@uql/core 1.0.12 → 3.1.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 (464) hide show
  1. package/CHANGELOG.md +254 -0
  2. package/LICENSE.md +2 -2
  3. package/dist/browser/http/bus.d.ts +3 -0
  4. package/dist/browser/http/bus.js +14 -0
  5. package/dist/browser/http/http.d.ts +6 -0
  6. package/dist/browser/http/http.js +45 -0
  7. package/dist/browser/http/index.d.ts +2 -0
  8. package/dist/browser/http/index.js +3 -0
  9. package/dist/browser/index.d.ts +4 -0
  10. package/dist/browser/index.js +5 -0
  11. package/dist/browser/options.d.ts +4 -0
  12. package/dist/browser/options.js +14 -0
  13. package/dist/browser/querier/genericClientRepository.d.ts +17 -0
  14. package/dist/browser/querier/genericClientRepository.js +39 -0
  15. package/dist/browser/querier/httpQuerier.d.ts +20 -0
  16. package/dist/browser/querier/httpQuerier.js +71 -0
  17. package/dist/browser/querier/index.d.ts +3 -0
  18. package/dist/browser/querier/index.js +4 -0
  19. package/dist/browser/querier/querier.util.d.ts +2 -0
  20. package/dist/browser/querier/querier.util.js +17 -0
  21. package/dist/browser/type/clientQuerier.d.ts +16 -0
  22. package/dist/browser/type/clientQuerier.js +2 -0
  23. package/dist/browser/type/clientQuerierPool.d.ts +4 -0
  24. package/dist/browser/type/clientQuerierPool.js +2 -0
  25. package/dist/browser/type/clientRepository.d.ts +13 -0
  26. package/dist/browser/type/clientRepository.js +2 -0
  27. package/dist/browser/type/index.d.ts +4 -0
  28. package/dist/browser/type/index.js +5 -0
  29. package/dist/browser/type/request.d.ts +28 -0
  30. package/dist/browser/type/request.js +2 -0
  31. package/dist/browser/uql-browser.min.js +2150 -0
  32. package/dist/browser/uql-browser.min.js.map +1 -0
  33. package/dist/dialect/abstractDialect.d.ts +16 -0
  34. package/dist/dialect/abstractDialect.js +28 -0
  35. package/dist/dialect/abstractSqlDialect.d.ts +47 -0
  36. package/dist/dialect/abstractSqlDialect.js +650 -0
  37. package/dist/dialect/index.d.ts +3 -0
  38. package/dist/dialect/index.js +4 -0
  39. package/dist/dialect/queryContext.d.ts +48 -0
  40. package/dist/dialect/queryContext.js +65 -0
  41. package/{entity → dist/entity}/decorator/definition.d.ts +3 -3
  42. package/dist/entity/decorator/definition.js +214 -0
  43. package/{entity → dist/entity}/decorator/entity.d.ts +1 -1
  44. package/dist/entity/decorator/entity.js +7 -0
  45. package/{entity → dist/entity}/decorator/field.d.ts +1 -1
  46. package/dist/entity/decorator/field.js +8 -0
  47. package/{entity → dist/entity}/decorator/id.d.ts +1 -1
  48. package/dist/entity/decorator/id.js +8 -0
  49. package/dist/entity/decorator/index.d.ts +5 -0
  50. package/dist/entity/decorator/index.js +6 -0
  51. package/{entity → dist/entity}/decorator/relation.d.ts +1 -1
  52. package/dist/entity/decorator/relation.js +20 -0
  53. package/dist/entity/index.d.ts +1 -0
  54. package/dist/entity/index.js +2 -0
  55. package/dist/express/index.d.ts +2 -0
  56. package/dist/express/index.js +3 -0
  57. package/dist/express/querierMiddleware.d.ts +26 -0
  58. package/dist/express/querierMiddleware.js +190 -0
  59. package/dist/express/query.util.d.ts +2 -0
  60. package/dist/express/query.util.js +19 -0
  61. package/dist/index.d.ts +9 -0
  62. package/dist/index.js +10 -0
  63. package/dist/maria/index.d.ts +3 -0
  64. package/dist/maria/index.js +4 -0
  65. package/dist/maria/mariaDialect.d.ts +8 -0
  66. package/dist/maria/mariaDialect.js +38 -0
  67. package/dist/maria/mariaQuerierPool.test.d.ts +5 -0
  68. package/dist/maria/mariaQuerierPool.test.js +19 -0
  69. package/dist/maria/mariadbQuerier.d.ts +17 -0
  70. package/dist/maria/mariadbQuerier.js +39 -0
  71. package/dist/maria/mariadbQuerier.test.d.ts +4 -0
  72. package/dist/maria/mariadbQuerier.test.js +19 -0
  73. package/dist/maria/mariadbQuerierPool.d.ts +10 -0
  74. package/dist/maria/mariadbQuerierPool.js +17 -0
  75. package/dist/migrate/cli.d.ts +2 -0
  76. package/dist/migrate/cli.js +254 -0
  77. package/dist/migrate/generator/index.d.ts +4 -0
  78. package/dist/migrate/generator/index.js +5 -0
  79. package/dist/migrate/generator/mongoSchemaGenerator.d.ts +12 -0
  80. package/dist/migrate/generator/mongoSchemaGenerator.js +100 -0
  81. package/dist/migrate/generator/mysqlSchemaGenerator.d.ts +14 -0
  82. package/dist/migrate/generator/mysqlSchemaGenerator.js +81 -0
  83. package/dist/migrate/generator/postgresSchemaGenerator.d.ts +18 -0
  84. package/dist/migrate/generator/postgresSchemaGenerator.js +111 -0
  85. package/dist/migrate/generator/sqliteSchemaGenerator.d.ts +14 -0
  86. package/dist/migrate/generator/sqliteSchemaGenerator.js +68 -0
  87. package/dist/migrate/index.d.ts +12 -0
  88. package/dist/migrate/index.js +17 -0
  89. package/dist/migrate/introspection/index.d.ts +4 -0
  90. package/dist/migrate/introspection/index.js +5 -0
  91. package/dist/migrate/introspection/mongoIntrospector.d.ts +8 -0
  92. package/dist/migrate/introspection/mongoIntrospector.js +46 -0
  93. package/dist/migrate/introspection/mysqlIntrospector.d.ts +25 -0
  94. package/dist/migrate/introspection/mysqlIntrospector.js +220 -0
  95. package/dist/migrate/introspection/postgresIntrospector.d.ts +21 -0
  96. package/dist/migrate/introspection/postgresIntrospector.js +269 -0
  97. package/dist/migrate/introspection/sqliteIntrospector.d.ts +23 -0
  98. package/dist/migrate/introspection/sqliteIntrospector.js +212 -0
  99. package/dist/migrate/migrator-mongo.test.d.ts +1 -0
  100. package/dist/migrate/migrator-mongo.test.js +54 -0
  101. package/dist/migrate/migrator.d.ts +133 -0
  102. package/dist/migrate/migrator.js +600 -0
  103. package/dist/migrate/migrator.test.d.ts +1 -0
  104. package/dist/migrate/migrator.test.js +106 -0
  105. package/dist/migrate/schemaGenerator.d.ts +78 -0
  106. package/dist/migrate/schemaGenerator.js +363 -0
  107. package/dist/migrate/storage/databaseStorage.d.ts +24 -0
  108. package/dist/migrate/storage/databaseStorage.js +77 -0
  109. package/dist/migrate/storage/index.d.ts +2 -0
  110. package/dist/migrate/storage/index.js +3 -0
  111. package/dist/migrate/storage/jsonStorage.d.ts +15 -0
  112. package/dist/migrate/storage/jsonStorage.js +51 -0
  113. package/dist/migrate/type.d.ts +1 -0
  114. package/dist/migrate/type.js +2 -0
  115. package/dist/mongo/index.d.ts +3 -0
  116. package/dist/mongo/index.js +4 -0
  117. package/dist/mongo/mongoDialect.d.ts +34 -0
  118. package/dist/mongo/mongoDialect.js +163 -0
  119. package/dist/mongo/mongodbQuerier.d.ts +28 -0
  120. package/dist/mongo/mongodbQuerier.js +204 -0
  121. package/dist/mongo/mongodbQuerier.test.d.ts +1 -0
  122. package/dist/mongo/mongodbQuerier.test.js +36 -0
  123. package/dist/mongo/mongodbQuerierPool.d.ts +10 -0
  124. package/dist/mongo/mongodbQuerierPool.js +20 -0
  125. package/dist/mongo/mongodbQuerierPool.test.d.ts +1 -0
  126. package/dist/mongo/mongodbQuerierPool.test.js +21 -0
  127. package/dist/mysql/index.d.ts +3 -0
  128. package/dist/mysql/index.js +4 -0
  129. package/dist/mysql/mysql2Querier.d.ts +17 -0
  130. package/dist/mysql/mysql2Querier.js +43 -0
  131. package/dist/mysql/mysql2Querier.test.d.ts +4 -0
  132. package/dist/mysql/mysql2Querier.test.js +16 -0
  133. package/dist/mysql/mysql2QuerierPool.d.ts +10 -0
  134. package/dist/mysql/mysql2QuerierPool.js +17 -0
  135. package/dist/mysql/mysql2QuerierPool.test.d.ts +5 -0
  136. package/dist/mysql/mysql2QuerierPool.test.js +16 -0
  137. package/dist/mysql/mysqlDialect.d.ts +5 -0
  138. package/dist/mysql/mysqlDialect.js +15 -0
  139. package/dist/namingStrategy/defaultNamingStrategy.d.ts +9 -0
  140. package/dist/namingStrategy/defaultNamingStrategy.js +15 -0
  141. package/dist/namingStrategy/index.d.ts +2 -0
  142. package/dist/namingStrategy/index.js +3 -0
  143. package/dist/namingStrategy/snakeCaseNamingStrategy.d.ts +8 -0
  144. package/dist/namingStrategy/snakeCaseNamingStrategy.js +14 -0
  145. package/{options.d.ts → dist/options.d.ts} +1 -1
  146. package/dist/options.js +14 -0
  147. package/dist/package.json +131 -0
  148. package/dist/postgres/index.d.ts +3 -0
  149. package/dist/postgres/index.js +4 -0
  150. package/dist/postgres/pgQuerier.d.ts +17 -0
  151. package/dist/postgres/pgQuerier.js +39 -0
  152. package/dist/postgres/pgQuerier.test.d.ts +4 -0
  153. package/dist/postgres/pgQuerier.test.js +20 -0
  154. package/dist/postgres/pgQuerierPool.d.ts +10 -0
  155. package/dist/postgres/pgQuerierPool.js +17 -0
  156. package/dist/postgres/pgQuerierPool.test.d.ts +5 -0
  157. package/dist/postgres/pgQuerierPool.test.js +23 -0
  158. package/dist/postgres/postgresDialect.d.ts +13 -0
  159. package/dist/postgres/postgresDialect.js +110 -0
  160. package/dist/querier/abstractQuerier-test.d.ts +45 -0
  161. package/dist/querier/abstractQuerier-test.js +461 -0
  162. package/dist/querier/abstractQuerier.d.ts +50 -0
  163. package/dist/querier/abstractQuerier.js +278 -0
  164. package/dist/querier/abstractQuerierPool-test.d.ts +9 -0
  165. package/dist/querier/abstractQuerierPool-test.js +18 -0
  166. package/dist/querier/abstractQuerierPool.d.ts +14 -0
  167. package/dist/querier/abstractQuerierPool.js +9 -0
  168. package/dist/querier/abstractSqlQuerier-test.d.ts +9 -0
  169. package/dist/querier/abstractSqlQuerier-test.js +16 -0
  170. package/dist/querier/abstractSqlQuerier.d.ts +28 -0
  171. package/dist/querier/abstractSqlQuerier.js +133 -0
  172. package/dist/querier/decorator/index.d.ts +3 -0
  173. package/dist/querier/decorator/index.js +4 -0
  174. package/dist/querier/decorator/injectQuerier.d.ts +3 -0
  175. package/dist/querier/decorator/injectQuerier.js +33 -0
  176. package/dist/querier/decorator/serialized.d.ts +6 -0
  177. package/dist/querier/decorator/serialized.js +14 -0
  178. package/{querier → dist/querier}/decorator/transactional.d.ts +1 -1
  179. package/dist/querier/decorator/transactional.js +48 -0
  180. package/dist/querier/index.d.ts +4 -0
  181. package/dist/querier/index.js +5 -0
  182. package/dist/repository/genericRepository.d.ts +20 -0
  183. package/dist/repository/genericRepository.js +51 -0
  184. package/dist/repository/index.d.ts +1 -0
  185. package/dist/repository/index.js +2 -0
  186. package/dist/sqlite/index.d.ts +3 -0
  187. package/dist/sqlite/index.js +4 -0
  188. package/dist/sqlite/sqliteDialect.d.ts +10 -0
  189. package/dist/sqlite/sqliteDialect.js +48 -0
  190. package/dist/sqlite/sqliteQuerier.d.ts +15 -0
  191. package/dist/sqlite/sqliteQuerier.js +33 -0
  192. package/dist/sqlite/sqliteQuerier.test.d.ts +5 -0
  193. package/dist/sqlite/sqliteQuerier.test.js +19 -0
  194. package/dist/sqlite/sqliteQuerierPool.d.ts +14 -0
  195. package/dist/sqlite/sqliteQuerierPool.js +34 -0
  196. package/dist/sqlite/sqliteQuerierPool.test.d.ts +5 -0
  197. package/dist/sqlite/sqliteQuerierPool.test.js +10 -0
  198. package/dist/test/entityMock.d.ts +164 -0
  199. package/dist/test/entityMock.js +554 -0
  200. package/dist/test/index.d.ts +3 -0
  201. package/dist/test/index.js +4 -0
  202. package/dist/test/it.util.d.ts +4 -0
  203. package/dist/test/it.util.js +55 -0
  204. package/dist/test/spec.util.d.ts +14 -0
  205. package/dist/test/spec.util.js +50 -0
  206. package/{type → dist/type}/entity.d.ts +97 -4
  207. package/dist/type/entity.js +5 -0
  208. package/dist/type/index.d.ts +9 -0
  209. package/dist/type/index.js +10 -0
  210. package/dist/type/migration.d.ts +213 -0
  211. package/dist/type/migration.js +2 -0
  212. package/dist/type/namingStrategy.d.ts +17 -0
  213. package/dist/type/namingStrategy.js +2 -0
  214. package/dist/type/querier.d.ts +96 -0
  215. package/dist/type/querier.js +11 -0
  216. package/{type → dist/type}/querierPool.d.ts +7 -3
  217. package/dist/type/querierPool.js +2 -0
  218. package/{type → dist/type}/query.d.ts +170 -108
  219. package/dist/type/query.js +9 -0
  220. package/{type → dist/type}/repository.d.ts +42 -35
  221. package/dist/type/repository.js +2 -0
  222. package/{type → dist/type}/universalQuerier.d.ts +50 -28
  223. package/dist/type/universalQuerier.js +2 -0
  224. package/dist/type/utility.d.ts +13 -0
  225. package/dist/type/utility.js +2 -0
  226. package/dist/util/dialect.util.d.ts +12 -0
  227. package/dist/util/dialect.util.js +93 -0
  228. package/dist/util/index.d.ts +5 -0
  229. package/dist/util/index.js +6 -0
  230. package/dist/util/object.util.d.ts +7 -0
  231. package/dist/util/object.util.js +19 -0
  232. package/dist/util/raw.d.ts +8 -0
  233. package/dist/util/raw.js +11 -0
  234. package/dist/util/sql.util.d.ts +13 -0
  235. package/dist/util/sql.util.js +78 -0
  236. package/{util → dist/util}/string.util.d.ts +1 -0
  237. package/dist/util/string.util.js +34 -0
  238. package/package.json +85 -17
  239. package/src/@types/index.d.ts +1 -0
  240. package/src/@types/jest.d.ts +6 -0
  241. package/src/browser/http/bus.spec.ts +22 -0
  242. package/src/browser/http/bus.ts +17 -0
  243. package/src/browser/http/http.spec.ts +70 -0
  244. package/src/browser/http/http.ts +55 -0
  245. package/src/browser/http/index.ts +2 -0
  246. package/src/browser/index.ts +4 -0
  247. package/src/browser/options.spec.ts +37 -0
  248. package/src/browser/options.ts +18 -0
  249. package/src/browser/querier/genericClientRepository.spec.ts +105 -0
  250. package/src/browser/querier/genericClientRepository.ts +49 -0
  251. package/src/browser/querier/httpQuerier.ts +82 -0
  252. package/src/browser/querier/index.ts +3 -0
  253. package/src/browser/querier/querier.util.spec.ts +35 -0
  254. package/src/browser/querier/querier.util.ts +18 -0
  255. package/src/browser/type/clientQuerier.ts +45 -0
  256. package/src/browser/type/clientQuerierPool.ts +5 -0
  257. package/src/browser/type/clientRepository.ts +22 -0
  258. package/src/browser/type/index.ts +4 -0
  259. package/src/browser/type/request.ts +25 -0
  260. package/src/dialect/abstractDialect.ts +28 -0
  261. package/src/dialect/abstractSqlDialect-spec.ts +1309 -0
  262. package/src/dialect/abstractSqlDialect.ts +805 -0
  263. package/src/dialect/index.ts +3 -0
  264. package/src/dialect/namingStrategy.spec.ts +52 -0
  265. package/src/dialect/queryContext.ts +69 -0
  266. package/src/entity/decorator/definition.spec.ts +736 -0
  267. package/src/entity/decorator/definition.ts +265 -0
  268. package/src/entity/decorator/entity.ts +8 -0
  269. package/src/entity/decorator/field.ts +9 -0
  270. package/src/entity/decorator/id.ts +9 -0
  271. package/src/entity/decorator/index.ts +5 -0
  272. package/src/entity/decorator/relation.spec.ts +41 -0
  273. package/src/entity/decorator/relation.ts +34 -0
  274. package/src/entity/index.ts +1 -0
  275. package/src/express/@types/express.d.ts +8 -0
  276. package/src/express/@types/index.d.ts +1 -0
  277. package/src/express/index.ts +2 -0
  278. package/src/express/querierMiddleware.ts +217 -0
  279. package/src/express/query.util.spec.ts +40 -0
  280. package/src/express/query.util.ts +21 -0
  281. package/src/index.ts +9 -0
  282. package/src/maria/index.ts +3 -0
  283. package/src/maria/mariaDialect.spec.ts +207 -0
  284. package/src/maria/mariaDialect.ts +42 -0
  285. package/src/maria/mariaQuerierPool.test.ts +23 -0
  286. package/src/maria/mariadbQuerier.test.ts +23 -0
  287. package/src/maria/mariadbQuerier.ts +45 -0
  288. package/src/maria/mariadbQuerierPool.ts +21 -0
  289. package/src/migrate/cli.ts +301 -0
  290. package/src/migrate/generator/index.ts +4 -0
  291. package/src/migrate/generator/mongoSchemaGenerator.spec.ts +112 -0
  292. package/src/migrate/generator/mongoSchemaGenerator.ts +115 -0
  293. package/src/migrate/generator/mysqlSchemaGenerator.spec.ts +34 -0
  294. package/src/migrate/generator/mysqlSchemaGenerator.ts +92 -0
  295. package/src/migrate/generator/postgresSchemaGenerator.spec.ts +44 -0
  296. package/src/migrate/generator/postgresSchemaGenerator.ts +127 -0
  297. package/src/migrate/generator/sqliteSchemaGenerator.spec.ts +33 -0
  298. package/src/migrate/generator/sqliteSchemaGenerator.ts +81 -0
  299. package/src/migrate/index.ts +41 -0
  300. package/src/migrate/introspection/index.ts +4 -0
  301. package/src/migrate/introspection/mongoIntrospector.spec.ts +75 -0
  302. package/src/migrate/introspection/mongoIntrospector.ts +47 -0
  303. package/src/migrate/introspection/mysqlIntrospector.spec.ts +113 -0
  304. package/src/migrate/introspection/mysqlIntrospector.ts +278 -0
  305. package/src/migrate/introspection/postgresIntrospector.spec.ts +112 -0
  306. package/src/migrate/introspection/postgresIntrospector.ts +329 -0
  307. package/src/migrate/introspection/sqliteIntrospector.spec.ts +112 -0
  308. package/src/migrate/introspection/sqliteIntrospector.ts +296 -0
  309. package/src/migrate/migrator-mongo.test.ts +54 -0
  310. package/src/migrate/migrator.spec.ts +255 -0
  311. package/src/migrate/migrator.test.ts +94 -0
  312. package/src/migrate/migrator.ts +719 -0
  313. package/src/migrate/namingStrategy.spec.ts +22 -0
  314. package/src/migrate/schemaGenerator-advanced.spec.ts +138 -0
  315. package/src/migrate/schemaGenerator.spec.ts +190 -0
  316. package/src/migrate/schemaGenerator.ts +478 -0
  317. package/src/migrate/storage/databaseStorage.spec.ts +69 -0
  318. package/src/migrate/storage/databaseStorage.ts +100 -0
  319. package/src/migrate/storage/index.ts +2 -0
  320. package/src/migrate/storage/jsonStorage.ts +58 -0
  321. package/src/migrate/type.ts +1 -0
  322. package/src/mongo/index.ts +3 -0
  323. package/src/mongo/mongoDialect.spec.ts +251 -0
  324. package/src/mongo/mongoDialect.ts +238 -0
  325. package/src/mongo/mongodbQuerier.test.ts +45 -0
  326. package/src/mongo/mongodbQuerier.ts +256 -0
  327. package/src/mongo/mongodbQuerierPool.test.ts +25 -0
  328. package/src/mongo/mongodbQuerierPool.ts +24 -0
  329. package/src/mysql/index.ts +3 -0
  330. package/src/mysql/mysql2Querier.test.ts +20 -0
  331. package/src/mysql/mysql2Querier.ts +49 -0
  332. package/src/mysql/mysql2QuerierPool.test.ts +20 -0
  333. package/src/mysql/mysql2QuerierPool.ts +21 -0
  334. package/src/mysql/mysqlDialect.spec.ts +20 -0
  335. package/src/mysql/mysqlDialect.ts +16 -0
  336. package/src/namingStrategy/defaultNamingStrategy.ts +18 -0
  337. package/src/namingStrategy/index.spec.ts +36 -0
  338. package/src/namingStrategy/index.ts +2 -0
  339. package/src/namingStrategy/snakeCaseNamingStrategy.ts +15 -0
  340. package/src/options.spec.ts +41 -0
  341. package/src/options.ts +18 -0
  342. package/src/postgres/index.ts +3 -0
  343. package/src/postgres/manual-types.d.ts +4 -0
  344. package/src/postgres/pgQuerier.test.ts +25 -0
  345. package/src/postgres/pgQuerier.ts +45 -0
  346. package/src/postgres/pgQuerierPool.test.ts +28 -0
  347. package/src/postgres/pgQuerierPool.ts +21 -0
  348. package/src/postgres/postgresDialect.spec.ts +428 -0
  349. package/src/postgres/postgresDialect.ts +144 -0
  350. package/src/querier/abstractQuerier-test.ts +584 -0
  351. package/src/querier/abstractQuerier.ts +353 -0
  352. package/src/querier/abstractQuerierPool-test.ts +20 -0
  353. package/src/querier/abstractQuerierPool.ts +18 -0
  354. package/src/querier/abstractSqlQuerier-spec.ts +979 -0
  355. package/src/querier/abstractSqlQuerier-test.ts +21 -0
  356. package/src/querier/abstractSqlQuerier.ts +138 -0
  357. package/src/querier/decorator/index.ts +3 -0
  358. package/src/querier/decorator/injectQuerier.spec.ts +74 -0
  359. package/src/querier/decorator/injectQuerier.ts +45 -0
  360. package/src/querier/decorator/serialized.spec.ts +98 -0
  361. package/src/querier/decorator/serialized.ts +13 -0
  362. package/src/querier/decorator/transactional.spec.ts +240 -0
  363. package/src/querier/decorator/transactional.ts +56 -0
  364. package/src/querier/index.ts +4 -0
  365. package/src/repository/genericRepository.spec.ts +111 -0
  366. package/src/repository/genericRepository.ts +74 -0
  367. package/src/repository/index.ts +1 -0
  368. package/src/sqlite/index.ts +3 -0
  369. package/src/sqlite/manual-types.d.ts +4 -0
  370. package/src/sqlite/sqliteDialect.spec.ts +155 -0
  371. package/src/sqlite/sqliteDialect.ts +76 -0
  372. package/src/sqlite/sqliteQuerier.spec.ts +36 -0
  373. package/src/sqlite/sqliteQuerier.test.ts +21 -0
  374. package/src/sqlite/sqliteQuerier.ts +37 -0
  375. package/src/sqlite/sqliteQuerierPool.test.ts +12 -0
  376. package/src/sqlite/sqliteQuerierPool.ts +38 -0
  377. package/src/test/entityMock.ts +375 -0
  378. package/src/test/index.ts +3 -0
  379. package/src/test/it.util.ts +69 -0
  380. package/src/test/spec.util.ts +57 -0
  381. package/src/type/entity.ts +218 -0
  382. package/src/type/index.ts +9 -0
  383. package/src/type/migration.ts +241 -0
  384. package/src/type/namingStrategy.ts +17 -0
  385. package/src/type/querier.ts +143 -0
  386. package/src/type/querierPool.ts +26 -0
  387. package/src/type/query.ts +506 -0
  388. package/src/type/repository.ts +142 -0
  389. package/src/type/universalQuerier.ts +133 -0
  390. package/src/type/utility.ts +21 -0
  391. package/src/util/dialect.util-extra.spec.ts +96 -0
  392. package/src/util/dialect.util.spec.ts +23 -0
  393. package/src/util/dialect.util.ts +134 -0
  394. package/src/util/index.ts +5 -0
  395. package/src/util/object.util.spec.ts +29 -0
  396. package/src/util/object.util.ts +27 -0
  397. package/src/util/raw.ts +11 -0
  398. package/src/util/sql.util-extra.spec.ts +17 -0
  399. package/src/util/sql.util.spec.ts +208 -0
  400. package/src/util/sql.util.ts +104 -0
  401. package/src/util/string.util.spec.ts +46 -0
  402. package/src/util/string.util.ts +35 -0
  403. package/tsconfig.build.json +5 -0
  404. package/tsconfig.json +8 -0
  405. package/README.md +0 -177
  406. package/dialect/abstractSqlDialect.d.ts +0 -30
  407. package/dialect/abstractSqlDialect.js +0 -365
  408. package/dialect/index.d.ts +0 -4
  409. package/dialect/index.js +0 -8
  410. package/dialect/mysqlDialect.d.ts +0 -6
  411. package/dialect/mysqlDialect.js +0 -21
  412. package/dialect/postgresDialect.d.ts +0 -8
  413. package/dialect/postgresDialect.js +0 -44
  414. package/dialect/sqliteDialect.d.ts +0 -4
  415. package/dialect/sqliteDialect.js +0 -11
  416. package/entity/decorator/definition.js +0 -223
  417. package/entity/decorator/entity.js +0 -11
  418. package/entity/decorator/field.js +0 -12
  419. package/entity/decorator/id.js +0 -12
  420. package/entity/decorator/index.d.ts +0 -5
  421. package/entity/decorator/index.js +0 -12
  422. package/entity/decorator/relation.js +0 -27
  423. package/entity/index.d.ts +0 -1
  424. package/entity/index.js +0 -5
  425. package/index.d.ts +0 -1
  426. package/index.js +0 -5
  427. package/options.js +0 -20
  428. package/querier/abstractQuerier.d.ts +0 -30
  429. package/querier/abstractQuerier.js +0 -230
  430. package/querier/abstractSqlQuerier.d.ts +0 -27
  431. package/querier/abstractSqlQuerier.js +0 -88
  432. package/querier/decorator/index.d.ts +0 -2
  433. package/querier/decorator/index.js +0 -6
  434. package/querier/decorator/injectQuerier.d.ts +0 -3
  435. package/querier/decorator/injectQuerier.js +0 -39
  436. package/querier/decorator/transactional.js +0 -52
  437. package/querier/index.d.ts +0 -3
  438. package/querier/index.js +0 -7
  439. package/repository/genericRepository.d.ts +0 -19
  440. package/repository/genericRepository.js +0 -52
  441. package/repository/index.d.ts +0 -1
  442. package/repository/index.js +0 -5
  443. package/type/entity.js +0 -5
  444. package/type/index.d.ts +0 -7
  445. package/type/index.js +0 -11
  446. package/type/querier.d.ts +0 -53
  447. package/type/querier.js +0 -3
  448. package/type/querierPool.js +0 -3
  449. package/type/query.js +0 -13
  450. package/type/repository.js +0 -3
  451. package/type/universalQuerier.js +0 -3
  452. package/type/utility.d.ts +0 -12
  453. package/type/utility.js +0 -3
  454. package/util/dialect.util.d.ts +0 -17
  455. package/util/dialect.util.js +0 -114
  456. package/util/index.d.ts +0 -5
  457. package/util/index.js +0 -9
  458. package/util/object.util.d.ts +0 -3
  459. package/util/object.util.js +0 -22
  460. package/util/raw.d.ts +0 -2
  461. package/util/raw.js +0 -9
  462. package/util/sql.util.d.ts +0 -2
  463. package/util/sql.util.js +0 -55
  464. package/util/string.util.js +0 -20
