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,93 @@
1
+ /**
2
+ * BaseModel 타입 시스템
3
+ *
4
+ * BaseModelClass에서 사용하는 타입 유틸리티들.
5
+ * Enhancer, SubsetQuery 교집합 등 Model 계층에서 필요한 타입 정의.
6
+ */
7
+ import type { DatabaseSchemaExtend } from "../types/types";
8
+ import type { Puri } from "./puri";
9
+ import type { PuriSubsetFn } from "./puri-subset.types";
10
+ /**
11
+ * Puri 인스턴스에서 TTables 타입 추출
12
+ */
13
+ export type ExtractPuriTables<T> = T extends Puri<any, infer TTables, any> ? TTables : never;
14
+ /**
15
+ * SubsetQueries에서 모든 TTables의 유니온 추출
16
+ * getSubsetQueries의 qb 타입 정의에 사용
17
+ */
18
+ export type UnionExtractedTTables<TSubsetKey extends string, TSubsetQueries extends Record<TSubsetKey, PuriSubsetFn>> = ExtractPuriTables<ReturnType<TSubsetQueries[TSubsetKey]>>;
19
+ /**
20
+ * 두 Puri의 테이블 교집합을 가진 새로운 Puri 생성
21
+ */
22
+ type MergePuriTables<A, B, TA = ExtractPuriTables<A>, TB = ExtractPuriTables<B>> = Puri<DatabaseSchemaExtend, Pick<TA, Extract<keyof TA, keyof TB>>, any>;
23
+ /**
24
+ * 서브셋 키 배열을 순회하며 테이블 교집합 Puri 계산
25
+ *
26
+ * onSubset(['A', 'P'])와 같이 여러 subset을 지정했을 때,
27
+ * 공통으로 사용 가능한 테이블만 포함된 Puri 타입 반환
28
+ */
29
+ export type ResolveSubsetIntersection<Keys extends readonly string[], Queries extends Record<string, (...args: any) => any>> = Keys extends [infer Head extends string, ...infer Tail extends string[]] ? Tail extends [] ? ReturnType<Queries[Head]> : MergePuriTables<ReturnType<Queries[Head]>, ResolveSubsetIntersection<Tail, Queries>> : never;
30
+ /**
31
+ * 단일 Enhancer 함수 타입
32
+ * computed 결과를 받아 최종 mapping 타입으로 변환
33
+ */
34
+ export type EnhancerFn<TComputed, TMapping> = (row: TComputed) => TMapping | Promise<TMapping>;
35
+ /**
36
+ * Enhancer가 필수인 SubsetKey 추출
37
+ *
38
+ * ComputedResults[K]가 SubsetMapping[K]에 할당 불가능하면 해당 K는 필수
39
+ * (즉, virtual 필드 등 추가 변환이 필요한 경우)
40
+ */
41
+ export type RequiredEnhancerKeys<TSubsetKey extends string, TComputedResults extends Record<TSubsetKey, any>, TSubsetMapping extends Record<TSubsetKey, any>> = {
42
+ [K in TSubsetKey]: TComputedResults[K] extends TSubsetMapping[K] ? never : K;
43
+ }[TSubsetKey];
44
+ /**
45
+ * Enhancer 객체 타입 정의
46
+ *
47
+ * - ComputedResults[K]가 SubsetMapping[K]에 assignable하면 → enhancer 선택적
48
+ * - 그렇지 않으면 → enhancer 필수
49
+ *
50
+ * @example
51
+ * // virtual 필드 employee_count가 있는 경우
52
+ * type Computed = { id: number; name: string }
53
+ * type Mapping = { id: number; name: string; employee_count: number }
54
+ * // → Enhancer 필수 (employee_count 계산 필요)
55
+ */
56
+ export type EnhancerMap<TSubsetKey extends string, TComputedResults extends Record<TSubsetKey, any>, TSubsetMapping extends Record<TSubsetKey, any>> = {
57
+ [K in TSubsetKey as TComputedResults[K] extends TSubsetMapping[K] ? K : never]?: EnhancerFn<TComputedResults[K], TSubsetMapping[K]>;
58
+ } & {
59
+ [K in TSubsetKey as TComputedResults[K] extends TSubsetMapping[K] ? never : K]: EnhancerFn<TComputedResults[K], TSubsetMapping[K]>;
60
+ };
61
+ /**
62
+ * executeSubsetQuery 기본 파라미터
63
+ */
64
+ export type ExecuteSubsetQueryBaseParams<TSubsetKey extends string> = {
65
+ subset: TSubsetKey;
66
+ qb: Puri<any, any, any>;
67
+ params: {
68
+ num?: number;
69
+ page?: number;
70
+ queryMode?: "list" | "count" | "both";
71
+ };
72
+ debug?: boolean;
73
+ optimizeCountQuery?: boolean;
74
+ };
75
+ /**
76
+ * executeSubsetQuery 파라미터 (Enhancer 포함)
77
+ *
78
+ * RequiredEnhancerKeys가 없으면 enhancers 선택적, 있으면 필수
79
+ */
80
+ export type ExecuteSubsetQueryParams<TSubsetKey extends string, TComputedResults extends Record<TSubsetKey, any>, TSubsetMapping extends Record<TSubsetKey, any>, T extends TSubsetKey> = ExecuteSubsetQueryBaseParams<T> & ([RequiredEnhancerKeys<TSubsetKey, TComputedResults, TSubsetMapping>] extends [never] ? {
81
+ enhancers?: EnhancerMap<TSubsetKey, TComputedResults, TSubsetMapping>;
82
+ } : {
83
+ enhancers: EnhancerMap<TSubsetKey, TComputedResults, TSubsetMapping>;
84
+ });
85
+ /**
86
+ * executeSubsetQuery 반환 타입
87
+ */
88
+ export type ExecuteSubsetQueryResult<TSubsetMapping extends Record<string, any>, T extends string> = {
89
+ rows: TSubsetMapping[T][];
90
+ total: number;
91
+ };
92
+ export {};
93
+ //# sourceMappingURL=base-model.types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"base-model.types.d.ts","sourceRoot":"","sources":["../../src/database/base-model.types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAC3D,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAMxD;;GAEG;AACH,MAAM,MAAM,iBAAiB,CAAC,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,GAAG,EAAE,MAAM,OAAO,EAAE,GAAG,CAAC,GAAG,OAAO,GAAG,KAAK,CAAC;AAE7F;;;GAGG;AACH,MAAM,MAAM,qBAAqB,CAC/B,UAAU,SAAS,MAAM,EACzB,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,YAAY,CAAC,IACrD,iBAAiB,CAAC,UAAU,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;AAM9D;;GAEG;AACH,KAAK,eAAe,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,GAAG,iBAAiB,CAAC,CAAC,CAAC,IAAI,IAAI,CACrF,oBAAoB,EACpB,IAAI,CAAC,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,CAAC,CAAC,EACrC,GAAG,CACJ,CAAC;AAEF;;;;;GAKG;AACH,MAAM,MAAM,yBAAyB,CACnC,IAAI,SAAS,SAAS,MAAM,EAAE,EAC9B,OAAO,SAAS,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,IAAI,EAAE,GAAG,KAAK,GAAG,CAAC,IACnD,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,MAAM,EAAE,GAAG,MAAM,IAAI,SAAS,MAAM,EAAE,CAAC,GACxE,IAAI,SAAS,EAAE,GACb,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,GACzB,eAAe,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,EAAE,yBAAyB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,GACtF,KAAK,CAAC;AAMV;;;GAGG;AACH,MAAM,MAAM,UAAU,CAAC,SAAS,EAAE,QAAQ,IAAI,CAAC,GAAG,EAAE,SAAS,KAAK,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;AAE/F;;;;;GAKG;AACH,MAAM,MAAM,oBAAoB,CAC9B,UAAU,SAAS,MAAM,EACzB,gBAAgB,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAChD,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,IAC5C;KACD,CAAC,IAAI,UAAU,GAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC;CAC7E,CAAC,UAAU,CAAC,CAAC;AAEd;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,WAAW,CACrB,UAAU,SAAS,MAAM,EACzB,gBAAgB,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAChD,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,IAC5C;KAED,CAAC,IAAI,UAAU,IAAI,gBAAgB,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,EAAE,UAAU,CACzF,gBAAgB,CAAC,CAAC,CAAC,EACnB,cAAc,CAAC,CAAC,CAAC,CAClB;CACF,GAAG;KAED,CAAC,IAAI,UAAU,IAAI,gBAAgB,CAAC,CAAC,CAAC,SAAS,cAAc,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,GAAG,UAAU,CACxF,gBAAgB,CAAC,CAAC,CAAC,EACnB,cAAc,CAAC,CAAC,CAAC,CAClB;CACF,CAAC;AAMF;;GAEG;AACH,MAAM,MAAM,4BAA4B,CAAC,UAAU,SAAS,MAAM,IAAI;IACpE,MAAM,EAAE,UAAU,CAAC;IACnB,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;IACxB,MAAM,EAAE;QACN,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,SAAS,CAAC,EAAE,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;KACvC,CAAC;IACF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF;;;;GAIG;AACH,MAAM,MAAM,wBAAwB,CAClC,UAAU,SAAS,MAAM,EACzB,gBAAgB,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAChD,cAAc,SAAS,MAAM,CAAC,UAAU,EAAE,GAAG,CAAC,EAC9C,CAAC,SAAS,UAAU,IAClB,4BAA4B,CAAC,CAAC,CAAC,GACjC,CAAC,CAAC,oBAAoB,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,GACjF;IAAE,SAAS,CAAC,EAAE,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;CAAE,GACzE;IAAE,SAAS,EAAE,WAAW,CAAC,UAAU,EAAE,gBAAgB,EAAE,cAAc,CAAC,CAAA;CAAE,CAAC,CAAC;AAEhF;;GAEG;AACH,MAAM,MAAM,wBAAwB,CAClC,cAAc,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC1C,CAAC,SAAS,MAAM,IACd;IACF,IAAI,EAAE,cAAc,CAAC,CAAC,CAAC,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * BaseModel 타입 시스템
3
+ *
4
+ * BaseModelClass에서 사용하는 타입 유틸리티들.
5
+ * Enhancer, SubsetQuery 교집합 등 Model 계층에서 필요한 타입 정의.
6
+ */ /**
7
+ * executeSubsetQuery 반환 타입
8
+ */ export { };
9
+
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9iYXNlLW1vZGVsLnR5cGVzLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQmFzZU1vZGVsIO2DgOyehSDsi5zsiqTthZxcbiAqXG4gKiBCYXNlTW9kZWxDbGFzc+yXkOyEnCDsgqzsmqntlZjripQg7YOA7J6FIOycoO2LuOumrO2LsOuTpC5cbiAqIEVuaGFuY2VyLCBTdWJzZXRRdWVyeSDqtZDsp5Htlakg65OxIE1vZGVsIOqzhOy4teyXkOyEnCDtlYTsmpTtlZwg7YOA7J6FIOygleydmC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlTdWJzZXRGbiB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFB1cmkg7YWM7J2067iUIOy2lOy2nCDsnKDti7jrpqzti7Bcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBQdXJpIOyduOyKpO2EtOyKpOyXkOyEnCBUVGFibGVzIO2DgOyehSDstpTstpxcbiAqL1xuZXhwb3J0IHR5cGUgRXh0cmFjdFB1cmlUYWJsZXM8VD4gPSBUIGV4dGVuZHMgUHVyaTxhbnksIGluZmVyIFRUYWJsZXMsIGFueT4gPyBUVGFibGVzIDogbmV2ZXI7XG5cbi8qKlxuICogU3Vic2V0UXVlcmllc+yXkOyEnCDrqqjrk6AgVFRhYmxlc+ydmCDsnKDri4jsmKgg7LaU7LacXG4gKiBnZXRTdWJzZXRRdWVyaWVz7J2YIHFiIO2DgOyehSDsoJXsnZjsl5Ag7IKs7JqpXG4gKi9cbmV4cG9ydCB0eXBlIFVuaW9uRXh0cmFjdGVkVFRhYmxlczxcbiAgVFN1YnNldEtleSBleHRlbmRzIHN0cmluZyxcbiAgVFN1YnNldFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgUHVyaVN1YnNldEZuPixcbj4gPSBFeHRyYWN0UHVyaVRhYmxlczxSZXR1cm5UeXBlPFRTdWJzZXRRdWVyaWVzW1RTdWJzZXRLZXldPj47XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIFN1YnNldCDqtZDsp5Htlakg6rOE7IKwIChvblN1YnNldCDrqZTshJzrk5zsmqkpXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog65GQIFB1cmnsnZgg7YWM7J2067iUIOq1kOynke2VqeydhCDqsIDsp4Qg7IOI66Gc7Jq0IFB1cmkg7IOd7ISxXG4gKi9cbnR5cGUgTWVyZ2VQdXJpVGFibGVzPEEsIEIsIFRBID0gRXh0cmFjdFB1cmlUYWJsZXM8QT4sIFRCID0gRXh0cmFjdFB1cmlUYWJsZXM8Qj4+ID0gUHVyaTxcbiAgRGF0YWJhc2VTY2hlbWFFeHRlbmQsXG4gIFBpY2s8VEEsIEV4dHJhY3Q8a2V5b2YgVEEsIGtleW9mIFRCPj4sXG4gIGFueVxuPjtcblxuLyoqXG4gKiDshJzruIzshYsg7YKkIOuwsOyXtOydhCDsiJztmoztlZjrqbAg7YWM7J2067iUIOq1kOynke2VqSBQdXJpIOqzhOyCsFxuICpcbiAqIG9uU3Vic2V0KFsnQScsICdQJ10p7JmAIOqwmeydtCDsl6zrn6wgc3Vic2V07J2EIOyngOygle2WiOydhCDrlYwsXG4gKiDqs7XthrXsnLzroZwg7IKs7JqpIOqwgOuKpe2VnCDthYzsnbTruJTrp4wg7Y+s7ZWo65CcIFB1cmkg7YOA7J6FIOuwmO2ZmFxuICovXG5leHBvcnQgdHlwZSBSZXNvbHZlU3Vic2V0SW50ZXJzZWN0aW9uPFxuICBLZXlzIGV4dGVuZHMgcmVhZG9ubHkgc3RyaW5nW10sXG4gIFF1ZXJpZXMgZXh0ZW5kcyBSZWNvcmQ8c3RyaW5nLCAoLi4uYXJnczogYW55KSA9PiBhbnk+LFxuPiA9IEtleXMgZXh0ZW5kcyBbaW5mZXIgSGVhZCBleHRlbmRzIHN0cmluZywgLi4uaW5mZXIgVGFpbCBleHRlbmRzIHN0cmluZ1tdXVxuICA/IFRhaWwgZXh0ZW5kcyBbXVxuICAgID8gUmV0dXJuVHlwZTxRdWVyaWVzW0hlYWRdPlxuICAgIDogTWVyZ2VQdXJpVGFibGVzPFJldHVyblR5cGU8UXVlcmllc1tIZWFkXT4sIFJlc29sdmVTdWJzZXRJbnRlcnNlY3Rpb248VGFpbCwgUXVlcmllcz4+XG4gIDogbmV2ZXI7XG5cbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbi8vIEVuaGFuY2VyXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG5cbi8qKlxuICog64uo7J28IEVuaGFuY2VyIO2VqOyImCDtg4DsnoVcbiAqIGNvbXB1dGVkIOqysOqzvOulvCDrsJvslYQg7LWc7KKFIG1hcHBpbmcg7YOA7J6F7Jy866GcIOuzgO2ZmFxuICovXG5leHBvcnQgdHlwZSBFbmhhbmNlckZuPFRDb21wdXRlZCwgVE1hcHBpbmc+ID0gKHJvdzogVENvbXB1dGVkKSA9PiBUTWFwcGluZyB8IFByb21pc2U8VE1hcHBpbmc+O1xuXG4vKipcbiAqIEVuaGFuY2Vy6rCAIO2VhOyImOyduCBTdWJzZXRLZXkg7LaU7LacXG4gKlxuICogQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5Ag7ZWg64u5IOu2iOqwgOuKpe2VmOuptCDtlbTri7kgS+uKlCDtlYTsiJhcbiAqICjspoksIHZpcnR1YWwg7ZWE65OcIOuTsSDstpTqsIAg67OA7ZmY7J20IO2VhOyalO2VnCDqsr3smrApXG4gKi9cbmV4cG9ydCB0eXBlIFJlcXVpcmVkRW5oYW5jZXJLZXlzPFxuICBUU3Vic2V0S2V5IGV4dGVuZHMgc3RyaW5nLFxuICBUQ29tcHV0ZWRSZXN1bHRzIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4gIFRTdWJzZXRNYXBwaW5nIGV4dGVuZHMgUmVjb3JkPFRTdWJzZXRLZXksIGFueT4sXG4+ID0ge1xuICBbSyBpbiBUU3Vic2V0S2V5XTogVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLO1xufVtUU3Vic2V0S2V5XTtcblxuLyoqXG4gKiBFbmhhbmNlciDqsJ3ssrQg7YOA7J6FIOygleydmFxuICpcbiAqIC0gQ29tcHV0ZWRSZXN1bHRzW0td6rCAIFN1YnNldE1hcHBpbmdbS13sl5AgYXNzaWduYWJsZe2VmOuptCDihpIgZW5oYW5jZXIg7ISg7YOd7KCBXG4gKiAtIOq3uOugh+yngCDslYrsnLzrqbQg4oaSIGVuaGFuY2VyIO2VhOyImFxuICpcbiAqIEBleGFtcGxlXG4gKiAvLyB2aXJ0dWFsIO2VhOuTnCBlbXBsb3llZV9jb3VudOqwgCDsnojripQg6rK97JqwXG4gKiB0eXBlIENvbXB1dGVkID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVxuICogdHlwZSBNYXBwaW5nID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtcGxveWVlX2NvdW50OiBudW1iZXIgfVxuICogLy8g4oaSIEVuaGFuY2VyIO2VhOyImCAoZW1wbG95ZWVfY291bnQg6rOE7IKwIO2VhOyalClcbiAqL1xuZXhwb3J0IHR5cGUgRW5oYW5jZXJNYXA8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55Pixcbj4gPSB7XG4gIC8vIENvbXB1dGVk6rCAIE1hcHBpbmfsl5Ag7Zi47ZmY65CY66m0IOyEoO2DneyggVxuICBbSyBpbiBUU3Vic2V0S2V5IGFzIFRDb21wdXRlZFJlc3VsdHNbS10gZXh0ZW5kcyBUU3Vic2V0TWFwcGluZ1tLXSA/IEsgOiBuZXZlcl0/OiBFbmhhbmNlckZuPFxuICAgIFRDb21wdXRlZFJlc3VsdHNbS10sXG4gICAgVFN1YnNldE1hcHBpbmdbS11cbiAgPjtcbn0gJiB7XG4gIC8vIO2YuO2ZmOuQmOyngCDslYrsnLzrqbQg7ZWE7IiYXG4gIFtLIGluIFRTdWJzZXRLZXkgYXMgVENvbXB1dGVkUmVzdWx0c1tLXSBleHRlbmRzIFRTdWJzZXRNYXBwaW5nW0tdID8gbmV2ZXIgOiBLXTogRW5oYW5jZXJGbjxcbiAgICBUQ29tcHV0ZWRSZXN1bHRzW0tdLFxuICAgIFRTdWJzZXRNYXBwaW5nW0tdXG4gID47XG59O1xuXG4vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4vLyBleGVjdXRlU3Vic2V0UXVlcnlcbi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuLyoqXG4gKiBleGVjdXRlU3Vic2V0UXVlcnkg6riw67O4IO2MjOudvOuvuO2EsFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlCYXNlUGFyYW1zPFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmc+ID0ge1xuICBzdWJzZXQ6IFRTdWJzZXRLZXk7XG4gIHFiOiBQdXJpPGFueSwgYW55LCBhbnk+O1xuICBwYXJhbXM6IHtcbiAgICBudW0/OiBudW1iZXI7XG4gICAgcGFnZT86IG51bWJlcjtcbiAgICBxdWVyeU1vZGU/OiBcImxpc3RcIiB8IFwiY291bnRcIiB8IFwiYm90aFwiO1xuICB9O1xuICBkZWJ1Zz86IGJvb2xlYW47XG4gIG9wdGltaXplQ291bnRRdWVyeT86IGJvb2xlYW47XG59O1xuXG4vKipcbiAqIGV4ZWN1dGVTdWJzZXRRdWVyeSDtjIzrnbzrr7jthLAgKEVuaGFuY2VyIO2PrO2VqClcbiAqXG4gKiBSZXF1aXJlZEVuaGFuY2VyS2V5c+qwgCDsl4bsnLzrqbQgZW5oYW5jZXJzIOyEoO2DneyggSwg7J6I7Jy866m0IO2VhOyImFxuICovXG5leHBvcnQgdHlwZSBFeGVjdXRlU3Vic2V0UXVlcnlQYXJhbXM8XG4gIFRTdWJzZXRLZXkgZXh0ZW5kcyBzdHJpbmcsXG4gIFRDb21wdXRlZFJlc3VsdHMgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVFN1YnNldE1hcHBpbmcgZXh0ZW5kcyBSZWNvcmQ8VFN1YnNldEtleSwgYW55PixcbiAgVCBleHRlbmRzIFRTdWJzZXRLZXksXG4+ID0gRXhlY3V0ZVN1YnNldFF1ZXJ5QmFzZVBhcmFtczxUPiAmXG4gIChbUmVxdWlyZWRFbmhhbmNlcktleXM8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+XSBleHRlbmRzIFtuZXZlcl1cbiAgICA/IHsgZW5oYW5jZXJzPzogRW5oYW5jZXJNYXA8VFN1YnNldEtleSwgVENvbXB1dGVkUmVzdWx0cywgVFN1YnNldE1hcHBpbmc+IH1cbiAgICA6IHsgZW5oYW5jZXJzOiBFbmhhbmNlck1hcDxUU3Vic2V0S2V5LCBUQ29tcHV0ZWRSZXN1bHRzLCBUU3Vic2V0TWFwcGluZz4gfSk7XG5cbi8qKlxuICogZXhlY3V0ZVN1YnNldFF1ZXJ5IOuwmO2ZmCDtg4DsnoVcbiAqL1xuZXhwb3J0IHR5cGUgRXhlY3V0ZVN1YnNldFF1ZXJ5UmVzdWx0PFxuICBUU3Vic2V0TWFwcGluZyBleHRlbmRzIFJlY29yZDxzdHJpbmcsIGFueT4sXG4gIFQgZXh0ZW5kcyBzdHJpbmcsXG4+ID0ge1xuICByb3dzOiBUU3Vic2V0TWFwcGluZ1tUXVtdO1xuICB0b3RhbDogbnVtYmVyO1xufTtcbiJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Q0FLQyxHQTRJRDs7Q0FFQyxHQUNELFdBTUUifQ==
@@ -1,4 +1,4 @@
1
- import { MigrationColumn, MigrationIndex } from "../types/types";
1
+ import type { MigrationColumn, MigrationIndex } from "../types/types";
2
2
  export declare class CodeGenerator {
3
3
  getAlterColumnsTo(entityColumns: MigrationColumn[], dbColumns: MigrationColumn[]): {
4
4
  add: MigrationColumn[];
@@ -1 +1 @@
1
- {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAEjE,qBAAa,aAAa;IACxB,iBAAiB,CACf,aAAa,EAAE,eAAe,EAAE,EAChC,SAAS,EAAE,eAAe,EAAE;aAGf,eAAe,EAAE;cAChB,eAAe,EAAE;eAChB,eAAe,EAAE;;IAiClC,iBAAiB,CACf,aAAa,EAAE,cAAc,EAAE,EAC/B,SAAS,EAAE,cAAc,EAAE;aAId,cAAc,EAAE;cACf,cAAc,EAAE;;CAmBjC"}
1
+ {"version":3,"file":"code-generator.d.ts","sourceRoot":"","sources":["../../src/database/code-generator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAGtE,qBAAa,aAAa;IACxB,iBAAiB,CAAC,aAAa,EAAE,eAAe,EAAE,EAAE,SAAS,EAAE,eAAe,EAAE;aAEjE,eAAe,EAAE;cAChB,eAAe,EAAE;eAChB,eAAe,EAAE;;IAuBlC,iBAAiB,CAAC,aAAa,EAAE,cAAc,EAAE,EAAE,SAAS,EAAE,cAAc,EAAE;aAG/D,cAAc,EAAE;cACf,cAAc,EAAE;;CAejC"}
@@ -1,5 +1,6 @@
1
- import * as _ from "lodash-es";
2
1
  import equal from "fast-deep-equal";
2
+ import { diff } from "radashi";
3
+ import { differenceWith, intersectionBy } from "../utils/utils.js";
3
4
  export class CodeGenerator {
4
5
  getAlterColumnsTo(entityColumns, dbColumns) {
5
6
  const columnsTo = {
@@ -9,8 +10,8 @@ export class CodeGenerator {
9
10
  };
10
11
  // 컬럼명 기준 비교
11
12
  const extraColumns = {
12
- db: _.differenceBy(dbColumns, entityColumns, (col)=>col.name),
13
- entity: _.differenceBy(entityColumns, dbColumns, (col)=>col.name)
13
+ db: diff(dbColumns, entityColumns, (col)=>col.name),
14
+ entity: diff(entityColumns, dbColumns, (col)=>col.name)
14
15
  };
15
16
  if (extraColumns.entity.length > 0) {
16
17
  columnsTo.add = columnsTo.add.concat(extraColumns.entity);
@@ -19,23 +20,23 @@ export class CodeGenerator {
19
20
  columnsTo.drop = columnsTo.drop.concat(extraColumns.db);
20
21
  }
21
22
  // 동일 컬럼명의 세부 필드 비교
22
- const sameDbColumns = _.intersectionBy(dbColumns, entityColumns, (col)=>col.name);
23
- const sameMdColumns = _.intersectionBy(entityColumns, dbColumns, (col)=>col.name);
24
- columnsTo.alter = _.differenceWith(sameDbColumns, sameMdColumns, (a, b)=>equal(a, b));
23
+ const sameDbColumns = intersectionBy(dbColumns, entityColumns, (col)=>col.name);
24
+ const sameMdColumns = intersectionBy(entityColumns, dbColumns, (col)=>col.name);
25
+ columnsTo.alter = differenceWith(sameDbColumns, sameMdColumns, (a, b)=>equal(a, b));
25
26
  return columnsTo;
26
27
  }
27
28
  getAlterIndexesTo(entityIndexes, dbIndexes) {
28
29
  // 인덱스 비교
29
- let indexesTo = {
30
+ const indexesTo = {
30
31
  add: [],
31
32
  drop: []
32
33
  };
33
34
  const extraIndexes = {
34
- db: _.differenceBy(dbIndexes, entityIndexes, (col)=>[
35
+ db: diff(dbIndexes, entityIndexes, (col)=>[
35
36
  col.type,
36
37
  col.columns.join("-")
37
38
  ].join("//")),
38
- entity: _.differenceBy(entityIndexes, dbIndexes, (col)=>[
39
+ entity: diff(entityIndexes, dbIndexes, (col)=>[
39
40
  col.type,
40
41
  col.columns.join("-")
41
42
  ].join("//"))
@@ -50,4 +51,4 @@ export class CodeGenerator {
50
51
  }
51
52
  }
52
53
 
53
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9jb2RlLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgKiBhcyBfIGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCBlcXVhbCBmcm9tIFwiZmFzdC1kZWVwLWVxdWFsXCI7XG5pbXBvcnQgeyBNaWdyYXRpb25Db2x1bW4sIE1pZ3JhdGlvbkluZGV4IH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5cbmV4cG9ydCBjbGFzcyBDb2RlR2VuZXJhdG9yIHtcbiAgZ2V0QWx0ZXJDb2x1bW5zVG8oXG4gICAgZW50aXR5Q29sdW1uczogTWlncmF0aW9uQ29sdW1uW10sXG4gICAgZGJDb2x1bW5zOiBNaWdyYXRpb25Db2x1bW5bXVxuICApIHtcbiAgICBjb25zdCBjb2x1bW5zVG8gPSB7XG4gICAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgZHJvcDogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgICBhbHRlcjogW10gYXMgTWlncmF0aW9uQ29sdW1uW10sXG4gICAgfTtcblxuICAgIC8vIOy7rOufvOuqhSDquLDspIAg67mE6rWQXG4gICAgY29uc3QgZXh0cmFDb2x1bW5zID0ge1xuICAgICAgZGI6IF8uZGlmZmVyZW5jZUJ5KGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgICAgZW50aXR5OiBfLmRpZmZlcmVuY2VCeShlbnRpdHlDb2x1bW5zLCBkYkNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKSxcbiAgICB9O1xuICAgIGlmIChleHRyYUNvbHVtbnMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbHVtbnNUby5hZGQgPSBjb2x1bW5zVG8uYWRkLmNvbmNhdChleHRyYUNvbHVtbnMuZW50aXR5KTtcbiAgICB9XG4gICAgaWYgKGV4dHJhQ29sdW1ucy5kYi5sZW5ndGggPiAwKSB7XG4gICAgICBjb2x1bW5zVG8uZHJvcCA9IGNvbHVtbnNUby5kcm9wLmNvbmNhdChleHRyYUNvbHVtbnMuZGIpO1xuICAgIH1cblxuICAgIC8vIOuPmeydvCDsu6zrn7zrqoXsnZgg7IS467aAIO2VhOuTnCDruYTqtZBcbiAgICBjb25zdCBzYW1lRGJDb2x1bW5zID0gXy5pbnRlcnNlY3Rpb25CeShcbiAgICAgIGRiQ29sdW1ucyxcbiAgICAgIGVudGl0eUNvbHVtbnMsXG4gICAgICAoY29sKSA9PiBjb2wubmFtZVxuICAgICk7XG4gICAgY29uc3Qgc2FtZU1kQ29sdW1ucyA9IF8uaW50ZXJzZWN0aW9uQnkoXG4gICAgICBlbnRpdHlDb2x1bW5zLFxuICAgICAgZGJDb2x1bW5zLFxuICAgICAgKGNvbCkgPT4gY29sLm5hbWVcbiAgICApO1xuICAgIGNvbHVtbnNUby5hbHRlciA9IF8uZGlmZmVyZW5jZVdpdGgoc2FtZURiQ29sdW1ucywgc2FtZU1kQ29sdW1ucywgKGEsIGIpID0+XG4gICAgICBlcXVhbChhLCBiKVxuICAgICk7XG5cbiAgICByZXR1cm4gY29sdW1uc1RvO1xuICB9XG5cbiAgZ2V0QWx0ZXJJbmRleGVzVG8oXG4gICAgZW50aXR5SW5kZXhlczogTWlncmF0aW9uSW5kZXhbXSxcbiAgICBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W11cbiAgKSB7XG4gICAgLy8g7J24642x7IqkIOu5hOq1kFxuICAgIGxldCBpbmRleGVzVG8gPSB7XG4gICAgICBhZGQ6IFtdIGFzIE1pZ3JhdGlvbkluZGV4W10sXG4gICAgICBkcm9wOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgIH07XG4gICAgY29uc3QgZXh0cmFJbmRleGVzID0ge1xuICAgICAgZGI6IF8uZGlmZmVyZW5jZUJ5KGRiSW5kZXhlcywgZW50aXR5SW5kZXhlcywgKGNvbCkgPT5cbiAgICAgICAgW2NvbC50eXBlLCBjb2wuY29sdW1ucy5qb2luKFwiLVwiKV0uam9pbihcIi8vXCIpXG4gICAgICApLFxuICAgICAgZW50aXR5OiBfLmRpZmZlcmVuY2VCeShlbnRpdHlJbmRleGVzLCBkYkluZGV4ZXMsIChjb2wpID0+XG4gICAgICAgIFtjb2wudHlwZSwgY29sLmNvbHVtbnMuam9pbihcIi1cIildLmpvaW4oXCIvL1wiKVxuICAgICAgKSxcbiAgICB9O1xuICAgIGlmIChleHRyYUluZGV4ZXMuZW50aXR5Lmxlbmd0aCA+IDApIHtcbiAgICAgIGluZGV4ZXNUby5hZGQgPSBpbmRleGVzVG8uYWRkLmNvbmNhdChleHRyYUluZGV4ZXMuZW50aXR5KTtcbiAgICB9XG4gICAgaWYgKGV4dHJhSW5kZXhlcy5kYi5sZW5ndGggPiAwKSB7XG4gICAgICBpbmRleGVzVG8uZHJvcCA9IGluZGV4ZXNUby5kcm9wLmNvbmNhdChleHRyYUluZGV4ZXMuZGIpO1xuICAgIH1cblxuICAgIHJldHVybiBpbmRleGVzVG87XG4gIH1cbn1cbiJdLCJuYW1lcyI6WyJfIiwiZXF1YWwiLCJDb2RlR2VuZXJhdG9yIiwiZ2V0QWx0ZXJDb2x1bW5zVG8iLCJlbnRpdHlDb2x1bW5zIiwiZGJDb2x1bW5zIiwiY29sdW1uc1RvIiwiYWRkIiwiZHJvcCIsImFsdGVyIiwiZXh0cmFDb2x1bW5zIiwiZGIiLCJkaWZmZXJlbmNlQnkiLCJjb2wiLCJuYW1lIiwiZW50aXR5IiwibGVuZ3RoIiwiY29uY2F0Iiwic2FtZURiQ29sdW1ucyIsImludGVyc2VjdGlvbkJ5Iiwic2FtZU1kQ29sdW1ucyIsImRpZmZlcmVuY2VXaXRoIiwiYSIsImIiLCJnZXRBbHRlckluZGV4ZXNUbyIsImVudGl0eUluZGV4ZXMiLCJkYkluZGV4ZXMiLCJpbmRleGVzVG8iLCJleHRyYUluZGV4ZXMiLCJ0eXBlIiwiY29sdW1ucyIsImpvaW4iXSwibWFwcGluZ3MiOiJBQUFBLFlBQVlBLE9BQU8sWUFBWTtBQUMvQixPQUFPQyxXQUFXLGtCQUFrQjtBQUdwQyxPQUFPLE1BQU1DO0lBQ1hDLGtCQUNFQyxhQUFnQyxFQUNoQ0MsU0FBNEIsRUFDNUI7UUFDQSxNQUFNQyxZQUFZO1lBQ2hCQyxLQUFLLEVBQUU7WUFDUEMsTUFBTSxFQUFFO1lBQ1JDLE9BQU8sRUFBRTtRQUNYO1FBRUEsWUFBWTtRQUNaLE1BQU1DLGVBQWU7WUFDbkJDLElBQUlYLEVBQUVZLFlBQVksQ0FBQ1AsV0FBV0QsZUFBZSxDQUFDUyxNQUFRQSxJQUFJQyxJQUFJO1lBQzlEQyxRQUFRZixFQUFFWSxZQUFZLENBQUNSLGVBQWVDLFdBQVcsQ0FBQ1EsTUFBUUEsSUFBSUMsSUFBSTtRQUNwRTtRQUNBLElBQUlKLGFBQWFLLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENWLFVBQVVDLEdBQUcsR0FBR0QsVUFBVUMsR0FBRyxDQUFDVSxNQUFNLENBQUNQLGFBQWFLLE1BQU07UUFDMUQ7UUFDQSxJQUFJTCxhQUFhQyxFQUFFLENBQUNLLE1BQU0sR0FBRyxHQUFHO1lBQzlCVixVQUFVRSxJQUFJLEdBQUdGLFVBQVVFLElBQUksQ0FBQ1MsTUFBTSxDQUFDUCxhQUFhQyxFQUFFO1FBQ3hEO1FBRUEsbUJBQW1CO1FBQ25CLE1BQU1PLGdCQUFnQmxCLEVBQUVtQixjQUFjLENBQ3BDZCxXQUNBRCxlQUNBLENBQUNTLE1BQVFBLElBQUlDLElBQUk7UUFFbkIsTUFBTU0sZ0JBQWdCcEIsRUFBRW1CLGNBQWMsQ0FDcENmLGVBQ0FDLFdBQ0EsQ0FBQ1EsTUFBUUEsSUFBSUMsSUFBSTtRQUVuQlIsVUFBVUcsS0FBSyxHQUFHVCxFQUFFcUIsY0FBYyxDQUFDSCxlQUFlRSxlQUFlLENBQUNFLEdBQUdDLElBQ25FdEIsTUFBTXFCLEdBQUdDO1FBR1gsT0FBT2pCO0lBQ1Q7SUFFQWtCLGtCQUNFQyxhQUErQixFQUMvQkMsU0FBMkIsRUFDM0I7UUFDQSxTQUFTO1FBQ1QsSUFBSUMsWUFBWTtZQUNkcEIsS0FBSyxFQUFFO1lBQ1BDLE1BQU0sRUFBRTtRQUNWO1FBQ0EsTUFBTW9CLGVBQWU7WUFDbkJqQixJQUFJWCxFQUFFWSxZQUFZLENBQUNjLFdBQVdELGVBQWUsQ0FBQ1osTUFDNUM7b0JBQUNBLElBQUlnQixJQUFJO29CQUFFaEIsSUFBSWlCLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDO2lCQUFLLENBQUNBLElBQUksQ0FBQztZQUV6Q2hCLFFBQVFmLEVBQUVZLFlBQVksQ0FBQ2EsZUFBZUMsV0FBVyxDQUFDYixNQUNoRDtvQkFBQ0EsSUFBSWdCLElBQUk7b0JBQUVoQixJQUFJaUIsT0FBTyxDQUFDQyxJQUFJLENBQUM7aUJBQUssQ0FBQ0EsSUFBSSxDQUFDO1FBRTNDO1FBQ0EsSUFBSUgsYUFBYWIsTUFBTSxDQUFDQyxNQUFNLEdBQUcsR0FBRztZQUNsQ1csVUFBVXBCLEdBQUcsR0FBR29CLFVBQVVwQixHQUFHLENBQUNVLE1BQU0sQ0FBQ1csYUFBYWIsTUFBTTtRQUMxRDtRQUNBLElBQUlhLGFBQWFqQixFQUFFLENBQUNLLE1BQU0sR0FBRyxHQUFHO1lBQzlCVyxVQUFVbkIsSUFBSSxHQUFHbUIsVUFBVW5CLElBQUksQ0FBQ1MsTUFBTSxDQUFDVyxhQUFhakIsRUFBRTtRQUN4RDtRQUVBLE9BQU9nQjtJQUNUO0FBQ0YifQ==
54
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9jb2RlLWdlbmVyYXRvci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgZXF1YWwgZnJvbSBcImZhc3QtZGVlcC1lcXVhbFwiO1xuaW1wb3J0IHsgZGlmZiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgdHlwZSB7IE1pZ3JhdGlvbkNvbHVtbiwgTWlncmF0aW9uSW5kZXggfSBmcm9tIFwiLi4vdHlwZXMvdHlwZXNcIjtcbmltcG9ydCB7IGRpZmZlcmVuY2VXaXRoLCBpbnRlcnNlY3Rpb25CeSB9IGZyb20gXCIuLi91dGlscy91dGlsc1wiO1xuXG5leHBvcnQgY2xhc3MgQ29kZUdlbmVyYXRvciB7XG4gIGdldEFsdGVyQ29sdW1uc1RvKGVudGl0eUNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdLCBkYkNvbHVtbnM6IE1pZ3JhdGlvbkNvbHVtbltdKSB7XG4gICAgY29uc3QgY29sdW1uc1RvID0ge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25Db2x1bW5bXSxcbiAgICAgIGRyb3A6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgICAgYWx0ZXI6IFtdIGFzIE1pZ3JhdGlvbkNvbHVtbltdLFxuICAgIH07XG5cbiAgICAvLyDsu6zrn7zrqoUg6riw7KSAIOu5hOq1kFxuICAgIGNvbnN0IGV4dHJhQ29sdW1ucyA9IHtcbiAgICAgIGRiOiBkaWZmKGRiQ29sdW1ucywgZW50aXR5Q29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgICAgZW50aXR5OiBkaWZmKGVudGl0eUNvbHVtbnMsIGRiQ29sdW1ucywgKGNvbCkgPT4gY29sLm5hbWUpLFxuICAgIH07XG4gICAgaWYgKGV4dHJhQ29sdW1ucy5lbnRpdHkubGVuZ3RoID4gMCkge1xuICAgICAgY29sdW1uc1RvLmFkZCA9IGNvbHVtbnNUby5hZGQuY29uY2F0KGV4dHJhQ29sdW1ucy5lbnRpdHkpO1xuICAgIH1cbiAgICBpZiAoZXh0cmFDb2x1bW5zLmRiLmxlbmd0aCA+IDApIHtcbiAgICAgIGNvbHVtbnNUby5kcm9wID0gY29sdW1uc1RvLmRyb3AuY29uY2F0KGV4dHJhQ29sdW1ucy5kYik7XG4gICAgfVxuXG4gICAgLy8g64+Z7J28IOy7rOufvOuqheydmCDshLjrtoAg7ZWE65OcIOu5hOq1kFxuICAgIGNvbnN0IHNhbWVEYkNvbHVtbnMgPSBpbnRlcnNlY3Rpb25CeShkYkNvbHVtbnMsIGVudGl0eUNvbHVtbnMsIChjb2wpID0+IGNvbC5uYW1lKTtcbiAgICBjb25zdCBzYW1lTWRDb2x1bW5zID0gaW50ZXJzZWN0aW9uQnkoZW50aXR5Q29sdW1ucywgZGJDb2x1bW5zLCAoY29sKSA9PiBjb2wubmFtZSk7XG4gICAgY29sdW1uc1RvLmFsdGVyID0gZGlmZmVyZW5jZVdpdGgoc2FtZURiQ29sdW1ucywgc2FtZU1kQ29sdW1ucywgKGEsIGIpID0+IGVxdWFsKGEsIGIpKTtcblxuICAgIHJldHVybiBjb2x1bW5zVG87XG4gIH1cblxuICBnZXRBbHRlckluZGV4ZXNUbyhlbnRpdHlJbmRleGVzOiBNaWdyYXRpb25JbmRleFtdLCBkYkluZGV4ZXM6IE1pZ3JhdGlvbkluZGV4W10pIHtcbiAgICAvLyDsnbjrjbHsiqQg67mE6rWQXG4gICAgY29uc3QgaW5kZXhlc1RvID0ge1xuICAgICAgYWRkOiBbXSBhcyBNaWdyYXRpb25JbmRleFtdLFxuICAgICAgZHJvcDogW10gYXMgTWlncmF0aW9uSW5kZXhbXSxcbiAgICB9O1xuICAgIGNvbnN0IGV4dHJhSW5kZXhlcyA9IHtcbiAgICAgIGRiOiBkaWZmKGRiSW5kZXhlcywgZW50aXR5SW5kZXhlcywgKGNvbCkgPT4gW2NvbC50eXBlLCBjb2wuY29sdW1ucy5qb2luKFwiLVwiKV0uam9pbihcIi8vXCIpKSxcbiAgICAgIGVudGl0eTogZGlmZihlbnRpdHlJbmRleGVzLCBkYkluZGV4ZXMsIChjb2wpID0+IFtjb2wudHlwZSwgY29sLmNvbHVtbnMuam9pbihcIi1cIildLmpvaW4oXCIvL1wiKSksXG4gICAgfTtcbiAgICBpZiAoZXh0cmFJbmRleGVzLmVudGl0eS5sZW5ndGggPiAwKSB7XG4gICAgICBpbmRleGVzVG8uYWRkID0gaW5kZXhlc1RvLmFkZC5jb25jYXQoZXh0cmFJbmRleGVzLmVudGl0eSk7XG4gICAgfVxuICAgIGlmIChleHRyYUluZGV4ZXMuZGIubGVuZ3RoID4gMCkge1xuICAgICAgaW5kZXhlc1RvLmRyb3AgPSBpbmRleGVzVG8uZHJvcC5jb25jYXQoZXh0cmFJbmRleGVzLmRiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gaW5kZXhlc1RvO1xuICB9XG59XG4iXSwibmFtZXMiOlsiZXF1YWwiLCJkaWZmIiwiZGlmZmVyZW5jZVdpdGgiLCJpbnRlcnNlY3Rpb25CeSIsIkNvZGVHZW5lcmF0b3IiLCJnZXRBbHRlckNvbHVtbnNUbyIsImVudGl0eUNvbHVtbnMiLCJkYkNvbHVtbnMiLCJjb2x1bW5zVG8iLCJhZGQiLCJkcm9wIiwiYWx0ZXIiLCJleHRyYUNvbHVtbnMiLCJkYiIsImNvbCIsIm5hbWUiLCJlbnRpdHkiLCJsZW5ndGgiLCJjb25jYXQiLCJzYW1lRGJDb2x1bW5zIiwic2FtZU1kQ29sdW1ucyIsImEiLCJiIiwiZ2V0QWx0ZXJJbmRleGVzVG8iLCJlbnRpdHlJbmRleGVzIiwiZGJJbmRleGVzIiwiaW5kZXhlc1RvIiwiZXh0cmFJbmRleGVzIiwidHlwZSIsImNvbHVtbnMiLCJqb2luIl0sIm1hcHBpbmdzIjoiQUFBQSxPQUFPQSxXQUFXLGtCQUFrQjtBQUNwQyxTQUFTQyxJQUFJLFFBQVEsVUFBVTtBQUUvQixTQUFTQyxjQUFjLEVBQUVDLGNBQWMsUUFBUSxvQkFBaUI7QUFFaEUsT0FBTyxNQUFNQztJQUNYQyxrQkFBa0JDLGFBQWdDLEVBQUVDLFNBQTRCLEVBQUU7UUFDaEYsTUFBTUMsWUFBWTtZQUNoQkMsS0FBSyxFQUFFO1lBQ1BDLE1BQU0sRUFBRTtZQUNSQyxPQUFPLEVBQUU7UUFDWDtRQUVBLFlBQVk7UUFDWixNQUFNQyxlQUFlO1lBQ25CQyxJQUFJWixLQUFLTSxXQUFXRCxlQUFlLENBQUNRLE1BQVFBLElBQUlDLElBQUk7WUFDcERDLFFBQVFmLEtBQUtLLGVBQWVDLFdBQVcsQ0FBQ08sTUFBUUEsSUFBSUMsSUFBSTtRQUMxRDtRQUNBLElBQUlILGFBQWFJLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENULFVBQVVDLEdBQUcsR0FBR0QsVUFBVUMsR0FBRyxDQUFDUyxNQUFNLENBQUNOLGFBQWFJLE1BQU07UUFDMUQ7UUFDQSxJQUFJSixhQUFhQyxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCVCxVQUFVRSxJQUFJLEdBQUdGLFVBQVVFLElBQUksQ0FBQ1EsTUFBTSxDQUFDTixhQUFhQyxFQUFFO1FBQ3hEO1FBRUEsbUJBQW1CO1FBQ25CLE1BQU1NLGdCQUFnQmhCLGVBQWVJLFdBQVdELGVBQWUsQ0FBQ1EsTUFBUUEsSUFBSUMsSUFBSTtRQUNoRixNQUFNSyxnQkFBZ0JqQixlQUFlRyxlQUFlQyxXQUFXLENBQUNPLE1BQVFBLElBQUlDLElBQUk7UUFDaEZQLFVBQVVHLEtBQUssR0FBR1QsZUFBZWlCLGVBQWVDLGVBQWUsQ0FBQ0MsR0FBR0MsSUFBTXRCLE1BQU1xQixHQUFHQztRQUVsRixPQUFPZDtJQUNUO0lBRUFlLGtCQUFrQkMsYUFBK0IsRUFBRUMsU0FBMkIsRUFBRTtRQUM5RSxTQUFTO1FBQ1QsTUFBTUMsWUFBWTtZQUNoQmpCLEtBQUssRUFBRTtZQUNQQyxNQUFNLEVBQUU7UUFDVjtRQUNBLE1BQU1pQixlQUFlO1lBQ25CZCxJQUFJWixLQUFLd0IsV0FBV0QsZUFBZSxDQUFDVixNQUFRO29CQUFDQSxJQUFJYyxJQUFJO29CQUFFZCxJQUFJZSxPQUFPLENBQUNDLElBQUksQ0FBQztpQkFBSyxDQUFDQSxJQUFJLENBQUM7WUFDbkZkLFFBQVFmLEtBQUt1QixlQUFlQyxXQUFXLENBQUNYLE1BQVE7b0JBQUNBLElBQUljLElBQUk7b0JBQUVkLElBQUllLE9BQU8sQ0FBQ0MsSUFBSSxDQUFDO2lCQUFLLENBQUNBLElBQUksQ0FBQztRQUN6RjtRQUNBLElBQUlILGFBQWFYLE1BQU0sQ0FBQ0MsTUFBTSxHQUFHLEdBQUc7WUFDbENTLFVBQVVqQixHQUFHLEdBQUdpQixVQUFVakIsR0FBRyxDQUFDUyxNQUFNLENBQUNTLGFBQWFYLE1BQU07UUFDMUQ7UUFDQSxJQUFJVyxhQUFhZCxFQUFFLENBQUNJLE1BQU0sR0FBRyxHQUFHO1lBQzlCUyxVQUFVaEIsSUFBSSxHQUFHZ0IsVUFBVWhCLElBQUksQ0FBQ1EsTUFBTSxDQUFDUyxhQUFhZCxFQUFFO1FBQ3hEO1FBRUEsT0FBT2E7SUFDVDtBQUNGIn0=
@@ -1,18 +1,17 @@
1
- export type DBPreset = "w" | "r";
2
- import { Knex } from "knex";
3
1
  import { AsyncLocalStorage } from "async_hooks";
2
+ import { type Knex } from "knex";
3
+ import type { SonamuConfig } from "../api/config";
4
4
  import { TransactionContext } from "./transaction-context";
5
- import { SonamuConfig } from "../api/config";
5
+ export type DBPreset = "w" | "r";
6
6
  export type SonamuDBConfig = {
7
7
  development_master: Knex.Config;
8
8
  development_slave: Knex.Config;
9
9
  test: Knex.Config;
10
- fixture_local: Knex.Config;
11
10
  fixture_remote: Knex.Config;
12
11
  production_master: Knex.Config;
13
12
  production_slave: Knex.Config;
14
13
  };
15
- declare class DBClass {
14
+ export declare class DBClass {
16
15
  private wdb?;
17
16
  private rdb?;
18
17
  transactionStorage: AsyncLocalStorage<TransactionContext>;
@@ -24,7 +23,7 @@ declare class DBClass {
24
23
  testTransaction: Knex.Transaction | null;
25
24
  createTestTransaction(): Promise<Knex.Transaction>;
26
25
  clearTestTransaction(): Promise<void>;
26
+ getTestConnection(): Promise<Knex>;
27
27
  }
28
28
  export declare const DB: DBClass;
29
- export {};
30
29
  //# sourceMappingURL=db.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AACjC,OAAa,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAGlC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAC3D,OAAO,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AAE7D,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC;IAChC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;IAClB,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC;IAC3B,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;CAC/B,CAAC;AAEF,cAAM,OAAO;IACX,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,GAAG,CAAC,CAAO;IAEZ,kBAAkB,wCAA+C;IAEjE,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7D,qBAAqB,IAAI,kBAAkB;IAIlD,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAoDtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,cAAc;IAgFlE,eAAe,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAQ;IACjD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAKlD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;CAI5C;AACD,eAAO,MAAM,EAAE,SAAgB,CAAC"}
1
+ {"version":3,"file":"db.d.ts","sourceRoot":"","sources":["../../src/database/db.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAa,EAAE,KAAK,IAAI,EAAE,MAAM,MAAM,CAAC;AAGvC,OAAO,KAAK,EAAkB,YAAY,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,GAAG,GAAG,GAAG,CAAC;AAEjC,MAAM,MAAM,cAAc,GAAG;IAC3B,kBAAkB,EAAE,IAAI,CAAC,MAAM,CAAC;IAChC,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC;IAClB,cAAc,EAAE,IAAI,CAAC,MAAM,CAAC;IAC5B,iBAAiB,EAAE,IAAI,CAAC,MAAM,CAAC;IAC/B,gBAAgB,EAAE,IAAI,CAAC,MAAM,CAAC;CAC/B,CAAC;AAEF,qBAAa,OAAO;IAClB,OAAO,CAAC,GAAG,CAAC,CAAO;IACnB,OAAO,CAAC,GAAG,CAAC,CAAO;IAEZ,kBAAkB,wCAA+C;IAEjE,kBAAkB,CAAC,CAAC,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAI7D,qBAAqB,IAAI,kBAAkB;IAIlD,KAAK,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI;IAiDtB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAWvB,gBAAgB,CAAC,MAAM,EAAE,YAAY,CAAC,UAAU,CAAC,GAAG,cAAc;IAiElE,eAAe,EAAE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAQ;IACjD,qBAAqB,IAAI,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC;IAKlD,oBAAoB,IAAI,OAAO,CAAC,IAAI,CAAC;IAIrC,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC;CAIzC;AACD,eAAO,MAAM,EAAE,SAAgB,CAAC"}
@@ -1,9 +1,9 @@
1
+ import { AsyncLocalStorage } from "async_hooks";
1
2
  import knex from "knex";
2
- import * as _ from "lodash-es";
3
+ import { assign } from "radashi";
3
4
  import { Sonamu } from "../api/index.js";
4
- import { AsyncLocalStorage } from "async_hooks";
5
5
  import { TransactionContext } from "./transaction-context.js";
6
- class DBClass {
6
+ export class DBClass {
7
7
  wdb;
8
8
  rdb;
9
9
  transactionStorage = new AsyncLocalStorage();
@@ -22,15 +22,15 @@ class DBClass {
22
22
  } else if (this.wdb) {
23
23
  return this.wdb;
24
24
  } else {
25
- this["wdb"] = knex({
26
- ...dbConfig["test"],
25
+ this.wdb = knex({
26
+ ...dbConfig.test,
27
27
  // 단일 풀
28
28
  pool: {
29
29
  min: 1,
30
30
  max: 1
31
31
  }
32
32
  });
33
- return this["wdb"];
33
+ return this.wdb;
34
34
  }
35
35
  }
36
36
  const instanceName = which === "w" ? "wdb" : "rdb";
@@ -39,10 +39,10 @@ class DBClass {
39
39
  switch(process.env.NODE_ENV ?? "development"){
40
40
  case "development":
41
41
  case "staging":
42
- config = which === "w" ? dbConfig["development_master"] : dbConfig["development_slave"] ?? dbConfig["development_master"];
42
+ config = which === "w" ? dbConfig.development_master : dbConfig.development_slave ?? dbConfig.development_master;
43
43
  break;
44
44
  case "production":
45
- config = which === "w" ? dbConfig["production_master"] : dbConfig["production_slave"] ?? dbConfig["production_master"];
45
+ config = which === "w" ? dbConfig.production_master : dbConfig.production_slave ?? dbConfig.production_master;
46
46
  break;
47
47
  default:
48
48
  throw new Error(`현재 ENV ${process.env.NODE_ENV}에는 설정 가능한 DB설정이 없습니다.`);
@@ -62,8 +62,8 @@ class DBClass {
62
62
  }
63
63
  }
64
64
  generateDBConfig(config) {
65
- const defaultKnexConfig = _.merge({
66
- client: "mysql2",
65
+ const defaultKnexConfig = assign({
66
+ client: "pg",
67
67
  pool: {
68
68
  min: 1,
69
69
  max: 5
@@ -77,37 +77,30 @@ class DBClass {
77
77
  }
78
78
  }, config.defaultOptions);
79
79
  // 로컬 환경 설정
80
- const test = _.merge({}, defaultKnexConfig, {
80
+ const test = assign(defaultKnexConfig, {
81
81
  connection: {
82
82
  database: `${config.name}_test`,
83
83
  ...config.defaultOptions?.connection
84
84
  }
85
85
  });
86
- const fixture_local = _.merge({}, defaultKnexConfig, {
87
- connection: {
88
- database: `${config.name}_fixture_local`,
89
- ...config.defaultOptions?.connection
90
- }
91
- });
92
86
  // 개발 환경 설정
93
87
  const devMasterOptions = config.environments?.development;
94
88
  const devSlaveOptions = config.environments?.development_slave;
95
- const development_master = _.merge({}, defaultKnexConfig, devMasterOptions);
96
- const development_slave = _.merge({}, defaultKnexConfig, devMasterOptions, devSlaveOptions);
89
+ const development_master = assign(defaultKnexConfig, devMasterOptions ?? {});
90
+ const development_slave = assign(assign(defaultKnexConfig, devMasterOptions ?? {}), devSlaveOptions ?? {});
97
91
  // NOTE: fixture remote는 default connection의 DB를 override해선 안됨.
98
- const fixture_remote = _.merge({}, defaultKnexConfig, devMasterOptions, {
92
+ const fixture_remote = assign(assign(assign(defaultKnexConfig, devMasterOptions ?? {}), {
99
93
  connection: {
100
94
  database: `${config.name}_fixture_remote`
101
95
  }
102
- }, config.environments?.remote_fixture);
96
+ }), config.environments?.remote_fixture ?? {});
103
97
  // 프로덕션 환경 설정
104
98
  const prodMasterOptions = config.environments?.production ?? {};
105
99
  const prodSlaveOptions = config.environments?.production_slave ?? {};
106
- const production_master = _.merge({}, defaultKnexConfig, prodMasterOptions);
107
- const production_slave = _.merge({}, defaultKnexConfig, prodMasterOptions, prodSlaveOptions);
100
+ const production_master = assign(defaultKnexConfig, prodMasterOptions);
101
+ const production_slave = assign(assign(defaultKnexConfig, prodMasterOptions), prodSlaveOptions ?? {});
108
102
  return {
109
103
  test,
110
- fixture_local,
111
104
  fixture_remote,
112
105
  development_master,
113
106
  development_slave,
@@ -126,7 +119,11 @@ class DBClass {
126
119
  await this.testTransaction?.rollback();
127
120
  this.testTransaction = null;
128
121
  }
122
+ async getTestConnection() {
123
+ const db = this.getDB("w");
124
+ return db;
125
+ }
129
126
  }
130
127
  export const DB = new DBClass();
131
128
 
132
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9kYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBEQlByZXNldCA9IFwid1wiIHwgXCJyXCI7XG5pbXBvcnQga25leCwgeyBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCAqIGFzIF8gZnJvbSBcImxvZGFzaC1lc1wiO1xuaW1wb3J0IHsgU29uYW11IH0gZnJvbSBcIi4uL2FwaVwiO1xuaW1wb3J0IHsgQXN5bmNMb2NhbFN0b3JhZ2UgfSBmcm9tIFwiYXN5bmNfaG9va3NcIjtcbmltcG9ydCB7IFRyYW5zYWN0aW9uQ29udGV4dCB9IGZyb20gXCIuL3RyYW5zYWN0aW9uLWNvbnRleHRcIjtcbmltcG9ydCB7IERhdGFiYXNlQ29uZmlnLCBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuXG5leHBvcnQgdHlwZSBTb25hbXVEQkNvbmZpZyA9IHtcbiAgZGV2ZWxvcG1lbnRfbWFzdGVyOiBLbmV4LkNvbmZpZztcbiAgZGV2ZWxvcG1lbnRfc2xhdmU6IEtuZXguQ29uZmlnO1xuICB0ZXN0OiBLbmV4LkNvbmZpZztcbiAgZml4dHVyZV9sb2NhbDogS25leC5Db25maWc7XG4gIGZpeHR1cmVfcmVtb3RlOiBLbmV4LkNvbmZpZztcbiAgcHJvZHVjdGlvbl9tYXN0ZXI6IEtuZXguQ29uZmlnO1xuICBwcm9kdWN0aW9uX3NsYXZlOiBLbmV4LkNvbmZpZztcbn07XG5cbmNsYXNzIERCQ2xhc3Mge1xuICBwcml2YXRlIHdkYj86IEtuZXg7XG4gIHByaXZhdGUgcmRiPzogS25leDtcblxuICBwdWJsaWMgdHJhbnNhY3Rpb25TdG9yYWdlID0gbmV3IEFzeW5jTG9jYWxTdG9yYWdlPFRyYW5zYWN0aW9uQ29udGV4dD4oKTtcblxuICBwdWJsaWMgcnVuV2l0aFRyYW5zYWN0aW9uPFQ+KGNhbGxiYWNrOiAoKSA9PiBQcm9taXNlPFQ+KTogUHJvbWlzZTxUPiB7XG4gICAgcmV0dXJuIHRoaXMudHJhbnNhY3Rpb25TdG9yYWdlLnJ1bihuZXcgVHJhbnNhY3Rpb25Db250ZXh0KCksIGNhbGxiYWNrKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXRUcmFuc2FjdGlvbkNvbnRleHQoKTogVHJhbnNhY3Rpb25Db250ZXh0IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UuZ2V0U3RvcmUoKSA/PyBuZXcgVHJhbnNhY3Rpb25Db250ZXh0KCk7XG4gIH1cblxuICBnZXREQih3aGljaDogREJQcmVzZXQpOiBLbmV4IHtcbiAgICBjb25zdCBkYkNvbmZpZyA9IFNvbmFtdS5kYkNvbmZpZztcblxuICAgIC8vIO2FjOyKpO2KuCDtirjrnpzsnq3shZgg6rKp66asXG4gICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInRlc3RcIikge1xuICAgICAgaWYgKHRoaXMudGVzdFRyYW5zYWN0aW9uKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnRlc3RUcmFuc2FjdGlvbjtcbiAgICAgIH0gZWxzZSBpZiAodGhpcy53ZGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMud2RiO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhpc1tcIndkYlwiXSA9IGtuZXgoe1xuICAgICAgICAgIC4uLmRiQ29uZmlnW1widGVzdFwiXSxcbiAgICAgICAgICAvLyDri6jsnbwg7ZKAXG4gICAgICAgICAgcG9vbDoge1xuICAgICAgICAgICAgbWluOiAxLFxuICAgICAgICAgICAgbWF4OiAxLFxuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpc1tcIndkYlwiXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBpbnN0YW5jZU5hbWUgPSB3aGljaCA9PT0gXCJ3XCIgPyBcIndkYlwiIDogXCJyZGJcIjtcblxuICAgIGlmICghdGhpc1tpbnN0YW5jZU5hbWVdKSB7XG4gICAgICBsZXQgY29uZmlnOiBLbmV4LkNvbmZpZztcbiAgICAgIHN3aXRjaCAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz8gXCJkZXZlbG9wbWVudFwiKSB7XG4gICAgICAgIGNhc2UgXCJkZXZlbG9wbWVudFwiOlxuICAgICAgICBjYXNlIFwic3RhZ2luZ1wiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZ1tcImRldmVsb3BtZW50X21hc3RlclwiXVxuICAgICAgICAgICAgICA6IChkYkNvbmZpZ1tcImRldmVsb3BtZW50X3NsYXZlXCJdID8/XG4gICAgICAgICAgICAgICAgZGJDb25maWdbXCJkZXZlbG9wbWVudF9tYXN0ZXJcIl0pO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJvZHVjdGlvblwiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZ1tcInByb2R1Y3Rpb25fbWFzdGVyXCJdXG4gICAgICAgICAgICAgIDogKGRiQ29uZmlnW1wicHJvZHVjdGlvbl9zbGF2ZVwiXSA/PyBkYkNvbmZpZ1tcInByb2R1Y3Rpb25fbWFzdGVyXCJdKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICAgICBg7ZiE7J6sIEVOViAke3Byb2Nlc3MuZW52Lk5PREVfRU5WfeyXkOuKlCDshKTsoJUg6rCA64ql7ZWcIERC7ISk7KCV7J20IOyXhuyKteuLiOuLpC5gXG4gICAgICAgICAgKTtcbiAgICAgIH1cbiAgICAgIHRoaXNbaW5zdGFuY2VOYW1lXSA9IGtuZXgoY29uZmlnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpc1tpbnN0YW5jZU5hbWVdITtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2RiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2RiID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5yZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlREJDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0S25leENvbmZpZzogUGFydGlhbDxEYXRhYmFzZUNvbmZpZz4gPSBfLm1lcmdlKFxuICAgICAge1xuICAgICAgICBjbGllbnQ6IFwibXlzcWwyXCIsXG4gICAgICAgIHBvb2w6IHtcbiAgICAgICAgICBtaW46IDEsXG4gICAgICAgICAgbWF4OiA1LFxuICAgICAgICB9LFxuICAgICAgICBtaWdyYXRpb25zOiB7XG4gICAgICAgICAgZGlyZWN0b3J5OiBcIi4vc3JjL21pZ3JhdGlvbnNcIixcbiAgICAgICAgfSxcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIGRhdGFiYXNlOiBjb25maWcubmFtZSxcbiAgICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlnLmRlZmF1bHRPcHRpb25zXG4gICAgKTtcblxuICAgIC8vIOuhnOy7rCDtmZjqsr0g7ISk7KCVXG4gICAgY29uc3QgdGVzdDogRGF0YWJhc2VDb25maWcgPSBfLm1lcmdlKHt9LCBkZWZhdWx0S25leENvbmZpZywge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X3Rlc3RgLFxuICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgY29uc3QgZml4dHVyZV9sb2NhbCA9IF8ubWVyZ2Uoe30sIGRlZmF1bHRLbmV4Q29uZmlnLCB7XG4gICAgICBjb25uZWN0aW9uOiB7XG4gICAgICAgIGRhdGFiYXNlOiBgJHtjb25maWcubmFtZX1fZml4dHVyZV9sb2NhbGAsXG4gICAgICAgIC4uLmNvbmZpZy5kZWZhdWx0T3B0aW9ucz8uY29ubmVjdGlvbixcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyDqsJzrsJwg7ZmY6rK9IOyEpOyglVxuICAgIGNvbnN0IGRldk1hc3Rlck9wdGlvbnMgPSBjb25maWcuZW52aXJvbm1lbnRzPy5kZXZlbG9wbWVudDtcbiAgICBjb25zdCBkZXZTbGF2ZU9wdGlvbnMgPSBjb25maWcuZW52aXJvbm1lbnRzPy5kZXZlbG9wbWVudF9zbGF2ZTtcbiAgICBjb25zdCBkZXZlbG9wbWVudF9tYXN0ZXIgPSBfLm1lcmdlKHt9LCBkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyk7XG4gICAgY29uc3QgZGV2ZWxvcG1lbnRfc2xhdmUgPSBfLm1lcmdlKFxuICAgICAge30sXG4gICAgICBkZWZhdWx0S25leENvbmZpZyxcbiAgICAgIGRldk1hc3Rlck9wdGlvbnMsXG4gICAgICBkZXZTbGF2ZU9wdGlvbnNcbiAgICApO1xuICAgIC8vIE5PVEU6IGZpeHR1cmUgcmVtb3Rl64qUIGRlZmF1bHQgY29ubmVjdGlvbuydmCBEQuulvCBvdmVycmlkZe2VtOyEoCDslYjrkKguXG4gICAgY29uc3QgZml4dHVyZV9yZW1vdGUgPSBfLm1lcmdlKFxuICAgICAge30sXG4gICAgICBkZWZhdWx0S25leENvbmZpZyxcbiAgICAgIGRldk1hc3Rlck9wdGlvbnMsXG4gICAgICB7XG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X2ZpeHR1cmVfcmVtb3RlYCxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maWcuZW52aXJvbm1lbnRzPy5yZW1vdGVfZml4dHVyZVxuICAgICk7XG5cbiAgICAvLyDtlITroZzrjZXshZgg7ZmY6rK9IOyEpOyglVxuICAgIGNvbnN0IHByb2RNYXN0ZXJPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8ucHJvZHVjdGlvbiA/PyB7fTtcbiAgICBjb25zdCBwcm9kU2xhdmVPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8ucHJvZHVjdGlvbl9zbGF2ZSA/PyB7fTtcbiAgICBjb25zdCBwcm9kdWN0aW9uX21hc3RlciA9IF8ubWVyZ2Uoe30sIGRlZmF1bHRLbmV4Q29uZmlnLCBwcm9kTWFzdGVyT3B0aW9ucyk7XG4gICAgY29uc3QgcHJvZHVjdGlvbl9zbGF2ZSA9IF8ubWVyZ2UoXG4gICAgICB7fSxcbiAgICAgIGRlZmF1bHRLbmV4Q29uZmlnLFxuICAgICAgcHJvZE1hc3Rlck9wdGlvbnMsXG4gICAgICBwcm9kU2xhdmVPcHRpb25zXG4gICAgKTtcblxuICAgIHJldHVybiB7XG4gICAgICB0ZXN0LFxuICAgICAgZml4dHVyZV9sb2NhbCxcbiAgICAgIGZpeHR1cmVfcmVtb3RlLFxuICAgICAgZGV2ZWxvcG1lbnRfbWFzdGVyLFxuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmUsXG4gICAgICBwcm9kdWN0aW9uX21hc3RlcixcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRlc3Qg7ZmY6rK97JeQ7IScIO2KuOuenOyereyFmCDsgqzsmqlcbiAgcHVibGljIHRlc3RUcmFuc2FjdGlvbjogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsO1xuICBhc3luYyBjcmVhdGVUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTxLbmV4LlRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwid1wiKTtcbiAgICB0aGlzLnRlc3RUcmFuc2FjdGlvbiA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICB9XG4gIGFzeW5jIGNsZWFyVGVzdFRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudGVzdFRyYW5zYWN0aW9uPy5yb2xsYmFjaygpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IERCID0gbmV3IERCQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJrbmV4IiwiXyIsIlNvbmFtdSIsIkFzeW5jTG9jYWxTdG9yYWdlIiwiVHJhbnNhY3Rpb25Db250ZXh0IiwiREJDbGFzcyIsIndkYiIsInJkYiIsInRyYW5zYWN0aW9uU3RvcmFnZSIsInJ1bldpdGhUcmFuc2FjdGlvbiIsImNhbGxiYWNrIiwicnVuIiwiZ2V0VHJhbnNhY3Rpb25Db250ZXh0IiwiZ2V0U3RvcmUiLCJnZXREQiIsIndoaWNoIiwiZGJDb25maWciLCJwcm9jZXNzIiwiZW52IiwiTk9ERV9FTlYiLCJ0ZXN0VHJhbnNhY3Rpb24iLCJwb29sIiwibWluIiwibWF4IiwiaW5zdGFuY2VOYW1lIiwiY29uZmlnIiwiRXJyb3IiLCJkZXN0cm95IiwidW5kZWZpbmVkIiwiZ2VuZXJhdGVEQkNvbmZpZyIsImRlZmF1bHRLbmV4Q29uZmlnIiwibWVyZ2UiLCJjbGllbnQiLCJtaWdyYXRpb25zIiwiZGlyZWN0b3J5IiwiY29ubmVjdGlvbiIsImRhdGFiYXNlIiwibmFtZSIsImRlZmF1bHRPcHRpb25zIiwidGVzdCIsImZpeHR1cmVfbG9jYWwiLCJkZXZNYXN0ZXJPcHRpb25zIiwiZW52aXJvbm1lbnRzIiwiZGV2ZWxvcG1lbnQiLCJkZXZTbGF2ZU9wdGlvbnMiLCJkZXZlbG9wbWVudF9zbGF2ZSIsImRldmVsb3BtZW50X21hc3RlciIsImZpeHR1cmVfcmVtb3RlIiwicmVtb3RlX2ZpeHR1cmUiLCJwcm9kTWFzdGVyT3B0aW9ucyIsInByb2R1Y3Rpb24iLCJwcm9kU2xhdmVPcHRpb25zIiwicHJvZHVjdGlvbl9zbGF2ZSIsInByb2R1Y3Rpb25fbWFzdGVyIiwiY3JlYXRlVGVzdFRyYW5zYWN0aW9uIiwiZGIiLCJ0cmFuc2FjdGlvbiIs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
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9kYi50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBc3luY0xvY2FsU3RvcmFnZSB9IGZyb20gXCJhc3luY19ob29rc1wiO1xuaW1wb3J0IGtuZXgsIHsgdHlwZSBLbmV4IH0gZnJvbSBcImtuZXhcIjtcbmltcG9ydCB7IGFzc2lnbiB9IGZyb20gXCJyYWRhc2hpXCI7XG5pbXBvcnQgeyBTb25hbXUgfSBmcm9tIFwiLi4vYXBpXCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlQ29uZmlnLCBTb25hbXVDb25maWcgfSBmcm9tIFwiLi4vYXBpL2NvbmZpZ1wiO1xuaW1wb3J0IHsgVHJhbnNhY3Rpb25Db250ZXh0IH0gZnJvbSBcIi4vdHJhbnNhY3Rpb24tY29udGV4dFwiO1xuXG5leHBvcnQgdHlwZSBEQlByZXNldCA9IFwid1wiIHwgXCJyXCI7XG5cbmV4cG9ydCB0eXBlIFNvbmFtdURCQ29uZmlnID0ge1xuICBkZXZlbG9wbWVudF9tYXN0ZXI6IEtuZXguQ29uZmlnO1xuICBkZXZlbG9wbWVudF9zbGF2ZTogS25leC5Db25maWc7XG4gIHRlc3Q6IEtuZXguQ29uZmlnO1xuICBmaXh0dXJlX3JlbW90ZTogS25leC5Db25maWc7XG4gIHByb2R1Y3Rpb25fbWFzdGVyOiBLbmV4LkNvbmZpZztcbiAgcHJvZHVjdGlvbl9zbGF2ZTogS25leC5Db25maWc7XG59O1xuXG5leHBvcnQgY2xhc3MgREJDbGFzcyB7XG4gIHByaXZhdGUgd2RiPzogS25leDtcbiAgcHJpdmF0ZSByZGI/OiBLbmV4O1xuXG4gIHB1YmxpYyB0cmFuc2FjdGlvblN0b3JhZ2UgPSBuZXcgQXN5bmNMb2NhbFN0b3JhZ2U8VHJhbnNhY3Rpb25Db250ZXh0PigpO1xuXG4gIHB1YmxpYyBydW5XaXRoVHJhbnNhY3Rpb248VD4oY2FsbGJhY2s6ICgpID0+IFByb21pc2U8VD4pOiBQcm9taXNlPFQ+IHtcbiAgICByZXR1cm4gdGhpcy50cmFuc2FjdGlvblN0b3JhZ2UucnVuKG5ldyBUcmFuc2FjdGlvbkNvbnRleHQoKSwgY2FsbGJhY2spO1xuICB9XG5cbiAgcHVibGljIGdldFRyYW5zYWN0aW9uQ29udGV4dCgpOiBUcmFuc2FjdGlvbkNvbnRleHQge1xuICAgIHJldHVybiB0aGlzLnRyYW5zYWN0aW9uU3RvcmFnZS5nZXRTdG9yZSgpID8/IG5ldyBUcmFuc2FjdGlvbkNvbnRleHQoKTtcbiAgfVxuXG4gIGdldERCKHdoaWNoOiBEQlByZXNldCk6IEtuZXgge1xuICAgIGNvbnN0IGRiQ29uZmlnID0gU29uYW11LmRiQ29uZmlnO1xuXG4gICAgLy8g7YWM7Iqk7Yq4IO2KuOuenOyereyFmCDqsqnrpqxcbiAgICBpZiAocHJvY2Vzcy5lbnYuTk9ERV9FTlYgPT09IFwidGVzdFwiKSB7XG4gICAgICBpZiAodGhpcy50ZXN0VHJhbnNhY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLndkYikge1xuICAgICAgICByZXR1cm4gdGhpcy53ZGI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLndkYiA9IGtuZXgoe1xuICAgICAgICAgIC4uLmRiQ29uZmlnLnRlc3QsXG4gICAgICAgICAgLy8g64uo7J28IO2SgFxuICAgICAgICAgIHBvb2w6IHtcbiAgICAgICAgICAgIG1pbjogMSxcbiAgICAgICAgICAgIG1heDogMSxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMud2RiO1xuICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IGluc3RhbmNlTmFtZSA9IHdoaWNoID09PSBcIndcIiA/IFwid2RiXCIgOiBcInJkYlwiO1xuXG4gICAgaWYgKCF0aGlzW2luc3RhbmNlTmFtZV0pIHtcbiAgICAgIGxldCBjb25maWc6IEtuZXguQ29uZmlnO1xuICAgICAgc3dpdGNoIChwcm9jZXNzLmVudi5OT0RFX0VOViA/PyBcImRldmVsb3BtZW50XCIpIHtcbiAgICAgICAgY2FzZSBcImRldmVsb3BtZW50XCI6XG4gICAgICAgIGNhc2UgXCJzdGFnaW5nXCI6XG4gICAgICAgICAgY29uZmlnID1cbiAgICAgICAgICAgIHdoaWNoID09PSBcIndcIlxuICAgICAgICAgICAgICA/IGRiQ29uZmlnLmRldmVsb3BtZW50X21hc3RlclxuICAgICAgICAgICAgICA6IChkYkNvbmZpZy5kZXZlbG9wbWVudF9zbGF2ZSA/PyBkYkNvbmZpZy5kZXZlbG9wbWVudF9tYXN0ZXIpO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIFwicHJvZHVjdGlvblwiOlxuICAgICAgICAgIGNvbmZpZyA9XG4gICAgICAgICAgICB3aGljaCA9PT0gXCJ3XCJcbiAgICAgICAgICAgICAgPyBkYkNvbmZpZy5wcm9kdWN0aW9uX21hc3RlclxuICAgICAgICAgICAgICA6IChkYkNvbmZpZy5wcm9kdWN0aW9uX3NsYXZlID8/IGRiQ29uZmlnLnByb2R1Y3Rpb25fbWFzdGVyKTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYO2YhOyerCBFTlYgJHtwcm9jZXNzLmVudi5OT0RFX0VOVn3sl5DripQg7ISk7KCVIOqwgOuKpe2VnCBEQuyEpOygleydtCDsl4bsirXri4jri6QuYCk7XG4gICAgICB9XG4gICAgICB0aGlzW2luc3RhbmNlTmFtZV0gPSBrbmV4KGNvbmZpZyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXNbaW5zdGFuY2VOYW1lXTtcbiAgfVxuXG4gIGFzeW5jIGRlc3Ryb3koKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMud2RiICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGF3YWl0IHRoaXMud2RiLmRlc3Ryb3koKTtcbiAgICAgIHRoaXMud2RiID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBpZiAodGhpcy5yZGIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgYXdhaXQgdGhpcy5yZGIuZGVzdHJveSgpO1xuICAgICAgdGhpcy5yZGIgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdlbmVyYXRlREJDb25maWcoY29uZmlnOiBTb25hbXVDb25maWdbXCJkYXRhYmFzZVwiXSk6IFNvbmFtdURCQ29uZmlnIHtcbiAgICBjb25zdCBkZWZhdWx0S25leENvbmZpZzogUGFydGlhbDxEYXRhYmFzZUNvbmZpZz4gPSBhc3NpZ24oXG4gICAgICB7XG4gICAgICAgIGNsaWVudDogXCJwZ1wiLFxuICAgICAgICBwb29sOiB7XG4gICAgICAgICAgbWluOiAxLFxuICAgICAgICAgIG1heDogNSxcbiAgICAgICAgfSxcbiAgICAgICAgbWlncmF0aW9uczoge1xuICAgICAgICAgIGRpcmVjdG9yeTogXCIuL3NyYy9taWdyYXRpb25zXCIsXG4gICAgICAgIH0sXG4gICAgICAgIGNvbm5lY3Rpb246IHtcbiAgICAgICAgICBkYXRhYmFzZTogY29uZmlnLm5hbWUsXG4gICAgICAgICAgLi4uY29uZmlnLmRlZmF1bHRPcHRpb25zPy5jb25uZWN0aW9uLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpZy5kZWZhdWx0T3B0aW9ucyxcbiAgICApO1xuXG4gICAgLy8g66Gc7LusIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCB0ZXN0OiBEYXRhYmFzZUNvbmZpZyA9IGFzc2lnbihkZWZhdWx0S25leENvbmZpZywge1xuICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICBkYXRhYmFzZTogYCR7Y29uZmlnLm5hbWV9X3Rlc3RgLFxuICAgICAgICAuLi5jb25maWcuZGVmYXVsdE9wdGlvbnM/LmNvbm5lY3Rpb24sXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8g6rCc67CcIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCBkZXZNYXN0ZXJPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8uZGV2ZWxvcG1lbnQ7XG4gICAgY29uc3QgZGV2U2xhdmVPcHRpb25zID0gY29uZmlnLmVudmlyb25tZW50cz8uZGV2ZWxvcG1lbnRfc2xhdmU7XG4gICAgY29uc3QgZGV2ZWxvcG1lbnRfbWFzdGVyID0gYXNzaWduKGRlZmF1bHRLbmV4Q29uZmlnLCBkZXZNYXN0ZXJPcHRpb25zID8/IHt9KTtcbiAgICBjb25zdCBkZXZlbG9wbWVudF9zbGF2ZSA9IGFzc2lnbihcbiAgICAgIGFzc2lnbihkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyA/PyB7fSksXG4gICAgICBkZXZTbGF2ZU9wdGlvbnMgPz8ge30sXG4gICAgKTtcbiAgICAvLyBOT1RFOiBmaXh0dXJlIHJlbW90ZeuKlCBkZWZhdWx0IGNvbm5lY3Rpb27snZggRELrpbwgb3ZlcnJpZGXtlbTshKAg7JWI65CoLlxuICAgIGNvbnN0IGZpeHR1cmVfcmVtb3RlID0gYXNzaWduKFxuICAgICAgYXNzaWduKGFzc2lnbihkZWZhdWx0S25leENvbmZpZywgZGV2TWFzdGVyT3B0aW9ucyA/PyB7fSksIHtcbiAgICAgICAgY29ubmVjdGlvbjoge1xuICAgICAgICAgIGRhdGFiYXNlOiBgJHtjb25maWcubmFtZX1fZml4dHVyZV9yZW1vdGVgLFxuICAgICAgICB9LFxuICAgICAgfSksXG4gICAgICBjb25maWcuZW52aXJvbm1lbnRzPy5yZW1vdGVfZml4dHVyZSA/PyB7fSxcbiAgICApO1xuXG4gICAgLy8g7ZSE66Gc642V7IWYIO2ZmOqyvSDshKTsoJVcbiAgICBjb25zdCBwcm9kTWFzdGVyT3B0aW9ucyA9IGNvbmZpZy5lbnZpcm9ubWVudHM/LnByb2R1Y3Rpb24gPz8ge307XG4gICAgY29uc3QgcHJvZFNsYXZlT3B0aW9ucyA9IGNvbmZpZy5lbnZpcm9ubWVudHM/LnByb2R1Y3Rpb25fc2xhdmUgPz8ge307XG4gICAgY29uc3QgcHJvZHVjdGlvbl9tYXN0ZXIgPSBhc3NpZ24oZGVmYXVsdEtuZXhDb25maWcsIHByb2RNYXN0ZXJPcHRpb25zKTtcbiAgICBjb25zdCBwcm9kdWN0aW9uX3NsYXZlID0gYXNzaWduKFxuICAgICAgYXNzaWduKGRlZmF1bHRLbmV4Q29uZmlnLCBwcm9kTWFzdGVyT3B0aW9ucyksXG4gICAgICBwcm9kU2xhdmVPcHRpb25zID8/IHt9LFxuICAgICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGVzdCxcbiAgICAgIGZpeHR1cmVfcmVtb3RlLFxuICAgICAgZGV2ZWxvcG1lbnRfbWFzdGVyLFxuICAgICAgZGV2ZWxvcG1lbnRfc2xhdmUsXG4gICAgICBwcm9kdWN0aW9uX21hc3RlcixcbiAgICAgIHByb2R1Y3Rpb25fc2xhdmUsXG4gICAgfTtcbiAgfVxuXG4gIC8vIFRlc3Qg7ZmY6rK97JeQ7IScIO2KuOuenOyereyFmCDsgqzsmqlcbiAgcHVibGljIHRlc3RUcmFuc2FjdGlvbjogS25leC5UcmFuc2FjdGlvbiB8IG51bGwgPSBudWxsO1xuICBhc3luYyBjcmVhdGVUZXN0VHJhbnNhY3Rpb24oKTogUHJvbWlzZTxLbmV4LlRyYW5zYWN0aW9uPiB7XG4gICAgY29uc3QgZGIgPSB0aGlzLmdldERCKFwid1wiKTtcbiAgICB0aGlzLnRlc3RUcmFuc2FjdGlvbiA9IGF3YWl0IGRiLnRyYW5zYWN0aW9uKCk7XG4gICAgcmV0dXJuIHRoaXMudGVzdFRyYW5zYWN0aW9uO1xuICB9XG4gIGFzeW5jIGNsZWFyVGVzdFRyYW5zYWN0aW9uKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGF3YWl0IHRoaXMudGVzdFRyYW5zYWN0aW9uPy5yb2xsYmFjaygpO1xuICAgIHRoaXMudGVzdFRyYW5zYWN0aW9uID0gbnVsbDtcbiAgfVxuICBhc3luYyBnZXRUZXN0Q29ubmVjdGlvbigpOiBQcm9taXNlPEtuZXg+IHtcbiAgICBjb25zdCBkYiA9IHRoaXMuZ2V0REIoXCJ3XCIpO1xuICAgIHJldHVybiBkYjtcbiAgfVxufVxuZXhwb3J0IGNvbnN0IERCID0gbmV3IERCQ2xhc3MoKTtcbiJdLCJuYW1lcyI6WyJBc3luY0xvY2FsU3RvcmFnZSIsImtuZXgiLCJhc3NpZ24iLCJTb25hbXUiLCJUcmFuc2FjdGlvbkNvbnRleHQiLCJEQkNsYXNzIiwid2RiIiwicmRiIiwidHJhbnNhY3Rpb25TdG9yYWdlIiwicnVuV2l0aFRyYW5zYWN0aW9uIiwiY2FsbGJhY2siLCJydW4iLCJnZXRUcmFuc2FjdGlvbkNvbnRleHQiLCJnZXRTdG9yZSIsImdldERCIiwid2hpY2giLCJkYkNvbmZpZyIsInByb2Nlc3MiLCJlbnYiLCJOT0RFX0VOViIsInRlc3RUcmFuc2FjdGlvbiIsInRlc3QiLCJwb29sIiwibWluIiwibWF4IiwiaW5zdGFuY2VOYW1lIiwiY29uZmlnIiwiZGV2ZWxvcG1lbnRfbWFzdGVyIiwiZGV2ZWxvcG1lbnRfc2xhdmUiLCJwcm9kdWN0aW9uX21hc3RlciIsInByb2R1Y3Rpb25fc2xhdmUiLCJFcnJvciIsImRlc3Ryb3kiLCJ1bmRlZmluZWQiLCJnZW5lcmF0ZURCQ29uZmlnIiwiZGVmYXVsdEtuZXhDb25maWciLCJjbGllbnQiLCJtaWdyYXRpb25zIiwiZGlyZWN0b3J5IiwiY29ubmVjdGlvbiIsImRhdGFiYXNlIiwibmFtZSIsImRlZmF1bHRPcHRpb25zIiwiZGV2TWFzdGVyT3B0aW9ucyIsImVudmlyb25tZW50cyIsImRldmVsb3BtZW50IiwiZGV2U2xhdmVPcHRpb25zIiwiZml4dHVyZV9yZW1vdGUiLCJyZW1vdGVfZml4dHVyZSIsInByb2RNYXN0ZXJPcHRpb25zIiwicHJvZHVjdGlvbiIsInByb2RTbGF2ZU9wdGlvbnMiLCJjcmVhdGVUZXN0VHJhbnNhY3Rpb24iLCJkYiIsInRyYW5zYWN0aW9uIiwiY2xlYXJUZXN0VHJhbnNhY3Rpb24iLCJyb2xsYmFjayIsImdldFRlc3RDb25uZWN0aW9uIiwiREIiXSwibWFwcGluZ3MiOiJBQUFBLFNBQVNBLGlCQUFpQixRQUFRLGNBQWM7QUFDaEQsT0FBT0MsVUFBeUIsT0FBTztBQUN2QyxTQUFTQyxNQUFNLFFBQVEsVUFBVTtBQUNqQyxTQUFTQyxNQUFNLFFBQVEsa0JBQVM7QUFFaEMsU0FBU0Msa0JBQWtCLFFBQVEsMkJBQXdCO0FBYTNELE9BQU8sTUFBTUM7SUFDSEMsSUFBVztJQUNYQyxJQUFXO0lB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
@@ -0,0 +1,81 @@
1
+ import { describe, expectTypeOf, it } from "vitest";
2
+ describe("Hydrate", ()=>{
3
+ it("flat 객체를 그대로 유지한다 (__ 없는 경우)", ()=>{
4
+ const result = {};
5
+ expectTypeOf(result).toEqualTypeOf();
6
+ });
7
+ it("단일 depth의 __ 키를 중첩 객체로 변환한다", ()=>{
8
+ const result = {};
9
+ expectTypeOf(result).toEqualTypeOf();
10
+ });
11
+ it("다중 depth의 __ 키를 재귀적으로 중첩 객체로 변환한다", ()=>{
12
+ const result = {};
13
+ expectTypeOf(result).toEqualTypeOf();
14
+ });
15
+ it("여러 관계를 동시에 처리한다", ()=>{
16
+ const result = {};
17
+ expectTypeOf(result).toEqualTypeOf();
18
+ });
19
+ it("빈 객체를 처리한다", ()=>{
20
+ const result = {};
21
+ expectTypeOf(result).toEqualTypeOf();
22
+ });
23
+ it("nullable 필드가 있는 중첩 객체를 처리한다", ()=>{
24
+ const result = {};
25
+ expectTypeOf(result).toEqualTypeOf();
26
+ });
27
+ it("동일한 prefix를 가진 여러 필드를 올바르게 그룹화한다", ()=>{
28
+ const result = {};
29
+ expectTypeOf(result).toEqualTypeOf();
30
+ });
31
+ });
32
+ describe("LoadersResult", ()=>{
33
+ it("단일 로더의 결과 타입을 생성한다", ()=>{
34
+ const result = {};
35
+ expectTypeOf(result).toHaveProperty("posts");
36
+ expectTypeOf(result).toEqualTypeOf();
37
+ });
38
+ it("중첩 로더를 처리한다", ()=>{
39
+ const result = {};
40
+ expectTypeOf(result).toHaveProperty("posts");
41
+ expectTypeOf(result).toEqualTypeOf();
42
+ });
43
+ it("여러 로더를 처리한다", ()=>{
44
+ const result = {};
45
+ expectTypeOf(result).toHaveProperty("projects");
46
+ expectTypeOf(result).toHaveProperty("employees");
47
+ expectTypeOf(result).toHaveProperty("department");
48
+ expectTypeOf(result).toEqualTypeOf();
49
+ });
50
+ });
51
+ describe("InferAllSubsets", ()=>{
52
+ describe("서브셋이 하나인 경우", ()=>{
53
+ it("로더 없이 기본 Subset 결과를 추론한다", ()=>{
54
+ const result = {};
55
+ expectTypeOf(result).toHaveProperty("A");
56
+ expectTypeOf(result.A).toEqualTypeOf();
57
+ expectTypeOf(result.A.department.company).toEqualTypeOf();
58
+ });
59
+ it("로더를 포함한 Subset 결과를 추론한다", ()=>{
60
+ const result = {};
61
+ expectTypeOf(result).toHaveProperty("A");
62
+ expectTypeOf(result).toEqualTypeOf();
63
+ });
64
+ it("중첩 로더를 포함한 Subset 결과를 추론한다", ()=>{
65
+ const result = {};
66
+ expectTypeOf(result).toEqualTypeOf();
67
+ });
68
+ });
69
+ describe("서브셋이 여러 개인 경우", ()=>{
70
+ it("로더 없이 기본 Subset 결과를 추론한다", ()=>{
71
+ const result = {};
72
+ expectTypeOf(result).toEqualTypeOf();
73
+ });
74
+ it("로더를 포함한 Subset 결과를 추론한다", ()=>{
75
+ const result = {};
76
+ expectTypeOf(result).toEqualTypeOf();
77
+ });
78
+ });
79
+ });
80
+
81
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9wdXJpLXN1YnNldC50ZXN0LWQudHMiXSwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdFR5cGVPZiwgaXQgfSBmcm9tIFwidml0ZXN0XCI7XG5pbXBvcnQgdHlwZSB7IERhdGFiYXNlU2NoZW1hRXh0ZW5kIH0gZnJvbSBcIi4uL3R5cGVzL3R5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmkgfSBmcm9tIFwiLi9wdXJpXCI7XG5pbXBvcnQgdHlwZSB7IEh5ZHJhdGUsIEluZmVyQWxsU3Vic2V0cywgTG9hZGVyc1Jlc3VsdCB9IGZyb20gXCIuL3B1cmktc3Vic2V0LnR5cGVzXCI7XG5pbXBvcnQgdHlwZSB7IFB1cmlXcmFwcGVyIH0gZnJvbSBcIi4vcHVyaS13cmFwcGVyXCI7XG5cbnR5cGUgTW9ja1B1cmk8VD4gPSBQdXJpPERhdGFiYXNlU2NoZW1hRXh0ZW5kLCBhbnksIFQ+O1xuXG5kZXNjcmliZShcIkh5ZHJhdGVcIiwgKCkgPT4ge1xuICBpdChcImZsYXQg6rCd7LK066W8IOq3uOuMgOuhnCDsnKDsp4DtlZzri6QgKF9fIOyXhuuKlCDqsr3smrApXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0geyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8SHlkcmF0ZTxJbnB1dD4+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64uo7J28IGRlcHRo7J2YIF9fIO2CpOulvCDspJHssqkg6rCd7LK066GcIOuzgO2ZmO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHsgaWQ6IG51bWJlcjsgdXNlcl9fbmFtZTogc3RyaW5nOyB1c2VyX19lbWFpbDogc3RyaW5nIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi64uk7KSRIGRlcHRo7J2YIF9fIO2CpOulvCDsnqzqt4DsoIHsnLzroZwg7KSR7LKpIOqwneyytOuhnCDrs4DtmZjtlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcl9fcHJvZmlsZV9fYmlvOiBzdHJpbmc7XG4gICAgICB1c2VyX19wcm9maWxlX19hdmF0YXI6IHN0cmluZztcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZztcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjoge1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIHByb2ZpbGU6IHsgYmlvOiBzdHJpbmc7IGF2YXRhcjogc3RyaW5nIH07XG4gICAgICB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi7Jes65+sIOq0gOqzhOulvCDrj5nsi5zsl5Ag7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIElucHV0ID0ge1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXJfX2lkOiBudW1iZXI7XG4gICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICBwb3N0X19pZDogbnVtYmVyO1xuICAgICAgcG9zdF9fdGl0bGU6IHN0cmluZztcbiAgICB9O1xuICAgIHR5cGUgUmVzdWx0ID0gSHlkcmF0ZTxJbnB1dD47XG5cbiAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICBpZDogbnVtYmVyO1xuICAgICAgdXNlcjogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfTtcbiAgICAgIHBvc3Q6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZyB9O1xuICAgIH0+KCk7XG4gIH0pO1xuXG4gIGl0KFwi67mIIOqwneyytOulvCDsspjrpqztlZzri6RcIiwgKCkgPT4ge1xuICAgIHR5cGUgSW5wdXQgPSB7fTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e30+KCk7XG4gIH0pO1xuXG4gIGl0KFwibnVsbGFibGUg7ZWE65Oc6rCAIOyeiOuKlCDspJHssqkg6rCd7LK066W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19pZDogbnVtYmVyIHwgbnVsbDtcbiAgICAgIHVzZXJfX25hbWU6IHN0cmluZyB8IG51bGw7XG4gICAgfTtcbiAgICB0eXBlIFJlc3VsdCA9IEh5ZHJhdGU8SW5wdXQ+O1xuXG4gICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgaWQ6IG51bWJlcjtcbiAgICAgIHVzZXI6IHsgaWQ6IG51bWJlciB8IG51bGw7IG5hbWU6IHN0cmluZyB8IG51bGwgfTtcbiAgICB9PigpO1xuICB9KTtcblxuICBpdChcIuuPmeydvO2VnCBwcmVmaXjrpbwg6rCA7KeEIOyXrOufrCDtlYTrk5zrpbwg7Jis67CU66W06rKMIOq3uOujue2ZlO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBJbnB1dCA9IHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyX19pZDogbnVtYmVyO1xuICAgICAgdXNlcl9fbmFtZTogc3RyaW5nO1xuICAgICAgdXNlcl9jb3VudDogbnVtYmVyO1xuICAgIH07XG4gICAgdHlwZSBSZXN1bHQgPSBIeWRyYXRlPElucHV0PjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIGlkOiBudW1iZXI7XG4gICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9O1xuICAgICAgdXNlcl9jb3VudDogbnVtYmVyO1xuICAgIH0+KCk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKFwiTG9hZGVyc1Jlc3VsdFwiLCAoKSA9PiB7XG4gIGl0KFwi64uo7J28IOuhnOuNlOydmCDqsrDqs7wg7YOA7J6F7J2EIOyDneyEse2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBNb2NrTG9hZGVyUWIgPSAoXG4gICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuXG4gICAgdHlwZSBMb2FkZXJzID0gW1xuICAgICAge1xuICAgICAgICBhczogXCJwb3N0c1wiO1xuICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICBxYjogTW9ja0xvYWRlclFiO1xuICAgICAgfSxcbiAgICBdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInBvc3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8eyBwb3N0czogeyBpZDogbnVtYmVyOyB0aXRsZTogc3RyaW5nIH1bXSB9PigpO1xuICB9KTtcblxuICBpdChcIuykkeyyqSDroZzrjZTrpbwg7LKY66as7ZWc64ukXCIsICgpID0+IHtcbiAgICB0eXBlIENvbW1lbnRMb2FkZXJRYiA9IChcbiAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IGNvbnRlbnQ6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgUG9zdExvYWRlclFiID0gKFxuICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcblxuICAgIHR5cGUgTG9hZGVycyA9IFtcbiAgICAgIHtcbiAgICAgICAgYXM6IFwicG9zdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IFBvc3RMb2FkZXJRYjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcImNvbW1lbnRzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IENvbW1lbnRMb2FkZXJRYjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfSxcbiAgICBdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInBvc3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvRXF1YWxUeXBlT2Y8e1xuICAgICAgcG9zdHM6IHsgaWQ6IG51bWJlcjsgdGl0bGU6IHN0cmluZzsgY29tbWVudHM6IHsgaWQ6IG51bWJlcjsgY29udGVudDogc3RyaW5nIH1bXSB9W107XG4gICAgfT4oKTtcbiAgfSk7XG5cbiAgaXQoXCLsl6zrn6wg66Gc642U66W8IOyymOumrO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgdHlwZSBQcm9qZWN0TG9hZGVyID0ge1xuICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgIHJlZklkOiBcImlkXCI7XG4gICAgICBxYjogKFxuICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgZnJvbUlkczogbnVtYmVyW10sXG4gICAgICApID0+IE1vY2tQdXJpPHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBEZXBhcnRtZW50TG9hZGVyID0ge1xuICAgICAgYXM6IFwiZGVwYXJ0bWVudFwiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGNvbXBhbnlfbmFtZTogc3RyaW5nOyByZWZJZDogbnVtYmVyIH0+O1xuICAgIH07XG4gICAgdHlwZSBFbXBsb3llZUxvYWRlciA9IHtcbiAgICAgIGFzOiBcImVtcGxveWVlc1wiO1xuICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgIHFiOiAoXG4gICAgICAgIHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+LFxuICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBlbXBsb3llZV9udW1iZXI6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAge1xuICAgICAgICAgIGFzOiBcInVzZXJcIjtcbiAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgIHFiOiAoXG4gICAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICkgPT4gTW9ja1B1cmk8eyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIH0sXG4gICAgICBdO1xuICAgIH07XG5cbiAgICB0eXBlIExvYWRlcnMgPSBbUHJvamVjdExvYWRlciwgRGVwYXJ0bWVudExvYWRlciwgRW1wbG95ZWVMb2FkZXJdO1xuICAgIHR5cGUgUmVzdWx0ID0gTG9hZGVyc1Jlc3VsdDxMb2FkZXJzPjtcblxuICAgIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFJlc3VsdDtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0hhdmVQcm9wZXJ0eShcInByb2plY3RzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiZW1wbG95ZWVzXCIpO1xuICAgIGV4cGVjdFR5cGVPZihyZXN1bHQpLnRvSGF2ZVByb3BlcnR5KFwiZGVwYXJ0bWVudFwiKTtcbiAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgIHByb2plY3RzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZyB9W107XG4gICAgICBkZXBhcnRtZW50OiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgY29tcGFueV9uYW1lOiBzdHJpbmcgfVtdO1xuICAgICAgZW1wbG95ZWVzOiB7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGVtcGxveWVlX251bWJlcjogc3RyaW5nO1xuICAgICAgICB1c2VyOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZyB9W107XG4gICAgICB9W107XG4gICAgfT4oKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoXCJJbmZlckFsbFN1YnNldHNcIiwgKCkgPT4ge1xuICBkZXNjcmliZShcIuyEnOu4jOyFi+ydtCDtlZjrgpjsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICB1c2VyX19uYW1lOiBzdHJpbmc7XG4gICAgICAgIHVzZXJfX2VtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9fY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJBXCIpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdC5BKS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgdXNlcjogeyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmcgfTtcbiAgICAgICAgZGVwYXJ0bWVudDogeyBuYW1lOiBzdHJpbmc7IGNvbXBhbnk6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgIH0+KCk7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0LkEuZGVwYXJ0bWVudC5jb21wYW55KS50b0VxdWFsVHlwZU9mPHsgbmFtZTogc3RyaW5nIH0+KCk7XG4gICAgfSk7XG5cbiAgICBpdChcIuuhnOuNlOulvCDtj6ztlajtlZwgU3Vic2V0IOqysOqzvOulvCDstpTroaDtlZzri6RcIiwgKCkgPT4ge1xuICAgICAgLy8gU3Vic2V0UXVlcnlcbiAgICAgIHR5cGUgU3Vic2V0Rm5BID0gKHFiV3JhcHBlcjogUHVyaVdyYXBwZXI8RGF0YWJhc2VTY2hlbWFFeHRlbmQ+KSA9PiBNb2NrUHVyaTx7XG4gICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgIGNvbXBhbnlfX2lkOiBudW1iZXI7XG4gICAgICAgIGNvbXBhbnlfX25hbWU6IHN0cmluZztcbiAgICAgICAgZGVwYXJ0bWVudF9faWQ6IG51bWJlcjtcbiAgICAgICAgZGVwYXJ0bWVudF9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIENvbXBhbnlEZXBhcnRtZW50c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiY29tcGFueV9fZGVwYXJ0bWVudHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiY29tcGFueV9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgIH07XG4gICAgICB0eXBlIERlcGFydG1lbnRQcm9qZWN0c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiZGVwYXJ0bWVudF9fcHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiZGVwYXJ0bWVudF9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICB9O1xuICAgICAgdHlwZSBMb2FkZXJRdWVyaWVzID0ge1xuICAgICAgICBBOiBbQ29tcGFueURlcGFydG1lbnRzTG9hZGVyLCBEZXBhcnRtZW50UHJvamVjdHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9IYXZlUHJvcGVydHkoXCJBXCIpO1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBkZXBhcnRtZW50czogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmcgfVtdIH07XG4gICAgICAgICAgZGVwYXJ0bWVudDoge1xuICAgICAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIHByb2plY3RzOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmcgfVtdO1xuICAgICAgICAgIH07XG4gICAgICAgIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLspJHssqkg66Gc642U66W8IO2PrO2VqO2VnCBTdWJzZXQg6rKw6rO866W8IOy2lOuhoO2VnOuLpFwiLCAoKSA9PiB7XG4gICAgICAvLyBTdWJzZXRRdWVyeVxuICAgICAgdHlwZSBTdWJzZXRGbkEgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgY29tcGFueV9fbmFtZTogc3RyaW5nO1xuICAgICAgfT47XG4gICAgICB0eXBlIFN1YnNldFF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFN1YnNldEZuQTtcbiAgICAgIH07XG5cbiAgICAgIC8vIExvYWRlclF1ZXJ5XG4gICAgICB0eXBlIENvbXBhbnlEZXBhcnRtZW50c0xvYWRlciA9IHtcbiAgICAgICAgYXM6IFwiY29tcGFueV9fZGVwYXJ0bWVudHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiY29tcGFueV9faWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgbG9hZGVyczogW1xuICAgICAgICAgIHtcbiAgICAgICAgICAgIGFzOiBcInByb2plY3RzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IChcbiAgICAgICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICAgIH07XG4gICAgICB0eXBlIExvYWRlclF1ZXJpZXMgPSB7XG4gICAgICAgIEE6IFtDb21wYW55RGVwYXJ0bWVudHNMb2FkZXJdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIGNvbXBhbnk6IHtcbiAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgIGRlcGFydG1lbnRzOiB7XG4gICAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICAgICAgcHJvamVjdHM6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBzdGF0dXM6IHN0cmluZyB9W107XG4gICAgICAgICAgICB9W107XG4gICAgICAgICAgfTtcbiAgICAgICAgfTtcbiAgICAgIH0+KCk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIGRlc2NyaWJlKFwi7ISc67iM7IWL7J20IOyXrOufrCDqsJzsnbgg6rK97JqwXCIsICgpID0+IHtcbiAgICBpdChcIuuhnOuNlCDsl4bsnbQg6riw67O4IFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW107XG4gICAgICAgIFA6IFtdO1xuICAgICAgICBTUzogW107XG4gICAgICB9O1xuXG4gICAgICAvLyBSZXN1bHRcbiAgICAgIHR5cGUgUmVzdWx0ID0gSW5mZXJBbGxTdWJzZXRzPFN1YnNldFF1ZXJpZXMsIExvYWRlclF1ZXJpZXM+O1xuXG4gICAgICBjb25zdCByZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gICAgICBleHBlY3RUeXBlT2YocmVzdWx0KS50b0VxdWFsVHlwZU9mPHtcbiAgICAgICAgQTogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGVtYWlsOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgUDogeyBpZDogbnVtYmVyOyBuYW1lOiBzdHJpbmc7IGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH0gfTtcbiAgICAgICAgU1M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBlbWFpbDogc3RyaW5nOyBwYXNzd29yZDogc3RyaW5nIH07XG4gICAgICB9PigpO1xuICAgIH0pO1xuXG4gICAgaXQoXCLroZzrjZTrpbwg7Y+s7ZWo7ZWcIFN1YnNldCDqsrDqs7zrpbwg7LaU66Gg7ZWc64ukXCIsICgpID0+IHtcbiAgICAgIC8vIFN1YnNldFF1ZXJ5XG4gICAgICB0eXBlIFN1YnNldEZuQSA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIGRlcGFydG1lbnRfX25hbWU6IHN0cmluZztcbiAgICAgIH0+O1xuICAgICAgdHlwZSBTdWJzZXRGblAgPSAocWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4pID0+IE1vY2tQdXJpPHtcbiAgICAgICAgaWQ6IG51bWJlcjtcbiAgICAgICAgbmFtZTogc3RyaW5nO1xuICAgICAgICBkZXBhcnRtZW50X19uYW1lOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0Rm5TUyA9IChxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPikgPT4gTW9ja1B1cmk8e1xuICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgICAgIHBhc3N3b3JkOiBzdHJpbmc7XG4gICAgICB9PjtcbiAgICAgIHR5cGUgU3Vic2V0UXVlcmllcyA9IHtcbiAgICAgICAgQTogU3Vic2V0Rm5BO1xuICAgICAgICBQOiBTdWJzZXRGblA7XG4gICAgICAgIFNTOiBTdWJzZXRGblNTO1xuICAgICAgfTtcblxuICAgICAgLy8gTG9hZGVyUXVlcnlcbiAgICAgIHR5cGUgUHJvamVjdExvYWRlciA9IHtcbiAgICAgICAgYXM6IFwicHJvamVjdHNcIjtcbiAgICAgICAgcmVmSWQ6IFwiaWRcIjtcbiAgICAgICAgcWI6IChcbiAgICAgICAgICBxYldyYXBwZXI6IFB1cmlXcmFwcGVyPERhdGFiYXNlU2NoZW1hRXh0ZW5kPixcbiAgICAgICAgICBmcm9tSWRzOiBudW1iZXJbXSxcbiAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgc3RhdHVzOiBzdHJpbmc7IHJlZklkOiBudW1iZXIgfT47XG4gICAgICAgIGxvYWRlcnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBhczogXCJ0YWdzXCI7XG4gICAgICAgICAgICByZWZJZDogXCJpZFwiO1xuICAgICAgICAgICAgcWI6IChcbiAgICAgICAgICAgICAgcWJXcmFwcGVyOiBQdXJpV3JhcHBlcjxEYXRhYmFzZVNjaGVtYUV4dGVuZD4sXG4gICAgICAgICAgICAgIGZyb21JZHM6IG51bWJlcltdLFxuICAgICAgICAgICAgKSA9PiBNb2NrUHVyaTx7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgcmVmSWQ6IG51bWJlciB9PjtcbiAgICAgICAgICB9LFxuICAgICAgICBdO1xuICAgICAgfTtcbiAgICAgIHR5cGUgTG9hZGVyUXVlcmllcyA9IHtcbiAgICAgICAgQTogW1Byb2plY3RMb2FkZXJdO1xuICAgICAgICBQOiBbXTtcbiAgICAgICAgU1M6IFtdO1xuICAgICAgfTtcblxuICAgICAgLy8gUmVzdWx0XG4gICAgICB0eXBlIFJlc3VsdCA9IEluZmVyQWxsU3Vic2V0czxTdWJzZXRRdWVyaWVzLCBMb2FkZXJRdWVyaWVzPjtcblxuICAgICAgY29uc3QgcmVzdWx0ID0ge30gYXMgUmVzdWx0O1xuICAgICAgZXhwZWN0VHlwZU9mKHJlc3VsdCkudG9FcXVhbFR5cGVPZjx7XG4gICAgICAgIEE6IHtcbiAgICAgICAgICBpZDogbnVtYmVyO1xuICAgICAgICAgIG5hbWU6IHN0cmluZztcbiAgICAgICAgICBlbWFpbDogc3RyaW5nO1xuICAgICAgICAgIGRlcGFydG1lbnQ6IHsgbmFtZTogc3RyaW5nIH07XG4gICAgICAgICAgcHJvamVjdHM6IHtcbiAgICAgICAgICAgIGlkOiBudW1iZXI7XG4gICAgICAgICAgICBuYW1lOiBzdHJpbmc7XG4gICAgICAgICAgICBzdGF0dXM6IHN0cmluZztcbiAgICAgICAgICAgIHRhZ3M6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nIH1bXTtcbiAgICAgICAgICB9W107XG4gICAgICAgIH07XG4gICAgICAgIFA6IHsgaWQ6IG51bWJlcjsgbmFtZTogc3RyaW5nOyBkZXBhcnRtZW50OiB7IG5hbWU6IHN0cmluZyB9IH07XG4gICAgICAgIFNTOiB7IGlkOiBudW1iZXI7IG5hbWU6IHN0cmluZzsgZW1haWw6IHN0cmluZzsgcGFzc3dvcmQ6IHN0cmluZyB9O1xuICAgICAgfT4oKTtcbiAgICB9KTtcbiAgfSk7XG59KTtcbiJdLCJuYW1lcyI6WyJkZXNjcmliZSIsImV4cGVjdFR5cGVPZiIsIml0IiwicmVzdWx0IiwidG9FcXVhbFR5cGVPZiIsInRvSGF2ZVByb3BlcnR5IiwiQSIsImRlcGFydG1lbnQiLCJjb21wYW55Il0sIm1hcHBpbmdzIjoiQUFBQSxTQUFTQSxRQUFRLEVBQUVDLFlBQVksRUFBRUMsRUFBRSxRQUFRLFNBQVM7QUFRcERGLFNBQVMsV0FBVztJQUNsQkUsR0FBRyxnQ0FBZ0M7UUFJakMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsK0JBQStCO1FBSWhDLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUlwQztJQUVBRixHQUFHLHFDQUFxQztRQVN0QyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFPcEM7SUFFQUYsR0FBRyxtQkFBbUI7UUFVcEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBS3BDO0lBRUFGLEdBQUcsY0FBYztRQUlmLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtJQUNwQztJQUVBRixHQUFHLCtCQUErQjtRQVFoQyxNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7SUFJcEM7SUFFQUYsR0FBRyxvQ0FBb0M7UUFTckMsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO0lBS3BDO0FBQ0Y7QUFFQUosU0FBUyxpQkFBaUI7SUFDeEJFLEdBQUcsc0JBQXNCO1FBZXZCLE1BQU1DLFNBQVMsQ0FBQztRQUNoQkYsYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRQyxhQUFhO0lBQ3BDO0lBRUFGLEdBQUcsZUFBZTtRQTJCaEIsTUFBTUMsU0FBUyxDQUFDO1FBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFHcEM7SUFFQUYsR0FBRyxlQUFlO1FBdUNoQixNQUFNQyxTQUFTLENBQUM7UUFDaEJGLGFBQWFFLFFBQVFFLGNBQWMsQ0FBQztRQUNwQ0osYUFBYUUsUUFBUUUsY0FBYyxDQUFDO1FBQ3BDSixhQUFhRSxRQUFRRSxjQUFjLENBQUM7UUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7SUFTcEM7QUFDRjtBQUVBSixTQUFTLG1CQUFtQjtJQUMxQkEsU0FBUyxlQUFlO1FBQ3RCRSxHQUFHLDRCQUE0QjtZQXFCN0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7WUFDcENKLGFBQWFFLE9BQU9HLENBQUMsRUFBRUYsYUFBYTtZQUtwQ0gsYUFBYUUsT0FBT0csQ0FBQyxDQUFDQyxVQUFVLENBQUNDLE9BQU8sRUFBRUosYUFBYTtRQUN6RDtRQUVBRixHQUFHLDJCQUEyQjtZQXFDNUIsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRRSxjQUFjLENBQUM7WUFDcENKLGFBQWFFLFFBQVFDLGFBQWE7UUFXcEM7UUFFQUYsR0FBRyw4QkFBOEI7WUFvQy9CLE1BQU1DLFNBQVMsQ0FBQztZQUNoQkYsYUFBYUUsUUFBUUMsYUFBYTtRQWFwQztJQUNGO0lBRUFKLFNBQVMsaUJBQWlCO1FBQ3hCRSxHQUFHLDRCQUE0QjtZQW1DN0IsTUFBTUMsU0FBUyxDQUFDO1lBQ2hCRixhQUFhRSxRQUFRQyxhQUFhO1FBS3BDO1FBRUFGLEdBQUcsMkJBQTJCO1lBcUQ1QixNQUFNQyxTQUFTLENBQUM7WUFDaEJGLGFBQWFFLFFBQVFDLGFBQWE7UUFnQnBDO0lBQ0Y7QUFDRiJ9