@newmo/graphql-fake-server 0.2.0 → 0.3.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.
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
@@ -74,7 +74,6 @@ directive @exampleBoolean(
74
74
 
75
75
  ## Usage
76
76
 
77
- - [ ] Write usage instructions
78
77
 
79
78
  ## Tests
80
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"}
package/package.json CHANGED
@@ -1,98 +1,83 @@
1
1
  {
2
- "name": "@newmo/graphql-fake-server",
3
- "description": "GraphQL fake server for testing",
4
- "version": "0.2.0",
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
- }
2
+ "name": "@newmo/graphql-fake-server",
3
+ "version": "0.3.1",
4
+ "private": false,
5
+ "description": "GraphQL fake server for testing",
6
+ "keywords": [
7
+ "testing",
8
+ "mock",
9
+ "graphql",
10
+ "graphql-code-generator"
11
+ ],
12
+ "repository": "https://github.com/newmo-oss/graphql-fake-server.git",
13
+ "license": "MIT",
14
+ "author": "newmo, Inc.",
15
+ "sideEffects": false,
16
+ "type": "module",
17
+ "exports": {
18
+ ".": {
19
+ "import": {
20
+ "types": "./dist/esm/index.d.ts",
21
+ "default": "./dist/esm/index.js"
22
+ }
23
+ },
24
+ "./cli": {
25
+ "import": {
26
+ "types": "./dist/esm/cli.d.ts",
27
+ "default": "./dist/esm/cli.js"
28
+ }
29
+ }
17
30
  },
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
- }
31
+ "bin": {
32
+ "@newmo/graphql-fake-server": "./dist/esm/bin.js"
33
+ },
34
+ "files": [
35
+ "src/",
36
+ "!src/test",
37
+ "!src/**/*.test.ts",
38
+ "!src/**/__snapshots__",
39
+ "dist/"
40
+ ],
41
+ "scripts": {
42
+ "prepare": "npm run build",
43
+ "build": "run-s -c build:*",
44
+ "build:esm": "tsc -p tsconfig.build.json",
45
+ "lint": "run-s -c lint:*",
46
+ "lint:tsc": "tsc",
47
+ "test": "vitest run",
48
+ "updateSnapshot": "vitest run -u"
49
+ },
50
+ "dependencies": {
51
+ "@apollo/server": "^4.10.4",
52
+ "@graphql-tools/mock": "^9.0.2",
53
+ "@graphql-tools/schema": "^10.0.3",
54
+ "@newmo/graphql-fake-core": "0.3.0",
55
+ "graphql-depth-limit": "^1.1.0"
56
+ },
57
+ "devDependencies": {
58
+ "@graphql-codegen/cli": "^5.0.0",
59
+ "@graphql-codegen/typescript": "^4.0.1",
60
+ "@tsconfig/node18": "^18.2.0",
61
+ "@tsconfig/strictest": "^2.0.1",
62
+ "@types/eslint": "^8.44.2",
63
+ "@types/node": "^20.5.1",
64
+ "@vitest/browser": "^1.3.1",
65
+ "eslint": "^8.47.0",
66
+ "graphql": "^16.8.1",
67
+ "npm-run-all": "^4.1.5",
68
+ "typescript": "^5.4.2",
69
+ "vitest": "^1.3.1",
70
+ "vitest-github-actions-reporter": "^0.11.1"
71
+ },
72
+ "peerDependencies": {
73
+ "graphql": "^16.8.1"
74
+ },
75
+ "engines": {
76
+ "node": ">=18.0.0"
77
+ },
78
+ "publishConfig": {
79
+ "access": "public",
80
+ "registry": "https://registry.npmjs.org/"
81
+ },
82
+ "gitHead": "c0bb7357d7212071dc305685b4bdf42dfc445737"
98
83
  }
package/src/bin.ts ADDED
@@ -0,0 +1,13 @@
1
+ #!/usr/bin/env node
2
+ import { run } from "./cli.js";
3
+
4
+ const ret = await run();
5
+ if (typeof ret !== "function") {
6
+ if (ret.stdout) {
7
+ console.log(ret.stdout);
8
+ }
9
+ if (ret.stderr) {
10
+ console.error(ret.stderr);
11
+ }
12
+ process.exit(ret.exitCode);
13
+ }