sonamu 0.6.0 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (406) hide show
  1. package/.swcrc.project-default +18 -0
  2. package/bin/cli.js +24 -0
  3. package/dist/ai/agents/agent.d.ts +11 -0
  4. package/dist/ai/agents/agent.d.ts.map +1 -0
  5. package/dist/ai/agents/agent.js +65 -0
  6. package/dist/ai/agents/index.d.ts +3 -0
  7. package/dist/ai/agents/index.d.ts.map +1 -0
  8. package/dist/ai/agents/index.js +4 -0
  9. package/dist/ai/agents/types.d.ts +43 -0
  10. package/dist/ai/agents/types.d.ts.map +1 -0
  11. package/dist/ai/agents/types.js +3 -0
  12. package/dist/ai/index.d.ts +2 -0
  13. package/dist/ai/index.d.ts.map +1 -0
  14. package/dist/ai/index.js +3 -0
  15. package/dist/ai/providers/rtzr/api.d.ts +22 -0
  16. package/dist/ai/providers/rtzr/api.d.ts.map +1 -0
  17. package/dist/ai/providers/rtzr/api.js +28 -0
  18. package/dist/ai/providers/rtzr/error.d.ts +18 -0
  19. package/dist/ai/providers/rtzr/error.d.ts.map +1 -0
  20. package/dist/ai/providers/rtzr/error.js +29 -0
  21. package/dist/ai/providers/rtzr/index.d.ts +5 -0
  22. package/dist/ai/providers/rtzr/index.d.ts.map +1 -0
  23. package/dist/ai/providers/rtzr/index.js +6 -0
  24. package/dist/ai/providers/rtzr/model.d.ts +52 -0
  25. package/dist/ai/providers/rtzr/model.d.ts.map +1 -0
  26. package/dist/ai/providers/rtzr/model.js +137 -0
  27. package/dist/ai/providers/rtzr/options.d.ts +7 -0
  28. package/dist/ai/providers/rtzr/options.d.ts.map +1 -0
  29. package/dist/ai/providers/rtzr/options.js +47 -0
  30. package/dist/ai/providers/rtzr/provider.d.ts +18 -0
  31. package/dist/ai/providers/rtzr/provider.d.ts.map +1 -0
  32. package/dist/ai/providers/rtzr/provider.js +54 -0
  33. package/dist/ai/providers/rtzr/utils.d.ts +19 -0
  34. package/dist/ai/providers/rtzr/utils.d.ts.map +1 -0
  35. package/dist/ai/providers/rtzr/utils.js +88 -0
  36. package/dist/api/base-frame.d.ts +2 -2
  37. package/dist/api/base-frame.d.ts.map +1 -1
  38. package/dist/api/base-frame.js +2 -1
  39. package/dist/api/caster.d.ts.map +1 -1
  40. package/dist/api/caster.js +6 -1
  41. package/dist/api/code-converters.d.ts +58 -14
  42. package/dist/api/code-converters.d.ts.map +1 -1
  43. package/dist/api/code-converters.js +178 -409
  44. package/dist/api/config.d.ts +27 -13
  45. package/dist/api/config.d.ts.map +1 -1
  46. package/dist/api/config.js +19 -26
  47. package/dist/api/context.d.ts +4 -3
  48. package/dist/api/context.d.ts.map +1 -1
  49. package/dist/api/context.js +1 -1
  50. package/dist/api/decorators.d.ts +20 -6
  51. package/dist/api/decorators.d.ts.map +1 -1
  52. package/dist/api/decorators.js +111 -18
  53. package/dist/api/index.d.ts +2 -2
  54. package/dist/api/index.d.ts.map +1 -1
  55. package/dist/api/index.js +3 -3
  56. package/dist/api/sonamu.d.ts +7 -7
  57. package/dist/api/sonamu.d.ts.map +1 -1
  58. package/dist/api/sonamu.js +83 -51
  59. package/dist/api/validator.d.ts +6 -0
  60. package/dist/api/validator.d.ts.map +1 -0
  61. package/dist/api/validator.js +81 -0
  62. package/dist/bin/build-config.d.ts +5 -1
  63. package/dist/bin/build-config.d.ts.map +1 -1
  64. package/dist/bin/build-config.js +5 -2
  65. package/dist/bin/cli.js +165 -64
  66. package/dist/bin/loader-register.d.ts +2 -0
  67. package/dist/bin/loader-register.d.ts.map +1 -0
  68. package/dist/bin/loader-register.js +34 -0
  69. package/dist/database/_batch_update.d.ts +5 -3
  70. package/dist/database/_batch_update.d.ts.map +1 -1
  71. package/dist/database/_batch_update.js +30 -13
  72. package/dist/database/base-model.d.ts +96 -10
  73. package/dist/database/base-model.d.ts.map +1 -1
  74. package/dist/database/base-model.js +232 -89
  75. package/dist/database/base-model.types.d.ts +93 -0
  76. package/dist/database/base-model.types.d.ts.map +1 -0
  77. package/dist/database/base-model.types.js +10 -0
  78. package/dist/database/code-generator.d.ts +1 -1
  79. package/dist/database/code-generator.d.ts.map +1 -1
  80. package/dist/database/code-generator.js +11 -10
  81. package/dist/database/db.d.ts +5 -6
  82. package/dist/database/db.d.ts.map +1 -1
  83. package/dist/database/db.js +22 -25
  84. package/dist/database/puri-subset.test-d.js +81 -0
  85. package/dist/database/puri-subset.types.d.ts +123 -0
  86. package/dist/database/puri-subset.types.d.ts.map +1 -0
  87. package/dist/database/puri-subset.types.js +16 -0
  88. package/dist/database/puri-wrapper.d.ts +13 -11
  89. package/dist/database/puri-wrapper.d.ts.map +1 -1
  90. package/dist/database/puri-wrapper.js +2 -2
  91. package/dist/database/puri.d.ts +25 -14
  92. package/dist/database/puri.d.ts.map +1 -1
  93. package/dist/database/puri.js +83 -21
  94. package/dist/database/puri.types.d.ts +21 -7
  95. package/dist/database/puri.types.d.ts.map +1 -1
  96. package/dist/database/puri.types.js +4 -1
  97. package/dist/database/transaction-context.d.ts +1 -1
  98. package/dist/database/transaction-context.d.ts.map +1 -1
  99. package/dist/database/transaction-context.js +1 -1
  100. package/dist/database/upsert-builder.d.ts +9 -3
  101. package/dist/database/upsert-builder.d.ts.map +1 -1
  102. package/dist/database/upsert-builder.js +228 -78
  103. package/dist/entity/entity-manager.d.ts +165 -2
  104. package/dist/entity/entity-manager.d.ts.map +1 -1
  105. package/dist/entity/entity-manager.js +26 -10
  106. package/dist/entity/entity.d.ts +5 -3
  107. package/dist/entity/entity.d.ts.map +1 -1
  108. package/dist/entity/entity.js +153 -54
  109. package/dist/exceptions/error-handler.d.ts +1 -1
  110. package/dist/exceptions/error-handler.d.ts.map +1 -1
  111. package/dist/exceptions/error-handler.js +1 -1
  112. package/dist/exceptions/so-exceptions.d.ts +1 -1
  113. package/dist/exceptions/so-exceptions.d.ts.map +1 -1
  114. package/dist/exceptions/so-exceptions.js +1 -1
  115. package/dist/file-storage/driver.d.ts +1 -1
  116. package/dist/file-storage/driver.d.ts.map +1 -1
  117. package/dist/file-storage/driver.js +1 -1
  118. package/dist/file-storage/file-storage.js +2 -2
  119. package/dist/index.d.ts +18 -11
  120. package/dist/index.d.ts.map +1 -1
  121. package/dist/index.js +19 -13
  122. package/dist/migration/code-generation.d.ts +1 -1
  123. package/dist/migration/code-generation.d.ts.map +1 -1
  124. package/dist/migration/code-generation.js +123 -67
  125. package/dist/migration/migration-set.d.ts +2 -10
  126. package/dist/migration/migration-set.d.ts.map +1 -1
  127. package/dist/migration/migration-set.js +67 -218
  128. package/dist/migration/migrator.d.ts +24 -73
  129. package/dist/migration/migrator.d.ts.map +1 -1
  130. package/dist/migration/migrator.js +121 -301
  131. package/dist/migration/postgresql-schema-reader.d.ts +51 -0
  132. package/dist/migration/postgresql-schema-reader.d.ts.map +1 -0
  133. package/dist/migration/postgresql-schema-reader.js +245 -0
  134. package/dist/migration/types.d.ts +6 -38
  135. package/dist/migration/types.d.ts.map +1 -1
  136. package/dist/migration/types.js +1 -1
  137. package/dist/naite/messaging-types.d.ts +43 -0
  138. package/dist/naite/messaging-types.d.ts.map +1 -0
  139. package/dist/naite/messaging-types.js +7 -0
  140. package/dist/naite/naite-reporter.d.ts +41 -0
  141. package/dist/naite/naite-reporter.d.ts.map +1 -0
  142. package/dist/naite/naite-reporter.js +102 -0
  143. package/dist/naite/naite.d.ts +91 -8
  144. package/dist/naite/naite.d.ts.map +1 -1
  145. package/dist/naite/naite.js +285 -41
  146. package/dist/stream/sse.d.ts +2 -2
  147. package/dist/stream/sse.d.ts.map +1 -1
  148. package/dist/stream/sse.js +1 -1
  149. package/dist/syncer/api-parser.d.ts +3 -13
  150. package/dist/syncer/api-parser.d.ts.map +1 -1
  151. package/dist/syncer/api-parser.js +67 -56
  152. package/dist/syncer/checksum.d.ts +2 -2
  153. package/dist/syncer/checksum.d.ts.map +1 -1
  154. package/dist/syncer/checksum.js +11 -11
  155. package/dist/syncer/code-generator.d.ts +3 -3
  156. package/dist/syncer/code-generator.d.ts.map +1 -1
  157. package/dist/syncer/code-generator.js +37 -17
  158. package/dist/syncer/entity-operations.d.ts +2 -2
  159. package/dist/syncer/entity-operations.d.ts.map +1 -1
  160. package/dist/syncer/entity-operations.js +9 -8
  161. package/dist/syncer/file-patterns.d.ts +1 -1
  162. package/dist/syncer/file-patterns.d.ts.map +1 -1
  163. package/dist/syncer/file-patterns.js +1 -1
  164. package/dist/syncer/index.d.ts +4 -4
  165. package/dist/syncer/index.d.ts.map +1 -1
  166. package/dist/syncer/index.js +5 -5
  167. package/dist/syncer/module-loader.d.ts +4 -4
  168. package/dist/syncer/module-loader.d.ts.map +1 -1
  169. package/dist/syncer/module-loader.js +17 -12
  170. package/dist/syncer/syncer.d.ts +31 -24
  171. package/dist/syncer/syncer.d.ts.map +1 -1
  172. package/dist/syncer/syncer.js +92 -45
  173. package/dist/template/entity-converter.d.ts +1 -1
  174. package/dist/template/entity-converter.d.ts.map +1 -1
  175. package/dist/template/entity-converter.js +15 -8
  176. package/dist/template/helpers.d.ts +2 -2
  177. package/dist/template/helpers.d.ts.map +1 -1
  178. package/dist/template/helpers.js +3 -3
  179. package/dist/template/implementations/entity.template.d.ts +2 -2
  180. package/dist/template/implementations/entity.template.d.ts.map +1 -1
  181. package/dist/template/implementations/entity.template.js +4 -5
  182. package/dist/template/implementations/generated.template.d.ts +2 -3
  183. package/dist/template/implementations/generated.template.d.ts.map +1 -1
  184. package/dist/template/implementations/generated.template.js +46 -29
  185. package/dist/template/implementations/generated_http.template.d.ts +2 -3
  186. package/dist/template/implementations/generated_http.template.d.ts.map +1 -1
  187. package/dist/template/implementations/generated_http.template.js +9 -9
  188. package/dist/template/implementations/generated_sso.template.d.ts +3 -4
  189. package/dist/template/implementations/generated_sso.template.d.ts.map +1 -1
  190. package/dist/template/implementations/generated_sso.template.js +54 -25
  191. package/dist/template/implementations/init_types.template.d.ts +2 -2
  192. package/dist/template/implementations/init_types.template.d.ts.map +1 -1
  193. package/dist/template/implementations/init_types.template.js +2 -2
  194. package/dist/template/implementations/model.template.d.ts +2 -2
  195. package/dist/template/implementations/model.template.d.ts.map +1 -1
  196. package/dist/template/implementations/model.template.js +47 -37
  197. package/dist/template/implementations/model_test.template.d.ts +2 -2
  198. package/dist/template/implementations/model_test.template.d.ts.map +1 -1
  199. package/dist/template/implementations/model_test.template.js +2 -2
  200. package/dist/template/implementations/service.template.d.ts +4 -4
  201. package/dist/template/implementations/service.template.d.ts.map +1 -1
  202. package/dist/template/implementations/service.template.js +24 -16
  203. package/dist/template/implementations/view_enums_buttonset.template.d.ts +2 -2
  204. package/dist/template/implementations/view_enums_buttonset.template.d.ts.map +1 -1
  205. package/dist/template/implementations/view_enums_buttonset.template.js +1 -1
  206. package/dist/template/implementations/view_enums_dropdown.template.d.ts +2 -2
  207. package/dist/template/implementations/view_enums_dropdown.template.d.ts.map +1 -1
  208. package/dist/template/implementations/view_enums_dropdown.template.js +2 -2
  209. package/dist/template/implementations/view_enums_select.template.d.ts +2 -2
  210. package/dist/template/implementations/view_enums_select.template.d.ts.map +1 -1
  211. package/dist/template/implementations/view_enums_select.template.js +2 -2
  212. package/dist/template/implementations/view_form.template.d.ts +2 -2
  213. package/dist/template/implementations/view_form.template.d.ts.map +1 -1
  214. package/dist/template/implementations/view_form.template.js +4 -4
  215. package/dist/template/implementations/view_id_all_select.template.d.ts +2 -2
  216. package/dist/template/implementations/view_id_all_select.template.d.ts.map +1 -1
  217. package/dist/template/implementations/view_id_all_select.template.js +1 -1
  218. package/dist/template/implementations/view_id_async_select.template.d.ts +2 -2
  219. package/dist/template/implementations/view_id_async_select.template.d.ts.map +1 -1
  220. package/dist/template/implementations/view_id_async_select.template.js +1 -1
  221. package/dist/template/implementations/view_list.template.d.ts +2 -2
  222. package/dist/template/implementations/view_list.template.d.ts.map +1 -1
  223. package/dist/template/implementations/view_list.template.js +29 -19
  224. package/dist/template/implementations/view_list_columns.template.d.ts +3 -3
  225. package/dist/template/implementations/view_list_columns.template.d.ts.map +1 -1
  226. package/dist/template/implementations/view_list_columns.template.js +1 -1
  227. package/dist/template/implementations/view_search_input.template.d.ts +2 -2
  228. package/dist/template/implementations/view_search_input.template.d.ts.map +1 -1
  229. package/dist/template/implementations/view_search_input.template.js +1 -1
  230. package/dist/template/index.d.ts +4 -2
  231. package/dist/template/index.d.ts.map +1 -1
  232. package/dist/template/index.js +5 -3
  233. package/dist/template/template-manager.d.ts +56 -0
  234. package/dist/template/template-manager.d.ts.map +1 -0
  235. package/dist/template/template-manager.js +125 -0
  236. package/dist/template/template-types.d.ts +16 -0
  237. package/dist/template/template-types.d.ts.map +1 -0
  238. package/dist/template/template-types.js +7 -0
  239. package/dist/template/template.d.ts +12 -2
  240. package/dist/template/template.d.ts.map +1 -1
  241. package/dist/template/template.js +19 -6
  242. package/dist/template/zod-converter.d.ts +40 -7
  243. package/dist/template/zod-converter.d.ts.map +1 -1
  244. package/dist/template/zod-converter.js +341 -58
  245. package/dist/testing/_relation-graph.d.ts +1 -1
  246. package/dist/testing/_relation-graph.d.ts.map +1 -1
  247. package/dist/testing/_relation-graph.js +12 -3
  248. package/dist/testing/fixture-manager.d.ts +42 -11
  249. package/dist/testing/fixture-manager.d.ts.map +1 -1
  250. package/dist/testing/fixture-manager.js +338 -236
  251. package/dist/types/types.d.ts +709 -104
  252. package/dist/types/types.d.ts.map +1 -1
  253. package/dist/types/types.js +309 -52
  254. package/dist/typings/knex.d.js +2 -2
  255. package/dist/utils/async-utils.d.ts.map +1 -1
  256. package/dist/utils/async-utils.js +3 -3
  257. package/dist/utils/console-util.js +1 -1
  258. package/dist/utils/controller.d.ts +1 -0
  259. package/dist/utils/controller.d.ts.map +1 -1
  260. package/dist/utils/controller.js +4 -1
  261. package/dist/utils/esm-utils.d.ts +0 -6
  262. package/dist/utils/esm-utils.d.ts.map +1 -1
  263. package/dist/utils/esm-utils.js +2 -9
  264. package/dist/utils/formatter.d.ts +3 -0
  265. package/dist/utils/formatter.d.ts.map +1 -0
  266. package/dist/utils/formatter.js +110 -0
  267. package/dist/utils/fs-utils.d.ts +1 -1
  268. package/dist/utils/fs-utils.d.ts.map +1 -1
  269. package/dist/utils/fs-utils.js +1 -1
  270. package/dist/utils/lodash-able.d.ts.map +1 -1
  271. package/dist/utils/lodash-able.js +1 -1
  272. package/dist/utils/object-utils.d.ts +44 -0
  273. package/dist/utils/object-utils.d.ts.map +1 -0
  274. package/dist/utils/object-utils.js +191 -0
  275. package/dist/utils/path-utils.d.ts +1 -1
  276. package/dist/utils/path-utils.d.ts.map +1 -1
  277. package/dist/utils/path-utils.js +3 -3
  278. package/dist/utils/process-utils.js +1 -1
  279. package/dist/utils/sql-parser.d.ts +5 -1
  280. package/dist/utils/sql-parser.d.ts.map +1 -1
  281. package/dist/utils/sql-parser.js +14 -3
  282. package/dist/utils/type-utils.d.ts +23 -0
  283. package/dist/utils/type-utils.d.ts.map +1 -0
  284. package/dist/utils/type-utils.js +45 -0
  285. package/dist/utils/utils.d.ts +7 -1
  286. package/dist/utils/utils.d.ts.map +1 -1
  287. package/dist/utils/utils.js +44 -5
  288. package/dist/utils/zod-error.d.ts +1 -1
  289. package/dist/utils/zod-error.d.ts.map +1 -1
  290. package/dist/utils/zod-error.js +1 -1
  291. package/package.json +54 -29
  292. package/src/ai/agents/agent.ts +87 -0
  293. package/src/ai/agents/index.ts +2 -0
  294. package/src/ai/agents/types.ts +47 -0
  295. package/src/ai/index.ts +1 -0
  296. package/src/ai/providers/rtzr/api.ts +37 -0
  297. package/src/ai/providers/rtzr/error.ts +34 -0
  298. package/src/ai/providers/rtzr/index.ts +4 -0
  299. package/src/ai/providers/rtzr/model.ts +201 -0
  300. package/src/ai/providers/rtzr/options.ts +49 -0
  301. package/src/ai/providers/rtzr/provider.ts +91 -0
  302. package/src/ai/providers/rtzr/utils.ts +127 -0
  303. package/src/api/base-frame.ts +4 -2
  304. package/src/api/caster.ts +17 -23
  305. package/src/api/code-converters.ts +176 -533
  306. package/src/api/config.ts +39 -56
  307. package/src/api/context.ts +7 -18
  308. package/src/api/decorators.ts +175 -46
  309. package/src/api/index.ts +2 -2
  310. package/src/api/sonamu.ts +133 -124
  311. package/src/api/validator.ts +83 -0
  312. package/src/bin/build-config.ts +7 -1
  313. package/src/bin/cli.ts +192 -110
  314. package/src/bin/loader-register.ts +38 -0
  315. package/src/database/_batch_update.ts +46 -31
  316. package/src/database/base-model.ts +390 -182
  317. package/src/database/base-model.types.ts +155 -0
  318. package/src/database/code-generator.ts +13 -32
  319. package/src/database/db.ts +36 -50
  320. package/src/database/puri-subset.test-d.ts +471 -0
  321. package/src/database/puri-subset.types.ts +195 -0
  322. package/src/database/puri-wrapper.ts +58 -67
  323. package/src/database/puri.ts +182 -126
  324. package/src/database/puri.types.ts +64 -31
  325. package/src/database/transaction-context.ts +1 -1
  326. package/src/database/upsert-builder.ts +262 -132
  327. package/src/entity/entity-manager.ts +36 -28
  328. package/src/entity/entity.ts +330 -249
  329. package/src/exceptions/error-handler.ts +3 -3
  330. package/src/exceptions/so-exceptions.ts +11 -11
  331. package/src/file-storage/driver.ts +5 -5
  332. package/src/file-storage/file-storage.ts +2 -2
  333. package/src/index.ts +18 -12
  334. package/src/migration/code-generation.ts +185 -172
  335. package/src/migration/migration-set.ts +80 -293
  336. package/src/migration/migrator.ts +182 -425
  337. package/src/migration/mysql-schema-reader.ts.txt +272 -0
  338. package/src/migration/postgresql-schema-reader.ts +310 -0
  339. package/src/migration/types.ts +6 -39
  340. package/src/naite/messaging-types.ts +51 -0
  341. package/src/naite/naite-reporter.ts +128 -0
  342. package/src/naite/naite.ts +378 -33
  343. package/src/shared/web.shared.ts.txt +20 -24
  344. package/src/stream/sse.ts +5 -5
  345. package/src/syncer/api-parser.ts +52 -69
  346. package/src/syncer/checksum.ts +25 -37
  347. package/src/syncer/code-generator.ts +58 -62
  348. package/src/syncer/entity-operations.ts +12 -15
  349. package/src/syncer/file-patterns.ts +2 -2
  350. package/src/syncer/index.ts +4 -4
  351. package/src/syncer/module-loader.ts +28 -25
  352. package/src/syncer/syncer.ts +155 -162
  353. package/src/template/entity-converter.ts +18 -27
  354. package/src/template/helpers.ts +8 -11
  355. package/src/template/implementations/entity.template.ts +6 -6
  356. package/src/template/implementations/generated.template.ts +99 -99
  357. package/src/template/implementations/generated_http.template.ts +21 -54
  358. package/src/template/implementations/generated_sso.template.ts +78 -65
  359. package/src/template/implementations/init_types.template.ts +4 -6
  360. package/src/template/implementations/model.template.ts +47 -38
  361. package/src/template/implementations/model_test.template.ts +3 -3
  362. package/src/template/implementations/service.template.ts +56 -80
  363. package/src/template/implementations/view_enums_buttonset.template.ts +2 -2
  364. package/src/template/implementations/view_enums_dropdown.template.ts +4 -4
  365. package/src/template/implementations/view_enums_select.template.ts +3 -3
  366. package/src/template/implementations/view_form.template.ts +34 -75
  367. package/src/template/implementations/view_id_all_select.template.ts +2 -2
  368. package/src/template/implementations/view_id_async_select.template.ts +9 -23
  369. package/src/template/implementations/view_list.template.ts +54 -95
  370. package/src/template/implementations/view_list_columns.template.ts +4 -10
  371. package/src/template/implementations/view_search_input.template.ts +2 -2
  372. package/src/template/index.ts +4 -2
  373. package/src/template/template-manager.ts +166 -0
  374. package/src/template/template-types.ts +16 -0
  375. package/src/template/template.ts +29 -10
  376. package/src/template/zod-converter.ts +407 -101
  377. package/src/testing/_relation-graph.ts +18 -11
  378. package/src/testing/fixture-manager.ts +468 -362
  379. package/src/types/types.ts +516 -248
  380. package/src/typings/knex.d.ts +7 -9
  381. package/src/utils/async-utils.ts +8 -12
  382. package/src/utils/console-util.ts +1 -1
  383. package/src/utils/controller.ts +3 -0
  384. package/src/utils/esm-utils.ts +8 -18
  385. package/src/utils/formatter.ts +109 -0
  386. package/src/utils/fs-utils.ts +1 -1
  387. package/src/utils/lodash-able.ts +1 -4
  388. package/src/utils/object-utils.ts +217 -0
  389. package/src/utils/path-utils.ts +3 -6
  390. package/src/utils/process-utils.ts +1 -1
  391. package/src/utils/sql-parser.ts +23 -5
  392. package/src/utils/type-utils.ts +83 -0
  393. package/src/utils/utils.ts +58 -9
  394. package/src/utils/zod-error.ts +3 -3
  395. package/dist/bin/cli-wrapper.d.ts +0 -3
  396. package/dist/bin/cli-wrapper.d.ts.map +0 -1
  397. package/dist/bin/cli-wrapper.js +0 -72
  398. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts +0 -2
  399. package/dist/database/knex-plugins/knex-on-duplicate-update.d.ts.map +0 -1
  400. package/dist/database/knex-plugins/knex-on-duplicate-update.js +0 -39
  401. package/dist/entity/entity-utils.d.ts +0 -61
  402. package/dist/entity/entity-utils.d.ts.map +0 -1
  403. package/dist/entity/entity-utils.js +0 -210
  404. package/src/bin/cli-wrapper.ts +0 -82
  405. package/src/database/knex-plugins/knex-on-duplicate-update.ts +0 -45
  406. package/src/entity/entity-utils.ts +0 -291
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader-register.d.ts","sourceRoot":"","sources":["../../src/bin/loader-register.ts"],"names":[],"mappings":""}
@@ -0,0 +1,34 @@
1
+ import { register } from "node:module";
2
+ import * as path from "node:path";
3
+ import { exists } from "../utils/fs-utils.js";
4
+ import { findApiRootPath } from "../utils/utils.js";
5
+ /**
6
+ * @sonamu-kit/loader/loader를 등록하는 스크립트입니다.
7
+ * 이 스크립트는 sonamu cli로 dev 실행할 때 --import로 실행됩니다.
8
+ */ async function setupSwcConfig() {
9
+ try {
10
+ const apiRoot = findApiRootPath();
11
+ // 프로젝트 루트에서 .swcrc 찾기
12
+ const projectSwcrcPath = path.join(apiRoot, ".swcrc");
13
+ if (await exists(projectSwcrcPath)) {
14
+ // 사용자 프로젝트에 .swcrc가 있으면 우선으로 사용합니다.
15
+ process.env.SWCRC_PATH = projectSwcrcPath;
16
+ return;
17
+ }
18
+ // 아니라면 sonamu가 관리하는 .swcrc.project-default를 가져다 씁니다.
19
+ const sonamuSwcrcPath = path.join(import.meta.dirname, "..", "..", ".swcrc.project-default");
20
+ if (await exists(sonamuSwcrcPath)) {
21
+ process.env.SWCRC_PATH = sonamuSwcrcPath;
22
+ return;
23
+ }
24
+ } catch {
25
+ // 환경 변수 설정 실패는 무시 (loader가 기본 설정 사용)
26
+ }
27
+ }
28
+ // swc 설정 파일 경로를 환경 변수로 설정
29
+ await setupSwcConfig();
30
+ register("@sonamu-kit/loader/loader", {
31
+ parentURL: import.meta.url
32
+ });
33
+
34
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9iaW4vbG9hZGVyLXJlZ2lzdGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlZ2lzdGVyIH0gZnJvbSBcIm5vZGU6bW9kdWxlXCI7XG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gXCJub2RlOnBhdGhcIjtcbmltcG9ydCB7IGV4aXN0cyB9IGZyb20gXCIuLi91dGlscy9mcy11dGlscy5qc1wiO1xuaW1wb3J0IHsgZmluZEFwaVJvb3RQYXRoIH0gZnJvbSBcIi4uL3V0aWxzL3V0aWxzLmpzXCI7XG5cbi8qKlxuICogQHNvbmFtdS1raXQvbG9hZGVyL2xvYWRlcuulvCDrk7HroZ3tlZjripQg7Iqk7YGs66a97Yq47J6F64uI64ukLlxuICog7J20IOyKpO2BrOumve2KuOuKlCBzb25hbXUgY2xp66GcIGRldiDsi6TtlontlaAg65WMIC0taW1wb3J066GcIOyLpO2WieuQqeuLiOuLpC5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gc2V0dXBTd2NDb25maWcoKSB7XG4gIHRyeSB7XG4gICAgY29uc3QgYXBpUm9vdCA9IGZpbmRBcGlSb290UGF0aCgpO1xuXG4gICAgLy8g7ZSE66Gc7KCd7Yq4IOujqO2KuOyXkOyEnCAuc3djcmMg7LC+6riwXG4gICAgY29uc3QgcHJvamVjdFN3Y3JjUGF0aCA9IHBhdGguam9pbihhcGlSb290LCBcIi5zd2NyY1wiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHByb2plY3RTd2NyY1BhdGgpKSB7XG4gICAgICAvLyDsgqzsmqnsnpAg7ZSE66Gc7KCd7Yq47JeQIC5zd2NyY+qwgCDsnojsnLzrqbQg7Jqw7ISg7Jy866GcIOyCrOyaqe2VqeuLiOuLpC5cbiAgICAgIHByb2Nlc3MuZW52LlNXQ1JDX1BBVEggPSBwcm9qZWN0U3djcmNQYXRoO1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIOyVhOuLiOudvOuptCBzb25hbXXqsIAg6rSA66as7ZWY64qUIC5zd2NyYy5wcm9qZWN0LWRlZmF1bHTrpbwg6rCA7KC464ukIOyUgeuLiOuLpC5cbiAgICBjb25zdCBzb25hbXVTd2NyY1BhdGggPSBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgXCIuLlwiLCBcIi4uXCIsIFwiLnN3Y3JjLnByb2plY3QtZGVmYXVsdFwiKTtcbiAgICBpZiAoYXdhaXQgZXhpc3RzKHNvbmFtdVN3Y3JjUGF0aCkpIHtcbiAgICAgIHByb2Nlc3MuZW52LlNXQ1JDX1BBVEggPSBzb25hbXVTd2NyY1BhdGg7XG4gICAgICByZXR1cm47XG4gICAgfVxuICB9IGNhdGNoIHtcbiAgICAvLyDtmZjqsr0g67OA7IiYIOyEpOyglSDsi6TtjKjripQg66y07IucIChsb2FkZXLqsIAg6riw67O4IOyEpOyglSDsgqzsmqkpXG4gIH1cbn1cblxuLy8gc3djIOyEpOyglSDtjIzsnbwg6rK966Gc66W8IO2ZmOqyvSDrs4DsiJjroZwg7ISk7KCVXG5hd2FpdCBzZXR1cFN3Y0NvbmZpZygpO1xuXG5yZWdpc3RlcihcIkBzb25hbXUta2l0L2xvYWRlci9sb2FkZXJcIiwge1xuICBwYXJlbnRVUkw6IGltcG9ydC5tZXRhLnVybCxcbn0pO1xuIl0sIm5hbWVzIjpbInJlZ2lzdGVyIiwicGF0aCIsImV4aXN0cyIsImZpbmRBcGlSb290UGF0aCIsInNldHVwU3djQ29uZmlnIiwiYXBpUm9vdCIsInByb2plY3RTd2NyY1BhdGgiLCJqb2luIiwicHJvY2VzcyIsImVudiIsIlNXQ1JDX1BBVEgiLCJzb25hbXVTd2NyY1BhdGgiLCJkaXJuYW1lIiwicGFyZW50VVJMIiwidXJsIl0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLFFBQVEsY0FBYztBQUN2QyxZQUFZQyxVQUFVLFlBQVk7QUFDbEMsU0FBU0MsTUFBTSxRQUFRLHVCQUF1QjtBQUM5QyxTQUFTQyxlQUFlLFFBQVEsb0JBQW9CO0FBRXBEOzs7Q0FHQyxHQUNELGVBQWVDO0lBQ2IsSUFBSTtRQUNGLE1BQU1DLFVBQVVGO1FBRWhCLHNCQUFzQjtRQUN0QixNQUFNRyxtQkFBbUJMLEtBQUtNLElBQUksQ0FBQ0YsU0FBUztRQUM1QyxJQUFJLE1BQU1ILE9BQU9JLG1CQUFtQjtZQUNsQyxvQ0FBb0M7WUFDcENFLFFBQVFDLEdBQUcsQ0FBQ0MsVUFBVSxHQUFHSjtZQUN6QjtRQUNGO1FBRUEscURBQXFEO1FBQ3JELE1BQU1LLGtCQUFrQlYsS0FBS00sSUFBSSxDQUFDLFlBQVlLLE9BQU8sRUFBRSxNQUFNLE1BQU07UUFDbkUsSUFBSSxNQUFNVixPQUFPUyxrQkFBa0I7WUFDakNILFFBQVFDLEdBQUcsQ0FBQ0MsVUFBVSxHQUFHQztZQUN6QjtRQUNGO0lBQ0YsRUFBRSxPQUFNO0lBQ04scUNBQXFDO0lBQ3ZDO0FBQ0Y7QUFFQSwwQkFBMEI7QUFDMUIsTUFBTVA7QUFFTkosU0FBUyw2QkFBNkI7SUFDcENhLFdBQVcsWUFBWUMsR0FBRztBQUM1QiJ9
@@ -1,7 +1,8 @@
1
- import { Knex } from "knex";
1
+ import type { Knex } from "knex";
2
+ type ColumnValue = string | number | boolean | null;
2
3
  export type RowWithId<Id extends string> = {
3
- [key in Id]: any;
4
- } & Record<string, any>;
4
+ [key in Id]: ColumnValue;
5
+ } & Record<string, ColumnValue>;
5
6
  /**
6
7
  * Batch update rows in a table. Technically its a patch since it only updates the specified columns. Any omitted columns will not be affected
7
8
  * @param db
@@ -12,4 +13,5 @@ export type RowWithId<Id extends string> = {
12
13
  * @param trx
13
14
  */
