sonamu 0.6.0 → 0.7.1

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 +227 -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 +386 -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 +55 -30
  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 +261 -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 +459 -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
@@ -0,0 +1,272 @@
1
+ // 일단 참고자료로 남겨두었으나, PG 전환 완료 이후 삭제 예정
2
+
3
+
4
+
5
+ import assert from "assert";
6
+ import type { Knex } from "knex";
7
+ import { group } from "radashi";
8
+ import {
9
+ isKnexError,
10
+ type MigrationColumn,
11
+ type MigrationForeign,
12
+ type MigrationIndex,
13
+ type MigrationSet,
14
+ type RelationOn,
15
+ } from "../types/types";
16
+
17
+ type MyColumn = {
18
+ Field: string;
19
+ Type: string;
20
+ Null: string;
21
+ Key: string;
22
+ Default: string | null;
23
+ Extra: string;
24
+ };
25
+ type MyIndex = {
26
+ Table: string;
27
+ Non_unique: number;
28
+ Key_name: string;
29
+ Seq_in_index: number;
30
+ Column_name: string;
31
+ Collation: string | null;
32
+ Cardinality: number | null;
33
+ Sub_part: number | null;
34
+ Packed: string | null;
35
+ Null: string;
36
+ Index_type: string;
37
+ Comment: string;
38
+ Index_comment: string;
39
+ Visible: string;
40
+ Expression: string | null;
41
+ };
42
+ type MyForeign = {
43
+ keyName: string;
44
+ from: string;
45
+ referencesTable: string;
46
+ referencesField: string;
47
+ onDelete: string;
48
+ onUpdate: string;
49
+ };
50
+
51
+ class MySQLSchemaReaderClass {
52
+ /**
53
+ * DB에서 테이블 정보를 읽어서 MigrationSet을 만들어옵니다.
54
+ * @param compareDB Knex 인스턴스
55
+ * @param table 테이블 이름
56
+ * @returns MigrationSet 객체
57
+ */
58
+ async getMigrationSetFromDB(compareDB: Knex, table: string): Promise<MigrationSet | null> {
59
+ let dbColumns: MyColumn[], dbIndexes: MyIndex[], dbForeigns: MyForeign[];
60
+ try {
61
+ [dbColumns, dbIndexes, dbForeigns] = await this.readTable(compareDB, table);
62
+ } catch (e: unknown) {
63
+ if (isKnexError(e) && e.code === "ER_NO_SUCH_TABLE") {
64
+ return null;
65
+ }
66
+ console.error(e);
67
+ return null;
68
+ }
69
+
70
+ const columns: MigrationColumn[] = dbColumns.map((dbColumn) => {
71
+ const dbColType = this.resolveDBColType(dbColumn.Type, dbColumn.Field);
72
+ return {
73
+ name: dbColumn.Field,
74
+ nullable: dbColumn.Null !== "NO",
75
+ ...dbColType,
76
+ ...(() => {
77
+ if (dbColumn.Default !== null) {
78
+ return {
79
+ defaultTo: dbColumn.Default,
80
+ };
81
+ }
82
+ return {};
83
+ })(),
84
+ };
85
+ });
86
+
87
+ const dbIndexesGroup = group(
88
+ dbIndexes.filter(
89
+ (dbIndex) =>
90
+ dbIndex.Key_name !== "PRIMARY" &&
91
+ !dbForeigns.find((dbForeign) => dbForeign.keyName === dbIndex.Key_name),
92
+ ),
93
+ (dbIndex) => dbIndex.Key_name,
94
+ );
95
+
96
+ const parseIndexType = (index: MyIndex) => {
97
+ if (index.Index_type === "FULLTEXT") {
98
+ return "fulltext";
99
+ }
100
+ return index.Non_unique === 1 ? "index" : "unique";
101
+ };
102
+
103
+ // indexes 처리
104
+ const indexes: MigrationIndex[] = Object.keys(dbIndexesGroup).map((keyName) => {
105
+ const currentIndexes = dbIndexesGroup[keyName];
106
+ assert(currentIndexes);
107
+ return {
108
+ type: parseIndexType(currentIndexes[0]),
109
+ columns: currentIndexes.map((currentIndex) => currentIndex.Column_name),
110
+ };
111
+ });
112
+ // console.log(table);
113
+ // console.table(dbIndexes);
114
+ // console.table(dbForeigns);
115
+
116
+ // foreigns 처리
117
+ const foreigns: MigrationForeign[] = dbForeigns.map((dbForeign) => {
118
+ return {
119
+ columns: [dbForeign.from],
120
+ to: `${dbForeign.referencesTable}.${dbForeign.referencesField}`,
121
+ onUpdate: dbForeign.onUpdate as RelationOn,
122
+ onDelete: dbForeign.onDelete as RelationOn,
123
+ };
124
+ });
125
+
126
+ return {
127
+ table,
128
+ columns,
129
+ indexes,
130
+ foreigns,
131
+ };
132
+ }
133
+
134
+ /*
135
+ * 기존 테이블 읽어서 cols, indexes 반환
136
+ */
137
+ async readTable(
138
+ compareDB: Knex,
139
+ tableName: string,
140
+ ): Promise<[MyColumn[], MyIndex[], MyForeign[]]> {
141
+ const [_cols] = (await compareDB.raw(`SHOW FIELDS FROM ${tableName}`)) as [MyColumn[]];
142
+ const cols = _cols.map((col) => ({
143
+ ...col,
144
+ // Default 값은 숫자나 MySQL Expression이 아닌 경우 ""로 감싸줌
145
+ ...(col.Default !== null && {
146
+ Default:
147
+ col.Default.replace(/[0-9]+/g, "").length > 0 && col.Extra !== "DEFAULT_GENERATED"
148
+ ? `"${col.Default}"`
149
+ : col.Default,
150
+ }),
151
+ }));
152
+
153
+ const [indexes] = await compareDB.raw(`SHOW INDEX FROM ${tableName}`);
154
+ const [[row]] = await compareDB.raw(`SHOW CREATE TABLE ${tableName}`);
155
+ const ddl = row["Create Table"];
156
+ const matched = ddl.match(/CONSTRAINT .+/g);
157
+ const foreignKeys = (matched ?? []).map((line: string) => {
158
+ // 해당 라인을 정규식으로 파싱
159
+ const matched = line.match(
160
+ /CONSTRAINT `(.+)` FOREIGN KEY \(`(.+)`\) REFERENCES `(.+)` \(`(.+)`\)( ON [A-Z ]+)*/,
161
+ );
162
+ if (!matched) {
163
+ throw new Error(`인식할 수 없는 FOREIGN KEY CONSTRAINT ${line}`);
164
+ }
165
+ const [, keyName, from, referencesTable, referencesField, onClause] = matched;
166
+ // console.debug({ tableName, line, onClause });
167
+
168
+ const [onUpdateFull, _onUpdate] = (onClause ?? "").match(/ON UPDATE ([A-Z ]+)$/) ?? [];
169
+ const onUpdate = _onUpdate ?? "NO ACTION";
170
+
171
+ const onDelete =
172
+ (onClause ?? "")
173
+ .replace(onUpdateFull ?? "", "")
174
+ .match(/ON DELETE ([A-Z ]+)/)?.[1]
175
+ ?.trim() ?? "NO ACTION";
176
+
177
+ return {
178
+ keyName,
179
+ from,
180
+ referencesTable,
181
+ referencesField,
182
+ onDelete,
183
+ onUpdate,
184
+ };
185
+ });
186
+ return [cols, indexes, foreignKeys];
187
+ }
188
+
189
+ /**
190
+ * DB의 컬럼 타입을 분석하여 MigrationColumn 객체로 변환합니다.
191
+ * @param colType DB 컬럼 타입
192
+ * @param colField DB 컬럼 이름
193
+ * @returns MigrationColumn
194
+ */
195
+ resolveDBColType(
196
+ colType: string,
197
+ colField: string,
198
+ ): Pick<MigrationColumn, "type" | "unsigned" | "length" | "precision" | "scale"> {
199
+ let [rawType, unsigned] = colType.split(" ");
200
+ const matched = rawType.match(/\(([0-9]+)\)/);
201
+ let length: number | undefined;
202
+ if (matched?.[1]) {
203
+ rawType = rawType.replace(/\(([0-9]+)\)/, "");
204
+ length = parseInt(matched[1]);
205
+ }
206
+
207
+ if (rawType === "char" && colField === "uuid") {
208
+ return {
209
+ type: "uuid",
210
+ };
211
+ }
212
+
213
+ switch (rawType) {
214
+ case "int":
215
+ return {
216
+ type: "integer",
217
+ unsigned: unsigned === "unsigned",
218
+ };
219
+ case "varchar":
220
+ // case "char":
221
+ return {
222
+ type: "string",
223
+ ...(length !== undefined && {
224
+ length,
225
+ }),
226
+ };
227
+ case "text":
228
+ case "mediumtext":
229
+ case "longtext":
230
+ case "timestamp":
231
+ case "json":
232
+ case "date":
233
+ case "time":
234
+ return {
235
+ type: rawType,
236
+ };
237
+ case "datetime":
238
+ return {
239
+ type: "datetime",
240
+ };
241
+ case "tinyint":
242
+ return {
243
+ type: "boolean",
244
+ };
245
+ default:
246
+ // decimal 처리
247
+ if (rawType.startsWith("decimal")) {
248
+ const [, precision, scale] = rawType.match(/decimal\(([0-9]+),([0-9]+)\)/) ?? [];
249
+ return {
250
+ type: "decimal",
251
+ precision: parseInt(precision),
252
+ scale: parseInt(scale),
253
+ ...(unsigned === "unsigned" && {
254
+ unsigned: true,
255
+ }),
256
+ };
257
+ } else if (rawType.startsWith("float")) {
258
+ const [, precision, scale] = rawType.match(/float\(([0-9]+),([0-9]+)\)/) ?? [];
259
+ return {
260
+ type: "float",
261
+ precision: parseInt(precision),
262
+ scale: parseInt(scale),
263
+ ...(unsigned === "unsigned" && {
264
+ unsigned: true,
265
+ }),
266
+ };
267
+ }
268
+ throw new Error(`resolve 불가능한 DB컬럼 타입 ${colType} ${rawType}`);
269
+ }
270
+ }
271
+ }
272
+ export const MySQLSchemaReader = new MySQLSchemaReaderClass();
@@ -0,0 +1,310 @@
1
+ import assert from "assert";
2
+ import type { Knex } from "knex";
3
+ import { group } from "radashi";
4
+ import type {
5
+ MigrationColumn,
6
+ MigrationForeign,
7
+ MigrationIndex,
8
+ MigrationSet,
9
+ RelationOn,
10
+ } from "../types/types";
11
+
12
+ export type PgColumn = {
13
+ column_name: string;
14
+ data_type: string;
15
+ udt_name: string;
16
+ character_maximum_length: number | null;
17
+ numeric_precision: number | null;
18
+ numeric_scale: number | null;
19
+ is_nullable: string;
20
+ column_default: string | null;
21
+ };
22
+
23
+ type PgIndex = {
24
+ index_name: string;
25
+ column_name: string;
26
+ is_unique: boolean;
27
+ is_primary: boolean;
28
+ index_type: string;
29
+ };
30
+
31
+ type PgForeign = {
32
+ constraint_name: string;
33
+ column_name: string;
34
+ foreign_table_name: string;
35
+ foreign_column_name: string;
36
+ update_rule: string;
37
+ delete_rule: string;
38
+ };
39
+
40
+ class PostgreSQLSchemaReaderClass {
41
+ /**
42
+ * DB에서 테이블 정보를 읽어서 MigrationSet을 만들어옵니다.
43
+ * @param compareDB Knex 인스턴스
44
+ * @param table 테이블 이름
45
+ * @returns MigrationSet 객체
46
+ */
47
+ async getMigrationSetFromDB(compareDB: Knex, table: string): Promise<MigrationSet | null> {
48
+ let dbColumns: PgColumn[], dbIndexes: PgIndex[], dbForeigns: PgForeign[];
49
+ try {
50
+ [dbColumns, dbIndexes, dbForeigns] = await this.readTable(compareDB, table);
51
+ } catch (e: unknown) {
52
+ if (e instanceof Error && e.message.includes("Table not found")) {
53
+ return null;
54
+ }
55
+ console.error(e);
56
+ return null;
57
+ }
58
+
59
+ const columns: MigrationColumn[] = dbColumns.map((dbColumn) => {
60
+ const dbColType = this.resolveDBColType(dbColumn);
61
+ return {
62
+ name: dbColumn.column_name,
63
+ nullable: dbColumn.is_nullable === "YES",
64
+ ...dbColType,
65
+ ...(() => {
66
+ if (dbColumn.column_default !== null) {
67
+ // PostgreSQL default 값 정리 (nextval, CURRENT_TIMESTAMP 등)
68
+ let defaultValue = dbColumn.column_default;
69
+
70
+ // nextval 제거 (SERIAL 타입)
71
+ if (defaultValue.startsWith("nextval(")) {
72
+ return {};
73
+ }
74
+
75
+ // 타입 캐스팅 제거 (예: '1'::integer → 1)
76
+ defaultValue = defaultValue.replace(/::[\w\s]+$/g, "");
77
+
78
+ // 따옴표 제거가 필요한 경우
79
+ if (defaultValue.startsWith("'") && defaultValue.endsWith("'")) {
80
+ defaultValue = defaultValue.slice(1, -1);
81
+ }
82
+
83
+ return {
84
+ defaultTo: defaultValue,
85
+ };
86
+ }
87
+ return {};
88
+ })(),
89
+ };
90
+ });
91
+
92
+ // PRIMARY KEY와 foreign key용 인덱스 제외
93
+ const dbIndexesGroup = group(
94
+ dbIndexes.filter(
95
+ (dbIndex) =>
96
+ !dbIndex.is_primary &&
97
+ !dbForeigns.find((dbForeign) => dbIndex.index_name.includes(dbForeign.constraint_name)),
98
+ ),
99
+ (dbIndex) => dbIndex.index_name,
100
+ );
101
+
102
+ // indexes 처리
103
+ const indexes: MigrationIndex[] = Object.keys(dbIndexesGroup).map((indexName) => {
104
+ const currentIndexes = dbIndexesGroup[indexName];
105
+ assert(currentIndexes);
106
+
107
+ const firstIndex = currentIndexes[0];
108
+ const type = firstIndex.is_unique ? "unique" : "index";
109
+
110
+ return {
111
+ type,
112
+ columns: currentIndexes.map((idx) => idx.column_name),
113
+ };
114
+ });
115
+
116
+ // foreigns 처리
117
+ const foreigns: MigrationForeign[] = dbForeigns.map((dbForeign) => {
118
+ return {
119
+ columns: [dbForeign.column_name],
120
+ to: `${dbForeign.foreign_table_name}.${dbForeign.foreign_column_name}`,
121
+ onUpdate: this.mapConstraintAction(dbForeign.update_rule),
122
+ onDelete: this.mapConstraintAction(dbForeign.delete_rule),
123
+ };
124
+ });
125
+
126
+ return {
127
+ table,
128
+ columns,
129
+ indexes,
130
+ foreigns,
131
+ };
132
+ }
133
+
134
+ /**
135
+ * PostgreSQL의 constraint action을 Knex 형식으로 변환
136
+ */
137
+ private mapConstraintAction(action: string): RelationOn {
138
+ const actionMap: Record<string, RelationOn> = {
139
+ "NO ACTION": "NO ACTION",
140
+ RESTRICT: "RESTRICT",
141
+ CASCADE: "CASCADE",
142
+ "SET NULL": "SET NULL",
143
+ "SET DEFAULT": "SET DEFAULT",
144
+ };
145
+ return actionMap[action] ?? "NO ACTION";
146
+ }
147
+
148
+ /**
149
+ * 기존 테이블 읽어서 cols, indexes, foreigns 반환
150
+ */
151
+ async readTable(
152
+ compareDB: Knex,
153
+ tableName: string,
154
+ ): Promise<[PgColumn[], PgIndex[], PgForeign[]]> {
155
+ // Columns 조회
156
+ const columns = await compareDB
157
+ .select(
158
+ "column_name",
159
+ "data_type",
160
+ "udt_name",
161
+ "character_maximum_length",
162
+ "numeric_precision",
163
+ "numeric_scale",
164
+ "is_nullable",
165
+ "column_default",
166
+ )
167
+ .from("information_schema.columns")
168
+ .where({ table_name: tableName })
169
+ .orderBy("ordinal_position");
170
+ if (columns.length === 0) {
171
+ throw new Error(`Table not found: ${tableName}`);
172
+ }
173
+
174
+ // Indexes 조회
175
+ const indexesQuery = `
176
+ SELECT
177
+ i.relname as index_name,
178
+ a.attname as column_name,
179
+ ix.indisunique as is_unique,
180
+ ix.indisprimary as is_primary,
181
+ am.amname as index_type
182
+ FROM pg_class t
183
+ JOIN pg_index ix ON t.oid = ix.indrelid
184
+ JOIN pg_class i ON i.oid = ix.indexrelid
185
+ JOIN pg_attribute a ON a.attrelid = t.oid
186
+ JOIN pg_am am ON i.relam = am.oid
187
+ WHERE t.relname = ?
188
+ AND a.attnum = ANY(ix.indkey)
189
+ ORDER BY i.relname, array_position(ix.indkey, a.attnum)
190
+ `;
191
+ const indexes = (await compareDB.raw(indexesQuery, [tableName])).rows;
192
+
193
+ // Foreign Keys 조회
194
+ const foreignsQuery = `
195
+ SELECT
196
+ tc.constraint_name,
197
+ kcu.column_name,
198
+ ccu.table_name AS foreign_table_name,
199
+ ccu.column_name AS foreign_column_name,
200
+ rc.update_rule,
201
+ rc.delete_rule
202
+ FROM information_schema.table_constraints AS tc
203
+ JOIN information_schema.key_column_usage AS kcu
204
+ ON tc.constraint_name = kcu.constraint_name
205
+ AND tc.table_schema = kcu.table_schema
206
+ JOIN information_schema.constraint_column_usage AS ccu
207
+ ON ccu.constraint_name = tc.constraint_name
208
+ AND ccu.table_schema = tc.table_schema
209
+ JOIN information_schema.referential_constraints AS rc
210
+ ON rc.constraint_name = tc.constraint_name
211
+ AND rc.constraint_schema = tc.table_schema
212
+ WHERE tc.constraint_type = 'FOREIGN KEY'
213
+ AND tc.table_name = ?
214
+ `;
215
+ const foreigns = (await compareDB.raw(foreignsQuery, [tableName])).rows;
216
+
217
+ return [columns, indexes, foreigns];
218
+ }
219
+
220
+ /**
221
+ * PostgreSQL 컬럼 타입을 분석하여 MigrationColumn 객체로 변환합니다.
222
+ */
223
+ resolveDBColType(
224
+ dbColumn: PgColumn,
225
+ ): Pick<MigrationColumn, "type" | "length" | "precision" | "scale" | "numberType"> {
226
+ const {
227
+ udt_name: _udt_name,
228
+ character_maximum_length,
229
+ numeric_precision,
230
+ numeric_scale,
231
+ } = dbColumn;
232
+
233
+ const { udt_name, singleOrArray } = (() => {
234
+ if (_udt_name.startsWith("_")) {
235
+ return {
236
+ udt_name: _udt_name.substring(1),
237
+ singleOrArray: "[]" as const,
238
+ };
239
+ }
240
+ return {
241
+ udt_name: _udt_name,
242
+ singleOrArray: "" as const,
243
+ };
244
+ })();
245
+
246
+ // UUID
247
+ if (udt_name === "uuid") {
248
+ return { type: `uuid${singleOrArray}` };
249
+ }
250
+
251
+ // Integer types
252
+ if (udt_name === "int4") {
253
+ return { type: `integer${singleOrArray}` };
254
+ }
255
+ if (udt_name === "int8") {
256
+ return { type: `bigInteger${singleOrArray}` };
257
+ }
258
+
259
+ // String types
260
+ if (udt_name === "varchar") {
261
+ return {
262
+ type: `string${singleOrArray}`,
263
+ ...(character_maximum_length && {
264
+ length: character_maximum_length,
265
+ }),
266
+ };
267
+ }
268
+ if (udt_name === "text") {
269
+ return { type: `string${singleOrArray}` }; // StringProp without length
270
+ }
271
+
272
+ // NumberOrNumeric types
273
+ if (udt_name === "numeric") {
274
+ return {
275
+ type: `numberOrNumeric${singleOrArray}`,
276
+ numberType: "numeric",
277
+ ...(numeric_precision !== null &&
278
+ numeric_scale !== null && {
279
+ precision: numeric_precision,
280
+ scale: numeric_scale,
281
+ }),
282
+ };
283
+ }
284
+ if (udt_name === "float4") {
285
+ return { type: `numberOrNumeric${singleOrArray}`, numberType: "real" };
286
+ }
287
+ if (udt_name === "float8") {
288
+ return { type: `numberOrNumeric${singleOrArray}`, numberType: "double precision" };
289
+ }
290
+
291
+ // Boolean
292
+ if (udt_name === "bool") {
293
+ return { type: `boolean${singleOrArray}` };
294
+ }
295
+
296
+ // Timestampz types
297
+ if (udt_name === "timestamptz") {
298
+ return { type: `date${singleOrArray}` }; // DateProp → timestamptz
299
+ }
300
+
301
+ // JSON
302
+ if (udt_name === "json" || udt_name === "jsonb") {
303
+ return { type: "json" };
304
+ }
305
+
306
+ throw new Error(`resolve 불가능한 PostgreSQL 컬럼 타입: ${udt_name}`);
307
+ }
308
+ }
309
+
310
+ export const PostgreSQLSchemaReader = new PostgreSQLSchemaReaderClass();
@@ -1,54 +1,21 @@
1
- import { SonamuDBConfig } from "../database/db";
2
- import { GenMigrationCode } from "../types/types";
1
+ import type { SonamuDBConfig } from "../database/db";
2
+ import type { GenMigrationCode } from "../types/types";
3
3
 
