@graphql-inspector/loaders
Version:
Loaders in GraphQL Inspector
102 lines (98 loc) • 3.52 kB
JavaScript
import { buildSchema } from 'graphql';
import { loadDocuments, loadSchema, } from '@graphql-tools/load';
export class LoadersRegistry {
constructor() {
this.loaders = [];
}
register(loader) {
this.loaders.push(loader);
}
registerModule(loaderName) {
try {
const loader = loadModule(`@graphql-inspector/${loaderName}-loader`);
this.register(loader);
}
catch (error) {
console.error(error);
throw new Error(`Couldn't load ${loaderName} loader`);
}
}
loadSchema(pointer, options = {}, enableApolloFederation, enableAWS) {
return enrichError(loadSchema(pointer, {
loaders: this.loaders,
...options,
...(enableApolloFederation
? {
schemas: [
buildSchema(/* GraphQL */ `
scalar _FieldSet
directive @external on FIELD_DEFINITION
directive @requires(fields: _FieldSet!) on FIELD_DEFINITION
directive @provides(fields: _FieldSet!) on FIELD_DEFINITION
directive @key(fields: _FieldSet!) on OBJECT | INTERFACE
directive @extends on OBJECT | INTERFACE
`),
],
}
: {}),
...(enableAWS
? {
schemas: [
buildSchema(/* GraphQL */ `
scalar AWSDate
scalar AWSTime
scalar AWSDateTime
scalar AWSTimestamp
scalar AWSEmail
scalar AWSJSON
scalar AWSURL
scalar AWSPhone
scalar AWSIPAddress
scalar BigInt
scalar Double
directive @aws_subscribe(mutations: [String!]!) on FIELD_DEFINITION
directive @deprecated(
reason: String
) on FIELD_DEFINITION | INPUT_FIELD_DEFINITION | ENUM | ENUM_VALUE
directive @aws_auth(cognito_groups: [String!]!) on FIELD_DEFINITION
directive @aws_api_key on FIELD_DEFINITION | OBJECT
directive @aws_iam on FIELD_DEFINITION | OBJECT
directive @aws_oidc on FIELD_DEFINITION | OBJECT
directive @aws_cognito_user_pools(
cognito_groups: [String!]
) on FIELD_DEFINITION | OBJECT
directive @aws_lambda on FIELD_DEFINITION | OBJECT
`),
],
}
: {}),
}));
}
loadDocuments(pointer, options = {}) {
return enrichError(loadDocuments(pointer, {
loaders: this.loaders,
...options,
}));
}
}
export function useLoaders(config) {
const loaders = new LoadersRegistry();
for (const loaderName of config.loaders)
loaders.registerModule(loaderName);
return loaders;
}
function loadModule(name) {
const mod = require(name);
return mod.default || mod;
}
/**
* Adds `(source: <file-path>)` suffix to error message if source is available
*/
function enrichError(looksPromising) {
return looksPromising.catch(error => {
if (error.source?.name) {
error.message = `${error.message} (source: ${error.source?.name})`;
}
return Promise.reject(error);
});
}