UNPKG

reiso

Version:
312 lines 23.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const graphql_1 = require("graphql"); const Model_1 = require("./Model"); const Error_1 = require("../../Modules/Error"); const typesInput = {}; const types = {}; function checkQuota(context, args, quota) { if (context.quotaLimit) { if (quota) { if (typeof quota === 'function') { context.quota += quota(args, context); } else { context.quota += quota; } } if (context.quotaLimit < context.quota) { throw new Error_1.LogError("Quota limit", "debug", `You have reached your quota of a query at ${context.quota} of ${context.quotaLimit}`); } } } exports.checkQuota = checkQuota; function getInputModelType(model) { if (typesInput[model.id]) { return typesInput[model.id]; } const fields = {}; for (const i in model.fields) { let field = model.fields[i]; fields[field.name] = { type: getInputType(field) }; } typesInput[model.id] = new graphql_1.GraphQLInputObjectType({ name: model.id, fields: fields }); return typesInput[model.id]; } exports.getInputModelType = getInputModelType; function getInputTypeSimple(t, arg) { let type = graphql_1.GraphQLString; switch (typeof t) { case 'string': if (t == 'string') { type = graphql_1.GraphQLString; } else if (t == 'integer') { type = graphql_1.GraphQLInt; } else if (t == 'float') { type = graphql_1.GraphQLFloat; } else if (t == 'boolean') { type = graphql_1.GraphQLBoolean; } else if (t == 'id') { type = graphql_1.GraphQLID; } else { throw new Error('Undefined arg type: ' + t + ' for ' + arg.name); } break; case 'object': if (Array.isArray(t)) { // TODO: Make union types // const types = t.forEach(t => getInputTypeSimple(t, arg)); // type = GraphQLUnionType; } else { throw new Error('The arg type: ' + typeof arg.type + ' should be String or Function [() => Class or GraphQLType] or an array of them for ' + arg.name); } break; case 'function': // TODO: resolveType like string into Structure let func = t(); if (typeof func == 'function') { let inputModel = Reflect.getMetadata(Model_1.inputMetadataKey, func) || Reflect.getMetadata(Model_1.inputMetadataKey, func.prototype); if (inputModel) { type = getInputModelType(inputModel); } else { throw new Error('The arg type: ' + typeof arg.type + ' does not have Model for ' + arg.name); } } else { type = func; } break; default: throw new Error('The arg type: ' + typeof arg.type + ' should be String or Function [() => Class or GraphQLType] or an array of them for ' + arg.name); } if (!arg.nullable) { type = new graphql_1.GraphQLNonNull(type); } if (arg.array) { type = new graphql_1.GraphQLList(type); } return type; } exports.getInputTypeSimple = getInputTypeSimple; function getInputType(arg) { if (Array.isArray(arg.type)) { // TODO: Make union types // const unionTypes = arg.type.map(t => ({ t, type: getInputTypeSimple(t, arg) })); // const type = new GraphQLUnionType({ // name: 'Union' + arg.name, // types: unionTypes.map(t => t.type), // resolveType: (value) => { // const resolvedType = unionTypes.find(t => t.t === arg.resolveType(value)); // return resolvedType && resolvedType.type; // } // }) // return type; throw new Error('Not implemented!'); } else { return getInputTypeSimple(arg.type, arg); } } exports.getInputType = getInputType; function getFieldType(arg) { let type = graphql_1.GraphQLString; switch (typeof arg.type) { case 'string': if (arg.type == 'string') { type = graphql_1.GraphQLString; } else if (arg.type == 'integer') { type = graphql_1.GraphQLInt; } else if (arg.type == 'float') { type = graphql_1.GraphQLFloat; } else if (arg.type == 'boolean') { type = graphql_1.GraphQLBoolean; } else if (arg.type == 'id') { type = graphql_1.GraphQLID; } else { throw new Error('Undefined arg type: ' + arg.type + ' for ' + arg.name); } break; case 'function': let func = arg.type(); if (typeof func == 'function') { let inputModel = Reflect.getMetadata(Model_1.typeMetadataKey, func) || Reflect.getMetadata(Model_1.typeMetadataKey, func.prototype); if (inputModel) { type = getModelType(inputModel); } else { throw new Error('The arg type: ' + typeof arg.type + ' does not have Model for ' + arg.name); } } else { type = func; } break; default: throw new Error('The arg type: ' + typeof arg.type + ' should be a string or a function [() => Class or GraphQLType] for ' + arg.name); } if (arg.array) { type = new graphql_1.GraphQLList(type); } return type; } exports.getFieldType = getFieldType; function getModelType(model) { if (types[model.id]) { return types[model.id]; } const fields = {}; types[model.id] = new graphql_1.GraphQLObjectType({ name: model.id, fields: fields }); for (const fieldName in model.fields) { const fieldRaw = model.fields[fieldName]; if (fieldRaw instanceof Model_1.ModelField) { const field = fieldRaw; if (field.substructure) { const func = field.type(); const inputModel = Reflect.getMetadata(Model_1.typeMetadataKey, func) || Reflect.getMetadata(Model_1.typeMetadataKey, func.prototype); if (inputModel instanceof Model_1.Model) { fields[field.name] = getField(inputModel); } else { throw new Error('Substructure should be Model: ' + field.type); } } else { const args = {}; for (const i in field.args) { const arg = field.args[i]; args[arg.name] = { type: getInputType(arg) }; } const type = getFieldType(field); fields[field.name] = { type: type, args: args, resolve: async (obj, argsRaw, context) => { const params = []; for (const i in field.args) { const arg = field.args[i]; params.push(argsRaw[arg.name]); } checkQuota(context, params, field.quota); params.push(context); if (typeof obj[fieldName] == "function") { return await obj[fieldName].apply(obj, params); } else { return obj[fieldName]; } } }; } } } return types[model.id]; } exports.getModelType = getModelType; function getField(model) { let constr = undefined; const args = {}; if (model.constr) { for (const i in model.constr.args) { const arg = model.constr.args[i]; args[arg.name] = { type: getInputType(arg) }; } constr = async (obj, argsRaw, context) => { const params = []; for (const i in model.constr.args) { const arg = model.constr.args[i]; params.push(argsRaw[arg.name]); } checkQuota(context, params, model.quotaConstr); params.push(context); if (model.constr.name) { let target = new (Function.prototype.bind.apply(model.target, params)); target.parent = obj; await target[model.constr.name].apply(target, params); return target; } else { let target = new (Function.prototype.bind.apply(model.target, params)); target.parent = obj; return target; } }; } else { constr = async (obj, argsRaw, context) => { checkQuota(context, [], model.quotaConstr); const target = new model.target(); target.parent = obj; return target; }; } const modelType = getModelType(model); return { type: modelType, args, resolve: constr }; } exports.getField = getField; function getSubscriptionField(model) { const args = {}; for (const i in model.args) { const arg = model.args[i]; args[arg.name] = { type: getInputType(arg) }; } const resolve = async (obj, argsRaw, context) => { const params = []; for (const i in model.args) { const arg = model.args[i]; params.push(argsRaw[arg.name]); } params.push(context); const target = await model.value(...params); return target; }; const subscribe = function (obj, argsRaw, context) { const params = []; for (const i in model.args) { const arg = model.args[i]; params.push(argsRaw[arg.name]); } checkQuota(context, params, model.quota); params.push(context); let target = model.subscribe(...params)(arguments); return target; }; const type = getFieldType(model); return { type: type, args: args, resolve: resolve, subscribe: subscribe }; } exports.getSubscriptionField = getSubscriptionField; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiSW5wdXQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvU2VydmVyL0dyYXBoUUwvSW5wdXQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSxxQ0FXaUI7QUFFakIsbUNBU2lCO0FBRWpCLCtDQUU2QjtBQUU3QixNQUFNLFVBQVUsR0FBRyxFQUFFLENBQUM7QUFDdEIsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO0FBRWpCLG9CQUEyQixPQUFPLEVBQUUsSUFBVyxFQUFFLEtBQWtEO0lBQy9GLElBQUksT0FBTyxDQUFDLFVBQVUsRUFBRTtRQUNwQixJQUFJLEtBQUssRUFBRTtZQUNQLElBQUksT0FBTyxLQUFLLEtBQUssVUFBVSxFQUFFO2dCQUM3QixPQUFPLENBQUMsS0FBSyxJQUFJLEtBQUssQ0FBQyxJQUFJLEVBQUUsT0FBTyxDQUFDLENBQUM7YUFDekM7aUJBQU07Z0JBQ0gsT0FBTyxDQUFDLEtBQUssSUFBSSxLQUFLLENBQUM7YUFDMUI7U0FDSjtRQUVELElBQUksT0FBTyxDQUFDLFVBQVUsR0FBRyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ3BDLE1BQU0sSUFBSSxnQkFBUSxDQUFDLGFBQWEsRUFBRSxPQUFPLEVBQUUsNkNBQTZDLE9BQU8sQ0FBQyxLQUFLLE9BQU8sT0FBTyxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUM7U0FDckk7S0FDSjtBQUNMLENBQUM7QUFkRCxnQ0FjQztBQUVELDJCQUFrQyxLQUFpQjtJQUMvQyxJQUFJLFVBQVUsQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEVBQUU7UUFDdEIsT0FBTyxVQUFVLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO0tBQy9CO0lBRUQsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLEtBQUssTUFBTSxDQUFDLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTtRQUMxQixJQUFJLEtBQUssR0FBRyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxD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