UNPKG

@zuu/owl

Version:

Zuu's Experimental GraphQL Implementation

190 lines 8.11 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const errors_1 = require("../errors"); const utils_1 = require("./utils"); class MetadataStorage { constructor() { this.queries = []; this.mutations = []; this.subscriptions = []; this.fieldResolvers = []; this.objectTypes = []; this.inputTypes = []; this.argumentTypes = []; this.interfaceTypes = []; this.authorizedFields = []; this.enums = []; this.unions = []; this.middlewares = []; this.resolverClasses = []; this.fields = []; this.params = []; utils_1.ensureReflectMetadataExists(); } collectQueryHandlerMetadata(definition) { this.queries.push(definition); } collectMutationHandlerMetadata(definition) { this.mutations.push(definition); } collectSubscriptionHandlerMetadata(definition) { this.subscriptions.push(definition); } collectFieldResolverMetadata(definition) { this.fieldResolvers.push(definition); } collectObjectMetadata(definition) { this.objectTypes.push(definition); } collectInputMetadata(definition) { this.inputTypes.push(definition); } collectArgsMetadata(definition) { this.argumentTypes.push(definition); } collectInterfaceMetadata(definition) { this.interfaceTypes.push(definition); } collectAuthorizedFieldMetadata(definition) { this.authorizedFields.push(definition); } collectEnumMetadata(definition) { this.enums.push(definition); } collectUnionMetadata(definition) { const unionSymbol = Symbol(definition.name); this.unions.push(Object.assign({}, definition, { symbol: unionSymbol })); return unionSymbol; } collectMiddlewareMetadata(definition) { this.middlewares.push(definition); } collectResolverClassMetadata(definition) { this.resolverClasses.push(definition); } collectClassFieldMetadata(definition) { this.fields.push(definition); } collectHandlerParamMetadata(definition) { this.params.push(definition); } build() { this.buildClassMetadata(this.objectTypes); this.buildClassMetadata(this.inputTypes); this.buildClassMetadata(this.argumentTypes); this.buildClassMetadata(this.interfaceTypes); this.buildFieldResolverMetadata(this.fieldResolvers); this.buildResolversMetadata(this.queries); this.buildResolversMetadata(this.mutations); this.buildResolversMetadata(this.subscriptions); this.buildExtendedResolversMetadata(); } clear() { this.queries = []; this.mutations = []; this.subscriptions = []; this.fieldResolvers = []; this.objectTypes = []; this.inputTypes = []; this.argumentTypes = []; this.interfaceTypes = []; this.authorizedFields = []; this.enums = []; this.unions = []; this.middlewares = []; this.resolverClasses = []; this.fields = []; this.params = []; } buildClassMetadata(definitions) { definitions.forEach(def => { const fields = this.fields.filter(field => field.target === def.target); fields.forEach(field => { field.roles = this.findFieldRoles(field.target, field.name); field.params = this.params.filter(param => param.target === field.target && field.name === param.methodName); field.middlewares = utils_1.mapMiddlewareMetadataToArray(this.middlewares.filter(middleware => middleware.target === field.target && middleware.fieldName === field.name)); }); def.fields = fields; }); } buildResolversMetadata(definitions) { definitions.forEach(def => { const resolverClassMetadata = this.resolverClasses.find(resolver => resolver.target === def.target); def.resolverClassMetadata = resolverClassMetadata; def.params = this.params.filter(param => param.target === def.target && def.methodName === param.methodName); def.roles = this.findFieldRoles(def.target, def.methodName); def.middlewares = utils_1.mapMiddlewareMetadataToArray(this.middlewares.filter(middleware => middleware.target === def.target && def.methodName === middleware.fieldName)); }); } buildFieldResolverMetadata(definitions) { this.buildResolversMetadata(definitions); definitions.forEach(def => { def.roles = this.findFieldRoles(def.target, def.methodName); def.getObjectType = def.kind === "external" ? this.resolverClasses.find(resolver => resolver.target === def.target).getObjectType : () => def.target; if (def.kind === "external") { const objectTypeCls = this.resolverClasses.find(resolver => resolver.target === def.target) .getObjectType(); const objectType = this.objectTypes.find(objTypeDef => objTypeDef.target === objectTypeCls); const objectTypeField = objectType.fields.find(fieldDef => fieldDef.name === def.methodName); if (!objectTypeField) { if (!def.getType || !def.typeOptions) { throw new errors_1.NoExplicitTypeError(def.target.name, def.methodName); } const fieldMetadata = { name: def.methodName, schemaName: def.schemaName, getType: def.getType, target: objectTypeCls, typeOptions: def.typeOptions, deprecationReason: def.deprecationReason, description: def.description, roles: def.roles, middlewares: def.middlewares, params: def.params, }; this.collectClassFieldMetadata(fieldMetadata); objectType.fields.push(fieldMetadata); } else { if (objectTypeField.params.length === 0) { objectTypeField.params = def.params; } if (def.roles) { objectTypeField.roles = def.roles; } else if (objectTypeField.roles) { def.roles = objectTypeField.roles; } } } }); } buildExtendedResolversMetadata() { this.resolverClasses.forEach(def => { const target = def.target; let superResolver = Object.getPrototypeOf(target); while (superResolver.prototype) { const superResolverMetadata = this.resolverClasses.find(it => it.target === superResolver); if (superResolverMetadata) { this.queries.unshift(...utils_1.mapSuperResolverHandlers(this.queries, superResolver, def)); this.mutations.unshift(...utils_1.mapSuperResolverHandlers(this.mutations, superResolver, def)); this.subscriptions.unshift(...utils_1.mapSuperResolverHandlers(this.subscriptions, superResolver, def)); this.fieldResolvers.unshift(...utils_1.mapSuperFieldResolverHandlers(this.fieldResolvers, superResolver, def)); } superResolver = Object.getPrototypeOf(superResolver); } }); } findFieldRoles(target, fieldName) { const authorizedField = this.authorizedFields.find(authField => authField.target === target && authField.fieldName === fieldName); if (!authorizedField) { return; } return authorizedField.roles; } } exports.MetadataStorage = MetadataStorage; //# sourceMappingURL=metadata-storage.js.map