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,130 +1,41 @@
1
- export type ComparisonOperator = "=" | ">" | ">=" | "<" | "<=" | "<>" | "!=";
2
- export type Expand<T> = T extends any[]
3
- ? { [K in keyof T[0]]: T[0][K] }[] // 배열이면 첫 번째 요소를 Expand하고 배열로 감쌈
4
- : T extends object
5
- ? { [K in keyof T]: T[K] }
6
- : T;
1
+ import { DatabaseSchemaExtend } from "../types/types";
2
+ import { Puri } from "./puri";
3
+ import { PuriWrapper } from "./puri-wrapper";
7
4
 
8
- // EmptyRecord가 남아있으면 AvailableColumns 추론이 제대로 되지 않음 (EmptyRecord를 {}로 변경하면 정상 동작함)
9
- export type MergeJoined<TExisting, TNew> = TExisting extends EmptyRecord
10
- ? TNew // 첫 join: EmptyRecord 제거하고 대체
11
- : TExisting & TNew; // 이후 join: 누적
12
-
13
- type DeepEqual<T, U> = [T] extends [U]
14
- ? [U] extends [T]
15
- ? true
16
- : false
17
- : false;
18
- type Extends<T, U> =
19
- DeepEqual<T, Record<string, never>> extends true
20
- ? false
21
- : T extends U
22
- ? true
23
- : false;
24
- type NullableToOptional<T> = {
25
- [K in keyof T as T[K] extends null | undefined ? K : never]?: Exclude<
26
- T[K],
27
- null | undefined
28
- >;
29
- } & Partial<{
30
- [K in keyof T as T[K] extends null | undefined ? never : K]: T[K];
31
- }>;
32
-
33
- // Join 등이 Empty 상태일 떄 {}가 아니라 EmptyRecord를 써서
34
- export type EmptyRecord = Record<string, never>;
5
+ // 메타데이터 컬럼 제외
6
+ type ExcludeMetadataColumns<T> = Exclude<T, "__fulltext__">;
35
7
 
8
+ // TTables의 모든 테이블에서 사용 가능한 컬럼 경로
9
+ export type AvailableColumns<TTables extends Record<string, any>> =
10
+ | {
11
+ [TAlias in keyof TTables]: `${TAlias & string}.${ExcludeMetadataColumns<keyof TTables[TAlias]> & string}`;
12
+ }[keyof TTables]
13
+ | (IsSingleKey<TTables> extends true
14
+ ? ExcludeMetadataColumns<keyof TTables[keyof TTables]> // 단일 테이블이면 컬럼명만도 허용
15
+ : never);
36
16
  // Group By, Order By, Having 등에서 선택 가능한 컬럼
37
17
  export type ResultAvailableColumns<
38
- TSchema,
39
- T extends keyof TSchema | string,
40
- TOriginal = any,
18
+ TTables extends Record<string, any>,
41
19
  TResult = any,
42
- TJoined = EmptyRecord,
43
- > = Exclude<
44
- | AvailableColumns<TSchema, T, TOriginal, TJoined>
45
- | `${keyof TResult & string}`,
46
- "__fulltext__" | `${T & string}.__fulltext__`
47
- >;
20
+ > = AvailableColumns<TTables> | `${keyof TResult & string}`;
48
21
 
