@common-stack/generate-plugin 5.0.6-alpha.3 → 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.
- package/.eslintrc.json +1 -1
- package/CHANGELOG.md +4 -0
- package/executors.json +14 -0
- package/generators.json +15 -0
- package/lib/executors/sort-package-json/executor.cjs +46 -0
- package/lib/executors/sort-package-json/executor.cjs.map +1 -0
- package/lib/executors/sort-package-json/executor.d.ts +4 -0
- package/lib/executors/sort-package-json/executor.mjs +46 -0
- package/lib/executors/sort-package-json/executor.mjs.map +1 -0
- package/lib/executors/sort-package-json/executor.spec.d.ts +1 -0
- package/lib/executors/sort-package-json/schema.json +9 -0
- package/lib/executors/update-deploy-version/executor.cjs +22 -0
- package/lib/executors/update-deploy-version/executor.cjs.map +1 -0
- package/lib/executors/update-deploy-version/executor.d.ts +4 -0
- package/lib/executors/update-deploy-version/executor.mjs +22 -0
- package/lib/executors/update-deploy-version/executor.mjs.map +1 -0
- package/lib/executors/update-deploy-version/executor.spec.d.ts +1 -0
- package/lib/executors/update-deploy-version/schema.json +14 -0
- package/lib/generators/add-backend/files/package.json +5 -5
- package/lib/generators/add-backend/files/tsconfig.json +1 -1
- package/lib/generators/add-backend/files/webpack.config.js +6 -10
- package/lib/generators/add-browser-package/files/package.json +1 -1
- package/lib/generators/add-client-package/files/CHANGELOG.md +807 -0
- package/lib/generators/add-client-package/files/LICENSE +674 -0
- package/lib/generators/add-client-package/files/jest.config.js +13 -0
- package/lib/generators/add-client-package/files/package.json +31 -0
- package/lib/generators/add-client-package/files/rollup.config.mjs +29 -0
- package/lib/generators/add-client-package/files/src/components/index.tsx.template +1 -0
- package/lib/generators/add-client-package/files/src/index.ts.template +1 -0
- package/lib/generators/add-client-package/files/tsconfig.json +27 -0
- package/lib/generators/add-client-package/files/webpack.config.js +72 -0
- package/lib/generators/add-client-package/generator.cjs +19 -0
- package/lib/generators/add-client-package/generator.cjs.map +1 -0
- package/lib/generators/add-client-package/generator.d.ts +4 -0
- package/lib/generators/add-client-package/generator.mjs +19 -0
- package/lib/generators/add-client-package/generator.mjs.map +1 -0
- package/lib/generators/add-client-package/generator.spec.d.ts +1 -0
- package/lib/generators/add-client-package/schema.json +19 -0
- package/lib/generators/add-core-package/files/CHANGELOG.md +1076 -0
- package/lib/generators/add-core-package/files/LICENSE +39 -0
- package/lib/generators/add-core-package/files/jest.config.js +3 -0
- package/lib/generators/add-core-package/files/package.json +31 -0
- package/lib/generators/add-core-package/files/rollup.config.mjs +65 -0
- package/lib/generators/add-core-package/files/src/constants/index.ts.template +1 -0
- package/lib/generators/add-core-package/files/src/constants/types.ts.template +3 -0
- package/lib/generators/add-core-package/files/src/index.ts.template +2 -0
- package/lib/generators/add-core-package/files/src/types/index.ts.template +1 -0
- package/lib/generators/add-core-package/files/src/types/types.ts.template +17 -0
- package/lib/generators/add-core-package/files/tsconfig.json +22 -0
- package/lib/generators/add-core-package/files/webpack.config.js +53 -0
- package/lib/generators/add-core-package/generator.cjs +19 -0
- package/lib/generators/add-core-package/generator.cjs.map +1 -0
- package/lib/generators/add-core-package/generator.d.ts +4 -0
- package/lib/generators/add-core-package/generator.mjs +19 -0
- package/lib/generators/add-core-package/generator.mjs.map +1 -0
- package/lib/generators/add-core-package/generator.spec.d.ts +1 -0
- package/lib/generators/add-core-package/schema.json +19 -0
- package/lib/generators/add-frontend/templates/package.json +8 -8
- package/lib/generators/add-fullstack/files/package.json +1 -1
- package/lib/generators/add-moleculer/files/package.json +5 -5
- package/lib/generators/add-server-package/files/CHANGELOG.md +2599 -0
- package/lib/generators/add-server-package/files/LICENSE +674 -0
- package/lib/generators/add-server-package/files/jest.config.js +32 -0
- package/lib/generators/add-server-package/files/package.json +78 -0
- package/lib/generators/add-server-package/files/rollup.config.mjs +30 -0
- package/lib/generators/add-server-package/files/src/constants/constants.ts.template +62 -0
- package/lib/generators/add-server-package/files/src/constants/index.ts.template +1 -0
- package/lib/generators/add-server-package/files/src/constants/types.ts.template +21 -0
- package/lib/generators/add-server-package/files/src/index.ts.template +6 -0
- package/lib/generators/add-server-package/files/src/module.ts.template +6 -0
- package/lib/generators/add-server-package/files/tsconfig.json +27 -0
- package/lib/generators/add-server-package/generator.cjs +19 -0
- package/lib/generators/add-server-package/generator.cjs.map +1 -0
- package/lib/generators/add-server-package/generator.d.ts +4 -0
- package/lib/generators/add-server-package/generator.mjs +19 -0
- package/lib/generators/add-server-package/generator.mjs.map +1 -0
- package/lib/generators/add-server-package/generator.spec.d.ts +1 -0
- package/lib/generators/add-server-package/schema.json +19 -0
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +5 -0
- package/lib/index.mjs +1 -1
- package/package.json +3 -2
- package/project.json +12 -1
- package/rollup.config.mjs +8 -0
- package/src/executors/sort-package-json/executor.spec.ts +18 -0
- package/src/executors/sort-package-json/executor.ts +53 -0
- package/src/executors/sort-package-json/schema.d.ts +1 -0
- package/src/executors/sort-package-json/schema.json +9 -0
- package/src/executors/update-deploy-version/executor.spec.ts +18 -0
- package/src/executors/update-deploy-version/executor.ts +36 -0
- package/src/executors/update-deploy-version/schema.d.ts +3 -0
- package/src/executors/update-deploy-version/schema.json +14 -0
- package/src/generators/add-client-package/generator.spec.ts +20 -0
- package/src/generators/add-client-package/generator.ts +23 -0
- package/src/generators/add-client-package/schema.d.ts +4 -0
- package/src/generators/add-client-package/schema.json +19 -0
- package/src/generators/add-core-package/generator.spec.ts +20 -0
- package/src/generators/add-core-package/generator.ts +23 -0
- package/src/generators/add-core-package/schema.d.ts +4 -0
- package/src/generators/add-core-package/schema.json +19 -0
- package/src/generators/add-fullstack/files/package.json +1 -1
- package/src/generators/add-moleculer/files/package.json +5 -5
- package/src/generators/add-server-package/generator.spec.ts +20 -0
- package/src/generators/add-server-package/generator.ts +23 -0
- package/src/generators/add-server-package/schema.d.ts +4 -0
- package/src/generators/add-server-package/schema.json +19 -0
- package/src/index.ts +5 -0
- package/lib/generators/add-backend/files/knexfile.js +0 -63
- package/lib/generators/add-backend/files/src/api/remote-config.ts.template +0 -11
- package/lib/generators/add-backend/files/src/api/resolver.ts.template +0 -15
- package/lib/generators/add-backend/files/src/api/scalar.ts.template +0 -16
- package/lib/generators/add-backend/files/src/api/schema-builder.ts.template +0 -189
- package/lib/generators/add-backend/files/src/api/utils.ts.template +0 -44
- package/lib/generators/add-backend/files/src/config/moleculer.config.ts.template +0 -228
- package/lib/generators/add-backend/files/src/connectors/connection-broker.ts.template +0 -80
- package/lib/generators/add-backend/files/src/connectors/graphql-pubsub-connector.ts.template +0 -43
- package/lib/generators/add-backend/files/src/connectors/mongo-connector.ts.template +0 -78
- package/lib/generators/add-backend/files/src/connectors/nats-connector.ts.template +0 -82
- package/lib/generators/add-backend/files/src/connectors/redis-connector.ts.template +0 -73
- package/lib/generators/add-backend/files/src/express-app.ts.template +0 -67
- package/lib/generators/add-backend/files/src/interfaces/index.ts.template +0 -1
- package/lib/generators/add-backend/files/src/interfaces/module-interface.ts.template +0 -16
- package/lib/generators/add-backend/files/src/main.spec.ts.template +0 -129
- package/lib/generators/add-backend/files/src/middleware/__tests__/cors.test.ts.template +0 -12
- package/lib/generators/add-backend/files/src/middleware/cors.ts.template +0 -31
- package/lib/generators/add-backend/files/src/middleware/error.ts.template +0 -63
- package/lib/generators/add-backend/files/src/middleware/moleculer-inter-namespace.ts.template +0 -60
- package/lib/generators/add-backend/files/src/middleware/persistedQuery.ts.template +0 -40
- package/lib/generators/add-backend/files/src/middleware/sentry.ts.template +0 -9
- package/lib/generators/add-backend/files/src/middleware/services.ts.template +0 -16
- package/lib/generators/add-backend/files/src/middleware/tracer.ts.template +0 -24
- package/lib/generators/add-backend/files/src/modules/auth/schema/auth-schema.graphql +0 -25
- package/lib/generators/add-backend/files/src/server-setup/graphql-server.ts.template +0 -185
- package/lib/generators/add-backend/files/src/server-setup/graphql-subscription-server.ts.template +0 -113
- package/lib/generators/add-backend/files/src/server-setup/graphql-ws.ts.template +0 -158
- package/lib/generators/add-backend/files/src/server-setup/mongodb-migration-update.ts.template +0 -47
- package/lib/generators/add-backend/files/src/server-setup/utils.ts.template +0 -43
- package/lib/generators/add-backend/files/src/server-setup/websocket-multipath-update.ts.template +0 -88
- package/lib/generators/add-backend/files/src/stack-server.ts.template +0 -277
- package/lib/generators/add-backend/files/src/utils/migrations.ts.template +0 -32
- package/lib/generators/add-backend/files/uploads/3986781.ppt +0 -0
|
@@ -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,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.
|
|
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.
|
|
32
|
-
"@common-stack/core": "5.0.6-alpha.
|
|
33
|
-
"@common-stack/server-core": "5.0.6-alpha.
|
|
34
|
-
"@common-stack/server-stack": "5.0.6-alpha.
|
|
35
|
-
"@common-stack/store-mongo": "5.0.6-alpha.
|
|
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,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,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
|
-
}
|