@intlayer/chokidar
Version:
Uses chokidar to scan and build Intlayer declaration files into dictionaries based on Intlayer configuration.
59 lines (57 loc) • 3.15 kB
JavaScript
import { sortAlphabetically } from "../utils/sortAlphabetically.mjs";
import { fetchDistantDictionaries } from "../fetchDistantDictionaries.mjs";
import { getConfiguration } from "@intlayer/config/node";
import { getIntlayerAPIProxy } from "@intlayer/api";
import { getRemoteDictionaries } from "@intlayer/remote-dictionaries-entry";
//#region src/loadDictionaries/loadRemoteDictionaries.ts
const formatDistantDictionaries = (dictionaries) => dictionaries.map((dict) => ({
...dict,
localId: `${dict.key}::remote::${dict.id}`,
location: "remote"
}));
const loadRemoteDictionaries = async (configuration = getConfiguration(), onStatusUpdate, options) => {
const { editor } = configuration;
const remoteDictionariesRecord = getRemoteDictionaries(configuration);
if (!Boolean(editor.clientId && editor.clientSecret)) return [];
try {
options?.onStartRemoteCheck?.();
const distantDictionaryUpdateTimeStamp = (await getIntlayerAPIProxy(void 0, configuration).dictionary.getDictionariesUpdateTimestamp()).data;
if (!distantDictionaryUpdateTimeStamp) throw new Error("No distant dictionaries found");
const dictionariesIdToFetch = Object.entries(distantDictionaryUpdateTimeStamp).filter(([dictionaryId, data]) => {
if (!data.updatedAt) return true;
const local = remoteDictionariesRecord[data.key]?.find((dictionary) => dictionary.id === dictionaryId);
if (!local) return true;
const localUpdatedAtRaw = local?.updatedAt;
const localUpdatedAt = typeof localUpdatedAtRaw === "number" ? localUpdatedAtRaw : localUpdatedAtRaw ? new Date(localUpdatedAtRaw).getTime() : void 0;
if (typeof localUpdatedAt !== "number") return true;
return data.updatedAt > localUpdatedAt;
});
const cachedDictionaries = Object.values(remoteDictionariesRecord).flat().filter((dictionary) => {
const remoteUpdatedAt = distantDictionaryUpdateTimeStamp[dictionary.id].updatedAt;
const localUpdatedAtRaw = dictionary.updatedAt;
const localUpdatedAt = typeof localUpdatedAtRaw === "number" ? localUpdatedAtRaw : localUpdatedAtRaw ? new Date(localUpdatedAtRaw).getTime() : void 0;
return typeof localUpdatedAt === "number" && typeof remoteUpdatedAt === "number" && localUpdatedAt >= remoteUpdatedAt;
});
if (cachedDictionaries.length > 0) onStatusUpdate?.(cachedDictionaries.map((dictionary) => ({
dictionaryKey: dictionary.key,
type: "remote",
status: "imported"
})));
const orderedDistantDictionaryKeys = dictionariesIdToFetch.map(([, data]) => data.key).sort(sortAlphabetically);
if (orderedDistantDictionaryKeys.length > 0) onStatusUpdate?.(orderedDistantDictionaryKeys.map((key) => ({
dictionaryKey: key,
type: "remote",
status: "pending"
})));
const distantDictionaries = formatDistantDictionaries(await fetchDistantDictionaries({ dictionaryKeys: orderedDistantDictionaryKeys }, onStatusUpdate));
return [...cachedDictionaries, ...distantDictionaries];
} catch (error) {
options?.onError?.(error);
return [];
} finally {
options?.onStopRemoteCheck?.();
}
};
//#endregion
export { formatDistantDictionaries, loadRemoteDictionaries };
//# sourceMappingURL=loadRemoteDictionaries.mjs.map