UNPKG

graphql-compose-mongoose

Version:

Plugin for `graphql-compose` which derive a graphql types from a mongoose model.

565 lines (482 loc) 17.7 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.DiscriminatorTypeComposer = void 0; var _graphqlCompose = require("graphql-compose"); var _composeWithMongoose = require("../composeWithMongoose"); var _composeChildTC = require("./composeChildTC"); var _mergeCustomizationOptions = require("./utils/mergeCustomizationOptions"); var _prepareBaseResolvers = require("./prepareBaseResolvers"); var _reorderFields = require("./utils/reorderFields"); function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } 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; } // sets the values on DKey enum TC function setDKeyETCValues(discriminators) { const values = {}; for (const DName in discriminators) { if (discriminators.hasOwnProperty(DName)) { values[DName] = { value: DName }; } } return values; } // creates an enum from discriminator names // then sets this enum type as the discriminator key field type function createAndSetDKeyETC(dTC, discriminators) { const DKeyETC = _graphqlCompose.EnumTypeComposer.create({ name: `EnumDKey${dTC.getTypeName()}${dTC.getDKey()[0].toUpperCase() + dTC.getDKey().substr(1)}`, values: setDKeyETCValues(discriminators) }); // set on Output dTC.extendField(dTC.getDKey(), { type: () => DKeyETC }); // set on Input dTC.getInputTypeComposer().extendField(dTC.getDKey(), { type: () => DKeyETC }); return DKeyETC; } class DiscriminatorTypeComposer extends _graphqlCompose.TypeComposerClass { static _getClassConnectedWithSchemaComposer(sc) { class _DiscriminatorTypeComposer extends DiscriminatorTypeComposer {} _defineProperty(_DiscriminatorTypeComposer, "schemaComposer", sc || _graphqlCompose.schemaComposer); return _DiscriminatorTypeComposer; } /* :: constructor(gqType: any): DiscriminatorTypeComposer<TContext> { super(gqType); return this; } */ static createFromModel(baseModel, opts) { if (!baseModel || !baseModel.discriminators) { throw Error('Discriminator Key not Set, Use composeWithMongoose for Normal Collections'); } // eslint-disable-next-line opts = _objectSpread({ reorderFields: true, schemaComposer: _graphqlCompose.schemaComposer }, opts); const baseTC = (0, _composeWithMongoose.composeWithMongoose)(baseModel, opts); const _DiscriminatorTypeComposer = this._getClassConnectedWithSchemaComposer(opts.schemaComposer); const baseDTC = new _DiscriminatorTypeComposer(baseTC.getType()); baseDTC.opts = opts; baseDTC.childTCs = []; baseDTC.discriminatorKey = baseModel.schema.get('discriminatorKey') || '__t'; // discriminators an object containing all discriminators with key being DNames baseDTC.DKeyETC = createAndSetDKeyETC(baseDTC, baseModel.discriminators); (0, _reorderFields.reorderFields)(baseDTC, baseDTC.opts.reorderFields, baseDTC.discriminatorKey); baseDTC.DInterface = baseDTC._createDInterface(baseDTC); baseDTC.setInterfaces([baseDTC.DInterface]); baseDTC.schemaComposer.addSchemaMustHaveType(baseDTC); // prepare Base Resolvers (0, _prepareBaseResolvers.prepareBaseResolvers)(baseDTC); return baseDTC; } _createDInterface(baseTC) { return this.schemaComposer.InterfaceTypeComposer.create({ name: `${baseTC.getTypeName()}Interface`, resolveType: value => { const childDName = value[baseTC.getDKey()]; if (childDName) { return baseTC.schemaComposer.getTC(childDName).getType(); } // as fallback return BaseModelTC return baseTC.schemaComposer.getTC(baseTC.getTypeName()).getType(); }, fields: () => { const baseFields = baseTC.getFieldNames(); const interfaceFields = {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = baseFields[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { const field = _step.value; interfaceFields[field] = baseTC.getFieldConfig(field); } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return != null) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } return interfaceFields; } }); } getDKey() { return this.discriminatorKey; } getDKeyETC() { return this.DKeyETC; } getDInterface() { return this.DInterface; } hasChildTC(DName) { return !!this.childTCs.find(ch => ch.getTypeName() === DName); } setFields(fields) { const oldFieldNames = super.getFieldNames(); super.setFields(fields); var _iteratorNormalCompletion2 = true; var _didIteratorError2 = false; var _iteratorError2 = undefined; try { for (var _iterator2 = this.childTCs[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) { const childTC = _step2.value; childTC.removeField(oldFieldNames); childTC.addFields(fields); (0, _reorderFields.reorderFields)(childTC, this.opts.reorderFields, this.getDKey(), super.getFieldNames()); } } catch (err) { _didIteratorError2 = true; _iteratorError2 = err; } finally { try { if (!_iteratorNormalCompletion2 && _iterator2.return != null) { _iterator2.return(); } } finally { if (_didIteratorError2) { throw _iteratorError2; } } } return this; } setField(fieldName, fieldConfig) { super.setField(fieldName, fieldConfig); var _iteratorNormalCompletion3 = true; var _didIteratorError3 = false; var _iteratorError3 = undefined; try { for (var _iterator3 = this.childTCs[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) { const childTC = _step3.value; childTC.setField(fieldName, fieldConfig); } } catch (err) { _didIteratorError3 = true; _iteratorError3 = err; } finally { try { if (!_iteratorNormalCompletion3 && _iterator3.return != null) { _iterator3.return(); } } finally { if (_didIteratorError3) { throw _iteratorError3; } } } return this; } // discriminators must have all interface fields addFields(newFields) { super.addFields(newFields); var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; try { for (var _iterator4 = this.childTCs[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { const childTC = _step4.value; childTC.addFields(newFields); } } catch (err) { _didIteratorError4 = true; _iteratorError4 = err; } finally { try { if (!_iteratorNormalCompletion4 && _iterator4.return != null) { _iterator4.return(); } } finally { if (_didIteratorError4) { throw _iteratorError4; } } } return this; } addNestedFields(newFields) { super.addNestedFields(newFields); var _iteratorNormalCompletion5 = true; var _didIteratorError5 = false; var _iteratorError5 = undefined; try { for (var _iterator5 = this.childTCs[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { const childTC = _step5.value; childTC.addNestedFields(newFields); } } catch (err) { _didIteratorError5 = true; _iteratorError5 = err; } finally { try { if (!_iteratorNormalCompletion5 && _iterator5.return != null) { _iterator5.return(); } } finally { if (_didIteratorError5) { throw _iteratorError5; } } } return this; } removeField(fieldNameOrArray) { super.removeField(fieldNameOrArray); var _iteratorNormalCompletion6 = true; var _didIteratorError6 = false; var _iteratorError6 = undefined; try { for (var _iterator6 = this.childTCs[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { const childTC = _step6.value; childTC.removeField(fieldNameOrArray); } } catch (err) { _didIteratorError6 = true; _iteratorError6 = err; } finally { try { if (!_iteratorNormalCompletion6 && _iterator6.return != null) { _iterator6.return(); } } finally { if (_didIteratorError6) { throw _iteratorError6; } } } return this; } removeOtherFields(fieldNameOrArray) { const oldFieldNames = super.getFieldNames(); super.removeOtherFields(fieldNameOrArray); var _iteratorNormalCompletion7 = true; var _didIteratorError7 = false; var _iteratorError7 = undefined; try { for (var _iterator7 = this.childTCs[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { const childTC = _step7.value; const specificFields = childTC.getFieldNames().filter(childFieldName => !oldFieldNames.find(oldBaseFieldName => oldBaseFieldName === childFieldName)); childTC.removeOtherFields(super.getFieldNames().concat(specificFields)); (0, _reorderFields.reorderFields)(childTC, this.opts.reorderFields, this.getDKey(), super.getFieldNames()); } } catch (err) { _didIteratorError7 = true; _iteratorError7 = err; } finally { try { if (!_iteratorNormalCompletion7 && _iterator7.return != null) { _iterator7.return(); } } finally { if (_didIteratorError7) { throw _iteratorError7; } } } return this; } extendField(fieldName, partialFieldConfig) { super.extendField(fieldName, partialFieldConfig); var _iteratorNormalCompletion8 = true; var _didIteratorError8 = false; var _iteratorError8 = undefined; try { for (var _iterator8 = this.childTCs[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { const childTC = _step8.value; childTC.extendField(fieldName, partialFieldConfig); } } catch (err) { _didIteratorError8 = true; _iteratorError8 = err; } finally { try { if (!_iteratorNormalCompletion8 && _iterator8.return != null) { _iterator8.return(); } } finally { if (_didIteratorError8) { throw _iteratorError8; } } } return this; } reorderFields(names) { super.reorderFields(names); var _iteratorNormalCompletion9 = true; var _didIteratorError9 = false; var _iteratorError9 = undefined; try { for (var _iterator9 = this.childTCs[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { const childTC = _step9.value; childTC.reorderFields(names); } } catch (err) { _didIteratorError9 = true; _iteratorError9 = err; } finally { try { if (!_iteratorNormalCompletion9 && _iterator9.return != null) { _iterator9.return(); } } finally { if (_didIteratorError9) { throw _iteratorError9; } } } return this; } makeFieldNonNull(fieldNameOrArray) { super.makeFieldNonNull(fieldNameOrArray); var _iteratorNormalCompletion10 = true; var _didIteratorError10 = false; var _iteratorError10 = undefined; try { for (var _iterator10 = this.childTCs[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { const childTC = _step10.value; childTC.makeFieldNonNull(fieldNameOrArray); } } catch (err) { _didIteratorError10 = true; _iteratorError10 = err; } finally { try { if (!_iteratorNormalCompletion10 && _iterator10.return != null) { _iterator10.return(); } } finally { if (_didIteratorError10) { throw _iteratorError10; } } } return this; } makeFieldNullable(fieldNameOrArray) { super.makeFieldNullable(fieldNameOrArray); var _iteratorNormalCompletion11 = true; var _didIteratorError11 = false; var _iteratorError11 = undefined; try { for (var _iterator11 = this.childTCs[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { const childTC = _step11.value; childTC.makeFieldNullable(fieldNameOrArray); } } catch (err) { _didIteratorError11 = true; _iteratorError11 = err; } finally { try { if (!_iteratorNormalCompletion11 && _iterator11.return != null) { _iterator11.return(); } } finally { if (_didIteratorError11) { throw _iteratorError11; } } } return this; } deprecateFields(fields) { super.deprecateFields(fields); var _iteratorNormalCompletion12 = true; var _didIteratorError12 = false; var _iteratorError12 = undefined; try { for (var _iterator12 = this.childTCs[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) { const childTC = _step12.value; childTC.deprecateFields(fields); } } catch (err) { _didIteratorError12 = true; _iteratorError12 = err; } finally { try { if (!_iteratorNormalCompletion12 && _iterator12.return != null) { _iterator12.return(); } } finally { if (_didIteratorError12) { throw _iteratorError12; } } } return this; } // relations with args are a bit hard to manage as interfaces i believe as of now do not // support field args. Well if one wants to have use args, you setType for resolver as this // this = this DiscriminantTypeComposer // NOTE, those relations will be propagated to the childTypeComposers and you can use normally. addRelation(fieldName, relationOpts) { super.addRelation(fieldName, relationOpts); var _iteratorNormalCompletion13 = true; var _didIteratorError13 = false; var _iteratorError13 = undefined; try { for (var _iterator13 = this.childTCs[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { const childTC = _step13.value; childTC.addRelation(fieldName, relationOpts); } } catch (err) { _didIteratorError13 = true; _iteratorError13 = err; } finally { try { if (!_iteratorNormalCompletion13 && _iterator13.return != null) { _iterator13.return(); } } finally { if (_didIteratorError13) { throw _iteratorError13; } } } return this; } setRecordIdFn(fn) { super.setRecordIdFn(fn); var _iteratorNormalCompletion14 = true; var _didIteratorError14 = false; var _iteratorError14 = undefined; try { for (var _iterator14 = this.childTCs[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) { const childTC = _step14.value; childTC.setRecordIdFn(fn); } } catch (err) { _didIteratorError14 = true; _iteratorError14 = err; } finally { try { if (!_iteratorNormalCompletion14 && _iterator14.return != null) { _iterator14.return(); } } finally { if (_didIteratorError14) { throw _iteratorError14; } } } return this; } /* eslint no-use-before-define: 0 */ discriminator(childModel, opts) { const customizationOpts = (0, _mergeCustomizationOptions.mergeCustomizationOptions)(this.opts, opts); let childTC = (0, _composeWithMongoose.composeWithMongoose)(childModel, customizationOpts); childTC = (0, _composeChildTC.composeChildTC)(this, childTC, this.opts); this.schemaComposer.addSchemaMustHaveType(childTC); this.childTCs.push(childTC); return childTC; } } exports.DiscriminatorTypeComposer = DiscriminatorTypeComposer;