graphql-compose-mongoose
Version:
Plugin for `graphql-compose` which derive a graphql types from a mongoose model.
102 lines • 4.2 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.prepareAliases = prepareAliases;
exports.prepareAliasesReverse = prepareAliasesReverse;
exports.replaceAliases = replaceAliases;
exports.prepareNestedAliases = prepareNestedAliases;
const graphql_compose_1 = require("graphql-compose");
function prepareAliases(model) {
var _a;
const aliases = ((_a = model === null || model === void 0 ? void 0 : model.schema) === null || _a === void 0 ? void 0 : _a.aliases) || {};
if (model.discriminators) {
Object.keys(model.discriminators).forEach((subModelName) => {
var _a;
const subModel = model.discriminators[subModelName];
Object.assign(aliases, (_a = subModel === null || subModel === void 0 ? void 0 : subModel.schema) === null || _a === void 0 ? void 0 : _a.aliases);
});
}
if (Object.keys(aliases).length > 0) {
return aliases;
}
return false;
}
function prepareAliasesReverse(schema) {
const aliases = schema === null || schema === void 0 ? void 0 : schema.aliases;
const keys = Object.keys(aliases);
if (keys.length > 0) {
const r = {};
keys.forEach((k) => {
r[aliases[k]] = k;
});
return r;
}
return false;
}
function replaceAliases(data, aliases) {
if (aliases) {
const res = Object.assign({}, data);
Object.keys(data).forEach((key) => {
if (aliases === null || aliases === void 0 ? void 0 : aliases[key]) {
const alias = aliases === null || aliases === void 0 ? void 0 : aliases[key];
let aliasValue;
if (typeof alias === 'string') {
aliasValue = alias;
}
else if ((0, graphql_compose_1.isObject)(alias)) {
aliasValue = alias === null || alias === void 0 ? void 0 : alias.__selfAlias;
}
res[aliasValue || key] = (0, graphql_compose_1.isObject)(res[key])
? replaceAliases(res[key], (0, graphql_compose_1.isObject)(alias) ? alias : undefined)
: res[key];
if (aliasValue) {
delete res[key];
}
}
});
return res;
}
return data;
}
function prepareNestedAliases(schema, preparedAliases = new Map()) {
if (preparedAliases.has(schema)) {
return preparedAliases.get(schema);
}
const aliases = {};
preparedAliases.set(schema, aliases);
const discriminators = schema.discriminators;
if (discriminators) {
Object.keys(discriminators).forEach((discSchemaName) => {
const discSchema = discriminators[discSchemaName];
const additionalAliases = prepareNestedAliases(discSchema, preparedAliases);
Object.assign(aliases, additionalAliases);
});
}
Object.keys(schema.paths).forEach((path) => {
var _a, _b;
const field = schema.paths[path];
let fieldName = path;
if ((_a = field === null || field === void 0 ? void 0 : field.options) === null || _a === void 0 ? void 0 : _a.alias) {
fieldName = (_b = field === null || field === void 0 ? void 0 : field.options) === null || _b === void 0 ? void 0 : _b.alias;
aliases[fieldName] = path;
}
if (field === null || field === void 0 ? void 0 : field.schema) {
const nestedSchema = field === null || field === void 0 ? void 0 : field.schema;
const nestedAliases = prepareNestedAliases(nestedSchema, preparedAliases);
if (nestedAliases) {
const topKey = aliases[fieldName];
if (topKey && typeof topKey === 'string') {
aliases[fieldName] = {
__selfAlias: topKey,
};
}
aliases[fieldName] = Object.assign(aliases[fieldName] || {}, nestedAliases);
}
}
});
if (!Object.keys(aliases).length) {
preparedAliases.set(schema, undefined);
return undefined;
}
return aliases;
}
//# sourceMappingURL=aliases.js.map