sonamu 0.6.0 → 0.7.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 (406) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +2 -1
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +6 -1
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +178 -409
  44. package/dist/api/config.d.ts +27 -13
  45. package/dist/api/config.d.ts.map +1 -1
  46. package/dist/api/config.js +19 -26
  47. package/dist/api/context.d.ts +4 -3
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +1 -1
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +111 -18
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +3 -3
  56. package/dist/api/sonamu.d.ts +7 -7
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +83 -51
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +5 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +5 -2
  65. package/dist/bin/cli.js +165 -64
  66. package/dist/bin/loader-register.d.ts +2 -0
  67. package/dist/bin/loader-register.d.ts.map +1 -0
  68. package/dist/bin/loader-register.js +34 -0
  69. package/dist/database/_batch_update.d.ts +5 -3
  70. package/dist/database/_batch_update.d.ts.map +1 -1
  71. package/dist/database/_batch_update.js +30 -13
  72. package/dist/database/base-model.d.ts +96 -10
  73. package/dist/database/base-model.d.ts.map +1 -1
  74. package/dist/database/base-model.js +232 -89
  75. package/dist/database/base-model.types.d.ts +93 -0
  76. package/dist/database/base-model.types.d.ts.map +1 -0
  77. package/dist/database/base-model.types.js +10 -0
  78. package/dist/database/code-generator.d.ts +1 -1
  79. package/dist/database/code-generator.d.ts.map +1 -1
  80. package/dist/database/code-generator.js +11 -10
  81. package/dist/database/db.d.ts +5 -6
  82. package/dist/database/db.d.ts.map +1 -1
  83. package/dist/database/db.js +22 -25
  84. package/dist/database/puri-subset.test-d.js +81 -0
  85. package/dist/database/puri-subset.types.d.ts +123 -0
  86. package/dist/database/puri-subset.types.d.ts.map +1 -0
  87. package/dist/database/puri-subset.types.js +16 -0
  88. package/dist/database/puri-wrapper.d.ts +13 -11
  89. package/dist/database/puri-wrapper.d.ts.map +1 -1
  90. package/dist/database/puri-wrapper.js +2 -2
  91. package/dist/database/puri.d.ts +25 -14
  92. package/dist/database/puri.d.ts.map +1 -1
  93. package/dist/database/puri.js +83 -21
  94. package/dist/database/puri.types.d.ts +21 -7
  95. package/dist/database/puri.types.d.ts.map +1 -1
  96. package/dist/database/puri.types.js +4 -1
  97. package/dist/database/transaction-context.d.ts +1 -1
  98. package/dist/database/transaction-context.d.ts.map +1 -1
  99. package/dist/database/transaction-context.js +1 -1
  100. package/dist/database/upsert-builder.d.ts +9 -3
  101. package/dist/database/upsert-builder.d.ts.map +1 -1
  102. package/dist/database/upsert-builder.js +228 -78
  103. package/dist/entity/entity-manager.d.ts +165 -2
  104. package/dist/entity/entity-manager.d.ts.map +1 -1
  105. package/dist/entity/entity-manager.js +26 -10
  106. package/dist/entity/entity.d.ts +5 -3
  107. package/dist/entity/entity.d.ts.map +1 -1
  108. package/dist/entity/entity.js +153 -54
  109. package/dist/exceptions/error-handler.d.ts +1 -1
  110. package/dist/exceptions/error-handler.d.ts.map +1 -1
  111. package/dist/exceptions/error-handler.js +1 -1
  112. package/dist/exceptions/so-exceptions.d.ts +1 -1
  113. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  114. package/dist/exceptions/so-exceptions.js +1 -1
  115. package/dist/file-storage/driver.d.ts +1 -1
  116. package/dist/file-storage/driver.d.ts.map +1 -1
  117. package/dist/file-storage/driver.js +1 -1
  118. package/dist/file-storage/file-storage.js +2 -2
  119. package/dist/index.d.ts +18 -11
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +19 -13
  122. package/dist/migration/code-generation.d.ts +1 -1
  123. package/dist/migration/code-generation.d.ts.map +1 -1
  124. package/dist/migration/code-generation.js +123 -67
  125. package/dist/migration/migration-set.d.ts +2 -10
  126. package/dist/migration/migration-set.d.ts.map +1 -1
  127. package/dist/migration/migration-set.js +67 -218
  128. package/dist/migration/migrator.d.ts +24 -73
  129. package/dist/migration/migrator.d.ts.map +1 -1
  130. package/dist/migration/migrator.js +121 -301
  131. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  132. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  133. package/dist/migration/postgresql-schema-reader.js +245 -0
  134. package/dist/migration/types.d.ts +6 -38
  135. package/dist/migration/types.d.ts.map +1 -1
  136. package/dist/migration/types.js +1 -1
  137. package/dist/naite/messaging-types.d.ts +43 -0
  138. package/dist/naite/messaging-types.d.ts.map +1 -0
  139. package/dist/naite/messaging-types.js +7 -0
  140. package/dist/naite/naite-reporter.d.ts +41 -0
  141. package/dist/naite/naite-reporter.d.ts.map +1 -0
  142. package/dist/naite/naite-reporter.js +102 -0
  143. package/dist/naite/naite.d.ts +91 -8
  144. package/dist/naite/naite.d.ts.map +1 -1
  145. package/dist/naite/naite.js +285 -41
  146. package/dist/stream/sse.d.ts +2 -2
  147. package/dist/stream/sse.d.ts.map +1 -1
  148. package/dist/stream/sse.js +1 -1
  149. package/dist/syncer/api-parser.d.ts +3 -13
  150. package/dist/syncer/api-parser.d.ts.map +1 -1
  151. package/dist/syncer/api-parser.js +67 -56
  152. package/dist/syncer/checksum.d.ts +2 -2
  153. package/dist/syncer/checksum.d.ts.map +1 -1
  154. package/dist/syncer/checksum.js +11 -11
  155. package/dist/syncer/code-generator.d.ts +3 -3
  156. package/dist/syncer/code-generator.d.ts.map +1 -1
  157. package/dist/syncer/code-generator.js +37 -17
  158. package/dist/syncer/entity-operations.d.ts +2 -2
  159. package/dist/syncer/entity-operations.d.ts.map +1 -1
  160. package/dist/syncer/entity-operations.js +9 -8
  161. package/dist/syncer/file-patterns.d.ts +1 -1
  162. package/dist/syncer/file-patterns.d.ts.map +1 -1
  163. package/dist/syncer/file-patterns.js +1 -1
  164. package/dist/syncer/index.d.ts +4 -4
  165. package/dist/syncer/index.d.ts.map +1 -1
  166. package/dist/syncer/index.js +5 -5
  167. package/dist/syncer/module-loader.d.ts +4 -4
  168. package/dist/syncer/module-loader.d.ts.map +1 -1
  169. package/dist/syncer/module-loader.js +17 -12
  170. package/dist/syncer/syncer.d.ts +31 -24
  171. package/dist/syncer/syncer.d.ts.map +1 -1
  172. package/dist/syncer/syncer.js +92 -45
  173. package/dist/template/entity-converter.d.ts +1 -1
  174. package/dist/template/entity-converter.d.ts.map +1 -1
  175. package/dist/template/entity-converter.js +15 -8
  176. package/dist/template/helpers.d.ts +2 -2
  177. package/dist/template/helpers.d.ts.map +1 -1
  178. package/dist/template/helpers.js +3 -3
  179. package/dist/template/implementations/entity.template.d.ts +2 -2
  180. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  181. package/dist/template/implementations/entity.template.js +4 -5
  182. package/dist/template/implementations/generated.template.d.ts +2 -3
  183. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  184. package/dist/template/implementations/generated.template.js +46 -29
  185. package/dist/template/implementations/generated_http.template.d.ts +2 -3
  186. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  187. package/dist/template/implementations/generated_http.template.js +9 -9
  188. package/dist/template/implementations/generated_sso.template.d.ts +3 -4
  189. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  190. package/dist/template/implementations/generated_sso.template.js +54 -25
  191. package/dist/template/implementations/init_types.template.d.ts +2 -2
  192. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  193. package/dist/template/implementations/init_types.template.js +2 -2
  194. package/dist/template/implementations/model.template.d.ts +2 -2
  195. package/dist/template/implementations/model.template.d.ts.map +1 -1
  196. package/dist/template/implementations/model.template.js +47 -37
  197. package/dist/template/implementations/model_test.template.d.ts +2 -2
  198. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  199. package/dist/template/implementations/model_test.template.js +2 -2
  200. package/dist/template/implementations/service.template.d.ts +4 -4
  201. package/dist/template/implementations/service.template.d.ts.map +1 -1
  202. package/dist/template/implementations/service.template.js +24 -16
  203. package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
  204. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
  205. package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
  206. package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
  207. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
  208. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  209. package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
  210. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  211. package/dist/template/implementations/view_enums_select.template.js +2 -2
  212. package/dist/template/implementations/view_form.template.d.ts +2 -2
  213. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  214. package/dist/template/implementations/view_form.template.js +4 -4
  215. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  216. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  217. package/dist/template/implementations/view_id_all_select.template.js +1 -1
  218. package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
  219. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  220. package/dist/template/implementations/view_id_async_select.template.js +1 -1
  221. package/dist/template/implementations/view_list.template.d.ts +2 -2
  222. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  223. package/dist/template/implementations/view_list.template.js +29 -19
  224. package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
  225. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
  226. package/dist/template/implementations/view_list_columns.template.js +1 -1
  227. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  228. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  229. package/dist/template/implementations/view_search_input.template.js +1 -1
  230. package/dist/template/index.d.ts +4 -2
  231. package/dist/template/index.d.ts.map +1 -1
  232. package/dist/template/index.js +5 -3
  233. package/dist/template/template-manager.d.ts +56 -0
  234. package/dist/template/template-manager.d.ts.map +1 -0
  235. package/dist/template/template-manager.js +125 -0
  236. package/dist/template/template-types.d.ts +16 -0
  237. package/dist/template/template-types.d.ts.map +1 -0
  238. package/dist/template/template-types.js +7 -0
  239. package/dist/template/template.d.ts +12 -2
  240. package/dist/template/template.d.ts.map +1 -1
  241. package/dist/template/template.js +19 -6
  242. package/dist/template/zod-converter.d.ts +40 -7
  243. package/dist/template/zod-converter.d.ts.map +1 -1
  244. package/dist/template/zod-converter.js +341 -58
  245. package/dist/testing/_relation-graph.d.ts +1 -1
  246. package/dist/testing/_relation-graph.d.ts.map +1 -1
  247. package/dist/testing/_relation-graph.js +12 -3
  248. package/dist/testing/fixture-manager.d.ts +42 -11
  249. package/dist/testing/fixture-manager.d.ts.map +1 -1
  250. package/dist/testing/fixture-manager.js +338 -236
  251. package/dist/types/types.d.ts +709 -104
  252. package/dist/types/types.d.ts.map +1 -1
  253. package/dist/types/types.js +309 -52
  254. package/dist/typings/knex.d.js +2 -2
  255. package/dist/utils/async-utils.d.ts.map +1 -1
  256. package/dist/utils/async-utils.js +3 -3
  257. package/dist/utils/console-util.js +1 -1
  258. package/dist/utils/controller.d.ts +1 -0
  259. package/dist/utils/controller.d.ts.map +1 -1
  260. package/dist/utils/controller.js +4 -1
  261. package/dist/utils/esm-utils.d.ts +0 -6
  262. package/dist/utils/esm-utils.d.ts.map +1 -1
  263. package/dist/utils/esm-utils.js +2 -9
  264. package/dist/utils/formatter.d.ts +3 -0
  265. package/dist/utils/formatter.d.ts.map +1 -0
  266. package/dist/utils/formatter.js +110 -0
  267. package/dist/utils/fs-utils.d.ts +1 -1
  268. package/dist/utils/fs-utils.d.ts.map +1 -1
  269. package/dist/utils/fs-utils.js +1 -1
  270. package/dist/utils/lodash-able.d.ts.map +1 -1
  271. package/dist/utils/lodash-able.js +1 -1
  272. package/dist/utils/object-utils.d.ts +44 -0
  273. package/dist/utils/object-utils.d.ts.map +1 -0
  274. package/dist/utils/object-utils.js +191 -0
  275. package/dist/utils/path-utils.d.ts +1 -1
  276. package/dist/utils/path-utils.d.ts.map +1 -1
  277. package/dist/utils/path-utils.js +3 -3
  278. package/dist/utils/process-utils.js +1 -1
  279. package/dist/utils/sql-parser.d.ts +5 -1
  280. package/dist/utils/sql-parser.d.ts.map +1 -1
  281. package/dist/utils/sql-parser.js +14 -3
  282. package/dist/utils/type-utils.d.ts +23 -0
  283. package/dist/utils/type-utils.d.ts.map +1 -0
  284. package/dist/utils/type-utils.js +45 -0
  285. package/dist/utils/utils.d.ts +7 -1
  286. package/dist/utils/utils.d.ts.map +1 -1
  287. package/dist/utils/utils.js +44 -5
  288. package/dist/utils/zod-error.d.ts +1 -1
  289. package/dist/utils/zod-error.d.ts.map +1 -1
  290. package/dist/utils/zod-error.js +1 -1
  291. package/package.json +54 -29
  292. package/src/ai/agents/agent.ts +87 -0
  293. package/src/ai/agents/index.ts +2 -0
  294. package/src/ai/agents/types.ts +47 -0
  295. package/src/ai/index.ts +1 -0
  296. package/src/ai/providers/rtzr/api.ts +37 -0
  297. package/src/ai/providers/rtzr/error.ts +34 -0
  298. package/src/ai/providers/rtzr/index.ts +4 -0
  299. package/src/ai/providers/rtzr/model.ts +201 -0
  300. package/src/ai/providers/rtzr/options.ts +49 -0
  301. package/src/ai/providers/rtzr/provider.ts +91 -0
  302. package/src/ai/providers/rtzr/utils.ts +127 -0
  303. package/src/api/base-frame.ts +4 -2
  304. package/src/api/caster.ts +17 -23
  305. package/src/api/code-converters.ts +176 -533
  306. package/src/api/config.ts +39 -56
  307. package/src/api/context.ts +7 -18
  308. package/src/api/decorators.ts +175 -46
  309. package/src/api/index.ts +2 -2
  310. package/src/api/sonamu.ts +133 -124
  311. package/src/api/validator.ts +83 -0
  312. package/src/bin/build-config.ts +7 -1
  313. package/src/bin/cli.ts +192 -110
  314. package/src/bin/loader-register.ts +38 -0
  315. package/src/database/_batch_update.ts +46 -31
  316. package/src/database/base-model.ts +390 -182
  317. package/src/database/base-model.types.ts +155 -0
  318. package/src/database/code-generator.ts +13 -32
  319. package/src/database/db.ts +36 -50
  320. package/src/database/puri-subset.test-d.ts +471 -0
  321. package/src/database/puri-subset.types.ts +195 -0
  322. package/src/database/puri-wrapper.ts +58 -67
  323. package/src/database/puri.ts +182 -126
  324. package/src/database/puri.types.ts +64 -31
  325. package/src/database/transaction-context.ts +1 -1
  326. package/src/database/upsert-builder.ts +262 -132
  327. package/src/entity/entity-manager.ts +36 -28
  328. package/src/entity/entity.ts +330 -249
  329. package/src/exceptions/error-handler.ts +3 -3
  330. package/src/exceptions/so-exceptions.ts +11 -11
  331. package/src/file-storage/driver.ts +5 -5
  332. package/src/file-storage/file-storage.ts +2 -2
  333. package/src/index.ts +18 -12
  334. package/src/migration/code-generation.ts +185 -172
  335. package/src/migration/migration-set.ts +80 -293
  336. package/src/migration/migrator.ts +182 -425
  337. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  338. package/src/migration/postgresql-schema-reader.ts +310 -0
  339. package/src/migration/types.ts +6 -39
  340. package/src/naite/messaging-types.ts +51 -0
  341. package/src/naite/naite-reporter.ts +128 -0
  342. package/src/naite/naite.ts +378 -33
  343. package/src/shared/web.shared.ts.txt +20 -24
  344. package/src/stream/sse.ts +5 -5
  345. package/src/syncer/api-parser.ts +52 -69
  346. package/src/syncer/checksum.ts +25 -37
  347. package/src/syncer/code-generator.ts +58 -62
  348. package/src/syncer/entity-operations.ts +12 -15
  349. package/src/syncer/file-patterns.ts +2 -2
  350. package/src/syncer/index.ts +4 -4
  351. package/src/syncer/module-loader.ts +28 -25
  352. package/src/syncer/syncer.ts +155 -162
  353. package/src/template/entity-converter.ts +18 -27
  354. package/src/template/helpers.ts +8 -11
  355. package/src/template/implementations/entity.template.ts +6 -6
  356. package/src/template/implementations/generated.template.ts +99 -99
  357. package/src/template/implementations/generated_http.template.ts +21 -54
  358. package/src/template/implementations/generated_sso.template.ts +78 -65
  359. package/src/template/implementations/init_types.template.ts +4 -6
  360. package/src/template/implementations/model.template.ts +47 -38
  361. package/src/template/implementations/model_test.template.ts +3 -3
  362. package/src/template/implementations/service.template.ts +56 -80
  363. package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
  364. package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
  365. package/src/template/implementations/view_enums_select.template.ts +3 -3
  366. package/src/template/implementations/view_form.template.ts +34 -75
  367. package/src/template/implementations/view_id_all_select.template.ts +2 -2
  368. package/src/template/implementations/view_id_async_select.template.ts +9 -23
  369. package/src/template/implementations/view_list.template.ts +54 -95
  370. package/src/template/implementations/view_list_columns.template.ts +4 -10
  371. package/src/template/implementations/view_search_input.template.ts +2 -2
  372. package/src/template/index.ts +4 -2
  373. package/src/template/template-manager.ts +166 -0
  374. package/src/template/template-types.ts +16 -0
  375. package/src/template/template.ts +29 -10
  376. package/src/template/zod-converter.ts +407 -101
  377. package/src/testing/_relation-graph.ts +18 -11
  378. package/src/testing/fixture-manager.ts +468 -362
  379. package/src/types/types.ts +516 -248
  380. package/src/typings/knex.d.ts +7 -9
  381. package/src/utils/async-utils.ts +8 -12
  382. package/src/utils/console-util.ts +1 -1
  383. package/src/utils/controller.ts +3 -0
  384. package/src/utils/esm-utils.ts +8 -18
  385. package/src/utils/formatter.ts +109 -0
  386. package/src/utils/fs-utils.ts +1 -1
  387. package/src/utils/lodash-able.ts +1 -4
  388. package/src/utils/object-utils.ts +217 -0
  389. package/src/utils/path-utils.ts +3 -6
  390. package/src/utils/process-utils.ts +1 -1
  391. package/src/utils/sql-parser.ts +23 -5
  392. package/src/utils/type-utils.ts +83 -0
  393. package/src/utils/utils.ts +58 -9
  394. package/src/utils/zod-error.ts +3 -3
  395. package/dist/bin/cli-wrapper.d.ts +0 -3
  396. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  397. package/dist/bin/cli-wrapper.js +0 -72
  398. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  399. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  400. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
  401. package/dist/entity/entity-utils.d.ts +0 -61
  402. package/dist/entity/entity-utils.d.ts.map +0 -1
  403. package/dist/entity/entity-utils.js +0 -210
  404. package/src/bin/cli-wrapper.ts +0 -82
  405. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  406. package/src/entity/entity-utils.ts +0 -291
