graphql-yoga
Version:
70 lines (69 loc) • 2.49 kB
JavaScript
import yargs from 'yargs';
import { hideBin } from 'yargs/helpers';
import { loadConfig } from 'graphql-config';
import { CodeFileLoader } from '@graphql-tools/code-file-loader';
import { createYoga } from 'graphql-yoga';
import { createServer } from 'http';
import { addMocksToSchema } from '@graphql-tools/mock';
const terminateEvents = ['SIGINT', 'SIGTERM'];
function registerTerminateHandler(callback) {
for (const eventName of terminateEvents) {
process.on(eventName, () => callback(eventName));
}
}
export const YogaExtensions = (api) => {
const codeFileLoader = new CodeFileLoader({
noPluck: true,
});
api.loaders.schema.register(codeFileLoader);
api.loaders.documents.register(codeFileLoader);
return {
name: 'Yoga',
};
};
export function graphqlYoga() {
return yargs(hideBin(process.argv)).command('$0', 'Serves GraphQL over HTTP using your GraphQL Config', (builder) => {
builder.option('project', {
type: 'string',
description: 'Project name',
});
builder.option('mock', {
type: 'boolean',
description: 'Mock the given schema',
});
}, async ({ project = 'default', mock }) => {
console.info(`Loading GraphQL Config from ${process.cwd()}`);
const config = await loadConfig({
extensions: [YogaExtensions],
throwOnMissing: false,
throwOnEmpty: false,
});
console.log(`Loading project: ${project}`);
const projectConfig = config?.getProject(project);
console.log(`Loading GraphQL Schema of ${project}`);
let schema = await projectConfig?.getSchema();
if (!schema) {
console.warn(`Could not find schema for project ${project} fallback to default schema`);
}
if (mock) {
if (!schema) {
console.warn('No schema found for mocking. Skipping mocking.');
}
else {
console.log(`Adding mocks to the schema`);
schema = addMocksToSchema({ schema });
}
}
console.log(`Building GraphQL Server`);
const yoga = createYoga({
schema,
});
const server = createServer(yoga);
console.log(`Starting GraphQL Server`);
server.listen(4000);
registerTerminateHandler(() => {
server.close();
});
}).argv;
}
export * from 'graphql-yoga';