obsidian-dev-utils 85.1.0 → 86.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.
- package/@types/obsidian-integration-testing/package.json +4 -0
- package/CHANGELOG.md +20 -0
- package/README.md +14 -8
- package/dist/lib/cjs/@types/obsidian-integration-testing.d.cts +18 -0
- package/dist/lib/cjs/__merged.cjs +1291 -0
- package/dist/lib/cjs/__merged.d.cts +165 -0
- package/dist/lib/cjs/abort-controller.cjs +3 -4
- package/dist/lib/cjs/async.cjs +13 -7
- package/dist/lib/cjs/async.d.cts +6 -0
- package/dist/lib/cjs/disposable.cjs +224 -3
- package/dist/lib/cjs/disposable.d.cts +222 -2
- package/dist/lib/cjs/error.cjs +41 -3
- package/dist/lib/cjs/error.d.cts +50 -1
- package/dist/lib/cjs/generated-during-build.cjs +2 -2
- package/dist/lib/cjs/index.cjs +4 -1
- package/dist/lib/cjs/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/attachment-path.cjs +3 -3
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.cjs +27 -11
- package/dist/lib/cjs/obsidian/command-handlers/command-handler-component.d.cts +14 -9
- package/dist/lib/cjs/obsidian/command-handlers/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/command-handlers/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.cjs +195 -0
- package/dist/lib/cjs/obsidian/command-handlers/open-demo-vault-command-handler.d.cts +65 -0
- package/dist/lib/cjs/obsidian/community-plugins.cjs +156 -0
- package/dist/lib/cjs/obsidian/community-plugins.d.cts +22 -0
- package/dist/lib/cjs/obsidian/components/disposable-component.cjs +8 -8
- package/dist/lib/cjs/obsidian/components/disposable-component.d.cts +9 -3
- package/dist/lib/cjs/obsidian/components/monkey-around-component.cjs +17 -2
- package/dist/lib/cjs/obsidian/components/monkey-around-component.d.cts +17 -0
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.cjs +161 -22
- package/dist/lib/cjs/obsidian/components/plugin-notice-component.d.cts +81 -8
- package/dist/lib/cjs/obsidian/css-class.cjs +4 -1
- package/dist/lib/cjs/obsidian/css-class.d.cts +13 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.cjs +239 -0
- package/dist/lib/cjs/obsidian/desktop-demo-vault-opener.d.cts +45 -0
- package/dist/lib/cjs/obsidian/desktop-trusted-input.cjs +215 -0
- package/dist/lib/cjs/obsidian/desktop-trusted-input.d.cts +135 -0
- package/dist/lib/cjs/obsidian/i18n/locales/en.cjs +3 -1
- package/dist/lib/cjs/obsidian/i18n/locales/en.d.cts +2 -0
- package/dist/lib/cjs/obsidian/i18n/locales/translations-map.d.cts +2 -0
- package/dist/lib/cjs/obsidian/index.cjs +10 -1
- package/dist/lib/cjs/obsidian/index.d.cts +3 -0
- package/dist/lib/cjs/obsidian/link.cjs +2 -2
- package/dist/lib/cjs/obsidian/modals/index.cjs +4 -1
- package/dist/lib/cjs/obsidian/modals/index.d.cts +1 -0
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.cjs +15 -2
- package/dist/lib/cjs/obsidian/modals/minimizable-modal.d.cts +18 -3
- package/dist/lib/cjs/obsidian/modals/select-option.cjs +182 -0
- package/dist/lib/cjs/obsidian/modals/select-option.d.cts +65 -0
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.cjs +4 -1
- package/dist/lib/cjs/obsidian/plugin/obsidian-plugin-repo-paths.d.cts +6 -0
- package/dist/lib/cjs/obsidian/plugin/plugin.cjs +50 -3
- package/dist/lib/cjs/obsidian/plugin/plugin.d.cts +17 -0
- package/dist/lib/cjs/obsidian/workspace.cjs +8 -1
- package/dist/lib/cjs/obsidian/workspace.d.cts +10 -0
- package/dist/lib/cjs/path.cjs +4 -4
- package/dist/lib/cjs/path.d.cts +1 -1
- package/dist/lib/cjs/script-utils/demo-vault.cjs +177 -0
- package/dist/lib/cjs/script-utils/demo-vault.d.cts +23 -0
- package/dist/lib/cjs/script-utils/exec.cjs +75 -34
- package/dist/lib/cjs/script-utils/exec.d.cts +34 -0
- package/dist/lib/cjs/script-utils/index.cjs +9 -3
- package/dist/lib/cjs/script-utils/index.d.cts +2 -0
- package/dist/lib/cjs/script-utils/linters/eslint-no-restricted-syntax.cjs +1 -5
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.cjs +5 -1
- package/dist/lib/cjs/script-utils/obsidian-dev-utils-repo-paths.d.cts +8 -0
- package/dist/lib/cjs/script-utils/version.cjs +8 -1
- package/dist/lib/cjs/script-utils/version.d.cts +8 -0
- package/dist/lib/cjs/script-utils/warnings-as-errors.cjs +157 -0
- package/dist/lib/cjs/script-utils/warnings-as-errors.d.cts +27 -0
- package/dist/lib/cjs/setup.cjs +75 -4
- package/dist/lib/cjs/setup.d.cts +29 -7
- package/dist/lib/cjs/string.cjs +7 -4
- package/dist/lib/cjs/string.d.cts +11 -1
- package/dist/lib/esm/@types/obsidian-integration-testing.d.mts +18 -0
- package/dist/lib/esm/__merged.d.mts +165 -0
- package/dist/lib/esm/__merged.mjs +1134 -0
- package/dist/lib/esm/abort-controller.mjs +7 -5
- package/dist/lib/esm/async.d.mts +6 -0
- package/dist/lib/esm/async.mjs +13 -7
- package/dist/lib/esm/disposable.d.mts +222 -2
- package/dist/lib/esm/disposable.mjs +215 -2
- package/dist/lib/esm/error.d.mts +50 -1
- package/dist/lib/esm/error.mjs +41 -4
- package/dist/lib/esm/generated-during-build.mjs +2 -2
- package/dist/lib/esm/index.d.mts +1 -0
- package/dist/lib/esm/index.mjs +3 -1
- package/dist/lib/esm/obsidian/attachment-path.mjs +4 -4
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.d.mts +14 -9
- package/dist/lib/esm/obsidian/command-handlers/command-handler-component.mjs +31 -11
- package/dist/lib/esm/obsidian/command-handlers/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/command-handlers/index.mjs +3 -1
- package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.d.mts +65 -0
- package/dist/lib/esm/obsidian/command-handlers/open-demo-vault-command-handler.mjs +77 -0
- package/dist/lib/esm/obsidian/community-plugins.d.mts +22 -0
- package/dist/lib/esm/obsidian/community-plugins.mjs +48 -0
- package/dist/lib/esm/obsidian/components/disposable-component.d.mts +9 -3
- package/dist/lib/esm/obsidian/components/disposable-component.mjs +8 -8
- package/dist/lib/esm/obsidian/components/monkey-around-component.d.mts +17 -0
- package/dist/lib/esm/obsidian/components/monkey-around-component.mjs +17 -2
- package/dist/lib/esm/obsidian/components/plugin-notice-component.d.mts +81 -8
- package/dist/lib/esm/obsidian/components/plugin-notice-component.mjs +163 -23
- package/dist/lib/esm/obsidian/css-class.d.mts +13 -0
- package/dist/lib/esm/obsidian/css-class.mjs +4 -1
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.d.mts +45 -0
- package/dist/lib/esm/obsidian/desktop-demo-vault-opener.mjs +121 -0
- package/dist/lib/esm/obsidian/desktop-trusted-input.d.mts +135 -0
- package/dist/lib/esm/obsidian/desktop-trusted-input.mjs +103 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.d.mts +2 -0
- package/dist/lib/esm/obsidian/i18n/locales/en.mjs +3 -1
- package/dist/lib/esm/obsidian/i18n/locales/translations-map.d.mts +2 -0
- package/dist/lib/esm/obsidian/index.d.mts +3 -0
- package/dist/lib/esm/obsidian/index.mjs +7 -1
- package/dist/lib/esm/obsidian/link.mjs +3 -3
- package/dist/lib/esm/obsidian/modals/index.d.mts +1 -0
- package/dist/lib/esm/obsidian/modals/index.mjs +3 -1
- package/dist/lib/esm/obsidian/modals/minimizable-modal.d.mts +18 -3
- package/dist/lib/esm/obsidian/modals/minimizable-modal.mjs +17 -3
- package/dist/lib/esm/obsidian/modals/select-option.d.mts +65 -0
- package/dist/lib/esm/obsidian/modals/select-option.mjs +77 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.d.mts +6 -0
- package/dist/lib/esm/obsidian/plugin/obsidian-plugin-repo-paths.mjs +4 -1
- package/dist/lib/esm/obsidian/plugin/plugin.d.mts +17 -0
- package/dist/lib/esm/obsidian/plugin/plugin.mjs +50 -3
- package/dist/lib/esm/obsidian/workspace.d.mts +10 -0
- package/dist/lib/esm/obsidian/workspace.mjs +7 -1
- package/dist/lib/esm/path.d.mts +1 -1
- package/dist/lib/esm/path.mjs +3 -3
- package/dist/lib/esm/script-utils/demo-vault.d.mts +23 -0
- package/dist/lib/esm/script-utils/demo-vault.mjs +63 -0
- package/dist/lib/esm/script-utils/exec.d.mts +34 -0
- package/dist/lib/esm/script-utils/exec.mjs +73 -34
- package/dist/lib/esm/script-utils/index.d.mts +2 -0
- package/dist/lib/esm/script-utils/index.mjs +6 -2
- package/dist/lib/esm/script-utils/linters/eslint-no-restricted-syntax.mjs +1 -5
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.d.mts +8 -0
- package/dist/lib/esm/script-utils/obsidian-dev-utils-repo-paths.mjs +5 -1
- package/dist/lib/esm/script-utils/version.d.mts +8 -0
- package/dist/lib/esm/script-utils/version.mjs +8 -1
- package/dist/lib/esm/script-utils/warnings-as-errors.d.mts +27 -0
- package/dist/lib/esm/script-utils/warnings-as-errors.mjs +38 -0
- package/dist/lib/esm/setup.d.mts +29 -7
- package/dist/lib/esm/setup.mjs +78 -4
- package/dist/lib/esm/string.d.mts +11 -1
- package/dist/lib/esm/string.mjs +5 -3
- package/dist/styles.css +33 -3
- package/obsidian/command-handlers/open-demo-vault-command-handler/package.json +6 -0
- package/obsidian/community-plugins/package.json +6 -0
- package/obsidian/desktop-demo-vault-opener/package.json +6 -0
- package/obsidian/desktop-trusted-input/package.json +6 -0
- package/obsidian/modals/select-option/package.json +6 -0
- package/package.json +22 -9
- package/script-utils/demo-vault/package.json +6 -0
- package/script-utils/warnings-as-errors/package.json +6 -0
- package/dist/dev/main.js +0 -32702
- package/dist/dev/manifest.json +0 -9
- /package/obsidian/@types/{Dataview → dataview}/api/data-array/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/api/extensions/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/api/inline-api/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/api/plugin-api/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/api/result/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/common/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/csv/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/inline-field/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/markdown-file/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/persister/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-entry/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-impl/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-import/web-worker/import-manager/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-index/index/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-index/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-index/resolver/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-index/source/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-model/markdown/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-model/serialized/markdown/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-model/transferable/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/data-model/value/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/expression/binaryop/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/expression/context/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/expression/field/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/expression/functions/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/expression/parse/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/index/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/main/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/query/engine/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/query/parse/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/query/query/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/settings/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/typings/obsidian-ex/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/typings/workers/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/export/markdown/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/lp-render/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/markdown/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/refreshable-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/render/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/calendar-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/inline-field-live-preview/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/inline-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/js-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/list-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/table-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/ui/views/task-view/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/util/hash/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/util/locale/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/util/media/package.json +0 -0
- /package/obsidian/@types/{Dataview → dataview}/util/normalize/package.json +0 -0
- /package/obsidian/{App → app}/package.json +0 -0
- /package/obsidian/{Backlink → backlink}/package.json +0 -0
- /package/obsidian/{Callout → callout}/package.json +0 -0
- /package/obsidian/{Components → components}/abort-signal-component/package.json +0 -0
- /package/obsidian/{Components → components}/all-windows-event-component/package.json +0 -0
- /package/obsidian/{Components → components}/async-error-handler-component/package.json +0 -0
- /package/obsidian/{Components → components}/async-events-component/package.json +0 -0
- /package/obsidian/{Components → components}/case-insensitive-file-index-component/package.json +0 -0
- /package/obsidian/{Components → components}/component-ex/package.json +0 -0
- /package/obsidian/{Components → components}/console-debug-component/package.json +0 -0
- /package/obsidian/{Components → components}/disposable-component/package.json +0 -0
- /package/obsidian/{Components → components}/embed-extensions-component/package.json +0 -0
- /package/obsidian/{Components → components}/generate-markdown-link-default-params-component/package.json +0 -0
- /package/obsidian/{Components → components}/index/package.json +0 -0
- /package/obsidian/{Components → components}/layout-ready-component/package.json +0 -0
- /package/obsidian/{Components → components}/menu-event-registrar-component/package.json +0 -0
- /package/obsidian/{Components → components}/monkey-around-component/package.json +0 -0
- /package/obsidian/{Components → components}/package.json +0 -0
- /package/obsidian/{Components → components}/plugin-context-component/package.json +0 -0
- /package/obsidian/{Components → components}/plugin-notice-component/package.json +0 -0
- /package/obsidian/{Components → components}/plugin-settings-component/package.json +0 -0
- /package/obsidian/{Components → components}/plugin-settings-tab-component/package.json +0 -0
- /package/obsidian/{Components → components}/registry-component/package.json +0 -0
- /package/obsidian/{Components → components}/rename-delete-handler-component/package.json +0 -0
- /package/obsidian/{Dataview → dataview}/package.json +0 -0
- /package/obsidian/{Editor → editor}/package.json +0 -0
- /package/obsidian/{Frontmatter → frontmatter}/package.json +0 -0
- /package/obsidian/{Link → link}/package.json +0 -0
- /package/obsidian/{Logger → logger}/package.json +0 -0
- /package/obsidian/{Loop → loop}/package.json +0 -0
- /package/obsidian/{Markdown → markdown}/package.json +0 -0
- /package/obsidian/{Modals/Alert → modals/alert}/package.json +0 -0
- /package/obsidian/{Modals/Confirm → modals/confirm}/package.json +0 -0
- /package/obsidian/{Modals → modals}/index/package.json +0 -0
- /package/obsidian/{Modals → modals}/minimizable-modal/package.json +0 -0
- /package/obsidian/{Modals → modals}/modal/package.json +0 -0
- /package/obsidian/{Modals → modals}/package.json +0 -0
- /package/obsidian/{Modals/Prompt → modals/prompt}/package.json +0 -0
- /package/obsidian/{Modals → modals}/select-item/package.json +0 -0
- /package/obsidian/{Modals → modals}/suggest-modal-command-builder/package.json +0 -0
- /package/obsidian/{Pdf → pdf}/package.json +0 -0
- /package/obsidian/{Plugin → plugin}/index/package.json +0 -0
- /package/obsidian/{Plugin → plugin}/obsidian-plugin-repo-paths/package.json +0 -0
- /package/obsidian/{Plugin → plugin}/package.json +0 -0
- /package/obsidian/{Plugin/Plugin → plugin/plugin}/package.json +0 -0
- /package/obsidian/{Plugin → plugin}/plugin-context/package.json +0 -0
- /package/obsidian/{Plugin → plugin}/plugin-event-source/package.json +0 -0
- /package/obsidian/{Plugin → plugin}/plugin-settings-tab/package.json +0 -0
- /package/obsidian/{Queue → queue}/package.json +0 -0
- /package/obsidian/{React → react}/app-context/package.json +0 -0
- /package/obsidian/{React → react}/index/package.json +0 -0
- /package/obsidian/{React → react}/package.json +0 -0
- /package/obsidian/{Reference → reference}/package.json +0 -0
- /package/obsidian/{Validation → validation}/package.json +0 -0
- /package/obsidian/{Vault → vault}/package.json +0 -0
- /package/obsidian/{Workspace → workspace}/package.json +0 -0
- /package/{Transformers → transformers}/date-transformer/package.json +0 -0
- /package/{Transformers → transformers}/duration-transformer/package.json +0 -0
- /package/{Transformers → transformers}/group-transformer/package.json +0 -0
- /package/{Transformers → transformers}/index/package.json +0 -0
- /package/{Transformers → transformers}/map-transformer/package.json +0 -0
- /package/{Transformers → transformers}/package.json +0 -0
- /package/{Transformers → transformers}/set-transformer/package.json +0 -0
- /package/{Transformers → transformers}/skip-private-property-transformer/package.json +0 -0
- /package/{Transformers/Transformer → transformers/transformer}/package.json +0 -0
- /package/{Transformers → transformers}/two-way-map-transformer/package.json +0 -0
- /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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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;
|