@@ -0,0 +1,461 @@
1
+ import { expect } from 'bun:test';
2
+ import { getEntities } from '../entity/index.js';
3
+ import { Company, InventoryAdjustment, Item, ItemAdjustment, LedgerAccount, MeasureUnit, Tag, TaxCategory, User, } from '../test/index.js';
4
+ export class AbstractQuerierIt {
5
+ pool;
6
+ querier;
7
+ constructor(pool) {
8
+ this.pool = pool;
9
+ }
10
+ async beforeAll() {
11
+ const querier = await this.pool.getQuerier();
12
+ try {
13
+ this.querier = querier;
14
+ await this.dropTables();
15
+ await this.createTables();
16
+ }
17
+ finally {
18
+ await querier.release();
19
+ this.querier = undefined;
20
+ }
21
+ }
22
+ async beforeEach() {
23
+ this.querier = await this.pool.getQuerier();
24
+ await this.clearTables();
25
+ }
26
+ async afterEach() {
27
+ await this.querier.release();
28
+ }
29
+ async afterAll() {
30
+ await this.pool.end();
31
+ }
32
+ shouldGetRepository() {
33
+ const repository = this.querier.getRepository(User);
34
+ expect(repository).toBeDefined();
35
+ }
36
+ async shouldInsertMany() {
37
+ const ids = await this.querier.insertMany(User, [
38
+ {
39
+ name: 'Some Name A',
40
+ email: 'someemaila@example.com',
41
+ password: '123456789a!',
42
+ },
43
+ {
44
+ name: 'Some Name B',
45
+ email: 'someemailb@example.com',
46
+ password: '123456789b!',
47
+ },
48
+ ]);
49
+ expect(ids).toHaveLength(2);
50
+ for (const id of ids) {
51
+ expect(id).toBeDefined();
52
+ }
53
+ }
54
+ async shouldInsertManyEmpty() {
55
+ const ids = await this.querier.insertMany(User, []);
56
+ expect(ids).toEqual([]);
57
+ }
58
+ async shouldInsertOne() {
59
+ const creatorId = await this.querier.insertOne(User, {
60
+ name: 'Some Name C',
61
+ email: 'someemailc@example.com',
62
+ password: '123456789z!',
63
+ });
64
+ expect(creatorId).toBeDefined();
65
+ const companyId = await this.querier.insertOne(Company, {
66
+ name: 'Some Name C',
67
+ creatorId,
68
+ });
69
+ expect(companyId).toBeDefined();
70
+ const taxCategoryId = await this.querier.insertOne(TaxCategory, {
71
+ name: 'Some Name C',
72
+ description: 'Some Description Z',
73
+ creatorId,
74
+ companyId,
75
+ });
76
+ expect(taxCategoryId).toBeDefined();
77
+ }
78
+ async shouldInsertOneWithOnInsertId() {
79
+ const id1 = await this.querier.insertOne(TaxCategory, {
80
+ name: 'Some Name',
81
+ });
82
+ const id2 = await this.querier.insertOne(TaxCategory, {
83
+ pk: '123',
84
+ name: 'Some Name',
85
+ });
86
+ expect(id1).toBeDefined();
87
+ expect(id2).toBeDefined();
88
+ }
89
+ async shouldInsertManyWithSpecifiedIdsAndOnInsertIdAsDefault() {
90
+ const ids = await this.querier.insertMany(TaxCategory, [
91
+ {
92
+ name: 'Some Name A',
93
+ },
94
+ {
95
+ pk: '50',
96
+ name: 'Some Name B',
97
+ },
98
+ {
99
+ name: 'Some Name C',
100
+ },
101
+ {
102
+ pk: '70',
103
+ name: 'Some Name D',
104
+ },
105
+ ]);
106
+ expect(ids).toHaveLength(4);
107
+ for (const id of ids) {
108
+ expect(id).toBeDefined();
109
+ }
110
+ }
111
+ async shouldInsertManyWithAutoIncrementIdAsDefault() {
112
+ const ids = await this.querier.insertMany(LedgerAccount, [
113
+ {
114
+ name: 'Some Name A',
115
+ },
116
+ {
117
+ name: 'Some Name B',
118
+ },
119
+ {
120
+ name: 'Some Name C',
121
+ },
122
+ ]);
123
+ expect(ids).toHaveLength(3);
124
+ for (const id of ids) {
125
+ expect(id).toBeDefined();
126
+ }
127
+ const founds = await this.querier.findMany(LedgerAccount, {});
128
+ expect(founds.map(({ id }) => id)).toEqual(ids);
129
+ }
130
+ async shouldInsertOneAndCascadeOneToOne() {
131
+ const payload = {
132
+ name: 'Some Name D',
133
+ createdAt: 123,
134
+ profile: { picture: 'abc', createdAt: 123 },
135
+ };
136
+ const id = await this.querier.insertOne(User, payload);
137
+ expect(id).toBeDefined();
138
+ const found = await this.querier.findOneById(User, id, { $select: { profile: true } });
139
+ expect(found).toMatchObject({ id, profile: payload.profile });
140
+ }
141
+ async shouldInsertOneAndCascadeManyToOne() {
142
+ const payload = {
143
+ name: 'Centimeter',
144
+ createdAt: 123,
145
+ category: { name: 'Metric', createdAt: 123 },
146
+ };
147
+ const id = await this.querier.insertOne(MeasureUnit, payload);
148
+ expect(id).toBeDefined();
149
+ const found = await this.querier.findOneById(MeasureUnit, id, { $select: { category: true } });
150
+ expect(found).toMatchObject({ id, category: payload.category });
151
+ }
152
+ async shouldInsertSpecialChars() {
153
+ const payload = {
154
+ name: `I'm Cielo! How are you doing today? It's been a while since we last talked`,
155
+ createdAt: 123,
156
+ };
157
+ const id = await this.querier.insertOne(MeasureUnit, payload);
158
+ expect(id).toBeDefined();
159
+ const found = await this.querier.findOneById(MeasureUnit, id);
160
+ expect(found).toMatchObject(payload);
161
+ }
162
+ async shouldInsertOneAndCascadeOneToMany() {
163
+ const itemAdjustments = [{ buyPrice: 50 }, { buyPrice: 300 }];
164
+ const date = new Date();
165
+ const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
166
+ description: 'some description',
167
+ date,
168
+ itemAdjustments,
169
+ });
170
+ expect(inventoryAdjustmentId).toBeDefined();
171
+ const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
172
+ $select: { itemAdjustments: true },
173
+ });
174
+ expect(inventoryAdjustmentFound).toMatchObject({
175
+ id: inventoryAdjustmentId,
176
+ itemAdjustments,
177
+ });
178
+ const itemAdjustmentsFound = await this.querier.findMany(ItemAdjustment, { $where: { inventoryAdjustmentId } });
179
+ expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
180
+ }
181
+ async shouldInsertOneAndCascadeOneToManyWithSpecificFields() {
182
+ const itemAdjustments = [{ buyPrice: 50 }, { buyPrice: 300 }];
183
+ const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
184
+ description: 'some description',
185
+ itemAdjustments: itemAdjustments.slice(),
186
+ });
187
+ expect(inventoryAdjustmentId).toBeDefined();
188
+ const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
189
+ $select: { itemAdjustments: ['buyPrice'] },
190
+ });
191
+ expect(inventoryAdjustmentFound).toMatchObject({
192
+ id: inventoryAdjustmentId,
193
+ itemAdjustments,
194
+ });
195
+ const itemAdjustmentsFound = await this.querier.findMany(ItemAdjustment, { $where: { inventoryAdjustmentId } });
196
+ expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
197
+ }
198
+ async shouldUpdateOneAndCascadeOneToMany() {
199
+ const itemAdjustments = [{ buyPrice: 50 }, { buyPrice: 300 }];
200
+ const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
201
+ description: 'some description',
202
+ });
203
+ expect(inventoryAdjustmentId).toBeDefined();
204
+ const changes = await this.querier.updateOneById(InventoryAdjustment, inventoryAdjustmentId, {
205
+ itemAdjustments,
206
+ });
207
+ expect(changes).toBe(1);
208
+ const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
209
+ $select: { itemAdjustments: ['buyPrice'] },
210
+ });
211
+ expect(inventoryAdjustmentFound).toMatchObject({
212
+ id: inventoryAdjustmentId,
213
+ itemAdjustments,
214
+ });
215
+ const itemAdjustmentsFound = await this.querier.findMany(ItemAdjustment, { $where: { inventoryAdjustmentId } });
216
+ expect(itemAdjustmentsFound).toMatchObject(itemAdjustments);
217
+ }
218
+ async shouldUpdateOneByIdAndCascadeOneToManyNull() {
219
+ const id = await this.querier.insertOne(InventoryAdjustment, { itemAdjustments: [{}, {}] });
220
+ await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(2);
221
+ await this.querier.updateOneById(InventoryAdjustment, id, {
222
+ itemAdjustments: null,
223
+ });
224
+ await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(0);
225
+ }
226
+ async shouldUpdateManyAndCascadeOneToManyNull() {
227
+ await this.querier.insertOne(InventoryAdjustment, { itemAdjustments: [{}, {}] });
228
+ await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(2);
229
+ await this.querier.updateMany(InventoryAdjustment, { $where: {} }, {
230
+ itemAdjustments: null,
231
+ });
232
+ await expect(this.querier.count(ItemAdjustment, {})).resolves.toBe(0);
233
+ }
234
+ async shouldInsertOneAndCascadeManyToMany() {
235
+ const payload = {
236
+ name: 'item one',
237
+ createdAt: 1,
238
+ tags: [
239
+ {
240
+ name: 'tag one',
241
+ createdAt: 1,
242
+ },
243
+ {
244
+ name: 'tag two',
245
+ createdAt: 1,
246
+ },
247
+ ],
248
+ };
249
+ const id = await this.querier.insertOne(Item, payload);
250
+ expect(id).toBeDefined();
251
+ const foundItem = await this.querier.findOneById(Item, id, {
252
+ $select: { name: true, createdAt: true, tags: ['name', 'createdAt'] },
253
+ });
254
+ expect(foundItem).toMatchObject({
255
+ id,
256
+ ...payload,
257
+ });
258
+ const foundTags = await this.querier.findMany(Tag, {
259
+ $select: { name: true, createdAt: true, items: ['name', 'createdAt'] },
260
+ });
261
+ delete foundItem.tags;
262
+ expect(foundTags).toMatchObject(payload.tags.map((tag) => ({ ...tag, items: [foundItem] })));
263
+ }
264
+ async shouldUpdateOneAndCascadeManyToMany() {
265
+ const id = await this.querier.insertOne(Item, { createdAt: 1 });
266
+ const payload = {
267
+ name: 'item one',
268
+ updatedAt: 1,
269
+ tags: [
270
+ {
271
+ name: 'tag one',
272
+ createdAt: 1,
273
+ },
274
+ {
275
+ name: 'tag two',
276
+ createdAt: 1,
277
+ },
278
+ ],
279
+ };
280
+ await this.querier.updateOneById(Item, id, payload);
281
+ const found = await this.querier.findOneById(Item, id, {
282
+ $select: { name: true, updatedAt: true, tags: true },
283
+ });
284
+ expect(found).toMatchObject({
285
+ id,
286
+ ...payload,
287
+ });
288
+ }
289
+ async shouldUpsertOne() {
290
+ const pk = '507f1f77bcf86cd799439011';
291
+ const record1 = await this.querier.findOne(TaxCategory, {
292
+ $select: ['name'],
293
+ $where: { pk },
294
+ });
295
+ expect(record1).toBeUndefined();
296
+ await this.querier.upsertOne(TaxCategory, { pk: true }, {
297
+ pk,
298
+ name: 'Some Name C',
299
+ });
300
+ const record2 = await this.querier.findOne(TaxCategory, {
301
+ $select: ['name'],
302
+ $where: { pk },
303
+ });
304
+ expect(record2).toMatchObject({
305
+ name: 'Some Name C',
306
+ });
307
+ await this.querier.upsertOne(TaxCategory, { pk: true }, {
308
+ pk,
309
+ name: 'Some Name D',
310
+ });
311
+ const record3 = await this.querier.findOne(TaxCategory, {
312
+ $select: ['name'],
313
+ $where: { pk },
314
+ });
315
+ expect(record3).toMatchObject({
316
+ name: 'Some Name D',
317
+ });
318
+ }
319
+ async shouldFindOne() {
320
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
321
+ const found = await this.querier.findOne(User, {
322
+ $select: ['id', 'name', 'email', 'password'],
323
+ $where: {
324
+ email: 'someemaila@example.com',
325
+ },
326
+ });
327
+ expect(found).toMatchObject({
328
+ name: 'Some Name A',
329
+ email: 'someemaila@example.com',
330
+ password: '123456789a!',
331
+ });
332
+ const notFound = await this.querier.findOne(User, {
333
+ $where: {
334
+ name: 'some name',
335
+ },
336
+ });
337
+ expect(notFound).toBeUndefined();
338
+ }
339
+ async shouldCount() {
340
+ await expect(this.querier.count(User, {})).resolves.toBe(0);
341
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
342
+ await expect(this.querier.count(User, {})).resolves.toBe(3);
343
+ await expect(this.querier.count(User, { $where: { companyId: null } })).resolves.toBe(3);
344
+ await expect(this.querier.count(User, { $where: { companyId: 1 } })).resolves.toBe(0);
345
+ }
346
+ async shouldUpdateMany() {
347
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
348
+ await expect(this.querier.updateMany(User, { $where: { companyId: 1 } }, { companyId: null })).resolves.toBe(0);
349
+ await expect(this.querier.updateMany(User, { $where: { companyId: null } }, { companyId: 1 })).resolves.toBe(3);
350
+ await expect(this.querier.updateMany(User, { $where: { companyId: 1 } }, { companyId: null })).resolves.toBe(3);
351
+ }
352
+ async shouldThrowIfUnknownComparisonOperator() {
353
+ await expect(this.querier.findMany(User, {
354
+ $where: { name: { $someInvalidOperator: 'some' } },
355
+ })).rejects.toThrow('unknown operator: $someInvalidOperator');
356
+ }
357
+ async shouldThrowWhenRollbackTransactionWithoutBeginTransaction() {
358
+ await expect(this.querier.rollbackTransaction()).rejects.toThrow('not a pending transaction');
359
+ }
360
+ async shouldCommit() {
361
+ await expect(this.querier.count(User, {})).resolves.toBe(0);
362
+ await this.querier.beginTransaction();
363
+ await this.querier.insertOne(User, {});
364
+ await expect(this.querier.count(User, {})).resolves.toBe(1);
365
+ await this.querier.commitTransaction();
366
+ await expect(this.querier.count(User, {})).resolves.toBe(1);
367
+ await this.querier.release();
368
+ }
369
+ async shouldRollback() {
370
+ await expect(this.querier.count(User, {})).resolves.toBe(0);
371
+ await this.querier.beginTransaction();
372
+ await this.querier.insertOne(User, {});
373
+ await expect(this.querier.count(User, {})).resolves.toBe(1);
374
+ await this.querier.rollbackTransaction();
375
+ await expect(this.querier.count(User, {})).resolves.toBe(0);
376
+ await this.querier.release();
377
+ }
378
+ async shouldThrowWhenBeginTransactionAfterBeginTransaction() {
379
+ expect(this.querier.hasOpenTransaction).toBeFalsy();
380
+ await this.querier.beginTransaction();
381
+ expect(this.querier.hasOpenTransaction).toBe(true);
382
+ await expect(this.querier.beginTransaction()).rejects.toThrow('pending transaction');
383
+ await expect(this.querier.release()).rejects.toThrow('pending transaction');
384
+ await this.querier.rollbackTransaction();
385
+ await this.querier.release();
386
+ }
387
+ async shouldReturnTransactionValue() {
388
+ const affectedRows = await this.querier.transaction(async () => {
389
+ await this.shouldInsertMany();
390
+ const count = await this.querier.count(User, {});
391
+ await this.querier.deleteMany(User, {});
392
+ return count;
393
+ });
394
+ expect(affectedRows).toBe(2);
395
+ }
396
+ async shouldThrowWhenCommitTransactionWithoutBeginTransaction() {
397
+ await expect(this.querier.commitTransaction()).rejects.toThrow('not a pending transaction');
398
+ }
399
+ async shouldSelectOneToManyEmpty() {
400
+ const inventoryAdjustment = await this.querier.findOneById(InventoryAdjustment, -1, {
401
+ $select: { itemAdjustments: true, creator: true },
402
+ });
403
+ expect(inventoryAdjustment).toBeUndefined();
404
+ const inventoryAdjustments = await this.querier.findMany(InventoryAdjustment, {
405
+ $select: { itemAdjustments: true },
406
+ });
407
+ expect(inventoryAdjustments).toHaveLength(0);
408
+ }
409
+ async shouldSelectOneToMany() {
410
+ await this.shouldInsertOne();
411
+ const [user, company] = await Promise.all([
412
+ this.querier.findOne(User, { $select: ['id'] }),
413
+ this.querier.findOne(Company, { $select: ['id'] }),
414
+ ]);
415
+ const [firstItemId, secondItemId] = await this.querier.insertMany(Item, [
416
+ {
417
+ name: 'some item name a',
418
+ creatorId: user.id,
419
+ companyId: company.id,
420
+ },
421
+ {
422
+ name: 'some item name b',
423
+ creatorId: user.id,
424
+ companyId: company.id,
425
+ },
426
+ ]);
427
+ const inventoryAdjustmentId = await this.querier.insertOne(InventoryAdjustment, {
428
+ description: 'some inventory adjustment',
429
+ creatorId: user.id,
430
+ companyId: company.id,
431
+ itemAdjustments: [
432
+ { buyPrice: 1000, itemId: firstItemId },
433
+ { buyPrice: 2000, itemId: secondItemId },
434
+ ],
435
+ });
436
+ const inventoryAdjustmentFound = await this.querier.findOneById(InventoryAdjustment, inventoryAdjustmentId, {
437
+ $select: { itemAdjustments: true, creator: true },
438
+ });
439
+ expect(inventoryAdjustmentFound).toMatchObject({
440
+ id: inventoryAdjustmentId,
441
+ itemAdjustments: [
442
+ { buyPrice: 1000, itemId: firstItemId },
443
+ { buyPrice: 2000, itemId: secondItemId },
444
+ ],
445
+ creator: {
446
+ email: 'someemailc@example.com',
447
+ name: 'Some Name C',
448
+ },
449
+ });
450
+ }
451
+ async shouldDeleteMany() {
452
+ await Promise.all([this.shouldInsertMany(), this.shouldInsertOne()]);
453
+ await expect(this.querier.deleteMany(User, { $where: { companyId: 1 } })).resolves.toBe(0);
454
+ await expect(this.querier.deleteMany(User, { $where: { companyId: null } })).resolves.toBe(3);
455
+ }
456
+ async clearTables() {
457
+ const entities = getEntities();
458
+ await Promise.all(entities.map((entity) => this.querier.deleteMany(entity, {})));
459
+ }
460
+ }
461
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWJzdHJhY3RRdWVyaWVyLXRlc3QuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvcXVlcmllci9hYnN0cmFjdFF1ZXJpZXItdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNqRCxPQUFPLEVBQ0wsT0FBTyxFQUNQLG1CQUFtQixFQUNuQixJQUFJLEVBQ0osY0FBYyxFQUNkLGFBQWEsRUFDYixXQUFXLEVBRVgsR0FBRyxFQUNILFdBQVcsRUFDWCxJQUFJLEdBQ0wsTUFBTSxrQkFBa0IsQ0FBQztBQUcxQixNQUFNLE9BQWdCLGlCQUFpQjtJQUdmO0lBRnRCLE9BQU8sQ0FBSTtJQUVYLFlBQXNCLElBQW9CO1FBQXBCLFNBQUksR0FBSixJQUFJLENBQWdCO0lBQUcsQ0FBQztJQUU5QyxLQUFLLENBQUMsU0FBUztRQUNiLE1BQU0sT0FBTyxHQUFHLE1BQU0sSUFBSSxDQUFDLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUM3QyxJQUFJLENBQUM7WUFDSCxJQUFJLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztZQUN2QixNQUFNLElBQUksQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUN4QixNQUFNLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUM1QixDQUFDO2dCQUFTLENBQUM7WUFDVCxNQUFNLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxHQUFHLFNBQVMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxVQUFVO1FBQ2QsSUFBSSxDQUFDLE9BQU8sR0FBRyxNQUFNLElBQUksQ0FBQyxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDNUMsTUFBTSxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJ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ZXNDb250ZW50IjpbImltcG9ydCB7IGV4cGVjdCB9IGZyb20gJ2J1bjp0ZXN0JztcbmltcG9ydCB7IGdldEVudGl0aWVzIH0gZnJvbSAnLi4vZW50aXR5L2luZGV4LmpzJztcbmltcG9ydCB7XG4gIENvbXBhbnksXG4gIEludmVudG9yeUFkanVzdG1lbnQsXG4gIEl0ZW0sXG4gIEl0ZW1BZGp1c3RtZW50LFxuICBMZWRnZXJBY2NvdW50LFxuICBNZWFzdXJlVW5pdCxcbiAgdHlwZSBTcGVjLFxuICBUYWcsXG4gIFRheENhdGVnb3J5LFxuICBVc2VyLFxufSBmcm9tICcuLi90ZXN0L2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHsgUXVlcmllciwgUXVlcmllclBvb2wgfSBmcm9tICcuLi90eXBlL2luZGV4LmpzJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0UXVlcmllckl0PFEgZXh0ZW5kcyBRdWVyaWVyPiBpbXBsZW1lbnRzIFNwZWMge1xuICBxdWVyaWVyOiBRO1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBwb29sOiBRdWVyaWVyUG9vbDxRPikge31cblxuICBhc3luYyBiZWZvcmVBbGwoKSB7XG4gICAgY29uc3QgcXVlcmllciA9IGF3YWl0IHRoaXMucG9vbC5nZXRRdWVyaWVyKCk7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMucXVlcmllciA9IHF1ZXJpZXI7XG4gICAgICBhd2FpdCB0aGlzLmRyb3BUYWJsZXMoKTtcbiAgICAgIGF3YWl0IHRoaXMuY3JlYXRlVGFibGVzKCk7XG4gICAgfSBmaW5hbGx5IHtcbiAgICAgIGF3YWl0IHF1ZXJpZXIucmVsZWFzZSgpO1xuICAgICAgdGhpcy5xdWVyaWVyID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIGJlZm9yZUVhY2goKSB7XG4gICAgdGhpcy5xdWVyaWVyID0gYXdhaXQgdGhpcy5wb29sLmdldFF1ZXJpZXIoKTtcbiAgICBhd2FpdCB0aGlzLmNsZWFyVGFibGVzKCk7XG4gIH1cblxuICBhc3luYyBhZnRlckVhY2goKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLnJlbGVhc2UoKTtcbiAgfVxuXG4gIGFzeW5jIGFmdGVyQWxsKCkge1xuICAgIGF3YWl0IHRoaXMucG9vbC5lbmQoKTtcbiAgfVxuXG4gIHNob3VsZEdldFJlcG9zaXRvcnkoKSB7XG4gICAgY29uc3QgcmVwb3NpdG9yeSA9IHRoaXMucXVlcmllci5nZXRSZXBvc2l0b3J5KFVzZXIpO1xuICAgIGV4cGVjdChyZXBvc2l0b3J5KS50b0JlRGVmaW5lZCgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0TWFueSgpIHtcbiAgICBjb25zdCBpZHMgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0TWFueShVc2VyLCBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICAgIGVtYWlsOiAnc29tZWVtYWlsYUBleGFtcGxlLmNvbScsXG4gICAgICAgIHBhc3N3b3JkOiAnMTIzNDU2Nzg5YSEnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBCJyxcbiAgICAgICAgZW1haWw6ICdzb21lZW1haWxiQGV4YW1wbGUuY29tJyxcbiAgICAgICAgcGFzc3dvcmQ6ICcxMjM0NTY3ODliIScsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGV4cGVjdChpZHMpLnRvSGF2ZUxlbmd0aCgyKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgZXhwZWN0KGlkKS50b0JlRGVmaW5lZCgpO1xuICAgIH1cbiAgfVxuXG4gIGFzeW5jIHNob3VsZEluc2VydE1hbnlFbXB0eSgpIHtcbiAgICBjb25zdCBpZHMgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0TWFueShVc2VyLCBbXSk7XG4gICAgZXhwZWN0KGlkcykudG9FcXVhbChbXSk7XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRPbmUoKSB7XG4gICAgY29uc3QgY3JlYXRvcklkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShVc2VyLCB7XG4gICAgICBuYW1lOiAnU29tZSBOYW1lIEMnLFxuICAgICAgZW1haWw6ICdzb21lZW1haWxjQGV4YW1wbGUuY29tJyxcbiAgICAgIHBhc3N3b3JkOiAnMTIzNDU2Nzg5eiEnLFxuICAgIH0pO1xuICAgIGV4cGVjdChjcmVhdG9ySWQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCBjb21wYW55SWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKENvbXBhbnksIHtcbiAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICBjcmVhdG9ySWQsXG4gICAgfSk7XG4gICAgZXhwZWN0KGNvbXBhbnlJZCkudG9CZURlZmluZWQoKTtcblxuICAgIGNvbnN0IHRheENhdGVnb3J5SWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFRheENhdGVnb3J5LCB7XG4gICAgICBuYW1lOiAnU29tZSBOYW1lIEMnLFxuICAgICAgZGVzY3JpcHRpb246ICdTb21lIERlc2NyaXB0aW9uIFonLFxuICAgICAgY3JlYXRvcklkLFxuICAgICAgY29tcGFueUlkLFxuICAgIH0pO1xuICAgIGV4cGVjdCh0YXhDYXRlZ29yeUlkKS50b0JlRGVmaW5lZCgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0T25lV2l0aE9uSW5zZXJ0SWQoKSB7XG4gICAgY29uc3QgaWQxID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShUYXhDYXRlZ29yeSwge1xuICAgICAgbmFtZTogJ1NvbWUgTmFtZScsXG4gICAgfSk7XG4gICAgY29uc3QgaWQyID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShUYXhDYXRlZ29yeSwge1xuICAgICAgcGs6ICcxMjMnLFxuICAgICAgbmFtZTogJ1NvbWUgTmFtZScsXG4gICAgfSk7XG4gICAgZXhwZWN0KGlkMSkudG9CZURlZmluZWQoKTtcbiAgICBleHBlY3QoaWQyKS50b0JlRGVmaW5lZCgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0TWFueVdpdGhTcGVjaWZpZWRJZHNBbmRPbkluc2VydElkQXNEZWZhdWx0KCkge1xuICAgIGNvbnN0IGlkcyA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRNYW55KFRheENhdGVnb3J5LCBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwazogJzUwJyxcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBCJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBwazogJzcwJyxcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBEJyxcbiAgICAgIH0sXG4gICAgXSk7XG4gICAgZXhwZWN0KGlkcykudG9IYXZlTGVuZ3RoKDQpO1xuICAgIGZvciAoY29uc3QgaWQgb2YgaWRzKSB7XG4gICAgICBleHBlY3QoaWQpLnRvQmVEZWZpbmVkKCk7XG4gICAgfVxuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0TWFueVdpdGhBdXRvSW5jcmVtZW50SWRBc0RlZmF1bHQoKSB7XG4gICAgY29uc3QgaWRzID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE1hbnkoTGVkZ2VyQWNjb3VudCwgW1xuICAgICAge1xuICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEEnLFxuICAgICAgfSxcbiAgICAgIHtcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBCJyxcbiAgICAgIH0sXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICB9LFxuICAgIF0pO1xuICAgIGV4cGVjdChpZHMpLnRvSGF2ZUxlbmd0aCgzKTtcbiAgICBmb3IgKGNvbnN0IGlkIG9mIGlkcykge1xuICAgICAgZXhwZWN0KGlkKS50b0JlRGVmaW5lZCgpO1xuICAgIH1cbiAgICBjb25zdCBmb3VuZHMgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE1hbnkoTGVkZ2VyQWNjb3VudCwge30pO1xuICAgIGV4cGVjdChmb3VuZHMubWFwKCh7IGlkIH0pID0+IGlkKSkudG9FcXVhbChpZHMpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0T25lQW5kQ2FzY2FkZU9uZVRvT25lKCkge1xuICAgIGNvbnN0IHBheWxvYWQgPSB7XG4gICAgICBuYW1lOiAnU29tZSBOYW1lIEQnLFxuICAgICAgY3JlYXRlZEF0OiAxMjMsXG4gICAgICBwcm9maWxlOiB7IHBpY3R1cmU6ICdhYmMnLCBjcmVhdGVkQXQ6IDEyMyB9LFxuICAgIH0gc2F0aXNmaWVzIFVzZXI7XG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFVzZXIsIHBheWxvYWQpO1xuICAgIGV4cGVjdChpZCkudG9CZURlZmluZWQoKTtcbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChVc2VyLCBpZCwgeyAkc2VsZWN0OiB7IHByb2ZpbGU6IHRydWUgfSB9KTtcbiAgICBleHBlY3QoZm91bmQpLnRvTWF0Y2hPYmplY3QoeyBpZCwgcHJvZmlsZTogcGF5bG9hZC5wcm9maWxlIH0pO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0T25lQW5kQ2FzY2FkZU1hbnlUb09uZSgpIHtcbiAgICBjb25zdCBwYXlsb2FkID0ge1xuICAgICAgbmFtZTogJ0NlbnRpbWV0ZXInLFxuICAgICAgY3JlYXRlZEF0OiAxMjMsXG4gICAgICBjYXRlZ29yeTogeyBuYW1lOiAnTWV0cmljJywgY3JlYXRlZEF0OiAxMjMgfSxcbiAgICB9IHNhdGlzZmllcyBNZWFzdXJlVW5pdDtcblxuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShNZWFzdXJlVW5pdCwgcGF5bG9hZCk7XG5cbiAgICBleHBlY3QoaWQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChNZWFzdXJlVW5pdCwgaWQsIHsgJHNlbGVjdDogeyBjYXRlZ29yeTogdHJ1ZSB9IH0pO1xuXG4gICAgZXhwZWN0KGZvdW5kKS50b01hdGNoT2JqZWN0KHsgaWQsIGNhdGVnb3J5OiBwYXlsb2FkLmNhdGVnb3J5IH0pO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0U3BlY2lhbENoYXJzKCkge1xuICAgIGNvbnN0IHBheWxvYWQ6IE1lYXN1cmVVbml0ID0ge1xuICAgICAgbmFtZTogYEknbSBDaWVsbyEgSG93IGFyZSB5b3UgZG9pbmcgdG9kYXk/IEl0J3MgYmVlbiBhIHdoaWxlIHNpbmNlIHdlIGxhc3QgdGFsa2VkYCxcbiAgICAgIGNyZWF0ZWRBdDogMTIzLFxuICAgIH07XG5cbiAgICBjb25zdCBpZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoTWVhc3VyZVVuaXQsIHBheWxvYWQpO1xuXG4gICAgZXhwZWN0KGlkKS50b0JlRGVmaW5lZCgpO1xuXG4gICAgY29uc3QgZm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZUJ5SWQoTWVhc3VyZVVuaXQsIGlkKTtcblxuICAgIGV4cGVjdChmb3VuZCkudG9NYXRjaE9iamVjdChwYXlsb2FkKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZEluc2VydE9uZUFuZENhc2NhZGVPbmVUb01hbnkoKSB7XG4gICAgY29uc3QgaXRlbUFkanVzdG1lbnRzOiBJdGVtQWRqdXN0bWVudFtdID0gW3sgYnV5UHJpY2U6IDUwIH0sIHsgYnV5UHJpY2U6IDMwMCB9XTtcblxuICAgIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudElkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShJbnZlbnRvcnlBZGp1c3RtZW50LCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NvbWUgZGVzY3JpcHRpb24nLFxuICAgICAgZGF0ZSxcbiAgICAgIGl0ZW1BZGp1c3RtZW50cyxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50SWQpLnRvQmVEZWZpbmVkKCk7XG5cbiAgICBjb25zdCBpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZUJ5SWQoSW52ZW50b3J5QWRqdXN0bWVudCwgaW52ZW50b3J5QWRqdXN0bWVudElkLCB7XG4gICAgICAkc2VsZWN0OiB7IGl0ZW1BZGp1c3RtZW50czogdHJ1ZSB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGludmVudG9yeUFkanVzdG1lbnRGb3VuZCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBpZDogaW52ZW50b3J5QWRqdXN0bWVudElkLFxuICAgICAgaXRlbUFkanVzdG1lbnRzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaXRlbUFkanVzdG1lbnRzRm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE1hbnkoSXRlbUFkanVzdG1lbnQsIHsgJHdoZXJlOiB7IGludmVudG9yeUFkanVzdG1lbnRJZCB9IH0pO1xuXG4gICAgZXhwZWN0KGl0ZW1BZGp1c3RtZW50c0ZvdW5kKS50b01hdGNoT2JqZWN0KGl0ZW1BZGp1c3RtZW50cyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRJbnNlcnRPbmVBbmRDYXNjYWRlT25lVG9NYW55V2l0aFNwZWNpZmljRmllbGRzKCkge1xuICAgIGNvbnN0IGl0ZW1BZGp1c3RtZW50czogSXRlbUFkanVzdG1lbnRbXSA9IFt7IGJ1eVByaWNlOiA1MCB9LCB7IGJ1eVByaWNlOiAzMDAgfV07XG5cbiAgICBjb25zdCBpbnZlbnRvcnlBZGp1c3RtZW50SWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKEludmVudG9yeUFkanVzdG1lbnQsIHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnc29tZSBkZXNjcmlwdGlvbicsXG4gICAgICBpdGVtQWRqdXN0bWVudHM6IGl0ZW1BZGp1c3RtZW50cy5zbGljZSgpLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGludmVudG9yeUFkanVzdG1lbnRJZCkudG9CZURlZmluZWQoKTtcblxuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnRGb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChJbnZlbnRvcnlBZGp1c3RtZW50LCBpbnZlbnRvcnlBZGp1c3RtZW50SWQsIHtcbiAgICAgICRzZWxlY3Q6IHsgaXRlbUFkanVzdG1lbnRzOiBbJ2J1eVByaWNlJ10gfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaWQ6IGludmVudG9yeUFkanVzdG1lbnRJZCxcbiAgICAgIGl0ZW1BZGp1c3RtZW50cyxcbiAgICB9KTtcblxuICAgIGNvbnN0IGl0ZW1BZGp1c3RtZW50c0ZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRNYW55KEl0ZW1BZGp1c3RtZW50LCB7ICR3aGVyZTogeyBpbnZlbnRvcnlBZGp1c3RtZW50SWQgfSB9KTtcblxuICAgIGV4cGVjdChpdGVtQWRqdXN0bWVudHNGb3VuZCkudG9NYXRjaE9iamVjdChpdGVtQWRqdXN0bWVudHMpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkVXBkYXRlT25lQW5kQ2FzY2FkZU9uZVRvTWFueSgpIHtcbiAgICBjb25zdCBpdGVtQWRqdXN0bWVudHM6IEl0ZW1BZGp1c3RtZW50W10gPSBbeyBidXlQcmljZTogNTAgfSwgeyBidXlQcmljZTogMzAwIH1dO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudElkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShJbnZlbnRvcnlBZGp1c3RtZW50LCB7XG4gICAgICBkZXNjcmlwdGlvbjogJ3NvbWUgZGVzY3JpcHRpb24nLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGludmVudG9yeUFkanVzdG1lbnRJZCkudG9CZURlZmluZWQoKTtcblxuICAgIGNvbnN0IGNoYW5nZXMgPSBhd2FpdCB0aGlzLnF1ZXJpZXIudXBkYXRlT25lQnlJZChJbnZlbnRvcnlBZGp1c3RtZW50LCBpbnZlbnRvcnlBZGp1c3RtZW50SWQsIHtcbiAgICAgIGl0ZW1BZGp1c3RtZW50cyxcbiAgICB9KTtcblxuICAgIGV4cGVjdChjaGFuZ2VzKS50b0JlKDEpO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudEZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmVCeUlkKEludmVudG9yeUFkanVzdG1lbnQsIGludmVudG9yeUFkanVzdG1lbnRJZCwge1xuICAgICAgJHNlbGVjdDogeyBpdGVtQWRqdXN0bWVudHM6IFsnYnV5UHJpY2UnXSB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGludmVudG9yeUFkanVzdG1lbnRGb3VuZCkudG9NYXRjaE9iamVjdCh7XG4gICAgICBpZDogaW52ZW50b3J5QWRqdXN0bWVudElkLFxuICAgICAgaXRlbUFkanVzdG1lbnRzLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaXRlbUFkanVzdG1lbnRzRm91bmQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE1hbnkoSXRlbUFkanVzdG1lbnQsIHsgJHdoZXJlOiB7IGludmVudG9yeUFkanVzdG1lbnRJZCB9IH0pO1xuXG4gICAgZXhwZWN0KGl0ZW1BZGp1c3RtZW50c0ZvdW5kKS50b01hdGNoT2JqZWN0KGl0ZW1BZGp1c3RtZW50cyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRVcGRhdGVPbmVCeUlkQW5kQ2FzY2FkZU9uZVRvTWFueU51bGwoKSB7XG4gICAgY29uc3QgaWQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKEludmVudG9yeUFkanVzdG1lbnQsIHsgaXRlbUFkanVzdG1lbnRzOiBbe30sIHt9XSB9KTtcblxuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoSXRlbUFkanVzdG1lbnQsIHt9KSkucmVzb2x2ZXMudG9CZSgyKTtcblxuICAgIGF3YWl0IHRoaXMucXVlcmllci51cGRhdGVPbmVCeUlkKEludmVudG9yeUFkanVzdG1lbnQsIGlkLCB7XG4gICAgICBpdGVtQWRqdXN0bWVudHM6IG51bGwsXG4gICAgfSk7XG5cbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KEl0ZW1BZGp1c3RtZW50LCB7fSkpLnJlc29sdmVzLnRvQmUoMCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRVcGRhdGVNYW55QW5kQ2FzY2FkZU9uZVRvTWFueU51bGwoKSB7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShJbnZlbnRvcnlBZGp1c3RtZW50LCB7IGl0ZW1BZGp1c3RtZW50czogW3t9LCB7fV0gfSk7XG5cbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KEl0ZW1BZGp1c3RtZW50LCB7fSkpLnJlc29sdmVzLnRvQmUoMik7XG5cbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIudXBkYXRlTWFueShcbiAgICAgIEludmVudG9yeUFkanVzdG1lbnQsXG4gICAgICB7ICR3aGVyZToge30gfSxcbiAgICAgIHtcbiAgICAgICAgaXRlbUFkanVzdG1lbnRzOiBudWxsLFxuICAgICAgfSxcbiAgICApO1xuXG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChJdGVtQWRqdXN0bWVudCwge30pKS5yZXNvbHZlcy50b0JlKDApO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkSW5zZXJ0T25lQW5kQ2FzY2FkZU1hbnlUb01hbnkoKSB7XG4gICAgY29uc3QgcGF5bG9hZDogSXRlbSA9IHtcbiAgICAgIG5hbWU6ICdpdGVtIG9uZScsXG4gICAgICBjcmVhdGVkQXQ6IDEsXG4gICAgICB0YWdzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAndGFnIG9uZScsXG4gICAgICAgICAgY3JlYXRlZEF0OiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3RhZyB0d28nLFxuICAgICAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGNvbnN0IGlkID0gYXdhaXQgdGhpcy5xdWVyaWVyLmluc2VydE9uZShJdGVtLCBwYXlsb2FkKTtcblxuICAgIGV4cGVjdChpZCkudG9CZURlZmluZWQoKTtcblxuICAgIGNvbnN0IGZvdW5kSXRlbSA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lQnlJZChJdGVtLCBpZCwge1xuICAgICAgJHNlbGVjdDogeyBuYW1lOiB0cnVlLCBjcmVhdGVkQXQ6IHRydWUsIHRhZ3M6IFsnbmFtZScsICdjcmVhdGVkQXQnXSB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGZvdW5kSXRlbSkudG9NYXRjaE9iamVjdCh7XG4gICAgICBpZCxcbiAgICAgIC4uLnBheWxvYWQsXG4gICAgfSk7XG5cbiAgICBjb25zdCBmb3VuZFRhZ3MgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE1hbnkoVGFnLCB7XG4gICAgICAkc2VsZWN0OiB7IG5hbWU6IHRydWUsIGNyZWF0ZWRBdDogdHJ1ZSwgaXRlbXM6IFsnbmFtZScsICdjcmVhdGVkQXQnXSB9LFxuICAgIH0pO1xuXG4gICAgZGVsZXRlIGZvdW5kSXRlbS50YWdzO1xuXG4gICAgZXhwZWN0KGZvdW5kVGFncykudG9NYXRjaE9iamVjdChwYXlsb2FkLnRhZ3MubWFwKCh0YWcpID0+ICh7IC4uLnRhZywgaXRlbXM6IFtmb3VuZEl0ZW1dIH0pKSk7XG4gIH1cblxuICBhc3luYyBzaG91bGRVcGRhdGVPbmVBbmRDYXNjYWRlTWFueVRvTWFueSgpIHtcbiAgICBjb25zdCBpZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoSXRlbSwgeyBjcmVhdGVkQXQ6IDEgfSk7XG4gICAgY29uc3QgcGF5bG9hZDogSXRlbSA9IHtcbiAgICAgIG5hbWU6ICdpdGVtIG9uZScsXG4gICAgICB1cGRhdGVkQXQ6IDEsXG4gICAgICB0YWdzOiBbXG4gICAgICAgIHtcbiAgICAgICAgICBuYW1lOiAndGFnIG9uZScsXG4gICAgICAgICAgY3JlYXRlZEF0OiAxLFxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgbmFtZTogJ3RhZyB0d28nLFxuICAgICAgICAgIGNyZWF0ZWRBdDogMSxcbiAgICAgICAgfSxcbiAgICAgIF0sXG4gICAgfTtcblxuICAgIGF3YWl0IHRoaXMucXVlcmllci51cGRhdGVPbmVCeUlkKEl0ZW0sIGlkLCBwYXlsb2FkKTtcblxuICAgIGNvbnN0IGZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmVCeUlkKEl0ZW0sIGlkLCB7XG4gICAgICAkc2VsZWN0OiB7IG5hbWU6IHRydWUsIHVwZGF0ZWRBdDogdHJ1ZSwgdGFnczogdHJ1ZSB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGZvdW5kKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIGlkLFxuICAgICAgLi4ucGF5bG9hZCxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFVwc2VydE9uZSgpIHtcbiAgICBjb25zdCBwayA9ICc1MDdmMWY3N2JjZjg2Y2Q3OTk0MzkwMTEnO1xuICAgIGNvbnN0IHJlY29yZDEgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZShUYXhDYXRlZ29yeSwge1xuICAgICAgJHNlbGVjdDogWyduYW1lJ10sXG4gICAgICAkd2hlcmU6IHsgcGsgfSxcbiAgICB9KTtcbiAgICBleHBlY3QocmVjb3JkMSkudG9CZVVuZGVmaW5lZCgpO1xuICAgIGF3YWl0IHRoaXMucXVlcmllci51cHNlcnRPbmUoXG4gICAgICBUYXhDYXRlZ29yeSxcbiAgICAgIHsgcGs6IHRydWUgfSxcbiAgICAgIHtcbiAgICAgICAgcGssXG4gICAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgICB9LFxuICAgICk7XG4gICAgY29uc3QgcmVjb3JkMiA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lKFRheENhdGVnb3J5LCB7XG4gICAgICAkc2VsZWN0OiBbJ25hbWUnXSxcbiAgICAgICR3aGVyZTogeyBwayB9LFxuICAgIH0pO1xuICAgIGV4cGVjdChyZWNvcmQyKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIG5hbWU6ICdTb21lIE5hbWUgQycsXG4gICAgfSk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLnVwc2VydE9uZShcbiAgICAgIFRheENhdGVnb3J5LFxuICAgICAgeyBwazogdHJ1ZSB9LFxuICAgICAge1xuICAgICAgICBwayxcbiAgICAgICAgbmFtZTogJ1NvbWUgTmFtZSBEJyxcbiAgICAgIH0sXG4gICAgKTtcbiAgICBjb25zdCByZWNvcmQzID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmUoVGF4Q2F0ZWdvcnksIHtcbiAgICAgICRzZWxlY3Q6IFsnbmFtZSddLFxuICAgICAgJHdoZXJlOiB7IHBrIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KHJlY29yZDMpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgbmFtZTogJ1NvbWUgTmFtZSBEJyxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZEZpbmRPbmUoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuc2hvdWxkSW5zZXJ0TWFueSgpLCB0aGlzLnNob3VsZEluc2VydE9uZSgpXSk7XG5cbiAgICBjb25zdCBmb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lKFVzZXIsIHtcbiAgICAgICRzZWxlY3Q6IFsnaWQnLCAnbmFtZScsICdlbWFpbCcsICdwYXNzd29yZCddLFxuICAgICAgJHdoZXJlOiB7XG4gICAgICAgIGVtYWlsOiAnc29tZWVtYWlsYUBleGFtcGxlLmNvbScsXG4gICAgICB9LFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGZvdW5kKS50b01hdGNoT2JqZWN0KHtcbiAgICAgIG5hbWU6ICdTb21lIE5hbWUgQScsXG4gICAgICBlbWFpbDogJ3NvbWVlbWFpbGFAZXhhbXBsZS5jb20nLFxuICAgICAgcGFzc3dvcmQ6ICcxMjM0NTY3ODlhIScsXG4gICAgfSk7XG5cbiAgICBjb25zdCBub3RGb3VuZCA9IGF3YWl0IHRoaXMucXVlcmllci5maW5kT25lKFVzZXIsIHtcbiAgICAgICR3aGVyZToge1xuICAgICAgICBuYW1lOiAnc29tZSBuYW1lJyxcbiAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBleHBlY3Qobm90Rm91bmQpLnRvQmVVbmRlZmluZWQoKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZENvdW50KCkge1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoVXNlciwge30pKS5yZXNvbHZlcy50b0JlKDApO1xuXG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuc2hvdWxkSW5zZXJ0TWFueSgpLCB0aGlzLnNob3VsZEluc2VydE9uZSgpXSk7XG5cbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KFVzZXIsIHt9KSkucmVzb2x2ZXMudG9CZSgzKTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KFVzZXIsIHsgJHdoZXJlOiB7IGNvbXBhbnlJZDogbnVsbCB9IH0pKS5yZXNvbHZlcy50b0JlKDMpO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoVXNlciwgeyAkd2hlcmU6IHsgY29tcGFueUlkOiAxIH0gfSkpLnJlc29sdmVzLnRvQmUoMCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRVcGRhdGVNYW55KCkge1xuICAgIGF3YWl0IFByb21pc2UuYWxsKFt0aGlzLnNob3VsZEluc2VydE1hbnkoKSwgdGhpcy5zaG91bGRJbnNlcnRPbmUoKV0pO1xuXG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci51cGRhdGVNYW55KFVzZXIsIHsgJHdoZXJlOiB7IGNvbXBhbnlJZDogMSB9IH0sIHsgY29tcGFueUlkOiBudWxsIH0pKS5yZXNvbHZlcy50b0JlKDApO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIudXBkYXRlTWFueShVc2VyLCB7ICR3aGVyZTogeyBjb21wYW55SWQ6IG51bGwgfSB9LCB7IGNvbXBhbnlJZDogMSB9KSkucmVzb2x2ZXMudG9CZSgzKTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLnVwZGF0ZU1hbnkoVXNlciwgeyAkd2hlcmU6IHsgY29tcGFueUlkOiAxIH0gfSwgeyBjb21wYW55SWQ6IG51bGwgfSkpLnJlc29sdmVzLnRvQmUoMyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRUaHJvd0lmVW5rbm93bkNvbXBhcmlzb25PcGVyYXRvcigpIHtcbiAgICBhd2FpdCBleHBlY3QoXG4gICAgICB0aGlzLnF1ZXJpZXIuZmluZE1hbnkoVXNlciwge1xuICAgICAgICAkd2hlcmU6IHsgbmFtZTogeyAkc29tZUludmFsaWRPcGVyYXRvcjogJ3NvbWUnIH0gYXMgYW55IH0sXG4gICAgICB9KSxcbiAgICApLnJlamVjdHMudG9UaHJvdygndW5rbm93biBvcGVyYXRvcjogJHNvbWVJbnZhbGlkT3BlcmF0b3InKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFRocm93V2hlblJvbGxiYWNrVHJhbnNhY3Rpb25XaXRob3V0QmVnaW5UcmFuc2FjdGlvbigpIHtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKSkucmVqZWN0cy50b1Rocm93KCdub3QgYSBwZW5kaW5nIHRyYW5zYWN0aW9uJyk7XG4gIH1cblxuICBhc3luYyBzaG91bGRDb21taXQoKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyLCB7fSkpLnJlc29sdmVzLnRvQmUoMCk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFVzZXIsIHt9KTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KFVzZXIsIHt9KSkucmVzb2x2ZXMudG9CZSgxKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuY29tbWl0VHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KFVzZXIsIHt9KSkucmVzb2x2ZXMudG9CZSgxKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIucmVsZWFzZSgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkUm9sbGJhY2soKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb3VudChVc2VyLCB7fSkpLnJlc29sdmVzLnRvQmUoMCk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLmJlZ2luVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0T25lKFVzZXIsIHt9KTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLmNvdW50KFVzZXIsIHt9KSkucmVzb2x2ZXMudG9CZSgxKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIucm9sbGJhY2tUcmFuc2FjdGlvbigpO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuY291bnQoVXNlciwge30pKS5yZXNvbHZlcy50b0JlKDApO1xuICAgIGF3YWl0IHRoaXMucXVlcmllci5yZWxlYXNlKCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRUaHJvd1doZW5CZWdpblRyYW5zYWN0aW9uQWZ0ZXJCZWdpblRyYW5zYWN0aW9uKCkge1xuICAgIGV4cGVjdCh0aGlzLnF1ZXJpZXIuaGFzT3BlblRyYW5zYWN0aW9uKS50b0JlRmFsc3koKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuYmVnaW5UcmFuc2FjdGlvbigpO1xuICAgIGV4cGVjdCh0aGlzLnF1ZXJpZXIuaGFzT3BlblRyYW5zYWN0aW9uKS50b0JlKHRydWUpO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuYmVnaW5UcmFuc2FjdGlvbigpKS5yZWplY3RzLnRvVGhyb3coJ3BlbmRpbmcgdHJhbnNhY3Rpb24nKTtcbiAgICBhd2FpdCBleHBlY3QodGhpcy5xdWVyaWVyLnJlbGVhc2UoKSkucmVqZWN0cy50b1Rocm93KCdwZW5kaW5nIHRyYW5zYWN0aW9uJyk7XG4gICAgYXdhaXQgdGhpcy5xdWVyaWVyLnJvbGxiYWNrVHJhbnNhY3Rpb24oKTtcbiAgICBhd2FpdCB0aGlzLnF1ZXJpZXIucmVsZWFzZSgpO1xuICB9XG5cbiAgYXN5bmMgc2hvdWxkUmV0dXJuVHJhbnNhY3Rpb25WYWx1ZSgpIHtcbiAgICBjb25zdCBhZmZlY3RlZFJvd3MgPSBhd2FpdCB0aGlzLnF1ZXJpZXIudHJhbnNhY3Rpb24oYXN5bmMgKCkgPT4ge1xuICAgICAgYXdhaXQgdGhpcy5zaG91bGRJbnNlcnRNYW55KCk7XG4gICAgICBjb25zdCBjb3VudCA9IGF3YWl0IHRoaXMucXVlcmllci5jb3VudChVc2VyLCB7fSk7XG4gICAgICBhd2FpdCB0aGlzLnF1ZXJpZXIuZGVsZXRlTWFueShVc2VyLCB7fSk7XG4gICAgICByZXR1cm4gY291bnQ7XG4gICAgfSk7XG4gICAgZXhwZWN0KGFmZmVjdGVkUm93cykudG9CZSgyKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFRocm93V2hlbkNvbW1pdFRyYW5zYWN0aW9uV2l0aG91dEJlZ2luVHJhbnNhY3Rpb24oKSB7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5jb21taXRUcmFuc2FjdGlvbigpKS5yZWplY3RzLnRvVGhyb3coJ25vdCBhIHBlbmRpbmcgdHJhbnNhY3Rpb24nKTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZFNlbGVjdE9uZVRvTWFueUVtcHR5KCkge1xuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnQgPSBhd2FpdCB0aGlzLnF1ZXJpZXIuZmluZE9uZUJ5SWQoSW52ZW50b3J5QWRqdXN0bWVudCwgLTEsIHtcbiAgICAgICRzZWxlY3Q6IHsgaXRlbUFkanVzdG1lbnRzOiB0cnVlLCBjcmVhdG9yOiB0cnVlIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KGludmVudG9yeUFkanVzdG1lbnQpLnRvQmVVbmRlZmluZWQoKTtcblxuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnRzID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRNYW55KEludmVudG9yeUFkanVzdG1lbnQsIHtcbiAgICAgICRzZWxlY3Q6IHsgaXRlbUFkanVzdG1lbnRzOiB0cnVlIH0sXG4gICAgfSk7XG4gICAgZXhwZWN0KGludmVudG9yeUFkanVzdG1lbnRzKS50b0hhdmVMZW5ndGgoMCk7XG4gIH1cblxuICBhc3luYyBzaG91bGRTZWxlY3RPbmVUb01hbnkoKSB7XG4gICAgYXdhaXQgdGhpcy5zaG91bGRJbnNlcnRPbmUoKTtcblxuICAgIGNvbnN0IFt1c2VyLCBjb21wYW55XSA9IGF3YWl0IFByb21pc2UuYWxsKFtcbiAgICAgIHRoaXMucXVlcmllci5maW5kT25lKFVzZXIsIHsgJHNlbGVjdDogWydpZCddIH0pLFxuICAgICAgdGhpcy5xdWVyaWVyLmZpbmRPbmUoQ29tcGFueSwgeyAkc2VsZWN0OiBbJ2lkJ10gfSksXG4gICAgXSk7XG5cbiAgICBjb25zdCBbZmlyc3RJdGVtSWQsIHNlY29uZEl0ZW1JZF0gPSBhd2FpdCB0aGlzLnF1ZXJpZXIuaW5zZXJ0TWFueShJdGVtLCBbXG4gICAgICB7XG4gICAgICAgIG5hbWU6ICdzb21lIGl0ZW0gbmFtZSBhJyxcbiAgICAgICAgY3JlYXRvcklkOiB1c2VyLmlkLFxuICAgICAgICBjb21wYW55SWQ6IGNvbXBhbnkuaWQsXG4gICAgICB9LFxuICAgICAge1xuICAgICAgICBuYW1lOiAnc29tZSBpdGVtIG5hbWUgYicsXG4gICAgICAgIGNyZWF0b3JJZDogdXNlci5pZCxcbiAgICAgICAgY29tcGFueUlkOiBjb21wYW55LmlkLFxuICAgICAgfSxcbiAgICBdKTtcblxuICAgIGNvbnN0IGludmVudG9yeUFkanVzdG1lbnRJZCA9IGF3YWl0IHRoaXMucXVlcmllci5pbnNlcnRPbmUoSW52ZW50b3J5QWRqdXN0bWVudCwge1xuICAgICAgZGVzY3JpcHRpb246ICdzb21lIGludmVudG9yeSBhZGp1c3RtZW50JyxcbiAgICAgIGNyZWF0b3JJZDogdXNlci5pZCxcbiAgICAgIGNvbXBhbnlJZDogY29tcGFueS5pZCxcbiAgICAgIGl0ZW1BZGp1c3RtZW50czogW1xuICAgICAgICB7IGJ1eVByaWNlOiAxMDAwLCBpdGVtSWQ6IGZpcnN0SXRlbUlkIH0sXG4gICAgICAgIHsgYnV5UHJpY2U6IDIwMDAsIGl0ZW1JZDogc2Vjb25kSXRlbUlkIH0sXG4gICAgICBdLFxuICAgIH0pO1xuXG4gICAgY29uc3QgaW52ZW50b3J5QWRqdXN0bWVudEZvdW5kID0gYXdhaXQgdGhpcy5xdWVyaWVyLmZpbmRPbmVCeUlkKEludmVudG9yeUFkanVzdG1lbnQsIGludmVudG9yeUFkanVzdG1lbnRJZCwge1xuICAgICAgJHNlbGVjdDogeyBpdGVtQWRqdXN0bWVudHM6IHRydWUsIGNyZWF0b3I6IHRydWUgfSxcbiAgICB9KTtcblxuICAgIGV4cGVjdChpbnZlbnRvcnlBZGp1c3RtZW50Rm91bmQpLnRvTWF0Y2hPYmplY3Qoe1xuICAgICAgaWQ6IGludmVudG9yeUFkanVzdG1lbnRJZCxcbiAgICAgIGl0ZW1BZGp1c3RtZW50czogW1xuICAgICAgICB7IGJ1eVByaWNlOiAxMDAwLCBpdGVtSWQ6IGZpcnN0SXRlbUlkIH0sXG4gICAgICAgIHsgYnV5UHJpY2U6IDIwMDAsIGl0ZW1JZDogc2Vjb25kSXRlbUlkIH0sXG4gICAgICBdLFxuICAgICAgY3JlYXRvcjoge1xuICAgICAgICBlbWFpbDogJ3NvbWVlbWFpbGNAZXhhbXBsZS5jb20nLFxuICAgICAgICBuYW1lOiAnU29tZSBOYW1lIEMnLFxuICAgICAgfSxcbiAgICB9KTtcbiAgfVxuXG4gIGFzeW5jIHNob3VsZERlbGV0ZU1hbnkoKSB7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwoW3RoaXMuc2hvdWxkSW5zZXJ0TWFueSgpLCB0aGlzLnNob3VsZEluc2VydE9uZSgpXSk7XG4gICAgYXdhaXQgZXhwZWN0KHRoaXMucXVlcmllci5kZWxldGVNYW55KFVzZXIsIHsgJHdoZXJlOiB7IGNvbXBhbnlJZDogMSB9IH0pKS5yZXNvbHZlcy50b0JlKDApO1xuICAgIGF3YWl0IGV4cGVjdCh0aGlzLnF1ZXJpZXIuZGVsZXRlTWFueShVc2VyLCB7ICR3aGVyZTogeyBjb21wYW55SWQ6IG51bGwgfSB9KSkucmVzb2x2ZXMudG9CZSgzKTtcbiAgfVxuXG4gIGFzeW5jIGNsZWFyVGFibGVzKCkge1xuICAgIGNvbnN0IGVudGl0aWVzID0gZ2V0RW50aXRpZXMoKTtcbiAgICBhd2FpdCBQcm9taXNlLmFsbChlbnRpdGllcy5tYXAoKGVudGl0eSkgPT4gdGhpcy5xdWVyaWVyLmRlbGV0ZU1hbnkoZW50aXR5LCB7fSkpKTtcbiAgfVxuXG4gIGFic3RyYWN0IGNyZWF0ZVRhYmxlcygpOiBQcm9taXNlPHZvaWQ+O1xuXG4gIGFic3RyYWN0IGRyb3BUYWJsZXMoKTogUHJvbWlzZTx2b2lkPjtcbn1cbiJdfQ==
@@ -0,0 +1,50 @@
1
+ import type { IdValue, Querier, Query, QueryConflictPaths, QueryOne, QueryOptions, QuerySearch, QuerySelect, QueryUpdateResult, RelationKey, Repository, Type } from '../type/index.js';
2
+ /**
3
+ * Base class for all database queriers.
4
+ * It provides a standardized way to execute tasks serially to prevent race conditions on database connections.
5
+ */
6
+ export declare abstract class AbstractQuerier implements Querier {
7
+ /**
8
+ * Internal promise used to queue database operations.
9
+ * This ensures that each operation is executed serially, preventing race conditions
10
+ * and ensuring that the database connection is used safely across concurrent calls.
11
+ */
12
+ private taskQueue;
13
+ findOneById<E>(entity: Type<E>, id: IdValue<E>, q?: QueryOne<E>): Promise<E>;
14
+ findOne<E>(entity: Type<E>, q: QueryOne<E>): Promise<E>;
15
+ abstract findMany<E>(entity: Type<E>, q: Query<E>): Promise<E[]>;
16
+ findManyAndCount<E>(entity: Type<E>, q: Query<E>): Promise<[E[], number]>;
17
+ abstract count<E>(entity: Type<E>, q: QuerySearch<E>): Promise<number>;
18
+ insertOne<E>(entity: Type<E>, payload: E): Promise<IdValue<E>>;
19
+ abstract insertMany<E>(entity: Type<E>, payload: E[]): Promise<IdValue<E>[]>;
20
+ updateOneById<E>(entity: Type<E>, id: IdValue<E>, payload: E): Promise<number>;
21
+ abstract updateMany<E>(entity: Type<E>, q: QuerySearch<E>, payload: E): Promise<number>;
22
+ abstract upsertOne<E>(entity: Type<E>, conflictPaths: QueryConflictPaths<E>, payload: E): Promise<QueryUpdateResult>;
23
+ deleteOneById<E>(entity: Type<E>, id: IdValue<E>, opts?: QueryOptions): Promise<number>;
24
+ abstract deleteMany<E>(entity: Type<E>, q: QuerySearch<E>, opts?: QueryOptions): Promise<number>;
25
+ saveOne<E>(entity: Type<E>, payload: E): Promise<IdValue<E> | E[import("../type/entity.js").IdKey<E>]>;
26
+ saveMany<E>(entity: Type<E>, payload: E[]): Promise<(Awaited<IdValue<E>> | Awaited<E[import("../type/entity.js").IdKey<E>]>)[]>;
27
+ protected fillToManyRelations<E>(entity: Type<E>, payload: E[], select: QuerySelect<E>): Promise<void>;
28
+ protected putChildrenInParents<E>(parents: E[], children: E[], parentIdKey: string, referenceKey: string, relKey: string): void;
29
+ protected insertRelations<E>(entity: Type<E>, payload: E[]): Promise<void>;
30
+ protected updateRelations<E>(entity: Type<E>, q: QuerySearch<E>, payload: E): Promise<void>;
31
+ protected deleteRelations<E>(entity: Type<E>, ids: IdValue<E>[], opts?: QueryOptions): Promise<void>;
32
+ protected saveRelation<E>(entity: Type<E>, payload: E, relKey: RelationKey<E>, isUpdate?: boolean): Promise<void>;
33
+ getRepository<E>(entity: Type<E>): Repository<E>;
34
+ abstract readonly hasOpenTransaction: boolean;
35
+ transaction<T>(callback: () => Promise<T>): Promise<T>;
36
+ releaseIfFree(): Promise<void>;
37
+ /**
38
+ * Schedules a task to be executed serially in the querier instance.
39
+ * This is used by the @Serialized decorator to protect database-level operations.
40
+ *
41
+ * @param task - The async task to execute.
42
+ * @returns A promise that resolves with the task's result.
43
+ */
44
+ protected serialize<T>(task: () => Promise<T>): Promise<T>;
45
+ abstract beginTransaction(): Promise<void>;
46
+ abstract commitTransaction(): Promise<void>;
47
+ abstract rollbackTransaction(): Promise<void>;
48
+ protected abstract internalRelease(): Promise<void>;
49
+ release(): Promise<void>;
50
+ }