canner
Version:
Build CMS in few lines of code for different data sources
331 lines (281 loc) • 10.4 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.fieldToQueriesObject = fieldToQueriesObject;
exports.genQuery = genQuery;
exports.schemaToQueriesObject = schemaToQueriesObject;
exports.objectToQueries = objectToQueries;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _objectSpread3 = _interopRequireDefault(require("@babel/runtime/helpers/objectSpread"));
var _pluralize = _interopRequireDefault(require("pluralize"));
var _lowerFirst = _interopRequireDefault(require("lodash/lowerFirst"));
var _upperFirst = _interopRequireDefault(require("lodash/upperFirst"));
var _lodash = require("lodash");
var _utils = require("./schema/utils");
var _types = require("./schema/types");
var DEFAULT_FIRST = 10;
var MAX = undefined;
function fieldToQueriesObject(field) {
var queriesObj = {};
var variables = {};
var variableTypes = {};
var type = field.getType();
switch (type) {
case _types.types.OBJECT:
{
field.forEach(function (childField) {
var qlo = fieldToQueriesObject(childField);
(0, _lodash.set)(queriesObj, ['fields', childField.getKey()], qlo.queriesObj);
});
break;
}
case _types.types.ARRAY:
{
field.forEach(function (childField) {
var qlo = fieldToQueriesObject(childField);
(0, _lodash.set)(queriesObj, ['fields', childField.getKey()], qlo.queriesObj);
(0, _lodash.merge)(variables, qlo.variables);
(0, _lodash.merge)(variableTypes, qlo.variableTypes);
});
if (field.isEntity) {
var _objectSpread2;
var _genQuery = genQuery(field),
args = _genQuery.args,
firstKey = _genQuery.firstKey,
afterKey = _genQuery.afterKey,
lastKey = _genQuery.lastKey,
beforeKey = _genQuery.beforeKey,
whereKey = _genQuery.whereKey,
orderByKey = _genQuery.orderByKey;
queriesObj.declareArgs = (0, _objectSpread3.default)({}, variableTypes, (_objectSpread2 = {}, (0, _defineProperty2.default)(_objectSpread2, firstKey, 'Int'), (0, _defineProperty2.default)(_objectSpread2, afterKey, 'String'), (0, _defineProperty2.default)(_objectSpread2, lastKey, 'Int'), (0, _defineProperty2.default)(_objectSpread2, beforeKey, 'String'), (0, _defineProperty2.default)(_objectSpread2, whereKey, "".concat(typeKey(field.getKey()), "WhereInput")), (0, _defineProperty2.default)(_objectSpread2, orderByKey, "".concat(typeKey(field.getKey()), "OrderByInput")), _objectSpread2));
queriesObj.connection = true;
queriesObj.args = args;
queriesObj.isPlural = true;
queriesObj.alias = field.getKey();
(0, _lodash.set)(queriesObj, ['fields', 'id'], null);
variables[firstKey] = MAX;
variables[whereKey] = {};
var toolbar = field.getAttr('toolbar');
var asyncToolbar = toolbar && toolbar.async;
var defaultSortField = toolbar && toolbar.sorter && toolbar.sorter.defaultField;
var permanentFilter = toolbar && toolbar.filter && toolbar.filter.permanentFilter;
var defaultFilter = toolbar && toolbar.filter && toolbar.filter.defaultFilter;
if (asyncToolbar) {
variables[firstKey] = DEFAULT_FIRST;
if (permanentFilter) {
variables[whereKey] = permanentFilter;
}
if (defaultFilter) {
variables[whereKey] = defaultFilter;
}
if (defaultSortField) {
var _field = (toolbar.sorter.options || []).find(function (option) {
return option.field === defaultSortField;
});
var defaultOrder = _field && _field.defaultOrder ? _field.defaultOrder.toUpperCase() : 'ASC';
variables[orderByKey] = "".concat(defaultSortField, "_").concat(defaultOrder);
}
}
}
break;
}
case _types.types.RELATION:
{
(0, _lodash.set)(queriesObj, ['fields', 'id'], null);
var relationFields = field.getRelationFields();
field.forEach(function (childField) {
if (relationFields.includes(childField.getKey()) || relationFields.length === 0 && childField.getType() !== _types.types.RELATION) {
var qlo = fieldToQueriesObject(childField);
(0, _lodash.set)(queriesObj, ['fields', childField.getKey()], qlo.queriesObj);
(0, _lodash.merge)(variables, qlo.variables);
(0, _lodash.merge)(variableTypes, qlo.variableTypes);
}
}); // for now, fetch all toMany data
// if (field.isToMany()) {
// const {args, firstKey, afterKey, lastKey, beforeKey, whereKey, orderByKey} = genQuery();
// queriesObj.args = args;
// queriesObj.isPlural = true;
// variables[firstKey] = defaultFirst;
// variableTypes = {
// ...variableTypes,
// [firstKey]: 'Int',
// [afterKey]: 'String',
// [lastKey]: 'Int',
// [beforeKey]: 'String',
// [whereKey]: `${typeKey(field.relationTo())}WhereUniqueInput`,
// [orderByKey]: `${typeKey(field.relationTo())}WhereUniqueInput`
// }
// }
break;
}
case _types.types.DATETIME:
case _types.types.FILE:
case _types.types.GEOPOINT:
case _types.types.IMAGE:
{
field.forEach(function (childField) {
var qlo = fieldToQueriesObject(childField);
(0, _lodash.set)(queriesObj, ['fields', childField.getKey()], qlo.queriesObj);
});
break;
}
case _types.types.COMPONENT:
queriesObj = undefined;
break;
case _types.types.BOOLEAN:
case _types.types.NUMBER:
case _types.types.INT:
case _types.types.ID:
case _types.types.STRING:
case _types.types.JSON:
default:
queriesObj = null;
break;
}
return {
queriesObj: queriesObj,
variables: variables,
variableTypes: variableTypes
};
}
function genQuery(field) {
var key = field.getKey();
var firstKey = "$".concat(key, "First");
var afterKey = "$".concat(key, "After");
var lastKey = "$".concat(key, "Last");
var beforeKey = "$".concat(key, "Before");
var whereKey = "$".concat(key, "Where");
var orderByKey = "$".concat(key, "OrderBy");
var args = {
first: firstKey,
after: afterKey,
last: lastKey,
before: beforeKey,
where: whereKey,
orderBy: orderByKey
};
return {
args: args,
firstKey: firstKey,
afterKey: afterKey,
lastKey: lastKey,
beforeKey: beforeKey,
whereKey: whereKey,
orderByKey: orderByKey
};
}
function schemaToQueriesObject(schema) {
var rootFields = (0, _utils.createSchema)(schema);
var rootVariables = {};
var rootVariableTypes = {};
var queriesObj = (0, _lodash.mapValues)(rootFields, function (v, key) {
var _fieldToQueriesObject = fieldToQueriesObject(v),
variables = _fieldToQueriesObject.variables,
queriesObj = _fieldToQueriesObject.queriesObj,
variableTypes = _fieldToQueriesObject.variableTypes;
(0, _lodash.merge)(rootVariables, variables);
rootVariableTypes[key] = variableTypes;
return queriesObj;
});
return {
queriesObj: queriesObj,
variables: rootVariables
};
}
function objectToQueries(o) {
var close = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
var variables = arguments.length > 2 ? arguments[2] : undefined;
var result = Object.keys(o).map(function (key) {
var query = "".concat(key);
var element = o[key];
if (element === null) {
return "".concat(query);
} else if (!element) {
return '';
}
if (element.declareArgs) {
var originElement = (0, _objectSpread3.default)({}, element);
var args = originElement.declareArgs;
delete originElement.declareArgs;
query = 'query';
element = {
args: args,
fields: (0, _defineProperty2.default)({}, key, originElement)
};
key = 'query';
}
if (element.isPlural) {
query = _pluralize.default.plural((0, _lowerFirst.default)(query));
}
if (element.connection) {
query = "".concat(query, "Connection");
}
if (element.alias) {
query = "".concat(element.alias, ": ").concat(query);
}
if (element.args) {
if (key === 'query') {
var _args = genDeclareArgs(element.args, variables);
query = _args ? "".concat(query, "(").concat(_args, ")") : "".concat(query);
} else {
var _args2 = genArgs(element.args, variables);
query = _args2 ? "".concat(query, "(").concat(_args2, ")") : "".concat(query);
}
}
if (element.fields) {
var _element = element,
fields = _element.fields;
if (element.connection) {
fields = {
edges: {
fields: {
cursor: null,
node: {
fields: fields
}
}
},
pageInfo: {
fields: {
hasNextPage: null,
hasPreviousPage: null,
startCursor: null,
endCursor: null
}
}
};
}
fields = objectToQueries(fields, true, variables);
query = "".concat(query).concat(fields);
}
return "".concat(query);
}).join(' ');
return close ? "{".concat(result, "}") : result;
}
function genArgs(args, variables) {
return Object.keys(args).filter(function (key) {
if (variables && variables[args[key].substr(1)] === undefined) {
return false;
}
return true;
}).map(function (key) {
var argValue = args[key];
return "".concat(key, ": ").concat(argValue);
}).join(',');
}
function genDeclareArgs(args, variables) {
return Object.keys(args).filter(function (key) {
if (variables && variables[key.substr(1)] === undefined) {
return false;
}
return true;
}).map(function (key) {
var argValue = args[key];
return "".concat(key, ": ").concat(argValue);
}).join(',');
}
function typeKey(key) {
return (0, _upperFirst.default)(_pluralize.default.singular(key));
}