UNPKG

payload

Version:

Node, React and MongoDB Headless CMS and Application Framework

142 lines (141 loc) • 18.9 kB
"use strict"; 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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