UNPKG

@pothos/plugin-federation

Version:

A Pothos plugin for implementing apollo federation subGraphs

139 lines (138 loc) 6.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); Object.defineProperty(exports, "hasResolvableKey", { enumerable: true, get: function() { return hasResolvableKey; } }); const _subgraph = require("@apollo/subgraph"); const _types = require("@apollo/subgraph/dist/types"); const _core = /*#__PURE__*/ _interop_require_default(require("@pothos/core")); const _graphql = require("graphql"); const _externalref = require("./external-ref"); const _types1 = require("./types"); const _util = require("./util"); function _interop_require_default(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const schemaBuilderProto = _core.default.prototype; function hasResolvableKey(type) { var _type_extensions, _type_extensions1, _directives_key; if (Array.isArray((_type_extensions = type.extensions) === null || _type_extensions === void 0 ? void 0 : _type_extensions.directives)) { var _type_extensions2; return (_type_extensions2 = type.extensions) === null || _type_extensions2 === void 0 ? void 0 : _type_extensions2.directives.some((d)=>d.name === 'key' && d.args.resolvable !== false); } var _type_extensions_directives; const directives = (_type_extensions_directives = (_type_extensions1 = type.extensions) === null || _type_extensions1 === void 0 ? void 0 : _type_extensions1.directives) !== null && _type_extensions_directives !== void 0 ? _type_extensions_directives : {}; if (!('key' in directives)) { return false; } if (Array.isArray(directives.key)) { return directives.key.some((d)=>d.resolvable !== false); } return ((_directives_key = directives.key) === null || _directives_key === void 0 ? void 0 : _directives_key.resolvable) !== false; } schemaBuilderProto.selection = (selection)=>({ selection, [_types1.selectionShapeKey]: {} }); schemaBuilderProto.keyDirective = (key, resolvable)=>({ ...key, resolvable }); schemaBuilderProto.externalRef = function externalRef(name, key, resolveReference) { return new _externalref.ExternalEntityRef(this, name, { key, resolveReference }); }; schemaBuilderProto.toSubGraphSchema = function toSubGraphSchema({ linkUrl = 'https://specs.apollo.dev/federation/v2.6', federationDirectives = (0, _util.getUsedDirectives)(this), ...options }) { var _options_extensions, _options_composeDirectives; var _options_composeDirectives_map; const schema = this.toSchema({ ...options, extensions: { ...options.extensions, directives: (0, _util.mergeDirectives)(options === null || options === void 0 ? void 0 : (_options_extensions = options.extensions) === null || _options_extensions === void 0 ? void 0 : _options_extensions.directives, [ { name: 'link', args: { url: linkUrl, import: [ ...federationDirectives, options.composeDirectives ? '@composeDirective' : null ].filter(Boolean) } }, ...(_options_composeDirectives_map = (_options_composeDirectives = options.composeDirectives) === null || _options_composeDirectives === void 0 ? void 0 : _options_composeDirectives.map((name)=>({ name: 'composeDirective', args: { name } }))) !== null && _options_composeDirectives_map !== void 0 ? _options_composeDirectives_map : [] ]) } }); const queryType = schema.getQueryType(); const types = schema.getTypeMap(); queryType === null || queryType === void 0 ? void 0 : queryType.toConfig(); const entityTypes = Object.values(types).filter((type)=>(0, _graphql.isObjectType)(type) && hasResolvableKey(type)); const hasEntities = entityTypes.length > 0; var _queryType_name; const newQuery = new _graphql.GraphQLObjectType({ name: (_queryType_name = queryType === null || queryType === void 0 ? void 0 : queryType.name) !== null && _queryType_name !== void 0 ? _queryType_name : 'Query', description: queryType === null || queryType === void 0 ? void 0 : queryType.description, astNode: queryType === null || queryType === void 0 ? void 0 : queryType.astNode, extensions: queryType === null || queryType === void 0 ? void 0 : queryType.extensions, fields: ()=>{ const updatedEntityType = new _graphql.GraphQLUnionType({ ..._types.EntityType.toConfig(), types: entityTypes.filter(_graphql.isObjectType).map((type)=>type === queryType ? newQuery : type) }); return { ...hasEntities && { _entities: { ..._types.entitiesField, type: new _graphql.GraphQLNonNull(new _graphql.GraphQLList(updatedEntityType)) } }, _service: { ..._types.serviceField, resolve: ()=>({ sdl }) }, ...queryType === null || queryType === void 0 ? void 0 : queryType.toConfig().fields }; } }); const subGraphSchema = new _graphql.GraphQLSchema({ query: newQuery, mutation: schema.getMutationType(), subscription: schema.getSubscriptionType(), extensions: schema.extensions, directives: schema.getDirectives(), extensionASTNodes: schema.extensionASTNodes, types: [ ...Object.values(types).filter((type)=>type.name !== 'Query'), newQuery ] }); const sorted = (0, _graphql.lexicographicSortSchema)(subGraphSchema); const sdl = (0, _subgraph.printSubgraphSchema)(sorted); return sorted; }; schemaBuilderProto.asEntity = function asEntity(param, options) { if (!_util.entityMapping.has(this)) { _util.entityMapping.set(this, new Map()); } this.configStore.onTypeConfig(param, (config)=>{ _util.entityMapping.get(this).set(config.name, options); }); }; //# sourceMappingURL=schema-builder.js.map