UNPKG

canner

Version:

Build CMS in few lines of code for different data sources

143 lines (137 loc) 3.5 kB
// @flow import {mapValues, get, isPlainObject, isArray} from 'lodash'; export function getValue(value: any, idPathArr: Array<string>) { return idPathArr.reduce((result: any, key: string) => { if (isPlainObject(result)) { if ('edges' in result && 'pageInfo' in result) { return get(result, ['edges', key, 'node']); } return get(result, key); } else if (isArray(result)) { return get(result, key); } else { return result; } }, value); } export function parseConnectionToNormal(value: any) { if (isPlainObject(value)) { if (value.edges) { return value.edges.map(edge => parseConnectionToNormal(edge.node)); } return mapValues(value, item => parseConnectionToNormal(item)); } else if (isArray(value)) { return value.map(item => parseConnectionToNormal(item)) } else { return value; } } export function defaultValue(type: string, relation: any, nullable?: boolean) { 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; } } } export function paginate(rootValue: Object, field: string, currentPage: number, pageSize: number = 10) { const copyValue = JSON.parse(JSON.stringify(rootValue)); const index = (currentPage - 1) * pageSize; copyValue[field].edges = copyValue[field].edges.slice(index, index + pageSize); return copyValue; } export function filterByWhere(rootValue: Object, field: string, where: Object) { const copyValue = JSON.parse(JSON.stringify(rootValue)); copyValue[field].edges = copyValue[field].edges.filter(edge => { return Object.keys(where).reduce((result, key) => { const condition = where[key]; const data = edge.node[key]; return result && passCondition(data , condition); }, true); }); return copyValue; } export function passCondition(data: any, condition: Object) { return Object.keys(condition).reduce((result, conditionKey) => { let isPass = true; const 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); }