UNPKG

graphql-compose

Version:

GraphQL schema builder from different data sources with middleware extensions.

390 lines (334 loc) 11.8 kB
'use strict'; var _keys = require('babel-runtime/core-js/object/keys'); var _keys2 = _interopRequireDefault(_keys); var _defineProperty2 = require('babel-runtime/core-js/object/define-property'); var _defineProperty3 = _interopRequireDefault(_defineProperty2); var _assign = require('babel-runtime/core-js/object/assign'); var _assign2 = _interopRequireDefault(_assign); Object.defineProperty(exports, "__esModule", { value: true }); var _extends = _assign2.default || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; (0, _defineProperty3.default)(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _graphql = require('graphql'); var _misc = require('./utils/misc'); var _debug = require('./utils/debug'); var _is = require('./utils/is'); var _configAsThunk = require('./utils/configAsThunk'); var _typeMapper = require('./typeMapper'); var _typeMapper2 = _interopRequireDefault(_typeMapper); var _typeByPath = require('./typeByPath'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _defineProperty(obj, key, value) { if (key in obj) { (0, _defineProperty3.default)(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } var InputTypeComposer = function () { _createClass(InputTypeComposer, null, [{ key: 'create', value: function create(opts) { var ITC = void 0; if ((0, _is.isString)(opts)) { // $FlowFixMe var typeName = opts; var NAME_RX = /^[_a-zA-Z][_a-zA-Z0-9]*$/; if (NAME_RX.test(typeName)) { ITC = new InputTypeComposer(new _graphql.GraphQLInputObjectType({ name: typeName, fields: function fields() { return {}; } })); } else { var type = _typeMapper2.default.createType(typeName); if (!(type instanceof _graphql.GraphQLInputObjectType)) { throw new Error('You should provide correct GraphQLInputObjectType type definition.'); } ITC = new InputTypeComposer(type); } } else if (opts instanceof _graphql.GraphQLInputObjectType) { ITC = new InputTypeComposer(opts); } else if ((0, _is.isObject)(opts)) { // $FlowFixMe var _type = new _graphql.GraphQLInputObjectType(_extends({}, opts, { fields: function fields() { return {}; } })); ITC = new InputTypeComposer(_type); // $FlowFixMe if ((0, _is.isObject)(opts.fields)) { // $FlowFixMe ITC.addFields(opts.fields); } } else { throw new Error('You should provide InputObjectConfig or string with type name to InputTypeComposer.create(opts)'); } return ITC; } }]); function InputTypeComposer(gqType) { _classCallCheck(this, InputTypeComposer); if (!(gqType instanceof _graphql.GraphQLInputObjectType)) { throw new Error('InputTypeComposer accept only GraphQLInputObjectType in constructor'); } this.gqType = gqType; } /** * Get fields from a GraphQL type * WARNING: this method read an internal GraphQL instance variable. */ _createClass(InputTypeComposer, [{ key: 'getFields', value: function getFields() { var fields = this.gqType._typeConfig.fields; // $FlowFixMe var fieldMap = (0, _configAsThunk.keepConfigsAsThunk)((0, _misc.resolveMaybeThunk)(fields)); if ((0, _is.isObject)(fieldMap)) { // $FlowFixMe return (0, _assign2.default)({}, fieldMap); } return {}; } }, { key: 'getFieldNames', value: function getFieldNames() { return (0, _keys2.default)(this.getFields()); } }, { key: 'hasField', value: function hasField(fieldName) { var fields = this.getFields(); return !!fields[fieldName]; } /** * Completely replace all fields in GraphQL type * WARNING: this method rewrite an internal GraphQL instance variable. */ }, { key: 'setFields', value: function setFields(fields) { var _this = this; var prepearedFields = _typeMapper2.default.convertInputFieldConfigMap(fields, this.getTypeName()); this.gqType._typeConfig.fields = function () { return (0, _configAsThunk.resolveInputConfigsAsThunk)(prepearedFields, _this.getTypeName()); }; delete this.gqType._fields; // if schema was builded, delete defineFieldMap return this; } }, { key: 'setField', value: function setField(fieldName, fieldConfig) { this.addFields(_defineProperty({}, fieldName, fieldConfig)); return this; } /** * @deprecated 2.0.0 */ }, { key: 'addField', value: function addField(fieldName, fieldConfig) { (0, _debug.deprecate)('Use InputTypeComposer.setField() or plural addFields({}) instead.'); this.addFields(_defineProperty({}, fieldName, fieldConfig)); } /** * Add new fields or replace existed in a GraphQL type */ }, { key: 'addFields', value: function addFields(newFields) { this.setFields((0, _assign2.default)({}, this.getFields(), newFields)); return this; } /** * Get fieldConfig by name */ }, { key: 'getField', value: function getField(fieldName) { var fields = this.getFields(); if (fields[fieldName]) { return fields[fieldName]; } return undefined; } }, { key: 'removeField', value: function removeField(fieldNameOrArray) { var fieldNames = Array.isArray(fieldNameOrArray) ? fieldNameOrArray : [fieldNameOrArray]; var fields = this.getFields(); fieldNames.forEach(function (fieldName) { return delete fields[fieldName]; }); this.setFields(fields); return this; } }, { key: 'removeOtherFields', value: function removeOtherFields(fieldNameOrArray) { var keepFieldNames = Array.isArray(fieldNameOrArray) ? fieldNameOrArray : [fieldNameOrArray]; var fields = this.getFields(); (0, _keys2.default)(fields).forEach(function (fieldName) { if (!keepFieldNames.includes(fieldName)) { delete fields[fieldName]; } }); this.setFields(fields); return this; } }, { key: 'extendField', value: function extendField(name, parialFieldConfig) { var fieldConfig = (0, _assign2.default)({}, this.getField(name), parialFieldConfig); this.setField(name, fieldConfig); return this; } }, { key: 'reorderFields', value: function reorderFields(names) { var orderedFields = {}; var fields = this.getFields(); names.forEach(function (name) { if (fields[name]) { orderedFields[name] = fields[name]; delete fields[name]; } }); this.setFields(_extends({}, orderedFields, fields)); return this; } }, { key: 'isRequired', value: function isRequired(fieldName) { return this.getFieldType(fieldName) instanceof _graphql.GraphQLNonNull; } }, { key: 'getFieldType', value: function getFieldType(fieldName) { var field = this.getField(fieldName); if (field) { return field.type; } return undefined; } /** * @deprecated 2.0.0 */ }, { key: 'isFieldRequired', value: function isFieldRequired(fieldName) { (0, _debug.deprecate)('Use InputTypeComposer.isRequired() instead.'); return this.isRequired(fieldName); } }, { key: 'makeRequired', value: function makeRequired(fieldNameOrArray) { var fieldNames = Array.isArray(fieldNameOrArray) ? fieldNameOrArray : [fieldNameOrArray]; var fields = this.getFields(); fieldNames.forEach(function (fieldName) { if (fields[fieldName] && fields[fieldName].type) { if (!(fields[fieldName].type instanceof _graphql.GraphQLNonNull)) { fields[fieldName].type = new _graphql.GraphQLNonNull(fields[fieldName].type); } } }); this.setFields(fields); return this; } /** * @deprecated 2.0.0 */ }, { key: 'makeFieldsRequired', value: function makeFieldsRequired(fieldNameOrArray) { (0, _debug.deprecate)('Use InputTypeComposer.makeRequired() instead.'); this.makeRequired(fieldNameOrArray); } }, { key: 'makeOptional', value: function makeOptional(fieldNameOrArray) { var fieldNames = Array.isArray(fieldNameOrArray) ? fieldNameOrArray : [fieldNameOrArray]; var fields = this.getFields(); fieldNames.forEach(function (fieldName) { if (fieldNames.includes(fieldName)) { if (fields[fieldName].type instanceof _graphql.GraphQLNonNull) { fields[fieldName].type = fields[fieldName].type.ofType; } } }); this.setFields(fields); return this; } /** * @deprecated 2.0.0 */ }, { key: 'makeFieldsOptional', value: function makeFieldsOptional(fieldNameOrArray) { (0, _debug.deprecate)('Use InputTypeComposer.makeOptional() instead.'); this.makeOptional(fieldNameOrArray); } }, { key: 'clone', value: function clone(newTypeName) { if (!newTypeName) { throw new Error('You should provide new type name for clone() method'); } var fields = this.getFields(); var newFields = {}; (0, _keys2.default)(fields).forEach(function (fieldName) { newFields[fieldName] = (0, _assign2.default)({}, fields[fieldName]); }); return new InputTypeComposer(new _graphql.GraphQLInputObjectType({ name: newTypeName, fields: newFields })); } }, { key: 'getType', value: function getType() { return this.gqType; } }, { key: 'getTypeAsRequired', value: function getTypeAsRequired() { return new _graphql.GraphQLNonNull(this.gqType); } }, { key: 'getTypeName', value: function getTypeName() { return this.gqType.name; } }, { key: 'setTypeName', value: function setTypeName(name) { this.gqType.name = name; return this; } }, { key: 'getDescription', value: function getDescription() { return this.gqType.description || ''; } }, { key: 'setDescription', value: function setDescription(description) { this.gqType.description = description; return this; } /** * @deprecated 2.0.0 */ }, { key: 'getByPath', value: function getByPath(path) { (0, _debug.deprecate)('Use InputTypeComposer.get() instead.'); return this.get(path); } }, { key: 'get', value: function get(path) { return (0, _typeByPath.typeByPath)(this, path); } }]); return InputTypeComposer; }(); exports.default = InputTypeComposer;