14
15
  export declare function batchUpdate<Id extends string>(knex: Knex, tableName: string, ids: Id[], rows: RowWithId<Id>[], chunkSize?: number, trx?: Knex.Transaction | null): Promise<void>;
16
+ export {};
15
17
  //# sourceMappingURL=_batch_update.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI;KACxC,GAAG,IAAI,EAAE,GAAG,GAAG;CACjB,GAAG,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAExB;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,EAAE,SAAS,MAAM,EACjD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,EAAE,EAAE,EACT,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EACrB,SAAS,SAAK,EACd,GAAG,GAAE,IAAI,CAAC,WAAW,GAAG,IAAW,iBA0BpC"}
1
+ {"version":3,"file":"_batch_update.d.ts","sourceRoot":"","sources":["../../src/database/_batch_update.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAEjC,KAAK,WAAW,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,IAAI,CAAC;AACpD,MAAM,MAAM,SAAS,CAAC,EAAE,SAAS,MAAM,IAAI;KACxC,GAAG,IAAI,EAAE,GAAG,WAAW;CACzB,GAAG,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;AAEhC;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAAC,EAAE,SAAS,MAAM,EACjD,IAAI,EAAE,IAAI,EACV,SAAS,EAAE,MAAM,EACjB,GAAG,EAAE,EAAE,EAAE,EACT,IAAI,EAAE,SAAS,CAAC,EAAE,CAAC,EAAE,EACrB,SAAS,SAAK,EACd,GAAG,GAAE,IAAI,CAAC,WAAW,GAAG,IAAW,iBAuBpC"}
@@ -47,7 +47,7 @@
47
47
  }
