generate-graphql-types.ts 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. import { generate } from '@graphql-codegen/cli';
  2. import { Types } from '@graphql-codegen/plugin-helpers';
  3. import fs from 'fs';
  4. import { buildClientSchema } from 'graphql';
  5. import path from 'path';
  6. import { ADMIN_API_PATH, SHOP_API_PATH } from '../../packages/common/src/shared-constants';
  7. import { downloadIntrospectionSchema } from './download-introspection-schema';
  8. const CLIENT_QUERY_FILES = [
  9. path.join(__dirname, '../../packages/admin-ui/src/lib/core/src/data/definitions/**/*.ts'),
  10. path.join(__dirname, '../../packages/admin-ui/src/lib/**/*.ts'),
  11. ];
  12. const specFileToIgnore = [
  13. 'import.e2e-spec',
  14. 'plugin.e2e-spec',
  15. 'shop-definitions',
  16. 'custom-fields.e2e-spec',
  17. 'custom-field-relations.e2e-spec',
  18. 'custom-field-struct.e2e-spec',
  19. 'custom-field-permissions.e2e-spec',
  20. 'order-item-price-calculation-strategy.e2e-spec',
  21. 'list-query-builder.e2e-spec',
  22. 'shop-order.e2e-spec',
  23. 'database-transactions.e2e-spec',
  24. 'custom-permissions.e2e-spec',
  25. 'parallel-transactions.e2e-spec',
  26. 'order-merge.e2e-spec',
  27. 'entity-hydrator.e2e-spec',
  28. 'relations-decorator.e2e-spec',
  29. 'active-order-strategy.e2e-spec',
  30. 'error-handler-strategy.e2e-spec',
  31. 'order-multi-vendor.e2e-spec',
  32. 'auth.e2e-spec',
  33. ];
  34. const E2E_ADMIN_QUERY_FILES = path.join(
  35. __dirname,
  36. `../../packages/core/e2e/**/!(${specFileToIgnore.join('|')}).ts`,
  37. );
  38. const E2E_SHOP_QUERY_FILES = [path.join(__dirname, '../../packages/core/e2e/graphql/shop-definitions.ts')];
  39. const E2E_ELASTICSEARCH_PLUGIN_QUERY_FILES = path.join(
  40. __dirname,
  41. '../../packages/elasticsearch-plugin/e2e/**/*.ts',
  42. );
  43. const E2E_ASSET_SERVER_PLUGIN_QUERY_FILES = path.join(
  44. __dirname,
  45. '../../packages/asset-server-plugin/e2e/**/*.ts',
  46. );
  47. const ADMIN_SCHEMA_OUTPUT_FILE = path.join(__dirname, '../../schema-admin.json');
  48. const SHOP_SCHEMA_OUTPUT_FILE = path.join(__dirname, '../../schema-shop.json');
  49. /* eslint-disable no-console */
  50. Promise.all([
  51. downloadIntrospectionSchema(ADMIN_API_PATH, ADMIN_SCHEMA_OUTPUT_FILE),
  52. downloadIntrospectionSchema(SHOP_API_PATH, SHOP_SCHEMA_OUTPUT_FILE),
  53. ])
  54. .then(([adminSchemaSuccess, shopSchemaSuccess]) => {
  55. if (!adminSchemaSuccess || !shopSchemaSuccess) {
  56. console.log('Attempting to generate types from existing schema json files...');
  57. }
  58. const adminSchemaJson = JSON.parse(fs.readFileSync(ADMIN_SCHEMA_OUTPUT_FILE, 'utf-8'));
  59. const shopSchemaJson = JSON.parse(fs.readFileSync(SHOP_SCHEMA_OUTPUT_FILE, 'utf-8'));
  60. const adminSchema = buildClientSchema(adminSchemaJson.data);
  61. const shopSchema = buildClientSchema(shopSchemaJson.data);
  62. const config = {
  63. namingConvention: {
  64. enumValues: 'keep',
  65. },
  66. strict: true,
  67. scalars: {
  68. Money: 'number',
  69. },
  70. };
  71. const e2eConfig = {
  72. ...config,
  73. skipTypename: true,
  74. };
  75. const disableEsLintPlugin = { add: { content: '/* eslint-disable */' } };
  76. const graphQlErrorsPlugin = path.join(__dirname, './plugins/graphql-errors-plugin.js');
  77. const commonPlugins = [disableEsLintPlugin, 'typescript'];
  78. const clientPlugins = [...commonPlugins, 'typescript-operations', 'typed-document-node'];
  79. const codegenConfig: Types.Config = {
  80. overwrite: true,
  81. generates: {
  82. [path.join(
  83. __dirname,
  84. '../../packages/core/src/common/error/generated-graphql-admin-errors.ts',
  85. )]: {
  86. schema: [ADMIN_SCHEMA_OUTPUT_FILE],
  87. plugins: [disableEsLintPlugin, graphQlErrorsPlugin],
  88. },
  89. [path.join(
  90. __dirname,
  91. '../../packages/core/src/common/error/generated-graphql-shop-errors.ts',
  92. )]: {
  93. schema: [SHOP_SCHEMA_OUTPUT_FILE],
  94. plugins: [disableEsLintPlugin, graphQlErrorsPlugin],
  95. },
  96. [path.join(__dirname, '../../packages/core/e2e/graphql/generated-e2e-admin-types.ts')]: {
  97. schema: [ADMIN_SCHEMA_OUTPUT_FILE],
  98. documents: E2E_ADMIN_QUERY_FILES,
  99. plugins: clientPlugins,
  100. config: e2eConfig,
  101. },
  102. [path.join(__dirname, '../../packages/core/e2e/graphql/generated-e2e-shop-types.ts')]: {
  103. schema: [SHOP_SCHEMA_OUTPUT_FILE],
  104. documents: E2E_SHOP_QUERY_FILES,
  105. plugins: clientPlugins,
  106. config: e2eConfig,
  107. },
  108. [path.join(
  109. __dirname,
  110. '../../packages/elasticsearch-plugin/e2e/graphql/generated-e2e-elasticsearch-plugin-types.ts',
  111. )]: {
  112. schema: [ADMIN_SCHEMA_OUTPUT_FILE],
  113. documents: E2E_ELASTICSEARCH_PLUGIN_QUERY_FILES,
  114. plugins: clientPlugins,
  115. config: e2eConfig,
  116. },
  117. [path.join(
  118. __dirname,
  119. '../../packages/asset-server-plugin/e2e/graphql/generated-e2e-asset-server-plugin-types.ts',
  120. )]: {
  121. schema: [ADMIN_SCHEMA_OUTPUT_FILE],
  122. documents: E2E_ASSET_SERVER_PLUGIN_QUERY_FILES,
  123. plugins: clientPlugins,
  124. config: e2eConfig,
  125. },
  126. [path.join(__dirname, '../../packages/admin-ui/src/lib/core/src/common/generated-types.ts')]:
  127. {
  128. schema: [ADMIN_SCHEMA_OUTPUT_FILE, path.join(__dirname, 'client-schema.ts')],
  129. documents: CLIENT_QUERY_FILES,
  130. plugins: clientPlugins,
  131. config: {
  132. ...config,
  133. skipTypeNameForRoot: true,
  134. },
  135. },
  136. [path.join(
  137. __dirname,
  138. '../../packages/admin-ui/src/lib/core/src/common/introspection-result.ts',
  139. )]: {
  140. schema: [ADMIN_SCHEMA_OUTPUT_FILE, path.join(__dirname, 'client-schema.ts')],
  141. documents: CLIENT_QUERY_FILES,
  142. plugins: [disableEsLintPlugin, 'fragment-matcher'],
  143. config: { ...config, apolloClientVersion: 3 },
  144. },
  145. [path.join(__dirname, '../../packages/common/src/generated-types.ts')]: {
  146. schema: [ADMIN_SCHEMA_OUTPUT_FILE],
  147. plugins: commonPlugins,
  148. config: {
  149. ...config,
  150. scalars: {
  151. ...(config.scalars ?? {}),
  152. ID: 'string | number',
  153. },
  154. maybeValue: 'T',
  155. },
  156. },
  157. [path.join(__dirname, '../../packages/common/src/generated-shop-types.ts')]: {
  158. schema: [SHOP_SCHEMA_OUTPUT_FILE],
  159. plugins: commonPlugins,
  160. config: {
  161. ...config,
  162. scalars: {
  163. ...(config.scalars ?? {}),
  164. ID: 'string | number',
  165. },
  166. maybeValue: 'T',
  167. },
  168. },
  169. [path.join(__dirname, '../../packages/payments-plugin/e2e/graphql/generated-admin-types.ts')]:
  170. {
  171. schema: [
  172. ADMIN_SCHEMA_OUTPUT_FILE,
  173. path.join(
  174. __dirname,
  175. '../../packages/payments-plugin/src/mollie/api-extensions.ts',
  176. ),
  177. ],
  178. documents: path.join(
  179. __dirname,
  180. '../../packages/payments-plugin/e2e/graphql/admin-queries.ts',
  181. ),
  182. plugins: clientPlugins,
  183. config: e2eConfig,
  184. },
  185. [path.join(__dirname, '../../packages/payments-plugin/e2e/graphql/generated-shop-types.ts')]:
  186. {
  187. schema: [
  188. SHOP_SCHEMA_OUTPUT_FILE,
  189. path.join(
  190. __dirname,
  191. '../../packages/payments-plugin/src/mollie/api-extensions.ts',
  192. ),
  193. ],
  194. documents: path.join(
  195. __dirname,
  196. '../../packages/payments-plugin/e2e/graphql/shop-queries.ts',
  197. ),
  198. plugins: clientPlugins,
  199. config: e2eConfig,
  200. },
  201. [path.join(
  202. __dirname,
  203. '../../packages/payments-plugin/src/mollie/graphql/generated-shop-types.ts',
  204. )]: {
  205. schema: [
  206. SHOP_SCHEMA_OUTPUT_FILE,
  207. path.join(__dirname, '../../packages/payments-plugin/src/mollie/api-extensions.ts'),
  208. ],
  209. plugins: clientPlugins,
  210. config,
  211. },
  212. },
  213. };
  214. return generate(codegenConfig);
  215. })
  216. .then(
  217. result => {
  218. process.exit(0);
  219. },
  220. err => {
  221. console.error(err);
  222. process.exit(1);
  223. },
  224. );