Skip to content

Commit a430258

Browse files
authored
chore: refactor flat loader (#471)
1 parent 66a9368 commit a430258

2 files changed

Lines changed: 33 additions & 14 deletions

File tree

packages/cli/src/cli/loaders/flat.spec.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ describe("flat loader", () => {
1717
messages: { "1": "foo", "2": "bar" },
1818
years: ["January 13, 2025", "February 14, 2025"],
1919
});
20-
await loader.pull("en", {}); // run again to ensure state is preserved
20+
await loader.pull("es", {}); // run again to ensure state is preserved
2121
const output = await loader.push("en", {
2222
"messages/1": "foo",
2323
"messages/2": "bar",

packages/cli/src/cli/loaders/flat.ts

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,55 @@
11
import { flatten, unflatten } from "flat";
22
import { ILoader } from "./_types";
3-
import { createLoader } from "./_utils";
3+
import { composeLoaders, createLoader } from "./_utils";
44
import _ from "lodash";
55

66
export 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>) {
5372
export 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

Comments
 (0)