graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
127 lines • 4.82 kB
JavaScript
;
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