@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 @@
1
+ export {};
@@ -0,0 +1,106 @@
1
+ import { __decorate, __metadata } from "tslib";
2
+ import { beforeEach, describe, expect, it, jest } from 'bun:test';
3
+ import { Entity, Field, Id } from '../entity/index.js';
4
+ import { Migrator } from './migrator.js';
5
+ let SyncUser = class SyncUser {
6
+ id;
7
+ name;
8
+ };
9
+ __decorate([
10
+ Id(),
11
+ __metadata("design:type", Number)
12
+ ], SyncUser.prototype, "id", void 0);
13
+ __decorate([
14
+ Field(),
15
+ __metadata("design:type", String)
16
+ ], SyncUser.prototype, "name", void 0);
17
+ SyncUser = __decorate([
18
+ Entity()
19
+ ], SyncUser);
20
+ let SyncProfile = class SyncProfile {
21
+ id;
22
+ bio;
23
+ userId;
24
+ };
25
+ __decorate([
26
+ Id(),
27
+ __metadata("design:type", Number)
28
+ ], SyncProfile.prototype, "id", void 0);
29
+ __decorate([
30
+ Field(),
31
+ __metadata("design:type", String)
32
+ ], SyncProfile.prototype, "bio", void 0);
33
+ __decorate([
34
+ Field({ reference: () => SyncUser }),
35
+ __metadata("design:type", Number)
36
+ ], SyncProfile.prototype, "userId", void 0);
37
+ SyncProfile = __decorate([
38
+ Entity()
39
+ ], SyncProfile);
40
+ describe('Migrator autoSync Integration', () => {
41
+ let migrator;
42
+ let pool;
43
+ beforeEach(() => {
44
+ // Mock pool and querier for testing
45
+ const querier = {
46
+ run: jest.fn().mockResolvedValue({}),
47
+ all: jest.fn().mockResolvedValue([]),
48
+ beginTransaction: jest.fn().mockResolvedValue(undefined),
49
+ commitTransaction: jest.fn().mockResolvedValue(undefined),
50
+ rollbackTransaction: jest.fn().mockResolvedValue(undefined),
51
+ release: jest.fn().mockResolvedValue(undefined),
52
+ dialect: {
53
+ escapeIdChar: '"',
54
+ placeholder: jest.fn().mockReturnValue('?'),
55
+ },
56
+ };
57
+ pool = {
58
+ getQuerier: jest.fn().mockResolvedValue(querier),
59
+ dialect: 'postgres',
60
+ };
61
+ migrator = new Migrator(pool, {
62
+ entities: [SyncUser, SyncProfile],
63
+ });
64
+ });
65
+ it('should generate create statements for new tables', async () => {
66
+ // Mock introspector to return nothing
67
+ const introspector = {
68
+ getTableSchema: jest.fn().mockResolvedValue(undefined),
69
+ getTableNames: jest.fn().mockResolvedValue([]),
70
+ tableExists: jest.fn().mockResolvedValue(false),
71
+ };
72
+ migrator.schemaIntrospector = introspector;
73
+ await migrator.autoSync({ logging: true });
74
+ const querier = (await pool.getQuerier());
75
+ expect(querier.run).toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE "SyncUser"'));
76
+ expect(querier.run).toHaveBeenCalledWith(expect.stringContaining('CREATE TABLE "SyncProfile"'));
77
+ });
78
+ it('should generate alter statements for missing columns', async () => {
79
+ // Mock introspector to return existing table with one column missing
80
+ const introspector = {
81
+ getTableSchema: jest.fn().mockImplementation((name) => {
82
+ if (name === 'SyncUser') {
83
+ return Promise.resolve({
84
+ name: 'SyncUser',
85
+ columns: [
86
+ {
87
+ name: 'id',
88
+ type: 'INTEGER',
89
+ nullable: false,
90
+ isPrimaryKey: true,
91
+ isAutoIncrement: true,
92
+ isUnique: false,
93
+ },
94
+ ],
95
+ });
96
+ }
97
+ return Promise.resolve(undefined);
98
+ }),
99
+ };
100
+ migrator.schemaIntrospector = introspector;
101
+ await migrator.autoSync({ logging: true });
102
+ const querier = (await pool.getQuerier());
103
+ expect(querier.run).toHaveBeenCalledWith(expect.stringContaining('ALTER TABLE "SyncUser" ADD COLUMN "name" VARCHAR(255)'));
104
+ });
105
+ });
106
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWlncmF0b3IudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9taWdyYXRlL21pZ3JhdG9yLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsSUFBSSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxNQUFNLG9CQUFvQixDQUFDO0FBRXZELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFHekMsSUFBTSxRQUFRLEdBQWQsTUFBTSxRQUFRO0lBQ04sRUFBRSxDQUFVO0lBQ1QsSUFBSSxDQUFVO0NBQ3hCLENBQUE7QUFGTztJQUFMLEVBQUUsRUFBRTs7b0NBQWE7QUFDVDtJQUFSLEtBQUssRUFBRTs7c0NBQWU7QUFGbkIsUUFBUTtJQURiLE1BQU0sRUFBRTtHQUNILFFBQVEsQ0FHYjtBQUdELElBQU0sV0FBVyxHQUFqQixNQUFNLFdBQVc7SUFDVCxFQUFFLENBQVU7SUFDVCxHQUFHLENBQVU7SUFDZ0IsTUFBTSxDQUFVO0NBQ3ZELENBQUE7QUFITztJQUFMLEVBQUUsRUFBRTs7dUNBQWE7QUFDVDtJQUFSLEtBQUssRUFBRTs7d0NBQWM7QUFDZ0I7SUFBckMsS0FBSyxDQUFDLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDOzsyQ0FBaUI7QUFIbEQsV0FBVztJQURoQixNQUFNLEVBQUU7R0FDSCxXQUFXLENBSWhCO0FBRUQsUUFBUSxDQUFDLCtCQUErQixFQUFFLEdBQUcsRUFBRTtJQUM3QyxJQUFJLFFBQWtCLENBQUM7SUFDdkIsSUFBSSxJQUFpQixDQUFDO0lBRXRCLFVBQVUsQ0FBQyxHQUFHLEVBQUU7UUFDZCxvQ0FBb0M7UUFDcEMsTUFBTSxPQUFPLEdBQUc7WUFDZCxHQUFHLEVBQUUsSUFBSSxD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TyxPQUFPLENBQUMsT0FBTyxDQUFDLFNBQVMsQ0FBQyxDQUFDO1lBQ3BDLENBQUMsQ0FBQztTQUNILENBQUM7UUFDRixRQUFRLENBQUMsa0JBQWtCLEdBQUcsWUFBbUIsQ0FBQztRQUVsRCxNQUFNLFFBQVEsQ0FBQyxRQUFRLENBQUMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUUzQyxNQUFNLE9BQU8sR0FBRyxDQUFDLE1BQU0sSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFlLENBQUM7UUFDeEQsTUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxvQkFBb0IsQ0FDdEMsTUFBTSxDQUFDLGdCQUFnQixDQUFDLHVEQUF1RCxDQUFDLENBQ2pGLENBQUM7SUFDSixDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgYmVmb3JlRWFjaCwgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIGplc3QgfSBmcm9tICdidW46dGVzdCc7XG5pbXBvcnQgeyBFbnRpdHksIEZpZWxkLCBJZCB9IGZyb20gJy4uL2VudGl0eS9pbmRleC5qcyc7XG5pbXBvcnQgdHlwZSB7IFF1ZXJpZXJQb29sLCBTcWxRdWVyaWVyLCBUYWJsZVNjaGVtYSB9IGZyb20gJy4uL3R5cGUvaW5kZXguanMnO1xuaW1wb3J0IHsgTWlncmF0b3IgfSBmcm9tICcuL21pZ3JhdG9yLmpzJztcblxuQEVudGl0eSgpXG5jbGFzcyBTeW5jVXNlciB7XG4gIEBJZCgpIGlkPzogbnVtYmVyO1xuICBARmllbGQoKSBuYW1lPzogc3RyaW5nO1xufVxuXG5ARW50aXR5KClcbmNsYXNzIFN5bmNQcm9maWxlIHtcbiAgQElkKCkgaWQ/OiBudW1iZXI7XG4gIEBGaWVsZCgpIGJpbz86IHN0cmluZztcbiAgQEZpZWxkKHsgcmVmZXJlbmNlOiAoKSA9PiBTeW5jVXNlciB9KSB1c2VySWQ/OiBudW1iZXI7XG59XG5cbmRlc2NyaWJlKCdNaWdyYXRvciBhdXRvU3luYyBJbnRlZ3JhdGlvbicsICgpID0+IHtcbiAgbGV0IG1pZ3JhdG9yOiBNaWdyYXRvcjtcbiAgbGV0IHBvb2w6IFF1ZXJpZXJQb29sO1xuXG4gIGJlZm9yZUVhY2goKCkgPT4ge1xuICAgIC8vIE1vY2sgcG9vbCBhbmQgcXVlcmllciBmb3IgdGVzdGluZ1xuICAgIGNvbnN0IHF1ZXJpZXIgPSB7XG4gICAgICBydW46IGplc3QuZm48YW55PigpLm1vY2tSZXNvbHZlZFZhbHVlKHt9KSxcbiAgICAgIGFsbDogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUoW10pLFxuICAgICAgYmVnaW5UcmFuc2FjdGlvbjogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgIGNvbW1pdFRyYW5zYWN0aW9uOiBqZXN0LmZuPGFueT4oKS5tb2NrUmVzb2x2ZWRWYWx1ZSh1bmRlZmluZWQpLFxuICAgICAgcm9sbGJhY2tUcmFuc2FjdGlvbjogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUodW5kZWZpbmVkKSxcbiAgICAgIHJlbGVhc2U6IGplc3QuZm48YW55PigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICBkaWFsZWN0OiB7XG4gICAgICAgIGVzY2FwZUlkQ2hhcjogJ1wiJyxcbiAgICAgICAgcGxhY2Vob2xkZXI6IGplc3QuZm48YW55PigpLm1vY2tSZXR1cm5WYWx1ZSgnPycpLFxuICAgICAgfSxcbiAgICB9O1xuICAgIHBvb2wgPSB7XG4gICAgICBnZXRRdWVyaWVyOiBqZXN0LmZuPGFueT4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShxdWVyaWVyKSxcbiAgICAgIGRpYWxlY3Q6ICdwb3N0Z3JlcycsXG4gICAgfSBhcyB1bmtub3duIGFzIFF1ZXJpZXJQb29sO1xuXG4gICAgbWlncmF0b3IgPSBuZXcgTWlncmF0b3IocG9vbCwge1xuICAgICAgZW50aXRpZXM6IFtTeW5jVXNlciwgU3luY1Byb2ZpbGVdLFxuICAgIH0pO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGNyZWF0ZSBzdGF0ZW1lbnRzIGZvciBuZXcgdGFibGVzJywgYXN5bmMgKCkgPT4ge1xuICAgIC8vIE1vY2sgaW50cm9zcGVjdG9yIHRvIHJldHVybiBub3RoaW5nXG4gICAgY29uc3QgaW50cm9zcGVjdG9yID0ge1xuICAgICAgZ2V0VGFibGVTY2hlbWE6IGplc3QuZm48YW55PigpLm1vY2tSZXNvbHZlZFZhbHVlKHVuZGVmaW5lZCksXG4gICAgICBnZXRUYWJsZU5hbWVzOiBqZXN0LmZuPGFueT4oKS5tb2NrUmVzb2x2ZWRWYWx1ZShbXSksXG4gICAgICB0YWJsZUV4aXN0czogamVzdC5mbjxhbnk+KCkubW9ja1Jlc29sdmVkVmFsdWUoZmFsc2UpLFxuICAgIH07XG4gICAgbWlncmF0b3Iuc2NoZW1hSW50cm9zcGVjdG9yID0gaW50cm9zcGVjdG9yIGFzIGFueTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLmF1dG9TeW5jKHsgbG9nZ2luZzogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHF1ZXJpZXIgPSAoYXdhaXQgcG9vbC5nZXRRdWVyaWVyKCkpIGFzIFNxbFF1ZXJpZXI7XG4gICAgZXhwZWN0KHF1ZXJpZXIucnVuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChleHBlY3Quc3RyaW5nQ29udGFpbmluZygnQ1JFQVRFIFRBQkxFIFwiU3luY1VzZXJcIicpKTtcbiAgICBleHBlY3QocXVlcmllci5ydW4pLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdDUkVBVEUgVEFCTEUgXCJTeW5jUHJvZmlsZVwiJykpO1xuICB9KTtcblxuICBpdCgnc2hvdWxkIGdlbmVyYXRlIGFsdGVyIHN0YXRlbWVudHMgZm9yIG1pc3NpbmcgY29sdW1ucycsIGFzeW5jICgpID0+IHtcbiAgICAvLyBNb2NrIGludHJvc3BlY3RvciB0byByZXR1cm4gZXhpc3RpbmcgdGFibGUgd2l0aCBvbmUgY29sdW1uIG1pc3NpbmdcbiAgICBjb25zdCBpbnRyb3NwZWN0b3IgPSB7XG4gICAgICBnZXRUYWJsZVNjaGVtYTogamVzdC5mbjxhbnk+KCkubW9ja0ltcGxlbWVudGF0aW9uKChuYW1lOiBhbnkpID0+IHtcbiAgICAgICAgaWYgKG5hbWUgPT09ICdTeW5jVXNlcicpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHtcbiAgICAgICAgICAgIG5hbWU6ICdTeW5jVXNlcicsXG4gICAgICAgICAgICBjb2x1bW5zOiBbXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgICAgICAgIHR5cGU6ICdJTlRFR0VSJyxcbiAgICAgICAgICAgICAgICBudWxsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgaXNQcmltYXJ5S2V5OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzQXV0b0luY3JlbWVudDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBpc1VuaXF1ZTogZmFsc2UsXG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBdLFxuICAgICAgICAgIH0gYXMgVGFibGVTY2hlbWEpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodW5kZWZpbmVkKTtcbiAgICAgIH0pLFxuICAgIH07XG4gICAgbWlncmF0b3Iuc2NoZW1hSW50cm9zcGVjdG9yID0gaW50cm9zcGVjdG9yIGFzIGFueTtcblxuICAgIGF3YWl0IG1pZ3JhdG9yLmF1dG9TeW5jKHsgbG9nZ2luZzogdHJ1ZSB9KTtcblxuICAgIGNvbnN0IHF1ZXJpZXIgPSAoYXdhaXQgcG9vbC5nZXRRdWVyaWVyKCkpIGFzIFNxbFF1ZXJpZXI7XG4gICAgZXhwZWN0KHF1ZXJpZXIucnVuKS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgIGV4cGVjdC5zdHJpbmdDb250YWluaW5nKCdBTFRFUiBUQUJMRSBcIlN5bmNVc2VyXCIgQUREIENPTFVNTiBcIm5hbWVcIiBWQVJDSEFSKDI1NSknKSxcbiAgICApO1xuICB9KTtcbn0pO1xuIl19
@@ -0,0 +1,78 @@
1
+ import { AbstractDialect } from '../dialect/index.js';
2
+ import type { ColumnSchema, ColumnType, EntityMeta, FieldOptions, IndexSchema, NamingStrategy, SchemaDiff, SchemaGenerator, TableSchema, Type } from '../type/index.js';
3
+ /**
4
+ * Abstract base class for SQL schema generation
5
+ */
6
+ export declare abstract class AbstractSchemaGenerator extends AbstractDialect implements SchemaGenerator {
7
+ protected readonly escapeIdChar: '`' | '"';
8
+ /**
9
+ * Primary key type for auto-increment integer IDs
10
+ */
11
+ protected abstract readonly serialPrimaryKeyType: string;
12
+ constructor(namingStrategy?: NamingStrategy, escapeIdChar?: '`' | '"');
13
+ /**
14
+ * Escape an identifier (table name, column name, etc.)
15
+ */
16
+ protected escapeId(identifier: string): string;
17
+ generateCreateTable<E>(entity: Type<E>, options?: {
18
+ ifNotExists?: boolean;
19
+ }): string;
20
+ generateDropTable<E>(entity: Type<E>): string;
21
+ generateAlterTable(diff: SchemaDiff): string[];
22
+ generateAlterTableDown(diff: SchemaDiff): string[];
23
+ generateCreateIndex(tableName: string, index: IndexSchema): string;
24
+ generateDropIndex(tableName: string, indexName: string): string;
25
+ /**
26
+ * Generate column definitions from entity metadata
27
+ */
28
+ generateColumnDefinitions<E>(meta: EntityMeta<E>): string[];
29
+ /**
30
+ * Generate a single column definition
31
+ */
32
+ generateColumnDefinition<E>(fieldKey: string, field: FieldOptions, meta: EntityMeta<E>): string;
33
+ /**
34
+ * Generate column definition from a ColumnSchema object
35
+ */
36
+ generateColumnDefinitionFromSchema(column: ColumnSchema): string;
37
+ /**
38
+ * Generate table constraints (indexes, foreign keys, etc.)
39
+ */
40
+ generateTableConstraints<E>(meta: EntityMeta<E>): string[];
41
+ getSqlType(field: FieldOptions, fieldType?: unknown): string;
42
+ /**
43
+ * Map uql column type to database-specific SQL type
44
+ */
45
+ abstract mapColumnType(columnType: ColumnType, field: FieldOptions): string;
46
+ /**
47
+ * Get the boolean type for this database
48
+ */
49
+ abstract getBooleanType(): string;
50
+ /**
51
+ * Generate ALTER COLUMN statements (database-specific)
52
+ */
53
+ abstract generateAlterColumnStatements(tableName: string, column: ColumnSchema, newDefinition: string): string[];
54
+ /**
55
+ * Get table options (e.g., ENGINE for MySQL)
56
+ */
57
+ getTableOptions<E>(meta: EntityMeta<E>): string;
58
+ /**
59
+ * Generate column comment clause (if supported)
60
+ */
61
+ abstract generateColumnComment(tableName: string, columnName: string, comment: string): string;
62
+ /**
63
+ * Format a default value for SQL
64
+ */
65
+ formatDefaultValue(value: unknown): string;
66
+ /**
67
+ * Compare two schemas and return the differences
68
+ */
69
+ diffSchema<E>(entity: Type<E>, currentSchema: TableSchema | undefined): SchemaDiff | undefined;
70
+ /**
71
+ * Convert field options to ColumnSchema
72
+ */
73
+ protected fieldToColumnSchema<E>(fieldKey: string, field: FieldOptions, meta: EntityMeta<E>): ColumnSchema;
74
+ /**
75
+ * Check if two columns differ enough to require alteration
76
+ */
77
+ protected columnsNeedAlteration(current: ColumnSchema, desired: ColumnSchema): boolean;
78
+ }
@@ -0,0 +1,363 @@
1
+ import { AbstractDialect } from '../dialect/index.js';
2
+ import { getMeta } from '../entity/index.js';
3
+ import { escapeSqlId, getKeys } from '../util/index.js';
4
+ /**
5
+ * Abstract base class for SQL schema generation
6
+ */
7
+ export class AbstractSchemaGenerator extends AbstractDialect {
8
+ escapeIdChar;
9
+ constructor(namingStrategy, escapeIdChar = '`') {
10
+ super(namingStrategy);
11
+ this.escapeIdChar = escapeIdChar;
12
+ }
13
+ /**
14
+ * Escape an identifier (table name, column name, etc.)
15
+ */
16
+ escapeId(identifier) {
17
+ return escapeSqlId(identifier, this.escapeIdChar);
18
+ }
19
+ generateCreateTable(entity, options = {}) {
20
+ const meta = getMeta(entity);
21
+ const tableName = this.resolveTableName(entity, meta);
22
+ const columns = this.generateColumnDefinitions(meta);
23
+ const constraints = this.generateTableConstraints(meta);
24
+ const ifNotExists = options.ifNotExists ? 'IF NOT EXISTS ' : '';
25
+ let sql = `CREATE TABLE ${ifNotExists}${this.escapeId(tableName)} (\n`;
26
+ sql += columns.map((col) => ` ${col}`).join(',\n');
27
+ if (constraints.length > 0) {
28
+ sql += ',\n';
29
+ sql += constraints.map((c) => ` ${c}`).join(',\n');
30
+ }
31
+ sql += '\n)';
32
+ sql += this.getTableOptions(meta);
33
+ sql += ';';
34
+ return sql;
35
+ }
36
+ generateDropTable(entity) {
37
+ const meta = getMeta(entity);
38
+ const tableName = this.resolveTableName(entity, meta);
39
+ return `DROP TABLE IF EXISTS ${this.escapeId(tableName)};`;
40
+ }
41
+ generateAlterTable(diff) {
42
+ const statements = [];
43
+ const tableName = this.escapeId(diff.tableName);
44
+ // Add new columns
45
+ if (diff.columnsToAdd?.length) {
46
+ for (const column of diff.columnsToAdd) {
47
+ const colDef = this.generateColumnDefinitionFromSchema(column);
48
+ statements.push(`ALTER TABLE ${tableName} ADD COLUMN ${colDef};`);
49
+ }
50
+ }
51
+ // Alter existing columns
52
+ if (diff.columnsToAlter?.length) {
53
+ for (const { to } of diff.columnsToAlter) {
54
+ const colDef = this.generateColumnDefinitionFromSchema(to);
55
+ const colStatements = this.generateAlterColumnStatements(diff.tableName, to, colDef);
56
+ statements.push(...colStatements);
57
+ }
58
+ }
59
+ // Drop columns
60
+ if (diff.columnsToDrop?.length) {
61
+ for (const columnName of diff.columnsToDrop) {
62
+ statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.escapeId(columnName)};`);
63
+ }
64
+ }
65
+ // Add indexes
66
+ if (diff.indexesToAdd?.length) {
67
+ for (const index of diff.indexesToAdd) {
68
+ statements.push(this.generateCreateIndex(diff.tableName, index));
69
+ }
70
+ }
71
+ // Drop indexes
72
+ if (diff.indexesToDrop?.length) {
73
+ for (const indexName of diff.indexesToDrop) {
74
+ statements.push(this.generateDropIndex(diff.tableName, indexName));
75
+ }
76
+ }
77
+ return statements;
78
+ }
79
+ generateAlterTableDown(diff) {
80
+ const statements = [];
81
+ const tableName = this.escapeId(diff.tableName);
82
+ // Rollback additions by dropping columns
83
+ if (diff.columnsToAdd?.length) {
84
+ for (const column of diff.columnsToAdd) {
85
+ statements.push(`ALTER TABLE ${tableName} DROP COLUMN ${this.escapeId(column.name)};`);
86
+ }
87
+ }
88
+ return statements;
89
+ }
90
+ generateCreateIndex(tableName, index) {
91
+ const unique = index.unique ? 'UNIQUE ' : '';
92
+ const columns = index.columns.map((c) => this.escapeId(c)).join(', ');
93
+ return `CREATE ${unique}INDEX ${this.escapeId(index.name)} ON ${this.escapeId(tableName)} (${columns});`;
94
+ }
95
+ generateDropIndex(tableName, indexName) {
96
+ return `DROP INDEX IF EXISTS ${this.escapeId(indexName)};`;
97
+ }
98
+ /**
99
+ * Generate column definitions from entity metadata
100
+ */
101
+ generateColumnDefinitions(meta) {
102
+ const columns = [];
103
+ const fieldKeys = getKeys(meta.fields);
104
+ for (const key of fieldKeys) {
105
+ const field = meta.fields[key];
106
+ if (field?.virtual)
107
+ continue; // Skip virtual fields
108
+ const colDef = this.generateColumnDefinition(key, field, meta);
109
+ columns.push(colDef);
110
+ }
111
+ return columns;
112
+ }
113
+ /**
114
+ * Generate a single column definition
115
+ */
116
+ generateColumnDefinition(fieldKey, field, meta) {
117
+ const columnName = this.escapeId(this.resolveColumnName(fieldKey, field));
118
+ const isId = field.isId === true;
119
+ const isPrimaryKey = isId && meta.id === fieldKey;
120
+ // Determine SQL type
121
+ let sqlType;
122
+ if (isPrimaryKey && field.autoIncrement !== false && !field.onInsert) {
123
+ // Auto-increment primary key
124
+ sqlType = this.serialPrimaryKeyType;
125
+ }
126
+ else {
127
+ sqlType = this.getSqlType(field, field.type);
128
+ }
129
+ let definition = `${columnName} ${sqlType}`;
130
+ // PRIMARY KEY constraint (for non-serial types)
131
+ if (isPrimaryKey && !sqlType.includes('PRIMARY KEY')) {
132
+ definition += ' PRIMARY KEY';
133
+ }
134
+ // NULL/NOT NULL
135
+ if (!isPrimaryKey) {
136
+ const nullable = field.nullable ?? true;
137
+ if (!nullable) {
138
+ definition += ' NOT NULL';
139
+ }
140
+ }
141
+ // UNIQUE constraint
142
+ if (field.unique && !isPrimaryKey) {
143
+ definition += ' UNIQUE';
144
+ }
145
+ // DEFAULT value
146
+ if (field.defaultValue !== undefined) {
147
+ definition += ` DEFAULT ${this.formatDefaultValue(field.defaultValue)}`;
148
+ }
149
+ // COMMENT (if supported)
150
+ if (field.comment) {
151
+ definition += this.generateColumnComment(this.resolveTableName(meta.entity, meta), this.resolveColumnName(fieldKey, field), field.comment);
152
+ }
153
+ return definition;
154
+ }
155
+ /**
156
+ * Generate column definition from a ColumnSchema object
157
+ */
158
+ generateColumnDefinitionFromSchema(column) {
159
+ const columnName = this.escapeId(column.name);
160
+ let type = column.type;
161
+ if (column.length && !type.includes('(')) {
162
+ type = `${type}(${column.length})`;
163
+ }
164
+ else if (column.precision !== undefined && !type.includes('(')) {
165
+ if (column.scale !== undefined) {
166
+ type = `${type}(${column.precision}, ${column.scale})`;
167
+ }
168
+ else {
169
+ type = `${type}(${column.precision})`;
170
+ }
171
+ }
172
+ let definition = `${columnName} ${type}`;
173
+ if (column.isPrimaryKey) {
174
+ definition += ' PRIMARY KEY';
175
+ }
176
+ if (!column.nullable && !column.isPrimaryKey) {
177
+ definition += ' NOT NULL';
178
+ }
179
+ if (column.isUnique && !column.isPrimaryKey) {
180
+ definition += ' UNIQUE';
181
+ }
182
+ if (column.defaultValue !== undefined) {
183
+ definition += ` DEFAULT ${this.formatDefaultValue(column.defaultValue)}`;
184
+ }
185
+ return definition;
186
+ }
187
+ /**
188
+ * Generate table constraints (indexes, foreign keys, etc.)
189
+ */
190
+ generateTableConstraints(meta) {
191
+ const constraints = [];
192
+ const fieldKeys = getKeys(meta.fields);
193
+ const tableName = this.resolveTableName(meta.entity, meta);
194
+ // Generate indexes from field options
195
+ for (const key of fieldKeys) {
196
+ const field = meta.fields[key];
197
+ if (field?.index) {
198
+ const columnName = this.resolveColumnName(key, field);
199
+ const indexName = typeof field.index === 'string' ? field.index : `idx_${tableName}_${columnName}`;
200
+ constraints.push(`INDEX ${this.escapeId(indexName)} (${this.escapeId(columnName)})`);
201
+ }
202
+ }
203
+ // Generate foreign key constraints from references
204
+ for (const key of fieldKeys) {
205
+ const field = meta.fields[key];
206
+ if (field?.reference) {
207
+ const refEntity = field.reference();
208
+ const refMeta = getMeta(refEntity);
209
+ const refIdField = refMeta.fields[refMeta.id];
210
+ const columnName = this.resolveColumnName(key, field);
211
+ const refTableName = this.resolveTableName(refEntity, refMeta);
212
+ const refColumnName = this.resolveColumnName(refMeta.id, refIdField);
213
+ const fkName = `fk_${tableName}_${columnName}`;
214
+ constraints.push(`CONSTRAINT ${this.escapeId(fkName)} FOREIGN KEY (${this.escapeId(columnName)}) ` +
215
+ `REFERENCES ${this.escapeId(refTableName)} (${this.escapeId(refColumnName)})`);
216
+ }
217
+ }
218
+ return constraints;
219
+ }
220
+ getSqlType(field, fieldType) {
221
+ // Use explicit column type if specified
222
+ if (field.columnType) {
223
+ return this.mapColumnType(field.columnType, field);
224
+ }
225
+ // Handle special types
226
+ if (field.type === 'json' || field.type === 'jsonb') {
227
+ return this.mapColumnType(field.type, field);
228
+ }
229
+ if (field.type === 'vector') {
230
+ return this.mapColumnType('vector', field);
231
+ }
232
+ // Infer from TypeScript type
233
+ const type = fieldType ?? field.type;
234
+ if (type === Number || type === 'number') {
235
+ return field.precision ? this.mapColumnType('decimal', field) : 'BIGINT';
236
+ }
237
+ if (type === String || type === 'string') {
238
+ const length = field.length ?? 255;
239
+ return `VARCHAR(${length})`;
240
+ }
241
+ if (type === Boolean || type === 'boolean') {
242
+ return this.getBooleanType();
243
+ }
244
+ if (type === Date || type === 'date') {
245
+ return 'TIMESTAMP';
246
+ }
247
+ if (type === BigInt || type === 'bigint') {
248
+ return 'BIGINT';
249
+ }
250
+ // Default to VARCHAR
251
+ return `VARCHAR(${field.length ?? 255})`;
252
+ }
253
+ /**
254
+ * Get table options (e.g., ENGINE for MySQL)
255
+ */
256
+ getTableOptions(meta) {
257
+ return '';
258
+ }
259
+ /**
260
+ * Format a default value for SQL
261
+ */
262
+ formatDefaultValue(value) {
263
+ if (value === null) {
264
+ return 'NULL';
265
+ }
266
+ if (typeof value === 'string') {
267
+ return `'${value.replace(/'/g, "''")}'`;
268
+ }
269
+ if (typeof value === 'boolean') {
270
+ return value ? 'TRUE' : 'FALSE';
271
+ }
272
+ if (typeof value === 'number' || typeof value === 'bigint') {
273
+ return String(value);
274
+ }
275
+ if (value instanceof Date) {
276
+ return `'${value.toISOString()}'`;
277
+ }
278
+ return String(value);
279
+ }
280
+ /**
281
+ * Compare two schemas and return the differences
282
+ */
283
+ diffSchema(entity, currentSchema) {
284
+ const meta = getMeta(entity);
285
+ if (!currentSchema) {
286
+ // Table doesn't exist, need to create
287
+ return {
288
+ tableName: this.resolveTableName(entity, meta),
289
+ type: 'create',
290
+ };
291
+ }
292
+ const columnsToAdd = [];
293
+ const columnsToAlter = [];
294
+ const columnsToDrop = [];
295
+ const currentColumns = new Map(currentSchema.columns.map((c) => [c.name, c]));
296
+ const fieldKeys = getKeys(meta.fields);
297
+ // Check for new or altered columns
298
+ for (const key of fieldKeys) {
299
+ const field = meta.fields[key];
300
+ if (field?.virtual)
301
+ continue;
302
+ const columnName = this.resolveColumnName(key, field);
303
+ const currentColumn = currentColumns.get(columnName);
304
+ if (!currentColumn) {
305
+ // Column needs to be added
306
+ columnsToAdd.push(this.fieldToColumnSchema(key, field, meta));
307
+ }
308
+ else {
309
+ // Check if column needs alteration
310
+ const desiredColumn = this.fieldToColumnSchema(key, field, meta);
311
+ if (this.columnsNeedAlteration(currentColumn, desiredColumn)) {
312
+ columnsToAlter.push({ from: currentColumn, to: desiredColumn });
313
+ }
314
+ }
315
+ currentColumns.delete(columnName);
316
+ }
317
+ // Remaining columns in currentColumns should be dropped
318
+ for (const [name] of currentColumns) {
319
+ columnsToDrop.push(name);
320
+ }
321
+ if (columnsToAdd.length === 0 && columnsToAlter.length === 0 && columnsToDrop.length === 0) {
322
+ return undefined; // No changes needed
323
+ }
324
+ return {
325
+ tableName: this.resolveTableName(entity, meta),
326
+ type: 'alter',
327
+ columnsToAdd: columnsToAdd.length > 0 ? columnsToAdd : undefined,
328
+ columnsToAlter: columnsToAlter.length > 0 ? columnsToAlter : undefined,
329
+ columnsToDrop: columnsToDrop.length > 0 ? columnsToDrop : undefined,
330
+ };
331
+ }
332
+ /**
333
+ * Convert field options to ColumnSchema
334
+ */
335
+ fieldToColumnSchema(fieldKey, field, meta) {
336
+ const isId = field.isId === true;
337
+ const isPrimaryKey = isId && meta.id === fieldKey;
338
+ return {
339
+ name: this.resolveColumnName(fieldKey, field),
340
+ type: this.getSqlType(field, field.type),
341
+ nullable: field.nullable ?? !isPrimaryKey,
342
+ defaultValue: field.defaultValue,
343
+ isPrimaryKey,
344
+ isAutoIncrement: isPrimaryKey && field.autoIncrement !== false && !field.onInsert,
345
+ isUnique: field.unique ?? false,
346
+ length: field.length,
347
+ precision: field.precision,
348
+ scale: field.scale,
349
+ comment: field.comment,
350
+ };
351
+ }
352
+ /**
353
+ * Check if two columns differ enough to require alteration
354
+ */
355
+ columnsNeedAlteration(current, desired) {
356
+ // Compare relevant properties
357
+ return (current.type.toLowerCase() !== desired.type.toLowerCase() ||
358
+ current.nullable !== desired.nullable ||
359
+ current.isUnique !== desired.isUnique ||
360
+ JSON.stringify(current.defaultValue) !== JSON.stringify(desired.defaultValue));
361
+ }
362
+ }
363
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZW1hR2VuZXJhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21pZ3JhdGUvc2NoZW1hR2VuZXJhdG9yLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN0RCxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFjN0MsT0FBTyxFQUFFLFdBQVcsRUFBRSxPQUFPLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUV4RDs7R0FFRztBQUNILE1BQU0sT0FBZ0IsdUJBQXdCLFNBQVEsZUFBZTtJQVE5QztJQUZyQixZQUNFLGNBQStCLEVBQ1osZUFBMEIsR0FBRztRQUVoRCxLQUFLLENBQUMsY0FBYyxDQUFDLENBQUM7UUFGSCxpQkFBWSxHQUFaLFlBQVksQ0FBaUI7SUFHbEQsQ0FBQztJQUVEOztPQUVHO0lBQ08sUUFBUSxDQUFDLFVBQWtCO1FBQ25DLE9BQU8sV0FBVyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDcEQsQ0FBQztJQUVELG1CQUFtQixDQUFJLE1BQWUsRUFBRSxVQUFxQyxFQUFFO1FBQzdFLE1BQU0sSUFBSSxHQUFHLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUM3QixNQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQ3RELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNyRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsd0JBQXdCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFFeEQsTUFBTSxXQUFXLEdBQUcsT0FBTyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztRQUNoRSxJQUFJLEdBQUcsR0FBRyxnQkFBZ0Is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cUIsRUFBRSxPQUFxQjtRQUMxRSw4QkFBOEI7UUFDOUIsT0FBTyxDQUNMLE9BQU8sQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDekQsT0FBTyxDQUFDLFFBQVEsS0FBSyxPQUFPLENBQUMsUUFBUTtZQUNyQyxPQUFPLENBQUMsUUFBUSxLQUFLLE9BQU8sQ0FBQyxRQUFRO1lBQ3JDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFlBQVksQ0FBQyxDQUM5RSxDQUFDO0lBQ0osQ0FBQztDQUNGIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQWJzdHJhY3REaWFsZWN0IH0gZnJvbSAnLi4vZGlhbGVjdC9pbmRleC5qcyc7XG5pbXBvcnQgeyBnZXRNZXRhIH0gZnJvbSAnLi4vZW50aXR5L2luZGV4LmpzJztcbmltcG9ydCB0eXBlIHtcbiAgQ29sdW1uU2NoZW1hLFxuICBDb2x1bW5UeXBlLFxuICBFbnRpdHlNZXRhLFxuICBGaWVsZEtleSxcbiAgRmllbGRPcHRpb25zLFxuICBJbmRleFNjaGVtYSxcbiAgTmFtaW5nU3RyYXRlZ3ksXG4gIFNjaGVtYURpZmYsXG4gIFNjaGVtYUdlbmVyYXRvcixcbiAgVGFibGVTY2hlbWEsXG4gIFR5cGUsXG59IGZyb20gJy4uL3R5cGUvaW5kZXguanMnO1xuaW1wb3J0IHsgZXNjYXBlU3FsSWQsIGdldEtleXMgfSBmcm9tICcuLi91dGlsL2luZGV4LmpzJztcblxuLyoqXG4gKiBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBTUUwgc2NoZW1hIGdlbmVyYXRpb25cbiAqL1xuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEFic3RyYWN0U2NoZW1hR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3REaWFsZWN0IGltcGxlbWVudHMgU2NoZW1hR2VuZXJhdG9yIHtcbiAgLyoqXG4gICAqIFByaW1hcnkga2V5IHR5cGUgZm9yIGF1dG8taW5jcmVtZW50IGludGVnZXIgSURzXG4gICAqL1xuICBwcm90ZWN0ZWQgYWJzdHJhY3QgcmVhZG9ubHkgc2VyaWFsUHJpbWFyeUtleVR5cGU6IHN0cmluZztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBuYW1pbmdTdHJhdGVneT86IE5hbWluZ1N0cmF0ZWd5LFxuICAgIHByb3RlY3RlZCByZWFkb25seSBlc2NhcGVJZENoYXI6ICdgJyB8ICdcIicgPSAnYCcsXG4gICkge1xuICAgIHN1cGVyKG5hbWluZ1N0cmF0ZWd5KTtcbiAgfVxuXG4gIC8qKlxuICAgKiBFc2NhcGUgYW4gaWRlbnRpZmllciAodGFibGUgbmFtZSwgY29sdW1uIG5hbWUsIGV0Yy4pXG4gICAqL1xuICBwcm90ZWN0ZWQgZXNjYXBlSWQoaWRlbnRpZmllcjogc3RyaW5nKTogc3RyaW5nIHtcbiAgICByZXR1cm4gZXNjYXBlU3FsSWQoaWRlbnRpZmllciwgdGhpcy5lc2NhcGVJZENoYXIpO1xuICB9XG5cbiAgZ2VuZXJhdGVDcmVhdGVUYWJsZTxFPihlbnRpdHk6IFR5cGU8RT4sIG9wdGlvbnM6IHsgaWZOb3RFeGlzdHM/OiBib29sZWFuIH0gPSB7fSk6IHN0cmluZyB7XG4gICAgY29uc3QgbWV0YSA9IGdldE1ldGEoZW50aXR5KTtcbiAgICBjb25zdCB0YWJsZU5hbWUgPSB0aGlzLnJlc29sdmVUYWJsZU5hbWUoZW50aXR5LCBtZXRhKTtcbiAgICBjb25zdCBjb2x1bW5zID0gdGhpcy5nZW5lcmF0ZUNvbHVtbkRlZmluaXRpb25zKG1ldGEpO1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzID0gdGhpcy5nZW5lcmF0ZVRhYmxlQ29uc3RyYWludHMobWV0YSk7XG5cbiAgICBjb25zdCBpZk5vdEV4aXN0cyA9IG9wdGlvbnMuaWZOb3RFeGlzdHMgPyAnSUYgTk9UIEVYSVNUUyAnIDogJyc7XG4gICAgbGV0IHNxbCA9IGBDUkVBVEUgVEFCTEUgJHtpZk5vdEV4aXN0c30ke3RoaXMuZXNjYXBlSWQodGFibGVOYW1lKX0gKFxcbmA7XG4gICAgc3FsICs9IGNvbHVtbnMubWFwKChjb2wpID0+IGAgICR7Y29sfWApLmpvaW4oJyxcXG4nKTtcblxuICAgIGlmIChjb25zdHJhaW50cy5sZW5ndGggPiAwKSB7XG4gICAgICBzcWwgKz0gJyxcXG4nO1xuICAgICAgc3FsICs9IGNvbnN0cmFpbnRzLm1hcCgoYzogYW55KSA9PiBgICAke2N9YCkuam9pbignLFxcbicpO1xuICAgIH1cblxuICAgIHNxbCArPSAnXFxuKSc7XG4gICAgc3FsICs9IHRoaXMuZ2V0VGFibGVPcHRpb25zKG1ldGEpO1xuICAgIHNxbCArPSAnOyc7XG5cbiAgICByZXR1cm4gc3FsO1xuICB9XG5cbiAgZ2VuZXJhdGVEcm9wVGFibGU8RT4oZW50aXR5OiBUeXBlPEU+KTogc3RyaW5nIHtcbiAgICBjb25zdCBtZXRhID0gZ2V0TWV0YShlbnRpdHkpO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMucmVzb2x2ZVRhYmxlTmFtZShlbnRpdHksIG1ldGEpO1xuICAgIHJldHVybiBgRFJPUCBUQUJMRSBJRiBFWElTVFMgJHt0aGlzLmVzY2FwZUlkKHRhYmxlTmFtZSl9O2A7XG4gIH1cblxuICBnZW5lcmF0ZUFsdGVyVGFibGUoZGlmZjogU2NoZW1hRGlmZik6IHN0cmluZ1tdIHtcbiAgICBjb25zdCBzdGF0ZW1lbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IHRhYmxlTmFtZSA9IHRoaXMuZXNjYXBlSWQoZGlmZi50YWJsZU5hbWUpO1xuXG4gICAgLy8gQWRkIG5ldyBjb2x1bW5zXG4gICAgaWYgKGRpZmYuY29sdW1uc1RvQWRkPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGRpZmYuY29sdW1uc1RvQWRkKSB7XG4gICAgICAgIGNvbnN0IGNvbERlZiA9IHRoaXMuZ2VuZXJhdGVDb2x1bW5EZWZpbml0aW9uRnJvbVNjaGVtYShjb2x1bW4pO1xuICAgICAgICBzdGF0ZW1lbnRzLnB1c2goYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBREQgQ09MVU1OICR7Y29sRGVmfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBbHRlciBleGlzdGluZyBjb2x1bW5zXG4gICAgaWYgKGRpZmYuY29sdW1uc1RvQWx0ZXI/Lmxlbmd0aCkge1xuICAgICAgZm9yIChjb25zdCB7IHRvIH0gb2YgZGlmZi5jb2x1bW5zVG9BbHRlcikge1xuICAgICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmdlbmVyYXRlQ29sdW1uRGVmaW5pdGlvbkZyb21TY2hlbWEodG8pO1xuICAgICAgICBjb25zdCBjb2xTdGF0ZW1lbnRzID0gdGhpcy5nZW5lcmF0ZUFsdGVyQ29sdW1uU3RhdGVtZW50cyhkaWZmLnRhYmxlTmFtZSwgdG8sIGNvbERlZik7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaCguLi5jb2xTdGF0ZW1lbnRzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcm9wIGNvbHVtbnNcbiAgICBpZiAoZGlmZi5jb2x1bW5zVG9Ecm9wPy5sZW5ndGgpIHtcbiAgICAgIGZvciAoY29uc3QgY29sdW1uTmFtZSBvZiBkaWZmLmNvbHVtbnNUb0Ryb3ApIHtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoKGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gRFJPUCBDT0xVTU4gJHt0aGlzLmVzY2FwZUlkKGNvbHVtbk5hbWUpfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBBZGQgaW5kZXhlc1xuICAgIGlmIChkaWZmLmluZGV4ZXNUb0FkZD8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4IG9mIGRpZmYuaW5kZXhlc1RvQWRkKSB7XG4gICAgICAgIHN0YXRlbWVudHMucHVzaCh0aGlzLmdlbmVyYXRlQ3JlYXRlSW5kZXgoZGlmZi50YWJsZU5hbWUsIGluZGV4KSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gRHJvcCBpbmRleGVzXG4gICAgaWYgKGRpZmYuaW5kZXhlc1RvRHJvcD8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGluZGV4TmFtZSBvZiBkaWZmLmluZGV4ZXNUb0Ryb3ApIHtcbiAgICAgICAgc3RhdGVtZW50cy5wdXNoKHRoaXMuZ2VuZXJhdGVEcm9wSW5kZXgoZGlmZi50YWJsZU5hbWUsIGluZGV4TmFtZSkpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnRzO1xuICB9XG5cbiAgZ2VuZXJhdGVBbHRlclRhYmxlRG93bihkaWZmOiBTY2hlbWFEaWZmKTogc3RyaW5nW10ge1xuICAgIGNvbnN0IHN0YXRlbWVudHM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5lc2NhcGVJZChkaWZmLnRhYmxlTmFtZSk7XG5cbiAgICAvLyBSb2xsYmFjayBhZGRpdGlvbnMgYnkgZHJvcHBpbmcgY29sdW1uc1xuICAgIGlmIChkaWZmLmNvbHVtbnNUb0FkZD8ubGVuZ3RoKSB7XG4gICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBkaWZmLmNvbHVtbnNUb0FkZCkge1xuICAgICAgICBzdGF0ZW1lbnRzLnB1c2goYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBEUk9QIENPTFVNTiAke3RoaXMuZXNjYXBlSWQoY29sdW1uLm5hbWUpfTtgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbiAgfVxuXG4gIGdlbmVyYXRlQ3JlYXRlSW5kZXgodGFibGVOYW1lOiBzdHJpbmcsIGluZGV4OiBJbmRleFNjaGVtYSk6IHN0cmluZyB7XG4gICAgY29uc3QgdW5pcXVlID0gaW5kZXgudW5pcXVlID8gJ1VOSVFVRSAnIDogJyc7XG4gICAgY29uc3QgY29sdW1ucyA9IGluZGV4LmNvbHVtbnMubWFwKChjOiBhbnkpID0+IHRoaXMuZXNjYXBlSWQoYykpLmpvaW4oJywgJyk7XG4gICAgcmV0dXJuIGBDUkVBVEUgJHt1bmlxdWV9SU5ERVggJHt0aGlzLmVzY2FwZUlkKGluZGV4Lm5hbWUpfSBPTiAke3RoaXMuZXNjYXBlSWQodGFibGVOYW1lKX0gKCR7Y29sdW1uc30pO2A7XG4gIH1cblxuICBnZW5lcmF0ZURyb3BJbmRleCh0YWJsZU5hbWU6IHN0cmluZywgaW5kZXhOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIHJldHVybiBgRFJPUCBJTkRFWCBJRiBFWElTVFMgJHt0aGlzLmVzY2FwZUlkKGluZGV4TmFtZSl9O2A7XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgY29sdW1uIGRlZmluaXRpb25zIGZyb20gZW50aXR5IG1ldGFkYXRhXG4gICAqL1xuICBwdWJsaWMgZ2VuZXJhdGVDb2x1bW5EZWZpbml0aW9uczxFPihtZXRhOiBFbnRpdHlNZXRhPEU+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbHVtbnM6IHN0cmluZ1tdID0gW107XG4gICAgY29uc3QgZmllbGRLZXlzID0gZ2V0S2V5cyhtZXRhLmZpZWxkcykgYXMgRmllbGRLZXk8RT5bXTtcblxuICAgIGZvciAoY29uc3Qga2V5IG9mIGZpZWxkS2V5cykge1xuICAgICAgY29uc3QgZmllbGQgPSBtZXRhLmZpZWxkc1trZXldO1xuICAgICAgaWYgKGZpZWxkPy52aXJ0dWFsKSBjb250aW51ZTsgLy8gU2tpcCB2aXJ0dWFsIGZpZWxkc1xuXG4gICAgICBjb25zdCBjb2xEZWYgPSB0aGlzLmdlbmVyYXRlQ29sdW1uRGVmaW5pdGlvbihrZXkgYXMgc3RyaW5nLCBmaWVsZCwgbWV0YSk7XG4gICAgICBjb2x1bW5zLnB1c2goY29sRGVmKTtcbiAgICB9XG5cbiAgICByZXR1cm4gY29sdW1ucztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBhIHNpbmdsZSBjb2x1bW4gZGVmaW5pdGlvblxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlQ29sdW1uRGVmaW5pdGlvbjxFPihmaWVsZEtleTogc3RyaW5nLCBmaWVsZDogRmllbGRPcHRpb25zLCBtZXRhOiBFbnRpdHlNZXRhPEU+KTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5lc2NhcGVJZCh0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGZpZWxkS2V5LCBmaWVsZCkpO1xuICAgIGNvbnN0IGlzSWQgPSBmaWVsZC5pc0lkID09PSB0cnVlO1xuICAgIGNvbnN0IGlzUHJpbWFyeUtleSA9IGlzSWQgJiYgbWV0YS5pZCA9PT0gZmllbGRLZXk7XG5cbiAgICAvLyBEZXRlcm1pbmUgU1FMIHR5cGVcbiAgICBsZXQgc3FsVHlwZTogc3RyaW5nO1xuICAgIGlmIChpc1ByaW1hcnlLZXkgJiYgZmllbGQuYXV0b0luY3JlbWVudCAhPT0gZmFsc2UgJiYgIWZpZWxkLm9uSW5zZXJ0KSB7XG4gICAgICAvLyBBdXRvLWluY3JlbWVudCBwcmltYXJ5IGtleVxuICAgICAgc3FsVHlwZSA9IHRoaXMuc2VyaWFsUHJpbWFyeUtleVR5cGU7XG4gICAgfSBlbHNlIHtcbiAgICAgIHNxbFR5cGUgPSB0aGlzLmdldFNxbFR5cGUoZmllbGQsIGZpZWxkLnR5cGUpO1xuICAgIH1cblxuICAgIGxldCBkZWZpbml0aW9uID0gYCR7Y29sdW1uTmFtZX0gJHtzcWxUeXBlfWA7XG5cbiAgICAvLyBQUklNQVJZIEtFWSBjb25zdHJhaW50IChmb3Igbm9uLXNlcmlhbCB0eXBlcylcbiAgICBpZiAoaXNQcmltYXJ5S2V5ICYmICFzcWxUeXBlLmluY2x1ZGVzKCdQUklNQVJZIEtFWScpKSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgUFJJTUFSWSBLRVknO1xuICAgIH1cblxuICAgIC8vIE5VTEwvTk9UIE5VTExcbiAgICBpZiAoIWlzUHJpbWFyeUtleSkge1xuICAgICAgY29uc3QgbnVsbGFibGUgPSBmaWVsZC5udWxsYWJsZSA/PyB0cnVlO1xuICAgICAgaWYgKCFudWxsYWJsZSkge1xuICAgICAgICBkZWZpbml0aW9uICs9ICcgTk9UIE5VTEwnO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVOSVFVRSBjb25zdHJhaW50XG4gICAgaWYgKGZpZWxkLnVuaXF1ZSAmJiAhaXNQcmltYXJ5S2V5KSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgVU5JUVVFJztcbiAgICB9XG5cbiAgICAvLyBERUZBVUxUIHZhbHVlXG4gICAgaWYgKGZpZWxkLmRlZmF1bHRWYWx1ZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBkZWZpbml0aW9uICs9IGAgREVGQVVMVCAke3RoaXMuZm9ybWF0RGVmYXVsdFZhbHVlKGZpZWxkLmRlZmF1bHRWYWx1ZSl9YDtcbiAgICB9XG5cbiAgICAvLyBDT01NRU5UIChpZiBzdXBwb3J0ZWQpXG4gICAgaWYgKGZpZWxkLmNvbW1lbnQpIHtcbiAgICAgIGRlZmluaXRpb24gKz0gdGhpcy5nZW5lcmF0ZUNvbHVtbkNvbW1lbnQoXG4gICAgICAgIHRoaXMucmVzb2x2ZVRhYmxlTmFtZShtZXRhLmVudGl0eSwgbWV0YSksXG4gICAgICAgIHRoaXMucmVzb2x2ZUNvbHVtbk5hbWUoZmllbGRLZXksIGZpZWxkKSxcbiAgICAgICAgZmllbGQuY29tbWVudCxcbiAgICAgICk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGRlZmluaXRpb247XG4gIH1cblxuICAvKipcbiAgICogR2VuZXJhdGUgY29sdW1uIGRlZmluaXRpb24gZnJvbSBhIENvbHVtblNjaGVtYSBvYmplY3RcbiAgICovXG4gIHB1YmxpYyBnZW5lcmF0ZUNvbHVtbkRlZmluaXRpb25Gcm9tU2NoZW1hKGNvbHVtbjogQ29sdW1uU2NoZW1hKTogc3RyaW5nIHtcbiAgICBjb25zdCBjb2x1bW5OYW1lID0gdGhpcy5lc2NhcGVJZChjb2x1bW4ubmFtZSk7XG4gICAgbGV0IHR5cGUgPSBjb2x1bW4udHlwZTtcblxuICAgIGlmIChjb2x1bW4ubGVuZ3RoICYmICF0eXBlLmluY2x1ZGVzKCcoJykpIHtcbiAgICAgIHR5cGUgPSBgJHt0eXBlfSgke2NvbHVtbi5sZW5ndGh9KWA7XG4gICAgfSBlbHNlIGlmIChjb2x1bW4ucHJlY2lzaW9uICE9PSB1bmRlZmluZWQgJiYgIXR5cGUuaW5jbHVkZXMoJygnKSkge1xuICAgICAgaWYgKGNvbHVtbi5zY2FsZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIHR5cGUgPSBgJHt0eXBlfSgke2NvbHVtbi5wcmVjaXNpb259LCAke2NvbHVtbi5zY2FsZX0pYDtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHR5cGUgPSBgJHt0eXBlfSgke2NvbHVtbi5wcmVjaXNpb259KWA7XG4gICAgICB9XG4gICAgfVxuXG4gICAgbGV0IGRlZmluaXRpb24gPSBgJHtjb2x1bW5OYW1lfSAke3R5cGV9YDtcblxuICAgIGlmIChjb2x1bW4uaXNQcmltYXJ5S2V5KSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgUFJJTUFSWSBLRVknO1xuICAgIH1cblxuICAgIGlmICghY29sdW1uLm51bGxhYmxlICYmICFjb2x1bW4uaXNQcmltYXJ5S2V5KSB7XG4gICAgICBkZWZpbml0aW9uICs9ICcgTk9UIE5VTEwnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW4uaXNVbmlxdWUgJiYgIWNvbHVtbi5pc1ByaW1hcnlLZXkpIHtcbiAgICAgIGRlZmluaXRpb24gKz0gJyBVTklRVUUnO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW4uZGVmYXVsdFZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgIGRlZmluaXRpb24gKz0gYCBERUZBVUxUICR7dGhpcy5mb3JtYXREZWZhdWx0VmFsdWUoY29sdW1uLmRlZmF1bHRWYWx1ZSl9YDtcbiAgICB9XG5cbiAgICByZXR1cm4gZGVmaW5pdGlvbjtcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSB0YWJsZSBjb25zdHJhaW50cyAoaW5kZXhlcywgZm9yZWlnbiBrZXlzLCBldGMuKVxuICAgKi9cbiAgcHVibGljIGdlbmVyYXRlVGFibGVDb25zdHJhaW50czxFPihtZXRhOiBFbnRpdHlNZXRhPEU+KTogc3RyaW5nW10ge1xuICAgIGNvbnN0IGNvbnN0cmFpbnRzOiBzdHJpbmdbXSA9IFtdO1xuICAgIGNvbnN0IGZpZWxkS2V5cyA9IGdldEtleXMobWV0YS5maWVsZHMpIGFzIEZpZWxkS2V5PEU+W107XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGhpcy5yZXNvbHZlVGFibGVOYW1lKG1ldGEuZW50aXR5LCBtZXRhKTtcblxuICAgIC8vIEdlbmVyYXRlIGluZGV4ZXMgZnJvbSBmaWVsZCBvcHRpb25zXG4gICAgZm9yIChjb25zdCBrZXkgb2YgZmllbGRLZXlzKSB7XG4gICAgICBjb25zdCBmaWVsZCA9IG1ldGEuZmllbGRzW2tleV07XG4gICAgICBpZiAoZmllbGQ/LmluZGV4KSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGtleSBhcyBzdHJpbmcsIGZpZWxkKTtcbiAgICAgICAgY29uc3QgaW5kZXhOYW1lID0gdHlwZW9mIGZpZWxkLmluZGV4ID09PSAnc3RyaW5nJyA/IGZpZWxkLmluZGV4IDogYGlkeF8ke3RhYmxlTmFtZX1fJHtjb2x1bW5OYW1lfWA7XG4gICAgICAgIGNvbnN0cmFpbnRzLnB1c2goYElOREVYICR7dGhpcy5lc2NhcGVJZChpbmRleE5hbWUpfSAoJHt0aGlzLmVzY2FwZUlkKGNvbHVtbk5hbWUpfSlgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZW5lcmF0ZSBmb3JlaWduIGtleSBjb25zdHJhaW50cyBmcm9tIHJlZmVyZW5jZXNcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZEtleXMpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcbiAgICAgIGlmIChmaWVsZD8ucmVmZXJlbmNlKSB7XG4gICAgICAgIGNvbnN0IHJlZkVudGl0eSA9IGZpZWxkLnJlZmVyZW5jZSgpO1xuICAgICAgICBjb25zdCByZWZNZXRhID0gZ2V0TWV0YShyZWZFbnRpdHkpO1xuICAgICAgICBjb25zdCByZWZJZEZpZWxkID0gcmVmTWV0YS5maWVsZHNbcmVmTWV0YS5pZF07XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGtleSBhcyBzdHJpbmcsIGZpZWxkKTtcbiAgICAgICAgY29uc3QgcmVmVGFibGVOYW1lID0gdGhpcy5yZXNvbHZlVGFibGVOYW1lKHJlZkVudGl0eSwgcmVmTWV0YSk7XG4gICAgICAgIGNvbnN0IHJlZkNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKHJlZk1ldGEuaWQsIHJlZklkRmllbGQpO1xuICAgICAgICBjb25zdCBma05hbWUgPSBgZmtfJHt0YWJsZU5hbWV9XyR7Y29sdW1uTmFtZX1gO1xuXG4gICAgICAgIGNvbnN0cmFpbnRzLnB1c2goXG4gICAgICAgICAgYENPTlNUUkFJTlQgJHt0aGlzLmVzY2FwZUlkKGZrTmFtZSl9IEZPUkVJR04gS0VZICgke3RoaXMuZXNjYXBlSWQoY29sdW1uTmFtZSl9KSBgICtcbiAgICAgICAgICAgIGBSRUZFUkVOQ0VTICR7dGhpcy5lc2NhcGVJZChyZWZUYWJsZU5hbWUpfSAoJHt0aGlzLmVzY2FwZUlkKHJlZkNvbHVtbk5hbWUpfSlgLFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjb25zdHJhaW50cztcbiAgfVxuXG4gIGdldFNxbFR5cGUoZmllbGQ6IEZpZWxkT3B0aW9ucywgZmllbGRUeXBlPzogdW5rbm93bik6IHN0cmluZyB7XG4gICAgLy8gVXNlIGV4cGxpY2l0IGNvbHVtbiB0eXBlIGlmIHNwZWNpZmllZFxuICAgIGlmIChmaWVsZC5jb2x1bW5UeXBlKSB7XG4gICAgICByZXR1cm4gdGhpcy5tYXBDb2x1bW5UeXBlKGZpZWxkLmNvbHVtblR5cGUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICAvLyBIYW5kbGUgc3BlY2lhbCB0eXBlc1xuICAgIGlmIChmaWVsZC50eXBlID09PSAnanNvbicgfHwgZmllbGQudHlwZSA9PT0gJ2pzb25iJykge1xuICAgICAgcmV0dXJuIHRoaXMubWFwQ29sdW1uVHlwZShmaWVsZC50eXBlIGFzIENvbHVtblR5cGUsIGZpZWxkKTtcbiAgICB9XG5cbiAgICBpZiAoZmllbGQudHlwZSA9PT0gJ3ZlY3RvcicpIHtcbiAgICAgIHJldHVybiB0aGlzLm1hcENvbHVtblR5cGUoJ3ZlY3RvcicsIGZpZWxkKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciBmcm9tIFR5cGVTY3JpcHQgdHlwZVxuICAgIGNvbnN0IHR5cGUgPSBmaWVsZFR5cGUgPz8gZmllbGQudHlwZTtcblxuICAgIGlmICh0eXBlID09PSBOdW1iZXIgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgIHJldHVybiBmaWVsZC5wcmVjaXNpb24gPyB0aGlzLm1hcENvbHVtblR5cGUoJ2RlY2ltYWwnLCBmaWVsZCkgOiAnQklHSU5UJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gU3RyaW5nIHx8IHR5cGUgPT09ICdzdHJpbmcnKSB7XG4gICAgICBjb25zdCBsZW5ndGggPSBmaWVsZC5sZW5ndGggPz8gMjU1O1xuICAgICAgcmV0dXJuIGBWQVJDSEFSKCR7bGVuZ3RofSlgO1xuICAgIH1cblxuICAgIGlmICh0eXBlID09PSBCb29sZWFuIHx8IHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgcmV0dXJuIHRoaXMuZ2V0Qm9vbGVhblR5cGUoKTtcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gRGF0ZSB8fCB0eXBlID09PSAnZGF0ZScpIHtcbiAgICAgIHJldHVybiAnVElNRVNUQU1QJztcbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gQmlnSW50IHx8IHR5cGUgPT09ICdiaWdpbnQnKSB7XG4gICAgICByZXR1cm4gJ0JJR0lOVCc7XG4gICAgfVxuXG4gICAgLy8gRGVmYXVsdCB0byBWQVJDSEFSXG4gICAgcmV0dXJuIGBWQVJDSEFSKCR7ZmllbGQubGVuZ3RoID8/IDI1NX0pYDtcbiAgfVxuXG4gIC8qKlxuICAgKiBNYXAgdXFsIGNvbHVtbiB0eXBlIHRvIGRhdGFiYXNlLXNwZWNpZmljIFNRTCB0eXBlXG4gICAqL1xuICBwdWJsaWMgYWJzdHJhY3QgbWFwQ29sdW1uVHlwZShjb2x1bW5UeXBlOiBDb2x1bW5UeXBlLCBmaWVsZDogRmllbGRPcHRpb25zKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBHZXQgdGhlIGJvb2xlYW4gdHlwZSBmb3IgdGhpcyBkYXRhYmFzZVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGdldEJvb2xlYW5UeXBlKCk6IHN0cmluZztcblxuICAvKipcbiAgICogR2VuZXJhdGUgQUxURVIgQ09MVU1OIHN0YXRlbWVudHMgKGRhdGFiYXNlLXNwZWNpZmljKVxuICAgKi9cbiAgcHVibGljIGFic3RyYWN0IGdlbmVyYXRlQWx0ZXJDb2x1bW5TdGF0ZW1lbnRzKFxuICAgIHRhYmxlTmFtZTogc3RyaW5nLFxuICAgIGNvbHVtbjogQ29sdW1uU2NoZW1hLFxuICAgIG5ld0RlZmluaXRpb246IHN0cmluZyxcbiAgKTogc3RyaW5nW107XG5cbiAgLyoqXG4gICAqIEdldCB0YWJsZSBvcHRpb25zIChlLmcuLCBFTkdJTkUgZm9yIE15U1FMKVxuICAgKi9cbiAgZ2V0VGFibGVPcHRpb25zPEU+KG1ldGE6IEVudGl0eU1ldGE8RT4pOiBzdHJpbmcge1xuICAgIHJldHVybiAnJztcbiAgfVxuXG4gIC8qKlxuICAgKiBHZW5lcmF0ZSBjb2x1bW4gY29tbWVudCBjbGF1c2UgKGlmIHN1cHBvcnRlZClcbiAgICovXG4gIHB1YmxpYyBhYnN0cmFjdCBnZW5lcmF0ZUNvbHVtbkNvbW1lbnQodGFibGVOYW1lOiBzdHJpbmcsIGNvbHVtbk5hbWU6IHN0cmluZywgY29tbWVudDogc3RyaW5nKTogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBGb3JtYXQgYSBkZWZhdWx0IHZhbHVlIGZvciBTUUxcbiAgICovXG4gIHB1YmxpYyBmb3JtYXREZWZhdWx0VmFsdWUodmFsdWU6IHVua25vd24pOiBzdHJpbmcge1xuICAgIGlmICh2YWx1ZSA9PT0gbnVsbCkge1xuICAgICAgcmV0dXJuICdOVUxMJztcbiAgICB9XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHJldHVybiBgJyR7dmFsdWUucmVwbGFjZSgvJy9nLCBcIicnXCIpfSdgO1xuICAgIH1cbiAgICBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgIHJldHVybiB2YWx1ZSA/ICdUUlVFJyA6ICdGQUxTRSc7XG4gICAgfVxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ2JpZ2ludCcpIHtcbiAgICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICAgIH1cbiAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBEYXRlKSB7XG4gICAgICByZXR1cm4gYCcke3ZhbHVlLnRvSVNPU3RyaW5nKCl9J2A7XG4gICAgfVxuICAgIHJldHVybiBTdHJpbmcodmFsdWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIENvbXBhcmUgdHdvIHNjaGVtYXMgYW5kIHJldHVybiB0aGUgZGlmZmVyZW5jZXNcbiAgICovXG4gIGRpZmZTY2hlbWE8RT4oZW50aXR5OiBUeXBlPEU+LCBjdXJyZW50U2NoZW1hOiBUYWJsZVNjaGVtYSB8IHVuZGVmaW5lZCk6IFNjaGVtYURpZmYgfCB1bmRlZmluZWQge1xuICAgIGNvbnN0IG1ldGEgPSBnZXRNZXRhKGVudGl0eSk7XG5cbiAgICBpZiAoIWN1cnJlbnRTY2hlbWEpIHtcbiAgICAgIC8vIFRhYmxlIGRvZXNuJ3QgZXhpc3QsIG5lZWQgdG8gY3JlYXRlXG4gICAgICByZXR1cm4ge1xuICAgICAgICB0YWJsZU5hbWU6IHRoaXMucmVzb2x2ZVRhYmxlTmFtZShlbnRpdHksIG1ldGEpLFxuICAgICAgICB0eXBlOiAnY3JlYXRlJyxcbiAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3QgY29sdW1uc1RvQWRkOiBDb2x1bW5TY2hlbWFbXSA9IFtdO1xuICAgIGNvbnN0IGNvbHVtbnNUb0FsdGVyOiB7IGZyb206IENvbHVtblNjaGVtYTsgdG86IENvbHVtblNjaGVtYSB9W10gPSBbXTtcbiAgICBjb25zdCBjb2x1bW5zVG9Ecm9wOiBzdHJpbmdbXSA9IFtdO1xuXG4gICAgY29uc3QgY3VycmVudENvbHVtbnMgPSBuZXcgTWFwKGN1cnJlbnRTY2hlbWEuY29sdW1ucy5tYXAoKGM6IGFueSkgPT4gW2MubmFtZSwgY10pKTtcbiAgICBjb25zdCBmaWVsZEtleXMgPSBnZXRLZXlzKG1ldGEuZmllbGRzKSBhcyBGaWVsZEtleTxFPltdO1xuXG4gICAgLy8gQ2hlY2sgZm9yIG5ldyBvciBhbHRlcmVkIGNvbHVtbnNcbiAgICBmb3IgKGNvbnN0IGtleSBvZiBmaWVsZEtleXMpIHtcbiAgICAgIGNvbnN0IGZpZWxkID0gbWV0YS5maWVsZHNba2V5XTtcbiAgICAgIGlmIChmaWVsZD8udmlydHVhbCkgY29udGludWU7XG5cbiAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSB0aGlzLnJlc29sdmVDb2x1bW5OYW1lKGtleSBhcyBzdHJpbmcsIGZpZWxkKTtcbiAgICAgIGNvbnN0IGN1cnJlbnRDb2x1bW4gPSBjdXJyZW50Q29sdW1ucy5nZXQoY29sdW1uTmFtZSk7XG5cbiAgICAgIGlmICghY3VycmVudENvbHVtbikge1xuICAgICAgICAvLyBDb2x1bW4gbmVlZHMgdG8gYmUgYWRkZWRcbiAgICAgICAgY29sdW1uc1RvQWRkLnB1c2godGhpcy5maWVsZFRvQ29sdW1uU2NoZW1hKGtleSBhcyBzdHJpbmcsIGZpZWxkLCBtZXRhKSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBDaGVjayBpZiBjb2x1bW4gbmVlZHMgYWx0ZXJhdGlvblxuICAgICAgICBjb25zdCBkZXNpcmVkQ29sdW1uID0gdGhpcy5maWVsZFRvQ29sdW1uU2NoZW1hKGtleSBhcyBzdHJpbmcsIGZpZWxkLCBtZXRhKTtcbiAgICAgICAgaWYgKHRoaXMuY29sdW1uc05lZWRBbHRlcmF0aW9uKGN1cnJlbnRDb2x1bW4sIGRlc2lyZWRDb2x1bW4pKSB7XG4gICAgICAgICAgY29sdW1uc1RvQWx0ZXIucHVzaCh7IGZyb206IGN1cnJlbnRDb2x1bW4sIHRvOiBkZXNpcmVkQ29sdW1uIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBjdXJyZW50Q29sdW1ucy5kZWxldGUoY29sdW1uTmFtZSk7XG4gICAgfVxuXG4gICAgLy8gUmVtYWluaW5nIGNvbHVtbnMgaW4gY3VycmVudENvbHVtbnMgc2hvdWxkIGJlIGRyb3BwZWRcbiAgICBmb3IgKGNvbnN0IFtuYW1lXSBvZiBjdXJyZW50Q29sdW1ucykge1xuICAgICAgY29sdW1uc1RvRHJvcC5wdXNoKG5hbWUpO1xuICAgIH1cblxuICAgIGlmIChjb2x1bW5zVG9BZGQubGVuZ3RoID09PSAwICYmIGNvbHVtbnNUb0FsdGVyLmxlbmd0aCA9PT0gMCAmJiBjb2x1bW5zVG9Ecm9wLmxlbmd0aCA9PT0gMCkge1xuICAgICAgcmV0dXJuIHVuZGVmaW5lZDsgLy8gTm8gY2hhbmdlcyBuZWVkZWRcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgdGFibGVOYW1lOiB0aGlzLnJlc29sdmVUYWJsZU5hbWUoZW50aXR5LCBtZXRhKSxcbiAgICAgIHR5cGU6ICdhbHRlcicsXG4gICAgICBjb2x1bW5zVG9BZGQ6IGNvbHVtbnNUb0FkZC5sZW5ndGggPiAwID8gY29sdW1uc1RvQWRkIDogdW5kZWZpbmVkLFxuICAgICAgY29sdW1uc1RvQWx0ZXI6IGNvbHVtbnNUb0FsdGVyLmxlbmd0aCA+IDAgPyBjb2x1bW5zVG9BbHRlciA6IHVuZGVmaW5lZCxcbiAgICAgIGNvbHVtbnNUb0Ryb3A6IGNvbHVtbnNUb0Ryb3AubGVuZ3RoID4gMCA/IGNvbHVtbnNUb0Ryb3AgOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb252ZXJ0IGZpZWxkIG9wdGlvbnMgdG8gQ29sdW1uU2NoZW1hXG4gICAqL1xuICBwcm90ZWN0ZWQgZmllbGRUb0NvbHVtblNjaGVtYTxFPihmaWVsZEtleTogc3RyaW5nLCBmaWVsZDogRmllbGRPcHRpb25zLCBtZXRhOiBFbnRpdHlNZXRhPEU+KTogQ29sdW1uU2NoZW1hIHtcbiAgICBjb25zdCBpc0lkID0gZmllbGQuaXNJZCA9PT0gdHJ1ZTtcbiAgICBjb25zdCBpc1ByaW1hcnlLZXkgPSBpc0lkICYmIG1ldGEuaWQgPT09IGZpZWxkS2V5O1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIG5hbWU6IHRoaXMucmVzb2x2ZUNvbHVtbk5hbWUoZmllbGRLZXksIGZpZWxkKSxcbiAgICAgIHR5cGU6IHRoaXMuZ2V0U3FsVHlwZShmaWVsZCwgZmllbGQudHlwZSksXG4gICAgICBudWxsYWJsZTogZmllbGQubnVsbGFibGUgPz8gIWlzUHJpbWFyeUtleSxcbiAgICAgIGRlZmF1bHRWYWx1ZTogZmllbGQuZGVmYXVsdFZhbHVlLFxuICAgICAgaXNQcmltYXJ5S2V5LFxuICAgICAgaXNBdXRvSW5jcmVtZW50OiBpc1ByaW1hcnlLZXkgJiYgZmllbGQuYXV0b0luY3JlbWVudCAhPT0gZmFsc2UgJiYgIWZpZWxkLm9uSW5zZXJ0LFxuICAgICAgaXNVbmlxdWU6IGZpZWxkLnVuaXF1ZSA/PyBmYWxzZSxcbiAgICAgIGxlbmd0aDogZmllbGQubGVuZ3RoLFxuICAgICAgcHJlY2lzaW9uOiBmaWVsZC5wcmVjaXNpb24sXG4gICAgICBzY2FsZTogZmllbGQuc2NhbGUsXG4gICAgICBjb21tZW50OiBmaWVsZC5jb21tZW50LFxuICAgIH07XG4gIH1cblxuICAvKipcbiAgICogQ2hlY2sgaWYgdHdvIGNvbHVtbnMgZGlmZmVyIGVub3VnaCB0byByZXF1aXJlIGFsdGVyYXRpb25cbiAgICovXG4gIHByb3RlY3RlZCBjb2x1bW5zTmVlZEFsdGVyYXRpb24oY3VycmVudDogQ29sdW1uU2NoZW1hLCBkZXNpcmVkOiBDb2x1bW5TY2hlbWEpOiBib29sZWFuIHtcbiAgICAvLyBDb21wYXJlIHJlbGV2YW50IHByb3BlcnRpZXNcbiAgICByZXR1cm4gKFxuICAgICAgY3VycmVudC50eXBlLnRvTG93ZXJDYXNlKCkgIT09IGRlc2lyZWQudHlwZS50b0xvd2VyQ2FzZSgpIHx8XG4gICAgICBjdXJyZW50Lm51bGxhYmxlICE9PSBkZXNpcmVkLm51bGxhYmxlIHx8XG4gICAgICBjdXJyZW50LmlzVW5pcXVlICE9PSBkZXNpcmVkLmlzVW5pcXVlIHx8XG4gICAgICBKU09OLnN0cmluZ2lmeShjdXJyZW50LmRlZmF1bHRWYWx1ZSkgIT09IEpTT04uc3RyaW5naWZ5KGRlc2lyZWQuZGVmYXVsdFZhbHVlKVxuICAgICk7XG4gIH1cbn1cbiJdfQ==