sonamu 0.5.7 → 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 (529) 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 +13 -2
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +71 -2
  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 +258 -2
  44. package/dist/api/config.d.ts +90 -0
  45. package/dist/api/config.d.ts.map +1 -0
  46. package/dist/api/config.js +25 -0
  47. package/dist/api/context.d.ts +4 -2
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +3 -2
  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 +235 -2
  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 +9 -2
  56. package/dist/api/sonamu.d.ts +10 -24
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +514 -2
  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 +6 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +15 -2
  65. package/dist/bin/cli.js +519 -2
  66. package/dist/bin/hot-hook-register.d.ts +11 -0
  67. package/dist/bin/hot-hook-register.d.ts.map +1 -0
  68. package/dist/bin/hot-hook-register.js +21 -0
  69. package/dist/bin/loader-register.d.ts +2 -0
  70. package/dist/bin/loader-register.d.ts.map +1 -0
  71. package/dist/bin/loader-register.js +34 -0
  72. package/dist/database/_batch_update.d.ts +5 -3
  73. package/dist/database/_batch_update.d.ts.map +1 -1
  74. package/dist/database/_batch_update.js +95 -2
  75. package/dist/database/base-model.d.ts +96 -10
  76. package/dist/database/base-model.d.ts.map +1 -1
  77. package/dist/database/base-model.js +390 -2
  78. package/dist/database/base-model.types.d.ts +93 -0
  79. package/dist/database/base-model.types.d.ts.map +1 -0
  80. package/dist/database/base-model.types.js +10 -0
  81. package/dist/database/code-generator.d.ts +1 -1
  82. package/dist/database/code-generator.d.ts.map +1 -1
  83. package/dist/database/code-generator.js +54 -2
  84. package/dist/database/db.d.ts +6 -21
  85. package/dist/database/db.d.ts.map +1 -1
  86. package/dist/database/db.js +129 -2
  87. package/dist/database/puri-subset.test-d.js +81 -0
  88. package/dist/database/puri-subset.types.d.ts +123 -0
  89. package/dist/database/puri-subset.types.d.ts.map +1 -0
  90. package/dist/database/puri-subset.types.js +16 -0
  91. package/dist/database/puri-wrapper.d.ts +13 -11
  92. package/dist/database/puri-wrapper.d.ts.map +1 -1
  93. package/dist/database/puri-wrapper.js +109 -2
  94. package/dist/database/puri.d.ts +41 -23
  95. package/dist/database/puri.d.ts.map +1 -1
  96. package/dist/database/puri.js +601 -2
  97. package/dist/database/puri.types.d.ts +25 -6
  98. package/dist/database/puri.types.d.ts.map +1 -1
  99. package/dist/database/puri.types.js +6 -2
  100. package/dist/database/transaction-context.d.ts +1 -1
  101. package/dist/database/transaction-context.d.ts.map +1 -1
  102. package/dist/database/transaction-context.js +14 -2
  103. package/dist/database/upsert-builder.d.ts +9 -3
  104. package/dist/database/upsert-builder.d.ts.map +1 -1
  105. package/dist/database/upsert-builder.js +365 -2
  106. package/dist/entity/entity-manager.d.ts +167 -2
  107. package/dist/entity/entity-manager.d.ts.map +1 -1
  108. package/dist/entity/entity-manager.js +130 -2
  109. package/dist/entity/entity.d.ts +5 -3
  110. package/dist/entity/entity.d.ts.map +1 -1
  111. package/dist/entity/entity.js +750 -2
  112. package/dist/exceptions/error-handler.d.ts +1 -1
  113. package/dist/exceptions/error-handler.d.ts.map +1 -1
  114. package/dist/exceptions/error-handler.js +29 -2
  115. package/dist/exceptions/so-exceptions.d.ts +1 -1
  116. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  117. package/dist/exceptions/so-exceptions.js +85 -2
  118. package/dist/file-storage/driver.d.ts +1 -1
  119. package/dist/file-storage/driver.d.ts.map +1 -1
  120. package/dist/file-storage/driver.js +79 -2
  121. package/dist/file-storage/file-storage.js +75 -2
  122. package/dist/index.d.ts +18 -9
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +34 -2
  125. package/dist/migration/code-generation.d.ts +1 -1
  126. package/dist/migration/code-generation.d.ts.map +1 -1
  127. package/dist/migration/code-generation.js +614 -2
  128. package/dist/migration/migration-set.d.ts +2 -10
  129. package/dist/migration/migration-set.d.ts.map +1 -1
  130. package/dist/migration/migration-set.js +213 -2
  131. package/dist/migration/migrator.d.ts +24 -82
  132. package/dist/migration/migrator.d.ts.map +1 -1
  133. package/dist/migration/migrator.js +330 -2
  134. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  135. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  136. package/dist/migration/postgresql-schema-reader.js +245 -0
  137. package/dist/migration/types.d.ts +6 -38
  138. package/dist/migration/types.d.ts.map +1 -1
  139. package/dist/migration/types.js +3 -2
  140. package/dist/naite/messaging-types.d.ts +43 -0
  141. package/dist/naite/messaging-types.d.ts.map +1 -0
  142. package/dist/naite/messaging-types.js +7 -0
  143. package/dist/naite/naite-reporter.d.ts +41 -0
  144. package/dist/naite/naite-reporter.d.ts.map +1 -0
  145. package/dist/naite/naite-reporter.js +102 -0
  146. package/dist/naite/naite.d.ts +95 -0
  147. package/dist/naite/naite.d.ts.map +1 -0
  148. package/dist/naite/naite.js +316 -0
  149. package/dist/stream/index.js +3 -2
  150. package/dist/stream/sse.d.ts +2 -2
  151. package/dist/stream/sse.d.ts.map +1 -1
  152. package/dist/stream/sse.js +38 -2
  153. package/dist/syncer/api-parser.d.ts +10 -0
  154. package/dist/syncer/api-parser.d.ts.map +1 -0
  155. package/dist/syncer/api-parser.js +240 -0
  156. package/dist/syncer/checksum.d.ts +21 -0
  157. package/dist/syncer/checksum.d.ts.map +1 -0
  158. package/dist/syncer/checksum.js +98 -0
  159. package/dist/syncer/code-generator.d.ts +20 -0
  160. package/dist/syncer/code-generator.d.ts.map +1 -0
  161. package/dist/syncer/code-generator.js +161 -0
  162. package/dist/syncer/entity-operations.d.ts +17 -0
  163. package/dist/syncer/entity-operations.d.ts.map +1 -0
  164. package/dist/syncer/entity-operations.js +59 -0
  165. package/dist/syncer/file-patterns.d.ts +29 -0
  166. package/dist/syncer/file-patterns.d.ts.map +1 -0
  167. package/dist/syncer/file-patterns.js +38 -0
  168. package/dist/syncer/index.d.ts +6 -0
  169. package/dist/syncer/index.d.ts.map +1 -1
  170. package/dist/syncer/index.js +9 -2
  171. package/dist/syncer/module-loader.d.ts +35 -0
  172. package/dist/syncer/module-loader.d.ts.map +1 -0
  173. package/dist/syncer/module-loader.js +87 -0
  174. package/dist/syncer/syncer.d.ts +98 -106
  175. package/dist/syncer/syncer.d.ts.map +1 -1
  176. package/dist/syncer/syncer.js +422 -2
  177. package/dist/template/entity-converter.d.ts +14 -0
  178. package/dist/template/entity-converter.d.ts.map +1 -0
  179. package/dist/template/entity-converter.js +108 -0
  180. package/dist/template/helpers.d.ts +23 -0
  181. package/dist/template/helpers.d.ts.map +1 -0
  182. package/dist/template/helpers.js +64 -0
  183. package/dist/{templates → template/implementations}/entity.template.d.ts +3 -3
  184. package/dist/template/implementations/entity.template.d.ts.map +1 -0
  185. package/dist/template/implementations/entity.template.js +86 -0
  186. package/dist/{templates → template/implementations}/generated.template.d.ts +3 -4
  187. package/dist/template/implementations/generated.template.d.ts.map +1 -0
  188. package/dist/template/implementations/generated.template.js +249 -0
  189. package/dist/{templates → template/implementations}/generated_http.template.d.ts +3 -4
  190. package/dist/template/implementations/generated_http.template.d.ts.map +1 -0
  191. package/dist/template/implementations/generated_http.template.js +131 -0
  192. package/dist/{templates → template/implementations}/generated_sso.template.d.ts +4 -5
  193. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -0
  194. package/dist/template/implementations/generated_sso.template.js +134 -0
  195. package/dist/{templates → template/implementations}/init_types.template.d.ts +3 -3
  196. package/dist/template/implementations/init_types.template.d.ts.map +1 -0
  197. package/dist/template/implementations/init_types.template.js +38 -0
  198. package/dist/template/implementations/model.template.d.ts +17 -0
  199. package/dist/template/implementations/model.template.d.ts.map +1 -0
  200. package/dist/template/implementations/model.template.js +181 -0
  201. package/dist/{templates → template/implementations}/model_test.template.d.ts +3 -3
  202. package/dist/template/implementations/model_test.template.d.ts.map +1 -0
  203. package/dist/template/implementations/model_test.template.js +35 -0
  204. package/dist/{templates → template/implementations}/service.template.d.ts +6 -6
  205. package/dist/template/implementations/service.template.d.ts.map +1 -0
  206. package/dist/template/implementations/service.template.js +201 -0
  207. package/dist/{templates → template/implementations}/view_enums_buttonset.template.d.ts +3 -3
  208. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -0
  209. package/dist/template/implementations/view_enums_buttonset.template.js +31 -0
  210. package/dist/{templates → template/implementations}/view_enums_dropdown.template.d.ts +3 -4
  211. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -0
  212. package/dist/template/implementations/view_enums_dropdown.template.js +50 -0
  213. package/dist/{templates → template/implementations}/view_enums_select.template.d.ts +3 -3
  214. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -0
  215. package/dist/template/implementations/view_enums_select.template.js +55 -0
  216. package/dist/{templates → template/implementations}/view_form.template.d.ts +5 -5
  217. package/dist/template/implementations/view_form.template.d.ts.map +1 -0
  218. package/dist/template/implementations/view_form.template.js +337 -0
  219. package/dist/{templates → template/implementations}/view_id_all_select.template.d.ts +3 -3
  220. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -0
  221. package/dist/template/implementations/view_id_all_select.template.js +31 -0
  222. package/dist/{templates → template/implementations}/view_id_async_select.template.d.ts +3 -3
  223. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -0
  224. package/dist/template/implementations/view_id_async_select.template.js +105 -0
  225. package/dist/{templates → template/implementations}/view_list.template.d.ts +5 -13
  226. package/dist/template/implementations/view_list.template.d.ts.map +1 -0
  227. package/dist/template/implementations/view_list.template.js +475 -0
  228. package/dist/template/implementations/view_list_columns.template.d.ts +17 -0
  229. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -0
  230. package/dist/template/implementations/view_list_columns.template.js +49 -0
  231. package/dist/{templates → template/implementations}/view_search_input.template.d.ts +3 -3
  232. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -0
  233. package/dist/template/implementations/view_search_input.template.js +64 -0
  234. package/dist/template/index.d.ts +7 -0
  235. package/dist/template/index.d.ts.map +1 -0
  236. package/dist/template/index.js +8 -0
  237. package/dist/template/template-manager.d.ts +56 -0
  238. package/dist/template/template-manager.d.ts.map +1 -0
  239. package/dist/template/template-manager.js +125 -0
  240. package/dist/template/template-types.d.ts +16 -0
  241. package/dist/template/template-types.d.ts.map +1 -0
  242. package/dist/template/template-types.js +7 -0
  243. package/dist/template/template.d.ts +49 -0
  244. package/dist/template/template.d.ts.map +1 -0
  245. package/dist/template/template.js +60 -0
  246. package/dist/template/zod-converter.d.ts +51 -0
  247. package/dist/template/zod-converter.d.ts.map +1 -0
  248. package/dist/template/zod-converter.js +449 -0
  249. package/dist/testing/_relation-graph.d.ts +1 -1
  250. package/dist/testing/_relation-graph.d.ts.map +1 -1
  251. package/dist/testing/_relation-graph.js +89 -2
  252. package/dist/testing/fixture-manager.d.ts +42 -11
  253. package/dist/testing/fixture-manager.d.ts.map +1 -1
  254. package/dist/testing/fixture-manager.js +623 -2
  255. package/dist/types/types.d.ts +747 -143
  256. package/dist/types/types.d.ts.map +1 -1
  257. package/dist/types/types.js +546 -2
  258. package/dist/typings/knex.d.js +3 -2
  259. package/dist/utils/async-utils.d.ts +7 -0
  260. package/dist/utils/async-utils.d.ts.map +1 -1
  261. package/dist/utils/async-utils.js +57 -2
  262. package/dist/utils/console-util.d.ts +2 -0
  263. package/dist/utils/console-util.d.ts.map +1 -0
  264. package/dist/utils/console-util.js +6 -0
  265. package/dist/utils/controller.d.ts +1 -0
  266. package/dist/utils/controller.d.ts.map +1 -1
  267. package/dist/utils/controller.js +29 -2
  268. package/dist/utils/esm-utils.d.ts +39 -0
  269. package/dist/utils/esm-utils.d.ts.map +1 -0
  270. package/dist/utils/esm-utils.js +49 -0
  271. package/dist/utils/formatter.d.ts +3 -0
  272. package/dist/utils/formatter.d.ts.map +1 -0
  273. package/dist/utils/formatter.js +110 -0
  274. package/dist/utils/fs-utils.d.ts +1 -1
  275. package/dist/utils/fs-utils.d.ts.map +1 -1
  276. package/dist/utils/fs-utils.js +17 -2
  277. package/dist/utils/lodash-able.d.ts.map +1 -1
  278. package/dist/utils/lodash-able.js +6 -2
  279. package/dist/utils/model.js +22 -2
  280. package/dist/utils/object-utils.d.ts +44 -0
  281. package/dist/utils/object-utils.d.ts.map +1 -0
  282. package/dist/utils/object-utils.js +191 -0
  283. package/dist/utils/path-utils.d.ts +89 -0
  284. package/dist/utils/path-utils.d.ts.map +1 -0
  285. package/dist/utils/path-utils.js +60 -0
  286. package/dist/utils/process-utils.d.ts +13 -0
  287. package/dist/utils/process-utils.d.ts.map +1 -0
  288. package/dist/utils/process-utils.js +36 -0
  289. package/dist/utils/sql-parser.d.ts +5 -1
  290. package/dist/utils/sql-parser.d.ts.map +1 -1
  291. package/dist/utils/sql-parser.js +46 -2
  292. package/dist/utils/type-utils.d.ts +23 -0
  293. package/dist/utils/type-utils.d.ts.map +1 -0
  294. package/dist/utils/type-utils.js +45 -0
  295. package/dist/utils/utils.d.ts +10 -7
  296. package/dist/utils/utils.d.ts.map +1 -1
  297. package/dist/utils/utils.js +72 -2
  298. package/dist/utils/zod-error.d.ts +1 -1
  299. package/dist/utils/zod-error.d.ts.map +1 -1
  300. package/dist/utils/zod-error.js +19 -2
  301. package/package.json +65 -27
  302. package/src/ai/agents/agent.ts +87 -0
  303. package/src/ai/agents/index.ts +2 -0
  304. package/src/ai/agents/types.ts +47 -0
  305. package/src/ai/index.ts +1 -0
  306. package/src/ai/providers/rtzr/api.ts +37 -0
  307. package/src/ai/providers/rtzr/error.ts +34 -0
  308. package/src/ai/providers/rtzr/index.ts +4 -0
  309. package/src/ai/providers/rtzr/model.ts +201 -0
  310. package/src/ai/providers/rtzr/options.ts +49 -0
  311. package/src/ai/providers/rtzr/provider.ts +91 -0
  312. package/src/ai/providers/rtzr/utils.ts +127 -0
  313. package/src/api/base-frame.ts +4 -2
  314. package/src/api/caster.ts +17 -23
  315. package/src/api/code-converters.ts +178 -535
  316. package/src/api/config.ts +125 -0
  317. package/src/api/context.ts +7 -17
  318. package/src/api/decorators.ts +176 -46
  319. package/src/api/index.ts +2 -2
  320. package/src/api/sonamu.ts +190 -167
  321. package/src/api/validator.ts +83 -0
  322. package/src/bin/build-config.ts +8 -1
  323. package/src/bin/cli.ts +258 -124
  324. package/src/bin/hot-hook-register.ts +22 -0
  325. package/src/bin/loader-register.ts +38 -0
  326. package/src/database/_batch_update.ts +46 -31
  327. package/src/database/base-model.ts +390 -182
  328. package/src/database/base-model.types.ts +155 -0
  329. package/src/database/code-generator.ts +13 -32
  330. package/src/database/db.ts +40 -96
  331. package/src/database/puri-subset.test-d.ts +471 -0
  332. package/src/database/puri-subset.types.ts +195 -0
  333. package/src/database/puri-wrapper.ts +58 -67
  334. package/src/database/puri.ts +229 -148
  335. package/src/database/puri.types.ts +76 -30
  336. package/src/database/transaction-context.ts +1 -1
  337. package/src/database/upsert-builder.ts +262 -132
  338. package/src/entity/entity-manager.ts +48 -36
  339. package/src/entity/entity.ts +330 -248
  340. package/src/exceptions/error-handler.ts +3 -3
  341. package/src/exceptions/so-exceptions.ts +11 -11
  342. package/src/file-storage/driver.ts +5 -5
  343. package/src/file-storage/file-storage.ts +2 -2
  344. package/src/index.ts +18 -10
  345. package/src/migration/code-generation.ts +185 -172
  346. package/src/migration/migration-set.ts +80 -293
  347. package/src/migration/migrator.ts +199 -571
  348. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  349. package/src/migration/postgresql-schema-reader.ts +310 -0
  350. package/src/migration/types.ts +6 -39
  351. package/src/naite/messaging-types.ts +51 -0
  352. package/src/naite/naite-reporter.ts +128 -0
  353. package/src/naite/naite.ts +415 -0
  354. package/src/shared/web.shared.ts.txt +20 -24
  355. package/src/stream/sse.ts +5 -5
  356. package/src/syncer/api-parser.ts +282 -0
  357. package/src/syncer/checksum.ts +140 -0
  358. package/src/syncer/code-generator.ts +198 -0
  359. package/src/syncer/entity-operations.ts +65 -0
  360. package/src/syncer/file-patterns.ts +56 -0
  361. package/src/syncer/index.ts +6 -0
  362. package/src/syncer/module-loader.ts +128 -0
  363. package/src/syncer/syncer.ts +389 -1453
  364. package/src/template/entity-converter.ts +114 -0
  365. package/src/template/helpers.ts +81 -0
  366. package/src/{templates → template/implementations}/entity.template.ts +7 -7
  367. package/src/{templates → template/implementations}/generated.template.ts +101 -101
  368. package/src/{templates → template/implementations}/generated_http.template.ts +27 -57
  369. package/src/template/implementations/generated_sso.template.ts +151 -0
  370. package/src/{templates → template/implementations}/init_types.template.ts +5 -7
  371. package/src/{templates → template/implementations}/model.template.ts +52 -43
  372. package/src/{templates → template/implementations}/model_test.template.ts +5 -5
  373. package/src/{templates → template/implementations}/service.template.ts +66 -82
  374. package/src/{templates → template/implementations}/view_enums_buttonset.template.ts +3 -3
  375. package/src/{templates → template/implementations}/view_enums_dropdown.template.ts +4 -20
  376. package/src/{templates → template/implementations}/view_enums_select.template.ts +4 -4
  377. package/src/{templates → template/implementations}/view_form.template.ts +40 -83
  378. package/src/{templates → template/implementations}/view_id_all_select.template.ts +3 -3
  379. package/src/{templates → template/implementations}/view_id_async_select.template.ts +10 -24
  380. package/src/{templates → template/implementations}/view_list.template.ts +60 -152
  381. package/src/{templates → template/implementations}/view_list_columns.template.ts +5 -11
  382. package/src/{templates → template/implementations}/view_search_input.template.ts +3 -3
  383. package/src/template/index.ts +6 -0
  384. package/src/template/template-manager.ts +166 -0
  385. package/src/template/template-types.ts +16 -0
  386. package/src/template/template.ts +105 -0
  387. package/src/template/zod-converter.ts +525 -0
  388. package/src/testing/_relation-graph.ts +18 -11
  389. package/src/testing/fixture-manager.ts +472 -359
  390. package/src/types/types.ts +553 -308
  391. package/src/typings/knex.d.ts +7 -9
  392. package/src/utils/async-utils.ts +23 -10
  393. package/src/utils/console-util.ts +4 -0
  394. package/src/utils/controller.ts +3 -0
  395. package/src/utils/esm-utils.ts +59 -0
  396. package/src/utils/formatter.ts +109 -0
  397. package/src/utils/fs-utils.ts +1 -1
  398. package/src/utils/lodash-able.ts +1 -4
  399. package/src/utils/object-utils.ts +217 -0
  400. package/src/utils/path-utils.ts +99 -0
  401. package/src/utils/process-utils.ts +46 -0
  402. package/src/utils/sql-parser.ts +23 -5
  403. package/src/utils/type-utils.ts +83 -0
  404. package/src/utils/utils.ts +66 -43
  405. package/src/utils/zod-error.ts +3 -4
  406. package/dist/api/base-frame.js.map +0 -1
  407. package/dist/api/caster.js.map +0 -1
  408. package/dist/api/code-converters.js.map +0 -1
  409. package/dist/api/context.js.map +0 -1
  410. package/dist/api/decorators.js.map +0 -1
  411. package/dist/api/index.js.map +0 -1
  412. package/dist/api/sonamu.js.map +0 -1
  413. package/dist/bin/build-config.js.map +0 -1
  414. package/dist/bin/cli-wrapper.d.ts +0 -3
  415. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  416. package/dist/bin/cli-wrapper.js +0 -3
  417. package/dist/bin/cli-wrapper.js.map +0 -1
  418. package/dist/bin/cli.js.map +0 -1
  419. package/dist/database/_batch_update.js.map +0 -1
  420. package/dist/database/base-model.js.map +0 -1
  421. package/dist/database/code-generator.js.map +0 -1
  422. package/dist/database/db.js.map +0 -1
  423. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  424. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  425. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -2
  426. package/dist/database/knex-plugins/knex-on-duplicate-update.js.map +0 -1
  427. package/dist/database/puri-wrapper.js.map +0 -1
  428. package/dist/database/puri.js.map +0 -1
  429. package/dist/database/puri.types.js.map +0 -1
  430. package/dist/database/transaction-context.js.map +0 -1
  431. package/dist/database/upsert-builder.js.map +0 -1
  432. package/dist/entity/entity-manager.js.map +0 -1
  433. package/dist/entity/entity-utils.d.ts +0 -61
  434. package/dist/entity/entity-utils.d.ts.map +0 -1
  435. package/dist/entity/entity-utils.js +0 -2
  436. package/dist/entity/entity-utils.js.map +0 -1
  437. package/dist/entity/entity.js.map +0 -1
  438. package/dist/exceptions/error-handler.js.map +0 -1
  439. package/dist/exceptions/so-exceptions.js.map +0 -1
  440. package/dist/file-storage/driver.js.map +0 -1
  441. package/dist/file-storage/file-storage.js.map +0 -1
  442. package/dist/index.js.map +0 -1
  443. package/dist/migration/code-generation.js.map +0 -1
  444. package/dist/migration/migration-set.js.map +0 -1
  445. package/dist/migration/migrator.js.map +0 -1
  446. package/dist/migration/types.js.map +0 -1
  447. package/dist/stream/index.js.map +0 -1
  448. package/dist/stream/sse.js.map +0 -1
  449. package/dist/syncer/index.js.map +0 -1
  450. package/dist/syncer/syncer.js.map +0 -1
  451. package/dist/templates/base-template.d.ts +0 -13
  452. package/dist/templates/base-template.d.ts.map +0 -1
  453. package/dist/templates/base-template.js +0 -2
  454. package/dist/templates/base-template.js.map +0 -1
  455. package/dist/templates/entity.template.d.ts.map +0 -1
  456. package/dist/templates/entity.template.js +0 -2
  457. package/dist/templates/entity.template.js.map +0 -1
  458. package/dist/templates/generated.template.d.ts.map +0 -1
  459. package/dist/templates/generated.template.js +0 -2
  460. package/dist/templates/generated.template.js.map +0 -1
  461. package/dist/templates/generated_http.template.d.ts.map +0 -1
  462. package/dist/templates/generated_http.template.js +0 -2
  463. package/dist/templates/generated_http.template.js.map +0 -1
  464. package/dist/templates/generated_sso.template.d.ts.map +0 -1
  465. package/dist/templates/generated_sso.template.js +0 -2
  466. package/dist/templates/generated_sso.template.js.map +0 -1
  467. package/dist/templates/index.d.ts +0 -2
  468. package/dist/templates/index.d.ts.map +0 -1
  469. package/dist/templates/index.js +0 -2
  470. package/dist/templates/index.js.map +0 -1
  471. package/dist/templates/init_types.template.d.ts.map +0 -1
  472. package/dist/templates/init_types.template.js +0 -2
  473. package/dist/templates/init_types.template.js.map +0 -1
  474. package/dist/templates/model.template.d.ts +0 -17
  475. package/dist/templates/model.template.d.ts.map +0 -1
  476. package/dist/templates/model.template.js +0 -2
  477. package/dist/templates/model.template.js.map +0 -1
  478. package/dist/templates/model_test.template.d.ts.map +0 -1
  479. package/dist/templates/model_test.template.js +0 -2
  480. package/dist/templates/model_test.template.js.map +0 -1
  481. package/dist/templates/service.template.d.ts.map +0 -1
  482. package/dist/templates/service.template.js +0 -2
  483. package/dist/templates/service.template.js.map +0 -1
  484. package/dist/templates/view_enums_buttonset.template.d.ts.map +0 -1
  485. package/dist/templates/view_enums_buttonset.template.js +0 -2
  486. package/dist/templates/view_enums_buttonset.template.js.map +0 -1
  487. package/dist/templates/view_enums_dropdown.template.d.ts.map +0 -1
  488. package/dist/templates/view_enums_dropdown.template.js +0 -2
  489. package/dist/templates/view_enums_dropdown.template.js.map +0 -1
  490. package/dist/templates/view_enums_select.template.d.ts.map +0 -1
  491. package/dist/templates/view_enums_select.template.js +0 -2
  492. package/dist/templates/view_enums_select.template.js.map +0 -1
  493. package/dist/templates/view_form.template.d.ts.map +0 -1
  494. package/dist/templates/view_form.template.js +0 -2
  495. package/dist/templates/view_form.template.js.map +0 -1
  496. package/dist/templates/view_id_all_select.template.d.ts.map +0 -1
  497. package/dist/templates/view_id_all_select.template.js +0 -2
  498. package/dist/templates/view_id_all_select.template.js.map +0 -1
  499. package/dist/templates/view_id_async_select.template.d.ts.map +0 -1
  500. package/dist/templates/view_id_async_select.template.js +0 -2
  501. package/dist/templates/view_id_async_select.template.js.map +0 -1
  502. package/dist/templates/view_list.template.d.ts.map +0 -1
  503. package/dist/templates/view_list.template.js +0 -2
  504. package/dist/templates/view_list.template.js.map +0 -1
  505. package/dist/templates/view_list_columns.template.d.ts +0 -17
  506. package/dist/templates/view_list_columns.template.d.ts.map +0 -1
  507. package/dist/templates/view_list_columns.template.js +0 -2
  508. package/dist/templates/view_list_columns.template.js.map +0 -1
  509. package/dist/templates/view_search_input.template.d.ts.map +0 -1
  510. package/dist/templates/view_search_input.template.js +0 -2
  511. package/dist/templates/view_search_input.template.js.map +0 -1
  512. package/dist/testing/_relation-graph.js.map +0 -1
  513. package/dist/testing/fixture-manager.js.map +0 -1
  514. package/dist/types/types.js.map +0 -1
  515. package/dist/typings/knex.d.js.map +0 -1
  516. package/dist/utils/async-utils.js.map +0 -1
  517. package/dist/utils/controller.js.map +0 -1
  518. package/dist/utils/fs-utils.js.map +0 -1
  519. package/dist/utils/lodash-able.js.map +0 -1
  520. package/dist/utils/model.js.map +0 -1
  521. package/dist/utils/sql-parser.js.map +0 -1
  522. package/dist/utils/utils.js.map +0 -1
  523. package/dist/utils/zod-error.js.map +0 -1
  524. package/src/bin/cli-wrapper.ts +0 -75
  525. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  526. package/src/entity/entity-utils.ts +0 -291
  527. package/src/templates/base-template.ts +0 -19
  528. package/src/templates/generated_sso.template.ts +0 -138
  529. package/src/templates/index.ts +0 -1
