1 | 'use strict';
|
2 |
|
3 | const fetch = require('cross-fetch');
|
4 | const { access, readFile, writeFile } = require('fs');
|
5 | const { promisify } = require('util');
|
6 | const { graphql } = require('graphql');
|
7 | const { makeExecutableSchema } = require('graphql-tools');
|
8 |
|
9 | function 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 |
|
16 | function 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 |
|
34 | function executeLocalQuery(schemaFile, query) {
|
35 | return promisify(readFile)(schemaFile, 'utf-8')
|
36 | .then(typeDefs => makeExecutableSchema({ typeDefs }))
|
37 | .then(executableSchema => graphql(executableSchema, query));
|
38 | }
|
39 |
|
40 | const query = `
|
41 | query IntrospectionQuery {
|
42 | __schema {
|
43 | types {
|
44 | kind
|
45 | name
|
46 | possibleTypes {
|
47 | name
|
48 | }
|
49 | }
|
50 | }
|
51 | }
|
52 | `;
|
53 |
|
54 | module.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 | };
|