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
@@ -0,0 +1,128 @@
1
+ /**
2
+ * NaiteReporter
3
+ *
4
+ * 테스트 결과와 Trace 정보를 Unix Socket으로 VS Code extension에 전달합니다.
5
+ * extension이 ~/.sonamu/naite.sock에 소켓 서버를 열어둡니다.
6
+ *
7
+ * fs mock 충돌을 피하기 위해 net 모듈만 사용합니다.
8
+ */
9
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */
10
+
11
+ import { connect, type Socket } from "net";
12
+ import { homedir } from "os";
13
+ import { join } from "path";
14
+ import type { NaiteMessagingTypes } from "./messaging-types";
15
+
16
+ // 소켓 경로
17
+ const SOCKET_PATH =
18
+ process.platform === "win32" ? "\\\\.\\pipe\\naite" : join(homedir(), ".sonamu", "naite.sock");
19
+
20
+ class NaiteReporterClass {
21
+ private socket: Socket | null = null;
22
+ private connected = false;
23
+ private buffer: string[] = [];
24
+
25
+ /**
26
+ * 소켓 연결 시도
27
+ */
28
+ private ensureConnection(): void {
29
+ if (this.connected || this.socket) return;
30
+
31
+ try {
32
+ this.socket = connect(SOCKET_PATH);
33
+
34
+ this.socket.on("connect", () => {
35
+ this.connected = true;
36
+ // 버퍼에 쌓인 메시지 전송
37
+ for (const msg of this.buffer) {
38
+ this.socket?.write(msg);
39
+ }
40
+ this.buffer = [];
41
+ });
42
+
43
+ this.socket.on("error", () => {
44
+ // 연결 실패 무시 (extension이 꺼져있을 수 있음)
45
+ this.connected = false;
46
+ this.socket = null;
47
+ });
48
+
49
+ this.socket.on("close", () => {
50
+ this.connected = false;
51
+ this.socket = null;
52
+ });
53
+ } catch {
54
+ // 연결 실패 무시
55
+ }
56
+ }
57
+
58
+ /**
59
+ * 메시지 전송 (줄바꿈으로 구분)
60
+ */
61
+ private send(data: NaiteMessagingTypes.NaiteMessage): void {
62
+ const msg = `${JSON.stringify(data)}\n`;
63
+
64
+ this.ensureConnection();
65
+
66
+ if (this.connected && this.socket) {
67
+ this.socket.write(msg);
68
+ } else {
69
+ // 연결 대기 중이면 버퍼에 저장
70
+ this.buffer.push(msg);
71
+ }
72
+ }
73
+
74
+ /**
75
+ * beforeAll에서 호출합니다.
76
+ * 테스트 run 시작을 알립니다 (데이터 클리어 신호).
77
+ */
78
+ startTestRun(): void {
79
+ if (process.env.CI) {
80
+ return;
81
+ }
82
+
83
+ this.send({
84
+ type: "run/start",
85
+ startedAt: new Date().toISOString(),
86
+ });
87
+ }
88
+
89
+ /**
90
+ * afterEach에서 호출합니다.
91
+ * 테스트 케이스 결과를 traces와 함께 전송합니다.
92
+ */
93
+ reportTestResult(result: Omit<NaiteMessagingTypes.TestResult, "receivedAt">): void {
94
+ if (process.env.CI) {
95
+ return;
96
+ }
97
+
98
+ this.send({
99
+ type: "test/result",
100
+ receivedAt: new Date().toISOString(),
101
+ ...result,
102
+ });
103
+ }
104
+
105
+ /**
106
+ * afterAll에서 호출합니다.
107
+ * 테스트 run 종료를 알립니다.
108
+ */
109
+ endTestRun(): void {
110
+ if (process.env.CI) {
111
+ return;
112
+ }
113
+
114
+ this.send({
115
+ type: "run/end",
116
+ endedAt: new Date().toISOString(),
117
+ });
118
+
119
+ // 연결 종료
120
+ if (this.socket) {
121
+ this.socket.end();
122
+ this.socket = null;
123
+ this.connected = false;
124
+ }
125
+ }
126
+ }
127
+
128
+ export const NaiteReporter = new NaiteReporterClass();
@@ -1,70 +1,415 @@
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Naite는 expect와 호응하도록 any를 허용함 */
2
+
3
+ import { get } from "radashi";
1
4
  import { Sonamu } from "../api/sonamu";
