ngx-translate-multi-http-loader 18.1.0 → 18.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,8 +1,9 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
- import { deepmerge } from 'deepmerge-ts';
3
2
  import { forkJoin, of } from 'rxjs';
4
3
  import { catchError, map } from 'rxjs/operators';
5
4
  export class MultiTranslateHttpLoader {
5
+ _handler;
6
+ _resourcesPrefix;
6
7
  constructor(_handler, _resourcesPrefix) {
7
8
  this._handler = _handler;
8
9
  this._resourcesPrefix = _resourcesPrefix;
@@ -10,12 +11,12 @@ export class MultiTranslateHttpLoader {
10
11
  getTranslation(lang) {
11
12
  const requests = this._resourcesPrefix.map((resource) => {
12
13
  let path;
13
- if (resource.prefix)
14
- path = `${resource.prefix}${lang}${resource.suffix || '.json'}`;
15
- else
14
+ if (typeof resource === 'string')
16
15
  path = `${resource}${lang}.json`;
16
+ else
17
+ path = `${resource.prefix}${lang}${resource.suffix || '.json'}`;
17
18
  return new HttpClient(this._handler).get(path).pipe(catchError((res) => {
18
- if (!resource.optional) {
19
+ if (typeof resource !== 'string' && !resource.optional) {
19
20
  console.group();
20
21
  console.error('Something went wrong for the following translation file:', path);
21
22
  console.error(res);
@@ -24,7 +25,33 @@ export class MultiTranslateHttpLoader {
24
25
  return of({});
25
26
  }));
26
27
  });
27
- return forkJoin(requests).pipe(map((response) => deepmerge(...response)));
28
+ return forkJoin(requests).pipe(map((response) => response.reduce((acc, curr) => this.mergeDeep(acc, curr), {})));
29
+ }
30
+ // @ToDo: Use it from ngx-translate once it gets exported: https://github.com/rbalet/ngx-translate-multi-http-loader/issues/35
31
+ isObject(item) {
32
+ return item && typeof item === 'object' && !Array.isArray(item);
33
+ }
34
+ mergeDeep(target, source) {
35
+ const output = Object.assign({}, target);
36
+ if (!this.isObject(target)) {
37
+ return this.mergeDeep({}, source);
38
+ }
39
+ if (this.isObject(target) && this.isObject(source)) {
40
+ Object.keys(source).forEach((key) => {
41
+ if (this.isObject(source[key])) {
42
+ if (!(key in target)) {
43
+ Object.assign(output, { [key]: source[key] });
44
+ }
45
+ else {
46
+ output[key] = this.mergeDeep(target[key], source[key]);
47
+ }
48
+ }
49
+ else {
50
+ Object.assign(output, { [key]: source[key] });
51
+ }
52
+ });
53
+ }
54
+ return output;
28
55
  }
29
56
  }
30
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaHR0cC1sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tdWx0aS1odHRwLWxvYWRlci9zcmMvbGliL211bHRpLWh0dHAtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUU5RCxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sY0FBYyxDQUFBO0FBQ3hDLE9BQU8sRUFBRSxRQUFRLEVBQWMsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFBO0FBQy9DLE9BQU8sRUFBRSxVQUFVLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUE7QUFRaEQsTUFBTSxPQUFPLHdCQUF3QjtJQUNuQyxZQUNVLFFBQXFCLEVBQ3JCLGdCQUFtRDtRQURuRCxhQUFRLEdBQVIsUUFBUSxDQUFhO1FBQ3JCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBbUM7SUFDMUQsQ0FBQztJQUVHLGNBQWMsQ0FBQyxJQUFZO1FBQ2hDLE1BQU0sUUFBUSxHQUE4QixJQUFJLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUMsUUFBUSxFQUFFLEVBQUU7WUFDakYsSUFBSSxJQUFZLENBQUE7WUFDaEIsSUFBSSxRQUFRLENBQUMsTUFBTTtnQkFBRSxJQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsTUFBTSxHQUFHLElBQUksR0FBRyxRQUFRLENBQUMsTUFBTSxJQUFJLE9BQU8sRUFBRSxDQUFBOztnQkFDL0UsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFBO1lBRXJDLE9BQU8sSUFBSSxVQUFVLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQ2pELFVBQVUsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dCQUNqQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO29CQUN2QixPQUFPLENBQUMsS0FBSyxFQUFFLENBQUE7b0JBQ2YsT0FBTyxDQUFDLEtBQUssQ0FBQywwREFBMEQsRUFBRSxJQUFJLENBQUMsQ0FBQTtvQkFDL0UsT0FBTyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQTtvQkFDbEIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFBO2dCQUNwQixDQUFDO2dCQUNELE9BQU8sRUFBRSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2YsQ0FBQyxDQUFDLENBQ0gsQ0FBQTtRQUNILENBQUMsQ0FBQyxDQUFBO1FBRUYsT0FBTyxRQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFBO0lBQzNFLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBCYWNrZW5kLCBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBUcmFuc2xhdGVMb2FkZXIgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgZGVlcG1lcmdlIH0gZnJvbSAnZGVlcG1lcmdlLXRzJ1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIElUcmFuc2xhdGlvblJlc291cmNlIHtcbiAgcHJlZml4OiBzdHJpbmdcbiAgc3VmZml4Pzogc3RyaW5nXG4gIG9wdGlvbmFsPzogYm9vbGVhblxufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlUcmFuc2xhdGVIdHRwTG9hZGVyIGltcGxlbWVudHMgVHJhbnNsYXRlTG9hZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaGFuZGxlcjogSHR0cEJhY2tlbmQsXG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VzUHJlZml4OiBzdHJpbmdbXSB8IElUcmFuc2xhdGlvblJlc291cmNlW10sXG4gICkge31cblxuICBwdWJsaWMgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCByZXF1ZXN0czogT2JzZXJ2YWJsZTxPYmplY3QgfCB7fT5bXSA9IHRoaXMuX3Jlc291cmNlc1ByZWZpeC5tYXAoKHJlc291cmNlKSA9PiB7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nXG4gICAgICBpZiAocmVzb3VyY2UucHJlZml4KSBwYXRoID0gYCR7cmVzb3VyY2UucHJlZml4fSR7bGFuZ30ke3Jlc291cmNlLnN1ZmZpeCB8fCAnLmpzb24nfWBcbiAgICAgIGVsc2UgcGF0aCA9IGAke3Jlc291cmNlfSR7bGFuZ30uanNvbmBcblxuICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50KHRoaXMuX2hhbmRsZXIpLmdldChwYXRoKS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAoIXJlc291cmNlLm9wdGlvbmFsKSB7XG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwKClcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1NvbWV0aGluZyB3ZW50IHdyb25nIGZvciB0aGUgZm9sbG93aW5nIHRyYW5zbGF0aW9uIGZpbGU6JywgcGF0aClcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IocmVzKVxuICAgICAgICAgICAgY29uc29sZS5ncm91cEVuZCgpXG4gICAgICAgICAgfVxuICAgICAgICAgIHJldHVybiBvZih7fSlcbiAgICAgICAgfSksXG4gICAgICApXG4gICAgfSlcblxuICAgIHJldHVybiBmb3JrSm9pbihyZXF1ZXN0cykucGlwZShtYXAoKHJlc3BvbnNlKSA9PiBkZWVwbWVyZ2UoLi4ucmVzcG9uc2UpKSlcbiAgfVxufVxuIl19
57
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibXVsdGktaHR0cC1sb2FkZXIuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9tdWx0aS1odHRwLWxvYWRlci9zcmMvbGliL211bHRpLWh0dHAtbG9hZGVyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBZSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQTtBQUU5RCxPQUFPLEVBQUUsUUFBUSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQTtBQUMvQyxPQUFPLEVBQUUsVUFBVSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBUWhELE1BQU0sT0FBTyx3QkFBd0I7SUFFekI7SUFDQTtJQUZWLFlBQ1UsUUFBcUIsRUFDckIsZ0JBQW1EO1FBRG5ELGFBQVEsR0FBUixRQUFRLENBQWE7UUFDckIscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFtQztJQUMxRCxDQUFDO0lBRUcsY0FBYyxDQUFDLElBQVk7UUFDaEMsTUFBTSxRQUFRLEdBQThCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBRTtZQUNqRixJQUFJLElBQVksQ0FBQTtZQUVoQixJQUFJLE9BQU8sUUFBUSxLQUFLLFFBQVE7Z0JBQUUsSUFBSSxHQUFHLEdBQUcsUUFBUSxHQUFHLElBQUksT0FBTyxDQUFBOztnQkFDN0QsSUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLE1BQU0sR0FBRyxJQUFJLEdBQUcsUUFBUSxDQUFDLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQTtZQUVwRSxPQUFPLElBQUksVUFBVSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUNqRCxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtnQkFDakIsSUFBSSxPQUFPLFFBQVEsS0FBSyxRQUFRLElBQUksQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLENBQUM7b0JBQ3ZELE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQTtvQkFDZixPQUFPLENBQUMsS0FBSyxDQUFDLDBEQUEwRCxFQUFFLElBQUksQ0FBQyxDQUFBO29CQUMvRSxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFBO29CQUNsQixPQUFPLENBQUMsUUFBUSxFQUFFLENBQUE7Z0JBQ3BCLENBQUM7Z0JBQ0QsT0FBTyxFQUFFLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDZixDQUFDLENBQUMsQ0FDSCxDQUFBO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFFRixPQUFPLFFBQVEsQ0FBQyxRQUFRLENBQUMsQ0FBQyxJQUFJLENBQzVCLEdBQUcsQ0FBQyxDQUFDLFFBQVEsRUFBRSxFQUFFLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLENBQ2pGLENBQUE7SUFDSCxDQUFDO0lBRUQsOEhBQThIO0lBQzlILFFBQVEsQ0FBQyxJQUFTO1FBQ2hCLE9BQU8sSUFBSSxJQUFJLE9BQU8sSUFBSSxLQUFLLFFBQVEsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUE7SUFDakUsQ0FBQztJQUVELFNBQVMsQ0FBQyxNQUFXLEVBQUUsTUFBVztRQUNoQyxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsRUFBRSxNQUFNLENBQUMsQ0FBQTtRQUV4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDO1lBQzNCLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDbkMsQ0FBQztRQUVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFRLEVBQUUsRUFBRTtnQkFDdkMsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLENBQUM7b0JBQy9CLElBQUksQ0FBQyxDQUFDLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBRSxDQUFDO3dCQUNyQixNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDL0MsQ0FBQzt5QkFBTSxDQUFDO3dCQUNOLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxNQUFNLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQTtvQkFDeEQsQ0FBQztnQkFDSCxDQUFDO3FCQUFNLENBQUM7b0JBQ04sTUFBTSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLENBQUE7Z0JBQy9DLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQTtRQUNKLENBQUM7UUFDRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEh0dHBCYWNrZW5kLCBIdHRwQ2xpZW50IH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uL2h0dHAnXG5pbXBvcnQgeyBUcmFuc2xhdGVMb2FkZXIgfSBmcm9tICdAbmd4LXRyYW5zbGF0ZS9jb3JlJ1xuaW1wb3J0IHsgZm9ya0pvaW4sIE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcydcbmltcG9ydCB7IGNhdGNoRXJyb3IsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJ1xuXG5leHBvcnQgaW50ZXJmYWNlIElUcmFuc2xhdGlvblJlc291cmNlIHtcbiAgcHJlZml4OiBzdHJpbmdcbiAgc3VmZml4Pzogc3RyaW5nXG4gIG9wdGlvbmFsPzogYm9vbGVhblxufVxuXG5leHBvcnQgY2xhc3MgTXVsdGlUcmFuc2xhdGVIdHRwTG9hZGVyIGltcGxlbWVudHMgVHJhbnNsYXRlTG9hZGVyIHtcbiAgY29uc3RydWN0b3IoXG4gICAgcHJpdmF0ZSBfaGFuZGxlcjogSHR0cEJhY2tlbmQsXG4gICAgcHJpdmF0ZSBfcmVzb3VyY2VzUHJlZml4OiBzdHJpbmdbXSB8IElUcmFuc2xhdGlvblJlc291cmNlW10sXG4gICkge31cblxuICBwdWJsaWMgZ2V0VHJhbnNsYXRpb24obGFuZzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcbiAgICBjb25zdCByZXF1ZXN0czogT2JzZXJ2YWJsZTxPYmplY3QgfCB7fT5bXSA9IHRoaXMuX3Jlc291cmNlc1ByZWZpeC5tYXAoKHJlc291cmNlKSA9PiB7XG4gICAgICBsZXQgcGF0aDogc3RyaW5nXG5cbiAgICAgIGlmICh0eXBlb2YgcmVzb3VyY2UgPT09ICdzdHJpbmcnKSBwYXRoID0gYCR7cmVzb3VyY2V9JHtsYW5nfS5qc29uYFxuICAgICAgZWxzZSBwYXRoID0gYCR7cmVzb3VyY2UucHJlZml4fSR7bGFuZ30ke3Jlc291cmNlLnN1ZmZpeCB8fCAnLmpzb24nfWBcblxuICAgICAgcmV0dXJuIG5ldyBIdHRwQ2xpZW50KHRoaXMuX2hhbmRsZXIpLmdldChwYXRoKS5waXBlKFxuICAgICAgICBjYXRjaEVycm9yKChyZXMpID0+IHtcbiAgICAgICAgICBpZiAodHlwZW9mIHJlc291cmNlICE9PSAnc3RyaW5nJyAmJiAhcmVzb3VyY2Uub3B0aW9uYWwpIHtcbiAgICAgICAgICAgIGNvbnNvbGUuZ3JvdXAoKVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcignU29tZXRoaW5nIHdlbnQgd3JvbmcgZm9yIHRoZSBmb2xsb3dpbmcgdHJhbnNsYXRpb24gZmlsZTonLCBwYXRoKVxuICAgICAgICAgICAgY29uc29sZS5lcnJvcihyZXMpXG4gICAgICAgICAgICBjb25zb2xlLmdyb3VwRW5kKClcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIG9mKHt9KVxuICAgICAgICB9KSxcbiAgICAgIClcbiAgICB9KVxuXG4gICAgcmV0dXJuIGZvcmtKb2luKHJlcXVlc3RzKS5waXBlKFxuICAgICAgbWFwKChyZXNwb25zZSkgPT4gcmVzcG9uc2UucmVkdWNlKChhY2MsIGN1cnIpID0+IHRoaXMubWVyZ2VEZWVwKGFjYywgY3VyciksIHt9KSksXG4gICAgKVxuICB9XG5cbiAgLy8gQFRvRG86IFVzZSBpdCBmcm9tIG5neC10cmFuc2xhdGUgb25jZSBpdCBnZXRzIGV4cG9ydGVkOiBodHRwczovL2dpdGh1Yi5jb20vcmJhbGV0L25neC10cmFuc2xhdGUtbXVsdGktaHR0cC1sb2FkZXIvaXNzdWVzLzM1XG4gIGlzT2JqZWN0KGl0ZW06IGFueSk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBpdGVtICYmIHR5cGVvZiBpdGVtID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShpdGVtKVxuICB9XG5cbiAgbWVyZ2VEZWVwKHRhcmdldDogYW55LCBzb3VyY2U6IGFueSk6IGFueSB7XG4gICAgY29uc3Qgb3V0cHV0ID0gT2JqZWN0LmFzc2lnbih7fSwgdGFyZ2V0KVxuXG4gICAgaWYgKCF0aGlzLmlzT2JqZWN0KHRhcmdldCkpIHtcbiAgICAgIHJldHVybiB0aGlzLm1lcmdlRGVlcCh7fSwgc291cmNlKVxuICAgIH1cblxuICAgIGlmICh0aGlzLmlzT2JqZWN0KHRhcmdldCkgJiYgdGhpcy5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgICBPYmplY3Qua2V5cyhzb3VyY2UpLmZvckVhY2goKGtleTogYW55KSA9PiB7XG4gICAgICAgIGlmICh0aGlzLmlzT2JqZWN0KHNvdXJjZVtrZXldKSkge1xuICAgICAgICAgIGlmICghKGtleSBpbiB0YXJnZXQpKSB7XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG91dHB1dCwgeyBba2V5XTogc291cmNlW2tleV0gfSlcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgb3V0cHV0W2tleV0gPSB0aGlzLm1lcmdlRGVlcCh0YXJnZXRba2V5XSwgc291cmNlW2tleV0pXG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIE9iamVjdC5hc3NpZ24ob3V0cHV0LCB7IFtrZXldOiBzb3VyY2Vba2V5XSB9KVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIH1cbiAgICByZXR1cm4gb3V0cHV0XG4gIH1cbn1cbiJdfQ==
@@ -1,9 +1,10 @@
1
1
  import { HttpClient } from '@angular/common/http';
2
- import { deepmerge } from 'deepmerge-ts';
3
2
  import { of, forkJoin } from 'rxjs';
4
3
  import { catchError, map } from 'rxjs/operators';
5
4
 
6
5
  class MultiTranslateHttpLoader {
6
+ _handler;
7
+ _resourcesPrefix;
7
8
  constructor(_handler, _resourcesPrefix) {
8
9
  this._handler = _handler;
9
10
  this._resourcesPrefix = _resourcesPrefix;
@@ -11,12 +12,12 @@ class MultiTranslateHttpLoader {
11
12
  getTranslation(lang) {
12
13
  const requests = this._resourcesPrefix.map((resource) => {
13
14
  let path;
14
- if (resource.prefix)
15
- path = `${resource.prefix}${lang}${resource.suffix || '.json'}`;
16
- else
15
+ if (typeof resource === 'string')
17
16
  path = `${resource}${lang}.json`;
17
+ else
18
+ path = `${resource.prefix}${lang}${resource.suffix || '.json'}`;
18
19
  return new HttpClient(this._handler).get(path).pipe(catchError((res) => {
19
- if (!resource.optional) {
20
+ if (typeof resource !== 'string' && !resource.optional) {
20
21
  console.group();
21
22
  console.error('Something went wrong for the following translation file:', path);
22
23
  console.error(res);
@@ -25,7 +26,33 @@ class MultiTranslateHttpLoader {
25
26
  return of({});
26
27
  }));
27
28
  });
28
- return forkJoin(requests).pipe(map((response) => deepmerge(...response)));
29
+ return forkJoin(requests).pipe(map((response) => response.reduce((acc, curr) => this.mergeDeep(acc, curr), {})));
30
+ }
31
+ // @ToDo: Use it from ngx-translate once it gets exported: https://github.com/rbalet/ngx-translate-multi-http-loader/issues/35
32
+ isObject(item) {
33
+ return item && typeof item === 'object' && !Array.isArray(item);
34
+ }
35
+ mergeDeep(target, source) {
36
+ const output = Object.assign({}, target);
37
+ if (!this.isObject(target)) {
38
+ return this.mergeDeep({}, source);
39
+ }
40
+ if (this.isObject(target) && this.isObject(source)) {
41
+ Object.keys(source).forEach((key) => {
42
+ if (this.isObject(source[key])) {
43
+ if (!(key in target)) {
44
+ Object.assign(output, { [key]: source[key] });
45
+ }
46
+ else {
47
+ output[key] = this.mergeDeep(target[key], source[key]);
48
+ }
49
+ }
50
+ else {
51
+ Object.assign(output, { [key]: source[key] });
52
+ }
53
+ });
54
+ }
55
+ return output;
29
56
  }
30
57
  }
31
58
 
@@ -1 +1 @@
1
- {"version":3,"file":"ngx-translate-multi-http-loader.mjs","sources":["../../../projects/multi-http-loader/src/lib/multi-http-loader.ts","../../../projects/multi-http-loader/src/ngx-translate-multi-http-loader.ts"],"sourcesContent":["import { HttpBackend, HttpClient } from '@angular/common/http'\nimport { TranslateLoader } from '@ngx-translate/core'\nimport { deepmerge } from 'deepmerge-ts'\nimport { forkJoin, Observable, of } from 'rxjs'\nimport { catchError, map } from 'rxjs/operators'\n\nexport interface ITranslationResource {\n prefix: string\n suffix?: string\n optional?: boolean\n}\n\nexport class MultiTranslateHttpLoader implements TranslateLoader {\n constructor(\n private _handler: HttpBackend,\n private _resourcesPrefix: string[] | ITranslationResource[],\n ) {}\n\n public getTranslation(lang: string): Observable<any> {\n const requests: Observable<Object | {}>[] = this._resourcesPrefix.map((resource) => {\n let path: string\n if (resource.prefix) path = `${resource.prefix}${lang}${resource.suffix || '.json'}`\n else path = `${resource}${lang}.json`\n\n return new HttpClient(this._handler).get(path).pipe(\n catchError((res) => {\n if (!resource.optional) {\n console.group()\n console.error('Something went wrong for the following translation file:', path)\n console.error(res)\n console.groupEnd()\n }\n return of({})\n }),\n )\n })\n\n return forkJoin(requests).pipe(map((response) => deepmerge(...response)))\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;MAYa,wBAAwB,CAAA;IACnC,WACU,CAAA,QAAqB,EACrB,gBAAmD,EAAA;QADnD,IAAQ,CAAA,QAAA,GAAR,QAAQ,CAAa;QACrB,IAAgB,CAAA,gBAAA,GAAhB,gBAAgB,CAAmC;KACzD;AAEG,IAAA,cAAc,CAAC,IAAY,EAAA;QAChC,MAAM,QAAQ,GAA8B,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAI;AACjF,YAAA,IAAI,IAAY,CAAA;YAChB,IAAI,QAAQ,CAAC,MAAM;AAAE,gBAAA,IAAI,GAAG,CAAA,EAAG,QAAQ,CAAC,MAAM,CAAG,EAAA,IAAI,CAAG,EAAA,QAAQ,CAAC,MAAM,IAAI,OAAO,EAAE,CAAA;;AAC/E,gBAAA,IAAI,GAAG,CAAG,EAAA,QAAQ,CAAG,EAAA,IAAI,OAAO,CAAA;YAErC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,IAAI,CACjD,UAAU,CAAC,CAAC,GAAG,KAAI;AACjB,gBAAA,IAAI,CAAC,QAAQ,CAAC,QAAQ,EAAE;oBACtB,OAAO,CAAC,KAAK,EAAE,CAAA;AACf,oBAAA,OAAO,CAAC,KAAK,CAAC,0DAA0D,EAAE,IAAI,CAAC,CAAA;AAC/E,oBAAA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;oBAClB,OAAO,CAAC,QAAQ,EAAE,CAAA;iBACnB;AACD,gBAAA,OAAO,EAAE,CAAC,EAAE,CAAC,CAAA;aACd,CAAC,CACH,CAAA;AACH,SAAC,CAAC,CAAA;QAEF,OAAO,QAAQ,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;KAC1E;AACF;;ACvCD;;AAEG;;;;"}
1
+ {"version":3,"file":"ngx-translate-multi-http-loader.mjs","sources":["../../../projects/multi-http-loader/src/lib/multi-http-loader.ts","../../../projects/multi-http-loader/src/ngx-translate-multi-http-loader.ts"],"sourcesContent":["import { HttpBackend, HttpClient } from '@angular/common/http'\nimport { TranslateLoader } from '@ngx-translate/core'\nimport { forkJoin, Observable, of } from 'rxjs'\nimport { catchError, map } from 'rxjs/operators'\n\nexport interface ITranslationResource {\n prefix: string\n suffix?: string\n optional?: boolean\n}\n\nexport class MultiTranslateHttpLoader implements TranslateLoader {\n constructor(\n private _handler: HttpBackend,\n private _resourcesPrefix: string[] | ITranslationResource[],\n ) {}\n\n public getTranslation(lang: string): Observable<any> {\n const requests: Observable<Object | {}>[] = this._resourcesPrefix.map((resource) => {\n let path: string\n\n if (typeof resource === 'string') path = `${resource}${lang}.json`\n else path = `${resource.prefix}${lang}${resource.suffix || '.json'}`\n\n return new HttpClient(this._handler).get(path).pipe(\n catchError((res) => {\n if (typeof resource !== 'string' && !resource.optional) {\n console.group()\n console.error('Something went wrong for the following translation file:', path)\n console.error(res)\n console.groupEnd()\n }\n return of({})\n }),\n )\n })\n\n return forkJoin(requests).pipe(\n map((response) => response.reduce((acc, curr) => this.mergeDeep(acc, curr), {})),\n )\n }\n\n // @ToDo: Use it from ngx-translate once it gets exported: https://github.com/rbalet/ngx-translate-multi-http-loader/issues/35\n isObject(item: any): boolean {\n return item && typeof item === 'object' && !Array.isArray(item)\n }\n\n mergeDeep(target: any, source: any): any {\n const output = Object.assign({}, target)\n\n if (!this.isObject(target)) {\n return this.mergeDeep({}, source)\n }\n\n if (this.isObject(target) && this.isObject(source)) {\n Object.keys(source).forEach((key: any) => {\n if (this.isObject(source[key])) {\n if (!(key in target)) {\n Object.assign(output, { [key]: source[key] })\n } else {\n output[key] = this.mergeDeep(target[key], source[key])\n }\n } else {\n Object.assign(output, { [key]: source[key] })\n }\n })\n }\n return output\n }\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -11,4 +11,6 @@ export declare class MultiTranslateHttpLoader implements TranslateLoader {
11
11
  private _resourcesPrefix;
12
12
  constructor(_handler: HttpBackend, _resourcesPrefix: string[] | ITranslationResource[]);
13
13
  getTranslation(lang: string): Observable<any>;
14
+ isObject(item: any): boolean;
15
+ mergeDeep(target: any, source: any): any;
14
16
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ngx-translate-multi-http-loader",
3
- "version": "18.1.0",
3
+ "version": "18.2.0",
4
4
  "license": "MIT",
5
5
  "author": {
6
6
  "name": "Raphaël Balet",
@@ -29,7 +29,6 @@
29
29
  "@angular/common": ">=13.0.0",
30
30
  "@angular/core": ">=13.0.0",
31
31
  "@ngx-translate/core": ">=15.0.0",
32
- "deepmerge-ts": "^7.1.0",
33
32
  "rxjs": "^7.8.1"
34
33
  },
35
34
  "module": "fesm2022/ngx-translate-multi-http-loader.mjs",