@newmo/graphql-fake-server 0.1.1

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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema-scanner.js","sourceRoot":"","sources":["../../src/schema-scanner.ts"],"names":[],"mappings":"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"}
package/package.json ADDED
@@ -0,0 +1,98 @@
1
+ {
2
+ "name": "@newmo/graphql-fake-server",
3
+ "description": "GraphQL fake server for testing",
4
+ "version": "0.1.1",
5
+ "type": "module",
6
+ "sideEffects": false,
7
+ "repository": "https://github.com/newmo-oss/graphql-fake-server.git",
8
+ "author": "newmo, Inc.",
9
+ "license": "MIT",
10
+ "private": false,
11
+ "exports": {
12
+ ".": {
13
+ "import": {
14
+ "types": "./dist/esm/index.d.ts",
15
+ "default": "./dist/esm/index.js"
16
+ }
17
+ },
18
+ "./cli": {
19
+ "import": {
20
+ "types": "./dist/esm/cli.d.ts",
21
+ "default": "./dist/esm/cli.js"
22
+ }
23
+ }
24
+ },
25
+ "workspaces": [
26
+ "e2e/esm",
27
+ "e2e/cjs",
28
+ "e2e/browser"
29
+ ],
30
+ "scripts": {
31
+ "build": "run-s -c build:*",
32
+ "build:esm": "tsc -p tsconfig.build.json",
33
+ "lint": "run-s -c lint:*",
34
+ "lint:tsc": "tsc",
35
+ "lint:eslint": "eslint .",
36
+ "lint:prettier": "prettier --check .",
37
+ "test": "# vitest",
38
+ "pree2e": "npm run build",
39
+ "e2e": "npm -w e2e/esm -w e2e/cjs run start"
40
+ },
41
+ "prettier": "@mizdra/prettier-config-mizdra",
42
+ "devDependencies": {
43
+ "@graphql-codegen/cli": "^5.0.0",
44
+ "@graphql-codegen/typescript": "^4.0.1",
45
+ "@mizdra/eslint-config-mizdra": "^2.0.0",
46
+ "@mizdra/prettier-config-mizdra": "^1.0.0",
47
+ "@tsconfig/node18": "^18.2.0",
48
+ "@tsconfig/strictest": "^2.0.1",
49
+ "@types/eslint": "^8.44.2",
50
+ "@types/node": "^20.5.1",
51
+ "@vitest/browser": "^1.3.1",
52
+ "eslint": "^8.47.0",
53
+ "graphql": "^16.8.1",
54
+ "npm-run-all": "^4.1.5",
55
+ "prettier": "^3.0.2",
56
+ "tsx": "^4.7.1",
57
+ "typescript": "^5.4.2",
58
+ "vitest": "^1.3.1",
59
+ "vitest-github-actions-reporter": "^0.11.1",
60
+ "webdriverio": "^8.33.1"
61
+ },
62
+ "overrides": {
63
+ "tsconfig-paths": "^4.0.0"
64
+ },
65
+ "engines": {
66
+ "node": ">=18.0.0"
67
+ },
68
+ "publishConfig": {
69
+ "access": "public",
70
+ "registry": "https://registry.npmjs.org/"
71
+ },
72
+ "keywords": [
73
+ "testing",
74
+ "mock",
75
+ "graphql",
76
+ "graphql-code-generator"
77
+ ],
78
+ "files": [
79
+ "src",
80
+ "!src/test",
81
+ "!src/**/*.test.ts",
82
+ "!src/**/__snapshots__",
83
+ "dist"
84
+ ],
85
+ "bin": {
86
+ "@newmo/graphql-fake-server": "./dist/esm/cli.js"
87
+ },
88
+ "peerDependencies": {
89
+ "graphql": "^16.0.0"
90
+ },
91
+ "dependencies": {
92
+ "@graphql-tools/mock": "^9.0.2",
93
+ "@apollo/server": "^4.10.4",
94
+ "@graphql-tools/schema": "^10.0.3",
95
+ "@graphql-codegen/plugin-helpers": "^5.0.1",
96
+ "@graphql-codegen/visitor-plugin-common": "^4.0.1"
97
+ }
98
+ }
package/src/cli.ts ADDED
@@ -0,0 +1,101 @@
1
+ #!/usr/bin/env node
2
+ import fs from "node:fs/promises";
3
+ import { parseArgs } from "node:util";
4
+ import vm from "node:vm";
5
+ import { ApolloServer } from '@apollo/server';
6
+ import { startStandaloneServer } from '@apollo/server/standalone';
7
+ import { addMocksToSchema } from '@graphql-tools/mock';
8
+ import { makeExecutableSchema } from '@graphql-tools/schema';
9
+ import { buildSchema } from "graphql";
10
+ import { GraphQLSchema } from "graphql/index.js";
11
+ import { generateCode } from "./code-generator.js";
12
+ import { normalizeConfig } from "./config.js";
13
+ import { getTypeInfos } from "./schema-scanner.js";
14
+
15
+ const HELP = `
16
+ Usage: cli <file.graphql>
17
+ `;
18
+ // cli foo.graphql
19
+ const { positionals, values } = parseArgs({
20
+ args: process.argv.slice(2), allowPositionals: true,
21
+ options: {
22
+ // --port
23
+ port: {
24
+ type: "string",
25
+ description: "Port to run the server on",
26
+ default: "4000",
27
+ },
28
+ verbose: {
29
+ type: "boolean",
30
+ description: "Verbose output",
31
+ default: false
32
+ }
33
+ }
34
+ });
35
+ if (!positionals.length) {
36
+ console.info(HELP);
37
+ process.exit(1);
38
+ }
39
+ const [filePath] = positionals;
40
+ if (!filePath) {
41
+ console.error(HELP);
42
+ process.exit(1);
43
+ }
44
+ const port = values.port ? Number.parseInt(values.port, 10) : NaN;
45
+ if (Number.isNaN(port)) {
46
+ console.error("--port must be a number");
47
+ process.exit(1);
48
+ }
49
+ const startFakeServer = async ({
50
+ schema,
51
+ mockObject
52
+ }: {
53
+ schema: GraphQLSchema;
54
+ mockObject: Record<string, {}>
55
+ }) => {
56
+
57
+ const mocks = Object.fromEntries(Object.entries(mockObject).map(([key, value]) => {
58
+ return [key, () => value];
59
+ })
60
+ )
61
+
62
+ const server = new ApolloServer({
63
+ schema: addMocksToSchema({
64
+ schema: makeExecutableSchema({
65
+ typeDefs: schema
66
+ }),
67
+ mocks,
68
+ }),
69
+ });
70
+
71
+ const { url } = await startStandaloneServer(server, { listen: { port: port } });
72
+
73
+ console.log(`🚀 Server listening at: ${url}`);
74
+ }
75
+ try {
76
+ const schema = buildSchema(await fs.readFile(filePath, "utf-8"));
77
+ const normalizedConfig = normalizeConfig({
78
+ typesFile: "types.ts",
79
+ });
80
+ const typeInfos = getTypeInfos(normalizedConfig, schema);
81
+ const code = generateCode(normalizedConfig, typeInfos);
82
+ if (values.verbose) {
83
+ console.info("Generated code:");
84
+ console.info(code);
85
+ }
86
+ // execute code in vm and get all exports
87
+ const exports = {};
88
+ vm.runInNewContext(code, { exports });
89
+ if (values.verbose) {
90
+ console.info("Exports:");
91
+ console.info(exports);
92
+ }
93
+ await startFakeServer({
94
+ schema,
95
+ mockObject: exports
96
+ });
97
+ // write to file
98
+ } catch (error) {
99
+ console.error(error);
100
+ process.exit(1);
101
+ }
@@ -0,0 +1,82 @@
1
+ import { Config } from './config.js';
2
+ import { ExampleDirective, ObjectTypeInfo, TypeInfo } from './schema-scanner.js';
3
+ import { GraphQLSchema } from "graphql/index.js";
4
+
5
+ function generatePreludeCode(config: Config, typeInfos: TypeInfo[]): string {
6
+ const joinedTypeNames = typeInfos
7
+ .filter(({ type }) => type === 'object')
8
+ .map(({ name }) => ` ${name}`)
9
+ .join(',\n');
10
+ const code = `
11
+ import type {
12
+ ${joinedTypeNames},
13
+ } from '${config.typesFile}';
14
+ `.trim();
15
+ return `${code}\n`;
16
+ }
17
+
18
+ const handleExample = (exampleDirective: ExampleDirective): string => {
19
+ if ("value" in exampleDirective) {
20
+ return JSON.stringify(exampleDirective.value);
21
+ } else if ("expression" in exampleDirective) {
22
+ return exampleDirective.expression;
23
+ }
24
+ throw new Error(`Invalid example directive${JSON.stringify(exampleDirective)}`);
25
+ }
26
+
27
+ function generateApolloFakeServer(config: Config, typeInfo: ObjectTypeInfo) {
28
+ const header = `import { ApolloServer } from '@apollo/server';
29
+ import { startStandaloneServer } from '@apollo/server/standalone';
30
+ import { addMocksToSchema } from '@graphql-tools/mock';
31
+ import { makeExecutableSchema } from '@graphql-tools/schema';
32
+ `;
33
+
34
+ const body = `
35
+ const server = new ApolloServer({
36
+ schema: addMocksToSchema({
37
+ schema: makeExecutableSchema({ typeDefs }),
38
+ mocks,
39
+ }),
40
+ });
41
+ const { url } = await startStandaloneServer(server, { listen: { port: 4000 } });
42
+ console.log(\`🚀 Server listening at: \${url}\`);
43
+ `;
44
+ return {
45
+ header,
46
+ body
47
+ }
48
+ }
49
+
50
+ function generateExampleCode(config: Config, typeInfo: ObjectTypeInfo): string {
51
+ const { name } = typeInfo;
52
+ const indent = ' ';
53
+ return `
54
+ /**
55
+ * Default ${name} model using @example directive.
56
+ */
57
+ const ${name} = {
58
+ ${typeInfo.fields.flatMap((field) => {
59
+ const example = field.example;
60
+ if (example) {
61
+ return [`${indent}${field.name}: ${handleExample(example)}`];
62
+ }
63
+ return [];
64
+ }).join(',\n')}
65
+ };
66
+ exports.${name} = ${name};
67
+ `.trimStart();
68
+ }
69
+
70
+ export function generateCode(config: Config, typeInfos: TypeInfo[]): string {
71
+ let code = '';
72
+ // code += generatePreludeCode(config, typeInfos);
73
+ // code += apolloFakeServer.header;
74
+ // code += '\n';
75
+ for (const typeInfo of typeInfos) {
76
+ if (typeInfo.type === 'object') {
77
+ code += generateExampleCode(config, typeInfo);
78
+ code += '\n';
79
+ }
80
+ }
81
+ return code;
82
+ }
package/src/config.ts ADDED
@@ -0,0 +1,96 @@
1
+ import { ConvertFn, RawTypesConfig, convertFactory } from '@graphql-codegen/visitor-plugin-common';
2
+
3
+ export type RawConfig = {
4
+ typesFile: string;
5
+ skipTypename?: RawTypesConfig['skipTypename'];
6
+ skipIsAbstractType?: boolean | undefined;
7
+ nonOptionalDefaultFields?: boolean | undefined;
8
+ namingConvention?: RawTypesConfig['namingConvention'];
9
+ typesPrefix?: RawTypesConfig['typesPrefix'];
10
+ typesSuffix?: RawTypesConfig['typesSuffix'];
11
+ // TODO: support addIsAbstractType
12
+ defaultValues?: {
13
+ String?: string
14
+ Int?: number
15
+ Float?: number
16
+ Boolean?: boolean
17
+ ID?: string
18
+ listLength?: number
19
+ }
20
+ };
21
+
22
+ export const DefaultValues = {
23
+ String: "string",
24
+ Int: 42,
25
+ Float: 4.2,
26
+ Boolean: true,
27
+ ID: "xxxx-xxxx-xxxx-xxxx",
28
+ listLength: 3
29
+ }
30
+ export type Config = {
31
+ typesFile: string;
32
+ skipTypename: Exclude<RawTypesConfig['skipTypename'], undefined>;
33
+ skipIsAbstractType: boolean;
34
+ nonOptionalDefaultFields: boolean;
35
+ typesPrefix: Exclude<RawTypesConfig['typesPrefix'], undefined>;
36
+ typesSuffix: Exclude<RawTypesConfig['typesSuffix'], undefined>;
37
+ convert: ConvertFn;
38
+ // TODO: support addIsAbstractType
39
+ defaultValues: {
40
+ String: string
41
+ Int: number
42
+ Float: number
43
+ Boolean: boolean
44
+ ID: string,
45
+ listLength: number
46
+ }
47
+ };
48
+
49
+ export function validateConfig(rawConfig: unknown): asserts rawConfig is RawConfig {
50
+ if (typeof rawConfig !== 'object' || rawConfig === null) {
51
+ throw new Error('`options` must be an object');
52
+ }
53
+ if (!('typesFile' in rawConfig)) {
54
+ throw new Error('`option.typesFile` is required');
55
+ }
56
+ if (typeof rawConfig['typesFile'] !== 'string') {
57
+ throw new Error('`options.typesFile` must be a string');
58
+ }
59
+ if ('skipTypename' in rawConfig && typeof rawConfig['skipTypename'] !== 'boolean') {
60
+ throw new Error('`options.skipTypename` must be a boolean');
61
+ }
62
+ if ('skipIsAbstractType' in rawConfig && typeof rawConfig['skipIsAbstractType'] !== 'boolean') {
63
+ throw new Error('`options.skipIsAbstractType` must be a boolean');
64
+ }
65
+ if ('nonOptionalDefaultFields' in rawConfig && typeof rawConfig['nonOptionalDefaultFields'] !== 'boolean') {
66
+ throw new Error('`options.nonOptionalDefaultFields` must be a boolean');
67
+ }
68
+ if ('typesPrefix' in rawConfig && typeof rawConfig['typesPrefix'] !== 'string') {
69
+ throw new Error('`options.typesPrefix` must be a string');
70
+ }
71
+ if ('typesSuffix' in rawConfig && typeof rawConfig['typesSuffix'] !== 'string') {
72
+ throw new Error('`options.typesSuffix` must be a string');
73
+ }
74
+ }
75
+
76
+ export function normalizeConfig(rawConfig: RawConfig): Config {
77
+ return {
78
+ typesFile: rawConfig.typesFile,
79
+ skipTypename: rawConfig.skipTypename ?? false,
80
+ skipIsAbstractType: rawConfig.skipIsAbstractType ?? true,
81
+ nonOptionalDefaultFields: rawConfig.nonOptionalDefaultFields ?? false,
82
+ typesPrefix: rawConfig.typesPrefix ?? '',
83
+ typesSuffix: rawConfig.typesSuffix ?? '',
84
+ convert: rawConfig.namingConvention
85
+ ? convertFactory({ namingConvention: rawConfig.namingConvention })
86
+ : convertFactory({}),
87
+ defaultValues: {
88
+ String: rawConfig.defaultValues?.String ?? DefaultValues.String,
89
+ Int: rawConfig.defaultValues?.Int ?? DefaultValues.Int,
90
+ Float: rawConfig.defaultValues?.Float ?? DefaultValues.Float,
91
+ Boolean: rawConfig.defaultValues?.Boolean ?? DefaultValues.Boolean,
92
+ ID: rawConfig.defaultValues?.ID ?? DefaultValues.ID,
93
+ listLength: rawConfig.defaultValues?.listLength ?? DefaultValues.listLength
94
+ }
95
+ };
96
+ }
package/src/index.ts ADDED
@@ -0,0 +1,15 @@
1
+ // MEMO: The tests for this module are covered by `e2e/*.e2e.ts`.
2
+
3
+ import { type PluginFunction } from '@graphql-codegen/plugin-helpers';
4
+ import { generateCode } from './code-generator.js';
5
+ import { normalizeConfig, validateConfig } from './config.js';
6
+ import { getTypeInfos } from './schema-scanner.js';
7
+
8
+ export const plugin: PluginFunction = (schema, _documents, config, _info) => {
9
+ validateConfig(config);
10
+
11
+ const normalizedConfig = normalizeConfig(config);
12
+ const typeInfos = getTypeInfos(normalizedConfig, schema);
13
+ const code = generateCode(normalizedConfig, typeInfos);
14
+ return code;
15
+ };