@spartacus/core
Version:
Spartacus - the core framework
112 lines • 12.3 kB
JavaScript
import { deepMerge, isObject } from '../../config/utils/deep-merge';
/**
* Merge occ fields parameters
*
* @param fields Fields definition as string or object
*/
export function mergeFields(fields) {
const parsedFields = fields.map((f) => typeof f === 'string' ? parseFields(f) : f);
const mergedFields = optimizeFields(deepMerge({}, ...parsedFields));
return stringifyFields(mergedFields);
}
/**
* Optimize fields definition by removing not needed groups
*
* @param fields
*/
export function optimizeFields(fields = {}) {
const keys = Object.keys(fields);
if (keys.includes('FULL')) {
delete fields['DEFAULT'];
delete fields['BASIC'];
}
else if (keys.includes('DEFAULT')) {
delete fields['BASIC'];
}
Object.keys(fields).forEach((key) => {
fields[key] = optimizeFields(fields[key]);
});
return fields;
}
/**
* Parse string field definition to an AST object
*
* @param fields Fields string definition
* @param startIndex Used for recurrence
*/
export function parseFields(fields, startIndex = 0) {
const parsedFields = {};
let i = startIndex;
while (i < fields.length) {
if (fields[i] === ',') {
if (i > startIndex) {
parsedFields[fields.substr(startIndex, i - startIndex)] = {};
}
startIndex = i + 1;
}
else if (fields[i] === '(') {
const subFields = parseFields(fields, i + 1);
if (Array.isArray(subFields)) {
parsedFields[fields.substr(startIndex, i - startIndex)] = subFields[0];
startIndex = subFields[1];
i = startIndex - 1;
}
else {
return parsedFields;
}
}
else if (fields[i] === ')') {
if (i > startIndex) {
parsedFields[fields.substr(startIndex, i - startIndex)] = {};
}
return [parsedFields, i + 1];
}
i++;
}
if (startIndex < fields.length) {
parsedFields[fields.substr(startIndex, i - startIndex)] = {};
}
return parsedFields;
}
/**
* Convert AST object fields definition to string representation
*
* @param fields
*/
export function stringifyFields(fields) {
return Object.keys(fields)
.map((key) => {
const subFields = stringifyFields(fields[key]);
return subFields ? `${key}(${subFields})` : key;
})
.join(',');
}
/**
* Extract part of the object described by fields definition
*
* @param data
* @param fields
*/
export function extractFields(data, fields) {
const parsedFields = typeof fields === 'string' ? parseFields(fields) : fields;
return getObjectPart(data, parsedFields);
}
function getObjectPart(data, fields) {
if (!isObject(data)) {
return data;
}
const keys = Object.keys(fields);
if (keys.length === 0 ||
// we should not extract parts of the object with ambiguous fields definitions
keys.find((el) => el === 'BASIC' || el === 'DEFAULT' || el === 'FULL')) {
return data;
}
const result = {};
keys.forEach((key) => {
if (data.hasOwnProperty(key)) {
result[key] = getObjectPart(data[key], fields[key]);
}
});
return result;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoib2NjLWZpZWxkcy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NvcmUvc3JjL29jYy91dGlscy9vY2MtZmllbGRzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFFcEU7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxXQUFXLENBQUMsTUFBMkI7SUFDckQsTUFBTSxZQUFZLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQ3BDLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNDLENBQUM7SUFDRixNQUFNLFlBQVksR0FBRyxjQUFjLENBQUMsU0FBUyxDQUFDLEVBQUUsRUFBRSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDcEUsT0FBTyxlQUFlLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDdkMsQ0FBQztBQUVEOzs7O0dBSUc7QUFDSCxNQUFNLFVBQVUsY0FBYyxDQUFDLFNBQWlCLEVBQUU7SUFDaEQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUNqQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLEVBQUU7UUFDekIsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7UUFDekIsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEI7U0FBTSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLEVBQUU7UUFDbkMsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUM7S0FDeEI7SUFDRCxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ2xDLE1BQU0sQ0FBQyxHQUFHLENBQUMsR0FBRyxjQUFjLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7SUFDNUMsQ0FBQyxDQUFDLENBQUM7SUFDSCxPQUFPLE1BQU0sQ0FBQztBQUNoQixDQUFDO0FBRUQ7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsV0FBVyxDQUN6QixNQUFjLEVBQ2QsVUFBVSxHQUFHLENBQUM7SUFFZCxNQUFNLFlBQVksR0FBRyxFQUFFLENBQUM7SUFFeEIsSUFBSSxDQUFDLEdBQUcsVUFBVSxDQUFDO0lBQ25CLE9BQU8sQ0FBQyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU7UUFDeEIsSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQ3JCLElBQUksQ0FBQyxHQUFHLFVBQVUsRUFBRTtnQkFDbEIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLEVBQUUsQ0FBQzthQUM5RDtZQUNELFVBQVUsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDO1NBQ3BCO2FBQU0sSUFBSSxNQUFNLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO1lBQzVCLE1BQU0sU0FBUyxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1lBQzdDLElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsRUFBRTtnQkFDNUIsWUFBWSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsVUFBVSxFQUFFLENBQUMsR0FBRyxVQUFVLENBQUMsQ0FBQyxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdkUsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDMUIsQ0FBQyxHQUFHLFVBQVUsR0FBRyxDQUFDLENBQUM7YUFDcEI7aUJBQU07Z0JBQ0wsT0FBTyxZQUFZLENBQUM7YUFDckI7U0FDRjthQUFNLElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUM1QixJQUFJLENBQUMsR0FBRyxVQUFVLEVBQUU7Z0JBQ2xCLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7YUFDOUQ7WUFDRCxPQUFPLENBQUMsWUFBWSxFQUFFLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUM5QjtRQUNELENBQUMsRUFBRSxDQUFDO0tBQ0w7SUFFRCxJQUFJLFVBQVUsR0FBRyxNQUFNLENBQUMsTUFBTSxFQUFFO1FBQzlCLFlBQVksQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLFVBQVUsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLENBQUMsR0FBRyxFQUFFLENBQUM7S0FDOUQ7SUFFRCxPQUFPLFlBQVksQ0FBQztBQUN0QixDQUFDO0FBRUQ7Ozs7R0FJRztBQUNILE1BQU0sVUFBVSxlQUFlLENBQUMsTUFBYztJQUM1QyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO1NBQ3ZCLEdBQUcsQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO1FBQ1gsTUFBTSxTQUFTLEdBQUcsZUFBZSxDQUFDLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBQy9DLE9BQU8sU0FBUyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsSUFBSSxTQUFTLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO0lBQ2xELENBQUMsQ0FBQztTQUNELElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNmLENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILE1BQU0sVUFBVSxhQUFhLENBQUksSUFBTyxFQUFFLE1BQXVCO0lBQy9ELE1BQU0sWUFBWSxHQUNoQixPQUFPLE1BQU0sS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDO0lBQzVELE9BQU8sYUFBYSxDQUFJLElBQUksRUFBRSxZQUFZLENBQUMsQ0FBQztBQUM5QyxDQUFDO0FBRUQsU0FBUyxhQUFhLENBQUksSUFBTyxFQUFFLE1BQWM7SUFDL0MsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsRUFBRTtRQUNuQixPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUVqQyxJQUNFLElBQUksQ0FBQyxNQUFNLEtBQUssQ0FBQztRQUNqQiw4RUFBOEU7UUFDOUUsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLEVBQUUsRUFBRSxFQUFFLENBQUMsRUFBRSxLQUFLLE9BQU8sSUFBSSxFQUFFLEtBQUssU0FBUyxJQUFJLEVBQUUsS0FBSyxNQUFNLENBQUMsRUFDdEU7UUFDQSxPQUFPLElBQUksQ0FBQztLQUNiO0lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBTyxDQUFDO0lBRXZCLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxHQUFHLEVBQUUsRUFBRTtRQUNuQixJQUFJLElBQUksQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLEVBQUU7WUFDNUIsTUFBTSxDQUFDLEdBQUcsQ0FBQyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7U0FDckQ7SUFDSCxDQUFDLENBQUMsQ0FBQztJQUVILE9BQU8sTUFBTSxDQUFDO0FBQ2hCLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBkZWVwTWVyZ2UsIGlzT2JqZWN0IH0gZnJvbSAnLi4vLi4vY29uZmlnL3V0aWxzL2RlZXAtbWVyZ2UnO1xuXG4vKipcbiAqIE1lcmdlIG9jYyBmaWVsZHMgcGFyYW1ldGVyc1xuICpcbiAqIEBwYXJhbSBmaWVsZHMgRmllbGRzIGRlZmluaXRpb24gYXMgc3RyaW5nIG9yIG9iamVjdFxuICovXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VGaWVsZHMoZmllbGRzOiAoc3RyaW5nIHwgb2JqZWN0KVtdKTogc3RyaW5nIHtcbiAgY29uc3QgcGFyc2VkRmllbGRzID0gZmllbGRzLm1hcCgoZikgPT5cbiAgICB0eXBlb2YgZiA9PT0gJ3N0cmluZycgPyBwYXJzZUZpZWxkcyhmKSA6IGZcbiAgKTtcbiAgY29uc3QgbWVyZ2VkRmllbGRzID0gb3B0aW1pemVGaWVsZHMoZGVlcE1lcmdlKHt9LCAuLi5wYXJzZWRGaWVsZHMpKTtcbiAgcmV0dXJuIHN0cmluZ2lmeUZpZWxkcyhtZXJnZWRGaWVsZHMpO1xufVxuXG4vKipcbiAqIE9wdGltaXplIGZpZWxkcyBkZWZpbml0aW9uIGJ5IHJlbW92aW5nIG5vdCBuZWVkZWQgZ3JvdXBzXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gb3B0aW1pemVGaWVsZHMoZmllbGRzOiBvYmplY3QgPSB7fSk6IG9iamVjdCB7XG4gIGNvbnN0IGtleXMgPSBPYmplY3Qua2V5cyhmaWVsZHMpO1xuICBpZiAoa2V5cy5pbmNsdWRlcygnRlVMTCcpKSB7XG4gICAgZGVsZXRlIGZpZWxkc1snREVGQVVMVCddO1xuICAgIGRlbGV0ZSBmaWVsZHNbJ0JBU0lDJ107XG4gIH0gZWxzZSBpZiAoa2V5cy5pbmNsdWRlcygnREVGQVVMVCcpKSB7XG4gICAgZGVsZXRlIGZpZWxkc1snQkFTSUMnXTtcbiAgfVxuICBPYmplY3Qua2V5cyhmaWVsZHMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgIGZpZWxkc1trZXldID0gb3B0aW1pemVGaWVsZHMoZmllbGRzW2tleV0pO1xuICB9KTtcbiAgcmV0dXJuIGZpZWxkcztcbn1cblxuLyoqXG4gKiBQYXJzZSBzdHJpbmcgZmllbGQgZGVmaW5pdGlvbiB0byBhbiBBU1Qgb2JqZWN0XG4gKlxuICogQHBhcmFtIGZpZWxkcyBGaWVsZHMgc3RyaW5nIGRlZmluaXRpb25cbiAqIEBwYXJhbSBzdGFydEluZGV4IFVzZWQgZm9yIHJlY3VycmVuY2VcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHBhcnNlRmllbGRzKFxuICBmaWVsZHM6IHN0cmluZyxcbiAgc3RhcnRJbmRleCA9IDBcbik6IFtvYmplY3QsIG51bWJlcl0gfCBvYmplY3Qge1xuICBjb25zdCBwYXJzZWRGaWVsZHMgPSB7fTtcblxuICBsZXQgaSA9IHN0YXJ0SW5kZXg7XG4gIHdoaWxlIChpIDwgZmllbGRzLmxlbmd0aCkge1xuICAgIGlmIChmaWVsZHNbaV0gPT09ICcsJykge1xuICAgICAgaWYgKGkgPiBzdGFydEluZGV4KSB7XG4gICAgICAgIHBhcnNlZEZpZWxkc1tmaWVsZHMuc3Vic3RyKHN0YXJ0SW5kZXgsIGkgLSBzdGFydEluZGV4KV0gPSB7fTtcbiAgICAgIH1cbiAgICAgIHN0YXJ0SW5kZXggPSBpICsgMTtcbiAgICB9IGVsc2UgaWYgKGZpZWxkc1tpXSA9PT0gJygnKSB7XG4gICAgICBjb25zdCBzdWJGaWVsZHMgPSBwYXJzZUZpZWxkcyhmaWVsZHMsIGkgKyAxKTtcbiAgICAgIGlmIChBcnJheS5pc0FycmF5KHN1YkZpZWxkcykpIHtcbiAgICAgICAgcGFyc2VkRmllbGRzW2ZpZWxkcy5zdWJzdHIoc3RhcnRJbmRleCwgaSAtIHN0YXJ0SW5kZXgpXSA9IHN1YkZpZWxkc1swXTtcbiAgICAgICAgc3RhcnRJbmRleCA9IHN1YkZpZWxkc1sxXTtcbiAgICAgICAgaSA9IHN0YXJ0SW5kZXggLSAxO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHBhcnNlZEZpZWxkcztcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGZpZWxkc1tpXSA9PT0gJyknKSB7XG4gICAgICBpZiAoaSA+IHN0YXJ0SW5kZXgpIHtcbiAgICAgICAgcGFyc2VkRmllbGRzW2ZpZWxkcy5zdWJzdHIoc3RhcnRJbmRleCwgaSAtIHN0YXJ0SW5kZXgpXSA9IHt9O1xuICAgICAgfVxuICAgICAgcmV0dXJuIFtwYXJzZWRGaWVsZHMsIGkgKyAxXTtcbiAgICB9XG4gICAgaSsrO1xuICB9XG5cbiAgaWYgKHN0YXJ0SW5kZXggPCBmaWVsZHMubGVuZ3RoKSB7XG4gICAgcGFyc2VkRmllbGRzW2ZpZWxkcy5zdWJzdHIoc3RhcnRJbmRleCwgaSAtIHN0YXJ0SW5kZXgpXSA9IHt9O1xuICB9XG5cbiAgcmV0dXJuIHBhcnNlZEZpZWxkcztcbn1cblxuLyoqXG4gKiBDb252ZXJ0IEFTVCBvYmplY3QgZmllbGRzIGRlZmluaXRpb24gdG8gc3RyaW5nIHJlcHJlc2VudGF0aW9uXG4gKlxuICogQHBhcmFtIGZpZWxkc1xuICovXG5leHBvcnQgZnVuY3Rpb24gc3RyaW5naWZ5RmllbGRzKGZpZWxkczogb2JqZWN0KTogc3RyaW5nIHtcbiAgcmV0dXJuIE9iamVjdC5rZXlzKGZpZWxkcylcbiAgICAubWFwKChrZXkpID0+IHtcbiAgICAgIGNvbnN0IHN1YkZpZWxkcyA9IHN0cmluZ2lmeUZpZWxkcyhmaWVsZHNba2V5XSk7XG4gICAgICByZXR1cm4gc3ViRmllbGRzID8gYCR7a2V5fSgke3N1YkZpZWxkc30pYCA6IGtleTtcbiAgICB9KVxuICAgIC5qb2luKCcsJyk7XG59XG5cbi8qKlxuICogRXh0cmFjdCBwYXJ0IG9mIHRoZSBvYmplY3QgZGVzY3JpYmVkIGJ5IGZpZWxkcyBkZWZpbml0aW9uXG4gKlxuICogQHBhcmFtIGRhdGFcbiAqIEBwYXJhbSBmaWVsZHNcbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RGaWVsZHM8VD4oZGF0YTogVCwgZmllbGRzOiBzdHJpbmcgfCBvYmplY3QpOiBUIHtcbiAgY29uc3QgcGFyc2VkRmllbGRzID1cbiAgICB0eXBlb2YgZmllbGRzID09PSAnc3RyaW5nJyA/IHBhcnNlRmllbGRzKGZpZWxkcykgOiBmaWVsZHM7XG4gIHJldHVybiBnZXRPYmplY3RQYXJ0PFQ+KGRhdGEsIHBhcnNlZEZpZWxkcyk7XG59XG5cbmZ1bmN0aW9uIGdldE9iamVjdFBhcnQ8VD4oZGF0YTogVCwgZmllbGRzOiBvYmplY3QpOiBUIHtcbiAgaWYgKCFpc09iamVjdChkYXRhKSkge1xuICAgIHJldHVybiBkYXRhO1xuICB9XG5cbiAgY29uc3Qga2V5cyA9IE9iamVjdC5rZXlzKGZpZWxkcyk7XG5cbiAgaWYgKFxuICAgIGtleXMubGVuZ3RoID09PSAwIHx8XG4gICAgLy8gd2Ugc2hvdWxkIG5vdCBleHRyYWN0IHBhcnRzIG9mIHRoZSBvYmplY3Qgd2l0aCBhbWJpZ3VvdXMgZmllbGRzIGRlZmluaXRpb25zXG4gICAga2V5cy5maW5kKChlbCkgPT4gZWwgPT09ICdCQVNJQycgfHwgZWwgPT09ICdERUZBVUxUJyB8fCBlbCA9PT0gJ0ZVTEwnKVxuICApIHtcbiAgICByZXR1cm4gZGF0YTtcbiAgfVxuXG4gIGNvbnN0IHJlc3VsdCA9IHt9IGFzIFQ7XG5cbiAga2V5cy5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBpZiAoZGF0YS5oYXNPd25Qcm9wZXJ0eShrZXkpKSB7XG4gICAgICByZXN1bHRba2V5XSA9IGdldE9iamVjdFBhcnQoZGF0YVtrZXldLCBmaWVsZHNba2V5XSk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gcmVzdWx0O1xufVxuIl19