@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.
- package/esm2022/src/cookie/cookie.service.mjs +135 -0
- package/esm2022/src/ddr-extensions.module.mjs +67 -0
- package/esm2022/src/http/redirect-to-login-interceptor.service.mjs +35 -0
- package/{esm2020 → esm2022}/src/http/with-credentials-interceptor.service.mjs +4 -4
- package/esm2022/src/image/lazy-image.directive.mjs +132 -0
- package/esm2022/src/jwt/jwt-interceptor.service.mjs +26 -0
- package/esm2022/src/jwt/jwt-refresh-token-interceptor.service.mjs +50 -0
- package/{esm2020 → esm2022}/src/jwt/jwt.service.mjs +5 -5
- package/esm2022/src/logger/console-logger.service.mjs +43 -0
- package/esm2022/src/methoddecorator/limit.mjs +16 -0
- package/esm2022/src/oauth/oauth2-access-token-interceptor.service.mjs +26 -0
- package/esm2022/src/oauth/oauth2-error.mjs +8 -0
- package/esm2022/src/oauth/oauth2-refresh-token-interceptor.service.mjs +24 -0
- package/{esm2020 → esm2022}/src/oauth/oauth2.module.mjs +5 -5
- package/esm2022/src/oauth/oauth2.service.mjs +125 -0
- package/esm2022/src/oauth/redirect-to-oauth2-login-interceptor.service.mjs +41 -0
- package/esm2022/src/scroll/bottom-hit.directive.mjs +60 -0
- package/esm2022/src/scroll/scroll.service.mjs +38 -0
- package/esm2022/src/storage/local-storage.service.mjs +53 -0
- package/esm2022/src/util/collection-utils.mjs +27 -0
- package/{esm2020 → esm2022}/src/util/number-utils.mjs +1 -1
- package/esm2022/src/util/string-utils.mjs +35 -0
- package/esm2022/src/util/type-utils.mjs +9 -0
- package/{esm2020 → esm2022}/src/visibility/visibility.service.mjs +5 -5
- package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs +102 -100
- package/{fesm2020 → fesm2022}/dontdrinkandroot-ngx-extensions.mjs.map +1 -1
- package/package.json +9 -15
- package/src/image/lazy-image.directive.d.ts +1 -1
- package/esm2020/src/cookie/cookie.service.mjs +0 -135
- package/esm2020/src/ddr-extensions.module.mjs +0 -67
- package/esm2020/src/http/redirect-to-login-interceptor.service.mjs +0 -35
- package/esm2020/src/image/lazy-image.directive.mjs +0 -132
- package/esm2020/src/jwt/jwt-interceptor.service.mjs +0 -26
- package/esm2020/src/jwt/jwt-refresh-token-interceptor.service.mjs +0 -50
- package/esm2020/src/logger/console-logger.service.mjs +0 -43
- package/esm2020/src/methoddecorator/limit.mjs +0 -16
- package/esm2020/src/oauth/oauth2-access-token-interceptor.service.mjs +0 -26
- package/esm2020/src/oauth/oauth2-error.mjs +0 -8
- package/esm2020/src/oauth/oauth2-refresh-token-interceptor.service.mjs +0 -24
- package/esm2020/src/oauth/oauth2.service.mjs +0 -125
- package/esm2020/src/oauth/redirect-to-oauth2-login-interceptor.service.mjs +0 -41
- package/esm2020/src/scroll/bottom-hit.directive.mjs +0 -60
- package/esm2020/src/scroll/scroll.service.mjs +0 -38
- package/esm2020/src/storage/local-storage.service.mjs +0 -53
- package/esm2020/src/util/collection-utils.mjs +0 -27
- package/esm2020/src/util/string-utils.mjs +0 -35
- package/esm2020/src/util/type-utils.mjs +0 -9
- package/fesm2015/dontdrinkandroot-ngx-extensions.mjs +0 -1132
- package/fesm2015/dontdrinkandroot-ngx-extensions.mjs.map +0 -1
- /package/{esm2020 → esm2022}/dontdrinkandroot-ngx-extensions.mjs +0 -0
- /package/{esm2020 → esm2022}/public-api.mjs +0 -0
- /package/{esm2020 → esm2022}/src/http/url-info.mjs +0 -0
- /package/{esm2020 → esm2022}/src/jwt/jwt-token-response.mjs +0 -0
- /package/{esm2020 → esm2022}/src/logger/logger.service.mjs +0 -0
- /package/{esm2020 → esm2022}/src/methoddecorator/debounce.mjs +0 -0
- /package/{esm2020 → esm2022}/src/oauth/json-web-token.mjs +0 -0
- /package/{esm2020 → esm2022}/src/oauth/oauth2-config.mjs +0 -0
- /package/{esm2020 → esm2022}/src/oauth/token-response.mjs +0 -0
- /package/{esm2020 → esm2022}/src/storage/storage.service.mjs +0 -0
- /package/{esm2020 → esm2022}/src/typeguard/is-non-null.mjs +0 -0
- /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
|
-
|
|
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,
|
|
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,
|
|
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==
|