@dontdrinkandroot/ngx-extensions 0.3.2 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/esm2022/src/cookie/cookie.service.mjs +135 -0
  2. package/esm2022/src/ddr-extensions.module.mjs +67 -0
  3. package/esm2022/src/http/redirect-to-login-interceptor.service.mjs +35 -0
  4. package/{esm2020 → esm2022}/src/http/with-credentials-interceptor.service.mjs +4 -4
  5. package/esm2022/src/image/lazy-image.directive.mjs +132 -0
  6. package/esm2022/src/jwt/jwt-interceptor.service.mjs +26 -0
  7. package/esm2022/src/jwt/jwt-refresh-token-interceptor.service.mjs +50 -0
  8. package/{esm2020 → esm2022}/src/jwt/jwt.service.mjs +5 -5
  9. package/esm2022/src/logger/console-logger.service.mjs +43 -0
  10. package/esm2022/src/methoddecorator/limit.mjs +16 -0
  11. package/esm2022/src/oauth/oauth2-access-token-interceptor.service.mjs +26 -0
  12. package/esm2022/src/oauth/oauth2-error.mjs +8 -0
  13. package/esm2022/src/oauth/oauth2-refresh-token-interceptor.service.mjs +24 -0
  14. package/{esm2020 → esm2022}/src/oauth/oauth2.module.mjs +5 -5
  15. package/esm2022/src/oauth/oauth2.service.mjs +125 -0
  16. package/esm2022/src/oauth/redirect-to-oauth2-login-interceptor.service.mjs +41 -0
  17. package/esm2022/src/scroll/bottom-hit.directive.mjs +60 -0
  18. package/esm2022/src/scroll/scroll.service.mjs +38 -0
  19. package/esm2022/src/storage/local-storage.service.mjs +53 -0
  20. package/esm2022/src/util/collection-utils.mjs +27 -0
  21. package/{esm2020 → esm2022}/src/util/number-utils.mjs +1 -1
  22. package/esm2022/src/util/string-utils.mjs +35 -0
  23. package/esm2022/src/util/type-utils.mjs +9 -0
  24. package/{esm2020 → esm2022}/src/visibility/visibility.service.mjs +5 -5
  25. package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs +102 -100
  26. package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs.map +1 -1
  27. package/package.json +9 -15
  28. package/src/image/lazy-image.directive.d.ts +1 -1
  29. package/esm2020/src/cookie/cookie.service.mjs +0 -135
  30. package/esm2020/src/ddr-extensions.module.mjs +0 -67
  31. package/esm2020/src/http/redirect-to-login-interceptor.service.mjs +0 -35
  32. package/esm2020/src/image/lazy-image.directive.mjs +0 -132
  33. package/esm2020/src/jwt/jwt-interceptor.service.mjs +0 -26
  34. package/esm2020/src/jwt/jwt-refresh-token-interceptor.service.mjs +0 -50
  35. package/esm2020/src/logger/console-logger.service.mjs +0 -43
  36. package/esm2020/src/methoddecorator/limit.mjs +0 -16
  37. package/esm2020/src/oauth/oauth2-access-token-interceptor.service.mjs +0 -26
  38. package/esm2020/src/oauth/oauth2-error.mjs +0 -8
  39. package/esm2020/src/oauth/oauth2-refresh-token-interceptor.service.mjs +0 -24
  40. package/esm2020/src/oauth/oauth2.service.mjs +0 -125
  41. package/esm2020/src/oauth/redirect-to-oauth2-login-interceptor.service.mjs +0 -41
  42. package/esm2020/src/scroll/bottom-hit.directive.mjs +0 -60
  43. package/esm2020/src/scroll/scroll.service.mjs +0 -38
  44. package/esm2020/src/storage/local-storage.service.mjs +0 -53
  45. package/esm2020/src/util/collection-utils.mjs +0 -27
  46. package/esm2020/src/util/string-utils.mjs +0 -35
  47. package/esm2020/src/util/type-utils.mjs +0 -9
  48. package/fesm2015/dontdrinkandroot-ngx-extensions.mjs +0 -1132
  49. package/fesm2015/dontdrinkandroot-ngx-extensions.mjs.map +0 -1
  50. /package/{esm2020 → esm2022}/dontdrinkandroot-ngx-extensions.mjs +0 -0
  51. /package/{esm2020 → esm2022}/public-api.mjs +0 -0
  52. /package/{esm2020 → esm2022}/src/http/url-info.mjs +0 -0
  53. /package/{esm2020 → esm2022}/src/jwt/jwt-token-response.mjs +0 -0
  54. /package/{esm2020 → esm2022}/src/logger/logger.service.mjs +0 -0
  55. /package/{esm2020 → esm2022}/src/methoddecorator/debounce.mjs +0 -0
  56. /package/{esm2020 → esm2022}/src/oauth/json-web-token.mjs +0 -0
  57. /package/{esm2020 → esm2022}/src/oauth/oauth2-config.mjs +0 -0
  58. /package/{esm2020 → esm2022}/src/oauth/token-response.mjs +0 -0
  59. /package/{esm2020 → esm2022}/src/storage/storage.service.mjs +0 -0
  60. /package/{esm2020 → esm2022}/src/typeguard/is-non-null.mjs +0 -0
  61. /package/{esm2020 → esm2022}/src/util/object-utils.mjs +0 -0
@@ -0,0 +1,16 @@
1
+ export function Limit(rate = 250) {
2
+ let timeoutReference = null;
3
+ return (target, propertyKey, descriptor) => {
4
+ const original = descriptor.value;
5
+ descriptor.value = function (...args) {
6
+ if (null == timeoutReference) {
7
+ timeoutReference = setTimeout(() => {
8
+ original.apply(this, args);
9
+ timeoutReference = undefined;
10
+ }, rate);
11
+ }
12
+ };
13
+ return descriptor;
14
+ };
15
+ }
16
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGltaXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbWV0aG9kZGVjb3JhdG9yL2xpbWl0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxLQUFLLENBQUMsT0FBZSxHQUFHO0lBRXBDLElBQUksZ0JBQWdCLEdBQVEsSUFBSSxDQUFDO0lBRWpDLE9BQU8sQ0FBQyxNQUFjLEVBQUUsV0FBNEIsRUFBRSxVQUF3QyxFQUFFLEVBQUU7UUFDOUYsTUFBTSxRQUFRLEdBQUcsVUFBVSxDQUFDLEtBQUssQ0FBQztRQUNsQyxVQUFVLENBQUMsS0FBSyxHQUFHLFVBQVUsR0FBRyxJQUFTO1lBQ3JDLElBQUksSUFBSSxJQUFJLGdCQUFnQixFQUFFLENBQUM7Z0JBQzNCLGdCQUFnQixHQUFHLFVBQVUsQ0FBQyxHQUFHLEVBQUU7b0JBQy9CLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO29CQUMzQixnQkFBZ0IsR0FBRyxTQUFTLENBQUE7Z0JBQ2hDLENBQUMsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUNiLENBQUM7UUFDTCxDQUFDLENBQUM7UUFFRixPQUFPLFVBQVUsQ0FBQztJQUN0QixDQUFDLENBQUM7QUFDTixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGZ1bmN0aW9uIExpbWl0KHJhdGU6IG51bWJlciA9IDI1MCk6IE1ldGhvZERlY29yYXRvclxue1xuICAgIGxldCB0aW1lb3V0UmVmZXJlbmNlOiBhbnkgPSBudWxsO1xuXG4gICAgcmV0dXJuICh0YXJnZXQ6IE9iamVjdCwgcHJvcGVydHlLZXk6IHN0cmluZyB8IHN5bWJvbCwgZGVzY3JpcHRvcjogVHlwZWRQcm9wZXJ0eURlc2NyaXB0b3I8YW55PikgPT4ge1xuICAgICAgICBjb25zdCBvcmlnaW5hbCA9IGRlc2NyaXB0b3IudmFsdWU7XG4gICAgICAgIGRlc2NyaXB0b3IudmFsdWUgPSBmdW5jdGlvbiAoLi4uYXJnczogYW55KSB7XG4gICAgICAgICAgICBpZiAobnVsbCA9PSB0aW1lb3V0UmVmZXJlbmNlKSB7XG4gICAgICAgICAgICAgICAgdGltZW91dFJlZmVyZW5jZSA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBvcmlnaW5hbC5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgdGltZW91dFJlZmVyZW5jZSA9IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIH0sIHJhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBkZXNjcmlwdG9yO1xuICAgIH07XG59XG4iXX0=
@@ -0,0 +1,26 @@
1
+ import { Injectable } from '@angular/core';
2
+ import * as i0 from "@angular/core";
3
+ import * as i1 from "./oauth2.service";
4
+ export class OAuth2AccessTokenInterceptor {
5
+ constructor(oAuth2Service) {
6
+ this.oAuth2Service = oAuth2Service;
7
+ }
8
+ /**
9
+ * @override
10
+ */
11
+ intercept(req, next) {
12
+ const accessTokenString = this.oAuth2Service.getAccessTokenString();
13
+ if (null !== accessTokenString && !this.oAuth2Service.isAccessTokenExpired()) {
14
+ req = req.clone({
15
+ headers: req.headers.set('Authorization', 'Bearer ' + accessTokenString)
16
+ });
17
+ }
18
+ return next.handle(req);
19
+ }
20
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2AccessTokenInterceptor, deps: [{ token: i1.OAuth2Service }], target: i0.ɵɵFactoryTarget.Injectable }); }
21
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2AccessTokenInterceptor }); }
22
+ }
23
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2AccessTokenInterceptor, decorators: [{
24
+ type: Injectable
25
+ }], ctorParameters: () => [{ type: i1.OAuth2Service }] });
26
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLWFjY2Vzcy10b2tlbi1pbnRlcmNlcHRvci5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL29hdXRoL29hdXRoMi1hY2Nlc3MtdG9rZW4taW50ZXJjZXB0b3Iuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFDQSxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7QUFLekMsTUFBTSxPQUFPLDRCQUE0QjtJQUVyQyxZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUVoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUVyRCxNQUFNLGlCQUFpQixHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztRQUVwRSxJQUFJLElBQUksS0FBSyxpQkFBaUIsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsb0JBQW9CLEVBQUUsRUFBRSxDQUFDO1lBQzNFLEdBQUcsR0FBRyxHQUFHLENBQUMsS0FBSyxDQUFDO2dCQUNaLE9BQU8sRUFBRSxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLEVBQUUsU0FBUyxHQUFHLGlCQUFpQixDQUFDO2FBQzNFLENBQUMsQ0FBQztRQUNQLENBQUM7UUFFRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUM7SUFDNUIsQ0FBQzs4R0FwQlEsNEJBQTRCO2tIQUE1Qiw0QkFBNEI7OzJGQUE1Qiw0QkFBNEI7a0JBRHhDLFVBQVUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0h0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3R9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7SW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge09ic2VydmFibGV9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHtPQXV0aDJTZXJ2aWNlfSBmcm9tICcuL29hdXRoMi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoMkFjY2Vzc1Rva2VuSW50ZXJjZXB0b3IgaW1wbGVtZW50cyBIdHRwSW50ZXJjZXB0b3JcbntcbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIG9BdXRoMlNlcnZpY2U6IE9BdXRoMlNlcnZpY2UpXG4gICAge1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEBvdmVycmlkZVxuICAgICAqL1xuICAgIHB1YmxpYyBpbnRlcmNlcHQocmVxOiBIdHRwUmVxdWVzdDxhbnk+LCBuZXh0OiBIdHRwSGFuZGxlcik6IE9ic2VydmFibGU8SHR0cEV2ZW50PGFueT4+XG4gICAge1xuICAgICAgICBjb25zdCBhY2Nlc3NUb2tlblN0cmluZyA9IHRoaXMub0F1dGgyU2VydmljZS5nZXRBY2Nlc3NUb2tlblN0cmluZygpO1xuXG4gICAgICAgIGlmIChudWxsICE9PSBhY2Nlc3NUb2tlblN0cmluZyAmJiAhdGhpcy5vQXV0aDJTZXJ2aWNlLmlzQWNjZXNzVG9rZW5FeHBpcmVkKCkpIHtcbiAgICAgICAgICAgIHJlcSA9IHJlcS5jbG9uZSh7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogcmVxLmhlYWRlcnMuc2V0KCdBdXRob3JpemF0aW9uJywgJ0JlYXJlciAnICsgYWNjZXNzVG9rZW5TdHJpbmcpXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,8 @@
1
+ export class OAuth2Error extends Error {
2
+ static { this.CODE_NOT_FOUND = 'code_not_found'; }
3
+ static { this.ACCESS_DENIED = 'access_denied'; }
4
+ constructor(error) {
5
+ super(error);
6
+ }
7
+ }
8
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLWVycm9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL29hdXRoL29hdXRoMi1lcnJvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLE9BQU8sV0FBWSxTQUFRLEtBQUs7YUFFWCxtQkFBYyxHQUFHLGdCQUFnQixDQUFDO2FBRWxDLGtCQUFhLEdBQUcsZUFBZSxDQUFDO0lBRXZELFlBQVksS0FBYTtRQUVyQixLQUFLLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDakIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBPQXV0aDJFcnJvciBleHRlbmRzIEVycm9yXG57XG4gICAgcHVibGljIHN0YXRpYyByZWFkb25seSBDT0RFX05PVF9GT1VORCA9ICdjb2RlX25vdF9mb3VuZCc7XG5cbiAgICBwdWJsaWMgc3RhdGljIHJlYWRvbmx5IEFDQ0VTU19ERU5JRUQgPSAnYWNjZXNzX2RlbmllZCc7XG5cbiAgICBjb25zdHJ1Y3RvcihlcnJvcjogc3RyaW5nKVxuICAgIHtcbiAgICAgICAgc3VwZXIoZXJyb3IpO1xuICAgIH1cbn1cbiJdfQ==
@@ -0,0 +1,24 @@
1
+ import { Injectable } from '@angular/core';
2
+ import { switchMap } from 'rxjs/operators';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "./oauth2.service";
5
+ export class OAuth2RefreshTokenInterceptor {
6
+ constructor(oAuth2Service) {
7
+ this.oAuth2Service = oAuth2Service;
8
+ }
9
+ /**
10
+ * @override
11
+ */
12
+ intercept(req, next) {
13
+ if (this.oAuth2Service.isRefreshPossibleAndRequired(req)) {
14
+ return this.oAuth2Service.performRefresh().pipe(switchMap(() => next.handle(req)));
15
+ }
16
+ return next.handle(req);
17
+ }
18
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2RefreshTokenInterceptor, deps: [{ token: i1.OAuth2Service }], target: i0.ɵɵFactoryTarget.Injectable }); }
19
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2RefreshTokenInterceptor }); }
20
+ }
21
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2RefreshTokenInterceptor, decorators: [{
22
+ type: Injectable
23
+ }], ctorParameters: () => [{ type: i1.OAuth2Service }] });
24
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLXJlZnJlc2gtdG9rZW4taW50ZXJjZXB0b3Iuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9vYXV0aC9vYXV0aDItcmVmcmVzaC10b2tlbi1pbnRlcmNlcHRvci5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sRUFBQyxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFDLFNBQVMsRUFBQyxNQUFNLGdCQUFnQixDQUFDOzs7QUFJekMsTUFBTSxPQUFPLDZCQUE2QjtJQUV0QyxZQUFvQixhQUE0QjtRQUE1QixrQkFBYSxHQUFiLGFBQWEsQ0FBZTtJQUVoRCxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUVyRCxJQUFJLElBQUksQ0FBQyxhQUFhLENBQUMsNEJBQTRCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUN2RCxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsY0FBYyxFQUFFLENBQUMsSUFBSSxDQUMzQyxTQUFTLENBQUMsR0FBRyxFQUFFLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUNwQyxDQUFDO1FBQ04sQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUM1QixDQUFDOzhHQWxCUSw2QkFBNkI7a0hBQTdCLDZCQUE2Qjs7MkZBQTdCLDZCQUE2QjtrQkFEekMsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cEV2ZW50LCBIdHRwSGFuZGxlciwgSHR0cEludGVyY2VwdG9yLCBIdHRwUmVxdWVzdH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7T2JzZXJ2YWJsZX0gZnJvbSAncnhqcyc7XG5pbXBvcnQge3N3aXRjaE1hcH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtPQXV0aDJTZXJ2aWNlfSBmcm9tICcuL29hdXRoMi5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIE9BdXRoMlJlZnJlc2hUb2tlbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yXG57XG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBvQXV0aDJTZXJ2aWNlOiBPQXV0aDJTZXJ2aWNlKVxuICAgIHtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgaW50ZXJjZXB0KHJlcTogSHR0cFJlcXVlc3Q8YW55PiwgbmV4dDogSHR0cEhhbmRsZXIpOiBPYnNlcnZhYmxlPEh0dHBFdmVudDxhbnk+PlxuICAgIHtcbiAgICAgICAgaWYgKHRoaXMub0F1dGgyU2VydmljZS5pc1JlZnJlc2hQb3NzaWJsZUFuZFJlcXVpcmVkKHJlcSkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm9BdXRoMlNlcnZpY2UucGVyZm9ybVJlZnJlc2goKS5waXBlKFxuICAgICAgICAgICAgICAgIHN3aXRjaE1hcCgoKSA9PiBuZXh0LmhhbmRsZShyZXEpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpO1xuICAgIH1cbn1cbiJdfQ==
@@ -34,11 +34,11 @@ export class OAuth2Module {
34
34
  ],
