generate-graphql-types.ts 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import fs from 'fs';
  2. import { buildClientSchema, graphqlSync, introspectionQuery } from 'graphql';
  3. import { generate } from 'graphql-code-generator';
  4. import { TypeScriptNamingConventionMap } from 'graphql-codegen-typescript-common';
  5. import { mergeSchemas } from 'graphql-tools';
  6. import path from 'path';
  7. import { ADMIN_API_PATH, API_PORT, SHOP_API_PATH } from '../../packages/common/src/shared-constants';
  8. import { downloadIntrospectionSchema } from './download-introspection-schema';
  9. const CLIENT_QUERY_FILES = path.join(__dirname, '../../admin-ui/src/app/data/definitions/**/*.ts');
  10. const ADMIN_SCHEMA_OUTPUT_FILE = path.join(__dirname, '../../schema-admin.json');
  11. const SHOP_SCHEMA_OUTPUT_FILE = path.join(__dirname, '../../schema-shop.json');
  12. // tslint:disable:no-console
  13. Promise.all([
  14. downloadIntrospectionSchema(ADMIN_API_PATH, ADMIN_SCHEMA_OUTPUT_FILE),
  15. downloadIntrospectionSchema(SHOP_API_PATH, SHOP_SCHEMA_OUTPUT_FILE),
  16. ])
  17. .then(([adminSchemaSuccess, shopSchemaSuccess]) => {
  18. if (!adminSchemaSuccess || !shopSchemaSuccess) {
  19. console.log('Attempting to generate types from existing schema json files...');
  20. }
  21. const adminSchemaJson = JSON.parse(fs.readFileSync(ADMIN_SCHEMA_OUTPUT_FILE, 'utf-8'));
  22. const shopSchemaJson = JSON.parse(fs.readFileSync(SHOP_SCHEMA_OUTPUT_FILE, 'utf-8'));
  23. const adminSchema = buildClientSchema(adminSchemaJson.data);
  24. const shopSchema = buildClientSchema(shopSchemaJson.data);
  25. const combinedSchemas = mergeSchemas({ schemas: [adminSchema, shopSchema]});
  26. const combinedJson = graphqlSync(combinedSchemas, introspectionQuery).data;
  27. fs.writeFileSync(path.join(__dirname, '../../schema.json'), JSON.stringify(combinedJson, null, 2));
  28. const namingConventionConfig = {
  29. namingConvention: {
  30. enumValues: 'keep',
  31. } as TypeScriptNamingConventionMap,
  32. };
  33. return generate({
  34. overwrite: true,
  35. generates: {
  36. [path.join(__dirname, '../../packages/common/src/generated-types.ts')]: {
  37. schema: [ADMIN_SCHEMA_OUTPUT_FILE, path.join(__dirname, 'client-schema.ts')],
  38. documents: CLIENT_QUERY_FILES,
  39. plugins: [
  40. { add: '// tslint:disable' },
  41. 'time',
  42. 'typescript-common',
  43. 'typescript-client',
  44. 'typescript-server'],
  45. config: namingConventionConfig,
  46. },
  47. [path.join(__dirname, '../../packages/common/src/generated-shop-types.ts')]: {
  48. schema: [SHOP_SCHEMA_OUTPUT_FILE],
  49. plugins: [
  50. { add: '// tslint:disable' },
  51. 'time',
  52. 'typescript-common',
  53. 'typescript-server'],
  54. config: namingConventionConfig,
  55. },
  56. },
  57. });
  58. })
  59. .then(
  60. result => {
  61. process.exit(0);
  62. },
  63. err => {
  64. console.error(err);
  65. process.exit(1);
  66. },
  67. );