@@ -1,11 +1,9 @@
1
1
  import qs from "qs";
2
2
  import { z } from "zod";
3
- import { TemplateOptions } from "../types/types";
4
- import { getZodObjectFromApi } from "../api/code-converters";
5
- import { ExtendedApi } from "../api/decorators";
6
- import { Template } from "./base-template";
7
- import prettier from "prettier";
8
- import { Sonamu } from "../api/sonamu";
3
+ import { getZodObjectFromApi } from "../../api/code-converters";
4
+ import type { ExtendedApi } from "../../api/decorators";
5
+ import { Sonamu } from "../../api/sonamu";
6
+ import { Template } from "../template";
9
7
 
10
8
  export class Template__generated_http extends Template {
11
9
  constructor() {
@@ -21,11 +19,13 @@ export class Template__generated_http extends Template {
21
19
  };
22
20
  }
23
21
 
24
- async render({}: TemplateOptions["generated_http"]) {
22
+ async render() {
25
23
  const {
26
24
  syncer: { types, apis },
27
25
  config: {
28
- route: { prefix },
26
+ api: {
27
+ route: { prefix },
28
+ },
29
29
  },
30
30
  } = Sonamu;
31
31
 
@@ -36,23 +36,13 @@ export class Template__generated_http extends Template {
36
36
  const dataLines = await (async () => {
37
37
  if ((api.options.httpMethod ?? "GET") === "GET") {
38
38
  return {
39
- querystring: [
40
- qs
41
- .stringify(reqObject, { encode: false })
42
- .split("&")
43
- .join("\n\t&"),
44
- ],
39
+ querystring: [qs.stringify(reqObject, { encode: false }).split("&").join("\n\t&")],
45
40
  body: [],
46
41
  };
47
42
  } else {
48
43
  return {
49
44
  querystring: [],
50
- body: [
51
- "",
52
- await prettier.format(JSON.stringify(reqObject), {
53
- parser: "json",
54
- }),
55
- ],
45
+ body: ["", JSON.stringify(reqObject, null, 2)],
56
46
  };
57
47
  }
58
48
  })();
@@ -65,7 +55,7 @@ export class Template__generated_http extends Template {
65
55
  `Content-Type: ${api.options.contentType ?? "application/json"}`,
66
56
  ...dataLines.body,
67
57
  ].join("\n");
68
- })
58
+ }),
69
59
  );
