obsidian-dev-utils 85.0.0 → 86.0.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 (275) hide show
  1. package/@types/obsidian-integration-testing/package.json +4 -0
  2. package/CHANGELOG.md +22 -0
  3. package/README.md +1 -0
  4. package/dist/dev/main.js +9153 -4744
  5. package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +18 -0
  6. package/dist/lib/cjs/__merged.cjs +1291 -0
  7. package/dist/lib/cjs/__merged.d.cts +165 -0
  8. package/dist/lib/cjs/abort-controller.cjs +3 -4
  9. package/dist/lib/cjs/async.cjs +13 -7
  10. package/dist/lib/cjs/async.d.cts +6 -0
  11. package/dist/lib/cjs/disposable.cjs +224 -3
  12. package/dist/lib/cjs/disposable.d.cts +222 -2
  13. package/dist/lib/cjs/error.cjs +41 -3
  14. package/dist/lib/cjs/error.d.cts +50 -1
  15. package/dist/lib/cjs/generated-during-build.cjs +2 -2
  16. package/dist/lib/cjs/index.cjs +4 -1
  17. package/dist/lib/cjs/index.d.cts +1 -0
  18. package/dist/lib/cjs/obsidian/attachment-path.cjs +3 -3
  19. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +27 -11
  20. package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +14 -9
  21. package/dist/lib/cjs/obsidian/command-handlers/index.cjs +4 -1
  22. package/dist/lib/cjs/obsidian/command-handlers/index.d.cts +1 -0
  23. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +195 -0
  24. package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.d.cts +65 -0
  25. package/dist/lib/cjs/obsidian/community-plugins.cjs +156 -0
  26. package/dist/lib/cjs/obsidian/community-plugins.d.cts +22 -0
  27. package/dist/lib/cjs/obsidian/components/disposable-component.cjs +8 -8
  28. package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +9 -3
  29. package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +17 -2
  30. package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +17 -0
  31. package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +161 -22
  32. package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +81 -8
  33. package/dist/lib/cjs/obsidian/css-class.cjs +4 -1
  34. package/dist/lib/cjs/obsidian/css-class.d.cts +13 -0
  35. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +239 -0
  36. package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +45 -0
  37. package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +215 -0
  38. package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +135 -0
  39. package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +3 -1
  40. package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +2 -0
  41. package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +2 -0
  42. package/dist/lib/cjs/obsidian/index.cjs +10 -1
  43. package/dist/lib/cjs/obsidian/index.d.cts +3 -0
  44. package/dist/lib/cjs/obsidian/link.cjs +24 -10
  45. package/dist/lib/cjs/obsidian/link.d.cts +16 -0
  46. package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
  47. package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
  48. package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +15 -2
  49. package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +18 -3
  50. package/dist/lib/cjs/obsidian/modals/select-option.cjs +182 -0
  51. package/dist/lib/cjs/obsidian/modals/select-option.d.cts +65 -0
  52. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +4 -1
  53. package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +6 -0
  54. package/dist/lib/cjs/obsidian/plugin/plugin.cjs +50 -3
  55. package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +17 -0
  56. package/dist/lib/cjs/obsidian/workspace.cjs +8 -1
  57. package/dist/lib/cjs/obsidian/workspace.d.cts +10 -0
  58. package/dist/lib/cjs/path.cjs +4 -4
  59. package/dist/lib/cjs/path.d.cts +1 -1
  60. package/dist/lib/cjs/script-utils/demo-vault.cjs +177 -0
  61. package/dist/lib/cjs/script-utils/demo-vault.d.cts +23 -0
  62. package/dist/lib/cjs/script-utils/exec.cjs +27 -5
  63. package/dist/lib/cjs/script-utils/exec.d.cts +20 -0
  64. package/dist/lib/cjs/script-utils/index.cjs +9 -3
  65. package/dist/lib/cjs/script-utils/index.d.cts +2 -0
  66. package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +1 -5
  67. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +2 -1
  68. package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +2 -0
  69. package/dist/lib/cjs/script-utils/version.cjs +8 -1
  70. package/dist/lib/cjs/script-utils/version.d.cts +8 -0
  71. package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +157 -0
  72. package/dist/lib/cjs/script-utils/warnings-as-errors.d.cts +27 -0
  73. package/dist/lib/cjs/setup.cjs +75 -4
  74. package/dist/lib/cjs/setup.d.cts +29 -7
  75. package/dist/lib/cjs/string.cjs +7 -4
  76. package/dist/lib/cjs/string.d.cts +11 -1
  77. package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +18 -0
  78. package/dist/lib/esm/__merged.d.mts +165 -0
  79. package/dist/lib/esm/__merged.mjs +1134 -0
  80. package/dist/lib/esm/abort-controller.mjs +7 -5
  81. package/dist/lib/esm/async.d.mts +6 -0
  82. package/dist/lib/esm/async.mjs +13 -7
  83. package/dist/lib/esm/disposable.d.mts +222 -2
  84. package/dist/lib/esm/disposable.mjs +215 -2
  85. package/dist/lib/esm/error.d.mts +50 -1
  86. package/dist/lib/esm/error.mjs +41 -4
  87. package/dist/lib/esm/generated-during-build.mjs +2 -2
  88. package/dist/lib/esm/index.d.mts +1 -0
  89. package/dist/lib/esm/index.mjs +3 -1
  90. package/dist/lib/esm/obsidian/attachment-path.mjs +4 -4
  91. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +14 -9
  92. package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +31 -11
  93. package/dist/lib/esm/obsidian/command-handlers/index.d.mts +1 -0
  94. package/dist/lib/esm/obsidian/command-handlers/index.mjs +3 -1
  95. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.d.mts +65 -0
  96. package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +77 -0
  97. package/dist/lib/esm/obsidian/community-plugins.d.mts +22 -0
  98. package/dist/lib/esm/obsidian/community-plugins.mjs +48 -0
  99. package/dist/lib/esm/obsidian/components/disposable-component.d.mts +9 -3
  100. package/dist/lib/esm/obsidian/components/disposable-component.mjs +8 -8
  101. package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +17 -0
  102. package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +17 -2
  103. package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +81 -8
  104. package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +163 -23
  105. package/dist/lib/esm/obsidian/css-class.d.mts +13 -0
  106. package/dist/lib/esm/obsidian/css-class.mjs +4 -1
  107. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +45 -0
  108. package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +121 -0
  109. package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +135 -0
  110. package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +103 -0
  111. package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +2 -0
  112. package/dist/lib/esm/obsidian/i18n/locales/en.mjs +3 -1
  113. package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +2 -0
  114. package/dist/lib/esm/obsidian/index.d.mts +3 -0
  115. package/dist/lib/esm/obsidian/index.mjs +7 -1
  116. package/dist/lib/esm/obsidian/link.d.mts +16 -0
  117. package/dist/lib/esm/obsidian/link.mjs +25 -11
  118. package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
  119. package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
  120. package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +18 -3
  121. package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +17 -3
  122. package/dist/lib/esm/obsidian/modals/select-option.d.mts +65 -0
  123. package/dist/lib/esm/obsidian/modals/select-option.mjs +77 -0
  124. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +6 -0
  125. package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +4 -1
  126. package/dist/lib/esm/obsidian/plugin/plugin.d.mts +17 -0
  127. package/dist/lib/esm/obsidian/plugin/plugin.mjs +50 -3
  128. package/dist/lib/esm/obsidian/workspace.d.mts +10 -0
  129. package/dist/lib/esm/obsidian/workspace.mjs +7 -1
  130. package/dist/lib/esm/path.d.mts +1 -1
  131. package/dist/lib/esm/path.mjs +3 -3
  132. package/dist/lib/esm/script-utils/demo-vault.d.mts +23 -0
  133. package/dist/lib/esm/script-utils/demo-vault.mjs +63 -0
  134. package/dist/lib/esm/script-utils/exec.d.mts +20 -0
  135. package/dist/lib/esm/script-utils/exec.mjs +25 -5
  136. package/dist/lib/esm/script-utils/index.d.mts +2 -0
  137. package/dist/lib/esm/script-utils/index.mjs +6 -2
  138. package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +1 -5
  139. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +2 -0
  140. package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +2 -1
  141. package/dist/lib/esm/script-utils/version.d.mts +8 -0
  142. package/dist/lib/esm/script-utils/version.mjs +8 -1
  143. package/dist/lib/esm/script-utils/warnings-as-errors.d.mts +27 -0
  144. package/dist/lib/esm/script-utils/warnings-as-errors.mjs +38 -0
  145. package/dist/lib/esm/setup.d.mts +29 -7
  146. package/dist/lib/esm/setup.mjs +78 -4
  147. package/dist/lib/esm/string.d.mts +11 -1
  148. package/dist/lib/esm/string.mjs +5 -3
  149. package/dist/styles.css +33 -3
  150. package/obsidian/command-handlers/open-demo-vault-command-handler/package.json +6 -0
  151. package/obsidian/community-plugins/package.json +6 -0
  152. package/obsidian/desktop-demo-vault-opener/package.json +6 -0
  153. package/obsidian/desktop-trusted-input/package.json +6 -0
  154. package/obsidian/modals/select-option/package.json +6 -0
  155. package/package.json +9 -10
  156. package/script-utils/demo-vault/package.json +6 -0
  157. package/script-utils/warnings-as-errors/package.json +6 -0
  158. /package/obsidian/@types/{Dataview → dataview}/api/data-array/package.json +0 -0
  159. /package/obsidian/@types/{Dataview → dataview}/api/extensions/package.json +0 -0
  160. /package/obsidian/@types/{Dataview → dataview}/api/inline-api/package.json +0 -0
  161. /package/obsidian/@types/{Dataview → dataview}/api/plugin-api/package.json +0 -0
  162. /package/obsidian/@types/{Dataview → dataview}/api/result/package.json +0 -0
  163. /package/obsidian/@types/{Dataview → dataview}/data-import/common/package.json +0 -0
  164. /package/obsidian/@types/{Dataview → dataview}/data-import/csv/package.json +0 -0
  165. /package/obsidian/@types/{Dataview → dataview}/data-import/inline-field/package.json +0 -0
  166. /package/obsidian/@types/{Dataview → dataview}/data-import/markdown-file/package.json +0 -0
  167. /package/obsidian/@types/{Dataview → dataview}/data-import/persister/package.json +0 -0
  168. /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-entry/package.json +0 -0
  169. /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-impl/package.json +0 -0
  170. /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-manager/package.json +0 -0
  171. /package/obsidian/@types/{Dataview → dataview}/data-index/index/package.json +0 -0
  172. /package/obsidian/@types/{Dataview → dataview}/data-index/package.json +0 -0
  173. /package/obsidian/@types/{Dataview → dataview}/data-index/resolver/package.json +0 -0
  174. /package/obsidian/@types/{Dataview → dataview}/data-index/source/package.json +0 -0
  175. /package/obsidian/@types/{Dataview → dataview}/data-model/markdown/package.json +0 -0
  176. /package/obsidian/@types/{Dataview → dataview}/data-model/serialized/markdown/package.json +0 -0
  177. /package/obsidian/@types/{Dataview → dataview}/data-model/transferable/package.json +0 -0
  178. /package/obsidian/@types/{Dataview → dataview}/data-model/value/package.json +0 -0
  179. /package/obsidian/@types/{Dataview → dataview}/expression/binaryop/package.json +0 -0
  180. /package/obsidian/@types/{Dataview → dataview}/expression/context/package.json +0 -0
  181. /package/obsidian/@types/{Dataview → dataview}/expression/field/package.json +0 -0
  182. /package/obsidian/@types/{Dataview → dataview}/expression/functions/package.json +0 -0
  183. /package/obsidian/@types/{Dataview → dataview}/expression/parse/package.json +0 -0
  184. /package/obsidian/@types/{Dataview → dataview}/index/package.json +0 -0
  185. /package/obsidian/@types/{Dataview → dataview}/main/package.json +0 -0
  186. /package/obsidian/@types/{Dataview → dataview}/package.json +0 -0
  187. /package/obsidian/@types/{Dataview → dataview}/query/engine/package.json +0 -0
  188. /package/obsidian/@types/{Dataview → dataview}/query/parse/package.json +0 -0
  189. /package/obsidian/@types/{Dataview → dataview}/query/query/package.json +0 -0
  190. /package/obsidian/@types/{Dataview → dataview}/settings/package.json +0 -0
  191. /package/obsidian/@types/{Dataview → dataview}/typings/obsidian-ex/package.json +0 -0
  192. /package/obsidian/@types/{Dataview → dataview}/typings/workers/package.json +0 -0
  193. /package/obsidian/@types/{Dataview → dataview}/ui/export/markdown/package.json +0 -0
  194. /package/obsidian/@types/{Dataview → dataview}/ui/lp-render/package.json +0 -0
  195. /package/obsidian/@types/{Dataview → dataview}/ui/markdown/package.json +0 -0
  196. /package/obsidian/@types/{Dataview → dataview}/ui/refreshable-view/package.json +0 -0
  197. /package/obsidian/@types/{Dataview → dataview}/ui/render/package.json +0 -0
  198. /package/obsidian/@types/{Dataview → dataview}/ui/views/calendar-view/package.json +0 -0
  199. /package/obsidian/@types/{Dataview → dataview}/ui/views/inline-field-live-preview/package.json +0 -0
  200. /package/obsidian/@types/{Dataview → dataview}/ui/views/inline-view/package.json +0 -0
  201. /package/obsidian/@types/{Dataview → dataview}/ui/views/js-view/package.json +0 -0
  202. /package/obsidian/@types/{Dataview → dataview}/ui/views/list-view/package.json +0 -0
  203. /package/obsidian/@types/{Dataview → dataview}/ui/views/table-view/package.json +0 -0
  204. /package/obsidian/@types/{Dataview → dataview}/ui/views/task-view/package.json +0 -0
  205. /package/obsidian/@types/{Dataview → dataview}/util/hash/package.json +0 -0
  206. /package/obsidian/@types/{Dataview → dataview}/util/locale/package.json +0 -0
  207. /package/obsidian/@types/{Dataview → dataview}/util/media/package.json +0 -0
  208. /package/obsidian/@types/{Dataview → dataview}/util/normalize/package.json +0 -0
  209. /package/obsidian/{App → app}/package.json +0 -0
  210. /package/obsidian/{Backlink → backlink}/package.json +0 -0
  211. /package/obsidian/{Callout → callout}/package.json +0 -0
  212. /package/obsidian/{Components → components}/abort-signal-component/package.json +0 -0
  213. /package/obsidian/{Components → components}/all-windows-event-component/package.json +0 -0
  214. /package/obsidian/{Components → components}/async-error-handler-component/package.json +0 -0
  215. /package/obsidian/{Components → components}/async-events-component/package.json +0 -0
  216. /package/obsidian/{Components → components}/case-insensitive-file-index-component/package.json +0 -0
  217. /package/obsidian/{Components → components}/component-ex/package.json +0 -0
  218. /package/obsidian/{Components → components}/console-debug-component/package.json +0 -0
  219. /package/obsidian/{Components → components}/disposable-component/package.json +0 -0
  220. /package/obsidian/{Components → components}/embed-extensions-component/package.json +0 -0
  221. /package/obsidian/{Components → components}/generate-markdown-link-default-params-component/package.json +0 -0
  222. /package/obsidian/{Components → components}/index/package.json +0 -0
  223. /package/obsidian/{Components → components}/layout-ready-component/package.json +0 -0
  224. /package/obsidian/{Components → components}/menu-event-registrar-component/package.json +0 -0
  225. /package/obsidian/{Components → components}/monkey-around-component/package.json +0 -0
  226. /package/obsidian/{Components → components}/package.json +0 -0
  227. /package/obsidian/{Components → components}/plugin-context-component/package.json +0 -0
  228. /package/obsidian/{Components → components}/plugin-notice-component/package.json +0 -0
  229. /package/obsidian/{Components → components}/plugin-settings-component/package.json +0 -0
  230. /package/obsidian/{Components → components}/plugin-settings-tab-component/package.json +0 -0
  231. /package/obsidian/{Components → components}/registry-component/package.json +0 -0
  232. /package/obsidian/{Components → components}/rename-delete-handler-component/package.json +0 -0
  233. /package/obsidian/{Dataview → dataview}/package.json +0 -0
  234. /package/obsidian/{Editor → editor}/package.json +0 -0
  235. /package/obsidian/{Frontmatter → frontmatter}/package.json +0 -0
  236. /package/obsidian/{Link → link}/package.json +0 -0
  237. /package/obsidian/{Logger → logger}/package.json +0 -0
  238. /package/obsidian/{Loop → loop}/package.json +0 -0
  239. /package/obsidian/{Markdown → markdown}/package.json +0 -0
  240. /package/obsidian/{Modals/Alert → modals/alert}/package.json +0 -0
  241. /package/obsidian/{Modals/Confirm → modals/confirm}/package.json +0 -0
  242. /package/obsidian/{Modals → modals}/index/package.json +0 -0
  243. /package/obsidian/{Modals → modals}/minimizable-modal/package.json +0 -0
  244. /package/obsidian/{Modals → modals}/modal/package.json +0 -0
  245. /package/obsidian/{Modals → modals}/package.json +0 -0
  246. /package/obsidian/{Modals/Prompt → modals/prompt}/package.json +0 -0
  247. /package/obsidian/{Modals → modals}/select-item/package.json +0 -0
  248. /package/obsidian/{Modals → modals}/suggest-modal-command-builder/package.json +0 -0
  249. /package/obsidian/{Pdf → pdf}/package.json +0 -0
  250. /package/obsidian/{Plugin → plugin}/index/package.json +0 -0
  251. /package/obsidian/{Plugin → plugin}/obsidian-plugin-repo-paths/package.json +0 -0
  252. /package/obsidian/{Plugin → plugin}/package.json +0 -0
  253. /package/obsidian/{Plugin/Plugin → plugin/plugin}/package.json +0 -0
  254. /package/obsidian/{Plugin → plugin}/plugin-context/package.json +0 -0
  255. /package/obsidian/{Plugin → plugin}/plugin-event-source/package.json +0 -0
  256. /package/obsidian/{Plugin → plugin}/plugin-settings-tab/package.json +0 -0
  257. /package/obsidian/{Queue → queue}/package.json +0 -0
  258. /package/obsidian/{React → react}/app-context/package.json +0 -0
  259. /package/obsidian/{React → react}/index/package.json +0 -0
  260. /package/obsidian/{React → react}/package.json +0 -0
  261. /package/obsidian/{Reference → reference}/package.json +0 -0
  262. /package/obsidian/{Validation → validation}/package.json +0 -0
  263. /package/obsidian/{Vault → vault}/package.json +0 -0
  264. /package/obsidian/{Workspace → workspace}/package.json +0 -0
  265. /package/{Transformers → transformers}/date-transformer/package.json +0 -0
  266. /package/{Transformers → transformers}/duration-transformer/package.json +0 -0
  267. /package/{Transformers → transformers}/group-transformer/package.json +0 -0
  268. /package/{Transformers → transformers}/index/package.json +0 -0
  269. /package/{Transformers → transformers}/map-transformer/package.json +0 -0
  270. /package/{Transformers → transformers}/package.json +0 -0
  271. /package/{Transformers → transformers}/set-transformer/package.json +0 -0
  272. /package/{Transformers → transformers}/skip-private-property-transformer/package.json +0 -0
  273. /package/{Transformers/Transformer → transformers/transformer}/package.json +0 -0
  274. /package/{Transformers → transformers}/two-way-map-transformer/package.json +0 -0
  275. /package/{Transformers → transformers}/typed-transformer/package.json +0 -0
