UNPKG

@itxch/contentful-import

Version:

This tool allows you to import JSON dump exported by contentful-export

74 lines (73 loc) 2.4 kB
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 };