4
4
  export type MigrationCode = {
5
5
  name: string;
6
6
  path: string;
7
7
  };
8
- export type ConnString =
9
- `${"mysql2"}://${string}@${string}:${number}/${string}`; // mysql2://account@host:port/database
8
+ export type ConnString = `${"pg"}://${string}@${string}:${number}/${string}`; // pg://account@host:port/database
10
9
  export type MigrationStatus = {
11
10
  codes: MigrationCode[];
12
11
  conns: {
13
12
  name: string;
14
13
  connKey: keyof SonamuDBConfig;
15
14
  connString: ConnString;
16
- currentVersion: string;
17
- status: string | number;
15
+ currentVersion: string | "error";
16
+ status: number | "error";
18
17
  pending: string[];
19
18
  }[];
20
19
  preparedCodes: GenMigrationCode[];
21
- };
22
- export type DBColumn = {
23
- Field: string;
24
- Type: string;
25
- Null: string;
26
- Key: string;
27
- Default: string | null;
28
- Extra: string;
29
- };
30
- export type DBIndex = {
31
- Table: string;
32
- Non_unique: number;
33
- Key_name: string;
34
- Seq_in_index: number;
35
- Column_name: string;
36
- Collation: string | null;
37
- Cardinality: number | null;
38
- Sub_part: number | null;
39
- Packed: string | null;
40
- Null: string;
41
- Index_type: string;
42
- Comment: string;
43
- Index_comment: string;
44
- Visible: string;
45
- Expression: string | null;
46
- };
47
- export type DBForeign = {
48
- keyName: string;
49
- from: string;
50
- referencesTable: string;
51
- referencesField: string;
52
- onDelete: string;
53
- onUpdate: string;
20
+ error?: string;
54
21
  };