@@ -127,12 +127,30 @@ var disposable_exports = {};
127
127
  __export(disposable_exports, {
128
128
  AsyncCallbackDisposable: () => AsyncCallbackDisposable,
129
129
  CallbackDisposable: () => CallbackDisposable,
130
+ CombineAsyncDisposable: () => CombineAsyncDisposable,
131
+ CombineDisposable: () => CombineDisposable,
132
+ DisposeErrorBehavior: () => DisposeErrorBehavior,
133
+ DisposeOrder: () => DisposeOrder,
130
134
  MultipleDisposeBehavior: () => MultipleDisposeBehavior,
131
135
  isAsyncDisposable: () => isAsyncDisposable,
132
- isDisposable: () => isDisposable
136
+ isAsyncDisposableEx: () => isAsyncDisposableEx,
137
+ isDisposable: () => isDisposable,
138
+ isDisposableEx: () => isDisposableEx,
139
+ toAsyncDisposableEx: () => toAsyncDisposableEx,
140
+ toDisposableEx: () => toDisposableEx
133
141
  });
134
142
  module.exports = __toCommonJS(disposable_exports);
135
143
  var import_type_guards = require('./type-guards.cjs');
144
+ var DisposeErrorBehavior = /* @__PURE__ */ ((DisposeErrorBehavior2) => {
145
+ DisposeErrorBehavior2[DisposeErrorBehavior2["Aggregate"] = 0] = "Aggregate";
146
+ DisposeErrorBehavior2[DisposeErrorBehavior2["FailFast"] = 1] = "FailFast";
147
+ return DisposeErrorBehavior2;
148
+ })(DisposeErrorBehavior || {});
149
+ var DisposeOrder = /* @__PURE__ */ ((DisposeOrder2) => {
150
+ DisposeOrder2[DisposeOrder2["Lifo"] = 0] = "Lifo";
151
+ DisposeOrder2[DisposeOrder2["Fifo"] = 1] = "Fifo";
152
+ return DisposeOrder2;
153
+ })(DisposeOrder || {});
136
154
  var MultipleDisposeBehavior = /* @__PURE__ */ ((MultipleDisposeBehavior2) => {
137
155
  MultipleDisposeBehavior2[MultipleDisposeBehavior2["Invoke"] = 0] = "Invoke";
138
156
  MultipleDisposeBehavior2[MultipleDisposeBehavior2["Ignore"] = 1] = "Ignore";
@@ -152,6 +170,15 @@ class AsyncCallbackDisposable {
152
170
  this.callback = params.callback;
153
171
  this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
154
172
  }
173
+ /**
174
+ * Disposes the object by executing the callback. Convenience alias that delegates to
175
+ * `this[Symbol.asyncDispose]()`.
176
+ *
177
+ * @returns A {@link Promise} that resolves once the callback completes.
178
+ */
179
+ asyncDispose() {
180
+ return this[Symbol.asyncDispose]();
181
+ }
155
182
  /**
156
183
  * Disposes the object by executing the callback.
157
184
  *
@@ -191,6 +218,13 @@ class CallbackDisposable {
191
218
  this.callback = params.callback;
192
219
  this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
193
220
  }
221
+ /**
222
+ * Disposes the object by executing the callback. Convenience alias that delegates to
223
+ * `this[Symbol.dispose]()`.
224
+ */
225
+ dispose() {
226
+ this[Symbol.dispose]();
227
+ }
194
228
  /**
195
229
  * Disposes the object by executing the callback.
196
230
  *
@@ -215,20 +249,207 @@ class CallbackDisposable {
215
249
  this.callback();
216
250
  }
217
251
  }
252
+ class CombineAsyncDisposable {
253
+ children;
254
+ disposeOrder;
255
+ errorBehavior;
256
+ isDisposed = false;
257
+ multipleDisposeBehavior;
258
+ /**
259
+ * Creates a new instance of {@link CombineAsyncDisposable}.
260
+ *
261
+ * @param params - The parameters.
262
+ */
263
+ constructor(params) {
264
+ this.children = [...params.asyncDisposables];
265
+ this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
266
+ this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
267
+ this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
268
+ }
269
+ /**
270
+ * Disposes all combined children. Convenience alias that delegates to
271
+ * `this[Symbol.asyncDispose]()`.
272
+ *
273
+ * @returns A {@link Promise} that resolves once all children have been disposed.
274
+ */
275
+ asyncDispose() {
276
+ return this[Symbol.asyncDispose]();
277
+ }
278
+ /**
279
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
280
+ * {@link DisposeErrorBehavior} when a child throws.
281
+ *
282
+ * This method is called automatically when the object is used in an `await using` declaration. It can
283
+ * also be called manually. The behavior on a second and later dispose is controlled by
284
+ * {@link CombineAsyncDisposableConstructorParams.multipleDisposeBehavior}.
285
+ *
286
+ * @returns A {@link Promise} that resolves once all children have been disposed.
287
+ */
288
+ async [Symbol.asyncDispose]() {
289
+ if (this.isDisposed) {
290
+ switch (this.multipleDisposeBehavior) {
291
+ case 1 /* Ignore */:
292
+ return;
293
+ case 0 /* Invoke */:
294
+ break;
295
+ case 2 /* Throw */:
296
+ throw new Error("This CombineAsyncDisposable has already been disposed.");
297
+ default:
298
+ (0, import_type_guards.assertNever)(this.multipleDisposeBehavior);
299
+ }
300
+ }
301
+ this.isDisposed = true;
302
+ const errors = [];
303
+ for (const child of this.getOrderedChildren()) {
304
+ try {
305
+ await child[Symbol.asyncDispose]();
306
+ } catch (error) {
307
+ if (this.errorBehavior === 1 /* FailFast */) {
308
+ throw error;
309
+ }
310
+ errors.push(error);
311
+ }
312
+ }
313
+ if (errors.length > 0) {
314
+ throw new AggregateError(errors);
315
+ }
316
+ }
317
+ getOrderedChildren() {
318
+ switch (this.disposeOrder) {
319
+ case 1 /* Fifo */:
320
+ return this.children;
321
+ case 0 /* Lifo */:
322
+ return [...this.children].reverse();
323
+ default:
324
+ (0, import_type_guards.assertNever)(this.disposeOrder);
325
+ }
326
+ }
327
+ }
328
+ class CombineDisposable {
329
+ children;
330
+ disposeOrder;
331
+ errorBehavior;
332
+ isDisposed = false;
333
+ multipleDisposeBehavior;
334
+ /**
335
+ * Creates a new instance of {@link CombineDisposable}.
336
+ *
337
+ * @param params - The parameters.
338
+ */
339
+ constructor(params) {
340
+ this.children = [...params.disposables];
341
+ this.disposeOrder = params.disposeOrder ?? 0 /* Lifo */;
342
+ this.errorBehavior = params.errorBehavior ?? 0 /* Aggregate */;
343
+ this.multipleDisposeBehavior = params.multipleDisposeBehavior ?? 0 /* Invoke */;
344
+ }
345
+ /**
346
+ * Disposes all combined children. Convenience alias that delegates to `this[Symbol.dispose]()`.
347
+ */
348
+ dispose() {
349
+ this[Symbol.dispose]();
350
+ }
351
+ /**
352
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
353
+ * {@link DisposeErrorBehavior} when a child throws.
354
+ *
355
+ * This method is called automatically when the object is used in a `using` declaration. It can also
356
+ * be called manually. The behavior on a second and later dispose is controlled by
357
+ * {@link CombineDisposableConstructorParams.multipleDisposeBehavior}.
358
+ */
359
+ [Symbol.dispose]() {
360
+ if (this.isDisposed) {
361
+ switch (this.multipleDisposeBehavior) {
362
+ case 1 /* Ignore */:
363
+ return;
364
+ case 0 /* Invoke */:
365
+ break;
366
+ case 2 /* Throw */:
367
+ throw new Error("This CombineDisposable has already been disposed.");
368
+ default:
369
+ (0, import_type_guards.assertNever)(this.multipleDisposeBehavior);
370
+ }
371
+ }
372
+ this.isDisposed = true;
373
+ const errors = [];
374
+ for (const child of this.getOrderedChildren()) {
375
+ try {
376
+ child[Symbol.dispose]();
377
+ } catch (error) {
378
+ if (this.errorBehavior === 1 /* FailFast */) {
379
+ throw error;
380
+ }
381
+ errors.push(error);
382
+ }
383
+ }
384
+ if (errors.length > 0) {
385
+ throw new AggregateError(errors);
386
+ }
387
+ }
388
+ getOrderedChildren() {
389
+ switch (this.disposeOrder) {
390
+ case 1 /* Fifo */:
391
+ return this.children;
392
+ case 0 /* Lifo */:
393
+ return [...this.children].reverse();
394
+ default:
395
+ (0, import_type_guards.assertNever)(this.disposeOrder);
396
+ }
397
+ }
398
+ }
218
399
  function isAsyncDisposable(obj) {
219
400
  const asyncDisposable = obj;
220
401
  return !!asyncDisposable[Symbol.asyncDispose];
221
402
  }
403
+ function isAsyncDisposableEx(obj) {
404
+ const asyncDisposableEx = obj;
405
+ return isAsyncDisposable(obj) && typeof asyncDisposableEx.asyncDispose === "function";
406
+ }
222
407
  function isDisposable(obj) {
223
408
  const disposable = obj;
224
409
  return !!disposable[Symbol.dispose];
225
410
  }
411
+ function isDisposableEx(obj) {
412
+ const disposableEx = obj;
413
+ return isDisposable(obj) && typeof disposableEx.dispose === "function";
414
+ }
415
+ function toAsyncDisposableEx(asyncDisposable) {
416
+ if (isAsyncDisposableEx(asyncDisposable)) {
417
+ return asyncDisposable;
418
+ }
419
+ return {
420
+ asyncDispose,
421
+ [Symbol.asyncDispose]: asyncDispose
422
+ };
423
+ function asyncDispose() {
424
+ return Promise.resolve(asyncDisposable[Symbol.asyncDispose]());
425
+ }
426
+ }
427
+ function toDisposableEx(disposable) {
428
+ if (isDisposableEx(disposable)) {
429
+ return disposable;
430
+ }
431
+ return {
432
+ dispose,
433
+ [Symbol.dispose]: dispose
434
+ };
435
+ function dispose() {
436
+ disposable[Symbol.dispose]();
437
+ }
438
+ }
226
439
  // Annotate the CommonJS export names for ESM import in node:
227
440
  0 && (module.exports = {
228
441
  AsyncCallbackDisposable,
229
442
  CallbackDisposable,
443
+ CombineAsyncDisposable,
444
+ CombineDisposable,
445
+ DisposeErrorBehavior,
446
+ DisposeOrder,
230
447
  MultipleDisposeBehavior,
231
448
  isAsyncDisposable,
232
- isDisposable
449
+ isAsyncDisposableEx,
450
+ isDisposable,
451
+ isDisposableEx,
452
+ toAsyncDisposableEx,
453
+ toDisposableEx
233
454
  });
234
- //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyBob3cgYSB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfSBvciB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGJlaGF2ZXMgd2hlbiBpdCBpc1xuICogZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gKi9cbmV4cG9ydCBlbnVtIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gZXZlcnkgZGlzcG9zZS5cbiAgICovXG4gIEludm9rZSxcblxuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgZmlyc3QgZGlzcG9zZSBvbmx5OyBzdWJzZXF1ZW50IGRpc3Bvc2VzIGFyZSBuby1vcHMuXG4gICAqL1xuICBJZ25vcmUsXG5cbiAgLyoqXG4gICAqIEludm9rZSB0aGUgY2FsbGJhY2sgb24gdGhlIGZpcnN0IGRpc3Bvc2Ugb25seTsgc3Vic2VxdWVudCBkaXNwb3NlcyB0aHJvdy5cbiAgICovXG4gIFRocm93XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBBc3luY0Rpc3Bvc2VDYWxsYmFjaztcblxuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogQSBjYWxsYmFjayBpbnZva2VkIHdoZW4gYW4ge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfSBpcyBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IHR5cGUgQXN5bmNEaXNwb3NlQ2FsbGJhY2sgPSAodGhpczogdm9pZCkgPT4gUHJvbWlzYWJsZTx2b2lkPjtcblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiBkaXNwb3NlZC5cbiAgICovXG4gIHJlYWRvbmx5IGNhbGxiYWNrOiBEaXNwb3NlQ2FsbGJhY2s7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgZGlzcG9zYWJsZSBiZWhhdmVzIHdoZW4gZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIGFzeW5jIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQgdmlhIGBhd2FpdCB1c2luZ2AgKG9yIGEgbWFudWFsXG4gKiBgYXdhaXQgZGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgdGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA9IHBhcmFtcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA/PyBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCBieSBleGVjdXRpbmcgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhbiBgYXdhaXQgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdFxuICAgKiBjYW4gYWxzbyBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICpcbiAgICogQHJldHVybnMgQSB7QGxpbmsgUHJvbWlzZX0gdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjYWxsYmFjayBjb21wbGV0ZXMuXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgYXdhaXQgdGhpcy5jYWxsYmFjaygpO1xuICB9XG59XG5cbi8qKlxuICogQSBkaXNwb3NhYmxlIHRoYXQgZXhlY3V0ZXMgYSBjYWxsYmFjayB3aGVuIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgY2xhc3MgQ2FsbGJhY2tEaXNwb3NhYmxlIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2FsbGJhY2s6IERpc3Bvc2VDYWxsYmFjaztcbiAgcHJpdmF0ZSBpc0Rpc3Bvc2VkID0gZmFsc2U7XG4gIHByaXZhdGUgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I6IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2FsbGJhY2sgPSBwYXJhbXMuY2FsbGJhY2s7XG4gICAgdGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA9IHBhcmFtcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvciA/PyBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U7XG4gIH1cblxuICAvKipcbiAgICogRGlzcG9zZXMgdGhlIG9iamVjdCBieSBleGVjdXRpbmcgdGhlIGNhbGxiYWNrLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhIGB1c2luZ2AgZGVjbGFyYXRpb24uIEl0IGNhbiBhbHNvXG4gICAqIGJlIGNhbGxlZCBtYW51YWxseS4gVGhlIGJlaGF2aW9yIG9uIGEgc2Vjb25kIGFuZCBsYXRlciBkaXNwb3NlIGlzIGNvbnRyb2xsZWQgYnlcbiAgICoge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBDYWxsYmFja0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhc3NlcnROZXZlcih0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuICAgIHRoaXMuY2FsbGJhY2soKTtcbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGFzeW5jRGlzcG9zYWJsZSA9IG9iaiBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWFzeW5jRGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlLlxuICpcbiAqIEBwYXJhbSBvYmogLSB0aGUgb2JqZWN0IHRvIGNoZWNrIGZvciB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlfSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzRGlzcG9zYWJsZShvYmo6IHVua25vd24pOiBvYmogaXMgRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGRpc3Bvc2FibGUgPSBvYmogYXMgUGFydGlhbDxEaXNwb3NhYmxlPjtcbiAgcmV0dXJuICEhZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV07XG59XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQVFBLHlCQUE0QjtBQU1yQixJQUFLLDBCQUFMLGtCQUFLQSw2QkFBTDtBQUlMLEVBQUFBLGtEQUFBO0FBS0EsRUFBQUEsa0RBQUE7QUFLQSxFQUFBQSxrREFBQTtBQWRVLFNBQUFBO0FBQUEsR0FBQTtBQWlFTCxNQUFNLHdCQUFtRDtBQUFBLEVBQzdDO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSywwQkFBMEIsT0FBTywyQkFBMkI7QUFBQSxFQUNuRTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBV0EsT0FBYyxPQUFPLFlBQVksSUFBbUI7QUFDbEQsUUFBSSxLQUFLLFlBQVk7QUFDbkIsY0FBUSxLQUFLLHlCQUF5QjtBQUFBLFFBQ3BDLEtBQUs7QUFDSDtBQUFBLFFBQ0YsS0FBSztBQUNIO0FBQUEsUUFDRixLQUFLO0FBQ0gsZ0JBQU0sSUFBSSxNQUFNLHlEQUF5RDtBQUFBLFFBQzNFO0FBQ0UsOENBQVksS0FBSyx1QkFBdUI7QUFBQSxNQUM1QztBQUFBLElBQ0Y7QUFFQSxTQUFLLGFBQWE7QUFDbEIsVUFBTSxLQUFLLFNBQVM7QUFBQSxFQUN0QjtBQUNGO0FBS08sTUFBTSxtQkFBeUM7QUFBQSxFQUNuQztBQUFBLEVBQ1QsYUFBYTtBQUFBLEVBQ0o7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsRUFPVixZQUFZLFFBQTZDO0FBQzlELFNBQUssV0FBVyxPQUFPO0FBQ3ZCLFNBQUssMEJBQTBCLE9BQU8sMkJBQTJCO0FBQUEsRUFDbkU7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBU0EsQ0FBUSxPQUFPLE9BQU8sSUFBVTtBQUM5QixRQUFJLEtBQUssWUFBWTtBQUNuQixjQUFRLEtBQUsseUJBQXlCO0FBQUEsUUFDcEMsS0FBSztBQUNIO0FBQUEsUUFDRixLQUFLO0FBQ0g7QUFBQSxRQUNGLEtBQUs7QUFDSCxnQkFBTSxJQUFJLE1BQU0sb0RBQW9EO0FBQUEsUUFDdEU7QUFDRSw4Q0FBWSxLQUFLLHVCQUF1QjtBQUFBLE1BQzVDO0FBQUEsSUFDRjtBQUVBLFNBQUssYUFBYTtBQUNsQixTQUFLLFNBQVM7QUFBQSxFQUNoQjtBQUNGO0FBUU8sU0FBUyxrQkFBa0IsS0FBc0M7QUFDdEUsUUFBTSxrQkFBa0I7QUFDeEIsU0FBTyxDQUFDLENBQUMsZ0JBQWdCLE9BQU8sWUFBWTtBQUM5QztBQVFPLFNBQVMsYUFBYSxLQUFpQztBQUM1RCxRQUFNLGFBQWE7QUFDbkIsU0FBTyxDQUFDLENBQUMsV0FBVyxPQUFPLE9BQU87QUFDcEM7IiwKICAibmFtZXMiOiBbIk11bHRpcGxlRGlzcG9zZUJlaGF2aW9yIl0KfQo=
455
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vLi4vLi4vc3JjL2Rpc3Bvc2FibGUudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbIi8qKlxuICogQGZpbGVcbiAqXG4gKiBEaXNwb3NhYmxlIHV0aWxpdGllcyBmb3IgYHVzaW5nYCAvIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb25zLlxuICovXG5cbmltcG9ydCB0eXBlIHsgUHJvbWlzYWJsZSB9IGZyb20gJ3R5cGUtZmVzdCc7XG5cbmltcG9ydCB7IGFzc2VydE5ldmVyIH0gZnJvbSAnLi90eXBlLWd1YXJkcy50cyc7XG5cbi8qKlxuICogRGV0ZXJtaW5lcyB0aGUgZXJyb3Igc2VtYW50aWNzIG9mIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gd2hlblxuICogb25lIG9mIGl0cyBjaGlsZHJlbiB0aHJvd3Mgd2hpbGUgYmVpbmcgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBlbnVtIERpc3Bvc2VFcnJvckJlaGF2aW9yIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgZXZlcnkgY2hpbGQgZXZlbiBpZiBzb21lIG9mIHRoZW0gdGhyb3csIGNvbGxlY3RpbmcgdGhlIHRocm93biBlcnJvcnMgYW5kIHJlLXRocm93aW5nIHRoZW1cbiAgICogYXMgYSBzaW5nbGUge0BsaW5rIEFnZ3JlZ2F0ZUVycm9yfSBvbmNlIGFsbCBjaGlsZHJlbiBoYXZlIGJlZW4gZGlzcG9zZWQuXG4gICAqL1xuICBBZ2dyZWdhdGUsXG5cbiAgLyoqXG4gICAqIFJlLXRocm93IHRoZSBmaXJzdCBlcnJvciBhIGNoaWxkIHRocm93cyBpbW1lZGlhdGVseSwgbGVhdmluZyB0aGUgcmVtYWluaW5nIGNoaWxkcmVuIHVuZGlzcG9zZWQuXG4gICAqL1xuICBGYWlsRmFzdFxufVxuXG4vKipcbiAqIERldGVybWluZXMgdGhlIG9yZGVyIGluIHdoaWNoIGEge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfSBvciB7QGxpbmsgQ29tYmluZUFzeW5jRGlzcG9zYWJsZX0gZGlzcG9zZXNcbiAqIGl0cyBjaGlsZHJlbi5cbiAqL1xuZXhwb3J0IGVudW0gRGlzcG9zZU9yZGVyIHtcbiAgLyoqXG4gICAqIERpc3Bvc2UgdGhlIGxhc3QtcmVnaXN0ZXJlZCBjaGlsZCBmaXJzdCAobGFzdC1pbiwgZmlyc3Qtb3V0KSwgbGlrZSBuZXN0ZWQgYHVzaW5nYCBkZWNsYXJhdGlvbnNcbiAgICogdW53aW5kaW5nIGluIHJldmVyc2UuXG4gICAqL1xuICBMaWZvLFxuXG4gIC8qKlxuICAgKiBEaXNwb3NlIHRoZSBmaXJzdC1yZWdpc3RlcmVkIGNoaWxkIGZpcnN0IChmaXJzdC1pbiwgZmlyc3Qtb3V0KS5cbiAgICovXG4gIEZpZm9cbn1cblxuLyoqXG4gKiBEZXRlcm1pbmVzIGhvdyBhIHtAbGluayBDYWxsYmFja0Rpc3Bvc2FibGV9IG9yIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0gYmVoYXZlcyB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAqL1xuZXhwb3J0IGVudW0gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3Ige1xuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiBldmVyeSBkaXNwb3NlLlxuICAgKi9cbiAgSW52b2tlLFxuXG4gIC8qKlxuICAgKiBJbnZva2UgdGhlIGNhbGxiYWNrIG9uIHRoZSBmaXJzdCBkaXNwb3NlIG9ubHk7IHN1YnNlcXVlbnQgZGlzcG9zZXMgYXJlIG5vLW9wcy5cbiAgICovXG4gIElnbm9yZSxcblxuICAvKipcbiAgICogSW52b2tlIHRoZSBjYWxsYmFjayBvbiB0aGUgZmlyc3QgZGlzcG9zZSBvbmx5OyBzdWJzZXF1ZW50IGRpc3Bvc2VzIHRocm93LlxuICAgKi9cbiAgVGhyb3dcbn1cblxuLyoqXG4gKiBUaGUgcGFyYW1ldGVycyBmb3IgY29uc3RydWN0aW5nIGFuIHtAbGluayBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZX0uXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IEFzeW5jRGlzcG9zZUNhbGxiYWNrO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGRpc3Bvc2FibGUgYmVoYXZlcyB3aGVuIGRpc3Bvc2VkIG1vcmUgdGhhbiBvbmNlLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlfVxuICAgKi9cbiAgcmVhZG9ubHkgbXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I/OiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcbn1cblxuLyoqXG4gKiBBbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlfSB0aGF0IGFkZGl0aW9uYWxseSBleHBvc2VzIGEgY29udmVuaWVuY2Uge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4LmFzeW5jRGlzcG9zZX1cbiAqIG1ldGhvZCwgc28gYSBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmFzeW5jRGlzcG9zZSgpYCBpbnN0ZWFkIG9mIHRoZSBjbHVua2llclxuICogYGhhbmRsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBBc3luY0Rpc3Bvc2FibGVFeCBleHRlbmRzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBkaXNwb3NhbCBjb21wbGV0ZXMuXG4gICAqL1xuICBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIGNhbGxiYWNrIGludm9rZWQgd2hlbiBhbiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9IGlzIGRpc3Bvc2VkLlxuICovXG5leHBvcnQgdHlwZSBBc3luY0Rpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiBQcm9taXNhYmxlPHZvaWQ+O1xuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja0Rpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcyB7XG4gIC8qKlxuICAgKiBUaGUgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcmVhZG9ubHkgY2FsbGJhY2s6IERpc3Bvc2VDYWxsYmFjaztcblxuICAvKipcbiAgICogSG93IHRoZSBkaXNwb3NhYmxlIGJlaGF2ZXMgd2hlbiBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogVGhlIHBhcmFtZXRlcnMgZm9yIGNvbnN0cnVjdGluZyBhIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlfS5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGFzeW5jIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBhc3luY0Rpc3Bvc2FibGVzOiBJdGVyYWJsZTxBc3luY0Rpc3Bvc2FibGU+O1xuXG4gIC8qKlxuICAgKiBUaGUgb3JkZXIgaW4gd2hpY2ggdGhlIGNoaWxkcmVuIGFyZSBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VPcmRlci5MaWZvfVxuICAgKi9cbiAgcmVhZG9ubHkgZGlzcG9zZU9yZGVyPzogRGlzcG9zZU9yZGVyO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBvbmUgb2YgaXRzIGNoaWxkcmVuIHRocm93cyB3aGlsZSBiZWluZyBkaXNwb3NlZC5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yLkFnZ3JlZ2F0ZX1cbiAgICovXG4gIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I/OiBEaXNwb3NlRXJyb3JCZWhhdmlvcjtcblxuICAvKipcbiAgICogSG93IHRoZSBjb21iaW5lciBiZWhhdmVzIHdoZW4gaXQgaXMgZGlzcG9zZWQgbW9yZSB0aGFuIG9uY2UuXG4gICAqXG4gICAqIEBkZWZhdWx0IHtAbGluayBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2V9XG4gICAqL1xuICByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcj86IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yO1xufVxuXG4vKipcbiAqIFRoZSBwYXJhbWV0ZXJzIGZvciBjb25zdHJ1Y3RpbmcgYSB7QGxpbmsgQ29tYmluZURpc3Bvc2FibGV9LlxuICovXG5leHBvcnQgaW50ZXJmYWNlIENvbWJpbmVEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMge1xuICAvKipcbiAgICogVGhlIGRpc3Bvc2FibGVzIHRvIGRpc3Bvc2Ugd2hlbiB0aGUgY29tYmluZXIgaXMgZGlzcG9zZWQuXG4gICAqL1xuICByZWFkb25seSBkaXNwb3NhYmxlczogSXRlcmFibGU8RGlzcG9zYWJsZT47XG5cbiAgLyoqXG4gICAqIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgY2hpbGRyZW4gYXJlIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZU9yZGVyLkxpZm99XG4gICAqL1xuICByZWFkb25seSBkaXNwb3NlT3JkZXI/OiBEaXNwb3NlT3JkZXI7XG5cbiAgLyoqXG4gICAqIEhvdyB0aGUgY29tYmluZXIgYmVoYXZlcyB3aGVuIG9uZSBvZiBpdHMgY2hpbGRyZW4gdGhyb3dzIHdoaWxlIGJlaW5nIGRpc3Bvc2VkLlxuICAgKlxuICAgKiBAZGVmYXVsdCB7QGxpbmsgRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlfVxuICAgKi9cbiAgcmVhZG9ubHkgZXJyb3JCZWhhdmlvcj86IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuXG4gIC8qKlxuICAgKiBIb3cgdGhlIGNvbWJpbmVyIGJlaGF2ZXMgd2hlbiBpdCBpcyBkaXNwb3NlZCBtb3JlIHRoYW4gb25jZS5cbiAgICpcbiAgICogQGRlZmF1bHQge0BsaW5rIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZX1cbiAgICovXG4gIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yPzogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZX0gdGhhdCBhZGRpdGlvbmFsbHkgZXhwb3NlcyBhIGNvbnZlbmllbmNlIHtAbGluayBEaXNwb3NhYmxlRXguZGlzcG9zZX0gbWV0aG9kLCBzbyBhXG4gKiBzdG9yZWQgaGFuZGxlIGNhbiBiZSBkaXNwb3NlZCBhcyBgaGFuZGxlLmRpc3Bvc2UoKWAgaW5zdGVhZCBvZiB0aGUgY2x1bmtpZXIgYGhhbmRsZVtTeW1ib2wuZGlzcG9zZV0oKWAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgRGlzcG9zYWJsZUV4IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0LiBEZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgZGlzcG9zZSgpOiB2b2lkO1xufVxuXG4vKipcbiAqIEEgY2FsbGJhY2sgaW52b2tlZCB3aGVuIGEge0BsaW5rIENhbGxiYWNrRGlzcG9zYWJsZX0gaXMgZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCB0eXBlIERpc3Bvc2VDYWxsYmFjayA9ICh0aGlzOiB2b2lkKSA9PiB2b2lkO1xuXG4vKipcbiAqIEFuIGFzeW5jIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQgdmlhIGBhd2FpdCB1c2luZ2AgKG9yIGEgbWFudWFsXG4gKiBgYXdhaXQgZGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXSgpYCkuXG4gKi9cbmV4cG9ydCBjbGFzcyBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZSBpbXBsZW1lbnRzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjYWxsYmFjazogQXN5bmNEaXNwb3NlQ2FsbGJhY2s7XG4gIHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQXN5bmNDYWxsYmFja0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBBc3luY0NhbGxiYWNrRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zKSB7XG4gICAgdGhpcy5jYWxsYmFjayA9IHBhcmFtcy5jYWxsYmFjaztcbiAgICB0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID0gcGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yID8/IE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLkludm9rZTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suIENvbnZlbmllbmNlIGFsaWFzIHRoYXQgZGVsZWdhdGVzIHRvXG4gICAqIGB0aGlzW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKClgLlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luY0Rpc3Bvc2UoKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgcmV0dXJuIHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGluIGFuIGBhd2FpdCB1c2luZ2AgZGVjbGFyYXRpb24uIEl0XG4gICAqIGNhbiBhbHNvIGJlIGNhbGxlZCBtYW51YWxseS4gVGhlIGJlaGF2aW9yIG9uIGEgc2Vjb25kIGFuZCBsYXRlciBkaXNwb3NlIGlzIGNvbnRyb2xsZWQgYnlcbiAgICoge0BsaW5rIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgdGhlIGNhbGxiYWNrIGNvbXBsZXRlcy5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIEFzeW5jQ2FsbGJhY2tEaXNwb3NhYmxlIGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQuJyk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5pc0Rpc3Bvc2VkID0gdHJ1ZTtcbiAgICBhd2FpdCB0aGlzLmNhbGxiYWNrKCk7XG4gIH1cbn1cblxuLyoqXG4gKiBBIGRpc3Bvc2FibGUgdGhhdCBleGVjdXRlcyBhIGNhbGxiYWNrIHdoZW4gZGlzcG9zZWQuXG4gKi9cbmV4cG9ydCBjbGFzcyBDYWxsYmFja0Rpc3Bvc2FibGUgaW1wbGVtZW50cyBEaXNwb3NhYmxlRXgge1xuICBwcml2YXRlIHJlYWRvbmx5IGNhbGxiYWNrOiBEaXNwb3NlQ2FsbGJhY2s7XG4gIHByaXZhdGUgaXNEaXNwb3NlZCA9IGZhbHNlO1xuICBwcml2YXRlIHJlYWRvbmx5IG11bHRpcGxlRGlzcG9zZUJlaGF2aW9yOiBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjtcblxuICAvKipcbiAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmNhbGxiYWNrID0gcGFyYW1zLmNhbGxiYWNrO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIHRoZSBvYmplY3QgYnkgZXhlY3V0aW5nIHRoZSBjYWxsYmFjay4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG9cbiAgICogYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyB0aGUgb2JqZWN0IGJ5IGV4ZWN1dGluZyB0aGUgY2FsbGJhY2suXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhdXRvbWF0aWNhbGx5IHdoZW4gdGhlIG9iamVjdCBpcyB1c2VkIGluIGEgYHVzaW5nYCBkZWNsYXJhdGlvbi4gSXQgY2FuIGFsc29cbiAgICogYmUgY2FsbGVkIG1hbnVhbGx5LiBUaGUgYmVoYXZpb3Igb24gYSBzZWNvbmQgYW5kIGxhdGVyIGRpc3Bvc2UgaXMgY29udHJvbGxlZCBieVxuICAgKiB7QGxpbmsgQ2FsbGJhY2tEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKi9cbiAgcHVibGljIFtTeW1ib2wuZGlzcG9zZV0oKTogdm9pZCB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIENhbGxiYWNrRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG4gICAgdGhpcy5jYWxsYmFjaygpO1xuICB9XG59XG5cbi8qKlxuICogQW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGFzeW5jIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0XG4gKiBpcyBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVBc3luY0Rpc3Bvc2FibGUgaW1wbGVtZW50cyBBc3luY0Rpc3Bvc2FibGVFeCB7XG4gIHByaXZhdGUgcmVhZG9ubHkgY2hpbGRyZW46IHJlYWRvbmx5IEFzeW5jRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVBc3luY0Rpc3Bvc2FibGV9LlxuICAgKlxuICAgKiBAcGFyYW0gcGFyYW1zIC0gVGhlIHBhcmFtZXRlcnMuXG4gICAqL1xuICBwdWJsaWMgY29uc3RydWN0b3IocGFyYW1zOiBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMpIHtcbiAgICB0aGlzLmNoaWxkcmVuID0gWy4uLnBhcmFtcy5hc3luY0Rpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbi4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG9cbiAgICogYHRoaXNbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKWAuXG4gICAqXG4gICAqIEByZXR1cm5zIEEge0BsaW5rIFByb21pc2V9IHRoYXQgcmVzb2x2ZXMgb25jZSBhbGwgY2hpbGRyZW4gaGF2ZSBiZWVuIGRpc3Bvc2VkLlxuICAgKi9cbiAgcHVibGljIGFzeW5jRGlzcG9zZSgpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICByZXR1cm4gdGhpc1tTeW1ib2wuYXN5bmNEaXNwb3NlXSgpO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbiBpbiB0aGUgY29uZmlndXJlZCB7QGxpbmsgRGlzcG9zZU9yZGVyfSwgYXBwbHlpbmcgdGhlIGNvbmZpZ3VyZWRcbiAgICoge0BsaW5rIERpc3Bvc2VFcnJvckJlaGF2aW9yfSB3aGVuIGEgY2hpbGQgdGhyb3dzLlxuICAgKlxuICAgKiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYXV0b21hdGljYWxseSB3aGVuIHRoZSBvYmplY3QgaXMgdXNlZCBpbiBhbiBgYXdhaXQgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdCBjYW5cbiAgICogYWxzbyBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBDb21iaW5lQXN5bmNEaXNwb3NhYmxlQ29uc3RydWN0b3JQYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3J9LlxuICAgKlxuICAgKiBAcmV0dXJucyBBIHtAbGluayBQcm9taXNlfSB0aGF0IHJlc29sdmVzIG9uY2UgYWxsIGNoaWxkcmVuIGhhdmUgYmVlbiBkaXNwb3NlZC5cbiAgICovXG4gIHB1YmxpYyBhc3luYyBbU3ltYm9sLmFzeW5jRGlzcG9zZV0oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKHRoaXMuaXNEaXNwb3NlZCkge1xuICAgICAgc3dpdGNoICh0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKSB7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSWdub3JlOlxuICAgICAgICAgIHJldHVybjtcbiAgICAgICAgY2FzZSBNdWx0aXBsZURpc3Bvc2VCZWhhdmlvci5JbnZva2U6XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuVGhyb3c6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdUaGlzIENvbWJpbmVBc3luY0Rpc3Bvc2FibGUgaGFzIGFscmVhZHkgYmVlbiBkaXNwb3NlZC4nKTtcbiAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICBhc3NlcnROZXZlcih0aGlzLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLmlzRGlzcG9zZWQgPSB0cnVlO1xuXG4gICAgY29uc3QgZXJyb3JzOiB1bmtub3duW10gPSBbXTtcbiAgICBmb3IgKGNvbnN0IGNoaWxkIG9mIHRoaXMuZ2V0T3JkZXJlZENoaWxkcmVuKCkpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGNoaWxkW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5lcnJvckJlaGF2aW9yID09PSBEaXNwb3NlRXJyb3JCZWhhdmlvci5GYWlsRmFzdCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgQXN5bmNEaXNwb3NhYmxlW10ge1xuICAgIHN3aXRjaCAodGhpcy5kaXNwb3NlT3JkZXIpIHtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkZpZm86XG4gICAgICAgIHJldHVybiB0aGlzLmNoaWxkcmVuO1xuICAgICAgY2FzZSBEaXNwb3NlT3JkZXIuTGlmbzpcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmNoaWxkcmVuXS5yZXZlcnNlKCk7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBhc3NlcnROZXZlcih0aGlzLmRpc3Bvc2VPcmRlcik7XG4gICAgfVxuICB9XG59XG5cbi8qKlxuICogQSB7QGxpbmsgRGlzcG9zYWJsZUV4fSB0aGF0IGNvbWJpbmVzIG11bHRpcGxlIGRpc3Bvc2FibGVzIGFuZCBkaXNwb3NlcyBhbGwgb2YgdGhlbSB3aGVuIGl0IGlzXG4gKiBkaXNwb3NlZC5cbiAqL1xuZXhwb3J0IGNsYXNzIENvbWJpbmVEaXNwb3NhYmxlIGltcGxlbWVudHMgRGlzcG9zYWJsZUV4IHtcbiAgcHJpdmF0ZSByZWFkb25seSBjaGlsZHJlbjogcmVhZG9ubHkgRGlzcG9zYWJsZVtdO1xuICBwcml2YXRlIHJlYWRvbmx5IGRpc3Bvc2VPcmRlcjogRGlzcG9zZU9yZGVyO1xuICBwcml2YXRlIHJlYWRvbmx5IGVycm9yQmVoYXZpb3I6IERpc3Bvc2VFcnJvckJlaGF2aW9yO1xuICBwcml2YXRlIGlzRGlzcG9zZWQgPSBmYWxzZTtcbiAgcHJpdmF0ZSByZWFkb25seSBtdWx0aXBsZURpc3Bvc2VCZWhhdmlvcjogTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3I7XG5cbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2Yge0BsaW5rIENvbWJpbmVEaXNwb3NhYmxlfS5cbiAgICpcbiAgICogQHBhcmFtIHBhcmFtcyAtIFRoZSBwYXJhbWV0ZXJzLlxuICAgKi9cbiAgcHVibGljIGNvbnN0cnVjdG9yKHBhcmFtczogQ29tYmluZURpc3Bvc2FibGVDb25zdHJ1Y3RvclBhcmFtcykge1xuICAgIHRoaXMuY2hpbGRyZW4gPSBbLi4ucGFyYW1zLmRpc3Bvc2FibGVzXTtcbiAgICB0aGlzLmRpc3Bvc2VPcmRlciA9IHBhcmFtcy5kaXNwb3NlT3JkZXIgPz8gRGlzcG9zZU9yZGVyLkxpZm87XG4gICAgdGhpcy5lcnJvckJlaGF2aW9yID0gcGFyYW1zLmVycm9yQmVoYXZpb3IgPz8gRGlzcG9zZUVycm9yQmVoYXZpb3IuQWdncmVnYXRlO1xuICAgIHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPSBwYXJhbXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IgPz8gTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlO1xuICB9XG5cbiAgLyoqXG4gICAqIERpc3Bvc2VzIGFsbCBjb21iaW5lZCBjaGlsZHJlbi4gQ29udmVuaWVuY2UgYWxpYXMgdGhhdCBkZWxlZ2F0ZXMgdG8gYHRoaXNbU3ltYm9sLmRpc3Bvc2VdKClgLlxuICAgKi9cbiAgcHVibGljIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgdGhpc1tTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEaXNwb3NlcyBhbGwgY29tYmluZWQgY2hpbGRyZW4gaW4gdGhlIGNvbmZpZ3VyZWQge0BsaW5rIERpc3Bvc2VPcmRlcn0sIGFwcGx5aW5nIHRoZSBjb25maWd1cmVkXG4gICAqIHtAbGluayBEaXNwb3NlRXJyb3JCZWhhdmlvcn0gd2hlbiBhIGNoaWxkIHRocm93cy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGF1dG9tYXRpY2FsbHkgd2hlbiB0aGUgb2JqZWN0IGlzIHVzZWQgaW4gYSBgdXNpbmdgIGRlY2xhcmF0aW9uLiBJdCBjYW4gYWxzb1xuICAgKiBiZSBjYWxsZWQgbWFudWFsbHkuIFRoZSBiZWhhdmlvciBvbiBhIHNlY29uZCBhbmQgbGF0ZXIgZGlzcG9zZSBpcyBjb250cm9sbGVkIGJ5XG4gICAqIHtAbGluayBDb21iaW5lRGlzcG9zYWJsZUNvbnN0cnVjdG9yUGFyYW1zLm11bHRpcGxlRGlzcG9zZUJlaGF2aW9yfS5cbiAgICovXG4gIHB1YmxpYyBbU3ltYm9sLmRpc3Bvc2VdKCk6IHZvaWQge1xuICAgIGlmICh0aGlzLmlzRGlzcG9zZWQpIHtcbiAgICAgIHN3aXRjaCAodGhpcy5tdWx0aXBsZURpc3Bvc2VCZWhhdmlvcikge1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLklnbm9yZTpcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIGNhc2UgTXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IuSW52b2tlOlxuICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIE11bHRpcGxlRGlzcG9zZUJlaGF2aW9yLlRocm93OlxuICAgICAgICAgIHRocm93IG5ldyBFcnJvcignVGhpcyBDb21iaW5lRGlzcG9zYWJsZSBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkLicpO1xuICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgIGFzc2VydE5ldmVyKHRoaXMubXVsdGlwbGVEaXNwb3NlQmVoYXZpb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIHRoaXMuaXNEaXNwb3NlZCA9IHRydWU7XG5cbiAgICBjb25zdCBlcnJvcnM6IHVua25vd25bXSA9IFtdO1xuICAgIGZvciAoY29uc3QgY2hpbGQgb2YgdGhpcy5nZXRPcmRlcmVkQ2hpbGRyZW4oKSkge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY2hpbGRbU3ltYm9sLmRpc3Bvc2VdKCk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBpZiAodGhpcy5lcnJvckJlaGF2aW9yID09PSBEaXNwb3NlRXJyb3JCZWhhdmlvci5GYWlsRmFzdCkge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG5cbiAgICAgICAgZXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChlcnJvcnMubGVuZ3RoID4gMCkge1xuICAgICAgdGhyb3cgbmV3IEFnZ3JlZ2F0ZUVycm9yKGVycm9ycyk7XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBnZXRPcmRlcmVkQ2hpbGRyZW4oKTogcmVhZG9ubHkgRGlzcG9zYWJsZVtdIHtcbiAgICBzd2l0Y2ggKHRoaXMuZGlzcG9zZU9yZGVyKSB7XG4gICAgICBjYXNlIERpc3Bvc2VPcmRlci5GaWZvOlxuICAgICAgICByZXR1cm4gdGhpcy5jaGlsZHJlbjtcbiAgICAgIGNhc2UgRGlzcG9zZU9yZGVyLkxpZm86XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5jaGlsZHJlbl0ucmV2ZXJzZSgpO1xuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXNzZXJ0TmV2ZXIodGhpcy5kaXNwb3NlT3JkZXIpO1xuICAgIH1cbiAgfVxufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGV9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNBc3luY0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZSB7XG4gIGNvbnN0IGFzeW5jRGlzcG9zYWJsZSA9IG9iaiBhcyBQYXJ0aWFsPEFzeW5jRGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWFzeW5jRGlzcG9zYWJsZVtTeW1ib2wuYXN5bmNEaXNwb3NlXTtcbn1cblxuLyoqXG4gKiBUeXBlIGd1YXJkIHRvIGNoZWNrIGlmIGFuIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gaW50ZXJmYWNlXG4gKiBAcmV0dXJucyBXaGV0aGVyIHRoZSBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIEFzeW5jRGlzcG9zYWJsZUV4fSBpbnRlcmZhY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQXN5bmNEaXNwb3NhYmxlRXgob2JqOiB1bmtub3duKTogb2JqIGlzIEFzeW5jRGlzcG9zYWJsZUV4IHtcbiAgY29uc3QgYXN5bmNEaXNwb3NhYmxlRXggPSBvYmogYXMgUGFydGlhbDxBc3luY0Rpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0FzeW5jRGlzcG9zYWJsZShvYmopICYmIHR5cGVvZiBhc3luY0Rpc3Bvc2FibGVFeC5hc3luY0Rpc3Bvc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogVHlwZSBndWFyZCB0byBjaGVjayBpZiBhbiBvYmplY3QgaW1wbGVtZW50cyB0aGUge0BsaW5rIERpc3Bvc2FibGV9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBEaXNwb3NhYmxlfSBpbnRlcmZhY2VcbiAqIEByZXR1cm5zIFdoZXRoZXIgdGhlIG9iamVjdCBpbXBsZW1lbnRzIHRoZSB7QGxpbmsgRGlzcG9zYWJsZX0gaW50ZXJmYWNlXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBpc0Rpc3Bvc2FibGUob2JqOiB1bmtub3duKTogb2JqIGlzIERpc3Bvc2FibGUge1xuICBjb25zdCBkaXNwb3NhYmxlID0gb2JqIGFzIFBhcnRpYWw8RGlzcG9zYWJsZT47XG4gIHJldHVybiAhIWRpc3Bvc2FibGVbU3ltYm9sLmRpc3Bvc2VdO1xufVxuXG4vKipcbiAqIFR5cGUgZ3VhcmQgdG8gY2hlY2sgaWYgYW4gb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZS5cbiAqXG4gKiBAcGFyYW0gb2JqIC0gdGhlIG9iamVjdCB0byBjaGVjayBmb3IgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICogQHJldHVybnMgV2hldGhlciB0aGUgb2JqZWN0IGltcGxlbWVudHMgdGhlIHtAbGluayBEaXNwb3NhYmxlRXh9IGludGVyZmFjZVxuICovXG5leHBvcnQgZnVuY3Rpb24gaXNEaXNwb3NhYmxlRXgob2JqOiB1bmtub3duKTogb2JqIGlzIERpc3Bvc2FibGVFeCB7XG4gIGNvbnN0IGRpc3Bvc2FibGVFeCA9IG9iaiBhcyBQYXJ0aWFsPERpc3Bvc2FibGVFeD47XG4gIHJldHVybiBpc0Rpc3Bvc2FibGUob2JqKSAmJiB0eXBlb2YgZGlzcG9zYWJsZUV4LmRpc3Bvc2UgPT09ICdmdW5jdGlvbic7XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIEFzeW5jRGlzcG9zYWJsZX0gaW50byBhbiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXh9IGJ5IGFkZGluZyBhIGNvbnZlbmllbmNlXG4gKiB7QGxpbmsgQXN5bmNEaXNwb3NhYmxlRXguYXN5bmNEaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5hc3luY0Rpc3Bvc2VgLlxuICpcbiAqIElmIHRoZSBvYmplY3QgYWxyZWFkeSBpbXBsZW1lbnRzIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0sIGl0IGlzIHJldHVybmVkIHVuY2hhbmdlZC5cbiAqXG4gKiBAcGFyYW0gYXN5bmNEaXNwb3NhYmxlIC0gdGhlIGFzeW5jIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEFuIHtAbGluayBBc3luY0Rpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGFzeW5jIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0FzeW5jRGlzcG9zYWJsZUV4KGFzeW5jRGlzcG9zYWJsZTogQXN5bmNEaXNwb3NhYmxlKTogQXN5bmNEaXNwb3NhYmxlRXgge1xuICBpZiAoaXNBc3luY0Rpc3Bvc2FibGVFeChhc3luY0Rpc3Bvc2FibGUpKSB7XG4gICAgcmV0dXJuIGFzeW5jRGlzcG9zYWJsZTtcbiAgfVxuXG4gIHJldHVybiB7XG4gICAgYXN5bmNEaXNwb3NlLFxuICAgIFtTeW1ib2wuYXN5bmNEaXNwb3NlXTogYXN5bmNEaXNwb3NlXG4gIH07XG5cbiAgZnVuY3Rpb24gYXN5bmNEaXNwb3NlKCk6IFByb21pc2U8dm9pZD4ge1xuICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoYXN5bmNEaXNwb3NhYmxlW1N5bWJvbC5hc3luY0Rpc3Bvc2VdKCkpO1xuICB9XG59XG5cbi8qKlxuICogQWRhcHRzIGEgcGxhaW4ge0BsaW5rIERpc3Bvc2FibGV9IGludG8gYSB7QGxpbmsgRGlzcG9zYWJsZUV4fSBieSBhZGRpbmcgYSBjb252ZW5pZW5jZVxuICoge0BsaW5rIERpc3Bvc2FibGVFeC5kaXNwb3NlfSBtZXRob2QgdGhhdCBkZWxlZ2F0ZXMgdG8gYFN5bWJvbC5kaXNwb3NlYC5cbiAqXG4gKiBJZiB0aGUgb2JqZWN0IGFscmVhZHkgaW1wbGVtZW50cyB7QGxpbmsgRGlzcG9zYWJsZUV4fSwgaXQgaXMgcmV0dXJuZWQgdW5jaGFuZ2VkLlxuICpcbiAqIEBwYXJhbSBkaXNwb3NhYmxlIC0gdGhlIGRpc3Bvc2FibGUgdG8gYWRhcHRcbiAqIEByZXR1cm5zIEEge0BsaW5rIERpc3Bvc2FibGVFeH0gd3JhcHBpbmcgdGhlIGRpc3Bvc2FibGUuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB0b0Rpc3Bvc2FibGVFeChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZUV4IHtcbiAgaWYgKGlzRGlzcG9zYWJsZUV4KGRpc3Bvc2FibGUpKSB7XG4gICAgcmV0dXJuIGRpc3Bvc2FibGU7XG4gIH1cblxuICByZXR1cm4ge1xuICAgIGRpc3Bvc2UsXG4gICAgW1N5bWJvbC5kaXNwb3NlXTogZGlzcG9zZVxuICB9O1xuXG4gIGZ1bmN0aW9uIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgZGlzcG9zYWJsZVtTeW1ib2wuZGlzcG9zZV0oKTtcbiAgfVxufVxuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBUUEseUJBQTRCO0FBTXJCLElBQUssdUJBQUwsa0JBQUtBLDBCQUFMO0FBS0wsRUFBQUEsNENBQUE7QUFLQSxFQUFBQSw0Q0FBQTtBQVZVLFNBQUFBO0FBQUEsR0FBQTtBQWlCTCxJQUFLLGVBQUwsa0JBQUtDLGtCQUFMO0FBS0wsRUFBQUEsNEJBQUE7QUFLQSxFQUFBQSw0QkFBQTtBQVZVLFNBQUFBO0FBQUEsR0FBQTtBQWlCTCxJQUFLLDBCQUFMLGtCQUFLQyw2QkFBTDtBQUlMLEVBQUFBLGtEQUFBO0FBS0EsRUFBQUEsa0RBQUE7QUFLQSxFQUFBQSxrREFBQTtBQWRVLFNBQUFBO0FBQUEsR0FBQTtBQXdKTCxNQUFNLHdCQUFxRDtBQUFBLEVBQy9DO0FBQUEsRUFDVCxhQUFhO0FBQUEsRUFDSjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxFQU9WLFlBQVksUUFBa0Q7QUFDbkUsU0FBSyxXQUFXLE9BQU87QUFDdkIsU0FBSywwQkFBMEIsT0FBTywy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TyxPQUFPLEVBQUU7QUFBQSxNQUN4QixTQUFTLE9BQU87QUFDZCxZQUFJLEtBQUssa0JBQWtCLGtCQUErQjtBQUN4RCxnQkFBTTtBQUFBLFFBQ1I7QUFFQSxlQUFPLEtBQUssS0FBSztBQUFBLE1BQ25CO0FBQUEsSUFDRjtBQUVBLFFBQUksT0FBTyxTQUFTLEdBQUc7QUFDckIsWUFBTSxJQUFJLGVBQWUsTUFBTTtBQUFBLElBQ2pDO0FBQUEsRUFDRjtBQUFBLEVBRVEscUJBQTRDO0FBQ2xELFlBQVEsS0FBSyxjQUFjO0FBQUEsTUFDekIsS0FBSztBQUNILGVBQU8sS0FBSztBQUFBLE1BQ2QsS0FBSztBQUNILGVBQU8sQ0FBQyxHQUFHLEtBQUssUUFBUSxFQUFFLFFBQVE7QUFBQSxNQUNwQztBQUNFLDRDQUFZLEtBQUssWUFBWTtBQUFBLElBQ2pDO0FBQUEsRUFDRjtBQUNGO0FBUU8sU0FBUyxrQkFBa0IsS0FBc0M7QUFDdEUsUUFBTSxrQkFBa0I7QUFDeEIsU0FBTyxDQUFDLENBQUMsZ0JBQWdCLE9BQU8sWUFBWTtBQUM5QztBQVFPLFNBQVMsb0JBQW9CLEtBQXdDO0FBQzFFLFFBQU0sb0JBQW9CO0FBQzFCLFNBQU8sa0JBQWtCLEdBQUcsS0FBSyxPQUFPLGtCQUFrQixpQkFBaUI7QUFDN0U7QUFRTyxTQUFTLGFBQWEsS0FBaUM7QUFDNUQsUUFBTSxhQUFhO0FBQ25CLFNBQU8sQ0FBQyxDQUFDLFdBQVcsT0FBTyxPQUFPO0FBQ3BDO0FBUU8sU0FBUyxlQUFlLEtBQW1DO0FBQ2hFLFFBQU0sZUFBZTtBQUNyQixTQUFPLGFBQWEsR0FBRyxLQUFLLE9BQU8sYUFBYSxZQUFZO0FBQzlEO0FBV08sU0FBUyxvQkFBb0IsaUJBQXFEO0FBQ3ZGLE1BQUksb0JBQW9CLGVBQWUsR0FBRztBQUN4QyxXQUFPO0FBQUEsRUFDVDtBQUVBLFNBQU87QUFBQSxJQUNMO0FBQUEsSUFDQSxDQUFDLE9BQU8sWUFBWSxHQUFHO0FBQUEsRUFDekI7QUFFQSxXQUFTLGVBQThCO0FBQ3JDLFdBQU8sUUFBUSxRQUFRLGdCQUFnQixPQUFPLFlBQVksRUFBRSxDQUFDO0FBQUEsRUFDL0Q7QUFDRjtBQVdPLFNBQVMsZUFBZSxZQUFzQztBQUNuRSxNQUFJLGVBQWUsVUFBVSxHQUFHO0FBQzlCLFdBQU87QUFBQSxFQUNUO0FBRUEsU0FBTztBQUFBLElBQ0w7QUFBQSxJQUNBLENBQUMsT0FBTyxPQUFPLEdBQUc7QUFBQSxFQUNwQjtBQUVBLFdBQVMsVUFBZ0I7QUFDdkIsZUFBVyxPQUFPLE9BQU8sRUFBRTtBQUFBLEVBQzdCO0FBQ0Y7IiwKICAibmFtZXMiOiBbIkRpc3Bvc2VFcnJvckJlaGF2aW9yIiwgIkRpc3Bvc2VPcmRlciIsICJNdWx0aXBsZURpc3Bvc2VCZWhhdmlvciJdCn0K
@@ -5,6 +5,36 @@
5
5
  * Disposable utilities for `using` / `await using` declarations.
6
6
  */
7
7
  import type { Promisable } from 'type-fest' with { 'resolution-mode': 'import' };
8
+ /**
9
+ * Determines the error semantics of a {@link CombineDisposable} or {@link CombineAsyncDisposable} when
10
+ * one of its children throws while being disposed.
11
+ */
12
+ export declare enum DisposeErrorBehavior {
13
+ /**
14
+ * Dispose every child even if some of them throw, collecting the thrown errors and re-throwing them
15
+ * as a single {@link AggregateError} once all children have been disposed.
16
+ */
17
+ Aggregate = 0,
18
+ /**
19
+ * Re-throw the first error a child throws immediately, leaving the remaining children undisposed.
20
+ */
21
+ FailFast = 1
22
+ }
23
+ /**
24
+ * Determines the order in which a {@link CombineDisposable} or {@link CombineAsyncDisposable} disposes
25
+ * its children.
26
+ */
27
+ export declare enum DisposeOrder {
28
+ /**
29
+ * Dispose the last-registered child first (last-in, first-out), like nested `using` declarations
30
+ * unwinding in reverse.
31
+ */
32
+ Lifo = 0,
33
+ /**
34
+ * Dispose the first-registered child first (first-in, first-out).
35
+ */
36
+ Fifo = 1
37
+ }
8
38
  /**
9
39
  * Determines how a {@link CallbackDisposable} or {@link AsyncCallbackDisposable} behaves when it is
10
40
  * disposed more than once.
@@ -38,6 +68,19 @@ export interface AsyncCallbackDisposableConstructorParams {
38
68
  */
39
69
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
40
70
  }
