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,40 +1,16 @@
1
- import type { GuardKey } from "./../api/decorators";
2
1
  import type { FastifyReply, FastifyRequest } from "fastify";
3
2
  import { z } from "zod";
4
3
  import type { ApiDecoratorOptions, AuthContext, Context } from "../api";
5
-
6
- /*
7
- Enums
8
- */
9
- export type EnumsLabel<T extends string, L extends "ko" | "en"> = {
10
- [key in T]: { [lang in L]: string };
11
- };
12
- export type EnumsLabelKo<T extends string> = EnumsLabel<T, "ko">;
13
-
14
- /*
15
- Custom Scalars
16
- */
17
- export const SQLDateTimeString = z
18
- .string()
19
- .regex(/([0-9]{4}-[0-9]{2}-[0-9]{2}( [0-9]{2}:[0-9]{2}:[0-9]{2})*)$/, {
20
- message: "잘못된 SQLDate 타입",
21
- })
22
- .min(10)
23
- .max(19)
24
- .describe("SQLDateTimeString");
25
- export type SQLDateTimeString = z.infer<typeof SQLDateTimeString>;
4
+ import type { GuardKey } from "./../api/decorators";
26
5
 
27
6
  /*
28
7
  Utility Types
29
8
  */
30
- export function zArrayable<T extends z.ZodTypeAny>(
31
- shape: T
32
- ): z.ZodUnion<[T, z.ZodArray<T>]> {
9
+ export function zArrayable<T extends z.ZodTypeAny>(shape: T): z.ZodUnion<[T, z.ZodArray<T>]> {
33
10
  return z.union([shape, shape.array()]);
34
11
  }
35
- export type DistributiveOmit<T, K extends keyof any> = T extends any
36
- ? Omit<T, K>
37
- : never;
12
+ // biome-ignore lint/suspicious/noExplicitAny: any is used to make the type distributive
13
+ export type DistributiveOmit<T, K extends keyof any> = T extends any ? Omit<T, K> : never;
38
14
 
39
15
  /*
40
16
  Model-Defintion
@@ -48,81 +24,84 @@ export type CommonProp = {
48
24
  };
49
25
  export type IntegerProp = CommonProp & {
50
26
  type: "integer";
51
- unsigned?: true;
52
- };
27
+ }; // PG: integer / TS: number / JSON: number
28
+ export type IntegerArrayProp = CommonProp & {
29
+ type: "integer[]";
30
+ }; // PG: integer[] / TS: number[] / JSON: number[]
53
31
  export type BigIntegerProp = CommonProp & {
54
32
  type: "bigInteger";
55
- unsigned?: true;
56
- };
57
- export type TextProp = CommonProp & {
58
- type: "text";
59
- textType: "text" | "mediumtext" | "longtext";
60
- };
33
+ }; // PG: bigint / TS: bigint / JSON: bigint
34
+ export type BigIntegerArrayProp = CommonProp & {
35
+ type: "bigInteger[]";
36
+ }; // PG: bigint[] / TS: bigint[] / JSON: bigint[]
61
37
  export type StringProp = CommonProp & {
62
38
  type: "string";
63
- length: number;
64
- };
39
+ length?: number; // PG: varchar(n), text / TS: string / JSON: string
40
+ }; // PG: text / TS: string / JSON: string
41
+ export type StringArrayProp = CommonProp & {
42
+ type: "string[]";
43
+ length?: number; // PG: varchar(n)[], text[] / TS: string[] / JSON: string[]
44
+ }; // PG: varchar(n)[], text[] / TS: string[] / JSON: string[]
65
45
  export type EnumProp = CommonProp & {
66
46
  type: "enum";
67
- length: number;
68
47
  id: string;
69
- };
70
- export type FloatProp = CommonProp & {
71
- type: "float";
72
- unsigned?: true;
73
- precision: number;
74
- scale: number;
75
- };
76
- export type DoubleProp = CommonProp & {
77
- type: "double";
78
- unsigned?: true;
79
- precision: number;
80
- scale: number;
81
- };
82
- export type DecimalProp = CommonProp & {
83
- type: "decimal";
84
- unsigned?: true;
85
- precision: number;
86
- scale: number;
87
- };
48
+ length?: number;
49
+ }; // PG: text / TS: string / JSON: string
50
+ export type EnumArrayProp = CommonProp & {
51
+ type: "enum[]";
52
+ id: string;
53
+ }; // PG: text[] / TS: string[] / JSON: string[]
54
+ export type NumberProp = CommonProp & {
55
+ type: "number";
56
+ precision?: number; // PG: numeric(p, s) / TS: number / JSON: number
57
+ scale?: number; // PG: numeric(p, s) / TS: number / JSON: number
58
+ numberType?: "real" | "double precision" | "numeric"; // 기본값: numeric
59
+ }; // PG: numeric(p, s) / TS: number / JSON: number
60
+ export type NumberArrayProp = CommonProp & {
61
+ type: "number[]";
62
+ precision?: number;
63
+ scale?: number;
64
+ numberType?: "real" | "double precision" | "numeric"; // 기본값: numeric
65
+ }; // PG: numeric(p, s)[] / TS: number[] / JSON: number[]
66
+ export type NumericProp = CommonProp & {
67
+ type: "numeric";
68
+ precision?: number;
69
+ scale?: number;
70
+ }; // PG: numeric(p, s) / TS: string / JSON: string
71
+ export type NumericArrayProp = CommonProp & {
72
+ type: "numeric[]";
73
+ precision?: number;
74
+ scale?: number;
75
+ }; // PG: numeric(p, s)[] / TS: string[] / JSON: string[]
88
76
  export type BooleanProp = CommonProp & {
89
77
  type: "boolean";
90
- };
78
+ }; // PG: boolean / TS: boolean / JSON: boolean
79
+ export type BooleanArrayProp = CommonProp & {
80
+ type: "boolean[]";
81
+ }; // PG: boolean[] / TS: boolean[] / JSON: boolean[]
91
82
  export type DateProp = CommonProp & {
92
83
  type: "date";
93
- };
94
- export type DateTimeProp = CommonProp & {
95
- type: "datetime";
96
- };
97
- export type TimeProp = CommonProp & {
98
- type: "time";
99
- };
100
- export type TimestampProp = CommonProp & {
101
- type: "timestamp";
102
- };
84
+ }; // PG: timestampz / TS: Date / JSON: string(ISOString)
85
+ export type DateArrayProp = CommonProp & {
86
+ type: "date[]";
87
+ }; // PG: timestamptz[] / TS: Date[] / JSON: string[]
103
88
  export type JsonProp = CommonProp & {
104
89
  type: "json";
105
90
  id: string;
106
- };
91
+ }; // PG: json / TS: any(id) / JSON: any
107
92
  export type UuidProp = CommonProp & {
108
93
  type: "uuid";
109
- };
94
+ }; // PG: uuid / TS: string / JSON: string
95
+ export type UuidArrayProp = CommonProp & {
96
+ type: "uuid[]";
97
+ }; // PG: uuid[] / TS: string[] / JSON: string[]
110
98
  export type VirtualProp = CommonProp & {
111
99
  type: "virtual";
112
100
  id: string;
113
- };
101
+ }; // PG: none / TS: any(id) / JSON: any
114
102
 
115
- export type RelationType =
116
- | "HasMany"
117
- | "BelongsToOne"
118
- | "ManyToMany"
119
- | "OneToOne";
120
- export type RelationOn =
121
- | "CASCADE"
122
- | "SET NULL"
123
- | "NO ACTION"
124
- | "SET DEFAULT"
125
- | "RESTRICT";
103
+ export type RelationType = "HasMany" | "BelongsToOne" | "ManyToMany" | "OneToOne";
104
+ export type RelationOn = "CASCADE" | "SET NULL" | "NO ACTION" | "SET DEFAULT" | "RESTRICT";
126
105
  type _RelationProp = {
127
106
  type: "relation";
128
107
  name: string;
@@ -171,20 +150,25 @@ export type RelationProp =
171
150
 
172
151
  export type EntityProp =
173
152
  | IntegerProp
153
+ | IntegerArrayProp
174
154
  | BigIntegerProp
175
- | TextProp
155
+ | BigIntegerArrayProp
176
156
  | StringProp
177
- | FloatProp
178
- | DoubleProp
179
- | DecimalProp
157
+ | StringArrayProp
158
+ | EnumProp
159
+ | EnumArrayProp
160
+ | NumberProp
161
+ | NumberArrayProp
162
+ | NumericProp
163
+ | NumericArrayProp
164
+ | NumericProp
180
165
  | BooleanProp
166
+ | BooleanArrayProp
181
167
  | DateProp
182
- | DateTimeProp
183
- | TimeProp
184
- | TimestampProp
185
- | JsonProp
168
+ | DateArrayProp
186
169
  | UuidProp
187
- | EnumProp
170
+ | UuidArrayProp
171
+ | JsonProp
188
172
  | VirtualProp
189
173
  | RelationProp;
190
174
 
@@ -222,19 +206,6 @@ export type EntitySubsetRow = {
222
206
  };
223
207
  export type FlattenSubsetRow = Omit<EntitySubsetRow, "children">;
224
208
 
225
- // SMD Legacy
226
- export type SMDInput<T extends string> = {
227
- id: string;
228
- parentId?: string;
229
- table?: string;
230
- title?: string;
231
- props?: EntityProp[];
232
- indexes?: EntityIndex[];
233
- subsets?: {
234
- [subset: string]: T[];
235
- };
236
- };
237
-
238
209
  /*
239
210
  PropNode
240
211
  */
@@ -269,70 +240,107 @@ export type EntityPropNode =
269
240
  /*
270
241
  Prop Type Guards
271
242
  */
272
- export function isIntegerProp(p: any): p is IntegerProp {
273
- return p?.type === "integer";
243
+ export function isIntegerSingleProp(p: unknown): p is IntegerProp {
244
+ return (p as IntegerProp)?.type === "integer";
245
+ }
246
+ export function isIntegerArrayProp(p: unknown): p is IntegerArrayProp {
247
+ return (p as IntegerArrayProp)?.type === "integer[]";
248
+ }
249
+ export function isIntegerProp(p: unknown): p is IntegerProp | IntegerArrayProp {
250
+ return isIntegerSingleProp(p) || isIntegerArrayProp(p);
251
+ }
252
+ export function isBigIntegerSingleProp(p: unknown): p is BigIntegerProp {
253
+ return (p as BigIntegerProp)?.type === "bigInteger";
254
+ }
255
+ export function isBigIntegerArrayProp(p: unknown): p is BigIntegerArrayProp {
256
+ return (p as BigIntegerArrayProp)?.type === "bigInteger[]";
257
+ }
258
+ export function isBigIntegerProp(p: unknown): p is BigIntegerProp | BigIntegerArrayProp {
259
+ return isBigIntegerSingleProp(p) || isBigIntegerArrayProp(p);
260
+ }
261
+ export function isStringSingleProp(p: unknown): p is StringProp {
262
+ return (p as StringProp)?.type === "string";
263
+ }
264
+ export function isStringArrayProp(p: unknown): p is StringArrayProp {
265
+ return (p as StringArrayProp)?.type === "string[]";
266
+ }
267
+ export function isStringProp(p: unknown): p is StringProp | StringArrayProp {
268
+ return isStringSingleProp(p) || isStringArrayProp(p);
269
+ }
270
+ export function isEnumSingleProp(p: unknown): p is EnumProp {
271
+ return (p as EnumProp)?.type === "enum";
272
+ }
273
+ export function isEnumArrayProp(p: unknown): p is EnumArrayProp {
274
+ return (p as EnumArrayProp)?.type === "enum[]";
275
+ }
276
+ export function isEnumProp(p: unknown): p is EnumProp | EnumArrayProp {
277
+ return isEnumSingleProp(p) || isEnumArrayProp(p);
278
+ }
279
+ export function isNumberSingleProp(p: unknown): p is NumberProp {
280
+ return (p as NumberProp)?.type === "number";
274
281
  }
275
- export function isBigIntegerProp(p: any): p is BigIntegerProp {
276
- return p?.type === "bigInteger";
282
+ export function isNumberArrayProp(p: unknown): p is NumberArrayProp {
283
+ return (p as NumberArrayProp)?.type === "number[]";
277
284
  }
278
- export function isTextProp(p: any): p is TextProp {
279
- return p?.type === "text";
285
+ export function isNumberProp(p: unknown): p is NumberProp | NumberArrayProp {
286
+ return isNumberSingleProp(p) || isNumberArrayProp(p);
280
287
  }
281
- export function isStringProp(p: any): p is StringProp {
282
- return p?.type === "string";
288
+ export function isNumericSingleProp(p: unknown): p is NumericProp {
289
+ return (p as NumericProp)?.type === "numeric";
283
290
  }
284
- export function isEnumProp(p: any): p is EnumProp {
285
- return p?.type === "enum";
291
+ export function isNumericArrayProp(p: unknown): p is NumericArrayProp {
292
+ return (p as NumericArrayProp)?.type === "numeric[]";
286
293
  }
287
- export function isFloatProp(p: any): p is FloatProp {
288
- return p?.type === "float";
294
+ export function isNumericProp(p: unknown): p is NumericProp | NumericArrayProp {
295
+ return isNumericSingleProp(p) || isNumericArrayProp(p);
289
296
  }
290
- export function isDoubleProp(p: any): p is DoubleProp {
291
- return p?.type === "double";
297
+ export function isBooleanSingleProp(p: unknown): p is BooleanProp {
298
+ return (p as BooleanProp)?.type === "boolean";
292
299
  }
293
- export function isDecimalProp(p: any): p is DecimalProp {
294
- return p?.type === "decimal";
300
+ export function isBooleanArrayProp(p: unknown): p is BooleanArrayProp {
301
+ return (p as BooleanArrayProp)?.type === "boolean[]";
295
302
  }
296
- export function isBooleanProp(p: any): p is BooleanProp {
297
- return p?.type === "boolean";
303
+ export function isBooleanProp(p: unknown): p is BooleanProp | BooleanArrayProp {
304
+ return isBooleanSingleProp(p) || isBooleanArrayProp(p);
298
305
  }
299
- export function isDateProp(p: any): p is DateProp {
300
- return p?.type === "date";
306
+ export function isDateSingleProp(p: unknown): p is DateProp {
307
+ return (p as DateProp)?.type === "date";
301
308
  }
302
- export function isDateTimeProp(p: any): p is DateTimeProp {
303
- return p?.type === "datetime";
309
+ export function isDateArrayProp(p: unknown): p is DateArrayProp {
310
+ return (p as DateArrayProp)?.type === "date[]";
304
311
  }
305
- export function isTimeProp(p: any): p is TimeProp {
306
- return p?.type === "time";
312
+ export function isDateProp(p: unknown): p is DateProp | DateArrayProp {
313
+ return isDateSingleProp(p) || isDateArrayProp(p);
307
314
  }
308
- export function isTimestampProp(p: any): p is TimestampProp {
309
- return p?.type === "timestamp";
315
+ export function isUuidSingleProp(p: unknown): p is UuidProp {
316
+ return (p as UuidProp)?.type === "uuid";
310
317
  }
311
- export function isJsonProp(p: any): p is JsonProp {
312
- return p?.type === "json";
318
+ export function isUuidArrayProp(p: unknown): p is UuidArrayProp {
319
+ return (p as UuidArrayProp)?.type === "uuid[]";
313
320
  }
314
- export function isUuidProp(p: any): p is UuidProp {
315
- return p?.type === "uuid";
321
+ export function isUuidProp(p: unknown): p is UuidProp | UuidArrayProp {
322
+ return isUuidSingleProp(p) || isUuidArrayProp(p);
316
323
  }
317
- export function isVirtualProp(p: any): p is VirtualProp {
318
- return p?.type === "virtual";
324
+ export function isJsonProp(p: unknown): p is JsonProp {
325
+ return (p as JsonProp)?.type === "json";
319
326
  }
320
- export function isRelationProp(p: any): p is RelationProp {
321
- return p?.type === "relation";
327
+ export function isVirtualProp(p: unknown): p is VirtualProp {
328
+ return (p as VirtualProp)?.type === "virtual";
322
329
  }
323
- export function isOneToOneRelationProp(p: any): p is OneToOneRelationProp {
324
- return p?.relationType === "OneToOne";
330
+ export function isRelationProp(p: unknown): p is RelationProp {
331
+ return (p as RelationProp)?.type === "relation";
325
332
  }
326
- export function isBelongsToOneRelationProp(
327
- p: any
328
- ): p is BelongsToOneRelationProp {
329
- return p?.relationType === "BelongsToOne";
333
+ export function isOneToOneRelationProp(p: unknown): p is OneToOneRelationProp {
334
+ return (p as OneToOneRelationProp)?.relationType === "OneToOne";
330
335
  }
331
- export function isHasManyRelationProp(p: any): p is HasManyRelationProp {
332
- return p?.relationType === "HasMany";
336
+ export function isBelongsToOneRelationProp(p: unknown): p is BelongsToOneRelationProp {
337
+ return (p as BelongsToOneRelationProp)?.relationType === "BelongsToOne";
333
338
  }
334
- export function isManyToManyRelationProp(p: any): p is ManyToManyRelationProp {
335
- return p?.relationType === "ManyToMany";
339
+ export function isHasManyRelationProp(p: unknown): p is HasManyRelationProp {
340
+ return (p as HasManyRelationProp)?.relationType === "HasMany";
341
+ }
342
+ export function isManyToManyRelationProp(p: unknown): p is ManyToManyRelationProp {
343
+ return (p as ManyToManyRelationProp)?.relationType === "ManyToMany";
336
344
  }
337
345
 
338
346
  type JoinClause =
@@ -343,44 +351,9 @@ type JoinClause =
343
351
  | {
344
352
  custom: string;
345
353
  };
346
- export function isCustomJoinClause(p: any): p is { custom: string } {
347
- return p?.custom;
348
- }
349
-
350
- /* 서브셋 */
351
- // type SubsetLoader = {
352
- // as: string;
353
- // table: string;
354
- // manyJoin: {
355
- // fromTable: string;
356
- // fromCol: string;
357
- // idField: string;
358
- // toTable: string;
359
- // toCol: string;
360
- // through?: {
361
- // table: string;
362
- // fromCol: string;
363
- // toCol: string;
364
- // };
365
- // };
366
- // oneJoins: ({
367
- // as: string;
368
- // join: "inner" | "outer";
369
- // table: string;
370
- // } & JoinClause)[];
371
- // select: (string | Knex.Raw)[];
372
- // loaders?: SubsetLoader[];
373
- // };
374
- // export type SubsetQuery = {
375
- // select: (string | Knex.Raw)[];
376
- // virtual: string[];
377
- // joins: ({
378
- // as: string;
379
- // join: "inner" | "outer";
380
- // table: string;
381
- // } & JoinClause)[];
382
- // loaders: SubsetLoader[];
383
- // };
354
+ export function isCustomJoinClause(p: unknown): p is { custom: string } {
355
+ return !!(p as { custom: string })?.custom;
356
+ }
384
357
 
385
358
  type SubsetLoader = {
386
359
  as: string;
@@ -429,8 +402,8 @@ export type KnexError = {
429
402
  sqlMessage: string;
430
403
  sqlState: string;
431
404
  };
432
- export function isKnexError(e: any): e is KnexError {
433
- return e.code && e.sqlMessage && e.sqlState;
405
+ export function isKnexError(e: unknown): e is KnexError {
406
+ return !!(e as KnexError)?.code && !!(e as KnexError)?.sqlMessage && !!(e as KnexError)?.sqlState;
434
407
  }
435
408
 
436
409
  export type KnexColumnType =
@@ -451,11 +424,27 @@ export type KnexColumnType =
451
424
  | "date"
452
425
  | "time"
453
426
  | "datetime";
427
+ export type MigrationColumnType =
428
+ | "string"
429
+ | "string[]"
430
+ | "integer"
431
+ | "integer[]"
432
+ | "bigInteger"
433
+ | "bigInteger[]"
434
+ | "numberOrNumeric"
435
+ | "numberOrNumeric[]"
436
+ | "boolean"
437
+ | "boolean[]"
438
+ | "date"
439
+ | "date[]"
440
+ | "uuid"
441
+ | "uuid[]"
442
+ | "json";
454
443
  export type MigrationColumn = {
455
444
  name: string;
456
- type: KnexColumnType;
445
+ type: MigrationColumnType;
457
446
  nullable: boolean;
458
- unsigned?: boolean;
447
+ numberType?: "real" | "double precision" | "numeric";
459
448
  length?: number;
460
449
  defaultTo?: string;
461
450
  precision?: number;
@@ -566,53 +555,83 @@ export namespace ApiParamType {
566
555
  constraint?: ApiParamType;
567
556
  };
568
557
 
569
- export function isObject(v: any): v is ApiParamType.Object {
570
- return v?.t === "object";
558
+ export function isObject(v: unknown): v is ApiParamType.Object {
559
+ return (v as ApiParamType.Object)?.t === "object";
571
560
  }
572
- export function isUnion(v: any): v is ApiParamType.Union {
573
- return v?.t === "union";
561
+ export function isUnion(v: unknown): v is ApiParamType.Union {
562
+ return (v as ApiParamType.Union)?.t === "union";
574
563
  }
575
- export function isIntersection(v: any): v is ApiParamType.Intersection {
576
- return v?.t === "intersection";
564
+ export function isIntersection(v: unknown): v is ApiParamType.Intersection {
565
+ return (v as ApiParamType.Intersection)?.t === "intersection";
577
566
  }
578
- export function isStringLiteral(v: any): v is ApiParamType.StringLiteral {
579
- return v?.t === "string-literal";
567
+ export function isStringLiteral(v: unknown): v is ApiParamType.StringLiteral {
568
+ return (v as ApiParamType.StringLiteral)?.t === "string-literal";
580
569
  }
581
- export function isNumericLiteral(v: any): v is ApiParamType.NumericLiteral {
582
- return v?.t === "numeric-literal";
570
+ export function isNumericLiteral(v: unknown): v is ApiParamType.NumericLiteral {
571
+ return (v as ApiParamType.NumericLiteral)?.t === "numeric-literal";
583
572
  }
584
- export function isArray(v: any): v is ApiParamType.Array {
585
- return v?.t === "array";
573
+ export function isArray(v: unknown): v is ApiParamType.Array {
574
+ return (v as ApiParamType.Array)?.t === "array";
586
575
  }
587
- export function isRef(v: any): v is ApiParamType.Ref {
588
- return v?.t === "ref";
576
+ export function isRef(v: unknown): v is ApiParamType.Ref {
577
+ return typeof v === "object" && v !== null && (v as { t?: unknown }).t === "ref";
589
578
  }
590
- export function isIndexedAccess(v: any): v is ApiParamType.IndexedAccess {
591
- return v?.t === "indexed-access";
579
+ export function isIndexedAccess(v: unknown): v is ApiParamType.IndexedAccess {
580
+ return typeof v === "object" && v !== null && (v as { t?: unknown }).t === "indexed-access";
592
581
  }
593
- export function isTupleType(v: any): v is ApiParamType.TupleType {
594
- return v?.t === "tuple-type";
582
+ export function isTupleType(v: unknown): v is ApiParamType.TupleType {
583
+ return typeof v === "object" && v !== null && (v as { t?: unknown }).t === "tuple-type";
595
584
  }
596
- export function isPick(v: any): v is ApiParamType.Pick {
597
- return v?.t === "ref" && v.id === "Pick";
585
+ export function isPick(v: unknown): v is ApiParamType.Pick {
586
+ return (
587
+ typeof v === "object" &&
588
+ v !== null &&
589
+ (v as { t?: unknown }).t === "ref" &&
590
+ (v as { id?: unknown }).id === "Pick"
591
+ );
598
592
  }
599
- export function isOmit(v: any): v is ApiParamType.Omit {
600
- return v?.t === "ref" && v.id === "Omit";
593
+ export function isOmit(v: unknown): v is ApiParamType.Omit {
594
+ return (
595
+ typeof v === "object" &&
596
+ v !== null &&
597
+ (v as { t?: unknown }).t === "ref" &&
598
+ (v as { id?: unknown }).id === "Omit"
599
+ );
601
600
  }
602
- export function isPartial(v: any): v is ApiParamType.Partial {
603
- return v?.t === "ref" && v.id === "Partial";
601
+ export function isPartial(v: unknown): v is ApiParamType.Partial {
602
+ return (
603
+ typeof v === "object" &&
604
+ v !== null &&
605
+ (v as { t?: unknown }).t === "ref" &&
606
+ (v as { id?: unknown }).id === "Partial"
607
+ );
604
608
  }
605
- export function isPromise(v: any): v is ApiParamType.Promise {
606
- return v?.t === "ref" && v.id === "Promise";
609
+ export function isPromise(v: unknown): v is ApiParamType.Promise {
610
+ return (
611
+ typeof v === "object" &&
612
+ v !== null &&
613
+ (v as { t?: unknown }).t === "ref" &&
614
+ (v as { id?: unknown }).id === "Promise"
615
+ );
607
616
  }
608
- export function isContext(v: any): v is ApiParamType.Context {
609
- return v?.t === "ref" && v.id === "Context";
617
+ export function isContext(v: unknown): v is ApiParamType.Context {
618
+ return (
619
+ typeof v === "object" &&
620
+ v !== null &&
621
+ (v as { t?: unknown }).t === "ref" &&
622
+ (v as { id?: unknown }).id === "Context"
623
+ );
610
624
  }
611
- export function isRefKnex(v: any): v is ApiParamType.Ref {
612
- return v?.t === "ref" && v.id === "Knex";
625
+ export function isRefKnex(v: unknown): v is ApiParamType.Ref {
626
+ return (
627
+ typeof v === "object" &&
628
+ v !== null &&
629
+ (v as { t?: unknown }).t === "ref" &&
630
+ (v as { id?: unknown }).id === "Knex"
631
+ );
613
632
  }
614
- export function isTypeParam(v: any): v is ApiParamType.TypeParam {
615
- return v?.t === "type-param";
633
+ export function isTypeParam(v: unknown): v is ApiParamType.TypeParam {
634
+ return typeof v === "object" && v !== null && (v as { t?: unknown }).t === "type-param";
616
635
  }
617
636
  }
618
637
  export type ApiParamType =
@@ -689,17 +708,270 @@ export type RenderingNode = {
689
708
  nullable?: boolean;
690
709
  };
691
710
 
711
+ const BasePropFields = {
712
+ name: z.string(),
713
+ desc: z.string().optional(),
714
+ nullable: z.boolean().optional(),
715
+ toFilter: z.literal(true).optional(),
716
+ dbDefault: z.union([z.string(), z.number(), z.boolean()]).optional(),
717
+ };
718
+
719
+ // 부가 필드가 필요없는 prop
720
+ const BasePropFieldsWithoutAdditional = z
721
+ .object({
722
+ ...BasePropFields,
723
+ type: z.union([
724
+ z.literal("integer"),
725
+ z.literal("integer[]"),
726
+ z.literal("bigInteger"),
727
+ z.literal("bigInteger[]"),
728
+ z.literal("boolean"),
729
+ z.literal("boolean[]"),
730
+ z.literal("date"),
731
+ z.literal("date[]"),
732
+ z.literal("uuid"),
733
+ z.literal("uuid[]"),
734
+ ]),
735
+ })
736
+ .strict();
737
+
738
+ // precision/scale 필드
739
+ const PrecisionScaleFields = {
740
+ precision: z.number().optional(),
741
+ scale: z.number().optional(),
742
+ };
743
+
744
+ // 각 타입별 스키마 정의
745
+
746
+ const StringPropSchema = z
747
+ .object({
748
+ ...BasePropFields,
749
+ type: z.literal("string"),
750
+ length: z.number().optional(),
751
+ })
752
+ .strict();
753
+ const StringArrayPropSchema = z
754
+ .object({
755
+ ...BasePropFields,
756
+ type: z.literal("string[]"),
757
+ length: z.number().optional(),
758
+ })
759
+ .strict();
760
+
761
+ const EnumPropSchema = z
762
+ .object({
763
+ ...BasePropFields,
764
+ type: z.literal("enum"),
765
+ id: z.string(),
766
+ })
767
+ .strict();
768
+ const EnumArrayPropSchema = z
769
+ .object({
770
+ ...BasePropFields,
771
+ type: z.literal("enum[]"),
772
+ id: z.string(),
773
+ })
774
+ .strict();
775
+
776
+ const NumberPropSchema = z
777
+ .object({
778
+ ...BasePropFields,
779
+ type: z.literal("number"),
780
+ ...PrecisionScaleFields,
781
+ numberType: z.enum(["real", "double precision", "numeric"]).optional(),
782
+ })
783
+ .strict();
784
+ const NumberArrayPropSchema = z
785
+ .object({
786
+ ...BasePropFields,
787
+ type: z.literal("number[]"),
788
+ ...PrecisionScaleFields,
789
+ numberType: z.enum(["real", "double precision", "numeric"]).optional(),
790
+ })
791
+ .strict();
792
+
793
+ const NumericPropSchema = z
794
+ .object({
795
+ ...BasePropFields,
796
+ type: z.literal("numeric"),
797
+ ...PrecisionScaleFields,
798
+ })
799
+ .strict();
800
+ const NumericArrayPropSchema = z
801
+ .object({
802
+ ...BasePropFields,
803
+ type: z.literal("numeric[]"),
804
+ ...PrecisionScaleFields,
805
+ })
806
+ .strict();
807
+
808
+ const JsonPropSchema = z
809
+ .object({
810
+ ...BasePropFields,
811
+ type: z.literal("json"),
812
+ id: z.string(),
813
+ })
814
+ .strict();
815
+
816
+ const VirtualPropSchema = z
817
+ .object({
818
+ ...BasePropFields,
819
+ type: z.literal("virtual"),
820
+ id: z.string(),
821
+ })
822
+ .strict();
823
+
824
+ // Relation 타입은 relationType에 따라 세분화
825
+ const BaseRelationFields = {
826
+ ...BasePropFields,
827
+ type: z.literal("relation"),
828
+ with: z.string(),
829
+ };
830
+
831
+ // RelationOn 타입
832
+ const RelationOnSchema = z.enum(["CASCADE", "SET NULL", "NO ACTION", "SET DEFAULT", "RESTRICT"]);
833
+
834
+ const BelongsToOneRelationPropSchema = z
835
+ .object({
836
+ ...BaseRelationFields,
837
+ relationType: z.literal("BelongsToOne"),
838
+ customJoinClause: z.string().optional(),
839
+ useConstraint: z.boolean().optional(),
840
+ onUpdate: RelationOnSchema.optional(),
841
+ onDelete: RelationOnSchema.optional(),
842
+ })
843
+ .strict();
844
+
845
+ const HasManyRelationPropSchema = z
846
+ .object({
847
+ ...BaseRelationFields,
848
+ relationType: z.literal("HasMany"),
849
+ joinColumn: z.string(),
850
+ fromColumn: z.string().optional(),
851
+ })
852
+ .strict();
853
+
854
+ const ManyToManyRelationPropSchema = z
855
+ .object({
856
+ ...BaseRelationFields,
857
+ relationType: z.literal("ManyToMany"),
858
+ joinTable: z.string(),
859
+ onUpdate: RelationOnSchema,
860
+ onDelete: RelationOnSchema,
861
+ })
862
+ .strict();
863
+
864
+ const OneToOneRelationPropSchema = z
865
+ .object({
866
+ ...BaseRelationFields,
867
+ relationType: z.literal("OneToOne"),
868
+ customJoinClause: z.string().optional(),
869
+ hasJoinColumn: z.boolean().optional(),
870
+ useConstraint: z.boolean().optional(),
871
+ onUpdate: RelationOnSchema.optional(),
872
+ onDelete: RelationOnSchema.optional(),
873
+ })
874
+ .strict();
875
+
876
+ const RelationTypes = ["BelongsToOne", "HasMany", "ManyToMany", "OneToOne"] as const;
877
+ export const RelationPropSchema = z.discriminatedUnion(
878
+ "relationType",
879
+ [
880
+ BelongsToOneRelationPropSchema,
881
+ HasManyRelationPropSchema,
882
+ ManyToManyRelationPropSchema,
883
+ OneToOneRelationPropSchema,
884
+ ],
885
+ {
886
+ error: (iss) =>
887
+ `relationType은 ${RelationTypes.map((t) => `'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${(iss.input as Record<string, unknown>)?.relationType}"`,
888
+ },
889
+ );
890
+
891
+ const NormalPropTypes = [
892
+ "integer",
893
+ "integer[]",
894
+ "bigInteger",
895
+ "bigInteger[]",
896
+ "string",
897
+ "string[]",
898
+ "enum",
899
+ "enum[]",
900
+ "number",
901
+ "number[]",
902
+ "numeric",
903
+ "numeric[]",
904
+ "boolean",
905
+ "boolean[]",
906
+ "date",
907
+ "date[]",
908
+ "uuid",
909
+ "uuid[]",
910
+ "json",
911
+ "virtual",
912
+ ] as const;
913
+ export const NormalPropSchema = z.discriminatedUnion(
914
+ "type",
915
+ [
916
+ BasePropFieldsWithoutAdditional,
917
+ StringPropSchema,
918
+ StringArrayPropSchema,
919
+ EnumPropSchema,
920
+ EnumArrayPropSchema,
921
+ NumberPropSchema,
922
+ NumberArrayPropSchema,
923
+ NumericPropSchema,
924
+ NumericArrayPropSchema,
925
+ JsonPropSchema,
926
+ VirtualPropSchema,
927
+ ],
928
+ {
929
+ error: (iss) =>
930
+ `type은 ${NormalPropTypes.map((t) => `'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${(iss.input as Record<string, unknown>)?.type}"`,
931
+ },
932
+ );
933
+
934
+ const AllPropTypes = [...NormalPropTypes, "relation"] as const;
935
+ const EntityPropSchema = z.discriminatedUnion("type", [NormalPropSchema, RelationPropSchema], {
936
+ error: (iss) =>
937
+ `type은 ${AllPropTypes.map((t) => `'${t}'`).join(", ")} 중 하나여야 합니다. 입력값: "${(iss.input as Record<string, unknown>)?.type}"`,
938
+ });
939
+
940
+ // EntityIndex 스키마 정의
941
+ const EntityIndexSchema = z
942
+ .object({
943
+ type: z.enum(["index", "unique", "fulltext"]),
944
+ columns: z.array(z.string()),
945
+ name: z.string().optional(),
946
+ parser: z.enum(["built-in", "ngram"]).optional(),
947
+ })
948
+ .strict();
949
+
950
+ export const EntityJsonSchema = z
951
+ .object({
952
+ id: z.string().describe("PascalCase로 된 Entity ID"),
953
+ title: z.string().describe("Entity 이름"),
954
+ table: z.string().describe("snake_case로 된 테이블명"),
955
+ parentId: z.string().optional().describe("부모 Entity ID"),
956
+ props: z.array(EntityPropSchema),
957
+ indexes: z.array(EntityIndexSchema),
958
+ subsets: z.record(z.string(), z.array(z.string())),
959
+ enums: z.record(z.string(), z.record(z.string(), z.string())),
960
+ })
961
+ .strict();
962
+
692
963
  export const TemplateOptions = z.object({
693
- entity: z.object({
694
- entityId: z.string(),
695
- parentId: z.string().optional(),
696
- title: z.string(),
697
- table: z.string().optional(),
698
- props: z.array(z.object({})).optional(),
699
- indexes: z.array(z.object({})).optional(),
700
- subsets: z.object({}).optional(),
701
- enums: z.object({}).optional(),
702
- }),
964
+ entity: EntityJsonSchema.omit({ id: true })
965
+ .extend({
966
+ entityId: z.string(),
967
+ })
968
+ .partial({
969
+ table: true,
970
+ props: true,
971
+ indexes: true,
972
+ subsets: true,
973
+ enums: true,
974
+ }),
703
975
  init_types: z.object({
704
976
  entityId: z.string(),
705
977
  }),
@@ -710,8 +982,8 @@ export const TemplateOptions = z.object({
710
982
  }),
711
983
  model: z.object({
712
984
  entityId: z.string(),
713
- defaultSearchField: z.string(),
714
- defaultOrderBy: z.string(),
985
+ defaultSearchField: z.string().optional(),
986
+ defaultOrderBy: z.string().optional(),
715
987
  }),
716
988
  model_test: z.object({
717
989
  entityId: z.string(),
@@ -815,6 +1087,7 @@ export type FixtureSearchOptions = {
815
1087
  searchType: "equals" | "like";
816
1088
  };
817
1089
 
1090
+ type ColumnValue = string | number | boolean | Date | null;
818
1091
  export type FixtureRecord = {
819
1092
  fixtureId: string;
820
1093
  entityId: string;
@@ -822,7 +1095,7 @@ export type FixtureRecord = {
822
1095
  columns: {
823
1096
  [key: string]: {
824
1097
  prop: EntityProp;
825
- value: any;
1098
+ value: ColumnValue | ColumnValue[];
826
1099
  };
827
1100
  };
828
1101
  fetchedRecords: string[];
@@ -835,7 +1108,7 @@ export type FixtureRecord = {
835
1108
  export type FixtureImportResult = {
836
1109
  entityId: string;
837
1110
  data: {
838
- [key: string]: any;
1111
+ [key: string]: ColumnValue;
839
1112
  };
840
1113
  };
841
1114
 
@@ -845,11 +1118,9 @@ export type RelationNode = {
845
1118
  related: Set<string>;
846
1119
  };
847
1120
 
1121
+ // biome-ignore lint/suspicious/noEmptyInterface: sonamu.generated.sso 에서 확장을 위해 준비된 빈 인터페이스
848
1122
  export interface DatabaseSchemaExtend {}
849
- export type ManyToManyBaseSchema<
850
- FromIdKey extends string,
851
- ToIdKey extends string,
852
- > = {
1123
+ export type ManyToManyBaseSchema<FromIdKey extends string, ToIdKey extends string> = {
853
1124
  id: number;
854
1125
  } & {
855
1126
  [K in `${FromIdKey}_id`]: number;
@@ -859,13 +1130,10 @@ export type ManyToManyBaseSchema<
859
1130
 
860
1131
  export type SonamuFastifyConfig = {
861
1132
  contextProvider: (
862
- defaultContext: Pick<
863
- Context,
864
- "request" | "reply" | "headers" | "createSSE" | "naiteStore"
865
- > &
1133
+ defaultContext: Pick<Context, "request" | "reply" | "headers" | "createSSE" | "naiteStore"> &
866
1134
  AuthContext,
867
1135
  request: FastifyRequest,
868
- reply: FastifyReply
1136
+ reply: FastifyReply,
869
1137
  ) => Context | Promise<Context>;
870
1138
  guardHandler: (
871
1139
  guard: GuardKey,
@@ -878,7 +1146,7 @@ export type SonamuFastifyConfig = {
878
1146
  methodName: string;
879
1147
  path: string;
880
1148
  options: ApiDecoratorOptions;
881
- }
1149
+ },
882
1150
  ) => void;
883
1151
  cache?: {
884
1152
  get: (key: string) => Promise<unknown | null>;
@@ -887,7 +1155,7 @@ export type SonamuFastifyConfig = {
887
1155
  path: string,
888
1156
  reqBody: {
889
1157
  [key: string]: unknown;
890
- }
1158
+ },
891
1159
  ) =>
892
1160
  | {
893
1161
  cache: false;