From 8ee18de105b13eb9e2768369f3c8fe48787b1f0e Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Mon, 2 Jan 2023 01:36:47 +0100 Subject: [PATCH 1/6] feat(locales): add mergeLocales utility --- src/utils/merge-locales.ts | 37 +++++++++++++++++++++ test/utils/merge-locales.spec.ts | 55 ++++++++++++++++++++++++++++++++ 2 files changed, 92 insertions(+) create mode 100644 src/utils/merge-locales.ts create mode 100644 test/utils/merge-locales.spec.ts diff --git a/src/utils/merge-locales.ts b/src/utils/merge-locales.ts new file mode 100644 index 00000000000..321ee7bbe3b --- /dev/null +++ b/src/utils/merge-locales.ts @@ -0,0 +1,37 @@ +import type { LocaleDefinition } from 'src'; + +/** + * Merges the given locales into one locale. + * The locales are merged in the order they are given. + * The first locale that provides a entry for a category will be used for that. + * Mutating the category entries in the returned locale will also mutate the entries in the respective source locale. + * + * @param locales The locales to merge. + * @returns The newly merged locale. + * + * @example + * const locale = mergeLocales([ de_CH, de, en ]); + */ +export function mergeLocales(locales: LocaleDefinition[]): LocaleDefinition { + const merged: LocaleDefinition = {} as LocaleDefinition; + + for (const locale of locales) { + for (const key in locale) { + if (merged[key] === undefined) { + if (typeof locale[key] === 'object') { + merged[key] = { ...locale[key] }; + } else { + merged[key] = locale[key]; + } + } else { + if (typeof locale[key] === 'object') { + merged[key] = { ...locale[key], ...merged[key] }; + } else { + // Do nothing + } + } + } + } + + return merged; +} diff --git a/test/utils/merge-locales.spec.ts b/test/utils/merge-locales.spec.ts new file mode 100644 index 00000000000..158a7e2102d --- /dev/null +++ b/test/utils/merge-locales.spec.ts @@ -0,0 +1,55 @@ +import { describe, expect, it } from 'vitest'; +import type { LocaleDefinition } from '../../src'; +import { mergeLocales } from '../../src/utils/merge-locales'; + +describe('mergeLocales', () => { + it('should overwrite locales', () => { + const locale1: LocaleDefinition = { + title: 'a', + person: { firstName: ['a'] }, + }; + const locale2: LocaleDefinition = { + title: 'b', + person: { firstName: ['b'] }, + }; + const locale3: LocaleDefinition = { + title: 'c', + person: { firstName: ['c'] }, + }; + + const merged = mergeLocales([locale1, locale2, locale3]); + + expect(merged).toEqual({ + title: 'a', + person: { firstName: ['a'] }, + }); + }); + + it('should extend locales', () => { + const locale1: LocaleDefinition = { + title: 'a', + location: { city: ['a'] }, + person: { first_name: ['a'] }, + }; + const locale2: LocaleDefinition = { + title: 'b', + animal: { cat: ['b'] }, + person: { last_name: ['b'] }, + }; + const locale3: LocaleDefinition = { + title: 'c', + color: { human: ['c'] }, + person: {}, + }; + + const merged = mergeLocales([locale1, locale2, locale3]); + + expect(merged).toEqual({ + title: 'a', + animal: { cat: ['b'] }, + color: { human: ['c'] }, + location: { city: ['a'] }, + person: { first_name: ['a'], last_name: ['b'] }, + }); + }); +}); From e8f3a582181bc90941edd8c224139358245b878e Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Mon, 2 Jan 2023 02:30:53 +0100 Subject: [PATCH 2/6] chore: fix import --- src/utils/merge-locales.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/merge-locales.ts b/src/utils/merge-locales.ts index 321ee7bbe3b..add4eb66a68 100644 --- a/src/utils/merge-locales.ts +++ b/src/utils/merge-locales.ts @@ -1,4 +1,4 @@ -import type { LocaleDefinition } from 'src'; +import type { LocaleDefinition } from '..'; /** * Merges the given locales into one locale. From 1c18af68e943b55109789f1e51336e6f11ef48bb Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Mon, 2 Jan 2023 22:44:36 +0100 Subject: [PATCH 3/6] chore: apply suggestions Co-authored-by: Shinigami --- src/utils/merge-locales.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/merge-locales.ts b/src/utils/merge-locales.ts index add4eb66a68..99b11002e7e 100644 --- a/src/utils/merge-locales.ts +++ b/src/utils/merge-locales.ts @@ -3,7 +3,7 @@ import type { LocaleDefinition } from '..'; /** * Merges the given locales into one locale. * The locales are merged in the order they are given. - * The first locale that provides a entry for a category will be used for that. + * The first locale that provides an entry for a category will be used for that. * Mutating the category entries in the returned locale will also mutate the entries in the respective source locale. * * @param locales The locales to merge. From 6326ce91906b8c00e2a2fb35702b7f9af0cd2d3c Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Mon, 2 Jan 2023 22:49:48 +0100 Subject: [PATCH 4/6] chore: apply suggestions --- src/utils/merge-locales.ts | 2 +- test/utils/merge-locales.spec.ts | 4 ++++ 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/src/utils/merge-locales.ts b/src/utils/merge-locales.ts index 99b11002e7e..8f60017ce69 100644 --- a/src/utils/merge-locales.ts +++ b/src/utils/merge-locales.ts @@ -10,7 +10,7 @@ import type { LocaleDefinition } from '..'; * @returns The newly merged locale. * * @example - * const locale = mergeLocales([ de_CH, de, en ]); + * const de_CH_with_fallbacks = mergeLocales([ de_CH, de, en ]); */ export function mergeLocales(locales: LocaleDefinition[]): LocaleDefinition { const merged: LocaleDefinition = {} as LocaleDefinition; diff --git a/test/utils/merge-locales.spec.ts b/test/utils/merge-locales.spec.ts index 158a7e2102d..791454114c2 100644 --- a/test/utils/merge-locales.spec.ts +++ b/test/utils/merge-locales.spec.ts @@ -7,14 +7,17 @@ describe('mergeLocales', () => { const locale1: LocaleDefinition = { title: 'a', person: { firstName: ['a'] }, + finance: { credit_card: { visa: ['a'] } }, }; const locale2: LocaleDefinition = { title: 'b', person: { firstName: ['b'] }, + finance: { credit_card: { mastercard: ['b'] } }, }; const locale3: LocaleDefinition = { title: 'c', person: { firstName: ['c'] }, + finance: { credit_card: {} }, }; const merged = mergeLocales([locale1, locale2, locale3]); @@ -22,6 +25,7 @@ describe('mergeLocales', () => { expect(merged).toEqual({ title: 'a', person: { firstName: ['a'] }, + finance: { credit_card: { visa: ['a'] } }, }); }); From 4f091ccd9c7003b38972961bdb06788505f107e9 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Wed, 11 Jan 2023 21:29:39 +0100 Subject: [PATCH 5/6] chore: edit after review --- src/utils/merge-locales.ts | 2 +- test/utils/merge-locales.spec.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/utils/merge-locales.ts b/src/utils/merge-locales.ts index 8f60017ce69..706b4d40b4c 100644 --- a/src/utils/merge-locales.ts +++ b/src/utils/merge-locales.ts @@ -27,7 +27,7 @@ export function mergeLocales(locales: LocaleDefinition[]): LocaleDefinition { if (typeof locale[key] === 'object') { merged[key] = { ...locale[key], ...merged[key] }; } else { - // Do nothing + // Primitive values cannot be not merged } } } diff --git a/test/utils/merge-locales.spec.ts b/test/utils/merge-locales.spec.ts index 791454114c2..0dcd3ab8a50 100644 --- a/test/utils/merge-locales.spec.ts +++ b/test/utils/merge-locales.spec.ts @@ -3,7 +3,7 @@ import type { LocaleDefinition } from '../../src'; import { mergeLocales } from '../../src/utils/merge-locales'; describe('mergeLocales', () => { - it('should overwrite locales', () => { + it('should not overwrite entries', () => { const locale1: LocaleDefinition = { title: 'a', person: { firstName: ['a'] }, @@ -29,7 +29,7 @@ describe('mergeLocales', () => { }); }); - it('should extend locales', () => { + it('should extend categories', () => { const locale1: LocaleDefinition = { title: 'a', location: { city: ['a'] }, From 1dd8e63f44f8b81cf85ab6b5231083156f236bb1 Mon Sep 17 00:00:00 2001 From: ST-DDT Date: Wed, 11 Jan 2023 22:34:49 +0100 Subject: [PATCH 6/6] chore: apply suggestions --- src/utils/merge-locales.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/merge-locales.ts b/src/utils/merge-locales.ts index 706b4d40b4c..f514930659c 100644 --- a/src/utils/merge-locales.ts +++ b/src/utils/merge-locales.ts @@ -27,7 +27,7 @@ export function mergeLocales(locales: LocaleDefinition[]): LocaleDefinition { if (typeof locale[key] === 'object') { merged[key] = { ...locale[key], ...merged[key] }; } else { - // Primitive values cannot be not merged + // Primitive values cannot be merged } } }