71
+ /**
72
+ * An {@link AsyncDisposable} that additionally exposes a convenience {@link AsyncDisposableEx.asyncDispose}
73
+ * method, so a stored handle can be disposed as `handle.asyncDispose()` instead of the clunkier
74
+ * `handle[Symbol.asyncDispose]()`.
75
+ */
76
+ export interface AsyncDisposableEx extends AsyncDisposable {
77
+ /**
78
+ * Disposes the object. Delegates to `this[Symbol.asyncDispose]()`.
79
+ *
80
+ * @returns A {@link Promise} that resolves once disposal completes.
81
+ */
82
+ asyncDispose(): Promise<void>;
83
+ }
41
84
  /**
42
85
  * A callback invoked when an {@link AsyncCallbackDisposable} is disposed.
43
86
  */
@@ -57,6 +100,70 @@ export interface CallbackDisposableConstructorParams {
57
100
  */
58
101
  readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
59
102
  }
103
+ /**
104
+ * The parameters for constructing a {@link CombineAsyncDisposable}.
105
+ */
106
+ export interface CombineAsyncDisposableConstructorParams {
107
+ /**
108
+ * The async disposables to dispose when the combiner is disposed.
109
+ */
110
+ readonly asyncDisposables: Iterable<AsyncDisposable>;
111
+ /**
112
+ * The order in which the children are disposed.
113
+ *
114
+ * @default {@link DisposeOrder.Lifo}
115
+ */
116
+ readonly disposeOrder?: DisposeOrder;
117
+ /**
118
+ * How the combiner behaves when one of its children throws while being disposed.
119
+ *
120
+ * @default {@link DisposeErrorBehavior.Aggregate}
121
+ */
122
+ readonly errorBehavior?: DisposeErrorBehavior;
123
+ /**
124
+ * How the combiner behaves when it is disposed more than once.
125
+ *
126
+ * @default {@link MultipleDisposeBehavior.Invoke}
127
+ */
128
+ readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
129
+ }
130
+ /**
131
+ * The parameters for constructing a {@link CombineDisposable}.
132
+ */
133
+ export interface CombineDisposableConstructorParams {
134
+ /**
135
+ * The disposables to dispose when the combiner is disposed.
136
+ */
137
+ readonly disposables: Iterable<Disposable>;
138
+ /**
139
+ * The order in which the children are disposed.
140
+ *
141
+ * @default {@link DisposeOrder.Lifo}
142
+ */
143
+ readonly disposeOrder?: DisposeOrder;
144
+ /**
145
+ * How the combiner behaves when one of its children throws while being disposed.
146
+ *
147
+ * @default {@link DisposeErrorBehavior.Aggregate}
148
+ */
149
+ readonly errorBehavior?: DisposeErrorBehavior;
150
+ /**
151
+ * How the combiner behaves when it is disposed more than once.
152
+ *
153
+ * @default {@link MultipleDisposeBehavior.Invoke}
154
+ */
155
+ readonly multipleDisposeBehavior?: MultipleDisposeBehavior;
156
+ }
157
+ /**
158
+ * A {@link Disposable} that additionally exposes a convenience {@link DisposableEx.dispose} method, so a
159
+ * stored handle can be disposed as `handle.dispose()` instead of the clunkier `handle[Symbol.dispose]()`.
160
+ */
161
+ export interface DisposableEx extends Disposable {
162
+ /**
163
+ * Disposes the object. Delegates to `this[Symbol.dispose]()`.
164
+ */
165
+ dispose(): void;
166
+ }
60
167
  /**
61
168
  * A callback invoked when a {@link CallbackDisposable} is disposed.
62
169
  */
