@common-stack/generate-plugin 5.0.6-alpha.2 → 5.0.6-alpha.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (142) hide show
  1. package/.eslintrc.json +1 -1
  2. package/CHANGELOG.md +8 -0
  3. package/executors.json +14 -0
  4. package/generators.json +15 -0
  5. package/lib/executors/sort-package-json/executor.cjs +46 -0
  6. package/lib/executors/sort-package-json/executor.cjs.map +1 -0
  7. package/lib/executors/sort-package-json/executor.d.ts +4 -0
  8. package/lib/executors/sort-package-json/executor.mjs +46 -0
  9. package/lib/executors/sort-package-json/executor.mjs.map +1 -0
  10. package/lib/executors/sort-package-json/executor.spec.d.ts +1 -0
  11. package/lib/executors/sort-package-json/schema.json +9 -0
  12. package/lib/executors/update-deploy-version/executor.cjs +22 -0
  13. package/lib/executors/update-deploy-version/executor.cjs.map +1 -0
  14. package/lib/executors/update-deploy-version/executor.d.ts +4 -0
  15. package/lib/executors/update-deploy-version/executor.mjs +22 -0
  16. package/lib/executors/update-deploy-version/executor.mjs.map +1 -0
  17. package/lib/executors/update-deploy-version/executor.spec.d.ts +1 -0
  18. package/lib/executors/update-deploy-version/schema.json +14 -0
  19. package/lib/generators/add-backend/files/__tests__/test.ts.template +2 -3
  20. package/lib/generators/add-backend/files/package.json +12 -5
  21. package/lib/generators/add-backend/files/tsconfig.json +1 -1
  22. package/lib/generators/add-backend/files/webpack.config.js +6 -10
  23. package/lib/generators/add-browser-package/files/package.json +1 -1
  24. package/lib/generators/add-client-package/files/CHANGELOG.md +807 -0
  25. package/lib/generators/add-client-package/files/LICENSE +674 -0
  26. package/lib/generators/add-client-package/files/jest.config.js +13 -0
  27. package/lib/generators/add-client-package/files/package.json +31 -0
  28. package/lib/generators/add-client-package/files/rollup.config.mjs +29 -0
  29. package/lib/generators/add-client-package/files/src/components/index.tsx.template +1 -0
  30. package/lib/generators/add-client-package/files/src/index.ts.template +1 -0
  31. package/lib/generators/add-client-package/files/tsconfig.json +27 -0
  32. package/lib/generators/add-client-package/files/webpack.config.js +72 -0
  33. package/lib/generators/add-client-package/generator.cjs +19 -0
  34. package/lib/generators/add-client-package/generator.cjs.map +1 -0
  35. package/lib/generators/add-client-package/generator.d.ts +4 -0
  36. package/lib/generators/add-client-package/generator.mjs +19 -0
  37. package/lib/generators/add-client-package/generator.mjs.map +1 -0
  38. package/lib/generators/add-client-package/generator.spec.d.ts +1 -0
  39. package/lib/generators/add-client-package/schema.json +19 -0
  40. package/lib/generators/add-core-package/files/CHANGELOG.md +1076 -0
  41. package/lib/generators/add-core-package/files/LICENSE +39 -0
  42. package/lib/generators/add-core-package/files/jest.config.js +3 -0
  43. package/lib/generators/add-core-package/files/package.json +31 -0
  44. package/lib/generators/add-core-package/files/rollup.config.mjs +65 -0
  45. package/lib/generators/add-core-package/files/src/constants/index.ts.template +1 -0
  46. package/lib/generators/add-core-package/files/src/constants/types.ts.template +3 -0
  47. package/lib/generators/add-core-package/files/src/index.ts.template +2 -0
  48. package/lib/generators/add-core-package/files/src/types/index.ts.template +1 -0
  49. package/lib/generators/add-core-package/files/src/types/types.ts.template +17 -0
  50. package/lib/generators/add-core-package/files/tsconfig.json +22 -0
  51. package/lib/generators/add-core-package/files/webpack.config.js +53 -0
  52. package/lib/generators/add-core-package/generator.cjs +19 -0
  53. package/lib/generators/add-core-package/generator.cjs.map +1 -0
  54. package/lib/generators/add-core-package/generator.d.ts +4 -0
  55. package/lib/generators/add-core-package/generator.mjs +19 -0
  56. package/lib/generators/add-core-package/generator.mjs.map +1 -0
  57. package/lib/generators/add-core-package/generator.spec.d.ts +1 -0
  58. package/lib/generators/add-core-package/schema.json +19 -0
  59. package/lib/generators/add-frontend/templates/package.json +9 -8
  60. package/lib/generators/add-fullstack/files/package.json +1 -1
  61. package/lib/generators/add-moleculer/files/package.json +5 -5
  62. package/lib/generators/add-server-package/files/CHANGELOG.md +2599 -0
  63. package/lib/generators/add-server-package/files/LICENSE +674 -0
  64. package/lib/generators/add-server-package/files/jest.config.js +32 -0
  65. package/lib/generators/add-server-package/files/package.json +78 -0
  66. package/lib/generators/add-server-package/files/rollup.config.mjs +30 -0
  67. package/lib/generators/add-server-package/files/src/constants/constants.ts.template +62 -0
  68. package/lib/generators/add-server-package/files/src/constants/index.ts.template +1 -0
  69. package/lib/generators/add-server-package/files/src/constants/types.ts.template +21 -0
  70. package/lib/generators/add-server-package/files/src/index.ts.template +6 -0
  71. package/lib/generators/add-server-package/files/src/module.ts.template +6 -0
  72. package/lib/generators/add-server-package/files/tsconfig.json +27 -0
  73. package/lib/generators/add-server-package/generator.cjs +19 -0
  74. package/lib/generators/add-server-package/generator.cjs.map +1 -0
  75. package/lib/generators/add-server-package/generator.d.ts +4 -0
  76. package/lib/generators/add-server-package/generator.mjs +19 -0
  77. package/lib/generators/add-server-package/generator.mjs.map +1 -0
  78. package/lib/generators/add-server-package/generator.spec.d.ts +1 -0
  79. package/lib/generators/add-server-package/schema.json +19 -0
  80. package/lib/index.cjs +1 -1
  81. package/lib/index.d.ts +5 -0
  82. package/lib/index.mjs +1 -1
  83. package/package.json +3 -2
  84. package/project.json +12 -1
  85. package/rollup.config.mjs +8 -0
  86. package/src/executors/sort-package-json/executor.spec.ts +18 -0
  87. package/src/executors/sort-package-json/executor.ts +53 -0
  88. package/src/executors/sort-package-json/schema.d.ts +1 -0
  89. package/src/executors/sort-package-json/schema.json +9 -0
  90. package/src/executors/update-deploy-version/executor.spec.ts +18 -0
  91. package/src/executors/update-deploy-version/executor.ts +36 -0
  92. package/src/executors/update-deploy-version/schema.d.ts +3 -0
  93. package/src/executors/update-deploy-version/schema.json +14 -0
  94. package/src/generators/add-client-package/generator.spec.ts +20 -0
  95. package/src/generators/add-client-package/generator.ts +23 -0
  96. package/src/generators/add-client-package/schema.d.ts +4 -0
  97. package/src/generators/add-client-package/schema.json +19 -0
  98. package/src/generators/add-core-package/generator.spec.ts +20 -0
  99. package/src/generators/add-core-package/generator.ts +23 -0
  100. package/src/generators/add-core-package/schema.d.ts +4 -0
  101. package/src/generators/add-core-package/schema.json +19 -0
  102. package/src/generators/add-fullstack/files/package.json +1 -1
  103. package/src/generators/add-moleculer/files/package.json +5 -5
  104. package/src/generators/add-server-package/generator.spec.ts +20 -0
  105. package/src/generators/add-server-package/generator.ts +23 -0
  106. package/src/generators/add-server-package/schema.d.ts +4 -0
  107. package/src/generators/add-server-package/schema.json +19 -0
  108. package/src/index.ts +5 -0
  109. package/lib/generators/add-backend/files/knexfile.js +0 -63
  110. package/lib/generators/add-backend/files/src/api/remote-config.ts.template +0 -11
  111. package/lib/generators/add-backend/files/src/api/resolver.ts.template +0 -15
  112. package/lib/generators/add-backend/files/src/api/scalar.ts.template +0 -16
  113. package/lib/generators/add-backend/files/src/api/schema-builder.ts.template +0 -189
  114. package/lib/generators/add-backend/files/src/api/utils.ts.template +0 -44
  115. package/lib/generators/add-backend/files/src/config/moleculer.config.ts.template +0 -228
  116. package/lib/generators/add-backend/files/src/connectors/connection-broker.ts.template +0 -80
  117. package/lib/generators/add-backend/files/src/connectors/graphql-pubsub-connector.ts.template +0 -43
  118. package/lib/generators/add-backend/files/src/connectors/mongo-connector.ts.template +0 -78
  119. package/lib/generators/add-backend/files/src/connectors/nats-connector.ts.template +0 -82
  120. package/lib/generators/add-backend/files/src/connectors/redis-connector.ts.template +0 -73
  121. package/lib/generators/add-backend/files/src/express-app.ts.template +0 -67
  122. package/lib/generators/add-backend/files/src/interfaces/index.ts.template +0 -1
  123. package/lib/generators/add-backend/files/src/interfaces/module-interface.ts.template +0 -16
  124. package/lib/generators/add-backend/files/src/main.spec.ts.template +0 -129
  125. package/lib/generators/add-backend/files/src/middleware/__tests__/cors.test.ts.template +0 -12
  126. package/lib/generators/add-backend/files/src/middleware/cors.ts.template +0 -31
  127. package/lib/generators/add-backend/files/src/middleware/error.ts.template +0 -63
  128. package/lib/generators/add-backend/files/src/middleware/moleculer-inter-namespace.ts.template +0 -60
  129. package/lib/generators/add-backend/files/src/middleware/persistedQuery.ts.template +0 -40
  130. package/lib/generators/add-backend/files/src/middleware/sentry.ts.template +0 -9
  131. package/lib/generators/add-backend/files/src/middleware/services.ts.template +0 -16
  132. package/lib/generators/add-backend/files/src/middleware/tracer.ts.template +0 -24
  133. package/lib/generators/add-backend/files/src/modules/auth/schema/auth-schema.graphql +0 -25
  134. package/lib/generators/add-backend/files/src/server-setup/graphql-server.ts.template +0 -185
  135. package/lib/generators/add-backend/files/src/server-setup/graphql-subscription-server.ts.template +0 -113
  136. package/lib/generators/add-backend/files/src/server-setup/graphql-ws.ts.template +0 -158
  137. package/lib/generators/add-backend/files/src/server-setup/mongodb-migration-update.ts.template +0 -47
  138. package/lib/generators/add-backend/files/src/server-setup/utils.ts.template +0 -43
  139. package/lib/generators/add-backend/files/src/server-setup/websocket-multipath-update.ts.template +0 -88
  140. package/lib/generators/add-backend/files/src/stack-server.ts.template +0 -277
  141. package/lib/generators/add-backend/files/src/utils/migrations.ts.template +0 -32
  142. package/lib/generators/add-backend/files/uploads/3986781.ppt +0 -0