@@ -1,8 +1,8 @@
1
- import { TemplateKey, TemplateOptions } from "../types/types";
2
- import { EntityNamesRecord } from "../entity/entity-manager";
1
+ import path from "path";
2
+ import type { EntityNamesRecord } from "../entity/entity-manager";
3
+ import type { TemplateKey, TemplateOptions } from "../types/types";
3
4
  import { globAsync } from "../utils/async-utils";
4
5
  import { importMembers } from "../utils/esm-utils";
5
- import path from "path";
6
6
 
7
7
  export type RenderedTemplate = {
8
8
  target: string;
@@ -27,15 +27,17 @@ export abstract class Template {
27
27
  /**
28
28
  * 템플릿 구현체가 있는 디렉토리의 모든 템플릿을 로드합니다.
29
29
  * 템플릿이 필요(Template.find)해지기 전에 최소 한 번 호출해주셔야 합니다.
30
+ * @deprecated TemplateManager.autoload() 사용 권장
30
31
  */
31
32
  public static async autoload() {
32
33
  const templateFiles = await globAsync(
33
34
  // Sonamu의 코드베이스는 항상 빌드된 채로 dist 속에 머무르므로,
34
35
  // 현재 파일을 기준으로 마찬가지로 dist 속에 있는 템플릿 구현체 js 파일들을 찾습니다.
35
- path.join(import.meta.dirname, "implementations/*.template.js")
36
+ path.join(import.meta.dirname, "implementations/*.template.js"),
36
37
  );
37
38
 
38
39
  for (const templateFile of templateFiles) {
40
+ // biome-ignore lint/suspicious/noExplicitAny: importMembers의 반환 타입을 명시적으로 지정할 수 없음
39
41
  const templates = await importMembers<any>(templateFile);
40
42
  if (
41
43
  templates.length === 1 &&
@@ -44,10 +46,10 @@ export abstract class Template {
44
46
  ) {
45
47
  // 클래스의 인스턴스를 생성하여 등록
46
48
  const instance = new templates[0].value();
47
- this.templates.set(instance.key, instance);
49
+ Template.templates.set(instance.key, instance);
48
50
  } else {
49
51
  throw new Error(
50
- `Template ${templateFile} should export only one class that extends Template`
52
+ `Template ${templateFile} should export only one class that extends Template`,
51
53
  );
52
54
  }
53
55
  }
@@ -60,17 +62,34 @@ export abstract class Template {
60
62
  /**
61
63
  * 템플릿 **인스턴스**를 key로 찾아옵니다.
62
64
  * 만약 템플릿이 로드(loadAll)되지 않았거나 찾는 템플릿이 없다면 에러를 던집니다.
63
- * @param key
64
- * @returns
65
+ * @deprecated TemplateManager.get() 사용 권장
66
+ * @param key
67
+ * @returns
65
68
  */
66
69
  public static find(key: TemplateKey): Template {
67
- const instance = this.templates.get(key);
70
+ const instance = Template.templates.get(key);
68
71
  if (!instance) {
69
- throw new Error(`Template ${key} not found. It might be becasuse you tried to find a template before loading all templates. Did you call Template.loadAll()?`);
72
+ throw new Error(
73
+ `Template ${key} not found. It might be becasuse you tried to find a template before loading all templates. Did you call Template.loadAll()?`,
74
+ );
70
75
  }
71
76
  return instance;
72
77
  }
73
78
 
79
+ /**
80
+ * 내부용: TemplateManager에서 사용
81
+ */
82
+ public static _getTemplatesMap(): Map<TemplateKey, Template> {
83
+ return Template.templates;
84
+ }
85
+
86
+ /**
87
+ * 내부용: TemplateManager에서 사용
88
+ */
89
+ public static _clearTemplates(): void {
90
+ Template.templates.clear();
91
+ }
92
+
74
93
  public abstract render(
75
94
  options: TemplateOptions[TemplateKey],
76
95
  ...extra: unknown[]
@@ -1,33 +1,67 @@
1
- import z from "zod";
1
+ /**
2
+ * zod-converter 구성
3
+ * 1. 유틸리티
4
+ * - getZodTypeById
5
+ *
6
+ * 2. Zod 타입 변환 (EntityProp -> ZodType)
7
+ * - propToZodType
8
+ *
9
+ * 3. EntityProp/Node -> Zod 코드 문자열
10
+ * - propToZodTypeDef
11
+ * - propNodeToZodTypeDef
12
+ *
13
+ * 4. Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환 (ZodType -> ZodCode)
14
+ * - zodTypeToZodCode
15
+ *
16
+ * 5. Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환 (ZodType -> RenderingNode)
17
+ * - zodTypeToRenderingNode
18
+ * - resolveRenderType
19
+ */
20
+
21
+ import inflection from "inflection";
22
+ import path from "path";
23
+ import { z } from "zod";
24
+ import type { $ZodLooseShape } from "zod/v4/core";
25
+ import { Sonamu } from "../api/sonamu";
2
26
  import { EntityManager } from "../entity/entity-manager";
3
27
  import {
4
- EntityProp,
28
+ type EntityProp,
29
+ type EntityPropNode,
5
30
  isBelongsToOneRelationProp,
6
- isBigIntegerProp,
7
- isBooleanProp,
8
- isDateProp,
9
- isDateTimeProp,
10
- isDecimalProp,
11
- isDoubleProp,
12
- isEnumProp,
13
- isFloatProp,
14
- isIntegerProp,
31
+ isBigIntegerArrayProp,
32
+ isBigIntegerSingleProp,
33
+ isBooleanArrayProp,
34
+ isBooleanSingleProp,
35
+ isDateArrayProp,
36
+ isDateSingleProp,
37
+ isEnumArrayProp,
38
+ isEnumSingleProp,
39
+ isIntegerArrayProp,
40
+ isIntegerSingleProp,
15
41
  isJsonProp,
42
+ isNumberArrayProp,
43
+ isNumberSingleProp,
44
+ isNumericArrayProp,
45
+ isNumericSingleProp,
16
46
  isOneToOneRelationProp,
17
47
  isRelationProp,
18
- isStringProp,
19
- isTextProp,
20
- isTimeProp,
21
- isTimestampProp,
22
- isUuidProp,
48
+ isStringArrayProp,
49
+ isStringSingleProp,
50
+ isUuidArrayProp,
51
+ isUuidSingleProp,
23
52
  isVirtualProp,
24
- RenderingNode,
53
+ type RenderingNode,
25
54
  } from "../types/types";
26
- import path from "path";
27
55
  import { createImportUrl } from "../utils/esm-utils";
28
- import { Sonamu } from "../api/sonamu";
29
- import inflection from "inflection";
30
- import { getTextTypeLength } from "../api";
56
+
57
+ // <any>를 자제하고, Zod에서 제약하는 기본적인 Generic Type Parameter를 사용함.
58
+ type AnyZodRecord = z.ZodRecord<z.ZodString | z.ZodNumber | z.ZodSymbol, z.ZodType>;
59
+ type AnyZodObject = z.ZodObject<$ZodLooseShape>;
60
+ type AnyZodNullable = z.ZodNullable<z.ZodType>;
61
+ type AnyZodDefault = z.ZodDefault<z.ZodType>;
62
+ type AnyZodUnion = z.ZodUnion<z.ZodType[]>;
63
+ type AnyZodArray = z.ZodArray<z.ZodType>;
64
+ type AnyZodOptional = z.ZodOptional<z.ZodType>;
31
65
 
32
66
  /**
33
67
  * Zod 타입 ID로부터 동적으로 Zod 스키마를 로드합니다.
@@ -35,12 +69,7 @@ import { getTextTypeLength } from "../api";
35
69
  */
36
70
  export async function getZodTypeById(zodTypeId: string): Promise<z.ZodTypeAny> {
37
71
  const modulePath = EntityManager.getModulePath(zodTypeId);
38
- const moduleAbsPath = path.join(
39
- Sonamu.apiRootPath,
40
- "dist",
41
- "application",
42
- modulePath + ".js"
43
- );
72
+ const moduleAbsPath = path.join(Sonamu.apiRootPath, "dist", "application", `${modulePath}.js`);
44
73
  const importUrl = createImportUrl(moduleAbsPath);
45
74
  const imported = await import(importUrl);
46
75
 
@@ -50,13 +79,356 @@ export async function getZodTypeById(zodTypeId: string): Promise<z.ZodTypeAny> {
50
79
  return imported[zodTypeId].describe(zodTypeId);
51
80
  }
52
81
 
82
+ /**
83
+ * EntityProp을 Zod 타입으로 변환합니다.
84
+ * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
85
+ */
86
+ export async function propToZodType(prop: EntityProp): Promise<z.ZodTypeAny> {
87
+ let zodType: z.ZodTypeAny = z.unknown();
88
+ if (isIntegerSingleProp(prop)) {
89
+ zodType = z.number().int();
90
+ } else if (isIntegerArrayProp(prop)) {
91
+ zodType = z.number().int().array();
92
+ } else if (isBigIntegerSingleProp(prop)) {
93
+ zodType = z.bigint();
94
+ } else if (isBigIntegerArrayProp(prop)) {
95
+ zodType = z.bigint().array();
96
+ } else if (isEnumSingleProp(prop)) {
97
+ zodType = await getZodTypeById(prop.id);
98
+ } else if (isEnumArrayProp(prop)) {
99
+ zodType = (await getZodTypeById(prop.id)).array();
100
+ } else if (isStringSingleProp(prop)) {
101
+ if (prop.length) {
102
+ zodType = z.string().max(prop.length);
103
+ } else {
104
+ zodType = z.string();
105
+ }
106
+ } else if (isStringArrayProp(prop)) {
107
+ if (prop.length) {
108
+ zodType = z.string().max(prop.length).array();
109
+ } else {
110
+ zodType = z.string().array();
111
+ }
112
+ } else if (isNumberSingleProp(prop)) {
113
+ zodType = z.number();
114
+ } else if (isNumberArrayProp(prop)) {
115
+ zodType = z.number().array();
116
+ } else if (isNumericSingleProp(prop)) {
117
+ zodType = z.string();
118
+ } else if (isNumericArrayProp(prop)) {
119
+ zodType = z.string().array();
120
+ } else if (isBooleanSingleProp(prop)) {
121
+ zodType = z.boolean();
122
+ } else if (isBooleanArrayProp(prop)) {
123
+ zodType = z.boolean().array();
124
+ } else if (isDateSingleProp(prop)) {
125
+ zodType = z.date();
126
+ } else if (isDateArrayProp(prop)) {
127
+ zodType = z.date().array();
128
+ } else if (isUuidSingleProp(prop)) {
129
+ zodType = z.uuid();
130
+ } else if (isUuidArrayProp(prop)) {
131
+ zodType = z.uuid().array();
132
+ } else if (isJsonProp(prop)) {
133
+ zodType = await getZodTypeById(prop.id);
134
+ } else if (isVirtualProp(prop)) {
135
+ zodType = await getZodTypeById(prop.id);
136
+ } else if (isRelationProp(prop)) {
137
+ if (isBelongsToOneRelationProp(prop) || (isOneToOneRelationProp(prop) && prop.hasJoinColumn)) {
138
+ zodType = z.number().int();
139
+ }
140
+ } else {
141
+ throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
142
+ }
143
+
144
+ if ((prop as { unsigned?: boolean }).unsigned) {
145
+ zodType = (zodType as z.ZodNumber).nonnegative();
146
+ }
147
+ if (prop.nullable) {
148
+ zodType = zodType.nullable();
149
+ }
150
+
151
+ return zodType;
152
+ }
153
+
154
+ /**
155
+ * EntityProp을 Zod 타입 정의 코드 문자열로 변환합니다.
156
+ */
157
+ export function propToZodTypeDef(prop: EntityProp, injectImportKeys: string[]): string {
158
+ let stmt: string;
159
+ if (isIntegerSingleProp(prop)) {
160
+ stmt = `${prop.name}: z.int()`;
161
+ } else if (isIntegerArrayProp(prop)) {
162
+ stmt = `${prop.name}: z.int().array()`;
163
+ } else if (isBigIntegerSingleProp(prop)) {
164
+ stmt = `${prop.name}: z.bigint()`;
165
+ } else if (isBigIntegerArrayProp(prop)) {
166
+ stmt = `${prop.name}: z.bigint().array()`;
167
+ } else if (isEnumSingleProp(prop)) {
168
+ stmt = `${prop.name}: ${prop.id}`;
169
+ injectImportKeys.push(prop.id);
170
+ } else if (isEnumArrayProp(prop)) {
171
+ stmt = `${prop.name}: ${prop.id}.array()`;
172
+ injectImportKeys.push(prop.id);
173
+ } else if (isStringSingleProp(prop)) {
174
+ if (prop.length) {
175
+ stmt = `${prop.name}: z.string().max(${prop.length})`;
176
+ } else {
177
+ stmt = `${prop.name}: z.string()`;
178
+ }
179
+ } else if (isStringArrayProp(prop)) {
180
+ if (prop.length) {
181
+ stmt = `${prop.name}: z.string().max(${prop.length}).array()`;
182
+ } else {
183
+ stmt = `${prop.name}: z.string().array()`;
184
+ }
185
+ } else if (isNumberSingleProp(prop)) {
186
+ stmt = `${prop.name}: z.number()`;
187
+ } else if (isNumberArrayProp(prop)) {
188
+ stmt = `${prop.name}: z.number().array()`;
189
+ } else if (isNumericSingleProp(prop)) {
190
+ stmt = `${prop.name}: z.string()`;
191
+ } else if (isNumericArrayProp(prop)) {
192
+ stmt = `${prop.name}: z.string().array()`;
193
+ } else if (isDateSingleProp(prop)) {
194
+ stmt = `${prop.name}: z.date()`;
195
+ } else if (isDateArrayProp(prop)) {
196
+ stmt = `${prop.name}: z.date().array()`;
197
+ } else if (isBooleanSingleProp(prop)) {
198
+ stmt = `${prop.name}: z.boolean()`;
199
+ } else if (isBooleanArrayProp(prop)) {
200
+ stmt = `${prop.name}: z.boolean().array()`;
201
+ } else if (isUuidSingleProp(prop)) {
202
+ stmt = `${prop.name}: z.uuid()`;
203
+ } else if (isUuidArrayProp(prop)) {
204
+ stmt = `${prop.name}: z.uuid().array()`;
205
+ } else if (isJsonProp(prop)) {
206
+ stmt = `${prop.name}: ${prop.id}`;
207
+ injectImportKeys.push(prop.id);
208
+ } else if (isVirtualProp(prop)) {
209
+ stmt = `${prop.name}: ${prop.id}`;
210
+ injectImportKeys.push(prop.id);
211
+ } else if (isRelationProp(prop)) {
212
+ if (isBelongsToOneRelationProp(prop) || (isOneToOneRelationProp(prop) && prop.hasJoinColumn)) {
213
+ stmt = `${prop.name}_id: z.int()`;
214
+ } else {
215
+ // 그외 relation 케이스 제외
216
+ return `// ${prop.name}: ${prop.relationType} ${prop.with}`;
217
+ }
218
+ } else {
219
+ return "// unable to resolve";
220
+ }
221
+
222
+ if ((prop as { unsigned?: boolean }).unsigned) {
223
+ stmt += ".nonnegative()";
224
+ }
225
+ if (prop.nullable) {
226
+ stmt += ".nullable()";
227
+ }
228
+
229
+ return `${stmt},`;
230
+ }
231
+
232
+ /**
233
+ * EntityPropNode를 Zod 타입 정의 코드 문자열로 변환합니다.
234
+ * plain, array, object 노드 타입을 재귀적으로 처리하여 중첩 구조를 지원합니다.
235
+ */
236
+ export function propNodeToZodTypeDef(propNode: EntityPropNode, injectImportKeys: string[]): string {
237
+ if (propNode.nodeType === "plain") {
238
+ return propToZodTypeDef(propNode.prop, injectImportKeys);
239
+ } else if (propNode.nodeType === "array") {
240
+ return [
241
+ propNode.prop ? `${propNode.prop.name}: ` : "",
242
+ "z.array(z.object({",
243
+ propNode.children
244
+ .map((childPropNode) => propNodeToZodTypeDef(childPropNode, injectImportKeys))
245
+ .join("\n"),
246
+ "",
247
+ "})),",
248
+ ].join("\n");
249
+ } else if (propNode.nodeType === "object") {
250
+ return [
251
+ propNode.prop ? `${propNode.prop.name}: ` : "",
252
+ "z.object({",
253
+ propNode.children
254
+ .map((childPropNode) => propNodeToZodTypeDef(childPropNode, injectImportKeys))
255
+ .join("\n"),
256
+ "",
257
+ `})${propNode.prop?.nullable ? ".nullable()" : ""},`,
258
+ ].join("\n");
259
+ } else {
260
+ throw Error;
261
+ }
262
+ }
263
+
264
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
265
+ export function zodTypeToTsTypeDef(zt: z.ZodType): string {
266
+ switch (zt.def.type) {
267
+ case "string":
268
+ case "number":
269
+ case "boolean":
270
+ case "bigint":
271
+ case "date":
272
+ case "null":
273
+ case "undefined":
274
+ case "any":
275
+ case "unknown":
276
+ case "never":
277
+ return zt.def.type;
278
+ case "nullable":
279
+ return `${zodTypeToTsTypeDef((zt as AnyZodNullable).def.innerType)} | null`;
280
+ case "default":
281
+ return zodTypeToTsTypeDef((zt as AnyZodDefault).def.innerType);
282
+ case "record": {
283
+ const recordType = zt as AnyZodRecord;
284
+ return `{ [ key: ${zodTypeToTsTypeDef(recordType.def.keyType)} ]: ${zodTypeToTsTypeDef(recordType.def.valueType)}}`;
285
+ }
286
+ case "literal":
287
+ return Array.from((zt as z.ZodLiteral).values)
288
+ .map((value) => {
289
+ if (typeof value === "string") {
290
+ return `"${value}"`;
291
+ }
292
+
293
+ if (value === null) {
294
+ return `null`;
295
+ }
296
+
297
+ if (value === undefined) {
298
+ return `undefined`;
299
+ }
300
+
301
+ return `${value}`;
302
+ })
303
+ .join(" | ");
304
+ case "union":
305
+ return `${(zt as AnyZodUnion).options
306
+ .map((option) => zodTypeToTsTypeDef(option))
307
+ .join(" | ")}`;
308
+ case "enum":
309
+ return `${(zt as z.ZodEnum).options.map((val) => `"${val}"`).join(" | ")}`;
310
+ case "array":
311
+ return `${zodTypeToTsTypeDef((zt as AnyZodArray).element)}[]`;
312
+ case "object": {
313
+ const shape = (zt as AnyZodObject).shape;
314
+ return [
315
+ "{",
316
+ ...Object.keys(shape).map((key) => {
317
+ if (shape[key].def.type === "optional") {
318
+ return `${key}?: ${zodTypeToTsTypeDef(shape[key].def.innerType)},`;
319
+ } else {
320
+ return `${key}: ${zodTypeToTsTypeDef(shape[key])},`;
321
+ }
322
+ }),
323
+ "}",
324
+ ].join("\n");
325
+ }
326
+ case "optional":
327
+ return `${zodTypeToTsTypeDef((zt as AnyZodOptional).def.innerType)} | undefined`;
328
+ default:
329
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
330
+ }
331
+ }
332
+
333
+ // TODO(Haze, 251031): "template_literal", "file"에 대한 지원이 필요함.
334
+ /**
335
+ * Zod 타입 인스턴스를 해당하는 Zod 코드 문자열로 변환합니다.
336
+ */
337
+ export function zodTypeToZodCode(zt: z.ZodType): string {
338
+ switch (zt.def.type) {
339
+ case "string":
340
+ return "z.string()";
341
+ case "number":
342
+ return "z.number()";
343
+ case "bigint":
344
+ return "z.bigint()";
345
+ case "boolean":
346
+ return "z.boolean()";
347
+ case "date":
348
+ return "z.date()";
349
+ case "null":
350
+ return "z.null()";
351
+ case "undefined":
352
+ return "z.undefined()";
353
+ case "any":
354
+ return "z.any()";
355
+ case "unknown":
356
+ return "z.unknown()";
357
+ case "never":
358
+ return "z.never()";
359
+ case "nullable":
360
+ return `${zodTypeToZodCode((zt as AnyZodNullable).def.innerType)}.nullable()`;
361
+ case "default": {
362
+ const zDefaultDef = (zt as AnyZodDefault).def;
363
+ return `${zodTypeToZodCode(zDefaultDef.innerType)}.default(${zDefaultDef.defaultValue})`;
364
+ }
365
+ case "record": {
366
+ const zRecordDef = (zt as AnyZodRecord).def;
367
+ return `z.record(${zodTypeToZodCode(zRecordDef.keyType)}, ${zodTypeToZodCode(
368
+ zRecordDef.valueType,
369
+ )})`;
370
+ }
371
+ case "literal": {
372
+ const items = Array.from((zt as z.ZodLiteral<string | number>).values).map((value) => {
373
+ if (typeof value === "string") {
374
+ return `"${value}"`;
375
+ }
376
+
377
+ if (value === null) {
378
+ return `null`;
379
+ }
380
+
381
+ if (value === undefined) {
382
+ return `undefined`;
383
+ }
384
+
385
+ return `${value}`;
386
+ });
387
+
388
+ if (items.length === 1) {
389
+ return `z.literal(${items[0]})`;
390
+ }
391
+ return `z.literal([${items.join(", ")}])`;
392
+ }
393
+ case "union":
394
+ return `z.union([${(zt as AnyZodUnion).def.options
395
+ .map((option: z.ZodType) => zodTypeToZodCode(option))
396
+ .join(",")}])`;
397
+ case "enum":
398
+ // NOTE: z.enum(["A", "B"])도 z.enum({ A: "A", B: "B" })로 처리됨.
399
+ return `z.enum({${Object.entries((zt as z.ZodEnum).def.entries)
400
+ .map(([key, val]) => (typeof val === "string" ? `${key}: "${val}"` : `${key}: ${val}`))
401
+ .join(", ")}})`;
402
+ case "array":
403
+ return `z.array(${zodTypeToZodCode((zt as z.ZodArray<z.ZodType>).def.element)})`;
404
+ case "object": {
405
+ const shape = (zt as AnyZodObject).shape;
406
+ return [
407
+ "z.object({",
408
+ ...Object.keys(shape).map((key) => `${key}: ${zodTypeToZodCode(shape[key])},`),
409
+ "})",
410
+ ].join("\n");
411
+ }
412
+ case "optional":
413
+ return `${zodTypeToZodCode((zt as z.ZodOptional<z.ZodType>).def.innerType)}.optional()`;
414
+ case "file":
415
+ return `z.file()`;
416
+ case "intersection": {
417
+ const zIntersectionDef = (zt as z.ZodIntersection<z.ZodType, z.ZodType>).def;
418
+ return `z.intersection(${zodTypeToZodCode(zIntersectionDef.left)}, ${zodTypeToZodCode(zIntersectionDef.right)})`;
419
+ }
420
+ default:
421
+ throw new Error(`처리되지 않은 ZodType ${zt.def.type}`);
422
+ }
423
+ }
424
+
53
425
  /**
54
426
  * Zod 타입을 UI 렌더링에 사용할 수 있는 RenderingNode로 변환합니다.
55
427
  * 재귀적으로 중첩된 타입들을 처리합니다.
56
428
  */
57
429
  export function zodTypeToRenderingNode(
58
- zodType: z.ZodType<any>,
59
- baseKey: string = "root"
430
+ zodType: z.ZodTypeAny,
431
+ baseKey: string = "root",
60
432
  ): RenderingNode {
61
433
  const def = {
62
434
  name: baseKey,
@@ -75,7 +447,7 @@ export function zodTypeToRenderingNode(
75
447
  children,
76
448
  };
77
449
  } else if (zodType instanceof z.ZodArray) {
78
- const innerType = (zodType as z.ZodArray<z.ZodType<any>>).def.element;
450
+ const innerType = (zodType as z.ZodArray<z.ZodTypeAny>).def.element;
79
451
  if (innerType instanceof z.ZodString && baseKey.includes("images")) {
80
452
  return {
81
453
  ...def,
@@ -88,25 +460,19 @@ export function zodTypeToRenderingNode(
88
460
  element: zodTypeToRenderingNode(innerType, baseKey),
89
461
  };
90
462
  } else if (zodType instanceof z.ZodUnion) {
91
- const optionNodes = (zodType as z.ZodUnion<z.ZodType[]>).def.options.map(
92
- (opt) => zodTypeToRenderingNode(opt, baseKey)
463
+ const optionNodes = (zodType as z.ZodUnion<z.ZodType[]>).def.options.map((opt) =>
464
+ zodTypeToRenderingNode(opt, baseKey),
93
465
  );
94
466
  // TODO: ZodUnion이 들어있는 경우 핸들링
95
467
  return optionNodes[0];
96
468
  } else if (zodType instanceof z.ZodOptional) {
97
469
  return {
98
- ...zodTypeToRenderingNode(
99
- (zodType as z.ZodOptional<z.ZodType>).def.innerType,
100
- baseKey
101
- ),
470
+ ...zodTypeToRenderingNode((zodType as z.ZodOptional<z.ZodType>).def.innerType, baseKey),
102
471
  optional: true,
103
472
  };
104
473
  } else if (zodType instanceof z.ZodNullable) {
105
474
  return {
106
- ...zodTypeToRenderingNode(
107
- (zodType as z.ZodNullable<z.ZodType>).def.innerType,
108
- baseKey
109
- ),
475
+ ...zodTypeToRenderingNode((zodType as z.ZodNullable<z.ZodType>).def.innerType, baseKey),
110
476
  nullable: true,
111
477
  };
112
478
  } else {
@@ -120,10 +486,7 @@ export function zodTypeToRenderingNode(
120
486
  /**
121
487
  * Zod 타입과 키 이름으로부터 적절한 RenderType을 결정합니다.
122
488
  */
123
- function resolveRenderType(
124
- key: string,
125
- zodType: z.ZodTypeAny
126
- ): RenderingNode["renderType"] {
489
+ function resolveRenderType(key: string, zodType: z.ZodTypeAny): RenderingNode["renderType"] {
127
490
  if (zodType instanceof z.ZodDate) {
128
491
  return "datetime";
129
492
  } else if (zodType instanceof z.ZodString) {
@@ -160,60 +523,3 @@ function resolveRenderType(
160
523
  throw new Error(`타입 파싱 불가 ${key} ${zodType.def.type}`);
161
524
  }
162
525
  }
163
-
164
- /**
165
- * EntityProp을 Zod 타입으로 변환합니다.
166
- * 각 prop의 타입에 따라 적절한 Zod validator를 생성합니다.
167
- */
168
- export async function propToZodType(prop: EntityProp): Promise<z.ZodTypeAny> {
169
- let zodType: z.ZodTypeAny = z.unknown();
170
- if (isIntegerProp(prop)) {
171
- zodType = z.number().int();
172
- } else if (isBigIntegerProp(prop)) {
173
- zodType = z.bigint();
174
- } else if (isTextProp(prop)) {
175
- zodType = z.string().max(getTextTypeLength(prop.textType));
176
- } else if (isEnumProp(prop)) {
177
- zodType = await getZodTypeById(prop.id);
178
- } else if (isStringProp(prop)) {
179
- zodType = z.string().max(prop.length);
180
- } else if (isFloatProp(prop) || isDoubleProp(prop)) {
181
- zodType = z.number();
182
- } else if (isDecimalProp(prop)) {
183
- zodType = z.string();
184
- } else if (isBooleanProp(prop)) {
185
- zodType = z.boolean();
186
- } else if (isDateProp(prop)) {
187
- zodType = z.string().length(10);
188
- } else if (isTimeProp(prop)) {
189
- zodType = z.string().length(8);
190
- } else if (isDateTimeProp(prop)) {
191
- zodType = z.date();
192
- } else if (isTimestampProp(prop)) {
193
- zodType = z.date();
194
- } else if (isJsonProp(prop)) {
195
- zodType = await getZodTypeById(prop.id);
196
- } else if (isUuidProp(prop)) {
197
- zodType = z.uuid();
198
- } else if (isVirtualProp(prop)) {
199
- zodType = await getZodTypeById(prop.id);
200
- } else if (isRelationProp(prop)) {
201
- if (
202
- isBelongsToOneRelationProp(prop) ||
203
- (isOneToOneRelationProp(prop) && prop.hasJoinColumn)
204
- ) {
205
- zodType = z.number().int();
206
- }
207
- } else {
208
- throw new Error(`prop을 zodType으로 변환하는데 실패 ${prop}}`);
209
- }
210
-
211
- if ((prop as { unsigned?: boolean }).unsigned) {
212
- zodType = (zodType as z.ZodNumber).nonnegative();
213
- }
214
- if (prop.nullable) {
215
- zodType = zodType.nullable();
216
- }
217
-
218
- return zodType;
219
- }