UNPKG

graphql-compose-mongoose

Version:

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

127 lines 4.82 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getIndexesFromModel = getIndexesFromModel; exports.getUniqueIndexes = getUniqueIndexes; exports.extendByReversedIndexes = extendByReversedIndexes; exports.getIndexedFieldNamesForGraphQL = getIndexedFieldNamesForGraphQL; const aliases_1 = require("../resolvers/helpers/aliases"); function isSpecificIndex(idx) { let hasSpecialIndex = false; Object.keys(idx).forEach((k) => { if (typeof idx[k] !== 'number' && typeof idx[k] !== 'boolean') { hasSpecialIndex = true; } }); return hasSpecialIndex; } function getIndexesFromModel(mongooseModel, opts = {}) { const extractCompound = opts.extractCompound === undefined ? true : Boolean(opts.extractCompound); const skipSpecificIndexes = opts.skipSpecificIndexes === undefined ? true : Boolean(opts.skipSpecificIndexes); const indexedFields = []; if (mongooseModel.schema.paths._id) { indexedFields.push({ _id: 1 }); } const reversedAliases = (0, aliases_1.prepareAliasesReverse)(mongooseModel.schema); Object.keys(mongooseModel.schema.paths).forEach((name) => { if (mongooseModel.schema.paths[name]._index) { const fieldName = (reversedAliases && reversedAliases[name]) || name; indexedFields.push({ [fieldName]: 1 }); } }); if (Array.isArray(mongooseModel.schema._indexes)) { mongooseModel.schema._indexes.forEach((idxData) => { const partialIndexes = {}; const idxFields = idxData[0]; if (!skipSpecificIndexes || !isSpecificIndex(idxFields)) { if (!extractCompound) { indexedFields.push(idxFields); } else { Object.keys(idxFields).forEach((name) => { const fieldName = (reversedAliases && reversedAliases[name]) || name; partialIndexes[fieldName] = idxFields[name]; indexedFields.push(Object.assign({}, partialIndexes)); }); } } }); } const tmp = []; const result = indexedFields.filter((val) => { const asString = JSON.stringify(val); if (tmp.indexOf(asString) > -1) return false; tmp.push(asString); return true; }); return result; } function getUniqueIndexes(mongooseModel) { const indexedFields = []; if (mongooseModel.schema.paths._id) { indexedFields.push({ _id: 1 }); } Object.keys(mongooseModel.schema.paths).forEach((name) => { var _a, _b; if ((_b = (_a = mongooseModel.schema.paths[name]) === null || _a === void 0 ? void 0 : _a._index) === null || _b === void 0 ? void 0 : _b.unique) { indexedFields.push({ [name]: 1 }); } }); if (Array.isArray(mongooseModel.schema._indexes)) { mongooseModel.schema._indexes.forEach((idxData) => { const idxFields = idxData[0]; const idxCfg = idxData[1]; if (idxCfg.unique && !isSpecificIndex(idxFields)) { indexedFields.push(idxFields); } }); } return indexedFields; } function extendByReversedIndexes(indexes, opts = {}) { const reversedFirst = opts.reversedFirst === undefined ? false : Boolean(opts.reversedFirst); const result = []; indexes.forEach((indexObj) => { let hasSpecificIndex = false; const reversedIndexObj = Object.assign({}, indexObj); Object.keys(reversedIndexObj).forEach((f) => { if (reversedIndexObj[f] === 1) reversedIndexObj[f] = -1; else if (reversedIndexObj[f] === -1) reversedIndexObj[f] = 1; else hasSpecificIndex = true; }); if (reversedFirst) { if (!hasSpecificIndex) { result.push(reversedIndexObj); } result.push(indexObj); } else { result.push(indexObj); if (!hasSpecificIndex) { result.push(reversedIndexObj); } } }); return result; } function getIndexedFieldNamesForGraphQL(model) { const indexes = getIndexesFromModel(model); const fieldNames = []; indexes.forEach((indexData) => { const keys = Object.keys(indexData); const clearedName = keys[0].replace(/[^_a-zA-Z0-9]/i, '__'); fieldNames.push(clearedName); }); const uniqueNames = []; const result = fieldNames.filter((val) => { if (uniqueNames.indexOf(val) > -1) return false; uniqueNames.push(val); return true; }); return result; } //# sourceMappingURL=getIndexesFromModel.js.map