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
@@ -1,714 +0,0 @@
1
- import _ from "lodash";
2
- import prettier from "prettier";
3
- import equal from "fast-deep-equal";
4
- import {
5
- GenMigrationCode,
6
- MigrationColumn,
7
- MigrationForeign,
8
- MigrationIndex,
9
- } from "../../../types/types";
10
- import { CodeGenerator } from "../../code-generator";
11
- import { EntityManager } from "../../../entity/entity-manager";
12
-
13
- export class KyselyGenerator extends CodeGenerator {
14
- async generateCreateCode_ColumnAndIndexes(
15
- table: string,
16
- columns: MigrationColumn[],
17
- indexes: MigrationIndex[]
18
- ): Promise<GenMigrationCode> {
19
- // 컬럼, 인덱스 처리
20
- const lines: string[] = [
21
- "// @ts-ignore",
22
- 'import { Kysely, sql } from "kysely";',
23
- 'import { Database } from "sonamu";',
24
- "",
25
- "export async function up(db: Kysely<Database>): Promise<void> {",
26
- `await db.schema.createTable("${table}")`,
27
- ...this.genColumnDefinitions(columns),
28
- ".execute();",
29
- "",
30
- "// indexes",
31
- ...this.genIndexDefinitions(table, indexes),
32
- "}",
33
- "",
34
- "export async function down(db: Kysely<Database>): Promise<void> {",
35
- ` await db.schema.dropTable("${table}").execute();`,
36
- "}",
37
- ];
38
-
39
- return {
40
- table,
41
- type: "normal",
42
- title: `create__${table}`,
43
- formatted: await prettier.format(lines.join("\n"), {
44
- parser: "typescript",
45
- }),
46
- };
47
- }
48
-
49
- /*
50
- 테이블 생성하는 케이스 - FK 생성
51
- */
52
- async generateCreateCode_Foreign(
53
- table: string,
54
- foreigns: MigrationForeign[]
55
- ): Promise<GenMigrationCode[]> {
56
- if (foreigns.length === 0) {
57
- return [];
58
- }
59
-
60
- const { up, down } = this.genForeignDefinitions(table, foreigns);
61
- if (up.length === 0 && down.length === 0) {
62
- console.log("fk 가 뭔가 다릅니다");
63
- return [];
64
- }
65
-
66
- const lines: string[] = [
67
- "// @ts-ignore",
68
- 'import { Kysely, sql } from "kysely";',
69
- 'import { Database } from "sonamu";',
70
- "",
71
- "export async function up(db: Kysely<Database>): Promise<void> {",
72
- ...up,
73
- "}",
74
- "",
75
- "export async function down(db: Kysely<Database>): Promise<void> {",
76
- ...down,
77
- "}",
78
- ];
79
-
80
- const foreignKeysString = foreigns
81
- .map((foreign) => foreign.columns.join("_"))
82
- .join("_");
83
- return [
84
- {
85
- table,
86
- type: "foreign",
87
- title: `foreign__${table}__${foreignKeysString}`,
88
- formatted: await prettier.format(lines.join("\n"), {
89
- parser: "typescript",
90
- }),
91
- },
92
- ];
93
- }
94
-
95
- async generateAlterCode_ColumnAndIndexes(
96
- table: string,
97
- entityColumns: MigrationColumn[],
98
- entityIndexes: MigrationIndex[],
99
- dbColumns: MigrationColumn[],
100
- dbIndexes: MigrationIndex[]
101
- ): Promise<GenMigrationCode[]> {
102
- /*
103
- 세부 비교 후 다른점 찾아서 코드 생성
104
-
105
- 1. 컬럼갯수 다름: MD에 있으나, DB에 없다면 추가
106
- 2. 컬럼갯수 다름: MD에 없으나, DB에 있다면 삭제
107
- 3. 그외 컬럼(컬럼 갯수가 동일하거나, 다른 경우 동일한 컬럼끼리) => alter
108
- 4. 다른거 다 동일하고 index만 변경되는 경우
109
-
110
- ** 컬럼명을 변경하는 경우는 따로 핸들링하지 않음
111
- => drop/add 형태의 마이그레이션 코드가 생성되는데, 수동으로 rename 코드로 수정하여 처리
112
- */
113
-
114
- // 각 컬럼 이름 기준으로 add, drop, alter 여부 확인
115
- const alterColumnsTo = this.getAlterColumnsTo(entityColumns, dbColumns);
116
-
117
- // 추출된 컬럼들을 기준으로 각각 라인 생성
118
- const alterColumnLinesTo = this.getAlterColumnLinesTo(
119
- alterColumnsTo,
120
- entityColumns
121
- );
122
-
123
- // 인덱스의 add, drop 여부 확인
124
- const alterIndexesTo = this.getAlterIndexesTo(entityIndexes, dbIndexes);
125
-
126
- // 추출된 인덱스들을 기준으로 각각 라인 생성
127
- const alterIndexLinesTo = this.getAlterIndexLinesTo(
128
- table,
129
- alterIndexesTo,
130
- alterColumnsTo
131
- );
132
-
133
- const alterColumnsToExist =
134
- _.sumBy(Object.values(alterColumnsTo), (v) => v.length) > 0;
135
- const lines: string[] = [
136
- "// @ts-ignore",
137
- 'import { Kysely, sql } from "kysely";',
138
- 'import { Database } from "sonamu";',
139
- "",
140
- "export async function up(db: Kysely<Database>): Promise<void> {",
141
- ...(alterColumnsToExist
142
- ? [
143
- `await db.schema.alterTable("${table}")`,
144
- ...(alterColumnsTo.add.length > 0 ? alterColumnLinesTo.add.up : []),
145
- ...(alterColumnsTo.drop.length > 0
146
- ? alterColumnLinesTo.drop.up
147
- : []),
148
- ...(alterColumnsTo.alter.length > 0
149
- ? alterColumnLinesTo.alter.up
150
- : []),
151
- ".execute();",
152
- ]
153
- : []),
154
- ...(alterIndexesTo.add.length > 0 ? alterIndexLinesTo.add.up : []),
155
- ...(alterIndexesTo.drop.length > 0 ? alterIndexLinesTo.drop.up : []),
156
- "}",
157
- "",
158
- "export async function down(db: Kysely<Database>): Promise<void> {",
159
- ...(alterColumnsToExist
160
- ? [
161
- `await db.schema.alterTable("${table}")`,
162
- ...(alterColumnsTo.add.length > 0
163
- ? alterColumnLinesTo.add.down
164
- : []),
165
- ...(alterColumnsTo.drop.length > 0
166
- ? alterColumnLinesTo.drop.down
167
- : []),
168
- ...(alterColumnsTo.alter.length > 0
169
- ? alterColumnLinesTo.alter.down
170
- : []),
171
- ".execute();",
172
- ]
173
- : []),
174
- ...(alterIndexLinesTo.add.down.length > 0
175
- ? alterIndexLinesTo.add.down
176
- : []),
177
- ...(alterIndexLinesTo.drop.down.length > 0
178
- ? alterIndexLinesTo.drop.down
179
- : []),
180
- "}",
181
- ];
182
-
183
- const formatted = await prettier.format(lines.join("\n"), {
184
- parser: "typescript",
185
- });
186
-
187
- const title = [
188
- "alter",
189
- table,
190
- ...(["add", "drop", "alter"] as const)
191
- .map((action) => {
192
- const len = alterColumnsTo[action].length;
193
- if (len > 0) {
194
- return action + len;
195
- }
196
- return null;
197
- })
198
- .filter((part) => part !== null),
199
- ].join("_");
200
-
201
- return [
202
- {
203
- table,
204
- title,
205
- formatted,
206
- type: "normal",
207
- },
208
- ];
209
- }
210
-
211
- async generateAlterCode_Foreigns(
212
- table: string,
213
- entityForeigns: MigrationForeign[],
214
- dbForeigns: MigrationForeign[]
215
- ): Promise<GenMigrationCode[]> {
216
- const getKey = (mf: MigrationForeign): string => {
217
- return [mf.columns.join("-"), mf.to].join("///");
218
- };
219
- const fkTo = entityForeigns.reduce(
220
- (result, entityF) => {
221
- const matchingDbF = dbForeigns.find(
222
- (dbF) => getKey(entityF) === getKey(dbF)
223
- );
224
- if (!matchingDbF) {
225
- result.add.push(entityF);
226
- return result;
227
- }
228
-
229
- if (equal(entityF, matchingDbF) === false) {
230
- result.alterSrc.push(matchingDbF);
231
- result.alterDst.push(entityF);
232
- return result;
233
- }
234
- return result;
235
- },
236
- {
237
- add: [] as MigrationForeign[],
238
- alterSrc: [] as MigrationForeign[],
239
- alterDst: [] as MigrationForeign[],
240
- }
241
- );
242
-
243
- const linesTo = {
244
- add: this.genForeignDefinitions(table, fkTo.add),
245
- alterSrc: this.genForeignDefinitions(table, fkTo.alterSrc),
246
- alterDst: this.genForeignDefinitions(table, fkTo.alterDst),
247
- };
248
-
249
- const lines: string[] = [
250
- "// @ts-ignore",
251
- 'import { Kysely, sql } from "kysely";',
252
- 'import { Database } from "sonamu";',
253
- "",
254
- "export async function up(db: Kysely<Database>): Promise<void> {",
255
- ...linesTo.add.up,
256
- ...linesTo.alterSrc.down,
257
- ...linesTo.alterDst.up,
258
- "}",
259
- "",
260
- "export async function down(db: Kysely<Database>): Promise<void> {",
261
- ...linesTo.add.down,
262
- ...linesTo.alterDst.down,
263
- ...linesTo.alterSrc.up,
264
- "}",
265
- ];
266
-
267
- const formatted = await prettier.format(lines.join("\n"), {
268
- parser: "typescript",
269
- });
270
-
271
- const title = [
272
- "alter",
273
- table,
274
- "foreigns",
275
- // TODO 바뀌는 부분
276
- ].join("_");
277
-
278
- return [
279
- {
280
- table,
281
- title,
282
- formatted,
283
- type: "normal",
284
- },
285
- ];
286
- }
287
-
288
- generateModelTemplate(
289
- entityId: string,
290
- def: { orderBy: string; search: string }
291
- ) {
292
- const names = EntityManager.getNamesFromId(entityId);
293
- const entity = EntityManager.get(entityId);
294
-
295
- return `
296
- import { ListResult, asArray, NotFoundException, BadRequestException, api } from 'sonamu';
297
- import { BaseModelClass } from 'sonamu/kysely';
298
- import {
299
- ${entityId}SubsetKey,
300
- ${entityId}SubsetMapping,
301
- } from "../sonamu.generated";
302
- import {
303
- ${names.camel}SubsetQueries,
304
- } from "../sonamu.generated.sso";
305
- import { ${entityId}ListParams, ${entityId}SaveParams } from "./${names.fs}.types";
306
-
307
- /*
308
- ${entityId} Model
309
- */
310
- class ${entityId}ModelClass extends BaseModelClass {
311
- modelName = "${entityId}";
312
-
313
- @api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${entityId}" })
314
- async findById<T extends ${entityId}SubsetKey>(
315
- subset: T,
316
- id: number
317
- ): Promise<${entityId}SubsetMapping[T]> {
318
- const { rows } = await this.findMany(subset, {
319
- id,
320
- num: 1,
321
- page: 1,
322
- });
323
- if (rows.length == 0) {
324
- throw new NotFoundException(\`존재하지 않는 ${names.capital} ID \${id}\`);
325
- }
326
-
327
- return rows[0];
328
- }
329
-
330
- async findOne<T extends ${entityId}SubsetKey>(
331
- subset: T,
332
- listParams: ${entityId}ListParams
333
- ): Promise<${entityId}SubsetMapping[T] | null> {
334
- const { rows } = await this.findMany(subset, {
335
- ...listParams,
336
- num: 1,
337
- page: 1,
338
- });
339
-
340
- return rows[0] ?? null;
341
- }
342
-
343
- @api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${names.capitalPlural}" })
344
- async findMany<T extends ${entityId}SubsetKey>(
345
- subset: T,
346
- params: ${entityId}ListParams = {}
347
- ): Promise<ListResult<${entityId}SubsetMapping[T]>> {
348
- // params with defaults
349
- params = {
350
- num: 24,
351
- page: 1,
352
- search: "${def.search}",
353
- orderBy: "${def.orderBy}",
354
- ...params,
355
- };
356
-
357
- // build queries
358
- let { rows, total } = await this.runSubsetQuery({
359
- subset,
360
- params,
361
- subsetQuery: ${names.camel}SubsetQueries[subset],
362
- build: ({ qb }) => {
363
- // id
364
- if (params.id) {
365
- qb = qb.where("${entity.table}.id", "in", asArray(params.id));
366
- }
367
-
368
- // search-keyword
369
- if (params.search && params.keyword && params.keyword.length > 0) {
370
- if (params.search === "id") {
371
- qb = qb.where("${entity.table}.id", "=", Number(params.keyword));
372
- }
373
- // } else if (params.search === "field") {
374
- // qb = qb.where("${entity.table}.field", "like", \`%\${params.keyword}%\`);
375
- // }
376
- else {
377
- throw new BadRequestException(
378
- \`구현되지 않은 검색 필드 \${params.search}\`
379
- );
380
- }
381
- }
382
-
383
- // orderBy
384
- if (params.orderBy) {
385
- // default orderBy
386
- const [orderByField, orderByDirec] = this.parseOrderBy(
387
- params.orderBy
388
- );
389
- qb = qb.orderBy(orderByField, orderByDirec);
390
- }
391
-
392
- return qb;
393
- },
394
- debug: false,
395
- });
396
-
397
- return {
398
- rows,
399
- total,
400
- };
401
- }
402
-
403
- @api({ httpMethod: "POST" })
404
- async save(
405
- spa: ${entityId}SaveParams[]
406
- ): Promise<number[]> {
407
- const wdb = this.getDB("w");
408
- const ub = this.getUpsertBuilder();
409
-
410
- // register
411
- spa.map((sp) => {
412
- ub.register("${entity.table}", sp);
413
- });
414
-
415
- // transaction
416
- return wdb.transaction().execute(async (trx) => {
417
- const ids = await ub.upsert(trx, "${entity.table}");
418
-
419
- return ids;
420
- });
421
- }
422
-
423
- @api({ httpMethod: "POST", guards: [ "admin" ] })
424
- async del(ids: number[]): Promise<number> {
425
- const wdb = this.getDB("w");
426
-
427
- // transaction
428
- await wdb.transaction().execute(async (trx) => {
429
- return trx.deleteFrom("${entity.table}").where("${entity.table}.id", "in", ids).execute();
430
- });
431
-
432
- return ids.length;
433
- }
434
- }
435
-
436
- export const ${entityId}Model = new ${entityId}ModelClass();
437
- `.trim();
438
- }
439
-
440
- /*
441
- MigrationColumn[] 읽어서 컬럼 정의하는 구문 생성
442
- */
443
- private genColumnDefinitions(columns: MigrationColumn[]): string[] {
444
- return columns.map((column) => {
445
- let str = "";
446
- const chains: string[] = [];
447
- if (column.name === "id") {
448
- return `.addColumn("id", "integer", (col) => col.unsigned().autoIncrement().primaryKey())`;
449
- }
450
-
451
- if (column.type === "decimal") {
452
- str = `.addColumn("${column.name}", "${column.type}(${column.precision}, ${column.scale})"`;
453
- } else if (column.type.includes("text")) {
454
- str = `.addColumn("${column.name}", sql\`${column.type.toUpperCase()}\``;
455
- } else {
456
- let columnType: string = column.type;
457
- // FIXME: add double
458
- if (columnType === "float") {
459
- columnType = "float4";
460
- } else if (columnType === "uuid") {
461
- columnType = "char(36)";
462
- } else if (columnType === "string") {
463
- columnType = "varchar";
464
- }
465
- str = `.addColumn("${column.name}", "${columnType}${column.length ? `(${column.length})` : ""}"`;
466
- }
467
- if (column.unsigned) {
468
- chains.push("unsigned()");
469
- }
470
-
471
- if (!column.nullable) {
472
- chains.push("notNull()");
473
- }
474
-
475
- if (column.defaultTo !== undefined) {
476
- if (
477
- typeof column.defaultTo === "string" &&
478
- column.defaultTo.startsWith(`"`)
479
- ) {
480
- chains.push(`defaultTo(${column.defaultTo})`);
481
- } else {
482
- chains.push(`defaultTo(sql\`${column.defaultTo}\`)`);
483
- }
484
- }
485
- if (column.type === "uuid") {
486
- chains.push("defaultTo(sql`UUID()`)");
487
- }
488
-
489
- return (
490
- (chains.length > 0 ? `${str}, (col) => col.${chains.join(".")}` : str) +
491
- ")"
492
- );
493
- });
494
- }
495
-
496
- /*
497
- MigrationIndex[] 읽어서 인덱스/유니크 정의하는 구문 생성
498
- */
499
- private genIndexDefinitions(
500
- table: string,
501
- indexes: MigrationIndex[]
502
- ): string[] {
503
- if (indexes.length === 0) {
504
- return [];
505
- }
506
-
507
- const lines = _.uniq(
508
- indexes.reduce((r, index) => {
509
- r.push(
510
- `await db.schema.createIndex("${this.createIndexName(table, index.columns, index.type)}")
511
- .on("${table}")
512
- .columns([${index.columns.map((col) => `"${col}"`).join(",")}])${index.type === "unique" ? ".unique()" : ""}
513
- .execute();`
514
- );
515
- return r;
516
- }, [] as string[])
517
- );
518
- return lines;
519
- }
520
-
521
- /*
522
- MigrationForeign[] 읽어서 외부키 constraint 정의하는 구문 생성
523
- */
524
- private genForeignDefinitions(
525
- table: string,
526
- foreigns: MigrationForeign[]
527
- ): { up: string[]; down: string[] } {
528
- return foreigns.reduce(
529
- (r, foreign) => {
530
- const [toTable, toColumn] = foreign.to.split(".");
531
- const name = `${table}_${foreign.columns.join("_")}_foreign`;
532
- const columnsStringQuote = foreign.columns
533
- .map((col) => `'${col.replace(`${table}.`, "")}'`)
534
- .join(",");
535
-
536
- r.up.push(
537
- "// create fk",
538
- `await db.schema.alterTable("${table}")`,
539
- `.addForeignKeyConstraint("${name}", [${columnsStringQuote}], "${toTable}", ["${toColumn}"])`,
540
- `.onUpdate("${foreign.onUpdate.toLowerCase()}")`,
541
- `.onDelete("${foreign.onDelete.toLowerCase()}")`,
542
- `.execute();`
543
- );
544
- r.down.push(
545
- "// drop fk",
546
- `await db.schema.alterTable("${table}")`,
547
- `.dropConstraint("${name}")`,
548
- `.execute();`
549
- );
550
-
551
- return r;
552
- },
553
- {
554
- up: [] as string[],
555
- down: [] as string[],
556
- }
557
- );
558
- }
559
-
560
- private getAlterColumnLinesTo(
561
- columnsTo: ReturnType<KyselyGenerator["getAlterColumnsTo"]>,
562
- entityColumns: MigrationColumn[]
563
- ) {
564
- let linesTo = {
565
- add: {
566
- up: [] as string[],
567
- down: [] as string[],
568
- },
569
- drop: {
570
- up: [] as string[],
571
- down: [] as string[],
572
- },
573
- alter: {
574
- up: [] as string[],
575
- down: [] as string[],
576
- },
577
- };
578
-
579
- linesTo.add = {
580
- up: ["// add", ...this.genColumnDefinitions(columnsTo.add)],
581
- down: [
582
- "// rollback - add",
583
- ...columnsTo.add.map((col) => `.dropColumn("${col.name}")`),
584
- ],
585
- };
586
- linesTo.drop = {
587
- up: [
588
- "// drop",
589
- ...columnsTo.drop.map((col) => `.dropColumn("${col.name}")`),
590
- ],
591
- down: [
592
- "// rollback - drop",
593
- ...this.genColumnDefinitions(columnsTo.drop),
594
- ],
595
- };
596
- linesTo.alter = columnsTo.alter.reduce(
597
- (r, dbColumn) => {
598
- const entityColumn = entityColumns.find(
599
- (col) => col.name == dbColumn.name
600
- );
601
- if (entityColumn === undefined) {
602
- return r;
603
- }
604
-
605
- // 컬럼 변경사항
606
- const columnDiffUp = _.difference(
607
- this.genColumnDefinitions([entityColumn]),
608
- this.genColumnDefinitions([dbColumn])
609
- );
610
- const columnDiffDown = _.difference(
611
- this.genColumnDefinitions([dbColumn]),
612
- this.genColumnDefinitions([entityColumn])
613
- );
614
- if (columnDiffUp.length > 0) {
615
- r.up = [
616
- ...r.up,
617
- "// alter column",
618
- ...columnDiffUp.map((l) =>
619
- l.replace(".addColumn", ".modifyColumn")
620
- ),
621
- ];
622
- r.down = [
623
- ...r.down,
624
- "// rollback - alter column",
625
- ...columnDiffDown.map((l) =>
626
- l.replace(".addColumn", ".modifyColumn")
627
- ),
628
- ];
629
- }
630
-
631
- return r;
632
- },
633
- {
634
- up: [] as string[],
635
- down: [] as string[],
636
- }
637
- );
638
-
639
- return linesTo;
640
- }
641
-
642
- private getAlterIndexLinesTo(
643
- table: string,
644
- indexesTo: ReturnType<KyselyGenerator["getAlterIndexesTo"]>,
645
- columnsTo: ReturnType<KyselyGenerator["getAlterColumnsTo"]>
646
- ) {
647
- let linesTo = {
648
- add: {
649
- up: [] as string[],
650
- down: [] as string[],
651
- },
652
- drop: {
653
- up: [] as string[],
654
- down: [] as string[],
655
- },
656
- };
657
-
658
- // 인덱스가 추가되는 경우, 컬럼과 같이 추가된 케이스에는 drop에서 제외해야함!
659
- linesTo.add = {
660
- up: ["// add indexes", ...this.genIndexDefinitions(table, indexesTo.add)],
661
- down: [
662
- "// rollback - add indexes",
663
- ...indexesTo.add
664
- .filter(
665
- (index) =>
666
- index.columns.every((colName) =>
667
- columnsTo.add.map((col) => col.name).includes(colName)
668
- ) === false
669
- )
670
- .map(
671
- (index) => `await db.schema.alterTable("${table}")
672
- .dropIndex("${this.createIndexName(table, index.columns, index.type)}")
673
- .execute();`
674
- ),
675
- ],
676
- };
677
- // 인덱스가 삭제되는 경우, 컬럼과 같이 삭제된 케이스에는 drop에서 제외해야함!
678
- linesTo.drop = {
679
- up: [
680
- ...indexesTo.drop
681
- .filter(
682
- (index) =>
683
- index.columns.every((colName) =>
684
- columnsTo.drop.map((col) => col.name).includes(colName)
685
- ) === false
686
- )
687
- .map(
688
- (index) => `await db.schema.alterTable("${table}")
689
- .dropIndex("${this.createIndexName(table, index.columns, index.type)}")
690
- .execute();`
691
- ),
692
- ],
693
- down: [
694
- "// rollback - drop indexes",
695
- ...this.genIndexDefinitions(table, indexesTo.drop),
696
- ],
697
- };
698
-
699
- return linesTo;
700
- }
701
-
702
- private createIndexName(
703
- table: string,
704
- columns: string[],
705
- type: string
706
- ): string {
707
- if (columns[0].split(".").length > 1) {
708
- table = columns[0].split(".")[0];
709
- columns = columns.map((col) => col.split(".")[1]);
710
- }
711
-
712
- return `${table}_${columns.join("_")}_${type}`;
713
- }
714
- }