sonamu 0.4.13 → 0.5.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 (371) hide show
  1. package/.swcrc +15 -0
  2. package/dist/api/base-frame.d.ts +8 -0
  3. package/dist/api/base-frame.d.ts.map +1 -0
  4. package/dist/api/base-frame.js +2 -0
  5. package/dist/api/base-frame.js.map +1 -0
  6. package/dist/api/caster.d.ts +5 -0
  7. package/dist/api/caster.d.ts.map +1 -0
  8. package/dist/api/caster.js +2 -0
  9. package/dist/api/caster.js.map +1 -0
  10. package/dist/api/code-converters.d.ts +23 -0
  11. package/dist/api/code-converters.d.ts.map +1 -0
  12. package/dist/api/code-converters.js +2 -0
  13. package/dist/api/code-converters.js.map +1 -0
  14. package/dist/api/context.d.ts +16 -0
  15. package/dist/api/context.d.ts.map +1 -0
  16. package/dist/api/context.js +2 -0
  17. package/dist/api/context.js.map +1 -0
  18. package/dist/api/decorators.d.ts +50 -0
  19. package/dist/api/decorators.d.ts.map +1 -0
  20. package/dist/api/decorators.js +2 -0
  21. package/dist/api/decorators.js.map +1 -0
  22. package/dist/api/index.d.ts +8 -0
  23. package/dist/api/index.d.ts.map +1 -0
  24. package/dist/api/index.js +2 -0
  25. package/dist/api/index.js.map +1 -0
  26. package/dist/api/sonamu.d.ts +83 -0
  27. package/dist/api/sonamu.d.ts.map +1 -0
  28. package/dist/api/sonamu.js +2 -0
  29. package/dist/api/sonamu.js.map +1 -0
  30. package/dist/api/sonamu.types.d.ts +30 -0
  31. package/dist/api/sonamu.types.d.ts.map +1 -0
  32. package/dist/api/sonamu.types.js +2 -0
  33. package/dist/api/sonamu.types.js.map +1 -0
  34. package/dist/bin/build-config.d.ts +5 -0
  35. package/dist/bin/build-config.d.ts.map +1 -0
  36. package/dist/bin/build-config.js +2 -0
  37. package/dist/bin/build-config.js.map +1 -0
  38. package/dist/bin/cli-wrapper.d.ts +2 -0
  39. package/dist/bin/cli-wrapper.d.ts.map +1 -0
  40. package/dist/bin/cli-wrapper.js +1 -38
  41. package/dist/bin/cli-wrapper.js.map +1 -1
  42. package/dist/bin/cli.d.ts +2 -2
  43. package/dist/bin/cli.d.ts.map +1 -0
  44. package/dist/bin/cli.js +1 -903
  45. package/dist/bin/cli.js.map +1 -1
  46. package/dist/bin/cli.mjs +2 -2
  47. package/dist/{chunk-DMJSNO2L.js → chunk-2WAC2GER.js} +44 -44
  48. package/dist/{chunk-DMJSNO2L.js.map → chunk-2WAC2GER.js.map} +1 -1
  49. package/dist/{chunk-NI37CY4T.mjs → chunk-C3IPIF6O.mjs} +2 -2
  50. package/dist/{chunk-DYFCACHD.js → chunk-EXHKSVTE.js} +7 -7
  51. package/dist/{chunk-QJFHDCBN.mjs → chunk-FCERKIIF.mjs} +2 -2
  52. package/dist/chunk-FCERKIIF.mjs.map +1 -0
  53. package/dist/{chunk-DDJ7T4MA.mjs → chunk-HGIBJYOU.mjs} +2 -2
  54. package/dist/{chunk-NIFOTHBW.mjs → chunk-JKSOJRQA.mjs} +2 -2
  55. package/dist/{chunk-CXAVBVKC.js → chunk-OTKKFP3Y.js} +100 -100
  56. package/dist/{chunk-J6S43O7G.js → chunk-UZ2IY5VE.js} +4 -4
  57. package/dist/database/_batch_update.d.ts +15 -0
  58. package/dist/database/_batch_update.d.ts.map +1 -0
  59. package/dist/database/_batch_update.js +2 -0
  60. package/dist/database/_batch_update.js.map +1 -0
  61. package/dist/database/base-model.d.ts +41 -0
  62. package/dist/database/base-model.d.ts.map +1 -0
  63. package/dist/database/base-model.js +2 -0
  64. package/dist/database/base-model.js.map +1 -0
  65. package/dist/database/code-generator.d.ts +13 -0
  66. package/dist/database/code-generator.d.ts.map +1 -0
  67. package/dist/database/code-generator.js +2 -0
  68. package/dist/database/code-generator.js.map +1 -0
  69. package/dist/database/db.d.ts +40 -0
  70. package/dist/database/db.d.ts.map +1 -0
  71. package/dist/database/db.js +2 -0
  72. package/dist/database/db.js.map +1 -0
  73. package/dist/database/drivers/knex/base-model.js +8 -8
  74. package/dist/database/drivers/knex/base-model.mjs +3 -3
  75. package/dist/database/drivers/kysely/base-model.js +9 -9
  76. package/dist/database/drivers/kysely/base-model.mjs +3 -3
  77. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +2 -0
  78. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +1 -0
  79. package/dist/database/knex-plugins/knex-on-duplicate-update.js +2 -0
  80. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +1 -0
  81. package/dist/database/puri-wrapper.d.ts +34 -0
  82. package/dist/database/puri-wrapper.d.ts.map +1 -0
  83. package/dist/database/puri-wrapper.js +2 -0
  84. package/dist/database/puri-wrapper.js.map +1 -0
  85. package/dist/database/puri.d.ts +83 -0
  86. package/dist/database/puri.d.ts.map +1 -0
  87. package/dist/database/puri.js +2 -0
  88. package/dist/database/puri.js.map +1 -0
  89. package/dist/database/puri.types.d.ts +60 -0
  90. package/dist/database/puri.types.d.ts.map +1 -0
  91. package/dist/database/puri.types.js +2 -0
  92. package/dist/database/puri.types.js.map +1 -0
  93. package/dist/database/transaction-context.d.ts +9 -0
  94. package/dist/database/transaction-context.d.ts.map +1 -0
  95. package/dist/database/transaction-context.js +2 -0
  96. package/dist/database/transaction-context.js.map +1 -0
  97. package/dist/database/types.d.ts +39 -0
  98. package/dist/database/types.d.ts.map +1 -0
  99. package/dist/database/types.js +2 -0
  100. package/dist/database/types.js.map +1 -0
  101. package/dist/database/upsert-builder.d.ts +34 -0
  102. package/dist/database/upsert-builder.d.ts.map +1 -0
  103. package/dist/database/upsert-builder.js +2 -0
  104. package/dist/database/upsert-builder.js.map +1 -0
  105. package/dist/entity/entity-manager.d.ts +32 -0
  106. package/dist/entity/entity-manager.d.ts.map +1 -0
  107. package/dist/entity/entity-manager.js +2 -0
  108. package/dist/entity/entity-manager.js.map +1 -0
  109. package/dist/entity/entity-utils.d.ts +61 -0
  110. package/dist/entity/entity-utils.d.ts.map +1 -0
  111. package/dist/entity/entity-utils.js +2 -0
  112. package/dist/entity/entity-utils.js.map +1 -0
  113. package/dist/entity/entity.d.ts +62 -0
  114. package/dist/entity/entity.d.ts.map +1 -0
  115. package/dist/entity/entity.js +2 -0
  116. package/dist/entity/entity.js.map +1 -0
  117. package/dist/entity/migrator.d.ts +135 -0
  118. package/dist/entity/migrator.d.ts.map +1 -0
  119. package/dist/entity/migrator.js +2 -0
  120. package/dist/entity/migrator.js.map +1 -0
  121. package/dist/exceptions/error-handler.d.ts +3 -0
  122. package/dist/exceptions/error-handler.d.ts.map +1 -0
  123. package/dist/exceptions/error-handler.js +2 -0
  124. package/dist/exceptions/error-handler.js.map +1 -0
  125. package/dist/exceptions/so-exceptions.d.ts +48 -0
  126. package/dist/exceptions/so-exceptions.d.ts.map +1 -0
  127. package/dist/exceptions/so-exceptions.js +2 -0
  128. package/dist/exceptions/so-exceptions.js.map +1 -0
  129. package/dist/file-storage/driver.d.ts +45 -0
  130. package/dist/file-storage/driver.d.ts.map +1 -0
  131. package/dist/file-storage/driver.js +2 -0
  132. package/dist/file-storage/driver.js.map +1 -0
  133. package/dist/file-storage/file-storage.d.ts +50 -0
  134. package/dist/file-storage/file-storage.d.ts.map +1 -0
  135. package/dist/file-storage/file-storage.js +2 -0
  136. package/dist/file-storage/file-storage.js.map +1 -0
  137. package/dist/index.d.ts +22 -813
  138. package/dist/index.d.ts.map +1 -0
  139. package/dist/index.js +1 -433
  140. package/dist/index.js.map +1 -1
  141. package/dist/index.mjs +3 -3
  142. package/dist/migration/code-generation.d.ts +15 -0
  143. package/dist/migration/code-generation.d.ts.map +1 -0
  144. package/dist/migration/code-generation.js +2 -0
  145. package/dist/migration/code-generation.js.map +1 -0
  146. package/dist/migration/migration-set.d.ts +17 -0
  147. package/dist/migration/migration-set.d.ts.map +1 -0
  148. package/dist/migration/migration-set.js +2 -0
  149. package/dist/migration/migration-set.js.map +1 -0
  150. package/dist/migration/migrator.d.ts +130 -0
  151. package/dist/migration/migrator.d.ts.map +1 -0
  152. package/dist/migration/migrator.js +2 -0
  153. package/dist/migration/migrator.js.map +1 -0
  154. package/dist/migration/types.d.ts +52 -0
  155. package/dist/migration/types.d.ts.map +1 -0
  156. package/dist/migration/types.js +2 -0
  157. package/dist/migration/types.js.map +1 -0
  158. package/dist/smd/smd-manager.d.ts +28 -0
  159. package/dist/smd/smd-manager.d.ts.map +1 -0
  160. package/dist/smd/smd-manager.js +2 -0
  161. package/dist/smd/smd-manager.js.map +1 -0
  162. package/dist/smd/smd.d.ts +40 -0
  163. package/dist/smd/smd.d.ts.map +1 -0
  164. package/dist/smd/smd.js +2 -0
  165. package/dist/smd/smd.js.map +1 -0
  166. package/dist/syncer/index.d.ts +2 -0
  167. package/dist/syncer/index.d.ts.map +1 -0
  168. package/dist/syncer/index.js +2 -0
  169. package/dist/syncer/index.js.map +1 -0
  170. package/dist/syncer/syncer.d.ts +127 -0
  171. package/dist/syncer/syncer.d.ts.map +1 -0
  172. package/dist/syncer/syncer.js +2 -0
  173. package/dist/syncer/syncer.js.map +1 -0
  174. package/dist/templates/base-template.d.ts +13 -0
  175. package/dist/templates/base-template.d.ts.map +1 -0
  176. package/dist/templates/base-template.js +2 -0
  177. package/dist/templates/base-template.js.map +1 -0
  178. package/dist/templates/entity.template.d.ts +17 -0
  179. package/dist/templates/entity.template.d.ts.map +1 -0
  180. package/dist/templates/entity.template.js +2 -0
  181. package/dist/templates/entity.template.js.map +1 -0
  182. package/dist/templates/generated.template.d.ts +27 -0
  183. package/dist/templates/generated.template.d.ts.map +1 -0
  184. package/dist/templates/generated.template.js +2 -0
  185. package/dist/templates/generated.template.js.map +1 -0
  186. package/dist/templates/generated_http.template.d.ts +24 -0
  187. package/dist/templates/generated_http.template.d.ts.map +1 -0
  188. package/dist/templates/generated_http.template.js +2 -0
  189. package/dist/templates/generated_http.template.js.map +1 -0
  190. package/dist/templates/generated_sso.template.d.ts +20 -0
  191. package/dist/templates/generated_sso.template.d.ts.map +1 -0
  192. package/dist/templates/generated_sso.template.js +2 -0
  193. package/dist/templates/generated_sso.template.js.map +1 -0
  194. package/dist/templates/index.d.ts +2 -0
  195. package/dist/templates/index.d.ts.map +1 -0
  196. package/dist/templates/index.js +2 -0
  197. package/dist/templates/index.js.map +1 -0
  198. package/dist/templates/init_types.template.d.ts +17 -0
  199. package/dist/templates/init_types.template.d.ts.map +1 -0
  200. package/dist/templates/init_types.template.js +2 -0
  201. package/dist/templates/init_types.template.js.map +1 -0
  202. package/dist/templates/model.template.d.ts +17 -0
  203. package/dist/templates/model.template.d.ts.map +1 -0
  204. package/dist/templates/model.template.js +2 -0
  205. package/dist/templates/model.template.js.map +1 -0
  206. package/dist/templates/model_test.template.d.ts +17 -0
  207. package/dist/templates/model_test.template.d.ts.map +1 -0
  208. package/dist/templates/model_test.template.js +2 -0
  209. package/dist/templates/model_test.template.js.map +1 -0
  210. package/dist/templates/service.template.d.ts +29 -0
  211. package/dist/templates/service.template.d.ts.map +1 -0
  212. package/dist/templates/service.template.js +2 -0
  213. package/dist/templates/service.template.js.map +1 -0
  214. package/dist/templates/view_enums_buttonset.template.d.ts +17 -0
  215. package/dist/templates/view_enums_buttonset.template.d.ts.map +1 -0
  216. package/dist/templates/view_enums_buttonset.template.js +2 -0
  217. package/dist/templates/view_enums_buttonset.template.js.map +1 -0
  218. package/dist/templates/view_enums_dropdown.template.d.ts +18 -0
  219. package/dist/templates/view_enums_dropdown.template.d.ts.map +1 -0
  220. package/dist/templates/view_enums_dropdown.template.js +2 -0
  221. package/dist/templates/view_enums_dropdown.template.js.map +1 -0
  222. package/dist/templates/view_enums_select.template.d.ts +17 -0
  223. package/dist/templates/view_enums_select.template.d.ts.map +1 -0
  224. package/dist/templates/view_enums_select.template.js +2 -0
  225. package/dist/templates/view_enums_select.template.js.map +1 -0
  226. package/dist/templates/view_form.template.d.ts +26 -0
  227. package/dist/templates/view_form.template.d.ts.map +1 -0
  228. package/dist/templates/view_form.template.js +2 -0
  229. package/dist/templates/view_form.template.js.map +1 -0
  230. package/dist/templates/view_id_all_select.template.d.ts +17 -0
  231. package/dist/templates/view_id_all_select.template.d.ts.map +1 -0
  232. package/dist/templates/view_id_all_select.template.js +2 -0
  233. package/dist/templates/view_id_all_select.template.js.map +1 -0
  234. package/dist/templates/view_id_async_select.template.d.ts +17 -0
  235. package/dist/templates/view_id_async_select.template.d.ts.map +1 -0
  236. package/dist/templates/view_id_async_select.template.js +2 -0
  237. package/dist/templates/view_id_async_select.template.js.map +1 -0
  238. package/dist/templates/view_list.template.d.ts +38 -0
  239. package/dist/templates/view_list.template.d.ts.map +1 -0
  240. package/dist/templates/view_list.template.js +2 -0
  241. package/dist/templates/view_list.template.js.map +1 -0
  242. package/dist/templates/view_list_columns.template.d.ts +17 -0
  243. package/dist/templates/view_list_columns.template.d.ts.map +1 -0
  244. package/dist/templates/view_list_columns.template.js +2 -0
  245. package/dist/templates/view_list_columns.template.js.map +1 -0
  246. package/dist/templates/view_search_input.template.d.ts +17 -0
  247. package/dist/templates/view_search_input.template.d.ts.map +1 -0
  248. package/dist/templates/view_search_input.template.js +2 -0
  249. package/dist/templates/view_search_input.template.js.map +1 -0
  250. package/dist/testing/_relation-graph.d.ts +7 -0
  251. package/dist/testing/_relation-graph.d.ts.map +1 -0
  252. package/dist/testing/_relation-graph.js +2 -0
  253. package/dist/testing/_relation-graph.js.map +1 -0
  254. package/dist/testing/fixture-manager.d.ts +35 -0
  255. package/dist/testing/fixture-manager.d.ts.map +1 -0
  256. package/dist/testing/fixture-manager.js +2 -0
  257. package/dist/testing/fixture-manager.js.map +1 -0
  258. package/dist/types/types.d.ts +609 -0
  259. package/dist/types/types.d.ts.map +1 -0
  260. package/dist/types/types.js +2 -0
  261. package/dist/types/types.js.map +1 -0
  262. package/dist/typings/knex.d.js +2 -0
  263. package/dist/typings/knex.d.js.map +1 -0
  264. package/dist/utils/async-utils.d.ts +25 -0
  265. package/dist/utils/async-utils.d.ts.map +1 -0
  266. package/dist/utils/async-utils.js +2 -0
  267. package/dist/utils/async-utils.js.map +1 -0
  268. package/dist/utils/controller.d.ts +9 -0
  269. package/dist/utils/controller.d.ts.map +1 -0
  270. package/dist/utils/controller.js +2 -0
  271. package/dist/utils/controller.js.map +1 -0
  272. package/dist/utils/fs-utils.d.ts +9 -0
  273. package/dist/utils/fs-utils.d.ts.map +1 -0
  274. package/dist/utils/fs-utils.js +2 -0
  275. package/dist/utils/fs-utils.js.map +1 -0
  276. package/dist/utils/lodash-able.d.ts +2 -0
  277. package/dist/utils/lodash-able.d.ts.map +1 -0
  278. package/dist/utils/lodash-able.js +2 -0
  279. package/dist/utils/lodash-able.js.map +1 -0
  280. package/dist/utils/model.d.ts +17 -0
  281. package/dist/utils/model.d.ts.map +1 -0
  282. package/dist/utils/model.js +2 -0
  283. package/dist/utils/model.js.map +1 -0
  284. package/dist/utils/sql-parser.d.ts +4 -0
  285. package/dist/utils/sql-parser.d.ts.map +1 -0
  286. package/dist/utils/sql-parser.js +2 -0
  287. package/dist/utils/sql-parser.js.map +1 -0
  288. package/dist/utils/utils.d.ts +9 -0
  289. package/dist/utils/utils.d.ts.map +1 -0
  290. package/dist/utils/utils.js +2 -0
  291. package/dist/utils/utils.js.map +1 -0
  292. package/dist/utils/zod-error.d.ts +8 -0
  293. package/dist/utils/zod-error.d.ts.map +1 -0
  294. package/dist/utils/zod-error.js +2 -0
  295. package/dist/utils/zod-error.js.map +1 -0
  296. package/nodemon.json +6 -0
  297. package/package.json +29 -44
  298. package/src/api/base-frame.ts +3 -4
  299. package/src/api/caster.ts +22 -23
  300. package/src/api/code-converters.ts +170 -134
  301. package/src/api/context.ts +13 -6
  302. package/src/api/decorators.ts +146 -20
  303. package/src/api/index.ts +2 -0
  304. package/src/api/sonamu.ts +374 -165
  305. package/src/bin/build-config.ts +5 -0
  306. package/src/bin/cli-wrapper.ts +29 -40
  307. package/src/bin/cli.ts +132 -190
  308. package/src/database/_batch_update.ts +10 -15
  309. package/src/database/base-model.ts +300 -216
  310. package/src/database/db.ts +191 -21
  311. package/src/database/{drivers/knex/plugins → knex-plugins}/knex-on-duplicate-update.ts +1 -1
  312. package/src/database/puri-wrapper.ts +129 -0
  313. package/src/database/puri.ts +808 -0
  314. package/src/database/puri.types.ts +222 -0
  315. package/src/database/transaction-context.ts +18 -0
  316. package/src/database/upsert-builder.ts +32 -35
  317. package/src/entity/entity-manager.ts +7 -15
  318. package/src/entity/entity.ts +9 -31
  319. package/src/entity/migrator-/354/235/264/354/202/254/352/260/224/354/226/264/354/232/224.md +1 -0
  320. package/src/file-storage/driver.ts +121 -0
  321. package/src/file-storage/file-storage.ts +100 -0
  322. package/src/index.ts +14 -11
  323. package/src/migration/code-generation.ts +777 -0
  324. package/src/migration/migration-set.ts +453 -0
  325. package/src/migration/migrator.ts +823 -0
  326. package/src/migration/types.ts +53 -0
  327. package/src/shared/web.shared.ts.txt +33 -2
  328. package/src/syncer/syncer.ts +294 -127
  329. package/src/templates/generated.template.ts +13 -1
  330. package/src/templates/generated_http.template.ts +15 -12
  331. package/src/templates/generated_sso.template.ts +50 -2
  332. package/src/templates/model.template.ts +138 -2
  333. package/src/templates/service.template.ts +0 -1
  334. package/src/templates/view_form.template.ts +11 -7
  335. package/src/templates/view_list.template.ts +12 -4
  336. package/src/testing/fixture-manager.ts +229 -174
  337. package/src/types/types.ts +102 -14
  338. package/src/utils/async-utils.ts +64 -0
  339. package/src/utils/fs-utils.ts +17 -0
  340. package/src/utils/model.ts +0 -2
  341. package/src/utils/utils.ts +14 -58
  342. package/src/utils/zod-error.ts +12 -176
  343. package/tsconfig.json +2 -0
  344. package/tsup.config.js +4 -2
  345. package/.pnp.cjs +0 -14363
  346. package/.pnp.loader.mjs +0 -2047
  347. package/.vscode/extensions.json +0 -6
  348. package/.vscode/settings.json +0 -9
  349. package/.yarnrc.yml +0 -5
  350. package/dist/chunk-QJFHDCBN.mjs.map +0 -1
  351. package/src/database/base-model.abstract.ts +0 -97
  352. package/src/database/db.abstract.ts +0 -75
  353. package/src/database/drivers/knex/base-model.ts +0 -55
  354. package/src/database/drivers/knex/client.ts +0 -209
  355. package/src/database/drivers/knex/db.ts +0 -232
  356. package/src/database/drivers/knex/generator.ts +0 -659
  357. package/src/database/drivers/kysely/base-model.ts +0 -89
  358. package/src/database/drivers/kysely/client.ts +0 -309
  359. package/src/database/drivers/kysely/db.ts +0 -238
  360. package/src/database/drivers/kysely/generator.ts +0 -714
  361. package/src/database/types.ts +0 -118
  362. package/src/entity/migrator.ts +0 -1400
  363. package/src/smd/smd-manager.ts +0 -139
  364. package/src/smd/smd.ts +0 -571
  365. package/src/templates/kysely_types.template.ts +0 -205
  366. /package/dist/{chunk-NI37CY4T.mjs.map → chunk-C3IPIF6O.mjs.map} +0 -0
  367. /package/dist/{chunk-DYFCACHD.js.map → chunk-EXHKSVTE.js.map} +0 -0
  368. /package/dist/{chunk-DDJ7T4MA.mjs.map → chunk-HGIBJYOU.mjs.map} +0 -0
  369. /package/dist/{chunk-NIFOTHBW.mjs.map → chunk-JKSOJRQA.mjs.map} +0 -0
  370. /package/dist/{chunk-CXAVBVKC.js.map → chunk-OTKKFP3Y.js.map} +0 -0
  371. /package/dist/{chunk-J6S43O7G.js.map → chunk-UZ2IY5VE.js.map} +0 -0
