sonamu 0.5.6 → 0.6.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 (365) hide show
  1. package/dist/api/base-frame.js +12 -2
  2. package/dist/api/caster.js +66 -2
  3. package/dist/api/code-converters.js +489 -2
  4. package/dist/api/config.d.ts +76 -0
  5. package/dist/api/config.d.ts.map +1 -0
  6. package/dist/api/config.js +32 -0
  7. package/dist/api/context.d.ts +1 -0
  8. package/dist/api/context.d.ts.map +1 -1
  9. package/dist/api/context.js +3 -2
  10. package/dist/api/decorators.d.ts +1 -0
  11. package/dist/api/decorators.d.ts.map +1 -1
  12. package/dist/api/decorators.js +142 -2
  13. package/dist/api/index.js +9 -2
  14. package/dist/api/sonamu.d.ts +8 -22
  15. package/dist/api/sonamu.d.ts.map +1 -1
  16. package/dist/api/sonamu.js +482 -2
  17. package/dist/bin/build-config.d.ts +2 -1
  18. package/dist/bin/build-config.d.ts.map +1 -1
  19. package/dist/bin/build-config.js +12 -2
  20. package/dist/bin/cli-wrapper.js +71 -2
  21. package/dist/bin/cli.js +418 -2
  22. package/dist/bin/hot-hook-register.d.ts +11 -0
  23. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  24. package/dist/bin/hot-hook-register.js +21 -0
  25. package/dist/database/_batch_update.js +78 -2
  26. package/dist/database/base-model.js +247 -2
  27. package/dist/database/code-generator.js +53 -2
  28. package/dist/database/db.d.ts +5 -16
  29. package/dist/database/db.d.ts.map +1 -1
  30. package/dist/database/db.js +132 -2
  31. package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
  32. package/dist/database/puri-wrapper.d.ts +22 -10
  33. package/dist/database/puri-wrapper.d.ts.map +1 -1
  34. package/dist/database/puri-wrapper.js +109 -2
  35. package/dist/database/puri.d.ts +105 -73
  36. package/dist/database/puri.d.ts.map +1 -1
  37. package/dist/database/puri.js +539 -2
  38. package/dist/database/puri.types.d.ts +33 -42
  39. package/dist/database/puri.types.d.ts.map +1 -1
  40. package/dist/database/puri.types.js +3 -2
  41. package/dist/database/transaction-context.d.ts +3 -3
  42. package/dist/database/transaction-context.d.ts.map +1 -1
  43. package/dist/database/transaction-context.js +14 -2
  44. package/dist/database/upsert-builder.js +215 -2
  45. package/dist/entity/entity-manager.d.ts +3 -1
  46. package/dist/entity/entity-manager.d.ts.map +1 -1
  47. package/dist/entity/entity-manager.js +114 -2
  48. package/dist/entity/entity-utils.js +210 -2
  49. package/dist/entity/entity.d.ts.map +1 -1
  50. package/dist/entity/entity.js +651 -2
  51. package/dist/exceptions/error-handler.js +29 -2
  52. package/dist/exceptions/so-exceptions.js +85 -2
  53. package/dist/file-storage/driver.js +79 -2
  54. package/dist/file-storage/file-storage.js +75 -2
  55. package/dist/index.d.ts +2 -0
  56. package/dist/index.d.ts.map +1 -1
  57. package/dist/index.js +28 -2
  58. package/dist/migration/code-generation.js +558 -2
  59. package/dist/migration/migration-set.js +364 -2
  60. package/dist/migration/migrator.d.ts +0 -9
  61. package/dist/migration/migrator.d.ts.map +1 -1
  62. package/dist/migration/migrator.js +510 -2
  63. package/dist/migration/types.js +3 -2
  64. package/dist/naite/naite.d.ts +12 -0
  65. package/dist/naite/naite.d.ts.map +1 -0
  66. package/dist/naite/naite.js +72 -0
  67. package/dist/stream/index.js +3 -2
  68. package/dist/stream/sse.js +38 -2
  69. package/dist/syncer/api-parser.d.ts +20 -0
  70. package/dist/syncer/api-parser.d.ts.map +1 -0
  71. package/dist/syncer/api-parser.js +229 -0
  72. package/dist/syncer/checksum.d.ts +21 -0
  73. package/dist/syncer/checksum.d.ts.map +1 -0
  74. package/dist/syncer/checksum.js +98 -0
  75. package/dist/syncer/code-generator.d.ts +20 -0
  76. package/dist/syncer/code-generator.d.ts.map +1 -0
  77. package/dist/syncer/code-generator.js +141 -0
  78. package/dist/syncer/entity-operations.d.ts +17 -0
  79. package/dist/syncer/entity-operations.d.ts.map +1 -0
  80. package/dist/syncer/entity-operations.js +58 -0
  81. package/dist/syncer/file-patterns.d.ts +29 -0
  82. package/dist/syncer/file-patterns.d.ts.map +1 -0
  83. package/dist/syncer/file-patterns.js +38 -0
  84. package/dist/syncer/index.d.ts +6 -0
  85. package/dist/syncer/index.d.ts.map +1 -1
  86. package/dist/syncer/index.js +9 -2
  87. package/dist/syncer/module-loader.d.ts +35 -0
  88. package/dist/syncer/module-loader.d.ts.map +1 -0
  89. package/dist/syncer/module-loader.js +82 -0
  90. package/dist/syncer/syncer.d.ts +93 -108
  91. package/dist/syncer/syncer.d.ts.map +1 -1
  92. package/dist/syncer/syncer.js +375 -2
  93. package/dist/template/entity-converter.d.ts +14 -0
  94. package/dist/template/entity-converter.d.ts.map +1 -0
  95. package/dist/template/entity-converter.js +101 -0
  96. package/dist/template/helpers.d.ts +23 -0
  97. package/dist/template/helpers.d.ts.map +1 -0
  98. package/dist/template/helpers.js +64 -0
  99. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  100. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  101. package/dist/template/implementations/entity.template.js +87 -0
  102. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
  103. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  104. package/dist/template/implementations/generated.template.js +232 -0
  105. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
  106. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  107. package/dist/template/implementations/generated_http.template.js +131 -0
  108. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
  109. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  110. package/dist/template/implementations/generated_sso.template.js +105 -0
  111. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  112. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  113. package/dist/template/implementations/init_types.template.js +38 -0
  114. package/dist/template/implementations/model.template.d.ts +17 -0
  115. package/dist/template/implementations/model.template.d.ts.map +1 -0
  116. package/dist/template/implementations/model.template.js +171 -0
  117. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  118. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  119. package/dist/template/implementations/model_test.template.js +35 -0
  120. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  121. package/dist/template/implementations/service.template.d.ts.map +1 -0
  122. package/dist/template/implementations/service.template.js +193 -0
  123. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  124. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  125. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  126. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  127. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  128. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  129. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  130. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  131. package/dist/template/implementations/view_enums_select.template.js +55 -0
  132. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  133. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  134. package/dist/template/implementations/view_form.template.js +337 -0
  135. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  136. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  137. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  138. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  139. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  140. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  141. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  142. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  143. package/dist/template/implementations/view_list.template.js +465 -0
  144. package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
  145. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  146. package/dist/template/implementations/view_list_columns.template.js +49 -0
  147. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  148. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  149. package/dist/template/implementations/view_search_input.template.js +64 -0
  150. package/dist/template/index.d.ts +5 -0
  151. package/dist/template/index.d.ts.map +1 -0
  152. package/dist/template/index.js +6 -0
  153. package/dist/template/template.d.ts +39 -0
  154. package/dist/template/template.d.ts.map +1 -0
  155. package/dist/template/template.js +47 -0
  156. package/dist/template/zod-converter.d.ts +18 -0
  157. package/dist/template/zod-converter.d.ts.map +1 -0
  158. package/dist/template/zod-converter.js +166 -0
  159. package/dist/testing/_relation-graph.js +80 -2
  160. package/dist/testing/fixture-manager.d.ts.map +1 -1
  161. package/dist/testing/fixture-manager.js +521 -2
  162. package/dist/types/types.d.ts +39 -40
  163. package/dist/types/types.d.ts.map +1 -1
  164. package/dist/types/types.js +289 -2
  165. package/dist/typings/knex.d.js +3 -2
  166. package/dist/utils/async-utils.d.ts +7 -0
  167. package/dist/utils/async-utils.d.ts.map +1 -1
  168. package/dist/utils/async-utils.js +57 -2
  169. package/dist/utils/console-util.d.ts +2 -0
  170. package/dist/utils/console-util.d.ts.map +1 -0
  171. package/dist/utils/console-util.js +6 -0
  172. package/dist/utils/controller.js +26 -2
  173. package/dist/utils/esm-utils.d.ts +45 -0
  174. package/dist/utils/esm-utils.d.ts.map +1 -0
  175. package/dist/utils/esm-utils.js +56 -0
  176. package/dist/utils/fs-utils.js +17 -2
  177. package/dist/utils/lodash-able.js +6 -2
  178. package/dist/utils/model.js +22 -2
  179. package/dist/utils/path-utils.d.ts +89 -0
  180. package/dist/utils/path-utils.d.ts.map +1 -0
  181. package/dist/utils/path-utils.js +60 -0
  182. package/dist/utils/process-utils.d.ts +13 -0
  183. package/dist/utils/process-utils.d.ts.map +1 -0
  184. package/dist/utils/process-utils.js +36 -0
  185. package/dist/utils/sql-parser.js +35 -2
  186. package/dist/utils/utils.d.ts +4 -7
  187. package/dist/utils/utils.d.ts.map +1 -1
  188. package/dist/utils/utils.js +33 -2
  189. package/dist/utils/zod-error.d.ts.map +1 -1
  190. package/dist/utils/zod-error.js +19 -2
  191. package/package.json +21 -9
  192. package/src/api/code-converters.ts +2 -2
  193. package/src/api/config.ts +142 -0
  194. package/src/api/context.ts +1 -0
  195. package/src/api/decorators.ts +15 -5
  196. package/src/api/sonamu.ts +102 -87
  197. package/src/bin/build-config.ts +2 -1
  198. package/src/bin/cli-wrapper.ts +10 -3
  199. package/src/bin/cli.ts +108 -56
  200. package/src/bin/hot-hook-register.ts +22 -0
  201. package/src/database/base-model.ts +1 -1
  202. package/src/database/code-generator.ts +1 -1
  203. package/src/database/db.ts +53 -60
  204. package/src/database/puri-wrapper.ts +104 -26
  205. package/src/database/puri.ts +477 -580
  206. package/src/database/puri.types.ts +111 -201
  207. package/src/database/transaction-context.ts +4 -4
  208. package/src/database/upsert-builder.ts +1 -1
  209. package/src/entity/entity-manager.ts +19 -15
  210. package/src/entity/entity.ts +4 -3
  211. package/src/index.ts +2 -0
  212. package/src/migration/code-generation.ts +1 -1
  213. package/src/migration/migration-set.ts +1 -1
  214. package/src/migration/migrator.ts +23 -152
  215. package/src/naite/naite.ts +70 -0
  216. package/src/syncer/api-parser.ts +299 -0
  217. package/src/syncer/checksum.ts +152 -0
  218. package/src/syncer/code-generator.ts +202 -0
  219. package/src/syncer/entity-operations.ts +68 -0
  220. package/src/syncer/file-patterns.ts +56 -0
  221. package/src/syncer/index.ts +6 -0
  222. package/src/syncer/module-loader.ts +125 -0
  223. package/src/syncer/syncer.ts +363 -1420
  224. package/src/template/entity-converter.ts +123 -0
  225. package/src/template/helpers.ts +84 -0
  226. package/src/{templates → template/implementations}/entity.template.ts +4 -4
  227. package/src/{templates → template/implementations}/generated.template.ts +9 -9
  228. package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
  229. package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
  230. package/src/{templates → template/implementations}/init_types.template.ts +4 -4
  231. package/src/{templates → template/implementations}/model.template.ts +9 -9
  232. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  233. package/src/{templates → template/implementations}/service.template.ts +29 -12
  234. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  235. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
  236. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  237. package/src/{templates → template/implementations}/view_form.template.ts +11 -13
  238. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  239. package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
  240. package/src/{templates → template/implementations}/view_list.template.ts +13 -64
  241. package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
  242. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  243. package/src/template/index.ts +4 -0
  244. package/src/template/template.ts +86 -0
  245. package/src/template/zod-converter.ts +219 -0
  246. package/src/testing/fixture-manager.ts +8 -1
  247. package/src/types/types.ts +39 -62
  248. package/src/utils/async-utils.ts +17 -0
  249. package/src/utils/console-util.ts +4 -0
  250. package/src/utils/esm-utils.ts +69 -0
  251. package/src/utils/path-utils.ts +102 -0
  252. package/src/utils/process-utils.ts +46 -0
  253. package/src/utils/sql-parser.ts +1 -1
  254. package/src/utils/utils.ts +14 -40
  255. package/src/utils/zod-error.ts +0 -1
  256. package/dist/api/base-frame.js.map +0 -1
  257. package/dist/api/caster.js.map +0 -1
  258. package/dist/api/code-converters.js.map +0 -1
  259. package/dist/api/context.js.map +0 -1
  260. package/dist/api/decorators.js.map +0 -1
  261. package/dist/api/index.js.map +0 -1
  262. package/dist/api/sonamu.js.map +0 -1
  263. package/dist/bin/build-config.js.map +0 -1
  264. package/dist/bin/cli-wrapper.js.map +0 -1
  265. package/dist/bin/cli.js.map +0 -1
  266. package/dist/database/_batch_update.js.map +0 -1
  267. package/dist/database/base-model.js.map +0 -1
  268. package/dist/database/code-generator.js.map +0 -1
  269. package/dist/database/db.js.map +0 -1
  270. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  271. package/dist/database/puri-wrapper.js.map +0 -1
  272. package/dist/database/puri.js.map +0 -1
  273. package/dist/database/puri.types.js.map +0 -1
  274. package/dist/database/transaction-context.js.map +0 -1
  275. package/dist/database/upsert-builder.js.map +0 -1
  276. package/dist/entity/entity-manager.js.map +0 -1
  277. package/dist/entity/entity-utils.js.map +0 -1
  278. package/dist/entity/entity.js.map +0 -1
  279. package/dist/exceptions/error-handler.js.map +0 -1
  280. package/dist/exceptions/so-exceptions.js.map +0 -1
  281. package/dist/file-storage/driver.js.map +0 -1
  282. package/dist/file-storage/file-storage.js.map +0 -1
  283. package/dist/index.js.map +0 -1
  284. package/dist/migration/code-generation.js.map +0 -1
  285. package/dist/migration/migration-set.js.map +0 -1
  286. package/dist/migration/migrator.js.map +0 -1
  287. package/dist/migration/types.js.map +0 -1
  288. package/dist/stream/index.js.map +0 -1
  289. package/dist/stream/sse.js.map +0 -1
  290. package/dist/syncer/index.js.map +0 -1
  291. package/dist/syncer/syncer.js.map +0 -1
  292. package/dist/templates/base-template.d.ts +0 -13
  293. package/dist/templates/base-template.d.ts.map +0 -1
  294. package/dist/templates/base-template.js +0 -2
  295. package/dist/templates/base-template.js.map +0 -1
  296. package/dist/templates/entity.template.d.ts.map +0 -1
  297. package/dist/templates/entity.template.js +0 -2
  298. package/dist/templates/entity.template.js.map +0 -1
  299. package/dist/templates/generated.template.d.ts.map +0 -1
  300. package/dist/templates/generated.template.js +0 -2
  301. package/dist/templates/generated.template.js.map +0 -1
  302. package/dist/templates/generated_http.template.d.ts.map +0 -1
  303. package/dist/templates/generated_http.template.js +0 -2
  304. package/dist/templates/generated_http.template.js.map +0 -1
  305. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  306. package/dist/templates/generated_sso.template.js +0 -2
  307. package/dist/templates/generated_sso.template.js.map +0 -1
  308. package/dist/templates/index.d.ts +0 -2
  309. package/dist/templates/index.d.ts.map +0 -1
  310. package/dist/templates/index.js +0 -2
  311. package/dist/templates/index.js.map +0 -1
  312. package/dist/templates/init_types.template.d.ts.map +0 -1
  313. package/dist/templates/init_types.template.js +0 -2
  314. package/dist/templates/init_types.template.js.map +0 -1
  315. package/dist/templates/model.template.d.ts +0 -17
  316. package/dist/templates/model.template.d.ts.map +0 -1
  317. package/dist/templates/model.template.js +0 -2
  318. package/dist/templates/model.template.js.map +0 -1
  319. package/dist/templates/model_test.template.d.ts.map +0 -1
  320. package/dist/templates/model_test.template.js +0 -2
  321. package/dist/templates/model_test.template.js.map +0 -1
  322. package/dist/templates/service.template.d.ts.map +0 -1
  323. package/dist/templates/service.template.js +0 -2
  324. package/dist/templates/service.template.js.map +0 -1
  325. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  326. package/dist/templates/view_enums_buttonset.template.js +0 -2
  327. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  328. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  329. package/dist/templates/view_enums_dropdown.template.js +0 -2
  330. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  331. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  332. package/dist/templates/view_enums_select.template.js +0 -2
  333. package/dist/templates/view_enums_select.template.js.map +0 -1
  334. package/dist/templates/view_form.template.d.ts.map +0 -1
  335. package/dist/templates/view_form.template.js +0 -2
  336. package/dist/templates/view_form.template.js.map +0 -1
  337. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  338. package/dist/templates/view_id_all_select.template.js +0 -2
  339. package/dist/templates/view_id_all_select.template.js.map +0 -1
  340. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  341. package/dist/templates/view_id_async_select.template.js +0 -2
  342. package/dist/templates/view_id_async_select.template.js.map +0 -1
  343. package/dist/templates/view_list.template.d.ts.map +0 -1
  344. package/dist/templates/view_list.template.js +0 -2
  345. package/dist/templates/view_list.template.js.map +0 -1
  346. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  347. package/dist/templates/view_list_columns.template.js +0 -2
  348. package/dist/templates/view_list_columns.template.js.map +0 -1
  349. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  350. package/dist/templates/view_search_input.template.js +0 -2
  351. package/dist/templates/view_search_input.template.js.map +0 -1
  352. package/dist/testing/_relation-graph.js.map +0 -1
  353. package/dist/testing/fixture-manager.js.map +0 -1
  354. package/dist/types/types.js.map +0 -1
  355. package/dist/typings/knex.d.js.map +0 -1
  356. package/dist/utils/async-utils.js.map +0 -1
  357. package/dist/utils/controller.js.map +0 -1
  358. package/dist/utils/fs-utils.js.map +0 -1
  359. package/dist/utils/lodash-able.js.map +0 -1
  360. package/dist/utils/model.js.map +0 -1
  361. package/dist/utils/sql-parser.js.map +0 -1
  362. package/dist/utils/utils.js.map +0 -1
  363. package/dist/utils/zod-error.js.map +0 -1
  364. package/src/templates/base-template.ts +0 -19
  365. package/src/templates/index.ts +0 -1