49
- // 사용 가능한 컬럼 경로 타입 (메인 테이블 + 조인된 테이블들)
50
- export type AvailableColumns<
51
- TSchema,
52
- T extends keyof TSchema | string,
53
- TOriginal = any,
54
- TJoined = EmptyRecord,
55
- > = T extends keyof TSchema
56
- ? // 기존 테이블 케이스
57
- | (Extends<TJoined, Record<string, any>> extends false
58
- ? // 이게 TSchema[T]에 존재하면
59
- keyof TSchema[T]
60
- : {
61
- [K in keyof TJoined]: TJoined[K] extends Record<string, any>
62
- ? `${string & K}.${keyof TJoined[K] & string}`
63
- : never;
64
- }[keyof TJoined])
65
- | `${T & string}.${keyof TSchema[T] & string}`
66
- : // 서브쿼리 케이스 (T는 alias string)
67
- | keyof TOriginal
68
- | `${T & string}.${keyof TOriginal & string}`
69
- | (Extends<TJoined, Record<string, any>> extends true
70
- ? {
71
- [K in keyof TJoined]: TJoined[K] extends Record<string, any>
72
- ? `${string & K}.${keyof TJoined[K] & string}`
73
- : never;
74
- }[keyof TJoined]
75
- : never);
76
-
77
- // 컬럼 경로에서 타입 추출
78
- export type ExtractColumnType<
79
- TSchema,
80
- T extends keyof TSchema | string,
81
- Path extends string,
82
- TOriginal = any,
83
- TJoined = EmptyRecord,
84
- > = T extends keyof TSchema
85
- ? // 기존 테이블 케이스
86
- Path extends keyof TSchema[T]
87
- ? TSchema[T][Path] // 메인 테이블 컬럼
88
- : Path extends `${T & string}.${infer Column}`
89
- ? Column extends keyof TSchema[T]
90
- ? TSchema[T][Column]
91
- : never
92
- : Path extends `${infer Table}.${infer Column}`
93
- ? Table extends keyof TJoined
94
- ? TJoined[Table] extends Record<string, any>
95
- ? Column extends keyof TJoined[Table]
96
- ? TJoined[Table][Column]
97
- : never
98
- : never
99
- : never
100
- : never
101
- : // 서브쿼리 케이스 (T는 alias)
102
- Path extends `${T & string}.${infer Column}`
103
- ? Column extends keyof TOriginal
104
- ? TOriginal[Column] // 서브쿼리 alias.컬럼
105
- : never
106
- : Path extends `${infer Table}.${infer Column}`
107
- ? Table extends keyof TJoined
108
- ? TJoined[Table] extends Record<string, any>
109
- ? Column extends keyof TJoined[Table]
110
- ? TJoined[Table][Column]
111
- : never
112
- : never
113
- : never
114
- : Path extends keyof TOriginal
115
- ? TOriginal[Path] // 서브쿼리 컬럼 직접 접근 (가장 마지막에)
116
- : never;
22
+ // Select 타입 확장
23
+ export type SelectValue<TTables extends Record<string, any>> =
24
+ | AvailableColumns<TTables>
25
+ | SqlExpression<"string" | "number" | "boolean" | "date">;
117
26
 
118
- // SQL 함수 타입 정의
119
- export type SqlFunction<T extends "string" | "number" | "boolean" | "date"> = {
120
- _type: "sql_function";
121
- _return: T;
122
- _sql: string;
123
- };
27
+ // Select 객체 타입 (현재는 컬럼 경로만 지원)
28
+ export type SelectObject<TTables extends Record<string, any>> = Record<
29
+ string,
30
+ SelectValue<TTables> // AvailableColumns 대신
31
+ >;
124
32
 
125
- // SQL 함수 결과에서 타입 추출
126
- type ExtractSqlType<T> =
127
- T extends SqlFunction<infer R>
33
+ // Select 결과 타입 추론
34
+ export type ParseSelectObject<
35
+ TTables extends Record<string, any>,
36
+ TSelect extends SelectObject<TTables>,
37
+ > = {
38
+ [K in keyof TSelect]: TSelect[K] extends SqlExpression<infer R>
128
39
  ? R extends "string"
129
40
  ? string
130
41
  : R extends "number"
@@ -134,96 +45,95 @@ type ExtractSqlType<T> =
134
45
  : R extends "date"
135
46
  ? Date
136
47
  : never
48
+ : ExtractColumnType<TTables, TSelect[K] & string>;
49
+ };
50
+
51
+ // 컬럼 경로에서 타입 추출
52
+ export type ExtractColumnType<
53
+ TTables extends Record<string, any>,
54
+ Path extends string,
55
+ > = Path extends `${infer TAlias}.${infer TColumn}`
56
+ ? TAlias extends keyof TTables
57
+ ? TColumn extends keyof TTables[TAlias]
58
+ ? TTables[TAlias][TColumn]
59
+ : never
60
+ : never
61
+ : IsSingleKey<TTables> extends true // 추가
62
+ ? Path extends keyof TTables[keyof TTables]
63
+ ? TTables[keyof TTables][Path]
64
+ : never
137
65
  : never;
