canner
Version:
Build CMS in few lines of code for different data sources
190 lines (163 loc) • 4.06 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getValue = getValue;
exports.parseConnectionToNormal = parseConnectionToNormal;
exports.defaultValue = defaultValue;
exports.paginate = paginate;
exports.filterByWhere = filterByWhere;
exports.passCondition = passCondition;
var _lodash = require("lodash");
function getValue(value, idPathArr) {
return idPathArr.reduce(function (result, key) {
if ((0, _lodash.isPlainObject)(result)) {
if ('edges' in result && 'pageInfo' in result) {
return (0, _lodash.get)(result, ['edges', key, 'node']);
}
return (0, _lodash.get)(result, key);
} else if ((0, _lodash.isArray)(result)) {
return (0, _lodash.get)(result, key);
} else {
return result;
}
}, value);
}
function parseConnectionToNormal(value) {
if ((0, _lodash.isPlainObject)(value)) {
if (value.edges) {
return value.edges.map(function (edge) {
return parseConnectionToNormal(edge.node);
});
}
return (0, _lodash.mapValues)(value, function (item) {
return parseConnectionToNormal(item);
});
} else if ((0, _lodash.isArray)(value)) {
return value.map(function (item) {
return parseConnectionToNormal(item);
});
} else {
return value;
}
}
function defaultValue(type, relation, nullable) {
if (nullable) {
return null;
}
switch (type) {
case 'connection':
{
return {
edges: [],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false
}
};
}
case 'array':
{
return [];
}
case 'object':
{
return {};
}
case 'boolean':
{
return false;
}
case 'number':
{
return 0;
}
case 'string':
{
return '';
}
case 'relation':
{
if (relation.type === 'toMany') {
return {
edges: [],
pageInfo: {
hasNextPage: false,
hasPreviousPage: false
}
};
} else {
return null;
}
}
case 'image':
case 'file':
{
return {
url: '',
contentType: '',
name: '',
size: 0,
__typename: null
};
}
case 'geoPoint':
{
return {
placeId: '',
address: '',
lat: 122,
lng: 23
};
}
default:
{
return null;
}
}
}
function paginate(rootValue, field, currentPage) {
var pageSize = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 10;
var copyValue = JSON.parse(JSON.stringify(rootValue));
var index = (currentPage - 1) * pageSize;
copyValue[field].edges = copyValue[field].edges.slice(index, index + pageSize);
return copyValue;
}
function filterByWhere(rootValue, field, where) {
var copyValue = JSON.parse(JSON.stringify(rootValue));
copyValue[field].edges = copyValue[field].edges.filter(function (edge) {
return Object.keys(where).reduce(function (result, key) {
var condition = where[key];
var data = edge.node[key];
return result && passCondition(data, condition);
}, true);
});
return copyValue;
}
function passCondition(data, condition) {
return Object.keys(condition).reduce(function (result, conditionKey) {
var isPass = true;
var conditionValue = condition[conditionKey];
switch (conditionKey) {
case 'contains':
isPass = data.indexOf(conditionValue) !== -1;
break;
case 'eq':
isPass = data === conditionValue;
break;
case 'gt':
isPass = data > conditionValue;
break;
case 'gte':
isPass = data >= conditionValue;
break;
case 'lt':
isPass = data < conditionValue;
break;
case 'lte':
isPass = data <= conditionValue;
break;
}
return result && isPass;
}, true);
}