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,4 +1,4 @@
1
- import { isHotReloadServer } from "./esm-utils.js";
1
+ import { isHotReloadServer, isTest } from "./controller.js";
2
2
  /**
3
3
  * 어떤 경로가 들어오든, 현재 실행 환경에 맞는 경로로 바꿔줍니다.
4
4
  *
@@ -49,7 +49,7 @@ import { isHotReloadServer } from "./esm-utils.js";
49
49
  *
50
50
  * @param anyPath
51
51
  * @returns
52
- */ export function runtimePath(anyPath, isDev = isHotReloadServer()) {
52
+ */ export function runtimePath(anyPath, isDev = isHotReloadServer() || isTest()) {
53
53
  if (isDev) {
54
54
  return anyPath.replace(/dist\//, "src/").replace(/\.js/, ".ts");
55
55
  } else {
@@ -57,4 +57,4 @@ import { isHotReloadServer } from "./esm-utils.js";
57
57
  }
58
58
  }
59
59
 
60
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wYXRoLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSG90UmVsb2FkU2VydmVyIH0gZnJvbSBcIi4vZXNtLXV0aWxzLmpzXCI7XG5cbi8qKlxuICogQVBJIO2MqO2CpOyngCDrgrTrtoAg7IOB64yAIOqyveuhnCAoc3JjLyDrmJDripQgZGlzdC/roZwg7Iuc7J6RKVxuICpcbiAqICoq7IKs7JqpIOychOy5mCoqOiBBUEkg7Yyo7YKk7KeAIOuCtOu2gCDtjIzsnbwg7LC47KGwXG4gKiAqKuyYiOyLnCoqOlxuICogLSBgXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJgXG4gKiAtIGBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJgXG4gKlxuICogKirquLDspIDsoJAqKjogYFNvbmFtdS5hcGlSb290UGF0aGAgKOydvOuwmOyggeycvOuhnCDtlITroZzsoJ3tirjsnZggYC9hcGlgIOuUlOugie2GoOumrClcbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVsYXRpdmVQYXRoID0gYCR7XCJzcmNcIiB8IFwiZGlzdFwifS8ke3N0cmluZ31gIHwgJ3NvbmFtdS5jb25maWcudHMnO1xuXG4vKipcbiAqIOyVsSDro6jtirgg6riw7KSAIOyDgeuMgCDqsr3roZwgKGFwaS8sIHdlYi8g65OxIO2DgOqynyDrlJTroInthqDrpqzroZwg7Iuc7J6RKVxuICpcbiAqICoq7IKs7JqpIOychOy5mCoqOiDri6Trpbgg7YOA6rKfKGFwaSwgd2ViIOuTsSnsnZgg7YyM7J28IOywuOyhsFxuICogKirsmIjsi5wqKjpcbiAqIC0gYFwiYXBpL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcImBcbiAqIC0gYFwid2ViL3NyYy9wYWdlcy9hZG1pbi91c2Vycy9pbmRleC50c3hcImBcbiAqIC0gYFwiYXBwL2Rpc3QvaW5kZXguanNcImBcbiAqXG4gKiAqKuq4sOykgOygkCoqOiBgU29uYW11LmFwcFJvb3RQYXRoYCAo7J2867CY7KCB7Jy866GcIOuqqOuFuOugiO2PrCDro6jtirgpXG4gKi9cbmV4cG9ydCB0eXBlIEFwcFJlbGF0aXZlUGF0aCA9IGAke3N0cmluZ30vJHtcInNyY1wiIHwgXCJkaXN0XCJ9LyR7c3RyaW5nfWA7XG5cbi8qKlxuICog7Iuc7Iqk7YWcIOygiOuMgCDqsr3roZwgKOujqO2KuCAvIOu2gO2EsCDsi5zsnpEpXG4gKlxuICogKirsgqzsmqkg7JyE7LmYKio6IO2MjOydvOyLnOyKpO2FnCDsp4HsoJEg7KCR6re8LCBnbG9iIO2MqO2EtFxuICogKirsmIjsi5wqKjogYFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJgXG4gKlxuICogKirspJHsmpQqKjpcbiAqIC0gaW1wb3J0IOyLnOyXkOuKlCDroZzrjZTqsIAg7JWM7JWE7IScIHNyYy9kaXN0IOuzgO2ZmO2VtOyjvOuvgOuhnCDslrTripAg6rK966Gc65OgIOqwgOuKpVxuICogLSBmcyDsp4HsoJEg7KCR6re8IOyLnOyXkOuKlCDsi6TsoJwg7KG07J6s7ZWY64qUIOqyveuhnOulvCDsgqzsmqntlbTslbwg7ZWoXG4gKiAgIC0gRGV2OiBzcmMvKi50cyDqsr3roZwg7IKs7JqpXG4gKiAgIC0gUHJvZDogZGlzdC8qLmpzIOqyveuhnCDsgqzsmqlcbiAqL1xuZXhwb3J0IHR5cGUgQWJzb2x1dGVQYXRoID0gYC8ke3N0cmluZ31gO1xuXG4vKipcbiAqIOyWtOuWpCDqsr3roZzqsIAg65Ok7Ja07Jik65OgLCDtmITsnqwg7Iuk7ZaJIO2ZmOqyveyXkCDrp57ripQg6rK966Gc66GcIOuwlOq/lOykjeuLiOuLpC5cbiAqXG4gKiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCJkaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wiXG4gKiBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDqsJzrsJwg66qo65Oc652866m0P1xuICogLT4gXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqIFwiZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOuwsO2PrCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJcbiAqXG4gKiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDqsJzrsJwg66qo65Oc652866m0P1xuICogLT4gXCIvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gKiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCIvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIlxuICogXCIvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wiXG4gKiBcIi9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg67Cw7Y+sIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJcbiAqXG4gKiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg67Cw7Y+sIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wiXG4gKlxuICogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDqsJzrsJwg66qo65Oc652866m0P1xuICogLT4gXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCJcbiAqIFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50cz9ob3Q9MTIzNDU2Nzg5MFwi6rCAIOuTpOyWtOyZlOydhCDrlYwg67Cw7Y+sIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanM/aG90PTEyMzQ1Njc4OTBcIlxuICogXCJkaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50cz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKiBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzP2hvdD0xMjM0NTY3ODkwXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCJkaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKlxuICogXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHM/aG90PTEyMzQ1Njc4OTBcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50cz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50cz9ob3Q9MTIzNDU2Nzg5MFwi6rCAIOuTpOyWtOyZlOydhCDrlYwg67Cw7Y+sIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanM/aG90PTEyMzQ1Njc4OTBcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50cz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanM/aG90PTEyMzQ1Njc4OTBcIuqwgCDrk6TslrTsmZTsnYQg65WMIOuwsO2PrCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanM/aG90PTEyMzQ1Njc4OTBcIlxuICpcbiAqIEBwYXJhbSBhbnlQYXRoXG4gKiBAcmV0dXJuc1xuICovXG5leHBvcnQgZnVuY3Rpb24gcnVudGltZVBhdGgoXG4gIGFueVBhdGg6IHN0cmluZyxcbiAgaXNEZXY6IGJvb2xlYW4gPSBpc0hvdFJlbG9hZFNlcnZlcigpXG4pOiBzdHJpbmcge1xuICBpZiAoaXNEZXYpIHtcbiAgICByZXR1cm4gYW55UGF0aC5yZXBsYWNlKC9kaXN0XFwvLywgXCJzcmMvXCIpLnJlcGxhY2UoL1xcLmpzLywgXCIudHNcIik7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGFueVBhdGgucmVwbGFjZSgvc3JjXFwvLywgXCJkaXN0L1wiKS5yZXBsYWNlKC9cXC50cy8sIFwiLmpzXCIpO1xuICB9XG59XG4iXSwibmFtZXMiOlsiaXNIb3RSZWxvYWRTZXJ2ZXIiLCJydW50aW1lUGF0aCIsImFueVBhdGgiLCJpc0RldiIsInJlcGxhY2UiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGlCQUFpQixRQUFRLGlCQUFpQjtBQXlDbkQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0NBa0RDLEdBQ0QsT0FBTyxTQUFTQyxZQUNkQyxPQUFlLEVBQ2ZDLFFBQWlCSCxtQkFBbUI7SUFFcEMsSUFBSUcsT0FBTztRQUNULE9BQU9ELFFBQVFFLE9BQU8sQ0FBQyxVQUFVLFFBQVFBLE9BQU8sQ0FBQyxRQUFRO0lBQzNELE9BQU87UUFDTCxPQUFPRixRQUFRRSxPQUFPLENBQUMsU0FBUyxTQUFTQSxPQUFPLENBQUMsUUFBUTtJQUMzRDtBQUNGIn0=
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wYXRoLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IGlzSG90UmVsb2FkU2VydmVyLCBpc1Rlc3QgfSBmcm9tIFwiLi9jb250cm9sbGVyLmpzXCI7XG5cbi8qKlxuICogQVBJIO2MqO2CpOyngCDrgrTrtoAg7IOB64yAIOqyveuhnCAoc3JjLyDrmJDripQgZGlzdC/roZwg7Iuc7J6RKVxuICpcbiAqICoq7IKs7JqpIOychOy5mCoqOiBBUEkg7Yyo7YKk7KeAIOuCtOu2gCDtjIzsnbwg7LC47KGwXG4gKiAqKuyYiOyLnCoqOlxuICogLSBgXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJgXG4gKiAtIGBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJgXG4gKlxuICogKirquLDspIDsoJAqKjogYFNvbmFtdS5hcGlSb290UGF0aGAgKOydvOuwmOyggeycvOuhnCDtlITroZzsoJ3tirjsnZggYC9hcGlgIOuUlOugie2GoOumrClcbiAqL1xuZXhwb3J0IHR5cGUgQXBpUmVsYXRpdmVQYXRoID0gYCR7XCJzcmNcIiB8IFwiZGlzdFwifS8ke3N0cmluZ31gIHwgXCJzb25hbXUuY29uZmlnLnRzXCI7XG5cbi8qKlxuICog7JWxIOujqO2KuCDquLDspIAg7IOB64yAIOqyveuhnCAoYXBpLywgd2ViLyDrk7Eg7YOA6rKfIOuUlOugie2GoOumrOuhnCDsi5zsnpEpXG4gKlxuICogKirsgqzsmqkg7JyE7LmYKio6IOuLpOuluCDtg4Dqsp8oYXBpLCB3ZWIg65OxKeydmCDtjIzsnbwg7LC47KGwXG4gKiAqKuyYiOyLnCoqOlxuICogLSBgXCJhcGkvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiYFxuICogLSBgXCJ3ZWIvc3JjL3BhZ2VzL2FkbWluL3VzZXJzL2luZGV4LnRzeFwiYFxuICogLSBgXCJhcHAvZGlzdC9pbmRleC5qc1wiYFxuICpcbiAqICoq6riw7KSA7KCQKio6IGBTb25hbXUuYXBwUm9vdFBhdGhgICjsnbzrsJjsoIHsnLzroZwg66qo64W466CI7Y+sIOujqO2KuClcbiAqL1xuZXhwb3J0IHR5cGUgQXBwUmVsYXRpdmVQYXRoID0gYCR7c3RyaW5nfS8ke1wic3JjXCIgfCBcImRpc3RcIn0vJHtzdHJpbmd9YDtcblxuLyoqXG4gKiDsi5zsiqTthZwg7KCI64yAIOqyveuhnCAo66Oo7Yq4IC8g67aA7YSwIOyLnOyekSlcbiAqXG4gKiAqKuyCrOyaqSDsnITsuZgqKjog7YyM7J287Iuc7Iqk7YWcIOyngeygkSDsoJHqt7wsIGdsb2Ig7Yyo7YS0XG4gKiAqKuyYiOyLnCoqOiBgXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcImBcbiAqXG4gKiAqKuykkeyalCoqOlxuICogLSBpbXBvcnQg7Iuc7JeQ64qUIOuhnOuNlOqwgCDslYzslYTshJwgc3JjL2Rpc3Qg67OA7ZmY7ZW07KO866+A66GcIOyWtOuKkCDqsr3roZzrk6Ag6rCA64qlXG4gKiAtIGZzIOyngeygkSDsoJHqt7wg7Iuc7JeQ64qUIOyLpOygnCDsobTsnqztlZjripQg6rK966Gc66W8IOyCrOyaqe2VtOyVvCDtlahcbiAqICAgLSBEZXY6IHNyYy8qLnRzIOqyveuhnCDsgqzsmqlcbiAqICAgLSBQcm9kOiBkaXN0LyouanMg6rK966GcIOyCrOyaqVxuICovXG5leHBvcnQgdHlwZSBBYnNvbHV0ZVBhdGggPSBgLyR7c3RyaW5nfWA7XG5cbi8qKlxuICog7Ja065akIOqyveuhnOqwgCDrk6TslrTsmKTrk6AsIO2YhOyerCDsi6Ttlokg7ZmY6rK97JeQIOunnuuKlCDqsr3roZzroZwg67CU6r+U7KSN64uI64ukLlxuICpcbiAqIFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwic3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50c1wiXG4gKiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOuwsO2PrCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJcbiAqIFwiZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICogXCJkaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg67Cw7Y+sIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIlxuICpcbiAqIFwiL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCJcbiAqIFwiL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOuwsO2PrCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wiXG4gKiBcIi9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qc1wi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJcbiAqIFwiL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCIvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIlxuICpcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDqsJzrsJwg66qo65Oc652866m0P1xuICogLT4gXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICogXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIuqwgCDrk6TslrTsmZTsnYQg65WMIOuwsO2PrCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanNcIlxuICogXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDqsJzrsJwg66qo65Oc652866m0P1xuICogLT4gXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL3NyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHNcIlxuICogXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzXCJcbiAqXG4gKiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHM/aG90PTEyMzQ1Njc4OTBcIuqwgCDrk6TslrTsmZTsnYQg65WMIOqwnOuwnCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcInNyYy9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwudHM/aG90PTEyMzQ1Njc4OTBcIlxuICogXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCJkaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKiBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzP2hvdD0xMjM0NTY3ODkwXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDqsJzrsJwg66qo65Oc652866m0P1xuICogLT4gXCJzcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCJcbiAqIFwiZGlzdC9hcHBsaWNhdGlvbi91c2VyL3VzZXIubW9kZWwuanM/aG90PTEyMzQ1Njc4OTBcIuqwgCDrk6TslrTsmZTsnYQg65WMIOuwsO2PrCDrqqjrk5zrnbzrqbQ/XG4gKiAtPiBcImRpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzP2hvdD0xMjM0NTY3ODkwXCJcbiAqXG4gKiBcIi9Vc2Vycy9wb3RhZG9zL1Byb2plY3RzL3NvbmFtdS9hcGkvc3JjL2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC50cz9ob3Q9MTIzNDU2Nzg5MFwi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCJcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCLqsIAg65Ok7Ja07JmU7J2EIOuVjCDrsLDtj6wg66qo65Oc652866m0P1xuICogLT4gXCIvVXNlcnMvcG90YWRvcy9Qcm9qZWN0cy9zb25hbXUvYXBpL2Rpc3QvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLmpzP2hvdD0xMjM0NTY3ODkwXCJcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwi6rCAIOuTpOyWtOyZlOydhCDrlYwg6rCc67CcIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9zcmMvYXBwbGljYXRpb24vdXNlci91c2VyLm1vZGVsLnRzP2hvdD0xMjM0NTY3ODkwXCJcbiAqIFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwi6rCAIOuTpOyWtOyZlOydhCDrlYwg67Cw7Y+sIOuqqOuTnOudvOuptD9cbiAqIC0+IFwiL1VzZXJzL3BvdGFkb3MvUHJvamVjdHMvc29uYW11L2FwaS9kaXN0L2FwcGxpY2F0aW9uL3VzZXIvdXNlci5tb2RlbC5qcz9ob3Q9MTIzNDU2Nzg5MFwiXG4gKlxuICogQHBhcmFtIGFueVBhdGhcbiAqIEByZXR1cm5zXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBydW50aW1lUGF0aChhbnlQYXRoOiBzdHJpbmcsIGlzRGV2OiBib29sZWFuID0gaXNIb3RSZWxvYWRTZXJ2ZXIoKSB8fCBpc1Rlc3QoKSk6IHN0cmluZyB7XG4gIGlmIChpc0Rldikge1xuICAgIHJldHVybiBhbnlQYXRoLnJlcGxhY2UoL2Rpc3RcXC8vLCBcInNyYy9cIikucmVwbGFjZSgvXFwuanMvLCBcIi50c1wiKTtcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYW55UGF0aC5yZXBsYWNlKC9zcmNcXC8vLCBcImRpc3QvXCIpLnJlcGxhY2UoL1xcLnRzLywgXCIuanNcIik7XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJpc0hvdFJlbG9hZFNlcnZlciIsImlzVGVzdCIsInJ1bnRpbWVQYXRoIiwiYW55UGF0aCIsImlzRGV2IiwicmVwbGFjZSJdLCJtYXBwaW5ncyI6IkFBQUEsU0FBU0EsaUJBQWlCLEVBQUVDLE1BQU0sUUFBUSxrQkFBa0I7QUF5QzVEOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztDQWtEQyxHQUNELE9BQU8sU0FBU0MsWUFBWUMsT0FBZSxFQUFFQyxRQUFpQkosdUJBQXVCQyxRQUFRO0lBQzNGLElBQUlHLE9BQU87UUFDVCxPQUFPRCxRQUFRRSxPQUFPLENBQUMsVUFBVSxRQUFRQSxPQUFPLENBQUMsUUFBUTtJQUMzRCxPQUFPO1FBQ0wsT0FBT0YsUUFBUUUsT0FBTyxDQUFDLFNBQVMsU0FBU0EsT0FBTyxDQUFDLFFBQVE7SUFDM0Q7QUFDRiJ9
@@ -33,4 +33,4 @@ import { setTimeout as setTimeoutPromises } from "node:timers/promises";
33
33
  process.off(event, onEvent);
34
34
  }
35
35
 
36
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wcm9jZXNzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2V0VGltZW91dFByb21pc2VzIH0gZnJvbSBcInRpbWVycy9wcm9taXNlc1wiO1xuXG4vKipcbiAqIOyjvOyWtOynhCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICog7KO87Ja07KeEIO2UhOuhnOyEuOyKpCDsnbTrsqTtirgoPeyLnOq3uOuEkCnqsIAg67Cc7IOd7ZWY7JiA7J2EIOuVjOyXkOuPhCDstZzrjIAg7ZWc6rOEKGRlbGF5QmVmb3JlU2h1dGRvd24pIOuPmeyViCDsnpHsl4XsnYQg6riw64uk66awIO2bhCDsooXro4ztlanri4jri6QuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGpvYiAtIOyLpO2Wie2VoCDsnpHsl4VcbiAqIEBwYXJhbSB7ZXZlbnQ6IE5vZGVKUy5TaWduYWxzOyBkZWxheUJlZm9yZVNodXRkb3duOiBudW1iZXJ9IG9wdGlvbnMgLSDsmLXshZhcbiAqIEBwYXJhbSB7Tm9kZUpTLlNpZ25hbHN9IG9wdGlvbnMuZXZlbnQgLSDtlITroZzshLjsiqQg7J2067Kk7Yq4XG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5kZWxheUJlZm9yZVNodXRkb3duIC0g7LWc64yAIO2VnOqzhCDsi5zqsIRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICBqb2I6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gIHtcbiAgICB3aGVuVGhpc0hhcHBlbnM6IGV2ZW50LFxuICAgIHdhaXRGb3JVcFRvOiBkZWxheUJlZm9yZVNodXRkb3duLFxuICB9OiB7IHdoZW5UaGlzSGFwcGVuczogTm9kZUpTLlNpZ25hbHM7IHdhaXRGb3JVcFRvOiBudW1iZXIgfSA9IHtcbiAgICB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLFxuICAgIHdhaXRGb3JVcFRvOiAyMDAwMCxcbiAgfVxuKTogUHJvbWlzZTx2b2lkPiB7XG4gIGxldCBpc1J1bm5pbmcgPSB0cnVlIGFzIGJvb2xlYW47XG5cbiAgY29uc3QgYWJvcnRDb250cm9sbGVyID0gbmV3IEFib3J0Q29udHJvbGxlcigpO1xuICBjb25zdCBvbkV2ZW50ID0gYXN5bmMgKCkgPT4ge1xuICAgIGlmICghaXNSdW5uaW5nKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoMCk7XG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGFCcmlnaHQoYHdhaXQgZm9yIHN5bmNpbmcgZG9uZS4uLi5gKSk7XG5cbiAgICB0cnkge1xuICAgICAgYXdhaXQgc2V0VGltZW91dFByb21pc2VzKGRlbGF5QmVmb3JlU2h1dGRvd24sIFwid2FpdGluZy1zeW5jXCIsIHtcbiAgICAgICAgc2lnbmFsOiBhYm9ydENvbnRyb2xsZXIuc2lnbmFsLFxuICAgICAgfSk7XG4gICAgfSBjYXRjaCB7fVxuICAgIGNvbnNvbGUubG9nKGNoYWxrLm1hZ2VudGFCcmlnaHQoYFN5bmNpbmcgRE9ORSFgKSk7XG4gICAgcHJvY2Vzcy5leGl0KDApO1xuICB9O1xuICBwcm9jZXNzLm9uKGV2ZW50LCBvbkV2ZW50KTtcblxuICBhd2FpdCBqb2IoKTtcblxuICBpc1J1bm5pbmcgPSBmYWxzZTtcbiAgYWJvcnRDb250cm9sbGVyLmFib3J0KCk7XG4gIHByb2Nlc3Mub2ZmKGV2ZW50LCBvbkV2ZW50KTtcbn1cbiJdLCJuYW1lcyI6WyJjaGFsayIsInNldFRpbWVvdXQiLCJzZXRUaW1lb3V0UHJvbWlzZXMiLCJydW5XaXRoR3JhY2VmdWxTaHV0ZG93biIsImpvYiIsIndoZW5UaGlzSGFwcGVucyIsImV2ZW50Iiwid2FpdEZvclVwVG8iLCJkZWxheUJlZm9yZVNodXRkb3duIiwiaXNSdW5uaW5nIiwiYWJvcnRDb250cm9sbGVyIiwiQWJvcnRDb250cm9sbGVyIiwib25FdmVudCIsInByb2Nlc3MiLCJleGl0IiwiY29uc29sZSIsImxvZyIsIm1hZ2VudGFCcmlnaHQiLCJzaWduYWwiLCJvbiIsImFib3J0Iiwib2ZmIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLFFBQVE7QUFDMUIsU0FBU0MsY0FBY0Msa0JBQWtCLFFBQVEsdUJBQWtCO0FBRW5FOzs7Ozs7O0NBT0MsR0FDRCxPQUFPLGVBQWVDLHdCQUNwQkMsR0FBd0IsRUFDeEIsRUFDRUMsaUJBQWlCQyxLQUFLLEVBQ3RCQyxhQUFhQyxtQkFBbUIsRUFDeUIsR0FBRztJQUM1REgsaUJBQWlCO0lBQ2pCRSxhQUFhO0FBQ2YsQ0FBQztJQUVELElBQUlFLFlBQVk7SUFFaEIsTUFBTUMsa0JBQWtCLElBQUlDO0lBQzVCLE1BQU1DLFVBQVU7UUFDZCxJQUFJLENBQUNILFdBQVc7WUFDZEksUUFBUUMsSUFBSSxDQUFDO1FBQ2Y7UUFDQUMsUUFBUUMsR0FBRyxDQUFDaEIsTUFBTWlCLGFBQWEsQ0FBQyxDQUFDLHlCQUF5QixDQUFDO1FBRTNELElBQUk7WUFDRixNQUFNZixtQkFBbUJNLHFCQUFxQixnQkFBZ0I7Z0JBQzVEVSxRQUFRUixnQkFBZ0JRLE1BQU07WUFDaEM7UUFDRixFQUFFLE9BQU0sQ0FBQztRQUNUSCxRQUFRQyxHQUFHLENBQUNoQixNQUFNaUIsYUFBYSxDQUFDLENBQUMsYUFBYSxDQUFDO1FBQy9DSixRQUFRQyxJQUFJLENBQUM7SUFDZjtJQUNBRCxRQUFRTSxFQUFFLENBQUNiLE9BQU9NO0lBRWxCLE1BQU1SO0lBRU5LLFlBQVk7SUFDWkMsZ0JBQWdCVSxLQUFLO0lBQ3JCUCxRQUFRUSxHQUFHLENBQUNmLE9BQU9NO0FBQ3JCIn0=
36
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9wcm9jZXNzLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBjaGFsayBmcm9tIFwiY2hhbGtcIjtcbmltcG9ydCB7IHNldFRpbWVvdXQgYXMgc2V0VGltZW91dFByb21pc2VzIH0gZnJvbSBcInRpbWVycy9wcm9taXNlc1wiO1xuXG4vKipcbiAqIOyjvOyWtOynhCDsnpHsl4XsnYQg7Iuk7ZaJ7ZWp64uI64ukLlxuICog7KO87Ja07KeEIO2UhOuhnOyEuOyKpCDsnbTrsqTtirgoPeyLnOq3uOuEkCnqsIAg67Cc7IOd7ZWY7JiA7J2EIOuVjOyXkOuPhCDstZzrjIAg7ZWc6rOEKGRlbGF5QmVmb3JlU2h1dGRvd24pIOuPmeyViCDsnpHsl4XsnYQg6riw64uk66awIO2bhCDsooXro4ztlanri4jri6QuXG4gKiBAcGFyYW0geygpID0+IFByb21pc2U8dm9pZD59IGpvYiAtIOyLpO2Wie2VoCDsnpHsl4VcbiAqIEBwYXJhbSB7ZXZlbnQ6IE5vZGVKUy5TaWduYWxzOyBkZWxheUJlZm9yZVNodXRkb3duOiBudW1iZXJ9IG9wdGlvbnMgLSDsmLXshZhcbiAqIEBwYXJhbSB7Tm9kZUpTLlNpZ25hbHN9IG9wdGlvbnMuZXZlbnQgLSDtlITroZzshLjsiqQg7J2067Kk7Yq4XG4gKiBAcGFyYW0ge251bWJlcn0gb3B0aW9ucy5kZWxheUJlZm9yZVNodXRkb3duIC0g7LWc64yAIO2VnOqzhCDsi5zqsIRcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHJ1bldpdGhHcmFjZWZ1bFNodXRkb3duKFxuICBqb2I6ICgpID0+IFByb21pc2U8dm9pZD4sXG4gIHtcbiAgICB3aGVuVGhpc0hhcHBlbnM6IGV2ZW50LFxuICAgIHdhaXRGb3JVcFRvOiBkZWxheUJlZm9yZVNodXRkb3duLFxuICB9OiB7IHdoZW5UaGlzSGFwcGVuczogTm9kZUpTLlNpZ25hbHM7IHdhaXRGb3JVcFRvOiBudW1iZXIgfSA9IHtcbiAgICB3aGVuVGhpc0hhcHBlbnM6IFwiU0lHVVNSMlwiLFxuICAgIHdhaXRGb3JVcFRvOiAyMDAwMCxcbiAgfSxcbik6IFByb21pc2U8dm9pZD4ge1xuICBsZXQgaXNSdW5uaW5nID0gdHJ1ZSBhcyBib29sZWFuO1xuXG4gIGNvbnN0IGFib3J0Q29udHJvbGxlciA9IG5ldyBBYm9ydENvbnRyb2xsZXIoKTtcbiAgY29uc3Qgb25FdmVudCA9IGFzeW5jICgpID0+IHtcbiAgICBpZiAoIWlzUnVubmluZykge1xuICAgICAgcHJvY2Vzcy5leGl0KDApO1xuICAgIH1cbiAgICBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhQnJpZ2h0KGB3YWl0IGZvciBzeW5jaW5nIGRvbmUuLi4uYCkpO1xuXG4gICAgdHJ5IHtcbiAgICAgIGF3YWl0IHNldFRpbWVvdXRQcm9taXNlcyhkZWxheUJlZm9yZVNodXRkb3duLCBcIndhaXRpbmctc3luY1wiLCB7XG4gICAgICAgIHNpZ25hbDogYWJvcnRDb250cm9sbGVyLnNpZ25hbCxcbiAgICAgIH0pO1xuICAgIH0gY2F0Y2gge31cbiAgICBjb25zb2xlLmxvZyhjaGFsay5tYWdlbnRhQnJpZ2h0KGBTeW5jaW5nIERPTkUhYCkpO1xuICAgIHByb2Nlc3MuZXhpdCgwKTtcbiAgfTtcbiAgcHJvY2Vzcy5vbihldmVudCwgb25FdmVudCk7XG5cbiAgYXdhaXQgam9iKCk7XG5cbiAgaXNSdW5uaW5nID0gZmFsc2U7XG4gIGFib3J0Q29udHJvbGxlci5hYm9ydCgpO1xuICBwcm9jZXNzLm9mZihldmVudCwgb25FdmVudCk7XG59XG4iXSwibmFtZXMiOlsiY2hhbGsiLCJzZXRUaW1lb3V0Iiwic2V0VGltZW91dFByb21pc2VzIiwicnVuV2l0aEdyYWNlZnVsU2h1dGRvd24iLCJqb2IiLCJ3aGVuVGhpc0hhcHBlbnMiLCJldmVudCIsIndhaXRGb3JVcFRvIiwiZGVsYXlCZWZvcmVTaHV0ZG93biIsImlzUnVubmluZyIsImFib3J0Q29udHJvbGxlciIsIkFib3J0Q29udHJvbGxlciIsIm9uRXZlbnQiLCJwcm9jZXNzIiwiZXhpdCIsImNvbnNvbGUiLCJsb2ciLCJtYWdlbnRhQnJpZ2h0Iiwic2lnbmFsIiwib24iLCJhYm9ydCIsIm9mZiJdLCJtYXBwaW5ncyI6IkFBQUEsT0FBT0EsV0FBVyxRQUFRO0FBQzFCLFNBQVNDLGNBQWNDLGtCQUFrQixRQUFRLHVCQUFrQjtBQUVuRTs7Ozs7OztDQU9DLEdBQ0QsT0FBTyxlQUFlQyx3QkFDcEJDLEdBQXdCLEVBQ3hCLEVBQ0VDLGlCQUFpQkMsS0FBSyxFQUN0QkMsYUFBYUMsbUJBQW1CLEVBQ3lCLEdBQUc7SUFDNURILGlCQUFpQjtJQUNqQkUsYUFBYTtBQUNmLENBQUM7SUFFRCxJQUFJRSxZQUFZO0lBRWhCLE1BQU1DLGtCQUFrQixJQUFJQztJQUM1QixNQUFNQyxVQUFVO1FBQ2QsSUFBSSxDQUFDSCxXQUFXO1lBQ2RJLFFBQVFDLElBQUksQ0FBQztRQUNmO1FBQ0FDLFFBQVFDLEdBQUcsQ0FBQ2hCLE1BQU1pQixhQUFhLENBQUMsQ0FBQyx5QkFBeUIsQ0FBQztRQUUzRCxJQUFJO1lBQ0YsTUFBTWYsbUJBQW1CTSxxQkFBcUIsZ0JBQWdCO2dCQUM1RFUsUUFBUVIsZ0JBQWdCUSxNQUFNO1lBQ2hDO1FBQ0YsRUFBRSxPQUFNLENBQUM7UUFDVEgsUUFBUUMsR0FBRyxDQUFDaEIsTUFBTWlCLGFBQWEsQ0FBQyxDQUFDLGFBQWEsQ0FBQztRQUMvQ0osUUFBUUMsSUFBSSxDQUFDO0lBQ2Y7SUFDQUQsUUFBUU0sRUFBRSxDQUFDYixPQUFPTTtJQUVsQixNQUFNUjtJQUVOSyxZQUFZO0lBQ1pDLGdCQUFnQlUsS0FBSztJQUNyQlAsUUFBUVEsR0FBRyxDQUFDZixPQUFPTTtBQUNyQiJ9
@@ -1,4 +1,8 @@
1
- import { AST, ColumnRef } from "node-sql-parser";
1
+ import type { AST, ColumnRef, Join } from "node-sql-parser";
2
2
  export declare function getTableName(expr: ColumnRef): string | null;
3
3
  export declare function getTableNamesFromWhere(ast: AST | AST[]): string[];
4
+ /**
5
+ * 주의: table명이 아닌 alias를 반환함
6
+ */
7
+ export declare function getJoinTables(ast: AST | AST[], joinTypes: Join["join"][]): string[];
4
8
  //# sourceMappingURL=sql-parser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"sql-parser.d.ts","sourceRoot":"","sources":["../../src/utils/sql-parser.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,GAAG,EAAE,SAAS,EAAiC,MAAM,iBAAiB,CAAC;AAEhF,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,iBAO3C;AAGD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CA0BjE"}
1
+ {"version":3,"file":"sql-parser.d.ts","sourceRoot":"","sources":["../../src/utils/sql-parser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAA+B,IAAI,EAAU,MAAM,iBAAiB,CAAC;AAIjG,wBAAgB,YAAY,CAAC,IAAI,EAAE,SAAS,iBAO3C;AAGD,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,GAAG,MAAM,EAAE,CA0BjE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,GAAG,MAAM,EAAE,CAYnF"}
@@ -1,4 +1,5 @@
1
- import * as _ from "lodash-es";
1
+ import { unique } from "radashi";
2
+ import { nonNullable } from "./utils.js";
2
3
  export function getTableName(expr) {
3
4
  if ("table" in expr && expr.table !== null) {
4
5
  return typeof expr.table === "string" ? expr.table : expr.table.value;
@@ -27,9 +28,19 @@ export function getTableNamesFromWhere(ast) {
27
28
  ...extractTableName(where.right)
28
29
  ];
29
30
  };
30
- return _.uniq((Array.isArray(ast) ? ast : [
31
+ return unique((Array.isArray(ast) ? ast : [
31
32
  ast
32
33
  ]).flatMap((a)=>a.type === "select" || a.type === "update" || a.type === "delete" ? extractTableNames(a.where) : []));
33
34
  }
35
+ /**
36
+ * 주의: table명이 아닌 alias를 반환함
37
+ */ export function getJoinTables(ast, joinTypes) {
38
+ const extractJoinTables = (froms)=>{
39
+ return froms.map((f)=>"join" in f && joinTypes.includes(f.join) ? f.as : null).filter(nonNullable);
40
+ };
41
+ return unique((Array.isArray(ast) ? ast : [
42
+ ast
43
+ ]).flatMap((a)=>a.type === "select" && Array.isArray(a.from) ? extractJoinTables(a.from) : []));
44
+ }
34
45
 
35
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zcWwtcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgQVNULCBDb2x1bW5SZWYsIEV4cHIsIEV4cHJlc3Npb25WYWx1ZSwgU2VsZWN0IH0gZnJvbSBcIm5vZGUtc3FsLXBhcnNlclwiO1xuXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lKGV4cHI6IENvbHVtblJlZikge1xuICBpZiAoXCJ0YWJsZVwiIGluIGV4cHIgJiYgZXhwci50YWJsZSAhPT0gbnVsbCkge1xuICAgIHJldHVybiB0eXBlb2YgZXhwci50YWJsZSA9PT0gXCJzdHJpbmdcIlxuICAgICAgPyBleHByLnRhYmxlXG4gICAgICA6IChleHByLnRhYmxlIGFzIHsgdHlwZTogc3RyaW5nOyB2YWx1ZTogc3RyaW5nIH0pLnZhbHVlO1xuICB9XG4gIHJldHVybiBudWxsO1xufVxuXG4vLyB3aGVyZSDsobDqsbTsl5Ag7IKs7Jqp65CcIO2FjOydtOu4lOuqheydhCDstpTstpxcbmV4cG9ydCBmdW5jdGlvbiBnZXRUYWJsZU5hbWVzRnJvbVdoZXJlKGFzdDogQVNUIHwgQVNUW10pOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGV4dHJhY3RUYWJsZU5hbWVzID0gKHdoZXJlOiBTZWxlY3RbXCJ3aGVyZVwiXSk6IHN0cmluZ1tdID0+IHtcbiAgICBpZiAod2hlcmUgPT09IG51bGwgfHwgISh3aGVyZS50eXBlID09PSBcImJpbmFyeV9leHByXCIgJiYgXCJsZWZ0XCIgaW4gd2hlcmUpKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgY29uc3QgZXh0cmFjdFRhYmxlTmFtZSA9IChleHByOiBFeHByIHwgRXhwcmVzc2lvblZhbHVlKTogc3RyaW5nW10gPT4ge1xuICAgICAgaWYgKGV4cHIudHlwZSA9PT0gXCJjb2x1bW5fcmVmXCIpIHtcbiAgICAgICAgY29uc3QgdGFibGUgPSBnZXRUYWJsZU5hbWUoZXhwciBhcyBDb2x1bW5SZWYpO1xuICAgICAgICByZXR1cm4gdGFibGUgPyBbdGFibGVdIDogW107XG4gICAgICB9IGVsc2UgaWYgKGV4cHIudHlwZSA9PT0gXCJiaW5hcnlfZXhwclwiICYmIFwibGVmdFwiIGluIGV4cHIpIHtcbiAgICAgICAgcmV0dXJuIGV4dHJhY3RUYWJsZU5hbWVzKGV4cHIpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtdO1xuICAgIH07XG5cbiAgICByZXR1cm4gWy4uLmV4dHJhY3RUYWJsZU5hbWUod2hlcmUubGVmdCksIC4uLmV4dHJhY3RUYWJsZU5hbWUod2hlcmUucmlnaHQpXTtcbiAgfTtcblxuICByZXR1cm4gXy51bmlxKFxuICAgIChBcnJheS5pc0FycmF5KGFzdCkgPyBhc3QgOiBbYXN0XSkuZmxhdE1hcCgoYSkgPT5cbiAgICAgIGEudHlwZSA9PT0gXCJzZWxlY3RcIiB8fCBhLnR5cGUgPT09IFwidXBkYXRlXCIgfHwgYS50eXBlID09PSBcImRlbGV0ZVwiXG4gICAgICAgID8gZXh0cmFjdFRhYmxlTmFtZXMoYS53aGVyZSlcbiAgICAgICAgOiBbXVxuICAgIClcbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJfIiwiZ2V0VGFibGVOYW1lIiwiZXhwciIsInRhYmxlIiwidmFsdWUiLCJnZXRUYWJsZU5hbWVzRnJvbVdoZXJlIiwiYXN0IiwiZXh0cmFjdFRhYmxlTmFtZXMiLCJ3aGVyZSIsInR5cGUiLCJleHRyYWN0VGFibGVOYW1lIiwibGVmdCIsInJpZ2h0IiwidW5pcSIsIkFycmF5IiwiaXNBcnJheSIsImZsYXRNYXAiLCJhIl0sIm1hcHBpbmdzIjoiQUFBQSxZQUFZQSxPQUFPLFlBQVk7QUFHL0IsT0FBTyxTQUFTQyxhQUFhQyxJQUFlO0lBQzFDLElBQUksV0FBV0EsUUFBUUEsS0FBS0MsS0FBSyxLQUFLLE1BQU07UUFDMUMsT0FBTyxPQUFPRCxLQUFLQyxLQUFLLEtBQUssV0FDekJELEtBQUtDLEtBQUssR0FDVixBQUFDRCxLQUFLQyxLQUFLLENBQXFDQyxLQUFLO0lBQzNEO0lBQ0EsT0FBTztBQUNUO0FBRUEseUJBQXlCO0FBQ3pCLE9BQU8sU0FBU0MsdUJBQXVCQyxHQUFnQjtJQUNyRCxNQUFNQyxvQkFBb0IsQ0FBQ0M7UUFDekIsSUFBSUEsVUFBVSxRQUFRLENBQUVBLENBQUFBLE1BQU1DLElBQUksS0FBSyxpQkFBaUIsVUFBVUQsS0FBSSxHQUFJO1lBQ3hFLE9BQU8sRUFBRTtRQUNYO1FBRUEsTUFBTUUsbUJBQW1CLENBQUNSO1lBQ3hCLElBQUlBLEtBQUtPLElBQUksS0FBSyxjQUFjO2dCQUM5QixNQUFNTixRQUFRRixhQUFhQztnQkFDM0IsT0FBT0MsUUFBUTtvQkFBQ0E7aUJBQU0sR0FBRyxFQUFFO1lBQzdCLE9BQU8sSUFBSUQsS0FBS08sSUFBSSxLQUFLLGlCQUFpQixVQUFVUCxNQUFNO2dCQUN4RCxPQUFPSyxrQkFBa0JMO1lBQzNCO1lBQ0EsT0FBTyxFQUFFO1FBQ1g7UUFFQSxPQUFPO2VBQUlRLGlCQUFpQkYsTUFBTUcsSUFBSTtlQUFNRCxpQkFBaUJGLE1BQU1JLEtBQUs7U0FBRTtJQUM1RTtJQUVBLE9BQU9aLEVBQUVhLElBQUksQ0FDWCxBQUFDQyxDQUFBQSxNQUFNQyxPQUFPLENBQUNULE9BQU9BLE1BQU07UUFBQ0E7S0FBSSxBQUFELEVBQUdVLE9BQU8sQ0FBQyxDQUFDQyxJQUMxQ0EsRUFBRVIsSUFBSSxLQUFLLFlBQVlRLEVBQUVSLElBQUksS0FBSyxZQUFZUSxFQUFFUixJQUFJLEtBQUssV0FDckRGLGtCQUFrQlUsRUFBRVQsS0FBSyxJQUN6QixFQUFFO0FBR1oifQ==
46
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9zcWwtcGFyc2VyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHsgQVNULCBDb2x1bW5SZWYsIEV4cHIsIEV4cHJlc3Npb25WYWx1ZSwgRnJvbSwgSm9pbiwgU2VsZWN0IH0gZnJvbSBcIm5vZGUtc3FsLXBhcnNlclwiO1xuaW1wb3J0IHsgdW5pcXVlIH0gZnJvbSBcInJhZGFzaGlcIjtcbmltcG9ydCB7IG5vbk51bGxhYmxlIH0gZnJvbSBcIi4vdXRpbHNcIjtcblxuZXhwb3J0IGZ1bmN0aW9uIGdldFRhYmxlTmFtZShleHByOiBDb2x1bW5SZWYpIHtcbiAgaWYgKFwidGFibGVcIiBpbiBleHByICYmIGV4cHIudGFibGUgIT09IG51bGwpIHtcbiAgICByZXR1cm4gdHlwZW9mIGV4cHIudGFibGUgPT09IFwic3RyaW5nXCJcbiAgICAgID8gZXhwci50YWJsZVxuICAgICAgOiAoZXhwci50YWJsZSBhcyB7IHR5cGU6IHN0cmluZzsgdmFsdWU6IHN0cmluZyB9KS52YWx1ZTtcbiAgfVxuICByZXR1cm4gbnVsbDtcbn1cblxuLy8gd2hlcmUg7KGw6rG07JeQIOyCrOyaqeuQnCDthYzsnbTruJTrqoXsnYQg7LaU7LacXG5leHBvcnQgZnVuY3Rpb24gZ2V0VGFibGVOYW1lc0Zyb21XaGVyZShhc3Q6IEFTVCB8IEFTVFtdKTogc3RyaW5nW10ge1xuICBjb25zdCBleHRyYWN0VGFibGVOYW1lcyA9ICh3aGVyZTogU2VsZWN0W1wid2hlcmVcIl0pOiBzdHJpbmdbXSA9PiB7XG4gICAgaWYgKHdoZXJlID09PSBudWxsIHx8ICEod2hlcmUudHlwZSA9PT0gXCJiaW5hcnlfZXhwclwiICYmIFwibGVmdFwiIGluIHdoZXJlKSkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIGNvbnN0IGV4dHJhY3RUYWJsZU5hbWUgPSAoZXhwcjogRXhwciB8IEV4cHJlc3Npb25WYWx1ZSk6IHN0cmluZ1tdID0+IHtcbiAgICAgIGlmIChleHByLnR5cGUgPT09IFwiY29sdW1uX3JlZlwiKSB7XG4gICAgICAgIGNvbnN0IHRhYmxlID0gZ2V0VGFibGVOYW1lKGV4cHIgYXMgQ29sdW1uUmVmKTtcbiAgICAgICAgcmV0dXJuIHRhYmxlID8gW3RhYmxlXSA6IFtdO1xuICAgICAgfSBlbHNlIGlmIChleHByLnR5cGUgPT09IFwiYmluYXJ5X2V4cHJcIiAmJiBcImxlZnRcIiBpbiBleHByKSB7XG4gICAgICAgIHJldHVybiBleHRyYWN0VGFibGVOYW1lcyhleHByKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBbXTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIFsuLi5leHRyYWN0VGFibGVOYW1lKHdoZXJlLmxlZnQpLCAuLi5leHRyYWN0VGFibGVOYW1lKHdoZXJlLnJpZ2h0KV07XG4gIH07XG5cbiAgcmV0dXJuIHVuaXF1ZShcbiAgICAoQXJyYXkuaXNBcnJheShhc3QpID8gYXN0IDogW2FzdF0pLmZsYXRNYXAoKGEpID0+XG4gICAgICBhLnR5cGUgPT09IFwic2VsZWN0XCIgfHwgYS50eXBlID09PSBcInVwZGF0ZVwiIHx8IGEudHlwZSA9PT0gXCJkZWxldGVcIlxuICAgICAgICA/IGV4dHJhY3RUYWJsZU5hbWVzKGEud2hlcmUpXG4gICAgICAgIDogW10sXG4gICAgKSxcbiAgKTtcbn1cblxuLyoqXG4gKiDso7zsnZg6IHRhYmxl66qF7J20IOyVhOuLjCBhbGlhc+ulvCDrsJjtmZjtlahcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGdldEpvaW5UYWJsZXMoYXN0OiBBU1QgfCBBU1RbXSwgam9pblR5cGVzOiBKb2luW1wiam9pblwiXVtdKTogc3RyaW5nW10ge1xuICBjb25zdCBleHRyYWN0Sm9pblRhYmxlcyA9IChmcm9tczogRnJvbVtdKTogc3RyaW5nW10gPT4ge1xuICAgIHJldHVybiBmcm9tc1xuICAgICAgLm1hcCgoZikgPT4gKFwiam9pblwiIGluIGYgJiYgam9pblR5cGVzLmluY2x1ZGVzKGYuam9pbikgPyBmLmFzIDogbnVsbCkpXG4gICAgICAuZmlsdGVyKG5vbk51bGxhYmxlKTtcbiAgfTtcblxuICByZXR1cm4gdW5pcXVlKFxuICAgIChBcnJheS5pc0FycmF5KGFzdCkgPyBhc3QgOiBbYXN0XSkuZmxhdE1hcCgoYSkgPT5cbiAgICAgIGEudHlwZSA9PT0gXCJzZWxlY3RcIiAmJiBBcnJheS5pc0FycmF5KGEuZnJvbSkgPyBleHRyYWN0Sm9pblRhYmxlcyhhLmZyb20pIDogW10sXG4gICAgKSxcbiAgKTtcbn1cbiJdLCJuYW1lcyI6WyJ1bmlxdWUiLCJub25OdWxsYWJsZSIsImdldFRhYmxlTmFtZSIsImV4cHIiLCJ0YWJsZSIsInZhbHVlIiwiZ2V0VGFibGVOYW1lc0Zyb21XaGVyZSIsImFzdCIsImV4dHJhY3RUYWJsZU5hbWVzIiwid2hlcmUiLCJ0eXBlIiwiZXh0cmFjdFRhYmxlTmFtZSIsImxlZnQiLCJyaWdodCIsIkFycmF5IiwiaXNBcnJheSIsImZsYXRNYXAiLCJhIiwiZ2V0Sm9pblRhYmxlcyIsImpvaW5UeXBlcyIsImV4dHJhY3RKb2luVGFibGVzIiwiZnJvbXMiLCJtYXAiLCJmIiwiaW5jbHVkZXMiLCJqb2luIiwiYXMiLCJmaWx0ZXIiLCJmcm9tIl0sIm1hcHBpbmdzIjoiQUFDQSxTQUFTQSxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxXQUFXLFFBQVEsYUFBVTtBQUV0QyxPQUFPLFNBQVNDLGFBQWFDLElBQWU7SUFDMUMsSUFBSSxXQUFXQSxRQUFRQSxLQUFLQyxLQUFLLEtBQUssTUFBTTtRQUMxQyxPQUFPLE9BQU9ELEtBQUtDLEtBQUssS0FBSyxXQUN6QkQsS0FBS0MsS0FBSyxHQUNWLEFBQUNELEtBQUtDLEtBQUssQ0FBcUNDLEtBQUs7SUFDM0Q7SUFDQSxPQUFPO0FBQ1Q7QUFFQSx5QkFBeUI7QUFDekIsT0FBTyxTQUFTQyx1QkFBdUJDLEdBQWdCO0lBQ3JELE1BQU1DLG9CQUFvQixDQUFDQztRQUN6QixJQUFJQSxVQUFVLFFBQVEsQ0FBRUEsQ0FBQUEsTUFBTUMsSUFBSSxLQUFLLGlCQUFpQixVQUFVRCxLQUFJLEdBQUk7WUFDeEUsT0FBTyxFQUFFO1FBQ1g7UUFFQSxNQUFNRSxtQkFBbUIsQ0FBQ1I7WUFDeEIsSUFBSUEsS0FBS08sSUFBSSxLQUFLLGNBQWM7Z0JBQzlCLE1BQU1OLFFBQVFGLGFBQWFDO2dCQUMzQixPQUFPQyxRQUFRO29CQUFDQTtpQkFBTSxHQUFHLEVBQUU7WUFDN0IsT0FBTyxJQUFJRCxLQUFLTyxJQUFJLEtBQUssaUJBQWlCLFVBQVVQLE1BQU07Z0JBQ3hELE9BQU9LLGtCQUFrQkw7WUFDM0I7WUFDQSxPQUFPLEVBQUU7UUFDWDtRQUVBLE9BQU87ZUFBSVEsaUJBQWlCRixNQUFNRyxJQUFJO2VBQU1ELGlCQUFpQkYsTUFBTUksS0FBSztTQUFFO0lBQzVFO0lBRUEsT0FBT2IsT0FDTCxBQUFDYyxDQUFBQSxNQUFNQyxPQUFPLENBQUNSLE9BQU9BLE1BQU07UUFBQ0E7S0FBSSxBQUFELEVBQUdTLE9BQU8sQ0FBQyxDQUFDQyxJQUMxQ0EsRUFBRVAsSUFBSSxLQUFLLFlBQVlPLEVBQUVQLElBQUksS0FBSyxZQUFZTyxFQUFFUCxJQUFJLEtBQUssV0FDckRGLGtCQUFrQlMsRUFBRVIsS0FBSyxJQUN6QixFQUFFO0FBR1o7QUFFQTs7Q0FFQyxHQUNELE9BQU8sU0FBU1MsY0FBY1gsR0FBZ0IsRUFBRVksU0FBeUI7SUFDdkUsTUFBTUMsb0JBQW9CLENBQUNDO1FBQ3pCLE9BQU9BLE1BQ0pDLEdBQUcsQ0FBQyxDQUFDQyxJQUFPLFVBQVVBLEtBQUtKLFVBQVVLLFFBQVEsQ0FBQ0QsRUFBRUUsSUFBSSxJQUFJRixFQUFFRyxFQUFFLEdBQUcsTUFDL0RDLE1BQU0sQ0FBQzFCO0lBQ1o7SUFFQSxPQUFPRCxPQUNMLEFBQUNjLENBQUFBLE1BQU1DLE9BQU8sQ0FBQ1IsT0FBT0EsTUFBTTtRQUFDQTtLQUFJLEFBQUQsRUFBR1MsT0FBTyxDQUFDLENBQUNDLElBQzFDQSxFQUFFUCxJQUFJLEtBQUssWUFBWUksTUFBTUMsT0FBTyxDQUFDRSxFQUFFVyxJQUFJLElBQUlSLGtCQUFrQkgsRUFBRVcsSUFBSSxJQUFJLEVBQUU7QUFHbkYifQ==
@@ -0,0 +1,23 @@
1
+ type Expand<T> = T extends infer O ? {
2
+ [K in keyof O]: O[K];
3
+ } : never;
4
+ type SetPath<T, P extends string, V> = T extends readonly (infer U)[] ? SetPath<U, P, V>[] : P extends `${infer K}.${infer Rest}` ? K extends keyof T ? Expand<{
5
+ [Key in keyof T]: Key extends K ? SetPath<T[K], Rest, V> : T[Key];
6
+ }> : Expand<T & {
7
+ [Key in K]: SetPath<{}, Rest, V>;
8
+ }> : P extends keyof T ? Expand<{
9
+ [Key in keyof T]: Key extends P ? V : T[Key];
10
+ }> : Expand<T & {
11
+ [Key in P]: V;
12
+ }>;
13
+ export declare function withProp<T extends object, P extends string, V>(obj: T, path: P, value: V): SetPath<T, P, V>;
14
+ interface ChainWrapper<T> {
15
+ set<P extends string, V>(path: P, value: V): ChainWrapper<SetPath<T, P, V>>;
16
+ value(): T;
17
+ }
18
+ /**
19
+ * 객체를 감싸서 체이닝을 시작합니다.
20
+ */
21
+ export declare function withProps<T extends object>(obj: T): ChainWrapper<T>;
22
+ export {};
23
+ //# sourceMappingURL=type-utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"type-utils.d.ts","sourceRoot":"","sources":["../../src/utils/type-utils.ts"],"names":[],"mappings":"AACA,KAAK,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG,KAAK,CAAC;AAGtE,KAAK,OAAO,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,CAAC,CAAC,EAAE,GACjE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAElB,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,MAAM,IAAI,EAAE,GAClC,CAAC,SAAS,MAAM,CAAC,GAEf,MAAM,CAAC;KACJ,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC,GAC3B,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,GACtB,CAAC,CAAC,GAAG,CAAC;CACX,CAAC,GAEF,MAAM,CAAC,CAAC,GAAG;KAAG,GAAG,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC;CAAE,CAAC,GAElD,CAAC,SAAS,MAAM,CAAC,GAEf,MAAM,CAAC;KAAG,GAAG,IAAI,MAAM,CAAC,GAAG,GAAG,SAAS,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC;CAAE,CAAC,GAExD,MAAM,CAAC,CAAC,GAAG;KAAG,GAAG,IAAI,CAAC,GAAG,CAAC;CAAE,CAAC,CAAC;AAEtC,wBAAgB,QAAQ,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,SAAS,MAAM,EAAE,CAAC,EAC5D,GAAG,EAAE,CAAC,EACN,IAAI,EAAE,CAAC,EACP,KAAK,EAAE,CAAC,GACP,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAiClB;AAED,UAAU,YAAY,CAAC,CAAC;IAEtB,GAAG,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;IAG5E,KAAK,IAAI,CAAC,CAAC;CACZ;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,CAAC,SAAS,MAAM,EAAE,GAAG,EAAE,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAQnE"}
@@ -0,0 +1,45 @@
1
+ // 타입을 펼쳐서 보여주는 유틸리티 (객체에만 사용해야 함)
2
+ export function withProp(obj, path, value) {
3
+ const keys = path.split(".");
4
+ if (keys.length === 0) throw new Error("Path cannot be empty");
5
+ const result = structuredClone(obj);
6
+ const setDeep = (current, keys, value)=>{
7
+ if (keys.length === 0) return;
8
+ const [key, ...rest] = keys;
9
+ if (rest.length === 0) {
10
+ if (Array.isArray(current)) {
11
+ current.forEach((item)=>{
12
+ item[key] = value;
13
+ });
14
+ } else {
15
+ current[key] = value;
16
+ }
17
+ } else {
18
+ if (!(key in current) || typeof current[key] !== "object") {
19
+ current[key] = {};
20
+ }
21
+ if (Array.isArray(current[key])) {
22
+ current[key].forEach((item)=>{
23
+ setDeep(item, rest, value);
24
+ });
25
+ } else {
26
+ setDeep(current[key], rest, value);
27
+ }
28
+ }
29
+ };
30
+ setDeep(result, keys, value);
31
+ return result;
32
+ }
33
+ /**
34
+ * 객체를 감싸서 체이닝을 시작합니다.
35
+ */ export function withProps(obj) {
36
+ return {
37
+ set: (path, value)=>{
38
+ const nextObj = withProp(obj, path, value);
39
+ return withProps(nextObj);
40
+ },
41
+ value: ()=>obj
42
+ };
43
+ }
44
+
45
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy90eXBlLXV0aWxzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8vIO2DgOyeheydhCDtjrzss5DshJwg67O07Jes7KO864qUIOycoO2LuOumrO2LsCAo6rCd7LK07JeQ66eMIOyCrOyaqe2VtOyVvCDtlagpXG50eXBlIEV4cGFuZDxUPiA9IFQgZXh0ZW5kcyBpbmZlciBPID8geyBbSyBpbiBrZXlvZiBPXTogT1tLXSB9IDogbmV2ZXI7XG5cbi8vIO2VteyLrCDroZzsp4FcbnR5cGUgU2V0UGF0aDxULCBQIGV4dGVuZHMgc3RyaW5nLCBWPiA9IFQgZXh0ZW5kcyByZWFkb25seSAoaW5mZXIgVSlbXSAvLyBbU3RlcCAxXSDtmITsnqwg7YOA7J6F7J20IOuwsOyXtOyduOqwgD8gLT4g7JqU7IaMKFUp7JeQIOuMgO2VtCDsnqzqt4Ag7Zi47LacIO2bhCDrsLDsl7TroZwg6rCQ7IyIXG4gID8gU2V0UGF0aDxVLCBQLCBWPltdXG4gIDogLy8gW1N0ZXAgMl0g6rK966Gc6rCAIOygkCguKeycvOuhnCDrgpjriZjripTqsIA/XG4gICAgUCBleHRlbmRzIGAke2luZmVyIEt9LiR7aW5mZXIgUmVzdH1gXG4gICAgPyBLIGV4dGVuZHMga2V5b2YgVFxuICAgICAgPyAvLyBbU3RlcCAyLTFdIO2CpOqwgCDsobTsnqztlahcbiAgICAgICAgRXhwYW5kPHtcbiAgICAgICAgICBbS2V5IGluIGtleW9mIFRdOiBLZXkgZXh0ZW5kcyBLXG4gICAgICAgICAgICA/IFNldFBhdGg8VFtLXSwgUmVzdCwgVj4gLy8g7J6s6reAIO2YuOy2nFxuICAgICAgICAgICAgOiBUW0tleV07XG4gICAgICAgIH0+XG4gICAgICA6IC8vIFtTdGVwIDItMl0g7YKk6rCAIOyXhuydjCAo7IOI66Gc7Jq0IOqwneyytCDqsr3roZwg7IOd7ISxKVxuICAgICAgICBFeHBhbmQ8VCAmIHsgW0tleSBpbiBLXTogU2V0UGF0aDx7fSwgUmVzdCwgVj4gfT5cbiAgICA6IC8vIFtTdGVwIDNdIOqyveuhnOydmCDrp4jsp4Drp4kgKEJhc2UgQ2FzZSlcbiAgICAgIFAgZXh0ZW5kcyBrZXlvZiBUXG4gICAgICA/IC8vIFtTdGVwIDMtMV0g6riw7KG0IO2CpCDrja7slrTsk7DquLAgKOq1kOywqCDtg4DsnoUgJiDrjIDsi6Ag7KGw6rG067aAIO2DgOyeheycvOuhnCDsmYTsoIQg6rWQ7LK0KVxuICAgICAgICBFeHBhbmQ8eyBbS2V5IGluIGtleW9mIFRdOiBLZXkgZXh0ZW5kcyBQID8gViA6IFRbS2V5XSB9PlxuICAgICAgOiAvLyBbU3RlcCAzLTJdIOyDiCDtgqQg7LaU6rCAXG4gICAgICAgIEV4cGFuZDxUICYgeyBbS2V5IGluIFBdOiBWIH0+O1xuXG5leHBvcnQgZnVuY3Rpb24gd2l0aFByb3A8VCBleHRlbmRzIG9iamVjdCwgUCBleHRlbmRzIHN0cmluZywgVj4oXG4gIG9iajogVCxcbiAgcGF0aDogUCxcbiAgdmFsdWU6IFYsXG4pOiBTZXRQYXRoPFQsIFAsIFY+IHtcbiAgY29uc3Qga2V5cyA9IHBhdGguc3BsaXQoXCIuXCIpO1xuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHRocm93IG5ldyBFcnJvcihcIlBhdGggY2Fubm90IGJlIGVtcHR5XCIpO1xuICBjb25zdCByZXN1bHQgPSBzdHJ1Y3R1cmVkQ2xvbmUob2JqKTtcblxuICBjb25zdCBzZXREZWVwID0gKGN1cnJlbnQ6IGFueSwga2V5czogc3RyaW5nW10sIHZhbHVlOiBWKTogdm9pZCA9PiB7XG4gICAgaWYgKGtleXMubGVuZ3RoID09PSAwKSByZXR1cm47XG4gICAgY29uc3QgW2tleSwgLi4ucmVzdF0gPSBrZXlzO1xuXG4gICAgaWYgKHJlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50KSkge1xuICAgICAgICBjdXJyZW50LmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICBpdGVtW2tleV0gPSB2YWx1ZTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjdXJyZW50W2tleV0gPSB2YWx1ZTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKCEoa2V5IGluIGN1cnJlbnQpIHx8IHR5cGVvZiBjdXJyZW50W2tleV0gIT09IFwib2JqZWN0XCIpIHtcbiAgICAgICAgY3VycmVudFtrZXldID0ge307XG4gICAgICB9XG4gICAgICBpZiAoQXJyYXkuaXNBcnJheShjdXJyZW50W2tleV0pKSB7XG4gICAgICAgIGN1cnJlbnRba2V5XS5mb3JFYWNoKChpdGVtOiBhbnkpID0+IHtcbiAgICAgICAgICBzZXREZWVwKGl0ZW0sIHJlc3QsIHZhbHVlKTtcbiAgICAgICAgfSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzZXREZWVwKGN1cnJlbnRba2V5XSwgcmVzdCwgdmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBzZXREZWVwKHJlc3VsdCwga2V5cywgdmFsdWUpO1xuICByZXR1cm4gcmVzdWx0IGFzIFNldFBhdGg8VCwgUCwgVj47XG59XG5cbmludGVyZmFjZSBDaGFpbldyYXBwZXI8VD4ge1xuICAvLyDqsr3roZzsl5Ag6rCS7J2EIOyEpOygle2VmOqzoCDrs4Dqsr3rkJwg7YOA7J6F7J2YIOyDiOuhnOyatCDssrTsnbgg656Y7Y2866W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgc2V0PFAgZXh0ZW5kcyBzdHJpbmcsIFY+KHBhdGg6IFAsIHZhbHVlOiBWKTogQ2hhaW5XcmFwcGVyPFNldFBhdGg8VCwgUCwgVj4+O1xuXG4gIC8vIOy1nOyihSDqsrDqs7wg6rCd7LK066W8IOuwmO2ZmO2VqeuLiOuLpC5cbiAgdmFsdWUoKTogVDtcbn1cblxuLyoqXG4gKiDqsJ3ssrTrpbwg6rCQ7Iu47IScIOyytOydtOuLneydhCDsi5zsnpHtlanri4jri6QuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB3aXRoUHJvcHM8VCBleHRlbmRzIG9iamVjdD4ob2JqOiBUKTogQ2hhaW5XcmFwcGVyPFQ+IHtcbiAgcmV0dXJuIHtcbiAgICBzZXQ6IDxQIGV4dGVuZHMgc3RyaW5nLCBWPihwYXRoOiBQLCB2YWx1ZTogVikgPT4ge1xuICAgICAgY29uc3QgbmV4dE9iaiA9IHdpdGhQcm9wKG9iaiwgcGF0aCwgdmFsdWUpO1xuICAgICAgcmV0dXJuIHdpdGhQcm9wcyhuZXh0T2JqKSBhcyBDaGFpbldyYXBwZXI8U2V0UGF0aDxULCBQLCBWPj47XG4gICAgfSxcbiAgICB2YWx1ZTogKCkgPT4gb2JqLFxuICB9O1xufVxuIl0sIm5hbWVzIjpbIndpdGhQcm9wIiwib2JqIiwicGF0aCIsInZhbHVlIiwia2V5cyIsInNwbGl0IiwibGVuZ3RoIiwiRXJyb3IiLCJyZXN1bHQiLCJzdHJ1Y3R1cmVkQ2xvbmUiLCJzZXREZWVwIiwiY3VycmVudCIsImtleSIsInJlc3QiLCJBcnJheSIsImlzQXJyYXkiLCJmb3JFYWNoIiwiaXRlbSIsIndpdGhQcm9wcyIsInNldCIsIm5leHRPYmoiXSwibWFwcGluZ3MiOiJBQUFBLGtDQUFrQztBQXdCbEMsT0FBTyxTQUFTQSxTQUNkQyxHQUFNLEVBQ05DLElBQU8sRUFDUEMsS0FBUTtJQUVSLE1BQU1DLE9BQU9GLEtBQUtHLEtBQUssQ0FBQztJQUN4QixJQUFJRCxLQUFLRSxNQUFNLEtBQUssR0FBRyxNQUFNLElBQUlDLE1BQU07SUFDdkMsTUFBTUMsU0FBU0MsZ0JBQWdCUjtJQUUvQixNQUFNUyxVQUFVLENBQUNDLFNBQWNQLE1BQWdCRDtRQUM3QyxJQUFJQyxLQUFLRSxNQUFNLEtBQUssR0FBRztRQUN2QixNQUFNLENBQUNNLEtBQUssR0FBR0MsS0FBSyxHQUFHVDtRQUV2QixJQUFJUyxLQUFLUCxNQUFNLEtBQUssR0FBRztZQUNyQixJQUFJUSxNQUFNQyxPQUFPLENBQUNKLFVBQVU7Z0JBQzFCQSxRQUFRSyxPQUFPLENBQUMsQ0FBQ0M7b0JBQ2ZBLElBQUksQ0FBQ0wsSUFBSSxHQUFHVDtnQkFDZDtZQUNGLE9BQU87Z0JBQ0xRLE9BQU8sQ0FBQ0MsSUFBSSxHQUFHVDtZQUNqQjtRQUNGLE9BQU87WUFDTCxJQUFJLENBQUVTLENBQUFBLE9BQU9ELE9BQU0sS0FBTSxPQUFPQSxPQUFPLENBQUNDLElBQUksS0FBSyxVQUFVO2dCQUN6REQsT0FBTyxDQUFDQyxJQUFJLEdBQUcsQ0FBQztZQUNsQjtZQUNBLElBQUlFLE1BQU1DLE9BQU8sQ0FBQ0osT0FBTyxDQUFDQyxJQUFJLEdBQUc7Z0JBQy9CRCxPQUFPLENBQUNDLElBQUksQ0FBQ0ksT0FBTyxDQUFDLENBQUNDO29CQUNwQlAsUUFBUU8sTUFBTUosTUFBTVY7Z0JBQ3RCO1lBQ0YsT0FBTztnQkFDTE8sUUFBUUMsT0FBTyxDQUFDQyxJQUFJLEVBQUVDLE1BQU1WO1lBQzlCO1FBQ0Y7SUFDRjtJQUVBTyxRQUFRRixRQUFRSixNQUFNRDtJQUN0QixPQUFPSztBQUNUO0FBVUE7O0NBRUMsR0FDRCxPQUFPLFNBQVNVLFVBQTRCakIsR0FBTTtJQUNoRCxPQUFPO1FBQ0xrQixLQUFLLENBQXNCakIsTUFBU0M7WUFDbEMsTUFBTWlCLFVBQVVwQixTQUFTQyxLQUFLQyxNQUFNQztZQUNwQyxPQUFPZSxVQUFVRTtRQUNuQjtRQUNBakIsT0FBTyxJQUFNRjtJQUNmO0FBQ0YifQ==
@@ -1,6 +1,12 @@
1
- import { AbsolutePath } from "./path-utils";
1
+ import type { AbsolutePath } from "./path-utils";
2
2
  export declare function findAppRootPath(): Promise<AbsolutePath>;
3
3
  export declare function findApiRootPath(): AbsolutePath;
4
4
  export declare function nonNullable<T>(value: T): value is NonNullable<T>;
5
5
  export declare function exhaustive(_param: never): void;
6
+ export declare function assertExists<T>(value: T | null | undefined, message?: string): T;
7
+ export declare function assertNotNull<T>(value: T | null, message?: string): T;
8
+ export declare function assertDefined<T>(value: T | undefined, message?: string): T;
9
+ export declare function chunk<T>(array: T[], size: number): T[][];
10
+ export declare function intersectionBy<T, K>(arr1: readonly T[], arr2: readonly T[], iteratee: (item: T) => K): T[];
11
+ export declare function differenceWith<T>(arr1: readonly T[], arr2: readonly T[], comparator: (a: T, b: T) => boolean): T[];
6
12
  //# sourceMappingURL=utils.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAE5C,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAM7D;AAED,wBAAgB,eAAe,IAAI,YAAY,CAmB9C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEhE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,QAEvC"}
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/utils/utils.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD,wBAAsB,eAAe,IAAI,OAAO,CAAC,YAAY,CAAC,CAG7D;AAED,wBAAgB,eAAe,IAAI,YAAY,CAyB9C;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,KAAK,IAAI,WAAW,CAAC,CAAC,CAAC,CAEhE;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,QAEvC;AAGD,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAKhF;AAGD,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAKrE;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,CAAC,CAK1E;AAGD,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,CAAC,EAAE,EAAE,CAExD;AAED,wBAAgB,cAAc,CAAC,CAAC,EAAE,CAAC,EACjC,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,GACvB,CAAC,EAAE,CAGL;AAED,wBAAgB,cAAc,CAAC,CAAC,EAC9B,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,IAAI,EAAE,SAAS,CAAC,EAAE,EAClB,UAAU,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,OAAO,GAClC,CAAC,EAAE,CAEL"}
@@ -1,15 +1,20 @@
1
- import path from "path";
2
1
  import fs from "fs";
2
+ import path from "path";
3
+ import { cluster } from "radashi";
3
4
  export async function findAppRootPath() {
4
5
  const apiRootPath = findApiRootPath();
5
6
  return apiRootPath.split(path.sep).slice(0, -1).join(path.sep);
6
7
  }
7
8
  export function findApiRootPath() {
8
- // NOTE: for support npm / yarn workspaces
9
- const workspacePath = process.env["INIT_CWD"];
10
- if (workspacePath && workspacePath.length !== 0) {
9
+ // NOTE: for support npm / yarn / pnpm workspaces
10
+ // 하지만 workspace 쓰면 process.cwd() 하면 되는데... 이건 나중에 협의 후 수정하는걸로
11
+ const workspacePath = process.env.PNPM_SCRIPT_SRC_DIR ?? process.env.INIT_CWD;
12
+ if (nonNullable(workspacePath)) {
11
13
  return workspacePath;
12
14
  }
15
+ if (nonNullable(process.env.PNPM_PACKAGE_NAME)) {
16
+ return process.cwd().split(path.sep).join(path.sep);
17
+ }
13
18
  const basePath = import.meta.filename;
14
19
  let dir = path.dirname(basePath);
15
20
  if (dir.includes("/.yarn/")) {
@@ -29,5 +34,39 @@ export function nonNullable(value) {
29
34
  export function exhaustive(_param) {
30
35
  throw new Error(`exhaustive`);
31
36
  }
37
+ // 일반 버전
38
+ export function assertExists(value, message) {
39
+ if (value === null || value === undefined) {
40
+ throw new Error(message ?? "Value must exist");
41
+ }
42
+ return value;
43
+ }
44
+ // null만 체크
45
+ export function assertNotNull(value, message) {
46
+ if (value === null) {
47
+ throw new Error(message ?? "Value must not be null");
48
+ }
49
+ return value;
50
+ }
51
+ // undefined만 체크
52
+ export function assertDefined(value, message) {
53
+ if (value === undefined) {
54
+ throw new Error(message ?? "Value must be defined");
55
+ }
56
+ return value;
57
+ }
58
+ // lodash chunk 대체 (radash cluster 사용)
59
+ export function chunk(array, size) {
60
+ return cluster(array, Math.ceil(array.length / size));
61
+ }
62
+ // lodash intersectionBy 대체
63
+ export function intersectionBy(arr1, arr2, iteratee) {
64
+ const arr2Keys = new Set(arr2.map(iteratee));
65
+ return arr1.filter((item)=>arr2Keys.has(iteratee(item)));
66
+ }
67
+ // lodash differenceWith 대체
68
+ export function differenceWith(arr1, arr2, comparator) {
69
+ return arr1.filter((itemA)=>!arr2.some((itemB)=>comparator(itemA, itemB)));
70
+ }
32
71
 
33
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuaW1wb3J0IHsgQWJzb2x1dGVQYXRoIH0gZnJvbSBcIi4vcGF0aC11dGlsc1wiO1xuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZmluZEFwcFJvb3RQYXRoKCk6IFByb21pc2U8QWJzb2x1dGVQYXRoPiB7XG4gIGNvbnN0IGFwaVJvb3RQYXRoID0gZmluZEFwaVJvb3RQYXRoKCk7XG4gIHJldHVybiBhcGlSb290UGF0aFxuICAgIC5zcGxpdChwYXRoLnNlcClcbiAgICAuc2xpY2UoMCwgLTEpXG4gICAgLmpvaW4ocGF0aC5zZXApIGFzIEFic29sdXRlUGF0aDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGZpbmRBcGlSb290UGF0aCgpOiBBYnNvbHV0ZVBhdGgge1xuICAvLyBOT1RFOiBmb3Igc3VwcG9ydCBucG0gLyB5YXJuIHdvcmtzcGFjZXNcbiAgY29uc3Qgd29ya3NwYWNlUGF0aCA9IHByb2Nlc3MuZW52W1wiSU5JVF9DV0RcIl07XG4gIGlmICh3b3Jrc3BhY2VQYXRoICYmIHdvcmtzcGFjZVBhdGgubGVuZ3RoICE9PSAwKSB7XG4gICAgcmV0dXJuIHdvcmtzcGFjZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICB9XG5cbiAgY29uc3QgYmFzZVBhdGggPSBpbXBvcnQubWV0YS5maWxlbmFtZTtcbiAgbGV0IGRpciA9IHBhdGguZGlybmFtZShiYXNlUGF0aCk7XG4gIGlmIChkaXIuaW5jbHVkZXMoXCIvLnlhcm4vXCIpKSB7XG4gICAgZGlyID0gZGlyLnNwbGl0KFwiLy55YXJuL1wiKVswXTtcbiAgfVxuICBkbyB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMocGF0aC5qb2luKGRpciwgXCIvcGFja2FnZS5qc29uXCIpKSkge1xuICAgICAgcmV0dXJuIGRpci5zcGxpdChwYXRoLnNlcCkuam9pbihwYXRoLnNlcCkgYXMgQWJzb2x1dGVQYXRoO1xuICAgIH1cbiAgICBkaXIgPSBkaXIuc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKTtcbiAgfSB3aGlsZSAoZGlyLnNwbGl0KHBhdGguc2VwKS5sZW5ndGggPiAxKTtcbiAgdGhyb3cgbmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgQXBwUm9vdCB1c2luZyBTb25hbXUgLTJcIik7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBub25OdWxsYWJsZTxUPih2YWx1ZTogVCk6IHZhbHVlIGlzIE5vbk51bGxhYmxlPFQ+IHtcbiAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHZhbHVlICE9PSB1bmRlZmluZWQ7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBleGhhdXN0aXZlKF9wYXJhbTogbmV2ZXIpIHtcbiAgdGhyb3cgbmV3IEVycm9yKGBleGhhdXN0aXZlYCk7XG59XG4iXSwibmFtZXMiOlsicGF0aCIsImZzIiwiZmluZEFwcFJvb3RQYXRoIiwiYXBpUm9vdFBhdGgiLCJmaW5kQXBpUm9vdFBhdGgiLCJzcGxpdCIsInNlcCIsInNsaWNlIiwiam9pbiIsIndvcmtzcGFjZVBhdGgiLCJwcm9jZXNzIiwiZW52IiwibGVuZ3RoIiwiYmFzZVBhdGgiLCJmaWxlbmFtZSIsImRpciIsImRpcm5hbWUiLCJpbmNsdWRlcyIsImV4aXN0c1N5bmMiLCJFcnJvciIsIm5vbk51bGxhYmxlIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJleGhhdXN0aXZlIiwiX3BhcmFtIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxVQUFVLE9BQU87QUFDeEIsT0FBT0MsUUFBUSxLQUFLO0FBR3BCLE9BQU8sZUFBZUM7SUFDcEIsTUFBTUMsY0FBY0M7SUFDcEIsT0FBT0QsWUFDSkUsS0FBSyxDQUFDTCxLQUFLTSxHQUFHLEVBQ2RDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FDVkMsSUFBSSxDQUFDUixLQUFLTSxHQUFHO0FBQ2xCO0FBRUEsT0FBTyxTQUFTRjtJQUNkLDBDQUEwQztJQUMxQyxNQUFNSyxnQkFBZ0JDLFFBQVFDLEdBQUcsQ0FBQyxXQUFXO0lBQzdDLElBQUlGLGlCQUFpQkEsY0FBY0csTUFBTSxLQUFLLEdBQUc7UUFDL0MsT0FBT0g7SUFDVDtJQUVBLE1BQU1JLFdBQVcsWUFBWUMsUUFBUTtJQUNyQyxJQUFJQyxNQUFNZixLQUFLZ0IsT0FBTyxDQUFDSDtJQUN2QixJQUFJRSxJQUFJRSxRQUFRLENBQUMsWUFBWTtRQUMzQkYsTUFBTUEsSUFBSVYsS0FBSyxDQUFDLFVBQVUsQ0FBQyxFQUFFO0lBQy9CO0lBQ0EsR0FBRztRQUNELElBQUlKLEdBQUdpQixVQUFVLENBQUNsQixLQUFLUSxJQUFJLENBQUNPLEtBQUssbUJBQW1CO1lBQ2xELE9BQU9BLElBQUlWLEtBQUssQ0FBQ0wsS0FBS00sR0FBRyxFQUFFRSxJQUFJLENBQUNSLEtBQUtNLEdBQUc7UUFDMUM7UUFDQVMsTUFBTUEsSUFBSVYsS0FBSyxDQUFDTCxLQUFLTSxHQUFHLEVBQUVDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBR0MsSUFBSSxDQUFDUixLQUFLTSxHQUFHO0lBQ3RELFFBQVNTLElBQUlWLEtBQUssQ0FBQ0wsS0FBS00sR0FBRyxFQUFFTSxNQUFNLEdBQUcsRUFBRztJQUN6QyxNQUFNLElBQUlPLE1BQU07QUFDbEI7QUFFQSxPQUFPLFNBQVNDLFlBQWVDLEtBQVE7SUFDckMsT0FBT0EsVUFBVSxRQUFRQSxVQUFVQztBQUNyQztBQUVBLE9BQU8sU0FBU0MsV0FBV0MsTUFBYTtJQUN0QyxNQUFNLElBQUlMLE1BQU0sQ0FBQyxVQUFVLENBQUM7QUFDOUIifQ==
72
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy91dGlscy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZnMgZnJvbSBcImZzXCI7XG5pbXBvcnQgcGF0aCBmcm9tIFwicGF0aFwiO1xuaW1wb3J0IHsgY2x1c3RlciB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IEFic29sdXRlUGF0aCB9IGZyb20gXCIuL3BhdGgtdXRpbHNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGZpbmRBcHBSb290UGF0aCgpOiBQcm9taXNlPEFic29sdXRlUGF0aD4ge1xuICBjb25zdCBhcGlSb290UGF0aCA9IGZpbmRBcGlSb290UGF0aCgpO1xuICByZXR1cm4gYXBpUm9vdFBhdGguc3BsaXQocGF0aC5zZXApLnNsaWNlKDAsIC0xKS5qb2luKHBhdGguc2VwKSBhcyBBYnNvbHV0ZVBhdGg7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBmaW5kQXBpUm9vdFBhdGgoKTogQWJzb2x1dGVQYXRoIHtcbiAgLy8gTk9URTogZm9yIHN1cHBvcnQgbnBtIC8geWFybiAvIHBucG0gd29ya3NwYWNlc1xuICAvLyDtlZjsp4Drp4wgd29ya3NwYWNlIOyTsOuptCBwcm9jZXNzLmN3ZCgpIO2VmOuptCDrkJjripTrjbAuLi4g7J206rG0IOuCmOykkeyXkCDtmJHsnZgg7ZuEIOyImOygle2VmOuKlOqxuOuhnFxuICBjb25zdCB3b3Jrc3BhY2VQYXRoID0gcHJvY2Vzcy5lbnYuUE5QTV9TQ1JJUFRfU1JDX0RJUiA/PyBwcm9jZXNzLmVudi5JTklUX0NXRDtcbiAgaWYgKG5vbk51bGxhYmxlKHdvcmtzcGFjZVBhdGgpKSB7XG4gICAgcmV0dXJuIHdvcmtzcGFjZVBhdGggYXMgQWJzb2x1dGVQYXRoO1xuICB9XG5cbiAgaWYgKG5vbk51bGxhYmxlKHByb2Nlc3MuZW52LlBOUE1fUEFDS0FHRV9OQU1FKSkge1xuICAgIHJldHVybiBwcm9jZXNzLmN3ZCgpLnNwbGl0KHBhdGguc2VwKS5qb2luKHBhdGguc2VwKSBhcyBBYnNvbHV0ZVBhdGg7XG4gIH1cblxuICBjb25zdCBiYXNlUGF0aCA9IGltcG9ydC5tZXRhLmZpbGVuYW1lO1xuICBsZXQgZGlyID0gcGF0aC5kaXJuYW1lKGJhc2VQYXRoKTtcbiAgaWYgKGRpci5pbmNsdWRlcyhcIi8ueWFybi9cIikpIHtcbiAgICBkaXIgPSBkaXIuc3BsaXQoXCIvLnlhcm4vXCIpWzBdO1xuICB9XG5cbiAgZG8ge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKHBhdGguam9pbihkaXIsIFwiL3BhY2thZ2UuanNvblwiKSkpIHtcbiAgICAgIHJldHVybiBkaXIuc3BsaXQocGF0aC5zZXApLmpvaW4ocGF0aC5zZXApIGFzIEFic29sdXRlUGF0aDtcbiAgICB9XG4gICAgZGlyID0gZGlyLnNwbGl0KHBhdGguc2VwKS5zbGljZSgwLCAtMSkuam9pbihwYXRoLnNlcCk7XG4gIH0gd2hpbGUgKGRpci5zcGxpdChwYXRoLnNlcCkubGVuZ3RoID4gMSk7XG4gIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIEFwcFJvb3QgdXNpbmcgU29uYW11IC0yXCIpO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gbm9uTnVsbGFibGU8VD4odmFsdWU6IFQpOiB2YWx1ZSBpcyBOb25OdWxsYWJsZTxUPiB7XG4gIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB2YWx1ZSAhPT0gdW5kZWZpbmVkO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZXhoYXVzdGl2ZShfcGFyYW06IG5ldmVyKSB7XG4gIHRocm93IG5ldyBFcnJvcihgZXhoYXVzdGl2ZWApO1xufVxuXG4vLyDsnbzrsJgg67KE7KCEXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0RXhpc3RzPFQ+KHZhbHVlOiBUIHwgbnVsbCB8IHVuZGVmaW5lZCwgbWVzc2FnZT86IHN0cmluZyk6IFQge1xuICBpZiAodmFsdWUgPT09IG51bGwgfHwgdmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgIHRocm93IG5ldyBFcnJvcihtZXNzYWdlID8/IFwiVmFsdWUgbXVzdCBleGlzdFwiKTtcbiAgfVxuICByZXR1cm4gdmFsdWU7XG59XG5cbi8vIG51bGzrp4wg7LK07YGsXG5leHBvcnQgZnVuY3Rpb24gYXNzZXJ0Tm90TnVsbDxUPih2YWx1ZTogVCB8IG51bGwsIG1lc3NhZ2U/OiBzdHJpbmcpOiBUIHtcbiAgaWYgKHZhbHVlID09PSBudWxsKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgPz8gXCJWYWx1ZSBtdXN0IG5vdCBiZSBudWxsXCIpO1xuICB9XG4gIHJldHVybiB2YWx1ZTtcbn1cbi8vIHVuZGVmaW5lZOunjCDssrTtgaxcbmV4cG9ydCBmdW5jdGlvbiBhc3NlcnREZWZpbmVkPFQ+KHZhbHVlOiBUIHwgdW5kZWZpbmVkLCBtZXNzYWdlPzogc3RyaW5nKTogVCB7XG4gIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UgPz8gXCJWYWx1ZSBtdXN0IGJlIGRlZmluZWRcIik7XG4gIH1cbiAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyBsb2Rhc2ggY2h1bmsg64yA7LK0IChyYWRhc2ggY2x1c3RlciDsgqzsmqkpXG5leHBvcnQgZnVuY3Rpb24gY2h1bms8VD4oYXJyYXk6IFRbXSwgc2l6ZTogbnVtYmVyKTogVFtdW10ge1xuICByZXR1cm4gY2x1c3RlcihhcnJheSwgTWF0aC5jZWlsKGFycmF5Lmxlbmd0aCAvIHNpemUpKTtcbn1cbi8vIGxvZGFzaCBpbnRlcnNlY3Rpb25CeSDrjIDssrRcbmV4cG9ydCBmdW5jdGlvbiBpbnRlcnNlY3Rpb25CeTxULCBLPihcbiAgYXJyMTogcmVhZG9ubHkgVFtdLFxuICBhcnIyOiByZWFkb25seSBUW10sXG4gIGl0ZXJhdGVlOiAoaXRlbTogVCkgPT4gSyxcbik6IFRbXSB7XG4gIGNvbnN0IGFycjJLZXlzID0gbmV3IFNldChhcnIyLm1hcChpdGVyYXRlZSkpO1xuICByZXR1cm4gYXJyMS5maWx0ZXIoKGl0ZW0pID0+IGFycjJLZXlzLmhhcyhpdGVyYXRlZShpdGVtKSkpO1xufVxuLy8gbG9kYXNoIGRpZmZlcmVuY2VXaXRoIOuMgOyytFxuZXhwb3J0IGZ1bmN0aW9uIGRpZmZlcmVuY2VXaXRoPFQ+KFxuICBhcnIxOiByZWFkb25seSBUW10sXG4gIGFycjI6IHJlYWRvbmx5IFRbXSxcbiAgY29tcGFyYXRvcjogKGE6IFQsIGI6IFQpID0+IGJvb2xlYW4sXG4pOiBUW10ge1xuICByZXR1cm4gYXJyMS5maWx0ZXIoKGl0ZW1BKSA9PiAhYXJyMi5zb21lKChpdGVtQikgPT4gY29tcGFyYXRvcihpdGVtQSwgaXRlbUIpKSk7XG59XG4iXSwibmFtZXMiOlsiZnMiLCJwYXRoIiwiY2x1c3RlciIsImZpbmRBcHBSb290UGF0aCIsImFwaVJvb3RQYXRoIiwiZmluZEFwaVJvb3RQYXRoIiwic3BsaXQiLCJzZXAiLCJzbGljZSIsImpvaW4iLCJ3b3Jrc3BhY2VQYXRoIiwicHJvY2VzcyIsImVudiIsIlBOUE1fU0NSSVBUX1NSQ19ESVIiLCJJTklUX0NXRCIsIm5vbk51bGxhYmxlIiwiUE5QTV9QQUNLQUdFX05BTUUiLCJjd2QiLCJiYXNlUGF0aCIsImZpbGVuYW1lIiwiZGlyIiwiZGlybmFtZSIsImluY2x1ZGVzIiwiZXhpc3RzU3luYyIsImxlbmd0aCIsIkVycm9yIiwidmFsdWUiLCJ1bmRlZmluZWQiLCJleGhhdXN0aXZlIiwiX3BhcmFtIiwiYXNzZXJ0RXhpc3RzIiwibWVzc2FnZSIsImFzc2VydE5vdE51bGwiLCJhc3NlcnREZWZpbmVkIiwiY2h1bmsiLCJhcnJheSIsInNpemUiLCJNYXRoIiwiY2VpbCIsImludGVyc2VjdGlvbkJ5IiwiYXJyMSIsImFycjIiLCJpdGVyYXRlZSIsImFycjJLZXlzIiwiU2V0IiwibWFwIiwiZmlsdGVyIiwiaXRlbSIsImhhcyIsImRpZmZlcmVuY2VXaXRoIiwiY29tcGFyYXRvciIsIml0ZW1BIiwic29tZSIsIml0ZW1CIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxRQUFRLEtBQUs7QUFDcEIsT0FBT0MsVUFBVSxPQUFPO0FBQ3hCLFNBQVNDLE9BQU8sUUFBUSxVQUFVO0FBR2xDLE9BQU8sZUFBZUM7SUFDcEIsTUFBTUMsY0FBY0M7SUFDcEIsT0FBT0QsWUFBWUUsS0FBSyxDQUFDTCxLQUFLTSxHQUFHLEVBQUVDLEtBQUssQ0FBQyxHQUFHLENBQUMsR0FBR0MsSUFBSSxDQUFDUixLQUFLTSxHQUFHO0FBQy9EO0FBRUEsT0FBTyxTQUFTRjtJQUNkLGlEQUFpRDtJQUNqRCw4REFBOEQ7SUFDOUQsTUFBTUssZ0JBQWdCQyxRQUFRQyxHQUFHLENBQUNDLG1CQUFtQixJQUFJRixRQUFRQyxHQUFHLENBQUNFLFFBQVE7SUFDN0UsSUFBSUMsWUFBWUwsZ0JBQWdCO1FBQzlCLE9BQU9BO0lBQ1Q7SUFFQSxJQUFJSyxZQUFZSixRQUFRQyxHQUFHLENBQUNJLGlCQUFpQixHQUFHO1FBQzlDLE9BQU9MLFFBQVFNLEdBQUcsR0FBR1gsS0FBSyxDQUFDTCxLQUFLTSxHQUFHLEVBQUVFLElBQUksQ0FBQ1IsS0FBS00sR0FBRztJQUNwRDtJQUVBLE1BQU1XLFdBQVcsWUFBWUMsUUFBUTtJQUNyQyxJQUFJQyxNQUFNbkIsS0FBS29CLE9BQU8sQ0FBQ0g7SUFDdkIsSUFBSUUsSUFBSUUsUUFBUSxDQUFDLFlBQVk7UUFDM0JGLE1BQU1BLElBQUlkLEtBQUssQ0FBQyxVQUFVLENBQUMsRUFBRTtJQUMvQjtJQUVBLEdBQUc7UUFDRCxJQUFJTixHQUFHdUIsVUFBVSxDQUFDdEIsS0FBS1EsSUFBSSxDQUFDVyxLQUFLLG1CQUFtQjtZQUNsRCxPQUFPQSxJQUFJZCxLQUFLLENBQUNMLEtBQUtNLEdBQUcsRUFBRUUsSUFBSSxDQUFDUixLQUFLTSxHQUFHO1FBQzFDO1FBQ0FhLE1BQU1BLElBQUlkLEtBQUssQ0FBQ0wsS0FBS00sR0FBRyxFQUFFQyxLQUFLLENBQUMsR0FBRyxDQUFDLEdBQUdDLElBQUksQ0FBQ1IsS0FBS00sR0FBRztJQUN0RCxRQUFTYSxJQUFJZCxLQUFLLENBQUNMLEtBQUtNLEdBQUcsRUFBRWlCLE1BQU0sR0FBRyxFQUFHO0lBQ3pDLE1BQU0sSUFBSUMsTUFBTTtBQUNsQjtBQUVBLE9BQU8sU0FBU1YsWUFBZVcsS0FBUTtJQUNyQyxPQUFPQSxVQUFVLFFBQVFBLFVBQVVDO0FBQ3JDO0FBRUEsT0FBTyxTQUFTQyxXQUFXQyxNQUFhO0lBQ3RDLE1BQU0sSUFBSUosTUFBTSxDQUFDLFVBQVUsQ0FBQztBQUM5QjtBQUVBLFFBQVE7QUFDUixPQUFPLFNBQVNLLGFBQWdCSixLQUEyQixFQUFFSyxPQUFnQjtJQUMzRSxJQUFJTCxVQUFVLFFBQVFBLFVBQVVDLFdBQVc7UUFDekMsTUFBTSxJQUFJRixNQUFNTSxXQUFXO0lBQzdCO0lBQ0EsT0FBT0w7QUFDVDtBQUVBLFdBQVc7QUFDWCxPQUFPLFNBQVNNLGNBQWlCTixLQUFlLEVBQUVLLE9BQWdCO0lBQ2hFLElBQUlMLFVBQVUsTUFBTTtRQUNsQixNQUFNLElBQUlELE1BQU1NLFdBQVc7SUFDN0I7SUFDQSxPQUFPTDtBQUNUO0FBQ0EsZ0JBQWdCO0FBQ2hCLE9BQU8sU0FBU08sY0FBaUJQLEtBQW9CLEVBQUVLLE9BQWdCO0lBQ3JFLElBQUlMLFVBQVVDLFdBQVc7UUFDdkIsTUFBTSxJQUFJRixNQUFNTSxXQUFXO0lBQzdCO0lBQ0EsT0FBT0w7QUFDVDtBQUVBLHNDQUFzQztBQUN0QyxPQUFPLFNBQVNRLE1BQVNDLEtBQVUsRUFBRUMsSUFBWTtJQUMvQyxPQUFPbEMsUUFBUWlDLE9BQU9FLEtBQUtDLElBQUksQ0FBQ0gsTUFBTVgsTUFBTSxHQUFHWTtBQUNqRDtBQUNBLDJCQUEyQjtBQUMzQixPQUFPLFNBQVNHLGVBQ2RDLElBQWtCLEVBQ2xCQyxJQUFrQixFQUNsQkMsUUFBd0I7SUFFeEIsTUFBTUMsV0FBVyxJQUFJQyxJQUFJSCxLQUFLSSxHQUFHLENBQUNIO0lBQ2xDLE9BQU9GLEtBQUtNLE1BQU0sQ0FBQyxDQUFDQyxPQUFTSixTQUFTSyxHQUFHLENBQUNOLFNBQVNLO0FBQ3JEO0FBQ0EsMkJBQTJCO0FBQzNCLE9BQU8sU0FBU0UsZUFDZFQsSUFBa0IsRUFDbEJDLElBQWtCLEVBQ2xCUyxVQUFtQztJQUVuQyxPQUFPVixLQUFLTSxNQUFNLENBQUMsQ0FBQ0ssUUFBVSxDQUFDVixLQUFLVyxJQUFJLENBQUMsQ0FBQ0MsUUFBVUgsV0FBV0MsT0FBT0U7QUFDeEUifQ==
@@ -1,4 +1,4 @@
1
- import { z } from 'zod';
1
+ import type { z } from "zod";
2
2
  type ValidationError = {
3
3
  path: string[];
4
4
  message: string;
@@ -1 +1 @@
1
- {"version":3,"file":"zod-error.d.ts","sourceRoot":"","sources":["../../src/utils/zod-error.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,eAAe,EAAE,CAgBrE"}
1
+ {"version":3,"file":"zod-error.d.ts","sourceRoot":"","sources":["../../src/utils/zod-error.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,KAAK,eAAe,GAAG;IACrB,IAAI,EAAE,MAAM,EAAE,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;CACjB,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,CAAC,CAAC,QAAQ,GAAG,eAAe,EAAE,CAgBrE"}
@@ -16,4 +16,4 @@ export function humanizeZodError(error) {
16
16
  });
17
17
  }
18
18
 
19
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy96b2QtZXJyb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgeiB9IGZyb20gJ3pvZCc7XG5cbnR5cGUgVmFsaWRhdGlvbkVycm9yID0ge1xuICBwYXRoOiBzdHJpbmdbXTtcbiAgbWVzc2FnZTogc3RyaW5nO1xufTtcblxuZXhwb3J0IGZ1bmN0aW9uIGh1bWFuaXplWm9kRXJyb3IoZXJyb3I6IHouWm9kRXJyb3IpOiBWYWxpZGF0aW9uRXJyb3JbXSB7XG4gIHJldHVybiBlcnJvci5pc3N1ZXMubWFwKCh7ICBwYXRoOiBvcmlnaW5QYXRoLCBtZXNzYWdlIH0pID0+IHtcbiAgICBjb25zdCBwYXRoID0gb3JpZ2luUGF0aC5tYXAoaXRlbSA9PiB7XG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwic3ltYm9sXCIpIHtcbiAgICAgICAgcmV0dXJuIGl0ZW0uZGVzY3JpcHRpb24gPz8gaXRlbS50b1N0cmluZygpO1xuICAgICAgfVxuXG4gICAgICBpZiAodHlwZW9mIGl0ZW0gPT09IFwibnVtYmVyXCIpIHtcbiAgICAgICAgcmV0dXJuIGBbJHtpdGVtfV1gO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gaXRlbTtcbiAgICB9KTtcblxuICAgIHJldHVybiB7IHBhdGgsIG1lc3NhZ2U6IG1lc3NhZ2UgfTtcbiAgfSk7XG59XG4iXSwibmFtZXMiOlsiaHVtYW5pemVab2RFcnJvciIsImVycm9yIiwiaXNzdWVzIiwibWFwIiwicGF0aCIsIm9yaWdpblBhdGgiLCJtZXNzYWdlIiwiaXRlbSIsImRlc2NyaXB0aW9uIiwidG9TdHJpbmciXSwibWFwcGluZ3MiOiJBQU9BLE9BQU8sU0FBU0EsaUJBQWlCQyxLQUFpQjtJQUNoRCxPQUFPQSxNQUFNQyxNQUFNLENBQUNDLEdBQUcsQ0FBQyxDQUFDLEVBQUdDLE1BQU1DLFVBQVUsRUFBRUMsT0FBTyxFQUFFO1FBQ3JELE1BQU1GLE9BQU9DLFdBQVdGLEdBQUcsQ0FBQ0ksQ0FBQUE7WUFDMUIsSUFBSSxPQUFPQSxTQUFTLFVBQVU7Z0JBQzVCLE9BQU9BLEtBQUtDLFdBQVcsSUFBSUQsS0FBS0UsUUFBUTtZQUMxQztZQUVBLElBQUksT0FBT0YsU0FBUyxVQUFVO2dCQUM1QixPQUFPLENBQUMsQ0FBQyxFQUFFQSxLQUFLLENBQUMsQ0FBQztZQUNwQjtZQUVBLE9BQU9BO1FBQ1Q7UUFFQSxPQUFPO1lBQUVIO1lBQU1FLFNBQVNBO1FBQVE7SUFDbEM7QUFDRiJ9
19
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy96b2QtZXJyb3IudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyB6IH0gZnJvbSBcInpvZFwiO1xuXG50eXBlIFZhbGlkYXRpb25FcnJvciA9IHtcbiAgcGF0aDogc3RyaW5nW107XG4gIG1lc3NhZ2U6IHN0cmluZztcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBodW1hbml6ZVpvZEVycm9yKGVycm9yOiB6LlpvZEVycm9yKTogVmFsaWRhdGlvbkVycm9yW10ge1xuICByZXR1cm4gZXJyb3IuaXNzdWVzLm1hcCgoeyBwYXRoOiBvcmlnaW5QYXRoLCBtZXNzYWdlIH0pID0+IHtcbiAgICBjb25zdCBwYXRoID0gb3JpZ2luUGF0aC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJzeW1ib2xcIikge1xuICAgICAgICByZXR1cm4gaXRlbS5kZXNjcmlwdGlvbiA/PyBpdGVtLnRvU3RyaW5nKCk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlbSA9PT0gXCJudW1iZXJcIikge1xuICAgICAgICByZXR1cm4gYFske2l0ZW19XWA7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiBpdGVtO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgcGF0aCwgbWVzc2FnZTogbWVzc2FnZSB9O1xuICB9KTtcbn1cbiJdLCJuYW1lcyI6WyJodW1hbml6ZVpvZEVycm9yIiwiZXJyb3IiLCJpc3N1ZXMiLCJtYXAiLCJwYXRoIiwib3JpZ2luUGF0aCIsIm1lc3NhZ2UiLCJpdGVtIiwiZGVzY3JpcHRpb24iLCJ0b1N0cmluZyJdLCJtYXBwaW5ncyI6IkFBT0EsT0FBTyxTQUFTQSxpQkFBaUJDLEtBQWlCO0lBQ2hELE9BQU9BLE1BQU1DLE1BQU0sQ0FBQ0MsR0FBRyxDQUFDLENBQUMsRUFBRUMsTUFBTUMsVUFBVSxFQUFFQyxPQUFPLEVBQUU7UUFDcEQsTUFBTUYsT0FBT0MsV0FBV0YsR0FBRyxDQUFDLENBQUNJO1lBQzNCLElBQUksT0FBT0EsU0FBUyxVQUFVO2dCQUM1QixPQUFPQSxLQUFLQyxXQUFXLElBQUlELEtBQUtFLFFBQVE7WUFDMUM7WUFFQSxJQUFJLE9BQU9GLFNBQVMsVUFBVTtnQkFDNUIsT0FBTyxDQUFDLENBQUMsRUFBRUEsS0FBSyxDQUFDLENBQUM7WUFDcEI7WUFFQSxPQUFPQTtRQUNUO1FBRUEsT0FBTztZQUFFSDtZQUFNRSxTQUFTQTtRQUFRO0lBQ2xDO0FBQ0YifQ==
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sonamu",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "description": "Sonamu — TypeScript Fullstack API Framework",
5
5
  "keywords": [
6
6
  "typescript",
@@ -13,15 +13,21 @@
13
13
  "import": "./dist/index.js",
14
14
  "types": "./dist/index.d.ts"
15
15
  },
16
+ "./ai": {
17
+ "import": "./dist/ai/index.js",
18
+ "types": "./dist/ai/index.d.ts"
19
+ },
20
+ "./ai/providers/rtzr": {
21
+ "import": "./dist/ai/providers/rtzr/index.js",
22
+ "types": "./dist/ai/providers/rtzr/index.d.ts"
23
+ },
24
+ "./loader-register": {
25
+ "default": "./dist/bin/loader-register.js"
26
+ },
16
27
  "./hot-hook-register": {
17
28
  "default": "./dist/bin/hot-hook-register.js"
18
29
  }
19
30
  },
20
- "scripts": {
21
- "dev": "nodemon exec",
22
- "build": "rm -rf dist && swc src -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
23
- "publish": "yarn build && yarn npm publish"
24
- },
25
31
  "license": "MIT",
26
32
  "author": {
27
33
  "name": "Minsang Kim",
@@ -32,71 +38,90 @@
32
38
  "type": "git",
33
39
  "url": "https://github.com/ping-alive/sonamu.git"
34
40
  },
35
- "bin": "./dist/bin/cli-wrapper.js",
41
+ "bin": "./bin/cli.js",
36
42
  "files": [
37
43
  "dist",
38
- "src"
44
+ "src",
45
+ "bin",
46
+ ".swcrc.project-default"
39
47
  ],
40
48
  "dependencies": {
41
49
  "@aws-sdk/client-s3": "^3.921.0",
42
50
  "@aws-sdk/s3-request-presigner": "^3.921.0",
51
+ "@biomejs/js-api": "^4.0.0",
52
+ "@biomejs/wasm-nodejs": "^2.3.7",
43
53
  "@fastify/cors": "^8.1.0",
44
54
  "@fastify/formbody": "^7.1.0",
45
55
  "@fastify/multipart": "^8",
46
56
  "@fastify/passport": "^2.2.0",
47
- "@fastify/secure-session": "^5.2.0",
57
+ "@fastify/secure-session": "^7",
48
58
  "@fastify/static": "^7",
49
59
  "@swc/core": "^1.13.19",
50
60
  "chalk": "^4.1.2",
51
61
  "chokidar": "^4.0.3",
52
- "date-fns": "^4.1.0",
53
62
  "date-fns-tz": "^3.2.0",
54
63
  "dotenv": "^16.0.2",
55
64
  "fast-deep-equal": "^3.1.3",
56
65
  "fastify": "^4.23.2",
57
66
  "fastify-qs": "^4.0.0",
58
67
  "fastify-sse-v2": "^4.2.1",
59
- "flydrive": "^1.3.0",
60
68
  "inflection": "^1.13.2",
61
69
  "knex": "^3.1.0",
62
- "lodash": "^4.17.21",
63
- "lodash-es": "^4.17.21",
64
- "luxon": "^3.0.3",
65
70
  "mime-types": "^3.0.1",
66
71
  "minimatch": "^10.0.3",
67
- "mysql2": "^3.6.1",
68
72
  "node-sql-parser": "^5.2.0",
69
- "nodemon": "^3.1.10",
73
+ "pg": "^8.16.3",
70
74
  "prompts": "^2.4.2",
71
75
  "qs": "^6.11.0",
76
+ "radashi": "^12.2.0",
72
77
  "tsicli": "^1.0.5",
73
- "zod": "^4.1.12"
78
+ "vitest": "^4.0.10",
79
+ "zod": "^4.1.12",
80
+ "@sonamu-kit/hot-runner": "^0.1.1",
81
+ "@sonamu-kit/loader": "^2.1.3",
82
+ "@sonamu-kit/hot-hook": "^0.4.1"
74
83
  },
75
84
  "devDependencies": {
76
- "@sonamu-kit/hot-hook": "^0.4.1",
77
- "@sonamu-kit/ui": "^0.6.0",
85
+ "@biomejs/biome": "^2.3.7",
78
86
  "@swc/cli": "^0.7.8",
79
87
  "@types/inflection": "^1.13.0",
80
- "@types/lodash": "^4.14.198",
81
- "@types/lodash-es": "^4.17.12",
82
- "@types/luxon": "^3.0.1",
83
88
  "@types/mime-types": "^3.0.1",
84
89
  "@types/node": "^22",
85
- "@types/prettier": "^3.0.0",
90
+ "@types/pg": "^8.15.6",
86
91
  "@types/prompts": "^2.0.14",
87
92
  "@types/qs": "^6.9.7",
88
- "prettier": "^3.2.5",
93
+ "nodemon": "3.1.10",
89
94
  "tsup": "^8.1.0",
90
- "typescript": "^5.2.2"
95
+ "typescript": "^5.9.3"
91
96
  },
92
97
  "peerDependencies": {
93
- "@sonamu-kit/hot-runner": "^0.1.1",
94
- "@sonamu-kit/loader": "^2.1.2",
95
98
  "@swc/cli": "^0.7.8",
96
99
  "@swc/core": "^1.13.5",
97
100
  "fastify": "^4.23.2",
98
101
  "knex": "^3.1.0",
99
- "mysql2": "^3.6.1",
100
- "nodemon": "3.1.10"
102
+ "typescript": "^5.9.3",
103
+ "@ai-sdk/openai": "3.0.0-beta.75",
104
+ "@ai-sdk/provider": "3.0.0-beta.22",
105
+ "@ai-sdk/provider-utils": "4.0.0-beta.40",
106
+ "ai": "^6.0.0-beta.99"
107
+ },
108
+ "peerDependenciesMeta": {
109
+ "@ai-sdk/openai": {
110
+ "optional": true
111
+ },
112
+ "@ai-sdk/provider": {
113
+ "optional": true
114
+ },
115
+ "@ai-sdk/provider-utils": {
116
+ "optional": true
117
+ },
118
+ "ai": {
119
+ "optional": true
120
+ }
121
+ },
122
+ "scripts": {
123
+ "dev": "nodemon exec",
124
+ "build": "rm -rf dist && swc src -d dist --strip-leading-paths && tsc --emitDeclarationOnly",
125
+ "test:type": "vitest --typecheck test-d.ts"
101
126
  }
102
127
  }
@@ -0,0 +1,87 @@
1
+ import type { Tool, ToolCallOptions } from "@ai-sdk/provider-utils";
2
+ import { tool } from "@ai-sdk/provider-utils";
3
+ import type { Agent, ToolSet } from "ai";
4
+ import { ToolLoopAgent } from "ai";
5
+ import { AsyncLocalStorage } from "async_hooks";
6
+ import inflection from "inflection";
7
+ import type { AgentConfig, RegisteredToolDefinition, ToolDecoratorOptions } from "./types";
8
+
9
+ const toolDefinitions: RegisteredToolDefinition[] = [];
10
+
11
+ // TODO(Haze, 251205): 텍스트가 아닌 structured output일 경우에 대한 지원이 필요
12
+ export class BaseAgentClass<TStore> {
13
+ private _als = new AsyncLocalStorage<TStore>();
14
+
15
+ public get store() {
16
+ return this._als.getStore();
17
+ }
18
+
19
+ // NOTE: [schemaSymbol] 추론 불가로 인해 캐스팅
20
+ protected get toolSet() {
21
+ const targeted = toolDefinitions.filter((def) => def.from === this.constructor.name);
22
+ return targeted.reduce<Record<string, Tool>>((acc, def) => {
23
+ acc[def.name] = tool({
24
+ description: def.description,
25
+ inputSchema: def.schema.input,
26
+ outputSchema: def.schema.output,
27
+ needsApproval: def.needsApproval ?? false,
28
+ toModelOutput: def.toModelOutput,
29
+ providerOptions: def.providerOptions,
30
+ execute: (input: unknown, options: ToolCallOptions) => {
31
+ const bound = def.method.bind(this);
32
+ return bound.length >= 2 ? bound(input, options) : bound(input);
33
+ },
34
+ });
35
+ return acc;
36
+ }, {}) as ToolSet;
37
+ }
38
+
39
+ public get tools(): ToolSet {
40
+ return this.toolSet;
41
+ }
42
+
43
+ public use<TReturn>(
44
+ config: AgentConfig,
45
+ initialStatus: TStore,
46
+ callback: (agent: Agent<never, ToolSet>) => Promise<TReturn>,
47
+ ) {
48
+ const agent = new ToolLoopAgent({
49
+ ...config,
50
+ tools: this.tools,
51
+ });
52
+
53
+ return this._als.run(initialStatus, () => callback(agent));
54
+ }
55
+ }
56
+
57
+ export function tools<INPUT, OUTPUT = unknown>(options: ToolDecoratorOptions<INPUT, OUTPUT>) {
58
+ const { name, description, schema, needsApproval, toModelOutput, providerOptions } = options;
59
+ return (target: BaseAgentClass<unknown>, propertyKey: string, descriptor: PropertyDescriptor) => {
60
+ if (!(target instanceof BaseAgentClass)) {
61
+ throw new Error("Target must be a subclass of BaseAgentClass");
62
+ }
63
+
64
+ const method = descriptor.value;
65
+ const modelName = target.constructor.name.match(/(.+)Class$/)?.[1];
66
+ const methodName = propertyKey;
67
+
68
+ const defaultPath =
69
+ modelName !== undefined
70
+ ? `${inflection.camelize(
71
+ (modelName ?? "").replace(/Model$/, "").replace(/Frame$/, ""),
72
+ true,
73
+ )}.${inflection.camelize(methodName, true)}`
74
+ : inflection.camelize(methodName, true);
75
+
76
+ toolDefinitions.push({
77
+ name: name ?? defaultPath,
78
+ description,
79
+ schema,
80
+ needsApproval,
81
+ toModelOutput,
82
+ providerOptions,
83
+ method,
84
+ from: target.constructor.name,
85
+ });
86
+ };
87
+ }
@@ -0,0 +1,2 @@
1
+ export * from "./agent";
2
+ export * from "./types";