graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
105 lines • 5.23 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.composeMongoose = composeMongoose;
exports.prepareFields = prepareFields;
exports.createInputType = createInputType;
exports.prepareInputFields = prepareInputFields;
const graphql_compose_1 = require("graphql-compose");
const fieldsConverter_1 = require("./fieldsConverter");
const resolvers_1 = require("./resolvers");
const MongoID_1 = __importDefault(require("./types/MongoID"));
function composeMongoose(model, opts = {}) {
const m = model;
const name = (opts && opts.name) || m.modelName;
const sc = opts.schemaComposer || graphql_compose_1.schemaComposer;
sc.add(MongoID_1.default);
if (sc.has(name)) {
throw new Error(`You try to generate GraphQL Type with name ${name} from mongoose model but this type already exists in SchemaComposer. Please choose another type name "composeWithMongoose(model, { name: 'NewTypeName' })", or reuse existed type "schemaComposer.getOTC('TypeName')", or remove type from SchemaComposer before calling composeWithMongoose method "schemaComposer.delete('TypeName')".`);
}
if (sc.has(m.schema)) {
sc.delete(m.schema);
}
const tc = (0, fieldsConverter_1.convertModelToGraphQL)(m, name, sc);
if (opts.description) {
tc.setDescription(opts.description);
}
prepareFields(tc, opts);
createInputType(tc, opts.inputType);
if (opts.defaultsAsNonNull) {
makeFieldsNonNullWithDefaultValues(tc);
}
tc.makeFieldNonNull('_id');
const mongooseResolvers = {};
Object.keys(resolvers_1.resolverFactory).forEach((name) => {
mongooseResolvers[name] = resolvers_1.resolverFactory[name].bind(undefined, model, tc);
});
tc.mongooseResolvers = mongooseResolvers;
return tc;
}
function makeFieldsNonNullWithDefaultValues(tc, alreadyWorked = new Set()) {
if (alreadyWorked.has(tc))
return;
alreadyWorked.add(tc);
let hasFieldsWithDefaultValues = false;
tc.getFieldNames().forEach((fieldName) => {
var _a, _b;
const fc = tc.getField(fieldName);
if (fc.type instanceof graphql_compose_1.ObjectTypeComposer) {
if ((_a = fc.extensions) === null || _a === void 0 ? void 0 : _a.isSingleNestedMongooseSchema) {
return;
}
makeFieldsNonNullWithDefaultValues(fc.type);
if (fc.type.getExtension('hasFieldsWithDefaultValue')) {
tc.makeFieldNonNull(fieldName);
}
}
const defaultValue = (_b = fc === null || fc === void 0 ? void 0 : fc.extensions) === null || _b === void 0 ? void 0 : _b.defaultValue;
if (defaultValue !== null && defaultValue !== undefined) {
hasFieldsWithDefaultValues = true;
tc.makeFieldNonNull(fieldName);
}
});
if (hasFieldsWithDefaultValues) {
tc.setExtension('hasFieldsWithDefaultValue', true);
}
}
function prepareFields(tc, opts = {}) {
var _a, _b;
const onlyFields = (opts === null || opts === void 0 ? void 0 : opts.onlyFields) || ((_a = opts === null || opts === void 0 ? void 0 : opts.fields) === null || _a === void 0 ? void 0 : _a.only);
if (onlyFields) {
tc.removeOtherFields(onlyFields);
}
const removeFields = (opts === null || opts === void 0 ? void 0 : opts.removeFields) || ((_b = opts === null || opts === void 0 ? void 0 : opts.fields) === null || _b === void 0 ? void 0 : _b.remove);
if (removeFields) {
tc.removeField(removeFields);
}
}
function createInputType(tc, inputTypeOpts = {}) {
const inputTypeComposer = tc.getInputTypeComposer();
if (inputTypeOpts.name) {
inputTypeComposer.setTypeName(inputTypeOpts.name);
}
if (inputTypeOpts.description) {
inputTypeComposer.setDescription(inputTypeOpts.description);
}
prepareInputFields(inputTypeComposer, inputTypeOpts);
}
function prepareInputFields(inputTypeComposer, inputTypeOpts = {}) {
var _a, _b, _c;
const onlyFields = (inputTypeOpts === null || inputTypeOpts === void 0 ? void 0 : inputTypeOpts.onlyFields) || ((_a = inputTypeOpts === null || inputTypeOpts === void 0 ? void 0 : inputTypeOpts.fields) === null || _a === void 0 ? void 0 : _a.only);
if (onlyFields) {
inputTypeComposer.removeOtherFields(onlyFields);
}
const removeFields = (inputTypeOpts === null || inputTypeOpts === void 0 ? void 0 : inputTypeOpts.removeFields) || ((_b = inputTypeOpts === null || inputTypeOpts === void 0 ? void 0 : inputTypeOpts.fields) === null || _b === void 0 ? void 0 : _b.remove);
if (removeFields) {
inputTypeComposer.removeField(removeFields);
}
const requiredFields = (inputTypeOpts === null || inputTypeOpts === void 0 ? void 0 : inputTypeOpts.requiredFields) || ((_c = inputTypeOpts === null || inputTypeOpts === void 0 ? void 0 : inputTypeOpts.fields) === null || _c === void 0 ? void 0 : _c.required);
if (requiredFields) {
inputTypeComposer.makeFieldNonNull(requiredFields);
}
}
//# sourceMappingURL=composeMongoose.js.map