@@ -0,0 +1,4 @@
1
+ export interface AddClientPackageGeneratorSchema {
2
+ name: string;
3
+ directory: string;
4
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "AddClientPackage",
4
+ "title": "",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "",
10
+ "x-prompt": "What name would you like to use?"
11
+ },
12
+ "directory": {
13
+ "type": "string",
14
+ "description": "",
15
+ "x-prompt": "What directory would you like to create in?"
16
+ }
17
+ },
18
+ "required": ["name", "directory"]
19
+ }
@@ -0,0 +1,20 @@
1
+ import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
2
+ import { Tree, readProjectConfiguration } from '@nx/devkit';
3
+
4
+ import { addCorePackageGenerator } from './generator';
5
+ import { AddCorePackageGeneratorSchema } from './schema';
6
+
7
+ describe('add-core-package generator', () => {
8
+ let tree: Tree;
9
+ const options: AddCorePackageGeneratorSchema = { name: 'test', directory: 'lib' };
10
+
11
+ beforeEach(() => {
12
+ tree = createTreeWithEmptyWorkspace();
13
+ });
14
+
15
+ it('should run successfully', async () => {
16
+ await addCorePackageGenerator(tree, options);
17
+ const config = readProjectConfiguration(tree, 'test');
18
+ expect(config).toBeDefined();
19
+ });
20
+ });
@@ -0,0 +1,23 @@
1
+ import { addProjectConfiguration, formatFiles, generateFiles, Tree, updateJson } from '@nx/devkit';
2
+ import * as path from 'path';
3
+ import { AddCorePackageGeneratorSchema } from './schema';
4
+ import { isValid, getValid } from '../../utils';
5
+
6
+ export async function addCorePackageGenerator(tree: Tree, options: AddCorePackageGeneratorSchema) {
7
+ const projectName = getValid(options.name) ?? 'core-package';
8
+ const projectRoot = isValid(options.directory) ? `${getValid(options.directory)}/${projectName}` : projectName;
9
+ // addProjectConfiguration(tree, options.name, {
10
+ // root: projectRoot,
11
+ // projectType: 'library',
12
+ // sourceRoot: `${projectRoot}/src`,
13
+ // targets: {},
14
+ // });
15
+ generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options);
16
+ updateJson(tree, `${projectRoot}/package.json`, (packageJson) => {
17
+ packageJson['name'] = projectName;
18
+ return packageJson;
19
+ });
20
+ await formatFiles(tree);
21
+ }
22
+
23
+ export default addCorePackageGenerator;
@@ -0,0 +1,4 @@
1
+ export interface AddCorePackageGeneratorSchema {
2
+ name: string;
3
+ directory: string;
4
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "AddCorePackage",
4
+ "title": "",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "",
10
+ "x-prompt": "What name would you like to use?"
11
+ },
12
+ "directory": {
13
+ "type": "string",
14
+ "description": "",
15
+ "x-prompt": "What directory would you like to create in?"
16
+ }
17
+ },
18
+ "required": ["name", "directory"]
19
+ }
@@ -159,7 +159,7 @@
159
159
  "@babel/preset-typescript": "^7.18.6",
