UNPKG

1.65 kBJavaScriptView Raw
1'use strict';
2
3const fetch = require('cross-fetch');
4const { access, readFile, writeFile } = require('fs');
5const { promisify } = require('util');
6const { graphql } = require('graphql');
7const { makeExecutableSchema } = require('graphql-tools');
8
9function writeFragmentTypesFile(fragmentsFile, result) {
10 result.data.__schema.types = result.data.__schema.types.filter(
11 t => t.possibleTypes !== null
12 );
13 return promisify(writeFile)(fragmentsFile, JSON.stringify(result.data));
14}
15
16function executeRemoteQuery(graphqlUri, optionalHeaders = [], query) {
17 const headers = optionalHeaders.reduce(
18 (headers, header) => {
19 const parts = header.split(':');
20 headers[parts.shift()] = parts.join(':');
21 return headers;
22 },
23 {
24 'Content-Type': 'application/json',
25 }
26 );
27 return fetch(graphqlUri, {
28 method: 'POST',
29 headers,
30 body: JSON.stringify({ query }),
31 }).then(result => result.json());
32}
33
34function executeLocalQuery(schemaFile, query) {
35 return promisify(readFile)(schemaFile, 'utf-8')
36 .then(typeDefs => makeExecutableSchema({ typeDefs }))
37 .then(executableSchema => graphql(executableSchema, query));
38}
39
40const query = `
41query IntrospectionQuery {
42 __schema {
43 types {
44 kind
45 name
46 possibleTypes {
47 name
48 }
49 }
50 }
51}
52`;
53
54module.exports = function generateFragmentTypes(options) {
55 return promisify(access)(options.schemaFile)
56 .then(
57 () => executeLocalQuery(options.schemaFile, query),
58 () => executeRemoteQuery(options.graphqlUri, options.headers, query)
59 )
60 .then(result => writeFragmentTypesFile(options.fragmentsFile, result));
61};