48
48
  function generateBatchUpdateSQL(db, tableName, data, identifiers) {
49
49
  const keySet = generateKeySetFromData(data);
50
- const bindings = [];
50
+ const allBindings = [];
51
51
  const invalidIdentifiers = identifiers.filter((id)=>!keySet.has(id));
52
52
  if (invalidIdentifiers.length > 0) {
53
53
  throw new Error(`Invalid identifiers: ${invalidIdentifiers.join(", ")}. Identifiers must exist in the data`);
@@ -55,24 +55,41 @@ function generateBatchUpdateSQL(db, tableName, data, identifiers) {
55
55
  const cases = [];
56
56
  for (const key of keySet){
57
57
  if (identifiers.includes(key)) continue;
58
- const rows = [];
58
+ const caseBindings = [];
59
+ const whenClauses = [];
59
60
  for (const row of data){
60
- if (Object.hasOwnProperty.call(row, key)) {
61
- const whereClause = identifiers.map((id)=>`\`${id}\` = ?`).join(" AND ");
62
- rows.push(`WHEN (${whereClause}) THEN ?`);
63
- bindings.push(...identifiers.map((i)=>row[i]), row[key]);
61
+ if (Object.hasOwn(row, key)) {
62
+ const whereParts = identifiers.map(()=>`?? = ?`).join(" AND ");
63
+ whenClauses.push(`WHEN (${whereParts}) THEN ?`);
64
+ // identifier 이름과 값들을 추가
65
+ for (const id of identifiers){
66
+ caseBindings.push(id, row[id]);
67
+ }
68
+ // THEN 값 추가
69
+ caseBindings.push(row[key]);
64
70
  }
65
71
  }
66
- const whenThen = rows.join(" ");
67
- cases.push(`\`${key}\` = CASE ${whenThen} ELSE \`${key}\` END`);
72
+ const whenThen = whenClauses.join(" ");
73
+ cases.push(`?? = CASE ${whenThen} ELSE ?? END`);
74
+ // 컬럼명 2개 추가 (SET의 컬럼명, ELSE의 컬럼명)
75
+ allBindings.push(key);
76
+ allBindings.push(...caseBindings);
77
+ allBindings.push(key);
68
78
  }
69
- const whereInClauses = identifiers.map((col)=>`${col} IN (${data.map(()=>"?").join(", ")})`).join(" AND ");
70
- const whereInBindings = identifiers.flatMap((col)=>data.map((row)=>row[col]));
71
- const sql = db.raw(`UPDATE \`${tableName}\` SET ${cases.join(", ")} WHERE ${whereInClauses}`, [
72
- ...bindings,
79
+ const whereInClauses = identifiers.map((_col)=>`?? IN (${data.map(()=>"?").join(", ")})`).join(" AND ");
80
+ const whereInBindings = [];
81
+ for (const col of identifiers){
82
+ whereInBindings.push(col);
83
+ for (const row of data){
84
+ whereInBindings.push(row[col]);
85
+ }
86
+ }
87
+ const sql = db.raw(`UPDATE ?? SET ${cases.join(", ")} WHERE ${whereInClauses}`, [
88
+ tableName,
89
+ ...allBindings,
73
90
  ...whereInBindings
74
91
  ]);
75
92
  return sql.toQuery();
76
93
  }
77
94
 
78
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9fYmF0Y2hfdXBkYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIOyVhOuemOydmCDrp4Htgazsl5DshJwg7LC46rOg7ZW07IScIOqwgOyguOyYqCDshozsiqTsvZTrk5xcbiAgaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9pc3N1ZXMvNTcxNlxuKi9cblxuaW1wb3J0IHsgS25leCB9IGZyb20gXCJrbmV4XCI7XG5cbmV4cG9ydCB0eXBlIFJvd1dpdGhJZDxJZCBleHRlbmRzIHN0cmluZz4gPSB7XG4gIFtrZXkgaW4gSWRdOiBhbnk7XG59ICYgUmVjb3JkPHN0cmluZywgYW55PjtcblxuLyoqXG4gKiBCYXRjaCB1cGRhdGUgcm93cyBpbiBhIHRhYmxlLiBUZWNobmljYWxseSBpdHMgYSBwYXRjaCBzaW5jZSBpdCBvbmx5IHVwZGF0ZXMgdGhlIHNwZWNpZmllZCBjb2x1bW5zLiBBbnkgb21pdHRlZCBjb2x1bW5zIHdpbGwgbm90IGJlIGFmZmVjdGVkXG4gKiBAcGFyYW0gZGJcbiAqIEBwYXJhbSB0YWJsZU5hbWVcbiAqIEBwYXJhbSBpZHNcbiAqIEBwYXJhbSByb3dzXG4gKiBAcGFyYW0gY2h1bmtTaXplXG4gKiBAcGFyYW0gdHJ4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaFVwZGF0ZTxJZCBleHRlbmRzIHN0cmluZz4oXG4gIGtuZXg6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBpZHM6IElkW10sXG4gIHJvd3M6IFJvd1dpdGhJZDxJZD5bXSxcbiAgY2h1bmtTaXplID0gNTAsXG4gIHRyeDogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsXG4pIHtcbiAgY29uc3QgY2h1bmtzOiBSb3dXaXRoSWQ8SWQ+W11bXSA9IFtdO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHJvd3MubGVuZ3RoOyBpICs9IGNodW5rU2l6ZSkge1xuICAgIGNodW5rcy5wdXNoKHJvd3Muc2xpY2UoaSwgaSArIGNodW5rU2l6ZSkpO1xuICB9XG5cbiAgY29uc3QgZXhlY3V0ZVVwZGF0ZSA9IGFzeW5jIChcbiAgICBjaHVuazogUm93V2l0aElkPElkPltdLFxuICAgIHRyYW5zYWN0aW9uOiBLbmV4LlRyYW5zYWN0aW9uXG4gICkgPT4ge1xuICAgIGNvbnN0IHNxbCA9IGdlbmVyYXRlQmF0Y2hVcGRhdGVTUUwoa25leCwgdGFibGVOYW1lLCBjaHVuaywgaWRzKTtcbiAgICByZXR1cm4ga25leC5yYXcoc3FsKS50cmFuc2FjdGluZyh0cmFuc2FjdGlvbik7XG4gIH07XG5cbiAgaWYgKHRyeCkge1xuICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICBhd2FpdCBleGVjdXRlVXBkYXRlKGNodW5rLCB0cngpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBhd2FpdCBrbmV4LnRyYW5zYWN0aW9uKGFzeW5jIChuZXdUcngpID0+IHtcbiAgICAgIGZvciAoY29uc3QgY2h1bmsgb2YgY2h1bmtzKSB7XG4gICAgICAgIGF3YWl0IGV4ZWN1dGVVcGRhdGUoY2h1bmssIG5ld1RyeCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSBhIHNldCBvZiB1bmlxdWUga2V5cyBpbiBhIGRhdGEgYXJyYXlcbiAqXG4gKiBFeGFtcGxlOlxuICogWyB7IGE6IDEsIGI6IDIgfSwgeyBhOiAzLCBjOiA0IH0gXSA9PiBTZXQoWyBcImFcIiwgXCJiXCIsIFwiY1wiIF0pXG4gKiBAcGFyYW0gZGF0YVxuICovXG5mdW5jdGlvbiBnZW5lcmF0ZUtleVNldEZyb21EYXRhKGRhdGE6IFJlY29yZDxzdHJpbmcsIGFueT5bXSkge1xuICBjb25zdCBrZXlTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5U2V0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMPElkIGV4dGVuZHMgc3RyaW5nPihcbiAgZGI6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBhbnk+W10sXG4gIGlkZW50aWZpZXJzOiBJZFtdXG4pIHtcbiAgY29uc3Qga2V5U2V0ID0gZ2VuZXJhdGVLZXlTZXRGcm9tRGF0YShkYXRhKTtcbiAgY29uc3QgYmluZGluZ3MgPSBbXTtcblxuICBjb25zdCBpbnZhbGlkSWRlbnRpZmllcnMgPSBpZGVudGlmaWVycy5maWx0ZXIoKGlkKSA9PiAha2V5U2V0LmhhcyhpZCkpO1xuICBpZiAoaW52YWxpZElkZW50aWZpZXJzLmxlbmd0aCA+IDApIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICBgSW52YWxpZCBpZGVudGlmaWVyczogJHtpbnZhbGlkSWRlbnRpZmllcnMuam9pbihcIiwgXCIpfS4gSWRlbnRpZmllcnMgbXVzdCBleGlzdCBpbiB0aGUgZGF0YWBcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2FzZXMgPSBbXTtcbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5U2V0KSB7XG4gICAgaWYgKGlkZW50aWZpZXJzLmluY2x1ZGVzKGtleSBhcyBJZCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3Qgcm93cyA9IFtdO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duUHJvcGVydHkuY2FsbChyb3csIGtleSkpIHtcbiAgICAgICAgY29uc3Qgd2hlcmVDbGF1c2UgPSBpZGVudGlmaWVyc1xuICAgICAgICAgIC5tYXAoKGlkKSA9PiBgXFxgJHtpZH1cXGAgPSA/YClcbiAgICAgICAgICAuam9pbihcIiBBTkQgXCIpO1xuICAgICAgICByb3dzLnB1c2goYFdIRU4gKCR7d2hlcmVDbGF1c2V9KSBUSEVOID9gKTtcbiAgICAgICAgYmluZGluZ3MucHVzaCguLi5pZGVudGlmaWVycy5tYXAoKGkpID0+IHJvd1tpXSksIHJvd1trZXldKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCB3aGVuVGhlbiA9IHJvd3Muam9pbihcIiBcIik7XG4gICAgY2FzZXMucHVzaChgXFxgJHtrZXl9XFxgID0gQ0FTRSAke3doZW5UaGVufSBFTFNFIFxcYCR7a2V5fVxcYCBFTkRgKTtcbiAgfVxuXG4gIGNvbnN0IHdoZXJlSW5DbGF1c2VzID0gaWRlbnRpZmllcnNcbiAgICAubWFwKChjb2wpID0+IGAke2NvbH0gSU4gKCR7ZGF0YS5tYXAoKCkgPT4gXCI/XCIpLmpvaW4oXCIsIFwiKX0pYClcbiAgICAuam9pbihcIiBBTkQgXCIpO1xuXG4gIGNvbnN0IHdoZXJlSW5CaW5kaW5ncyA9IGlkZW50aWZpZXJzLmZsYXRNYXAoKGNvbCkgPT5cbiAgICBkYXRhLm1hcCgocm93KSA9PiByb3dbY29sXSlcbiAgKTtcblxuICBjb25zdCBzcWwgPSBkYi5yYXcoXG4gICAgYFVQREFURSBcXGAke3RhYmxlTmFtZX1cXGAgU0VUICR7Y2FzZXMuam9pbihcIiwgXCIpfSBXSEVSRSAke3doZXJlSW5DbGF1c2VzfWAsXG4gICAgWy4uLmJpbmRpbmdzLCAuLi53aGVyZUluQmluZGluZ3NdXG4gICk7XG5cbiAgcmV0dXJuIHNxbC50b1F1ZXJ5KCk7XG59XG4iXSwibmFtZXMiOlsiYmF0Y2hVcGRhdGUiLCJrbmV4IiwidGFibGVOYW1lIiwiaWRzIiwicm93cyIsImNodW5rU2l6ZSIsInRyeCIsImNodW5rcyIsImkiLCJsZW5ndGgiLCJwdXNoIiwic2xpY2UiLCJleGVjdXRlVXBkYXRlIiwiY2h1bmsiLCJ0cmFuc2FjdGlvbiIsInNxbCIsImdlbmVyYXRlQmF0Y2hVcGRhdGVTUUwiLCJyYXciLCJ0cmFuc2FjdGluZyIsIm5ld1RyeCIsImdlbmVyYXRlS2V5U2V0RnJvbURhdGEiLCJkYXRhIiwia2V5U2V0IiwiU2V0Iiwicm93Iiwia2V5IiwiT2JqZWN0Iiwia2V5cyIsImFkZCIsImRiIiwiaWRlbnRpZmllcnMiLCJiaW5kaW5ncyIsImludmFsaWRJZGVudGlmaWVycyIsImZpbHRlciIsImlkIiwiaGFzIiwiRXJyb3IiLCJqb2luIiwiY2FzZXMiLCJpbmNsdWRlcyIsImhhc093blByb3BlcnR5IiwiY2FsbCIsIndoZXJlQ2xhdXNlIiwibWFwIiwid2hlblRoZW4iLCJ3aGVyZUluQ2xhdXNlcyIsImNvbCIsIndoZXJlSW5CaW5kaW5ncyIsImZsYXRNYXAiLCJ0b1F1ZXJ5Il0sIm1hcHBpbmdzIjoiQUFBQTs7O0FBR0EsR0FRQTs7Ozs7Ozs7Q0FRQyxHQUNELE9BQU8sZUFBZUEsWUFDcEJDLElBQVUsRUFDVkMsU0FBaUIsRUFDakJDLEdBQVMsRUFDVEMsSUFBcUIsRUFDckJDLFlBQVksRUFBRSxFQUNkQyxNQUErQixJQUFJO0lBRW5DLE1BQU1DLFNBQTRCLEVBQUU7SUFDcEMsSUFBSyxJQUFJQyxJQUFJLEdBQUdBLElBQUlKLEtBQUtLLE1BQU0sRUFBRUQsS0FBS0gsVUFBVztRQUMvQ0UsT0FBT0csSUFBSSxDQUFDTixLQUFLTyxLQUFLLENBQUNILEdBQUdBLElBQUlIO0lBQ2hDO0lBRUEsTUFBTU8sZ0JBQWdCLE9BQ3BCQyxPQUNBQztRQUVBLE1BQU1DLE1BQU1DLHVCQUF1QmYsTUFBTUMsV0FBV1csT0FBT1Y7UUFDM0QsT0FBT0YsS0FBS2dCLEdBQUcsQ0FBQ0YsS0FBS0csV0FBVyxDQUFDSjtJQUNuQztJQUVBLElBQUlSLEtBQUs7UUFDUCxLQUFLLE1BQU1PLFNBQVNOLE9BQVE7WUFDMUIsTUFBTUssY0FBY0MsT0FBT1A7UUFDN0I7SUFDRixPQUFPO1FBQ0wsTUFBTUwsS0FBS2EsV0FBVyxDQUFDLE9BQU9LO1lBQzVCLEtBQUssTUFBTU4sU0FBU04sT0FBUTtnQkFDMUIsTUFBTUssY0FBY0MsT0FBT007WUFDN0I7UUFDRjtJQUNGO0FBQ0Y7QUFFQTs7Ozs7O0NBTUMsR0FDRCxTQUFTQyx1QkFBdUJDLElBQTJCO0lBQ3pELE1BQU1DLFNBQXNCLElBQUlDO0lBQ2hDLEtBQUssTUFBTUMsT0FBT0gsS0FBTTtRQUN0QixLQUFLLE1BQU1JLE9BQU9DLE9BQU9DLElBQUksQ0FBQ0gsS0FBTTtZQUNsQ0YsT0FBT00sR0FBRyxDQUFDSDtRQUNiO0lBQ0Y7SUFDQSxPQUFPSDtBQUNUO0FBRUEsU0FBU04sdUJBQ1BhLEVBQVEsRUFDUjNCLFNBQWlCLEVBQ2pCbUIsSUFBMkIsRUFDM0JTLFdBQWlCO0lBRWpCLE1BQU1SLFNBQVNGLHVCQUF1QkM7SUFDdEMsTUFBTVUsV0FBVyxFQUFFO0lBRW5CLE1BQU1DLHFCQUFxQkYsWUFBWUcsTUFBTSxDQUFDLENBQUNDLEtBQU8sQ0FBQ1osT0FBT2EsR0FBRyxDQUFDRDtJQUNsRSxJQUFJRixtQkFBbUJ2QixNQUFNLEdBQUcsR0FBRztRQUNqQyxNQUFNLElBQUkyQixNQUNSLENBQUMscUJBQXFCLEVBQUVKLG1CQUFtQkssSUFBSSxDQUFDLE1BQU0sb0NBQW9DLENBQUM7SUFFL0Y7SUFFQSxNQUFNQyxRQUFRLEVBQUU7SUFDaEIsS0FBSyxNQUFNYixPQUFPSCxPQUFRO1FBQ3hCLElBQUlRLFlBQVlTLFFBQVEsQ0FBQ2QsTUFBWTtRQUVyQyxNQUFNckIsT0FBTyxFQUFFO1FBQ2YsS0FBSyxNQUFNb0IsT0FBT0gsS0FBTTtZQUN0QixJQUFJSyxPQUFPYyxjQUFjLENBQUNDLElBQUksQ0FBQ2pCLEtBQUtDLE1BQU07Z0JBQ3hDLE1BQU1pQixjQUFjWixZQUNqQmEsR0FBRyxDQUFDLENBQUNULEtBQU8sQ0FBQyxFQUFFLEVBQUVBLEdBQUcsTUFBTSxDQUFDLEVBQzNCRyxJQUFJLENBQUM7Z0JBQ1JqQyxLQUFLTSxJQUFJLENBQUMsQ0FBQyxNQUFNLEVBQUVnQyxZQUFZLFFBQVEsQ0FBQztnQkFDeENYLFNBQVNyQixJQUFJLElBQUlvQixZQUFZYSxHQUFHLENBQUMsQ0FBQ25DLElBQU1nQixHQUFHLENBQUNoQixFQUFFLEdBQUdnQixHQUFHLENBQUNDLElBQUk7WUFDM0Q7UUFDRjtRQUVBLE1BQU1tQixXQUFXeEMsS0FBS2lDLElBQUksQ0FBQztRQUMzQkMsTUFBTTVCLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRWUsSUFBSSxVQUFVLEVBQUVtQixTQUFTLFFBQVEsRUFBRW5CLElBQUksTUFBTSxDQUFDO0lBQ2hFO0lBRUEsTUFBTW9CLGlCQUFpQmYsWUFDcEJhLEdBQUcsQ0FBQyxDQUFDRyxNQUFRLEdBQUdBLElBQUksS0FBSyxFQUFFekIsS0FBS3NCLEdBQUcsQ0FBQyxJQUFNLEtBQUtOLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUM1REEsSUFBSSxDQUFDO0lBRVIsTUFBTVUsa0JBQWtCakIsWUFBWWtCLE9BQU8sQ0FBQyxDQUFDRixNQUMzQ3pCLEtBQUtzQixHQUFHLENBQUMsQ0FBQ25CLE1BQVFBLEdBQUcsQ0FBQ3NCLElBQUk7SUFHNUIsTUFBTS9CLE1BQU1jLEdBQUdaLEdBQUcsQ0FDaEIsQ0FBQyxTQUFTLEVBQUVmLFVBQVUsT0FBTyxFQUFFb0MsTUFBTUQsSUFBSSxDQUFDLE1BQU0sT0FBTyxFQUFFUSxnQkFBZ0IsRUFDekU7V0FBSWQ7V0FBYWdCO0tBQWdCO0lBR25DLE9BQU9oQyxJQUFJa0MsT0FBTztBQUNwQiJ9
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9fYmF0Y2hfdXBkYXRlLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gIOyVhOuemOydmCDrp4Htgazsl5DshJwg7LC46rOg7ZW07IScIOqwgOyguOyYqCDshozsiqTsvZTrk5xcbiAgaHR0cHM6Ly9naXRodWIuY29tL2tuZXgva25leC9pc3N1ZXMvNTcxNlxuKi9cblxuaW1wb3J0IHR5cGUgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcblxudHlwZSBDb2x1bW5WYWx1ZSA9IHN0cmluZyB8IG51bWJlciB8IGJvb2xlYW4gfCBudWxsO1xuZXhwb3J0IHR5cGUgUm93V2l0aElkPElkIGV4dGVuZHMgc3RyaW5nPiA9IHtcbiAgW2tleSBpbiBJZF06IENvbHVtblZhbHVlO1xufSAmIFJlY29yZDxzdHJpbmcsIENvbHVtblZhbHVlPjtcblxuLyoqXG4gKiBCYXRjaCB1cGRhdGUgcm93cyBpbiBhIHRhYmxlLiBUZWNobmljYWxseSBpdHMgYSBwYXRjaCBzaW5jZSBpdCBvbmx5IHVwZGF0ZXMgdGhlIHNwZWNpZmllZCBjb2x1bW5zLiBBbnkgb21pdHRlZCBjb2x1bW5zIHdpbGwgbm90IGJlIGFmZmVjdGVkXG4gKiBAcGFyYW0gZGJcbiAqIEBwYXJhbSB0YWJsZU5hbWVcbiAqIEBwYXJhbSBpZHNcbiAqIEBwYXJhbSByb3dzXG4gKiBAcGFyYW0gY2h1bmtTaXplXG4gKiBAcGFyYW0gdHJ4XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBiYXRjaFVwZGF0ZTxJZCBleHRlbmRzIHN0cmluZz4oXG4gIGtuZXg6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBpZHM6IElkW10sXG4gIHJvd3M6IFJvd1dpdGhJZDxJZD5bXSxcbiAgY2h1bmtTaXplID0gNTAsXG4gIHRyeDogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsLFxuKSB7XG4gIGNvbnN0IGNodW5rczogUm93V2l0aElkPElkPltdW10gPSBbXTtcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCByb3dzLmxlbmd0aDsgaSArPSBjaHVua1NpemUpIHtcbiAgICBjaHVua3MucHVzaChyb3dzLnNsaWNlKGksIGkgKyBjaHVua1NpemUpKTtcbiAgfVxuXG4gIGNvbnN0IGV4ZWN1dGVVcGRhdGUgPSBhc3luYyAoY2h1bms6IFJvd1dpdGhJZDxJZD5bXSwgdHJhbnNhY3Rpb246IEtuZXguVHJhbnNhY3Rpb24pID0+IHtcbiAgICBjb25zdCBzcWwgPSBnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMKGtuZXgsIHRhYmxlTmFtZSwgY2h1bmssIGlkcyk7XG4gICAgcmV0dXJuIGtuZXgucmF3KHNxbCkudHJhbnNhY3RpbmcodHJhbnNhY3Rpb24pO1xuICB9O1xuXG4gIGlmICh0cngpIHtcbiAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgYXdhaXQgZXhlY3V0ZVVwZGF0ZShjaHVuaywgdHJ4KTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgYXdhaXQga25leC50cmFuc2FjdGlvbihhc3luYyAobmV3VHJ4KSA9PiB7XG4gICAgICBmb3IgKGNvbnN0IGNodW5rIG9mIGNodW5rcykge1xuICAgICAgICBhd2FpdCBleGVjdXRlVXBkYXRlKGNodW5rLCBuZXdUcngpO1xuICAgICAgfVxuICAgIH0pO1xuICB9XG59XG5cbi8qKlxuICogR2VuZXJhdGUgYSBzZXQgb2YgdW5pcXVlIGtleXMgaW4gYSBkYXRhIGFycmF5XG4gKlxuICogRXhhbXBsZTpcbiAqIFsgeyBhOiAxLCBiOiAyIH0sIHsgYTogMywgYzogNCB9IF0gPT4gU2V0KFsgXCJhXCIsIFwiYlwiLCBcImNcIiBdKVxuICogQHBhcmFtIGRhdGFcbiAqL1xuZnVuY3Rpb24gZ2VuZXJhdGVLZXlTZXRGcm9tRGF0YShkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT5bXSkge1xuICBjb25zdCBrZXlTZXQ6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuICBmb3IgKGNvbnN0IHJvdyBvZiBkYXRhKSB7XG4gICAgZm9yIChjb25zdCBrZXkgb2YgT2JqZWN0LmtleXMocm93KSkge1xuICAgICAga2V5U2V0LmFkZChrZXkpO1xuICAgIH1cbiAgfVxuICByZXR1cm4ga2V5U2V0O1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMPElkIGV4dGVuZHMgc3RyaW5nPihcbiAgZGI6IEtuZXgsXG4gIHRhYmxlTmFtZTogc3RyaW5nLFxuICBkYXRhOiBSZWNvcmQ8c3RyaW5nLCBDb2x1bW5WYWx1ZT5bXSxcbiAgaWRlbnRpZmllcnM6IElkW10sXG4pIHtcbiAgY29uc3Qga2V5U2V0ID0gZ2VuZXJhdGVLZXlTZXRGcm9tRGF0YShkYXRhKTtcbiAgY29uc3QgYWxsQmluZGluZ3M6IChzdHJpbmcgfCBudW1iZXIgfCBib29sZWFuIHwgbnVsbClbXSA9IFtdO1xuXG4gIGNvbnN0IGludmFsaWRJZGVudGlmaWVycyA9IGlkZW50aWZpZXJzLmZpbHRlcigoaWQpID0+ICFrZXlTZXQuaGFzKGlkKSk7XG4gIGlmIChpbnZhbGlkSWRlbnRpZmllcnMubGVuZ3RoID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgIGBJbnZhbGlkIGlkZW50aWZpZXJzOiAke2ludmFsaWRJZGVudGlmaWVycy5qb2luKFwiLCBcIil9LiBJZGVudGlmaWVycyBtdXN0IGV4aXN0IGluIHRoZSBkYXRhYCxcbiAgICApO1xuICB9XG5cbiAgY29uc3QgY2FzZXM6IHN0cmluZ1tdID0gW107XG5cbiAgZm9yIChjb25zdCBrZXkgb2Yga2V5U2V0KSB7XG4gICAgaWYgKGlkZW50aWZpZXJzLmluY2x1ZGVzKGtleSBhcyBJZCkpIGNvbnRpbnVlO1xuXG4gICAgY29uc3QgY2FzZUJpbmRpbmdzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwpW10gPSBbXTtcbiAgICBjb25zdCB3aGVuQ2xhdXNlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgIGlmIChPYmplY3QuaGFzT3duKHJvdywga2V5KSkge1xuICAgICAgICBjb25zdCB3aGVyZVBhcnRzID0gaWRlbnRpZmllcnMubWFwKCgpID0+IGA/PyA9ID9gKS5qb2luKFwiIEFORCBcIik7XG4gICAgICAgIHdoZW5DbGF1c2VzLnB1c2goYFdIRU4gKCR7d2hlcmVQYXJ0c30pIFRIRU4gP2ApO1xuXG4gICAgICAgIC8vIGlkZW50aWZpZXIg7J2066aE6rO8IOqwkuuTpOydhCDstpTqsIBcbiAgICAgICAgZm9yIChjb25zdCBpZCBvZiBpZGVudGlmaWVycykge1xuICAgICAgICAgIGNhc2VCaW5kaW5ncy5wdXNoKGlkLCByb3dbaWRdKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBUSEVOIOqwkiDstpTqsIBcbiAgICAgICAgY2FzZUJpbmRpbmdzLnB1c2gocm93W2tleV0pO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHdoZW5UaGVuID0gd2hlbkNsYXVzZXMuam9pbihcIiBcIik7XG4gICAgY2FzZXMucHVzaChgPz8gPSBDQVNFICR7d2hlblRoZW59IEVMU0UgPz8gRU5EYCk7XG5cbiAgICAvLyDsu6zrn7zrqoUgMuqwnCDstpTqsIAgKFNFVOydmCDsu6zrn7zrqoUsIEVMU0XsnZgg7Lus65+866qFKVxuICAgIGFsbEJpbmRpbmdzLnB1c2goa2V5KTtcbiAgICBhbGxCaW5kaW5ncy5wdXNoKC4uLmNhc2VCaW5kaW5ncyk7XG4gICAgYWxsQmluZGluZ3MucHVzaChrZXkpO1xuICB9XG5cbiAgY29uc3Qgd2hlcmVJbkNsYXVzZXMgPSBpZGVudGlmaWVyc1xuICAgIC5tYXAoKF9jb2wpID0+IGA/PyBJTiAoJHtkYXRhLm1hcCgoKSA9PiBcIj9cIikuam9pbihcIiwgXCIpfSlgKVxuICAgIC5qb2luKFwiIEFORCBcIik7XG5cbiAgY29uc3Qgd2hlcmVJbkJpbmRpbmdzOiAoc3RyaW5nIHwgbnVtYmVyIHwgYm9vbGVhbiB8IG51bGwpW10gPSBbXTtcbiAgZm9yIChjb25zdCBjb2wgb2YgaWRlbnRpZmllcnMpIHtcbiAgICB3aGVyZUluQmluZGluZ3MucHVzaChjb2wpO1xuICAgIGZvciAoY29uc3Qgcm93IG9mIGRhdGEpIHtcbiAgICAgIHdoZXJlSW5CaW5kaW5ncy5wdXNoKHJvd1tjb2xdKTtcbiAgICB9XG4gIH1cblxuICBjb25zdCBzcWwgPSBkYi5yYXcoYFVQREFURSA/PyBTRVQgJHtjYXNlcy5qb2luKFwiLCBcIil9IFdIRVJFICR7d2hlcmVJbkNsYXVzZXN9YCwgW1xuICAgIHRhYmxlTmFtZSxcbiAgICAuLi5hbGxCaW5kaW5ncyxcbiAgICAuLi53aGVyZUluQmluZGluZ3MsXG4gIF0pO1xuXG4gIHJldHVybiBzcWwudG9RdWVyeSgpO1xufVxuIl0sIm5hbWVzIjpbImJhdGNoVXBkYXRlIiwia25leCIsInRhYmxlTmFtZSIsImlkcyIsInJvd3MiLCJjaHVua1NpemUiLCJ0cngiLCJjaHVua3MiLCJpIiwibGVuZ3RoIiwicHVzaCIsInNsaWNlIiwiZXhlY3V0ZVVwZGF0ZSIsImNodW5rIiwidHJhbnNhY3Rpb24iLCJzcWwiLCJnZW5lcmF0ZUJhdGNoVXBkYXRlU1FMIiwicmF3IiwidHJhbnNhY3RpbmciLCJuZXdUcngiLCJnZW5lcmF0ZUtleVNldEZyb21EYXRhIiwiZGF0YSIsImtleVNldCIsIlNldCIsInJvdyIsImtleSIsIk9iamVjdCIsImtleXMiLCJhZGQiLCJkYiIsImlkZW50aWZpZXJzIiwiYWxsQmluZGluZ3MiLCJpbnZhbGlkSWRlbnRpZmllcnMiLCJmaWx0ZXIiLCJpZCIsImhhcyIsIkVycm9yIiwiam9pbiIsImNhc2VzIiwiaW5jbHVkZXMiLCJjYXNlQmluZGluZ3MiLCJ3aGVuQ2xhdXNlcyIsImhhc093biIsIndoZXJlUGFydHMiLCJtYXAiLCJ3aGVuVGhlbiIsIndoZXJlSW5DbGF1c2VzIiwiX2NvbCIsIndoZXJlSW5CaW5kaW5ncyIsImNvbCIsInRvUXVlcnkiXSwibWFwcGluZ3MiOiJBQUFBOzs7QUFHQSxHQVNBOzs7Ozs7OztDQVFDLEdBQ0QsT0FBTyxlQUFlQSxZQUNwQkMsSUFBVSxFQUNWQyxTQUFpQixFQUNqQkMsR0FBUyxFQUNUQyxJQUFxQixFQUNyQkMsWUFBWSxFQUFFLEVBQ2RDLE1BQStCLElBQUk7SUFFbkMsTUFBTUMsU0FBNEIsRUFBRTtJQUNwQyxJQUFLLElBQUlDLElBQUksR0FBR0EsSUFBSUosS0FBS0ssTUFBTSxFQUFFRCxLQUFLSCxVQUFXO1FBQy9DRSxPQUFPRyxJQUFJLENBQUNOLEtBQUtPLEtBQUssQ0FBQ0gsR0FBR0EsSUFBSUg7SUFDaEM7SUFFQSxNQUFNTyxnQkFBZ0IsT0FBT0MsT0FBd0JDO1FBQ25ELE1BQU1DLE1BQU1DLHVCQUF1QmYsTUFBTUMsV0FBV1csT0FBT1Y7UUFDM0QsT0FBT0YsS0FBS2dCLEdBQUcsQ0FBQ0YsS0FBS0csV0FBVyxDQUFDSjtJQUNuQztJQUVBLElBQUlSLEtBQUs7UUFDUCxLQUFLLE1BQU1PLFNBQVNOLE9BQVE7WUFDMUIsTUFBTUssY0FBY0MsT0FBT1A7UUFDN0I7SUFDRixPQUFPO1FBQ0wsTUFBTUwsS0FBS2EsV0FBVyxDQUFDLE9BQU9LO1lBQzVCLEtBQUssTUFBTU4sU0FBU04sT0FBUTtnQkFDMUIsTUFBTUssY0FBY0MsT0FBT007WUFDN0I7UUFDRjtJQUNGO0FBQ0Y7QUFFQTs7Ozs7O0NBTUMsR0FDRCxTQUFTQyx1QkFBdUJDLElBQW1DO0lBQ2pFLE1BQU1DLFNBQXNCLElBQUlDO0lBQ2hDLEtBQUssTUFBTUMsT0FBT0gsS0FBTTtRQUN0QixLQUFLLE1BQU1JLE9BQU9DLE9BQU9DLElBQUksQ0FBQ0gsS0FBTTtZQUNsQ0YsT0FBT00sR0FBRyxDQUFDSDtRQUNiO0lBQ0Y7SUFDQSxPQUFPSDtBQUNUO0FBRUEsU0FBU04sdUJBQ1BhLEVBQVEsRUFDUjNCLFNBQWlCLEVBQ2pCbUIsSUFBbUMsRUFDbkNTLFdBQWlCO0lBRWpCLE1BQU1SLFNBQVNGLHVCQUF1QkM7SUFDdEMsTUFBTVUsY0FBb0QsRUFBRTtJQUU1RCxNQUFNQyxxQkFBcUJGLFlBQVlHLE1BQU0sQ0FBQyxDQUFDQyxLQUFPLENBQUNaLE9BQU9hLEdBQUcsQ0FBQ0Q7SUFDbEUsSUFBSUYsbUJBQW1CdkIsTUFBTSxHQUFHLEdBQUc7UUFDakMsTUFBTSxJQUFJMkIsTUFDUixDQUFDLHFCQUFxQixFQUFFSixtQkFBbUJLLElBQUksQ0FBQyxNQUFNLG9DQUFvQyxDQUFDO0lBRS9GO0lBRUEsTUFBTUMsUUFBa0IsRUFBRTtJQUUxQixLQUFLLE1BQU1iLE9BQU9ILE9BQVE7UUFDeEIsSUFBSVEsWUFBWVMsUUFBUSxDQUFDZCxNQUFZO1FBRXJDLE1BQU1lLGVBQXFELEVBQUU7UUFDN0QsTUFBTUMsY0FBd0IsRUFBRTtRQUVoQyxLQUFLLE1BQU1qQixPQUFPSCxLQUFNO1lBQ3RCLElBQUlLLE9BQU9nQixNQUFNLENBQUNsQixLQUFLQyxNQUFNO2dCQUMzQixNQUFNa0IsYUFBYWIsWUFBWWMsR0FBRyxDQUFDLElBQU0sQ0FBQyxNQUFNLENBQUMsRUFBRVAsSUFBSSxDQUFDO2dCQUN4REksWUFBWS9CLElBQUksQ0FBQyxDQUFDLE1BQU0sRUFBRWlDLFdBQVcsUUFBUSxDQUFDO2dCQUU5Qyx3QkFBd0I7Z0JBQ3hCLEtBQUssTUFBTVQsTUFBTUosWUFBYTtvQkFDNUJVLGFBQWE5QixJQUFJLENBQUN3QixJQUFJVixHQUFHLENBQUNVLEdBQUc7Z0JBQy9CO2dCQUNBLFlBQVk7Z0JBQ1pNLGFBQWE5QixJQUFJLENBQUNjLEdBQUcsQ0FBQ0MsSUFBSTtZQUM1QjtRQUNGO1FBRUEsTUFBTW9CLFdBQVdKLFlBQVlKLElBQUksQ0FBQztRQUNsQ0MsTUFBTTVCLElBQUksQ0FBQyxDQUFDLFVBQVUsRUFBRW1DLFNBQVMsWUFBWSxDQUFDO1FBRTlDLGtDQUFrQztRQUNsQ2QsWUFBWXJCLElBQUksQ0FBQ2U7UUFDakJNLFlBQVlyQixJQUFJLElBQUk4QjtRQUNwQlQsWUFBWXJCLElBQUksQ0FBQ2U7SUFDbkI7SUFFQSxNQUFNcUIsaUJBQWlCaEIsWUFDcEJjLEdBQUcsQ0FBQyxDQUFDRyxPQUFTLENBQUMsT0FBTyxFQUFFMUIsS0FBS3VCLEdBQUcsQ0FBQyxJQUFNLEtBQUtQLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUN6REEsSUFBSSxDQUFDO0lBRVIsTUFBTVcsa0JBQXdELEVBQUU7SUFDaEUsS0FBSyxNQUFNQyxPQUFPbkIsWUFBYTtRQUM3QmtCLGdCQUFnQnRDLElBQUksQ0FBQ3VDO1FBQ3JCLEtBQUssTUFBTXpCLE9BQU9ILEtBQU07WUFDdEIyQixnQkFBZ0J0QyxJQUFJLENBQUNjLEdBQUcsQ0FBQ3lCLElBQUk7UUFDL0I7SUFDRjtJQUVBLE1BQU1sQyxNQUFNYyxHQUFHWixHQUFHLENBQUMsQ0FBQyxjQUFjLEVBQUVxQixNQUFNRCxJQUFJLENBQUMsTUFBTSxPQUFPLEVBQUVTLGdCQUFnQixFQUFFO1FBQzlFNUM7V0FDRzZCO1dBQ0FpQjtLQUNKO0lBRUQsT0FBT2pDLElBQUltQyxPQUFPO0FBQ3BCIn0=
@@ -1,18 +1,90 @@
1
- import { Knex } from "knex";
2
- import { DBPreset } from "./db";
3
- import { type SubsetQuery } from "../types/types";
1
+ import type { Knex } from "knex";
2
+ import { type DatabaseSchemaExtend, type SubsetQuery } from "../types/types";
4
3
  import type { BaseListParams } from "../utils/model";
5
- import { UpsertBuilder } from "./upsert-builder";
4
+ import type { EnhancerMap, ExecuteSubsetQueryResult, ResolveSubsetIntersection, UnionExtractedTTables } from "./base-model.types";
5
+ import type { DBPreset } from "./db";
6
+ import { Puri } from "./puri";
7
+ import type { InferAllSubsets, PuriLoaderQueries, PuriSubsetFn } from "./puri-subset.types";
6
8
  import { PuriWrapper } from "./puri-wrapper";
7
- export declare class BaseModelClass {
9
+ import { UpsertBuilder } from "./upsert-builder";
10
+ type UnknownDBRecord = Record<string, unknown>;
11
+ /**
12
+ * 모든 Model 클래스의 기본 클래스
13
+ *
14
+ * @template TSubsetKey - 서브셋 키 유니온 (예: "A" | "P" | "SS")
15
+ * @template TSubsetMapping - 서브셋별 최종 결과 타입 매핑
16
+ * @template TSubsetQueries - 서브셋 쿼리 함수 객체
17
+ * @template TLoaderQueries - 서브셋별 로더 쿼리 배열 객체
18
+ */
19
+ export declare class BaseModelClass<TSubsetKey extends string = never, TSubsetMapping extends Record<string, any> = never, TSubsetQueries extends Record<TSubsetKey, PuriSubsetFn> = never, TLoaderQueries extends PuriLoaderQueries<TSubsetKey> = never> {
20
+ protected subsetQueries?: TSubsetQueries | undefined;
21
+ protected loaderQueries?: TLoaderQueries | undefined;
8
22
  modelName: string;
23
+ constructor(subsetQueries?: TSubsetQueries | undefined, loaderQueries?: TLoaderQueries | undefined);
9
24
  getDB(which: DBPreset): Knex;
10
25
  getPuri(which: DBPreset): PuriWrapper;
11
26
  destroy(): Promise<void>;
12
- myNow(timestamp?: number): string;
13
- getInsertedIds(wdb: Knex, rows: any[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise<number[]>;
14
- useLoaders(db: Knex, rows: any[], loaders: SubsetQuery["loaders"]): Promise<any[]>;
15
- hydrate<T>(rows: T[]): T[];
27
+ getInsertedIds(wdb: Knex, rows: UnknownDBRecord[], tableName: string, unqKeyFields: string[], chunkSize?: number): Promise<number[]>;
28
+ /**
29
+ * 특정 서브셋에 대한 쿼리 빌더 획득
30
+ *
31
+ * @returns qb - 쿼리 빌더 (조건 추가용)
32
+ * @returns onSubset - 특정 서브셋 전용 타입이 필요할 때 사용
33
+ */
34
+ getSubsetQueries<T extends TSubsetKey>(subset: T): {
35
+ qb: Puri<DatabaseSchemaExtend, UnionExtractedTTables<TSubsetKey, TSubsetQueries> & {
36
+ NonAllowedAsSingleTable: {
37
+ __fulltext__: true;
38
+ };
39
+ }, {}>;
40
+ onSubset: {
41
+ <S extends TSubsetKey>(subset: S): ReturnType<TSubsetQueries[S]>;
42
+ <Arr extends readonly TSubsetKey[]>(subsets: [...Arr]): ResolveSubsetIntersection<Arr, TSubsetQueries>;
43
+ };
44
+ };
45
+ /**
46
+ * Enhancer 객체 생성 헬퍼
47
+ * 타입 검증 및 추론을 도와줌
48
+ */
49
+ createEnhancers<T extends TSubsetKey>(enhancers: EnhancerMap<T, InferAllSubsets<TSubsetQueries, TLoaderQueries>, TSubsetMapping>): EnhancerMap<T, InferAllSubsets<TSubsetQueries, TLoaderQueries>, TSubsetMapping>;
50
+ /**
51
+ * 서브셋 쿼리 실행
52
+ *
53
+ * 1. 쿼리 실행 (pagination 적용)
54
+ * 2. 로더 실행 (1:N, N:M 관계 데이터 로딩)
55
+ * 3. Hydrate (flat → 중첩 객체)
56
+ * 4. Enhancer 적용 (virtual 필드 계산)
57
+ */
58
+ executeSubsetQuery<T extends TSubsetKey, TComputedResults extends InferAllSubsets<TSubsetQueries, TLoaderQueries>>(params: {
59
+ subset: T;
60
+ qb: Puri<any, any, any>;
61
+ params: {
62
+ num?: number;
63
+ page?: number;
64
+ queryMode?: "list" | "count" | "both";
65
+ };
66
+ debug?: boolean;
67
+ optimizeCountQuery?: boolean;
68
+ } & EnhancerParam<TSubsetKey, TComputedResults, TSubsetMapping>): Promise<ExecuteSubsetQueryResult<TSubsetMapping, T>>;
69
+ /**
70
+ * COUNT 쿼리 실행 (내부 메서드)
71
+ */
72
+ private executeCountQuery;
73
+ /**
74
+ * LIST 쿼리 실행 (내부 메서드)
75
+ */
76
+ private executeListQuery;
77
+ /**
78
+ * 재귀적 로더 처리
79
+ */
80
+ private processLoaders;
81
+ /**
82
+ * Flat 레코드를 중첩 객체로 변환
83
+ *
84
+ * - `user__name` → `{ user: { name } }`
85
+ * - nullable relation의 경우 모든 필드가 null이면 객체 자체를 null로
86
+ */
87
+ hydrate<T extends UnknownDBRecord>(rows: T[]): T[];
16
88
  runSubsetQuery<T extends BaseListParams, U extends string>({ params, baseTable, subset, subsetQuery, build, afterBuild, debug, db: _db, optimizeCountQuery, }: {
17
89
  subset: U;
18
90
  params: T;
@@ -41,8 +113,22 @@ export declare class BaseModelClass {
41
113
  subsetQuery: SubsetQuery;
42
114
  qb: Knex.QueryBuilder;
43
115
  }>;
116
+ useLoaders(db: Knex, rows: UnknownDBRecord[], loaders: SubsetQuery["loaders"]): Promise<UnknownDBRecord[]>;
44
117
  getJoinClause(db: Knex<any, unknown>, join: SubsetQuery["joins"][number]): Knex.Raw<any>;
45
118
  getUpsertBuilder(): UpsertBuilder;
46
119
  }
47
- export declare const BaseModel: BaseModelClass;
120
+ /**
121
+ * Enhancer 파라미터 조건부 타입
122
+ * RequiredEnhancerKeys가 없으면 enhancers 선택적, 있으면 필수
123
+ */
124
+ type EnhancerParam<TSubsetKey extends string, TComputedResults extends Record<TSubsetKey, any>, TSubsetMapping extends Record<TSubsetKey, any>> = [RequiredEnhancerKeys<TSubsetKey, TComputedResults, TSubsetMapping>] extends [never] ? {
125
+ enhancers?: EnhancerMap<TSubsetKey, TComputedResults, TSubsetMapping>;
126
+ } : {
127
+ enhancers: EnhancerMap<TSubsetKey, TComputedResults, TSubsetMapping>;
128
+ };
129
+ type RequiredEnhancerKeys<TSubsetKey extends string, TComputedResults extends Record<TSubsetKey, any>, TSubsetMapping extends Record<TSubsetKey, any>> = {
130
+ [K in TSubsetKey]: TComputedResults[K] extends TSubsetMapping[K] ? never : K;
131
+ }[TSubsetKey];
132
+ export declare const BaseModel: BaseModelClass<never, never, never, never>;
133
+ export {};
48
134
  //# sourceMappingURL=base-model.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAE5B,OAAO,EAAE,QAAQ,EAAM,MAAM,MAAM,CAAC;AACpC,OAAO,EAAsB,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACtE,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGrD,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,qBAAa,cAAc;IAClB,SAAS,EAAE,MAAM,CAAa;IAGrC,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAI5B,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW;IAY/B,OAAO;IAIb,KAAK,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,MAAM;IAQ3B,cAAc,CAClB,GAAG,EAAE,IAAI,EACT,IAAI,EAAE,GAAG,EAAE,EACX,SAAS,EAAE,MAAM,EACjB,YAAY,EAAE,MAAM,EAAE,EACtB,SAAS,GAAE,MAAY;IAkCnB,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,WAAW,CAAC,SAAS,CAAC;IAiFvE,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE;IAiDpB,cAAc,CAAC,CAAC,SAAS,cAAc,EAAE,CAAC,SAAS,MAAM,EAAE,EAC/D,MAAM,EACN,SAAS,EACT,MAAM,EACN,WAAW,EACX,KAAK,EACL,UAAU,EACV,KAAK,EACL,EAAE,EAAE,GAAG,EACP,kBAAkB,GACnB,EAAE;QACD,MAAM,EAAE,CAAC,CAAC;QACV,MAAM,EAAE,CAAC,CAAC;QACV,WAAW,EAAE,WAAW,CAAC;QACzB,KAAK,EAAE,CAAC,WAAW,EAAE;YACnB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,KAAK,IAAI,CAAC,YAAY,CAAC;QACxB,UAAU,CAAC,EAAE,CAAC,WAAW,EAAE;YACzB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;YACtB,EAAE,EAAE,IAAI,CAAC;YACT,MAAM,EAAE,CAAC,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC;YAC5B,OAAO,EAAE,MAAM,EAAE,CAAC;SACnB,KAAK,IAAI,CAAC,YAAY,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,OAAO,CAAC;QACnC,EAAE,CAAC,EAAE,IAAI,CAAC;QACV,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,GAAG,OAAO,CAAC;QACV,IAAI,EAAE,GAAG,EAAE,CAAC;QACZ,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAC3B,WAAW,EAAE,WAAW,CAAC;QACzB,EAAE,EAAE,IAAI,CAAC,YAAY,CAAC;KACvB,CAAC;IAiJF,aAAa,CACX,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,EACtB,IAAI,EAAE,WAAW,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,GACjC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IAQhB,gBAAgB,IAAI,aAAa;CAGlC;AACD,eAAO,MAAM,SAAS,gBAAuB,CAAC"}
1
+ {"version":3,"file":"base-model.d.ts","sourceRoot":"","sources":["../../src/database/base-model.ts"],"names":[],"mappings":"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"}