angular-toolbox 0.0.7 → 0.9.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/LICENSE +21 -0
- package/README.md +14 -10
- package/{esm2020 → esm2022}/angular-toolbox.mjs +4 -4
- package/esm2022/lib/angular-toolbox.module.mjs +21 -0
- package/esm2022/lib/core/bridge/app-bridge.mjs +76 -0
- package/esm2022/lib/core/error/app-bridge-error.mjs +24 -0
- package/esm2022/lib/core/error/http-mock-service-error.mjs +26 -0
- package/esm2022/lib/core/error/index.mjs +5 -0
- package/esm2022/lib/core/error/integrity-error.mjs +26 -0
- package/esm2022/lib/core/error/subscription-error.mjs +26 -0
- package/esm2022/lib/core/impl/index.mjs +2 -0
- package/esm2022/lib/core/impl/lang/identifiable-component.mjs +31 -0
- package/esm2022/lib/core/impl/lang/index.mjs +2 -0
- package/esm2022/lib/core/impl/version/version.impl.mjs +34 -0
- package/esm2022/lib/core/index.mjs +3 -0
- package/esm2022/lib/directive/anchor-link.directive.mjs +62 -0
- package/esm2022/lib/directive/button-role.directive.mjs +102 -0
- package/esm2022/lib/directive/content-renderer.directive.mjs +61 -0
- package/esm2022/lib/directive/index.mjs +5 -0
- package/esm2022/lib/directive/navigate-to-url.directive.mjs +51 -0
- package/esm2022/lib/directive/navigation-directive-base.mjs +23 -0
- package/esm2022/lib/framework/index.mjs +2 -0
- package/esm2022/lib/framework/mock/http/config/http-mock-parameters.mjs +9 -0
- package/esm2022/lib/framework/mock/http/config/http-mock.decorator.mjs +48 -0
- package/esm2022/lib/framework/mock/http/config/index.mjs +3 -0
- package/esm2022/lib/framework/mock/http/config/route-mock-config.mjs +9 -0
- package/esm2022/lib/framework/mock/http/core/data-storage.mjs +9 -0
- package/esm2022/lib/framework/mock/http/event/event-target.impl.mjs +122 -0
- package/esm2022/lib/framework/mock/http/event/progress-event-mock.mjs +48 -0
- package/esm2022/lib/framework/mock/http/index.mjs +4 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/constants.mjs +111 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/escape-to-regexp-string.mjs +34 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/get-flags.mjs +28 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/iter.mjs +76 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/lexer.mjs +96 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/loose-replacer.mjs +28 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/decode-key-to-string.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/encode.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/key.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/lex-token.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/lexer-type.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/loose-replacer-provider.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/non-delimiter-encoder-provider.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/parse-options.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/path-to-regexp-options.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/route-string-tokenizer.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/simple-tokens.mjs +30 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/token-data-regexp-factory.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/token-type.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/model/token.mjs +17 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/string-to-token-data.mjs +87 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/to-key-regexp.mjs +41 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/to-stringify.mjs +29 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/token-data-to-regexp.mjs +49 -0
- package/esm2022/lib/framework/mock/http/path-to-regexp/token-data.mjs +33 -0
- package/esm2022/lib/framework/mock/http/util/data-storage.builder.mjs +35 -0
- package/esm2022/lib/framework/mock/http/util/http-headers-mock.builder.mjs +138 -0
- package/esm2022/lib/framework/mock/http/util/http-headers.util.mjs +56 -0
- package/esm2022/lib/framework/mock/http/util/http-method-ref.enum.mjs +60 -0
- package/esm2022/lib/framework/mock/http/util/http-mock-response.builder.mjs +117 -0
- package/esm2022/lib/framework/mock/http/util/index.mjs +3 -0
- package/esm2022/lib/framework/mock/http/xhr/delegate-xhr.mjs +316 -0
- package/esm2022/lib/framework/mock/http/xhr/http-mock-factory.impl.mjs +29 -0
- package/esm2022/lib/framework/mock/http/xhr/http-mock-factory.mjs +19 -0
- package/esm2022/lib/framework/mock/http/xhr/index.mjs +2 -0
- package/esm2022/lib/framework/mock/http/xhr/xhr-base.mjs +123 -0
- package/esm2022/lib/framework/mock/http/xhr/xhr-proxy-impl.mjs +177 -0
- package/esm2022/lib/model/business/index.mjs +5 -0
- package/esm2022/lib/model/business/lang/app-bridge-command.mjs +9 -0
- package/esm2022/lib/model/business/lang/destroyable.mjs +9 -0
- package/esm2022/lib/model/business/lang/identifiable.mjs +9 -0
- package/esm2022/lib/model/business/lang/index.mjs +5 -0
- package/esm2022/lib/model/business/lang/instantiable.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/http-method-mock.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/http-mock-config.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/http-mock-endpoint.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/http-mock-error.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/http-mock-interceptor.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/http-response-mock.mjs +9 -0
- package/esm2022/lib/model/business/mock/http/index.mjs +8 -0
- package/esm2022/lib/model/business/mock/http/xhr-proxy.mjs +9 -0
- package/esm2022/lib/model/business/ui/dark-mode-config.mjs +9 -0
- package/esm2022/lib/model/business/ui/dark-mode-config.provider.mjs +43 -0
- package/esm2022/lib/model/business/ui/dark-mode.constant.mjs +16 -0
- package/esm2022/lib/model/business/ui/index.mjs +5 -0
- package/esm2022/lib/model/business/ui/scroll-behavior.type.mjs +9 -0
- package/esm2022/lib/model/business/version/index.mjs +4 -0
- package/esm2022/lib/model/business/version/version-config.mjs +9 -0
- package/esm2022/lib/model/business/version/version-config.provider.mjs +40 -0
- package/esm2022/lib/model/business/version/version.mjs +10 -0
- package/esm2022/lib/model/index.mjs +3 -0
- package/esm2022/lib/model/service/index.mjs +5 -0
- package/esm2022/lib/model/service/mock/http/http-mock.service.mjs +239 -0
- package/esm2022/lib/model/service/subscription/subscription.service.mjs +122 -0
- package/esm2022/lib/model/service/ui/app-bridge.service.mjs +142 -0
- package/esm2022/lib/model/service/ui/dark-mode.service.mjs +183 -0
- package/esm2022/lib/model/service/ui/index.mjs +4 -0
- package/esm2022/lib/model/service/ui/scroll.service.mjs +93 -0
- package/esm2022/lib/model/service/version/version.service.mjs +51 -0
- package/{esm2020 → esm2022}/lib/pipe/index.mjs +1 -1
- package/esm2022/lib/pipe/safe/safe-html.pipe.mjs +34 -0
- package/esm2022/lib/util/aria-role.constant.mjs +16 -0
- package/esm2022/lib/util/default-scroll-behavior.mjs +13 -0
- package/esm2022/lib/util/empty-string.const.mjs +12 -0
- package/esm2022/lib/util/index.mjs +5 -0
- package/esm2022/lib/util/js-type.mjs +40 -0
- package/esm2022/lib/util/uuid.mjs +126 -0
- package/esm2022/public-api.mjs +18 -0
- package/fesm2022/angular-toolbox.mjs +3710 -0
- package/fesm2022/angular-toolbox.mjs.map +1 -0
- package/index.d.ts +5 -5
- package/lib/angular-toolbox.module.d.ts +9 -7
- package/lib/core/bridge/app-bridge.d.ts +59 -0
- package/lib/core/error/app-bridge-error.d.ts +16 -0
- package/lib/core/error/http-mock-service-error.d.ts +18 -0
- package/lib/core/error/index.d.ts +4 -0
- package/lib/core/error/integrity-error.d.ts +18 -0
- package/lib/core/error/subscription-error.d.ts +18 -0
- package/lib/core/impl/index.d.ts +1 -0
- package/lib/core/impl/lang/identifiable-component.d.ts +26 -0
- package/lib/core/impl/lang/index.d.ts +1 -0
- package/lib/core/impl/version/version.impl.d.ts +42 -0
- package/lib/core/index.d.ts +2 -0
- package/lib/directive/anchor-link.directive.d.ts +29 -0
- package/lib/directive/button-role.directive.d.ts +52 -0
- package/lib/directive/content-renderer.directive.d.ts +39 -0
- package/lib/directive/index.d.ts +4 -0
- package/lib/directive/navigate-to-url.directive.d.ts +23 -0
- package/lib/directive/navigation-directive-base.d.ts +19 -0
- package/lib/framework/index.d.ts +1 -0
- package/lib/framework/mock/http/config/http-mock-parameters.d.ts +13 -0
- package/lib/framework/mock/http/config/http-mock.decorator.d.ts +13 -0
- package/lib/framework/mock/http/config/index.d.ts +2 -0
- package/lib/framework/mock/http/config/route-mock-config.d.ts +30 -0
- package/lib/framework/mock/http/core/data-storage.d.ts +38 -0
- package/lib/framework/mock/http/event/event-target.impl.d.ts +70 -0
- package/lib/framework/mock/http/event/progress-event-mock.d.ts +36 -0
- package/lib/framework/mock/http/index.d.ts +3 -0
- package/lib/framework/mock/http/path-to-regexp/constants.d.ts +111 -0
- package/lib/framework/mock/http/path-to-regexp/escape-to-regexp-string.d.ts +24 -0
- package/lib/framework/mock/http/path-to-regexp/get-flags.d.ts +25 -0
- package/lib/framework/mock/http/path-to-regexp/iter.d.ts +50 -0
- package/lib/framework/mock/http/path-to-regexp/lexer.d.ts +24 -0
- package/lib/framework/mock/http/path-to-regexp/loose-replacer.d.ts +25 -0
- package/lib/framework/mock/http/path-to-regexp/model/decode-key-to-string.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/model/encode.d.ts +20 -0
- package/lib/framework/mock/http/path-to-regexp/model/key.d.ts +45 -0
- package/lib/framework/mock/http/path-to-regexp/model/lex-token.d.ts +34 -0
- package/lib/framework/mock/http/path-to-regexp/model/lexer-type.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/model/loose-replacer-provider.d.ts +20 -0
- package/lib/framework/mock/http/path-to-regexp/model/non-delimiter-encoder-provider.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/model/parse-options.d.ts +33 -0
- package/lib/framework/mock/http/path-to-regexp/model/path-to-regexp-options.d.ts +52 -0
- package/lib/framework/mock/http/path-to-regexp/model/route-string-tokenizer.d.ts +22 -0
- package/lib/framework/mock/http/path-to-regexp/model/simple-tokens.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/model/token-data-regexp-factory.d.ts +23 -0
- package/lib/framework/mock/http/path-to-regexp/model/token-type.d.ts +20 -0
- package/lib/framework/mock/http/path-to-regexp/model/token.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/string-to-token-data.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/to-key-regexp.d.ts +22 -0
- package/lib/framework/mock/http/path-to-regexp/to-stringify.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/token-data-to-regexp.d.ts +21 -0
- package/lib/framework/mock/http/path-to-regexp/token-data.d.ts +32 -0
- package/lib/framework/mock/http/util/data-storage.builder.d.ts +25 -0
- package/lib/framework/mock/http/util/http-headers-mock.builder.d.ts +106 -0
- package/lib/framework/mock/http/util/http-headers.util.d.ts +31 -0
- package/lib/framework/mock/http/util/http-method-ref.enum.d.ts +58 -0
- package/lib/framework/mock/http/util/http-mock-response.builder.d.ts +83 -0
- package/lib/framework/mock/http/util/index.d.ts +2 -0
- package/lib/framework/mock/http/xhr/delegate-xhr.d.ts +199 -0
- package/lib/framework/mock/http/xhr/http-mock-factory.d.ts +14 -0
- package/lib/framework/mock/http/xhr/http-mock-factory.impl.d.ts +24 -0
- package/lib/framework/mock/http/xhr/index.d.ts +1 -0
- package/lib/framework/mock/http/xhr/xhr-base.d.ts +123 -0
- package/lib/framework/mock/http/xhr/xhr-proxy-impl.d.ts +125 -0
- package/lib/model/business/index.d.ts +4 -0
- package/lib/model/business/lang/app-bridge-command.d.ts +11 -0
- package/lib/model/business/lang/destroyable.d.ts +16 -0
- package/lib/model/business/lang/identifiable.d.ts +19 -0
- package/lib/model/business/lang/index.d.ts +4 -0
- package/lib/model/business/lang/instantiable.d.ts +15 -0
- package/lib/model/business/mock/http/http-method-mock.d.ts +35 -0
- package/lib/model/business/mock/http/http-mock-config.d.ts +28 -0
- package/lib/model/business/mock/http/http-mock-endpoint.d.ts +41 -0
- package/lib/model/business/mock/http/http-mock-error.d.ts +21 -0
- package/lib/model/business/mock/http/http-mock-interceptor.d.ts +27 -0
- package/lib/model/business/mock/http/http-response-mock.d.ts +44 -0
- package/lib/model/business/mock/http/index.d.ts +7 -0
- package/lib/model/business/mock/http/xhr-proxy.d.ts +15 -0
- package/lib/model/business/ui/dark-mode-config.d.ts +29 -0
- package/lib/model/business/ui/dark-mode-config.provider.d.ts +21 -0
- package/lib/model/business/ui/dark-mode.constant.d.ts +15 -0
- package/lib/model/business/ui/index.d.ts +4 -0
- package/lib/model/business/ui/scroll-behavior.type.d.ts +11 -0
- package/lib/model/business/version/index.d.ts +3 -0
- package/lib/model/business/version/version-config.d.ts +28 -0
- package/lib/model/business/version/version-config.provider.d.ts +22 -0
- package/lib/model/business/version/version.d.ts +34 -0
- package/lib/model/index.d.ts +2 -0
- package/lib/model/service/index.d.ts +4 -0
- package/lib/model/service/mock/http/http-mock.service.d.ts +101 -0
- package/lib/model/service/subscription/subscription.service.d.ts +66 -0
- package/lib/model/service/ui/app-bridge.service.d.ts +80 -0
- package/lib/model/service/ui/dark-mode.service.d.ts +99 -0
- package/lib/model/service/ui/index.d.ts +3 -0
- package/lib/model/service/ui/scroll.service.d.ts +55 -0
- package/lib/model/service/version/version.service.d.ts +30 -0
- package/lib/pipe/index.d.ts +1 -1
- package/lib/pipe/safe/safe-html.pipe.d.ts +30 -10
- package/lib/util/aria-role.constant.d.ts +15 -0
- package/lib/util/default-scroll-behavior.d.ts +12 -0
- package/lib/util/empty-string.const.d.ts +11 -0
- package/lib/util/index.d.ts +4 -0
- package/lib/util/js-type.d.ts +39 -0
- package/lib/util/uuid.d.ts +89 -0
- package/package.json +10 -13
- package/public-api.d.ts +14 -3
- package/esm2020/lib/angular-toolbox.module.mjs +0 -26
- package/esm2020/lib/pipe/safe/safe-html.pipe.mjs +0 -18
- package/esm2020/lib/service/index.mjs +0 -3
- package/esm2020/lib/service/subscription/subscription.service.mjs +0 -60
- package/esm2020/lib/service/ui/dark-mode.service.mjs +0 -167
- package/esm2020/public-api.mjs +0 -7
- package/fesm2015/angular-toolbox.mjs +0 -278
- package/fesm2015/angular-toolbox.mjs.map +0 -1
- package/fesm2020/angular-toolbox.mjs +0 -274
- package/fesm2020/angular-toolbox.mjs.map +0 -1
- package/lib/service/index.d.ts +0 -2
- package/lib/service/subscription/subscription.service.d.ts +0 -33
- package/lib/service/ui/dark-mode.service.d.ts +0 -92
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Pascal ECHEMANN. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be found in
|
|
6
|
+
* the LICENSE file at https://pascalechemann.com/angular-toolbox/resources/license
|
|
7
|
+
*/
|
|
8
|
+
/**
|
|
9
|
+
* The default provider for the `VersionService` configuration. You typically define
|
|
10
|
+
* the custom properties in the main `NgModule` declaration to initialize the application
|
|
11
|
+
* config:
|
|
12
|
+
*
|
|
13
|
+
* @NgModule({
|
|
14
|
+
* ...
|
|
15
|
+
* providers: [
|
|
16
|
+
* { provide: VERSION_CONFIG, useValue: { major: 1, minor: 2, patch: 12 } }
|
|
17
|
+
* ],
|
|
18
|
+
* ...
|
|
19
|
+
* });
|
|
20
|
+
*/
|
|
21
|
+
export const VERSION_CONFIG = {
|
|
22
|
+
/**
|
|
23
|
+
* Specifies the major number of this config.
|
|
24
|
+
*/
|
|
25
|
+
major: 0,
|
|
26
|
+
/**
|
|
27
|
+
* Specifies the minor number of this config.
|
|
28
|
+
*/
|
|
29
|
+
minor: 0,
|
|
30
|
+
/**
|
|
31
|
+
* Specifies the patch number of this config.
|
|
32
|
+
*/
|
|
33
|
+
patch: 0,
|
|
34
|
+
/**
|
|
35
|
+
* Specifies the timestamp that corresponds to the build date for this `Version` object.
|
|
36
|
+
* Default value is `NaN`.
|
|
37
|
+
*/
|
|
38
|
+
buildTimestamp: NaN
|
|
39
|
+
};
|
|
40
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi1jb25maWcucHJvdmlkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9tb2RlbC9idXNpbmVzcy92ZXJzaW9uL3ZlcnNpb24tY29uZmlnLnByb3ZpZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7R0FNRztBQUlIOzs7Ozs7Ozs7Ozs7R0FZRztBQUNILE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBa0I7SUFFekM7O09BRUc7SUFDSCxLQUFLLEVBQUUsQ0FBQztJQUVSOztPQUVHO0lBQ0gsS0FBSyxFQUFFLENBQUM7SUFFUjs7T0FFRztJQUNILEtBQUssRUFBRSxDQUFDO0lBRVI7OztPQUdHO0lBQ0gsY0FBYyxFQUFFLEdBQUc7Q0FDdEIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgUGFzY2FsIEVDSEVNQU5OLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKlxyXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpblxyXG4gKiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcGFzY2FsZWNoZW1hbm4uY29tL2FuZ3VsYXItdG9vbGJveC9yZXNvdXJjZXMvbGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IFZlcnNpb25Db25maWcgfSBmcm9tIFwiLi92ZXJzaW9uLWNvbmZpZ1wiO1xyXG5cclxuLyoqXHJcbiAqIFRoZSBkZWZhdWx0IHByb3ZpZGVyIGZvciB0aGUgYFZlcnNpb25TZXJ2aWNlYCBjb25maWd1cmF0aW9uLiBZb3UgdHlwaWNhbGx5IGRlZmluZVxyXG4gKiB0aGUgY3VzdG9tIHByb3BlcnRpZXMgaW4gdGhlIG1haW4gYE5nTW9kdWxlYCBkZWNsYXJhdGlvbiB0byBpbml0aWFsaXplIHRoZSBhcHBsaWNhdGlvblxyXG4gKiBjb25maWc6XHJcbiAqIFxyXG4gKiBATmdNb2R1bGUoe1xyXG4gKiAuLi5cclxuICogcHJvdmlkZXJzOiBbXHJcbiAqICAgeyBwcm92aWRlOiBWRVJTSU9OX0NPTkZJRywgdXNlVmFsdWU6IHsgbWFqb3I6IDEsIG1pbm9yOiAyLCBwYXRjaDogMTIgfSB9XHJcbiAqIF0sXHJcbiAqIC4uLlxyXG4gKiB9KTtcclxuICovXHJcbmV4cG9ydCBjb25zdCBWRVJTSU9OX0NPTkZJRzogVmVyc2lvbkNvbmZpZyA9IHtcclxuICBcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHRoZSBtYWpvciBudW1iZXIgb2YgdGhpcyBjb25maWcuXHJcbiAgICAgKi9cclxuICAgIG1ham9yOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHRoZSBtaW5vciBudW1iZXIgb2YgdGhpcyBjb25maWcuXHJcbiAgICAgKi9cclxuICAgIG1pbm9yOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHRoZSBwYXRjaCBudW1iZXIgb2YgdGhpcyBjb25maWcuXHJcbiAgICAgKi9cclxuICAgIHBhdGNoOiAwLFxyXG5cclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHRoZSB0aW1lc3RhbXAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYnVpbGQgZGF0ZSBmb3IgdGhpcyBgVmVyc2lvbmAgb2JqZWN0LlxyXG4gICAgICogRGVmYXVsdCB2YWx1ZSBpcyBgTmFOYC5cclxuICAgICAqL1xyXG4gICAgYnVpbGRUaW1lc3RhbXA6IE5hTlxyXG59OyJdfQ==
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Pascal ECHEMANN. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be found in
|
|
6
|
+
* the LICENSE file at https://pascalechemann.com/angular-toolbox/resources/license
|
|
7
|
+
*/
|
|
8
|
+
;
|
|
9
|
+
export {};
|
|
10
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmVyc2lvbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXItdG9vbGJveC9zcmMvbGliL21vZGVsL2J1c2luZXNzL3ZlcnNpb24vdmVyc2lvbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFpQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgUGFzY2FsIEVDSEVNQU5OLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKlxyXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBmb3VuZCBpblxyXG4gKiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcGFzY2FsZWNoZW1hbm4uY29tL2FuZ3VsYXItdG9vbGJveC9yZXNvdXJjZXMvbGljZW5zZVxyXG4gKi9cclxuXHJcbi8qKlxyXG4gKiBTcGVjaWZpZXMgdGhlIHNlbWFudGljIHZlcnNpb25pbmcgb2YgYW4gQW5ndWxhciBhcHBsaWNhdGlvbi5cclxuICovXHJcbmV4cG9ydCBpbnRlcmZhY2UgVmVyc2lvbiB7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBTcGVjaWZpZXMgdmVyc2lvbnMgd2l0aCBpbmNvbXBhdGlibGUgQVBJIGNoYW5nZXMuXHJcbiAgICAgKi9cclxuICAgIG1ham9yOiBudW1iZXI7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHZlcnNpb25zIHdpdGggZnVuY3Rpb25hbGl0aWVzIHRoYXQgaGF2ZSAgYmFja3dhcmQgY29tcGF0aWJpbGl0eS5cclxuICAgICAqL1xyXG4gICAgbWlub3I6IG51bWJlcjtcclxuXHJcbiAgICAvKipcclxuICAgICAqIFNwZWNpZmllcyB2ZXJzaW9ucyB0aGF0IGZpeGVzIGJ1Z3MuXHJcbiAgICAgKi9cclxuICAgIHBhdGNoOiBudW1iZXI7XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogU3BlY2lmaWVzIHRoZSB0aW1lc3RhbXAgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYnVpbGQgZGF0ZSBmb3IgdGhpcyBgVmVyc2lvbmAgb2JqZWN0LlxyXG4gICAgICovXHJcbiAgICBidWlsZFRpbWVTdGFtcDogbnVtYmVyO1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIGBWZXJzaW9uYCBvYmplY3QuXHJcbiAgICAgKiBcclxuICAgICAqIEByZXR1cm5zIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgYFZlcnNpb25gIG9iamVjdC5cclxuICAgICAqL1xyXG4gICAgdG9TdHJpbmcoKTogc3RyaW5nO1xyXG59OyJdfQ==
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './business';
|
|
2
|
+
export * from './service';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9tb2RlbC9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQztBQUMzQixjQUFjLFdBQVcsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gJy4vYnVzaW5lc3MnO1xyXG5leHBvcnQgKiBmcm9tICcuL3NlcnZpY2UnOyJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from './subscription/subscription.service';
|
|
2
|
+
export * from './ui';
|
|
3
|
+
export * from './version/version.service';
|
|
4
|
+
export * from './mock/http/http-mock.service';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9tb2RlbC9zZXJ2aWNlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUNBQXFDLENBQUM7QUFDcEQsY0FBYyxNQUFNLENBQUM7QUFDckIsY0FBYywyQkFBMkIsQ0FBQztBQUMxQyxjQUFjLCtCQUErQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9zdWJzY3JpcHRpb24vc3Vic2NyaXB0aW9uLnNlcnZpY2UnO1xyXG5leHBvcnQgKiBmcm9tICcuL3VpJztcclxuZXhwb3J0ICogZnJvbSAnLi92ZXJzaW9uL3ZlcnNpb24uc2VydmljZSc7XHJcbmV4cG9ydCAqIGZyb20gJy4vbW9jay9odHRwL2h0dHAtbW9jay5zZXJ2aWNlJzsiXX0=
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Pascal ECHEMANN. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be found in
|
|
6
|
+
* the LICENSE file at https://pascalechemann.com/angular-toolbox/resources/license
|
|
7
|
+
*/
|
|
8
|
+
import { Injectable } from '@angular/core';
|
|
9
|
+
import { HTTPMethodRef } from '../../../../framework/mock/http/util/http-method-ref.enum';
|
|
10
|
+
import { tokenDataToRegexp } from '../../../../framework/mock/http/path-to-regexp/token-data-to-regexp';
|
|
11
|
+
import { stringToTokenData } from '../../../../framework/mock/http/path-to-regexp/string-to-token-data';
|
|
12
|
+
import { DEFAULT_DELIMITER } from '../../../../framework/mock/http/path-to-regexp/constants';
|
|
13
|
+
import { Uuid } from '../../../../util';
|
|
14
|
+
import { HttpMockServiceError } from 'projects/angular-toolbox/src/public-api';
|
|
15
|
+
import * as i0 from "@angular/core";
|
|
16
|
+
/**
|
|
17
|
+
* @private
|
|
18
|
+
* Reference to the original type for this class.
|
|
19
|
+
*/
|
|
20
|
+
export const HTTP_MOCK_SERVICE = "HttpMockService";
|
|
21
|
+
/**
|
|
22
|
+
* The `HttpMockService` class provides the API for managing HTTP mock configuration objects.
|
|
23
|
+
*/
|
|
24
|
+
export class HttpMockService {
|
|
25
|
+
constructor() {
|
|
26
|
+
/**
|
|
27
|
+
* @private
|
|
28
|
+
* Ensures that class type is still accessible after TypeScript compilation.
|
|
29
|
+
*/
|
|
30
|
+
this.type = HTTP_MOCK_SERVICE;
|
|
31
|
+
/**
|
|
32
|
+
* @private
|
|
33
|
+
* The list of IDs associated with each config object.
|
|
34
|
+
*/
|
|
35
|
+
this._configIdList = [];
|
|
36
|
+
/**
|
|
37
|
+
* @private
|
|
38
|
+
* Stores the complete collection of mocking behaviors for each registered config.
|
|
39
|
+
*/
|
|
40
|
+
this._configList = new Map();
|
|
41
|
+
/**
|
|
42
|
+
* @private
|
|
43
|
+
* The reference to the current app URL origin.
|
|
44
|
+
*/
|
|
45
|
+
this.APP_ORIGIN = window.location.origin;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Adds the specified `HttpMockConfig` object to this `HttpMockService` instance.
|
|
49
|
+
*
|
|
50
|
+
* @param config The `HttpMockConfig` object to add to this `HttpMockService` instance.
|
|
51
|
+
* @Returns The `Uuid` instance associated with the added `HttpMockConfig` object.
|
|
52
|
+
*/
|
|
53
|
+
addConfig(config) {
|
|
54
|
+
const origin = config.origin || this.APP_ORIGIN;
|
|
55
|
+
this.checkOrigin(origin);
|
|
56
|
+
let id = config.id;
|
|
57
|
+
if (!id) {
|
|
58
|
+
id = Uuid.build();
|
|
59
|
+
config.id = id;
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
if (this.hasRegisteredConfig(id))
|
|
63
|
+
throw new HttpMockServiceError(`A config object has already been registered with the id: ["${id.toString()}"].`);
|
|
64
|
+
}
|
|
65
|
+
this._configIdList.push(id);
|
|
66
|
+
const uuid = id.toString();
|
|
67
|
+
config.interceptors.forEach((interceptor) => this.extractConfig(interceptor, origin, uuid));
|
|
68
|
+
return id;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Returns the current app URL origin.
|
|
72
|
+
*
|
|
73
|
+
* @returns A string that represents the current app URL origin.
|
|
74
|
+
*/
|
|
75
|
+
getAppOrigin() {
|
|
76
|
+
return this.APP_ORIGIN;
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Removes the configuration registered with the specified `uuid` from this `HttpMockService` instance.
|
|
80
|
+
*
|
|
81
|
+
* @param uuid The UUID of the configuration to remove.
|
|
82
|
+
*/
|
|
83
|
+
removeConfig(uuid) {
|
|
84
|
+
if (!this.hasRegisteredConfig(uuid))
|
|
85
|
+
return;
|
|
86
|
+
const configId = uuid.toString();
|
|
87
|
+
this._configList.forEach((value, key) => {
|
|
88
|
+
this.deleteConfigById(value, configId);
|
|
89
|
+
if (value.size === 0)
|
|
90
|
+
this._configList.delete(key);
|
|
91
|
+
});
|
|
92
|
+
this._configIdList.splice(this._configIdList.indexOf(uuid), 1);
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Removes all registred configurations from this `HttpMockService` instance.
|
|
96
|
+
*/
|
|
97
|
+
clearConfigs() {
|
|
98
|
+
this._configList.clear();
|
|
99
|
+
this._configIdList.length = 0;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Returns a boolean value that indicates whether a config with the specified UUID has been registered
|
|
103
|
+
* (`true`), or not (`false`).
|
|
104
|
+
*
|
|
105
|
+
* @param uuid The UUID of the config to check.
|
|
106
|
+
* @returns `true` whether a config with the specified UUID has been registered; `false` otherwise.
|
|
107
|
+
*/
|
|
108
|
+
hasRegisteredConfig(uuid) {
|
|
109
|
+
return this._configIdList.indexOf(uuid) !== -1;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Returns the `RouteMockConfig` object associated with the specified `URL` instance and HTTP method.
|
|
113
|
+
*
|
|
114
|
+
* @param url The `URL` instance for which to find a route config.
|
|
115
|
+
* @param method The HTTP method for which to find a route config.
|
|
116
|
+
* @returns The `RouteMockConfig` object associated with the specified `URL` instance and HTTP method whether it exists;
|
|
117
|
+
* `undefined` otherwise.
|
|
118
|
+
*/
|
|
119
|
+
getRouteConfig(url, method) {
|
|
120
|
+
const urlConfigList = this._configList.get(url.origin);
|
|
121
|
+
const route = url.pathname;
|
|
122
|
+
let result = undefined;
|
|
123
|
+
if (!urlConfigList)
|
|
124
|
+
return result;
|
|
125
|
+
const methodList = urlConfigList.get(method);
|
|
126
|
+
if (!methodList)
|
|
127
|
+
return result;
|
|
128
|
+
let len = methodList.length - 1;
|
|
129
|
+
while (len >= 0) {
|
|
130
|
+
const methodMap = methodList[len];
|
|
131
|
+
const regexp = methodMap.regexp;
|
|
132
|
+
if (regexp.test(route)) {
|
|
133
|
+
result = {
|
|
134
|
+
methodConfig: methodMap.methodMock,
|
|
135
|
+
parameters: this.buildParameters(regexp, methodMap.keys, route)
|
|
136
|
+
};
|
|
137
|
+
break;
|
|
138
|
+
}
|
|
139
|
+
len--;
|
|
140
|
+
}
|
|
141
|
+
return result;
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* @rivate
|
|
145
|
+
*/
|
|
146
|
+
buildParameters(regexp, keys, route) {
|
|
147
|
+
const execResult = regexp.exec(route);
|
|
148
|
+
if (!execResult)
|
|
149
|
+
return null;
|
|
150
|
+
const params = {};
|
|
151
|
+
let len = execResult.length - 1;
|
|
152
|
+
let i = 1;
|
|
153
|
+
for (; i <= len; ++i) {
|
|
154
|
+
const key = keys[i - 1];
|
|
155
|
+
params[key.name] = execResult[i];
|
|
156
|
+
}
|
|
157
|
+
return params;
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* @rivate
|
|
161
|
+
*/
|
|
162
|
+
extractConfig(interceptor, globalOrigin, configId) {
|
|
163
|
+
const endpoints = interceptor.endpoints;
|
|
164
|
+
let origin = interceptor.origin;
|
|
165
|
+
if (origin)
|
|
166
|
+
this.checkOrigin(origin);
|
|
167
|
+
else
|
|
168
|
+
origin = globalOrigin;
|
|
169
|
+
if (!this._configList.has(origin))
|
|
170
|
+
this._configList.set(origin, new Map());
|
|
171
|
+
endpoints.forEach((endpoint) => {
|
|
172
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.GET, configId);
|
|
173
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.POST, configId);
|
|
174
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.PUT, configId);
|
|
175
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.DELETE, configId);
|
|
176
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.HEAD, configId);
|
|
177
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.OPTIONS, configId);
|
|
178
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.PATCH, configId);
|
|
179
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.CONNECT, configId);
|
|
180
|
+
this.extractEndpointConfig(origin, endpoint, HTTPMethodRef.TRACE, configId);
|
|
181
|
+
});
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* @rivate
|
|
185
|
+
*/
|
|
186
|
+
extractEndpointConfig(origin, endpoint, method, configId) {
|
|
187
|
+
const ep = endpoint;
|
|
188
|
+
if (!ep[method])
|
|
189
|
+
return;
|
|
190
|
+
const originConfig = this._configList.get(origin);
|
|
191
|
+
const route = endpoint.route;
|
|
192
|
+
const data = stringToTokenData(route);
|
|
193
|
+
const keys = [];
|
|
194
|
+
const regexp = tokenDataToRegexp(data, keys, {});
|
|
195
|
+
if (!originConfig.has(method))
|
|
196
|
+
originConfig.set(method, []);
|
|
197
|
+
const methodConfig = originConfig.get(method);
|
|
198
|
+
methodConfig.push({
|
|
199
|
+
regexp: regexp,
|
|
200
|
+
keys: keys,
|
|
201
|
+
methodMock: ep[method],
|
|
202
|
+
configId: configId
|
|
203
|
+
});
|
|
204
|
+
}
|
|
205
|
+
/**
|
|
206
|
+
* @rivate
|
|
207
|
+
*/
|
|
208
|
+
checkOrigin(origin) {
|
|
209
|
+
if (origin.endsWith(DEFAULT_DELIMITER))
|
|
210
|
+
throw new SyntaxError(`Origin must not end with a / character: ["${origin}"].`);
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* @rivate
|
|
214
|
+
*/
|
|
215
|
+
deleteConfigById(storageMap, configId) {
|
|
216
|
+
storageMap.forEach((storage, key) => {
|
|
217
|
+
const cleanedConfig = this.cleanConfig(storage, configId);
|
|
218
|
+
if (cleanedConfig.length)
|
|
219
|
+
storageMap.set(key, cleanedConfig);
|
|
220
|
+
else
|
|
221
|
+
storageMap.delete(key);
|
|
222
|
+
});
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* @rivate
|
|
226
|
+
*/
|
|
227
|
+
cleanConfig(storage, configId) {
|
|
228
|
+
return storage.filter((value) => value.configId !== configId);
|
|
229
|
+
}
|
|
230
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: HttpMockService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
231
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: HttpMockService, providedIn: 'root' }); }
|
|
232
|
+
}
|
|
233
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: HttpMockService, decorators: [{
|
|
234
|
+
type: Injectable,
|
|
235
|
+
args: [{
|
|
236
|
+
providedIn: 'root'
|
|
237
|
+
}]
|
|
238
|
+
}] });
|
|
239
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1tb2NrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9tb2RlbC9zZXJ2aWNlL21vY2svaHR0cC9odHRwLW1vY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwyREFBMkQsQ0FBQztBQUMxRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUd4RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUN4RyxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSwwREFBMEQsQ0FBQztBQUM3RixPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFFeEMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0seUNBQXlDLENBQUM7O0FBRS9FOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUFXLGlCQUFpQixDQUFDO0FBYTNEOztHQUVHO0FBSUgsTUFBTSxPQUFPLGVBQWU7SUFINUI7UUFLRTs7O1dBR0c7UUFDYSxTQUFJLEdBQVcsaUJBQWlCLENBQUM7UUFFakQ7OztXQUdHO1FBQ0ssa0JBQWEsR0FBVyxFQUFFLENBQUM7UUFFbkM7OztXQUdHO1FBQ0ssZ0JBQVcsR0FBd0QsSUFBSSxHQUFHLEVBQWtELENBQUM7UUFFckk7OztXQUdHO1FBQ2MsZUFBVSxHQUFXLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDO0tBb0w5RDtJQWxMQzs7Ozs7T0FLRztJQUNJLFNBQVMsQ0FBQyxNQUFzQjtRQUNyQyxNQUFNLE1BQU0sR0FBVyxNQUFNLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxVQUFV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T0FFRztJQUNLLFdBQVcsQ0FBQyxNQUFjO1FBQ2hDLElBQUksTUFBTSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUIsQ0FBQztZQUFFLE1BQU0sSUFBSSxXQUFXLENBQUMsNkNBQTZDLE1BQU0sS0FBSyxDQUFDLENBQUM7SUFDMUgsQ0FBQztJQUVEOztPQUVHO0lBQ0ssZ0JBQWdCLENBQUMsVUFBa0QsRUFBRSxRQUFnQjtRQUMzRixVQUFVLENBQUMsT0FBTyxDQUFDLENBQUMsT0FBa0MsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUNyRSxNQUFNLGFBQWEsR0FBOEIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLENBQUM7WUFDckYsSUFBSSxhQUFhLENBQUMsTUFBTTtnQkFBRSxVQUFVLENBQUMsR0FBRyxDQUFDLEdBQUcsRUFBRSxhQUFhLENBQUMsQ0FBQzs7Z0JBQ3hELFVBQVUsQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7UUFDOUIsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQ7O09BRUc7SUFDSyxXQUFXLENBQUMsT0FBa0MsRUFBRSxRQUFnQjtRQUN0RSxPQUFPLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQyxLQUE4QixFQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsUUFBUSxLQUFLLFFBQVEsQ0FBQyxDQUFDO0lBQ3hGLENBQUM7OEdBM01VLGVBQWU7a0hBQWYsZUFBZSxjQUZkLE1BQU07OzJGQUVQLGVBQWU7a0JBSDNCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXHJcbiAqIEBsaWNlbnNlXHJcbiAqIENvcHlyaWdodCBQYXNjYWwgRUNIRU1BTk4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXHJcbiAqXHJcbiAqIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGFuIE1JVC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlIGZvdW5kIGluXHJcbiAqIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9wYXNjYWxlY2hlbWFubi5jb20vYW5ndWxhci10b29sYm94L3Jlc291cmNlcy9saWNlbnNlXHJcbiAqL1xyXG5cclxuaW1wb3J0IHsgSW5qZWN0YWJsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBIdHRwTW9ja0ludGVyY2VwdG9yLCBIdHRwTW9ja0NvbmZpZywgSHR0cE1ldGhvZE1vY2ssIEh0dHBNb2NrRW5kcG9pbnQgfSBmcm9tICcuLi8uLi8uLi9idXNpbmVzcyc7XHJcbmltcG9ydCB7IEhUVFBNZXRob2RSZWYgfSBmcm9tICcuLi8uLi8uLi8uLi9mcmFtZXdvcmsvbW9jay9odHRwL3V0aWwvaHR0cC1tZXRob2QtcmVmLmVudW0nO1xyXG5pbXBvcnQgeyB0b2tlbkRhdGFUb1JlZ2V4cCB9IGZyb20gJy4uLy4uLy4uLy4uL2ZyYW1ld29yay9tb2NrL2h0dHAvcGF0aC10by1yZWdleHAvdG9rZW4tZGF0YS10by1yZWdleHAnO1xyXG5pbXBvcnQgeyBSb3V0ZU1vY2tDb25maWcgfSBmcm9tICcuLi8uLi8uLi8uLi9mcmFtZXdvcmsvbW9jay9odHRwL2NvbmZpZy9yb3V0ZS1tb2NrLWNvbmZpZyc7XHJcbmltcG9ydCB7IEtleSB9IGZyb20gJy4uLy4uLy4uLy4uL2ZyYW1ld29yay9tb2NrL2h0dHAvcGF0aC10by1yZWdleHAvbW9kZWwva2V5JztcclxuaW1wb3J0IHsgc3RyaW5nVG9Ub2tlbkRhdGEgfSBmcm9tICcuLi8uLi8uLi8uLi9mcmFtZXdvcmsvbW9jay9odHRwL3BhdGgtdG8tcmVnZXhwL3N0cmluZy10by10b2tlbi1kYXRhJztcclxuaW1wb3J0IHsgREVGQVVMVF9ERUxJTUlURVIgfSBmcm9tICcuLi8uLi8uLi8uLi9mcmFtZXdvcmsvbW9jay9odHRwL3BhdGgtdG8tcmVnZXhwL2NvbnN0YW50cyc7XHJcbmltcG9ydCB7IFV1aWQgfSBmcm9tICcuLi8uLi8uLi8uLi91dGlsJztcclxuaW1wb3J0IHsgVG9rZW5EYXRhIH0gZnJvbSAnLi4vLi4vLi4vLi4vZnJhbWV3b3JrL21vY2svaHR0cC9wYXRoLXRvLXJlZ2V4cC90b2tlbi1kYXRhJztcclxuaW1wb3J0IHsgSHR0cE1vY2tTZXJ2aWNlRXJyb3IgfSBmcm9tICdwcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL3B1YmxpYy1hcGknO1xyXG5cclxuLyoqXHJcbiAqIEBwcml2YXRlXHJcbiAqIFJlZmVyZW5jZSB0byB0aGUgb3JpZ2luYWwgdHlwZSBmb3IgdGhpcyBjbGFzcy5cclxuICovXHJcbmV4cG9ydCBjb25zdCBIVFRQX01PQ0tfU0VSVklDRTogc3RyaW5nID0gXCJIdHRwTW9ja1NlcnZpY2VcIjtcclxuXHJcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKiBBbiBpbnRlcm5hbCB1dGlsaXR5IGZvciBzdG9ycmluZyByZWZlcmVuY2VzIHRvIGVuZHBvaW50IG1vY2sgY29uZmlncy5cclxuICovXHJcbmludGVyZmFjZSBIdHRwTW9ja0VuZHBvaW50U3RvcmFnZSB7XHJcbiAgbWV0aG9kTW9jazogSHR0cE1ldGhvZE1vY2s7XHJcbiAgcmVnZXhwOiBSZWdFeHA7XHJcbiAga2V5czogS2V5W107XHJcbiAgY29uZmlnSWQ6IHN0cmluZztcclxufVxyXG5cclxuLyoqXHJcbiAqIFRoZSBgSHR0cE1vY2tTZXJ2aWNlYCBjbGFzcyBwcm92aWRlcyB0aGUgQVBJIGZvciBtYW5hZ2luZyBIVFRQIG1vY2sgY29uZmlndXJhdGlvbiBvYmplY3RzLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gIHByb3ZpZGVkSW46ICdyb290J1xyXG59KVxyXG5leHBvcnQgY2xhc3MgSHR0cE1vY2tTZXJ2aWNlIHtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBFbnN1cmVzIHRoYXQgY2xhc3MgdHlwZSBpcyBzdGlsbCBhY2Nlc3NpYmxlIGFmdGVyIFR5cGVTY3JpcHQgY29tcGlsYXRpb24uXHJcbiAgICovXHJcbiAgcHVibGljIHJlYWRvbmx5IHR5cGU6IHN0cmluZyA9IEhUVFBfTU9DS19TRVJWSUNFO1xyXG5cclxuICAvKipcclxuICAgKiBAcHJpdmF0ZVxyXG4gICAqIFRoZSBsaXN0IG9mIElEcyBhc3NvY2lhdGVkIHdpdGggZWFjaCBjb25maWcgb2JqZWN0LlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NvbmZpZ0lkTGlzdDogVXVpZFtdID0gW107XHJcblxyXG4gIC8qKlxyXG4gICAqIEBwcml2YXRlXHJcbiAgICogU3RvcmVzIHRoZSBjb21wbGV0ZSBjb2xsZWN0aW9uIG9mIG1vY2tpbmcgYmVoYXZpb3JzIGZvciBlYWNoIHJlZ2lzdGVyZWQgY29uZmlnLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgX2NvbmZpZ0xpc3Q6IE1hcDxzdHJpbmcsIE1hcDxzdHJpbmcsIEh0dHBNb2NrRW5kcG9pbnRTdG9yYWdlW10+PiA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBIdHRwTW9ja0VuZHBvaW50U3RvcmFnZVtdPj4oKTtcclxuXHJcbiAgLyoqXHJcbiAgICogQHByaXZhdGVcclxuICAgKiBUaGUgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGFwcCBVUkwgb3JpZ2luLlxyXG4gICAqL1xyXG4gIHByaXZhdGUgcmVhZG9ubHkgQVBQX09SSUdJTjogc3RyaW5nID0gd2luZG93LmxvY2F0aW9uLm9yaWdpbjtcclxuXHJcbiAgLyoqXHJcbiAgICogQWRkcyB0aGUgc3BlY2lmaWVkIGBIdHRwTW9ja0NvbmZpZ2Agb2JqZWN0IHRvIHRoaXMgYEh0dHBNb2NrU2VydmljZWAgaW5zdGFuY2UuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIGNvbmZpZyBUaGUgYEh0dHBNb2NrQ29uZmlnYCBvYmplY3QgdG8gYWRkIHRvIHRoaXMgYEh0dHBNb2NrU2VydmljZWAgaW5zdGFuY2UuXHJcbiAgICogQFJldHVybnMgVGhlIGBVdWlkYCBpbnN0YW5jZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFkZGVkIGBIdHRwTW9ja0NvbmZpZ2Agb2JqZWN0LlxyXG4gICAqL1xyXG4gIHB1YmxpYyBhZGRDb25maWcoY29uZmlnOiBIdHRwTW9ja0NvbmZpZyk6IFV1aWQge1xyXG4gICAgY29uc3Qgb3JpZ2luOiBzdHJpbmcgPSBjb25maWcub3JpZ2luIHx8IHRoaXMuQVBQX09SSUdJTjtcclxuICAgIHRoaXMuY2hlY2tPcmlnaW4ob3JpZ2luKTtcclxuICAgIGxldCBpZDogVXVpZCB8IHVuZGVmaW5lZCA9IGNvbmZpZy5pZDtcclxuICAgIGlmICghaWQpIHtcclxuICAgICAgaWQgPSBVdWlkLmJ1aWxkKCk7XHJcbiAgICAgIGNvbmZpZy5pZCA9IGlkO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgaWYgKHRoaXMuaGFzUmVnaXN0ZXJlZENvbmZpZyhpZCkpIHRocm93IG5ldyBIdHRwTW9ja1NlcnZpY2VFcnJvcihgQSBjb25maWcgb2JqZWN0IGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCB3aXRoIHRoZSBpZDogW1wiJHtpZC50b1N0cmluZygpfVwiXS5gKSA7XHJcbiAgICB9XHJcbiAgICB0aGlzLl9jb25maWdJZExpc3QucHVzaChpZCk7XHJcbiAgICBjb25zdCB1dWlkOiBzdHJpbmcgPSBpZC50b1N0cmluZygpO1xyXG4gICAgY29uZmlnLmludGVyY2VwdG9ycy5mb3JFYWNoKChpbnRlcmNlcHRvcjogSHR0cE1vY2tJbnRlcmNlcHRvcikgPT4gdGhpcy5leHRyYWN0Q29uZmlnKGludGVyY2VwdG9yLCBvcmlnaW4sIHV1aWQpICk7XHJcbiAgICByZXR1cm4gaWQ7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IGFwcCBVUkwgb3JpZ2luLlxyXG4gICAqIFxyXG4gICAqIEByZXR1cm5zIEEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgY3VycmVudCBhcHAgVVJMIG9yaWdpbi5cclxuICAgKi9cclxuICBwdWJsaWMgZ2V0QXBwT3JpZ2luKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gdGhpcy5BUFBfT1JJR0lOO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmVtb3ZlcyB0aGUgY29uZmlndXJhdGlvbiByZWdpc3RlcmVkIHdpdGggdGhlIHNwZWNpZmllZCBgdXVpZGAgZnJvbSB0aGlzIGBIdHRwTW9ja1NlcnZpY2VgIGluc3RhbmNlLlxyXG4gICAqIFxyXG4gICAqIEBwYXJhbSB1dWlkIFRoZSBVVUlEIG9mIHRoZSBjb25maWd1cmF0aW9uIHRvIHJlbW92ZS5cclxuICAgKi9cclxuICBwdWJsaWMgcmVtb3ZlQ29uZmlnKHV1aWQ6IFV1aWQpOiB2b2lkIHtcclxuICAgIGlmICghdGhpcy5oYXNSZWdpc3RlcmVkQ29uZmlnKHV1aWQpKSByZXR1cm47XHJcbiAgICBjb25zdCBjb25maWdJZDogc3RyaW5nID0gdXVpZC50b1N0cmluZygpO1xyXG4gICAgdGhpcy5fY29uZmlnTGlzdC5mb3JFYWNoKCh2YWx1ZTogTWFwPHN0cmluZywgSHR0cE1vY2tFbmRwb2ludFN0b3JhZ2VbXT4sIGtleTogc3RyaW5nKSA9PiB7XHJcbiAgICAgIHRoaXMuZGVsZXRlQ29uZmlnQnlJZCh2YWx1ZSwgY29uZmlnSWQpO1xyXG4gICAgICBpZiAodmFsdWUuc2l6ZSA9PT0gMCkgdGhpcy5fY29uZmlnTGlzdC5kZWxldGUoa2V5KTtcclxuICAgIH0pO1xyXG4gICAgdGhpcy5fY29uZmlnSWRMaXN0LnNwbGljZSh0aGlzLl9jb25maWdJZExpc3QuaW5kZXhPZih1dWlkKSwgMSk7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBSZW1vdmVzIGFsbCByZWdpc3RyZWQgY29uZmlndXJhdGlvbnMgZnJvbSB0aGlzIGBIdHRwTW9ja1NlcnZpY2VgIGluc3RhbmNlLlxyXG4gICAqL1xyXG4gIHB1YmxpYyBjbGVhckNvbmZpZ3MoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jb25maWdMaXN0LmNsZWFyKCk7XHJcbiAgICB0aGlzLl9jb25maWdJZExpc3QubGVuZ3RoID0gMDtcclxuICB9XHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyBhIGJvb2xlYW4gdmFsdWUgdGhhdCBpbmRpY2F0ZXMgd2hldGhlciBhIGNvbmZpZyB3aXRoIHRoZSBzcGVjaWZpZWQgVVVJRCBoYXMgYmVlbiByZWdpc3RlcmVkXHJcbiAgICogKGB0cnVlYCksIG9yIG5vdCAoYGZhbHNlYCkuXHJcbiAgICogXHJcbiAgICogQHBhcmFtIHV1aWQgVGhlIFVVSUQgb2YgdGhlIGNvbmZpZyB0byBjaGVjay5cclxuICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hldGhlciBhIGNvbmZpZyB3aXRoIHRoZSBzcGVjaWZpZWQgVVVJRCBoYXMgYmVlbiByZWdpc3RlcmVkOyBgZmFsc2VgIG90aGVyd2lzZS5cclxuICAgKi9cclxuICBwdWJsaWMgaGFzUmVnaXN0ZXJlZENvbmZpZyh1dWlkOiBVdWlkKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5fY29uZmlnSWRMaXN0LmluZGV4T2YodXVpZCkgIT09IC0xO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogUmV0dXJucyB0aGUgYFJvdXRlTW9ja0NvbmZpZ2Agb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGBVUkxgIGluc3RhbmNlIGFuZCBIVFRQIG1ldGhvZC5cclxuICAgKiBcclxuICAgKiBAcGFyYW0gdXJsIFRoZSBgVVJMYCBpbnN0YW5jZSBmb3Igd2hpY2ggdG8gZmluZCBhIHJvdXRlIGNvbmZpZy5cclxuICAgKiBAcGFyYW0gbWV0aG9kIFRoZSBIVFRQIG1ldGhvZCBmb3Igd2hpY2ggdG8gZmluZCBhIHJvdXRlIGNvbmZpZy5cclxuICAgKiBAcmV0dXJucyBUaGUgYFJvdXRlTW9ja0NvbmZpZ2Agb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGBVUkxgIGluc3RhbmNlIGFuZCBIVFRQIG1ldGhvZCB3aGV0aGVyIGl0IGV4aXN0cztcclxuICAgKiAgICAgICAgICBgdW5kZWZpbmVkYCBvdGhlcndpc2UuXHJcbiAgICovXHJcbiAgcHVibGljIGdldFJvdXRlQ29uZmlnKHVybDogVVJMLCBtZXRob2Q6IEhUVFBNZXRob2RSZWYpOiBSb3V0ZU1vY2tDb25maWcgfCB1bmRlZmluZWQge1xyXG4gICAgY29uc3QgdXJsQ29uZmlnTGlzdDogTWFwPHN0cmluZywgSHR0cE1vY2tFbmRwb2ludFN0b3JhZ2VbXT4gfCB1bmRlZmluZWQgPSB0aGlzLl9jb25maWdMaXN0LmdldCh1cmwub3JpZ2luKTtcclxuICAgIGNvbnN0IHJvdXRlOiBzdHJpbmcgPSB1cmwucGF0aG5hbWU7XHJcbiAgICBsZXQgcmVzdWx0OiBSb3V0ZU1vY2tDb25maWcgfCB1bmRlZmluZWQgPSB1bmRlZmluZWQ7XHJcbiAgICBpZiAoIXVybENvbmZpZ0xpc3QpIHJldHVybiByZXN1bHQ7XHJcbiAgICBjb25zdCBtZXRob2RMaXN0OiBIdHRwTW9ja0VuZHBvaW50U3RvcmFnZVtdIHwgdW5kZWZpbmVkID0gdXJsQ29uZmlnTGlzdC5nZXQobWV0aG9kKTtcclxuICAgIGlmICghbWV0aG9kTGlzdCkgcmV0dXJuIHJlc3VsdDtcclxuICAgIGxldCBsZW46IG51bWJlciA9IG1ldGhvZExpc3QubGVuZ3RoIC0gMTtcclxuICAgIHdoaWxlIChsZW4gPj0gMCApIHtcclxuICAgICAgY29uc3QgbWV0aG9kTWFwOiBIdHRwTW9ja0VuZHBvaW50U3RvcmFnZSA9IG1ldGhvZExpc3RbbGVuXTtcclxuICAgICAgY29uc3QgcmVnZXhwOiBSZWdFeHAgPSBtZXRob2RNYXAucmVnZXhwO1xyXG4gICAgICBpZiAocmVnZXhwLnRlc3Qocm91dGUpKSB7XHJcbiAgICAgICAgcmVzdWx0ID0ge1xyXG4gICAgICAgICAgbWV0aG9kQ29uZmlnOiBtZXRob2RNYXAubWV0aG9kTW9jayxcclxuICAgICAgICAgIHBhcmFtZXRlcnM6IHRoaXMuYnVpbGRQYXJhbWV0ZXJzKHJlZ2V4cCwgbWV0aG9kTWFwLmtleXMsIHJvdXRlKVxyXG4gICAgICAgIH07XHJcbiAgICAgICAgYnJlYWs7XHJcbiAgICAgIH1cclxuICAgICAgbGVuLS07XHJcbiAgICB9XHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJpdmF0ZSBcclxuICAgKi9cclxuICBwcml2YXRlIGJ1aWxkUGFyYW1ldGVycyhyZWdleHA6IFJlZ0V4cCwga2V5czogS2V5W10sIHJvdXRlOiBzdHJpbmcpOiBhbnkge1xyXG4gICAgY29uc3QgZXhlY1Jlc3VsdDogUmVnRXhwRXhlY0FycmF5IHwgbnVsbCA9IHJlZ2V4cC5leGVjKHJvdXRlKTtcclxuICAgIGlmICghZXhlY1Jlc3VsdCkgcmV0dXJuIG51bGw7XHJcbiAgICBjb25zdCBwYXJhbXM6IGFueSA9IHt9O1xyXG4gICAgbGV0IGxlbjogbnVtYmVyID0gZXhlY1Jlc3VsdC5sZW5ndGggLSAxO1xyXG4gICAgbGV0IGk6IG51bWJlciA9IDE7XHJcbiAgICBmb3IgKDsgaSA8PSBsZW47ICsraSkge1xyXG4gICAgICBjb25zdCBrZXk6IEtleSA9IGtleXNbaSAtIDFdO1xyXG4gICAgICBwYXJhbXNba2V5Lm5hbWVdID0gZXhlY1Jlc3VsdFtpXTtcclxuICAgIH1cclxuICAgIHJldHVybiBwYXJhbXM7XHJcbiAgfVxyXG5cclxuICAvKipcclxuICAgKiBAcml2YXRlIFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZXh0cmFjdENvbmZpZyhpbnRlcmNlcHRvcjogSHR0cE1vY2tJbnRlcmNlcHRvciwgZ2xvYmFsT3JpZ2luOiBzdHJpbmcsIGNvbmZpZ0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIGNvbnN0IGVuZHBvaW50czogSHR0cE1vY2tFbmRwb2ludFtdID0gaW50ZXJjZXB0b3IuZW5kcG9pbnRzO1xyXG4gICAgbGV0IG9yaWdpbjogc3RyaW5nIHwgdW5kZWZpbmVkID0gaW50ZXJjZXB0b3Iub3JpZ2luO1xyXG4gICAgaWYgKG9yaWdpbikgdGhpcy5jaGVja09yaWdpbihvcmlnaW4pO1xyXG4gICAgZWxzZSBvcmlnaW4gPSBnbG9iYWxPcmlnaW47XHJcbiAgICBpZiAoIXRoaXMuX2NvbmZpZ0xpc3QuaGFzKG9yaWdpbikpIHRoaXMuX2NvbmZpZ0xpc3Quc2V0KG9yaWdpbiwgbmV3IE1hcDxzdHJpbmcsIEh0dHBNb2NrRW5kcG9pbnRTdG9yYWdlW10+KCkpO1xyXG4gICAgZW5kcG9pbnRzLmZvckVhY2goKGVuZHBvaW50OiBIdHRwTW9ja0VuZHBvaW50KSA9PiB7XHJcbiAgICAgIHRoaXMuZXh0cmFjdEVuZHBvaW50Q29uZmlnKG9yaWdpbiwgZW5kcG9pbnQsIEhUVFBNZXRob2RSZWYuR0VULCBjb25maWdJZCk7XHJcbiAgICAgIHRoaXMuZXh0cmFjdEVuZHBvaW50Q29uZmlnKG9yaWdpbiwgZW5kcG9pbnQsIEhUVFBNZXRob2RSZWYuUE9TVCwgY29uZmlnSWQpO1xyXG4gICAgICB0aGlzLmV4dHJhY3RFbmRwb2ludENvbmZpZyhvcmlnaW4sIGVuZHBvaW50LCBIVFRQTWV0aG9kUmVmLlBVVCwgY29uZmlnSWQpO1xyXG4gICAgICB0aGlzLmV4dHJhY3RFbmRwb2ludENvbmZpZyhvcmlnaW4sIGVuZHBvaW50LCBIVFRQTWV0aG9kUmVmLkRFTEVURSwgY29uZmlnSWQpO1xyXG4gICAgICB0aGlzLmV4dHJhY3RFbmRwb2ludENvbmZpZyhvcmlnaW4sIGVuZHBvaW50LCBIVFRQTWV0aG9kUmVmLkhFQUQsIGNvbmZpZ0lkKTtcclxuICAgICAgdGhpcy5leHRyYWN0RW5kcG9pbnRDb25maWcob3JpZ2luLCBlbmRwb2ludCwgSFRUUE1ldGhvZFJlZi5PUFRJT05TLCBjb25maWdJZCk7XHJcbiAgICAgIHRoaXMuZXh0cmFjdEVuZHBvaW50Q29uZmlnKG9yaWdpbiwgZW5kcG9pbnQsIEhUVFBNZXRob2RSZWYuUEFUQ0gsIGNvbmZpZ0lkKTtcclxuICAgICAgdGhpcy5leHRyYWN0RW5kcG9pbnRDb25maWcob3JpZ2luLCBlbmRwb2ludCwgSFRUUE1ldGhvZFJlZi5DT05ORUNULCBjb25maWdJZCk7XHJcbiAgICAgIHRoaXMuZXh0cmFjdEVuZHBvaW50Q29uZmlnKG9yaWdpbiwgZW5kcG9pbnQsIEhUVFBNZXRob2RSZWYuVFJBQ0UsIGNvbmZpZ0lkKTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJpdmF0ZSBcclxuICAgKi9cclxuICBwcml2YXRlIGV4dHJhY3RFbmRwb2ludENvbmZpZyhvcmlnaW46IHN0cmluZywgZW5kcG9pbnQ6IEh0dHBNb2NrRW5kcG9pbnQsIG1ldGhvZDogSFRUUE1ldGhvZFJlZiwgY29uZmlnSWQ6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgZXA6IGFueSA9IGVuZHBvaW50O1xyXG4gICAgaWYgKCFlcFttZXRob2QgYXMgYW55XSkgcmV0dXJuO1xyXG4gICAgY29uc3Qgb3JpZ2luQ29uZmlnOiBNYXA8c3RyaW5nLCBIdHRwTW9ja0VuZHBvaW50U3RvcmFnZVtdPiA9IHRoaXMuX2NvbmZpZ0xpc3QuZ2V0KG9yaWdpbikgYXMgYW55O1xyXG4gICAgY29uc3Qgcm91dGU6IHN0cmluZyA9IGVuZHBvaW50LnJvdXRlO1xyXG4gICAgY29uc3QgZGF0YTogVG9rZW5EYXRhID0gc3RyaW5nVG9Ub2tlbkRhdGEocm91dGUpO1xyXG4gICAgY29uc3Qga2V5czogS2V5W10gPSBbXTtcclxuICAgIGNvbnN0IHJlZ2V4cDogUmVnRXhwID0gdG9rZW5EYXRhVG9SZWdleHAoZGF0YSwga2V5cywge30pO1xyXG4gICAgaWYgKCFvcmlnaW5Db25maWcuaGFzKG1ldGhvZCkpIG9yaWdpbkNvbmZpZy5zZXQobWV0aG9kLCBbXSk7XHJcbiAgICBjb25zdCBtZXRob2RDb25maWc6IEh0dHBNb2NrRW5kcG9pbnRTdG9yYWdlW10gPSBvcmlnaW5Db25maWcuZ2V0KG1ldGhvZCkgYXMgYW55O1xyXG4gICAgbWV0aG9kQ29uZmlnLnB1c2goe1xyXG4gICAgICByZWdleHA6IHJlZ2V4cCxcclxuICAgICAga2V5czoga2V5cyxcclxuICAgICAgbWV0aG9kTW9jazogZXBbbWV0aG9kXSxcclxuICAgICAgY29uZmlnSWQ6IGNvbmZpZ0lkXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8qKlxyXG4gICAqIEByaXZhdGUgXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBjaGVja09yaWdpbihvcmlnaW46IHN0cmluZyk6IHZvaWQge1xyXG4gICAgaWYgKG9yaWdpbi5lbmRzV2l0aChERUZBVUxUX0RFTElNSVRFUikpIHRocm93IG5ldyBTeW50YXhFcnJvcihgT3JpZ2luIG11c3Qgbm90IGVuZCB3aXRoIGEgLyBjaGFyYWN0ZXI6IFtcIiR7b3JpZ2lufVwiXS5gKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQHJpdmF0ZSBcclxuICAgKi9cclxuICBwcml2YXRlIGRlbGV0ZUNvbmZpZ0J5SWQoc3RvcmFnZU1hcDogTWFwPHN0cmluZywgSHR0cE1vY2tFbmRwb2ludFN0b3JhZ2VbXT4sIGNvbmZpZ0lkOiBzdHJpbmcpOiB2b2lkIHtcclxuICAgIHN0b3JhZ2VNYXAuZm9yRWFjaCgoc3RvcmFnZTogSHR0cE1vY2tFbmRwb2ludFN0b3JhZ2VbXSwga2V5OiBzdHJpbmcpID0+IHtcclxuICAgICAgY29uc3QgY2xlYW5lZENvbmZpZzogSHR0cE1vY2tFbmRwb2ludFN0b3JhZ2VbXSA9IHRoaXMuY2xlYW5Db25maWcoc3RvcmFnZSwgY29uZmlnSWQpO1xyXG4gICAgICBpZiAoY2xlYW5lZENvbmZpZy5sZW5ndGgpIHN0b3JhZ2VNYXAuc2V0KGtleSwgY2xlYW5lZENvbmZpZyk7XHJcbiAgICAgIGVsc2Ugc3RvcmFnZU1hcC5kZWxldGUoa2V5KTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgLyoqXHJcbiAgICogQHJpdmF0ZSBcclxuICAgKi9cclxuICBwcml2YXRlIGNsZWFuQ29uZmlnKHN0b3JhZ2U6IEh0dHBNb2NrRW5kcG9pbnRTdG9yYWdlW10sIGNvbmZpZ0lkOiBzdHJpbmcpOiBIdHRwTW9ja0VuZHBvaW50U3RvcmFnZVtdIHtcclxuICAgIHJldHVybiBzdG9yYWdlLmZpbHRlcigodmFsdWU6IEh0dHBNb2NrRW5kcG9pbnRTdG9yYWdlKT0+IHZhbHVlLmNvbmZpZ0lkICE9PSBjb25maWdJZCk7XHJcbiAgfVxyXG59XHJcbiJdfQ==
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Pascal ECHEMANN. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be found in
|
|
6
|
+
* the LICENSE file at https://pascalechemann.com/angular-toolbox/resources/license
|
|
7
|
+
*/
|
|
8
|
+
import { Injectable } from '@angular/core';
|
|
9
|
+
import { SubscriptionError } from '../../../core';
|
|
10
|
+
import { IdentifiableComponent } from '../../../core/impl';
|
|
11
|
+
import * as i0 from "@angular/core";
|
|
12
|
+
/**
|
|
13
|
+
* A lightweight service that helps to manage unregistration issues of Angular subscriptions.
|
|
14
|
+
*/
|
|
15
|
+
export class SubscriptionService {
|
|
16
|
+
constructor() {
|
|
17
|
+
/**
|
|
18
|
+
* @private
|
|
19
|
+
* Stores an internal reference to the last reference used with the `register()`
|
|
20
|
+
* method.
|
|
21
|
+
*/
|
|
22
|
+
this._lastRef = null;
|
|
23
|
+
/**
|
|
24
|
+
* @private
|
|
25
|
+
* The internal `Subscription` instances storage.
|
|
26
|
+
*/
|
|
27
|
+
this._subMap = new Map();
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Stores a new `Subscription` instance associated with the specified reference.
|
|
31
|
+
*
|
|
32
|
+
* @param ref The reference for which to store a new `Subscription` instance.
|
|
33
|
+
* Can be either a string or an `Identifiable` object.
|
|
34
|
+
* @param subscription The `Subscription` instance to register.
|
|
35
|
+
*
|
|
36
|
+
* @returns A reference to this `SubscriptionService` instance.
|
|
37
|
+
*/
|
|
38
|
+
register(ref, subscription) {
|
|
39
|
+
const REF = this.getRef(ref);
|
|
40
|
+
this._lastRef = REF;
|
|
41
|
+
if (!this._subMap.has(REF))
|
|
42
|
+
this._subMap.set(REF, []);
|
|
43
|
+
this._subMap.get(REF)?.push(subscription);
|
|
44
|
+
return this;
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Stores a new `Subscription` instance associated with the reference specified
|
|
48
|
+
* by the last `register()` method invokation.
|
|
49
|
+
*
|
|
50
|
+
* @param subscription The `Subscription` instance to register.
|
|
51
|
+
*
|
|
52
|
+
* @returns A reference to this `SubscriptionService` instance.
|
|
53
|
+
*/
|
|
54
|
+
append(subscription) {
|
|
55
|
+
if (!this._lastRef)
|
|
56
|
+
throw new SubscriptionError("Illegal Access Error: you must call the register() method before invoking the append() method.");
|
|
57
|
+
return this.register(this._lastRef, subscription);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Unsubscribes and removes all `Subscription` instances associated with the specified reference.
|
|
61
|
+
*
|
|
62
|
+
* @param ref The reference for which to remove all `Subscription` instances.
|
|
63
|
+
* Can be either a string or an `Identifiable` object.
|
|
64
|
+
*
|
|
65
|
+
* @returns `true` whether the specified reference exists; `false` otherwise.
|
|
66
|
+
*/
|
|
67
|
+
clearAll(ref) {
|
|
68
|
+
const REF = this.getRef(ref);
|
|
69
|
+
let result = false;
|
|
70
|
+
if (this._lastRef === REF)
|
|
71
|
+
this._lastRef = null;
|
|
72
|
+
if (this._subMap.has(REF)) {
|
|
73
|
+
this._subMap.get(REF)?.forEach(subscription => {
|
|
74
|
+
if (!subscription.closed)
|
|
75
|
+
subscription.unsubscribe();
|
|
76
|
+
});
|
|
77
|
+
this._subMap.delete(REF);
|
|
78
|
+
result = true;
|
|
79
|
+
}
|
|
80
|
+
return result;
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* Returns all `Subscription` instances associated with the specified reference.
|
|
84
|
+
*
|
|
85
|
+
* @param ref The reference for which to remove get `Subscription` instances.
|
|
86
|
+
* Can be either a string or an `Identifiable` object.
|
|
87
|
+
*
|
|
88
|
+
* @returns All `Subscription` instances associated with the specified reference, or
|
|
89
|
+
* `null` whether the specified reference does not exists.
|
|
90
|
+
*/
|
|
91
|
+
get(ref) {
|
|
92
|
+
return this._subMap.get(this.getRef(ref)) || null;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* @private
|
|
96
|
+
* Returns the string reference for the regsitration process.
|
|
97
|
+
*
|
|
98
|
+
* @param ref The reference to be used the regsitration process.
|
|
99
|
+
* Can be either a string or an `Identifiable` object.
|
|
100
|
+
*
|
|
101
|
+
* @returns the string reference for the regsitration process.
|
|
102
|
+
*/
|
|
103
|
+
getRef(ref) {
|
|
104
|
+
let targetRef;
|
|
105
|
+
if (typeof ref === "string")
|
|
106
|
+
targetRef = ref;
|
|
107
|
+
else if (ref instanceof IdentifiableComponent)
|
|
108
|
+
targetRef = ref.getID().toString();
|
|
109
|
+
else
|
|
110
|
+
throw new TypeError("ref must be of type of string or Identifiable");
|
|
111
|
+
return targetRef;
|
|
112
|
+
}
|
|
113
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SubscriptionService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
114
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SubscriptionService, providedIn: 'root' }); }
|
|
115
|
+
}
|
|
116
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: SubscriptionService, decorators: [{
|
|
117
|
+
type: Injectable,
|
|
118
|
+
args: [{
|
|
119
|
+
providedIn: 'root'
|
|
120
|
+
}]
|
|
121
|
+
}] });
|
|
122
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3Vic2NyaXB0aW9uLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyLXRvb2xib3gvc3JjL2xpYi9tb2RlbC9zZXJ2aWNlL3N1YnNjcmlwdGlvbi9zdWJzY3JpcHRpb24uc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7O0dBTUc7QUFFSCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNDLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFNM0Q7O0dBRUc7QUFDSCxNQUFNLE9BQU8sbUJBQW1CO0lBTmhDO1FBUUk7Ozs7V0FJRztRQUNLLGFBQVEsR0FBa0IsSUFBSSxDQUFDO1FBRXZDOzs7V0FHRztRQUNLLFlBQU8sR0FBcUMsSUFBSSxHQUFHLEVBQStCLENBQUM7S0FtRjlGO0lBakZHOzs7Ozs7OztPQVFHO0lBQ0ksUUFBUSxDQUFDLEdBQTBCLEVBQUUsWUFBMEI7UUFDbEUsTUFBTSxHQUFHLEdBQVcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNyQyxJQUFJLENBQUMsUUFBUSxHQUFHLEdBQUcsQ0FBQztRQUNwQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDO1lBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxFQUFFLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUMxQyxPQUFPLElBQUksQ0FBQztJQUNoQixDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLE1BQU0sQ0FBQyxZQUEwQjtRQUNwQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVE7WUFBRSxNQUFNLElBQUksaUJBQWlCLENBQUMsZ0dBQWdHLENBQUMsQ0FBQztRQUNsSixPQUFPLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFFBQVEsRUFBRSxZQUFZLENBQUMsQ0FBQztJQUN0RCxDQUFDO0lBRUQ7Ozs7Ozs7T0FPRztJQUNJLFFBQVEsQ0FBQyxHQUEwQjtRQUN0QyxNQUFNLEdBQUcsR0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ3JDLElBQUksTUFBTSxHQUFZLEtBQUssQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxRQUFRLEtBQUssR0FBRztZQUFFLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDO1FBQ2hELElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN4QixJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxPQUFPLENBQUMsWUFBWSxDQUFDLEVBQUU7Z0JBQzFDLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTtvQkFBRSxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDeEQsQ0FBQyxDQUFDLENBQUM7WUFDSixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUN6QixNQUFNLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQztJQUNsQixDQUFDO0lBRUQ7Ozs7Ozs7O09BUUc7SUFDSSxHQUFHLENBQUMsR0FBMEI7UUFDakMsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLElBQUksSUFBSSxDQUFDO0lBQ3RELENBQUM7SUFFRDs7Ozs7Ozs7T0FRRztJQUNLLE1BQU0sQ0FBQyxHQUEwQjtRQUNyQyxJQUFJLFNBQWlCLENBQUM7UUFDdEIsSUFBSSxPQUFPLEdBQUcsS0FBSyxRQUFRO1lBQUUsU0FBUyxHQUFHLEdBQUcsQ0FBQzthQUN4QyxJQUFJLEdBQUcsWUFBWSxxQkFBcUI7WUFBRSxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssRUFBRSxDQUFDLFFBQVEsRUFBRSxDQUFDOztZQUM3RSxNQUFNLElBQUksU0FBUyxDQUFDLCtDQUErQyxDQUFDLENBQUM7UUFDMUUsT0FBTyxTQUFTLENBQUM7SUFDckIsQ0FBQzs4R0EvRlEsbUJBQW1CO2tIQUFuQixtQkFBbUIsY0FMaEIsTUFBTTs7MkZBS1QsbUJBQW1CO2tCQU4vQixVQUFVO21CQUFDO29CQUNSLFVBQVUsRUFBRSxNQUFNO2lCQUNyQiIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQGxpY2Vuc2VcbiAqIENvcHlyaWdodCBQYXNjYWwgRUNIRU1BTk4uIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUgZm91bmQgaW4gXG4gKiB0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcGFzY2FsZWNoZW1hbm4uY29tL2FuZ3VsYXItdG9vbGJveC9yZXNvdXJjZXMvbGljZW5zZVxuICovXG5cbmltcG9ydCB7IEluamVjdGFibGUgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU3Vic2NyaXB0aW9uRXJyb3IgfSBmcm9tICcuLi8uLi8uLi9jb3JlJztcbmltcG9ydCB7IElkZW50aWZpYWJsZUNvbXBvbmVudCB9IGZyb20gJy4uLy4uLy4uL2NvcmUvaW1wbCc7XG5pbXBvcnQgeyBJZGVudGlmaWFibGUgfSBmcm9tICcuLi8uLi9idXNpbmVzcyc7XG5cbkBJbmplY3RhYmxlKHtcbiAgICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG4vKipcbiAqIEEgbGlnaHR3ZWlnaHQgc2VydmljZSB0aGF0IGhlbHBzIHRvIG1hbmFnZSB1bnJlZ2lzdHJhdGlvbiBpc3N1ZXMgb2YgQW5ndWxhciBzdWJzY3JpcHRpb25zLlxuICovXG5leHBvcnQgY2xhc3MgU3Vic2NyaXB0aW9uU2VydmljZSB7XG5cbiAgICAvKipcbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIFN0b3JlcyBhbiBpbnRlcm5hbCByZWZlcmVuY2UgdG8gdGhlIGxhc3QgcmVmZXJlbmNlIHVzZWQgd2l0aCB0aGUgYHJlZ2lzdGVyKClgXG4gICAgICogbWV0aG9kLlxuICAgICAqL1xuICAgIHByaXZhdGUgX2xhc3RSZWY6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuXG4gICAgLyoqXG4gICAgICogQHByaXZhdGVcbiAgICAgKiBUaGUgaW50ZXJuYWwgYFN1YnNjcmlwdGlvbmAgaW5zdGFuY2VzIHN0b3JhZ2UuXG4gICAgICovXG4gICAgcHJpdmF0ZSBfc3ViTWFwOiBNYXA8c3RyaW5nLCBBcnJheTxTdWJzY3JpcHRpb24+PiA9IG5ldyBNYXA8c3RyaW5nLCBBcnJheTxTdWJzY3JpcHRpb24+PigpO1xuXG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEgbmV3IGBTdWJzY3JpcHRpb25gIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSByZWZlcmVuY2UgZm9yIHdoaWNoIHRvIHN0b3JlIGEgbmV3IGBTdWJzY3JpcHRpb25gIGluc3RhbmNlLlxuICAgICAqICAgICAgICAgICAgQ2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBgSWRlbnRpZmlhYmxlYCBvYmplY3QuXG4gICAgICogQHBhcmFtIHN1YnNjcmlwdGlvbiBUaGUgYFN1YnNjcmlwdGlvbmAgaW5zdGFuY2UgdG8gcmVnaXN0ZXIuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhpcyBgU3Vic2NyaXB0aW9uU2VydmljZWAgaW5zdGFuY2UuXG4gICAgICovXG4gICAgcHVibGljIHJlZ2lzdGVyKHJlZjogc3RyaW5nIHwgSWRlbnRpZmlhYmxlLCBzdWJzY3JpcHRpb246IFN1YnNjcmlwdGlvbik6IFN1YnNjcmlwdGlvblNlcnZpY2Uge1xuICAgICAgICBjb25zdCBSRUY6IHN0cmluZyA9IHRoaXMuZ2V0UmVmKHJlZik7XG4gICAgICAgIHRoaXMuX2xhc3RSZWYgPSBSRUY7XG4gICAgICAgIGlmICghdGhpcy5fc3ViTWFwLmhhcyhSRUYpKSB0aGlzLl9zdWJNYXAuc2V0KFJFRiwgW10pO1xuICAgICAgICB0aGlzLl9zdWJNYXAuZ2V0KFJFRik/LnB1c2goc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogU3RvcmVzIGEgbmV3IGBTdWJzY3JpcHRpb25gIGluc3RhbmNlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVmZXJlbmNlIHNwZWNpZmllZFxuICAgICAqIGJ5IHRoZSBsYXN0IGByZWdpc3RlcigpYCBtZXRob2QgaW52b2thdGlvbi5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gc3Vic2NyaXB0aW9uIFRoZSBgU3Vic2NyaXB0aW9uYCBpbnN0YW5jZSB0byByZWdpc3Rlci5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBBIHJlZmVyZW5jZSB0byB0aGlzIGBTdWJzY3JpcHRpb25TZXJ2aWNlYCBpbnN0YW5jZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgYXBwZW5kKHN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uKTogU3Vic2NyaXB0aW9uU2VydmljZSB7XG4gICAgICAgIGlmICghdGhpcy5fbGFzdFJlZikgdGhyb3cgbmV3IFN1YnNjcmlwdGlvbkVycm9yKFwiSWxsZWdhbCBBY2Nlc3MgRXJyb3I6IHlvdSBtdXN0IGNhbGwgdGhlIHJlZ2lzdGVyKCkgbWV0aG9kIGJlZm9yZSBpbnZva2luZyB0aGUgYXBwZW5kKCkgbWV0aG9kLlwiKTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVnaXN0ZXIodGhpcy5fbGFzdFJlZiwgc3Vic2NyaXB0aW9uKTtcbiAgICB9XG4gXG4gICAgLyoqXG4gICAgICogVW5zdWJzY3JpYmVzIGFuZCByZW1vdmVzIGFsbCBgU3Vic2NyaXB0aW9uYCBpbnN0YW5jZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlLlxuICAgICAqIFxuICAgICAqIEBwYXJhbSByZWYgVGhlIHJlZmVyZW5jZSBmb3Igd2hpY2ggdG8gcmVtb3ZlIGFsbCBgU3Vic2NyaXB0aW9uYCBpbnN0YW5jZXMuXG4gICAgICogICAgICAgICAgICBDYW4gYmUgZWl0aGVyIGEgc3RyaW5nIG9yIGFuIGBJZGVudGlmaWFibGVgIG9iamVjdC5cbiAgICAgKiBcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hldGhlciB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZSBleGlzdHM7IGBmYWxzZWAgb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHB1YmxpYyBjbGVhckFsbChyZWY6IHN0cmluZyB8IElkZW50aWZpYWJsZSk6IGJvb2xlYW4ge1xuICAgICAgICBjb25zdCBSRUY6IHN0cmluZyA9IHRoaXMuZ2V0UmVmKHJlZik7XG4gICAgICAgIGxldCByZXN1bHQ6IGJvb2xlYW4gPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuX2xhc3RSZWYgPT09IFJFRikgdGhpcy5fbGFzdFJlZiA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLl9zdWJNYXAuaGFzKFJFRikpIHtcbiAgICAgICAgICAgIHRoaXMuX3N1Yk1hcC5nZXQoUkVGKT8uZm9yRWFjaChzdWJzY3JpcHRpb24gPT4ge1xuICAgICAgICAgICAgICAgIGlmICghc3Vic2NyaXB0aW9uLmNsb3NlZCkgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLl9zdWJNYXAuZGVsZXRlKFJFRik7XG4gICAgICAgICAgICByZXN1bHQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogUmV0dXJucyBhbGwgYFN1YnNjcmlwdGlvbmAgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHJlZmVyZW5jZS5cbiAgICAgKiBcbiAgICAgKiBAcGFyYW0gcmVmIFRoZSByZWZlcmVuY2UgZm9yIHdoaWNoIHRvIHJlbW92ZSBnZXQgYFN1YnNjcmlwdGlvbmAgaW5zdGFuY2VzLlxuICAgICAqICAgICAgICAgICAgQ2FuIGJlIGVpdGhlciBhIHN0cmluZyBvciBhbiBgSWRlbnRpZmlhYmxlYCBvYmplY3QuXG4gICAgICogXG4gICAgICogQHJldHVybnMgQWxsIGBTdWJzY3JpcHRpb25gIGluc3RhbmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCByZWZlcmVuY2UsIG9yIFxuICAgICAqICAgICAgICAgIGBudWxsYCB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgcmVmZXJlbmNlIGRvZXMgbm90IGV4aXN0cy5cbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0KHJlZjogc3RyaW5nIHwgSWRlbnRpZmlhYmxlKTogQXJyYXk8U3Vic2NyaXB0aW9uPiB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5fc3ViTWFwLmdldCh0aGlzLmdldFJlZihyZWYpKSB8fCBudWxsO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBwcml2YXRlIFxuICAgICAqIFJldHVybnMgdGhlIHN0cmluZyByZWZlcmVuY2UgZm9yIHRoZSByZWdzaXRyYXRpb24gcHJvY2Vzcy4gXG4gICAgICogXG4gICAgICogQHBhcmFtIHJlZiBUaGUgcmVmZXJlbmNlIHRvIGJlIHVzZWQgdGhlIHJlZ3NpdHJhdGlvbiBwcm9jZXNzLiBcbiAgICAgKiAgICAgICAgICAgIENhbiBiZSBlaXRoZXIgYSBzdHJpbmcgb3IgYW4gYElkZW50aWZpYWJsZWAgb2JqZWN0LlxuICAgICAqIFxuICAgICAqIEByZXR1cm5zIHRoZSBzdHJpbmcgcmVmZXJlbmNlIGZvciB0aGUgcmVnc2l0cmF0aW9uIHByb2Nlc3MuIFxuICAgICAqL1xuICAgIHByaXZhdGUgZ2V0UmVmKHJlZjogc3RyaW5nIHwgSWRlbnRpZmlhYmxlKTogc3RyaW5nIHtcbiAgICAgICAgbGV0IHRhcmdldFJlZjogc3RyaW5nO1xuICAgICAgICBpZiAodHlwZW9mIHJlZiA9PT0gXCJzdHJpbmdcIikgdGFyZ2V0UmVmID0gcmVmO1xuICAgICAgICBlbHNlIGlmIChyZWYgaW5zdGFuY2VvZiBJZGVudGlmaWFibGVDb21wb25lbnQpIHRhcmdldFJlZiA9IHJlZi5nZXRJRCgpLnRvU3RyaW5nKCk7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihcInJlZiBtdXN0IGJlIG9mIHR5cGUgb2Ygc3RyaW5nIG9yIElkZW50aWZpYWJsZVwiKTtcbiAgICAgICAgcmV0dXJuIHRhcmdldFJlZjtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @license
|
|
3
|
+
* Copyright Pascal ECHEMANN. All Rights Reserved.
|
|
4
|
+
*
|
|
5
|
+
* Use of this source code is governed by an MIT-style license that can be ound in
|
|
6
|
+
* fthe LICENSE file at https://pascalechemann.com/angular-toolbox/resources/license
|
|
7
|
+
*/
|
|
8
|
+
import { DOCUMENT } from '@angular/common';
|
|
9
|
+
import { Injectable, Inject } from '@angular/core';
|
|
10
|
+
import { DEFAULT_SCROLL_BEHAVIOR } from '../../../util/default-scroll-behavior';
|
|
11
|
+
import { AppBridge } from '../../../core/bridge/app-bridge';
|
|
12
|
+
import { AppBridgeError } from '../../../core';
|
|
13
|
+
import * as i0 from "@angular/core";
|
|
14
|
+
import * as i1 from "@angular/router";
|
|
15
|
+
/**
|
|
16
|
+
* @private
|
|
17
|
+
*/
|
|
18
|
+
export const APP_PRIDGE_REF = "appBridge";
|
|
19
|
+
/**
|
|
20
|
+
* @private
|
|
21
|
+
*/
|
|
22
|
+
const HREF = "href";
|
|
23
|
+
/**
|
|
24
|
+
* @private
|
|
25
|
+
*/
|
|
26
|
+
const NATIVE_COMMANDS = "navigate|goToAnchor|declareCommand|deleteCommand|getCommand";
|
|
27
|
+
/**
|
|
28
|
+
* A utility service that allows dynamically injected HTML fragments, to interact with the Angular application.
|
|
29
|
+
*/
|
|
30
|
+
export class AppBrigeService {
|
|
31
|
+
/**
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
constructor(_router, _zone, _document) {
|
|
35
|
+
this._router = _router;
|
|
36
|
+
this._zone = _zone;
|
|
37
|
+
this._document = _document;
|
|
38
|
+
this._defaultView = _document.defaultView;
|
|
39
|
+
this._appBridge = new AppBridge();
|
|
40
|
+
if (!this._defaultView[APP_PRIDGE_REF])
|
|
41
|
+
this._defaultView[APP_PRIDGE_REF] = this;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* Provides the ability to invoke the `navigate()` method of the Angular app router.
|
|
45
|
+
*
|
|
46
|
+
* @param commands The commands array as specified by the Angular router `navigate()` method.
|
|
47
|
+
* @param extras The navigation options as specified by the Angular router `navigate()` method.
|
|
48
|
+
* @return `Promise` that resolves to `true` when navigation succeeds, or `false` when navigation fails.
|
|
49
|
+
*
|
|
50
|
+
* @see https://angular.dev/api/router/Router#navigate
|
|
51
|
+
*/
|
|
52
|
+
navigate(commands, extras) {
|
|
53
|
+
return this._zone.run(() => {
|
|
54
|
+
return this._router.navigate(commands, extras);
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Allows to scroll to the fragment specified by the `href` attribute when the user element interact with the associated element.
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* <a href="#myAnchor" onclick="appBridge.goToAnchor(event)">My Section</a></code>
|
|
62
|
+
*
|
|
63
|
+
* @param event The event that triggers the anchor navigation.
|
|
64
|
+
* @return `Promise` that resolves to `true` when navigation succeeds, or `false` when navigation fails.
|
|
65
|
+
*
|
|
66
|
+
* @see https://angular.dev/api/router/Router#navigate
|
|
67
|
+
*/
|
|
68
|
+
goToAnchor(event) {
|
|
69
|
+
event.preventDefault();
|
|
70
|
+
const anchor = event.target.getAttribute(HREF);
|
|
71
|
+
if (!anchor)
|
|
72
|
+
throw new ReferenceError("href attribute is not defined.");
|
|
73
|
+
const elm = this._document.querySelector(anchor);
|
|
74
|
+
if (!elm)
|
|
75
|
+
return new Promise((resolve) => resolve(false));
|
|
76
|
+
elm.scrollIntoView(DEFAULT_SCROLL_BEHAVIOR);
|
|
77
|
+
return this._zone.run(() => {
|
|
78
|
+
return this._router.navigate([], { fragment: anchor.slice(1) });
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Declares a new JavaScript command to be used with dynamically loaded documents.
|
|
83
|
+
*
|
|
84
|
+
* @param name The name of the command to declare.
|
|
85
|
+
* @param command The reference to a JavaScript command to be used with dynamically loaded documents.
|
|
86
|
+
*/
|
|
87
|
+
declareCommand(name, command) {
|
|
88
|
+
this.checkCommandName(name);
|
|
89
|
+
if (!this._appBridge.hasCommand(name)) {
|
|
90
|
+
this._appBridge.addCommand(name, command);
|
|
91
|
+
Object.defineProperty(this, name, {
|
|
92
|
+
configurable: true,
|
|
93
|
+
get: function () {
|
|
94
|
+
return this._appBridge.getCommand(name);
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Unregisters a JavaScript command previously referenced with the `declareCommand()` method.
|
|
101
|
+
*
|
|
102
|
+
* @param name The name of the command to remove.
|
|
103
|
+
*
|
|
104
|
+
* @returns `true` whether the command existed and has been removed; `false` otherwise.
|
|
105
|
+
*/
|
|
106
|
+
deleteCommand(name) {
|
|
107
|
+
this.checkCommandName(name);
|
|
108
|
+
if (!this._appBridge.removeCommand(name))
|
|
109
|
+
return false;
|
|
110
|
+
delete this._defaultView[APP_PRIDGE_REF][name];
|
|
111
|
+
return true;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Returns the JavaScript command previously referenced with the `declareCommand()` method.
|
|
115
|
+
*
|
|
116
|
+
* @param name The name of the command to retrieve.
|
|
117
|
+
* @returns The JavaScript command previously referenced with the specified `name` parameter.
|
|
118
|
+
* If no command is found, returns `undefined`.
|
|
119
|
+
*/
|
|
120
|
+
getCommand(name) {
|
|
121
|
+
return this._appBridge.getCommand(name);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* @private
|
|
125
|
+
*/
|
|
126
|
+
checkCommandName(name) {
|
|
127
|
+
if (NATIVE_COMMANDS.includes(name))
|
|
128
|
+
throw new AppBridgeError("Command name cannot be the reference to a native command: " + name);
|
|
129
|
+
}
|
|
130
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: AppBrigeService, deps: [{ token: i1.Router }, { token: i0.NgZone }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
131
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: AppBrigeService, providedIn: 'root' }); }
|
|
132
|
+
}
|
|
133
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.0.3", ngImport: i0, type: AppBrigeService, decorators: [{
|
|
134
|
+
type: Injectable,
|
|
135
|
+
args: [{
|
|
136
|
+
providedIn: 'root'
|
|
137
|
+
}]
|
|
138
|
+
}], ctorParameters: () => [{ type: i1.Router }, { type: i0.NgZone }, { type: undefined, decorators: [{
|
|
139
|
+
type: Inject,
|
|
140
|
+
args: [DOCUMENT]
|
|
141
|
+
}] }] });
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBwLWJyaWRnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYW5ndWxhci10b29sYm94L3NyYy9saWIvbW9kZWwvc2VydmljZS91aS9hcHAtYnJpZGdlLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7OztHQU1HO0FBRUgsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFBRSxVQUFVLEVBQVUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTNELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLHVDQUF1QyxDQUFDO0FBQ2hGLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUM1RCxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sZUFBZSxDQUFDOzs7QUFHL0M7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxjQUFjLEdBQVcsV0FBVyxDQUFDO0FBRWxEOztHQUVHO0FBQ0gsTUFBTSxJQUFJLEdBQVcsTUFBTSxDQUFDO0FBRTVCOztHQUVHO0FBQ0gsTUFBTSxlQUFlLEdBQVcsNkRBQTZELENBQUM7QUFFOUY7O0dBRUc7QUFJSCxNQUFNLE9BQU8sZUFBZTtJQWF4Qjs7T0FFRztJQUNILFlBQW9CLE9BQWUsRUFDZixLQUFhLEVBQ0ssU0FBYztRQUZoQyxZQUFPLEdBQVAsT0FBTyxDQUFRO1FBQ2YsVUFBSyxHQUFMLEtBQUssQ0FBUTtRQUNLLGNBQVMsR0FBVCxTQUFTLENBQUs7UUFDaEQsSUFBSSxDQUFDLFlBQVksR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDO1FBQzFDLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztRQUNsQyxJQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxjQUFjLENBQUM7WUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLGNBQWMsQ0FBQyxHQUFH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QUFFLE1BQU07aUJBQ3JCOzswQkFtQmdCLE1BQU07MkJBQUMsUUFBUSIsInNvdXJjZXNDb250ZW50IjpbIi8qKlxyXG4gKiBAbGljZW5zZVxyXG4gKiBDb3B5cmlnaHQgUGFzY2FsIEVDSEVNQU5OLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxyXG4gKlxyXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZSBvdW5kIGluXHJcbiAqIGZ0aGUgTElDRU5TRSBmaWxlIGF0IGh0dHBzOi8vcGFzY2FsZWNoZW1hbm4uY29tL2FuZ3VsYXItdG9vbGJveC9yZXNvdXJjZXMvbGljZW5zZVxyXG4gKi9cclxuXHJcbmltcG9ydCB7IERPQ1VNRU5UIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcclxuaW1wb3J0IHsgSW5qZWN0YWJsZSwgTmdab25lLCBJbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmF2aWdhdGlvbkV4dHJhcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcclxuaW1wb3J0IHsgREVGQVVMVF9TQ1JPTExfQkVIQVZJT1IgfSBmcm9tICcuLi8uLi8uLi91dGlsL2RlZmF1bHQtc2Nyb2xsLWJlaGF2aW9yJztcclxuaW1wb3J0IHsgQXBwQnJpZGdlIH0gZnJvbSAnLi4vLi4vLi4vY29yZS9icmlkZ2UvYXBwLWJyaWRnZSc7XHJcbmltcG9ydCB7IEFwcEJyaWRnZUVycm9yIH0gZnJvbSAnLi4vLi4vLi4vY29yZSc7XHJcbmltcG9ydCB7IEFwcEJyaWRnZUNvbW1hbmQgfSBmcm9tICcuLi8uLi9idXNpbmVzcy9sYW5nL2FwcC1icmlkZ2UtY29tbWFuZCc7XHJcblxyXG4vKipcclxuICogQHByaXZhdGVcclxuICovXHJcbmV4cG9ydCBjb25zdCBBUFBfUFJJREdFX1JFRjogc3RyaW5nID0gXCJhcHBCcmlkZ2VcIjtcclxuXHJcbi8qKlxyXG4gKiBAcHJpdmF0ZVxyXG4gKi9cclxuY29uc3QgSFJFRjogc3RyaW5nID0gXCJocmVmXCI7XHJcblxyXG4vKipcclxuICogQHByaXZhdGVcclxuICovXHJcbmNvbnN0IE5BVElWRV9DT01NQU5EUzogc3RyaW5nID0gXCJuYXZpZ2F0ZXxnb1RvQW5jaG9yfGRlY2xhcmVDb21tYW5kfGRlbGV0ZUNvbW1hbmR8Z2V0Q29tbWFuZFwiO1xyXG5cclxuLyoqXHJcbiAqIEEgdXRpbGl0eSBzZXJ2aWNlIHRoYXQgYWxsb3dzIGR5bmFtaWNhbGx5IGluamVjdGVkIEhUTUwgZnJhZ21lbnRzLCB0byBpbnRlcmFjdCB3aXRoIHRoZSBBbmd1bGFyIGFwcGxpY2F0aW9uLlxyXG4gKi9cclxuQEluamVjdGFibGUoe1xyXG4gICAgcHJvdmlkZWRJbjogJ3Jvb3QnXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBBcHBCcmlnZVNlcnZpY2Uge1xyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfZGVmYXVsdFZpZXc6IGFueTtcclxuXHJcbiAgICAvKipcclxuICAgICAqIEBwcml2YXRlXHJcbiAgICAgKiBUaGVyZWZlcmVuY2UgdG8gdGhlIGNvbW1hbmQgaW52b2tlci5cclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSByZWFkb25seSBfYXBwQnJpZGdlOiBBcHBCcmlkZ2U7XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBAcHJpdmF0ZVxyXG4gICAgICovXHJcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9yb3V0ZXI6IFJvdXRlcixcclxuICAgICAgICAgICAgICAgIHByaXZhdGUgX3pvbmU6IE5nWm9uZSxcclxuICAgICAgICAgICAgICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgX2RvY3VtZW50OiBhbnkpIHtcclxuICAgICAgICB0aGlzLl9kZWZhdWx0VmlldyA9IF9kb2N1bWVudC5kZWZhdWx0VmlldztcclxuICAgICAgICB0aGlzLl9hcHBCcmlkZ2UgPSBuZXcgQXBwQnJpZGdlKCk7XHJcbiAgICAgICAgaWYoIXRoaXMuX2RlZmF1bHRWaWV3W0FQUF9QUklER0VfUkVGXSkgdGhpcy5fZGVmYXVsdFZpZXdbQVBQX1BSSURHRV9SRUZdID0gdGhpcztcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIFByb3ZpZGVzIHRoZSBhYmlsaXR5IHRvIGludm9rZSB0aGUgYG5hdmlnYXRlKClgIG1ldGhvZCBvZiB0aGUgQW5ndWxhciBhcHAgcm91dGVyLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gY29tbWFuZHMgVGhlIGNvbW1hbmRzIGFycmF5IGFzIHNwZWNpZmllZCBieSB0aGUgQW5ndWxhciByb3V0ZXIgYG5hdmlnYXRlKClgIG1ldGhvZC5cclxuICAgICAqIEBwYXJhbSBleHRyYXMgVGhlIG5hdmlnYXRpb24gb3B0aW9ucyBhcyBzcGVjaWZpZWQgYnkgdGhlIEFuZ3VsYXIgcm91dGVyIGBuYXZpZ2F0ZSgpYCBtZXRob2QuXHJcbiAgICAgKiBAcmV0dXJuIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCB3aGVuIG5hdmlnYXRpb24gc3VjY2VlZHMsIG9yIGBmYWxzZWAgd2hlbiBuYXZpZ2F0aW9uIGZhaWxzLlxyXG4gICAgICogXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5kZXYvYXBpL3JvdXRlci9Sb3V0ZXIjbmF2aWdhdGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIG5hdmlnYXRlKGNvbW1hbmRzOiBzdHJpbmdbXSwgZXh0cmFzPzogTmF2aWdhdGlvbkV4dHJhcyB8IHVuZGVmaW5lZCk6IFByb21pc2U8Ym9vbGVhbj4ge1xyXG4gICAgICAgIHJldHVybiB0aGlzLl96b25lLnJ1bigoKSA9PiB7XHJcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9yb3V0ZXIubmF2aWdhdGUoY29tbWFuZHMsIGV4dHJhcyk7XHJcbiAgICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgLyoqXHJcbiAgICAgKiBBbGxvd3MgdG8gc2Nyb2xsIHRvIHRoZSBmcmFnbWVudCBzcGVjaWZpZWQgYnkgdGhlIGBocmVmYCBhdHRyaWJ1dGUgd2hlbiB0aGUgdXNlciBlbGVtZW50IGludGVyYWN0IHdpdGggdGhlIGFzc29jaWF0ZWQgZWxlbWVudC5cclxuICAgICAqIFxyXG4gICAgICogQGV4YW1wbGVcclxuICAgICAqIDxhIGhyZWY9XCIjbXlBbmNob3JcIiBvbmNsaWNrPVwiYXBwQnJpZGdlLmdvVG9BbmNob3IoZXZlbnQpXCI+TXkgU2VjdGlvbjwvYT48L2NvZGU+XHJcbiAgICAgKiBcclxuICAgICAqIEBwYXJhbSBldmVudCBUaGUgZXZlbnQgdGhhdCB0cmlnZ2VycyB0aGUgYW5jaG9yIG5hdmlnYXRpb24uXHJcbiAgICAgKiBAcmV0dXJuIGBQcm9taXNlYCB0aGF0IHJlc29sdmVzIHRvIGB0cnVlYCB3aGVuIG5hdmlnYXRpb24gc3VjY2VlZHMsIG9yIGBmYWxzZWAgd2hlbiBuYXZpZ2F0aW9uIGZhaWxzLlxyXG4gICAgICogXHJcbiAgICAgKiBAc2VlIGh0dHBzOi8vYW5ndWxhci5kZXYvYXBpL3JvdXRlci9Sb3V0ZXIjbmF2aWdhdGVcclxuICAgICAqL1xyXG4gICAgcHVibGljIGdvVG9BbmNob3IoZXZlbnQ6IEV2ZW50KTogUHJvbWlzZTxib29sZWFuPiB7XHJcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcclxuICAgICAgICBjb25zdCBhbmNob3I6IHN0cmluZyA9IChldmVudC50YXJnZXQgYXMgYW55KS5nZXRBdHRyaWJ1dGUoSFJFRik7XHJcbiAgICAgICAgaWYgKCFhbmNob3IpIHRocm93IG5ldyBSZWZlcmVuY2VFcnJvcihcImhyZWYgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkLlwiKTtcclxuICAgICAgICBjb25zdCBlbG06IGFueSA9IHRoaXMuX2RvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoYW5jaG9yKTtcclxuICAgICAgICBpZiAoIWVsbSkgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlOiBGdW5jdGlvbikgPT4gcmVzb2x2ZShmYWxzZSkpO1xyXG4gICAgICAgIGVsbS5zY3JvbGxJbnRvVmlldyhERUZBVUxUX1NDUk9MTF9CRUhBVklPUik7XHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX3pvbmUucnVuKCgpID0+IHtcclxuICAgICAgICAgICByZXR1cm4gdGhpcy5fcm91dGVyLm5hdmlnYXRlKFtdLCB7IGZyYWdtZW50OiBhbmNob3Iuc2xpY2UoMSl9KTtcclxuICAgICAgICB9KTtcclxuICAgIH1cclxuXHJcbiAgICAvKipcclxuICAgICAqIERlY2xhcmVzIGEgbmV3IEphdmFTY3JpcHQgY29tbWFuZCB0byBiZSB1c2VkIHdpdGggZHluYW1pY2FsbHkgbG9hZGVkIGRvY3VtZW50cy5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gZGVjbGFyZS5cclxuICAgICAqIEBwYXJhbSBjb21tYW5kIFRoZSByZWZlcmVuY2UgdG8gYSBKYXZhU2NyaXB0IGNvbW1hbmQgdG8gYmUgdXNlZCB3aXRoIGR5bmFtaWNhbGx5IGxvYWRlZCBkb2N1bWVudHMuXHJcbiAgICAgKi9cclxuICAgIHB1YmxpYyBkZWNsYXJlQ29tbWFuZChuYW1lOiBzdHJpbmcsIGNvbW1hbmQ6IEFwcEJyaWRnZUNvbW1hbmQpOiB2b2lkIHtcclxuICAgICAgICB0aGlzLmNoZWNrQ29tbWFuZE5hbWUobmFtZSk7XHJcbiAgICAgICAgaWYoIXRoaXMuX2FwcEJyaWRnZS5oYXNDb21tYW5kKG5hbWUpKSB7XHJcbiAgICAgICAgICAgIHRoaXMuX2FwcEJyaWRnZS5hZGRDb21tYW5kKG5hbWUsIGNvbW1hbmQpO1xyXG4gICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcywgbmFtZSwge1xyXG4gICAgICAgICAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlLFxyXG4gICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHtcclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fYXBwQnJpZGdlLmdldENvbW1hbmQobmFtZSk7XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuICAgIH1cclxuICAgIFxyXG4gICAgLyoqXHJcbiAgICAgKiBVbnJlZ2lzdGVycyBhIEphdmFTY3JpcHQgY29tbWFuZCBwcmV2aW91c2x5IHJlZmVyZW5jZWQgd2l0aCB0aGUgYGRlY2xhcmVDb21tYW5kKClgIG1ldGhvZC5cclxuICAgICAqIFxyXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIGNvbW1hbmQgdG8gcmVtb3ZlLlxyXG4gICAgICogXHJcbiAgICAgKiBAcmV0dXJucyBgdHJ1ZWAgd2hldGhlciB0aGUgY29tbWFuZCBleGlzdGVkIGFuZCBoYXMgYmVlbiByZW1vdmVkOyBgZmFsc2VgIG90aGVyd2lzZS5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGRlbGV0ZUNvbW1hbmQobmFtZTogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAgICAgdGhpcy5jaGVja0NvbW1hbmROYW1lKG5hbWUpO1xyXG4gICAgICAgIGlmKCF0aGlzLl9hcHBCcmlkZ2UucmVtb3ZlQ29tbWFuZChuYW1lKSkgcmV0dXJuIGZhbHNlO1xyXG4gICAgICAgIGRlbGV0ZSB0aGlzLl9kZWZhdWx0Vmlld1tBUFBfUFJJREdFX1JFRl1bbmFtZV07XHJcbiAgICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8qKlxyXG4gICAgICogUmV0dXJucyB0aGUgSmF2YVNjcmlwdCBjb21tYW5kIHByZXZpb3VzbHkgcmVmZXJlbmNlZCB3aXRoIHRoZSBgZGVjbGFyZUNvbW1hbmQoKWAgbWV0aG9kLlxyXG4gICAgICogXHJcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY29tbWFuZCB0byByZXRyaWV2ZS5cclxuICAgICAqIEByZXR1cm5zIFRoZSBKYXZhU2NyaXB0IGNvbW1hbmQgcHJldmlvdXNseSByZWZlcmVuY2VkIHdpdGggdGhlIHNwZWNpZmllZCBgbmFtZWAgcGFyYW1ldGVyLlxyXG4gICAgICogICAgICAgICAgSWYgbm8gY29tbWFuZCBpcyBmb3VuZCwgcmV0dXJucyBgdW5kZWZpbmVkYC5cclxuICAgICAqL1xyXG4gICAgcHVibGljIGdldENvbW1hbmQobmFtZTogc3RyaW5nKTogQXBwQnJpZGdlQ29tbWFuZCB8IHVuZGVmaW5lZCB7ICAgXHJcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FwcEJyaWRnZS5nZXRDb21tYW5kKG5hbWUpO1xyXG4gICAgfVxyXG5cclxuICAgIC8qKlxyXG4gICAgICogQHByaXZhdGVcclxuICAgICAqL1xyXG4gICAgcHJpdmF0ZSBjaGVja0NvbW1hbmROYW1lKG5hbWU6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgICAgIGlmIChOQVRJVkVfQ09NTUFORFMuaW5jbHVkZXMobmFtZSkpIHRocm93IG5ldyBBcHBCcmlkZ2VFcnJvcihcIkNvbW1hbmQgbmFtZSBjYW5ub3QgYmUgdGhlIHJlZmVyZW5jZSB0byBhIG5hdGl2ZSBjb21tYW5kOiBcIiArIG5hbWUpO1xyXG4gICAgfVxyXG59Il19
|