generate-graphql-types.ts 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import { spawn } from 'child_process';
  2. import * as rimraf from 'rimraf';
  3. import { API_PATH, API_PORT } from '../shared/shared-constants';
  4. /*
  5. * This script uses apollo-codegen to generate TypeScript interfaces for all
  6. * GraphQL queries defined in the admin-ui app. Run it via the package.json
  7. * script "generate-gql-types".
  8. */
  9. const API_URL = `http://localhost:${API_PORT}/${API_PATH}`;
  10. const SCHEMA_DUMP = 'schema.temp.json';
  11. // tslint:disable:no-console
  12. runApolloCodegen([
  13. 'introspect-schema',
  14. API_URL,
  15. '--add-typename',
  16. `--output ${SCHEMA_DUMP}`,
  17. ])
  18. .then(() => {
  19. console.log('Generated schema dump...');
  20. return runApolloCodegen([
  21. 'generate',
  22. './src/app/common/queries/**/*.ts',
  23. `--schema ${SCHEMA_DUMP}`,
  24. '--target typescript',
  25. '--output ./src/app/common/types/gql-generated-types.ts',
  26. ]);
  27. })
  28. .then(() => {
  29. console.log('Generated TypeScript definitions!');
  30. })
  31. .then(() => {
  32. rimraf(SCHEMA_DUMP, (err) => {
  33. if (err) {
  34. console.log('Could not delete schema dump');
  35. }
  36. console.log('Deleted schema dump');
  37. });
  38. })
  39. .catch(() => {
  40. console.log('Could not generate types!');
  41. process.exitCode = 1;
  42. });
  43. /**
  44. * Run the apollo-codegen script and wrap in a Promise.
  45. */
  46. function runApolloCodegen(args: string[]): Promise<any> {
  47. return new Promise((resolve, reject) => {
  48. const cp = spawn('yarn', ['apollo-codegen', ...args], { shell: true });
  49. cp.on('error', reject);
  50. cp.stdout.on('data', (data) => {
  51. if (4 < data.length) {
  52. console.log(`${data}`);
  53. }
  54. });
  55. cp.stderr.on('data', data => {
  56. if (4 < data.length) {
  57. console.log(`${data}`);
  58. }
  59. });
  60. cp.on('close', code => {
  61. if (code !== 0) {
  62. reject(code);
  63. }
  64. resolve(code);
  65. });
  66. });
  67. }