UNPKG

inversify-graphql

Version:

Builds dependency-inverted GraphQL schemas with InversifyJS

184 lines 7.78 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; return c > 3 && r && Object.defineProperty(target, key, r), r; }; var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __metadata = (this && this.__metadata) || function (k, v) { if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v); }; Object.defineProperty(exports, "__esModule", { value: true }); exports.InversifyObjectTypeBuilder = exports.InversifyObjectTypeBuilderBase = exports.ExtensibleSchemaSymbol = void 0; const inv = __importStar(require("inversify")); const gql = __importStar(require("graphql")); const interfaces_private_1 = require("./interfaces-private"); exports.ExtensibleSchemaSymbol = Symbol(); let InversifyObjectTypeBuilderBase = class InversifyObjectTypeBuilderBase { constructor() { this.extensions = 'all'; } doBuildConfig() { if (this.building) throw new Error(`The type ${this.constructor.name} is involved in a circlar referenciation loop. If this is intended, please use the thunk version of 'fields' - i.e. "fields: () => ({ /* field definition */ })`); this.building = true; // resolve fields, and // deep copy item (this.config() might return a constant => must not be modified) const cfg = { ...this.config() }; if (typeof cfg.fields === 'function') { const cpy = cfg.fields; cfg.fields = () => ({ ...cpy() }); } else if (cfg.fields instanceof Array) { cfg.fields = [...cfg.fields]; } else { cfg.fields = { ...cfg.fields, }; } // resolve types // deep copy item (this.config() might return a constant => must not be modified) let interfaces; if ('interfaces' in cfg) { // typescript wont do the cast automatically :( const cfgo = cfg; if (typeof cfgo.interfaces === 'function') { const cpy = cfgo.interfaces; cfgo.interfaces = () => [...cpy()]; } else if (cfgo.interfaces instanceof Array) { cfgo.interfaces = [...cfgo.interfaces]; } // map types if (typeof cfgo.interfaces === 'function') { const cpy = cfgo.interfaces; interfaces = () => cpy().map(x => this.builders.buildType(x)); } else { interfaces = cfgo.interfaces.map(x => this.builders.buildType(x)); } } // load extensions if (this.extensible) { const extList = this.extensible.getNoCreate(cfg.name, Object.getPrototypeOf(this).constructor, this.extensions); for (const extended of extList) { const built = extended.buildType(); if (built) { const instanciated = this.builders.get(built); const extCfg = instanciated.config(); if (typeof cfg.fields === 'function') { const cpy = cfg.fields; cfg.fields = () => ({ ...cpy(), ...extCfg.fields, }); } else { cfg.fields = { ...cfg.fields, ...extCfg.fields, }; // for (const fname of Object.keys(extCfg.fields)) { // if (fname in cfg.fields) // throw new Error('Cannot merge GraphQL extensions in ' + cfg.name + ' because an extension also declares a field named ' + fname); // cfg.fields[fname] = extCfg.fields[fname]; // } } } } } const buildField = (ifcm) => { // build real type map const builtMap = {}; Object.keys(ifcm) .forEach(fieldName => { const field = ifcm[fieldName]; if (!field) return; // ignore undefined fields const type = this.builders.buildType(field.type); builtMap[fieldName] = { ...field, type: type, }; }); return builtMap; }; // retreive fields let builtFields; if (cfg.fields instanceof Array) { builtFields = {}; cfg.fields.forEach(b => { let m = this.builders.get(b).map(); if (typeof m === 'function') m = m(); const builtMap = buildField(m); Object.keys(builtMap) .forEach(mk => { if (builtFields[mk]) throw new Error('Dupplicate field in partial graphql map: ' + mk); builtFields[mk] = builtMap[mk]; }); }); } else if (typeof cfg.fields === 'function') { const fieldsFn = cfg.fields; builtFields = () => buildField(fieldsFn()); } else builtFields = buildField(cfg.fields); delete this.building; return { ...cfg, interfaces, fields: builtFields, }; } }; __decorate([ inv.inject(interfaces_private_1.ITypeCache), __metadata("design:type", interfaces_private_1.ITypeCache) ], InversifyObjectTypeBuilderBase.prototype, "builders", void 0); __decorate([ inv.inject(exports.ExtensibleSchemaSymbol), inv.optional(), __metadata("design:type", Object) ], InversifyObjectTypeBuilderBase.prototype, "extensible", void 0); InversifyObjectTypeBuilderBase = __decorate([ inv.injectable() ], InversifyObjectTypeBuilderBase); exports.InversifyObjectTypeBuilderBase = InversifyObjectTypeBuilderBase; class InversifyObjectTypeBuilder extends InversifyObjectTypeBuilderBase { build() { if (this.built) return this.built; const cfg = super.doBuildConfig(); // return real object type this.built = new gql.GraphQLObjectType(cfg); return this.built; } } exports.InversifyObjectTypeBuilder = InversifyObjectTypeBuilder; //# sourceMappingURL=object-builder.js.map