@itxch/contentful-import
Version:
This tool allows you to import JSON dump exported by contentful-export
74 lines (73 loc) • 2.4 kB
JavaScript
import { map, filter, some } from "lodash-es/collection.js";
import * as _o from "lodash-es/object.js";
import { flatten } from "lodash-es/array.js";
function sortEntries(entries) {
const linkedEntries = getLinkedEntries(entries);
const mergedLinkedEntries = mergeSort(linkedEntries, (a) => {
return hasLinkedIndexesInFront(a);
});
return map(mergedLinkedEntries, (linkInfo) => entries[linkInfo.index]);
function hasLinkedIndexesInFront(item) {
if (hasLinkedIndexes(item)) {
return some(item.linkIndexes, (index) => index > item.index) ? 1 : -1;
}
return 0;
}
function hasLinkedIndexes(item) {
return item.linkIndexes.length > 0;
}
}
function getLinkedEntries(entries) {
return map(entries, function(entry) {
const entryIndex = entries.indexOf(entry);
const rawLinks = map(entry.fields, (field) => {
field = _o.values(field)[0];
if (isEntryLink(field)) {
return getFieldEntriesIndex(field, entries);
} else if (isEntityArray(field) && isEntryLink(field[0])) {
return map(field, (item) => getFieldEntriesIndex(item, entries));
}
});
return {
index: entryIndex,
linkIndexes: filter(flatten(rawLinks), (index) => index >= 0)
};
});
}
function getFieldEntriesIndex(field, entries) {
const id = _o.get(field, "sys.id");
return entries.findIndex((entry) => entry.sys.id === id);
}
function isEntryLink(item) {
return _o.get(item, "sys.type") === "Entry" || _o.get(item, "sys.linkType") === "Entry";
}
function isEntityArray(item) {
return Array.isArray(item) && item.length > 0 && _o.has(item[0], "sys");
}
function mergeSort(arr, compareFn) {
if (arr.length < 2) return arr;
if (compareFn == null) compareFn = defaultCompare;
const mid = ~~(arr.length / 2);
const left = mergeSort(arr.slice(0, mid), compareFn);
const right = mergeSort(arr.slice(mid, arr.length), compareFn);
return merge(left, right, compareFn);
}
function defaultCompare(a, b) {
return a < b ? -1 : a > b ? 1 : 0;
}
function merge(left, right, compareFn) {
const result = [];
while (left.length && right.length) {
if (compareFn(left[0], right[0]) <= 0) {
result.push(left.shift());
} else {
result.push(right.shift());
}
}
if (left.length) result.push(...left);
if (right.length) result.push(...right);
return result;
}
export {
sortEntries as default
};