@abp/ng.core 5.0.1 → 5.0.2
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/README.md +3 -3
- package/abp-ng.core.d.ts +5 -5
- package/bundles/abp-ng.core-locale.umd.js +361 -361
- package/bundles/abp-ng.core-locale.umd.js.map +1 -1
- package/bundles/abp-ng.core-testing.umd.js +442 -442
- package/bundles/abp-ng.core-testing.umd.js.map +1 -1
- package/bundles/abp-ng.core.umd.js +4873 -4868
- package/bundles/abp-ng.core.umd.js.map +1 -1
- package/esm2015/abp-ng.core.js +4 -4
- package/esm2015/lib/abstracts/index.js +2 -2
- package/esm2015/lib/abstracts/ng-model.component.js +59 -59
- package/esm2015/lib/components/dynamic-layout.component.js +89 -89
- package/esm2015/lib/components/index.js +4 -4
- package/esm2015/lib/components/replaceable-route-container.component.js +42 -42
- package/esm2015/lib/components/router-outlet.component.js +15 -15
- package/esm2015/lib/constants/different-locales.js +337 -337
- package/esm2015/lib/constants/index.js +2 -2
- package/esm2015/lib/core.module.js +281 -281
- package/esm2015/lib/directives/autofocus.directive.js +30 -30
- package/esm2015/lib/directives/debounce.directive.js +36 -36
- package/esm2015/lib/directives/for.directive.js +151 -151
- package/esm2015/lib/directives/form-submit.directive.js +69 -69
- package/esm2015/lib/directives/index.js +9 -9
- package/esm2015/lib/directives/init.directive.js +21 -21
- package/esm2015/lib/directives/permission.directive.js +48 -48
- package/esm2015/lib/directives/replaceable-template.directive.js +121 -121
- package/esm2015/lib/directives/stop-propagation.directive.js +32 -32
- package/esm2015/lib/enums/common.js +2 -2
- package/esm2015/lib/enums/index.js +2 -2
- package/esm2015/lib/guards/auth.guard.js +29 -29
- package/esm2015/lib/guards/index.js +3 -3
- package/esm2015/lib/guards/permission.guard.js +44 -44
- package/esm2015/lib/handlers/oauth-configuration.handler.js +37 -37
- package/esm2015/lib/handlers/routes.handler.js +47 -47
- package/esm2015/lib/interceptors/api.interceptor.js +54 -54
- package/esm2015/lib/interceptors/index.js +2 -2
- package/esm2015/lib/localization.module.js +16 -16
- package/esm2015/lib/models/auth.js +2 -2
- package/esm2015/lib/models/common.js +2 -2
- package/esm2015/lib/models/dtos.js +119 -119
- package/esm2015/lib/models/environment.js +2 -2
- package/esm2015/lib/models/index.js +10 -10
- package/esm2015/lib/models/localization.js +2 -2
- package/esm2015/lib/models/replaceable-components.js +2 -2
- package/esm2015/lib/models/rest.js +2 -2
- package/esm2015/lib/models/session.js +2 -2
- package/esm2015/lib/models/utility.js +2 -2
- package/esm2015/lib/pipes/index.js +3 -3
- package/esm2015/lib/pipes/localization.pipe.js +33 -33
- package/esm2015/lib/pipes/sort.pipe.js +49 -49
- package/esm2015/lib/providers/cookie-language.provider.js +22 -22
- package/esm2015/lib/providers/locale.provider.js +22 -22
- package/esm2015/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.js +29 -29
- package/esm2015/lib/proxy/pages/abp/multi-tenancy/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.js +24 -24
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.js +25 -25
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/index.js +5 -5
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/models.js +3 -3
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/http/modeling/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/http/modeling/models.js +3 -3
- package/esm2015/lib/proxy/volo/abp/localization/index.js +2 -2
- package/esm2015/lib/proxy/volo/abp/localization/models.js +2 -2
- package/esm2015/lib/proxy/volo/abp/models.js +2 -2
- package/esm2015/lib/services/auth.service.js +47 -47
- package/esm2015/lib/services/config-state.service.js +130 -130
- package/esm2015/lib/services/content-projection.service.js +17 -17
- package/esm2015/lib/services/dom-insertion.service.js +32 -32
- package/esm2015/lib/services/environment.service.js +35 -35
- package/esm2015/lib/services/http-error-reporter.service.js +29 -29
- package/esm2015/lib/services/http-wait.service.js +72 -72
- package/esm2015/lib/services/index.js +22 -22
- package/esm2015/lib/services/lazy-load.service.js +38 -38
- package/esm2015/lib/services/list.service.js +103 -103
- package/esm2015/lib/services/localization.service.js +182 -182
- package/esm2015/lib/services/multi-tenancy.service.js +48 -48
- package/esm2015/lib/services/permission.service.js +64 -64
- package/esm2015/lib/services/replaceable-components.service.js +49 -49
- package/esm2015/lib/services/resource-wait.service.js +39 -39
- package/esm2015/lib/services/rest.service.js +63 -63
- package/esm2015/lib/services/router-events.service.js +38 -38
- package/esm2015/lib/services/router-wait.service.js +51 -51
- package/esm2015/lib/services/routes.service.js +147 -147
- package/esm2015/lib/services/session-state.service.js +76 -76
- package/esm2015/lib/services/subscription.service.js +41 -41
- package/esm2015/lib/services/track-by.service.js +21 -21
- package/esm2015/lib/strategies/auth-flow.strategy.js +202 -202
- package/esm2015/lib/strategies/container.strategy.js +38 -38
- package/esm2015/lib/strategies/content-security.strategy.js +28 -28
- package/esm2015/lib/strategies/content.strategy.js +48 -48
- package/esm2015/lib/strategies/context.strategy.js +37 -37
- package/esm2015/lib/strategies/cross-origin.strategy.js +26 -26
- package/esm2015/lib/strategies/dom.strategy.js +27 -27
- package/esm2015/lib/strategies/index.js +9 -9
- package/esm2015/lib/strategies/loading.strategy.js +58 -58
- package/esm2015/lib/strategies/projection.strategy.js +80 -80
- package/esm2015/lib/tokens/app-config.token.js +3 -3
- package/esm2015/lib/tokens/cookie-language-key.token.js +5 -5
- package/esm2015/lib/tokens/index.js +9 -9
- package/esm2015/lib/tokens/list.token.js +3 -3
- package/esm2015/lib/tokens/localization.token.js +10 -10
- package/esm2015/lib/tokens/lodaer-delay.token.js +3 -3
- package/esm2015/lib/tokens/manage-profile.token.js +12 -12
- package/esm2015/lib/tokens/options.token.js +8 -8
- package/esm2015/lib/tokens/tenant-key.token.js +3 -3
- package/esm2015/lib/utils/array-utils.js +7 -7
- package/esm2015/lib/utils/auth-utils.js +42 -42
- package/esm2015/lib/utils/common-utils.js +29 -29
- package/esm2015/lib/utils/date-extensions.js +6 -6
- package/esm2015/lib/utils/date-utils.js +13 -13
- package/esm2015/lib/utils/environment-utils.js +36 -36
- package/esm2015/lib/utils/factory-utils.js +24 -24
- package/esm2015/lib/utils/file-utils.js +14 -14
- package/esm2015/lib/utils/form-utils.js +12 -12
- package/esm2015/lib/utils/generator-utils.js +34 -34
- package/esm2015/lib/utils/http-utils.js +19 -19
- package/esm2015/lib/utils/index.js +21 -21
- package/esm2015/lib/utils/initial-utils.js +64 -64
- package/esm2015/lib/utils/internal-store-utils.js +36 -36
- package/esm2015/lib/utils/lazy-load-utils.js +40 -40
- package/esm2015/lib/utils/localization-utils.js +50 -50
- package/esm2015/lib/utils/multi-tenancy-utils.js +83 -83
- package/esm2015/lib/utils/number-utils.js +4 -4
- package/esm2015/lib/utils/object-utils.js +37 -37
- package/esm2015/lib/utils/route-utils.js +27 -27
- package/esm2015/lib/utils/string-utils.js +25 -21
- package/esm2015/lib/utils/tree-utils.js +54 -54
- package/esm2015/lib/validators/age.validator.js +14 -14
- package/esm2015/lib/validators/credit-card.validator.js +21 -21
- package/esm2015/lib/validators/index.js +23 -23
- package/esm2015/lib/validators/range.validator.js +15 -15
- package/esm2015/lib/validators/required.validator.js +13 -13
- package/esm2015/lib/validators/string-length.validator.js +15 -15
- package/esm2015/lib/validators/url.validator.js +16 -16
- package/esm2015/locale/abp-ng.core-locale.js +4 -4
- package/esm2015/locale/public-api.js +2 -2
- package/esm2015/locale/utils/register-locale.js +43 -43
- package/esm2015/public-api.js +26 -26
- package/esm2015/testing/abp-ng.core-testing.js +4 -4
- package/esm2015/testing/lib/core-testing.module.js +62 -62
- package/esm2015/testing/lib/services/index.js +3 -3
- package/esm2015/testing/lib/services/mock-permission.service.js +35 -35
- package/esm2015/testing/lib/services/mock-rest.service.js +30 -30
- package/esm2015/testing/lib/utils/clear-page.util.js +10 -10
- package/esm2015/testing/lib/utils/index.js +3 -3
- package/esm2015/testing/lib/utils/wait.util.js +5 -5
- package/esm2015/testing/public-api.js +4 -4
- package/fesm2015/abp-ng.core-locale.js +40 -40
- package/fesm2015/abp-ng.core-locale.js.map +1 -1
- package/fesm2015/abp-ng.core-testing.js +113 -113
- package/fesm2015/abp-ng.core-testing.js.map +1 -1
- package/fesm2015/abp-ng.core.js +3979 -3975
- package/fesm2015/abp-ng.core.js.map +1 -1
- package/lib/abstracts/index.d.ts +1 -1
- package/lib/abstracts/ng-model.component.d.ts +25 -25
- package/lib/components/dynamic-layout.component.d.ts +27 -27
- package/lib/components/index.d.ts +3 -3
- package/lib/components/replaceable-route-container.component.d.ts +17 -17
- package/lib/components/router-outlet.component.d.ts +5 -5
- package/lib/constants/different-locales.d.ts +334 -334
- package/lib/constants/index.d.ts +1 -1
- package/lib/core.module.d.ts +56 -56
- package/lib/directives/autofocus.directive.d.ts +12 -12
- package/lib/directives/debounce.directive.d.ts +13 -13
- package/lib/directives/for.directive.d.ts +36 -36
- package/lib/directives/form-submit.directive.d.ts +19 -19
- package/lib/directives/index.d.ts +8 -8
- package/lib/directives/init.directive.d.ts +10 -10
- package/lib/directives/permission.directive.d.ts +18 -18
- package/lib/directives/replaceable-template.directive.d.ts +30 -30
- package/lib/directives/stop-propagation.directive.d.ts +12 -12
- package/lib/enums/common.d.ts +5 -5
- package/lib/enums/index.d.ts +1 -1
- package/lib/guards/auth.guard.d.ts +13 -13
- package/lib/guards/index.d.ts +2 -2
- package/lib/guards/permission.guard.d.ts +16 -16
- package/lib/handlers/oauth-configuration.handler.d.ts +13 -13
- package/lib/handlers/routes.handler.d.ts +11 -11
- package/lib/interceptors/api.interceptor.d.ts +16 -16
- package/lib/interceptors/index.d.ts +1 -1
- package/lib/localization.module.d.ts +7 -7
- package/lib/models/auth.d.ts +6 -6
- package/lib/models/common.d.ts +77 -77
- package/lib/models/dtos.d.ts +95 -95
- package/lib/models/environment.d.ts +35 -35
- package/lib/models/index.d.ts +9 -9
- package/lib/models/localization.d.ts +5 -5
- package/lib/models/replaceable-components.d.ts +45 -45
- package/lib/models/rest.d.ts +35 -35
- package/lib/models/session.d.ts +7 -7
- package/lib/models/utility.d.ts +14 -14
- package/lib/pipes/index.d.ts +2 -2
- package/lib/pipes/localization.pipe.d.ts +12 -12
- package/lib/pipes/sort.pipe.d.ts +9 -9
- package/lib/providers/cookie-language.provider.d.ts +3 -3
- package/lib/providers/locale.provider.d.ts +9 -9
- package/lib/proxy/pages/abp/multi-tenancy/abp-tenant.service.d.ts +12 -12
- package/lib/proxy/pages/abp/multi-tenancy/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/abp-api-definition.service.d.ts +11 -11
- package/lib/proxy/volo/abp/asp-net-core/mvc/api-exploring/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/abp-application-configuration.service.d.ts +11 -11
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/index.d.ts +4 -4
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/models.d.ts +85 -85
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/application-configurations/object-extending/models.d.ts +71 -71
- package/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/index.d.ts +1 -1
- package/lib/proxy/volo/abp/asp-net-core/mvc/multi-tenancy/models.d.ts +14 -14
- package/lib/proxy/volo/abp/http/modeling/index.d.ts +1 -1
- package/lib/proxy/volo/abp/http/modeling/models.d.ts +70 -70
- package/lib/proxy/volo/abp/localization/index.d.ts +1 -1
- package/lib/proxy/volo/abp/localization/models.d.ts +6 -6
- package/lib/proxy/volo/abp/models.d.ts +4 -4
- package/lib/services/auth.service.d.ts +17 -17
- package/lib/services/config-state.service.d.ts +339 -339
- package/lib/services/content-projection.service.d.ts +10 -10
- package/lib/services/dom-insertion.service.d.ts +10 -10
- package/lib/services/environment.service.d.ts +96 -96
- package/lib/services/http-error-reporter.service.d.ts +12 -12
- package/lib/services/http-wait.service.d.ts +30 -30
- package/lib/services/index.d.ts +21 -21
- package/lib/services/lazy-load.service.d.ts +13 -13
- package/lib/services/list.service.d.ts +39 -39
- package/lib/services/localization.service.d.ts +47 -47
- package/lib/services/multi-tenancy.service.d.ts +22 -22
- package/lib/services/permission.service.d.ts +19 -19
- package/lib/services/replaceable-components.service.d.ts +19 -19
- package/lib/services/resource-wait.service.d.ts +15 -15
- package/lib/services/rest.service.d.ts +20 -20
- package/lib/services/router-events.service.d.ts +29 -29
- package/lib/services/router-wait.service.d.ts +20 -20
- package/lib/services/routes.service.d.ts +50 -50
- package/lib/services/session-state.service.d.ts +25 -25
- package/lib/services/subscription.service.d.ts +17 -17
- package/lib/services/track-by.service.d.ts +11 -11
- package/lib/strategies/auth-flow.strategy.d.ts +367 -367
- package/lib/strategies/container.strategy.d.ts +22 -22
- package/lib/strategies/content-security.strategy.d.ts +17 -17
- package/lib/strategies/content.strategy.d.ts +26 -26
- package/lib/strategies/context.strategy.d.ts +23 -23
- package/lib/strategies/cross-origin.strategy.d.ts +14 -14
- package/lib/strategies/dom.strategy.d.ts +13 -13
- package/lib/strategies/index.d.ts +8 -8
- package/lib/strategies/loading.strategy.d.ts +28 -28
- package/lib/strategies/projection.strategy.d.ts +39 -39
- package/lib/tokens/app-config.token.d.ts +3 -3
- package/lib/tokens/cookie-language-key.token.d.ts +2 -2
- package/lib/tokens/index.d.ts +8 -8
- package/lib/tokens/list.token.d.ts +2 -2
- package/lib/tokens/localization.token.d.ts +6 -6
- package/lib/tokens/lodaer-delay.token.d.ts +2 -2
- package/lib/tokens/manage-profile.token.d.ts +2 -2
- package/lib/tokens/options.token.d.ts +4 -4
- package/lib/tokens/tenant-key.token.d.ts +2 -2
- package/lib/utils/array-utils.d.ts +1 -1
- package/lib/utils/auth-utils.d.ts +162 -162
- package/lib/utils/common-utils.d.ts +9 -9
- package/lib/utils/date-extensions.d.ts +6 -6
- package/lib/utils/date-utils.d.ts +4 -4
- package/lib/utils/environment-utils.d.ts +3 -3
- package/lib/utils/factory-utils.d.ts +9 -9
- package/lib/utils/file-utils.d.ts +1 -1
- package/lib/utils/form-utils.d.ts +2 -2
- package/lib/utils/generator-utils.d.ts +3 -3
- package/lib/utils/http-utils.d.ts +8 -8
- package/lib/utils/index.d.ts +20 -20
- package/lib/utils/initial-utils.d.ts +159 -159
- package/lib/utils/internal-store-utils.d.ts +14 -14
- package/lib/utils/lazy-load-utils.d.ts +4 -4
- package/lib/utils/localization-utils.d.ts +5 -5
- package/lib/utils/multi-tenancy-utils.d.ts +3 -3
- package/lib/utils/number-utils.d.ts +1 -1
- package/lib/utils/object-utils.d.ts +1 -1
- package/lib/utils/route-utils.d.ts +8 -8
- package/lib/utils/string-utils.d.ts +3 -2
- package/lib/utils/tree-utils.d.ts +19 -19
- package/lib/validators/age.validator.d.ts +10 -10
- package/lib/validators/credit-card.validator.d.ts +5 -5
- package/lib/validators/index.d.ts +22 -22
- package/lib/validators/range.validator.d.ts +12 -12
- package/lib/validators/required.validator.d.ts +8 -8
- package/lib/validators/string-length.validator.d.ts +14 -14
- package/lib/validators/url.validator.d.ts +5 -5
- package/locale/abp-ng.core-locale.d.ts +5 -5
- package/locale/public-api.d.ts +1 -1
- package/locale/utils/register-locale.d.ts +13 -13
- package/package.json +2 -2
- package/public-api.d.ts +24 -24
- package/testing/abp-ng.core-testing.d.ts +5 -5
- package/testing/lib/core-testing.module.d.ts +16 -16
- package/testing/lib/services/index.d.ts +2 -2
- package/testing/lib/services/mock-permission.service.d.ts +10 -10
- package/testing/lib/services/mock-rest.service.d.ts +13 -13
- package/testing/lib/utils/clear-page.util.d.ts +2 -2
- package/testing/lib/utils/index.d.ts +2 -2
- package/testing/lib/utils/wait.util.d.ts +2 -2
- package/testing/public-api.d.ts +3 -3
|
@@ -1,202 +1,202 @@
|
|
|
1
|
-
import { __awaiter } from "tslib";
|
|
2
|
-
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
-
import { Router } from '@angular/router';
|
|
4
|
-
import { OAuthErrorEvent, OAuthInfoEvent, OAuthService } from 'angular-oauth2-oidc';
|
|
5
|
-
import { from, of, pipe } from 'rxjs';
|
|
6
|
-
import { filter, switchMap, tap } from 'rxjs/operators';
|
|
7
|
-
import { ConfigStateService } from '../services/config-state.service';
|
|
8
|
-
import { EnvironmentService } from '../services/environment.service';
|
|
9
|
-
import { HttpErrorReporterService } from '../services/http-error-reporter.service';
|
|
10
|
-
import { SessionStateService } from '../services/session-state.service';
|
|
11
|
-
import { TENANT_KEY } from '../tokens/tenant-key.token';
|
|
12
|
-
import { removeRememberMe, setRememberMe } from '../utils/auth-utils';
|
|
13
|
-
import { noop } from '../utils/common-utils';
|
|
14
|
-
export const oAuthStorage = localStorage;
|
|
15
|
-
export class AuthFlowStrategy {
|
|
16
|
-
constructor(injector) {
|
|
17
|
-
this.injector = injector;
|
|
18
|
-
this.catchError = err => {
|
|
19
|
-
this.httpErrorReporter.reportError(err);
|
|
20
|
-
return of(null);
|
|
21
|
-
};
|
|
22
|
-
this.httpErrorReporter = injector.get(HttpErrorReporterService);
|
|
23
|
-
this.environment = injector.get(EnvironmentService);
|
|
24
|
-
this.configState = injector.get(ConfigStateService);
|
|
25
|
-
this.oAuthService = injector.get(OAuthService);
|
|
26
|
-
this.sessionState = injector.get(SessionStateService);
|
|
27
|
-
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig;
|
|
28
|
-
this.tenantKey = injector.get(TENANT_KEY);
|
|
29
|
-
this.listenToOauthErrors();
|
|
30
|
-
}
|
|
31
|
-
init() {
|
|
32
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
-
const shouldClear = shouldStorageClear(this.environment.getEnvironment().oAuthConfig.clientId, oAuthStorage);
|
|
34
|
-
if (shouldClear)
|
|
35
|
-
clearOAuthStorage(oAuthStorage);
|
|
36
|
-
this.oAuthService.configure(this.oAuthConfig);
|
|
37
|
-
this.oAuthService.events
|
|
38
|
-
.pipe(filter(event => event.type === 'token_refresh_error'))
|
|
39
|
-
.subscribe(() => this.navigateToLogin());
|
|
40
|
-
return this.oAuthService
|
|
41
|
-
.loadDiscoveryDocument()
|
|
42
|
-
.then(() => {
|
|
43
|
-
if (this.oAuthService.hasValidAccessToken() || !this.oAuthService.getRefreshToken()) {
|
|
44
|
-
return Promise.resolve();
|
|
45
|
-
}
|
|
46
|
-
return this.refreshToken();
|
|
47
|
-
})
|
|
48
|
-
.catch(this.catchError);
|
|
49
|
-
});
|
|
50
|
-
}
|
|
51
|
-
refreshToken() {
|
|
52
|
-
return this.oAuthService.refreshToken().catch(() => clearOAuthStorage());
|
|
53
|
-
}
|
|
54
|
-
listenToOauthErrors() {
|
|
55
|
-
this.oAuthService.events
|
|
56
|
-
.pipe(filter(event => event instanceof OAuthErrorEvent), tap(() => clearOAuthStorage()), switchMap(() => this.configState.refreshAppState()))
|
|
57
|
-
.subscribe();
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
export class AuthCodeFlowStrategy extends AuthFlowStrategy {
|
|
61
|
-
constructor() {
|
|
62
|
-
super(...arguments);
|
|
63
|
-
this.isInternalAuth = false;
|
|
64
|
-
}
|
|
65
|
-
init() {
|
|
66
|
-
const _super = Object.create(null, {
|
|
67
|
-
init: { get: () => super.init }
|
|
68
|
-
});
|
|
69
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
-
return _super.init.call(this)
|
|
71
|
-
.then(() => this.oAuthService.tryLogin().catch(noop))
|
|
72
|
-
.then(() => this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token'));
|
|
73
|
-
});
|
|
74
|
-
}
|
|
75
|
-
navigateToLogin(queryParams) {
|
|
76
|
-
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
77
|
-
}
|
|
78
|
-
checkIfInternalAuth(queryParams) {
|
|
79
|
-
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
80
|
-
return false;
|
|
81
|
-
}
|
|
82
|
-
logout(queryParams) {
|
|
83
|
-
return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams)));
|
|
84
|
-
}
|
|
85
|
-
login(queryParams) {
|
|
86
|
-
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
87
|
-
return of(null);
|
|
88
|
-
}
|
|
89
|
-
getCultureParams(queryParams) {
|
|
90
|
-
const lang = this.sessionState.getLanguage();
|
|
91
|
-
const culture = { culture: lang, 'ui-culture': lang };
|
|
92
|
-
return Object.assign(Object.assign({}, (lang && culture)), queryParams);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
|
|
96
|
-
constructor() {
|
|
97
|
-
super(...arguments);
|
|
98
|
-
this.isInternalAuth = true;
|
|
99
|
-
this.cookieKey = 'rememberMe';
|
|
100
|
-
this.storageKey = 'passwordFlow';
|
|
101
|
-
}
|
|
102
|
-
listenToTokenExpiration() {
|
|
103
|
-
this.oAuthService.events
|
|
104
|
-
.pipe(filter(event => event instanceof OAuthInfoEvent &&
|
|
105
|
-
event.type === 'token_expires' &&
|
|
106
|
-
event.info === 'access_token'))
|
|
107
|
-
.subscribe(() => {
|
|
108
|
-
if (this.oAuthService.getRefreshToken()) {
|
|
109
|
-
this.refreshToken();
|
|
110
|
-
}
|
|
111
|
-
else {
|
|
112
|
-
this.oAuthService.logOut();
|
|
113
|
-
removeRememberMe();
|
|
114
|
-
this.configState.refreshAppState().subscribe();
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
init() {
|
|
119
|
-
const _super = Object.create(null, {
|
|
120
|
-
init: { get: () => super.init }
|
|
121
|
-
});
|
|
122
|
-
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
-
if (!getCookieValueByName(this.cookieKey) && localStorage.getItem(this.storageKey)) {
|
|
124
|
-
this.oAuthService.logOut();
|
|
125
|
-
}
|
|
126
|
-
return _super.init.call(this).then(() => this.listenToTokenExpiration());
|
|
127
|
-
});
|
|
128
|
-
}
|
|
129
|
-
navigateToLogin(queryParams) {
|
|
130
|
-
const router = this.injector.get(Router);
|
|
131
|
-
router.navigate(['/account/login'], { queryParams });
|
|
132
|
-
}
|
|
133
|
-
checkIfInternalAuth() {
|
|
134
|
-
return true;
|
|
135
|
-
}
|
|
136
|
-
login(params) {
|
|
137
|
-
const tenant = this.sessionState.getTenant();
|
|
138
|
-
return from(this.oAuthService.fetchTokenUsingPasswordFlow(params.username, params.password, new HttpHeaders(Object.assign({}, (tenant && tenant.id && { [this.tenantKey]: tenant.id }))))).pipe(this.pipeToLogin(params));
|
|
139
|
-
}
|
|
140
|
-
pipeToLogin(params) {
|
|
141
|
-
const router = this.injector.get(Router);
|
|
142
|
-
return pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
143
|
-
setRememberMe(params.rememberMe);
|
|
144
|
-
if (params.redirectUrl)
|
|
145
|
-
router.navigate([params.redirectUrl]);
|
|
146
|
-
}));
|
|
147
|
-
}
|
|
148
|
-
logout(queryParams) {
|
|
149
|
-
const router = this.injector.get(Router);
|
|
150
|
-
return from(this.oAuthService.revokeTokenAndLogout(queryParams)).pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
151
|
-
router.navigateByUrl('/');
|
|
152
|
-
removeRememberMe();
|
|
153
|
-
}));
|
|
154
|
-
}
|
|
155
|
-
refreshToken() {
|
|
156
|
-
return this.oAuthService.refreshToken().catch(() => {
|
|
157
|
-
clearOAuthStorage();
|
|
158
|
-
removeRememberMe();
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
}
|
|
162
|
-
export const AUTH_FLOW_STRATEGY = {
|
|
163
|
-
Code(injector) {
|
|
164
|
-
return new AuthCodeFlowStrategy(injector);
|
|
165
|
-
},
|
|
166
|
-
Password(injector) {
|
|
167
|
-
return new AuthPasswordFlowStrategy(injector);
|
|
168
|
-
},
|
|
169
|
-
};
|
|
170
|
-
export function clearOAuthStorage(storage = oAuthStorage) {
|
|
171
|
-
const keys = [
|
|
172
|
-
'access_token',
|
|
173
|
-
'id_token',
|
|
174
|
-
'refresh_token',
|
|
175
|
-
'nonce',
|
|
176
|
-
'PKCE_verifier',
|
|
177
|
-
'expires_at',
|
|
178
|
-
'id_token_claims_obj',
|
|
179
|
-
'id_token_expires_at',
|
|
180
|
-
'id_token_stored_at',
|
|
181
|
-
'access_token_stored_at',
|
|
182
|
-
'granted_scopes',
|
|
183
|
-
'session_state',
|
|
184
|
-
];
|
|
185
|
-
keys.forEach(key => storage.removeItem(key));
|
|
186
|
-
}
|
|
187
|
-
function shouldStorageClear(clientId, storage) {
|
|
188
|
-
const key = 'abpOAuthClientId';
|
|
189
|
-
if (!storage.getItem(key)) {
|
|
190
|
-
storage.setItem(key, clientId);
|
|
191
|
-
return false;
|
|
192
|
-
}
|
|
193
|
-
const shouldClear = storage.getItem(key) !== clientId;
|
|
194
|
-
if (shouldClear)
|
|
195
|
-
storage.setItem(key, clientId);
|
|
196
|
-
return shouldClear;
|
|
197
|
-
}
|
|
198
|
-
function getCookieValueByName(name) {
|
|
199
|
-
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
200
|
-
return match ? match[2] : '';
|
|
201
|
-
}
|
|
202
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1mbG93LnN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL3N0cmF0ZWdpZXMvYXV0aC1mbG93LnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLFlBQVksRUFFYixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBcUJwQyxZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBTGhDLGVBQVUsR0FBRyxHQUFHLENBQUMs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UUFDckIsb0JBQW9CO1FBQ3BCLHdCQUF3QjtRQUN4QixnQkFBZ0I7UUFDaEIsZUFBZTtLQUNoQixDQUFDO0lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLE9BQXFCO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDO0lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RCxJQUFJLFdBQVc7UUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xyXG5pbXBvcnQgeyBJbmplY3RvciB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBQYXJhbXMsIFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7XHJcbiAgQXV0aENvbmZpZyxcclxuICBPQXV0aEVycm9yRXZlbnQsXHJcbiAgT0F1dGhJbmZvRXZlbnQsXHJcbiAgT0F1dGhTZXJ2aWNlLFxyXG4gIE9BdXRoU3RvcmFnZVxyXG59IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xyXG5pbXBvcnQgeyBmcm9tLCBPYnNlcnZhYmxlLCBvZiwgcGlwZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIHN3aXRjaE1hcCwgdGFwIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBMb2dpblBhcmFtcyB9IGZyb20gJy4uL21vZGVscy9hdXRoJztcclxuaW1wb3J0IHsgQ29uZmlnU3RhdGVTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY29uZmlnLXN0YXRlLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBFbnZpcm9ubWVudFNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9lbnZpcm9ubWVudC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSHR0cEVycm9yUmVwb3J0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaHR0cC1lcnJvci1yZXBvcnRlci5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2Vzc2lvblN0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL3Nlc3Npb24tc3RhdGUuc2VydmljZSc7XHJcbmltcG9ydCB7IFRFTkFOVF9LRVkgfSBmcm9tICcuLi90b2tlbnMvdGVuYW50LWtleS50b2tlbic7XHJcbmltcG9ydCB7IHJlbW92ZVJlbWVtYmVyTWUsIHNldFJlbWVtYmVyTWUgfSBmcm9tICcuLi91dGlscy9hdXRoLXV0aWxzJztcclxuaW1wb3J0IHsgbm9vcCB9IGZyb20gJy4uL3V0aWxzL2NvbW1vbi11dGlscyc7XHJcblxyXG5leHBvcnQgY29uc3Qgb0F1dGhTdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xyXG5cclxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIEF1dGhGbG93U3RyYXRlZ3kge1xyXG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzSW50ZXJuYWxBdXRoOiBib29sZWFuO1xyXG5cclxuICBwcm90ZWN0ZWQgaHR0cEVycm9yUmVwb3J0ZXI6IEh0dHBFcnJvclJlcG9ydGVyU2VydmljZTtcclxuICBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50U2VydmljZTtcclxuICBwcm90ZWN0ZWQgY29uZmlnU3RhdGU6IENvbmZpZ1N0YXRlU2VydmljZTtcclxuICBwcm90ZWN0ZWQgb0F1dGhTZXJ2aWNlOiBPQXV0aFNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIG9BdXRoQ29uZmlnOiBBdXRoQ29uZmlnO1xyXG4gIHByb3RlY3RlZCBzZXNzaW9uU3RhdGU6IFNlc3Npb25TdGF0ZVNlcnZpY2U7XHJcbiAgcHJvdGVjdGVkIHRlbmFudEtleTogc3RyaW5nO1xyXG5cclxuICBhYnN0cmFjdCBjaGVja0lmSW50ZXJuYWxBdXRoKHF1ZXJ5UGFyYW1zPzogUGFyYW1zKTogYm9vbGVhbjtcclxuICBhYnN0cmFjdCBuYXZpZ2F0ZVRvTG9naW4ocXVlcnlQYXJhbXM/OiBQYXJhbXMpOiB2b2lkO1xyXG4gIGFic3RyYWN0IGxvZ291dChxdWVyeVBhcmFtcz86IFBhcmFtcyk6IE9ic2VydmFibGU8YW55PjtcclxuICBhYnN0cmFjdCBsb2dpbihwYXJhbXM/OiBMb2dpblBhcmFtcyB8IFBhcmFtcyk6IE9ic2VydmFibGU8YW55PjtcclxuXHJcbiAgcHJpdmF0ZSBjYXRjaEVycm9yID0gZXJyID0+IHtcclxuICAgIHRoaXMuaHR0cEVycm9yUmVwb3J0ZXIucmVwb3J0RXJyb3IoZXJyKTtcclxuICAgIHJldHVybiBvZihudWxsKTtcclxuICB9O1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm90ZWN0ZWQgaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyID0gaW5qZWN0b3IuZ2V0KEh0dHBFcnJvclJlcG9ydGVyU2VydmljZSk7XHJcbiAgICB0aGlzLmVudmlyb25tZW50ID0gaW5qZWN0b3IuZ2V0KEVudmlyb25tZW50U2VydmljZSk7XHJcbiAgICB0aGlzLmNvbmZpZ1N0YXRlID0gaW5qZWN0b3IuZ2V0KENvbmZpZ1N0YXRlU2VydmljZSk7XHJcbiAgICB0aGlzLm9BdXRoU2VydmljZSA9IGluamVjdG9yLmdldChPQXV0aFNlcnZpY2UpO1xyXG4gICAgdGhpcy5zZXNzaW9uU3RhdGUgPSBpbmplY3Rvci5nZXQoU2Vzc2lvblN0YXRlU2VydmljZSk7XHJcbiAgICB0aGlzLm9BdXRoQ29uZmlnID0gdGhpcy5lbnZpcm9ubWVudC5nZXRFbnZpcm9ubWVudCgpLm9BdXRoQ29uZmlnO1xyXG4gICAgdGhpcy50ZW5hbnRLZXkgPSBpbmplY3Rvci5nZXQoVEVOQU5UX0tFWSk7XHJcblxyXG4gICAgdGhpcy5saXN0ZW5Ub09hdXRoRXJyb3JzKCk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBpbml0KCk6IFByb21pc2U8YW55PiB7XHJcbiAgICBjb25zdCBzaG91bGRDbGVhciA9IHNob3VsZFN0b3JhZ2VDbGVhcihcclxuICAgICAgdGhpcy5lbnZpcm9ubWVudC5nZXRFbnZpcm9ubWVudCgpLm9BdXRoQ29uZmlnLmNsaWVudElkLFxyXG4gICAgICBvQXV0aFN0b3JhZ2UsXHJcbiAgICApO1xyXG4gICAgaWYgKHNob3VsZENsZWFyKSBjbGVhck9BdXRoU3RvcmFnZShvQXV0aFN0b3JhZ2UpO1xyXG5cclxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmNvbmZpZ3VyZSh0aGlzLm9BdXRoQ29uZmlnKTtcclxuXHJcbiAgICB0aGlzLm9BdXRoU2VydmljZS5ldmVudHNcclxuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnR5cGUgPT09ICd0b2tlbl9yZWZyZXNoX2Vycm9yJykpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4gdGhpcy5uYXZpZ2F0ZVRvTG9naW4oKSk7XHJcblxyXG4gICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlXHJcbiAgICAgIC5sb2FkRGlzY292ZXJ5RG9jdW1lbnQoKVxyXG4gICAgICAudGhlbigoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMub0F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKSB8fCAhdGhpcy5vQXV0aFNlcnZpY2UuZ2V0UmVmcmVzaFRva2VuKCkpIHtcclxuICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcclxuICAgICAgICB9XHJcblxyXG4gICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlbigpO1xyXG4gICAgICB9KVxyXG4gICAgICAuY2F0Y2godGhpcy5jYXRjaEVycm9yKTtcclxuICB9XHJcblxyXG4gIHByb3RlY3RlZCByZWZyZXNoVG9rZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5vQXV0aFNlcnZpY2UucmVmcmVzaFRva2VuKCkuY2F0Y2goKCkgPT4gY2xlYXJPQXV0aFN0b3JhZ2UoKSk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgbGlzdGVuVG9PYXV0aEVycm9ycygpIHtcclxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmV2ZW50c1xyXG4gICAgICAucGlwZShcclxuICAgICAgICBmaWx0ZXIoZXZlbnQgPT4gZXZlbnQgaW5zdGFuY2VvZiBPQXV0aEVycm9yRXZlbnQpLFxyXG4gICAgICAgIHRhcCgoKSA9PiBjbGVhck9BdXRoU3RvcmFnZSgpKSxcclxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKSksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgpO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIEF1dGhDb2RlRmxvd1N0cmF0ZWd5IGV4dGVuZHMgQXV0aEZsb3dTdHJhdGVneSB7XHJcbiAgcmVhZG9ubHkgaXNJbnRlcm5hbEF1dGggPSBmYWxzZTtcclxuXHJcbiAgYXN5bmMgaW5pdCgpIHtcclxuICAgIHJldHVybiBzdXBlclxyXG4gICAgICAuaW5pdCgpXHJcbiAgICAgIC50aGVuKCgpID0+IHRoaXMub0F1dGhTZXJ2aWNlLnRyeUxvZ2luKCkuY2F0Y2gobm9vcCkpXHJcbiAgICAgIC50aGVuKCgpID0+IHRoaXMub0F1dGhTZXJ2aWNlLnNldHVwQXV0b21hdGljU2lsZW50UmVmcmVzaCh7fSwgJ2FjY2Vzc190b2tlbicpKTtcclxuICB9XHJcblxyXG4gIG5hdmlnYXRlVG9Mb2dpbihxdWVyeVBhcmFtcz86IFBhcmFtcykge1xyXG4gICAgdGhpcy5vQXV0aFNlcnZpY2UuaW5pdENvZGVGbG93KCcnLCB0aGlzLmdldEN1bHR1cmVQYXJhbXMocXVlcnlQYXJhbXMpKTtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZJbnRlcm5hbEF1dGgocXVlcnlQYXJhbXM/OiBQYXJhbXMpIHtcclxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmluaXRDb2RlRmxvdygnJywgdGhpcy5nZXRDdWx0dXJlUGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XHJcbiAgICByZXR1cm4gZmFsc2U7XHJcbiAgfVxyXG5cclxuICBsb2dvdXQocXVlcnlQYXJhbXM/OiBQYXJhbXMpIHtcclxuICAgIHJldHVybiBmcm9tKHRoaXMub0F1dGhTZXJ2aWNlLnJldm9rZVRva2VuQW5kTG9nb3V0KHRoaXMuZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcykpKTtcclxuICB9XHJcblxyXG4gIGxvZ2luKHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XHJcbiAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0Q29kZUZsb3coJycsIHRoaXMuZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcykpO1xyXG4gICAgcmV0dXJuIG9mKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBnZXRDdWx0dXJlUGFyYW1zKHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XHJcbiAgICBjb25zdCBsYW5nID0gdGhpcy5zZXNzaW9uU3RhdGUuZ2V0TGFuZ3VhZ2UoKTtcclxuICAgIGNvbnN0IGN1bHR1cmUgPSB7IGN1bHR1cmU6IGxhbmcsICd1aS1jdWx0dXJlJzogbGFuZyB9O1xyXG4gICAgcmV0dXJuIHsgLi4uKGxhbmcgJiYgY3VsdHVyZSksIC4uLnF1ZXJ5UGFyYW1zIH07XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY2xhc3MgQXV0aFBhc3N3b3JkRmxvd1N0cmF0ZWd5IGV4dGVuZHMgQXV0aEZsb3dTdHJhdGVneSB7XHJcbiAgcmVhZG9ubHkgaXNJbnRlcm5hbEF1dGggPSB0cnVlO1xyXG4gIHByaXZhdGUgY29va2llS2V5ID0gJ3JlbWVtYmVyTWUnO1xyXG4gIHByaXZhdGUgc3RvcmFnZUtleSA9ICdwYXNzd29yZEZsb3cnO1xyXG5cclxuICBwcml2YXRlIGxpc3RlblRvVG9rZW5FeHBpcmF0aW9uKCkge1xyXG4gICAgdGhpcy5vQXV0aFNlcnZpY2UuZXZlbnRzXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICAgIGZpbHRlcihcclxuICAgICAgICAgIGV2ZW50ID0+XHJcbiAgICAgICAgICAgIGV2ZW50IGluc3RhbmNlb2YgT0F1dGhJbmZvRXZlbnQgJiZcclxuICAgICAgICAgICAgZXZlbnQudHlwZSA9PT0gJ3Rva2VuX2V4cGlyZXMnICYmXHJcbiAgICAgICAgICAgIGV2ZW50LmluZm8gPT09ICdhY2Nlc3NfdG9rZW4nLFxyXG4gICAgICAgICksXHJcbiAgICAgIClcclxuICAgICAgLnN1YnNjcmliZSgoKSA9PiB7XHJcbiAgICAgICAgaWYgKHRoaXMub0F1dGhTZXJ2aWNlLmdldFJlZnJlc2hUb2tlbigpKSB7XHJcbiAgICAgICAgICB0aGlzLnJlZnJlc2hUb2tlbigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLm9BdXRoU2VydmljZS5sb2dPdXQoKTtcclxuICAgICAgICAgIHJlbW92ZVJlbWVtYmVyTWUoKTtcclxuICAgICAgICAgIHRoaXMuY29uZmlnU3RhdGUucmVmcmVzaEFwcFN0YXRlKCkuc3Vic2NyaWJlKCk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICB9XHJcblxyXG4gIGFzeW5jIGluaXQoKSB7XHJcbiAgICBpZiAoIWdldENvb2tpZVZhbHVlQnlOYW1lKHRoaXMuY29va2llS2V5KSAmJiBsb2NhbFN0b3JhZ2UuZ2V0SXRlbSh0aGlzLnN0b3JhZ2VLZXkpKSB7XHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmxvZ091dCgpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBzdXBlci5pbml0KCkudGhlbigoKSA9PiB0aGlzLmxpc3RlblRvVG9rZW5FeHBpcmF0aW9uKCkpO1xyXG4gIH1cclxuXHJcbiAgbmF2aWdhdGVUb0xvZ2luKHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XHJcbiAgICBjb25zdCByb3V0ZXIgPSB0aGlzLmluamVjdG9yLmdldChSb3V0ZXIpO1xyXG4gICAgcm91dGVyLm5hdmlnYXRlKFsnL2FjY291bnQvbG9naW4nXSwgeyBxdWVyeVBhcmFtcyB9KTtcclxuICB9XHJcblxyXG4gIGNoZWNrSWZJbnRlcm5hbEF1dGgoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIGxvZ2luKHBhcmFtczogTG9naW5QYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgdGVuYW50ID0gdGhpcy5zZXNzaW9uU3RhdGUuZ2V0VGVuYW50KCk7XHJcblxyXG4gICAgcmV0dXJuIGZyb20oXHJcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmZldGNoVG9rZW5Vc2luZ1Bhc3N3b3JkRmxvdyhcclxuICAgICAgICBwYXJhbXMudXNlcm5hbWUsXHJcbiAgICAgICAgcGFyYW1zLnBhc3N3b3JkLFxyXG4gICAgICAgIG5ldyBIdHRwSGVhZGVycyh7IC4uLih0ZW5hbnQgJiYgdGVuYW50LmlkICYmIHsgW3RoaXMudGVuYW50S2V5XTogdGVuYW50LmlkIH0pIH0pLFxyXG4gICAgICApLFxyXG4gICAgKS5waXBlKHRoaXMucGlwZVRvTG9naW4ocGFyYW1zKSk7XHJcbiAgfVxyXG5cclxuICBwaXBlVG9Mb2dpbihwYXJhbXM6IFBpY2s8TG9naW5QYXJhbXMsICdyZWRpcmVjdFVybCcgfCAncmVtZW1iZXJNZSc+KSB7XHJcbiAgICBjb25zdCByb3V0ZXIgPSB0aGlzLmluamVjdG9yLmdldChSb3V0ZXIpO1xyXG5cclxuICAgIHJldHVybiBwaXBlKFxyXG4gICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKSksXHJcbiAgICAgIHRhcCgoKSA9PiB7XHJcbiAgICAgICAgc2V0UmVtZW1iZXJNZShwYXJhbXMucmVtZW1iZXJNZSk7XHJcbiAgICAgICAgaWYgKHBhcmFtcy5yZWRpcmVjdFVybCkgcm91dGVyLm5hdmlnYXRlKFtwYXJhbXMucmVkaXJlY3RVcmxdKTtcclxuICAgICAgfSksXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbG9nb3V0KHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XHJcbiAgICBjb25zdCByb3V0ZXIgPSB0aGlzLmluamVjdG9yLmdldChSb3V0ZXIpO1xyXG5cclxuICAgIHJldHVybiBmcm9tKHRoaXMub0F1dGhTZXJ2aWNlLnJldm9rZVRva2VuQW5kTG9nb3V0KHF1ZXJ5UGFyYW1zKSkucGlwZShcclxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlnU3RhdGUucmVmcmVzaEFwcFN0YXRlKCkpLFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJyk7XHJcbiAgICAgICAgcmVtb3ZlUmVtZW1iZXJNZSgpO1xyXG4gICAgICB9KSxcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwcm90ZWN0ZWQgcmVmcmVzaFRva2VuKCkge1xyXG4gICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IHtcclxuICAgICAgY2xlYXJPQXV0aFN0b3JhZ2UoKTtcclxuICAgICAgcmVtb3ZlUmVtZW1iZXJNZSgpO1xyXG4gICAgfSk7XHJcbiAgfVxyXG59XHJcblxyXG5leHBvcnQgY29uc3QgQVVUSF9GTE9XX1NUUkFURUdZID0ge1xyXG4gIENvZGUoaW5qZWN0b3I6IEluamVjdG9yKSB7XHJcbiAgICByZXR1cm4gbmV3IEF1dGhDb2RlRmxvd1N0cmF0ZWd5KGluamVjdG9yKTtcclxuICB9LFxyXG4gIFBhc3N3b3JkKGluamVjdG9yOiBJbmplY3Rvcikge1xyXG4gICAgcmV0dXJuIG5ldyBBdXRoUGFzc3dvcmRGbG93U3RyYXRlZ3koaW5qZWN0b3IpO1xyXG4gIH0sXHJcbn07XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY2xlYXJPQXV0aFN0b3JhZ2Uoc3RvcmFnZTogT0F1dGhTdG9yYWdlID0gb0F1dGhTdG9yYWdlKSB7XHJcbiAgY29uc3Qga2V5cyA9IFtcclxuICAgICdhY2Nlc3NfdG9rZW4nLFxyXG4gICAgJ2lkX3Rva2VuJyxcclxuICAgICdyZWZyZXNoX3Rva2VuJyxcclxuICAgICdub25jZScsXHJcbiAgICAnUEtDRV92ZXJpZmllcicsXHJcbiAgICAnZXhwaXJlc19hdCcsXHJcbiAgICAnaWRfdG9rZW5fY2xhaW1zX29iaicsXHJcbiAgICAnaWRfdG9rZW5fZXhwaXJlc19hdCcsXHJcbiAgICAnaWRfdG9rZW5fc3RvcmVkX2F0JyxcclxuICAgICdhY2Nlc3NfdG9rZW5fc3RvcmVkX2F0JyxcclxuICAgICdncmFudGVkX3Njb3BlcycsXHJcbiAgICAnc2Vzc2lvbl9zdGF0ZScsXHJcbiAgXTtcclxuXHJcbiAga2V5cy5mb3JFYWNoKGtleSA9PiBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KSk7XHJcbn1cclxuXHJcbmZ1bmN0aW9uIHNob3VsZFN0b3JhZ2VDbGVhcihjbGllbnRJZDogc3RyaW5nLCBzdG9yYWdlOiBPQXV0aFN0b3JhZ2UpOiBib29sZWFuIHtcclxuICBjb25zdCBrZXkgPSAnYWJwT0F1dGhDbGllbnRJZCc7XHJcbiAgaWYgKCFzdG9yYWdlLmdldEl0ZW0oa2V5KSkge1xyXG4gICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgY2xpZW50SWQpO1xyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgY29uc3Qgc2hvdWxkQ2xlYXIgPSBzdG9yYWdlLmdldEl0ZW0oa2V5KSAhPT0gY2xpZW50SWQ7XHJcbiAgaWYgKHNob3VsZENsZWFyKSBzdG9yYWdlLnNldEl0ZW0oa2V5LCBjbGllbnRJZCk7XHJcbiAgcmV0dXJuIHNob3VsZENsZWFyO1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZXRDb29raWVWYWx1ZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcclxuICBjb25zdCBtYXRjaCA9IGRvY3VtZW50LmNvb2tpZS5tYXRjaChuZXcgUmVnRXhwKCcoXnwgKScgKyBuYW1lICsgJz0oW147XSspJykpO1xyXG4gIHJldHVybiBtYXRjaCA/IG1hdGNoWzJdIDogJyc7XHJcbn1cclxuIl19
|
|
1
|
+
import { __awaiter } from "tslib";
|
|
2
|
+
import { HttpHeaders } from '@angular/common/http';
|
|
3
|
+
import { Router } from '@angular/router';
|
|
4
|
+
import { OAuthErrorEvent, OAuthInfoEvent, OAuthService } from 'angular-oauth2-oidc';
|
|
5
|
+
import { from, of, pipe } from 'rxjs';
|
|
6
|
+
import { filter, switchMap, tap } from 'rxjs/operators';
|
|
7
|
+
import { ConfigStateService } from '../services/config-state.service';
|
|
8
|
+
import { EnvironmentService } from '../services/environment.service';
|
|
9
|
+
import { HttpErrorReporterService } from '../services/http-error-reporter.service';
|
|
10
|
+
import { SessionStateService } from '../services/session-state.service';
|
|
11
|
+
import { TENANT_KEY } from '../tokens/tenant-key.token';
|
|
12
|
+
import { removeRememberMe, setRememberMe } from '../utils/auth-utils';
|
|
13
|
+
import { noop } from '../utils/common-utils';
|
|
14
|
+
export const oAuthStorage = localStorage;
|
|
15
|
+
export class AuthFlowStrategy {
|
|
16
|
+
constructor(injector) {
|
|
17
|
+
this.injector = injector;
|
|
18
|
+
this.catchError = err => {
|
|
19
|
+
this.httpErrorReporter.reportError(err);
|
|
20
|
+
return of(null);
|
|
21
|
+
};
|
|
22
|
+
this.httpErrorReporter = injector.get(HttpErrorReporterService);
|
|
23
|
+
this.environment = injector.get(EnvironmentService);
|
|
24
|
+
this.configState = injector.get(ConfigStateService);
|
|
25
|
+
this.oAuthService = injector.get(OAuthService);
|
|
26
|
+
this.sessionState = injector.get(SessionStateService);
|
|
27
|
+
this.oAuthConfig = this.environment.getEnvironment().oAuthConfig;
|
|
28
|
+
this.tenantKey = injector.get(TENANT_KEY);
|
|
29
|
+
this.listenToOauthErrors();
|
|
30
|
+
}
|
|
31
|
+
init() {
|
|
32
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
33
|
+
const shouldClear = shouldStorageClear(this.environment.getEnvironment().oAuthConfig.clientId, oAuthStorage);
|
|
34
|
+
if (shouldClear)
|
|
35
|
+
clearOAuthStorage(oAuthStorage);
|
|
36
|
+
this.oAuthService.configure(this.oAuthConfig);
|
|
37
|
+
this.oAuthService.events
|
|
38
|
+
.pipe(filter(event => event.type === 'token_refresh_error'))
|
|
39
|
+
.subscribe(() => this.navigateToLogin());
|
|
40
|
+
return this.oAuthService
|
|
41
|
+
.loadDiscoveryDocument()
|
|
42
|
+
.then(() => {
|
|
43
|
+
if (this.oAuthService.hasValidAccessToken() || !this.oAuthService.getRefreshToken()) {
|
|
44
|
+
return Promise.resolve();
|
|
45
|
+
}
|
|
46
|
+
return this.refreshToken();
|
|
47
|
+
})
|
|
48
|
+
.catch(this.catchError);
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
refreshToken() {
|
|
52
|
+
return this.oAuthService.refreshToken().catch(() => clearOAuthStorage());
|
|
53
|
+
}
|
|
54
|
+
listenToOauthErrors() {
|
|
55
|
+
this.oAuthService.events
|
|
56
|
+
.pipe(filter(event => event instanceof OAuthErrorEvent), tap(() => clearOAuthStorage()), switchMap(() => this.configState.refreshAppState()))
|
|
57
|
+
.subscribe();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
export class AuthCodeFlowStrategy extends AuthFlowStrategy {
|
|
61
|
+
constructor() {
|
|
62
|
+
super(...arguments);
|
|
63
|
+
this.isInternalAuth = false;
|
|
64
|
+
}
|
|
65
|
+
init() {
|
|
66
|
+
const _super = Object.create(null, {
|
|
67
|
+
init: { get: () => super.init }
|
|
68
|
+
});
|
|
69
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
70
|
+
return _super.init.call(this)
|
|
71
|
+
.then(() => this.oAuthService.tryLogin().catch(noop))
|
|
72
|
+
.then(() => this.oAuthService.setupAutomaticSilentRefresh({}, 'access_token'));
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
navigateToLogin(queryParams) {
|
|
76
|
+
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
77
|
+
}
|
|
78
|
+
checkIfInternalAuth(queryParams) {
|
|
79
|
+
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
logout(queryParams) {
|
|
83
|
+
return from(this.oAuthService.revokeTokenAndLogout(this.getCultureParams(queryParams)));
|
|
84
|
+
}
|
|
85
|
+
login(queryParams) {
|
|
86
|
+
this.oAuthService.initCodeFlow('', this.getCultureParams(queryParams));
|
|
87
|
+
return of(null);
|
|
88
|
+
}
|
|
89
|
+
getCultureParams(queryParams) {
|
|
90
|
+
const lang = this.sessionState.getLanguage();
|
|
91
|
+
const culture = { culture: lang, 'ui-culture': lang };
|
|
92
|
+
return Object.assign(Object.assign({}, (lang && culture)), queryParams);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export class AuthPasswordFlowStrategy extends AuthFlowStrategy {
|
|
96
|
+
constructor() {
|
|
97
|
+
super(...arguments);
|
|
98
|
+
this.isInternalAuth = true;
|
|
99
|
+
this.cookieKey = 'rememberMe';
|
|
100
|
+
this.storageKey = 'passwordFlow';
|
|
101
|
+
}
|
|
102
|
+
listenToTokenExpiration() {
|
|
103
|
+
this.oAuthService.events
|
|
104
|
+
.pipe(filter(event => event instanceof OAuthInfoEvent &&
|
|
105
|
+
event.type === 'token_expires' &&
|
|
106
|
+
event.info === 'access_token'))
|
|
107
|
+
.subscribe(() => {
|
|
108
|
+
if (this.oAuthService.getRefreshToken()) {
|
|
109
|
+
this.refreshToken();
|
|
110
|
+
}
|
|
111
|
+
else {
|
|
112
|
+
this.oAuthService.logOut();
|
|
113
|
+
removeRememberMe();
|
|
114
|
+
this.configState.refreshAppState().subscribe();
|
|
115
|
+
}
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
init() {
|
|
119
|
+
const _super = Object.create(null, {
|
|
120
|
+
init: { get: () => super.init }
|
|
121
|
+
});
|
|
122
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
123
|
+
if (!getCookieValueByName(this.cookieKey) && localStorage.getItem(this.storageKey)) {
|
|
124
|
+
this.oAuthService.logOut();
|
|
125
|
+
}
|
|
126
|
+
return _super.init.call(this).then(() => this.listenToTokenExpiration());
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
navigateToLogin(queryParams) {
|
|
130
|
+
const router = this.injector.get(Router);
|
|
131
|
+
router.navigate(['/account/login'], { queryParams });
|
|
132
|
+
}
|
|
133
|
+
checkIfInternalAuth() {
|
|
134
|
+
return true;
|
|
135
|
+
}
|
|
136
|
+
login(params) {
|
|
137
|
+
const tenant = this.sessionState.getTenant();
|
|
138
|
+
return from(this.oAuthService.fetchTokenUsingPasswordFlow(params.username, params.password, new HttpHeaders(Object.assign({}, (tenant && tenant.id && { [this.tenantKey]: tenant.id }))))).pipe(this.pipeToLogin(params));
|
|
139
|
+
}
|
|
140
|
+
pipeToLogin(params) {
|
|
141
|
+
const router = this.injector.get(Router);
|
|
142
|
+
return pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
143
|
+
setRememberMe(params.rememberMe);
|
|
144
|
+
if (params.redirectUrl)
|
|
145
|
+
router.navigate([params.redirectUrl]);
|
|
146
|
+
}));
|
|
147
|
+
}
|
|
148
|
+
logout(queryParams) {
|
|
149
|
+
const router = this.injector.get(Router);
|
|
150
|
+
return from(this.oAuthService.revokeTokenAndLogout(queryParams)).pipe(switchMap(() => this.configState.refreshAppState()), tap(() => {
|
|
151
|
+
router.navigateByUrl('/');
|
|
152
|
+
removeRememberMe();
|
|
153
|
+
}));
|
|
154
|
+
}
|
|
155
|
+
refreshToken() {
|
|
156
|
+
return this.oAuthService.refreshToken().catch(() => {
|
|
157
|
+
clearOAuthStorage();
|
|
158
|
+
removeRememberMe();
|
|
159
|
+
});
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
export const AUTH_FLOW_STRATEGY = {
|
|
163
|
+
Code(injector) {
|
|
164
|
+
return new AuthCodeFlowStrategy(injector);
|
|
165
|
+
},
|
|
166
|
+
Password(injector) {
|
|
167
|
+
return new AuthPasswordFlowStrategy(injector);
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
export function clearOAuthStorage(storage = oAuthStorage) {
|
|
171
|
+
const keys = [
|
|
172
|
+
'access_token',
|
|
173
|
+
'id_token',
|
|
174
|
+
'refresh_token',
|
|
175
|
+
'nonce',
|
|
176
|
+
'PKCE_verifier',
|
|
177
|
+
'expires_at',
|
|
178
|
+
'id_token_claims_obj',
|
|
179
|
+
'id_token_expires_at',
|
|
180
|
+
'id_token_stored_at',
|
|
181
|
+
'access_token_stored_at',
|
|
182
|
+
'granted_scopes',
|
|
183
|
+
'session_state',
|
|
184
|
+
];
|
|
185
|
+
keys.forEach(key => storage.removeItem(key));
|
|
186
|
+
}
|
|
187
|
+
function shouldStorageClear(clientId, storage) {
|
|
188
|
+
const key = 'abpOAuthClientId';
|
|
189
|
+
if (!storage.getItem(key)) {
|
|
190
|
+
storage.setItem(key, clientId);
|
|
191
|
+
return false;
|
|
192
|
+
}
|
|
193
|
+
const shouldClear = storage.getItem(key) !== clientId;
|
|
194
|
+
if (shouldClear)
|
|
195
|
+
storage.setItem(key, clientId);
|
|
196
|
+
return shouldClear;
|
|
197
|
+
}
|
|
198
|
+
function getCookieValueByName(name) {
|
|
199
|
+
const match = document.cookie.match(new RegExp('(^| )' + name + '=([^;]+)'));
|
|
200
|
+
return match ? match[2] : '';
|
|
201
|
+
}
|
|
202
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC1mbG93LnN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL3N0cmF0ZWdpZXMvYXV0aC1mbG93LnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFFbkQsT0FBTyxFQUFVLE1BQU0sRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQ2pELE9BQU8sRUFFTCxlQUFlLEVBQ2YsY0FBYyxFQUNkLFlBQVksRUFFYixNQUFNLHFCQUFxQixDQUFDO0FBQzdCLE9BQU8sRUFBRSxJQUFJLEVBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNsRCxPQUFPLEVBQUUsTUFBTSxFQUFFLFNBQVMsRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUV4RCxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxrQ0FBa0MsQ0FBQztBQUN0RSxPQUFPLEVBQUUsa0JBQWtCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSx5Q0FBeUMsQ0FBQztBQUNuRixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUN4RSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGFBQWEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQ3RFLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSx1QkFBdUIsQ0FBQztBQUU3QyxNQUFNLENBQUMsTUFBTSxZQUFZLEdBQUcsWUFBWSxDQUFDO0FBRXpDLE1BQU0sT0FBZ0IsZ0JBQWdCO0lBcUJwQyxZQUFzQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBTGhDLGVBQVUsR0FBRyxHQUFHLENBQUMsRUFBRTtZQUN6QixJQUFJLENBQUMsaUJBQWlCLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQ3hDLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ2xCLENBQUMsQ0FBQztRQUdBLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLHdCQUF3QixDQUFDLENBQUM7UUFDaEUsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFdBQVcsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLGtCQUFrQixDQUFDLENBQUM7UUFDcEQsSUFBSSxDQUFDLFlBQVksR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBQy9DLElBQUksQ0FBQyxZQUFZLEdBQUcsUUFBUSxDQUFDLEdBQUcsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxjQUFjLEVBQUUsQ0FBQyxXQUFXLENBQUM7UUFDakUsSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBRTFDLElBQUksQ0FBQyxtQkFBbUIsRUFBRSxDQUFDO0lBQzdCLENBQUM7SUFFSyxJQUFJOztZQUNSLE1BQU0sV0FBVyxHQUFHLGtCQUFrQixDQUNwQyxJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWMsRUFBRSxDQUFDLFdBQVcsQ0FBQyxRQUFRLEVBQ3RELFlBQVksQ0FDYixDQUFDO1lBQ0YsSUFBSSxXQUFXO2dCQUFFLGlCQUFpQixDQUFDLFlBQVksQ0FBQyxDQUFDO1lBRWpELElBQUksQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztZQUU5QyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU07aUJBQ3JCLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLHFCQUFxQixDQUFDLENBQUM7aUJBQzNELFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsZUFBZSxFQUFFLENBQUMsQ0FBQztZQUUzQyxPQUFPLElBQUksQ0FBQyxZQUFZO2lCQUNyQixxQkFBcUIsRUFBRTtpQkFDdkIsSUFBSSxDQUFDLEdBQUcsRUFBRTtnQkFDVCxJQUFJLElBQUksQ0FBQyxZQUFZLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsZUFBZSxFQUFFLEVBQUU7b0JBQ25GLE9BQU8sT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDO2lCQUMxQjtnQkFFRCxPQUFPLElBQUksQ0FBQyxZQUFZLEVBQUUsQ0FBQztZQUM3QixDQUFDLENBQUM7aUJBQ0QsS0FBSyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztRQUM1QixDQUFDO0tBQUE7SUFFUyxZQUFZO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLENBQUMsaUJBQWlCLEVBQUUsQ0FBQyxDQUFDO0lBQzNFLENBQUM7SUFFUyxtQkFBbUI7UUFDM0IsSUFBSSxDQUFDLFlBQVksQ0FBQyxNQUFNO2FBQ3JCLElBQUksQ0FDSCxNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLFlBQVksZUFBZSxDQUFDLEVBQ2pELEdBQUcsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLEVBQzlCLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLENBQ3BEO2FBQ0EsU0FBUyxFQUFFLENBQUM7SUFDakIsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLG9CQUFxQixTQUFRLGdCQUFnQjtJQUExRDs7UUFDVyxtQkFBYyxHQUFHLEtBQUssQ0FBQztJQWdDbEMsQ0FBQztJQTlCTyxJQUFJOzs7OztZQUNSLE9BQU8sT0FDSixJQUFJO2lCQUNKLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFFBQVEsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQztpQkFDcEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsMkJBQTJCLENBQUMsRUFBRSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUM7UUFDbkYsQ0FBQztLQUFBO0lBRUQsZUFBZSxDQUFDLFdBQW9CO1FBQ2xDLElBQUksQ0FBQyxZQUFZLENBQUMsWUFBWSxDQUFDLEVBQUUsRUFBRSxJQUFJLENBQUMsZ0JBQWdCLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUN6RSxDQUFDO0lBRUQsbUJBQW1CLENBQUMsV0FBb0I7UUFDdEMsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ3ZFLE9BQU8sS0FBSyxDQUFDO0lBQ2YsQ0FBQztJQUVELE1BQU0sQ0FBQyxXQUFvQjtRQUN6QixPQUFPLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUYsQ0FBQztJQUVELEtBQUssQ0FBQyxXQUFvQjtRQUN4QixJQUFJLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7UUFDdkUsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDbEIsQ0FBQztJQUVPLGdCQUFnQixDQUFDLFdBQW9CO1FBQzNDLE1BQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDN0MsTUFBTSxPQUFPLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxJQUFJLEVBQUUsQ0FBQztRQUN0RCx1Q0FBWSxDQUFDLElBQUksSUFBSSxPQUFPLENBQUMsR0FBSyxXQUFXLEVBQUc7SUFDbEQsQ0FBQztDQUNGO0FBRUQsTUFBTSxPQUFPLHdCQUF5QixTQUFRLGdCQUFnQjtJQUE5RDs7UUFDVyxtQkFBYyxHQUFHLElBQUksQ0FBQztRQUN2QixjQUFTLEdBQUcsWUFBWSxDQUFDO1FBQ3pCLGVBQVUsR0FBRyxjQUFjLENBQUM7SUFrRnRDLENBQUM7SUFoRlMsdUJBQXVCO1FBQzdCLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTTthQUNyQixJQUFJLENBQ0gsTUFBTSxDQUNKLEtBQUssQ0FBQyxFQUFFLENBQ04sS0FBSyxZQUFZLGNBQWM7WUFDL0IsS0FBSyxDQUFDLElBQUksS0FBSyxlQUFlO1lBQzlCLEtBQUssQ0FBQyxJQUFJLEtBQUssY0FBYyxDQUNoQyxDQUNGO2FBQ0EsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxlQUFlLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxDQUFDLFlBQVksRUFBRSxDQUFDO2FBQ3JCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQzNCLGdCQUFnQixFQUFFLENBQUM7Z0JBQ25CLElBQUksQ0FBQyxXQUFXLENBQUMsZUFBZSxFQUFFLENBQUMsU0FBUyxFQUFFLENBQUM7YUFDaEQ7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFSyxJQUFJOzs7OztZQUNSLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksWUFBWSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEVBQUU7Z0JBQ2xGLElBQUksQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLENBQUM7YUFDNUI7WUFFRCxPQUFPLE9BQU0sSUFBSSxZQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsdUJBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBQ2pFLENBQUM7S0FBQTtJQUVELGVBQWUsQ0FBQyxXQUFvQjtRQUNsQyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN6QyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxFQUFFLFdBQVcsRUFBRSxDQUFDLENBQUM7SUFDdkQsQ0FBQztJQUVELG1CQUFtQjtRQUNqQixPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxLQUFLLENBQUMsTUFBbUI7UUFDdkIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFlBQVksQ0FBQyxTQUFTLEVBQUUsQ0FBQztRQUU3QyxPQUFPLElBQUksQ0FDVCxJQUFJLENBQUMsWUFBWSxDQUFDLDJCQUEyQixDQUMzQyxNQUFNLENBQUMsUUFBUSxFQUNmLE1BQU0sQ0FBQyxRQUFRLEVBQ2YsSUFBSSxXQUFXLG1CQUFNLENBQUMsTUFBTSxJQUFJLE1BQU0sQ0FBQyxFQUFFLElBQUksRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRyxDQUNqRixDQUNGLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztJQUNuQyxDQUFDO0lBRUQsV0FBVyxDQUFDLE1BQXVEO1FBQ2pFLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLE9BQU8sSUFBSSxDQUNULFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQ25ELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxhQUFhLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2pDLElBQUksTUFBTSxDQUFDLFdBQVc7Z0JBQUUsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO1FBQ2hFLENBQUMsQ0FBQyxDQUNILENBQUM7SUFDSixDQUFDO0lBRUQsTUFBTSxDQUFDLFdBQW9CO1FBQ3pCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBRXpDLE9BQU8sSUFBSSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsb0JBQW9CLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQ25FLFNBQVMsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLGVBQWUsRUFBRSxDQUFDLEVBQ25ELEdBQUcsQ0FBQyxHQUFHLEVBQUU7WUFDUCxNQUFNLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1lBQzFCLGdCQUFnQixFQUFFLENBQUM7UUFDckIsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFUyxZQUFZO1FBQ3BCLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFO1lBQ2pELGlCQUFpQixFQUFFLENBQUM7WUFDcEIsZ0JBQWdCLEVBQUUsQ0FBQztRQUNyQixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLElBQUksQ0FBQyxRQUFrQjtRQUNyQixPQUFPLElBQUksb0JBQW9CLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUNELFFBQVEsQ0FBQyxRQUFrQjtRQUN6QixPQUFPLElBQUksd0JBQXdCLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsQ0FBQztDQUNGLENBQUM7QUFFRixNQUFNLFVBQVUsaUJBQWlCLENBQUMsVUFBd0IsWUFBWTtJQUNwRSxNQUFNLElBQUksR0FBRztRQUNYLGNBQWM7UUFDZCxVQUFVO1FBQ1YsZUFBZTtRQUNmLE9BQU87UUFDUCxlQUFlO1FBQ2YsWUFBWTtRQUNaLHFCQUFxQjtRQUNyQixxQkFBcUI7UUFDckIsb0JBQW9CO1FBQ3BCLHdCQUF3QjtRQUN4QixnQkFBZ0I7UUFDaEIsZUFBZTtLQUNoQixDQUFDO0lBRUYsSUFBSSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUMvQyxDQUFDO0FBRUQsU0FBUyxrQkFBa0IsQ0FBQyxRQUFnQixFQUFFLE9BQXFCO0lBQ2pFLE1BQU0sR0FBRyxHQUFHLGtCQUFrQixDQUFDO0lBQy9CLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFO1FBQ3pCLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQy9CLE9BQU8sS0FBSyxDQUFDO0tBQ2Q7SUFFRCxNQUFNLFdBQVcsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxLQUFLLFFBQVEsQ0FBQztJQUN0RCxJQUFJLFdBQVc7UUFBRSxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsQ0FBQztJQUNoRCxPQUFPLFdBQVcsQ0FBQztBQUNyQixDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxJQUFZO0lBQ3hDLE1BQU0sS0FBSyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sR0FBRyxJQUFJLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RSxPQUFPLEtBQUssQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDL0IsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBIZWFkZXJzIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHsgSW5qZWN0b3IgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IFBhcmFtcywgUm91dGVyIH0gZnJvbSAnQGFuZ3VsYXIvcm91dGVyJztcbmltcG9ydCB7XG4gIEF1dGhDb25maWcsXG4gIE9BdXRoRXJyb3JFdmVudCxcbiAgT0F1dGhJbmZvRXZlbnQsXG4gIE9BdXRoU2VydmljZSxcbiAgT0F1dGhTdG9yYWdlXG59IGZyb20gJ2FuZ3VsYXItb2F1dGgyLW9pZGMnO1xuaW1wb3J0IHsgZnJvbSwgT2JzZXJ2YWJsZSwgb2YsIHBpcGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGZpbHRlciwgc3dpdGNoTWFwLCB0YXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBMb2dpblBhcmFtcyB9IGZyb20gJy4uL21vZGVscy9hdXRoJztcbmltcG9ydCB7IENvbmZpZ1N0YXRlU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NvbmZpZy1zdGF0ZS5zZXJ2aWNlJztcbmltcG9ydCB7IEVudmlyb25tZW50U2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2Vudmlyb25tZW50LnNlcnZpY2UnO1xuaW1wb3J0IHsgSHR0cEVycm9yUmVwb3J0ZXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvaHR0cC1lcnJvci1yZXBvcnRlci5zZXJ2aWNlJztcbmltcG9ydCB7IFNlc3Npb25TdGF0ZVNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9zZXNzaW9uLXN0YXRlLnNlcnZpY2UnO1xuaW1wb3J0IHsgVEVOQU5UX0tFWSB9IGZyb20gJy4uL3Rva2Vucy90ZW5hbnQta2V5LnRva2VuJztcbmltcG9ydCB7IHJlbW92ZVJlbWVtYmVyTWUsIHNldFJlbWVtYmVyTWUgfSBmcm9tICcuLi91dGlscy9hdXRoLXV0aWxzJztcbmltcG9ydCB7IG5vb3AgfSBmcm9tICcuLi91dGlscy9jb21tb24tdXRpbHMnO1xuXG5leHBvcnQgY29uc3Qgb0F1dGhTdG9yYWdlID0gbG9jYWxTdG9yYWdlO1xuXG5leHBvcnQgYWJzdHJhY3QgY2xhc3MgQXV0aEZsb3dTdHJhdGVneSB7XG4gIGFic3RyYWN0IHJlYWRvbmx5IGlzSW50ZXJuYWxBdXRoOiBib29sZWFuO1xuXG4gIHByb3RlY3RlZCBodHRwRXJyb3JSZXBvcnRlcjogSHR0cEVycm9yUmVwb3J0ZXJTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgZW52aXJvbm1lbnQ6IEVudmlyb25tZW50U2VydmljZTtcbiAgcHJvdGVjdGVkIGNvbmZpZ1N0YXRlOiBDb25maWdTdGF0ZVNlcnZpY2U7XG4gIHByb3RlY3RlZCBvQXV0aFNlcnZpY2U6IE9BdXRoU2VydmljZTtcbiAgcHJvdGVjdGVkIG9BdXRoQ29uZmlnOiBBdXRoQ29uZmlnO1xuICBwcm90ZWN0ZWQgc2Vzc2lvblN0YXRlOiBTZXNzaW9uU3RhdGVTZXJ2aWNlO1xuICBwcm90ZWN0ZWQgdGVuYW50S2V5OiBzdHJpbmc7XG5cbiAgYWJzdHJhY3QgY2hlY2tJZkludGVybmFsQXV0aChxdWVyeVBhcmFtcz86IFBhcmFtcyk6IGJvb2xlYW47XG4gIGFic3RyYWN0IG5hdmlnYXRlVG9Mb2dpbihxdWVyeVBhcmFtcz86IFBhcmFtcyk6IHZvaWQ7XG4gIGFic3RyYWN0IGxvZ291dChxdWVyeVBhcmFtcz86IFBhcmFtcyk6IE9ic2VydmFibGU8YW55PjtcbiAgYWJzdHJhY3QgbG9naW4ocGFyYW1zPzogTG9naW5QYXJhbXMgfCBQYXJhbXMpOiBPYnNlcnZhYmxlPGFueT47XG5cbiAgcHJpdmF0ZSBjYXRjaEVycm9yID0gZXJyID0+IHtcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyLnJlcG9ydEVycm9yKGVycik7XG4gICAgcmV0dXJuIG9mKG51bGwpO1xuICB9O1xuXG4gIGNvbnN0cnVjdG9yKHByb3RlY3RlZCBpbmplY3RvcjogSW5qZWN0b3IpIHtcbiAgICB0aGlzLmh0dHBFcnJvclJlcG9ydGVyID0gaW5qZWN0b3IuZ2V0KEh0dHBFcnJvclJlcG9ydGVyU2VydmljZSk7XG4gICAgdGhpcy5lbnZpcm9ubWVudCA9IGluamVjdG9yLmdldChFbnZpcm9ubWVudFNlcnZpY2UpO1xuICAgIHRoaXMuY29uZmlnU3RhdGUgPSBpbmplY3Rvci5nZXQoQ29uZmlnU3RhdGVTZXJ2aWNlKTtcbiAgICB0aGlzLm9BdXRoU2VydmljZSA9IGluamVjdG9yLmdldChPQXV0aFNlcnZpY2UpO1xuICAgIHRoaXMuc2Vzc2lvblN0YXRlID0gaW5qZWN0b3IuZ2V0KFNlc3Npb25TdGF0ZVNlcnZpY2UpO1xuICAgIHRoaXMub0F1dGhDb25maWcgPSB0aGlzLmVudmlyb25tZW50LmdldEVudmlyb25tZW50KCkub0F1dGhDb25maWc7XG4gICAgdGhpcy50ZW5hbnRLZXkgPSBpbmplY3Rvci5nZXQoVEVOQU5UX0tFWSk7XG5cbiAgICB0aGlzLmxpc3RlblRvT2F1dGhFcnJvcnMoKTtcbiAgfVxuXG4gIGFzeW5jIGluaXQoKTogUHJvbWlzZTxhbnk+IHtcbiAgICBjb25zdCBzaG91bGRDbGVhciA9IHNob3VsZFN0b3JhZ2VDbGVhcihcbiAgICAgIHRoaXMuZW52aXJvbm1lbnQuZ2V0RW52aXJvbm1lbnQoKS5vQXV0aENvbmZpZy5jbGllbnRJZCxcbiAgICAgIG9BdXRoU3RvcmFnZSxcbiAgICApO1xuICAgIGlmIChzaG91bGRDbGVhcikgY2xlYXJPQXV0aFN0b3JhZ2Uob0F1dGhTdG9yYWdlKTtcblxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmNvbmZpZ3VyZSh0aGlzLm9BdXRoQ29uZmlnKTtcblxuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmV2ZW50c1xuICAgICAgLnBpcGUoZmlsdGVyKGV2ZW50ID0+IGV2ZW50LnR5cGUgPT09ICd0b2tlbl9yZWZyZXNoX2Vycm9yJykpXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHRoaXMubmF2aWdhdGVUb0xvZ2luKCkpO1xuXG4gICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlXG4gICAgICAubG9hZERpc2NvdmVyeURvY3VtZW50KClcbiAgICAgIC50aGVuKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub0F1dGhTZXJ2aWNlLmhhc1ZhbGlkQWNjZXNzVG9rZW4oKSB8fCAhdGhpcy5vQXV0aFNlcnZpY2UuZ2V0UmVmcmVzaFRva2VuKCkpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgIH0pXG4gICAgICAuY2F0Y2godGhpcy5jYXRjaEVycm9yKTtcbiAgfVxuXG4gIHByb3RlY3RlZCByZWZyZXNoVG9rZW4oKSB7XG4gICAgcmV0dXJuIHRoaXMub0F1dGhTZXJ2aWNlLnJlZnJlc2hUb2tlbigpLmNhdGNoKCgpID0+IGNsZWFyT0F1dGhTdG9yYWdlKCkpO1xuICB9XG5cbiAgcHJvdGVjdGVkIGxpc3RlblRvT2F1dGhFcnJvcnMoKSB7XG4gICAgdGhpcy5vQXV0aFNlcnZpY2UuZXZlbnRzXG4gICAgICAucGlwZShcbiAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgT0F1dGhFcnJvckV2ZW50KSxcbiAgICAgICAgdGFwKCgpID0+IGNsZWFyT0F1dGhTdG9yYWdlKCkpLFxuICAgICAgICBzd2l0Y2hNYXAoKCkgPT4gdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKSksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCk7XG4gIH1cbn1cblxuZXhwb3J0IGNsYXNzIEF1dGhDb2RlRmxvd1N0cmF0ZWd5IGV4dGVuZHMgQXV0aEZsb3dTdHJhdGVneSB7XG4gIHJlYWRvbmx5IGlzSW50ZXJuYWxBdXRoID0gZmFsc2U7XG5cbiAgYXN5bmMgaW5pdCgpIHtcbiAgICByZXR1cm4gc3VwZXJcbiAgICAgIC5pbml0KClcbiAgICAgIC50aGVuKCgpID0+IHRoaXMub0F1dGhTZXJ2aWNlLnRyeUxvZ2luKCkuY2F0Y2gobm9vcCkpXG4gICAgICAudGhlbigoKSA9PiB0aGlzLm9BdXRoU2VydmljZS5zZXR1cEF1dG9tYXRpY1NpbGVudFJlZnJlc2goe30sICdhY2Nlc3NfdG9rZW4nKSk7XG4gIH1cblxuICBuYXZpZ2F0ZVRvTG9naW4ocXVlcnlQYXJhbXM/OiBQYXJhbXMpIHtcbiAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0Q29kZUZsb3coJycsIHRoaXMuZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICB9XG5cbiAgY2hlY2tJZkludGVybmFsQXV0aChxdWVyeVBhcmFtcz86IFBhcmFtcykge1xuICAgIHRoaXMub0F1dGhTZXJ2aWNlLmluaXRDb2RlRmxvdygnJywgdGhpcy5nZXRDdWx0dXJlUGFyYW1zKHF1ZXJ5UGFyYW1zKSk7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgbG9nb3V0KHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5vQXV0aFNlcnZpY2UucmV2b2tlVG9rZW5BbmRMb2dvdXQodGhpcy5nZXRDdWx0dXJlUGFyYW1zKHF1ZXJ5UGFyYW1zKSkpO1xuICB9XG5cbiAgbG9naW4ocXVlcnlQYXJhbXM/OiBQYXJhbXMpIHtcbiAgICB0aGlzLm9BdXRoU2VydmljZS5pbml0Q29kZUZsb3coJycsIHRoaXMuZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcykpO1xuICAgIHJldHVybiBvZihudWxsKTtcbiAgfVxuXG4gIHByaXZhdGUgZ2V0Q3VsdHVyZVBhcmFtcyhxdWVyeVBhcmFtcz86IFBhcmFtcykge1xuICAgIGNvbnN0IGxhbmcgPSB0aGlzLnNlc3Npb25TdGF0ZS5nZXRMYW5ndWFnZSgpO1xuICAgIGNvbnN0IGN1bHR1cmUgPSB7IGN1bHR1cmU6IGxhbmcsICd1aS1jdWx0dXJlJzogbGFuZyB9O1xuICAgIHJldHVybiB7IC4uLihsYW5nICYmIGN1bHR1cmUpLCAuLi5xdWVyeVBhcmFtcyB9O1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBBdXRoUGFzc3dvcmRGbG93U3RyYXRlZ3kgZXh0ZW5kcyBBdXRoRmxvd1N0cmF0ZWd5IHtcbiAgcmVhZG9ubHkgaXNJbnRlcm5hbEF1dGggPSB0cnVlO1xuICBwcml2YXRlIGNvb2tpZUtleSA9ICdyZW1lbWJlck1lJztcbiAgcHJpdmF0ZSBzdG9yYWdlS2V5ID0gJ3Bhc3N3b3JkRmxvdyc7XG5cbiAgcHJpdmF0ZSBsaXN0ZW5Ub1Rva2VuRXhwaXJhdGlvbigpIHtcbiAgICB0aGlzLm9BdXRoU2VydmljZS5ldmVudHNcbiAgICAgIC5waXBlKFxuICAgICAgICBmaWx0ZXIoXG4gICAgICAgICAgZXZlbnQgPT5cbiAgICAgICAgICAgIGV2ZW50IGluc3RhbmNlb2YgT0F1dGhJbmZvRXZlbnQgJiZcbiAgICAgICAgICAgIGV2ZW50LnR5cGUgPT09ICd0b2tlbl9leHBpcmVzJyAmJlxuICAgICAgICAgICAgZXZlbnQuaW5mbyA9PT0gJ2FjY2Vzc190b2tlbicsXG4gICAgICAgICksXG4gICAgICApXG4gICAgICAuc3Vic2NyaWJlKCgpID0+IHtcbiAgICAgICAgaWYgKHRoaXMub0F1dGhTZXJ2aWNlLmdldFJlZnJlc2hUb2tlbigpKSB7XG4gICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9BdXRoU2VydmljZS5sb2dPdXQoKTtcbiAgICAgICAgICByZW1vdmVSZW1lbWJlck1lKCk7XG4gICAgICAgICAgdGhpcy5jb25maWdTdGF0ZS5yZWZyZXNoQXBwU3RhdGUoKS5zdWJzY3JpYmUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gIH1cblxuICBhc3luYyBpbml0KCkge1xuICAgIGlmICghZ2V0Q29va2llVmFsdWVCeU5hbWUodGhpcy5jb29raWVLZXkpICYmIGxvY2FsU3RvcmFnZS5nZXRJdGVtKHRoaXMuc3RvcmFnZUtleSkpIHtcbiAgICAgIHRoaXMub0F1dGhTZXJ2aWNlLmxvZ091dCgpO1xuICAgIH1cblxuICAgIHJldHVybiBzdXBlci5pbml0KCkudGhlbigoKSA9PiB0aGlzLmxpc3RlblRvVG9rZW5FeHBpcmF0aW9uKCkpO1xuICB9XG5cbiAgbmF2aWdhdGVUb0xvZ2luKHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcbiAgICByb3V0ZXIubmF2aWdhdGUoWycvYWNjb3VudC9sb2dpbiddLCB7IHF1ZXJ5UGFyYW1zIH0pO1xuICB9XG5cbiAgY2hlY2tJZkludGVybmFsQXV0aCgpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIGxvZ2luKHBhcmFtczogTG9naW5QYXJhbXMpOiBPYnNlcnZhYmxlPGFueT4ge1xuICAgIGNvbnN0IHRlbmFudCA9IHRoaXMuc2Vzc2lvblN0YXRlLmdldFRlbmFudCgpO1xuXG4gICAgcmV0dXJuIGZyb20oXG4gICAgICB0aGlzLm9BdXRoU2VydmljZS5mZXRjaFRva2VuVXNpbmdQYXNzd29yZEZsb3coXG4gICAgICAgIHBhcmFtcy51c2VybmFtZSxcbiAgICAgICAgcGFyYW1zLnBhc3N3b3JkLFxuICAgICAgICBuZXcgSHR0cEhlYWRlcnMoeyAuLi4odGVuYW50ICYmIHRlbmFudC5pZCAmJiB7IFt0aGlzLnRlbmFudEtleV06IHRlbmFudC5pZCB9KSB9KSxcbiAgICAgICksXG4gICAgKS5waXBlKHRoaXMucGlwZVRvTG9naW4ocGFyYW1zKSk7XG4gIH1cblxuICBwaXBlVG9Mb2dpbihwYXJhbXM6IFBpY2s8TG9naW5QYXJhbXMsICdyZWRpcmVjdFVybCcgfCAncmVtZW1iZXJNZSc+KSB7XG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcblxuICAgIHJldHVybiBwaXBlKFxuICAgICAgc3dpdGNoTWFwKCgpID0+IHRoaXMuY29uZmlnU3RhdGUucmVmcmVzaEFwcFN0YXRlKCkpLFxuICAgICAgdGFwKCgpID0+IHtcbiAgICAgICAgc2V0UmVtZW1iZXJNZShwYXJhbXMucmVtZW1iZXJNZSk7XG4gICAgICAgIGlmIChwYXJhbXMucmVkaXJlY3RVcmwpIHJvdXRlci5uYXZpZ2F0ZShbcGFyYW1zLnJlZGlyZWN0VXJsXSk7XG4gICAgICB9KSxcbiAgICApO1xuICB9XG5cbiAgbG9nb3V0KHF1ZXJ5UGFyYW1zPzogUGFyYW1zKSB7XG4gICAgY29uc3Qgcm91dGVyID0gdGhpcy5pbmplY3Rvci5nZXQoUm91dGVyKTtcblxuICAgIHJldHVybiBmcm9tKHRoaXMub0F1dGhTZXJ2aWNlLnJldm9rZVRva2VuQW5kTG9nb3V0KHF1ZXJ5UGFyYW1zKSkucGlwZShcbiAgICAgIHN3aXRjaE1hcCgoKSA9PiB0aGlzLmNvbmZpZ1N0YXRlLnJlZnJlc2hBcHBTdGF0ZSgpKSxcbiAgICAgIHRhcCgoKSA9PiB7XG4gICAgICAgIHJvdXRlci5uYXZpZ2F0ZUJ5VXJsKCcvJyk7XG4gICAgICAgIHJlbW92ZVJlbWVtYmVyTWUoKTtcbiAgICAgIH0pLFxuICAgICk7XG4gIH1cblxuICBwcm90ZWN0ZWQgcmVmcmVzaFRva2VuKCkge1xuICAgIHJldHVybiB0aGlzLm9BdXRoU2VydmljZS5yZWZyZXNoVG9rZW4oKS5jYXRjaCgoKSA9PiB7XG4gICAgICBjbGVhck9BdXRoU3RvcmFnZSgpO1xuICAgICAgcmVtb3ZlUmVtZW1iZXJNZSgpO1xuICAgIH0pO1xuICB9XG59XG5cbmV4cG9ydCBjb25zdCBBVVRIX0ZMT1dfU1RSQVRFR1kgPSB7XG4gIENvZGUoaW5qZWN0b3I6IEluamVjdG9yKSB7XG4gICAgcmV0dXJuIG5ldyBBdXRoQ29kZUZsb3dTdHJhdGVneShpbmplY3Rvcik7XG4gIH0sXG4gIFBhc3N3b3JkKGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHJldHVybiBuZXcgQXV0aFBhc3N3b3JkRmxvd1N0cmF0ZWd5KGluamVjdG9yKTtcbiAgfSxcbn07XG5cbmV4cG9ydCBmdW5jdGlvbiBjbGVhck9BdXRoU3RvcmFnZShzdG9yYWdlOiBPQXV0aFN0b3JhZ2UgPSBvQXV0aFN0b3JhZ2UpIHtcbiAgY29uc3Qga2V5cyA9IFtcbiAgICAnYWNjZXNzX3Rva2VuJyxcbiAgICAnaWRfdG9rZW4nLFxuICAgICdyZWZyZXNoX3Rva2VuJyxcbiAgICAnbm9uY2UnLFxuICAgICdQS0NFX3ZlcmlmaWVyJyxcbiAgICAnZXhwaXJlc19hdCcsXG4gICAgJ2lkX3Rva2VuX2NsYWltc19vYmonLFxuICAgICdpZF90b2tlbl9leHBpcmVzX2F0JyxcbiAgICAnaWRfdG9rZW5fc3RvcmVkX2F0JyxcbiAgICAnYWNjZXNzX3Rva2VuX3N0b3JlZF9hdCcsXG4gICAgJ2dyYW50ZWRfc2NvcGVzJyxcbiAgICAnc2Vzc2lvbl9zdGF0ZScsXG4gIF07XG5cbiAga2V5cy5mb3JFYWNoKGtleSA9PiBzdG9yYWdlLnJlbW92ZUl0ZW0oa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHNob3VsZFN0b3JhZ2VDbGVhcihjbGllbnRJZDogc3RyaW5nLCBzdG9yYWdlOiBPQXV0aFN0b3JhZ2UpOiBib29sZWFuIHtcbiAgY29uc3Qga2V5ID0gJ2FicE9BdXRoQ2xpZW50SWQnO1xuICBpZiAoIXN0b3JhZ2UuZ2V0SXRlbShrZXkpKSB7XG4gICAgc3RvcmFnZS5zZXRJdGVtKGtleSwgY2xpZW50SWQpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHNob3VsZENsZWFyID0gc3RvcmFnZS5nZXRJdGVtKGtleSkgIT09IGNsaWVudElkO1xuICBpZiAoc2hvdWxkQ2xlYXIpIHN0b3JhZ2Uuc2V0SXRlbShrZXksIGNsaWVudElkKTtcbiAgcmV0dXJuIHNob3VsZENsZWFyO1xufVxuXG5mdW5jdGlvbiBnZXRDb29raWVWYWx1ZUJ5TmFtZShuYW1lOiBzdHJpbmcpIHtcbiAgY29uc3QgbWF0Y2ggPSBkb2N1bWVudC5jb29raWUubWF0Y2gobmV3IFJlZ0V4cCgnKF58ICknICsgbmFtZSArICc9KFteO10rKScpKTtcbiAgcmV0dXJuIG1hdGNoID8gbWF0Y2hbMl0gOiAnJztcbn1cbiJdfQ==
|
|
@@ -1,38 +1,38 @@
|
|
|
1
|
-
export class ContainerStrategy {
|
|
2
|
-
constructor(containerRef) {
|
|
3
|
-
this.containerRef = containerRef;
|
|
4
|
-
}
|
|
5
|
-
prepare() { }
|
|
6
|
-
}
|
|
7
|
-
export class ClearContainerStrategy extends ContainerStrategy {
|
|
8
|
-
getIndex() {
|
|
9
|
-
return 0;
|
|
10
|
-
}
|
|
11
|
-
prepare() {
|
|
12
|
-
this.containerRef.clear();
|
|
13
|
-
}
|
|
14
|
-
}
|
|
15
|
-
export class InsertIntoContainerStrategy extends ContainerStrategy {
|
|
16
|
-
constructor(containerRef, index) {
|
|
17
|
-
super(containerRef);
|
|
18
|
-
this.index = index;
|
|
19
|
-
}
|
|
20
|
-
getIndex() {
|
|
21
|
-
return Math.min(Math.max(0, this.index), this.containerRef.length);
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
export const CONTAINER_STRATEGY = {
|
|
25
|
-
Clear(containerRef) {
|
|
26
|
-
return new ClearContainerStrategy(containerRef);
|
|
27
|
-
},
|
|
28
|
-
Append(containerRef) {
|
|
29
|
-
return new InsertIntoContainerStrategy(containerRef, containerRef.length);
|
|
30
|
-
},
|
|
31
|
-
Prepend(containerRef) {
|
|
32
|
-
return new InsertIntoContainerStrategy(containerRef, 0);
|
|
33
|
-
},
|
|
34
|
-
Insert(containerRef, index) {
|
|
35
|
-
return new InsertIntoContainerStrategy(containerRef, index);
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
1
|
+
export class ContainerStrategy {
|
|
2
|
+
constructor(containerRef) {
|
|
3
|
+
this.containerRef = containerRef;
|
|
4
|
+
}
|
|
5
|
+
prepare() { }
|
|
6
|
+
}
|
|
7
|
+
export class ClearContainerStrategy extends ContainerStrategy {
|
|
8
|
+
getIndex() {
|
|
9
|
+
return 0;
|
|
10
|
+
}
|
|
11
|
+
prepare() {
|
|
12
|
+
this.containerRef.clear();
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
export class InsertIntoContainerStrategy extends ContainerStrategy {
|
|
16
|
+
constructor(containerRef, index) {
|
|
17
|
+
super(containerRef);
|
|
18
|
+
this.index = index;
|
|
19
|
+
}
|
|
20
|
+
getIndex() {
|
|
21
|
+
return Math.min(Math.max(0, this.index), this.containerRef.length);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
export const CONTAINER_STRATEGY = {
|
|
25
|
+
Clear(containerRef) {
|
|
26
|
+
return new ClearContainerStrategy(containerRef);
|
|
27
|
+
},
|
|
28
|
+
Append(containerRef) {
|
|
29
|
+
return new InsertIntoContainerStrategy(containerRef, containerRef.length);
|
|
30
|
+
},
|
|
31
|
+
Prepend(containerRef) {
|
|
32
|
+
return new InsertIntoContainerStrategy(containerRef, 0);
|
|
33
|
+
},
|
|
34
|
+
Insert(containerRef, index) {
|
|
35
|
+
return new InsertIntoContainerStrategy(containerRef, index);
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGFpbmVyLnN0cmF0ZWd5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvY29yZS9zcmMvbGliL3N0cmF0ZWdpZXMvY29udGFpbmVyLnN0cmF0ZWd5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUVBLE1BQU0sT0FBZ0IsaUJBQWlCO0lBQ3JDLFlBQW1CLFlBQThCO1FBQTlCLGlCQUFZLEdBQVosWUFBWSxDQUFrQjtJQUFHLENBQUM7SUFJckQsT0FBTyxLQUFVLENBQUM7Q0FDbkI7QUFFRCxNQUFNLE9BQU8sc0JBQXVCLFNBQVEsaUJBQWlCO0lBQzNELFFBQVE7UUFDTixPQUFPLENBQUMsQ0FBQztJQUNYLENBQUM7SUFFRCxPQUFPO1FBQ0wsSUFBSSxDQUFDLFlBQVksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUM1QixDQUFDO0NBQ0Y7QUFFRCxNQUFNLE9BQU8sMkJBQTRCLFNBQVEsaUJBQWlCO0lBQ2hFLFlBQVksWUFBOEIsRUFBVSxLQUFhO1FBQy9ELEtBQUssQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUQ4QixVQUFLLEdBQUwsS0FBSyxDQUFRO0lBRWpFLENBQUM7SUFFRCxRQUFRO1FBQ04sT0FBTyxJQUFJLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ3JFLENBQUM7Q0FDRjtBQUVELE1BQU0sQ0FBQyxNQUFNLGtCQUFrQixHQUFHO0lBQ2hDLEtBQUssQ0FBQyxZQUE4QjtRQUNsQyxPQUFPLElBQUksc0JBQXNCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUNELE1BQU0sQ0FBQyxZQUE4QjtRQUNuQyxPQUFPLElBQUksMkJBQTJCLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUM1RSxDQUFDO0lBQ0QsT0FBTyxDQUFDLFlBQThCO1FBQ3BDLE9BQU8sSUFBSSwyQkFBMkIsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDMUQsQ0FBQztJQUNELE1BQU0sQ0FBQyxZQUE4QixFQUFFLEtBQWE7UUFDbEQsT0FBTyxJQUFJLDJCQUEyQixDQUFDLFlBQVksRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RCxDQUFDO0NBQ0YsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZpZXdDb250YWluZXJSZWYgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuZXhwb3J0IGFic3RyYWN0IGNsYXNzIENvbnRhaW5lclN0cmF0ZWd5IHtcbiAgY29uc3RydWN0b3IocHVibGljIGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge31cblxuICBhYnN0cmFjdCBnZXRJbmRleCgpOiBudW1iZXI7XG5cbiAgcHJlcGFyZSgpOiB2b2lkIHt9XG59XG5cbmV4cG9ydCBjbGFzcyBDbGVhckNvbnRhaW5lclN0cmF0ZWd5IGV4dGVuZHMgQ29udGFpbmVyU3RyYXRlZ3kge1xuICBnZXRJbmRleCgpOiBudW1iZXIge1xuICAgIHJldHVybiAwO1xuICB9XG5cbiAgcHJlcGFyZSgpIHtcbiAgICB0aGlzLmNvbnRhaW5lclJlZi5jbGVhcigpO1xuICB9XG59XG5cbmV4cG9ydCBjbGFzcyBJbnNlcnRJbnRvQ29udGFpbmVyU3RyYXRlZ3kgZXh0ZW5kcyBDb250YWluZXJTdHJhdGVneSB7XG4gIGNvbnN0cnVjdG9yKGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgcHJpdmF0ZSBpbmRleDogbnVtYmVyKSB7XG4gICAgc3VwZXIoY29udGFpbmVyUmVmKTtcbiAgfVxuXG4gIGdldEluZGV4KCkge1xuICAgIHJldHVybiBNYXRoLm1pbihNYXRoLm1heCgwLCB0aGlzLmluZGV4KSwgdGhpcy5jb250YWluZXJSZWYubGVuZ3RoKTtcbiAgfVxufVxuXG5leHBvcnQgY29uc3QgQ09OVEFJTkVSX1NUUkFURUdZID0ge1xuICBDbGVhcihjb250YWluZXJSZWY6IFZpZXdDb250YWluZXJSZWYpIHtcbiAgICByZXR1cm4gbmV3IENsZWFyQ29udGFpbmVyU3RyYXRlZ3koY29udGFpbmVyUmVmKTtcbiAgfSxcbiAgQXBwZW5kKGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZikge1xuICAgIHJldHVybiBuZXcgSW5zZXJ0SW50b0NvbnRhaW5lclN0cmF0ZWd5KGNvbnRhaW5lclJlZiwgY29udGFpbmVyUmVmLmxlbmd0aCk7XG4gIH0sXG4gIFByZXBlbmQoY29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmKSB7XG4gICAgcmV0dXJuIG5ldyBJbnNlcnRJbnRvQ29udGFpbmVyU3RyYXRlZ3koY29udGFpbmVyUmVmLCAwKTtcbiAgfSxcbiAgSW5zZXJ0KGNvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZiwgaW5kZXg6IG51bWJlcikge1xuICAgIHJldHVybiBuZXcgSW5zZXJ0SW50b0NvbnRhaW5lclN0cmF0ZWd5KGNvbnRhaW5lclJlZiwgaW5kZXgpO1xuICB9LFxufTtcbiJdfQ==
|