generate-graphql-types.ts 9.6 KB

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