160
160
  "@babel/register": "^7.18.9",
161
161
  "@babel/runtime": "^7.20.1",
162
- "@common-stack/env-list-loader": "5.0.6-alpha.1",
162
+ "@common-stack/env-list-loader": "5.0.6-alpha.3",
163
163
  "@emotion/babel-plugin": "^11.11.0",
164
164
  "@graphql-codegen/add": "^5.0.2",
165
165
  "@graphql-codegen/cli": "^5.0.2",
@@ -28,11 +28,11 @@
28
28
  "@casl/ability": "^4.1.5",
29
29
  "@cdm-logger/client": "9.0.3",
30
30
  "@cdm-logger/server": "^9.0.3",
31
- "@common-stack/client-core": "5.0.6-alpha.1",
32
- "@common-stack/core": "5.0.6-alpha.1",
33
- "@common-stack/server-core": "5.0.6-alpha.1",
34
- "@common-stack/server-stack": "5.0.6-alpha.1",
35
- "@common-stack/store-mongo": "5.0.6-alpha.1",
31
+ "@common-stack/client-core": "5.0.6-alpha.3",
32
+ "@common-stack/core": "5.0.6-alpha.3",
33
+ "@common-stack/server-core": "5.0.6-alpha.3",
34
+ "@common-stack/server-stack": "5.0.6-alpha.3",
35
+ "@common-stack/store-mongo": "5.0.6-alpha.3",
36
36
  "@container-stack/mailing-api": "5.2.1-alpha.1",
