sonamu 0.5.7 → 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 (358) 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.map +1 -1
  11. package/dist/api/decorators.js +142 -2
  12. package/dist/api/index.js +9 -2
  13. package/dist/api/sonamu.d.ts +8 -22
  14. package/dist/api/sonamu.d.ts.map +1 -1
  15. package/dist/api/sonamu.js +482 -2
  16. package/dist/bin/build-config.d.ts +2 -1
  17. package/dist/bin/build-config.d.ts.map +1 -1
  18. package/dist/bin/build-config.js +12 -2
  19. package/dist/bin/cli-wrapper.js +71 -2
  20. package/dist/bin/cli.js +418 -2
  21. package/dist/bin/hot-hook-register.d.ts +11 -0
  22. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  23. package/dist/bin/hot-hook-register.js +21 -0
  24. package/dist/database/_batch_update.js +78 -2
  25. package/dist/database/base-model.js +247 -2
  26. package/dist/database/code-generator.js +53 -2
  27. package/dist/database/db.d.ts +2 -16
  28. package/dist/database/db.d.ts.map +1 -1
  29. package/dist/database/db.js +132 -2
  30. package/dist/database/knex-plugins/knex-on-duplicate-update.js +39 -2
  31. package/dist/database/puri-wrapper.js +109 -2
  32. package/dist/database/puri.d.ts +23 -16
  33. package/dist/database/puri.d.ts.map +1 -1
  34. package/dist/database/puri.js +539 -2
  35. package/dist/database/puri.types.d.ts +8 -3
  36. package/dist/database/puri.types.d.ts.map +1 -1
  37. package/dist/database/puri.types.js +3 -2
  38. package/dist/database/transaction-context.js +14 -2
  39. package/dist/database/upsert-builder.js +215 -2
  40. package/dist/entity/entity-manager.d.ts +3 -1
  41. package/dist/entity/entity-manager.d.ts.map +1 -1
  42. package/dist/entity/entity-manager.js +114 -2
  43. package/dist/entity/entity-utils.js +210 -2
  44. package/dist/entity/entity.d.ts.map +1 -1
  45. package/dist/entity/entity.js +651 -2
  46. package/dist/exceptions/error-handler.js +29 -2
  47. package/dist/exceptions/so-exceptions.js +85 -2
  48. package/dist/file-storage/driver.js +79 -2
  49. package/dist/file-storage/file-storage.js +75 -2
  50. package/dist/index.d.ts +2 -0
  51. package/dist/index.d.ts.map +1 -1
  52. package/dist/index.js +28 -2
  53. package/dist/migration/code-generation.js +558 -2
  54. package/dist/migration/migration-set.js +364 -2
  55. package/dist/migration/migrator.d.ts +0 -9
  56. package/dist/migration/migrator.d.ts.map +1 -1
  57. package/dist/migration/migrator.js +510 -2
  58. package/dist/migration/types.js +3 -2
  59. package/dist/naite/naite.d.ts +12 -0
  60. package/dist/naite/naite.d.ts.map +1 -0
  61. package/dist/naite/naite.js +72 -0
  62. package/dist/stream/index.js +3 -2
  63. package/dist/stream/sse.js +38 -2
  64. package/dist/syncer/api-parser.d.ts +20 -0
  65. package/dist/syncer/api-parser.d.ts.map +1 -0
  66. package/dist/syncer/api-parser.js +229 -0
  67. package/dist/syncer/checksum.d.ts +21 -0
  68. package/dist/syncer/checksum.d.ts.map +1 -0
  69. package/dist/syncer/checksum.js +98 -0
  70. package/dist/syncer/code-generator.d.ts +20 -0
  71. package/dist/syncer/code-generator.d.ts.map +1 -0
  72. package/dist/syncer/code-generator.js +141 -0
  73. package/dist/syncer/entity-operations.d.ts +17 -0
  74. package/dist/syncer/entity-operations.d.ts.map +1 -0
  75. package/dist/syncer/entity-operations.js +58 -0
  76. package/dist/syncer/file-patterns.d.ts +29 -0
  77. package/dist/syncer/file-patterns.d.ts.map +1 -0
  78. package/dist/syncer/file-patterns.js +38 -0
  79. package/dist/syncer/index.d.ts +6 -0
  80. package/dist/syncer/index.d.ts.map +1 -1
  81. package/dist/syncer/index.js +9 -2
  82. package/dist/syncer/module-loader.d.ts +35 -0
  83. package/dist/syncer/module-loader.d.ts.map +1 -0
  84. package/dist/syncer/module-loader.js +82 -0
  85. package/dist/syncer/syncer.d.ts +93 -108
  86. package/dist/syncer/syncer.d.ts.map +1 -1
  87. package/dist/syncer/syncer.js +375 -2
  88. package/dist/template/entity-converter.d.ts +14 -0
  89. package/dist/template/entity-converter.d.ts.map +1 -0
  90. package/dist/template/entity-converter.js +101 -0
  91. package/dist/template/helpers.d.ts +23 -0
  92. package/dist/template/helpers.d.ts.map +1 -0
  93. package/dist/template/helpers.js +64 -0
  94. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  95. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  96. package/dist/template/implementations/entity.template.js +87 -0
  97. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -3
  98. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  99. package/dist/template/implementations/generated.template.js +232 -0
  100. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -3
  101. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  102. package/dist/template/implementations/generated_http.template.js +131 -0
  103. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +3 -3
  104. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  105. package/dist/template/implementations/generated_sso.template.js +105 -0
  106. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  107. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  108. package/dist/template/implementations/init_types.template.js +38 -0
  109. package/dist/template/implementations/model.template.d.ts +17 -0
  110. package/dist/template/implementations/model.template.d.ts.map +1 -0
  111. package/dist/template/implementations/model.template.js +171 -0
  112. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  113. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  114. package/dist/template/implementations/model_test.template.js +35 -0
  115. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  116. package/dist/template/implementations/service.template.d.ts.map +1 -0
  117. package/dist/template/implementations/service.template.js +193 -0
  118. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  119. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  120. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  121. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  122. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  123. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  124. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  125. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  126. package/dist/template/implementations/view_enums_select.template.js +55 -0
  127. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  128. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  129. package/dist/template/implementations/view_form.template.js +337 -0
  130. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  131. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  132. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  133. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  134. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  135. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  136. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  137. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  138. package/dist/template/implementations/view_list.template.js +465 -0
  139. package/dist/{templates → template/implementations}/view_list_columns.template.d.ts +3 -3
  140. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  141. package/dist/template/implementations/view_list_columns.template.js +49 -0
  142. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  143. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  144. package/dist/template/implementations/view_search_input.template.js +64 -0
  145. package/dist/template/index.d.ts +5 -0
  146. package/dist/template/index.d.ts.map +1 -0
  147. package/dist/template/index.js +6 -0
  148. package/dist/template/template.d.ts +39 -0
  149. package/dist/template/template.d.ts.map +1 -0
  150. package/dist/template/template.js +47 -0
  151. package/dist/template/zod-converter.d.ts +18 -0
  152. package/dist/template/zod-converter.d.ts.map +1 -0
  153. package/dist/template/zod-converter.js +166 -0
  154. package/dist/testing/_relation-graph.js +80 -2
  155. package/dist/testing/fixture-manager.d.ts.map +1 -1
  156. package/dist/testing/fixture-manager.js +521 -2
  157. package/dist/types/types.d.ts +39 -40
  158. package/dist/types/types.d.ts.map +1 -1
  159. package/dist/types/types.js +289 -2
  160. package/dist/typings/knex.d.js +3 -2
  161. package/dist/utils/async-utils.d.ts +7 -0
  162. package/dist/utils/async-utils.d.ts.map +1 -1
  163. package/dist/utils/async-utils.js +57 -2
  164. package/dist/utils/console-util.d.ts +2 -0
  165. package/dist/utils/console-util.d.ts.map +1 -0
  166. package/dist/utils/console-util.js +6 -0
  167. package/dist/utils/controller.js +26 -2
  168. package/dist/utils/esm-utils.d.ts +45 -0
  169. package/dist/utils/esm-utils.d.ts.map +1 -0
  170. package/dist/utils/esm-utils.js +56 -0
  171. package/dist/utils/fs-utils.js +17 -2
  172. package/dist/utils/lodash-able.js +6 -2
  173. package/dist/utils/model.js +22 -2
  174. package/dist/utils/path-utils.d.ts +89 -0
  175. package/dist/utils/path-utils.d.ts.map +1 -0
  176. package/dist/utils/path-utils.js +60 -0
  177. package/dist/utils/process-utils.d.ts +13 -0
  178. package/dist/utils/process-utils.d.ts.map +1 -0
  179. package/dist/utils/process-utils.js +36 -0
  180. package/dist/utils/sql-parser.js +35 -2
  181. package/dist/utils/utils.d.ts +4 -7
  182. package/dist/utils/utils.d.ts.map +1 -1
  183. package/dist/utils/utils.js +33 -2
  184. package/dist/utils/zod-error.d.ts.map +1 -1
  185. package/dist/utils/zod-error.js +19 -2
  186. package/package.json +21 -8
  187. package/src/api/code-converters.ts +2 -2
  188. package/src/api/config.ts +142 -0
  189. package/src/api/context.ts +1 -0
  190. package/src/api/decorators.ts +1 -0
  191. package/src/api/sonamu.ts +81 -67
  192. package/src/bin/build-config.ts +2 -1
  193. package/src/bin/cli-wrapper.ts +10 -3
  194. package/src/bin/cli.ts +108 -56
  195. package/src/bin/hot-hook-register.ts +22 -0
  196. package/src/database/base-model.ts +1 -1
  197. package/src/database/code-generator.ts +1 -1
  198. package/src/database/db.ts +10 -52
  199. package/src/database/puri.ts +78 -53
  200. package/src/database/puri.types.ts +18 -5
  201. package/src/database/upsert-builder.ts +1 -1
  202. package/src/entity/entity-manager.ts +19 -15
  203. package/src/entity/entity.ts +4 -3
  204. package/src/index.ts +2 -0
  205. package/src/migration/code-generation.ts +1 -1
  206. package/src/migration/migration-set.ts +1 -1
  207. package/src/migration/migrator.ts +23 -152
  208. package/src/naite/naite.ts +70 -0
  209. package/src/syncer/api-parser.ts +299 -0
  210. package/src/syncer/checksum.ts +152 -0
  211. package/src/syncer/code-generator.ts +202 -0
  212. package/src/syncer/entity-operations.ts +68 -0
  213. package/src/syncer/file-patterns.ts +56 -0
  214. package/src/syncer/index.ts +6 -0
  215. package/src/syncer/module-loader.ts +125 -0
  216. package/src/syncer/syncer.ts +363 -1420
  217. package/src/template/entity-converter.ts +123 -0
  218. package/src/template/helpers.ts +84 -0
  219. package/src/{templates → template/implementations}/entity.template.ts +4 -4
  220. package/src/{templates → template/implementations}/generated.template.ts +9 -9
  221. package/src/{templates → template/implementations}/generated_http.template.ts +9 -6
  222. package/src/{templates → template/implementations}/generated_sso.template.ts +7 -7
  223. package/src/{templates → template/implementations}/init_types.template.ts +4 -4
  224. package/src/{templates → template/implementations}/model.template.ts +9 -9
  225. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  226. package/src/{templates → template/implementations}/service.template.ts +19 -11
  227. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  228. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +5 -21
  229. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  230. package/src/{templates → template/implementations}/view_form.template.ts +11 -13
  231. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  232. package/src/{templates → template/implementations}/view_id_async_select.template.ts +3 -3
  233. package/src/{templates → template/implementations}/view_list.template.ts +13 -64
  234. package/src/{templates → template/implementations}/view_list_columns.template.ts +3 -3
  235. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  236. package/src/template/index.ts +4 -0
  237. package/src/template/template.ts +86 -0
  238. package/src/template/zod-converter.ts +219 -0
  239. package/src/testing/fixture-manager.ts +8 -1
  240. package/src/types/types.ts +38 -61
  241. package/src/utils/async-utils.ts +17 -0
  242. package/src/utils/console-util.ts +4 -0
  243. package/src/utils/esm-utils.ts +69 -0
  244. package/src/utils/path-utils.ts +102 -0
  245. package/src/utils/process-utils.ts +46 -0
  246. package/src/utils/sql-parser.ts +1 -1
  247. package/src/utils/utils.ts +14 -40
  248. package/src/utils/zod-error.ts +0 -1
  249. package/dist/api/base-frame.js.map +0 -1
  250. package/dist/api/caster.js.map +0 -1
  251. package/dist/api/code-converters.js.map +0 -1
  252. package/dist/api/context.js.map +0 -1
  253. package/dist/api/decorators.js.map +0 -1
  254. package/dist/api/index.js.map +0 -1
  255. package/dist/api/sonamu.js.map +0 -1
  256. package/dist/bin/build-config.js.map +0 -1
  257. package/dist/bin/cli-wrapper.js.map +0 -1
  258. package/dist/bin/cli.js.map +0 -1
  259. package/dist/database/_batch_update.js.map +0 -1
  260. package/dist/database/base-model.js.map +0 -1
  261. package/dist/database/code-generator.js.map +0 -1
  262. package/dist/database/db.js.map +0 -1
  263. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  264. package/dist/database/puri-wrapper.js.map +0 -1
  265. package/dist/database/puri.js.map +0 -1
  266. package/dist/database/puri.types.js.map +0 -1
  267. package/dist/database/transaction-context.js.map +0 -1
  268. package/dist/database/upsert-builder.js.map +0 -1
  269. package/dist/entity/entity-manager.js.map +0 -1
  270. package/dist/entity/entity-utils.js.map +0 -1
  271. package/dist/entity/entity.js.map +0 -1
  272. package/dist/exceptions/error-handler.js.map +0 -1
  273. package/dist/exceptions/so-exceptions.js.map +0 -1
  274. package/dist/file-storage/driver.js.map +0 -1
  275. package/dist/file-storage/file-storage.js.map +0 -1
  276. package/dist/index.js.map +0 -1
  277. package/dist/migration/code-generation.js.map +0 -1
  278. package/dist/migration/migration-set.js.map +0 -1
  279. package/dist/migration/migrator.js.map +0 -1
  280. package/dist/migration/types.js.map +0 -1
  281. package/dist/stream/index.js.map +0 -1
  282. package/dist/stream/sse.js.map +0 -1
  283. package/dist/syncer/index.js.map +0 -1
  284. package/dist/syncer/syncer.js.map +0 -1
  285. package/dist/templates/base-template.d.ts +0 -13
  286. package/dist/templates/base-template.d.ts.map +0 -1
  287. package/dist/templates/base-template.js +0 -2
  288. package/dist/templates/base-template.js.map +0 -1
  289. package/dist/templates/entity.template.d.ts.map +0 -1
  290. package/dist/templates/entity.template.js +0 -2
  291. package/dist/templates/entity.template.js.map +0 -1
  292. package/dist/templates/generated.template.d.ts.map +0 -1
  293. package/dist/templates/generated.template.js +0 -2
  294. package/dist/templates/generated.template.js.map +0 -1
  295. package/dist/templates/generated_http.template.d.ts.map +0 -1
  296. package/dist/templates/generated_http.template.js +0 -2
  297. package/dist/templates/generated_http.template.js.map +0 -1
  298. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  299. package/dist/templates/generated_sso.template.js +0 -2
  300. package/dist/templates/generated_sso.template.js.map +0 -1
  301. package/dist/templates/index.d.ts +0 -2
  302. package/dist/templates/index.d.ts.map +0 -1
  303. package/dist/templates/index.js +0 -2
  304. package/dist/templates/index.js.map +0 -1
  305. package/dist/templates/init_types.template.d.ts.map +0 -1
  306. package/dist/templates/init_types.template.js +0 -2
  307. package/dist/templates/init_types.template.js.map +0 -1
  308. package/dist/templates/model.template.d.ts +0 -17
  309. package/dist/templates/model.template.d.ts.map +0 -1
  310. package/dist/templates/model.template.js +0 -2
  311. package/dist/templates/model.template.js.map +0 -1
  312. package/dist/templates/model_test.template.d.ts.map +0 -1
  313. package/dist/templates/model_test.template.js +0 -2
  314. package/dist/templates/model_test.template.js.map +0 -1
  315. package/dist/templates/service.template.d.ts.map +0 -1
  316. package/dist/templates/service.template.js +0 -2
  317. package/dist/templates/service.template.js.map +0 -1
  318. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  319. package/dist/templates/view_enums_buttonset.template.js +0 -2
  320. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  321. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  322. package/dist/templates/view_enums_dropdown.template.js +0 -2
  323. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  324. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  325. package/dist/templates/view_enums_select.template.js +0 -2
  326. package/dist/templates/view_enums_select.template.js.map +0 -1
  327. package/dist/templates/view_form.template.d.ts.map +0 -1
  328. package/dist/templates/view_form.template.js +0 -2
  329. package/dist/templates/view_form.template.js.map +0 -1
  330. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  331. package/dist/templates/view_id_all_select.template.js +0 -2
  332. package/dist/templates/view_id_all_select.template.js.map +0 -1
  333. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  334. package/dist/templates/view_id_async_select.template.js +0 -2
  335. package/dist/templates/view_id_async_select.template.js.map +0 -1
  336. package/dist/templates/view_list.template.d.ts.map +0 -1
  337. package/dist/templates/view_list.template.js +0 -2
  338. package/dist/templates/view_list.template.js.map +0 -1
  339. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  340. package/dist/templates/view_list_columns.template.js +0 -2
  341. package/dist/templates/view_list_columns.template.js.map +0 -1
  342. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  343. package/dist/templates/view_search_input.template.js +0 -2
  344. package/dist/templates/view_search_input.template.js.map +0 -1
  345. package/dist/testing/_relation-graph.js.map +0 -1
  346. package/dist/testing/fixture-manager.js.map +0 -1
  347. package/dist/types/types.js.map +0 -1
  348. package/dist/typings/knex.d.js.map +0 -1
  349. package/dist/utils/async-utils.js.map +0 -1
  350. package/dist/utils/controller.js.map +0 -1
  351. package/dist/utils/fs-utils.js.map +0 -1
  352. package/dist/utils/lodash-able.js.map +0 -1
  353. package/dist/utils/model.js.map +0 -1
  354. package/dist/utils/sql-parser.js.map +0 -1
  355. package/dist/utils/utils.js.map +0 -1
  356. package/dist/utils/zod-error.js.map +0 -1
  357. package/src/templates/base-template.ts +0 -19
  358. package/src/templates/index.ts +0 -1