@@ -0,0 +1,51 @@
1
+ // biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함
2
+
3
+ /**
4
+ * Sonamu extension과 공유하는 Naite 메시징 관련 타입 정의들입니다.
5
+ * 이 파일은 cartanova-ai/sonamu와 cartanova-ai/vscode-sonamu에서 공통으로 사용됩니다.
6
+ */
7
+ export namespace NaiteMessagingTypes {
8
+ export type NaiteRunStartMessage = {
9
+ type: "run/start";
10
+ startedAt: string;
11
+ };
12
+
13
+ export type NaiteTestResultMessage = {
14
+ type: "test/result";
15
+ receivedAt: string;
16
+ } & TestResult;
17
+
18
+ export type NaiteRunEndMessage = {
19
+ type: "run/end";
20
+ endedAt: string;
21
+ };
22
+
23
+ export type NaiteMessage = NaiteRunStartMessage | NaiteTestResultMessage | NaiteRunEndMessage;
24
+
25
+ export type NaiteTrace = {
26
+ key: string;
27
+ value: any;
28
+ filePath: string;
29
+ lineNumber: number;
30
+ at: string;
31
+ };
32
+
33
+ export type TestError = {
34
+ message: string;
35
+ stack?: string;
36
+ };
37
+
38
+ export type TestResult = {
39
+ suiteName: string;
40
+ suiteFilePath?: string;
41
+ testName: string;
42
+ testFilePath: string;
43
+ testLine: number;
44
+ status: string;
45
+ duration: number;
46
+ error?: TestError;
47
+ traces: NaiteTrace[];
48
+ receivedAt: string;
49
+ };
50
+ }
51
+