11import { flatten , unflatten } from "flat" ;
22import { ILoader } from "./_types" ;
3- import { createLoader } from "./_utils" ;
3+ import { composeLoaders , createLoader } from "./_utils" ;
44import _ from "lodash" ;
55
66export const OBJECT_NUMERIC_KEY_PREFIX = "__lingodotdev__obj__" ;
77
8- export default function createFlatLoader ( ) : ILoader < Record < string , any > , Record < string , string > > {
9- let denormalizedKeysMap : Record < string , string > = { } ;
8+ export default function createFlatLoader ( ) {
9+ return composeLoaders ( createDenormalizeLoader ( ) , createNormalizeLoader ( ) ) ;
10+ }
11+
12+ type DenormalizeResult = {
13+ denormalized : Record < string , string > ;
14+ keysMap : Record < string , string > ;
15+ } ;
1016
17+ function createDenormalizeLoader ( ) : ILoader < Record < string , any > , DenormalizeResult > {
1118 return createLoader ( {
1219 pull : async ( locale , input ) => {
13- const denormalized = denormalizeObjectKeys ( input || { } ) ;
14- const flattened : Record < string , string > = flatten ( denormalized , {
20+ const inputDenormalized = denormalizeObjectKeys ( input || { } ) ;
21+ const denormalized : Record < string , string > = flatten ( inputDenormalized , {
1522 delimiter : "/" ,
1623 transformKey ( key ) {
1724 return encodeURIComponent ( String ( key ) ) ;
1825 } ,
1926 } ) ;
20- denormalizedKeysMap = { ...denormalizedKeysMap , ...buildDenormalizedKeysMap ( flattened ) } ;
21- const normalized = normalizeObjectKeys ( flattened ) ;
27+ const keysMap = buildDenormalizedKeysMap ( denormalized ) ;
28+ return { denormalized, keysMap } ;
29+ } ,
30+ push : async ( locale , { denormalized } ) => {
31+ const normalized = normalizeObjectKeys ( denormalized ) ;
2232 return normalized ;
2333 } ,
24- push : async ( locale , data ) => {
25- const denormalized = mapDenormalizedKeys ( data , denormalizedKeysMap ) ;
26- const unflattened : Record < string , any > = unflatten ( denormalized || { } , {
34+ } ) ;
35+ }
36+
37+ function createNormalizeLoader ( ) : ILoader < DenormalizeResult , Record < string , string > > {
38+ return createLoader ( {
39+ pull : async ( locale , input ) => {
40+ const normalized = normalizeObjectKeys ( input . denormalized ) ;
41+ return normalized ;
42+ } ,
43+ push : async ( locale , data , originalInput ) => {
44+ const keysMap = originalInput ?. keysMap ?? { } ;
45+ const input = mapDenormalizedKeys ( data , keysMap ) ;
46+ const denormalized : Record < string , any > = unflatten ( input , {
2747 delimiter : "/" ,
2848 transformKey ( key ) {
2949 return decodeURIComponent ( String ( key ) ) ;
3050 } ,
3151 } ) ;
32- const normalized = normalizeObjectKeys ( unflattened ) ;
33- return normalized ;
52+ return { denormalized, keysMap : keysMap || { } } ;
3453 } ,
3554 } ) ;
3655}
@@ -53,7 +72,7 @@ export function buildDenormalizedKeysMap(obj: Record<string, string>) {
5372export function mapDenormalizedKeys ( obj : Record < string , any > , denormalizedKeysMap : Record < string , string > ) {
5473 return Object . keys ( obj ) . reduce (
5574 ( acc , key ) => {
56- const denormalizedKey = denormalizedKeysMap [ key ] ;
75+ const denormalizedKey = denormalizedKeysMap [ key ] ?? key ;
5776 acc [ denormalizedKey ] = obj [ key ] ;
5877 return acc ;
5978 } ,
0 commit comments