66
+ // Where 조건 객체 타입
67
+ // 예: { "u.id": 1, "u.status": "active" }
68
+ export type WhereCondition<TTables extends Record<string, any>> = {
69
+ [key in AvailableColumns<TTables>]?: ExtractColumnType<TTables, key & string>;
70
+ };
138
71
 
139
- // Select 타입 확장
140
- export type SelectValue<
141
- TSchema,
142
- T extends keyof TSchema | string,
143
- TOriginal = any,
144
- TJoined = EmptyRecord,
145
- > =
146
- | AvailableColumns<TSchema, T, TOriginal, TJoined> // 기존 컬럼
147
- | SqlFunction<"string" | "number" | "boolean" | "date">; // SQL 함수
72
+ // Fulltext index 컬럼 추출 타입
73
+ export type FulltextColumns<TTables extends Record<string, any>> = {
74
+ [TAlias in keyof TTables]: TTables[TAlias] extends {
75
+ __fulltext__: readonly (infer Col)[];
76
+ }
77
+ ? Col extends string
78
+ ? `${TAlias & string}.${Col}`
79
+ : never
80
+ : never;
81
+ }[keyof TTables];
148
82
 
149
- // Select 객체 타입 정의
150
- export type SelectObject<
151
- TSchema,
152
- T extends keyof TSchema | string,
153
- TOriginal = any,
154
- TJoined = EmptyRecord,
155
- > = Record<string, SelectValue<TSchema, T, TOriginal, TJoined>>;
83
+ // 비교 연산자
84
+ export type ComparisonOperator = "=" | ">" | ">=" | "<" | "<=" | "<>" | "!=";
156
85
 
157
- // Select 결과 타입 추론
158
- export type ParseSelectObject<
159
- TSchema,
160
- T extends keyof TSchema | string,
161
- S extends SelectObject<TSchema, T, TOriginal, TJoined>,
162
- TOriginal = any,
163
- TJoined = EmptyRecord,
164
- > = {
165
- [K in keyof S]: S[K] extends SqlFunction<any>
166
- ? ExtractSqlType<S[K]> // SQL 함수면 타입 추출
167
- : ExtractColumnType<TSchema, T, S[K] & string, TOriginal, TJoined>;
168
- };
86
+ // SQL Expression 타입 정의
87
+ export type SqlExpression<T extends "string" | "number" | "boolean" | "date"> =
88
+ {
89
+ _type: "sql_expression"; // 또는 "computed_value"
90
+ _return: T;
91
+ _sql: string;
92
+ };
169
93
 
170
- // Where 조건 타입 (조인된 테이블 컬럼도 포함)
171
- export type WhereCondition<
172
- TSchema,
173
- T extends keyof TSchema | string,
174
- TOriginal = any,
175
- TJoined = EmptyRecord,
176
- > = {
177
- [key in AvailableColumns<TSchema, T, TOriginal, TJoined>]?: ExtractColumnType<
178
- TSchema,
179
- T,
180
- key & string,
181
- TOriginal,
182
- TJoined
183
- >;
184
- };
94
+ // 결과 타입 가독성을 위한 타입 확장
95
+ export type Expand<T> = T extends any[]
96
+ ? { [K in keyof T[0]]: T[0][K] }[] // 배열이면 첫 번째 요소를 Expand하고 배열로 감쌈
97
+ : T extends object
98
+ ? { [K in keyof T]: T[K] }
99
+ : T;
185
100
 