5
+ import type { ComparisonOperator } from "../database/puri.types";
6
+ import { isSerializable } from "../utils/object-utils";
7
+
8
+ // StackFrame 타입
9
+ interface StackFrame {
10
+ functionName: string | null;
11
+ filePath: string; // "/Users/.../syncer.ts" 또는 "node:internal/..."
12
+ lineNumber: number; // TS 파일 기준 라인 번호
13
+ }
14
+
15
+ // NaiteTrace 타입
16
+ interface NaiteTrace {
17
+ key: string;
18
+ data: any;
19
+ stack: StackFrame[]; // 콜스택 정보
20
+ at: Date;
21
+ }
22
+
23
+ // Naite.t가 저장되는 타입 (항상 배열로 통일)
24
+ export type NaiteStore = Map<string, NaiteTrace[]>;
25
+
26
+ /**
27
+ * 콜스택을 파싱하여 StackFrame 배열로 반환
28
+ * - extractCallStack 자신과 Naite.t는 제외
29
+ * - runWithContext/runWithMockContext 발견 시 거기서 종료
30
+ * - node: 내부 경로는 포함하되, lineNumber는 path에 : 포함 시 붙이지 않음
31
+ */
32
+ function extractCallStack(): StackFrame[] {
33
+ const stack = new Error().stack;
34
+ if (!stack) return [];
35
+
36
+ const lines = stack.split("\n");
37
+
38
+ // 콜스택 구조:
39
+ // [0]: "Error"
40
+ // [1]: "at extractCallStack"
41
+ // [2]: "at Naite.t"
42
+ // [3]: 실제 호출 위치부터 시작
43
+ const frames = lines
44
+ .slice(3)
45
+ .map(parseStackFrame)
46
+ .filter((frame): frame is StackFrame => frame !== null);
47
+
48
+ // runWithContext 계열 함수 발견 시 거기서 자르기
49
+ const contextIndex = frames.findIndex(
50
+ (f) =>
51
+ f.functionName?.includes("runWithContext") || f.functionName?.includes("runWithMockContext"),
52
+ );
53
+
54
+ return contextIndex >= 0 ? frames.slice(0, contextIndex + 1) : frames;
55
+ }
56
+
57
+ /**
58
+ * 콜스택 한 줄을 파싱
59
+ * 형식1: "at FunctionName (filePath:lineNumber:columnNumber)"
60
+ * 형식2: "at filePath:lineNumber:columnNumber" (익명 함수/모듈 레벨)
61
+ */
62
+ function parseStackFrame(line: string): StackFrame | null {
63
+ // 패턴1: "at FunctionName (filePath:lineNumber:columnNumber)"
64
+ const matchWithFunc = line.match(/at\s+(.+?)\s+\((.+?):(\d+):\d+\)/);
65
+ if (matchWithFunc) {
66
+ const functionName = matchWithFunc[1];
67
+ const filePath = matchWithFunc[2];
68
+ const lineNumberStr = matchWithFunc[3];
69
+
70
+ // filePath에 이미 :가 포함되어 있으면 (예: "node:internal/...")
71
+ if (filePath.includes(":")) {
72
+ return { functionName, filePath, lineNumber: 0 };
73
+ }
74
+
75
+ return {
76
+ functionName,
77
+ filePath,
78
+ lineNumber: Number.parseInt(lineNumberStr, 10),
79
+ };
80
+ }
81
+
82
+ // 패턴2: "at filePath:lineNumber:columnNumber" (함수명 없음)
83
+ const matchNoFunc = line.match(/at\s+(.+?):(\d+):\d+$/);
84
+ if (matchNoFunc) {
85
+ const filePath = matchNoFunc[1];
86
+ const lineNumberStr = matchNoFunc[2];
87
+
88
+ return {
89
+ functionName: null,
90
+ filePath,
91
+ lineNumber: Number.parseInt(lineNumberStr, 10),
92
+ };
93
+ }
94
+
95
+ return null;
96
+ }
97
+
98
+ /**
99
+ * wildcard 패턴 매칭
100
+ * 예시:
101
+ * - "syncer:*" → "syncer:a", "syncer:a:b" 모두 매칭
102
+ * - "syncer:*:user" → "syncer:renderTemplate:user" 매칭
103
+ * - "syncer:renderTemplate:*" → "syncer:renderTemplate:service" 매칭
104
+ */
105
+ function matchesPattern(key: string, pattern: string): boolean {
106
+ const keyParts = key.split(":");
107
+ const patternParts = pattern.split(":");
108
+
109
+ // 마지막이 * → prefix 매칭 (길이 무관)
110
+ // 예: "syncer:*"는 "syncer:a", "syncer:a:b" 모두 매칭
111
+ if (patternParts[patternParts.length - 1] === "*") {
112
+ const prefixParts = patternParts.slice(0, -1);
113
+ // prefix가 모두 일치하는지 확인
114
+ return prefixParts.every((part, i) => part === keyParts[i]);
115
+ }
116
+
117
+ // 길이가 같아야 함
118
+ if (patternParts.length !== keyParts.length) {
119
+ return false;
120
+ }
121
+
122
+ // 각 파트가 * 또는 정확히 일치
123
+ return patternParts.every((part, i) => part === "*" || part === keyParts[i]);
124
+ }
125
+
126
+ /**
127
+ * NaiteQuery 클래스
128
+ * 체이닝을 통한 trace 필터링 및 조회
129
+ */
130
+ export class NaiteQuery {
131
+ constructor(private traces: NaiteTrace[]) {}
132
+
133
+ /**
134
+ * 파일명으로 필터링
135
+ * @param fileName 파일명 (예: "syncer.test.ts")
136
+ */
137
+ fromFile(fileName: string): NaiteQuery {
138
+ const filtered = this.traces.filter((t) =>
139
+ t.stack.some((frame) => frame.filePath.endsWith(`/${fileName}`)),
140
+ );
141
+ return new NaiteQuery(filtered);
142
+ }
143
+
144
+ /**
145
+ * 함수명으로 필터링
146
+ * @param funcName 함수명 (includes 체크)
147
+ * @param options.from 'direct' = 직접 호출만, 'indirect' = 간접 호출만, 'both' = 모두
148
+ */
149
+ fromFunction(
150
+ funcName: string,
151
+ options: { from: "direct" | "indirect" | "both" } = { from: "both" },
152
+ ): NaiteQuery {
153
+ const filtered = this.traces.filter((t) => {
154
+ if (options.from === "direct") {
155
+ // stack[0]만 확인 (직접 호출)
156
+ return t.stack[0]?.functionName?.includes(funcName);
157
+ }
158
+ if (options.from === "indirect") {
159
+ // stack[1+]에서 확인 (간접 호출)
160
+ return t.stack.slice(1).some((f) => f.functionName?.includes(funcName));
161
+ }
162
+ // 전체 스택에서 확인
163
+ return t.stack.some((f) => f.functionName?.includes(funcName));
164
+ });
165
+ return new NaiteQuery(filtered);
166
+ }
167
+
168
+ /**
169
+ * 데이터 경로 기반 필터링
170
+ * @param path radash get 경로 (예: "data.userId")
171
+ * @param operator 비교 연산자
172
+ * @param value 비교값
173
+ */
174
+ where(path: string, operator: ComparisonOperator | "includes", value: any): NaiteQuery {
175
+ const filtered = this.traces.filter((trace) => {
176
+ const actual = get(trace, path) as any;
177
+
178
+ switch (operator) {
179
+ case ">":
180
+ return actual > value;
181
+ case "<":
182
+ return actual < value;
183
+ case ">=":
184
+ return actual >= value;
185
+ case "<=":
186
+ return actual <= value;
187
+ case "=":
188
+ return actual === value;
189
+ case "!=":
190
+ return actual !== value;
191
+ case "includes":
192
+ return typeof actual === "string" && actual.includes(value);
193
+ default:
194
+ return false;
195
+ }
196
+ });
197
+ return new NaiteQuery(filtered);
198
+ }
199
+
200
+ /**
201
+ * 전체 데이터 배열 반환
202
+ */
203
+ result(): any[] {
204
+ return this.traces.map((t) => t.data);
205
+ }
206
+
207
+ /**
208
+ * 첫 번째 데이터 반환
209
+ */
210
+ first(): any | undefined {
211
+ return this.traces[0]?.data;
212
+ }
2
213
 
3
- export class Naite {
214
+ /**
215
+ * 마지막 데이터 반환
216
+ */
217
+ last(): any | undefined {
218
+ return this.traces[this.traces.length - 1]?.data;
219
+ }
220
+
221
+ /**
222
+ * n번째 데이터 반환
223
+ */
224
+ at(index: number): any | undefined {
225
+ return this.traces[index]?.data;
226
+ }
227
+
228
+ /**
229
+ * 원본 trace 배열 반환 (디버깅/NaiteViewer용)
230
+ */
231
+ getTraces(): NaiteTrace[] {
232
+ return this.traces;
233
+ }
234
+ }
235
+
236
+ // Naite 싱글턴 객체 (추후 logger 연결 등의 상태 관리 필요성 고려)
237
+ export class NaiteClass {
4
238
  // 테스트 로그 기록
5
- static t(name: string, value: any) {
239
+ t(
240
+ name: string,
241
+ value: any /*이렇게 받은 값이 NaiteTrace로 저장되어 있다가 추후에 vitest에게 meta를 통해 넘겨져 프로세스간 통신을 통해 직렬화되어야 하는 점을 고려하였을 때 여기에 Serializable을 써서 제한을 둘 수도 있지만, 사용상의 편의를 생각하여 any로 받습니다.*/,
242
+ ) {
243
+ // 이 t 함수는 테스트 환경에서만 작동해야 합니다.
244
+ // 그리고 테스트 환경 판단에 왜 isTest() 함수를 사용하지 않았냐면요,,
245
+ // 이렇게 하는게 유틸 함수 불러와서 사용하는 것보다 조금이나마 빠를 것 같았기 때문입니다.
246
+ if (process.env.NODE_ENV !== "test") {
247
+ return;
248
+ }
249
+
250
+ try {
251
+ const context = Sonamu.getContext();
252
+ const store = context?.naiteStore;
253
+
254
+ if (!store) {
255
+ return;
256
+ }
257
+
258
+ // 콜스택 수집
259
+ const stack = extractCallStack();
260
+
261
+ const trace: NaiteTrace = {
262
+ key: name,
263
+ data: value,
264
+ stack,
265
+ at: new Date(),
266
+ };
267
+
268
+ // 항상 배열로 관리
269
+ const existing = store.get(name) ?? [];
270
+ store.set(name, [...existing, trace]);
271
+ } catch {
272
+ // Context 없는 상황에서 Naite.t 호출
273
+ }
274
+ }
275
+
276
+ /**
277
+ * key 또는 wildcard 패턴으로 trace 조회
278
+ * 항상 NaiteQuery 반환하여 체이닝 가능
279
+ */
280
+ get(keyPattern: string): NaiteQuery {
6
281
  const context = Sonamu.getContext();
7
282
  const store = context?.naiteStore;
8
283
 
9
284
  if (!store) {
10
- return;
285
+ return new NaiteQuery([]);
11
286
  }
12
- if (store.has(name)) {
13
- // 이미 값이 있는 경우
14
- if (Array.isArray(store.get(name))) {
15
- // 배열에 추가
16
- store.set(name, [...store.get(name), value]);
287
+
288
+ // wildcard 없으면 exact match
289
+ if (!keyPattern.includes("*")) {
290
+ const traces = store.get(keyPattern) ?? [];
291
+ return new NaiteQuery(traces);
292
+ }
293
+
294
+ // wildcard 패턴 매칭
295
+ const allTraces: NaiteTrace[] = [];
296
+ for (const [key, traces] of store.entries()) {
297
+ if (matchesPattern(key, keyPattern)) {
298
+ allTraces.push(...traces);
299
+ }
300
+ }
301
+
302
+ return new NaiteQuery(allTraces);
303
+ }
304
+
305
+ // 전체 리스트 가져오기
306
+ getAll(): { [key: string]: any } {
307
+ const context = Sonamu.getContext();
308
+ if (!context?.naiteStore) {
309
+ return {};
310
+ }
311
+ // NaiteTrace 배열을 data만 추출하여 반환
312
+ const result: { [key: string]: any } = {};
313
+ for (const [key, traces] of context.naiteStore.entries()) {
314
+ if (key.startsWith("mock:")) {
315
+ // Mock 설정은 그대로 반환
316
+ result[key] = traces;
17
317
  } else {
18
- // 배열이 아닌 경우 배열로 변환
19
- store.set(name, [store.get(name), value]);
318
+ // NaiteTrace 배열은 data만 추출
319
+ result[key] = traces.map((t: NaiteTrace) => t.data);
20
320
  }
21
- } else {
22
- // 값이 없는 경우 추가
23
- store.set(name, value);
24
321
  }
322
+ return result;
25
323
  }
26
324
 
27
- // 테스트에서 값 가져오기
28
- static get(name: string): any {
325
+ /**
326
+ * 스토어에 들어있던 트레이스를 고대로 꺼내옵니다.
327
+ * 이때 값들은 모두 직렬화 가능한 상태로 나가게 됩니다.
328
+ * 테스트 정보와 함께 extensions에 보낼 용도로 만들었습니다.
329
+ * @returns
330
+ */
331
+ getAllTraces(): {
332
+ key: string;
333
+ value: any;
334
+ filePath: string;
335
+ lineNumber: number;
336
+ at: string;
337
+ }[] {
29
338
  const context = Sonamu.getContext();
30
- if (!context?.naiteStore || !context.naiteStore.has(name)) {
31
- throw new Error(`Naite.get: \`${name}\` not found`);
339
+ if (!context?.naiteStore) {
340
+ return [];
32
341
  }
33
- return context?.naiteStore?.get(name);
342
+
343
+ const traces = Array.from(context.naiteStore.values()).flat();
344
+
345
+ // 직렬화 불가능한 값이 존재한다면 이를 대문짝만하게 알려줍니다! 그치만 알리기만 하고 그냥 지나갑니다 ㅎㅎ
346
+ // 왜 직렬화가 중요한가? 이(getAllTraces) 호출의 결과는 외부로 나가게 되는데,
347
+ // 이때 주 용도가 vitest의 task.meta 필드를 통해 afterEach에서 Sonamu extension으로 전달하는 것입니다.
348
+ // 여기서 meta 필드에 담긴 내용은 프로세스간 통신(process.send) 또는 스레드간 통신(message port)을 통해 전달되어야 하는데,
349
+ // 이로 인해 "직렬화 가능한 값들만 허용"하는 제약이 생깁니다.
350
+ //
351
+ // 이 제약을 의식하여 Naite.t에 직렬화 가능한 값만 넘기게 할 수도 있었지만, 그렇게 하면 불편해질 것 같아서 하지 않았습니다.
352
+ // 따라서 현재 Naite.t는 모든 값을 받을 수 있게 되어 있습니다.
353
+ // 대신 이렇게(getAllTraces) 그 값들을 빼낼 때 JSON.stringify를 사용하여 강제로 직렬화 가능하게 만들었습니다,,
354
+ for (const trace of traces) {
355
+ const check = isSerializable(trace.data);
356
+ if (!check.valid) {
357
+ console.warn(
358
+ "\n" +
359
+ "╔════════════════════════════════════════════════════════════════╗\n" +
360
+ "║ [Naite] Non-serializable value detected! ║\n" +
361
+ "╠════════════════════════════════════════════════════════════════╣\n" +
362
+ `║ Key: ${trace.key.padEnd(57)}║\n` +
363
+ `║ Reason: ${(check.reason ?? "unknown").slice(0, 54).padEnd(54)}║\n` +
364
+ `║ Location: ${(trace.stack[0]?.filePath ?? "unknown").slice(-51).padEnd(52)}║\n` +
365
+ `║ Line: ${String(trace.stack[0]?.lineNumber ?? 0).padEnd(56)}║\n` +
366
+ "╠════════════════════════════════════════════════════════════════╣\n" +
367
+ "║ Naite.t() accepts any type of value. However, values will ║\n" +
368
+ "║ be serialized to JSON when exported via Naite.getAllTraces(). ║\n" +
369
+ "╚════════════════════════════════════════════════════════════════╝\n",
370
+ );
371
+ }
372
+ }
373
+
374
+ return traces.map((trace) => ({
375
+ key: trace.key,
376
+ value: JSON.parse(JSON.stringify(trace.data ?? "")), // 직렬화 가능한 것만 남기려는 눈물겨운 노력,, 안그러면 task.meta에 들어가서 프로세스간 통신 할 때 문제 생기거든요,,
377
+ filePath: trace.stack[0]?.filePath ?? "",
378
+ lineNumber: trace.stack[0]?.lineNumber ?? 0,
379
+ at: trace.at.toISOString(),
380
+ }));
34
381
  }
35
382
 
36
- // 전체 리스트 가져오기
37
- static getAll(): { [key: string]: any } {
383
+ // 특정 삭제하기
384
+ del(key: string) {
38
385
  const context = Sonamu.getContext();
39
386
  if (!context?.naiteStore) {
40
- return {};
387
+ return;
41
388
  }
42
- return Object.fromEntries(context.naiteStore.entries());
389
+ context.naiteStore.delete(key);
43
390
  }
44
391
 
45
- // expect 래퍼 (CJS-ESM 이슈로 현재 사용불가)
46
- // static expect(name: string) {
47
- // if (!this.vitestExpect) {
48
- // throw new Error("Vitest is not initialized");
49
- // }
50
- // return this.vitestExpect(this.get(name));
51
- // }
392
+ createStore(): NaiteStore {
393
+ return new Map<string, NaiteTrace[]>();
394
+ }
52
395
 
53
396
  // 일반 로그 레벨
54
- static d(_message: string) {
397
+ d(_message: string) {
55
398
  // TODO: Logger 연결
56
399
  console.log(`[DEBUG] ${_message}`);
57
400
  }
58
- static i(_message: string) {
401
+ i(_message: string) {
59
402
  // TODO: Logger 연결
60
403
  console.log(`[INFO] ${_message}`);
61
404
  }
62
- static w(_message: string) {
405
+ w(_message: string) {
63
406
  // TODO: Logger 연결
64
407
  console.log(`[WARN] ${_message}`);
65
408
  }
66
- static e(_message: string) {
409
+ e(_message: string) {
67
410
  // TODO: Logger 연결
68
411
  console.log(`[ERROR] ${_message}`);
69
412
  }
70
413
  }
414
+
415
+ export const Naite = new NaiteClass();