generate-graphql-types.ts 9.6 KB

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