186
- // Fulltext index 컬럼 추출 타입 (메인 테이블 + 조인된 테이블)
187
- export type FulltextColumns<
188
- TSchema,
189
- T extends keyof TSchema | string,
190
- TOriginal = any,
191
- TJoined = EmptyRecord,
192
- > = T extends keyof TSchema
193
- ? // 기존 테이블 케이스
194
- | (TSchema[T] extends { __fulltext__: readonly (infer Col)[] }
195
- ? Col & string
196
- : never)
197
- | (TSchema[T] extends { __fulltext__: readonly (infer Col)[] }
198
- ? `${T & string}.${Col & string}`
199
- : never)
200
- | (TJoined extends Record<string, any>
201
- ? {
202
- [K in keyof TJoined]: TJoined[K] extends {
203
- __fulltext__: readonly (infer Col)[];
204
- }
205
- ? (Col & string) | `${string & K}.${Col & string}`
206
- : never;
207
- }[keyof TJoined]
208
- : never)
209
- : // 서브쿼리 케이스 (T는 alias)
210
- | (TOriginal extends { __fulltext__: readonly (infer Col)[] }
211
- ? Col & string
212
- : never)
213
- | (TOriginal extends { __fulltext__: readonly (infer Col)[] }
214
- ? `${T & string}.${Col & string}`
215
- : never)
216
- | (TJoined extends Record<string, any>
217
- ? {
218
- [K in keyof TJoined]: TJoined[K] extends {
219
- __fulltext__: readonly (infer Col)[];
220
- }
221
- ? (Col & string) | `${string & K}.${Col & string}`
222
- : never;
223
- }[keyof TJoined]
224
- : never);
101
+ type IsSingleKey<TTables extends Record<string, any>> =
102
+ keyof TTables extends infer K
103
+ ? K extends keyof TTables
104
+ ? keyof TTables extends K // 역방향 체크로 단일 키 확인
105
+ ? true
106
+ : false
107
+ : false
108
+ : false;
109
+
110
+ export type SingleTableValue<TTables extends Record<string, any>> =
111
+ IsSingleKey<TTables> extends true ? TTables[keyof TTables] : never;
112
+
113
+ // Nullable을 Optional로 변환
114
+ type NullableToOptional<T> = {
115
+ [K in keyof T as T[K] extends null | undefined ? K : never]?: Exclude<
116
+ T[K],
117
+ null | undefined
118
+ >;
119
+ } & Partial<{
120
+ [K in keyof T as T[K] extends null | undefined ? never : K]: T[K];
121
+ }>;
225
122
 
226
123
  // Insert 타입: id, created_at 제외
227
124
  export type InsertData<T> = NullableToOptional<
228
125
  Omit<T, "id" | "created_at" | "__fulltext__">
229
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,14 +1,14 @@
1
- import type { PuriWrapper } from "./puri-wrapper";
1
+ import type { PuriTransactionWrapper } from "./puri-wrapper";
2
2
  import type { DBPreset } from "./db";
3
3
 
4
4
  export class TransactionContext {
5
- private transactions: Map<DBPreset, PuriWrapper> = new Map();
5
+ private transactions: Map<DBPreset, PuriTransactionWrapper> = new Map();
6
6
 
7
- getTransaction(preset: DBPreset): PuriWrapper | undefined {
7
+ getTransaction(preset: DBPreset): PuriTransactionWrapper | undefined {
8
8
  return this.transactions.get(preset);
9
9
  }
10
10
 
11
- setTransaction(preset: DBPreset, trx: PuriWrapper): void {
11
+ setTransaction(preset: DBPreset, trx: PuriTransactionWrapper): void {
12
12
  this.transactions.set(preset, trx);
13
13
  }
14
14
 
@@ -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";