@@ -1,9 +1,9 @@
1
+ import { DatabaseSchemaExtend } from "../types/types";
2
+ import { Puri } from "./puri";
3
+ import { PuriWrapper } from "./puri-wrapper";
4
+
1
5
  // 메타데이터 컬럼 제외
2
- type ExcludeMetadataColumns<T> = T extends {
3
- __fulltext__: readonly (infer _Col)[];
4
- }
5
- ? Omit<T, "__fulltext__">
6
- : T;
6
+ type ExcludeMetadataColumns<T> = Exclude<T, "__fulltext__">;
7
7
 
8
8
  // TTables의 모든 테이블에서 사용 가능한 컬럼 경로
9
9
  export type AvailableColumns<TTables extends Record<string, any>> =
@@ -124,3 +124,16 @@ type NullableToOptional<T> = {
124
124
  export type InsertData<T> = NullableToOptional<
125
125
  Omit<T, "id" | "created_at" | "__fulltext__">
126
126
  >;
127
+
128
+ // SubsetQuery를 위한 타입 유틸리티
129
+ type ExtractTTables<T extends Puri<any, any, any>> =
130
+ T extends Puri<any, infer TTables, any> ? TTables : never;
131
+ export type UnionExtractedTTables<
132
+ SubsetKey extends string,
133
+ SubsetQueries extends Record<
134
+ SubsetKey,
135
+ (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => Puri<any, any, any>
136
+ >,
137
+ > = {
138
+ [K in SubsetKey]: ExtractTTables<ReturnType<SubsetQueries[K]>>;
139
+ }[SubsetKey];
@@ -1,5 +1,5 @@
1
1
  import { randomUUID } from "crypto";
2
- import _ from "lodash";
2
+ import * as _ from "lodash-es";
3
3
  import { Knex } from "knex";
4
4
  import { EntityManager } from "../entity/entity-manager";
5
5
  import { nonNullable } from "../utils/utils";
@@ -1,12 +1,13 @@
1
- import chalk from "chalk";
2
1
  import { glob } from "fs/promises";
3
2
  import inflection from "inflection";
4
- import _ from "lodash";
3
+ import * as _ from "lodash-es";
5
4
  import path from "path";
6
5
  import { Entity } from "./entity";
7
6
  import { EntityJson } from "../types/types";
8
7
  import { Sonamu } from "../api/sonamu";
9
8
  import { readFile } from "fs/promises";
9
+ import { AbsolutePath } from "../utils/path-utils";
10
+ import assert from "assert";
10
11
 
11
12
  export type EntityNamesRecord = Record<
12
13
  | "fs"
@@ -30,7 +31,7 @@ class EntityManagerClass {
30
31
  public isAutoloaded: boolean = false;
31
32
 
32
33
  // 경로 전달받아 모든 entity.json 파일 로드
33
- async autoload(doSilent: boolean = false) {
34
+ async autoload(_: boolean = false) {
34
35
  if (this.isAutoloaded) {
35
36
  return;
36
37
  }
@@ -38,30 +39,28 @@ class EntityManagerClass {
38
39
  Sonamu.apiRootPath,
39
40
  "/src/application/**/*.entity.json"
40
41
  );
41
- !doSilent && console.log(chalk.yellow(`autoload ${pathPattern}`));
42
42
 
43
+ let count = 0;
43
44
  for await (const file of glob(path.resolve(pathPattern!))) {
44
45
  await this.register(JSON.parse((await readFile(file)).toString()));
46
+ count++;
45
47
  }
48
+ // !doSilent &&
49
+ // console.log(
50
+ // chalk.gray(
51
+ // `[Loading] Loaded entity definitions from "*.entity.json" files: ${count} files.`
52
+ // )
53
+ // );
54
+
46
55
  this.isAutoloaded = true;
47
56
  }
48
57
 
49
58
  async reload(doSilent: boolean = false) {
50
- console.log("reload");
51
59
  this.entities.clear();
52
60
  this.modulePaths.clear();
53
61
  this.tableSpecs.clear();
54
62
  this.isAutoloaded = false;
55
63
 
56
- const sonamuPath = path.join(
57
- Sonamu.apiRootPath,
58
- `dist/application/sonamu.generated.js`
59
- );
60
- // CJS
61
- if (require?.cache && require.cache[sonamuPath]) {
62
- delete require.cache[sonamuPath];
63
- }
64
-
65
64
  return await this.autoload(doSilent);
66
65
  }
67
66
 
@@ -70,7 +69,6 @@ class EntityManagerClass {
70
69
  await entity.registerModulePaths();
71
70
  entity.registerTableSpecs();
72
71
  this.entities.set(json.id, entity);
73
- // console.debug(chalk.cyan(`register :: ${entity.id}`));
74
72
  }
75
73
 
76
74
  get(entityId: string): Entity {
@@ -152,6 +150,12 @@ class EntityManagerClass {
152
150
  constant: inflection.underscore(entityId).toUpperCase(),
153
151
  };
154
152
  }
153
+
154
+ getEntityIdFromPath(filePath: AbsolutePath): string {
155
+ const matched = filePath.match(/application\/(.+)\//);
156
+ assert(matched?.[1]);
157
+ return inflection.camelize(matched[1].replace(/\-/g, "_"));
158
+ }
155
159
  }
156
160
 
157
161
  export const EntityManager = new EntityManagerClass();
@@ -1,4 +1,5 @@
1
- import _ from "lodash";
1
+ import * as _ from "lodash-es";
2
+ import { createImportUrl } from "../utils/esm-utils";
2
3
  import { EntityManager as EntityManager } from "./entity-manager";
3
4
  import {
4
5
  EntityProp,
@@ -553,8 +554,8 @@ export class Entity {
553
554
  );
554
555
 
555
556
  if (await exists(typesFileDistPath)) {
556
- const importPath = path.relative(__dirname, typesFileDistPath);
557
- const t = await import(importPath);
557
+ const importUrl = createImportUrl(typesFileDistPath);
558
+ const t = await import(importUrl);
558
559
  this.types = Object.keys(t).reduce((result, key) => {
559
560
  EntityManager.setModulePath(key, typesModulePath);
560
561
  return {
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export type * from "./api/context";
2
+ export * from "./api/config";
2
3
  export * from "./api/decorators";
3
4
  export * from "./api/sonamu";
4
5
  export * from "./database/base-model";
@@ -21,6 +22,7 @@ export * from "./entity/entity";
21
22
  export * from "./migration/migrator";
22
23
  export * from "./migration/types";
23
24
  export * from "./file-storage/driver";
25
+ export * from "./naite/naite";
24
26
 
25
27
  // export * from "./api/code-converters";
26
28
  // export * from "./entity/entity-utils";
@@ -1,4 +1,4 @@
1
- import _ from "lodash";
1
+ import * as _ from "lodash-es";
2
2
  import prettier from "prettier";
3
3
  import equal from "fast-deep-equal";
4
4
  import {
@@ -1,6 +1,6 @@
1
1
  import { Knex } from "knex";
2
2
  import { DBColumn, DBForeign, DBIndex } from "./types";
3
- import _ from "lodash";
3
+ import * as _ from "lodash-es";
4
4
  import inflection from "inflection";
5
5
  import { Entity } from "../entity/entity";
6
6
  import { EntityManager } from "../entity/entity-manager";
@@ -1,4 +1,4 @@
1
- import _ from "lodash";
1
+ import * as _ from "lodash-es";
2
2
  import knex, { Knex } from "knex";
3
3
  import chalk from "chalk";
4
4
  import { DateTime } from "luxon";
@@ -73,63 +73,24 @@ export class Migrator {
73
73
  }
74
74
  }
75
75
 
76
- private async getMigrationCodes(): Promise<{
77
- normal: MigrationCode[];
78
- onlyTs: MigrationCode[];
79
- onlyJs: MigrationCode[];
80
- }> {
81
- const srcMigrationsDir = `${Sonamu.apiRootPath}/src/migrations`;
82
- const distMigrationsDir = `${Sonamu.apiRootPath}/dist/migrations`;
76
+ private async getMigrationCodes(): Promise<MigrationCode[]> {
77
+ const srcMigrationsDir = path.join(Sonamu.apiRootPath, "src", "migrations"); // 이건 환경에 관계없이 항상 src에서 찾아야 해요.
83
78
 
84
79
  if (!(await exists(srcMigrationsDir))) {
85
80
  await mkdir(srcMigrationsDir, {
86
81
  recursive: true,
87
82
  });
88
83
  }
89
- if (!(await exists(distMigrationsDir))) {
90
- await mkdir(distMigrationsDir, {
91
- recursive: true,
92
- });
93
- }
94
- const srcMigrations = (await readdir(srcMigrationsDir))
95
- .filter((f) => f.endsWith(".ts"))
96
- .map((f) => f.split(".")[0]);
97
- const distMigrations = (await readdir(distMigrationsDir))
98
- .filter((f) => f.endsWith(".js"))
99
- .map((f) => f.split(".")[0]);
100
-
101
- const normal = _.intersection(srcMigrations, distMigrations)
102
- .map((filename) => {
103
- return {
104
- name: filename,
105
- path: path.join(srcMigrationsDir, filename) + ".ts",
106
- };
107
- })
108
- .sort((a, b) => (a > b ? 1 : -1));
109
84
 
110
- const onlyTs = _.difference(srcMigrations, distMigrations).map(
111
- (filename) => {
112
- return {
113
- name: filename,
114
- path: path.join(srcMigrationsDir, filename) + ".ts",
115
- };
116
- }
117
- );
118
-
119
- const onlyJs = _.difference(distMigrations, srcMigrations).map(
120
- (filename) => {
121
- return {
122
- name: filename,
123
- path: path.join(distMigrationsDir, filename) + ".js",
124
- };
125
- }
126
- );
85
+ const codes = (await readdir(srcMigrationsDir))
86
+ .filter((f) => f.endsWith(".ts"))
87
+ .map((f) => ({
88
+ name: f.replace(".ts", ""),
89
+ path: path.join(srcMigrationsDir, f),
90
+ }))
91
+ .sort((a, b) => (a.name < b.name ? 1 : -1)); // 이름 내림차순 정렬(최신순)
127
92
 
128
- return {
129
- normal,
130
- onlyTs,
131
- onlyJs,
132
- };
93
+ return codes;
133
94
  }
134
95
 
135
96
  /**
@@ -142,25 +103,7 @@ export class Migrator {
142
103
  * @returns
143
104
  */
144
105
  async getStatus(): Promise<MigrationStatus> {
145
- const { normal, onlyTs, onlyJs } = await this.getMigrationCodes();
146
- if (onlyTs.length > 0) {
147
- console.debug({ onlyTs });
148
- throw new ServiceUnavailableException(
149
- `There are un-compiled TS migration files.\nPlease compile them first. You might want to run a development server with HMR.\n\n${onlyTs
150
- .map((f) => f.name)
151
- .join("\n")}`
152
- );
153
- }
154
- if (onlyJs.length > 0) {
155
- console.debug({ onlyJs });
156
- await Promise.all(
157
- onlyJs.map(async (f) => {
158
- execSync(
159
- `rm -f ${f.path.replace("/src/", "/dist/").replace(".ts", ".js")}`
160
- );
161
- })
162
- );
163
- }
106
+ const codes = await this.getMigrationCodes();
164
107
 
165
108
  const connKeys = Object.keys(Sonamu.dbConfig).filter(
166
109
  (key) => key.endsWith("_slave") === false
@@ -187,7 +130,7 @@ export class Migrator {
187
130
  try {
188
131
  const [, fdList] = await tConn.migrate.list();
189
132
  return fdList.map((fd: { file: string }) =>
190
- fd.file.replace(".js", "")
133
+ fd.file.replace(".ts", "")
191
134
  );
192
135
  } catch (err) {
193
136
  return [];
@@ -222,6 +165,11 @@ export class Migrator {
222
165
  const preparedCodes: GenMigrationCode[] = await (async () => {
223
166
  const status0conn = statuses.find((status) => status.status === 0);
224
167
  if (status0conn === undefined) {
168
+ console.warn(
169
+ chalk.yellow(
170
+ `While trying to prepare migration codes, we found that there is no database to compare migrations. We need at least one database where every migration is applied(status === 0). You might want to apply your existing migrations to one of the databases.`
171
+ )
172
+ );
225
173
  return [];
226
174
  }
227
175
 
@@ -235,14 +183,10 @@ export class Migrator {
235
183
 
236
184
  return {
237
185
  conns: statuses,
238
- codes: normal,
186
+ codes,
239
187
  preparedCodes,
240
188
  };
241
189
  /*
242
- TS/JS 코드 컴파일 상태 확인
243
- 1. 원본 파일 없는 JS파일이 존재하는 경우: 삭제
244
- 2. 컴파일 되지 않은 TS파일이 존재하는 경우: throw 쳐서 데브 서버 오픈 요청
245
-
246
190
  DB 마이그레이션 상태 확인
247
191
  1. 전체 DB설정에 대해서 현재 마이그레이션 상태 확인
248
192
  - connKey: string
@@ -355,12 +299,9 @@ export class Migrator {
355
299
  );
356
300
  }
357
301
 
358
- const delFiles = codeNames
359
- .map((codeName) => [
360
- `${Sonamu.apiRootPath}/src/migrations/${codeName}.ts`,
361
- `${Sonamu.apiRootPath}/dist/migrations/${codeName}.js`,
362
- ])
363
- .flat();
302
+ const delFiles = codeNames.map(
303
+ (codeName) => `${Sonamu.apiRootPath}/src/migrations/${codeName}.ts`
304
+ );
364
305
 
365
306
  const res = await Promise.all(
366
307
  delFiles.map(async (delFile) => {
@@ -421,14 +362,13 @@ export class Migrator {
421
362
  ];
422
363
  const migrationsDir = `${Sonamu.apiRootPath}/src/migrations`;
423
364
  const delList = pendingList.map((df) => {
424
- return path.join(migrationsDir, df.file).replace(".js", ".ts");
365
+ return path.join(migrationsDir, df.file);
425
366
  });
426
367
  for (let p of delList) {
427
368
  if (await exists(p)) {
428
369
  await unlink(p);
429
370
  }
430
371
  }
431
- await this.cleanUpDist(true);
432
372
  }
433
373
 
434
374
  /**
@@ -553,75 +493,6 @@ export class Migrator {
553
493
  console.dir({ rollbackAllResult }, { depth: null });
554
494
  console.timeEnd(chalk.red("rollback:"));
555
495
  }
556
-
557
- /**
558
- * 빌드된 마이그레이션 파일을 삭제합니다.
559
- *
560
- * CLI에서 사용됩니다.
561
- *
562
- * @param force 강제 삭제 여부
563
- * @returns
564
- */
565
- async cleanUpDist(force: boolean = false): Promise<void> {
566
- async function getFilesUnder(dir: string): Promise<string[]> {
567
- const migrationPath = path.join(Sonamu.apiRootPath, dir, "migrations");
568
- if (!(await exists(migrationPath))) {
569
- await mkdir(migrationPath, {
570
- recursive: true,
571
- });
572
- }
573
- return (await readdir(migrationPath)).filter(
574
- (filename) => filename.startsWith(".") === false
575
- );
576
- }
577
-
578
- const files = {
579
- src: await getFilesUnder("src"),
580
- dist: await getFilesUnder("dist"),
581
- };
582
-
583
- const diffOnSrc = _.differenceBy(
584
- files.src,
585
- files.dist,
586
- (filename) => filename.split(".")[0]
587
- );
588
- if (diffOnSrc.length > 0) {
589
- throw new Error(
590
- "컴파일 되지 않은 파일이 있습니다.\n" + diffOnSrc.join("\n")
591
- );
592
- }
593
-
594
- const diffOnDist = _.differenceBy(
595
- files.dist,
596
- files.src,
597
- (filename) => filename.split(".")[0]
598
- );
599
- if (diffOnDist.length > 0) {
600
- console.log(chalk.red("원본 ts파일을 찾을 수 없는 js파일이 있습니다."));
601
- console.log(diffOnDist);
602
-
603
- if (!force) {
604
- const answer = await prompts({
605
- type: "confirm",
606
- name: "value",
607
- message: "삭제를 진행하시겠습니까?",
608
- initial: true,
609
- });
610
- if (answer.value === false) {
611
- return;
612
- }
613
- }
614
-
615
- const filesToRm = diffOnDist.map((filename) => {
616
- return path.join(Sonamu.apiRootPath, "dist", "migrations", filename);
617
- });
618
- for (const filePath of filesToRm) {
619
- await unlink(filePath);
620
- }
621
- console.log(chalk.green(`${filesToRm.length}건 삭제되었습니다!`));
622
- }
623
- }
624
-
625
496
  /**
626
497
  * Shadow DB 테스트를 진행합니다.
627
498
  *
@@ -0,0 +1,70 @@
1
+ import { Sonamu } from "../api/sonamu";
2
+
3
+ export class Naite {
4
+ // 테스트 로그 기록
5
+ static t(name: string, value: any) {
6
+ const context = Sonamu.getContext();
7
+ const store = context?.naiteStore;
8
+
9
+ if (!store) {
10
+ return;
11
+ }
12
+ if (store.has(name)) {
13
+ // 이미 값이 있는 경우
14
+ if (Array.isArray(store.get(name))) {
15
+ // 배열에 추가
16
+ store.set(name, [...store.get(name), value]);
17
+ } else {
18
+ // 배열이 아닌 경우 배열로 변환
19
+ store.set(name, [store.get(name), value]);
20
+ }
21
+ } else {
22
+ // 값이 없는 경우 추가
23
+ store.set(name, value);
24
+ }
25
+ }
26
+
27
+ // 테스트에서 값 가져오기
28
+ static get(name: string): any {
29
+ const context = Sonamu.getContext();
30
+ if (!context?.naiteStore || !context.naiteStore.has(name)) {
31
+ throw new Error(`Naite.get: \`${name}\` not found`);
32
+ }
33
+ return context?.naiteStore?.get(name);
34
+ }
35
+
36
+ // 전체 리스트 가져오기
37
+ static getAll(): { [key: string]: any } {
38
+ const context = Sonamu.getContext();
39
+ if (!context?.naiteStore) {
40
+ return {};
41
+ }
42
+ return Object.fromEntries(context.naiteStore.entries());
43
+ }
44
+
45
+ // expect 래퍼 (CJS-ESM 이슈로 현재 사용불가)
46
+ // static expect(name: string) {
47
+ // if (!this.vitestExpect) {
48
+ // throw new Error("Vitest is not initialized");
49
+ // }
50
+ // return this.vitestExpect(this.get(name));
51
+ // }
52
+
53
+ // 일반 로그 레벨
54
+ static d(_message: string) {
55
+ // TODO: Logger 연결
56
+ console.log(`[DEBUG] ${_message}`);
57
+ }
58
+ static i(_message: string) {
59
+ // TODO: Logger 연결
60
+ console.log(`[INFO] ${_message}`);
61
+ }
62
+ static w(_message: string) {
63
+ // TODO: Logger 연결
64
+ console.log(`[WARN] ${_message}`);
65
+ }
66
+ static e(_message: string) {
67
+ // TODO: Logger 연결
68
+ console.log(`[ERROR] ${_message}`);
69
+ }
70
+ }