UNPKG

ichigoo

Version:

Static site generator with React and GraphQL

88 lines (78 loc) 3.2 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _getFieldsFromEntities = _interopRequireDefault(require("../../introspection/getFieldsFromEntities")); var _nameConverter = require("../../nameConverter"); var _relationships = require("../../relationships"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } /** * Add resolvers for relationship fields * * @example * Consider this data: * * { * posts: [ * { id: 1, title: 'Hello, world', user_id: 123 } * ], * users: [ * { id: 123, name: 'John Doe' } * ] * comments: [ * { id: 4646, post_id: 1, body: 'Nice post!' } * ] * } * * There are two relationship fields here, posts.user_id and comments.post_id. * The generated GraphQL schema for posts is: * * type Post { * id: ID! * title: String * user_id: ID * User: User * Comments: [Comment] * } * * When called for the posts entity, this method generates resolvers * for Post.User and Post.Comments * * @param {String} entityName The entity key in the data map, e.g. "posts" * @param {Object} data The entire data map, e.g. { posts: [], users: [] } * * @return {Object} resolvers, e.g. * * { * Post: { * User: (post) => users.find(user => user.id == post.user_id), * Comments: (post) => comments.filter(comment => comment.post_id = post.id), * }, * } */ var _default = function _default(entityName, data) { var entityFields = Object.keys((0, _getFieldsFromEntities["default"])(data[entityName])); var manyToOneResolvers = entityFields.filter(_relationships.isRelationshipField).reduce(function (resolvers, fieldName) { return Object.assign({}, resolvers, _defineProperty({}, (0, _nameConverter.getRelatedType)(fieldName), function (entity) { return data[(0, _nameConverter.getRelatedKey)(fieldName)].find(function (relatedRecord) { return relatedRecord.id == entity[fieldName]; }); })); }, {}); var relatedField = (0, _nameConverter.getReverseRelatedField)(entityName); // 'posts' => 'post_id' var hasReverseRelationship = function hasReverseRelationship(entityName) { return (0, _getFieldsFromEntities["default"])(data[entityName]).hasOwnProperty(relatedField); }; var entities = Object.keys(data); var oneToManyResolvers = entities.filter(hasReverseRelationship).reduce(function (resolvers, entityName) { return Object.assign({}, resolvers, _defineProperty({}, (0, _nameConverter.getRelationshipFromKey)(entityName), function (entity) { return data[entityName].filter(function (record) { return record[relatedField] == entity.id; }); })); }, {}); return Object.assign({}, manyToOneResolvers, oneToManyResolvers); }; exports["default"] = _default;