@albi_scando/as-backbone-lib 1.1.1 → 1.1.3
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 +21 -16
- package/{dist/as-backbone-lib/fesm2022 → fesm2022}/albi_scando-as-backbone-lib.mjs +105 -108
- package/fesm2022/albi_scando-as-backbone-lib.mjs.map +1 -0
- package/package.json +19 -102
- package/dist/as-backbone-lib/README.md +0 -64
- package/dist/as-backbone-lib/fesm2022/albi_scando-as-backbone-lib.mjs.map +0 -1
- /package/{dist/as-backbone-lib/types → types}/albi_scando-as-backbone-lib.d.ts +0 -0
package/README.md
CHANGED
|
@@ -1,16 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# AsBackboneLib
|
|
2
2
|
|
|
3
|
-
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.2.
|
|
4
|
-
|
|
5
|
-
## Development server
|
|
6
|
-
|
|
7
|
-
To start a local development server, run:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
ng serve
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
Once the server is running, open your browser and navigate to `http://localhost:4200/`. The application will automatically reload whenever you modify any of the source files.
|
|
3
|
+
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.2.0.
|
|
14
4
|
|
|
15
5
|
## Code scaffolding
|
|
16
6
|
|
|
@@ -28,17 +18,32 @@ ng generate --help
|
|
|
28
18
|
|
|
29
19
|
## Building
|
|
30
20
|
|
|
31
|
-
To build the
|
|
21
|
+
To build the library, run:
|
|
32
22
|
|
|
33
23
|
```bash
|
|
34
|
-
ng build
|
|
24
|
+
ng build as-backbone-lib
|
|
35
25
|
```
|
|
36
26
|
|
|
37
|
-
This will compile your project and
|
|
27
|
+
This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
|
|
28
|
+
|
|
29
|
+
### Publishing the Library
|
|
30
|
+
|
|
31
|
+
Once the project is built, you can publish your library by following these steps:
|
|
32
|
+
|
|
33
|
+
1. Navigate to the `dist` directory:
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
cd dist/as-backbone-lib
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
2. Run the `npm publish` command to publish your library to the npm registry:
|
|
40
|
+
```bash
|
|
41
|
+
npm publish
|
|
42
|
+
```
|
|
38
43
|
|
|
39
44
|
## Running unit tests
|
|
40
45
|
|
|
41
|
-
To execute unit tests with the [
|
|
46
|
+
To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
|
|
42
47
|
|
|
43
48
|
```bash
|
|
44
49
|
ng test
|
|
@@ -2,13 +2,10 @@ import { HttpClient, HttpEventType } from '@angular/common/http';
|
|
|
2
2
|
import * as i0 from '@angular/core';
|
|
3
3
|
import { inject, Injectable, signal, computed, Pipe } from '@angular/core';
|
|
4
4
|
import { HTTP_HEADERS, HTTP_RESPONSE_STATUS_CODES } from '@albi_scando/as-const-http-lib';
|
|
5
|
-
import {
|
|
5
|
+
import { STRING_EMPTY, TRANSLATION_DELIBERATELY_UNSET } from '@albi_scando/as-const-lib';
|
|
6
|
+
import { of, take, tap, catchError, throwError, forkJoin, defaultIfEmpty, map, defer, EMPTY, switchMap } from 'rxjs';
|
|
6
7
|
import { LoggerService } from '@albi_scando/as-log-lib';
|
|
7
|
-
import { tap, catchError, throwError, of, forkJoin, defaultIfEmpty, map, take, defer, EMPTY, switchMap } from 'rxjs';
|
|
8
8
|
import { LOCALE_ISO_CODES, LOCALES } from '@albi_scando/as-const-languages-lib';
|
|
9
|
-
import { TRANSLATION_DELIBERATELY_UNSET } from '@albi_scando/as-const-lib/dist/types/constants/constants';
|
|
10
|
-
import { HttpService as HttpService$1 } from '@http/services/http/http.service';
|
|
11
|
-
import { STRING_EMPTY } from '@albi_scando/as-const-lib';
|
|
12
9
|
|
|
13
10
|
class HttpService {
|
|
14
11
|
/**
|
|
@@ -122,6 +119,104 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImpor
|
|
|
122
119
|
}]
|
|
123
120
|
}] });
|
|
124
121
|
|
|
122
|
+
var language = {
|
|
123
|
+
username: "user",
|
|
124
|
+
updateAPI: ""
|
|
125
|
+
};
|
|
126
|
+
var defaultConfigJSON$1 = {
|
|
127
|
+
language: language
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
const DEFAULT_USERNAME = 'guest';
|
|
131
|
+
const DEFAULT_LEVEL = 'guest';
|
|
132
|
+
|
|
133
|
+
class UserService {
|
|
134
|
+
/**
|
|
135
|
+
* {@link IUserService.username}
|
|
136
|
+
*/
|
|
137
|
+
username = signal(undefined, ...(ngDevMode ? [{ debugName: "username" }] : /* istanbul ignore next */ []));
|
|
138
|
+
/**
|
|
139
|
+
* {@link IUserService.token}
|
|
140
|
+
*/
|
|
141
|
+
token = signal(undefined, ...(ngDevMode ? [{ debugName: "token" }] : /* istanbul ignore next */ []));
|
|
142
|
+
/**
|
|
143
|
+
* @see IUserService.locale
|
|
144
|
+
*/
|
|
145
|
+
locale = signal(undefined, ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
146
|
+
/**
|
|
147
|
+
* Derived signal that indicates whether the user is logged in.
|
|
148
|
+
* Returns true if both username and token are set and not empty.
|
|
149
|
+
*/
|
|
150
|
+
isLoggedIn = computed(() => {
|
|
151
|
+
const username = this.username();
|
|
152
|
+
const token = this.token();
|
|
153
|
+
return (username !== null &&
|
|
154
|
+
username !== undefined &&
|
|
155
|
+
username !== STRING_EMPTY &&
|
|
156
|
+
token !== null &&
|
|
157
|
+
token !== undefined &&
|
|
158
|
+
token !== STRING_EMPTY);
|
|
159
|
+
}, ...(ngDevMode ? [{ debugName: "isLoggedIn" }] : /* istanbul ignore next */ []));
|
|
160
|
+
/**
|
|
161
|
+
* Constructor
|
|
162
|
+
* @constructor
|
|
163
|
+
* @ignore
|
|
164
|
+
*/
|
|
165
|
+
constructor() {
|
|
166
|
+
this.initialize();
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* @see IUserService.setup$
|
|
170
|
+
*/
|
|
171
|
+
setup$(setup) {
|
|
172
|
+
this.reset();
|
|
173
|
+
this.setUsername(setup.username);
|
|
174
|
+
return of(undefined);
|
|
175
|
+
}
|
|
176
|
+
/**
|
|
177
|
+
* @see IUserService.reset
|
|
178
|
+
*/
|
|
179
|
+
reset() {
|
|
180
|
+
this.initialize();
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* @see IUserService.setUsername
|
|
184
|
+
*/
|
|
185
|
+
setUsername(username) {
|
|
186
|
+
this.username.set(username);
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* @see IUserService.setLocale
|
|
190
|
+
*/
|
|
191
|
+
setLocale(locale) {
|
|
192
|
+
this.locale.set(locale);
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Initialization method
|
|
196
|
+
*
|
|
197
|
+
* @returns {void}
|
|
198
|
+
*/
|
|
199
|
+
initialize() {
|
|
200
|
+
const config = defaultConfigJSON$1;
|
|
201
|
+
const setup = {
|
|
202
|
+
username: config.language?.username ?? DEFAULT_USERNAME,
|
|
203
|
+
level: DEFAULT_LEVEL,
|
|
204
|
+
api: {
|
|
205
|
+
patchUserDataAPIUrl: config.language?.updateAPI ?? STRING_EMPTY,
|
|
206
|
+
},
|
|
207
|
+
};
|
|
208
|
+
this.setup$(setup).pipe(take(1)).subscribe();
|
|
209
|
+
}
|
|
210
|
+
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: UserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
211
|
+
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: UserService, providedIn: 'root' });
|
|
212
|
+
}
|
|
213
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: UserService, decorators: [{
|
|
214
|
+
type: Injectable,
|
|
215
|
+
args: [{
|
|
216
|
+
providedIn: 'root',
|
|
217
|
+
}]
|
|
218
|
+
}], ctorParameters: () => [] });
|
|
219
|
+
|
|
125
220
|
/**
|
|
126
221
|
* This interceptor is responsible for adding Authorization header parameter to every outgoing HttpRequest
|
|
127
222
|
*
|
|
@@ -133,7 +228,7 @@ const authorizationInterceptor = (httpRequest, next) => {
|
|
|
133
228
|
/**
|
|
134
229
|
* {@link UserService}
|
|
135
230
|
*/
|
|
136
|
-
const userService = inject(UserService
|
|
231
|
+
const userService = inject(UserService);
|
|
137
232
|
const token = userService.token();
|
|
138
233
|
if (token === undefined) {
|
|
139
234
|
return next(httpRequest);
|
|
@@ -255,7 +350,7 @@ class TranslationsService {
|
|
|
255
350
|
/**
|
|
256
351
|
* {@link HttpService}
|
|
257
352
|
*/
|
|
258
|
-
httpService = inject(HttpService
|
|
353
|
+
httpService = inject(HttpService);
|
|
259
354
|
/**
|
|
260
355
|
* {@link LoggerService}
|
|
261
356
|
*/
|
|
@@ -446,7 +541,7 @@ var languages = [
|
|
|
446
541
|
"en",
|
|
447
542
|
"it"
|
|
448
543
|
];
|
|
449
|
-
var defaultConfigJSON
|
|
544
|
+
var defaultConfigJSON = {
|
|
450
545
|
languages: languages
|
|
451
546
|
};
|
|
452
547
|
|
|
@@ -483,14 +578,14 @@ class LanguageService {
|
|
|
483
578
|
/**
|
|
484
579
|
* {@link UserService}
|
|
485
580
|
*/
|
|
486
|
-
userService = inject(UserService
|
|
581
|
+
userService = inject(UserService);
|
|
487
582
|
/**
|
|
488
583
|
* Constructor
|
|
489
584
|
* @constructor
|
|
490
585
|
* @ignore
|
|
491
586
|
*/
|
|
492
587
|
constructor() {
|
|
493
|
-
const config = defaultConfigJSON
|
|
588
|
+
const config = defaultConfigJSON;
|
|
494
589
|
const setup = {
|
|
495
590
|
locales: new Set(config['locales']),
|
|
496
591
|
currentLocale: config['currentLocale'],
|
|
@@ -644,104 +739,6 @@ const USER_LEVELS = {
|
|
|
644
739
|
GUEST: 'guest',
|
|
645
740
|
};
|
|
646
741
|
|
|
647
|
-
var language = {
|
|
648
|
-
username: "user",
|
|
649
|
-
updateAPI: ""
|
|
650
|
-
};
|
|
651
|
-
var defaultConfigJSON = {
|
|
652
|
-
language: language
|
|
653
|
-
};
|
|
654
|
-
|
|
655
|
-
const DEFAULT_USERNAME = 'guest';
|
|
656
|
-
const DEFAULT_LEVEL = 'guest';
|
|
657
|
-
|
|
658
|
-
class UserService {
|
|
659
|
-
/**
|
|
660
|
-
* {@link IUserService.username}
|
|
661
|
-
*/
|
|
662
|
-
username = signal(undefined, ...(ngDevMode ? [{ debugName: "username" }] : /* istanbul ignore next */ []));
|
|
663
|
-
/**
|
|
664
|
-
* {@link IUserService.token}
|
|
665
|
-
*/
|
|
666
|
-
token = signal(undefined, ...(ngDevMode ? [{ debugName: "token" }] : /* istanbul ignore next */ []));
|
|
667
|
-
/**
|
|
668
|
-
* @see IUserService.locale
|
|
669
|
-
*/
|
|
670
|
-
locale = signal(undefined, ...(ngDevMode ? [{ debugName: "locale" }] : /* istanbul ignore next */ []));
|
|
671
|
-
/**
|
|
672
|
-
* Derived signal that indicates whether the user is logged in.
|
|
673
|
-
* Returns true if both username and token are set and not empty.
|
|
674
|
-
*/
|
|
675
|
-
isLoggedIn = computed(() => {
|
|
676
|
-
const username = this.username();
|
|
677
|
-
const token = this.token();
|
|
678
|
-
return (username !== null &&
|
|
679
|
-
username !== undefined &&
|
|
680
|
-
username !== STRING_EMPTY &&
|
|
681
|
-
token !== null &&
|
|
682
|
-
token !== undefined &&
|
|
683
|
-
token !== STRING_EMPTY);
|
|
684
|
-
}, ...(ngDevMode ? [{ debugName: "isLoggedIn" }] : /* istanbul ignore next */ []));
|
|
685
|
-
/**
|
|
686
|
-
* Constructor
|
|
687
|
-
* @constructor
|
|
688
|
-
* @ignore
|
|
689
|
-
*/
|
|
690
|
-
constructor() {
|
|
691
|
-
this.initialize();
|
|
692
|
-
}
|
|
693
|
-
/**
|
|
694
|
-
* @see IUserService.setup$
|
|
695
|
-
*/
|
|
696
|
-
setup$(setup) {
|
|
697
|
-
this.reset();
|
|
698
|
-
this.setUsername(setup.username);
|
|
699
|
-
return of(undefined);
|
|
700
|
-
}
|
|
701
|
-
/**
|
|
702
|
-
* @see IUserService.reset
|
|
703
|
-
*/
|
|
704
|
-
reset() {
|
|
705
|
-
this.initialize();
|
|
706
|
-
}
|
|
707
|
-
/**
|
|
708
|
-
* @see IUserService.setUsername
|
|
709
|
-
*/
|
|
710
|
-
setUsername(username) {
|
|
711
|
-
this.username.set(username);
|
|
712
|
-
}
|
|
713
|
-
/**
|
|
714
|
-
* @see IUserService.setLocale
|
|
715
|
-
*/
|
|
716
|
-
setLocale(locale) {
|
|
717
|
-
this.locale.set(locale);
|
|
718
|
-
}
|
|
719
|
-
/**
|
|
720
|
-
* Initialization method
|
|
721
|
-
*
|
|
722
|
-
* @returns {void}
|
|
723
|
-
*/
|
|
724
|
-
initialize() {
|
|
725
|
-
const config = defaultConfigJSON;
|
|
726
|
-
const setup = {
|
|
727
|
-
username: config.language?.username ?? DEFAULT_USERNAME,
|
|
728
|
-
level: DEFAULT_LEVEL,
|
|
729
|
-
api: {
|
|
730
|
-
patchUserDataAPIUrl: config.language?.updateAPI ?? STRING_EMPTY,
|
|
731
|
-
},
|
|
732
|
-
};
|
|
733
|
-
this.setup$(setup).pipe(take(1)).subscribe();
|
|
734
|
-
}
|
|
735
|
-
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: UserService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
|
|
736
|
-
static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: UserService, providedIn: 'root' });
|
|
737
|
-
}
|
|
738
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.4", ngImport: i0, type: UserService, decorators: [{
|
|
739
|
-
type: Injectable,
|
|
740
|
-
args: [{
|
|
741
|
-
providedIn: 'root',
|
|
742
|
-
}]
|
|
743
|
-
}], ctorParameters: () => [] });
|
|
744
|
-
|
|
745
742
|
/**
|
|
746
743
|
* Generated bundle index. Do not edit.
|
|
747
744
|
*/
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"albi_scando-as-backbone-lib.mjs","sources":["../../../projects/as-backbone-lib/src/lib/modules/http/services/http/http.service.ts","../../../projects/as-backbone-lib/src/lib/modules/user/constants/default.ts","../../../projects/as-backbone-lib/src/lib/modules/user/services/user/user.service.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/authorization/authorization.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/log-request/log-request.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/request-timestamp/request-timestamp.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/unauthorized/unauthorized.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/language/services/translations/translations.service.ts","../../../projects/as-backbone-lib/src/lib/modules/language/pipes/translate/translate.pipe.ts","../../../projects/as-backbone-lib/src/lib/modules/language/constants/constants.ts","../../../projects/as-backbone-lib/src/lib/modules/language/services/language/language.service.ts","../../../projects/as-backbone-lib/src/lib/modules/user/constants/user-levels.constant.ts","../../../projects/as-backbone-lib/src/albi_scando-as-backbone-lib.ts"],"sourcesContent":["import type { HttpHeaders } from '@albi_scando/as-const-http-lib';\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\n\nimport type { IHttpService } from './http.service.interface';\nimport type { Delete } from '../../interfaces/delete';\nimport type { Get } from '../../interfaces/get';\nimport type { Patch } from '../../interfaces/patch';\nimport type { Post } from '../../interfaces/post';\nimport type { Put } from '../../interfaces/put';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService implements IHttpService {\n\n /**\n * {@link HttpClient}\n */\n private httpClient: HttpClient = inject(HttpClient);\n\n /**\n * {@link IHttpService.expiredPasswordFn}\n */\n public expiredPasswordFn = (): void => undefined;\n\n /**\n * {@link IHttpService.unauthorizedFn}\n */\n public unauthorizedFn = (): void => undefined;\n\n /**\n * Perform http delete request\n *\n * @param {Delete} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public delete(httpRequest: Delete): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.delete(httpRequest.url, options);\n }\n\n /**\n * Perform http get request\n *\n * @param {Get} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public get(httpRequest: Get): Observable<unknown> {\n httpRequest.url = this._setQueryParams(httpRequest.queryParams, httpRequest.url);\n\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.get(httpRequest.url, options);\n }\n\n /**\n * Perform http patch request\n *\n * @param {Patch} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public patch(httpRequest: Patch): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.patch(httpRequest.url, httpRequest.body, options);\n }\n\n /**\n * Perform http post request\n *\n * @param {Post} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public post(httpRequest: Post): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.post(httpRequest.url, httpRequest.body, options);\n }\n\n /**\n * Perform http put request\n *\n * @param {Put} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public put(httpRequest: Put): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.put(httpRequest.url, httpRequest.body, options);\n }\n\n /**\n * Set url query parameters\n *\n * @param {Map<string, string>} queryParams query parameters key-value pairs\n * @param {string} url original httpRequest url\n * @returns {string} new url with aquery parameters\n */\n private _setQueryParams(queryParams = new Map<string, string>(), url: string): string {\n if (queryParams.size === 0) {\n return url;\n }\n\n url += `?${Array.from(queryParams.entries()).map(([key, value]) => `${key}=${value}`).join('&')}`;\n return url;\n }\n\n /**\n * Type safe header options for HttpClient methods\n * @param httpRequestHeaders header parameters key-value pairs\n * @returns header options for HttpClient methods\n */\n private typeSafeHeaderOptions(\n httpRequestHeaders: Map<HttpHeaders, string | boolean> | undefined\n ): {\n headers: Partial<Record<HttpHeaders, string>>;\n } {\n return { headers: Object.fromEntries(this._setHeaderParams(httpRequestHeaders)) };\n }\n \n /**\n * Set http request header parameters\n *\n * @param {Map<HttpHeaders, string | boolean>} headerParams header parameters key-value pairs\n * @returns {Map<HttpHeaders, string>} header parameters key-value pairs. All values must be strings.\n */\n private _setHeaderParams(headerParams: Map<HttpHeaders, string | boolean> | undefined): Map<HttpHeaders, string> {\n if (headerParams === undefined || headerParams.size === 0) {\n return new Map();\n }\n\n const headerParameters: Map<HttpHeaders, string> = new Map<HttpHeaders, string>();\n Array.from(headerParams.entries()).forEach(([key, value]: [key: HttpHeaders, value: string | boolean]) => {\n headerParameters.set(key, `${value}`);\n });\n\n return headerParameters;\n }\n}\n","export const DEFAULT_USERNAME = 'guest';\nexport const DEFAULT_LEVEL = 'guest';\n","import type { Locales } from '@albi_scando/as-const-languages-lib';\nimport { STRING_EMPTY } from '@albi_scando/as-const-lib';\nimport type { Signal, WritableSignal } from '@angular/core';\nimport { Injectable, computed, signal } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { of, take } from 'rxjs';\n\n// Assets\nimport type { IUserService } from './user.service.interface';\nimport defaultConfigJSON from '../../assets/jsons/default.json';\n// Constants\nimport { DEFAULT_LEVEL, DEFAULT_USERNAME } from '../../constants/default';\n// Interfaces\nimport type { IUserLibSetup } from '../../interfaces/setup.interface';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService implements IUserService {\n /**\n * {@link IUserService.username}\n */\n public username: WritableSignal<string | undefined> = signal(undefined);\n\n /**\n * {@link IUserService.token}\n */\n public token: WritableSignal<string | undefined> = signal(undefined);\n\n /**\n * @see IUserService.locale\n */\n public locale: WritableSignal<Locales | undefined> = signal(undefined);\n\n /**\n * Derived signal that indicates whether the user is logged in.\n * Returns true if both username and token are set and not empty.\n */\n public isLoggedIn: Signal<boolean> = computed(() => {\n const username = this.username();\n const token = this.token();\n return (\n username !== null &&\n username !== undefined &&\n username !== STRING_EMPTY &&\n token !== null &&\n token !== undefined &&\n token !== STRING_EMPTY\n );\n });\n\n /**\n * Constructor\n * @constructor\n * @ignore\n */\n constructor() {\n this.initialize();\n }\n\n /**\n * @see IUserService.setup$\n */\n public setup$(setup: IUserLibSetup): Observable<void> {\n this.reset();\n\n this.setUsername(setup.username);\n\n return of(undefined);\n }\n\n /**\n * @see IUserService.reset\n */\n public reset(): void {\n this.initialize();\n }\n\n /**\n * @see IUserService.setUsername\n */\n public setUsername(username: string): void {\n this.username.set(username);\n }\n\n /**\n * @see IUserService.setLocale\n */\n public setLocale(locale: Locales): void {\n this.locale.set(locale);\n }\n\n /**\n * Initialization method\n * \n * @returns {void}\n */\n private initialize(): void {\n const config = defaultConfigJSON as {\n language?: {\n username?: string;\n updateAPI?: string;\n };\n };\n\n const setup: IUserLibSetup = {\n username: config.language?.username ?? DEFAULT_USERNAME,\n level: DEFAULT_LEVEL as IUserLibSetup['level'],\n api: {\n patchUserDataAPIUrl: config.language?.updateAPI ?? STRING_EMPTY,\n },\n };\n\n this.setup$(setup).pipe(take(1)).subscribe();\n }\n}\n","import { HTTP_HEADERS } from '@albi_scando/as-const-http-lib';\nimport type {\n HttpEvent,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\n\nimport { UserService } from '../../../user/services/user/user.service';\n\n/**\n * This interceptor is responsible for adding Authorization header parameter to every outgoing HttpRequest\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link Observable<HttpEvent>}\n */\nexport const authorizationInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n /**\n * {@link UserService}\n */\n const userService: UserService = inject(UserService);\n const token: string | undefined = userService.token();\n\n if (token === undefined) {\n return next(httpRequest);\n }\n\n const clonedRequest: HttpRequest<unknown> = httpRequest.clone({\n headers: httpRequest.headers.set(\n HTTP_HEADERS.AUTHORIZATION,\n token\n ),\n });\n return next(clonedRequest);\n};\n","import { LoggerService } from '@albi_scando/as-log-lib';\nimport type {\n HttpEvent,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable} from 'rxjs';\nimport { tap } from 'rxjs';\n\n/**\n * This interceptor logs every outgoing HttpRequest.\n * It fulfills the same task as the developer tools Network inspector.\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link Observable<HttpEvent>}\n */\nexport const logRequestInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n /**\n * {@link LoggerService}\n */\n const loggerService: LoggerService = inject(LoggerService);\n\n return next(httpRequest).pipe(\n tap(() => {\n loggerService.debug(\n `${logRequestInterceptor.name}: - ${httpRequest.url} http request`,\n httpRequest\n );\n })\n );\n};\n","import { LoggerService } from '@albi_scando/as-log-lib';\nimport type {\n HttpEvent,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { HttpEventType } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { tap } from 'rxjs';\n\n/**\n * This interceptor logs the time interval (in milliseconds) between the request submission and the incoming response.\n * It fulfills the same task as 'Waterfall' graph in the developer tools Network inspector.\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link Observable<HttpEvent>}\n */\nexport const requestTimestampInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n /**\n * {@link LoggerService}\n */\n const loggerService: LoggerService = inject(LoggerService);\n\n const startTime: number = Date.now();\n const formatLog = (message: string, isError = false): void => {\n const diff: number = Date.now() - startTime;\n const logMessage = `${requestTimestampInterceptor.name}: - ${httpRequest.url} ${message} in ${diff} ms`;\n if (isError) {\n loggerService.error(logMessage);\n } else {\n loggerService.debug(logMessage);\n }\n };\n\n return next(httpRequest).pipe(\n tap({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n formatLog('succeeded');\n }\n },\n error: () => {\n formatLog('failed', true);\n },\n })\n );\n};\n","import { HTTP_RESPONSE_STATUS_CODES } from '@albi_scando/as-const-http-lib';\nimport type {\n HttpRequest,\n HttpErrorResponse,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpEvent,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { catchError, of, throwError } from 'rxjs';\n\n// Services\nimport { HttpService } from '../../services/http/http.service';\n\nconst EXPIRED_PASSWORD_MESSAGE = 'Expired password';\n\n/**\n * Http request interceptor to handle 401 unauthorized responses.\n * 401 error is special, because it needs more than just a feedback.\n * In most situations, it could be provoked by an expired token that requires a redirect to a 'Login' page.\n * When validating credentials, it could be provoked by an expired password that requires a redirect to 'Change password' page.\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link : Observable<HttpEvent>}\n */\nexport const unauthorizedInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n const httpService: HttpService = inject(HttpService);\n\n return next(httpRequest).pipe(\n catchError((httpResponse: HttpErrorResponse) => {\n if (httpResponse.status !== HTTP_RESPONSE_STATUS_CODES.UNAUTHORIZED) {\n return throwError(() => httpResponse);\n }\n\n const errorMessage: string | undefined = httpResponse.error?.ErrMsg;\n if (errorMessage === EXPIRED_PASSWORD_MESSAGE) {\n httpService.expiredPasswordFn();\n } else {\n httpService.unauthorizedFn();\n }\n\n return of();\n })\n );\n};\n","import { LOCALE_ISO_CODES, type Locales } from '@albi_scando/as-const-languages-lib';\nimport { TRANSLATION_DELIBERATELY_UNSET } from '@albi_scando/as-const-lib';\nimport { LoggerService } from '@albi_scando/as-log-lib';\nimport type { Signal, WritableSignal } from '@angular/core';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { defaultIfEmpty, forkJoin, map } from 'rxjs';\n\nimport type { Get } from '../../../http/interfaces/get';\nimport { HttpService } from '../../../http/services/http/http.service';\n// Interfaces\nimport type { Translations } from '../../interfaces/translations.interface';\n\n/**\n * A service that manages translations based on the current language.\n *\n * The `TranslationsService` handles fetching, storing, and updating translations\n * for different languages. It interacts with various translation sources and\n * provides methods to retrieve translations based on a given key.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationsService {\n /**\n * List of translations sources (apis/files)\n */\n private _sources = new Set<string>();\n\n /**\n * Current translations dictionary, mapping translation keys to their values.\n */\n public translations: WritableSignal<Map<string, string>> = signal(new Map());\n\n /**\n * Derived signal that indicates whether translations are currently loaded.\n * Returns true if the translations map contains any entries.\n */\n public hasTranslations: Signal<boolean> = computed(\n () => this.translations().size > 0\n );\n\n /**\n * Derived signal for the count of currently loaded translations.\n * Useful for debugging or monitoring translation load status.\n */\n public translationsCount: Signal<number> = computed(\n () => this.translations().size\n );\n\n /**\n * {@link HttpService}\n */\n private readonly httpService = inject(HttpService);\n\n /**\n * {@link LoggerService}\n */\n private readonly loggerService = inject(LoggerService);\n\n /**\n * Adds new translation sources and optionally updates translations for a given language code.\n *\n * If no language code is provided, the translations will not be updated immediately.\n * The translations will be updated as soon as the current language is set.\n *\n * @param {Set<TranslationsSource>} sources New sources to add.\n * @param {Locales} [language=stringEmpty] Optional language code to trigger translations update.\n * @returns {Observable<void>} An observable that completes when the translations are updated.\n */\n public addTranslationsSources$(\n sources: Set<string>,\n language: Locales\n ): Observable<void> {\n this._sources = new Set([...this._sources, ...sources]);\n this.loggerService.debug(`Translations sources added`, this._sources);\n\n return this.updateTranslations$(language, sources);\n }\n\n /**\n * Updates translations based on the provided language code and sources.\n *\n * @param {Locales} language The language code to use for updating translations.\n * @param {Set<TranslationsSource>} [sources=this._sources] Optional set of sources to update.\n * @returns {Observable<void>} An observable that completes when the translations are updated.\n */\n public updateTranslations$(\n language: Locales,\n sources: Set<string> = this._sources\n ): Observable<void> {\n const observables: Set<Observable<Map<string, string>>> =\n this._getUpdateTranslationsObservables(language, sources);\n\n return forkJoin(Array.from(observables)).pipe(\n defaultIfEmpty([]),\n map((responses) => {\n this.translations.update(() =>\n this._mergeMaps(this.translations(), ...responses)\n );\n this.loggerService.info(\n `${this.constructor.name} - Setup - Translations set`,\n this.translations()\n );\n })\n );\n }\n\n /**\n * {@link ITranslationsService.translate}\n */\n public translate(key: string): string {\n const keyExists: boolean = this.translations().has(key);\n if (!keyExists) {\n this.loggerService.warn(\n `${this.constructor.name} - '${key}' translation key does not exist.`\n );\n return key;\n }\n\n const value: string = this.translations().get(key) as string;\n if (value === '' || value == null) {\n this.loggerService.warn(\n `${this.constructor.name} - '${key}' translation value is missing.`\n );\n return key;\n }\n\n if (value === TRANSLATION_DELIBERATELY_UNSET) {\n return key;\n }\n\n return value.replace('\\\\n', '\\n');\n }\n\n /**\n * Merge all translations update observables into a single set object\n * @param {Locales} language required language\n * @param {string} sources source object\n * @returns {Set<Observable<Map<string, string>>>} a set of translations\n * @private\n */\n private _getUpdateTranslationsObservables(\n language: Locales,\n sources: Set<string>\n ): Set<Observable<Map<string, string>>> {\n const observables = new Set<Observable<Map<string, string>>>();\n\n sources.forEach((source) => {\n const observable: Observable<Map<string, string>> =\n this._fetchTranslations$(language, source);\n observables.add(observable);\n });\n\n return observables;\n }\n\n /**\n * Fetch translations process, from JSON file path or API url\n * @param {Locales} language required language\n * @param {string} source source object\n * @returns {Observable<Map<string, string>>} a map with all required translations\n * @private\n */\n private _fetchTranslations$(\n language: Locales,\n source: string\n ): Observable<Map<string, string>> {\n const request: Get = {\n key: `translations:${language}:${source}`,\n url: `${source}`,\n };\n\n const observable: Observable<Map<string, string>> = this.httpService\n .get(request)\n .pipe(\n map((response) =>\n this._filterTranslations(\n language,\n response as Record<string, Translations>\n )\n )\n );\n\n return observable;\n }\n\n /**\n * API fetched translations are already filtered correctly by current language.\n * JSON are not. Treat them equally and filter out unneeded translations.\n *\n * @example\n * Generic JSON response is of type\n * {\n * key1: {\n * fr: 'frenchTranslatedValue',\n * en: 'englishTranslatedValue',\n * it: 'italianTranslatedValue'\n * ...\n * },\n * key2: {\n * fr: 'frenchTranslatedValue',\n * en: 'englishTranslatedValue',\n * it: 'italianTranslatedValue'\n * ...\n * },\n * ...\n * }\n *\n * If language is 'en', then original response will be filtered as follow\n *\n * {\n * key1: 'englishTranslatedValue',\n * key2: 'englishTranslatedValue',\n * ...\n * }\n *\n * @param {Locales} language filter translations upon this language code\n * @param {any} response fetched translations\n * @returns {Translations} this source filtered translations\n * @private\n */\n private _filterTranslations(\n language: Locales,\n response: Record<string, Translations>\n ): Map<string, string> {\n const isoCode = LOCALE_ISO_CODES[language];\n \n const translations = new Map<string, string>(\n Object.entries(\n Object.entries(response)\n .map(([key, value]: [string, Record<string, string>]) => {\n const val = value[isoCode];\n return { [key]: val };\n })\n .reduce((acc, translation) => Object.assign(acc, translation), {})\n )\n );\n return translations;\n }\n\n /**\n * Merge multiple map objects into single map\n * @param {Map<K, V>[]} maps maps to merge\n * @returns {Map<K, V>} merged maps\n * @private\n */\n private _mergeMaps<K, V>(...maps: Map<K, V>[]): Map<K, V> {\n const mergedMap = new Map<K, V>();\n\n maps.forEach((map) => {\n map.forEach((value, key) => {\n mergedMap.set(key, value);\n });\n });\n\n return mergedMap;\n }\n}\n","import type { PipeTransform } from '@angular/core';\nimport { Pipe, inject } from '@angular/core';\n\n// Services\nimport { TranslationsService } from '../../services/translations/translations.service';\n\n/**\n * Pipe that transforms a key into a translated string based on the provided language.\n * It allows to avoid calling function {@link TranslationsService.translate} in template\n * (highly inefficient for function being triggered on every changeDetection), exploiting\n * signal powerness.\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n})\nexport class TranslatePipe implements PipeTransform {\n /**\n * @type {TranslationsService}\n */\n private readonly translationsService = inject(TranslationsService);\n\n /**\n * Transforms the given key into the corresponding translation.\n *\n * @param {string} key The key for the translation.\n * @returns {string} The translated string.\n */\n public transform(key: string): string {\n return this.translationsService.translate(key);\n }\n}\n","import type { Locales } from '@albi_scando/as-const-languages-lib';\nimport { LOCALES } from '@albi_scando/as-const-languages-lib';\n\n/**\n * Default language\n */\nexport const DEFAULT_LANGUAGE: Locales =\n LOCALES.ENGLISH_UNITED_KINGDOM;\n","\nimport type { Locales } from '@albi_scando/as-const-languages-lib';\nimport { LoggerService } from '@albi_scando/as-log-lib';\nimport type { Signal, WritableSignal } from '@angular/core';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { defer, EMPTY, of, switchMap, take, tap } from 'rxjs';\n\nimport { UserService } from '../../../user/services/user/user.service';\n// assets\nimport defaultConfigJSON from '../../assets/jsons/default.json';\n// constants\nimport { DEFAULT_LANGUAGE } from '../../constants/constants';\n// interfaces\nimport type { ILanguageLibSetup } from '../../interfaces/setup.interface';\n// services\nimport { TranslationsService } from '../translations/translations.service';\n\n/**\n * A service that manages different languages operations.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LanguageService {\n /**\n * Boolean value triggered when there is an ongoing language change process\n */\n public isLoadingLanguage: WritableSignal<boolean> = signal(false);\n\n /**\n * Allowed locales\n */\n public allowedLocales = new Set<Locales>();\n\n /**\n * Derived signal for the current language/locale from the user service.\n * Updates automatically when user's locale changes.\n */\n public currentLanguage: Signal<Locales | undefined> = computed(\n () => this.userService.locale()\n );\n\n /**\n * {@link LoggerService}\n */\n private readonly loggerService = inject(LoggerService);\n\n /**\n * {@link TranslationsService}\n */\n private readonly translationsService = inject(TranslationsService);\n\n /**\n * {@link UserService}\n */\n private readonly userService = inject(UserService);\n\n /**\n * Constructor\n * @constructor\n * @ignore\n */\n constructor() {\n const config = defaultConfigJSON as Record<string, unknown>;\n\n const setup: ILanguageLibSetup = {\n locales: new Set<Locales>(config['locales'] as Locales[]),\n currentLocale: config['currentLocale'] as Locales,\n };\n this.setup$(setup).pipe(take(1)).subscribe();\n }\n\n /**\n * {@link ILanguageService.setup$}\n */\n public setup$(setup: Partial<ILanguageLibSetup>): Observable<void> {\n return defer(() => {\n if (setup.locales !== null && setup.locales !== undefined) {this.setAllowedLanguages(setup.locales);}\n return setup.currentLocale !== null && setup.currentLocale !== undefined\n ? this.setLanguage$(setup.currentLocale)\n : this.setLanguage$();\n });\n }\n\n /**\n * {@link ILanguageService.setAllowedLanguages}\n */\n public setAllowedLanguages(locales: Set<Locales>): void {\n this.allowedLocales = locales;\n }\n\n /**\n * {@link ILanguageService.setLanguage$}\n */\n public setLanguage$(\n locale: Locales | undefined = undefined\n ): Observable<void> {\n if (locale !== null && locale !== undefined && this._isLanguageAllowed(locale) === false) {\n this.loggerService.warn(\n `'${locale}' is not among valid locales. Going for auto locale.`\n );\n locale = undefined;\n }\n\n if (locale === null || locale === undefined) {\n locale = this._pickAutoLanguage();\n this.loggerService.warn(`Auto locale set. Picked '${locale}'.`);\n }\n\n if (this._isLanguageAlreadySet(locale)) {\n this.loggerService.warn(`'${locale}' locale is already set.`);\n return EMPTY;\n }\n\n const resolvedLocale: Locales = locale;\n\n return of(() => { this._toggleIsLoadingLanguage(true); }).pipe(\n tap(() => { this._updateUserLanguage(resolvedLocale); }),\n switchMap(() => this._updateTranslations$()),\n tap(() => { this._toggleIsLoadingLanguage(false); })\n );\n }\n\n /**\n * Update user locale and sync\n * @param {Locales} locale locale to set\n * @returns {void}\n * @private\n */\n private _updateUserLanguage(locale: Locales): void {\n this.userService.setLocale(locale);\n }\n\n /**\n * Update app translations according to current user locale\n * @returns {Observable<void>}\n * @private\n */\n private _updateTranslations$(): Observable<void> {\n const locale = this.userService.locale();\n if (locale === null || locale === undefined) {\n this.loggerService.error(\n `User locale is not set. Cannot update translations.`\n );\n return EMPTY;\n }\n return this.translationsService.updateTranslations$(\n locale\n );\n }\n\n /**\n * Check if locale is already set\n * @param {Locales} locale locale to set\n * @returns {boolean} true if provided locale is already set\n * @private\n */\n private _isLanguageAlreadySet(locale: Locales): boolean {\n return locale === this.userService.locale();\n }\n\n /**\n * Check if locale is among allowed ones\n * @param {Locales} locale locale to set\n * @returns {boolean} true if provided locale is among allowed ones\n * @private\n */\n private _isLanguageAllowed(locale: Locales): boolean {\n return this.allowedLocales.has(locale);\n }\n\n /**\n * Pick a valid locale automatically.\n * Try to get it from:\n * 1. user locale\n * 2. navigator locale\n * 3. default locale (en)\n * 4. first allowed locale\n * @returns {Locales} allowed locale according to rules above.\n * @private\n */\n private _pickAutoLanguage(): Locales {\n let language: Locales | undefined = this.userService.locale();\n if (language === null || language === undefined || !this._isLanguageAllowed(language)) {\n language = this._getNavigatorLanguage();\n if (!this._isLanguageAllowed(language)) {\n language = DEFAULT_LANGUAGE;\n if (!this._isLanguageAllowed(language)) {\n language = [...this.allowedLocales][0];\n }\n }\n }\n\n return language;\n }\n\n /**\n * Get navigator language\n * @returns {Locales} navigator language 'it'/'fr'\n * @private\n */\n private _getNavigatorLanguage(): Locales {\n const navigatorLocale: string = this._getNavigatorLocale();\n\n return (navigatorLocale.includes('-')\n ? navigatorLocale.split('-')[0]\n : navigatorLocale) as unknown as Locales;\n }\n\n /**\n * Get navigator locale\n * @returns {string} navigator locale 'it-IT'/'fr-FR'\n * @private\n */\n private _getNavigatorLocale(): string {\n return window.navigator.language;\n }\n\n /**\n * Toggle isLoadingNewLanguage property\n * @param {boolean | null} value value to set\n * @returns {void}\n * @private\n */\n private _toggleIsLoadingLanguage(value: boolean | null): void {\n value = value ?? !this.isLoadingLanguage();\n this.isLoadingLanguage.set(value);\n }\n}\n","/**\n * User levels constants.\n */\nexport const USER_LEVELS = {\n GUEST: 'guest',\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["defaultConfigJSON"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,110 +1,27 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@albi_scando/as-backbone-lib",
|
|
3
|
-
"version": "1.1.
|
|
4
|
-
"
|
|
5
|
-
|
|
6
|
-
"
|
|
7
|
-
"url": "git+https://github.com/albertoscandolara/as-backbone-lib"
|
|
8
|
-
},
|
|
9
|
-
"author": "Alberto Scandolara",
|
|
10
|
-
"license": "ISC",
|
|
11
|
-
"bugs": {
|
|
12
|
-
"url": "https://github.com/albertoscandolara/as-backbone-lib/issues"
|
|
13
|
-
},
|
|
14
|
-
"homepage": "https://github.com/albertoscandolara/as-backbone-lib#readme",
|
|
15
|
-
"scripts": {
|
|
16
|
-
"ng": "ng",
|
|
17
|
-
"start": "ng serve",
|
|
18
|
-
"build": "ng build",
|
|
19
|
-
"commit": "cz",
|
|
20
|
-
"watch": "ng build --watch --configuration development",
|
|
21
|
-
"test": "ng test",
|
|
22
|
-
"docs:build": "typedoc",
|
|
23
|
-
"docs:serve": "npx http-server docs -o",
|
|
24
|
-
"formatter": "npm run prettier && npm run lint",
|
|
25
|
-
"formatter:fix": "npm run prettier:fix && npm run lint:fix",
|
|
26
|
-
"lint": "eslint .",
|
|
27
|
-
"lint:fix": "eslint . --fix",
|
|
28
|
-
"prepare": "husky",
|
|
29
|
-
"preview": "vite preview",
|
|
30
|
-
"prettier": "prettier . --check",
|
|
31
|
-
"prettier:fix": "prettier . --write",
|
|
32
|
-
"release": "semantic-release",
|
|
33
|
-
"release:dry": "semantic-release --dry-run"
|
|
34
|
-
},
|
|
35
|
-
"files": [
|
|
36
|
-
"dist/as-backbone-lib"
|
|
37
|
-
],
|
|
38
|
-
"packageManager": "pnpm@10.28.2",
|
|
39
|
-
"engines": {
|
|
40
|
-
"node": ">=22.11.0"
|
|
41
|
-
},
|
|
42
|
-
"config": {
|
|
43
|
-
"commitizen": {
|
|
44
|
-
"path": "./node_modules/cz-conventional-changelog"
|
|
45
|
-
}
|
|
46
|
-
},
|
|
47
|
-
"lint-staged": {
|
|
48
|
-
"*.ts": "prettier --write",
|
|
49
|
-
"*.{js,scss,css,md}": [
|
|
50
|
-
"prettier --write",
|
|
51
|
-
"eslint --fix"
|
|
52
|
-
]
|
|
3
|
+
"version": "1.1.3",
|
|
4
|
+
"peerDependencies": {
|
|
5
|
+
"@angular/common": "^21.2.0",
|
|
6
|
+
"@angular/core": "^21.2.0"
|
|
53
7
|
},
|
|
54
8
|
"dependencies": {
|
|
55
|
-
"@angular/common": "^21.2.0",
|
|
56
|
-
"@angular/compiler": "^21.2.0",
|
|
57
|
-
"@angular/core": "^21.2.0",
|
|
58
|
-
"@angular/forms": "^21.2.0",
|
|
59
|
-
"@angular/platform-browser": "^21.2.0",
|
|
60
|
-
"@angular/router": "^21.2.0",
|
|
61
|
-
"rxjs": "~7.8.0",
|
|
62
9
|
"tslib": "^2.3.0"
|
|
63
10
|
},
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
"
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
"
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
"@semantic-release/npm": "^13.1.3",
|
|
79
|
-
"@types/jasmine": "~5.1.0",
|
|
80
|
-
"@types/node": "^25.2.1",
|
|
81
|
-
"@types/numeric": "^1.2.6",
|
|
82
|
-
"branch-name-lint": "^3.0.1",
|
|
83
|
-
"commitizen": "^4.3.1",
|
|
84
|
-
"cz-conventional-changelog": "^3.3.0",
|
|
85
|
-
"eslint": "^9.39.2",
|
|
86
|
-
"eslint-config-prettier": "^10.1.8",
|
|
87
|
-
"eslint-plugin-import-x": "^4.16.1",
|
|
88
|
-
"eslint-plugin-prettier": "^5.5.5",
|
|
89
|
-
"eslint-plugin-regexp": "^3.0.0",
|
|
90
|
-
"eslint-plugin-security": "^3.0.1",
|
|
91
|
-
"globals": "^17.3.0",
|
|
92
|
-
"husky": "^9.1.7",
|
|
93
|
-
"jsdom": "^28.0.0",
|
|
94
|
-
"lint-staged": "^16.2.7",
|
|
95
|
-
"ng-packagr": "^21.2.0",
|
|
96
|
-
"prettier": "^3.8.1",
|
|
97
|
-
"semantic-release": "^25.0.3",
|
|
98
|
-
"typedoc": "^0.28.16",
|
|
99
|
-
"typescript": "~5.9.2",
|
|
100
|
-
"typescript-eslint": "^8.54.0",
|
|
101
|
-
"validate-branch-name": "^1.3.2",
|
|
102
|
-
"vitest": "^4.0.8"
|
|
11
|
+
"sideEffects": false,
|
|
12
|
+
"main": "./fesm2022/albi_scando-as-backbone-lib.mjs",
|
|
13
|
+
"module": "fesm2022/albi_scando-as-backbone-lib.mjs",
|
|
14
|
+
"types": "./types/albi_scando-as-backbone-lib.d.ts",
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"types": "./types/albi_scando-as-backbone-lib.d.ts",
|
|
18
|
+
"import": "./fesm2022/albi_scando-as-backbone-lib.mjs",
|
|
19
|
+
"require": "./fesm2022/albi_scando-as-backbone-lib.mjs",
|
|
20
|
+
"default": "./fesm2022/albi_scando-as-backbone-lib.mjs"
|
|
21
|
+
},
|
|
22
|
+
"./package.json": {
|
|
23
|
+
"default": "./package.json"
|
|
24
|
+
}
|
|
103
25
|
},
|
|
104
|
-
"
|
|
105
|
-
"@albi_scando/as-const-http-lib": "^1.0.0",
|
|
106
|
-
"@albi_scando/as-const-languages-lib": "^1.1.0",
|
|
107
|
-
"@albi_scando/as-const-lib": "^1.11.0",
|
|
108
|
-
"@albi_scando/as-log-lib": "^1.0.1"
|
|
109
|
-
}
|
|
26
|
+
"typings": "types/albi_scando-as-backbone-lib.d.ts"
|
|
110
27
|
}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
# AsBackboneLib
|
|
2
|
-
|
|
3
|
-
This project was generated using [Angular CLI](https://github.com/angular/angular-cli) version 21.2.0.
|
|
4
|
-
|
|
5
|
-
## Code scaffolding
|
|
6
|
-
|
|
7
|
-
Angular CLI includes powerful code scaffolding tools. To generate a new component, run:
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
ng generate component component-name
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
For a complete list of available schematics (such as `components`, `directives`, or `pipes`), run:
|
|
14
|
-
|
|
15
|
-
```bash
|
|
16
|
-
ng generate --help
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Building
|
|
20
|
-
|
|
21
|
-
To build the library, run:
|
|
22
|
-
|
|
23
|
-
```bash
|
|
24
|
-
ng build as-backbone-lib
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
This command will compile your project, and the build artifacts will be placed in the `dist/` directory.
|
|
28
|
-
|
|
29
|
-
### Publishing the Library
|
|
30
|
-
|
|
31
|
-
Once the project is built, you can publish your library by following these steps:
|
|
32
|
-
|
|
33
|
-
1. Navigate to the `dist` directory:
|
|
34
|
-
|
|
35
|
-
```bash
|
|
36
|
-
cd dist/as-backbone-lib
|
|
37
|
-
```
|
|
38
|
-
|
|
39
|
-
2. Run the `npm publish` command to publish your library to the npm registry:
|
|
40
|
-
```bash
|
|
41
|
-
npm publish
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
## Running unit tests
|
|
45
|
-
|
|
46
|
-
To execute unit tests with the [Karma](https://karma-runner.github.io) test runner, use the following command:
|
|
47
|
-
|
|
48
|
-
```bash
|
|
49
|
-
ng test
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Running end-to-end tests
|
|
53
|
-
|
|
54
|
-
For end-to-end (e2e) testing, run:
|
|
55
|
-
|
|
56
|
-
```bash
|
|
57
|
-
ng e2e
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Angular CLI does not come with an end-to-end testing framework by default. You can choose one that suits your needs.
|
|
61
|
-
|
|
62
|
-
## Additional Resources
|
|
63
|
-
|
|
64
|
-
For more information on using the Angular CLI, including detailed command references, visit the [Angular CLI Overview and Command Reference](https://angular.dev/tools/cli) page.
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"albi_scando-as-backbone-lib.mjs","sources":["../../../projects/as-backbone-lib/src/lib/modules/http/services/http/http.service.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/authorization/authorization.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/log-request/log-request.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/request-timestamp/request-timestamp.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/http/interceptors/unauthorized/unauthorized.interceptor.ts","../../../projects/as-backbone-lib/src/lib/modules/language/services/translations/translations.service.ts","../../../projects/as-backbone-lib/src/lib/modules/language/pipes/translate/translate.pipe.ts","../../../projects/as-backbone-lib/src/lib/modules/language/constants/constants.ts","../../../projects/as-backbone-lib/src/lib/modules/language/services/language/language.service.ts","../../../projects/as-backbone-lib/src/lib/modules/user/constants/user-levels.constant.ts","../../../projects/as-backbone-lib/src/lib/modules/user/constants/default.ts","../../../projects/as-backbone-lib/src/lib/modules/user/services/user/user.service.ts","../../../projects/as-backbone-lib/src/albi_scando-as-backbone-lib.ts"],"sourcesContent":["import type { HttpHeaders } from '@albi_scando/as-const-http-lib';\nimport { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\n\nimport type { IHttpService } from './http.service.interface';\nimport type { Delete } from '../../interfaces/delete';\nimport type { Get } from '../../interfaces/get';\nimport type { Patch } from '../../interfaces/patch';\nimport type { Post } from '../../interfaces/post';\nimport type { Put } from '../../interfaces/put';\n\n@Injectable({\n providedIn: 'root',\n})\nexport class HttpService implements IHttpService {\n\n /**\n * {@link HttpClient}\n */\n private httpClient: HttpClient = inject(HttpClient);\n\n /**\n * {@link IHttpService.expiredPasswordFn}\n */\n public expiredPasswordFn = (): void => undefined;\n\n /**\n * {@link IHttpService.unauthorizedFn}\n */\n public unauthorizedFn = (): void => undefined;\n\n /**\n * Perform http delete request\n *\n * @param {Delete} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public delete(httpRequest: Delete): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.delete(httpRequest.url, options);\n }\n\n /**\n * Perform http get request\n *\n * @param {Get} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public get(httpRequest: Get): Observable<unknown> {\n httpRequest.url = this._setQueryParams(httpRequest.queryParams, httpRequest.url);\n\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.get(httpRequest.url, options);\n }\n\n /**\n * Perform http patch request\n *\n * @param {Patch} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public patch(httpRequest: Patch): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.patch(httpRequest.url, httpRequest.body, options);\n }\n\n /**\n * Perform http post request\n *\n * @param {Post} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public post(httpRequest: Post): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.post(httpRequest.url, httpRequest.body, options);\n }\n\n /**\n * Perform http put request\n *\n * @param {Put} httpRequest http request\n * @returns {Observable<unknown>} response observable\n */\n public put(httpRequest: Put): Observable<unknown> {\n const options: { headers: Partial<Record<HttpHeaders, string>> } = this.typeSafeHeaderOptions(httpRequest.headerParams);\n\n return this.httpClient.put(httpRequest.url, httpRequest.body, options);\n }\n\n /**\n * Set url query parameters\n *\n * @param {Map<string, string>} queryParams query parameters key-value pairs\n * @param {string} url original httpRequest url\n * @returns {string} new url with aquery parameters\n */\n private _setQueryParams(queryParams = new Map<string, string>(), url: string): string {\n if (queryParams.size === 0) {\n return url;\n }\n\n url += `?${Array.from(queryParams.entries()).map(([key, value]) => `${key}=${value}`).join('&')}`;\n return url;\n }\n\n /**\n * Type safe header options for HttpClient methods\n * @param httpRequestHeaders header parameters key-value pairs\n * @returns header options for HttpClient methods\n */\n private typeSafeHeaderOptions(\n httpRequestHeaders: Map<HttpHeaders, string | boolean> | undefined\n ): {\n headers: Partial<Record<HttpHeaders, string>>;\n } {\n return { headers: Object.fromEntries(this._setHeaderParams(httpRequestHeaders)) };\n }\n \n /**\n * Set http request header parameters\n *\n * @param {Map<HttpHeaders, string | boolean>} headerParams header parameters key-value pairs\n * @returns {Map<HttpHeaders, string>} header parameters key-value pairs. All values must be strings.\n */\n private _setHeaderParams(headerParams: Map<HttpHeaders, string | boolean> | undefined): Map<HttpHeaders, string> {\n if (headerParams === undefined || headerParams.size === 0) {\n return new Map();\n }\n\n const headerParameters: Map<HttpHeaders, string> = new Map<HttpHeaders, string>();\n Array.from(headerParams.entries()).forEach(([key, value]: [key: HttpHeaders, value: string | boolean]) => {\n headerParameters.set(key, `${value}`);\n });\n\n return headerParameters;\n }\n}\n","import { HTTP_HEADERS } from '@albi_scando/as-const-http-lib';\nimport type {\n HttpEvent,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport { UserService } from '@user/services/user/user.service';\nimport type { Observable } from 'rxjs';\n\n/**\n * This interceptor is responsible for adding Authorization header parameter to every outgoing HttpRequest\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link Observable<HttpEvent>}\n */\nexport const authorizationInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n /**\n * {@link UserService}\n */\n const userService: UserService = inject(UserService);\n const token: string | undefined = userService.token();\n\n if (token === undefined) {\n return next(httpRequest);\n }\n\n const clonedRequest: HttpRequest<unknown> = httpRequest.clone({\n headers: httpRequest.headers.set(\n HTTP_HEADERS.AUTHORIZATION,\n token\n ),\n });\n return next(clonedRequest);\n};\n","import { LoggerService } from '@albi_scando/as-log-lib';\nimport type {\n HttpEvent,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable} from 'rxjs';\nimport { tap } from 'rxjs';\n\n/**\n * This interceptor logs every outgoing HttpRequest.\n * It fulfills the same task as the developer tools Network inspector.\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link Observable<HttpEvent>}\n */\nexport const logRequestInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n /**\n * {@link LoggerService}\n */\n const loggerService: LoggerService = inject(LoggerService);\n\n return next(httpRequest).pipe(\n tap(() => {\n loggerService.debug(\n `${logRequestInterceptor.name}: - ${httpRequest.url} http request`,\n httpRequest\n );\n })\n );\n};\n","import { LoggerService } from '@albi_scando/as-log-lib';\nimport type {\n HttpEvent,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpRequest,\n} from '@angular/common/http';\nimport { HttpEventType } from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { tap } from 'rxjs';\n\n/**\n * This interceptor logs the time interval (in milliseconds) between the request submission and the incoming response.\n * It fulfills the same task as 'Waterfall' graph in the developer tools Network inspector.\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link Observable<HttpEvent>}\n */\nexport const requestTimestampInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n /**\n * {@link LoggerService}\n */\n const loggerService: LoggerService = inject(LoggerService);\n\n const startTime: number = Date.now();\n const formatLog = (message: string, isError = false): void => {\n const diff: number = Date.now() - startTime;\n const logMessage = `${requestTimestampInterceptor.name}: - ${httpRequest.url} ${message} in ${diff} ms`;\n if (isError) {\n loggerService.error(logMessage);\n } else {\n loggerService.debug(logMessage);\n }\n };\n\n return next(httpRequest).pipe(\n tap({\n next: (event) => {\n if (event.type === HttpEventType.Response) {\n formatLog('succeeded');\n }\n },\n error: () => {\n formatLog('failed', true);\n },\n })\n );\n};\n","import { HTTP_RESPONSE_STATUS_CODES } from '@albi_scando/as-const-http-lib';\nimport type {\n HttpRequest,\n HttpErrorResponse,\n HttpHandlerFn,\n HttpInterceptorFn,\n HttpEvent,\n} from '@angular/common/http';\nimport { inject } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { catchError, of, throwError } from 'rxjs';\n\n// Services\nimport { HttpService } from '../../services/http/http.service';\n\nconst EXPIRED_PASSWORD_MESSAGE = 'Expired password';\n\n/**\n * Http request interceptor to handle 401 unauthorized responses.\n * 401 error is special, because it needs more than just a feedback.\n * In most situations, it could be provoked by an expired token that requires a redirect to a 'Login' page.\n * When validating credentials, it could be provoked by an expired password that requires a redirect to 'Change password' page.\n *\n * @param {HttpRequest<unknown>} httpRequest @see {@link HttpRequest}\n * @param {HttpHandlerFn} next @see {@link HttpHandlerFn}\n * @returns {Observable<HttpEvent<unknown>>} @see {@link : Observable<HttpEvent>}\n */\nexport const unauthorizedInterceptor: HttpInterceptorFn = (\n httpRequest: HttpRequest<unknown>,\n next: HttpHandlerFn\n): Observable<HttpEvent<unknown>> => {\n const httpService: HttpService = inject(HttpService);\n\n return next(httpRequest).pipe(\n catchError((httpResponse: HttpErrorResponse) => {\n if (httpResponse.status !== HTTP_RESPONSE_STATUS_CODES.UNAUTHORIZED) {\n return throwError(() => httpResponse);\n }\n\n const errorMessage: string | undefined = httpResponse.error?.ErrMsg;\n if (errorMessage === EXPIRED_PASSWORD_MESSAGE) {\n httpService.expiredPasswordFn();\n } else {\n httpService.unauthorizedFn();\n }\n\n return of();\n })\n );\n};\n","\nimport { LOCALE_ISO_CODES, type Locales } from '@albi_scando/as-const-languages-lib';\nimport { TRANSLATION_DELIBERATELY_UNSET } from '@albi_scando/as-const-lib/dist/types/constants/constants';\nimport { LoggerService } from '@albi_scando/as-log-lib';\nimport type { Signal, WritableSignal } from '@angular/core';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport type { Get } from '@http/interfaces/get';\nimport { HttpService } from '@http/services/http/http.service';\nimport type { Observable } from 'rxjs';\nimport { defaultIfEmpty, forkJoin, map } from 'rxjs';\n\n// Interfaces\nimport type { Translations } from '../../interfaces/translations.interface';\n\n/**\n * A service that manages translations based on the current language.\n *\n * The `TranslationsService` handles fetching, storing, and updating translations\n * for different languages. It interacts with various translation sources and\n * provides methods to retrieve translations based on a given key.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class TranslationsService {\n /**\n * List of translations sources (apis/files)\n */\n private _sources = new Set<string>();\n\n /**\n * Current translations dictionary, mapping translation keys to their values.\n */\n public translations: WritableSignal<Map<string, string>> = signal(new Map());\n\n /**\n * Derived signal that indicates whether translations are currently loaded.\n * Returns true if the translations map contains any entries.\n */\n public hasTranslations: Signal<boolean> = computed(\n () => this.translations().size > 0\n );\n\n /**\n * Derived signal for the count of currently loaded translations.\n * Useful for debugging or monitoring translation load status.\n */\n public translationsCount: Signal<number> = computed(\n () => this.translations().size\n );\n\n /**\n * {@link HttpService}\n */\n private readonly httpService = inject(HttpService);\n\n /**\n * {@link LoggerService}\n */\n private readonly loggerService = inject(LoggerService);\n\n /**\n * Adds new translation sources and optionally updates translations for a given language code.\n *\n * If no language code is provided, the translations will not be updated immediately.\n * The translations will be updated as soon as the current language is set.\n *\n * @param {Set<TranslationsSource>} sources New sources to add.\n * @param {Locales} [language=stringEmpty] Optional language code to trigger translations update.\n * @returns {Observable<void>} An observable that completes when the translations are updated.\n */\n public addTranslationsSources$(\n sources: Set<string>,\n language: Locales\n ): Observable<void> {\n this._sources = new Set([...this._sources, ...sources]);\n this.loggerService.debug(`Translations sources added`, this._sources);\n\n return this.updateTranslations$(language, sources);\n }\n\n /**\n * Updates translations based on the provided language code and sources.\n *\n * @param {Locales} language The language code to use for updating translations.\n * @param {Set<TranslationsSource>} [sources=this._sources] Optional set of sources to update.\n * @returns {Observable<void>} An observable that completes when the translations are updated.\n */\n public updateTranslations$(\n language: Locales,\n sources: Set<string> = this._sources\n ): Observable<void> {\n const observables: Set<Observable<Map<string, string>>> =\n this._getUpdateTranslationsObservables(language, sources);\n\n return forkJoin(Array.from(observables)).pipe(\n defaultIfEmpty([]),\n map((responses) => {\n this.translations.update(() =>\n this._mergeMaps(this.translations(), ...responses)\n );\n this.loggerService.info(\n `${this.constructor.name} - Setup - Translations set`,\n this.translations()\n );\n })\n );\n }\n\n /**\n * {@link ITranslationsService.translate}\n */\n public translate(key: string): string {\n const keyExists: boolean = this.translations().has(key);\n if (!keyExists) {\n this.loggerService.warn(\n `${this.constructor.name} - '${key}' translation key does not exist.`\n );\n return key;\n }\n\n const value: string = this.translations().get(key) as string;\n if (value === '' || value == null) {\n this.loggerService.warn(\n `${this.constructor.name} - '${key}' translation value is missing.`\n );\n return key;\n }\n\n if (value === TRANSLATION_DELIBERATELY_UNSET) {\n return key;\n }\n\n return value.replace('\\\\n', '\\n');\n }\n\n /**\n * Merge all translations update observables into a single set object\n * @param {Locales} language required language\n * @param {string} sources source object\n * @returns {Set<Observable<Map<string, string>>>} a set of translations\n * @private\n */\n private _getUpdateTranslationsObservables(\n language: Locales,\n sources: Set<string>\n ): Set<Observable<Map<string, string>>> {\n const observables = new Set<Observable<Map<string, string>>>();\n\n sources.forEach((source) => {\n const observable: Observable<Map<string, string>> =\n this._fetchTranslations$(language, source);\n observables.add(observable);\n });\n\n return observables;\n }\n\n /**\n * Fetch translations process, from JSON file path or API url\n * @param {Locales} language required language\n * @param {string} source source object\n * @returns {Observable<Map<string, string>>} a map with all required translations\n * @private\n */\n private _fetchTranslations$(\n language: Locales,\n source: string\n ): Observable<Map<string, string>> {\n const request: Get = {\n key: `translations:${language}:${source}`,\n url: `${source}`,\n };\n\n const observable: Observable<Map<string, string>> = this.httpService\n .get(request)\n .pipe(\n map((response) =>\n this._filterTranslations(\n language,\n response as Record<string, Translations>\n )\n )\n );\n\n return observable;\n }\n\n /**\n * API fetched translations are already filtered correctly by current language.\n * JSON are not. Treat them equally and filter out unneeded translations.\n *\n * @example\n * Generic JSON response is of type\n * {\n * key1: {\n * fr: 'frenchTranslatedValue',\n * en: 'englishTranslatedValue',\n * it: 'italianTranslatedValue'\n * ...\n * },\n * key2: {\n * fr: 'frenchTranslatedValue',\n * en: 'englishTranslatedValue',\n * it: 'italianTranslatedValue'\n * ...\n * },\n * ...\n * }\n *\n * If language is 'en', then original response will be filtered as follow\n *\n * {\n * key1: 'englishTranslatedValue',\n * key2: 'englishTranslatedValue',\n * ...\n * }\n *\n * @param {Locales} language filter translations upon this language code\n * @param {any} response fetched translations\n * @returns {Translations} this source filtered translations\n * @private\n */\n private _filterTranslations(\n language: Locales,\n response: Record<string, Translations>\n ): Map<string, string> {\n const isoCode = LOCALE_ISO_CODES[language];\n \n const translations = new Map<string, string>(\n Object.entries(\n Object.entries(response)\n .map(([key, value]: [string, Record<string, string>]) => {\n const val = value[isoCode];\n return { [key]: val };\n })\n .reduce((acc, translation) => Object.assign(acc, translation), {})\n )\n );\n return translations;\n }\n\n /**\n * Merge multiple map objects into single map\n * @param {Map<K, V>[]} maps maps to merge\n * @returns {Map<K, V>} merged maps\n * @private\n */\n private _mergeMaps<K, V>(...maps: Map<K, V>[]): Map<K, V> {\n const mergedMap = new Map<K, V>();\n\n maps.forEach((map) => {\n map.forEach((value, key) => {\n mergedMap.set(key, value);\n });\n });\n\n return mergedMap;\n }\n}\n","import type { PipeTransform } from '@angular/core';\nimport { Pipe, inject } from '@angular/core';\n\n// Services\nimport { TranslationsService } from '../../services/translations/translations.service';\n\n/**\n * Pipe that transforms a key into a translated string based on the provided language.\n * It allows to avoid calling function {@link TranslationsService.translate} in template\n * (highly inefficient for function being triggered on every changeDetection), exploiting\n * signal powerness.\n */\n@Pipe({\n name: 'translate',\n standalone: true,\n})\nexport class TranslatePipe implements PipeTransform {\n /**\n * @type {TranslationsService}\n */\n private readonly translationsService = inject(TranslationsService);\n\n /**\n * Transforms the given key into the corresponding translation.\n *\n * @param {string} key The key for the translation.\n * @returns {string} The translated string.\n */\n public transform(key: string): string {\n return this.translationsService.translate(key);\n }\n}\n","import type { Locales } from '@albi_scando/as-const-languages-lib';\nimport { LOCALES } from '@albi_scando/as-const-languages-lib';\n\n/**\n * Default language\n */\nexport const DEFAULT_LANGUAGE: Locales =\n LOCALES.ENGLISH_UNITED_KINGDOM;\n","\nimport type { Locales } from '@albi_scando/as-const-languages-lib';\nimport { LoggerService } from '@albi_scando/as-log-lib';\nimport type { Signal, WritableSignal } from '@angular/core';\nimport { Injectable, computed, inject, signal } from '@angular/core';\nimport { UserService } from '@user/services/user/user.service';\nimport type { Observable } from 'rxjs';\nimport { defer, EMPTY, of, switchMap, take, tap } from 'rxjs';\n\n// assets\nimport defaultConfigJSON from '../../assets/jsons/default.json';\n// constants\nimport { DEFAULT_LANGUAGE } from '../../constants/constants';\n// interfaces\nimport type { ILanguageLibSetup } from '../../interfaces/setup.interface';\n// services\nimport { TranslationsService } from '../translations/translations.service';\n\n/**\n * A service that manages different languages operations.\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class LanguageService {\n /**\n * Boolean value triggered when there is an ongoing language change process\n */\n public isLoadingLanguage: WritableSignal<boolean> = signal(false);\n\n /**\n * Allowed locales\n */\n public allowedLocales = new Set<Locales>();\n\n /**\n * Derived signal for the current language/locale from the user service.\n * Updates automatically when user's locale changes.\n */\n public currentLanguage: Signal<Locales | undefined> = computed(\n () => this.userService.locale()\n );\n\n /**\n * {@link LoggerService}\n */\n private readonly loggerService = inject(LoggerService);\n\n /**\n * {@link TranslationsService}\n */\n private readonly translationsService = inject(TranslationsService);\n\n /**\n * {@link UserService}\n */\n private readonly userService = inject(UserService);\n\n /**\n * Constructor\n * @constructor\n * @ignore\n */\n constructor() {\n const config = defaultConfigJSON as Record<string, unknown>;\n\n const setup: ILanguageLibSetup = {\n locales: new Set<Locales>(config['locales'] as Locales[]),\n currentLocale: config['currentLocale'] as Locales,\n };\n this.setup$(setup).pipe(take(1)).subscribe();\n }\n\n /**\n * {@link ILanguageService.setup$}\n */\n public setup$(setup: Partial<ILanguageLibSetup>): Observable<void> {\n return defer(() => {\n if (setup.locales !== null && setup.locales !== undefined) {this.setAllowedLanguages(setup.locales);}\n return setup.currentLocale !== null && setup.currentLocale !== undefined\n ? this.setLanguage$(setup.currentLocale)\n : this.setLanguage$();\n });\n }\n\n /**\n * {@link ILanguageService.setAllowedLanguages}\n */\n public setAllowedLanguages(locales: Set<Locales>): void {\n this.allowedLocales = locales;\n }\n\n /**\n * {@link ILanguageService.setLanguage$}\n */\n public setLanguage$(\n locale: Locales | undefined = undefined\n ): Observable<void> {\n if (locale !== null && locale !== undefined && this._isLanguageAllowed(locale) === false) {\n this.loggerService.warn(\n `'${locale}' is not among valid locales. Going for auto locale.`\n );\n locale = undefined;\n }\n\n if (locale === null || locale === undefined) {\n locale = this._pickAutoLanguage();\n this.loggerService.warn(`Auto locale set. Picked '${locale}'.`);\n }\n\n if (this._isLanguageAlreadySet(locale)) {\n this.loggerService.warn(`'${locale}' locale is already set.`);\n return EMPTY;\n }\n\n const resolvedLocale: Locales = locale;\n\n return of(() => { this._toggleIsLoadingLanguage(true); }).pipe(\n tap(() => { this._updateUserLanguage(resolvedLocale); }),\n switchMap(() => this._updateTranslations$()),\n tap(() => { this._toggleIsLoadingLanguage(false); })\n );\n }\n\n /**\n * Update user locale and sync\n * @param {Locales} locale locale to set\n * @returns {void}\n * @private\n */\n private _updateUserLanguage(locale: Locales): void {\n this.userService.setLocale(locale);\n }\n\n /**\n * Update app translations according to current user locale\n * @returns {Observable<void>}\n * @private\n */\n private _updateTranslations$(): Observable<void> {\n const locale = this.userService.locale();\n if (locale === null || locale === undefined) {\n this.loggerService.error(\n `User locale is not set. Cannot update translations.`\n );\n return EMPTY;\n }\n return this.translationsService.updateTranslations$(\n locale\n );\n }\n\n /**\n * Check if locale is already set\n * @param {Locales} locale locale to set\n * @returns {boolean} true if provided locale is already set\n * @private\n */\n private _isLanguageAlreadySet(locale: Locales): boolean {\n return locale === this.userService.locale();\n }\n\n /**\n * Check if locale is among allowed ones\n * @param {Locales} locale locale to set\n * @returns {boolean} true if provided locale is among allowed ones\n * @private\n */\n private _isLanguageAllowed(locale: Locales): boolean {\n return this.allowedLocales.has(locale);\n }\n\n /**\n * Pick a valid locale automatically.\n * Try to get it from:\n * 1. user locale\n * 2. navigator locale\n * 3. default locale (en)\n * 4. first allowed locale\n * @returns {Locales} allowed locale according to rules above.\n * @private\n */\n private _pickAutoLanguage(): Locales {\n let language: Locales | undefined = this.userService.locale();\n if (language === null || language === undefined || !this._isLanguageAllowed(language)) {\n language = this._getNavigatorLanguage();\n if (!this._isLanguageAllowed(language)) {\n language = DEFAULT_LANGUAGE;\n if (!this._isLanguageAllowed(language)) {\n language = [...this.allowedLocales][0];\n }\n }\n }\n\n return language;\n }\n\n /**\n * Get navigator language\n * @returns {Locales} navigator language 'it'/'fr'\n * @private\n */\n private _getNavigatorLanguage(): Locales {\n const navigatorLocale: string = this._getNavigatorLocale();\n\n return (navigatorLocale.includes('-')\n ? navigatorLocale.split('-')[0]\n : navigatorLocale) as unknown as Locales;\n }\n\n /**\n * Get navigator locale\n * @returns {string} navigator locale 'it-IT'/'fr-FR'\n * @private\n */\n private _getNavigatorLocale(): string {\n return window.navigator.language;\n }\n\n /**\n * Toggle isLoadingNewLanguage property\n * @param {boolean | null} value value to set\n * @returns {void}\n * @private\n */\n private _toggleIsLoadingLanguage(value: boolean | null): void {\n value = value ?? !this.isLoadingLanguage();\n this.isLoadingLanguage.set(value);\n }\n}\n","/**\n * User levels constants.\n */\nexport const USER_LEVELS = {\n GUEST: 'guest',\n}\n","export const DEFAULT_USERNAME = 'guest';\nexport const DEFAULT_LEVEL = 'guest';\n","import type { Locales } from '@albi_scando/as-const-languages-lib';\nimport { STRING_EMPTY } from '@albi_scando/as-const-lib';\nimport type { Signal, WritableSignal } from '@angular/core';\nimport { Injectable, computed, signal } from '@angular/core';\nimport type { Observable } from 'rxjs';\nimport { of, take } from 'rxjs';\n\n// Assets\nimport type { IUserService } from './user.service.interface';\nimport defaultConfigJSON from '../../assets/jsons/default.json';\n// Constants\nimport { DEFAULT_LEVEL, DEFAULT_USERNAME } from '../../constants/default';\n// Interfaces\nimport type { IUserLibSetup } from '../../interfaces/setup.interface';\n\n\n@Injectable({\n providedIn: 'root',\n})\nexport class UserService implements IUserService {\n /**\n * {@link IUserService.username}\n */\n public username: WritableSignal<string | undefined> = signal(undefined);\n\n /**\n * {@link IUserService.token}\n */\n public token: WritableSignal<string | undefined> = signal(undefined);\n\n /**\n * @see IUserService.locale\n */\n public locale: WritableSignal<Locales | undefined> = signal(undefined);\n\n /**\n * Derived signal that indicates whether the user is logged in.\n * Returns true if both username and token are set and not empty.\n */\n public isLoggedIn: Signal<boolean> = computed(() => {\n const username = this.username();\n const token = this.token();\n return (\n username !== null &&\n username !== undefined &&\n username !== STRING_EMPTY &&\n token !== null &&\n token !== undefined &&\n token !== STRING_EMPTY\n );\n });\n\n /**\n * Constructor\n * @constructor\n * @ignore\n */\n constructor() {\n this.initialize();\n }\n\n /**\n * @see IUserService.setup$\n */\n public setup$(setup: IUserLibSetup): Observable<void> {\n this.reset();\n\n this.setUsername(setup.username);\n\n return of(undefined);\n }\n\n /**\n * @see IUserService.reset\n */\n public reset(): void {\n this.initialize();\n }\n\n /**\n * @see IUserService.setUsername\n */\n public setUsername(username: string): void {\n this.username.set(username);\n }\n\n /**\n * @see IUserService.setLocale\n */\n public setLocale(locale: Locales): void {\n this.locale.set(locale);\n }\n\n /**\n * Initialization method\n * \n * @returns {void}\n */\n private initialize(): void {\n const config = defaultConfigJSON as {\n language?: {\n username?: string;\n updateAPI?: string;\n };\n };\n\n const setup: IUserLibSetup = {\n username: config.language?.username ?? DEFAULT_USERNAME,\n level: DEFAULT_LEVEL as IUserLibSetup['level'],\n api: {\n patchUserDataAPIUrl: config.language?.updateAPI ?? STRING_EMPTY,\n },\n };\n\n this.setup$(setup).pipe(take(1)).subscribe();\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["UserService","HttpService","defaultConfigJSON"],"mappings":"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"}
|
|
File without changes
|