35
35
  };
36
36
  }
37
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Module, deps: [], target: i0.ɵɵFactoryTarget.NgModule }); }
38
+ static { this.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Module }); }
39
+ static { this.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Module }); }
37
40
  }
38
- OAuth2Module.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Module, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
39
- OAuth2Module.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "14.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Module });
40
- OAuth2Module.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Module });
41
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.4", ngImport: i0, type: OAuth2Module, decorators: [{
41
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Module, decorators: [{
42
42
  type: NgModule
43
43
  }] });
44
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9vYXV0aC9vYXV0aDIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBZSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ2hHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHL0MsTUFBTSxPQUFPLFlBQVk7SUFFckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFvQjtRQUUvQixPQUFPO1lBQ0gsUUFBUSxFQUFFLFlBQVk7WUFDdEIsU0FBUyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2I7b0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsUUFBUSxFQUFFLE1BQU07aUJBQ25CO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSw2QkFBNkI7b0JBQ3ZDLEtBQUssRUFBRSxJQUFJO2lCQUNkO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLEtBQUssRUFBRSxJQUFJO2lCQUNkO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLEtBQUssRUFBRSxJQUFJO2lCQUNkO2FBQ0o7U0FDSixDQUFDO0lBQ04sQ0FBQzs7eUdBN0JRLFlBQVk7MEdBQVosWUFBWTswR0FBWixZQUFZOzJGQUFaLFlBQVk7a0JBRHhCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RERSX09BVVRIMl9DT05GSUcsIE9BdXRoMkNvbmZpZ30gZnJvbSAnLi9vYXV0aDItY29uZmlnJztcbmltcG9ydCB7SFRUUF9JTlRFUkNFUFRPUlN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T0F1dGgyUmVmcmVzaFRva2VuSW50ZXJjZXB0b3J9IGZyb20gJy4vb2F1dGgyLXJlZnJlc2gtdG9rZW4taW50ZXJjZXB0b3Iuc2VydmljZSc7XG5pbXBvcnQge1JlZGlyZWN0VG9PQXV0aDJMb2dpbkludGVyY2VwdG9yfSBmcm9tICcuL3JlZGlyZWN0LXRvLW9hdXRoMi1sb2dpbi1pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmltcG9ydCB7T0F1dGgyQWNjZXNzVG9rZW5JbnRlcmNlcHRvcn0gZnJvbSAnLi9vYXV0aDItYWNjZXNzLXRva2VuLWludGVyY2VwdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtPQXV0aDJTZXJ2aWNlfSBmcm9tICcuL29hdXRoMi5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aDJNb2R1bGVcbntcbiAgICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE9BdXRoMkNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8T0F1dGgyTW9kdWxlPlxuICAgIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBPQXV0aDJNb2R1bGUsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICBPQXV0aDJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRERSX09BVVRIMl9DT05GSUcsXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBjb25maWdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBPQXV0aDJSZWZyZXNoVG9rZW5JbnRlcmNlcHRvcixcbiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBSZWRpcmVjdFRvT0F1dGgyTG9naW5JbnRlcmNlcHRvcixcbiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBPQXV0aDJBY2Nlc3NUb2tlbkludGVyY2VwdG9yLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
44
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9vYXV0aC9vYXV0aDIubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBc0IsUUFBUSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVELE9BQU8sRUFBQyxpQkFBaUIsRUFBZSxNQUFNLGlCQUFpQixDQUFDO0FBQ2hFLE9BQU8sRUFBQyxpQkFBaUIsRUFBQyxNQUFNLHNCQUFzQixDQUFDO0FBQ3ZELE9BQU8sRUFBQyw2QkFBNkIsRUFBQyxNQUFNLDRDQUE0QyxDQUFDO0FBQ3pGLE9BQU8sRUFBQyxnQ0FBZ0MsRUFBQyxNQUFNLGdEQUFnRCxDQUFDO0FBQ2hHLE9BQU8sRUFBQyw0QkFBNEIsRUFBQyxNQUFNLDJDQUEyQyxDQUFDO0FBQ3ZGLE9BQU8sRUFBQyxhQUFhLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQzs7QUFHL0MsTUFBTSxPQUFPLFlBQVk7SUFFckIsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFvQjtRQUUvQixPQUFPO1lBQ0gsUUFBUSxFQUFFLFlBQVk7WUFDdEIsU0FBUyxFQUFFO2dCQUNQLGFBQWE7Z0JBQ2I7b0JBQ0ksT0FBTyxFQUFFLGlCQUFpQjtvQkFDMUIsUUFBUSxFQUFFLE1BQU07aUJBQ25CO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSw2QkFBNkI7b0JBQ3ZDLEtBQUssRUFBRSxJQUFJO2lCQUNkO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSxnQ0FBZ0M7b0JBQzFDLEtBQUssRUFBRSxJQUFJO2lCQUNkO2dCQUNEO29CQUNJLE9BQU8sRUFBRSxpQkFBaUI7b0JBQzFCLFFBQVEsRUFBRSw0QkFBNEI7b0JBQ3RDLEtBQUssRUFBRSxJQUFJO2lCQUNkO2FBQ0o7U0FDSixDQUFDO0lBQ04sQ0FBQzs4R0E3QlEsWUFBWTsrR0FBWixZQUFZOytHQUFaLFlBQVk7OzJGQUFaLFlBQVk7a0JBRHhCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge01vZHVsZVdpdGhQcm92aWRlcnMsIE5nTW9kdWxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7RERSX09BVVRIMl9DT05GSUcsIE9BdXRoMkNvbmZpZ30gZnJvbSAnLi9vYXV0aDItY29uZmlnJztcbmltcG9ydCB7SFRUUF9JTlRFUkNFUFRPUlN9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T0F1dGgyUmVmcmVzaFRva2VuSW50ZXJjZXB0b3J9IGZyb20gJy4vb2F1dGgyLXJlZnJlc2gtdG9rZW4taW50ZXJjZXB0b3Iuc2VydmljZSc7XG5pbXBvcnQge1JlZGlyZWN0VG9PQXV0aDJMb2dpbkludGVyY2VwdG9yfSBmcm9tICcuL3JlZGlyZWN0LXRvLW9hdXRoMi1sb2dpbi1pbnRlcmNlcHRvci5zZXJ2aWNlJztcbmltcG9ydCB7T0F1dGgyQWNjZXNzVG9rZW5JbnRlcmNlcHRvcn0gZnJvbSAnLi9vYXV0aDItYWNjZXNzLXRva2VuLWludGVyY2VwdG9yLnNlcnZpY2UnO1xuaW1wb3J0IHtPQXV0aDJTZXJ2aWNlfSBmcm9tICcuL29hdXRoMi5zZXJ2aWNlJztcblxuQE5nTW9kdWxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aDJNb2R1bGVcbntcbiAgICBzdGF0aWMgZm9yUm9vdChjb25maWc6IE9BdXRoMkNvbmZpZyk6IE1vZHVsZVdpdGhQcm92aWRlcnM8T0F1dGgyTW9kdWxlPlxuICAgIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG5nTW9kdWxlOiBPQXV0aDJNb2R1bGUsXG4gICAgICAgICAgICBwcm92aWRlcnM6IFtcbiAgICAgICAgICAgICAgICBPQXV0aDJTZXJ2aWNlLFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogRERSX09BVVRIMl9DT05GSUcsXG4gICAgICAgICAgICAgICAgICAgIHVzZVZhbHVlOiBjb25maWdcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBPQXV0aDJSZWZyZXNoVG9rZW5JbnRlcmNlcHRvcixcbiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBSZWRpcmVjdFRvT0F1dGgyTG9naW5JbnRlcmNlcHRvcixcbiAgICAgICAgICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvdmlkZTogSFRUUF9JTlRFUkNFUFRPUlMsXG4gICAgICAgICAgICAgICAgICAgIHVzZUNsYXNzOiBPQXV0aDJBY2Nlc3NUb2tlbkludGVyY2VwdG9yLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aTogdHJ1ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIF0sXG4gICAgICAgIH07XG4gICAgfVxufVxuIl19
@@ -0,0 +1,125 @@
1
+ import { Inject, Injectable } from '@angular/core';
2
+ import { throwError } from 'rxjs';
3
+ import { HttpParams } from '@angular/common/http';
4
+ import { catchError, map, shareReplay } from 'rxjs/operators';
5
+ import { DDR_OAUTH2_CONFIG } from './oauth2-config';
6
+ import { OAuth2Error } from './oauth2-error';
7
+ import { TypeUtils } from '../util/type-utils';
8
+ import { StringUtils } from '../util/string-utils';
9
+ import * as i0 from "@angular/core";
10
+ import * as i1 from "@angular/router";
11
+ import * as i2 from "@angular/common/http";
12
+ import * as i3 from "../logger/logger.service";
13
+ import * as i4 from "./oauth2-config";
14
+ export class OAuth2Service {
15
+ static { this.STORAGE_KEY_CHALLENGE = 'ddr_oauth2_challenge'; }
16
+ static { this.STORAGE_KEY_REFRESH_TOKEN = 'ddr_oauth2_refresh_token'; }
17
+ static { this.STORAGE_KEY_RETURN_URL = 'ddr_oauth2_return_url'; }
18
+ constructor(route, httpClient, loggerService, config) {
19
+ this.route = route;
20
+ this.httpClient = httpClient;
21
+ this.loggerService = loggerService;
22
+ this.config = config;
23
+ this.accessTokenString = null;
24
+ this.accessToken = null;
25
+ this.REFRESH_MARGIN_SECONDS = 60 * 10;
26
+ this.refreshTokenRequest$ = null;
27
+ }
28
+ redirectToLogin() {
29
+ const challenge = this.createChallenge();
30
+ localStorage.setItem(OAuth2Service.STORAGE_KEY_CHALLENGE, challenge);
31
+ const params = new HttpParams()
32
+ .set('client_id', this.config.clientId)
33
+ .set('response_type', 'code')
34
+ .set('redirect_uri', this.config.redirectUri)
35
+ .set('code_challenge', challenge)
36
+ .set('code_challenge_method', 'plain');
37
+ window.location.href = this.config.authorizeUri + '?' + params.toString();
38
+ }
39
+ handleCode() {
40
+ if (this.route.snapshot.queryParamMap.has('error')) {
41
+ const error = this.route.snapshot.queryParamMap.get('error');
42
+ return throwError(() => new OAuth2Error(error ?? 'Unknown error'));
43
+ }
44
+ if (!this.route.snapshot.queryParamMap.has('code')) {
45
+ return throwError(() => new OAuth2Error(OAuth2Error.CODE_NOT_FOUND));
46
+ }
47
+ const code = TypeUtils.notNull(this.route.snapshot.queryParamMap.get('code'));
48
+ const params = new HttpParams()
49
+ .set('grant_type', 'authorization_code')
50
+ .set('code', code)
51
+ .set('redirect_uri', this.config.redirectUri)
52
+ .set('code_verifier', TypeUtils.notNull(localStorage.getItem(OAuth2Service.STORAGE_KEY_CHALLENGE)))
53
+ .set('client_id', this.config.clientId);
54
+ return this.httpClient.post(this.config.tokenUri, params).pipe(map(tokenResponse => this.processTokenResponse(tokenResponse)));
55
+ }
56
+ createChallenge() {
57
+ return StringUtils.createRandomString(64, 'ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-._~');
58
+ }
59
+ getRefreshToken() {
60
+ return localStorage.getItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
61
+ }
62
+ getAccessTokenString() {
63
+ return this.accessTokenString;
64
+ }
65
+ isAccessTokenExpired() {
66
+ return (null == this.accessToken
67
+ || this.accessToken.exp * 1000 < Date.now());
68
+ }
69
+ isRefreshPossibleAndRequired(req = null) {
70
+ return ((null == req || !req.url.endsWith(this.config.tokenUri))
71
+ && null != this.getRefreshToken()
72
+ && (null == this.accessToken
73
+ || (this.accessToken.exp - this.REFRESH_MARGIN_SECONDS) * 1000 < Date.now()));
74
+ }
75
+ performRefresh() {
76
+ if (null == this.refreshTokenRequest$) {
77
+ this.loggerService.info('Performing token refesh');
78
+ const params = new HttpParams()
79
+ .set('grant_type', 'refresh_token')
80
+ .set('refresh_token', TypeUtils.notNull(this.getRefreshToken()))
81
+ .set('client_id', this.config.clientId);
82
+ this.refreshTokenRequest$ = this.httpClient.post(this.config.tokenUri, params).pipe(map(tokenResponse => {
83
+ const token = this.processTokenResponse(tokenResponse);
84
+ this.refreshTokenRequest$ = null;
85
+ return token;
86
+ }), catchError(error => {
87
+ this.accessTokenString = null;
88
+ this.accessToken = null;
89
+ localStorage.removeItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
90
+ this.refreshTokenRequest$ = null;
91
+ return throwError(error);
92
+ }), shareReplay(1));
93
+ }
94
+ return this.refreshTokenRequest$;
95
+ }
96
+ processTokenResponse(tokenResponse) {
97
+ localStorage.removeItem(OAuth2Service.STORAGE_KEY_CHALLENGE);
98
+ this.accessTokenString = tokenResponse.access_token;
99
+ this.accessToken = JSON.parse(atob(tokenResponse.access_token.split('.')[1]));
100
+ this.loggerService.info('Access Token Expiry', new Date(this.accessToken.exp * 1000));
101
+ localStorage.setItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN, tokenResponse.refresh_token);
102
+ return this.accessToken;
103
+ }
104
+ clear() {
105
+ this.accessToken = null;
106
+ this.accessTokenString = null;
107
+ localStorage.removeItem(OAuth2Service.STORAGE_KEY_REFRESH_TOKEN);
108
+ localStorage.removeItem(OAuth2Service.STORAGE_KEY_RETURN_URL);
109
+ }
110
+ setReturnUrl(url) {
111
+ localStorage.setItem(OAuth2Service.STORAGE_KEY_RETURN_URL, url);
112
+ }
113
+ getReturnUrl() {
114
+ return localStorage.getItem(OAuth2Service.STORAGE_KEY_RETURN_URL);
115
+ }
116
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Service, deps: [{ token: i1.ActivatedRoute }, { token: i2.HttpClient }, { token: i3.Logger }, { token: DDR_OAUTH2_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
117
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Service }); }
118
+ }
119
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: OAuth2Service, decorators: [{
120
+ type: Injectable
121
+ }], ctorParameters: () => [{ type: i1.ActivatedRoute }, { type: i2.HttpClient }, { type: i3.Logger }, { type: i4.OAuth2Config, decorators: [{
122
+ type: Inject,
123
+ args: [DDR_OAUTH2_CONFIG]
124
+ }] }] });
125
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2F1dGgyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvb2F1dGgvb2F1dGgyLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFFakQsT0FBTyxFQUFhLFVBQVUsRUFBQyxNQUFNLE1BQU0sQ0FBQztBQUM1QyxPQUFPLEVBQWEsVUFBVSxFQUFjLE1BQU0sc0JBQXNCLENBQUM7QUFDekUsT0FBTyxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsV0FBVyxFQUFDLE1BQU0sZ0JBQWdCLENBQUM7QUFHNUQsT0FBTyxFQUFDLGlCQUFpQixFQUFlLE1BQU0saUJBQWlCLENBQUM7QUFDaEUsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBQzNDLE9BQU8sRUFBQyxTQUFTLEVBQUMsTUFBTSxvQkFBb0IsQ0FBQztBQUM3QyxPQUFPLEVBQUMsV0FBVyxFQUFDLE1BQU0sc0JBQXNCLENBQUM7Ozs7OztBQUlqRCxNQUFNLE9BQU8sYUFBYTthQUVQLDBCQUFxQixHQUFHLHNCQUFzQixBQUF6QixDQUEwQjthQUUvQyw4QkFBeUIsR0FBRywwQkFBMEIsQUFBN0IsQ0FBOEI7YUFFeEQsMkJBQXNCLEdBQUcsdUJBQXVCLEFBQTFCLENBQTJCO0lBVS9ELFlBQ1ksS0FBcUIsRUFDckIsVUFBc0IsRUFDdEIsYUFBcUIsRUFDTSxNQUFvQjtRQUgvQyxVQUFLLEdBQUwsS0FBSyxDQUFnQjtRQUNyQixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQ3RCLGtCQUFhLEdBQWIsYUFBYSxDQUFRO1FBQ00sV0FBTSxHQUFOLE1BQU0sQ0FBYztRQVpuRCxzQkFBaUIsR0FBa0IsSUFBSSxDQUFDO1FBRXhDLGdCQUFXLEdBQXdCLElBQUksQ0FBQztRQUUvQiwyQkFBc0IsR0FBRyxFQUFFLEdBQUcsRUFBRSxDQUFDO1FBRTFDLHlC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QUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMseUJBQXlCLEVBQUUsYUFBYSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBRTNGLE9BQU8sSUFBSSxDQUFDLFdBQVksQ0FBQztJQUM3QixDQUFDO0lBRU0sS0FBSztRQUVSLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFDOUIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxhQUFhLENBQUMseUJBQXlCLENBQUMsQ0FBQztRQUNqRSxZQUFZLENBQUMsVUFBVSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO0lBQ2xFLENBQUM7SUFFTSxZQUFZLENBQUMsR0FBVztRQUUzQixZQUFZLENBQUMsT0FBTyxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUNwRSxDQUFDO0lBRU0sWUFBWTtRQUVmLE9BQU8sWUFBWSxDQUFDLE9BQU8sQ0FBQyxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztJQUN0RSxDQUFDOzhHQTVKUSxhQUFhLGdHQW9CVixpQkFBaUI7a0hBcEJwQixhQUFhOzsyRkFBYixhQUFhO2tCQUR6QixVQUFVOzswQkFxQkYsTUFBTTsyQkFBQyxpQkFBaUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtPYnNlcnZhYmxlLCB0aHJvd0Vycm9yfSBmcm9tICdyeGpzJztcbmltcG9ydCB7SHR0cENsaWVudCwgSHR0cFBhcmFtcywgSHR0cFJlcXVlc3R9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7Y2F0Y2hFcnJvciwgbWFwLCBzaGFyZVJlcGxheX0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuaW1wb3J0IHtUb2tlblJlc3BvbnNlfSBmcm9tICcuL3Rva2VuLXJlc3BvbnNlJztcbmltcG9ydCB7SnNvbldlYlRva2VufSBmcm9tICcuL2pzb24td2ViLXRva2VuJztcbmltcG9ydCB7RERSX09BVVRIMl9DT05GSUcsIE9BdXRoMkNvbmZpZ30gZnJvbSAnLi9vYXV0aDItY29uZmlnJztcbmltcG9ydCB7T0F1dGgyRXJyb3J9IGZyb20gJy4vb2F1dGgyLWVycm9yJztcbmltcG9ydCB7VHlwZVV0aWxzfSBmcm9tICcuLi91dGlsL3R5cGUtdXRpbHMnO1xuaW1wb3J0IHtTdHJpbmdVdGlsc30gZnJvbSAnLi4vdXRpbC9zdHJpbmctdXRpbHMnO1xuaW1wb3J0IHtMb2dnZXJ9IGZyb20gJy4uL2xvZ2dlci9sb2dnZXIuc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBPQXV0aDJTZXJ2aWNlXG57XG4gICAgcHJpdmF0ZSBzdGF0aWMgU1RPUkFHRV9LRVlfQ0hBTExFTkdFID0gJ2Rkcl9vYXV0aDJfY2hhbGxlbmdlJztcblxuICAgIHByaXZhdGUgc3RhdGljIFNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4gPSAnZGRyX29hdXRoMl9yZWZyZXNoX3Rva2VuJztcblxuICAgIHB1YmxpYyBzdGF0aWMgU1RPUkFHRV9LRVlfUkVUVVJOX1VSTCA9ICdkZHJfb2F1dGgyX3JldHVybl91cmwnO1xuXG4gICAgcHJpdmF0ZSBhY2Nlc3NUb2tlblN0cmluZzogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG5cbiAgICBwcml2YXRlIGFjY2Vzc1Rva2VuOiBKc29uV2ViVG9rZW4gfCBudWxsID0gbnVsbDtcblxuICAgIHByaXZhdGUgcmVhZG9ubHkgUkVGUkVTSF9NQVJHSU5fU0VDT05EUyA9IDYwICogMTA7XG5cbiAgICBwcml2YXRlIHJlZnJlc2hUb2tlblJlcXVlc3QkOiBPYnNlcnZhYmxlPEpzb25XZWJUb2tlbj4gfCBudWxsID0gbnVsbDtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIHJvdXRlOiBBY3RpdmF0ZWRSb3V0ZSxcbiAgICAgICAgcHJpdmF0ZSBodHRwQ2xpZW50OiBIdHRwQ2xpZW50LFxuICAgICAgICBwcml2YXRlIGxvZ2dlclNlcnZpY2U6IExvZ2dlcixcbiAgICAgICAgQEluamVjdChERFJfT0FVVEgyX0NPTkZJRykgcHJpdmF0ZSBjb25maWc6IE9BdXRoMkNvbmZpZ1xuICAgIClcbiAgICB7XG4gICAgfVxuXG4gICAgcHVibGljIHJlZGlyZWN0VG9Mb2dpbigpXG4gICAge1xuICAgICAgICBjb25zdCBjaGFsbGVuZ2UgPSB0aGlzLmNyZWF0ZUNoYWxsZW5nZSgpO1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX0NIQUxMRU5HRSwgY2hhbGxlbmdlKTtcblxuICAgICAgICBjb25zdCBwYXJhbXMgPSBuZXcgSHR0cFBhcmFtcygpXG4gICAgICAgICAgICAuc2V0KCdjbGllbnRfaWQnLCB0aGlzLmNvbmZpZy5jbGllbnRJZClcbiAgICAgICAgICAgIC5zZXQoJ3Jlc3BvbnNlX3R5cGUnLCAnY29kZScpXG4gICAgICAgICAgICAuc2V0KCdyZWRpcmVjdF91cmknLCB0aGlzLmNvbmZpZy5yZWRpcmVjdFVyaSlcbiAgICAgICAgICAgIC5zZXQoJ2NvZGVfY2hhbGxlbmdlJywgY2hhbGxlbmdlKVxuICAgICAgICAgICAgLnNldCgnY29kZV9jaGFsbGVuZ2VfbWV0aG9kJywgJ3BsYWluJyk7XG5cbiAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSB0aGlzLmNvbmZpZy5hdXRob3JpemVVcmkgKyAnPycgKyBwYXJhbXMudG9TdHJpbmcoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaGFuZGxlQ29kZSgpOiBPYnNlcnZhYmxlPEpzb25XZWJUb2tlbj5cbiAgICB7XG4gICAgICAgIGlmICh0aGlzLnJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1NYXAuaGFzKCdlcnJvcicpKSB7XG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IHRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5nZXQoJ2Vycm9yJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcigoKSA9PiBuZXcgT0F1dGgyRXJyb3IoZXJyb3IgPz8gJ1Vua25vd24gZXJyb3InKSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMucm91dGUuc25hcHNob3QucXVlcnlQYXJhbU1hcC5oYXMoJ2NvZGUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRocm93RXJyb3IoKCkgPT4gbmV3IE9BdXRoMkVycm9yKE9BdXRoMkVycm9yLkNPREVfTk9UX0ZPVU5EKSk7XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjb2RlID0gVHlwZVV0aWxzLm5vdE51bGwodGhpcy5yb3V0ZS5zbmFwc2hvdC5xdWVyeVBhcmFtTWFwLmdldCgnY29kZScpKTtcbiAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgICAgICAgLnNldCgnZ3JhbnRfdHlwZScsICdhdXRob3JpemF0aW9uX2NvZGUnKVxuICAgICAgICAgICAgLnNldCgnY29kZScsIGNvZGUpXG4gICAgICAgICAgICAuc2V0KCdyZWRpcmVjdF91cmknLCB0aGlzLmNvbmZpZy5yZWRpcmVjdFVyaSlcbiAgICAgICAgICAgIC5zZXQoJ2NvZGVfdmVyaWZpZXInLCBUeXBlVXRpbHMubm90TnVsbChsb2NhbFN0b3JhZ2UuZ2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX0NIQUxMRU5HRSkpKVxuICAgICAgICAgICAgLnNldCgnY2xpZW50X2lkJywgdGhpcy5jb25maWcuY2xpZW50SWQpO1xuICAgICAgICByZXR1cm4gdGhpcy5odHRwQ2xpZW50LnBvc3Q8VG9rZW5SZXNwb25zZT4odGhpcy5jb25maWcudG9rZW5VcmksIHBhcmFtcykucGlwZShcbiAgICAgICAgICAgIG1hcCh0b2tlblJlc3BvbnNlID0+IHRoaXMucHJvY2Vzc1Rva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSkpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVDaGFsbGVuZ2UoKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIFN0cmluZ1V0aWxzLmNyZWF0ZVJhbmRvbVN0cmluZyg2NCwgJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMTIzNDU2Nzg5MC0uX34nKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFJlZnJlc2hUb2tlbigpOiBzdHJpbmcgfCBudWxsXG4gICAge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oT0F1dGgyU2VydmljZS5TVE9SQUdFX0tFWV9SRUZSRVNIX1RPS0VOKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0QWNjZXNzVG9rZW5TdHJpbmcoKTogc3RyaW5nIHwgbnVsbFxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYWNjZXNzVG9rZW5TdHJpbmc7XG4gICAgfVxuXG4gICAgcHVibGljIGlzQWNjZXNzVG9rZW5FeHBpcmVkKCk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBudWxsID09IHRoaXMuYWNjZXNzVG9rZW5cbiAgICAgICAgICAgIHx8IHRoaXMuYWNjZXNzVG9rZW4uZXhwICogMTAwMCA8IERhdGUubm93KClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgaXNSZWZyZXNoUG9zc2libGVBbmRSZXF1aXJlZChyZXE6IEh0dHBSZXF1ZXN0PGFueT4gfCBudWxsID0gbnVsbCk6IGJvb2xlYW5cbiAgICB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAobnVsbCA9PSByZXEgfHwgIXJlcS51cmwuZW5kc1dpdGgodGhpcy5jb25maWcudG9rZW5VcmkpKVxuICAgICAgICAgICAgJiYgbnVsbCAhPSB0aGlzLmdldFJlZnJlc2hUb2tlbigpXG4gICAgICAgICAgICAmJiAoXG4gICAgICAgICAgICAgICAgbnVsbCA9PSB0aGlzLmFjY2Vzc1Rva2VuXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMuYWNjZXNzVG9rZW4uZXhwIC0gdGhpcy5SRUZSRVNIX01BUkdJTl9TRUNPTkRTKSAqIDEwMDAgPCBEYXRlLm5vdygpXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIHBlcmZvcm1SZWZyZXNoKCk6IE9ic2VydmFibGU8SnNvbldlYlRva2VuPlxuICAgIHtcbiAgICAgICAgaWYgKG51bGwgPT0gdGhpcy5yZWZyZXNoVG9rZW5SZXF1ZXN0JCkge1xuXG4gICAgICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuaW5mbygnUGVyZm9ybWluZyB0b2tlbiByZWZlc2gnKTtcblxuICAgICAgICAgICAgY29uc3QgcGFyYW1zID0gbmV3IEh0dHBQYXJhbXMoKVxuICAgICAgICAgICAgICAgIC5zZXQoJ2dyYW50X3R5cGUnLCAncmVmcmVzaF90b2tlbicpXG4gICAgICAgICAgICAgICAgLnNldCgncmVmcmVzaF90b2tlbicsIFR5cGVVdGlscy5ub3ROdWxsKHRoaXMuZ2V0UmVmcmVzaFRva2VuKCkpKVxuICAgICAgICAgICAgICAgIC5zZXQoJ2NsaWVudF9pZCcsIHRoaXMuY29uZmlnLmNsaWVudElkKTtcblxuICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5SZXF1ZXN0JCA9IHRoaXMuaHR0cENsaWVudC5wb3N0PFRva2VuUmVzcG9uc2U+KHRoaXMuY29uZmlnLnRva2VuVXJpLCBwYXJhbXMpLnBpcGUoXG4gICAgICAgICAgICAgICAgbWFwKHRva2VuUmVzcG9uc2UgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0b2tlbiA9IHRoaXMucHJvY2Vzc1Rva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVmcmVzaFRva2VuUmVxdWVzdCQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW47XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgY2F0Y2hFcnJvcihlcnJvciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWNjZXNzVG9rZW5TdHJpbmcgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oT0F1dGgyU2VydmljZS5TVE9SQUdFX0tFWV9SRUZSRVNIX1RPS0VOKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWZyZXNoVG9rZW5SZXF1ZXN0JCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aHJvd0Vycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICBzaGFyZVJlcGxheSgxKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnJlZnJlc2hUb2tlblJlcXVlc3QkO1xuICAgIH1cblxuICAgIHByaXZhdGUgcHJvY2Vzc1Rva2VuUmVzcG9uc2UodG9rZW5SZXNwb25zZTogVG9rZW5SZXNwb25zZSk6IEpzb25XZWJUb2tlblxuICAgIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnJlbW92ZUl0ZW0oT0F1dGgyU2VydmljZS5TVE9SQUdFX0tFWV9DSEFMTEVOR0UpO1xuICAgICAgICB0aGlzLmFjY2Vzc1Rva2VuU3RyaW5nID0gdG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW47XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW4gPSBKU09OLnBhcnNlKGF0b2IodG9rZW5SZXNwb25zZS5hY2Nlc3NfdG9rZW4uc3BsaXQoJy4nKVsxXSkpO1xuICAgICAgICB0aGlzLmxvZ2dlclNlcnZpY2UuaW5mbygnQWNjZXNzIFRva2VuIEV4cGlyeScsIG5ldyBEYXRlKHRoaXMuYWNjZXNzVG9rZW4hLmV4cCAqIDEwMDApKTtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0oT0F1dGgyU2VydmljZS5TVE9SQUdFX0tFWV9SRUZSRVNIX1RPS0VOLCB0b2tlblJlc3BvbnNlLnJlZnJlc2hfdG9rZW4pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmFjY2Vzc1Rva2VuITtcbiAgICB9XG5cbiAgICBwdWJsaWMgY2xlYXIoKVxuICAgIHtcbiAgICAgICAgdGhpcy5hY2Nlc3NUb2tlbiA9IG51bGw7XG4gICAgICAgIHRoaXMuYWNjZXNzVG9rZW5TdHJpbmcgPSBudWxsO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFRlJFU0hfVE9LRU4pO1xuICAgICAgICBsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFVFVSTl9VUkwpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRSZXR1cm5VcmwodXJsOiBzdHJpbmcpXG4gICAge1xuICAgICAgICBsb2NhbFN0b3JhZ2Uuc2V0SXRlbShPQXV0aDJTZXJ2aWNlLlNUT1JBR0VfS0VZX1JFVFVSTl9VUkwsIHVybCk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldFJldHVyblVybCgpOiBzdHJpbmcgfCBudWxsXG4gICAge1xuICAgICAgICByZXR1cm4gbG9jYWxTdG9yYWdlLmdldEl0ZW0oT0F1dGgyU2VydmljZS5TVE9SQUdFX0tFWV9SRVRVUk5fVVJMKTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,41 @@
1
+ import { HttpErrorResponse } from '@angular/common/http';
2
+ import { throwError } from 'rxjs';
3
+ import { Inject, Injectable } from '@angular/core';
4
+ import { catchError } from 'rxjs/operators';
5
+ import { DDR_OAUTH2_CONFIG } from './oauth2-config';
6
+ import * as i0 from "@angular/core";
7
+ import * as i1 from "./oauth2.service";
8
+ import * as i2 from "@angular/router";
9
+ import * as i3 from "./oauth2-config";
10
+ export class RedirectToOAuth2LoginInterceptor {
11
+ constructor(oAuth2Service, router, oAuth2Config) {
12
+ this.oAuth2Service = oAuth2Service;
13
+ this.router = router;
14
+ this.oAuth2Config = oAuth2Config;
15
+ }
16
+ /**
17
+ * @override
18
+ */
19
+ intercept(req, next) {
20
+ return next.handle(req).pipe(catchError((err) => {
21
+ if (err instanceof HttpErrorResponse) {
22
+ if (err.status === 401) {
23
+ if (!window.location.href.startsWith(this.oAuth2Config.redirectUri)) {
24
+ this.oAuth2Service.setReturnUrl(this.router.routerState.snapshot.url);
25
+ this.oAuth2Service.redirectToLogin();
26
+ }
27
+ }
28
+ }
29
+ return throwError(err);
30
+ }));
31
+ }
32
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: RedirectToOAuth2LoginInterceptor, deps: [{ token: i1.OAuth2Service }, { token: i2.Router }, { token: DDR_OAUTH2_CONFIG }], target: i0.ɵɵFactoryTarget.Injectable }); }
33
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: RedirectToOAuth2LoginInterceptor }); }
34
+ }
35
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: RedirectToOAuth2LoginInterceptor, decorators: [{
36
+ type: Injectable
37
+ }], ctorParameters: () => [{ type: i1.OAuth2Service }, { type: i2.Router }, { type: i3.OAuth2Config, decorators: [{
38
+ type: Inject,
39
+ args: [DDR_OAUTH2_CONFIG]
40
+ }] }] });
41
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicmVkaXJlY3QtdG8tb2F1dGgyLWxvZ2luLWludGVyY2VwdG9yLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvb2F1dGgvcmVkaXJlY3QtdG8tb2F1dGgyLWxvZ2luLWludGVyY2VwdG9yLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLGlCQUFpQixFQUF1RCxNQUFNLHNCQUFzQixDQUFDO0FBQzdHLE9BQU8sRUFBYSxVQUFVLEVBQUMsTUFBTSxNQUFNLENBQUM7QUFDNUMsT0FBTyxFQUFDLE1BQU0sRUFBRSxVQUFVLEVBQUMsTUFBTSxlQUFlLENBQUM7QUFDakQsT0FBTyxFQUFDLFVBQVUsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRzFDLE9BQU8sRUFBQyxpQkFBaUIsRUFBZSxNQUFNLGlCQUFpQixDQUFDOzs7OztBQUdoRSxNQUFNLE9BQU8sZ0NBQWdDO0lBRXpDLFlBQ1ksYUFBNEIsRUFDNUIsTUFBYyxFQUNhLFlBQTBCO1FBRnJELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQzVCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDYSxpQkFBWSxHQUFaLFlBQVksQ0FBYztJQUdqRSxDQUFDO0lBRUQ7O09BRUc7SUFDSSxTQUFTLENBQUMsR0FBcUIsRUFBRSxJQUFpQjtRQUVyRCxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1lBRTVDLElBQUksR0FBRyxZQUFZLGlCQUFpQixFQUFFLENBQUM7Z0JBQ25DLElBQUksR0FBRyxDQUFDLE1BQU0sS0FBSyxHQUFHLEVBQUUsQ0FBQztvQkFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLFdBQVcsQ0FBQyxFQUFFLENBQUM7d0JBQ2xFLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQzt3QkFDdEUsSUFBSSxDQUFDLGFBQWEsQ0FBQyxlQUFlLEVBQUUsQ0FBQztvQkFDekMsQ0FBQztnQkFDTCxDQUFDO1lBQ0wsQ0FBQztZQUVELE9BQU8sVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDUixDQUFDOzhHQTVCUSxnQ0FBZ0MscUVBSzdCLGlCQUFpQjtrSEFMcEIsZ0NBQWdDOzsyRkFBaEMsZ0NBQWdDO2tCQUQ1QyxVQUFVOzswQkFNRixNQUFNOzJCQUFDLGlCQUFpQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7SHR0cEVycm9yUmVzcG9uc2UsIEh0dHBFdmVudCwgSHR0cEhhbmRsZXIsIEh0dHBJbnRlcmNlcHRvciwgSHR0cFJlcXVlc3R9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7T2JzZXJ2YWJsZSwgdGhyb3dFcnJvcn0gZnJvbSAncnhqcyc7XG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge2NhdGNoRXJyb3J9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7Um91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtPQXV0aDJTZXJ2aWNlfSBmcm9tICcuL29hdXRoMi5zZXJ2aWNlJztcbmltcG9ydCB7RERSX09BVVRIMl9DT05GSUcsIE9BdXRoMkNvbmZpZ30gZnJvbSAnLi9vYXV0aDItY29uZmlnJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIFJlZGlyZWN0VG9PQXV0aDJMb2dpbkludGVyY2VwdG9yIGltcGxlbWVudHMgSHR0cEludGVyY2VwdG9yXG57XG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgb0F1dGgyU2VydmljZTogT0F1dGgyU2VydmljZSxcbiAgICAgICAgcHJpdmF0ZSByb3V0ZXI6IFJvdXRlcixcbiAgICAgICAgQEluamVjdChERFJfT0FVVEgyX0NPTkZJRykgcHJpdmF0ZSBvQXV0aDJDb25maWc6IE9BdXRoMkNvbmZpZ1xuICAgIClcbiAgICB7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcHVibGljIGludGVyY2VwdChyZXE6IEh0dHBSZXF1ZXN0PGFueT4sIG5leHQ6IEh0dHBIYW5kbGVyKTogT2JzZXJ2YWJsZTxIdHRwRXZlbnQ8YW55Pj5cbiAgICB7XG4gICAgICAgIHJldHVybiBuZXh0LmhhbmRsZShyZXEpLnBpcGUoY2F0Y2hFcnJvcigoZXJyKSA9PiB7XG5cbiAgICAgICAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICAgICAgICAgIGlmIChlcnIuc3RhdHVzID09PSA0MDEpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF3aW5kb3cubG9jYXRpb24uaHJlZi5zdGFydHNXaXRoKHRoaXMub0F1dGgyQ29uZmlnLnJlZGlyZWN0VXJpKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vQXV0aDJTZXJ2aWNlLnNldFJldHVyblVybCh0aGlzLnJvdXRlci5yb3V0ZXJTdGF0ZS5zbmFwc2hvdC51cmwpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vQXV0aDJTZXJ2aWNlLnJlZGlyZWN0VG9Mb2dpbigpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihlcnIpO1xuICAgICAgICB9KSk7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,60 @@
1
+ import { __decorate } from "tslib";
2
+ import { Directive, EventEmitter, HostListener, Output } from '@angular/core';
3
+ import { Limit } from '../methoddecorator/limit';
4
+ import * as i0 from "@angular/core";
5
+ export class BottomHitDirective {
6
+ constructor() {
7
+ this.offset = 1000;
8
+ this.onWindowBottomHit = new EventEmitter();
9
+ this.onElementBottomHit = new EventEmitter();
10
+ }
11
+ scrolled($event) {
12
+ this.elementScrollEvent($event);
13
+ }
14
+ windowScrolled($event) {
15
+ this.windowScrollEvent($event);
16
+ }
17
+ windowScrollEvent($event) {
18
+ const pageHeight = Math.max(document.body.scrollHeight, document.documentElement.scrollHeight, document.body.offsetHeight, document.documentElement.offsetHeight, document.body.clientHeight, document.documentElement.clientHeight);
19
+ const viewportHeight = document.documentElement.clientHeight;
20
+ const scrollPosition = window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
21
+ const distanceToBottom = pageHeight - (scrollPosition + viewportHeight);
22
+ if (distanceToBottom < this.offset) {
23
+ this.onWindowBottomHit.emit();
24
+ }
25
+ }
26
+ elementScrollEvent($event) {
27
+ const target = $event.target;
28
+ const scrollPosition = target.scrollHeight - target.scrollTop;
29
+ const offsetHeight = target.offsetHeight;
30
+ const isReachingBottom = (scrollPosition - offsetHeight) < this.offset;
31
+ if (isReachingBottom) {
32
+ this.onElementBottomHit.emit();
33
+ }
34
+ }
35
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BottomHitDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive }); }
36
+ static { this.ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "17.3.8", type: BottomHitDirective, selector: "[ddrBottomHit]", outputs: { onWindowBottomHit: "onWindowBottomHit", onElementBottomHit: "onElementBottomHit" }, host: { listeners: { "scroll": "scrolled($event)", "window:scroll": "windowScrolled($event)" } }, ngImport: i0 }); }
37
+ }
38
+ __decorate([
39
+ Limit()
40
+ ], BottomHitDirective.prototype, "scrolled", null);
41
+ __decorate([
42
+ Limit()
43
+ ], BottomHitDirective.prototype, "windowScrolled", null);
44
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: BottomHitDirective, decorators: [{
45
+ type: Directive,
46
+ args: [{
47
+ selector: '[ddrBottomHit]'
48
+ }]
49
+ }], ctorParameters: () => [], propDecorators: { onWindowBottomHit: [{
50
+ type: Output
51
+ }], onElementBottomHit: [{
52
+ type: Output
53
+ }], scrolled: [{
54
+ type: HostListener,
55
+ args: ['scroll', ['$event']]
56
+ }], windowScrolled: [{
57
+ type: HostListener,
58
+ args: ['window:scroll', ['$event']]
59
+ }] } });
60
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYm90dG9tLWhpdC5kaXJlY3RpdmUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2Nyb2xsL2JvdHRvbS1oaXQuZGlyZWN0aXZlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUMsU0FBUyxFQUFFLFlBQVksRUFBRSxZQUFZLEVBQUUsTUFBTSxFQUFDLE1BQU0sZUFBZSxDQUFDO0FBQzVFLE9BQU8sRUFBQyxLQUFLLEVBQUMsTUFBTSwwQkFBMEIsQ0FBQzs7QUFLL0MsTUFBTSxPQUFPLGtCQUFrQjtJQVUzQjtRQVJPLFdBQU0sR0FBRyxJQUFJLENBQUM7UUFHZCxzQkFBaUIsR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBR3RDLHVCQUFrQixHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7SUFJaEQsQ0FBQztJQUlNLFFBQVEsQ0FBQyxNQUFhO1FBRXpCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNwQyxDQUFDO0lBSU0sY0FBYyxDQUFDLE1BQWE7UUFFL0IsSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sQ0FBQyxDQUFDO0lBQ25DLENBQUM7SUFFUyxpQkFBaUIsQ0FBQyxNQUFhO1FBRXJDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQ3ZCLFFBQVEsQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUNqRSxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksRUFBRSxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksRUFDakUsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLEVBQUUsUUFBUSxDQUFDLGVBQWUsQ0FBQyxZQUFZLENBQ3BFLENBQUM7UUFDRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsZUFBZSxDQUFDLFlBQVksQ0FBQztRQUM3RCxNQUFNLGNBQWMsR0FBRyxNQUFNLENBQUMsV0FBVyxJQUFJLFFBQVEsQ0FBQyxlQUFlLENBQUMsU0FBUyxJQUFJLFFBQVEsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLENBQUMsQ0FBQztRQUNoSCxNQUFNLGdCQUFnQixHQUFHLFVBQVUsR0FBRyxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUMsQ0FBQztRQUN4RSxJQUFJLGdCQUFnQixHQUFHLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUNqQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDbEMsQ0FBQztJQUNMLENBQUM7SUFFUyxrQkFBa0IsQ0FBQyxNQUFhO1FBRXRDLE1BQU0sTUFBTSxHQUFHLE1BQU0sQ0FBQyxNQUFxQixDQUFDO1FBQzVDLE1BQU0sY0FBYyxHQUFHLE1BQU0sQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQztRQUM5RCxNQUFNLFlBQVksR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDO1FBQ3pDLE1BQU0sZ0JBQWdCLEdBQUcsQ0FBQyxjQUFjLEdBQUcsWUFBWSxDQUFDLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQztRQUN2RSxJQUFJLGdCQUFnQixFQUFFLENBQUM7WUFDbkIsSUFBSSxDQUFDLGtCQUFrQixDQUFDLElBQUksRUFBRSxDQUFDO1FBQ25DLENBQUM7SUFDTCxDQUFDOzhHQXBEUSxrQkFBa0I7a0dBQWxCLGtCQUFrQjs7QUFnQnBCO0lBRE4sS0FBSyxFQUFFO2tEQUlQO0FBSU07SUFETixLQUFLLEVBQUU7d0RBSVA7MkZBMUJRLGtCQUFrQjtrQkFIOUIsU0FBUzttQkFBQztvQkFDUCxRQUFRLEVBQUUsZ0JBQWdCO2lCQUM3Qjt3REFNVSxpQkFBaUI7c0JBRHZCLE1BQU07Z0JBSUMsa0JBQWtCO3NCQUR6QixNQUFNO2dCQVNBLFFBQVE7c0JBRmQsWUFBWTt1QkFBQyxRQUFRLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBUzNCLGNBQWM7c0JBRnBCLFlBQVk7dUJBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtEaXJlY3RpdmUsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBPdXRwdXR9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtMaW1pdH0gZnJvbSAnLi4vbWV0aG9kZGVjb3JhdG9yL2xpbWl0JztcblxuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbZGRyQm90dG9tSGl0XSdcbn0pXG5leHBvcnQgY2xhc3MgQm90dG9tSGl0RGlyZWN0aXZlXG57XG4gICAgcHVibGljIG9mZnNldCA9IDEwMDA7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwdWJsaWMgb25XaW5kb3dCb3R0b21IaXQgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBAT3V0cHV0KClcbiAgICBwcml2YXRlIG9uRWxlbWVudEJvdHRvbUhpdCA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcblxuICAgIGNvbnN0cnVjdG9yKClcbiAgICB7XG4gICAgfVxuXG4gICAgQEhvc3RMaXN0ZW5lcignc2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgICBATGltaXQoKVxuICAgIHB1YmxpYyBzY3JvbGxlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy5lbGVtZW50U2Nyb2xsRXZlbnQoJGV2ZW50KTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCd3aW5kb3c6c2Nyb2xsJywgWyckZXZlbnQnXSlcbiAgICBATGltaXQoKVxuICAgIHB1YmxpYyB3aW5kb3dTY3JvbGxlZCgkZXZlbnQ6IEV2ZW50KTogdm9pZFxuICAgIHtcbiAgICAgICAgdGhpcy53aW5kb3dTY3JvbGxFdmVudCgkZXZlbnQpO1xuICAgIH1cblxuICAgIHByb3RlY3RlZCB3aW5kb3dTY3JvbGxFdmVudCgkZXZlbnQ6IEV2ZW50KTogdm9pZFxuICAgIHtcbiAgICAgICAgY29uc3QgcGFnZUhlaWdodCA9IE1hdGgubWF4KFxuICAgICAgICAgICAgZG9jdW1lbnQuYm9keS5zY3JvbGxIZWlnaHQsIGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxIZWlnaHQsXG4gICAgICAgICAgICBkb2N1bWVudC5ib2R5Lm9mZnNldEhlaWdodCwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50Lm9mZnNldEhlaWdodCxcbiAgICAgICAgICAgIGRvY3VtZW50LmJvZHkuY2xpZW50SGVpZ2h0LCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuY2xpZW50SGVpZ2h0XG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudEhlaWdodDtcbiAgICAgICAgY29uc3Qgc2Nyb2xsUG9zaXRpb24gPSB3aW5kb3cucGFnZVlPZmZzZXQgfHwgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnNjcm9sbFRvcCB8fCBkb2N1bWVudC5ib2R5LnNjcm9sbFRvcCB8fCAwO1xuICAgICAgICBjb25zdCBkaXN0YW5jZVRvQm90dG9tID0gcGFnZUhlaWdodCAtIChzY3JvbGxQb3NpdGlvbiArIHZpZXdwb3J0SGVpZ2h0KTtcbiAgICAgICAgaWYgKGRpc3RhbmNlVG9Cb3R0b20gPCB0aGlzLm9mZnNldCkge1xuICAgICAgICAgICAgdGhpcy5vbldpbmRvd0JvdHRvbUhpdC5lbWl0KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZWxlbWVudFNjcm9sbEV2ZW50KCRldmVudDogRXZlbnQpOiB2b2lkXG4gICAge1xuICAgICAgICBjb25zdCB0YXJnZXQgPSAkZXZlbnQudGFyZ2V0IGFzIEhUTUxFbGVtZW50O1xuICAgICAgICBjb25zdCBzY3JvbGxQb3NpdGlvbiA9IHRhcmdldC5zY3JvbGxIZWlnaHQgLSB0YXJnZXQuc2Nyb2xsVG9wO1xuICAgICAgICBjb25zdCBvZmZzZXRIZWlnaHQgPSB0YXJnZXQub2Zmc2V0SGVpZ2h0O1xuICAgICAgICBjb25zdCBpc1JlYWNoaW5nQm90dG9tID0gKHNjcm9sbFBvc2l0aW9uIC0gb2Zmc2V0SGVpZ2h0KSA8IHRoaXMub2Zmc2V0O1xuICAgICAgICBpZiAoaXNSZWFjaGluZ0JvdHRvbSkge1xuICAgICAgICAgICAgdGhpcy5vbkVsZW1lbnRCb3R0b21IaXQuZW1pdCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
@@ -0,0 +1,38 @@
1
+ import { NavigationStart } from '@angular/router';
2
+ import { Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "@angular/router";
5
+ import * as i2 from "@angular/common";
6
+ export class ScrollService {
7
+ constructor(router, viewportScroller) {
8
+ this.router = router;
9
+ this.viewportScroller = viewportScroller;
10
+ this.scrollPositionMap = new Map();
11
+ this.router.events
12
+ .subscribe(e => {
13
+ if (e instanceof NavigationStart) {
14
+ this.scrollPositionMap.set(this.router.url, this.viewportScroller.getScrollPosition());
15
+ }
16
+ });
17
+ }
18
+ restore() {
19
+ const url = this.router.url;
20
+ if (this.scrollPositionMap.has(url)) {
21
+ /* Restore after timeout so rendering was completed */
22
+ setTimeout(() => {
23
+ let scrollPosition = this.scrollPositionMap.get(url);
24
+ if (null != scrollPosition)
25
+ this.viewportScroller.scrollToPosition(scrollPosition);
26
+ }, 1);
27
+ }
28
+ }
29
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: ScrollService, deps: [{ token: i1.Router }, { token: i2.ViewportScroller }], target: i0.ɵɵFactoryTarget.Injectable }); }
30
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: ScrollService, providedIn: 'root' }); }
31
+ }
32
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: ScrollService, decorators: [{
33
+ type: Injectable,
34
+ args: [{
35
+ providedIn: 'root'
36
+ }]
37
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i2.ViewportScroller }] });
38
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2Nyb2xsLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvc2Nyb2xsL3Njcm9sbC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxlQUFlLEVBQVMsTUFBTSxpQkFBaUIsQ0FBQztBQUV4RCxPQUFPLEVBQUMsVUFBVSxFQUFDLE1BQU0sZUFBZSxDQUFDOzs7O0FBS3pDLE1BQU0sT0FBTyxhQUFhO0lBSXRCLFlBQW9CLE1BQWMsRUFBVSxnQkFBa0M7UUFBMUQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtRQUFVLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBa0I7UUFGdEUsc0JBQWlCLEdBQWtDLElBQUksR0FBRyxFQUE0QixDQUFDO1FBSTNGLElBQUksQ0FBQyxNQUFNLENBQUMsTUFBTTthQUNiLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUNYLElBQUksQ0FBQyxZQUFZLGVBQWUsRUFBRSxDQUFDO2dCQUMvQixJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUM7WUFDM0YsQ0FBQztRQUNMLENBQUMsQ0FBQyxDQUFDO0lBQ1gsQ0FBQztJQUVNLE9BQU87UUFFVixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQztRQUM1QixJQUFJLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQztZQUNsQyxzREFBc0Q7WUFDdEQsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNyRCxJQUFJLElBQUksSUFBSSxjQUFjO29CQUFFLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUN2RixDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFDVixDQUFDO0lBQ0wsQ0FBQzs4R0F4QlEsYUFBYTtrSEFBYixhQUFhLGNBRlYsTUFBTTs7MkZBRVQsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDUixVQUFVLEVBQUUsTUFBTTtpQkFDckIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge05hdmlnYXRpb25TdGFydCwgUm91dGVyfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtWaWV3cG9ydFNjcm9sbGVyfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xuaW1wb3J0IHtJbmplY3RhYmxlfSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuQEluamVjdGFibGUoe1xuICAgIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBTY3JvbGxTZXJ2aWNlXG57XG4gICAgcHJpdmF0ZSBzY3JvbGxQb3NpdGlvbk1hcDogTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyXT4gPSBuZXcgTWFwPHN0cmluZywgW251bWJlciwgbnVtYmVyXT4oKTtcblxuICAgIGNvbnN0cnVjdG9yKHByaXZhdGUgcm91dGVyOiBSb3V0ZXIsIHByaXZhdGUgdmlld3BvcnRTY3JvbGxlcjogVmlld3BvcnRTY3JvbGxlcilcbiAgICB7XG4gICAgICAgIHRoaXMucm91dGVyLmV2ZW50c1xuICAgICAgICAgICAgLnN1YnNjcmliZShlID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZSBpbnN0YW5jZW9mIE5hdmlnYXRpb25TdGFydCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjcm9sbFBvc2l0aW9uTWFwLnNldCh0aGlzLnJvdXRlci51cmwsIHRoaXMudmlld3BvcnRTY3JvbGxlci5nZXRTY3JvbGxQb3NpdGlvbigpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgcmVzdG9yZSgpOiB2b2lkXG4gICAge1xuICAgICAgICBjb25zdCB1cmwgPSB0aGlzLnJvdXRlci51cmw7XG4gICAgICAgIGlmICh0aGlzLnNjcm9sbFBvc2l0aW9uTWFwLmhhcyh1cmwpKSB7XG4gICAgICAgICAgICAvKiBSZXN0b3JlIGFmdGVyIHRpbWVvdXQgc28gcmVuZGVyaW5nIHdhcyBjb21wbGV0ZWQgKi9cbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIGxldCBzY3JvbGxQb3NpdGlvbiA9IHRoaXMuc2Nyb2xsUG9zaXRpb25NYXAuZ2V0KHVybCk7XG4gICAgICAgICAgICAgICAgaWYgKG51bGwgIT0gc2Nyb2xsUG9zaXRpb24pIHRoaXMudmlld3BvcnRTY3JvbGxlci5zY3JvbGxUb1Bvc2l0aW9uKHNjcm9sbFBvc2l0aW9uKTtcbiAgICAgICAgICAgIH0sIDEpO1xuICAgICAgICB9XG4gICAgfVxufVxuIl19
@@ -0,0 +1,53 @@
1
+ import { DDR_STORAGE_PREFIX, StorageService } from './storage.service';
2
+ import { Inject, Injectable } from '@angular/core';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../logger/logger.service";
5
+ export class LocalStorageService extends StorageService {
6
+ constructor(storagePrefix, logger) {
7
+ super();
8
+ this.storagePrefix = storagePrefix;
9
+ this.logger = logger;
10
+ }
11
+ /**
12
+ * @override
13
+ */
14
+ retrieve(key, defaultValue = null) {
15
+ let fullKey = this.getFullKey(key);
16
+ let valueJson = localStorage.getItem(fullKey);
17
+ if (null == valueJson) {
18
+ return defaultValue;
19
+ }
20
+ try {
21
+ return JSON.parse(valueJson);
22
+ }
23
+ catch (e) {
24
+ this.logger.warn('Could not parse json value', valueJson, e);
25
+ localStorage.removeItem(fullKey);
26
+ return null;
27
+ }
28
+ }
29
+ /**
30
+ * @override
31
+ */
32
+ store(key, value) {
33
+ localStorage.setItem(this.getFullKey(key), JSON.stringify(value));
34
+ }
35
+ /**
36
+ * @override
37
+ */
38
+ remove(key) {
39
+ localStorage.removeItem(this.getFullKey(key));
40
+ }
41
+ getFullKey(key) {
42
+ return this.storagePrefix + '.' + key;
43
+ }
44
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: LocalStorageService, deps: [{ token: DDR_STORAGE_PREFIX }, { token: i1.Logger }], target: i0.ɵɵFactoryTarget.Injectable }); }
45
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: LocalStorageService }); }
46
+ }
47
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.8", ngImport: i0, type: LocalStorageService, decorators: [{
48
+ type: Injectable
49
+ }], ctorParameters: () => [{ type: undefined, decorators: [{
50
+ type: Inject,
51
+ args: [DDR_STORAGE_PREFIX]
52
+ }] }, { type: i1.Logger }] });
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9jYWwtc3RvcmFnZS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3N0b3JhZ2UvbG9jYWwtc3RvcmFnZS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBQyxrQkFBa0IsRUFBRSxjQUFjLEVBQUMsTUFBTSxtQkFBbUIsQ0FBQztBQUNyRSxPQUFPLEVBQUMsTUFBTSxFQUFFLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQzs7O0FBSWpELE1BQU0sT0FBTyxtQkFBb0IsU0FBUSxjQUFjO0lBRW5ELFlBQzBDLGFBQXFCLEVBQ2pELE1BQWM7UUFHeEIsS0FBSyxFQUFFLENBQUM7UUFKOEIsa0JBQWEsR0FBYixhQUFhLENBQVE7UUFDakQsV0FBTSxHQUFOLE1BQU0sQ0FBUTtJQUk1QixDQUFDO0lBRUQ7O09BRUc7SUFDSSxRQUFRLENBQUksR0FBVyxFQUFFLGVBQXlCLElBQUk7UUFFekQsSUFBSSxPQUFPLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQztRQUNuQyxJQUFJLFNBQVMsR0FBRyxZQUFZLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQzlDLElBQUksSUFBSSxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sWUFBWSxDQUFDO1FBQ3hCLENBQUM7UUFFRCxJQUFJLENBQUM7WUFDRCxPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDakMsQ0FBQztRQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUM7WUFDVCxJQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyw0QkFBNEIsRUFBRSxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7WUFDN0QsWUFBWSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQztZQUNqQyxPQUFPLElBQUksQ0FBQztRQUNoQixDQUFDO0lBQ0wsQ0FBQztJQUVEOztPQUVHO0lBQ0ksS0FBSyxDQUFJLEdBQVcsRUFBRSxLQUFRO1FBRWpDLFlBQVksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7SUFDdEUsQ0FBQztJQUVEOztPQUVHO0lBQ0ksTUFBTSxDQUFDLEdBQVc7UUFFckIsWUFBWSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDbEQsQ0FBQztJQUVTLFVBQVUsQ0FBQyxHQUFXO1FBRTVCLE9BQU8sSUFBSSxDQUFDLGFBQWEsR0FBRyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBQzFDLENBQUM7OEdBakRRLG1CQUFtQixrQkFHaEIsa0JBQWtCO2tIQUhyQixtQkFBbUI7OzJGQUFuQixtQkFBbUI7a0JBRC9CLFVBQVU7OzBCQUlGLE1BQU07MkJBQUMsa0JBQWtCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtERFJfU1RPUkFHRV9QUkVGSVgsIFN0b3JhZ2VTZXJ2aWNlfSBmcm9tICcuL3N0b3JhZ2Uuc2VydmljZSc7XG5pbXBvcnQge0luamVjdCwgSW5qZWN0YWJsZX0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQge0xvZ2dlcn0gZnJvbSAnLi4vbG9nZ2VyL2xvZ2dlci5zZXJ2aWNlJztcblxuQEluamVjdGFibGUoKVxuZXhwb3J0IGNsYXNzIExvY2FsU3RvcmFnZVNlcnZpY2UgZXh0ZW5kcyBTdG9yYWdlU2VydmljZVxue1xuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBASW5qZWN0KEREUl9TVE9SQUdFX1BSRUZJWCkgcHJvdGVjdGVkIHN0b3JhZ2VQcmVmaXg6IHN0cmluZyxcbiAgICAgICAgcHJvdGVjdGVkIGxvZ2dlcjogTG9nZ2VyXG4gICAgKVxuICAgIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgcmV0cmlldmU8VD4oa2V5OiBzdHJpbmcsIGRlZmF1bHRWYWx1ZTogVCB8IG51bGwgPSBudWxsKTogVCB8IG51bGxcbiAgICB7XG4gICAgICAgIGxldCBmdWxsS2V5ID0gdGhpcy5nZXRGdWxsS2V5KGtleSk7XG4gICAgICAgIGxldCB2YWx1ZUpzb24gPSBsb2NhbFN0b3JhZ2UuZ2V0SXRlbShmdWxsS2V5KTtcbiAgICAgICAgaWYgKG51bGwgPT0gdmFsdWVKc29uKSB7XG4gICAgICAgICAgICByZXR1cm4gZGVmYXVsdFZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBKU09OLnBhcnNlKHZhbHVlSnNvbik7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMubG9nZ2VyLndhcm4oJ0NvdWxkIG5vdCBwYXJzZSBqc29uIHZhbHVlJywgdmFsdWVKc29uLCBlKTtcbiAgICAgICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKGZ1bGxLZXkpO1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAb3ZlcnJpZGVcbiAgICAgKi9cbiAgICBwdWJsaWMgc3RvcmU8VD4oa2V5OiBzdHJpbmcsIHZhbHVlOiBUKTogdm9pZFxuICAgIHtcbiAgICAgICAgbG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5nZXRGdWxsS2V5KGtleSksIEpTT04uc3RyaW5naWZ5KHZhbHVlKSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogQG92ZXJyaWRlXG4gICAgICovXG4gICAgcHVibGljIHJlbW92ZShrZXk6IHN0cmluZylcbiAgICB7XG4gICAgICAgIGxvY2FsU3RvcmFnZS5yZW1vdmVJdGVtKHRoaXMuZ2V0RnVsbEtleShrZXkpKTtcbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgZ2V0RnVsbEtleShrZXk6IHN0cmluZyk6IHN0cmluZ1xuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZVByZWZpeCArICcuJyArIGtleTtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,27 @@
1
+ import { ObjectUtils } from './object-utils';
2
+ export class CollectionUtils {
3
+ /**
4
+ * Maps an array into a Map by a specific property which should be unique.
5
+ */
6
+ static mapByProperty(entries, property) {
7
+ const map = new Map();
8
+ for (const entry of entries) {
9
+ map.set(ObjectUtils.getProperty(entry, property), entry);
10
+ }
11
+ return map;
12
+ }
13
+ /**
14
+ * Maps an array into a Map by a specified property and aggregates them into an array.
15
+ */
16
+ static mapArrayByProperty(entries, property) {
17
+ const map = new Map();
18
+ for (const entry of entries) {
19
+ const value = ObjectUtils.getProperty(entry, property);
20
+ const existingEntries = map.get(value) ?? [];
21
+ existingEntries.push(entry);
22
+ map.set(value, existingEntries);
23
+ }
24
+ return map;
25
+ }
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGVjdGlvbi11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL2NvbGxlY3Rpb24tdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFDLFdBQVcsRUFBQyxNQUFNLGdCQUFnQixDQUFDO0FBRTNDLE1BQU0sT0FBTyxlQUFlO0lBRXhCOztPQUVHO0lBQ0ksTUFBTSxDQUFDLGFBQWEsQ0FBc0MsT0FBaUIsRUFBRSxRQUFXO1FBRTNGLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFVLENBQUM7UUFDOUIsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixHQUFHLENBQUMsR0FBRyxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsS0FBSyxFQUFFLFFBQVEsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQzdELENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7SUFFRDs7T0FFRztJQUNJLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBc0MsT0FBaUIsRUFBRSxRQUFXO1FBRWhHLE1BQU0sR0FBRyxHQUFHLElBQUksR0FBRyxFQUFZLENBQUM7UUFDaEMsS0FBSyxNQUFNLEtBQUssSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUMxQixNQUFNLEtBQUssR0FBRyxXQUFXLENBQUMsV0FBVyxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsQ0FBQztZQUN2RCxNQUFNLGVBQWUsR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUM1QyxlQUFlLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO1lBQzNCLEdBQUcsQ0FBQyxHQUFHLENBQUMsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFBO1FBQ25DLENBQUM7UUFFRCxPQUFPLEdBQUcsQ0FBQztJQUNmLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7T2JqZWN0VXRpbHN9IGZyb20gJy4vb2JqZWN0LXV0aWxzJztcblxuZXhwb3J0IGNsYXNzIENvbGxlY3Rpb25VdGlsc1xue1xuICAgIC8qKlxuICAgICAqIE1hcHMgYW4gYXJyYXkgaW50byBhIE1hcCBieSBhIHNwZWNpZmljIHByb3BlcnR5IHdoaWNoIHNob3VsZCBiZSB1bmlxdWUuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBtYXBCeVByb3BlcnR5PFYgZXh0ZW5kcyBvYmplY3QsIEsgZXh0ZW5kcyBrZXlvZiBWPihlbnRyaWVzOiBBcnJheTxWPiwgcHJvcGVydHk6IEspOiBNYXA8YW55LCBWPlxuICAgIHtcbiAgICAgICAgY29uc3QgbWFwID0gbmV3IE1hcDxhbnksIFY+KCk7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgbWFwLnNldChPYmplY3RVdGlscy5nZXRQcm9wZXJ0eShlbnRyeSwgcHJvcGVydHkpLCBlbnRyeSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbWFwO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIE1hcHMgYW4gYXJyYXkgaW50byBhIE1hcCBieSBhIHNwZWNpZmllZCBwcm9wZXJ0eSBhbmQgYWdncmVnYXRlcyB0aGVtIGludG8gYW4gYXJyYXkuXG4gICAgICovXG4gICAgcHVibGljIHN0YXRpYyBtYXBBcnJheUJ5UHJvcGVydHk8ViBleHRlbmRzIG9iamVjdCwgSyBleHRlbmRzIGtleW9mIFY+KGVudHJpZXM6IEFycmF5PFY+LCBwcm9wZXJ0eTogSyk6IE1hcDxhbnksIFZbXT5cbiAgICB7XG4gICAgICAgIGNvbnN0IG1hcCA9IG5ldyBNYXA8YW55LCBWW10+KCk7XG4gICAgICAgIGZvciAoY29uc3QgZW50cnkgb2YgZW50cmllcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBPYmplY3RVdGlscy5nZXRQcm9wZXJ0eShlbnRyeSwgcHJvcGVydHkpO1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmdFbnRyaWVzID0gbWFwLmdldCh2YWx1ZSkgPz8gW11cbiAgICAgICAgICAgIGV4aXN0aW5nRW50cmllcy5wdXNoKGVudHJ5KVxuICAgICAgICAgICAgbWFwLnNldCh2YWx1ZSwgZXhpc3RpbmdFbnRyaWVzKVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1hcDtcbiAgICB9XG59XG4iXX0=
@@ -7,4 +7,4 @@ export class NumberUtils {
7
7
  return target;
8
8
  }
9
9
  }
