@newmo/graphql-fake-server 0.1.1 → 0.3.0

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/LICENSE CHANGED
@@ -1,7 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023 mizdra
4
- Copyright (c) 2022 Yosuke Kurami
3
+ Copyright (c) 2024 newmo, Inc.
5
4
 
6
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
7
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -11,11 +11,69 @@ GraphQL Fake Server.
11
11
 
12
12
  ## Installation
13
13
 
14
- - [ ] Describe the installation process
14
+ 1. Add `@exampleID`, `@exampleString`, `@exampleInt`, `@exampleFloat`, `@exampleBoolean` directive to your schema.
15
+
16
+ ```graphql
17
+ """
18
+ @exampleID directive specifies an example value for a ID field.
19
+ This example value is used in the fake data.
20
+ ID value will be unique between all ID fake data.
21
+ """
22
+ directive @exampleID(
23
+ """
24
+ The value of the ID field.
25
+ @exampleID(value: "id")
26
+ """
27
+ value: ID!
28
+ ) on FIELD_DEFINITION
29
+ """
30
+ @exampleString directive specifies an example value for a String field.
31
+ This example value is used in the fake data.
32
+ """
33
+ directive @exampleString(
34
+ """
35
+ The value of the String field.
36
+ @exampleString(value: "example")
37
+ """
38
+ value: String!
39
+ ) on FIELD_DEFINITION
40
+ """
41
+ @exampleInt directive specifies an example value for a Inf field.
42
+ This example value is used in the fake data.
43
+ """
44
+ directive @exampleInt(
45
+ """
46
+ The value of the Int field.
47
+ @exampleInt(value: 1)
48
+ """
49
+ value: Int!
50
+ ) on FIELD_DEFINITION
51
+ """
52
+ @exampleFloat directive specifies an example value for a Float field.
53
+ This example value is used in the fake data.
54
+ """
55
+ directive @exampleFloat(
56
+ """
57
+ The value of the Float field.
58
+ @exampleFloat(value: 1.0)
59
+ """
60
+ value: Float!
61
+ ) on FIELD_DEFINITION
62
+ """
63
+ @exampleBoolean directive specifies an example value for a Boolean field.
64
+ This example value is used in the fake data.
65
+ """
66
+ directive @exampleBoolean(
67
+ """
68
+ The value of the Boolean field.
69
+ @exampleBoolean(value: true)
70
+ """
71
+ value: Boolean!
72
+ ) on FIELD_DEFINITION
73
+ ```
15
74
 
16
75
  ## Usage
17
76
 
18
- - [ ] Write usage instructions
19
77
 
20
78
  ## Tests
21
79
 
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+ export {};
3
+ //# sourceMappingURL=bin.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.d.ts","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":""}
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { run } from "./cli.js";
3
+ const ret = await run();
4
+ if (typeof ret !== "function") {
5
+ if (ret.stdout) {
6
+ console.log(ret.stdout);
7
+ }
8
+ if (ret.stderr) {
9
+ console.error(ret.stderr);
10
+ }
11
+ process.exit(ret.exitCode);
12
+ }
13
+ //# sourceMappingURL=bin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bin.js","sourceRoot":"","sources":["../../src/bin.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,MAAM,UAAU,CAAC;AAE/B,MAAM,GAAG,GAAG,MAAM,GAAG,EAAE,CAAC;AACxB,IAAI,OAAO,GAAG,KAAK,UAAU,EAAE,CAAC;IAC5B,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IACD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;AAC/B,CAAC"}
package/dist/esm/cli.d.ts CHANGED
@@ -1,3 +1,15 @@
1
1
  #!/usr/bin/env node
2
- export {};
2
+ export declare const cli: {
3
+ values: {
4
+ schema: string | undefined;
5
+ port: string | undefined;
6
+ logLevel: string | undefined;
7
+ };
8
+ positionals: [];
9
+ };
10
+ export declare const run: ({ values, }?: typeof cli) => Promise<{
11
+ stdout: string;
12
+ stderr: string | Error;
13
+ exitCode: number;
14
+ } | (() => void)>;
3
15
  //# sourceMappingURL=cli.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":""}
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AAkBA,eAAO,MAAM,GAAG;;;;;;;CAoBd,CAAC;AACH,eAAO,MAAM,GAAG,iBAEb,UAAU,KAAS,QAChB;IACI,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;CACpB,GACD,CAAC,MAAM,IAAI,CAAC,CAoDjB,CAAC"}
package/dist/esm/cli.js CHANGED
@@ -1,90 +1,92 @@
1
1
  #!/usr/bin/env node
