@geekbears/gb-ngrx-stack-base 17.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +24 -0
- package/domain/entities/index.d.ts +1 -0
- package/domain/entities/user.d.ts +9 -0
- package/domain/index.d.ts +1 -0
- package/esm2022/domain/entities/index.mjs +2 -0
- package/esm2022/domain/entities/user.mjs +2 -0
- package/esm2022/domain/index.mjs +2 -0
- package/esm2022/geekbears-gb-ngrx-stack-base.mjs +5 -0
- package/esm2022/index.mjs +5 -0
- package/esm2022/infrastructure/index.mjs +2 -0
- package/esm2022/infrastructure/models/index.mjs +3 -0
- package/esm2022/infrastructure/models/loaded-data.model.mjs +55 -0
- package/esm2022/infrastructure/models/user.model.mjs +16 -0
- package/esm2022/types/api-response.type.mjs +2 -0
- package/esm2022/types/do-interface.type.mjs +2 -0
- package/esm2022/types/failure.type.mjs +6 -0
- package/esm2022/types/index.mjs +4 -0
- package/esm2022/utils/authentication-change-base-action-token.mjs +7 -0
- package/esm2022/utils/failure.helper.mjs +44 -0
- package/esm2022/utils/http-response-handle.helper.mjs +41 -0
- package/esm2022/utils/index.mjs +6 -0
- package/esm2022/utils/rxjs.helper.mjs +62 -0
- package/esm2022/utils/test.mjs +6 -0
- package/fesm2022/geekbears-gb-ngrx-stack-base.mjs +237 -0
- package/fesm2022/geekbears-gb-ngrx-stack-base.mjs.map +1 -0
- package/index.d.ts +4 -0
- package/infrastructure/index.d.ts +1 -0
- package/infrastructure/models/index.d.ts +2 -0
- package/infrastructure/models/loaded-data.model.d.ts +22 -0
- package/infrastructure/models/user.model.d.ts +12 -0
- package/package.json +25 -0
- package/types/api-response.type.d.ts +18 -0
- package/types/do-interface.type.d.ts +3 -0
- package/types/failure.type.d.ts +8 -0
- package/types/index.d.ts +3 -0
- package/utils/authentication-change-base-action-token.d.ts +14 -0
- package/utils/failure.helper.d.ts +17 -0
- package/utils/http-response-handle.helper.d.ts +9 -0
- package/utils/index.d.ts +5 -0
- package/utils/rxjs.helper.d.ts +30 -0
- package/utils/test.d.ts +1 -0
package/README.md
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
# GbNgrxStackBase
|
|
2
|
+
|
|
3
|
+
This library was generated with [Angular CLI](https://github.com/angular/angular-cli) version 12.2.0.
|
|
4
|
+
|
|
5
|
+
## Code scaffolding
|
|
6
|
+
|
|
7
|
+
Run `ng generate component component-name --project gb-ngrx-stack-base` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module --project gb-ngrx-stack-base`.
|
|
8
|
+
> Note: Don't forget to add `--project gb-ngrx-stack-base` or else it will be added to the default project in your `angular.json` file.
|
|
9
|
+
|
|
10
|
+
## Build
|
|
11
|
+
|
|
12
|
+
Run `ng build gb-ngrx-stack-base` to build the project. The build artifacts will be stored in the `dist/` directory.
|
|
13
|
+
|
|
14
|
+
## Publishing
|
|
15
|
+
|
|
16
|
+
After building your library with `ng build gb-ngrx-stack-base`, go to the dist folder `cd dist/gb-ngrx-stack-base` and run `npm publish`.
|
|
17
|
+
|
|
18
|
+
## Running unit tests
|
|
19
|
+
|
|
20
|
+
Run `ng test gb-ngrx-stack-base` to execute the unit tests via [Karma](https://karma-runner.github.io).
|
|
21
|
+
|
|
22
|
+
## Further help
|
|
23
|
+
|
|
24
|
+
To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI Overview and Command Reference](https://angular.io/cli) page.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./user";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./entities";
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./user";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL2RvbWFpbi9lbnRpdGllcy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL3VzZXJcIjsiXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2diLW5ncngtc3RhY2stYmFzZS9zcmMvZG9tYWluL2VudGl0aWVzL3VzZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgSVVzZXIge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgZW1haWw6IHN0cmluZztcbiAgICBmaXJzdE5hbWU6IHN0cmluZztcbiAgICBsYXN0TmFtZTogc3RyaW5nO1xuICAgIHJvbGVzOiBzdHJpbmdbXSB8IHVuZGVmaW5lZDtcbiAgICBwZXJtaXNzaW9uczogc3RyaW5nW10gfCB1bmRlZmluZWQ7XG4gICAgYWNjb3VudENvbmZpcm1lZEF0PzogRGF0ZTtcbn1cbiJdfQ==
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./entities";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL2RvbWFpbi9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLFlBQVksQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2VudGl0aWVzXCI7Il19
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated bundle index. Do not edit.
|
|
3
|
+
*/
|
|
4
|
+
export * from './index';
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2Vla2JlYXJzLWdiLW5ncngtc3RhY2stYmFzZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3Byb2plY3RzL2diLW5ncngtc3RhY2stYmFzZS9zcmMvZ2Vla2JlYXJzLWdiLW5ncngtc3RhY2stYmFzZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export * from "./domain";
|
|
2
|
+
export * from "./infrastructure";
|
|
3
|
+
export * from "./types";
|
|
4
|
+
export * from "./utils";
|
|
5
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsVUFBVSxDQUFDO0FBQ3pCLGNBQWMsa0JBQWtCLENBQUM7QUFDakMsY0FBYyxTQUFTLENBQUM7QUFDeEIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgKiBmcm9tIFwiLi9kb21haW5cIjtcbmV4cG9ydCAqIGZyb20gXCIuL2luZnJhc3RydWN0dXJlXCI7XG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiO1xuZXhwb3J0ICogZnJvbSBcIi4vdXRpbHNcIjsiXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export * from "./models";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL2luZnJhc3RydWN0dXJlL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsVUFBVSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vbW9kZWxzXCI7Il19
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export * from './user.model';
|
|
2
|
+
export * from './loaded-data.model';
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL2luZnJhc3RydWN0dXJlL21vZGVscy9pbmRleC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxjQUFjLGNBQWMsQ0FBQztBQUM3QixjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi91c2VyLm1vZGVsJztcbmV4cG9ydCAqIGZyb20gJy4vbG9hZGVkLWRhdGEubW9kZWwnO1xuIl19
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isNil } from 'lodash-es';
|
|
2
|
+
export class LoadedData {
|
|
3
|
+
get errored() {
|
|
4
|
+
return this.failure != undefined && this.failure != null;
|
|
5
|
+
}
|
|
6
|
+
constructor(data) {
|
|
7
|
+
this._class = 'LoadedData';
|
|
8
|
+
this.loading = false;
|
|
9
|
+
this.timestamp = null;
|
|
10
|
+
this.failure = null;
|
|
11
|
+
this.value = null;
|
|
12
|
+
this.loading = data?.loading ?? this.loading;
|
|
13
|
+
this.timestamp = data?.timestamp ?? !isNil(data?.value) ? new Date() : this.timestamp;
|
|
14
|
+
this.value = data?.value ?? this.value;
|
|
15
|
+
this.failure = data?.failure ?? this.failure;
|
|
16
|
+
}
|
|
17
|
+
equals(other) {
|
|
18
|
+
if (this === other)
|
|
19
|
+
return true;
|
|
20
|
+
return (other instanceof LoadedData &&
|
|
21
|
+
other.loading === this.loading &&
|
|
22
|
+
other.timestamp === this.timestamp &&
|
|
23
|
+
other.value === this.value &&
|
|
24
|
+
other.failure?.code === this.failure?.code &&
|
|
25
|
+
JSON.stringify(other.failure?.messages) === JSON.stringify(this.failure?.messages));
|
|
26
|
+
}
|
|
27
|
+
copyWith(data) {
|
|
28
|
+
return new LoadedData(Object.assign({}, this, data));
|
|
29
|
+
}
|
|
30
|
+
copyWithData({ loading = false, value }) {
|
|
31
|
+
return new LoadedData({
|
|
32
|
+
loading,
|
|
33
|
+
timestamp: !isNil(value) ? new Date() : this.timestamp,
|
|
34
|
+
value,
|
|
35
|
+
failure: null,
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
copyWithLoading() {
|
|
39
|
+
return this.copyWith({
|
|
40
|
+
loading: true,
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
toObject() {
|
|
44
|
+
return {
|
|
45
|
+
loading: this.loading,
|
|
46
|
+
timestamp: this.timestamp,
|
|
47
|
+
value: this.value,
|
|
48
|
+
failure: this.failure,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
toString() {
|
|
52
|
+
return JSON.stringify(this);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9hZGVkLWRhdGEubW9kZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL2luZnJhc3RydWN0dXJlL21vZGVscy9sb2FkZWQtZGF0YS5tb2RlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBVWxDLE1BQU0sT0FBTyxVQUFVO0lBT25CLElBQUksT0FBTztRQUNQLE9BQU8sSUFBSSxDQUFDLE9BQU8sSUFBSSxTQUFTLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUM7SUFDN0QsQ0FBQztJQUVELFlBQVksSUFBOEI7UUFWMUMsV0FBTSxHQUFpQixZQUFZLENBQUM7UUFDcEMsWUFBTyxHQUFZLEtBQUssQ0FBQztRQUN6QixjQUFTLEdBQWdCLElBQUksQ0FBQztRQUM5QixZQUFPLEdBQW1CLElBQUksQ0FBQztRQUMvQixVQUFLLEdBQWEsSUFBSSxDQUFDO1FBT25CLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxFQUFFLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDO1FBQzdDLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxFQUFFLFNBQVMsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDdEYsSUFBSSxDQUFDLEtBQUssR0FBRyxJQUFJLEVBQUUsS0FBSyxJQUFJLElBQUksQ0FBQyxLQUFLLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sR0FBRyxJQUFJLEVBQUUsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUM7SUFDakQsQ0FBQztJQUVELE1BQU0sQ0FBQyxLQUFvQjtRQUN2QixJQUFJLElBQUksS0FBSyxLQUFLO1lBQUUsT0FBTyxJQUFJLENBQUM7UUFFaEMsT0FBTyxDQUNILEtBQUssWUFBWSxVQUFVO1lBQzNCLEtBQUssQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLE9BQU87WUFDOUIsS0FBSyxDQUFDLFNBQVMsS0FBSyxJQUFJLENBQUMsU0FBUztZQUNsQyxLQUFLLENBQUMsS0FBSyxLQUFLLElBQUksQ0FBQyxLQUFLO1lBQzFCLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxLQUFLLElBQUksQ0FBQyxPQUFPLEVBQUUsSUFBSTtZQUMxQyxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsUUFBUSxDQUFDLEtBQUssSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUNyRixDQUFDO0lBQ04sQ0FBQztJQUVELFFBQVEsQ0FBQyxJQUE0QjtRQUNqQyxPQUFPLElBQUksVUFBVSxDQUFJLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRCxZQUFZLENBQUMsRUFBRSxPQUFPLEdBQUcsS0FBSyxFQUFFLEtBQUssRUFBMEI7UUFDM0QsT0FBTyxJQUFJLFVBQVUsQ0FBSTtZQUNyQixPQUFPO1lBQ1AsU0FBUyxFQUFFLENBQUMsS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUztZQUN0RCxLQUFLO1lBQ0wsT0FBTyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELGVBQWU7UUFDWCxPQUFPLElBQUksQ0FBQyxRQUFRLENBQUM7WUFDakIsT0FBTyxFQUFFLElBQUk7U0FDaEIsQ0FBQyxDQUFDO0lBQ1AsQ0FBQztJQUVELFFBQVE7UUFDSixPQUFPO1lBQ0gsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1lBQ3JCLFNBQVMsRUFBRSxJQUFJLENBQUMsU0FBUztZQUN6QixLQUFLLEVBQUUsSUFBSSxDQUFDLEtBQUs7WUFDakIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO1NBQ3hCLENBQUM7SUFDTixDQUFDO0lBRUQsUUFBUTtRQUNKLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNoQyxDQUFDO0NBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpc05pbCB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBGYWlsdXJlIH0gZnJvbSAnLi4vLi4vdHlwZXMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElMb2FkZWREYXRhPFQ+IHtcbiAgICBsb2FkaW5nOiBib29sZWFuO1xuICAgIHRpbWVzdGFtcDogRGF0ZSB8IG51bGw7XG4gICAgZmFpbHVyZTogRmFpbHVyZSB8IG51bGw7XG4gICAgdmFsdWU6IFQgfCBudWxsO1xufVxuXG5leHBvcnQgY2xhc3MgTG9hZGVkRGF0YTxUPiB7XG4gICAgX2NsYXNzOiAnTG9hZGVkRGF0YScgPSAnTG9hZGVkRGF0YSc7XG4gICAgbG9hZGluZzogYm9vbGVhbiA9IGZhbHNlO1xuICAgIHRpbWVzdGFtcDogRGF0ZSB8IG51bGwgPSBudWxsO1xuICAgIGZhaWx1cmU6IEZhaWx1cmUgfCBudWxsID0gbnVsbDtcbiAgICB2YWx1ZTogVCB8IG51bGwgPSBudWxsO1xuXG4gICAgZ2V0IGVycm9yZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiB0aGlzLmZhaWx1cmUgIT0gdW5kZWZpbmVkICYmIHRoaXMuZmFpbHVyZSAhPSBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGRhdGE/OiBQYXJ0aWFsPElMb2FkZWREYXRhPFQ+Pikge1xuICAgICAgICB0aGlzLmxvYWRpbmcgPSBkYXRhPy5sb2FkaW5nID8/IHRoaXMubG9hZGluZztcbiAgICAgICAgdGhpcy50aW1lc3RhbXAgPSBkYXRhPy50aW1lc3RhbXAgPz8gIWlzTmlsKGRhdGE/LnZhbHVlKSA/IG5ldyBEYXRlKCkgOiB0aGlzLnRpbWVzdGFtcDtcbiAgICAgICAgdGhpcy52YWx1ZSA9IGRhdGE/LnZhbHVlID8/IHRoaXMudmFsdWU7XG4gICAgICAgIHRoaXMuZmFpbHVyZSA9IGRhdGE/LmZhaWx1cmUgPz8gdGhpcy5mYWlsdXJlO1xuICAgIH1cblxuICAgIGVxdWFscyhvdGhlcjogTG9hZGVkRGF0YTxUPik6IGJvb2xlYW4ge1xuICAgICAgICBpZiAodGhpcyA9PT0gb3RoZXIpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICBvdGhlciBpbnN0YW5jZW9mIExvYWRlZERhdGEgJiZcbiAgICAgICAgICAgIG90aGVyLmxvYWRpbmcgPT09IHRoaXMubG9hZGluZyAmJlxuICAgICAgICAgICAgb3RoZXIudGltZXN0YW1wID09PSB0aGlzLnRpbWVzdGFtcCAmJlxuICAgICAgICAgICAgb3RoZXIudmFsdWUgPT09IHRoaXMudmFsdWUgJiZcbiAgICAgICAgICAgIG90aGVyLmZhaWx1cmU/LmNvZGUgPT09IHRoaXMuZmFpbHVyZT8uY29kZSAmJlxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkob3RoZXIuZmFpbHVyZT8ubWVzc2FnZXMpID09PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZhaWx1cmU/Lm1lc3NhZ2VzKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGNvcHlXaXRoKGRhdGE6IFBhcnRpYWw8TG9hZGVkRGF0YTxUPj4pOiBMb2FkZWREYXRhPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2FkZWREYXRhPFQ+KE9iamVjdC5hc3NpZ24oe30sIHRoaXMsIGRhdGEpKTtcbiAgICB9XG5cbiAgICBjb3B5V2l0aERhdGEoeyBsb2FkaW5nID0gZmFsc2UsIHZhbHVlIH06IFBhcnRpYWw8TG9hZGVkRGF0YTxUPj4pOiBMb2FkZWREYXRhPFQ+IHtcbiAgICAgICAgcmV0dXJuIG5ldyBMb2FkZWREYXRhPFQ+KHtcbiAgICAgICAgICAgIGxvYWRpbmcsXG4gICAgICAgICAgICB0aW1lc3RhbXA6ICFpc05pbCh2YWx1ZSkgPyBuZXcgRGF0ZSgpIDogdGhpcy50aW1lc3RhbXAsXG4gICAgICAgICAgICB2YWx1ZSxcbiAgICAgICAgICAgIGZhaWx1cmU6IG51bGwsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGNvcHlXaXRoTG9hZGluZygpOiBMb2FkZWREYXRhPFQ+IHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY29weVdpdGgoe1xuICAgICAgICAgICAgbG9hZGluZzogdHJ1ZSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdG9PYmplY3QoKTogSUxvYWRlZERhdGE8VD4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9hZGluZzogdGhpcy5sb2FkaW5nLFxuICAgICAgICAgICAgdGltZXN0YW1wOiB0aGlzLnRpbWVzdGFtcCxcbiAgICAgICAgICAgIHZhbHVlOiB0aGlzLnZhbHVlLFxuICAgICAgICAgICAgZmFpbHVyZTogdGhpcy5mYWlsdXJlLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHRvU3RyaW5nKCk6IHN0cmluZyB7XG4gICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export class UserModel {
|
|
2
|
+
constructor(data) {
|
|
3
|
+
this.email = data.email ?? "";
|
|
4
|
+
this.id = data.id ?? "";
|
|
5
|
+
this.firstName = data.firstName ?? "";
|
|
6
|
+
this.lastName = data.lastName ?? "";
|
|
7
|
+
this.roles = data.permissions ?? [];
|
|
8
|
+
this.permissions = data.permissions ?? [];
|
|
9
|
+
this.accountConfirmedAt = data.accountConfirmedAt;
|
|
10
|
+
}
|
|
11
|
+
get fullName() {
|
|
12
|
+
return `${this.firstName} ${this.lastName}`;
|
|
13
|
+
}
|
|
14
|
+
;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXNlci5tb2RlbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2diLW5ncngtc3RhY2stYmFzZS9zcmMvaW5mcmFzdHJ1Y3R1cmUvbW9kZWxzL3VzZXIubW9kZWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsTUFBTSxPQUFPLFNBQVM7SUFTbEIsWUFBWSxJQUFvQjtRQUM1QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxLQUFLLElBQUksRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyxFQUFFLEdBQUcsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFNBQVMsR0FBRyxJQUFJLENBQUMsU0FBUyxJQUFJLEVBQUUsQ0FBQztRQUN0QyxJQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQyxRQUFRLElBQUksRUFBRSxDQUFDO1FBQ3BDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUM7UUFDcEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxJQUFJLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsa0JBQWtCLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO0lBQ3RELENBQUM7SUFFRCxJQUFJLFFBQVE7UUFDVixPQUFPLEdBQUcsSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsUUFBUSxFQUFFLENBQUE7SUFDN0MsQ0FBQztJQUFBLENBQUM7Q0FDTCIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IElVc2VyIH0gZnJvbSBcIi4uLy4uL2RvbWFpblwiO1xuXG5leHBvcnQgY2xhc3MgVXNlck1vZGVsIGltcGxlbWVudHMgSVVzZXIge1xuICAgIGVtYWlsOiBzdHJpbmc7XG4gICAgZmlyc3ROYW1lOiBzdHJpbmc7XG4gICAgbGFzdE5hbWU6IHN0cmluZztcbiAgICByb2xlczogc3RyaW5nW107XG4gICAgcGVybWlzc2lvbnM6IHN0cmluZ1tdO1xuICAgIGFjY291bnRDb25maXJtZWRBdD86IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgaWQ6IHN0cmluZztcblxuICAgIGNvbnN0cnVjdG9yKGRhdGE6IFBhcnRpYWw8SVVzZXI+KSB7XG4gICAgICAgIHRoaXMuZW1haWwgPSBkYXRhLmVtYWlsID8/IFwiXCI7XG4gICAgICAgIHRoaXMuaWQgPSBkYXRhLmlkID8/IFwiXCI7XG4gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZGF0YS5maXJzdE5hbWUgPz8gXCJcIjtcbiAgICAgICAgdGhpcy5sYXN0TmFtZSA9IGRhdGEubGFzdE5hbWUgPz8gXCJcIjtcbiAgICAgICAgdGhpcy5yb2xlcyA9IGRhdGEucGVybWlzc2lvbnMgPz8gW107XG4gICAgICAgIHRoaXMucGVybWlzc2lvbnMgPSBkYXRhLnBlcm1pc3Npb25zID8/IFtdO1xuICAgICAgICB0aGlzLmFjY291bnRDb25maXJtZWRBdCA9IGRhdGEuYWNjb3VudENvbmZpcm1lZEF0O1xuICAgIH1cblxuICAgIGdldCBmdWxsTmFtZSgpOiBzdHJpbmcge1xuICAgICAgcmV0dXJuIGAke3RoaXMuZmlyc3ROYW1lfSAke3RoaXMubGFzdE5hbWV9YFxuICAgIH07XG59XG4iXX0=
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXBpLXJlc3BvbnNlLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL3R5cGVzL2FwaS1yZXNwb25zZS50eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJVXNlciB9IGZyb20gJy4uJztcblxuZXhwb3J0IGludGVyZmFjZSBJQXV0aGVudGljYXRpb25SZXNwb25zZSB7XG4gICAgaWQ6IHN0cmluZztcbiAgICB0b2tlbjogc3RyaW5nO1xuICAgIGV4cGlyZWQ6IGJvb2xlYW47XG4gICAgdXNlcj86IElVc2VyIHwgbnVsbDtcbiAgICByZWZyZXNoVG9rZW4/OiBzdHJpbmcgfCBudWxsO1xuICAgIGRldmljZUluZm8/OiBJQXV0aERldmljZUluZm87XG4gICAgY29weVdpdGgoZGF0YTogUGFydGlhbDxJQXV0aGVudGljYXRpb25SZXNwb25zZT4pOiBJQXV0aGVudGljYXRpb25SZXNwb25zZTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJQXV0aERldmljZUluZm8ge1xuICAgIGlkOiBzdHJpbmc7XG4gICAgbmFtZTogc3RyaW5nO1xuXG4gICAgdG9Kc29uKCk6IHN0cmluZztcbiAgICB0b01hcCgpOiB7IFtrZXk6IHN0cmluZ106IGFueSB9O1xufVxuIl19
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export {};
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZG8taW50ZXJmYWNlLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL3R5cGVzL2RvLWludGVyZmFjZS50eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSBEb0ludGVyZmFjZTxULCBLIGV4dGVuZHMgUHJvcGVydHlLZXkgPSBuZXZlcj4gPSBPbWl0PFxuICAgIHtcbiAgICAgICAgW1AgaW4ga2V5b2YgVCBhcyBUW1BdIGV4dGVuZHMgRnVuY3Rpb24gPyBuZXZlciA6IFAgZXh0ZW5kcyBLID8gbmV2ZXIgOiBQXTogVFtQXTtcbiAgICB9LFxuICAgICdfY2xhc3MnXG4+O1xuIl19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export var FailureType;
|
|
2
|
+
(function (FailureType) {
|
|
3
|
+
FailureType["RateLimitExceeded"] = "RateLimitExceeded";
|
|
4
|
+
})(FailureType || (FailureType = {}));
|
|
5
|
+
export const UnkownFailureCode = "unknown";
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpbHVyZS50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2ItbmdyeC1zdGFjay1iYXNlL3NyYy90eXBlcy9mYWlsdXJlLnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBS0EsTUFBTSxDQUFOLElBQVksV0FFWDtBQUZELFdBQVksV0FBVztJQUNyQixzREFBdUMsQ0FBQTtBQUN6QyxDQUFDLEVBRlcsV0FBVyxLQUFYLFdBQVcsUUFFdEI7QUFFRCxNQUFNLENBQUMsTUFBTSxpQkFBaUIsR0FBRyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgaW50ZXJmYWNlIEZhaWx1cmUge1xuICAgIGNvZGU6IEZhaWx1cmVUeXBlIHwgc3RyaW5nO1xuICAgIG1lc3NhZ2VzPzogc3RyaW5nW107XG59XG5cbmV4cG9ydCBlbnVtIEZhaWx1cmVUeXBlIHtcbiAgUmF0ZUxpbWl0RXhjZWVkZWQgPSAnUmF0ZUxpbWl0RXhjZWVkZWQnLFxufVxuXG5leHBvcnQgY29uc3QgVW5rb3duRmFpbHVyZUNvZGUgPSBcInVua25vd25cIjtcbiJdfQ==
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export * from './api-response.type';
|
|
2
|
+
export * from './failure.type';
|
|
3
|
+
export * from './do-interface.type';
|
|
4
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL3R5cGVzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyxnQkFBZ0IsQ0FBQztBQUMvQixjQUFjLHFCQUFxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSAnLi9hcGktcmVzcG9uc2UudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2ZhaWx1cmUudHlwZSc7XG5leHBvcnQgKiBmcm9tICcuL2RvLWludGVyZmFjZS50eXBlJztcbiJdfQ==
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
/**
|
|
3
|
+
* The idea of this token is to have a way to register a general action that deals with authentication changes
|
|
4
|
+
* this way different libraries can rely on it either by subscribing it or dispatching it
|
|
5
|
+
*/
|
|
6
|
+
export const AuthenticationChangeBaseActionToken = new InjectionToken('AuthenticationChangeBaseActionToken');
|
|
7
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aGVudGljYXRpb24tY2hhbmdlLWJhc2UtYWN0aW9uLXRva2VuLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2ItbmdyeC1zdGFjay1iYXNlL3NyYy91dGlscy9hdXRoZW50aWNhdGlvbi1jaGFuZ2UtYmFzZS1hY3Rpb24tdG9rZW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUsvQzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxtQ0FBbUMsR0FBRyxJQUFJLGNBQWMsQ0FDakUscUNBQXFDLENBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3Rpb25Ub2tlbiB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQWN0aW9uLCBBY3Rpb25DcmVhdG9yLCBDcmVhdG9yLCBOb3RBbGxvd2VkQ2hlY2sgfSBmcm9tICdAbmdyeC9zdG9yZSc7XG5pbXBvcnQgeyBUeXBlZEFjdGlvbiB9IGZyb20gJ0BuZ3J4L3N0b3JlL3NyYy9tb2RlbHMnO1xuaW1wb3J0IHsgSUF1dGhlbnRpY2F0aW9uUmVzcG9uc2UgfSBmcm9tICcuLi90eXBlcyc7XG5cbi8qKlxuICogVGhlIGlkZWEgb2YgdGhpcyB0b2tlbiBpcyB0byBoYXZlIGEgd2F5IHRvIHJlZ2lzdGVyIGEgZ2VuZXJhbCBhY3Rpb24gdGhhdCBkZWFscyB3aXRoIGF1dGhlbnRpY2F0aW9uIGNoYW5nZXNcbiAqIHRoaXMgd2F5IGRpZmZlcmVudCBsaWJyYXJpZXMgY2FuIHJlbHkgb24gaXQgZWl0aGVyIGJ5IHN1YnNjcmliaW5nIGl0IG9yIGRpc3BhdGNoaW5nIGl0XG4gKi9cbmV4cG9ydCBjb25zdCBBdXRoZW50aWNhdGlvbkNoYW5nZUJhc2VBY3Rpb25Ub2tlbiA9IG5ldyBJbmplY3Rpb25Ub2tlbjxBdXRoZW50aWNhdGlvbkNoYW5nZUFjdGlvbj4oXG4gICAgJ0F1dGhlbnRpY2F0aW9uQ2hhbmdlQmFzZUFjdGlvblRva2VuJyxcbik7XG5cbmV4cG9ydCB0eXBlIEF1dGhlbnRpY2F0aW9uQ2hhbmdlQWN0aW9uID0gQWN0aW9uQ3JlYXRvcjxcbiAgICBzdHJpbmcsXG4gICAgKFxuICAgICAgICBwcm9wczogQXV0aGVudGljYXRpb25DaGFuZ2VBY3Rpb25Qcm9wcyAmIE5vdEFsbG93ZWRDaGVjazxBdXRoZW50aWNhdGlvbkNoYW5nZUFjdGlvblByb3BzPixcbiAgICApID0+IEF1dGhlbnRpY2F0aW9uQ2hhbmdlQWN0aW9uUHJvcHMgJiBUeXBlZEFjdGlvbjxzdHJpbmc+XG4+O1xuXG5leHBvcnQgaW50ZXJmYWNlIEF1dGhlbnRpY2F0aW9uQ2hhbmdlQWN0aW9uUHJvcHMge1xuICAgIGF1dGhlbnRpY2F0ZWQ6IGJvb2xlYW47XG4gICAgZGF0YTogSUF1dGhlbnRpY2F0aW9uUmVzcG9uc2UgfCBudWxsO1xufVxuIl19
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { has, isEmpty, isNil, isObject } from "lodash-es";
|
|
2
|
+
/**
|
|
3
|
+
*
|
|
4
|
+
* @param failure The Failure as input
|
|
5
|
+
* @param or If failure is null or couln't not retrieve any message from it, use this instead. Defaults to '' empty string
|
|
6
|
+
* @param messageWrapper Failures often return an array of messages, this give you the oportunity to wrap each message between whatever you want
|
|
7
|
+
* @param joiner The postfix that will join each message together, default behavior is to join by line break '\n'
|
|
8
|
+
* @returns A sigle string with the failure messages.
|
|
9
|
+
*/
|
|
10
|
+
export function getFailureMessageOr(failure, or = "", messageWrapper, joiner) {
|
|
11
|
+
let messages = [];
|
|
12
|
+
if (isNil(failure)) {
|
|
13
|
+
return or;
|
|
14
|
+
}
|
|
15
|
+
if (!isNil(failure.messages) && !isEmpty(failure.messages)) {
|
|
16
|
+
messages = failure.messages.map((message) => {
|
|
17
|
+
if (isNil(messageWrapper)) {
|
|
18
|
+
return message;
|
|
19
|
+
}
|
|
20
|
+
return messageWrapper(message);
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
else if (!isNil(failure.code)) {
|
|
24
|
+
messages = [failure.code];
|
|
25
|
+
}
|
|
26
|
+
if (isEmpty(messages)) {
|
|
27
|
+
return or;
|
|
28
|
+
}
|
|
29
|
+
return messages.join(joiner ?? "\n");
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Since Failure is not a runtime type but just an interface this check if given object can be treated as a Failure
|
|
33
|
+
* @param object Any object expected to be a Failure
|
|
34
|
+
* @returns {boolean}
|
|
35
|
+
*/
|
|
36
|
+
export function maybeFailure(object) {
|
|
37
|
+
if (!isObject(object))
|
|
38
|
+
return false;
|
|
39
|
+
if (has(object, "code")) {
|
|
40
|
+
return true;
|
|
41
|
+
}
|
|
42
|
+
return false;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFpbHVyZS5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL3V0aWxzL2ZhaWx1cmUuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBTyxHQUFHLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFNL0Q7Ozs7Ozs7R0FPRztBQUNILE1BQU0sVUFBVSxtQkFBbUIsQ0FBQyxPQUFtQyxFQUFFLEtBQWEsRUFBRSxFQUFFLGNBQXNDLEVBQUUsTUFBZTtJQUM3SSxJQUFJLFFBQVEsR0FBYSxFQUFFLENBQUM7SUFFNUIsSUFBRyxLQUFLLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQztRQUNoQixPQUFPLEVBQUUsQ0FBQztJQUNkLENBQUM7SUFFRCxJQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQztRQUN4RCxRQUFRLEdBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtZQUN4QyxJQUFHLEtBQUssQ0FBQyxjQUFjLENBQUMsRUFBRSxDQUFDO2dCQUN2QixPQUFPLE9BQU8sQ0FBQztZQUNuQixDQUFDO1lBQ0QsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLENBQUM7UUFDbkMsQ0FBQyxDQUFDLENBQUE7SUFDTixDQUFDO1NBQU0sSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQztRQUM5QixRQUFRLEdBQUcsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDOUIsQ0FBQztJQUVELElBQUcsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFLENBQUM7UUFDbkIsT0FBTyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUMsSUFBSSxDQUFDLE1BQU0sSUFBRyxJQUFJLENBQUMsQ0FBQztBQUN4QyxDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxZQUFZLENBQUMsTUFBVztJQUNwQyxJQUFHLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQztRQUFFLE9BQU8sS0FBSyxDQUFDO0lBRW5DLElBQUcsR0FBRyxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsRUFBRSxDQUFDO1FBQ3JCLE9BQU8sSUFBSSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQztBQUNqQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgZ2V0LCBoYXMsIGlzRW1wdHksIGlzTmlsLCBpc09iamVjdCB9IGZyb20gXCJsb2Rhc2gtZXNcIjtcbmltcG9ydCB7IE9wZXJhdG9yRnVuY3Rpb24gfSBmcm9tIFwicnhqc1wiO1xuaW1wb3J0IHsgRmFpbHVyZSB9IGZyb20gXCIuLi90eXBlc1wiO1xuXG5leHBvcnQgdHlwZSBGYWlsdXJlTWVzc2FnZVdyYXBwZXIgPSAobWVzc2FnZTogc3RyaW5nKSA9PiBzdHJpbmc7XG5cbi8qKlxuICogXG4gKiBAcGFyYW0gZmFpbHVyZSBUaGUgRmFpbHVyZSBhcyBpbnB1dFxuICogQHBhcmFtIG9yIElmIGZhaWx1cmUgaXMgbnVsbCBvciBjb3Vsbid0IG5vdCByZXRyaWV2ZSBhbnkgbWVzc2FnZSBmcm9tIGl0LCB1c2UgdGhpcyBpbnN0ZWFkLiBEZWZhdWx0cyB0byAnJyBlbXB0eSBzdHJpbmdcbiAqIEBwYXJhbSBtZXNzYWdlV3JhcHBlciBGYWlsdXJlcyBvZnRlbiByZXR1cm4gYW4gYXJyYXkgb2YgbWVzc2FnZXMsIHRoaXMgZ2l2ZSB5b3UgdGhlIG9wb3J0dW5pdHkgdG8gd3JhcCBlYWNoIG1lc3NhZ2UgYmV0d2VlbiB3aGF0ZXZlciB5b3Ugd2FudFxuICogQHBhcmFtIGpvaW5lciBUaGUgcG9zdGZpeCB0aGF0IHdpbGwgam9pbiBlYWNoIG1lc3NhZ2UgdG9nZXRoZXIsIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gam9pbiBieSBsaW5lIGJyZWFrICdcXG4nXG4gKiBAcmV0dXJucyBBIHNpZ2xlIHN0cmluZyB3aXRoIHRoZSBmYWlsdXJlIG1lc3NhZ2VzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFpbHVyZU1lc3NhZ2VPcihmYWlsdXJlOiBGYWlsdXJlIHwgbnVsbCB8IHVuZGVmaW5lZCwgb3I6IHN0cmluZyA9IFwiXCIsIG1lc3NhZ2VXcmFwcGVyPzogRmFpbHVyZU1lc3NhZ2VXcmFwcGVyLCBqb2luZXI/OiBzdHJpbmcpOiBzdHJpbmcge1xuICAgIGxldCBtZXNzYWdlczogc3RyaW5nW10gPSBbXTtcblxuICAgIGlmKGlzTmlsKGZhaWx1cmUpKSB7XG4gICAgICAgIHJldHVybiBvcjtcbiAgICB9XG5cbiAgICBpZighaXNOaWwoZmFpbHVyZS5tZXNzYWdlcykgJiYgIWlzRW1wdHkoZmFpbHVyZS5tZXNzYWdlcykpIHtcbiAgICAgICAgbWVzc2FnZXMgPSBmYWlsdXJlLm1lc3NhZ2VzLm1hcCgobWVzc2FnZSkgPT4ge1xuICAgICAgICAgICAgaWYoaXNOaWwobWVzc2FnZVdyYXBwZXIpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbWVzc2FnZVdyYXBwZXIobWVzc2FnZSk7XG4gICAgICAgIH0pXG4gICAgfSBlbHNlIGlmICghaXNOaWwoZmFpbHVyZS5jb2RlKSkge1xuICAgICAgICBtZXNzYWdlcyA9IFtmYWlsdXJlLmNvZGVdO1xuICAgIH1cblxuICAgIGlmKGlzRW1wdHkobWVzc2FnZXMpKSB7XG4gICAgICAgIHJldHVybiBvcjtcbiAgICB9XG5cbiAgICByZXR1cm4gbWVzc2FnZXMuam9pbihqb2luZXI/PyBcIlxcblwiKTtcbn1cblxuLyoqXG4gKiBTaW5jZSBGYWlsdXJlIGlzIG5vdCBhIHJ1bnRpbWUgdHlwZSBidXQganVzdCBhbiBpbnRlcmZhY2UgdGhpcyBjaGVjayBpZiBnaXZlbiBvYmplY3QgY2FuIGJlIHRyZWF0ZWQgYXMgYSBGYWlsdXJlXG4gKiBAcGFyYW0gb2JqZWN0IEFueSBvYmplY3QgZXhwZWN0ZWQgdG8gYmUgYSBGYWlsdXJlXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIG1heWJlRmFpbHVyZShvYmplY3Q6IGFueSk6IGJvb2xlYW4ge1xuICAgIGlmKCFpc09iamVjdChvYmplY3QpKSByZXR1cm4gZmFsc2U7XG5cbiAgICBpZihoYXMob2JqZWN0LCBcImNvZGVcIikpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufSJdfQ==
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
+
import { get, isEmpty, isNil, isObject, first, camelCase } from 'lodash-es';
|
|
3
|
+
import { UnkownFailureCode } from '../types';
|
|
4
|
+
export function httpResponseHandle(params) { }
|
|
5
|
+
/**
|
|
6
|
+
*
|
|
7
|
+
* @param error Throwed error by a function on the call stack
|
|
8
|
+
* @returns Returns a valid {Failure}
|
|
9
|
+
*/
|
|
10
|
+
export function httpResponseFailureHandle(error) {
|
|
11
|
+
if (isObject(error) && error instanceof HttpErrorResponse) {
|
|
12
|
+
let messages = get(error.error, 'messages', []);
|
|
13
|
+
// to support old applications
|
|
14
|
+
let singleMessage = get(error.error, 'message');
|
|
15
|
+
if (isEmpty(messages) && !isNil(singleMessage)) {
|
|
16
|
+
messages.push(singleMessage);
|
|
17
|
+
}
|
|
18
|
+
// to support old applications
|
|
19
|
+
if (isNil(singleMessage) && !isNil(get(error.error, 'error'))) {
|
|
20
|
+
let message = get(get(error.error, 'error'), 'message');
|
|
21
|
+
if (!isNil(message))
|
|
22
|
+
messages.push(message);
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
code: get(error.error, 'errorCode') || camelCase(first(messages)) || error.message,
|
|
26
|
+
messages: messages,
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
else if (isObject(error) && error instanceof Error) {
|
|
30
|
+
return {
|
|
31
|
+
code: error.name,
|
|
32
|
+
messages: !isNil(error.message) && !isEmpty(error.message) ? [error.message] : [],
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
return {
|
|
37
|
+
code: UnkownFailureCode,
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaHR0cC1yZXNwb25zZS1oYW5kbGUuaGVscGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvZ2ItbmdyeC1zdGFjay1iYXNlL3NyYy91dGlscy9odHRwLXJlc3BvbnNlLWhhbmRsZS5oZWxwZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDekQsT0FBTyxFQUFFLEdBQUcsRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLFFBQVEsRUFBRSxLQUFLLEVBQUUsU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQzVFLE9BQU8sRUFBVyxpQkFBaUIsRUFBRSxNQUFNLFVBQVUsQ0FBQztBQUV0RCxNQUFNLFVBQVUsa0JBQWtCLENBQUMsTUFBVyxJQUFHLENBQUM7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSx5QkFBeUIsQ0FBQyxLQUFnQztJQUN0RSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksaUJBQWlCLEVBQUUsQ0FBQztRQUN4RCxJQUFJLFFBQVEsR0FBYSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxVQUFVLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFMUQsOEJBQThCO1FBQzlCLElBQUksYUFBYSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLFNBQVMsQ0FBQyxDQUFDO1FBQ2hELElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxFQUFFLENBQUM7WUFDN0MsUUFBUSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUNqQyxDQUFDO1FBQ0QsOEJBQThCO1FBQzlCLElBQUksS0FBSyxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsS0FBSyxFQUFFLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1RCxJQUFJLE9BQU8sR0FBRyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxLQUFLLEVBQUUsT0FBTyxDQUFDLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDeEQsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUM7Z0JBQUUsUUFBUSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNoRCxDQUFDO1FBQ0QsT0FBTztZQUNILElBQUksRUFBRSxHQUFHLENBQUMsS0FBSyxDQUFDLEtBQUssRUFBRSxXQUFXLENBQUMsSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksS0FBSyxDQUFDLE9BQU87WUFDbEYsUUFBUSxFQUFFLFFBQVE7U0FDckIsQ0FBQztJQUNOLENBQUM7U0FBTSxJQUFJLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLFlBQVksS0FBSyxFQUFFLENBQUM7UUFDbkQsT0FBTztZQUNILElBQUksRUFBRSxLQUFLLENBQUMsSUFBSTtZQUNoQixRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUU7U0FDcEYsQ0FBQztJQUNOLENBQUM7U0FBTSxDQUFDO1FBQ0osT0FBTztZQUNILElBQUksRUFBRSxpQkFBaUI7U0FDMUIsQ0FBQztJQUNOLENBQUM7QUFDTCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSHR0cEVycm9yUmVzcG9uc2UgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XG5pbXBvcnQgeyBnZXQsIGlzRW1wdHksIGlzTmlsLCBpc09iamVjdCwgZmlyc3QsIGNhbWVsQ2FzZSB9IGZyb20gJ2xvZGFzaC1lcyc7XG5pbXBvcnQgeyBGYWlsdXJlLCBVbmtvd25GYWlsdXJlQ29kZSB9IGZyb20gJy4uL3R5cGVzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGh0dHBSZXNwb25zZUhhbmRsZShwYXJhbXM6IGFueSkge31cblxuLyoqXG4gKlxuICogQHBhcmFtIGVycm9yIFRocm93ZWQgZXJyb3IgYnkgYSBmdW5jdGlvbiBvbiB0aGUgY2FsbCBzdGFja1xuICogQHJldHVybnMgUmV0dXJucyBhIHZhbGlkIHtGYWlsdXJlfVxuICovXG5leHBvcnQgZnVuY3Rpb24gaHR0cFJlc3BvbnNlRmFpbHVyZUhhbmRsZShlcnJvcjogRXJyb3IgfCBIdHRwRXJyb3JSZXNwb25zZSk6IEZhaWx1cmUge1xuICAgIGlmIChpc09iamVjdChlcnJvcikgJiYgZXJyb3IgaW5zdGFuY2VvZiBIdHRwRXJyb3JSZXNwb25zZSkge1xuICAgICAgICBsZXQgbWVzc2FnZXM6IHN0cmluZ1tdID0gZ2V0KGVycm9yLmVycm9yLCAnbWVzc2FnZXMnLCBbXSk7XG5cbiAgICAgICAgLy8gdG8gc3VwcG9ydCBvbGQgYXBwbGljYXRpb25zXG4gICAgICAgIGxldCBzaW5nbGVNZXNzYWdlID0gZ2V0KGVycm9yLmVycm9yLCAnbWVzc2FnZScpO1xuICAgICAgICBpZiAoaXNFbXB0eShtZXNzYWdlcykgJiYgIWlzTmlsKHNpbmdsZU1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBtZXNzYWdlcy5wdXNoKHNpbmdsZU1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIHRvIHN1cHBvcnQgb2xkIGFwcGxpY2F0aW9uc1xuICAgICAgICBpZiAoaXNOaWwoc2luZ2xlTWVzc2FnZSkgJiYgIWlzTmlsKGdldChlcnJvci5lcnJvciwgJ2Vycm9yJykpKSB7XG4gICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGdldChnZXQoZXJyb3IuZXJyb3IsICdlcnJvcicpLCAnbWVzc2FnZScpO1xuICAgICAgICAgICAgaWYgKCFpc05pbChtZXNzYWdlKSkgbWVzc2FnZXMucHVzaChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY29kZTogZ2V0KGVycm9yLmVycm9yLCAnZXJyb3JDb2RlJykgfHwgY2FtZWxDYXNlKGZpcnN0KG1lc3NhZ2VzKSkgfHwgZXJyb3IubWVzc2FnZSxcbiAgICAgICAgICAgIG1lc3NhZ2VzOiBtZXNzYWdlcyxcbiAgICAgICAgfTtcbiAgICB9IGVsc2UgaWYgKGlzT2JqZWN0KGVycm9yKSAmJiBlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiBlcnJvci5uYW1lLFxuICAgICAgICAgICAgbWVzc2FnZXM6ICFpc05pbChlcnJvci5tZXNzYWdlKSAmJiAhaXNFbXB0eShlcnJvci5tZXNzYWdlKSA/IFtlcnJvci5tZXNzYWdlXSA6IFtdLFxuICAgICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjb2RlOiBVbmtvd25GYWlsdXJlQ29kZSxcbiAgICAgICAgfTtcbiAgICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export * from "./authentication-change-base-action-token";
|
|
2
|
+
export * from "./failure.helper";
|
|
3
|
+
export * from "./http-response-handle.helper";
|
|
4
|
+
export * from "./rxjs.helper";
|
|
5
|
+
export * from "./test";
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL3V0aWxzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsMkNBQTJDLENBQUM7QUFDMUQsY0FBYyxrQkFBa0IsQ0FBQztBQUNqQyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsZUFBZSxDQUFDO0FBQzlCLGNBQWMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0ICogZnJvbSBcIi4vYXV0aGVudGljYXRpb24tY2hhbmdlLWJhc2UtYWN0aW9uLXRva2VuXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9mYWlsdXJlLmhlbHBlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vaHR0cC1yZXNwb25zZS1oYW5kbGUuaGVscGVyXCI7XG5leHBvcnQgKiBmcm9tIFwiLi9yeGpzLmhlbHBlclwiO1xuZXhwb3J0ICogZnJvbSBcIi4vdGVzdFwiOyJdfQ==
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { HttpErrorResponse } from "@angular/common/http";
|
|
2
|
+
import { isObject } from "lodash-es";
|
|
3
|
+
import { of, throwError } from "rxjs";
|
|
4
|
+
import { catchError, map } from "rxjs/operators";
|
|
5
|
+
import { getFailureMessageOr, maybeFailure } from "./failure.helper";
|
|
6
|
+
import { httpResponseFailureHandle } from "./http-response-handle.helper";
|
|
7
|
+
/**
|
|
8
|
+
* This operator helps you catching any exception on your API call and tries to get a Failure form it and provides you with an easy way
|
|
9
|
+
* of proccessing that failure into something else
|
|
10
|
+
* @param converter Mapper function to dispatch given value instead of the Failure
|
|
11
|
+
* @returns Returns any value provided ny the converter
|
|
12
|
+
*/
|
|
13
|
+
export function catchAndGetFromFailureRxOp(converter) {
|
|
14
|
+
return catchError((error) => {
|
|
15
|
+
let failure;
|
|
16
|
+
if (isObject(error) && (error instanceof Error || error instanceof HttpErrorResponse)) {
|
|
17
|
+
failure = httpResponseFailureHandle(error);
|
|
18
|
+
}
|
|
19
|
+
else if (maybeFailure(error)) {
|
|
20
|
+
failure = error;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
failure = httpResponseFailureHandle(error);
|
|
24
|
+
}
|
|
25
|
+
return of(converter(failure));
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Catch an error, throws a Failure in the onservabe pipeline
|
|
30
|
+
* @returns Catch any error from the proccesed pipeline and throws a Failure instead
|
|
31
|
+
*/
|
|
32
|
+
export const catchAndThrowFailureRxOp = () => {
|
|
33
|
+
return catchError((error) => {
|
|
34
|
+
let failure = httpResponseFailureHandle(error);
|
|
35
|
+
return throwError(failure);
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
/**
|
|
39
|
+
* Catch an error and gets a Failure from it
|
|
40
|
+
* @returns Returns a Failure
|
|
41
|
+
*/
|
|
42
|
+
export const catchGetFailureRxOp = () => {
|
|
43
|
+
return catchError((error) => {
|
|
44
|
+
let failure = httpResponseFailureHandle(error);
|
|
45
|
+
return of(failure);
|
|
46
|
+
});
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* This converts failure to a message using same logic as '[getFailureMessageOr]'
|
|
50
|
+
* @see {@link getFailureMessageOr}
|
|
51
|
+
*
|
|
52
|
+
* @param or
|
|
53
|
+
* @param messageWrapper
|
|
54
|
+
* @param joiner
|
|
55
|
+
* @returns
|
|
56
|
+
*/
|
|
57
|
+
export const getFailureMessageRxOp = (or = "", messageWrapper, joiner) => {
|
|
58
|
+
return map((failure) => {
|
|
59
|
+
return getFailureMessageOr(failure, or, messageWrapper, joiner);
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicnhqcy5oZWxwZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9nYi1uZ3J4LXN0YWNrLWJhc2Uvc3JjL3V0aWxzL3J4anMuaGVscGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLHNCQUFzQixDQUFBO0FBQ3hELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxXQUFXLENBQUE7QUFDcEMsT0FBTyxFQUFFLEVBQUUsRUFBb0IsVUFBVSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQ3ZELE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFFaEQsT0FBTyxFQUF5QixtQkFBbUIsRUFBRSxZQUFZLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQTtBQUMzRixPQUFPLEVBQUUseUJBQXlCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQTtBQUV6RTs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSwwQkFBMEIsQ0FBSSxTQUFrQztJQUM1RSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hCLElBQUksT0FBZ0IsQ0FBQztRQUNyQixJQUFHLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssWUFBWSxLQUFLLElBQUksS0FBSyxZQUFZLGlCQUFpQixDQUFDLEVBQUUsQ0FBQztZQUNuRixPQUFPLEdBQUcseUJBQXlCLENBQUMsS0FBSyxDQUFDLENBQUM7UUFDL0MsQ0FBQzthQUFNLElBQUksWUFBWSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUM7WUFDN0IsT0FBTyxHQUFHLEtBQUssQ0FBQztRQUNwQixDQUFDO2FBQU0sQ0FBQztZQUNKLE9BQU8sR0FBRyx5QkFBeUIsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUMvQyxDQUFDO1FBQ0QsT0FBTyxFQUFFLENBQ0wsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUNyQixDQUFDO0lBQ04sQ0FBQyxDQUFDLENBQUM7QUFDUCxDQUFDO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sd0JBQXdCLEdBQUcsR0FBbUMsRUFBRTtJQUN6RSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hCLElBQUksT0FBTyxHQUFZLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQy9CLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFBO0FBRUQ7OztHQUdHO0FBQ0gsTUFBTSxDQUFDLE1BQU0sbUJBQW1CLEdBQUcsR0FBbUMsRUFBRTtJQUNwRSxPQUFPLFVBQVUsQ0FBQyxDQUFDLEtBQUssRUFBRSxFQUFFO1FBQ3hCLElBQUksT0FBTyxHQUFZLHlCQUF5QixDQUFDLEtBQUssQ0FBQyxDQUFDO1FBQ3hELE9BQU8sRUFBRSxDQUFDLE9BQU8sQ0FBQyxDQUFDO0lBQ3ZCLENBQUMsQ0FBQyxDQUFDO0FBQ1AsQ0FBQyxDQUFBO0FBRUQ7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxDQUFDLEtBQWEsRUFBRSxFQUFFLGNBQXNDLEVBQUUsTUFBZSxFQUF3RCxFQUFFO0lBQ3BLLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDbkIsT0FBTyxtQkFBbUIsQ0FBQyxPQUFPLEVBQUUsRUFBRSxFQUFFLGNBQWMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNwRSxDQUFDLENBQUMsQ0FBQztBQUNQLENBQUMsQ0FBQSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBFcnJvclJlc3BvbnNlIH0gZnJvbSBcIkBhbmd1bGFyL2NvbW1vbi9odHRwXCJcbmltcG9ydCB7IGlzT2JqZWN0IH0gZnJvbSBcImxvZGFzaC1lc1wiXG5pbXBvcnQgeyBvZiwgT3BlcmF0b3JGdW5jdGlvbiwgdGhyb3dFcnJvciB9IGZyb20gXCJyeGpzXCJcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gXCJyeGpzL29wZXJhdG9yc1wiXG5pbXBvcnQgeyBGYWlsdXJlIH0gZnJvbSBcIi4uL3R5cGVzXCJcbmltcG9ydCB7IEZhaWx1cmVNZXNzYWdlV3JhcHBlciwgZ2V0RmFpbHVyZU1lc3NhZ2VPciwgbWF5YmVGYWlsdXJlIH0gZnJvbSBcIi4vZmFpbHVyZS5oZWxwZXJcIlxuaW1wb3J0IHsgaHR0cFJlc3BvbnNlRmFpbHVyZUhhbmRsZSB9IGZyb20gXCIuL2h0dHAtcmVzcG9uc2UtaGFuZGxlLmhlbHBlclwiXG5cbi8qKlxuICogVGhpcyBvcGVyYXRvciBoZWxwcyB5b3UgY2F0Y2hpbmcgYW55IGV4Y2VwdGlvbiBvbiB5b3VyIEFQSSBjYWxsIGFuZCB0cmllcyB0byBnZXQgYSBGYWlsdXJlIGZvcm0gaXQgYW5kIHByb3ZpZGVzIHlvdSB3aXRoIGFuIGVhc3kgd2F5IFxuICogb2YgcHJvY2Nlc3NpbmcgdGhhdCBmYWlsdXJlIGludG8gc29tZXRoaW5nIGVsc2VcbiAqIEBwYXJhbSBjb252ZXJ0ZXIgTWFwcGVyIGZ1bmN0aW9uIHRvIGRpc3BhdGNoIGdpdmVuIHZhbHVlIGluc3RlYWQgb2YgdGhlIEZhaWx1cmVcbiAqIEByZXR1cm5zIFJldHVybnMgYW55IHZhbHVlIHByb3ZpZGVkIG55IHRoZSBjb252ZXJ0ZXJcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGNhdGNoQW5kR2V0RnJvbUZhaWx1cmVSeE9wPFQ+KGNvbnZlcnRlcjogKGZhaWx1cmU6IEZhaWx1cmUpID0+IFQpOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgVD4ge1xuICAgIHJldHVybiBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBsZXQgZmFpbHVyZTogRmFpbHVyZTtcbiAgICAgICAgaWYoaXNPYmplY3QoZXJyb3IpICYmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yIHx8IGVycm9yIGluc3RhbmNlb2YgSHR0cEVycm9yUmVzcG9uc2UpKSB7XG4gICAgICAgICAgICBmYWlsdXJlID0gaHR0cFJlc3BvbnNlRmFpbHVyZUhhbmRsZShlcnJvcik7XG4gICAgICAgIH0gZWxzZSBpZiAobWF5YmVGYWlsdXJlKGVycm9yKSkge1xuICAgICAgICAgICAgZmFpbHVyZSA9IGVycm9yO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZmFpbHVyZSA9IGh0dHBSZXNwb25zZUZhaWx1cmVIYW5kbGUoZXJyb3IpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvZihcbiAgICAgICAgICAgIGNvbnZlcnRlcihmYWlsdXJlKSxcbiAgICAgICAgKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDYXRjaCBhbiBlcnJvciwgdGhyb3dzIGEgRmFpbHVyZSBpbiB0aGUgb25zZXJ2YWJlIHBpcGVsaW5lXG4gKiBAcmV0dXJucyBDYXRjaCBhbnkgZXJyb3IgZnJvbSB0aGUgcHJvY2Nlc2VkIHBpcGVsaW5lIGFuZCB0aHJvd3MgYSBGYWlsdXJlIGluc3RlYWRcbiAqL1xuZXhwb3J0IGNvbnN0IGNhdGNoQW5kVGhyb3dGYWlsdXJlUnhPcCA9ICgpOiBPcGVyYXRvckZ1bmN0aW9uPGFueSwgRmFpbHVyZT4gPT4ge1xuICAgIHJldHVybiBjYXRjaEVycm9yKChlcnJvcikgPT4ge1xuICAgICAgICBsZXQgZmFpbHVyZTogRmFpbHVyZSA9IGh0dHBSZXNwb25zZUZhaWx1cmVIYW5kbGUoZXJyb3IpO1xuICAgICAgICByZXR1cm4gdGhyb3dFcnJvcihmYWlsdXJlKTtcbiAgICB9KTtcbn1cblxuLyoqXG4gKiBDYXRjaCBhbiBlcnJvciBhbmQgZ2V0cyBhIEZhaWx1cmUgZnJvbSBpdFxuICogQHJldHVybnMgUmV0dXJucyBhIEZhaWx1cmVcbiAqL1xuZXhwb3J0IGNvbnN0IGNhdGNoR2V0RmFpbHVyZVJ4T3AgPSAoKTogT3BlcmF0b3JGdW5jdGlvbjxhbnksIEZhaWx1cmU+ID0+IHtcbiAgICByZXR1cm4gY2F0Y2hFcnJvcigoZXJyb3IpID0+IHtcbiAgICAgICAgbGV0IGZhaWx1cmU6IEZhaWx1cmUgPSBodHRwUmVzcG9uc2VGYWlsdXJlSGFuZGxlKGVycm9yKTtcbiAgICAgICAgcmV0dXJuIG9mKGZhaWx1cmUpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIFRoaXMgY29udmVydHMgZmFpbHVyZSB0byBhIG1lc3NhZ2UgdXNpbmcgc2FtZSBsb2dpYyBhcyAnW2dldEZhaWx1cmVNZXNzYWdlT3JdJ1xuICogQHNlZSB7QGxpbmsgZ2V0RmFpbHVyZU1lc3NhZ2VPcn1cbiAqIFxuICogQHBhcmFtIG9yIFxuICogQHBhcmFtIG1lc3NhZ2VXcmFwcGVyIFxuICogQHBhcmFtIGpvaW5lciBcbiAqIEByZXR1cm5zIFxuICovXG5leHBvcnQgY29uc3QgZ2V0RmFpbHVyZU1lc3NhZ2VSeE9wID0gKG9yOiBzdHJpbmcgPSBcIlwiLCBtZXNzYWdlV3JhcHBlcj86IEZhaWx1cmVNZXNzYWdlV3JhcHBlciwgam9pbmVyPzogc3RyaW5nKTogT3BlcmF0b3JGdW5jdGlvbjxGYWlsdXJlIHwgbnVsbCB8IHVuZGVmaW5lZCwgc3RyaW5nPiA9PiB7XG4gICAgcmV0dXJuIG1hcCgoZmFpbHVyZSkgPT4ge1xuICAgICAgICByZXR1cm4gZ2V0RmFpbHVyZU1lc3NhZ2VPcihmYWlsdXJlLCBvciwgbWVzc2FnZVdyYXBwZXIsIGpvaW5lcik7XG4gICAgfSk7XG59Il19
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export function mockHttpResponse(data) {
|
|
2
|
+
return {
|
|
3
|
+
data: data,
|
|
4
|
+
};
|
|
5
|
+
}
|
|
6
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2diLW5ncngtc3RhY2stYmFzZS9zcmMvdXRpbHMvdGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLFVBQVUsZ0JBQWdCLENBQUMsSUFBWTtJQUN6QyxPQUFPO1FBQ0gsSUFBSSxFQUFFLElBQUk7S0FDYixDQUFBO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBmdW5jdGlvbiBtb2NrSHR0cFJlc3BvbnNlKGRhdGE6IG9iamVjdCk6IG9iamVjdCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICB9XG59Il19
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import { isNil, isEmpty, isObject, has, get, camelCase, first } from 'lodash-es';
|
|
2
|
+
import { InjectionToken } from '@angular/core';
|
|
3
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
|
4
|
+
import { of, throwError } from 'rxjs';
|
|
5
|
+
import { catchError, map } from 'rxjs/operators';
|
|
6
|
+
|
|
7
|
+
class UserModel {
|
|
8
|
+
constructor(data) {
|
|
9
|
+
this.email = data.email ?? "";
|
|
10
|
+
this.id = data.id ?? "";
|
|
11
|
+
this.firstName = data.firstName ?? "";
|
|
12
|
+
this.lastName = data.lastName ?? "";
|
|
13
|
+
this.roles = data.permissions ?? [];
|
|
14
|
+
this.permissions = data.permissions ?? [];
|
|
15
|
+
this.accountConfirmedAt = data.accountConfirmedAt;
|
|
16
|
+
}
|
|
17
|
+
get fullName() {
|
|
18
|
+
return `${this.firstName} ${this.lastName}`;
|
|
19
|
+
}
|
|
20
|
+
;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class LoadedData {
|
|
24
|
+
get errored() {
|
|
25
|
+
return this.failure != undefined && this.failure != null;
|
|
26
|
+
}
|
|
27
|
+
constructor(data) {
|
|
28
|
+
this._class = 'LoadedData';
|
|
29
|
+
this.loading = false;
|
|
30
|
+
this.timestamp = null;
|
|
31
|
+
this.failure = null;
|
|
32
|
+
this.value = null;
|
|
33
|
+
this.loading = data?.loading ?? this.loading;
|
|
34
|
+
this.timestamp = data?.timestamp ?? !isNil(data?.value) ? new Date() : this.timestamp;
|
|
35
|
+
this.value = data?.value ?? this.value;
|
|
36
|
+
this.failure = data?.failure ?? this.failure;
|
|
37
|
+
}
|
|
38
|
+
equals(other) {
|
|
39
|
+
if (this === other)
|
|
40
|
+
return true;
|
|
41
|
+
return (other instanceof LoadedData &&
|
|
42
|
+
other.loading === this.loading &&
|
|
43
|
+
other.timestamp === this.timestamp &&
|
|
44
|
+
other.value === this.value &&
|
|
45
|
+
other.failure?.code === this.failure?.code &&
|
|
46
|
+
JSON.stringify(other.failure?.messages) === JSON.stringify(this.failure?.messages));
|
|
47
|
+
}
|
|
48
|
+
copyWith(data) {
|
|
49
|
+
return new LoadedData(Object.assign({}, this, data));
|
|
50
|
+
}
|
|
51
|
+
copyWithData({ loading = false, value }) {
|
|
52
|
+
return new LoadedData({
|
|
53
|
+
loading,
|
|
54
|
+
timestamp: !isNil(value) ? new Date() : this.timestamp,
|
|
55
|
+
value,
|
|
56
|
+
failure: null,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
copyWithLoading() {
|
|
60
|
+
return this.copyWith({
|
|
61
|
+
loading: true,
|
|
62
|
+
});
|
|
63
|
+
}
|
|
64
|
+
toObject() {
|
|
65
|
+
return {
|
|
66
|
+
loading: this.loading,
|
|
67
|
+
timestamp: this.timestamp,
|
|
68
|
+
value: this.value,
|
|
69
|
+
failure: this.failure,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
toString() {
|
|
73
|
+
return JSON.stringify(this);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
var FailureType;
|
|
78
|
+
(function (FailureType) {
|
|
79
|
+
FailureType["RateLimitExceeded"] = "RateLimitExceeded";
|
|
80
|
+
})(FailureType || (FailureType = {}));
|
|
81
|
+
const UnkownFailureCode = "unknown";
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The idea of this token is to have a way to register a general action that deals with authentication changes
|
|
85
|
+
* this way different libraries can rely on it either by subscribing it or dispatching it
|
|
86
|
+
*/
|
|
87
|
+
const AuthenticationChangeBaseActionToken = new InjectionToken('AuthenticationChangeBaseActionToken');
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
*
|
|
91
|
+
* @param failure The Failure as input
|
|
92
|
+
* @param or If failure is null or couln't not retrieve any message from it, use this instead. Defaults to '' empty string
|
|
93
|
+
* @param messageWrapper Failures often return an array of messages, this give you the oportunity to wrap each message between whatever you want
|
|
94
|
+
* @param joiner The postfix that will join each message together, default behavior is to join by line break '\n'
|
|
95
|
+
* @returns A sigle string with the failure messages.
|
|
96
|
+
*/
|
|
97
|
+
function getFailureMessageOr(failure, or = "", messageWrapper, joiner) {
|
|
98
|
+
let messages = [];
|
|
99
|
+
if (isNil(failure)) {
|
|
100
|
+
return or;
|
|
101
|
+
}
|
|
102
|
+
if (!isNil(failure.messages) && !isEmpty(failure.messages)) {
|
|
103
|
+
messages = failure.messages.map((message) => {
|
|
104
|
+
if (isNil(messageWrapper)) {
|
|
105
|
+
return message;
|
|
106
|
+
}
|
|
107
|
+
return messageWrapper(message);
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
else if (!isNil(failure.code)) {
|
|
111
|
+
messages = [failure.code];
|
|
112
|
+
}
|
|
113
|
+
if (isEmpty(messages)) {
|
|
114
|
+
return or;
|
|
115
|
+
}
|
|
116
|
+
return messages.join(joiner ?? "\n");
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Since Failure is not a runtime type but just an interface this check if given object can be treated as a Failure
|
|
120
|
+
* @param object Any object expected to be a Failure
|
|
121
|
+
* @returns {boolean}
|
|
122
|
+
*/
|
|
123
|
+
function maybeFailure(object) {
|
|
124
|
+
if (!isObject(object))
|
|
125
|
+
return false;
|
|
126
|
+
if (has(object, "code")) {
|
|
127
|
+
return true;
|
|
128
|
+
}
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
function httpResponseHandle(params) { }
|
|
133
|
+
/**
|
|
134
|
+
*
|
|
135
|
+
* @param error Throwed error by a function on the call stack
|
|
136
|
+
* @returns Returns a valid {Failure}
|
|
137
|
+
*/
|
|
138
|
+
function httpResponseFailureHandle(error) {
|
|
139
|
+
if (isObject(error) && error instanceof HttpErrorResponse) {
|
|
140
|
+
let messages = get(error.error, 'messages', []);
|
|
141
|
+
// to support old applications
|
|
142
|
+
let singleMessage = get(error.error, 'message');
|
|
143
|
+
if (isEmpty(messages) && !isNil(singleMessage)) {
|
|
144
|
+
messages.push(singleMessage);
|
|
145
|
+
}
|
|
146
|
+
// to support old applications
|
|
147
|
+
if (isNil(singleMessage) && !isNil(get(error.error, 'error'))) {
|
|
148
|
+
let message = get(get(error.error, 'error'), 'message');
|
|
149
|
+
if (!isNil(message))
|
|
150
|
+
messages.push(message);
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
code: get(error.error, 'errorCode') || camelCase(first(messages)) || error.message,
|
|
154
|
+
messages: messages,
|
|
155
|
+
};
|
|
156
|
+
}
|
|
157
|
+
else if (isObject(error) && error instanceof Error) {
|
|
158
|
+
return {
|
|
159
|
+
code: error.name,
|
|
160
|
+
messages: !isNil(error.message) && !isEmpty(error.message) ? [error.message] : [],
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
else {
|
|
164
|
+
return {
|
|
165
|
+
code: UnkownFailureCode,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/**
|
|
171
|
+
* This operator helps you catching any exception on your API call and tries to get a Failure form it and provides you with an easy way
|
|
172
|
+
* of proccessing that failure into something else
|
|
173
|
+
* @param converter Mapper function to dispatch given value instead of the Failure
|
|
174
|
+
* @returns Returns any value provided ny the converter
|
|
175
|
+
*/
|
|
176
|
+
function catchAndGetFromFailureRxOp(converter) {
|
|
177
|
+
return catchError((error) => {
|
|
178
|
+
let failure;
|
|
179
|
+
if (isObject(error) && (error instanceof Error || error instanceof HttpErrorResponse)) {
|
|
180
|
+
failure = httpResponseFailureHandle(error);
|
|
181
|
+
}
|
|
182
|
+
else if (maybeFailure(error)) {
|
|
183
|
+
failure = error;
|
|
184
|
+
}
|
|
185
|
+
else {
|
|
186
|
+
failure = httpResponseFailureHandle(error);
|
|
187
|
+
}
|
|
188
|
+
return of(converter(failure));
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Catch an error, throws a Failure in the onservabe pipeline
|
|
193
|
+
* @returns Catch any error from the proccesed pipeline and throws a Failure instead
|
|
194
|
+
*/
|
|
195
|
+
const catchAndThrowFailureRxOp = () => {
|
|
196
|
+
return catchError((error) => {
|
|
197
|
+
let failure = httpResponseFailureHandle(error);
|
|
198
|
+
return throwError(failure);
|
|
199
|
+
});
|
|
200
|
+
};
|
|
201
|
+
/**
|
|
202
|
+
* Catch an error and gets a Failure from it
|
|
203
|
+
* @returns Returns a Failure
|
|
204
|
+
*/
|
|
205
|
+
const catchGetFailureRxOp = () => {
|
|
206
|
+
return catchError((error) => {
|
|
207
|
+
let failure = httpResponseFailureHandle(error);
|
|
208
|
+
return of(failure);
|
|
209
|
+
});
|
|
210
|
+
};
|
|
211
|
+
/**
|
|
212
|
+
* This converts failure to a message using same logic as '[getFailureMessageOr]'
|
|
213
|
+
* @see {@link getFailureMessageOr}
|
|
214
|
+
*
|
|
215
|
+
* @param or
|
|
216
|
+
* @param messageWrapper
|
|
217
|
+
* @param joiner
|
|
218
|
+
* @returns
|
|
219
|
+
*/
|
|
220
|
+
const getFailureMessageRxOp = (or = "", messageWrapper, joiner) => {
|
|
221
|
+
return map((failure) => {
|
|
222
|
+
return getFailureMessageOr(failure, or, messageWrapper, joiner);
|
|
223
|
+
});
|
|
224
|
+
};
|
|
225
|
+
|
|
226
|
+
function mockHttpResponse(data) {
|
|
227
|
+
return {
|
|
228
|
+
data: data,
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
/**
|
|
233
|
+
* Generated bundle index. Do not edit.
|
|
234
|
+
*/
|
|
235
|
+
|
|
236
|
+
export { AuthenticationChangeBaseActionToken, FailureType, LoadedData, UnkownFailureCode, UserModel, catchAndGetFromFailureRxOp, catchAndThrowFailureRxOp, catchGetFailureRxOp, getFailureMessageOr, getFailureMessageRxOp, httpResponseFailureHandle, httpResponseHandle, maybeFailure, mockHttpResponse };
|
|
237
|
+
//# sourceMappingURL=geekbears-gb-ngrx-stack-base.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"geekbears-gb-ngrx-stack-base.mjs","sources":["../../../projects/gb-ngrx-stack-base/src/infrastructure/models/user.model.ts","../../../projects/gb-ngrx-stack-base/src/infrastructure/models/loaded-data.model.ts","../../../projects/gb-ngrx-stack-base/src/types/failure.type.ts","../../../projects/gb-ngrx-stack-base/src/utils/authentication-change-base-action-token.ts","../../../projects/gb-ngrx-stack-base/src/utils/failure.helper.ts","../../../projects/gb-ngrx-stack-base/src/utils/http-response-handle.helper.ts","../../../projects/gb-ngrx-stack-base/src/utils/rxjs.helper.ts","../../../projects/gb-ngrx-stack-base/src/utils/test.ts","../../../projects/gb-ngrx-stack-base/src/geekbears-gb-ngrx-stack-base.ts"],"sourcesContent":["import { IUser } from \"../../domain\";\n\nexport class UserModel implements IUser {\n email: string;\n firstName: string;\n lastName: string;\n roles: string[];\n permissions: string[];\n accountConfirmedAt?: Date | undefined;\n id: string;\n\n constructor(data: Partial<IUser>) {\n this.email = data.email ?? \"\";\n this.id = data.id ?? \"\";\n this.firstName = data.firstName ?? \"\";\n this.lastName = data.lastName ?? \"\";\n this.roles = data.permissions ?? [];\n this.permissions = data.permissions ?? [];\n this.accountConfirmedAt = data.accountConfirmedAt;\n }\n\n get fullName(): string {\n return `${this.firstName} ${this.lastName}`\n };\n}\n","import { isNil } from 'lodash-es';\nimport { Failure } from '../../types';\n\nexport interface ILoadedData<T> {\n loading: boolean;\n timestamp: Date | null;\n failure: Failure | null;\n value: T | null;\n}\n\nexport class LoadedData<T> {\n _class: 'LoadedData' = 'LoadedData';\n loading: boolean = false;\n timestamp: Date | null = null;\n failure: Failure | null = null;\n value: T | null = null;\n\n get errored(): boolean {\n return this.failure != undefined && this.failure != null;\n }\n\n constructor(data?: Partial<ILoadedData<T>>) {\n this.loading = data?.loading ?? this.loading;\n this.timestamp = data?.timestamp ?? !isNil(data?.value) ? new Date() : this.timestamp;\n this.value = data?.value ?? this.value;\n this.failure = data?.failure ?? this.failure;\n }\n\n equals(other: LoadedData<T>): boolean {\n if (this === other) return true;\n\n return (\n other instanceof LoadedData &&\n other.loading === this.loading &&\n other.timestamp === this.timestamp &&\n other.value === this.value &&\n other.failure?.code === this.failure?.code &&\n JSON.stringify(other.failure?.messages) === JSON.stringify(this.failure?.messages)\n );\n }\n\n copyWith(data: Partial<LoadedData<T>>): LoadedData<T> {\n return new LoadedData<T>(Object.assign({}, this, data));\n }\n\n copyWithData({ loading = false, value }: Partial<LoadedData<T>>): LoadedData<T> {\n return new LoadedData<T>({\n loading,\n timestamp: !isNil(value) ? new Date() : this.timestamp,\n value,\n failure: null,\n });\n }\n\n copyWithLoading(): LoadedData<T> {\n return this.copyWith({\n loading: true,\n });\n }\n\n toObject(): ILoadedData<T> {\n return {\n loading: this.loading,\n timestamp: this.timestamp,\n value: this.value,\n failure: this.failure,\n };\n }\n\n toString(): string {\n return JSON.stringify(this);\n }\n}\n","export interface Failure {\n code: FailureType | string;\n messages?: string[];\n}\n\nexport enum FailureType {\n RateLimitExceeded = 'RateLimitExceeded',\n}\n\nexport const UnkownFailureCode = \"unknown\";\n","import { InjectionToken } from '@angular/core';\nimport { Action, ActionCreator, Creator, NotAllowedCheck } from '@ngrx/store';\nimport { TypedAction } from '@ngrx/store/src/models';\nimport { IAuthenticationResponse } from '../types';\n\n/**\n * The idea of this token is to have a way to register a general action that deals with authentication changes\n * this way different libraries can rely on it either by subscribing it or dispatching it\n */\nexport const AuthenticationChangeBaseActionToken = new InjectionToken<AuthenticationChangeAction>(\n 'AuthenticationChangeBaseActionToken',\n);\n\nexport type AuthenticationChangeAction = ActionCreator<\n string,\n (\n props: AuthenticationChangeActionProps & NotAllowedCheck<AuthenticationChangeActionProps>,\n ) => AuthenticationChangeActionProps & TypedAction<string>\n>;\n\nexport interface AuthenticationChangeActionProps {\n authenticated: boolean;\n data: IAuthenticationResponse | null;\n}\n","import { get, has, isEmpty, isNil, isObject } from \"lodash-es\";\nimport { OperatorFunction } from \"rxjs\";\nimport { Failure } from \"../types\";\n\nexport type FailureMessageWrapper = (message: string) => string;\n\n/**\n * \n * @param failure The Failure as input\n * @param or If failure is null or couln't not retrieve any message from it, use this instead. Defaults to '' empty string\n * @param messageWrapper Failures often return an array of messages, this give you the oportunity to wrap each message between whatever you want\n * @param joiner The postfix that will join each message together, default behavior is to join by line break '\\n'\n * @returns A sigle string with the failure messages.\n */\nexport function getFailureMessageOr(failure: Failure | null | undefined, or: string = \"\", messageWrapper?: FailureMessageWrapper, joiner?: string): string {\n let messages: string[] = [];\n\n if(isNil(failure)) {\n return or;\n }\n\n if(!isNil(failure.messages) && !isEmpty(failure.messages)) {\n messages = failure.messages.map((message) => {\n if(isNil(messageWrapper)) {\n return message;\n }\n return messageWrapper(message);\n })\n } else if (!isNil(failure.code)) {\n messages = [failure.code];\n }\n\n if(isEmpty(messages)) {\n return or;\n }\n\n return messages.join(joiner?? \"\\n\");\n}\n\n/**\n * Since Failure is not a runtime type but just an interface this check if given object can be treated as a Failure\n * @param object Any object expected to be a Failure\n * @returns {boolean}\n */\nexport function maybeFailure(object: any): boolean {\n if(!isObject(object)) return false;\n\n if(has(object, \"code\")) {\n return true;\n }\n\n return false;\n}","import { HttpErrorResponse } from '@angular/common/http';\nimport { get, isEmpty, isNil, isObject, first, camelCase } from 'lodash-es';\nimport { Failure, UnkownFailureCode } from '../types';\n\nexport function httpResponseHandle(params: any) {}\n\n/**\n *\n * @param error Throwed error by a function on the call stack\n * @returns Returns a valid {Failure}\n */\nexport function httpResponseFailureHandle(error: Error | HttpErrorResponse): Failure {\n if (isObject(error) && error instanceof HttpErrorResponse) {\n let messages: string[] = get(error.error, 'messages', []);\n\n // to support old applications\n let singleMessage = get(error.error, 'message');\n if (isEmpty(messages) && !isNil(singleMessage)) {\n messages.push(singleMessage);\n }\n // to support old applications\n if (isNil(singleMessage) && !isNil(get(error.error, 'error'))) {\n let message = get(get(error.error, 'error'), 'message');\n if (!isNil(message)) messages.push(message);\n }\n return {\n code: get(error.error, 'errorCode') || camelCase(first(messages)) || error.message,\n messages: messages,\n };\n } else if (isObject(error) && error instanceof Error) {\n return {\n code: error.name,\n messages: !isNil(error.message) && !isEmpty(error.message) ? [error.message] : [],\n };\n } else {\n return {\n code: UnkownFailureCode,\n };\n }\n}\n","import { HttpErrorResponse } from \"@angular/common/http\"\nimport { isObject } from \"lodash-es\"\nimport { of, OperatorFunction, throwError } from \"rxjs\"\nimport { catchError, map } from \"rxjs/operators\"\nimport { Failure } from \"../types\"\nimport { FailureMessageWrapper, getFailureMessageOr, maybeFailure } from \"./failure.helper\"\nimport { httpResponseFailureHandle } from \"./http-response-handle.helper\"\n\n/**\n * This operator helps you catching any exception on your API call and tries to get a Failure form it and provides you with an easy way \n * of proccessing that failure into something else\n * @param converter Mapper function to dispatch given value instead of the Failure\n * @returns Returns any value provided ny the converter\n */\nexport function catchAndGetFromFailureRxOp<T>(converter: (failure: Failure) => T): OperatorFunction<any, T> {\n return catchError((error) => {\n let failure: Failure;\n if(isObject(error) && (error instanceof Error || error instanceof HttpErrorResponse)) {\n failure = httpResponseFailureHandle(error);\n } else if (maybeFailure(error)) {\n failure = error;\n } else {\n failure = httpResponseFailureHandle(error);\n }\n return of(\n converter(failure),\n );\n });\n}\n\n/**\n * Catch an error, throws a Failure in the onservabe pipeline\n * @returns Catch any error from the proccesed pipeline and throws a Failure instead\n */\nexport const catchAndThrowFailureRxOp = (): OperatorFunction<any, Failure> => {\n return catchError((error) => {\n let failure: Failure = httpResponseFailureHandle(error);\n return throwError(failure);\n });\n}\n\n/**\n * Catch an error and gets a Failure from it\n * @returns Returns a Failure\n */\nexport const catchGetFailureRxOp = (): OperatorFunction<any, Failure> => {\n return catchError((error) => {\n let failure: Failure = httpResponseFailureHandle(error);\n return of(failure);\n });\n}\n\n/**\n * This converts failure to a message using same logic as '[getFailureMessageOr]'\n * @see {@link getFailureMessageOr}\n * \n * @param or \n * @param messageWrapper \n * @param joiner \n * @returns \n */\nexport const getFailureMessageRxOp = (or: string = \"\", messageWrapper?: FailureMessageWrapper, joiner?: string): OperatorFunction<Failure | null | undefined, string> => {\n return map((failure) => {\n return getFailureMessageOr(failure, or, messageWrapper, joiner);\n });\n}","export function mockHttpResponse(data: object): object {\n return {\n data: data,\n }\n}","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":[],"mappings":";;;;;;MAEa,SAAS,CAAA;AASlB,IAAA,WAAA,CAAY,IAAoB,EAAA;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;QAC9B,IAAI,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,IAAI,EAAE,CAAC;QACtC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;QACpC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,EAAE,CAAC;AAC1C,QAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC;KACrD;AAED,IAAA,IAAI,QAAQ,GAAA;QACV,OAAO,CAAA,EAAG,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAA,CAAE,CAAA;KAC5C;;AACJ;;MCdY,UAAU,CAAA;AAOnB,IAAA,IAAI,OAAO,GAAA;QACP,OAAO,IAAI,CAAC,OAAO,IAAI,SAAS,IAAI,IAAI,CAAC,OAAO,IAAI,IAAI,CAAC;KAC5D;AAED,IAAA,WAAA,CAAY,IAA8B,EAAA;QAV1C,IAAM,CAAA,MAAA,GAAiB,YAAY,CAAC;QACpC,IAAO,CAAA,OAAA,GAAY,KAAK,CAAC;QACzB,IAAS,CAAA,SAAA,GAAgB,IAAI,CAAC;QAC9B,IAAO,CAAA,OAAA,GAAmB,IAAI,CAAC;QAC/B,IAAK,CAAA,KAAA,GAAa,IAAI,CAAC;QAOnB,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAC7C,IAAI,CAAC,SAAS,GAAG,IAAI,EAAE,SAAS,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC;QACtF,IAAI,CAAC,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QACvC,IAAI,CAAC,OAAO,GAAG,IAAI,EAAE,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;KAChD;AAED,IAAA,MAAM,CAAC,KAAoB,EAAA;QACvB,IAAI,IAAI,KAAK,KAAK;AAAE,YAAA,OAAO,IAAI,CAAC;QAEhC,QACI,KAAK,YAAY,UAAU;AAC3B,YAAA,KAAK,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;AAC9B,YAAA,KAAK,CAAC,SAAS,KAAK,IAAI,CAAC,SAAS;AAClC,YAAA,KAAK,CAAC,KAAK,KAAK,IAAI,CAAC,KAAK;YAC1B,KAAK,CAAC,OAAO,EAAE,IAAI,KAAK,IAAI,CAAC,OAAO,EAAE,IAAI;YAC1C,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,OAAO,EAAE,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,EACpF;KACL;AAED,IAAA,QAAQ,CAAC,IAA4B,EAAA;AACjC,QAAA,OAAO,IAAI,UAAU,CAAI,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;KAC3D;AAED,IAAA,YAAY,CAAC,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,EAA0B,EAAA;QAC3D,OAAO,IAAI,UAAU,CAAI;YACrB,OAAO;AACP,YAAA,SAAS,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS;YACtD,KAAK;AACL,YAAA,OAAO,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;KACN;IAED,eAAe,GAAA;QACX,OAAO,IAAI,CAAC,QAAQ,CAAC;AACjB,YAAA,OAAO,EAAE,IAAI;AAChB,SAAA,CAAC,CAAC;KACN;IAED,QAAQ,GAAA;QACJ,OAAO;YACH,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,OAAO,EAAE,IAAI,CAAC,OAAO;SACxB,CAAC;KACL;IAED,QAAQ,GAAA;AACJ,QAAA,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;KAC/B;AACJ;;ICnEW,YAEX;AAFD,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,mBAAA,CAAA,GAAA,mBAAuC,CAAA;AACzC,CAAC,EAFW,WAAW,KAAX,WAAW,GAEtB,EAAA,CAAA,CAAA,CAAA;AAEM,MAAM,iBAAiB,GAAG;;ACJjC;;;AAGG;MACU,mCAAmC,GAAG,IAAI,cAAc,CACjE,qCAAqC;;ACJzC;;;;;;;AAOG;AACG,SAAU,mBAAmB,CAAC,OAAmC,EAAE,KAAa,EAAE,EAAE,cAAsC,EAAE,MAAe,EAAA;IAC7I,IAAI,QAAQ,GAAa,EAAE,CAAC;AAE5B,IAAA,IAAG,KAAK,CAAC,OAAO,CAAC,EAAE;AACf,QAAA,OAAO,EAAE,CAAC;KACb;AAED,IAAA,IAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE;QACvD,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,KAAI;AACxC,YAAA,IAAG,KAAK,CAAC,cAAc,CAAC,EAAE;AACtB,gBAAA,OAAO,OAAO,CAAC;aAClB;AACD,YAAA,OAAO,cAAc,CAAC,OAAO,CAAC,CAAC;AACnC,SAAC,CAAC,CAAA;KACL;SAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;AAC7B,QAAA,QAAQ,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7B;AAED,IAAA,IAAG,OAAO,CAAC,QAAQ,CAAC,EAAE;AAClB,QAAA,OAAO,EAAE,CAAC;KACb;IAED,OAAO,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAG,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;;AAIG;AACG,SAAU,YAAY,CAAC,MAAW,EAAA;AACpC,IAAA,IAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;AAAE,QAAA,OAAO,KAAK,CAAC;AAEnC,IAAA,IAAG,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE;AACpB,QAAA,OAAO,IAAI,CAAC;KACf;AAED,IAAA,OAAO,KAAK,CAAC;AACjB;;AChDgB,SAAA,kBAAkB,CAAC,MAAW,KAAI;AAElD;;;;AAIG;AACG,SAAU,yBAAyB,CAAC,KAAgC,EAAA;IACtE,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,iBAAiB,EAAE;AACvD,QAAA,IAAI,QAAQ,GAAa,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,EAAE,EAAE,CAAC,CAAC;;QAG1D,IAAI,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAChD,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,aAAa,CAAC,EAAE;AAC5C,YAAA,QAAQ,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;SAChC;;AAED,QAAA,IAAI,KAAK,CAAC,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,EAAE;AAC3D,YAAA,IAAI,OAAO,GAAG,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,OAAO,CAAC,EAAE,SAAS,CAAC,CAAC;AACxD,YAAA,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC;AAAE,gBAAA,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;SAC/C;QACD,OAAO;YACH,IAAI,EAAE,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,CAAC,IAAI,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO;AAClF,YAAA,QAAQ,EAAE,QAAQ;SACrB,CAAC;KACL;SAAM,IAAI,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,YAAY,KAAK,EAAE;QAClD,OAAO;YACH,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,QAAQ,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;SACpF,CAAC;KACL;SAAM;QACH,OAAO;AACH,YAAA,IAAI,EAAE,iBAAiB;SAC1B,CAAC;KACL;AACL;;AC/BA;;;;;AAKG;AACG,SAAU,0BAA0B,CAAI,SAAkC,EAAA;AAC5E,IAAA,OAAO,UAAU,CAAC,CAAC,KAAK,KAAI;AACxB,QAAA,IAAI,OAAgB,CAAC;AACrB,QAAA,IAAG,QAAQ,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY,KAAK,IAAI,KAAK,YAAY,iBAAiB,CAAC,EAAE;AAClF,YAAA,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;SAC9C;AAAM,aAAA,IAAI,YAAY,CAAC,KAAK,CAAC,EAAE;YAC5B,OAAO,GAAG,KAAK,CAAC;SACnB;aAAM;AACH,YAAA,OAAO,GAAG,yBAAyB,CAAC,KAAK,CAAC,CAAC;SAC9C;AACD,QAAA,OAAO,EAAE,CACL,SAAS,CAAC,OAAO,CAAC,CACrB,CAAC;AACN,KAAC,CAAC,CAAC;AACP,CAAC;AAED;;;AAGG;AACI,MAAM,wBAAwB,GAAG,MAAqC;AACzE,IAAA,OAAO,UAAU,CAAC,CAAC,KAAK,KAAI;AACxB,QAAA,IAAI,OAAO,GAAY,yBAAyB,CAAC,KAAK,CAAC,CAAC;AACxD,QAAA,OAAO,UAAU,CAAC,OAAO,CAAC,CAAC;AAC/B,KAAC,CAAC,CAAC;AACP,EAAC;AAED;;;AAGG;AACI,MAAM,mBAAmB,GAAG,MAAqC;AACpE,IAAA,OAAO,UAAU,CAAC,CAAC,KAAK,KAAI;AACxB,QAAA,IAAI,OAAO,GAAY,yBAAyB,CAAC,KAAK,CAAC,CAAC;AACxD,QAAA,OAAO,EAAE,CAAC,OAAO,CAAC,CAAC;AACvB,KAAC,CAAC,CAAC;AACP,EAAC;AAED;;;;;;;;AAQG;AACI,MAAM,qBAAqB,GAAG,CAAC,EAAA,GAAa,EAAE,EAAE,cAAsC,EAAE,MAAe,KAA0D;AACpK,IAAA,OAAO,GAAG,CAAC,CAAC,OAAO,KAAI;QACnB,OAAO,mBAAmB,CAAC,OAAO,EAAE,EAAE,EAAE,cAAc,EAAE,MAAM,CAAC,CAAC;AACpE,KAAC,CAAC,CAAC;AACP;;ACjEM,SAAU,gBAAgB,CAAC,IAAY,EAAA;IACzC,OAAO;AACH,QAAA,IAAI,EAAE,IAAI;KACb,CAAA;AACL;;ACJA;;AAEG;;;;"}
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./models";
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { Failure } from '../../types';
|
|
2
|
+
export interface ILoadedData<T> {
|
|
3
|
+
loading: boolean;
|
|
4
|
+
timestamp: Date | null;
|
|
5
|
+
failure: Failure | null;
|
|
6
|
+
value: T | null;
|
|
7
|
+
}
|
|
8
|
+
export declare class LoadedData<T> {
|
|
9
|
+
_class: 'LoadedData';
|
|
10
|
+
loading: boolean;
|
|
11
|
+
timestamp: Date | null;
|
|
12
|
+
failure: Failure | null;
|
|
13
|
+
value: T | null;
|
|
14
|
+
get errored(): boolean;
|
|
15
|
+
constructor(data?: Partial<ILoadedData<T>>);
|
|
16
|
+
equals(other: LoadedData<T>): boolean;
|
|
17
|
+
copyWith(data: Partial<LoadedData<T>>): LoadedData<T>;
|
|
18
|
+
copyWithData({ loading, value }: Partial<LoadedData<T>>): LoadedData<T>;
|
|
19
|
+
copyWithLoading(): LoadedData<T>;
|
|
20
|
+
toObject(): ILoadedData<T>;
|
|
21
|
+
toString(): string;
|
|
22
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { IUser } from "../../domain";
|
|
2
|
+
export declare class UserModel implements IUser {
|
|
3
|
+
email: string;
|
|
4
|
+
firstName: string;
|
|
5
|
+
lastName: string;
|
|
6
|
+
roles: string[];
|
|
7
|
+
permissions: string[];
|
|
8
|
+
accountConfirmedAt?: Date | undefined;
|
|
9
|
+
id: string;
|
|
10
|
+
constructor(data: Partial<IUser>);
|
|
11
|
+
get fullName(): string;
|
|
12
|
+
}
|
package/package.json
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@geekbears/gb-ngrx-stack-base",
|
|
3
|
+
"version": "17.0.5",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^17.2.1",
|
|
6
|
+
"@angular/core": "^17.2.1"
|
|
7
|
+
},
|
|
8
|
+
"dependencies": {
|
|
9
|
+
"tslib": "^2.3.0"
|
|
10
|
+
},
|
|
11
|
+
"module": "fesm2022/geekbears-gb-ngrx-stack-base.mjs",
|
|
12
|
+
"typings": "index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
"./package.json": {
|
|
15
|
+
"default": "./package.json"
|
|
16
|
+
},
|
|
17
|
+
".": {
|
|
18
|
+
"types": "./index.d.ts",
|
|
19
|
+
"esm2022": "./esm2022/geekbears-gb-ngrx-stack-base.mjs",
|
|
20
|
+
"esm": "./esm2022/geekbears-gb-ngrx-stack-base.mjs",
|
|
21
|
+
"default": "./fesm2022/geekbears-gb-ngrx-stack-base.mjs"
|
|
22
|
+
}
|
|
23
|
+
},
|
|
24
|
+
"sideEffects": false
|
|
25
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { IUser } from '..';
|
|
2
|
+
export interface IAuthenticationResponse {
|
|
3
|
+
id: string;
|
|
4
|
+
token: string;
|
|
5
|
+
expired: boolean;
|
|
6
|
+
user?: IUser | null;
|
|
7
|
+
refreshToken?: string | null;
|
|
8
|
+
deviceInfo?: IAuthDeviceInfo;
|
|
9
|
+
copyWith(data: Partial<IAuthenticationResponse>): IAuthenticationResponse;
|
|
10
|
+
}
|
|
11
|
+
export interface IAuthDeviceInfo {
|
|
12
|
+
id: string;
|
|
13
|
+
name: string;
|
|
14
|
+
toJson(): string;
|
|
15
|
+
toMap(): {
|
|
16
|
+
[key: string]: any;
|
|
17
|
+
};
|
|
18
|
+
}
|
package/types/index.d.ts
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { InjectionToken } from '@angular/core';
|
|
2
|
+
import { ActionCreator, NotAllowedCheck } from '@ngrx/store';
|
|
3
|
+
import { TypedAction } from '@ngrx/store/src/models';
|
|
4
|
+
import { IAuthenticationResponse } from '../types';
|
|
5
|
+
/**
|
|
6
|
+
* The idea of this token is to have a way to register a general action that deals with authentication changes
|
|
7
|
+
* this way different libraries can rely on it either by subscribing it or dispatching it
|
|
8
|
+
*/
|
|
9
|
+
export declare const AuthenticationChangeBaseActionToken: InjectionToken<AuthenticationChangeAction>;
|
|
10
|
+
export type AuthenticationChangeAction = ActionCreator<string, (props: AuthenticationChangeActionProps & NotAllowedCheck<AuthenticationChangeActionProps>) => AuthenticationChangeActionProps & TypedAction<string>>;
|
|
11
|
+
export interface AuthenticationChangeActionProps {
|
|
12
|
+
authenticated: boolean;
|
|
13
|
+
data: IAuthenticationResponse | null;
|
|
14
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { Failure } from "../types";
|
|
2
|
+
export type FailureMessageWrapper = (message: string) => string;
|
|
3
|
+
/**
|
|
4
|
+
*
|
|
5
|
+
* @param failure The Failure as input
|
|
6
|
+
* @param or If failure is null or couln't not retrieve any message from it, use this instead. Defaults to '' empty string
|
|
7
|
+
* @param messageWrapper Failures often return an array of messages, this give you the oportunity to wrap each message between whatever you want
|
|
8
|
+
* @param joiner The postfix that will join each message together, default behavior is to join by line break '\n'
|
|
9
|
+
* @returns A sigle string with the failure messages.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getFailureMessageOr(failure: Failure | null | undefined, or?: string, messageWrapper?: FailureMessageWrapper, joiner?: string): string;
|
|
12
|
+
/**
|
|
13
|
+
* Since Failure is not a runtime type but just an interface this check if given object can be treated as a Failure
|
|
14
|
+
* @param object Any object expected to be a Failure
|
|
15
|
+
* @returns {boolean}
|
|
16
|
+
*/
|
|
17
|
+
export declare function maybeFailure(object: any): boolean;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { HttpErrorResponse } from '@angular/common/http';
|
|
2
|
+
import { Failure } from '../types';
|
|
3
|
+
export declare function httpResponseHandle(params: any): void;
|
|
4
|
+
/**
|
|
5
|
+
*
|
|
6
|
+
* @param error Throwed error by a function on the call stack
|
|
7
|
+
* @returns Returns a valid {Failure}
|
|
8
|
+
*/
|
|
9
|
+
export declare function httpResponseFailureHandle(error: Error | HttpErrorResponse): Failure;
|
package/utils/index.d.ts
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { OperatorFunction } from "rxjs";
|
|
2
|
+
import { Failure } from "../types";
|
|
3
|
+
import { FailureMessageWrapper } from "./failure.helper";
|
|
4
|
+
/**
|
|
5
|
+
* This operator helps you catching any exception on your API call and tries to get a Failure form it and provides you with an easy way
|
|
6
|
+
* of proccessing that failure into something else
|
|
7
|
+
* @param converter Mapper function to dispatch given value instead of the Failure
|
|
8
|
+
* @returns Returns any value provided ny the converter
|
|
9
|
+
*/
|
|
10
|
+
export declare function catchAndGetFromFailureRxOp<T>(converter: (failure: Failure) => T): OperatorFunction<any, T>;
|
|
11
|
+
/**
|
|
12
|
+
* Catch an error, throws a Failure in the onservabe pipeline
|
|
13
|
+
* @returns Catch any error from the proccesed pipeline and throws a Failure instead
|
|
14
|
+
*/
|
|
15
|
+
export declare const catchAndThrowFailureRxOp: () => OperatorFunction<any, Failure>;
|
|
16
|
+
/**
|
|
17
|
+
* Catch an error and gets a Failure from it
|
|
18
|
+
* @returns Returns a Failure
|
|
19
|
+
*/
|
|
20
|
+
export declare const catchGetFailureRxOp: () => OperatorFunction<any, Failure>;
|
|
21
|
+
/**
|
|
22
|
+
* This converts failure to a message using same logic as '[getFailureMessageOr]'
|
|
23
|
+
* @see {@link getFailureMessageOr}
|
|
24
|
+
*
|
|
25
|
+
* @param or
|
|
26
|
+
* @param messageWrapper
|
|
27
|
+
* @param joiner
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
export declare const getFailureMessageRxOp: (or?: string, messageWrapper?: FailureMessageWrapper, joiner?: string) => OperatorFunction<Failure | null | undefined, string>;
|
package/utils/test.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function mockHttpResponse(data: object): object;
|