From 223ff75474666e8df0727b472a1d072b18fb5e08 Mon Sep 17 00:00:00 2001 From: Nicolas Laplante Date: Thu, 13 Sep 2018 10:02:33 -0400 Subject: [PATCH 1/3] add deepmerge dependency --- package-lock.json | 5 +++++ package.json | 1 + 2 files changed, 6 insertions(+) diff --git a/package-lock.json b/package-lock.json index 2cfcc1b..81c0d53 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3227,6 +3227,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, + "deepmerge": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-2.1.1.tgz", + "integrity": "sha512-urQxA1smbLZ2cBbXbaYObM1dJ82aJ2H57A1C/Kklfh/ZN1bgH4G/n5KWhdNfOK11W98gqZfyYj7W4frJJRwA2w==" + }, "default-require-extensions": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-1.0.0.tgz", diff --git a/package.json b/package.json index d3b402e..b73f61e 100644 --- a/package.json +++ b/package.json @@ -19,6 +19,7 @@ "@angular/platform-browser-dynamic": "^6.0.0", "@ngx-translate/core": ">=10.0.0", "core-js": "^2.5.4", + "deepmerge": "^2.1.1", "rxjs": "^6.1.0", "zone.js": "^0.8.26" }, From 3052a618ce9d2ce6dfd0bb8b6db76bcaf6a9ffd9 Mon Sep 17 00:00:00 2001 From: Nicolas Laplante Date: Thu, 13 Sep 2018 10:02:56 -0400 Subject: [PATCH 2/3] use deepmerge.all to merge the multiple objetcts together --- .../multi-http-loader/src/lib/multi-http-loader.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/projects/ngx-translate/multi-http-loader/src/lib/multi-http-loader.ts b/projects/ngx-translate/multi-http-loader/src/lib/multi-http-loader.ts index b415f73..d8fd3b9 100644 --- a/projects/ngx-translate/multi-http-loader/src/lib/multi-http-loader.ts +++ b/projects/ngx-translate/multi-http-loader/src/lib/multi-http-loader.ts @@ -2,6 +2,7 @@ import {HttpClient} from "@angular/common/http"; import {TranslateLoader} from "@ngx-translate/core"; import {Observable, forkJoin} from "rxjs"; import {map} from "rxjs/operators"; +import merge from 'deepmerge'; export interface ITranslationResource { @@ -19,6 +20,6 @@ export class MultiTranslateHttpLoader implements TranslateLoader { const requests = this.resources.map(resource => { return this.http.get(resource.prefix + lang + resource.suffix); }); - return forkJoin(requests).pipe(map(response => response.reduce((a, b) => Object.assign(a, b)))); + return forkJoin(requests).pipe(map(response => merge.all(response))); } } From b0c7120c965bb69ff6799780bd37d03e28470d31 Mon Sep 17 00:00:00 2001 From: Nicolas Laplante Date: Thu, 13 Sep 2018 10:03:31 -0400 Subject: [PATCH 3/3] update specs to test the deep merged translations --- .../tests/multi-http-loader.spec.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/projects/ngx-translate/multi-http-loader/tests/multi-http-loader.spec.ts b/projects/ngx-translate/multi-http-loader/tests/multi-http-loader.spec.ts index f6556fc..3bc2bd6 100644 --- a/projects/ngx-translate/multi-http-loader/tests/multi-http-loader.spec.ts +++ b/projects/ngx-translate/multi-http-loader/tests/multi-http-loader.spec.ts @@ -151,11 +151,17 @@ describe('MultiTranslateHttpLoader - Multiple Translation Files', () => { // mock response after the xhr request, otherwise it will be undefined http.expectOne('/assets/i18n/core/en.json').flush({ "TEST": "This is a test (core)", - "TEST2": "This is another test (core)" + "TEST2": "This is another test (core)", + "DEEP": { + "some": "thing" + } }); http.expectOne('/assets/i18n/shared/en.json').flush({ "TEST-SHARED": "This is a test (shared)", - "TEST2-SHARED": "This is another test (shared)" + "TEST2-SHARED": "This is another test (shared)", + "DEEP": { + "another": "something" + } }); // this will request the translation from downloaded translations without making a request to the backend @@ -165,5 +171,11 @@ describe('MultiTranslateHttpLoader - Multiple Translation Files', () => { translate.get('TEST2-SHARED').subscribe((res: string) => { expect(res).toEqual('This is another test (shared)'); }); + translate.get('DEEP').subscribe((res: any) => { + expect(res).toEqual({ + "some": "thing", + "another": "something" + }); + }); }); });