10
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWwvbnVtYmVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBRWIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQWE7UUFFekMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxNQUFNLEdBQUcsS0FBSyxFQUFFO1lBQ25CLE1BQU0sSUFBSSxDQUFDLENBQUM7U0FDZjtRQUVELE9BQU8sTUFBTSxDQUFDO0lBQ2xCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBOdW1iZXJVdGlsc1xue1xuICAgIHB1YmxpYyBzdGF0aWMgZ2V0TmV4dFBvd2VyT2ZUd28odmFsdWU6IG51bWJlcik6IG51bWJlclxuICAgIHtcbiAgICAgICAgbGV0IHRhcmdldCA9IDI7XG4gICAgICAgIHdoaWxlICh0YXJnZXQgPCB2YWx1ZSkge1xuICAgICAgICAgICAgdGFyZ2V0ICo9IDI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH1cbn1cbiJdfQ==
10
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibnVtYmVyLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWwvbnVtYmVyLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBRWIsTUFBTSxDQUFDLGlCQUFpQixDQUFDLEtBQWE7UUFFekMsSUFBSSxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ2YsT0FBTyxNQUFNLEdBQUcsS0FBSyxFQUFFLENBQUM7WUFDcEIsTUFBTSxJQUFJLENBQUMsQ0FBQztRQUNoQixDQUFDO1FBRUQsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIE51bWJlclV0aWxzXG57XG4gICAgcHVibGljIHN0YXRpYyBnZXROZXh0UG93ZXJPZlR3byh2YWx1ZTogbnVtYmVyKTogbnVtYmVyXG4gICAge1xuICAgICAgICBsZXQgdGFyZ2V0ID0gMjtcbiAgICAgICAgd2hpbGUgKHRhcmdldCA8IHZhbHVlKSB7XG4gICAgICAgICAgICB0YXJnZXQgKj0gMjtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0YXJnZXQ7XG4gICAgfVxufVxuIl19
@@ -0,0 +1,35 @@
1
+ export class StringUtils {
2
+ static capitalizeFirstLetter(text) {
3
+ return text.charAt(0).toUpperCase() + text.slice(1);
4
+ }
5
+ static stripTrailingSlash(text) {
6
+ const lastChar = text.charAt(text.length - 1);
7
+ if ('/' === lastChar) {
8
+ return text.slice(0, text.length - 1);
9
+ }
10
+ return text;
11
+ }
12
+ static updateUrlParameter(uri, key, value) {
13
+ // remove the hash part before operating on the uri
14
+ const i = uri.indexOf('#');
15
+ const hash = i === -1 ? '' : uri.substr(i);
16
+ uri = i === -1 ? uri : uri.substr(0, i);
17
+ const re = new RegExp('([?&])' + key + '=.*?(&|$)', 'i');
18
+ const separator = uri.indexOf('?') !== -1 ? '&' : '?';
19
+ if (uri.match(re)) {
20
+ uri = uri.replace(re, '$1' + key + '=' + value + '$2');
21
+ }
22
+ else {
23
+ uri = uri + separator + key + '=' + value;
24
+ }
25
+ return uri + hash; // finally append the hash as well
26
+ }
27
+ static createRandomString(lengthOfCode, possible) {
28
+ let text = '';
29
+ for (let i = 0; i < lengthOfCode; i++) {
30
+ text += possible.charAt(Math.floor(Math.random() * possible.length));
31
+ }
32
+ return text;
33
+ }
34
+ }
35
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RyaW5nLXV0aWxzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL3V0aWwvc3RyaW5nLXV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxXQUFXO0lBRWIsTUFBTSxDQUFDLHFCQUFxQixDQUFDLElBQVk7UUFFNUMsT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxJQUFZO1FBRXpDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUM5QyxJQUFJLEdBQUcsS0FBSyxRQUFRLEVBQUUsQ0FBQztZQUNuQixPQUFPLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDMUMsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFTSxNQUFNLENBQUMsa0JBQWtCLENBQUMsR0FBVyxFQUFFLEdBQVcsRUFBRSxLQUFhO1FBRXBFLG1EQUFtRDtRQUNuRCxNQUFNLENBQUMsR0FBRyxHQUFHLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQzNCLE1BQU0sSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDO1FBQzNDLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7UUFFeEMsTUFBTSxFQUFFLEdBQUcsSUFBSSxNQUFNLENBQUMsUUFBUSxHQUFHLEdBQUcsR0FBRyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDekQsTUFBTSxTQUFTLEdBQUcsR0FBRyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUM7UUFDdEQsSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxFQUFFLENBQUM7WUFDaEIsR0FBRyxHQUFHLEdBQUcsQ0FBQyxPQUFPLENBQUMsRUFBRSxFQUFFLElBQUksR0FBRyxHQUFHLEdBQUcsR0FBRyxHQUFHLEtBQUssR0FBRyxJQUFJLENBQUMsQ0FBQztRQUMzRCxDQUFDO2FBQU0sQ0FBQztZQUNKLEdBQUcsR0FBRyxHQUFHLEdBQUcsU0FBUyxHQUFHLEdBQUcsR0FBRyxHQUFHLEdBQUcsS0FBSyxDQUFDO1FBQzlDLENBQUM7UUFDRCxPQUFPLEdBQUcsR0FBRyxJQUFJLENBQUMsQ0FBRSxrQ0FBa0M7SUFDMUQsQ0FBQztJQUVNLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxZQUFvQixFQUFFLFFBQWdCO1FBRW5FLElBQUksSUFBSSxHQUFHLEVBQUUsQ0FBQztRQUNkLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxZQUFZLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQztZQUNwQyxJQUFJLElBQUksUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsR0FBRyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQztRQUN6RSxDQUFDO1FBQ0QsT0FBTyxJQUFJLENBQUM7SUFDaEIsQ0FBQztDQUNKIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFN0cmluZ1V0aWxzXG57XG4gICAgcHVibGljIHN0YXRpYyBjYXBpdGFsaXplRmlyc3RMZXR0ZXIodGV4dDogc3RyaW5nKTogc3RyaW5nXG4gICAge1xuICAgICAgICByZXR1cm4gdGV4dC5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHRleHQuc2xpY2UoMSk7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyBzdHJpcFRyYWlsaW5nU2xhc2godGV4dDogc3RyaW5nKTogc3RyaW5nXG4gICAge1xuICAgICAgICBjb25zdCBsYXN0Q2hhciA9IHRleHQuY2hhckF0KHRleHQubGVuZ3RoIC0gMSk7XG4gICAgICAgIGlmICgnLycgPT09IGxhc3RDaGFyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC5zbGljZSgwLCB0ZXh0Lmxlbmd0aCAtIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuXG4gICAgcHVibGljIHN0YXRpYyB1cGRhdGVVcmxQYXJhbWV0ZXIodXJpOiBzdHJpbmcsIGtleTogc3RyaW5nLCB2YWx1ZTogc3RyaW5nKTogc3RyaW5nXG4gICAge1xuICAgICAgICAvLyByZW1vdmUgdGhlIGhhc2ggcGFydCBiZWZvcmUgb3BlcmF0aW5nIG9uIHRoZSB1cmlcbiAgICAgICAgY29uc3QgaSA9IHVyaS5pbmRleE9mKCcjJyk7XG4gICAgICAgIGNvbnN0IGhhc2ggPSBpID09PSAtMSA/ICcnIDogdXJpLnN1YnN0cihpKTtcbiAgICAgICAgdXJpID0gaSA9PT0gLTEgPyB1cmkgOiB1cmkuc3Vic3RyKDAsIGkpO1xuXG4gICAgICAgIGNvbnN0IHJlID0gbmV3IFJlZ0V4cCgnKFs/Jl0pJyArIGtleSArICc9Lio/KCZ8JCknLCAnaScpO1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSB1cmkuaW5kZXhPZignPycpICE9PSAtMSA/ICcmJyA6ICc/JztcbiAgICAgICAgaWYgKHVyaS5tYXRjaChyZSkpIHtcbiAgICAgICAgICAgIHVyaSA9IHVyaS5yZXBsYWNlKHJlLCAnJDEnICsga2V5ICsgJz0nICsgdmFsdWUgKyAnJDInKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHVyaSA9IHVyaSArIHNlcGFyYXRvciArIGtleSArICc9JyArIHZhbHVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB1cmkgKyBoYXNoOyAgLy8gZmluYWxseSBhcHBlbmQgdGhlIGhhc2ggYXMgd2VsbFxuICAgIH1cblxuICAgIHB1YmxpYyBzdGF0aWMgY3JlYXRlUmFuZG9tU3RyaW5nKGxlbmd0aE9mQ29kZTogbnVtYmVyLCBwb3NzaWJsZTogc3RyaW5nKTogc3RyaW5nXG4gICAge1xuICAgICAgICBsZXQgdGV4dCA9ICcnO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxlbmd0aE9mQ29kZTsgaSsrKSB7XG4gICAgICAgICAgICB0ZXh0ICs9IHBvc3NpYmxlLmNoYXJBdChNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBwb3NzaWJsZS5sZW5ndGgpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG59XG4iXX0=
@@ -0,0 +1,9 @@
1
+ export class TypeUtils {
2
+ static notNull(value, message = 'Value must not be null') {
3
+ if (null == value) {
4
+ throw new Error(message);
5
+ }
6
+ return value;
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZS11dGlscy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy91dGlsL3R5cGUtdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFNBQVM7SUFFWCxNQUFNLENBQUMsT0FBTyxDQUFJLEtBQTJCLEVBQUUsVUFBa0Isd0JBQXdCO1FBRTVGLElBQUksSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE1BQU0sSUFBSSxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDN0IsQ0FBQztRQUVELE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBUeXBlVXRpbHNcbntcbiAgICBwdWJsaWMgc3RhdGljIG5vdE51bGw8VD4odmFsdWU6IFQgfCBudWxsIHwgdW5kZWZpbmVkLCBtZXNzYWdlOiBzdHJpbmcgPSAnVmFsdWUgbXVzdCBub3QgYmUgbnVsbCcpOiBUXG4gICAge1xuICAgICAgICBpZiAobnVsbCA9PSB2YWx1ZSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1lc3NhZ2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH1cbn1cbiJdfQ==