70
60
 
71
61
  return {
@@ -81,15 +71,10 @@ export class Template__generated_http extends Template {
81
71
  Object.keys(zodType.shape).map((key) => [
82
72
  key,
83
73
  this.zodTypeToReqDefault(zodType.shape[key], key),
84
- ])
74
+ ]),
85
75
  );
86
76
  } else if (zodType instanceof z.ZodArray) {
87
- return [
88
- this.zodTypeToReqDefault(
89
- (zodType as z.ZodArray<z.ZodType>).element,
90
- name
91
- ),
92
- ];
77
+ return [this.zodTypeToReqDefault((zodType as z.ZodArray<z.ZodType>).element, name)];
93
78
  } else if (zodType instanceof z.ZodString) {
94
79
  if (name.endsWith("_at") || name.endsWith("_date") || name === "range") {
95
80
  return "2000-01-01";
@@ -108,51 +93,36 @@ export class Template__generated_http extends Template {
108
93
  } else if (zodType instanceof z.ZodEnum) {
109
94
  return zodType.options[0];
110
95
  } else if (zodType instanceof z.ZodOptional) {
111
- return this.zodTypeToReqDefault(
112
- (zodType as z.ZodOptional<z.ZodType>).def.innerType,
113
- name
114
- );
96
+ return this.zodTypeToReqDefault((zodType as z.ZodOptional<z.ZodType>).def.innerType, name);
115
97
  } else if (zodType instanceof z.ZodNullable) {
116
98
  return null;
117
99
  } else if (zodType instanceof z.ZodUnion) {
118
- return this.zodTypeToReqDefault(
119
- (zodType as z.ZodUnion<z.ZodType[]>).def.options[0],
120
- name
121
- );
100
+ return this.zodTypeToReqDefault((zodType as z.ZodUnion<z.ZodType[]>).def.options[0], name);
122
101
  } else if (zodType instanceof z.ZodUnknown) {
123
102
  return "unknown";
124
103
  } else if (zodType instanceof z.ZodTuple) {
125
- return zodType.def.items.map((item: any) =>
126
- this.zodTypeToReqDefault(item, name)
127
- );
104
+ /** biome-ignore lint/suspicious/noExplicitAny: ZodTuple 타입 사용 */
105
+ return zodType.def.items.map((item: any) => this.zodTypeToReqDefault(item, name));
128
106
  } else if (zodType instanceof z.ZodDate) {
129
107
  return "2000-01-01";
130
108
  } else if (zodType instanceof z.ZodLiteral) {
131
109
  return zodType.value;
132
110
  } else if (zodType instanceof z.ZodRecord || zodType instanceof z.ZodMap) {
133
- const kvDef = (
134
- zodType as z.ZodRecord<any, z.ZodType> | z.ZodMap<z.ZodType, z.ZodType>
135
- ).def;
111
+ // biome-ignore lint/suspicious/noExplicitAny: ZodRecord 타입 사용
112
+ const kvDef = (zodType as z.ZodRecord<any, z.ZodType> | z.ZodMap<z.ZodType, z.ZodType>).def;
113
+ // biome-ignore lint/suspicious/noExplicitAny: ZodIntersection 타입 사용
136
114
  const key = this.zodTypeToReqDefault(kvDef.keyType, name) as any;
137
115
  const value = this.zodTypeToReqDefault(kvDef.valueType, name);
138
116
  return { [key]: value };
139
117
  } else if (zodType instanceof z.ZodSet) {
140
- return [
141
- this.zodTypeToReqDefault(
142
- (zodType as z.ZodSet<z.ZodType>).def.valueType,
143
- name
144
- ),
145
- ];
118
+ return [this.zodTypeToReqDefault((zodType as z.ZodSet<z.ZodType>).def.valueType, name)];
146
119
  } else if (zodType instanceof z.ZodIntersection) {
147
120
  return this.zodTypeToReqDefault(
148
121
  (zodType as z.ZodIntersection<z.ZodType, z.ZodType>).def.right,
149
- name
122
+ name,
150
123
  );
151
124
  } else if (zodType instanceof z.ZodDefault) {
152
- return this.zodTypeToReqDefault(
153
- (zodType as z.ZodDefault<z.ZodType>).def.innerType,
154
- name
155
- );
125
+ return this.zodTypeToReqDefault((zodType as z.ZodDefault<z.ZodType>).def.innerType, name);
156
126
  } else {
157
127
  // console.log(zodType);
158
128
  return `unknown-${zodType.type}`;
@@ -161,7 +131,8 @@ export class Template__generated_http extends Template {
161
131
 
162
132
  resolveApiParams(
163
133
  api: ExtendedApi,
164
- references: { [typeName: string]: z.ZodObject<any> }
134
+ // biome-ignore lint/suspicious/noExplicitAny: ZodObject 타입 사용
135
+ references: { [typeName: string]: z.ZodObject<any> },
165
136
  ): { [key: string]: unknown } {
166
137
  const reqType = getZodObjectFromApi(api, references);
167
138
  try {
@@ -170,9 +141,8 @@ export class Template__generated_http extends Template {
170
141
  };
171
142
  return def;
172
143
  } catch (error) {
173
- throw new Error(
174
- `Invalid zod type detected on ${api.modelName}:${api.methodName}`
175
- );
144
+ console.error(error);
145
+ throw new Error(`Invalid zod type detected on ${api.modelName}:${api.methodName}`);
176
146
  }
177
147
  }
178
148
  }
@@ -0,0 +1,151 @@
1
+ import assert from "assert";
2
+ import inflection from "inflection";
3
+ import { unique } from "radashi";
4
+ import { Sonamu } from "../../api";
5
+ import type { Entity } from "../../entity/entity";
6
+ import { EntityManager } from "../../entity/entity-manager";
7
+ import { isManyToManyRelationProp } from "../../types/types";
8
+ import { Template } from "../template";
9
+ import type { SourceCode } from "./generated.template";
10
+
11
+ export class Template__generated_sso extends Template {
12
+ constructor() {
13
+ super("generated_sso");
14
+ }
15
+
16
+ getTargetAndPath() {
17
+ const { dir } = Sonamu.config.api;
18
+
19
+ return {
20
+ target: `${dir}/src/application`,
21
+ path: `sonamu.generated.sso.ts`,
22
+ };
23
+ }
24
+
25
+ render() {
26
+ const entityIds = EntityManager.getAllIds();
27
+ const entities = entityIds.map((id) => EntityManager.get(id));
28
+
29
+ // SubsetQueries 생성 대상: 부모 엔티티가 없고 서브셋이 존재
30
+ const targetEntities = entities.filter(
31
+ (entity) => entity.parentId === undefined && Object.keys(entity.subsets).length > 0,
32
+ );
33
+
34
+ // SubsetQueries 생성
35
+ const sourceCodes: SourceCode[] = targetEntities.flatMap((entity) => {
36
+ const subsetKeys = Object.keys(entity.subsets);
37
+
38
+ const subsetKeyTypeName = `${entity.names.module}SubsetKey`;
39
+ const entityCamelName = inflection.camelize(entity.id, true);
40
+
41
+ // Puri 기반 SubsetQuery
42
+ const puriSubsetQuery: SourceCode = {
43
+ label: `SubsetQuery: ${entity.id}`,
44
+ lines: [
45
+ `export const ${entityCamelName}SubsetQueries = {`,
46
+ ...subsetKeys.map(
47
+ (subsetKey) => `${subsetKey}: (qbWrapper: PuriWrapper<DatabaseSchemaExtend>) => {
48
+ ${entity.getPuriSubsetQuery(subsetKey)};
49
+ },`,
50
+ ),
51
+ `};`,
52
+ "",
53
+ ],
54
+ importKeys: [],
55
+ };
56
+
57
+ // Puri 기반 SubsetLoadersQuery
58
+ const puriLoaderQuery: SourceCode = {
59
+ label: `LoaderQuery: ${entity.id}`,
60
+ lines: [
61
+ `export const ${entityCamelName}LoaderQueries = {`,
62
+ ...subsetKeys.map((subsetKey) => {
63
+ return `${subsetKey}: ${entity.getPuriLoaderQuery(subsetKey)},`;
64
+ }),
65
+ `} as const satisfies PuriLoaderQueries<${subsetKeyTypeName}>;`,
66
+ "",
67
+ ],
68
+ importKeys: [subsetKeyTypeName],
69
+ };
70
+
71
+ return [puriSubsetQuery, puriLoaderQuery];
72
+ });
73
+
74
+ // DatabaseSchema 생성
75
+ const dbSchemaSourceCode = this.getDatabaseSchemaSourceCode(entities);
76
+ if (dbSchemaSourceCode) {
77
+ sourceCodes.push(dbSchemaSourceCode);
78
+ }
79
+
80
+ const sourceCode = sourceCodes.reduce(
81
+ (result, ts) => {
82
+ if (ts === null) {
83
+ return result;
84
+ }
85
+ assert(result);
86
+ return {
87
+ lines: [...result.lines, `// ${ts.label}`, ...ts.lines, ""],
88
+ importKeys: unique([...result.importKeys, ...ts.importKeys]),
89
+ };
90
+ },
91
+ {
92
+ lines: [],
93
+ importKeys: [],
94
+ } as Omit<SourceCode, "label">,
95
+ );
96
+
97
+ const body = sourceCode.lines.join("\n");
98
+ const isUsingManyToManyBaseSchema = body.includes("ManyToManyBaseSchema");
99
+
100
+ const sonamuImports = [
101
+ "PuriWrapper",
102
+ "DatabaseSchemaExtend",
103
+ "PuriLoaderQueries",
104
+ isUsingManyToManyBaseSchema ? "ManyToManyBaseSchema" : "",
105
+ ]
106
+ .filter(Boolean)
107
+ .join(", ");
108
+
109
+ return {
110
+ ...this.getTargetAndPath(),
111
+ body: sourceCode.lines.join("\n"),
112
+ importKeys: sourceCode.importKeys,
113
+ customHeaders: [`import { ${sonamuImports} } from "sonamu";`],
114
+ };
115
+ }
116
+
117
+ getDatabaseSchemaSourceCode(entities: Entity[]): SourceCode | null {
118
+ if (entities.length === 0) {
119
+ return null;
120
+ }
121
+
122
+ const entitySchemaLines = entities.map((entity) => `${entity.table}: ${entity.id}BaseSchema;`);
123
+
124
+ const joinTables = unique(
125
+ entities.flatMap((entity) =>
126
+ entity.props.filter(isManyToManyRelationProp).map((prop) => {
127
+ const fromTableKey = inflection.singularize(entity.table);
128
+ const toTableKey = inflection.singularize(EntityManager.get(prop.with).table);
129
+ return { table: prop.joinTable, fromTableKey, toTableKey };
130
+ }),
131
+ ),
132
+ (joinTable) => joinTable.table,
133
+ );
134
+
135
+ return {
136
+ label: `DatabaseSchema`,
137
+ lines: [
138
+ `declare module "sonamu" {`,
139
+ ` export interface DatabaseSchemaExtend {`,
140
+ ...entitySchemaLines,
141
+ ...joinTables.map(
142
+ (joinTable) =>
143
+ `${joinTable.table}: ManyToManyBaseSchema<"${joinTable.fromTableKey}", "${joinTable.toTableKey}">;`,
144
+ ),
145
+ ` }`,
146
+ `}`,
147
+ ],
148
+ importKeys: entities.map((entity) => `${entity.id}BaseSchema`),
149
+ };
150
+ }
151
+ }
@@ -1,7 +1,7 @@
1
- import { TemplateOptions } from "../types/types";
2
- import { EntityManager, EntityNamesRecord } from "../entity/entity-manager";
3
- import { Template } from "./base-template";
4
- import { Sonamu } from "../api";
1
+ import { Sonamu } from "../../api";
2
+ import { EntityManager, type EntityNamesRecord } from "../../entity/entity-manager";
3
+ import type { TemplateOptions } from "../../types/types";
4
+ import { Template } from "../template";
5
5
 
6
6
  export class Template__init_types extends Template {
7
7
  constructor() {
@@ -21,9 +21,7 @@ export class Template__init_types extends Template {
21
21
  const names = EntityManager.getNamesFromId(entityId);
22
22
 
23
23
  const hasCreatedAt =
24
- EntityManager.get(entityId).props.find(
25
- (prop) => prop.name === "created_at"
26
- ) !== undefined;
24
+ EntityManager.get(entityId).props.find((prop) => prop.name === "created_at") !== undefined;
27
25
 
28
26
  return {
29
27
  ...this.getTargetAndPath(names),
@@ -1,8 +1,10 @@
1
- import { RenderingNode, TemplateOptions } from "../types/types";
2
- import { EntityManager, EntityNamesRecord } from "../entity/entity-manager";
3
- import { Template } from "./base-template";
1
+ import { Sonamu } from "../../api";
2
+ import { EntityManager, type EntityNamesRecord } from "../../entity/entity-manager";
3
+ import { Naite } from "../../naite/naite";
4
+ import type { TemplateOptions } from "../../types/types";
5
+ import { Template } from "../template";
6
+ import { getZodTypeById, zodTypeToRenderingNode } from "../zod-converter";
4
7
  import { Template__view_list } from "./view_list.template";
5
- import { Sonamu } from "../api";
6
8
 
7
9
  export class Template__model extends Template {
8
10
  constructor() {
@@ -18,11 +20,12 @@ export class Template__model extends Template {
18
20
  };
19
21
  }
20
22
 
21
- render(
22
- { entityId }: TemplateOptions["model"],
23
- _columnsNode: RenderingNode,
24
- listParamsNode: RenderingNode
25
- ) {
23
+ async render({ entityId }: TemplateOptions["model"]) {
24
+ Naite.t("render", { entityId });
25
+
26
+ const listParamsZodType = await getZodTypeById(`${entityId}ListParams`);
27
+ const listParamsNode = zodTypeToRenderingNode(listParamsZodType);
28
+
26
29
  const names = EntityManager.getNamesFromId(entityId);
27
30
  const entity = EntityManager.get(entityId);
28
31
 
@@ -35,20 +38,26 @@ export class Template__model extends Template {
35
38
  return {
36
39
  ...this.getTargetAndPath(names),
37
40
  body: `
38
- import { BaseModelClass, ListResult, asArray, NotFoundException, BadRequestException, api } from 'sonamu';
41
+ import { BaseModelClass, type ListResult, asArray, NotFoundException, BadRequestException, api, exhaustive } from 'sonamu';
39
42
  import {
40
43
  ${entityId}SubsetKey,
41
44
  ${entityId}SubsetMapping,
42
45
  } from "../sonamu.generated";
43
46
  import {
44
47
  ${names.camel}SubsetQueries,
48
+ ${names.camel}LoaderQueries,
45
49
  } from "../sonamu.generated.sso";
46
50
  import { ${entityId}ListParams, ${entityId}SaveParams } from "./${names.fs}.types";
47
51
 
48
52
  /*
49
53
  ${entityId} Model
50
54
  */
51
- class ${entityId}ModelClass extends BaseModelClass {
55
+ class ${entityId}ModelClass extends BaseModelClass<
56
+ ${entityId}SubsetKey,
57
+ ${entityId}SubsetMapping,
58
+ typeof ${names.camel}SubsetQueries,
59
+ typeof ${names.camel}LoaderQueries
60
+ > {
52
61
  modelName = "${entityId}";
53
62
 
54
63
  @api({ httpMethod: "GET", clients: ["axios", "swr"], resourceName: "${entityId}" })
@@ -96,38 +105,38 @@ class ${entityId}ModelClass extends BaseModelClass {
96
105
  };
97
106
 
98
107
  // build queries
99
- let { rows, total } = await this.runSubsetQuery({
108
+ const { qb, onSubset: _ } = this.getSubsetQueries(subset);
109
+
110
+ // id
111
+ if (params.id) {
112
+ qb.whereIn("${entity.table}.id", asArray(params.id));
113
+ }
114
+
115
+ // search-keyword
116
+ if (params.search && params.keyword && params.keyword.length > 0) {
117
+ if (params.search === "id") {
118
+ qb.where("${entity.table}.id", Number(params.keyword));
119
+ // } else if (params.search === "field") {
120
+ // qb.where("${entity.table}.field", "like", \`%\${params.keyword}%\`);
121
+ } else {
122
+ throw new BadRequestException(\`구현되지 않은 검색 필드 \${params.search}\`);
123
+ }
124
+ }
125
+
126
+ // orderBy
127
+ if (params.orderBy) {
128
+ // default orderBy
129
+ if (params.orderBy === "id-desc") {
130
+ qb.orderBy("${entity.table}.id", "desc");
131
+ } else {
132
+ exhaustive(params.orderBy);
133
+ }
134
+ }
135
+
136
+ const { rows, total } = await this.executeSubsetQuery({
100
137
  subset,
138
+ qb,
101
139
  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
140
  debug: false,
132
141
  });
133
142
 
@@ -144,7 +153,7 @@ class ${entityId}ModelClass extends BaseModelClass {
144
153
  const wdb = this.getPuri("w");
145
154
 
146
155
  // register
147
- spa.map((sp) => {
156
+ spa.forEach((sp) => {
148
157
  wdb.ubRegister("${entity.table}", sp);
149
158
  });
150
159
 
@@ -169,7 +178,7 @@ class ${entityId}ModelClass extends BaseModelClass {
169
178
  }
170
179
  }
171
180
 
172
- export const ${entityId}Model = new ${entityId}ModelClass();
181
+ export const ${entityId}Model = new ${entityId}ModelClass(${names.camel}SubsetQueries, ${names.camel}LoaderQueries);
173
182
  `.trim(),
174
183
  importKeys: [],
175
184
  };
@@ -1,7 +1,7 @@
1
- import { TemplateOptions } from "../types/types";
2
- import { EntityManager, EntityNamesRecord } from "../entity/entity-manager";
3
- import { Template } from "./base-template";
4
- import { Sonamu } from "../api";
1
+ import { Sonamu } from "../../api";
2
+ import { EntityManager, type EntityNamesRecord } from "../../entity/entity-manager";
3
+ import type { TemplateOptions } from "../../types/types";
4
+ import { Template } from "../template";
5
5
 
6
6
  export class Template__model_test extends Template {
7
7
  constructor() {
@@ -26,7 +26,7 @@ export class Template__model_test extends Template {
26
26
  import { describe, test, expect } from "vitest";
27
27
  import { bootstrap } from '../../testing/bootstrap';
28
28
 
29
- bootstrap([]);
29
+ bootstrap();
30
30
  describe.skip("${entityId}ModelTest", () => {
31
31
  test("Query", async () => {
32
32
  expect(true).toBe(true);