2
- import fs from "node:fs/promises";
2
+ import * as fs from "node:fs/promises";
3
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 { generateCode } from "./code-generator.js";
11
- import { normalizeConfig } from "./config.js";
12
- import { getTypeInfos } from "./schema-scanner.js";
4
+ import { buildSchema } from "graphql/utilities/index.js";
5
+ import { createMock, startFakeServer } from "./index.js";
6
+ import { createLogger } from "./logger.js";
13
7
  const HELP = `
14
- Usage: cli <file.graphql>
8
+ Usage: npx @newmo/graphql-fake-server --schema <path> [options]
9
+
10
+ Options:
11
+
12
+ --schema <path> Path to the schema file. e.g. schema.graphql
13
+ --port <port> Port to run the server on
14
+ --logLevel <logLevel> log level: debug, info, warn, error
15
+
15
16
  `;
16
17
  // cli foo.graphql
17
- const { positionals, values } = parseArgs({
18
- args: process.argv.slice(2), allowPositionals: true,
18
+ export const cli = parseArgs({
19
+ args: process.argv.slice(2),
19
20
  options: {
21
+ // --schema
22
+ schema: {
23
+ type: "string",
24
+ description: "Path to the schema file. e.g. schema.graphql",
25
+ },
20
26
  // --port
21
27
  port: {
22
28
  type: "string",
23
29
  description: "Port to run the server on",
24
30
  default: "4000",
25
31
  },
26
- verbose: {
27
- type: "boolean",
28
- description: "Verbose output",
29
- default: false
30
- }
31
- }
32
+ logLevel: {
33
+ type: "string",
34
+ description: "log level: debug, info, warn, error",
35
+ default: "info",
36
+ },
37
+ },
32
38
  });
33
- if (!positionals.length) {
34
- console.info(HELP);
35
- process.exit(1);
36
- }
37
- const [filePath] = positionals;
38
- if (!filePath) {
39
- console.error(HELP);
40
- process.exit(1);
41
- }
42
- const port = values.port ? Number.parseInt(values.port, 10) : NaN;
43
- if (Number.isNaN(port)) {
44
- console.error("--port must be a number");
45
- process.exit(1);
46
- }
47
- const startFakeServer = async ({ schema, mockObject }) => {
48
- const mocks = Object.fromEntries(Object.entries(mockObject).map(([key, value]) => {
49
- return [key, () => value];
50
- }));
51
- const server = new ApolloServer({
52
- schema: addMocksToSchema({
53
- schema: makeExecutableSchema({
54
- typeDefs: schema
55
- }),
56
- mocks,
57
- }),
58
- });
59
- const { url } = await startStandaloneServer(server, { listen: { port: port } });
60
- console.log(`🚀 Server listening at: ${url}`);
61
- };
62
- try {
63
- const schema = buildSchema(await fs.readFile(filePath, "utf-8"));
64
- const normalizedConfig = normalizeConfig({
65
- typesFile: "types.ts",
66
- });
67
- const typeInfos = getTypeInfos(normalizedConfig, schema);
68
- const code = generateCode(normalizedConfig, typeInfos);
69
- if (values.verbose) {
70
- console.info("Generated code:");
71
- console.info(code);
39
+ export const run = async ({ values, } = cli) => {
40
+ const logLevel = values.logLevel;
41
+ if (!logLevel || !["debug", "info", "warn", "error"].includes(logLevel)) {
42
+ return {
43
+ stdout: "",
44
+ stderr: "--logLevel must be one of debug, info, warn, error",
45
+ exitCode: 1,
46
+ };
47
+ }
48
+ const logger = createLogger(logLevel);
49
+ const schemaPath = values.schema;
50
+ if (!schemaPath) {
51
+ logger.info(HELP);
52
+ return {
53
+ stdout: "",
54
+ stderr: "--schema is required",
55
+ exitCode: 1,
56
+ };
57
+ }
58
+ const port = values.port ? Number.parseInt(values.port, 10) : Number.NaN;
59
+ if (Number.isNaN(port)) {
60
+ logger.info(HELP);
61
+ return {
62
+ stdout: "",
63
+ stderr: "--port must be a number",
64
+ exitCode: 1,
65
+ };
72
66
  }
73
- // execute code in vm and get all exports
74
- const exports = {};
75
- vm.runInNewContext(code, { exports });
76
- if (values.verbose) {
77
- console.info("Exports:");
78
- console.info(exports);
67
+ try {
68
+ const schema = buildSchema(await fs.readFile(schemaPath, "utf-8"));
69
+ const mockObject = await createMock({
70
+ schema,
71
+ logLevel: logLevel,
72
+ });
73
+ const closeServer = await startFakeServer({
74
+ mockObject,
75
+ port,
76
+ schema,
77
+ });
78
+ // TODO: more readable output?
79
+ return closeServer;
79
80
  }
80
- await startFakeServer({
81
- schema,
82
- mockObject: exports
83
- });
84
- // write to file
85
- }
86
- catch (error) {
87
- console.error(error);
88
- process.exit(1);
89
- }
81
+ catch (error) {
82
+ logger.error(error);
83
+ return {
84
+ stdout: "",
85
+ stderr: new Error("Failed to start server", {
86
+ cause: error,
87
+ }),
88
+ exitCode: 1,
89
+ };
90
+ }
91
+ };
90
92
  //# sourceMappingURL=cli.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,21 @@
1
- import { type PluginFunction } from '@graphql-codegen/plugin-helpers';
2
- export declare const plugin: PluginFunction;
1
+ import type { GraphQLSchema } from "graphql";
2
+ import { type LogLevel } from "./logger.js";
3
+ export type MockObject = Record<string, unknown>;
4
+ export type StartFakeServerOptions = {
5
+ schema: GraphQLSchema;
6
+ mockObject: MockObject;
7
+ port?: number;
8
+ logLevel?: LogLevel;
9
+ };
10
+ export declare const startFakeServer: ({ schema, mockObject, port, logLevel, }: StartFakeServerOptions) => Promise<() => void>;
11
+ export type GenerateMockOptions = {
12
+ schema: GraphQLSchema;
13
+ logLevel?: LogLevel;
14
+ };
15
+ /**
16
+ * Create mock object from schema
17
+ * It supports @example directive
18
+ * @param options
19
+ */
20
+ export declare const createMock: (options: GenerateMockOptions) => Promise<MockObject>;
3
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,iCAAiC,CAAC;AAKtE,eAAO,MAAM,MAAM,EAAE,cAOpB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAG7C,OAAO,EAAE,KAAK,QAAQ,EAAgB,MAAM,aAAa,CAAC;AAE1D,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AACjD,MAAM,MAAM,sBAAsB,GAAG;IACjC,MAAM,EAAE,aAAa,CAAC;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB,CAAC;AACF,eAAO,MAAM,eAAe,4CAKzB,sBAAsB,wBAsBxB,CAAC;AACF,MAAM,MAAM,mBAAmB,GAAG;IAC9B,MAAM,EAAE,aAAa,CAAC;IACtB,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACvB,CAAC;AAIF;;;;GAIG;AACH,eAAO,MAAM,UAAU,YAAmB,mBAAmB,KAAG,QAAQ,UAAU,CA4BjF,CAAC"}
package/dist/esm/index.js CHANGED
@@ -1,12 +1,66 @@
1
- // MEMO: The tests for this module are covered by `e2e/*.e2e.ts`.
2
- import { generateCode } from './code-generator.js';
3
- import { normalizeConfig, validateConfig } from './config.js';
4
- import { getTypeInfos } from './schema-scanner.js';
5
- export const plugin = (schema, _documents, config, _info) => {
6
- validateConfig(config);
7
- const normalizedConfig = normalizeConfig(config);
8
- const typeInfos = getTypeInfos(normalizedConfig, schema);
9
- const code = generateCode(normalizedConfig, typeInfos);
10
- return code;
1
+ import vm from "node:vm";
2
+ import { ApolloServer } from "@apollo/server";
3
+ import { startStandaloneServer } from "@apollo/server/standalone";
4
+ import { addMocksToSchema } from "@graphql-tools/mock";
5
+ import { makeExecutableSchema } from "@graphql-tools/schema";
6
+ import { generateCode, getTypeInfos, normalizeConfig } from "@newmo/graphql-fake-core";
7
+ //@ts-expect-error
8
+ import depthLimit from "graphql-depth-limit";
9
+ import { createLogger } from "./logger.js";
10
+ export const startFakeServer = async ({ schema, mockObject, port, logLevel, }) => {
11
+ const logger = createLogger(logLevel);
12
+ const mocks = Object.fromEntries(Object.entries(mockObject).map(([key, value]) => {
13
+ return [key, () => value];
14
+ }));
15
+ const server = new ApolloServer({
16
+ schema: addMocksToSchema({
17
+ schema: makeExecutableSchema({
18
+ typeDefs: schema,
19
+ }),
20
+ mocks,
21
+ }),
22
+ validationRules: [depthLimit(3)],
23
+ });
24
+ const { url } = await startStandaloneServer(server, { listen: { port: port } });
25
+ logger.info(`🚀 Server listening at: ${url}`);
26
+ return () => {
27
+ // close
28
+ server.stop();
29
+ };
30
+ };
31
+ const cloneAsJSON = (obj) => {
32
+ return JSON.parse(JSON.stringify(obj));
33
+ };
34
+ /**
35
+ * Create mock object from schema
36
+ * It supports @example directive
37
+ * @param options
38
+ */
39
+ export const createMock = async (options) => {
40
+ const logger = createLogger(options.logLevel);
41
+ try {
42
+ const normalizedConfig = normalizeConfig({
43
+ maxFieldRecursionDepth: 4,
44
+ });
45
+ const typeInfos = getTypeInfos(normalizedConfig, options.schema);
46
+ const code = generateCode({
47
+ ...normalizedConfig,
48
+ outputType: "commonjs",
49
+ }, typeInfos);
50
+ logger.debug("Generated code:");
51
+ logger.debug(code);
52
+ // execute code in vm and get all exports
53
+ const exports = {};
54
+ vm.runInNewContext(code, { exports });
55
+ // Apollo Server does not support Function type in mock object
56
+ const plainObject = cloneAsJSON(exports);
57
+ logger.debug("Exports:");
58
+ logger.debug(JSON.stringify(plainObject, null, 2));
59
+ return plainObject;
60
+ }
61
+ catch (error) {
62
+ logger.error(error);
63
+ process.exit(1);
64
+ }
11
65
  };
12
66
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,iEAAiE;AAGjE,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,MAAM,CAAC,MAAM,MAAM,GAAmB,CAAC,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE;IACxE,cAAc,CAAC,MAAM,CAAC,CAAC;IAEvB,MAAM,gBAAgB,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IACjD,MAAM,SAAS,GAAG,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,YAAY,CAAC,gBAAgB,EAAE,SAAS,CAAC,CAAC;IACvD,OAAO,IAAI,CAAC;AAChB,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * if logLevel is debug, log all logs
3
+ * if logLevel is info, log info, warn, error
4
+ * if logLevel is warn, log warn, error
5
+ * if logLevel is error, log error
6
+ */
7
+ export type LogLevel = "debug" | "info" | "warn" | "error";
8
+ export declare const createLogger: (logLevel?: LogLevel) => {
9
+ debug: (...args: unknown[]) => void;
10
+ info: (...args: unknown[]) => void;
11
+ warn: (...args: unknown[]) => void;
12
+ error: (...args: unknown[]) => void;
13
+ };
14
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,eAAO,MAAM,YAAY,cAAc,QAAQ;qBAEtB,OAAO,EAAE;oBAKV,OAAO,EAAE;oBAKT,OAAO,EAAE;qBAKR,OAAO,EAAE;CAIjC,CAAC"}
@@ -0,0 +1,23 @@
1
+ export const createLogger = (logLevel = "info") => {
2
+ return {
3
+ debug: (...args) => {
4
+ if (logLevel === "debug") {
5
+ console.debug(...args);
6
+ }
7
+ },
8
+ info: (...args) => {
9
+ if (logLevel === "debug" || logLevel === "info") {
10
+ console.info(...args);
11
+ }
12
+ },
13
+ warn: (...args) => {
14
+ if (logLevel === "debug" || logLevel === "info" || logLevel === "warn") {
15
+ console.warn(...args);
16
+ }
17
+ },
18
+ error: (...args) => {
19
+ console.error(...args);
20
+ },
21
+ };
22
+ };
23
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/logger.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,MAAM,YAAY,GAAG,CAAC,WAAqB,MAAM,EAAE,EAAE;IACxD,OAAO;QACH,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC1B,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;gBACvB,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;YAC3B,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YACzB,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBAC9C,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,IAAI,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YACzB,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,MAAM,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;gBACrE,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC;YAC1B,CAAC;QACL,CAAC;QACD,KAAK,EAAE,CAAC,GAAG,IAAe,EAAE,EAAE;YAC1B,OAAO,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3B,CAAC;KACJ,CAAC;AACN,CAAC,CAAC"}