37
37
  "app-root-path": "^3.0.0",
38
38
  "body-parser": "^1.19.0",
@@ -0,0 +1,20 @@
1
+ import { createTreeWithEmptyWorkspace } from '@nx/devkit/testing';
2
+ import { Tree, readProjectConfiguration } from '@nx/devkit';
3
+
4
+ import { addServerPackageGenerator } from './generator';
5
+ import { AddServerPackageGeneratorSchema } from './schema';
6
+
7
+ describe('add-server-package generator', () => {
8
+ let tree: Tree;
9
+ const options: AddServerPackageGeneratorSchema = { name: 'test', directory: 'lib' };
10
+
11
+ beforeEach(() => {
12
+ tree = createTreeWithEmptyWorkspace();
13
+ });
14
+
15
+ it('should run successfully', async () => {
16
+ await addServerPackageGenerator(tree, options);
17
+ const config = readProjectConfiguration(tree, 'test');
18
+ expect(config).toBeDefined();
19
+ });
20
+ });
@@ -0,0 +1,23 @@
1
+ import { addProjectConfiguration, formatFiles, generateFiles, Tree, updateJson } from '@nx/devkit';
2
+ import * as path from 'path';
3
+ import { AddServerPackageGeneratorSchema } from './schema';
4
+ import { isValid, getValid } from '../../utils';
5
+
6
+ export async function addServerPackageGenerator(tree: Tree, options: AddServerPackageGeneratorSchema) {
7
+ const projectName = getValid(options.name) ?? 'server-package';
8
+ const projectRoot = isValid(options.directory) ? `${getValid(options.directory)}/${projectName}` : projectName;
9
+ // addProjectConfiguration(tree, options.name, {
10
+ // root: projectRoot,
11
+ // projectType: 'library',
12
+ // sourceRoot: `${projectRoot}/src`,
13
+ // targets: {},
14
+ // });
15
+ generateFiles(tree, path.join(__dirname, 'files'), projectRoot, options);
16
+ updateJson(tree, `${projectRoot}/package.json`, (packageJson) => {
17
+ packageJson['name'] = projectName;
18
+ return packageJson;
19
+ });
20
+ await formatFiles(tree);
21
+ }
22
+
23
+ export default addServerPackageGenerator;
@@ -0,0 +1,4 @@
1
+ export interface AddServerPackageGeneratorSchema {
2
+ name: string;
3
+ directory: string;
4
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$schema": "https://json-schema.org/schema",
3
+ "$id": "AddServerPackage",
4
+ "title": "",
5
+ "type": "object",
6
+ "properties": {
7
+ "name": {
8
+ "type": "string",
9
+ "description": "",
10
+ "x-prompt": "What name would you like to use?"
11
+ },
12
+ "directory": {
13
+ "type": "string",
14
+ "description": "",
15
+ "x-prompt": "What directory would you like to create in?"
16
+ }
17
+ },
18
+ "required": ["name", "directory"]
19
+ }
package/src/index.ts CHANGED
@@ -3,3 +3,8 @@ export * from './generators/add-backend/generator';
3
3
  export * from './generators/add-fullstack/generator';