@@ -171,9 +171,21 @@ export class Template__generated extends Template {
171
171
 
172
172
  const schemaBody = propNodeToZodTypeDef(propNode, importKeys);
173
173
 
174
+ // fulltext index에 포함된 컬럼들 추출
175
+ const fulltextColumns = _.uniq(
176
+ entity.indexes
177
+ .filter((index) => index.type === "fulltext")
178
+ .flatMap((index) => index.columns)
179
+ );
180
+
174
181
  const lines = [
175
182
  `export const ${schemaName} = ${schemaBody}`,
176
- `export type ${schemaName} = z.infer<typeof ${schemaName}>`,
183
+ `export type ${schemaName} = z.infer<typeof ${schemaName}>` +
184
+ (fulltextColumns.length > 0
185
+ ? ` & { readonly __fulltext__: readonly [${fulltextColumns
186
+ .map((col) => `"${col}"`)
187
+ .join(", ")}] }`
188
+ : ""),
177
189
  ];
178
190
 
179
191
  return {
@@ -84,7 +84,7 @@ export class Template__generated_http extends Template {
84
84
  ])
85
85
  );
86
86
  } else if (zodType instanceof z.ZodArray) {
87
- return [this.zodTypeToReqDefault(zodType.element, name)];
87
+ return [this.zodTypeToReqDefault((zodType as z.ZodArray<z.ZodType>).element, name)];
88
88
  } else if (zodType instanceof z.ZodString) {
89
89
  if (name.endsWith("_at") || name.endsWith("_date") || name === "range") {
90
90
  return "2000-01-01";
@@ -95,40 +95,43 @@ export class Template__generated_http extends Template {
95
95
  if (name === "num") {
96
96
  return 24;
97
97
  }
98
- return zodType.minValue ?? 0;
98
+
99
+ const minValue = zodType.minValue ?? 0;
100
+ return minValue > Number.MIN_SAFE_INTEGER ? minValue : 0;
99
101
  } else if (zodType instanceof z.ZodBoolean) {
100
102
  return false;
101
103
  } else if (zodType instanceof z.ZodEnum) {
102
104
  return zodType.options[0];
103
105
  } else if (zodType instanceof z.ZodOptional) {
104
- return this.zodTypeToReqDefault(zodType._def.innerType, name);
106
+ return this.zodTypeToReqDefault((zodType as z.ZodOptional<z.ZodType>).def.innerType, name);
105
107
  } else if (zodType instanceof z.ZodNullable) {
106
108
  return null;
107
109
  } else if (zodType instanceof z.ZodUnion) {
108
- return this.zodTypeToReqDefault(zodType._def.options[0], name);
110
+ return this.zodTypeToReqDefault((zodType as z.ZodUnion<z.ZodType[]>).def.options[0], name);
109
111
  } else if (zodType instanceof z.ZodUnknown) {
110
112
  return "unknown";
111
113
  } else if (zodType instanceof z.ZodTuple) {
112
- return zodType._def.items.map((item: any) =>
114
+ return zodType.def.items.map((item: any) =>
113
115
  this.zodTypeToReqDefault(item, name)
114
116
  );
115
117
  } else if (zodType instanceof z.ZodDate) {
116
118
  return "2000-01-01";
117
119
  } else if (zodType instanceof z.ZodLiteral) {
118
120
  return zodType.value;
119
- } else if (zodType instanceof z.ZodEffects) {
120
- return this.zodTypeToReqDefault(zodType._def.schema, name);
121
121
  } else if (zodType instanceof z.ZodRecord || zodType instanceof z.ZodMap) {
122
- const key = this.zodTypeToReqDefault(zodType._def.keyType, name) as any;
123
- const value = this.zodTypeToReqDefault(zodType._def.valueType, name);
122
+ const kvDef = (zodType as z.ZodRecord<any, z.ZodType> | z.ZodMap<z.ZodType, z.ZodType>).def
123
+ const key = this.zodTypeToReqDefault(kvDef.keyType, name) as any;
124
+ const value = this.zodTypeToReqDefault(kvDef.valueType, name);
124
125
  return { [key]: value };
125
126
  } else if (zodType instanceof z.ZodSet) {
126
- return [this.zodTypeToReqDefault(zodType._def.valueType, name)];
127
+ return [this.zodTypeToReqDefault((zodType as z.ZodSet<z.ZodType>).def.valueType, name)];
127
128
  } else if (zodType instanceof z.ZodIntersection) {
128
- return this.zodTypeToReqDefault(zodType._def.right, name);
129
+ return this.zodTypeToReqDefault((zodType as z.ZodIntersection<z.ZodType, z.ZodType>).def.right, name);
130
+ } else if (zodType instanceof z.ZodDefault) {
131
+ return this.zodTypeToReqDefault((zodType as z.ZodDefault<z.ZodType>).def.innerType, name);
129
132
  } else {
130
133
  // console.log(zodType);
131
- return `unknown-${zodType._type}`;
134
+ return `unknown-${zodType.type}`;
132
135
  }
133
136
  }
134
137
 
@@ -1,4 +1,8 @@
1
- import { SubsetQuery, TemplateOptions } from "../types/types";
1
+ import {
2
+ isManyToManyRelationProp,
3
+ SubsetQuery,
4
+ TemplateOptions,
5
+ } from "../types/types";
2
6
  import { EntityManager } from "../entity/entity-manager";
3
7
  import { Template } from "./base-template";
4
8
  import inflection from "inflection";
@@ -6,6 +10,7 @@ import { SourceCode } from "./generated.template";
6
10
  import _ from "lodash";
7
11
  import { nonNullable } from "../utils/utils";
8
12
  import { Sonamu } from "../api";
13
+ import { Entity } from "../entity/entity";
9
14
 
10
15
  export class Template__generated_sso extends Template {
11
16
  constructor() {
@@ -62,6 +67,12 @@ export class Template__generated_sso extends Template {
62
67
  })
63
68
  .filter(nonNullable);
64
69
 
70
+ // DatabaseSchema 생성
71
+ const dbSchemaSourceCode = this.getDatabaseSchemaSourceCode(entities);
72
+ if (dbSchemaSourceCode) {
73
+ sourceCodes.push(dbSchemaSourceCode);
74
+ }
75
+
65
76
  const sourceCode = sourceCodes.reduce(
66
77
  (result, ts) => {
67
78
  if (ts === null) {
@@ -82,7 +93,44 @@ export class Template__generated_sso extends Template {
82
93
  ...this.getTargetAndPath(),
83
94
  body: sourceCode.lines.join("\n"),
84
95
  importKeys: sourceCode.importKeys,
85
- customHeaders: [`import { SubsetQuery } from "sonamu";`],
96
+ customHeaders: [
97
+ `import { SubsetQuery, ManyToManyBaseSchema } from "sonamu";`,
98
+ ],
99
+ };
100
+ }
101
+
102
+ getDatabaseSchemaSourceCode(entities: Entity[]): SourceCode | null {
103
+ if (entities.length === 0) {
104
+ return null;
105
+ }
106
+
107
+ const entitySchemaLines = entities.map(
108
+ (entity) => `${entity.table}: ${entity.id}BaseSchema;`
109
+ );
110
+
111
+ const joinTableSchemaLines = _.uniq(
112
+ entities.flatMap((entity) =>
113
+ entity.props.filter(isManyToManyRelationProp).map((prop) => {
114
+ const fromTableKey = inflection.singularize(entity.table);
115
+ const toTableKey = inflection.singularize(
116
+ EntityManager.get(prop.with).table
117
+ );
118
+ return `${prop.joinTable}: ManyToManyBaseSchema<"${fromTableKey}", "${toTableKey}">;`;
119
+ })
120
+ )
121
+ );
122
+
123
+ return {
124
+ label: `DatabaseSchema`,
125
+ lines: [
126
+ `declare module "sonamu" {`,
127
+ ` export interface DatabaseSchemaExtend {`,
128
+ ...entitySchemaLines,
129
+ ...joinTableSchemaLines,
130
+ ` }`,
131
+ `}`,
132
+ ],
133
+ importKeys: entities.map((entity) => `${entity.id}BaseSchema`),
86
134
  };
87
135
  }
88
136
  }
@@ -3,7 +3,6 @@ import { EntityManager, EntityNamesRecord } from "../entity/entity-manager";
3
3
  import { Template } from "./base-template";
4
4
  import { Template__view_list } from "./view_list.template";
5
5
  import { Sonamu } from "../api";
6
- import { DB } from "../database/db";
7
6
 
8
7
  export class Template__model extends Template {
9
8
  constructor() {
@@ -25,6 +24,7 @@ export class Template__model extends Template {
25
24
  listParamsNode: RenderingNode
26
25
  ) {
27
26
  const names = EntityManager.getNamesFromId(entityId);
27
+ const entity = EntityManager.get(entityId);
28
28
 
29
29
  const vlTpl = new Template__view_list();
30
30
  if (listParamsNode?.children === undefined) {
@@ -34,7 +34,143 @@ export class Template__model extends Template {
34
34
 
35
35
  return {
36
36
  ...this.getTargetAndPath(names),
37
- body: DB.generator.generateModelTemplate(entityId, def),
37
+ body: `
38
+ import { BaseModelClass, ListResult, asArray, NotFoundException, BadRequestException, api } from 'sonamu';
39
+ import {
40
+ ${entityId}SubsetKey,
41
+ ${entityId}SubsetMapping,
42
+ } from "../sonamu.generated";
43
+ import {
44
+ ${names.camel}SubsetQueries,
45
+ } from "../sonamu.generated.sso";
46
+ import { ${entityId}ListParams, ${entityId}SaveParams } from "./${names.fs}.types";
47
+
48
+ /*
49
+ ${entityId} Model
50
+ */
51
+ class ${entityId}ModelClass extends BaseModelClass {
52
+ modelName = "${entityId}";
53
+
54
+ @api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${entityId}" })
55
+ async findById<T extends ${entityId}SubsetKey>(
56
+ subset: T,
57
+ id: number
58
+ ): Promise<${entityId}SubsetMapping[T]> {
59
+ const { rows } = await this.findMany(subset, {
60
+ id,
61
+ num: 1,
62
+ page: 1,
63
+ });
64
+ if (!rows[0]) {
65
+ throw new NotFoundException(\`존재하지 않는 ${names.capital} ID \${id}\`);
66
+ }
67
+
68
+ return rows[0];
69
+ }
70
+
71
+ async findOne<T extends ${entityId}SubsetKey>(
72
+ subset: T,
73
+ listParams: ${entityId}ListParams
74
+ ): Promise<${entityId}SubsetMapping[T] | null> {
75
+ const { rows } = await this.findMany(subset, {
76
+ ...listParams,
77
+ num: 1,
78
+ page: 1,
79
+ });
80
+
81
+ return rows[0] ?? null;
82
+ }
83
+
84
+ @api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${names.capitalPlural}" })
85
+ async findMany<T extends ${entityId}SubsetKey>(
86
+ subset: T,
87
+ params: ${entityId}ListParams = {}
88
+ ): Promise<ListResult<${entityId}SubsetMapping[T]>> {
89
+ // params with defaults
90
+ params = {
91
+ num: 24,
92
+ page: 1,
93
+ search: "${def.search}",
94
+ orderBy: "${def.orderBy}",
95
+ ...params,
96
+ };
97
+
98
+ // build queries
99
+ let { rows, total } = await this.runSubsetQuery({
100
+ subset,
101
+ params,
102
+ subsetQuery: ${names.camel}SubsetQueries[subset],
103
+ build: ({ qb }) => {
104
+ // id
105
+ if (params.id) {
106
+ qb.whereIn("${entity.table}.id", asArray(params.id));
107
+ }
108
+
109
+ // search-keyword
110
+ if (params.search && params.keyword && params.keyword.length > 0) {
111
+ if (params.search === "id") {
112
+ qb.where("${entity.table}.id", params.keyword);
113
+ // } else if (params.search === "field") {
114
+ // qb.where("${entity.table}.field", "like", \`%\${params.keyword}%\`);
115
+ } else {
116
+ throw new BadRequestException(
117
+ \`구현되지 않은 검색 필드 \${params.search}\`
118
+ );
119
+ }
120
+ }
121
+
122
+ // orderBy
123
+ if (params.orderBy) {
124
+ // default orderBy
125
+ const [orderByField, orderByDirec] = params.orderBy.split("-");
126
+ qb.orderBy("${entity.table}." + orderByField, orderByDirec);
127
+ }
128
+
129
+ return qb;
130
+ },
131
+ debug: false,
132
+ });
133
+
134
+ return {
135
+ rows,
136
+ total,
137
+ };
138
+ }
139
+
140
+ @api({ httpMethod: "POST" })
141
+ async save(
142
+ spa: ${entityId}SaveParams[]
143
+ ): Promise<number[]> {
144
+ const wdb = this.getPuri("w");
145
+
146
+ // register
147
+ spa.map((sp) => {
148
+ wdb.ubRegister("${entity.table}", sp);
149
+ });
150
+
151
+ // transaction
152
+ return wdb.transaction(async (trx) => {
153
+ const ids = await trx.ubUpsert("${entity.table}");
154
+
155
+ return ids;
156
+ });
157
+ }
158
+
159
+ @api({ httpMethod: "POST", guards: [ "admin" ] })
160
+ async del(ids: number[]): Promise<number> {
161
+ const wdb = this.getPuri("w");
162
+
163
+ // transaction
164
+ await wdb.transaction(async (trx) => {
165
+ return trx.table("${entity.table}").whereIn("${entity.table}.id", ids).delete();
166
+ });
167
+
168
+ return ids.length;
169
+ }
170
+ }
171
+
172
+ export const ${entityId}Model = new ${entityId}ModelClass();
173
+ `.trim(),
38
174
  importKeys: [],
39
175
  };
40
176
  }
@@ -73,7 +73,6 @@ export class Template__service extends Template {
73
73
  (param) =>
74
74
  !ApiParamType.isContext(param.type) &&
75
75
  !ApiParamType.isRefKnex(param.type) &&
76
- !ApiParamType.isRefKysely(param.type) &&
77
76
  !(param.optional === true && param.name.startsWith("_")) // _로 시작하는 파라미터는 제외
78
77
  );
79
78
 
@@ -81,6 +81,8 @@ export class Template__view_form extends Template {
81
81
  } else {
82
82
  return `<TextArea rows={8} placeholder="${col.label}" ${regExpr} />`;
83
83
  }
84
+ case "datetime":
85
+ return `<Input type="datetime-local" ${regExpr} />`;
84
86
  case "string-datetime":
85
87
  return `<SQLDateTimeInput ${regExpr} />`;
86
88
  case "string-date":
@@ -147,9 +149,11 @@ export class Template__view_form extends Template {
147
149
  } else if (col.zodType instanceof z.ZodNumber) {
148
150
  value = 0;
149
151
  } else if (col.zodType instanceof z.ZodEnum) {
150
- value = Object.keys(col.zodType.Enum)[0];
152
+ value = Object.keys(col.zodType.options)[0];
151
153
  } else if (col.zodType instanceof z.ZodBoolean) {
152
154
  value = false;
155
+ } else if (col.zodType instanceof z.ZodDate) {
156
+ value = new Date();
153
157
  } else if (col.zodType instanceof z.ZodString) {
154
158
  if (col.renderType === "string-datetime") {
155
159
  value = "now()";
@@ -268,10 +272,10 @@ import {
268
272
  } from 'semantic-ui-react';
269
273
  import { DateTime } from "luxon";
270
274
 
271
- import { BackLink, LinkInput, NumberInput, BooleanToggle, SQLDateTimeInput, SQLDateInput, useTypeForm, useGoBack } from "@sonamu-kit/react-sui";
275
+ import { BackLink, LinkInput, NumberInput, BooleanToggle, SQLDateTimeInput, SQLDateInput, useTypeForm, useGoBack, formatDateTime } from "@sonamu-kit/react-sui";
272
276
  import { defaultCatch } from 'src/services/sonamu.shared';
273
- import { ImageUploader } from 'src/admin-common/ImageUploader';
274
- import { useCommonModal } from "src/admin-common/CommonModal";
277
+ // import { ImageUploader } from 'src/admin-common/ImageUploader';
278
+ // import { useCommonModal } from "src/admin-common/CommonModal";
275
279
 
276
280
  import { ${names.capital}SaveParams } from 'src/services/${names.fs}/${
277
281
  names.fs
@@ -343,14 +347,14 @@ export function ${names.capitalPlural}Form({ id, mode }: ${
343
347
  }, [id]);
344
348
 
345
349
  // CommonModal
346
- const { doneModal, closeModal } = useCommonModal();
350
+ // const { doneModal, closeModal } = useCommonModal();
347
351
 
348
352
  // 저장
349
353
  const { goBack } = useGoBack();
350
354
  const handleSubmit = useCallback(() => {
351
355
  ${names.capital}Service.save([form]).then(([id]) => {
352
356
  if( mode === 'modal' ) {
353
- doneModal();
357
+ // doneModal();
354
358
  } else {
355
359
  goBack('/admin/${names.fsPlural}');
356
360
  }
@@ -383,7 +387,7 @@ export function ${names.capitalPlural}Form({ id, mode }: ${
383
387
  .map((col) => {
384
388
  if (col.name === "created_at") {
385
389
  return `{form.id && (${this.wrapFG(
386
- `<div className="p-8px">{form.${col.name}}</div>`,
390
+ `<div className="p-8px">{formatDateTime(form.${col.name})}</div>`,
387
391
  "등록일시"
388
392
  )})}`;
389
393
  } else {
@@ -54,6 +54,12 @@ export class Template__view_list extends Template {
54
54
  return `<>{${
55
55
  col.nullable ? `${colName} && ` : ""
56
56
  }<img src={${colName}} />}</>`;
57
+ case "datetime":
58
+ if (col.nullable) {
59
+ return `<span className="text-tiny">{${colName} === null ? '-' : formatDateTime(${colName})}</span>`;
60
+ } else {
61
+ return `<span className="text-tiny">{formatDateTime(${colName})}</span>`;
62
+ }
57
63
  case "string-datetime":
58
64
  if (col.nullable) {
59
65
  return `<span className="text-tiny">{${colName} === null ? '-' : dateF(${colName})}</span>`;
@@ -133,7 +139,9 @@ export class Template__view_list extends Template {
133
139
  return `import { ${names.capital}SearchInput } from "src/components/${names.fs}/${names.capital}SearchInput";`;
134
140
  } else if (col.renderType === "enums") {
135
141
  if (col.name === "orderBy") {
136
- const componentId = `${names.capital}${inflection.camelize(col.name)}Select`;
142
+ const componentId = `${names.capital}${inflection.camelize(
143
+ col.name
144
+ )}Select`;
137
145
  return `import { ${componentId} } from "src/components/${names.fs}/${componentId}";`;
138
146
  } else {
139
147
  try {
@@ -217,11 +225,11 @@ export class Template__view_list extends Template {
217
225
  (col) => col.name === "orderBy"
218
226
  )?.zodType;
219
227
  if (orderByZodType && orderByZodType instanceof z.ZodEnum) {
220
- def.orderBy = Object.keys(orderByZodType.Enum)[0];
228
+ def.orderBy = orderByZodType.options[0].toString();
221
229
  }
222
230
  const searchZodType = columns.find((col) => col.name === "search")?.zodType;
223
231
  if (searchZodType && searchZodType instanceof z.ZodEnum) {
224
- def.search = Object.keys(searchZodType.Enum)[0];
232
+ def.search = searchZodType.options[0].toString();
225
233
  }
226
234
  return def;
227
235
  }
@@ -347,7 +355,7 @@ import {
347
355
  } from 'semantic-ui-react';
348
356
  import classNames from 'classnames';
349
357
  import { DateTime } from "luxon";
350
- import { DelButton, EditButton, AppBreadcrumbs, AddButton, useSelection, useListParams, SonamuCol, numF, dateF, datetimeF } from '@sonamu-kit/react-sui';
358
+ import { DelButton, EditButton, AppBreadcrumbs, AddButton, useSelection, useListParams, SonamuCol, numF, formatDate, formatDateTime } from '@sonamu-kit/react-sui';
351
359
 
352
360
  import { ${names.capital}SubsetA } from "src/services/sonamu.generated";
353
361
  import { ${names.capital}Service } from 'src/services/${names.fs}/${