payload
Version:
Node, React and MongoDB Headless CMS and Application Framework
142 lines (141 loc) • 18.9 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", {
value: true
});
Object.defineProperty(exports, "getLocalizedPaths", {
enumerable: true,
get: function() {
return getLocalizedPaths;
}
});
const _types = require("../fields/config/types");
const _flattenTopLevelFields = /*#__PURE__*/ _interop_require_default(require("../utilities/flattenTopLevelFields"));
function _interop_require_default(obj) {
return obj && obj.__esModule ? obj : {
default: obj
};
}
async function getLocalizedPaths({ collectionSlug, fields, globalSlug, incomingPath, locale, overrideAccess = false, payload }) {
const pathSegments = incomingPath.split('.');
const localizationConfig = payload.config.localization;
let paths = [
{
collectionSlug,
complete: false,
field: undefined,
fields: (0, _flattenTopLevelFields.default)(fields, false),
globalSlug,
invalid: false,
path: ''
}
];
for(let i = 0; i < pathSegments.length; i += 1){
const segment = pathSegments[i];
const lastIncompletePath = paths.find(({ complete })=>!complete);
if (lastIncompletePath) {
const { path } = lastIncompletePath;
let currentPath = path ? `${path}.${segment}` : segment;
const matchedField = lastIncompletePath.fields.find((field)=>(0, _types.fieldAffectsData)(field) && field.name === segment);
lastIncompletePath.field = matchedField;
if (currentPath === 'globalType' && globalSlug) {
lastIncompletePath.path = currentPath;
lastIncompletePath.complete = true;
lastIncompletePath.field = {
name: 'globalType',
type: 'text'
};
return paths;
}
if (!matchedField && currentPath === 'id' && i === pathSegments.length - 1) {
lastIncompletePath.path = currentPath;
const idField = {
name: 'id',
type: payload.db.defaultIDType
};
lastIncompletePath.field = idField;
lastIncompletePath.complete = true;
return paths;
}
if (matchedField) {
if ('hidden' in matchedField && matchedField.hidden && !overrideAccess) {
lastIncompletePath.invalid = true;
}
const nextSegment = pathSegments[i + 1];
const nextSegmentIsLocale = localizationConfig && localizationConfig.localeCodes.includes(nextSegment);
if (nextSegmentIsLocale) {
// Skip the next iteration, because it's a locale
i += 1;
currentPath = `${currentPath}.${nextSegment}`;
} else if (localizationConfig && 'localized' in matchedField && matchedField.localized) {
currentPath = `${currentPath}.${locale}`;
}
switch(matchedField.type){
case 'blocks':
case 'richText':
case 'json':
{
const upcomingSegments = pathSegments.slice(i + 1).join('.');
lastIncompletePath.complete = true;
lastIncompletePath.path = upcomingSegments ? `${currentPath}.${upcomingSegments}` : currentPath;
return paths;
}
case 'relationship':
case 'upload':
{
// If this is a polymorphic relation,
// We only support querying directly (no nested querying)
if (typeof matchedField.relationTo !== 'string') {
const lastSegmentIsValid = [
'relationTo',
'value'
].includes(pathSegments[pathSegments.length - 1]) || pathSegments.length === 1;
if (lastSegmentIsValid) {
lastIncompletePath.complete = true;
lastIncompletePath.path = pathSegments.join('.');
} else {
lastIncompletePath.invalid = true;
return paths;
}
} else {
lastIncompletePath.complete = true;
lastIncompletePath.path = currentPath;
const nestedPathToQuery = pathSegments.slice(nextSegmentIsLocale ? i + 2 : i + 1).join('.');
if (nestedPathToQuery) {
const relatedCollection = payload.collections[matchedField.relationTo].config;
// eslint-disable-next-line no-await-in-loop
const remainingPaths = await getLocalizedPaths({
collectionSlug: relatedCollection.slug,
fields: relatedCollection.fields,
globalSlug,
incomingPath: nestedPathToQuery,
locale,
payload
});
paths = [
...paths,
...remainingPaths
];
}
return paths;
}
break;
}
default:
{
if ('fields' in lastIncompletePath.field) {
lastIncompletePath.fields = (0, _flattenTopLevelFields.default)(lastIncompletePath.field.fields, false);
}
if (i + 1 === pathSegments.length) lastIncompletePath.complete = true;
lastIncompletePath.path = currentPath;
}
}
} else {
lastIncompletePath.invalid = true;
lastIncompletePath.path = currentPath;
return paths;
}
}
}
return paths;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9kYXRhYmFzZS9nZXRMb2NhbGl6ZWRQYXRocy50cyJdLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFBheWxvYWQgfSBmcm9tICcuLidcbmltcG9ydCB0eXBlIHsgRmllbGQgfSBmcm9tICcuLi9maWVsZHMvY29uZmlnL3R5cGVzJ1xuaW1wb3J0IHR5cGUgeyBQYXRoVG9RdWVyeSB9IGZyb20gJy4vcXVlcnlWYWxpZGF0aW9uL3R5cGVzJ1xuXG5pbXBvcnQgeyBmaWVsZEFmZmVjdHNEYXRhIH0gZnJvbSAnLi4vZmllbGRzL2NvbmZpZy90eXBlcydcbmltcG9ydCBmbGF0dGVuRmllbGRzIGZyb20gJy4uL3V0aWxpdGllcy9mbGF0dGVuVG9wTGV2ZWxGaWVsZHMnXG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZXRMb2NhbGl6ZWRQYXRocyh7XG4gIGNvbGxlY3Rpb25TbHVnLFxuICBmaWVsZHMsXG4gIGdsb2JhbFNsdWcsXG4gIGluY29taW5nUGF0aCxcbiAgbG9jYWxlLFxuICBvdmVycmlkZUFjY2VzcyA9IGZhbHNlLFxuICBwYXlsb2FkLFxufToge1xuICBjb2xsZWN0aW9uU2x1Zz86IHN0cmluZ1xuICBmaWVsZHM6IEZpZWxkW11cbiAgZ2xvYmFsU2x1Zz86IHN0cmluZ1xuICBpbmNvbWluZ1BhdGg6IHN0cmluZ1xuICBsb2NhbGU/OiBzdHJpbmdcbiAgb3ZlcnJpZGVBY2Nlc3M/OiBib29sZWFuXG4gIHBheWxvYWQ6IFBheWxvYWRcbn0pOiBQcm9taXNlPFBhdGhUb1F1ZXJ5W10+IHtcbiAgY29uc3QgcGF0aFNlZ21lbnRzID0gaW5jb21pbmdQYXRoLnNwbGl0KCcuJylcbiAgY29uc3QgbG9jYWxpemF0aW9uQ29uZmlnID0gcGF5bG9hZC5jb25maWcubG9jYWxpemF0aW9uXG5cbiAgbGV0IHBhdGhzOiBQYXRoVG9RdWVyeVtdID0gW1xuICAgIHtcbiAgICAgIGNvbGxlY3Rpb25TbHVnLFxuICAgICAgY29tcGxldGU6IGZhbHNlLFxuICAgICAgZmllbGQ6IHVuZGVmaW5lZCxcbiAgICAgIGZpZWxkczogZmxhdHRlbkZpZWxkcyhmaWVsZHMsIGZhbHNlKSxcbiAgICAgIGdsb2JhbFNsdWcsXG4gICAgICBpbnZhbGlkOiBmYWxzZSxcbiAgICAgIHBhdGg6ICcnLFxuICAgIH0sXG4gIF1cblxuICBmb3IgKGxldCBpID0gMDsgaSA8IHBhdGhTZWdtZW50cy5sZW5ndGg7IGkgKz0gMSkge1xuICAgIGNvbnN0IHNlZ21lbnQgPSBwYXRoU2VnbWVudHNbaV1cblxuICAgIGNvbnN0IGxhc3RJbmNvbXBsZXRlUGF0aCA9IHBhdGhzLmZpbmQoKHsgY29tcGxldGUgfSkgPT4gIWNvbXBsZXRlKVxuXG4gICAgaWYgKGxhc3RJbmNvbXBsZXRlUGF0aCkge1xuICAgICAgY29uc3QgeyBwYXRoIH0gPSBsYXN0SW5jb21wbGV0ZVBhdGhcbiAgICAgIGxldCBjdXJyZW50UGF0aCA9IHBhdGggPyBgJHtwYXRofS4ke3NlZ21lbnR9YCA6IHNlZ21lbnRcblxuICAgICAgY29uc3QgbWF0Y2hlZEZpZWxkID0gbGFzdEluY29tcGxldGVQYXRoLmZpZWxkcy5maW5kKFxuICAgICAgICAoZmllbGQpID0+IGZpZWxkQWZmZWN0c0RhdGEoZmllbGQpICYmIGZpZWxkLm5hbWUgPT09IHNlZ21lbnQsXG4gICAgICApXG4gICAgICBsYXN0SW5jb21wbGV0ZVBhdGguZmllbGQgPSBtYXRjaGVkRmllbGRcblxuICAgICAgaWYgKGN1cnJlbnRQYXRoID09PSAnZ2xvYmFsVHlwZScgJiYgZ2xvYmFsU2x1Zykge1xuICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGgucGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgIGxhc3RJbmNvbXBsZXRlUGF0aC5jb21wbGV0ZSA9IHRydWVcbiAgICAgICAgbGFzdEluY29tcGxldGVQYXRoLmZpZWxkID0ge1xuICAgICAgICAgIG5hbWU6ICdnbG9iYWxUeXBlJyxcbiAgICAgICAgICB0eXBlOiAndGV4dCcsXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcGF0aHNcbiAgICAgIH1cblxuICAgICAgaWYgKCFtYXRjaGVkRmllbGQgJiYgY3VycmVudFBhdGggPT09ICdpZCcgJiYgaSA9PT0gcGF0aFNlZ21lbnRzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgbGFzdEluY29tcGxldGVQYXRoLnBhdGggPSBjdXJyZW50UGF0aFxuICAgICAgICBjb25zdCBpZEZpZWxkOiBGaWVsZCA9IHtcbiAgICAgICAgICBuYW1lOiAnaWQnLFxuICAgICAgICAgIHR5cGU6IHBheWxvYWQuZGIuZGVmYXVsdElEVHlwZSBhcyAndGV4dCcsXG4gICAgICAgIH1cbiAgICAgICAgbGFzdEluY29tcGxldGVQYXRoLmZpZWxkID0gaWRGaWVsZFxuICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGguY29tcGxldGUgPSB0cnVlXG4gICAgICAgIHJldHVybiBwYXRoc1xuICAgICAgfVxuXG4gICAgICBpZiAobWF0Y2hlZEZpZWxkKSB7XG4gICAgICAgIGlmICgnaGlkZGVuJyBpbiBtYXRjaGVkRmllbGQgJiYgbWF0Y2hlZEZpZWxkLmhpZGRlbiAmJiAhb3ZlcnJpZGVBY2Nlc3MpIHtcbiAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGguaW52YWxpZCA9IHRydWVcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IG5leHRTZWdtZW50ID0gcGF0aFNlZ21lbnRzW2kgKyAxXVxuICAgICAgICBjb25zdCBuZXh0U2VnbWVudElzTG9jYWxlID1cbiAgICAgICAgICBsb2NhbGl6YXRpb25Db25maWcgJiYgbG9jYWxpemF0aW9uQ29uZmlnLmxvY2FsZUNvZGVzLmluY2x1ZGVzKG5leHRTZWdtZW50KVxuXG4gICAgICAgIGlmIChuZXh0U2VnbWVudElzTG9jYWxlKSB7XG4gICAgICAgICAgLy8gU2tpcCB0aGUgbmV4dCBpdGVyYXRpb24sIGJlY2F1c2UgaXQncyBhIGxvY2FsZVxuICAgICAgICAgIGkgKz0gMVxuICAgICAgICAgIGN1cnJlbnRQYXRoID0gYCR7Y3VycmVudFBhdGh9LiR7bmV4dFNlZ21lbnR9YFxuICAgICAgICB9IGVsc2UgaWYgKGxvY2FsaXphdGlvbkNvbmZpZyAmJiAnbG9jYWxpemVkJyBpbiBtYXRjaGVkRmllbGQgJiYgbWF0Y2hlZEZpZWxkLmxvY2FsaXplZCkge1xuICAgICAgICAgIGN1cnJlbnRQYXRoID0gYCR7Y3VycmVudFBhdGh9LiR7bG9jYWxlfWBcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAobWF0Y2hlZEZpZWxkLnR5cGUpIHtcbiAgICAgICAgICBjYXNlICdibG9ja3MnOlxuICAgICAgICAgIGNhc2UgJ3JpY2hUZXh0JzpcbiAgICAgICAgICBjYXNlICdqc29uJzoge1xuICAgICAgICAgICAgY29uc3QgdXBjb21pbmdTZWdtZW50cyA9IHBhdGhTZWdtZW50cy5zbGljZShpICsgMSkuam9pbignLicpXG4gICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGguY29tcGxldGUgPSB0cnVlXG4gICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGgucGF0aCA9IHVwY29taW5nU2VnbWVudHNcbiAgICAgICAgICAgICAgPyBgJHtjdXJyZW50UGF0aH0uJHt1cGNvbWluZ1NlZ21lbnRzfWBcbiAgICAgICAgICAgICAgOiBjdXJyZW50UGF0aFxuICAgICAgICAgICAgcmV0dXJuIHBhdGhzXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY2FzZSAncmVsYXRpb25zaGlwJzpcbiAgICAgICAgICBjYXNlICd1cGxvYWQnOiB7XG4gICAgICAgICAgICAvLyBJZiB0aGlzIGlzIGEgcG9seW1vcnBoaWMgcmVsYXRpb24sXG4gICAgICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgcXVlcnlpbmcgZGlyZWN0bHkgKG5vIG5lc3RlZCBxdWVyeWluZylcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbWF0Y2hlZEZpZWxkLnJlbGF0aW9uVG8gIT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgIGNvbnN0IGxhc3RTZWdtZW50SXNWYWxpZCA9XG4gICAgICAgICAgICAgICAgWydyZWxhdGlvblRvJywgJ3ZhbHVlJ10uaW5jbHVkZXMocGF0aFNlZ21lbnRzW3BhdGhTZWdtZW50cy5sZW5ndGggLSAxXSkgfHxcbiAgICAgICAgICAgICAgICBwYXRoU2VnbWVudHMubGVuZ3RoID09PSAxXG5cbiAgICAgICAgICAgICAgaWYgKGxhc3RTZWdtZW50SXNWYWxpZCkge1xuICAgICAgICAgICAgICAgIGxhc3RJbmNvbXBsZXRlUGF0aC5jb21wbGV0ZSA9IHRydWVcbiAgICAgICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGgucGF0aCA9IHBhdGhTZWdtZW50cy5qb2luKCcuJylcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGguaW52YWxpZCA9IHRydWVcbiAgICAgICAgICAgICAgICByZXR1cm4gcGF0aHNcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgbGFzdEluY29tcGxldGVQYXRoLmNvbXBsZXRlID0gdHJ1ZVxuICAgICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGgucGF0aCA9IGN1cnJlbnRQYXRoXG5cbiAgICAgICAgICAgICAgY29uc3QgbmVzdGVkUGF0aFRvUXVlcnkgPSBwYXRoU2VnbWVudHNcbiAgICAgICAgICAgICAgICAuc2xpY2UobmV4dFNlZ21lbnRJc0xvY2FsZSA/IGkgKyAyIDogaSArIDEpXG4gICAgICAgICAgICAgICAgLmpvaW4oJy4nKVxuXG4gICAgICAgICAgICAgIGlmIChuZXN0ZWRQYXRoVG9RdWVyeSkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlbGF0ZWRDb2xsZWN0aW9uID0gcGF5bG9hZC5jb2xsZWN0aW9uc1ttYXRjaGVkRmllbGQucmVsYXRpb25Ub10uY29uZmlnXG5cbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tYXdhaXQtaW4tbG9vcFxuICAgICAgICAgICAgICAgIGNvbnN0IHJlbWFpbmluZ1BhdGhzID0gYXdhaXQgZ2V0TG9jYWxpemVkUGF0aHMoe1xuICAgICAgICAgICAgICAgICAgY29sbGVjdGlvblNsdWc6IHJlbGF0ZWRDb2xsZWN0aW9uLnNsdWcsXG4gICAgICAgICAgICAgICAgICBmaWVsZHM6IHJlbGF0ZWRDb2xsZWN0aW9uLmZpZWxkcyxcbiAgICAgICAgICAgICAgICAgIGdsb2JhbFNsdWcsXG4gICAgICAgICAgICAgICAgICBpbmNvbWluZ1BhdGg6IG5lc3RlZFBhdGhUb1F1ZXJ5LFxuICAgICAgICAgICAgICAgICAgbG9jYWxlLFxuICAgICAgICAgICAgICAgICAgcGF5bG9hZCxcbiAgICAgICAgICAgICAgICB9KVxuXG4gICAgICAgICAgICAgICAgcGF0aHMgPSBbLi4ucGF0aHMsIC4uLnJlbWFpbmluZ1BhdGhzXVxuICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgcmV0dXJuIHBhdGhzXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGJyZWFrXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgZGVmYXVsdDoge1xuICAgICAgICAgICAgaWYgKCdmaWVsZHMnIGluIGxhc3RJbmNvbXBsZXRlUGF0aC5maWVsZCkge1xuICAgICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGguZmllbGRzID0gZmxhdHRlbkZpZWxkcyhsYXN0SW5jb21wbGV0ZVBhdGguZmllbGQuZmllbGRzLCBmYWxzZSlcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGkgKyAxID09PSBwYXRoU2VnbWVudHMubGVuZ3RoKSBsYXN0SW5jb21wbGV0ZVBhdGguY29tcGxldGUgPSB0cnVlXG4gICAgICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGgucGF0aCA9IGN1cnJlbnRQYXRoXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsYXN0SW5jb21wbGV0ZVBhdGguaW52YWxpZCA9IHRydWVcbiAgICAgICAgbGFzdEluY29tcGxldGVQYXRoLnBhdGggPSBjdXJyZW50UGF0aFxuICAgICAgICByZXR1cm4gcGF0aHNcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gcGF0aHNcbn1cbiJdLCJuYW1lcyI6WyJnZXRMb2NhbGl6ZWRQYXRocyIsImNvbGxlY3Rpb25TbHVnIiwiZmllbGRzIiwiZ2xvYmFsU2x1ZyIsImluY29taW5nUGF0aCIsImxvY2FsZSIsIm92ZXJyaWRlQWNjZXNzIiwicGF5bG9hZCIsInBhdGhTZWdtZW50cyIsInNwbGl0IiwibG9jYWxpemF0aW9uQ29uZmlnIiwiY29uZmlnIiwibG9jYWxpemF0aW9uIiwicGF0aHMiLCJjb21wbGV0ZSIsImZpZWxkIiwidW5kZWZpbmVkIiwiZmxhdHRlbkZpZWxkcyIsImludmFsaWQiLCJwYXRoIiwiaSIsImxlbmd0aCIsInNlZ21lbnQiLCJsYXN0SW5jb21wbGV0ZVBhdGgiLCJmaW5kIiwiY3VycmVudFBhdGgiLCJtYXRjaGVkRmllbGQiLCJmaWVsZEFmZmVjdHNEYXRhIiwibmFtZSIsInR5cGUiLCJpZEZpZWxkIiwiZGIiLCJkZWZhdWx0SURUeXBlIiwiaGlkZGVuIiwibmV4dFNlZ21lbnQiLCJuZXh0U2VnbWVudElzTG9jYWxlIiwibG9jYWxlQ29kZXMiLCJpbmNsdWRlcyIsImxvY2FsaXplZCIsInVwY29taW5nU2VnbWVudHMiLCJzbGljZSIsImpvaW4iLCJyZWxhdGlvblRvIiwibGFzdFNlZ21lbnRJc1ZhbGlkIiwibmVzdGVkUGF0aFRvUXVlcnkiLCJyZWxhdGVkQ29sbGVjdGlvbiIsImNvbGxlY3Rpb25zIiwicmVtYWluaW5nUGF0aHMiLCJzbHVnIl0sIm1hcHBpbmdzIjoiOzs7OytCQU9zQkE7OztlQUFBQTs7O3VCQUhXOzhFQUNQOzs7Ozs7QUFFbkIsZUFBZUEsa0JBQWtCLEVBQ3RDQyxjQUFjLEVBQ2RDLE1BQU0sRUFDTkMsVUFBVSxFQUNWQyxZQUFZLEVBQ1pDLE1BQU0sRUFDTkMsaUJBQWlCLEtBQUssRUFDdEJDLE9BQU8sRUFTUjtJQUNDLE1BQU1D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