4
4
  export * from './generators/add-moleculer/generator';
5
5
  export * from './generators/add-browser-package/generator';
6
+ export * from './generators/add-client-package/generator';
7
+ export * from './generators/add-core-package/generator';
8
+ export * from './generators/add-server-package/generator';
9
+ export { default as updateDeployVersion } from './executors/update-deploy-version/executor';
10
+ export { default as sortPackageJson } from './executors/sort-package-json/executor';
@@ -1,63 +0,0 @@
1
- // Update with your config settings.
2
- var path = require('path');
3
- require('dotenv').config({ path: process.env.ENV_FILE });
4
-
5
- var connection = {
6
- host: process.env.DB_HOST,
7
- user: process.env.DB_USER,
8
- socketPath: process.env.DB_SOCKET_PATH,
9
- password: process.env.DB_PASSWORD,
10
- database: process.env.DB_DATABASE,
11
- multipleStatements: true,
12
- charset: 'utf8',
13
- };
14
- var DB_CLIENT = process.env.DB_TYPE || 'sqlite3';
15
-
16
- var migrations_path = path.dirname(require.resolve('@adminide-stack/store/lib/store/migrations/index'));
17
- var seeds_path = path.dirname(require.resolve('@adminide-stack/store/lib/store/seeds/index'));
18
- module.exports = {
19
-
20
- development: {
21
- client: 'sqlite3',
22
- connection: {
23
- filename: './dev-db.sqlite3'
24
- },
25
- seeds: {
26
- directory: seeds_path,
27
- },
28
- migrations: {
29
- directory: migrations_path,
30
- },
31
- useNullAsDefault: true,
32
- },
33
-
34
- test: {
35
- client: DB_CLIENT,
36
- connection: connection,
37
- pool: {
38
- min: 2,
39
- max: 10
40
- },
41
- seeds: {
42
- directory: seeds_path,
43
- },
44
- migrations: {
45
- directory: migrations_path,
46
- },
47
- useNullAsDefault: true,
48
- },
49
-
50
- production: {
51
- client: DB_CLIENT,
52
- connection: connection,
53
- pool: {
54
- min: 2,
55
- max: 200
56
- },
57
- migrations: {
58
- directory: migrations_path,
59
- },
60
- useNullAsDefault: true,
61
- }
62
-
63
- };
@@ -1,11 +0,0 @@
1
- interface ISchemaConfig {
2
- uri: string;
3
- wsUri: string;
4
- }
5
-
6
- export const remoteSchemaDetails: ISchemaConfig[] = [
7
- // {
8
- // uri: 'http://localhost:8085/graphql',
9
- // wsUri: 'ws://localhost:8085/graphql',
10
- // },
11
- ];
@@ -1,15 +0,0 @@
1
- import GraphQLJSON, { GraphQLJSONObject } from 'graphql-type-json';
2
- import { GraphQLDate, GraphQLTime, GraphQLDateTime } from 'graphql-iso-date';
3
- import { GraphQLAnyObject } from './scalar';
4
- import GraphQLURI from '@cdmbase/graphql-type-uri';
5
-
6
- export const resolvers = {
7
- AnyObject: GraphQLAnyObject,
8
- Date: GraphQLDate,
9
- Time: GraphQLTime,
10
- URI: GraphQLURI('URI'),
11
- URIInput: GraphQLURI('URIInput'),
12
- DateTime: GraphQLDateTime,
13
- JSON: GraphQLJSON,
14
- JSONObject: GraphQLJSONObject,
15
- };
@@ -1,16 +0,0 @@
1
- // add any scalar types
2
- import { GraphQLError, GraphQLScalarType, Kind } from 'graphql';
3
-
4
- // https://stackoverflow.com/questions/41557536/custom-map-keys-in-graphql-response
5
- export const GraphQLAnyObject = new GraphQLScalarType({
6
- name: 'AnyObject',
7
- description: 'Any JSON object. This type bypasses type checking.',
8
- serialize: (value) => value,
9
- parseValue: (value) => value,
10
- parseLiteral: (ast) => {
11
- if (ast.kind !== Kind.OBJECT) {
12
- throw new GraphQLError(`Query error: Can only parse object but got a: ${ast.kind}`, [ast]);
13
- }
14
- return ast.fields;
15
- },
16
- });
@@ -1,189 +0,0 @@
1
- /* eslint-disable class-methods-use-this */
2
- /* eslint-disable no-useless-constructor */
3
- /* eslint-disable import/no-extraneous-dependencies */
4
- import * as fs from 'fs';
5
- import { GraphQLSchema, OperationDefinitionNode } from 'graphql';
6
- import { stitchSchemas } from '@graphql-tools/stitch';
7
- import { makeExecutableSchema } from '@graphql-tools/schema';
8
- import { linkToExecutor } from '@graphql-tools/links';
9
- import { introspectSchema, wrapSchema } from '@graphql-tools/wrap';
10
- // import { transformSchema } from '@graphql-tools/delegate';
11
- import * as ws from 'ws';
12
- import { getMainDefinition } from '@apollo/client/utilities';
13
- import { WebSocketLink } from '@apollo/client/link/ws';
14
- import { split } from '@apollo/client/index.js';
15
- import { IGraphqlShieldRules, logger } from '@common-stack/server-core';
16
- import { HttpLink } from '@apollo/client/link/http';
17
- import * as fetch from 'isomorphic-fetch';
18
- import { CdmLogger } from '@cdm-logger/core';
19
- import { shield } from 'graphql-shield';
20
- import { applyMiddleware } from 'graphql-middleware';
21
- import { remoteSchemaDetails } from './remote-config';
22
- import rootSchemaDef from './root-schema.graphqls';
23
- import { resolvers as rootResolver } from './resolver';
24
- import { attachDirectiveResolvers } from './utils';
25
-
26
- interface IGraphqlOptions {
27
- schema: string | string[];
28
- resolvers: any;
29
- directives: any[];
30
- directiveResolvers: { [key: string]: any };
31
- middlewares: any[];
32
- rules?: IGraphqlShieldRules;
33
- logger: CdmLogger.ILogger;
34
- }
35
- export class GatewaySchemaBuilder {
36
- constructor(private options: IGraphqlOptions) {}
37
-
38
- public async build(): Promise<GraphQLSchema> {
39
- let gatewaySchema;
40
- let ownSchema;
41
- try {
42
- ownSchema = this.createOwnSchema();
43
- const remoteSchema = await this.load();
44
- // techSchema = this.patchSchema(techSchema, 'TechService');
45
-
46
- gatewaySchema = stitchSchemas({
47
- subschemas: [ownSchema],
48
- });
49
-
50
- // Apply middleware to the schema
51
- if (this.options.middlewares && this.options.middlewares.length > 0) {
52
- gatewaySchema = applyMiddleware(
53
- gatewaySchema,
54
- ...this.options.middlewares,
55
- shield(this.options.rules || {}, {
56
- allowExternalErrors: true,
57
- }),
58
- );
59
- }
60
- // TODO after updating graphql-tools to v8
61
- // addErrorLoggingToSchema(schema, { log: (e) => logger.error(e as Error) });
62
- } catch (err) {
63
- logger.error('[Graphql Schema Errors] when building schema:', err.message);
64
- gatewaySchema = ownSchema;
65
- }
66
-
67
- return gatewaySchema;
68
- }
69
-
70
- private async load() {
71
- const schemas = [];
72
- // eslint-disable-next-line no-plusplus
73
- for (let i = 0; i < remoteSchemaDetails.length; i++) {
74
- // eslint-disable-next-line no-await-in-loop
75
- const schema = await this.loadRemoteSchema(remoteSchemaDetails[i]);
76
- schemas.push(schema);
77
- }
78
- return schemas;
79
- }
80
-
81
- private async createRemoteSchema(service: string, iteration?: number): Promise<GraphQLSchema> {
82
- logger.info('Fetch service [%s] iteration [%s]', service, iteration);
83
- const services = remoteSchemaDetails;
84
- if (!services.length) {
85
- console.warn(`Service ${services} is undefined`);
86
- if (iteration && iteration > 2) {
87
- return Promise.reject(`tried upto ${iteration} attempts, now failing...`);
88
- }
89
- return new Promise<GraphQLSchema>((resolve, reject) => {
90
- const timeout = iteration ? 1000 * iteration : 1000;
91
- logger.info('Wait for service startup %s', timeout);
92
- setTimeout(() => {
93
- this.createRemoteSchema(service, iteration ? iteration + 1 : 1)
94
- .then(resolve)
95
- .catch(reject);
96
- }, timeout);
97
- });
98
- }
99
- // instead need to loop it
100
- // https://github.com/j-colter/graphql-gateway/blob/9c64d90a74727d2002d10b06f47e1f4a316070fc/src/schema.js#L50
101
- const url = services[0].uri;
102
- logger.info('fetch service [%s]', url);
103
- // 1. Create apollo Link that's connected to the underlying GraphQL API
104
- const link = new HttpLink({ uri: url, fetch });
105
- const executor: any = linkToExecutor(link);
106
- // 2. Retrieve schema definition of the underlying GraphQL API
107
- const remoteSchema = await introspectSchema(link as any);
108
-
109
- // 3. Create the executable schema based on schema definition and Apollo Link
110
- return wrapSchema({
111
- schema: remoteSchema,
112
- executor,
113
- });
114
- }
115
-
116
- private async loadRemoteSchema({ uri, wsUri }) {
117
- try {
118
- const httpLink = new HttpLink({ uri, fetch });
119
- let link = null;
120
-
121
- if (wsUri) {
122
- const wsLink = new WebSocketLink({
123
- uri: wsUri,
124
- options: {
125
- reconnect: true,
126
- },
127
- webSocketImpl: ws,
128
- });
129
- link = split(
130
- // split based on operatino type
131
- ({ query }) => {
132
- const { kind, operation } = getMainDefinition(query) as OperationDefinitionNode;
133
- return kind === 'OperationDefinition' && operation === 'subscription';
134
- },
135
- wsLink,
136
- httpLink,
137
- );
138
- } else {
139
- link = httpLink;
140
- }
141
- const executor: any = linkToExecutor(link);
142
- const remoteSchema = await introspectSchema(link);
143
- const executableSchema = wrapSchema({
144
- schema: remoteSchema,
145
- executor,
146
- });
147
- return executableSchema;
148
- } catch (err) {
149
- this.options.logger.error('fetching schema error: ', err);
150
- return {};
151
- }
152
- }
153
-
154
- // disabled after updating to apollo-client to v3 and graphql-tools to v8
155
- // private patchSchema(schema: GraphQLSchema, systemName: string) {
156
- // return transformSchema(schema, [
157
- // new RenameTypes((name: string) => (name === 'StatusInfo' ? `${systemName}StatusInfo` : undefined)),
158
- // new RenameRootFields((_operation: string, name: string) =>
159
- // name === 'status'
160
- // ? `${systemName.substring(0, 1).toLowerCase()}${systemName.substring(1)}Status`
161
- // : name,
162
- // ),
163
- // ]);
164
- // }
165
-
166
- private createOwnSchema(): GraphQLSchema {
167
- const typeDefs = [rootSchemaDef, this.options.schema].join('\n');
168
- if (__DEV__) {
169
- import('../modules/module').then(({ ExternalModules }) => {
170
- const externalSchema = ExternalModules?.schemas || ``;
171
- const writeData = `${externalSchema}`;
172
- fs.writeFileSync('./generated-schema.graphql', writeData);
173
- });
174
- }
175
- let mergedSchema = makeExecutableSchema({
176
- resolvers: [rootResolver, this.options.resolvers],
177
- typeDefs,
178
- resolverValidationOptions: {
179
- requireResolversForResolveType: 'warn',
180
- },
181
- });
182
- // mergedSchema = this.options.directives.reduce((curSchema,transform) => transform(curSchema), mergedSchema);
183
- if (this.options.directiveResolvers && Object.keys(this.options.directiveResolvers).length !== 0) {
184
- this.options.logger.warn('directiveResolvers deprecated replaced with directives');
185
- mergedSchema = attachDirectiveResolvers(mergedSchema, this.options.directiveResolvers);
186
- }
187
- return mergedSchema;
188
- }
189
- }
@@ -1,44 +0,0 @@
1
- import { defaultFieldResolver, GraphQLSchema } from 'graphql';
2
- import { mapSchema, MapperKind, getDirectives } from '@graphql-tools/utils';
3
-
4
- export function attachDirectiveResolvers(
5
- schema: GraphQLSchema,
6
- directiveResolvers: {[key: string]: Function},
7
- ): GraphQLSchema {
8
- // ... argument validation ...
9
-
10
- return mapSchema(schema, {
11
- [MapperKind.OBJECT_FIELD]: (fieldConfig) => {
12
- const newFieldConfig = { ...fieldConfig };
13
-
14
- const directives = getDirectives(schema, fieldConfig);
15
- for (const directive of directives) {
16
- const directiveName = directive.name;
17
- if (directiveResolvers[directiveName]) {
18
- const resolver = directiveResolvers[directiveName];
19
- const originalResolver =
20
- newFieldConfig.resolve != null ? newFieldConfig.resolve : defaultFieldResolver;
21
- const directiveArgs = directive.args;
22
- newFieldConfig.resolve = (source, originalArgs, context, info) => {
23
- return resolver(
24
- () =>
25
- new Promise((resolve, reject) => {
26
- const result = originalResolver(source, originalArgs, context, info);
27
- if (result instanceof Error) {
28
- reject(result);
29
- }
30
- resolve(result);
31
- }),
32
- source,
33
- directiveArgs,
34
- context,
35
- info,
36
- );
37
- };
38
- }
39
- }
40
-
41
- return newFieldConfig;
42
- },
43
- });
44
- }