@pothos/plugin-federation
Version:
A Pothos plugin for implementing apollo federation subGraphs
139 lines (138 loc) • 6.4 kB
JavaScript
;
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