@@ -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 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\"] ?? 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 case \"test\":\n config = dbConfig[\"test\"];\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({}, defaultKnexConfig, devMasterOptions, {\n connection: {\n database: `${config.database}_fixture_remote`,\n },\n }, config.environments?.remote_fixture);\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}\nexport const DB = new DBClass();\n"],"names":["DB","DBClass","wdb","rdb","transactionStorage","AsyncLocalStorage","runWithTransaction","callback","run","TransactionContext","getTransactionContext","getStore","readKnexfile","dbConfigPath","knexfileModule","config","path","join","Sonamu","apiRootPath","default","generateDBConfig","ServiceUnavailableException","getDB","which","dbConfig","instanceName","process","env","NODE_ENV","Error","knex","destroy","undefined","defaultKnexConfig","_","merge","client","pool","min","max","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"],"mappings":"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"}
@@ -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<DBSchema extends DatabaseSchemaExtend> = Extract<\n keyof DBSchema,\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 DBSchema 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 table<TTable extends TableName<DBSchema>>(\n tableName: TTable\n ): Puri<DBSchema, TTable> {\n return new Puri(this.knex, tableName as any);\n }\n\n // 새로 추가: 서브쿼리로 시작\n fromSubquery<TSubResult, TAlias extends string>(\n subquery: Puri<DBSchema, any, any, TSubResult, any>,\n alias: TAlias extends string ? TAlias : never\n ): Puri<DBSchema, TAlias, TSubResult, TSubResult, {}> {\n return new Puri(this.knex, subquery, alias);\n }\n\n async transaction<T>(\n callback: (trx: PuriTransactionWrapper) => Promise<T>,\n options: TransactionalOptions = {}\n ): Promise<T> {\n const { isolation, readOnly } = options;\n\n return this.knex.transaction(\n async (trx) => {\n return callback(new PuriTransactionWrapper(trx, this.upsertBuilder));\n },\n { isolationLevel: isolation, readOnly }\n );\n }\n\n ubRegister<TTable extends TableName<DBSchema>>(\n tableName: TTable,\n row: Partial<{\n [K in keyof DBSchema[TTable]]: DBSchema[TTable][K] | UBRef;\n }>\n ): UBRef {\n return this.upsertBuilder.register(tableName, row);\n }\n\n ubUpsert(\n tableName: TableName<DBSchema>,\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertBuilder.upsert(this.knex, tableName, chunkSize);\n }\n\n ubInsertOnly(\n tableName: TableName<DBSchema>,\n chunkSize?: number\n ): Promise<number[]> {\n return this.upsertBuilder.insertOnly(this.knex, tableName, chunkSize);\n }\n\n ubUpsertOrInsert(\n tableName: TableName<DBSchema>,\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<DBSchema>,\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","table","tableName","Puri","fromSubquery","subquery","alias","transaction","callback","options","isolation","readOnly","trx","isolationLevel","ubRegister","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 ComparisonOperator,\n EmptyRecord,\n Expand,\n ExtractColumnType,\n FulltextColumns,\n InsertData,\n MergeJoined,\n ParseSelectObject,\n ResultAvailableColumns,\n SelectObject,\n SqlFunction,\n WhereCondition,\n} from \"./puri.types\";\nimport chalk from \"chalk\";\n\n// 메인 Puri 클래스\nexport class Puri<\n TSchema,\n TTable extends keyof TSchema | string,\n TOriginal = TTable extends keyof TSchema ? TSchema[TTable] : unknown,\n TResult = TTable extends keyof TSchema ? TSchema[TTable] : unknown,\n TJoined = EmptyRecord,\n> {\n private knexQuery: Knex.QueryBuilder;\n\n // 생성자 시그니처들\n constructor(\n knex: Knex,\n tableName: TTable extends keyof TSchema ? TTable : unknown\n );\n constructor(\n knex: Knex,\n subquery: Puri<TSchema, any, any, TOriginal, any>,\n alias: TTable extends string ? TTable : never\n );\n constructor(\n private knex: Knex,\n tableNameOrSubquery: any,\n alias?: TTable extends string ? TTable : never\n ) {\n if (typeof tableNameOrSubquery === \"string\") {\n // 일반 테이블로 시작\n this.knexQuery = knex(tableNameOrSubquery).from(tableNameOrSubquery);\n } else {\n // 서브쿼리로 시작\n this.knexQuery = knex.from(tableNameOrSubquery.raw().as(alias));\n }\n }\n\n // Static SQL helper functions\n static count(column: string = \"*\"): SqlFunction<\"number\"> {\n return {\n _type: \"sql_function\",\n _return: \"number\",\n _sql: `COUNT(${column})`,\n };\n }\n\n static sum(column: string): SqlFunction<\"number\"> {\n return { _type: \"sql_function\", _return: \"number\", _sql: `SUM(${column})` };\n }\n\n static avg(column: string): SqlFunction<\"number\"> {\n return { _type: \"sql_function\", _return: \"number\", _sql: `AVG(${column})` };\n }\n\n static max(column: string): SqlFunction<\"number\"> {\n return { _type: \"sql_function\", _return: \"number\", _sql: `MAX(${column})` };\n }\n\n static min(column: string): SqlFunction<\"number\"> {\n return { _type: \"sql_function\", _return: \"number\", _sql: `MIN(${column})` };\n }\n\n static concat(...args: string[]): SqlFunction<\"string\"> {\n return {\n _type: \"sql_function\",\n _return: \"string\",\n _sql: `CONCAT(${args.join(\", \")})`,\n };\n }\n\n static upper(column: string): SqlFunction<\"string\"> {\n return {\n _type: \"sql_function\",\n _return: \"string\",\n _sql: `UPPER(${column})`,\n };\n }\n\n static lower(column: string): SqlFunction<\"string\"> {\n return {\n _type: \"sql_function\",\n _return: \"string\",\n _sql: `LOWER(${column})`,\n };\n }\n\n // Raw functions\n static rawString(sql: string): SqlFunction<\"string\"> {\n return { _type: \"sql_function\", _return: \"string\", _sql: sql };\n }\n\n static rawNumber(sql: string): SqlFunction<\"number\"> {\n return { _type: \"sql_function\", _return: \"number\", _sql: sql };\n }\n\n static rawBoolean(sql: string): SqlFunction<\"boolean\"> {\n return { _type: \"sql_function\", _return: \"boolean\", _sql: sql };\n }\n\n static rawDate(sql: string): SqlFunction<\"date\"> {\n return { _type: \"sql_function\", _return: \"date\", _sql: sql };\n }\n\n // Alias 기반 Select\n select<TSelect extends SelectObject<TSchema, TTable, TOriginal, TJoined>>(\n selectObj: TSelect\n ): Puri<\n TSchema,\n TTable,\n TOriginal,\n ParseSelectObject<TSchema, TTable, TSelect, TOriginal, TJoined>,\n TJoined\n > {\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_function\"\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 // 전체 선택 (편의 메서드)\n selectAll(): Puri<\n TSchema,\n TTable,\n TOriginal,\n TTable extends keyof TSchema\n ? TSchema[TTable] & TJoined\n : TResult & TJoined,\n TJoined\n > {\n this.knexQuery.select(\"*\");\n return this as any;\n }\n\n // Where 조건 (조인된 테이블 컬럼도 지원)\n where(\n conditions: WhereCondition<TSchema, TTable, TOriginal, TJoined>\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n where<TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>>(\n column: TColumn,\n value: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n where<TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>>(\n column: TColumn,\n operator: ComparisonOperator | \"like\",\n value: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n where(\n columnOrConditions: any,\n operatorOrValue?: any,\n value?: any\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\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 // WhereIn (조인된 테이블 컬럼도 지원)\n whereIn<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n values: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >[]\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n whereIn(\n column: string,\n values: any[]\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.whereIn(column, values);\n return this;\n }\n\n whereNotIn<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n values: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >[]\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n whereNotIn(\n column: string,\n values: any[]\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.whereNotIn(column, values);\n return this;\n }\n\n whereMatch<\n TColumn extends FulltextColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n value: string\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.whereRaw(`MATCH (${String(column)}) AGAINST (?)`, [value]);\n return this;\n }\n\n // WhereGroup (괄호 그룹핑 지원)\n whereGroup(\n callback: (\n group: WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ) => WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.where((builder) => {\n const group = new WhereGroup<TSchema, TTable, TOriginal, TJoined>(\n builder\n );\n callback(group);\n });\n return this;\n }\n\n orWhereGroup(\n callback: (\n group: WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ) => WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.orWhere((builder) => {\n const group = new WhereGroup<TSchema, TTable, TOriginal, TJoined>(\n builder\n );\n callback(group);\n });\n return this;\n }\n\n // Join\n join<\n TJoinTable extends keyof TSchema,\n TLColumn extends AvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TJoined & Record<TJoinTable, TSchema[TJoinTable]>\n >,\n TRColumn extends AvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TJoined & Record<TJoinTable, TSchema[TJoinTable]>\n >,\n >(\n table: TJoinTable,\n left: TLColumn,\n right: TRColumn\n ): Puri<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n MergeJoined<TJoined, Record<TJoinTable, TSchema[TJoinTable]>>\n >;\n join<TJoinTable extends keyof TSchema>(\n table: TJoinTable,\n joinCallback: (\n joinClause: JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>\n ) => void\n ): Puri<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n MergeJoined<TJoined, Record<TJoinTable, TSchema[TJoinTable]>>\n >;\n join<TSubResult, TAlias extends string>(\n subquery: Puri<TSchema, any, any, TSubResult, any>,\n alias: TAlias,\n left: string,\n right: string\n ): Puri<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined & Record<TAlias, TSubResult>\n >;\n join(\n table: string,\n left: string,\n right: string\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n join(\n tableOrSubquery: string | keyof TSchema | Puri<TSchema, any, any, any, any>,\n ...args: any[]\n ): Puri<TSchema, TTable, TOriginal, TResult, any> {\n if (tableOrSubquery instanceof Puri) {\n // 서브쿼리 조인: join(subquery, alias, left, right)\n const [alias, left, right] = args;\n this.knexQuery.join(tableOrSubquery.raw().as(alias), left, right);\n } else if (\n args.length === 2 &&\n typeof args[0] === \"string\" &&\n typeof args[1] === \"string\"\n ) {\n const [left, right] = args;\n this.knexQuery.join(tableOrSubquery as string, left, right);\n } else if (args.length === 1 && typeof args[0] === \"function\") {\n const joinCallback = args[0];\n this.knexQuery.join(tableOrSubquery as string, (joinClause) => {\n joinCallback(new JoinClauseGroup(joinClause));\n });\n } else {\n throw new Error(\"Invalid arguments\");\n }\n return this as any;\n }\n\n leftJoin<\n TJoinTable extends keyof TSchema,\n TLColumn extends AvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TJoined & Record<TJoinTable, TSchema[TJoinTable]>\n >,\n TRColumn extends AvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TJoined & Record<TJoinTable, TSchema[TJoinTable]>\n >,\n >(\n table: TJoinTable,\n left: TLColumn,\n right: TRColumn\n ): Puri<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined & Record<TJoinTable, Partial<TSchema[TJoinTable]>>\n >;\n leftJoin<TSubResult, TAlias extends string>(\n subquery: Puri<TSchema, any, any, TSubResult, any>,\n alias: TAlias,\n left: string,\n right: string\n ): Puri<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined & Record<TAlias, Partial<TSubResult>>\n >;\n leftJoin(\n table: string,\n left: string,\n right: string\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n leftJoin(\n tableOrSubquery: string | keyof TSchema | Puri<TSchema, any, any, any, any>,\n ...args: any[]\n ): Puri<TSchema, TTable, TOriginal, TResult, any> {\n if (tableOrSubquery instanceof Puri) {\n // 서브쿼리 조인: leftJoin(subquery, alias, left, right)\n const [alias, left, right] = args;\n this.knexQuery.leftJoin(tableOrSubquery.raw().as(alias), left, right);\n } else {\n const [left, right] = args;\n this.knexQuery.leftJoin(tableOrSubquery as string, left, right);\n }\n return this as any;\n }\n\n // OrderBy\n orderBy<\n TColumn extends ResultAvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined\n >,\n >(\n column: TColumn,\n direction: \"asc\" | \"desc\"\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n orderBy(\n column: string,\n direction: \"asc\" | \"desc\" = \"asc\"\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.orderBy(column, direction);\n return this;\n }\n\n // 기본 쿼리 메서드들\n limit(count: number): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.limit(count);\n return this;\n }\n\n offset(count: number): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.offset(count);\n return this;\n }\n\n // Group by (조인된 테이블 컬럼도 지원)\n groupBy<\n TColumns extends ResultAvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined\n >,\n >(...columns: TColumns[]): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n groupBy(\n ...columns: string[]\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.groupBy(...(columns as string[]));\n return this;\n }\n\n having(condition: string): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n having<\n TColumn extends ResultAvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined\n >,\n >(\n condition: TColumn,\n operator: ComparisonOperator,\n value: any\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined>;\n having(\n ...conditions: string[]\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n this.knexQuery.having(...(conditions as [string, string, string]));\n return this;\n }\n // 실행 메서드들 - thenable 구현\n then<TResult1, TResult2 = never>(\n onfulfilled?:\n | ((\n value: Expand<TResult>[]\n ) => Expand<TResult1> | PromiseLike<Expand<TResult1>>)\n | null,\n onrejected?: ((reason: any) => TResult2 | PromiseLike<TResult2>) | null\n ): Promise<Expand<TResult1> | TResult2> {\n return this.knexQuery.then(onfulfilled as any, onrejected);\n }\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\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() as Promise<Expand<TResult> | undefined>;\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 as TResult;\n }\n\n async at(index: number): Promise<Expand<TResult> | undefined> {\n const results = await this;\n return results[index] as Expand<TResult> | undefined;\n }\n\n async assertAt(index: number): Promise<Expand<TResult>> {\n const results = await this;\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 // Pluck\n async pluck<\n TColumn extends ResultAvailableColumns<\n TSchema,\n TTable,\n TOriginal,\n TResult,\n TJoined\n >,\n >(\n column: TColumn\n ): Promise<\n ExtractColumnType<TSchema, TTable, TColumn & string, TOriginal, TJoined>[]\n > {\n return this.knexQuery.pluck(column) as Promise<\n ExtractColumnType<TSchema, TTable, TColumn & string, TOriginal, TJoined>[]\n >;\n }\n\n // Insert/Update/Delete\n // TODO(Haze, 251030): InsertData<T>에서 nullable type을 제대로 처리하지 못하는 것 같음.\n async insert(\n data: TTable extends keyof TSchema ? InsertData<TSchema[TTable]> : unknown\n ): Promise<number[]> {\n return this.knexQuery.insert(data);\n }\n\n async update(\n data: Partial<TTable extends keyof TSchema ? TSchema[TTable] : unknown>\n ): Promise<number> {\n return this.knexQuery.update(data);\n }\n\n async delete(): Promise<number> {\n return this.knexQuery.delete();\n }\n\n toQuery(): string {\n return this.knexQuery.toQuery();\n }\n\n debug(): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\n console.log(\n `${chalk.cyan(\"[Puri Debug]\")} ${chalk.yellow(this.formatSQL(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 raw(): Knex.QueryBuilder {\n return this.knexQuery;\n }\n\n increment<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n value: number\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\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\n decrement<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n value: number\n ): Puri<TSchema, TTable, TOriginal, TResult, TJoined> {\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\n// 11. Database 클래스\nclass WhereGroup<\n TSchema,\n TTable extends keyof TSchema | string,\n TOriginal = any,\n TJoined = EmptyRecord,\n> {\n constructor(private builder: Knex.QueryBuilder) {}\n\n where(\n conditions: WhereCondition<TSchema, TTable, TOriginal, TJoined>\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n where<TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>>(\n column: TColumn,\n value: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n where<TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>>(\n column: TColumn,\n operator: ComparisonOperator | \"like\",\n value: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n where(raw: string): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n where(...args: any[]): WhereGroup<TSchema, TTable, TOriginal, TJoined> {\n this.builder.where(args[0], ...args.slice(1));\n return this;\n }\n\n orWhere(\n conditions: WhereCondition<TSchema, TTable, TOriginal, TJoined>\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n orWhere<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n value: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n orWhere<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n operator: ComparisonOperator | \"like\",\n value: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n orWhere(raw: string): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n orWhere(...args: any[]): WhereGroup<TSchema, TTable, TOriginal, TJoined> {\n this.builder.orWhere(args[0], ...args.slice(1));\n return this;\n }\n\n whereIn<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n values: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >[]\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n whereIn(\n column: string,\n values: any[]\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined> {\n this.builder.whereIn(column, values);\n return this;\n }\n\n orWhereIn<\n TColumn extends AvailableColumns<TSchema, TTable, TOriginal, TJoined>,\n >(\n column: TColumn,\n values: ExtractColumnType<\n TSchema,\n TTable,\n TColumn & string,\n TOriginal,\n TJoined\n >[]\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined>;\n orWhereIn(\n column: string,\n values: any[]\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined> {\n this.builder.orWhereIn(column, values);\n return this;\n }\n\n // 중첩 그룹 지원\n whereGroup(\n callback: (\n group: WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ) => WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined> {\n this.builder.where((subBuilder) => {\n const subGroup = new WhereGroup<TSchema, TTable, TOriginal, TJoined>(\n subBuilder\n );\n callback(subGroup);\n });\n return this;\n }\n\n orWhereGroup(\n callback: (\n group: WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ) => WhereGroup<TSchema, TTable, TOriginal, TJoined>\n ): WhereGroup<TSchema, TTable, TOriginal, TJoined> {\n this.builder.orWhere((subBuilder) => {\n const subGroup = new WhereGroup<TSchema, TTable, TOriginal, TJoined>(\n subBuilder\n );\n callback(subGroup);\n });\n return this;\n }\n}\n\nexport class JoinClauseGroup<\n TSchema,\n TTable extends keyof TSchema | string,\n TOriginal = any,\n TJoined = EmptyRecord,\n> {\n constructor(private callback: Knex.JoinClause) {}\n\n on(\n callback: (\n joinClause: JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>\n ) => void\n ): JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>;\n on(\n column: string,\n value: any\n ): JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>;\n on(...args: any[]): JoinClauseGroup<TSchema, TTable, TOriginal, TJoined> {\n this.callback.on(...(args as [string, string]));\n return this;\n }\n\n orOn(\n callback: (\n joinClause: JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>\n ) => void\n ): JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>;\n orOn(\n column: string,\n value: any\n ): JoinClauseGroup<TSchema, TTable, TOriginal, TJoined>;\n orOn(...args: any[]): JoinClauseGroup<TSchema, TTable, TOriginal, TJoined> {\n this.callback.orOn(...(args as [string, string]));\n return this;\n }\n}\n"],"names":["JoinClauseGroup","Puri","knex","tableNameOrSubquery","alias","knexQuery","from","raw","as","select","selectObj","selectClauses","Object","entries","columnOrFunction","_type","push","_sql","columnPath","selectAll","where","columnOrConditions","operatorOrValue","value","arguments","length","whereNull","whereNotNull","whereIn","column","values","whereNotIn","whereMatch","whereRaw","String","whereGroup","callback","builder","group","WhereGroup","orWhereGroup","orWhere","join","tableOrSubquery","args","left","right","joinCallback","joinClause","Error","leftJoin","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","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","increment","decrement","_return","sum","avg","min","concat","upper","lower","rawString","sql","rawNumber","rawBoolean","rawDate","slice","orWhereIn","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 { PuriWrapper } from \"./puri-wrapper\";\nimport type { DBPreset } from \"./db\";\n\nexport class TransactionContext {\n private transactions: Map<DBPreset, PuriWrapper> = new Map();\n\n getTransaction(preset: DBPreset): PuriWrapper | undefined {\n return this.transactions.get(preset);\n }\n\n setTransaction(preset: DBPreset, trx: PuriWrapper): 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,eAA2C,IAAIC,mBAD5CF,qBAGXG,IAAAA,uBAAAA,SAAAA,eAAeC,MAAgB,EAC7B,OAAO,IAAI,CAACH,YAAY,CAACI,GAAG,CAACD,OAC/B,IAEAE,IAAAA,uBAAAA,SAAAA,eAAeF,MAAgB,CAAEG,GAAgB,EAC/C,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":"mPA2BaA,uBAAAA,mBATGC,oBAAAA,kCAlBW,oEACb,sCAEgB,+CACF,4CACW,wgMAahC,SAASA,WAAWC,KAAU,EACnC,OACEA,QAAUC,WACVD,QAAU,MACVA,MAAME,EAAE,GAAKD,WACbD,MAAMG,IAAI,GAAKF,SAEnB,CAEO,IAAA,AAAMH,2BAAN,iCAAMA,uCAAAA,eACXM,sBAAAA,SAAAA,KAAAA,EAEE,CAAA,IAAI,CAACA,MAAM,CAAG,IAAIC,kBAHTP,gBAMXQ,IAAAA,iBAAAA,SAAAA,SAASC,SAAiB,EACxB,IAAMC,MAAQ,IAAI,CAACJ,MAAM,CAACK,GAAG,CAACF,WAC9B,GAAIC,QAAUP,UAAW,CACvB,IAAMS,UAAY,AAAC,WACjB,GAAI,CACF,OAAOC,4BAAa,CAACC,YAAY,CAACL,UACpC,CAAE,QAAM,CACN,OAAO,IACT,CACF,QAKiBG,yBAHjB,IAAI,CAACN,MAAM,CAACS,GAAG,CAACN,UAAW,CACzBO,WAAY,IAAIC,IAChBC,KAAM,EAAE,CACRC,cAAeP,CAAAA,yBAAAA,kBAAAA,0BAAAA,UAAWO,aAAa,UAAxBP,kCAAAA,yBAA4B,EAAE,CAC7CQ,WAAY,IAAIb,GAClB,EACF,CAEA,OAAO,IAAI,CAACD,MAAM,CAACK,GAAG,CAACF,UACzB,IAEAY,IAAAA,iBAAAA,SAAAA,SAASZ,SAAiB,EACxB,OAAO,IAAI,CAACH,MAAM,CAACgB,GAAG,CAACb,UACzB,IAEAc,IAAAA,iBAAAA,SAAAA,SACEd,SAAiB,CACjBe,GAUC,EAED,IAAMd,MAAQ,IAAI,CAACF,QAAQ,CAACC,WAG5B,IAAMgB,WAAaf,MAAMS,aAAa,CACnCO,GAAG,CAAC,SAACC,UACJ,IAAMC,eAAiBD,SAASE,OAAO,CAACH,GAAG,CAAC,SAACI,QAC3C,IAAMC,IAAMP,GAAG,CAACM,OAA2B,CAC3C,GAAI7B,WAAW8B,KAAM,CACnB,OAAOA,IAAI1B,IAAI,AACjB,KAAO,KACEmB,YAAP,MAAOA,CAAAA,YAAAA,GAAG,CAACM,OAA2B,UAA/BN,qBAAAA,YAAmCQ,GAAAA,kBAAU,GACtD,CACF,GAGA,GAAIJ,eAAeK,MAAM,GAAK,EAAG,CAC/B,OAAO,IACT,CACA,OAAOL,eAAeM,IAAI,CAAC,iBAC7B,GACCC,MAAM,CAACC,kBAAW,EAGrB,IAAM/B,KAAe,AAAC,WAEpB,GAAIoB,WAAWQ,MAAM,CAAG,EAAG,KACpB,+BAAA,wBAAA,6BAAL,QAAK,UAAmBR,8BAAnB,QAAA,2BAAA,MAAA,wBAAA,+BAA+B,CAA/B,IAAMY,UAAN,YACH,GAAI3B,MAAMU,UAAU,CAACE,GAAG,CAACe,WAAY,CACnC,OAAO3B,MAAMU,UAAU,CAACT,GAAG,CAAC0B,UAC9B,CACF,aAJK,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBAKP,CAGA,MAAOL,GAAAA,kBAAU,GACnB,IAGA,GAAIP,WAAWQ,MAAM,CAAG,EAAG,KACpB,+BAAA,wBAAA,6BAAL,QAAK,UAAmBR,8BAAnB,QAAA,2BAAA,MAAA,wBAAA,+BAA+B,CAA/B,IAAMY,UAAN,YACH3B,MAAMU,UAAU,CAACL,GAAG,CAACsB,UAAWhC,KAClC,aAFK,uBAAA,mCAAA,2BAAA,wBAAA,+BAAA,yBAAA,iBAGP,CAIAmB,IAAMc,OAAOC,IAAI,CAACf,KAAKgB,MAAM,CAAC,SAACC,EAAGC,QAChC,IAAMC,SAAWnB,GAAG,CAACkB,OAA2B,CAEhD,GAAIzC,WAAW0C,UAAW,KACxBA,kBAAAA,QAAAA,UAAAA,UAASC,gCAATD,UAASC,IAAQ,KACjBlC,MAAMM,UAAU,CAAC6B,GAAG,CAACF,SAASvC,EAAE,CAAG,IAAMuC,SAASC,GAAG,CACrDH,CAAAA,CAAC,CAACC,OAAO,CAAGC,QACd,MAAO,GAAI,CAAA,OAAOA,mCAAP,SAAOA,SAAO,IAAM,UAAY,CAAEA,AAAQ,YAARA,SAAoBG,MAAO,CAEtEL,CAAC,CAACC,OAAO,CAAGC,WAAa,KAAO,KAAOI,KAAKC,SAAS,CAACL,SACxD,KAAO,CACLF,CAAC,CAACC,OAAO,CAAGC,QACd,CACA,OAAOF,CACT,EAAG,CAAC,GAEJ/B,MAAMQ,IAAI,CAAC+B,IAAI,CAAC,gBACd5C,KAAAA,MACGmB,UAKG,UAFR,MAAO,CACLpB,GAAIK,UACJJ,KAAM,CAAA,UAAA,AAACmB,IAA0BnB,IAAI,UAA/B,mBAAA,UAAmCA,IAC3C,CACF,IAEM6C,IAAAA,eAAN,SAAMA,OACJC,GAAS,CACT1C,SAAiB,CACjB2C,SAAkB,mFAElB,SAAO,IAAI,CAACC,cAAc,CAACF,IAAK1C,UAAW,SAAU2C,aACvD,iBACME,IAAAA,mBAAN,SAAMA,WACJH,GAAS,CACT1C,SAAiB,CACjB2C,SAAkB,mFAElB,SAAO,IAAI,CAACC,cAAc,CAACF,IAAK1C,UAAW,SAAU2C,aACvD,iBAEMC,IAAAA,uBAAN,SAAMA,eACJF,GAAS,CACT1C,SAAiB,CACjB8C,IAAyB,CACzBH,SAAkB,4CAMZ1C,MAkB4B8C,mBAA1BxC,WAAYyC,UAiBdC,cAKAC,OAKaA,eAAbC,WACcD,gBAAdE,YAEAC,OACAC,QAED,0BAAA,kBAAA,eAAA,UAAA,MAAMC,MACHC,EAQAC,MACAC,iBA4BFC,OAOJA,QADMC,kFAnGR,GAAI,IAAI,CAAChD,QAAQ,CAACZ,aAAe,MAAO,CACtC,YACF,CAEMC,MAAQ,IAAI,CAACJ,MAAM,CAACK,GAAG,CAACF,WAC9B,GAAIC,QAAUP,UAAW,CACvB,MAAM,IAAImE,MAAM,AAAC,eAAwB,OAAV7D,UAAU,eAC3C,MAAO,GAAIC,MAAMQ,IAAI,CAACe,MAAM,GAAK,EAAG,CAClC,MAAM,IAAIqC,MAAM,AAAC,GAAY,OAAV7D,UAAU,yBAC/B,CAEA,GACEC,MAAMQ,IAAI,CAACqD,IAAI,CAAC,SAAC/C,YACfc,OAAOkC,OAAO,CAAChD,KAAK+C,IAAI,CACtB,qDAAIE,uBAAWxE,WAAWwE,QAAUA,MAAMrE,EAAE,GAAKK,cAGrD,CACA,MAAM,IAAI6D,MAAM,AAAC,GAAY,OAAV7D,UAAU,sBAC/B,CAGkC+C,mBAAAA,MAAMkB,IAAI,CAAC,IAAI,CAACpE,MAAM,EAAEkC,MAAM,CAC9D,SAACC,8CAAM/B,gBACL,IAAMiE,UAAYnB,MAAMkB,IAAI,CAAChE,MAAMM,UAAU,CAAC4D,MAAM,IAAIC,IAAI,CAAC,SAACC,YAC5DA,IAAIC,QAAQ,CAACtE,UAAY,OAE3B,GAAIkE,UAAW,CACblC,EAAEzB,UAAU,CAACiC,IAAI,CAAC0B,WAClBlC,EAAEgB,SAAS,CAACR,IAAI,CAACvC,MACnB,CAEA,OAAO+B,CACT,EACA,CACEzB,UAAU,IACVyC,SAAS,GACX,GAfMzC,WAA0BwC,mBAA1BxC,WAAYyC,UAAcD,mBAAdC,UAiBdC,cAAgBsB,eAAC,CAACC,IAAI,CAACjE,YAAYU,GAAG,CAC1C,SAACiD,kBAAcA,UAAUO,KAAK,CAAC,IAAI,CAAC,EAAE,GAIlCvB,OAASqB,eAAC,CAACG,OAAO,CAACzE,MAAMQ,IAAI,CAAE,SAACM,YACpCc,OAAOkC,OAAO,CAAChD,KAAK+C,IAAI,CAAC,qDAAIE,uBAAWxE,WAAWwE,SAC/C,UACA,WAEAb,WAAaD,CAAAA,eAAAA,OAAOyB,MAAM,UAAbzB,wBAAAA,kBACbE,YAAcF,CAAAA,gBAAAA,OAAO0B,OAAO,UAAd1B,yBAAAA,mBAEdG,OAASV,UAAY4B,eAAC,CAAChB,KAAK,CAACJ,WAAYR,YAAcQ,YACvDG,QAAU,IAAIxD,IAEf,+BAAA,wBAAA,8EAAA,UAAeuD,sDAAf,2BAAA,MAAA,oCAAME,MAAN,YACGC,EAAId,IAAImC,MAAM,CAACtB,OAAOuB,IAAI,CAAC9E,eAC7B8C,CAAAA,OAAS,QAAO,EAAhBA,YACF,SAAMU,UAAN,qCACSV,CAAAA,OAAS,QAAO,EAAhBA,YACT,SAAMU,EAAEuB,iBAAiB,CAACC,KAAK,CAACxB,EAAG3B,OAAOC,IAAI,CAACqB,UAAU,CAAC,EAAE,WAA5D,oCAIIM,MAAQF,MAAMtC,GAAG,CAAC,SAACF,YAAQA,IAAInB,IAAI,GACpB,SAAM8C,IAAI1C,WAC5BiF,MAAM,CAACV,eAAC,CAACC,IAAI,CAAC,CAAC,OAAQ,MAAT,OAAe,qBAAGvB,kBAChCiC,OAAO,CAAC,OAAQzB,eAFbC,aAAe,cAGrBA,aAAayB,OAAO,CAAC,SAACpE,KACpBuC,QAAQhD,GAAG,CAACS,IAAInB,IAAI,CAAEmB,IACxB,yBAfG,yFAAA,uBAAA,gDAAA,2BAAA,wBAAA,+BAAA,yBAAA,kCAmBLiC,UAAU/B,GAAG,CAAC,SAAChB,OACbA,MAAMQ,IAAI,CAAGR,MAAMQ,IAAI,CAACQ,GAAG,CAAC,SAACF,KAC3Bc,OAAOC,IAAI,CAACf,KAAKE,GAAG,CAAC,SAACmE,KACpB,IAAMC,KAAOtE,GAAG,CAACqE,IAAI,CACrB,GAAI5F,WAAW6F,OAASA,KAAK1F,EAAE,GAAKK,UAAW,CAC7C,IAAMsF,OAAShC,QAAQpD,GAAG,CAACmF,KAAKzF,IAAI,EACpC,GAAI0F,SAAW5F,UAAW,CACxB6F,QAAQC,KAAK,CAACH,KACd,OAAM,IAAIxB,MACR,AAAC,gBAAkC7D,OAAnBqF,KAAKzF,IAAI,CAAC,WAAmB,OAAVI,WAEvC,KACkBqF,SAAlBtE,CAAAA,GAAG,CAACqE,IAAI,CAAGE,MAAM,CAACD,CAAAA,UAAAA,KAAKlD,GAAG,UAARkD,mBAAAA,UAAY,KAAK,AACrC,CACF,GACA,OAAOtE,GACT,EACF,GAEM4C,OAASZ,MAAMkB,IAAI,CAACX,QAAQa,MAAM,IAAIlD,GAAG,CAAC,SAACF,YAAQA,IAAI0E,EAAE,OAG3DrC,CAAAA,YAAY5B,MAAM,CAAG,CAAA,EAArB4B,YAEFnD,CAAAA,MAAMQ,IAAI,CAAG2C,YACM,SAAM,IAAI,CAACX,MAAM,CAACC,IAAK1C,UAAW2C,oBAA/CiB,WAAa,cACnBD,CAAAA,QAAAA,QAAOnB,IAAI,OAAXmB,QAAY,qBAAGC,kCAGf3D,MAAMQ,IAAI,IACVR,MAAMM,UAAU,CAACmF,KAAK,GACtBzF,MAAMU,UAAU,CAAC+E,KAAK,2BAGxB,SAAO/B,UACT,iBAEMgC,IAAAA,oBAAN,SAAMA,YACJjD,GAAS,CACT1C,SAAiB,CACjB4F,OAGC,4CAUK3F,MAOD2F,eAFCC,aAGApF,4EAhBNmF,QAAUrB,eAAC,CAACuB,QAAQ,CAACF,QAAS,CAC5BjD,UAAW,IACXoD,MAAO,IACT,GAEA,GAAI,IAAI,CAACnF,QAAQ,CAACZ,aAAe,MAAO,CACtC,SACF,CACMC,MAAQ,IAAI,CAACJ,MAAM,CAACK,GAAG,CAACF,WAC9B,GAAIC,MAAMQ,IAAI,CAACe,MAAM,GAAK,EAAG,CAC3B,SACF,CAEMqE,aAAe9C,MAAMiD,OAAO,CAACJ,QAAQG,KAAK,EAC5CH,QAAQG,KAAK,EACZH,CAAAA,eAAAA,QAAQG,KAAK,UAAbH,wBAAAA,eAAiB,MAChBnF,KAAOR,MAAMQ,IAAI,CAACQ,GAAG,CAAC,SAACgF,MAC3B,IAAM,AAAErG,KAAiBqG,KAAjBrG,KAASmB,+BAAQkF,MAAjBrG,SACR,OAAOmB,GACT,GAEA,SAAMmF,GAAAA,yBAAW,EAACxD,IAAK1C,UAAW6F,aAAcpF,KAAMmF,QAAQjD,SAAS,UAAvE,aAGA1C,CAAAA,MAAMQ,IAAI,IACVR,MAAMM,UAAU,CAACmF,KAAK,GACtBzF,MAAMU,UAAU,CAAC+E,KAAK,eACxB,yBA9RWnG"}
@@ -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 +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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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/entity/entity.ts"],"sourcesContent":["import _ from \"lodash\";\nimport { EntityManager as EntityManager } from \"./entity-manager\";\nimport {\n EntityProp,\n RelationProp,\n isRelationProp,\n SubsetQuery,\n isVirtualProp,\n isBelongsToOneRelationProp,\n isOneToOneRelationProp,\n isHasManyRelationProp,\n isManyToManyRelationProp,\n EntityPropNode,\n isEnumProp,\n StringProp,\n EntityIndex,\n EntityJson,\n EntitySubsetRow,\n} from \"../types/types\";\nimport inflection from \"inflection\";\nimport path from \"path\";\nimport { writeFile } from \"fs/promises\";\nimport { z } from \"zod\";\nimport { Sonamu } from \"../api/sonamu\";\nimport prettier from \"prettier\";\nimport { nonNullable } from \"../utils/utils\";\nimport { exists } from \"../utils/fs-utils\";\n\nexport class Entity {\n id: string;\n parentId?: string;\n table: string;\n title: string;\n names: {\n parentFs: string;\n fs: string;\n module: string;\n };\n props: EntityProp[];\n propsDict: {\n [key: string]: EntityProp;\n };\n relations: {\n [key: string]: RelationProp;\n };\n indexes: EntityIndex[];\n subsets: {\n [key: string]: string[];\n };\n types: {\n [name: string]: z.ZodTypeAny;\n } = {};\n enums: {\n [enumId: string]: z.ZodEnum<any>;\n } = {};\n enumLabels: {\n [enumId: string]: {\n [key: string]: string;\n };\n } = {};\n\n constructor({\n id,\n parentId,\n table,\n title,\n props,\n indexes,\n subsets,\n enums,\n }: EntityJson) {\n // id\n this.id = id;\n this.parentId = parentId;\n this.title = title ?? this.id;\n this.table = table ?? inflection.underscore(inflection.pluralize(id));\n\n // props\n if (props) {\n this.props = props.map((prop) => {\n if (isEnumProp(prop)) {\n if (prop.id.includes(\"$Model\")) {\n prop.id = prop.id.replace(\"$Model\", id);\n }\n }\n return prop;\n });\n this.propsDict = props.reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n\n // relations\n this.relations = props\n .filter((prop) => isRelationProp(prop))\n .reduce((result, prop) => {\n return {\n ...result,\n [prop.name]: prop,\n };\n }, {});\n } else {\n this.props = [];\n this.propsDict = {};\n this.relations = {};\n }\n\n // indexes\n this.indexes = indexes ?? [];\n\n // subsets\n this.subsets = subsets ?? {};\n\n // enums\n this.enumLabels = enums ?? {};\n this.enums = Object.fromEntries(\n Object.entries(this.enumLabels).map(([key, enumLabel]) => {\n return [\n key,\n z.enum(\n Object.keys(enumLabel) as unknown as readonly [string, ...string[]]\n ),\n ];\n })\n );\n\n // names\n this.names = {\n parentFs: inflection\n .dasherize(inflection.underscore(parentId ?? id))\n .toLowerCase(),\n fs: inflection.dasherize(inflection.underscore(id)).toLowerCase(),\n module: id,\n };\n }\n\n /*\n subset SELECT/JOIN/LOADER 결과 리턴\n */\n getSubsetQuery(subsetKey: string): SubsetQuery {\n const subset = this.subsets[subsetKey];\n\n const result: SubsetQuery = this.resolveSubsetQuery(\"\", subset);\n return result;\n }\n\n /*\n */\n resolveSubsetQuery(\n prefix: string,\n fields: string[],\n isAlreadyOuterJoined: boolean = false\n ): SubsetQuery {\n // prefix 치환 (prefix는 ToOneRelation이 복수로 붙은 경우 모두 __로 변경됨)\n prefix = prefix.replace(/\\./g, \"__\");\n\n // 서브셋을 1뎁스만 분리하여 그룹핑\n const subsetGroup = _.groupBy(fields, (field) => {\n if (field.includes(\".\")) {\n const [rel] = field.split(\".\");\n return rel;\n } else {\n return \"\";\n }\n });\n\n const result = Object.keys(subsetGroup).reduce(\n (r, groupKey) => {\n const fields = subsetGroup[groupKey];\n // 현재 테이블 필드셋은 select, virtual에 추가하고 리턴\n if (groupKey === \"\") {\n const realFields = fields.filter(\n (field) => !isVirtualProp(this.propsDict[field])\n );\n const virtualFields = fields.filter((field) =>\n isVirtualProp(this.propsDict[field])\n );\n\n if (prefix === \"\") {\n // 현재 테이블인 경우\n r.select = r.select.concat(\n realFields.map((field) => `${this.table}.${field}`)\n );\n r.virtual = r.virtual.concat(virtualFields);\n } else {\n // 넘어온 테이블인 경우\n r.select = r.select.concat(\n realFields.map(\n (field) => `${prefix}.${field} as ${prefix}__${field}`\n )\n );\n }\n\n return r;\n }\n\n const relation = this.relations[groupKey];\n if (relation === undefined) {\n throw new Error(`존재하지 않는 relation 참조 ${groupKey}`);\n }\n const relEntity = EntityManager.get(relation.with);\n\n if (\n isOneToOneRelationProp(relation) ||\n isBelongsToOneRelationProp(relation)\n ) {\n // -One Relation: JOIN 으로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n\n // -One Relation에서 id 필드만 참조하는 경우 릴레이션 넘기지 않고 리턴\n if (relFields.length === 1 && relFields[0] === \"id\") {\n if (prefix === \"\") {\n r.select = r.select.concat(`${this.table}.${groupKey}_id`);\n } else {\n r.select = r.select.concat(\n `${prefix}.${groupKey}_id as ${prefix}__${groupKey}_id`\n );\n }\n return r;\n }\n\n // innerOrOuter\n const innerOrOuter = (() => {\n if (isAlreadyOuterJoined) {\n return \"outer\";\n }\n\n if (isOneToOneRelationProp(relation)) {\n if (\n relation.hasJoinColumn === true &&\n (relation.nullable ?? false) === false\n ) {\n return \"inner\";\n } else {\n return \"outer\";\n }\n } else {\n if (relation.nullable) {\n return \"outer\";\n } else {\n return \"inner\";\n }\n }\n })();\n const relSubsetQuery = relEntity.resolveSubsetQuery(\n `${prefix !== \"\" ? prefix + \".\" : \"\"}${groupKey}`,\n relFields,\n innerOrOuter === \"outer\"\n );\n r.select = r.select.concat(relSubsetQuery.select);\n r.virtual = r.virtual.concat(relSubsetQuery.virtual);\n\n const joinAs = prefix === \"\" ? groupKey : prefix + \"__\" + groupKey;\n const fromTable = prefix === \"\" ? this.table : prefix;\n\n let joinClause;\n if (relation.customJoinClause) {\n joinClause = {\n custom: relation.customJoinClause,\n };\n } else {\n let from, to;\n if (isOneToOneRelationProp(relation)) {\n if (relation.hasJoinColumn) {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n } else {\n from = `${fromTable}.id`;\n to = `${joinAs}.${inflection.underscore(\n this.names.fs.replace(/\\-/g, \"_\")\n )}_id`;\n }\n } else {\n from = `${fromTable}.${relation.name}_id`;\n to = `${joinAs}.id`;\n }\n joinClause = {\n from,\n to,\n };\n }\n\n r.joins.push({\n as: joinAs,\n join: innerOrOuter,\n table: relEntity.table,\n ...joinClause,\n });\n\n // BelongsToOne 밑에 HasMany가 붙은 경우\n if (relSubsetQuery.loaders.length > 0) {\n const convertedLoaders = relSubsetQuery.loaders.map((loader) => {\n const newAs = [groupKey, loader.as].join(\"__\");\n return {\n as: newAs,\n table: loader.table,\n manyJoin: loader.manyJoin,\n oneJoins: loader.oneJoins,\n select: loader.select,\n loaders: loader.loaders,\n };\n });\n\n r.loaders = [...r.loaders, ...convertedLoaders];\n }\n\n r.joins = r.joins.concat(relSubsetQuery.joins);\n } else if (\n isHasManyRelationProp(relation) ||\n isManyToManyRelationProp(relation)\n ) {\n // -Many Relation: Loader 로 처리\n const relFields = fields.map((field) =>\n field.split(\".\").slice(1).join(\".\")\n );\n const relSubsetQuery = relEntity.resolveSubsetQuery(\"\", relFields);\n\n let manyJoin: SubsetQuery[\"loaders\"][number][\"manyJoin\"];\n if (isHasManyRelationProp(relation)) {\n const fromCol = relation?.fromColumn ?? \"id\";\n manyJoin = {\n fromTable: this.table,\n fromCol,\n idField: prefix === \"\" ? `${fromCol}` : `${prefix}__${fromCol}`,\n toTable: relEntity.table,\n toCol: relation.joinColumn,\n };\n } else if (isManyToManyRelationProp(relation)) {\n manyJoin = {\n fromTable: this.table,\n fromCol: \"id\",\n idField: prefix === \"\" ? `id` : `${prefix}__id`,\n through: {\n table: relation.joinTable,\n fromCol: `${inflection.singularize(this.table)}_id`,\n toCol: `${inflection.singularize(relEntity.table)}_id`,\n },\n toTable: relEntity.table,\n toCol: \"id\",\n };\n } else {\n throw new Error();\n }\n\n r.loaders.push({\n as: groupKey,\n table: relEntity.table,\n manyJoin,\n oneJoins: relSubsetQuery.joins,\n select: relSubsetQuery.select,\n loaders: relSubsetQuery.loaders,\n });\n }\n\n return r;\n },\n {\n select: [],\n virtual: [],\n joins: [],\n loaders: [],\n } as SubsetQuery\n );\n return result;\n }\n\n /*\n FieldExpr[] 을 EntityPropNode[] 로 변환\n */\n fieldExprsToPropNodes(\n fieldExprs: string[],\n entity: Entity = this\n ): EntityPropNode[] {\n const groups = fieldExprs.reduce(\n (result, fieldExpr) => {\n let key, value, elseExpr;\n if (fieldExpr.includes(\".\")) {\n [key, ...elseExpr] = fieldExpr.split(\".\");\n value = elseExpr.join(\".\");\n } else {\n key = \"\";\n value = fieldExpr;\n }\n result[key] = (result[key] ?? []).concat(value);\n\n return result;\n },\n {} as {\n [k: string]: string[];\n }\n );\n\n return Object.keys(groups)\n .map((key) => {\n const group = groups[key];\n\n // 일반 prop 처리\n if (key === \"\") {\n return group.map((propName) => {\n // uuid 개별 처리\n if (propName === \"uuid\") {\n return {\n nodeType: \"plain\" as const,\n prop: {\n type: \"string\",\n name: \"uuid\",\n length: 128,\n } as StringProp,\n children: [],\n };\n }\n\n const prop = entity.props.find((p) => p.name === propName);\n if (prop === undefined) {\n console.log({ propName, groups });\n throw new Error(`${entity.id} -- 잘못된 FieldExpr ${propName}`);\n }\n return {\n nodeType: \"plain\" as const,\n prop,\n children: [],\n };\n });\n }\n\n // relation prop 처리\n const prop = entity.propsDict[key];\n if (!isRelationProp(prop)) {\n throw new Error(`잘못된 FieldExpr ${key}.${group[0]}`);\n }\n const relEntity = EntityManager.get(prop.with);\n\n // relation -One 에 id 필드 하나인 경우\n if (isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)) {\n if (group.length == 1 && (group[0] === \"id\" || group[0] == \"id?\")) {\n // id 하나만 있는지 체크해서, 하나만 있으면 상위 prop으로 id를 리턴\n const idProp = relEntity.propsDict.id;\n return {\n nodeType: \"plain\" as const,\n prop: {\n ...idProp,\n name: key + \"_id\",\n nullable: prop.nullable,\n },\n children: [],\n };\n }\n }\n\n // -One 그외의 경우 object로 리턴\n // -Many의 경우 array로 리턴\n // Recursive 로 뎁스 처리\n const children = this.fieldExprsToPropNodes(group, relEntity);\n const nodeType =\n isBelongsToOneRelationProp(prop) || isOneToOneRelationProp(prop)\n ? (\"object\" as const)\n : (\"array\" as const);\n\n return {\n prop,\n children,\n nodeType,\n };\n })\n .flat();\n }\n\n getFieldExprs(\n prefix = \"\",\n maxDepth: number = 3,\n froms: string[] = []\n ): string[] {\n return this.props\n .map((prop) => {\n const propName = [prefix, prop.name].filter((v) => v !== \"\").join(\".\");\n if (propName === prefix) {\n return null;\n }\n if (isRelationProp(prop)) {\n if (maxDepth < 0) {\n return null;\n }\n if (froms.includes(prop.with)) {\n // 역방향 relation인 경우 제외\n return null;\n }\n // 정방향 relation인 경우 recursive 콜\n const relMd = EntityManager.get(prop.with);\n return relMd.getFieldExprs(propName, maxDepth - 1, [\n ...froms,\n this.id,\n ]);\n }\n return propName;\n })\n .flat()\n .filter((f) => f !== null) as string[];\n }\n\n getTableColumns(): { name: string; type: string }[] {\n return this.props\n .map((prop) => {\n if (prop.type === \"relation\") {\n if (\n prop.relationType === \"BelongsToOne\" ||\n (prop.relationType === \"OneToOne\" && prop.hasJoinColumn === true)\n ) {\n return { name: `${prop.name}_id`, type: \"int_unsigned\" };\n } else {\n return null;\n }\n }\n return { name: prop.name, type: prop.type };\n })\n .filter(nonNullable);\n }\n\n async registerModulePaths() {\n const basePath = `${this.names.parentFs}`;\n\n // base-scheme\n EntityManager.setModulePath(`${this.id}BaseSchema`, `sonamu.generated`);\n\n // subset\n if (Object.keys(this.subsets).length > 0) {\n EntityManager.setModulePath(`${this.id}SubsetKey`, `sonamu.generated`);\n EntityManager.setModulePath(\n `${this.id}SubsetMapping`,\n `sonamu.generated`\n );\n Object.keys(this.subsets).map((subsetKey) => {\n EntityManager.setModulePath(\n `${this.id}Subset${subsetKey.toUpperCase()}`,\n `sonamu.generated`\n );\n });\n }\n\n // enums\n Object.keys(this.enumLabels).map((enumId) => {\n EntityManager.setModulePath(enumId, `sonamu.generated`);\n });\n\n // types\n const typesModulePath = `${basePath}/${this.names.parentFs}.types`;\n const typesFileDistPath = path.join(\n Sonamu.apiRootPath,\n `dist/application/${typesModulePath}.js`\n );\n\n if (await exists(typesFileDistPath)) {\n const importPath = path.relative(__dirname, typesFileDistPath);\n const t = await import(importPath);\n this.types = Object.keys(t).reduce((result, key) => {\n EntityManager.setModulePath(key, typesModulePath);\n return {\n ...result,\n [key]: t[key],\n };\n }, {});\n }\n }\n\n registerTableSpecs(): void {\n const uniqueIndexes = this.indexes.filter((idx) => idx.type === \"unique\");\n\n EntityManager.setTableSpec({\n name: this.table,\n uniqueIndexes,\n });\n }\n\n toJson(): EntityJson {\n return {\n id: this.id,\n parentId: this.parentId,\n table: this.table,\n title: this.title,\n props: this.props,\n indexes: this.indexes,\n subsets: this.subsets,\n enums: this.enumLabels,\n };\n }\n\n async save(): Promise<void> {\n // sort: subsets\n const subsetRows = this.getSubsetRows();\n this.subsets = Object.fromEntries(\n Object.entries(this.subsets).map(([subsetKey]) => {\n return [\n subsetKey,\n this.subsetRowsToSubsetFields(subsetRows, subsetKey),\n ];\n })\n );\n\n // save\n const jsonPath = path.join(\n Sonamu.apiRootPath,\n `src/application/${this.names.parentFs}/${this.names.fs}.entity.json`\n );\n const json = this.toJson();\n await writeFile(\n jsonPath,\n await prettier.format(JSON.stringify(json), {\n parser: \"json\",\n })\n );\n\n // reload\n await EntityManager.register(json);\n }\n\n getSubsetRows(\n _subsets?: { [key: string]: string[] },\n prefixes: string[] = []\n ): EntitySubsetRow[] {\n if (prefixes.length > 10) {\n return [];\n }\n\n const subsets = _subsets ?? this.subsets;\n const subsetKeys = Object.keys(subsets);\n const allFields = _.uniq(subsetKeys.map((key) => subsets[key]).flat());\n\n return this.props.map((prop) => {\n if (\n prop.type === \"relation\" &&\n allFields.find((f) =>\n f.startsWith([...prefixes, prop.name].join(\".\") + \".\")\n )\n ) {\n const relEntity = EntityManager.get(prop.with);\n const children = relEntity.getSubsetRows(subsets, [\n ...prefixes,\n `${prop.name}`,\n ]);\n\n return {\n field: prop.name,\n children,\n relationEntity: prop.with,\n prefixes,\n isOpen: children.length > 0,\n has: Object.fromEntries(\n subsetKeys.map((subsetKey) => {\n return [\n subsetKey,\n children.every((child) => child.has[subsetKey] === true),\n ];\n })\n ),\n };\n }\n\n return {\n field: prop.name,\n children: [],\n relationEntity: prop.type === \"relation\" ? prop.with : undefined,\n prefixes,\n has: Object.fromEntries(\n subsetKeys.map((subsetKey) => {\n const subsetFields = subsets[subsetKey];\n const has = subsetFields.some((f) => {\n const field = [...prefixes, prop.name].join(\".\");\n return f === field || f.startsWith(field + \".\");\n });\n return [subsetKey, has];\n })\n ),\n };\n });\n }\n\n subsetRowsToSubsetFields(\n subsetRows: EntitySubsetRow[],\n subsetKey: string\n ): string[] {\n return subsetRows\n .map((subsetRow) => {\n if (subsetRow.children.length > 0) {\n return this.subsetRowsToSubsetFields(subsetRow.children, subsetKey);\n } else if (subsetRow.has[subsetKey]) {\n return subsetRow.prefixes.concat(subsetRow.field).join(\".\");\n } else {\n return null;\n }\n })\n .filter(nonNullable)\n .flat();\n }\n\n async createProp(prop: EntityProp, at?: number): Promise<void> {\n if (!at) {\n this.props.push(prop);\n } else {\n this.props.splice(at, 0, prop);\n }\n await this.save();\n }\n\n analyzeSubsetField(subsetField: string): {\n entityId: string;\n propName: string;\n }[] {\n const arr = subsetField.split(\".\");\n\n let entityId = this.id;\n const result: {\n entityId: string;\n propName: string;\n }[] = [];\n for (let i = 0; i < arr.length; i++) {\n const propName = arr[i];\n result.push({\n entityId,\n propName,\n });\n\n const prop = EntityManager.get(entityId).props.find(\n (p) => p.name === propName\n );\n if (!prop) {\n throw new Error(`${entityId}의 잘못된 서브셋키 ${subsetField}`);\n }\n if (isRelationProp(prop)) {\n entityId = prop.with;\n }\n }\n return result;\n }\n\n async modifyProp(newProp: EntityProp, at: number): Promise<void> {\n // 이전 프롭 이름 저장\n const oldName = this.props[at].name;\n\n // 저장할 엔티티\n const entities: Entity[] = [this];\n\n // 이름이 바뀐 경우\n if (oldName !== newProp.name) {\n // 전체 엔티티에서 현재 수정된 프롭을 참조하고 있는 모든 서브셋필드 찾아서 수정\n const allEntityIds = EntityManager.getAllIds();\n for (const relEntityId of allEntityIds) {\n const relEntity = EntityManager.get(relEntityId);\n const relEntitySubsetKeys = Object.keys(relEntity.subsets);\n for (const subsetKey of relEntitySubsetKeys) {\n const subset = relEntity.subsets[subsetKey];\n\n // 서브셋 필드를 순회하며, 엔티티-프롭 단위로 분석한 후 현재 엔티티-프롭과 일치하는 경우 수정 처리\n const modifiedSubsetFields = subset.map((subsetField) => {\n const analyzed = relEntity.analyzeSubsetField(subsetField);\n const modified = analyzed.map((a) =>\n a.propName === oldName && a.entityId === this.id\n ? {\n ...a,\n propName: newProp.name,\n }\n : a\n );\n // 분석한 필드를 다시 서브셋 필드로 복구\n return modified.map((a) => a.propName).join(\".\");\n });\n\n if (subset.join(\",\") !== modifiedSubsetFields.join(\",\")) {\n relEntity.subsets[subsetKey] = modifiedSubsetFields;\n entities.push(relEntity);\n }\n }\n }\n }\n\n // 프롭 수정\n this.props[at] = newProp;\n\n await Promise.all(entities.map(async (entity) => entity.save()));\n }\n\n async delProp(at: number): Promise<void> {\n // 이전 프롭 이름 저장\n const oldName = this.props[at].name;\n\n // 저장할 엔티티\n const entities: Entity[] = [this];\n\n // 전체 엔티티에서 현재 삭제된 프롭을 참조하고 있는 모든 서브셋필드 찾아서 제외\n const allEntityIds = EntityManager.getAllIds();\n for (const relEntityId of allEntityIds) {\n const relEntity = EntityManager.get(relEntityId);\n const relEntitySubsetKeys = Object.keys(relEntity.subsets);\n for (const subsetKey of relEntitySubsetKeys) {\n const subset = relEntity.subsets[subsetKey];\n // 서브셋 필드를 순회하며, 엔티티-프롭 단위로 분석한 후 현재 엔티티-프롭과 일치하는 경우 이후의 필드를 제외\n const modifiedSubsetFields = subset\n .map((subsetField) => {\n const analyzed = relEntity.analyzeSubsetField(subsetField);\n if (\n analyzed.find(\n (a) => a.propName === oldName && a.entityId === this.id\n )\n ) {\n return null;\n } else {\n return subsetField;\n }\n })\n .filter(nonNullable);\n\n if (subset.join(\",\") !== modifiedSubsetFields.join(\",\")) {\n relEntity.subsets[subsetKey] = modifiedSubsetFields;\n entities.push(relEntity);\n }\n }\n }\n\n // 현재 엔티티의 인덱스에서 제외\n EntityManager.get(this.id).indexes.map((index) => {\n index.columns = index.columns.filter((col) => col !== oldName);\n });\n\n // 프롭 삭제\n this.props.splice(at, 1);\n\n await Promise.all(entities.map(async (entity) => entity.save()));\n }\n\n getEntityIdFromSubsetField(subsetField: string): string {\n if (subsetField.includes(\".\") === false) {\n return this.id;\n }\n\n // 서브셋 필드의 마지막은 프롭이므로 제외\n const arr = subsetField.split(\".\").slice(0, -1);\n\n // 서브셋 필드를 내려가면서 마지막으로 relation된 엔티티를 찾음\n const lastEntityId = arr.reduce((entityId, field) => {\n const relProp = EntityManager.get(entityId).props.find(\n (p) => p.name === field\n );\n if (!relProp || relProp.type !== \"relation\") {\n console.debug({ arr, thisId: this.id, entityId, field });\n throw new Error(`잘못된 서브셋키 ${subsetField}`);\n }\n return relProp.with;\n }, this.id);\n return lastEntityId;\n }\n\n async moveProp(at: number, to: number): Promise<void> {\n const prop = this.props[at];\n const newProps = [...this.props];\n newProps.splice(to, 0, prop);\n newProps.splice(at < to ? at : at + 1, 1);\n this.props = newProps;\n\n await this.save();\n }\n}\n"],"names":["Entity","id","parentId","table","title","props","indexes","subsets","enums","names","propsDict","relations","types","enumLabels","inflection","underscore","pluralize","map","prop","isEnumProp","includes","replace","reduce","result","name","filter","isRelationProp","Object","fromEntries","entries","key","enumLabel","z","enum","keys","parentFs","dasherize","toLowerCase","fs","module","getSubsetQuery","subsetKey","subset","resolveSubsetQuery","prefix","fields","isAlreadyOuterJoined","subsetGroup","_","groupBy","field","split","rel","r","groupKey","realFields","isVirtualProp","virtualFields","select","concat","virtual","relation","undefined","Error","relEntity","EntityManager","get","with","isOneToOneRelationProp","isBelongsToOneRelationProp","relFields","slice","join","length","innerOrOuter","hasJoinColumn","nullable","relSubsetQuery","joinAs","fromTable","joinClause","customJoinClause","custom","from","to","joins","push","as","loaders","convertedLoaders","loader","newAs","manyJoin","oneJoins","isHasManyRelationProp","isManyToManyRelationProp","fromCol","fromColumn","idField","toTable","toCol","joinColumn","through","joinTable","singularize","fieldExprsToPropNodes","fieldExprs","entity","groups","fieldExpr","value","elseExpr","group","propName","nodeType","type","children","find","p","console","log","idProp","flat","getFieldExprs","maxDepth","froms","v","relMd","f","getTableColumns","relationType","nonNullable","registerModulePaths","basePath","typesModulePath","typesFileDistPath","importPath","t","setModulePath","toUpperCase","enumId","path","Sonamu","apiRootPath","exists","relative","__dirname","registerTableSpecs","uniqueIndexes","idx","setTableSpec","toJson","save","subsetRows","jsonPath","json","getSubsetRows","subsetRowsToSubsetFields","prettier","format","JSON","stringify","parser","writeFile","register","_subsets","prefixes","subsetKeys","allFields","uniq","startsWith","relationEntity","isOpen","has","every","child","subsetFields","some","subsetRow","createProp","at","splice","analyzeSubsetField","subsetField","arr","i","entityId","modifyProp","newProp","oldName","entities","allEntityIds","getAllIds","relEntityId","relEntitySubsetKeys","modifiedSubsetFields","analyzed","modified","a","Promise","all","delProp","index","columns","col","getEntityIdFromSubsetField","lastEntityId","relProp","debug","thisId","moveProp","newProps"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exceptions/error-handler.ts"],"sourcesContent":["import { FastifyInstance } from \"fastify\";\nimport { ZodIssue } from \"zod\";\nimport { isSoException } from \"./so-exceptions\";\n\nexport function setupErrorHandler(server: FastifyInstance) {\n server.setErrorHandler((error, request, reply) => {\n error.statusCode ??= 400;\n\n if (isSoException(error) && error.payload && Array.isArray(error.payload)) {\n const issues = error.payload as ZodIssue[];\n const [issue] = issues;\n const message = `${issue.message} (${issue.path.join(\"/\")})`;\n\n request.log.error(`${error.statusCode} ${message}`);\n reply.status(error.statusCode <= 501 ? error.statusCode : 501).send({\n name: error.name,\n code: error.code,\n message: message,\n validationErrors: error.validation,\n issues,\n });\n } else {\n request.log.error(`${error.statusCode} ${error.message}`);\n reply.status(error.statusCode <= 501 ? error.statusCode : 501).send({\n name: error.name,\n code: error.code,\n message: error.message,\n validationErrors: error.validation,\n });\n }\n });\n}\n"],"names":["setupErrorHandler","server","setErrorHandler","error","request","reply","statusCode","isSoException","payload","Array","isArray","issues","issue","message","path","join","log","status","send","name","code","validationErrors","validation"],"mappings":"oGAIgBA,2DAAAA,+CAFc,62CAEvB,SAASA,kBAAkBC,MAAuB,EACvDA,OAAOC,eAAe,CAAC,SAACC,MAAOC,QAASC,WACtCF,sBAAAA,eAAAA,OAAAA,OAAMG,qDAANH,OAAMG,WAAe,IAErB,GAAIC,GAAAA,2BAAa,EAACJ,QAAUA,MAAMK,OAAO,EAAIC,MAAMC,OAAO,CAACP,MAAMK,OAAO,EAAG,CACzE,IAAMG,OAASR,MAAMK,OAAO,CAC5B,IAAgBG,yBAAAA,UAATC,MAASD,WAChB,IAAME,QAAU,AAAC,GAAoBD,OAAlBA,MAAMC,OAAO,CAAC,MAAyB,OAArBD,MAAME,IAAI,CAACC,IAAI,CAAC,KAAK,KAE1DX,QAAQY,GAAG,CAACb,KAAK,CAAC,AAAC,GAAsBU,OAApBV,MAAMG,UAAU,CAAC,KAAW,OAARO,UACzCR,MAAMY,MAAM,CAACd,MAAMG,UAAU,EAAI,IAAMH,MAAMG,UAAU,CAAG,KAAKY,IAAI,CAAC,CAClEC,KAAMhB,MAAMgB,IAAI,CAChBC,KAAMjB,MAAMiB,IAAI,CAChBP,QAASA,QACTQ,iBAAkBlB,MAAMmB,UAAU,CAClCX,OAAAA,MACF,EACF,KAAO,CACLP,QAAQY,GAAG,CAACb,KAAK,CAAC,AAAC,GAAsBA,OAApBA,MAAMG,UAAU,CAAC,KAAiB,OAAdH,MAAMU,OAAO,GACtDR,MAAMY,MAAM,CAACd,MAAMG,UAAU,EAAI,IAAMH,MAAMG,UAAU,CAAG,KAAKY,IAAI,CAAC,CAClEC,KAAMhB,MAAMgB,IAAI,CAChBC,KAAMjB,MAAMiB,IAAI,CAChBP,QAASV,MAAMU,OAAO,CACtBQ,iBAAkBlB,MAAMmB,UAAU,AACpC,EACF,CACF,EACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/exceptions/so-exceptions.ts"],"sourcesContent":["export abstract class SoException extends Error {\n constructor(\n public readonly statusCode: number,\n public message: string,\n public payload?: unknown\n ) {\n super(message);\n }\n}\n\nexport function isSoException(err: any): err is SoException {\n return err.statusCode !== undefined;\n}\n\n/*\n\t잘못된 매개변수 등 요청사항에 문제가 있는 경우\n*/\nexport class BadRequestException extends SoException {\n constructor(\n public message = \"Bad Request\",\n public payload?: unknown\n ) {\n super(400, message, payload);\n }\n}\n\n/*\n\t로그인이 반드시 필요한 케이스에 로그아웃 상태인 경우 / 접근 권한이 없는 요청시\n*/\nexport class UnauthorizedException extends SoException {\n constructor(\n public message = \"Unauthorized\",\n public payload?: unknown\n ) {\n super(401, message, payload);\n }\n}\n\n/*\n\t존재하지 않는 레코드에 접근시\n*/\nexport class NotFoundException extends SoException {\n constructor(\n public message = \"Not Found\",\n public payload?: unknown\n ) {\n super(404, message, payload);\n }\n}\n\n/*\n\t현재 상태에서 처리가 불가능한 케이스\n*/\nexport class ServiceUnavailableException extends SoException {\n constructor(\n public message = \"Service Unavailable\",\n public payload?: unknown\n ) {\n super(503, message, payload);\n }\n}\n\n/*\n\t내부 처리 로직 (외부 API 콜 포함) 오류 발생시\n*/\nexport class InternalServerErrorException extends SoException {\n constructor(\n public message = \"Internal Server Error\",\n public payload?: unknown\n ) {\n super(500, message, payload);\n }\n}\n\n/*\n\t이미 처리함\n*/\nexport class AlreadyProcessedException extends SoException {\n constructor(\n public message = \"Already Processed\",\n public payload?: unknown\n ) {\n super(541, message, payload);\n }\n}\n\n/*\n\t중복 허용하지 않는 케이스에 중복 요청\n*/\nexport class DuplicateRowException extends SoException {\n constructor(\n public message = \"Duplicate Row\",\n public payload?: unknown\n ) {\n super(542, message, payload);\n }\n}\n\n/*\n\t뭔가를 하려고 했으나 대상이 없음\n*/\nexport class TargetNotFoundException extends SoException {\n constructor(\n public message = \"Target Not Found\",\n public payload?: unknown\n ) {\n super(520, message, payload);\n }\n}\n"],"names":["AlreadyProcessedException","BadRequestException","DuplicateRowException","InternalServerErrorException","NotFoundException","ServiceUnavailableException","SoException","TargetNotFoundException","UnauthorizedException","isSoException","statusCode","message","payload","Error","err","undefined"],"mappings":"mPA6EaA,mCAAAA,+BA5DAC,6BAAAA,yBAwEAC,+BAAAA,2BAxBAC,sCAAAA,kCAxBAC,2BAAAA,uBAYAC,qCAAAA,iCArDSC,qBAAAA,iBAqGTC,iCAAAA,6BAxEAC,+BAAAA,2BAnBGC,uBAAAA,ijGAVT,IAAA,AAAeH,yBAAf,wCAAeA,6BAAAA,YAElB,AAAgBI,UAAkB,CAClC,AAAOC,OAAe,CACtB,AAAOC,OAAiB,yBAJNN,6BAMlB,iBANkBA,aAMZK,8IAJUD,WAAAA,iBACTC,QAAAA,cACAC,QAAAA,4BAJWN,gCAAoBO,QAUnC,SAASJ,cAAcK,GAAQ,EACpC,OAAOA,IAAIJ,UAAU,GAAKK,SAC5B,CAKO,IAAA,AAAMd,iCAAN,6CAAMA,0CAAAA,0BAET,AAAOU,QAAP,uDAAiB,cACjB,AAAOC,sEAHEX,qCAKT,iBALSA,qBAKH,IAAKU,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHEX,qBAA4BK,aAYlC,IAAA,AAAME,mCAAN,6CAAMA,4CAAAA,4BAET,AAAOG,QAAP,uDAAiB,eACjB,AAAOC,sEAHEJ,uCAKT,iBALSA,uBAKH,IAAKG,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHEJ,uBAA8BF,aAYpC,IAAA,AAAMF,+BAAN,6CAAMA,wCAAAA,wBAET,AAAOO,QAAP,uDAAiB,YACjB,AAAOC,sEAHER,mCAKT,iBALSA,mBAKH,IAAKO,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHER,mBAA0BE,aAYhC,IAAA,AAAMD,yCAAN,6CAAMA,kDAAAA,kCAET,AAAOM,QAAP,uDAAiB,sBACjB,AAAOC,sEAHEP,6CAKT,iBALSA,6BAKH,IAAKM,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHEP,6BAAoCC,aAY1C,IAAA,AAAMH,0CAAN,6CAAMA,mDAAAA,mCAET,AAAOQ,QAAP,uDAAiB,wBACjB,AAAOC,sEAHET,8CAKT,iBALSA,8BAKH,IAAKQ,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHET,8BAAqCG,aAY3C,IAAA,AAAMN,uCAAN,6CAAMA,gDAAAA,gCAET,AAAOW,QAAP,uDAAiB,oBACjB,AAAOC,sEAHEZ,2CAKT,iBALSA,2BAKH,IAAKW,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHEZ,2BAAkCM,aAYxC,IAAA,AAAMJ,mCAAN,6CAAMA,4CAAAA,4BAET,AAAOS,QAAP,uDAAiB,gBACjB,AAAOC,sEAHEV,uCAKT,iBALSA,uBAKH,IAAKS,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHEV,uBAA8BI,aAYpC,IAAA,AAAMC,qCAAN,6CAAMA,8CAAAA,8BAET,AAAOI,QAAP,uDAAiB,mBACjB,AAAOC,sEAHEL,yCAKT,iBALSA,yBAKH,IAAKI,QAASC,kGAHbD,QAAAA,cACAC,QAAAA,4BAHEL,yBAAgCD"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/file-storage/driver.ts"],"sourcesContent":["import {\n DeleteObjectCommand,\n GetObjectCommand,\n PutObjectCommand,\n S3Client,\n S3ClientConfig,\n} from \"@aws-sdk/client-s3\";\nimport { getSignedUrl } from \"@aws-sdk/s3-request-presigner\";\nimport fs from \"fs/promises\";\nimport path from \"path\";\n\n/**\n * 파일 저장소의 공통 인터페이스\n */\nexport interface Driver {\n put(\n key: string,\n contents: Buffer,\n options?: { contentType?: string; visibility?: \"public\" | \"private\" }\n ): Promise<void>;\n\n del(key: string): Promise<void>;\n\n getUrl(key: string): string;\n\n getSignedUrl(key: string, expiresIn?: number): Promise<string>;\n\n destroy(): void;\n}\n\nexport type FSDriverConfig = {\n location: string;\n urlPrefix: string;\n};\n\n/**\n * 로컬 파일시스템\n */\nexport class FSDriver implements Driver {\n constructor(private config: FSDriverConfig) {}\n\n async put(key: string, contents: Buffer): Promise<void> {\n const filePath = path.join(this.config.location, key);\n const dir = path.dirname(filePath);\n\n await fs.mkdir(dir, { recursive: true });\n\n await fs.writeFile(filePath, contents);\n }\n\n async del(key: string) {\n await fs.rm(path.join(this.config.location, key));\n }\n\n getUrl(key: string): string {\n return `${this.config.urlPrefix}/${key}`;\n }\n\n // 로컬 파일시스템은 signed URL을 지원하지 않으므로 일반 URL 반환\n async getSignedUrl(key: string, _expiresIn?: number): Promise<string> {\n return this.getUrl(key);\n }\n\n destroy() {\n // 아무것도 하지 않음\n }\n}\n\nexport type S3DriverConfig = S3ClientConfig & {\n bucket: string;\n};\n\nexport class S3Driver implements Driver {\n s3: S3Client;\n\n constructor(private config: S3DriverConfig) {\n this.s3 = new S3Client(config);\n }\n\n async put(\n key: string,\n contents: Buffer,\n options?: { contentType?: string; visibility?: \"public\" | \"private\" }\n ): Promise<void> {\n await this.s3.send(\n new PutObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n Body: contents,\n ContentType: options?.contentType,\n ACL: this.getAcl(options?.visibility),\n })\n );\n }\n\n async del(key: string): Promise<void> {\n await this.s3.send(\n new DeleteObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n })\n );\n }\n\n getUrl(key: string): string {\n return `https://${this.config.bucket}.s3.${this.config.region}.amazonaws.com/${key}`;\n }\n\n async getSignedUrl(key: string, expiresIn?: number): Promise<string> {\n const command = new GetObjectCommand({\n Bucket: this.config.bucket,\n Key: key,\n });\n\n return getSignedUrl(this.s3, command, {\n expiresIn: expiresIn ?? 60 * 60 * 24 * 7,\n });\n }\n\n private getAcl(visibility?: \"public\" | \"private\") {\n if (visibility === \"public\") {\n return \"public-read\";\n }\n\n return visibility;\n }\n\n destroy() {\n this.s3.destroy();\n }\n}\n"],"names":["FSDriver","S3Driver","config","put","key","contents","filePath","dir","path","join","location","dirname","fs","mkdir","recursive","writeFile","del","rm","getUrl","urlPrefix","getSignedUrl","_expiresIn","destroy","s3","S3Client","options","send","PutObjectCommand","Bucket","bucket","Key","Body","ContentType","contentType","ACL","getAcl","visibility","DeleteObjectCommand","region","expiresIn","command","GetObjectCommand"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/file-storage/file-storage.ts"],"sourcesContent":["import type { MultipartFile } from \"@fastify/multipart\";\nimport mime from \"mime-types\";\nimport { createHash } from \"crypto\";\nimport type { Driver } from \"./driver\";\n\n/**\n * @fastify/multipart의 MultipartFile 래퍼\n */\nexport class FileStorage {\n private _file: MultipartFile;\n private _buffer?: Buffer;\n private _driver: Driver;\n\n constructor(file: MultipartFile, driver: Driver) {\n this._file = file;\n this._driver = driver;\n }\n\n /**\n * 사용자 컴퓨터의 원본 파일명\n */\n get clientName(): string {\n return this._file.filename;\n }\n\n /**\n * 파일명 (clientName의 별칭)\n */\n get filename(): string {\n return this._file.filename;\n }\n\n /**\n * HTML input 필드명\n */\n get fieldName(): string {\n return this._file.fieldname;\n }\n\n /**\n * 파일 크기 (바이트)\n */\n get size(): number {\n return this._file.file.bytesRead;\n }\n\n /**\n * 파일 확장자 (점 제외)\n */\n get extname(): string | false {\n return mime.extension(this._file.mimetype);\n }\n\n get mimetype(): string {\n return this._file.mimetype;\n }\n\n get encoding(): string {\n return this._file.encoding;\n }\n\n async toBuffer(): Promise<Buffer> {\n if (!this._buffer) {\n this._buffer = await this._file.toBuffer();\n }\n return this._buffer;\n }\n\n async md5(): Promise<string> {\n const buffer = await this.toBuffer();\n return createHash(\"md5\").update(buffer).digest(\"hex\");\n }\n\n /**\n * 파일을 저장소에 저장\n *\n * @example\n * ```typescript\n * const { file } = Sonamu.getUploadContext();\n * const url = await file.saveToDisk('uploads/avatar.png');\n * ```\n */\n async saveToDisk(\n key: string,\n options?: { contentType?: string; visibility?: \"public\" | \"private\" }\n ): Promise<string> {\n const buffer = await this.toBuffer();\n\n await this._driver.put(key, buffer, {\n contentType: options?.contentType ?? this.mimetype,\n visibility: options?.visibility,\n });\n\n return this._driver.getSignedUrl(key);\n }\n\n get raw(): MultipartFile {\n return this._file;\n }\n}\n"],"names":["FileStorage","file","driver","_file","_buffer","_driver","clientName","filename","fieldName","fieldname","size","bytesRead","extname","mime","extension","mimetype","encoding","toBuffer","md5","buffer","createHash","update","digest","saveToDisk","key","options","put","contentType","visibility","getSignedUrl","raw"],"mappings":"oGAQaA,qDAAAA,4EAPI,mCACU,+qFAMpB,IAAA,AAAMA,yBAAN,iCAAMA,YAKCC,IAAmB,CAAEC,MAAc,yBALpCF,aACX,sBAAQG,QAAR,KAAA,GACA,sBAAQC,UAAR,KAAA,GACA,sBAAQC,UAAR,KAAA,EAGE,CAAA,IAAI,CAACF,KAAK,CAAGF,IACb,CAAA,IAAI,CAACI,OAAO,CAAGH,qBAPNF,cAaPM,IAAAA,iBAAJ,eACE,OAAO,IAAI,CAACH,KAAK,CAACI,QAAQ,AAC5B,IAKIA,IAAAA,eAAJ,eACE,OAAO,IAAI,CAACJ,KAAK,CAACI,QAAQ,AAC5B,IAKIC,IAAAA,gBAAJ,eACE,OAAO,IAAI,CAACL,KAAK,CAACM,SAAS,AAC7B,IAKIC,IAAAA,WAAJ,eACE,OAAO,IAAI,CAACP,KAAK,CAACF,IAAI,CAACU,SAAS,AAClC,IAKIC,IAAAA,cAAJ,eACE,OAAOC,kBAAI,CAACC,SAAS,CAAC,IAAI,CAACX,KAAK,CAACY,QAAQ,CAC3C,IAEIA,IAAAA,eAAJ,eACE,OAAO,IAAI,CAACZ,KAAK,CAACY,QAAQ,AAC5B,IAEIC,IAAAA,eAAJ,eACE,OAAO,IAAI,CAACb,KAAK,CAACa,QAAQ,AAC5B,IAEMC,IAAAA,iBAAN,SAAMA,kIACA,CAAC,IAAI,CAACb,OAAO,CAAb,cACF,IAAI,CAAW,SAAM,IAAI,CAACD,KAAK,CAACc,QAAQ,WAAxC,EAAKb,OAAO,CAAG,oCAEjB,SAAO,IAAI,CAACA,OAAO,IACrB,iBAEMc,IAAAA,YAAN,SAAMA,gDACEC,8EAAS,SAAM,IAAI,CAACF,QAAQ,WAA5BE,OAAS,cACf,SAAOC,GAAAA,kBAAU,EAAC,OAAOC,MAAM,CAACF,QAAQG,MAAM,CAAC,UACjD,iBAWMC,IAAAA,mBAAN,SAAMA,WACJC,GAAW,CACXC,OAAqE,4CAE/DN,OAGSM,4FAHA,SAAM,IAAI,CAACR,QAAQ,WAA5BE,OAAS,cAEf,SAAM,IAAI,CAACd,OAAO,CAACqB,GAAG,CAACF,IAAKL,OAAQ,CAClCQ,YAAaF,CAAAA,qBAAAA,gBAAAA,wBAAAA,QAASE,WAAW,UAApBF,8BAAAA,qBAAwB,IAAI,CAACV,QAAQ,CAClDa,UAAU,CAAEH,gBAAAA,wBAAAA,QAASG,UAAU,AACjC,WAHA,cAKA,SAAO,IAAI,CAACvB,OAAO,CAACwB,YAAY,CAACL,QACnC,iBAEIM,IAAAA,UAAJ,eACE,OAAO,IAAI,CAAC3B,KAAK,AACnB,YA1FWH"}
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export type * from \"./api/context\";\nexport * from \"./api/decorators\";\nexport * from \"./api/sonamu\";\nexport * from \"./database/base-model\";\nexport * from \"./api/base-frame\";\nexport * from \"./database/db\";\nexport * from \"./database/upsert-builder\";\nexport * from \"./database/puri\";\nexport * from \"./database/puri-wrapper\";\nexport * from \"./database/puri.types\";\nexport * from \"./exceptions/error-handler\";\nexport * from \"./exceptions/so-exceptions\";\nexport * from \"./stream/sse\";\nexport * from \"./types/types\";\nexport * from \"./utils/controller\";\nexport * from \"./utils/model\";\nexport * from \"./utils/utils\";\nexport * from \"./testing/fixture-manager\";\nexport * from \"./entity/entity-manager\";\nexport * from \"./entity/entity\";\nexport * from \"./migration/migrator\";\nexport * from \"./migration/types\";\nexport * from \"./file-storage/driver\";\n\n// export * from \"./api/code-converters\";\n// export * from \"./entity/entity-utils\";\n// export * from \"./syncer/syncer\";\n"],"names":[],"mappings":"2FACc,kDACA,8CACA,uDACA,kDACA,+CACA,2DACA,iDACA,yDACA,uDACA,4DACA,4DACA,8CACA,+CACA,oDACA,+CACA,+CACA,2DACA,yDACA,iDACA,sDACA,mDACA"}