@@ -65,7 +172,7 @@ export type DisposeCallback = (this: void) => void;
65
172
  * An async disposable that executes a callback when disposed via `await using` (or a manual
66
173
  * `await disposable[Symbol.asyncDispose]()`).
67
174
  */
68
- export declare class AsyncCallbackDisposable implements AsyncDisposable {
175
+ export declare class AsyncCallbackDisposable implements AsyncDisposableEx {
69
176
  private readonly callback;
70
177
  private isDisposed;
71
178
  private readonly multipleDisposeBehavior;
@@ -75,6 +182,13 @@ export declare class AsyncCallbackDisposable implements AsyncDisposable {
75
182
  * @param params - The parameters.
76
183
  */
77
184
  constructor(params: AsyncCallbackDisposableConstructorParams);
185
+ /**
186
+ * Disposes the object by executing the callback. Convenience alias that delegates to
187
+ * `this[Symbol.asyncDispose]()`.
188
+ *
189
+ * @returns A {@link Promise} that resolves once the callback completes.
190
+ */
191
+ asyncDispose(): Promise<void>;
78
192
  /**
79
193
  * Disposes the object by executing the callback.
80
194
  *
@@ -89,7 +203,7 @@ export declare class AsyncCallbackDisposable implements AsyncDisposable {
89
203
  /**
90
204
  * A disposable that executes a callback when disposed.
91
205
  */
92
- export declare class CallbackDisposable implements Disposable {
206
+ export declare class CallbackDisposable implements DisposableEx {
93
207
  private readonly callback;
94
208
  private isDisposed;
95
209
  private readonly multipleDisposeBehavior;
@@ -99,6 +213,11 @@ export declare class CallbackDisposable implements Disposable {
99
213
  * @param params - The parameters.
100
214
  */
101
215
  constructor(params: CallbackDisposableConstructorParams);
216
+ /**
217
+ * Disposes the object by executing the callback. Convenience alias that delegates to
218
+ * `this[Symbol.dispose]()`.
219
+ */
220
+ dispose(): void;
102
221
  /**
103
222
  * Disposes the object by executing the callback.
104
223
  *
@@ -108,6 +227,73 @@ export declare class CallbackDisposable implements Disposable {
108
227
  */
109
228
  [Symbol.dispose](): void;
110
229
  }
230
+ /**
231
+ * An {@link AsyncDisposableEx} that combines multiple async disposables and disposes all of them when it
232
+ * is disposed.
233
+ */
234
+ export declare class CombineAsyncDisposable implements AsyncDisposableEx {
235
+ private readonly children;
236
+ private readonly disposeOrder;
237
+ private readonly errorBehavior;
238
+ private isDisposed;
239
+ private readonly multipleDisposeBehavior;
240
+ /**
241
+ * Creates a new instance of {@link CombineAsyncDisposable}.
242
+ *
243
+ * @param params - The parameters.
244
+ */
245
+ constructor(params: CombineAsyncDisposableConstructorParams);
246
+ /**
247
+ * Disposes all combined children. Convenience alias that delegates to
248
+ * `this[Symbol.asyncDispose]()`.
249
+ *
250
+ * @returns A {@link Promise} that resolves once all children have been disposed.
251
+ */
252
+ asyncDispose(): Promise<void>;
253
+ /**
254
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
255
+ * {@link DisposeErrorBehavior} when a child throws.
256
+ *
257
+ * This method is called automatically when the object is used in an `await using` declaration. It can
258
+ * also be called manually. The behavior on a second and later dispose is controlled by
259
+ * {@link CombineAsyncDisposableConstructorParams.multipleDisposeBehavior}.
260
+ *
261
+ * @returns A {@link Promise} that resolves once all children have been disposed.
262
+ */
263
+ [Symbol.asyncDispose](): Promise<void>;
264
+ private getOrderedChildren;
265
+ }
266
+ /**
267
+ * A {@link DisposableEx} that combines multiple disposables and disposes all of them when it is
268
+ * disposed.
269
+ */
270
+ export declare class CombineDisposable implements DisposableEx {
271
+ private readonly children;
272
+ private readonly disposeOrder;
273
+ private readonly errorBehavior;
274
+ private isDisposed;
275
+ private readonly multipleDisposeBehavior;
276
+ /**
277
+ * Creates a new instance of {@link CombineDisposable}.
278
+ *
279
+ * @param params - The parameters.
280
+ */
281
+ constructor(params: CombineDisposableConstructorParams);
282
+ /**
283
+ * Disposes all combined children. Convenience alias that delegates to `this[Symbol.dispose]()`.
284
+ */
285
+ dispose(): void;
286
+ /**
287
+ * Disposes all combined children in the configured {@link DisposeOrder}, applying the configured
288
+ * {@link DisposeErrorBehavior} when a child throws.
289
+ *
290
+ * This method is called automatically when the object is used in a `using` declaration. It can also
291
+ * be called manually. The behavior on a second and later dispose is controlled by
292
+ * {@link CombineDisposableConstructorParams.multipleDisposeBehavior}.
293
+ */
294
+ [Symbol.dispose](): void;
295
+ private getOrderedChildren;
296
+ }
111
297
  /**
112
298
  * Type guard to check if an object implements the {@link AsyncDisposable} interface.
113
299
  *
@@ -115,6 +301,13 @@ export declare class CallbackDisposable implements Disposable {
115
301
  * @returns Whether the object implements the {@link AsyncDisposable} interface
116
302
  */
117
303
  export declare function isAsyncDisposable(obj: unknown): obj is AsyncDisposable;
304
+ /**
305
+ * Type guard to check if an object implements the {@link AsyncDisposableEx} interface.
306
+ *
307
+ * @param obj - the object to check for the {@link AsyncDisposableEx} interface
308
+ * @returns Whether the object implements the {@link AsyncDisposableEx} interface
309
+ */
310
+ export declare function isAsyncDisposableEx(obj: unknown): obj is AsyncDisposableEx;
118
311
  /**
119
312
  * Type guard to check if an object implements the {@link Disposable} interface.
120
313
  *
@@ -122,3 +315,30 @@ export declare function isAsyncDisposable(obj: unknown): obj is AsyncDisposable;
122
315
  * @returns Whether the object implements the {@link Disposable} interface
123
316
  */
124
317
  export declare function isDisposable(obj: unknown): obj is Disposable;
318
+ /**
319
+ * Type guard to check if an object implements the {@link DisposableEx} interface.
320
+ *
321
+ * @param obj - the object to check for the {@link DisposableEx} interface
322
+ * @returns Whether the object implements the {@link DisposableEx} interface
323
+ */
324
+ export declare function isDisposableEx(obj: unknown): obj is DisposableEx;
325
+ /**
326
+ * Adapts a plain {@link AsyncDisposable} into an {@link AsyncDisposableEx} by adding a convenience
327
+ * {@link AsyncDisposableEx.asyncDispose} method that delegates to `Symbol.asyncDispose`.
328
+ *
329
+ * If the object already implements {@link AsyncDisposableEx}, it is returned unchanged.
330
+ *
331
+ * @param asyncDisposable - the async disposable to adapt
332
+ * @returns An {@link AsyncDisposableEx} wrapping the async disposable.
333
+ */
334
+ export declare function toAsyncDisposableEx(asyncDisposable: AsyncDisposable): AsyncDisposableEx;
335
+ /**
336
+ * Adapts a plain {@link Disposable} into a {@link DisposableEx} by adding a convenience
337
+ * {@link DisposableEx.dispose} method that delegates to `Symbol.dispose`.
338
+ *
339
+ * If the object already implements {@link DisposableEx}, it is returned unchanged.
340
+ *
341
+ * @param disposable - the disposable to adapt
342
+ * @returns A {@link DisposableEx} wrapping the disposable.
343
+ */
344
+ export declare function toDisposableEx(disposable: Disposable): DisposableEx;