@newmo/graphql-fake-server 0.19.0 → 0.20.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/README.md +162 -118
- package/dist/esm/cli.d.ts.map +1 -1
- package/dist/esm/cli.js +1 -1
- package/dist/esm/cli.js.map +1 -1
- package/dist/esm/config.d.ts.map +1 -1
- package/dist/esm/createMock.d.ts +0 -0
- package/dist/esm/createMock.d.ts.map +0 -0
- package/dist/esm/createMock.js +39 -0
- package/dist/esm/createMock.js.map +0 -0
- package/dist/esm/index.d.ts +3 -3
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/logger.d.ts.map +1 -1
- package/dist/esm/server.d.ts +23 -20
- package/dist/esm/server.d.ts.map +1 -1
- package/dist/esm/server.js +473 -85
- package/dist/esm/server.js.map +1 -1
- package/package.json +81 -80
- package/src/cli.ts +2 -7
- package/src/index.ts +12 -6
- package/src/server.ts +656 -128
package/README.md
CHANGED
|
@@ -44,49 +44,45 @@ You need to set `sequence-id` header to identify the sequence with the request.
|
|
|
44
44
|
|
|
45
45
|
```js
|
|
46
46
|
await fetch(`${urls.fakeServer}/graphql`, {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
variables: {
|
|
63
|
-
title: "The Great Gatsby",
|
|
64
|
-
},
|
|
65
|
-
}),
|
|
47
|
+
method: "POST",
|
|
48
|
+
headers: {
|
|
49
|
+
"Content-Type": "application/json",
|
|
50
|
+
"sequence-id": sequenceId,
|
|
51
|
+
},
|
|
52
|
+
body: JSON.stringify({
|
|
53
|
+
query: `
|
|
54
|
+
query GetBooks {
|
|
55
|
+
books {
|
|
56
|
+
id
|
|
57
|
+
title
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
`,
|
|
61
|
+
}),
|
|
66
62
|
});
|
|
67
63
|
```
|
|
68
64
|
|
|
69
65
|
### `/fake`
|
|
70
66
|
|
|
71
|
-
Register
|
|
67
|
+
Register fake response for GraphQL operation.
|
|
72
68
|
|
|
73
69
|
```js
|
|
74
70
|
await fetch(`${urls.fakeServer}/fake`, {
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
71
|
+
method: "POST",
|
|
72
|
+
headers: {
|
|
73
|
+
"Content-Type": "application/json",
|
|
74
|
+
"sequence-id": sequenceId,
|
|
75
|
+
},
|
|
76
|
+
body: JSON.stringify({
|
|
77
|
+
type: "operation",
|
|
78
|
+
operationName: "CreateBook",
|
|
79
|
+
data: {
|
|
80
|
+
createBook: {
|
|
81
|
+
id: "new-id",
|
|
82
|
+
title: "new BOOK",
|
|
83
|
+
},
|
|
79
84
|
},
|
|
80
|
-
|
|
81
|
-
type: "operation",
|
|
82
|
-
operationName: "CreateBook",
|
|
83
|
-
data: {
|
|
84
|
-
createBook: {
|
|
85
|
-
id: "new-id",
|
|
86
|
-
title: "new BOOK",
|
|
87
|
-
},
|
|
88
|
-
},
|
|
89
|
-
}),
|
|
85
|
+
}),
|
|
90
86
|
});
|
|
91
87
|
```
|
|
92
88
|
|
|
@@ -96,16 +92,106 @@ Return request and response for the request with `sequence-id` and `operationNam
|
|
|
96
92
|
|
|
97
93
|
```js
|
|
98
94
|
const calledResponse = await fetch(`${urls.fakeServer}/fake/called`, {
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
95
|
+
method: "POST",
|
|
96
|
+
headers: {
|
|
97
|
+
"Content-Type": "application/json",
|
|
98
|
+
"sequence-id": sequenceId,
|
|
99
|
+
},
|
|
100
|
+
body: JSON.stringify({
|
|
101
|
+
operationName: "CreateBook",
|
|
102
|
+
}),
|
|
103
|
+
});
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Conditional Fake
|
|
107
|
+
|
|
108
|
+
You can register fake responses with conditions that determine when they should be returned. This allows for different responses based on request characteristics.
|
|
109
|
+
|
|
110
|
+
#### Supported Conditions
|
|
111
|
+
|
|
112
|
+
- **Count condition**: Return a specific response on the nth call
|
|
113
|
+
- **Variables condition**: Return a specific response when variables match exactly
|
|
114
|
+
|
|
115
|
+
#### Examples
|
|
116
|
+
|
|
117
|
+
**Count-based condition:**
|
|
118
|
+
|
|
119
|
+
```js
|
|
120
|
+
// Register a fake that only returns on the 2nd call
|
|
121
|
+
await fetch(`${urls.fakeServer}/fake`, {
|
|
122
|
+
method: "POST",
|
|
123
|
+
headers: {
|
|
124
|
+
"Content-Type": "application/json",
|
|
125
|
+
"sequence-id": sequenceId,
|
|
126
|
+
},
|
|
127
|
+
body: JSON.stringify({
|
|
128
|
+
type: "operation",
|
|
129
|
+
operationName: "GetUser",
|
|
130
|
+
requestCondition: {
|
|
131
|
+
type: "count",
|
|
132
|
+
value: 2,
|
|
103
133
|
},
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
134
|
+
data: {
|
|
135
|
+
user: {
|
|
136
|
+
id: "user123",
|
|
137
|
+
name: "Second Call User",
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
}),
|
|
107
141
|
});
|
|
108
|
-
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
**Variables-based condition:**
|
|
145
|
+
|
|
146
|
+
```js
|
|
147
|
+
// Register a fake that only returns when variables match exactly
|
|
148
|
+
await fetch(`${urls.fakeServer}/fake`, {
|
|
149
|
+
method: "POST",
|
|
150
|
+
headers: {
|
|
151
|
+
"Content-Type": "application/json",
|
|
152
|
+
"sequence-id": sequenceId,
|
|
153
|
+
},
|
|
154
|
+
body: JSON.stringify({
|
|
155
|
+
type: "operation",
|
|
156
|
+
operationName: "GetUser",
|
|
157
|
+
requestCondition: {
|
|
158
|
+
type: "variables",
|
|
159
|
+
value: { id: "admin", role: "admin" },
|
|
160
|
+
},
|
|
161
|
+
data: {
|
|
162
|
+
user: {
|
|
163
|
+
id: "admin",
|
|
164
|
+
name: "Admin User",
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
}),
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
When no condition matches, the server falls back to the declarative fake data defined in the GraphQL schema.
|
|
172
|
+
|
|
173
|
+
#### Condition Restrictions
|
|
174
|
+
|
|
175
|
+
To ensure predictable behavior, the following condition combinations are not allowed for the same operation within a sequence:
|
|
176
|
+
|
|
177
|
+
- **Count + Default**: Cannot mix count conditions with default (no condition) responses
|
|
178
|
+
- **Count + Variables**: Cannot mix count conditions with variables conditions
|
|
179
|
+
|
|
180
|
+
✅ **Allowed combinations:**
|
|
181
|
+
|
|
182
|
+
- Variables + Default: You can have both variables-specific responses and a default fallback
|
|
183
|
+
- Multiple Variables: Different variables conditions can coexist
|
|
184
|
+
- Multiple Count: Different count values can coexist
|
|
185
|
+
|
|
186
|
+
❌ **Rejected combinations:**
|
|
187
|
+
|
|
188
|
+
```js
|
|
189
|
+
// This will be rejected with an error response
|
|
190
|
+
// 1. Register default response
|
|
191
|
+
await fetch("/fake", { body: { operationName: "GetUser", data: {...} } });
|
|
192
|
+
// 2. Try to register count condition - ERROR!
|
|
193
|
+
await fetch("/fake", { body: { operationName: "GetUser", requestCondition: { type: "count", value: 1 }, data: {...} } });
|
|
194
|
+
```
|
|
109
195
|
|
|
110
196
|
## Config
|
|
111
197
|
|
|
@@ -119,86 +205,44 @@ Example of the config file: `graphql-fake-server.config.mjs`
|
|
|
119
205
|
|
|
120
206
|
```js
|
|
121
207
|
export default {
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
208
|
+
schemaFilePath: "./api/api.graphql",
|
|
209
|
+
ports: {
|
|
210
|
+
fakeServer: 4000,
|
|
211
|
+
apolloServer: 4002,
|
|
212
|
+
},
|
|
213
|
+
maxRegisteredSequences: 1000,
|
|
214
|
+
maxQueryDepth: 10,
|
|
215
|
+
maxFieldRecursionDepth: 9,
|
|
216
|
+
logLevel: "info",
|
|
217
|
+
/**
|
|
218
|
+
* @type {string[] | undefined}
|
|
219
|
+
* Allowed CORS origins for the fake server
|
|
220
|
+
* If undefined, it allows localhost and internal network connections only
|
|
221
|
+
* @example ["https://example.com", "https://app.example.com"]
|
|
222
|
+
*/
|
|
223
|
+
allowedCORSOrigins: undefined,
|
|
137
224
|
};
|
|
138
225
|
```
|
|
139
226
|
|
|
140
|
-
|
|
141
|
-
Please See [src/config.ts](src/config.ts)
|
|
227
|
+
`RequiredFakeServerConfig` schema:
|
|
142
228
|
|
|
143
229
|
```ts
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
*/
|
|
161
|
-
fakeServer?: number | undefined;
|
|
162
|
-
/**
|
|
163
|
-
* Apollo Server port.
|
|
164
|
-
* It provides the GraphQL Playground.
|
|
165
|
-
* Default is 4002.
|
|
166
|
-
*/
|
|
167
|
-
apolloServer?: number | undefined;
|
|
168
|
-
}
|
|
169
|
-
| undefined;
|
|
170
|
-
/**
|
|
171
|
-
* The maximum number of registered sequences.
|
|
172
|
-
* Default is 1000.
|
|
173
|
-
*/
|
|
174
|
-
maxRegisteredSequences?: number | undefined;
|
|
175
|
-
/**
|
|
176
|
-
* The maximum number of depth of field recursion.
|
|
177
|
-
* Default is 9.
|
|
178
|
-
*/
|
|
179
|
-
maxFieldRecursionDepth?: RawConfig["maxFieldRecursionDepth"] | undefined;
|
|
180
|
-
/**
|
|
181
|
-
* The maximum number of depth of complexity of query
|
|
182
|
-
* this value should be maxFieldRecursionDepth + 1
|
|
183
|
-
* Default is 10
|
|
184
|
-
*/
|
|
185
|
-
maxQueryDepth?: number | undefined;
|
|
186
|
-
/**
|
|
187
|
-
* Default values for scalar types.
|
|
188
|
-
*/
|
|
189
|
-
defaultValues?: RawConfig["defaultValues"] | undefined;
|
|
190
|
-
/**
|
|
191
|
-
* Log level: "debug", "info", "warn", "error"
|
|
192
|
-
* If you want to see the debug logs, set the logLevel to "debug".
|
|
193
|
-
* Default is "info".
|
|
194
|
-
*/
|
|
195
|
-
logLevel?: LogLevel | undefined;
|
|
196
|
-
/**
|
|
197
|
-
* Additional origins to allow for CORS requests.
|
|
198
|
-
* By default, only localhost and private IP ranges are allowed.
|
|
199
|
-
* This option allows you to specify additional origins to accept.
|
|
200
|
-
*/
|
|
201
|
-
allowedCORSOrigins?: string[] | undefined;
|
|
230
|
+
type RequiredFakeServerConfig = {
|
|
231
|
+
schemaFilePath: string;
|
|
232
|
+
ports: {
|
|
233
|
+
fakeServer: number;
|
|
234
|
+
apolloServer: number;
|
|
235
|
+
};
|
|
236
|
+
maxRegisteredSequences: number;
|
|
237
|
+
maxQueryDepth: number;
|
|
238
|
+
maxFieldRecursionDepth: number;
|
|
239
|
+
logLevel?: LogLevel;
|
|
240
|
+
/**
|
|
241
|
+
* Allowed CORS origins for the fake server
|
|
242
|
+
* If undefined, it allows localhost and internal network connections only
|
|
243
|
+
* @example ["https://example.com", "https://app.example.com"]
|
|
244
|
+
*/
|
|
245
|
+
allowedCORSOrigins?: string[] | undefined;
|
|
202
246
|
};
|
|
203
247
|
```
|
|
204
248
|
|
|
@@ -218,4 +262,4 @@ npm test
|
|
|
218
262
|
|
|
219
263
|
## License
|
|
220
264
|
|
|
221
|
-
MIT
|
|
265
|
+
MIT
|
package/dist/esm/cli.d.ts.map
CHANGED
|
@@ -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":";AA0BA,eAAO,MAAM,GAAG;;;;;;;;;CA0Bd,CAAC;AACH,eAAO,MAAM,GAAG,GAAU,cAEvB,OAAO,GAAS,KAAG,OAAO,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,GAAG,KAAK,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;CACvB,CA+CA,CAAC"}
|
package/dist/esm/cli.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { parseArgs } from "node:util";
|
|
3
|
-
import { loadConfig, loadFakeServerConfigFromCLI
|
|
3
|
+
import { loadConfig, loadFakeServerConfigFromCLI } from "./config.js";
|
|
4
4
|
import { createFakeServer } from "./index.js";
|
|
5
5
|
import { createLogger } from "./logger.js";
|
|
6
6
|
const HELP = `
|
package/dist/esm/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,2BAA2B,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAiB,MAAM,aAAa,CAAC;AAE1D,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;CAkBZ,CAAC;AACF,kBAAkB;AAClB,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;IACzB,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;IAC3B,OAAO,EAAE;QACL,GAAG,EAAE;YACD,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,2BAA2B;YACxC,OAAO,EAAE,OAAO,CAAC,GAAG,EAAE;SACzB;QACD,MAAM,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uBAAuB;SACvC;QACD,MAAM,EAAE;YACJ,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,uBAAuB;SACvC;QACD,QAAQ,EAAE;YACN,IAAI,EAAE,QAAQ;YACd,WAAW,EAAE,qCAAqC;YAClD,OAAO,EAAE,MAAM;SAClB;QACD,IAAI,EAAE;YACF,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,WAAW;SAC3B;KACJ;CACJ,CAAC,CAAC;AACH,MAAM,CAAC,MAAM,GAAG,GAAG,KAAK,EAAE,EACtB,MAAM,MACM,GAAG,EAKhB,EAAE;IACD,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;QACd,OAAO;YACH,MAAM,EAAE,IAAI;YACZ,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,CAAC;SACd,CAAC;IACN,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAgC,CAAC;IACzD,IAAI,CAAC,QAAQ,IAAI,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;QACtE,OAAO;YACH,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,oDAAoD;YAC5D,QAAQ,EAAE,CAAC;SACd,CAAC;IACN,CAAC;IACD,MAAM,cAAc,GAAG,MAAM,CAAC,MAAM,CAAC;IACrC,sCAAsC;IACtC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM;QACxB,CAAC,CAAC,MAAM,UAAU,CAAC,MAAM,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,MAAM,CAAC;QAC9D,CAAC,CAAC,2BAA2B,CAAC;YACxB,cAAc;YACd,QAAQ;SACX,CAAC,CAAC;IACT,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE,MAAM,CAAC,CAAC;IACjD,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,MAAM,CAAC,CAAC;QAC9C,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,KAAK,EAAE,CAAC;QACtC,MAAM,CAAC,IAAI,CAAC,wCAAwC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QACvE,MAAM,CAAC,IAAI,CAAC,yCAAyC,IAAI,CAAC,YAAY,EAAE,CAAC,CAAC;QAC1E,OAAO;YACH,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,EAAE;YACV,QAAQ,EAAE,CAAC;YACX,SAAS,EAAE,IAAI;SAClB,CAAC;IACN,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO;YACH,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,IAAI,KAAK,CAAC,wBAAwB,EAAE;gBACxC,KAAK,EAAE,KAAK;aACf,CAAC;YACF,QAAQ,EAAE,CAAC;SACd,CAAC;IACN,CAAC;AACL,CAAC,CAAC"}
|
package/dist/esm/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EACA;QACI;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC;;;;WAIG;QACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACrC,GACD,SAAS,CAAC;IAChB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,SAAS,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,yBAAyB,
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/config.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;GAEG;AACH,MAAM,MAAM,gBAAgB,GAAG;IAC3B;;OAEG;IACH,cAAc,EAAE,MAAM,CAAC;IACvB;;OAEG;IACH,KAAK,CAAC,EACA;QACI;;;WAGG;QACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;QAChC;;;;WAIG;QACH,YAAY,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;KACrC,GACD,SAAS,CAAC;IAChB;;;OAGG;IACH,sBAAsB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IAC5C;;;OAGG;IACH,sBAAsB,CAAC,EAAE,SAAS,CAAC,wBAAwB,CAAC,GAAG,SAAS,CAAC;IACzE;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;OAEG;IACH,aAAa,CAAC,EAAE,SAAS,CAAC,eAAe,CAAC,GAAG,SAAS,CAAC;IACvD;;;;OAIG;IACH,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;IAChC;;;;OAIG;IACH,kBAAkB,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;CAC7C,CAAC;AACF,MAAM,MAAM,wBAAwB,GAAG;IACnC,cAAc,EAAE,MAAM,CAAC;IACvB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,SAAS,CAAC,eAAe,CAAC,CAAC;IAC1C,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,eAAO,MAAM,yBAAyB,GAAI,QAAQ,gBAAgB,KAAG,wBAcpE,CAAC;AACF,eAAO,MAAM,wBAAwB,GAAI,QAAQ,gBAAgB,KAAG,gBA+CnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,GACnB,KAAK,MAAM,EACX,YAAY,MAAM,KACnB,OAAO,CAAC,wBAAwB,CAMlC,CAAC;AACF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,GAAI,+BAGzC;IACC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC,KAAG,wBAYH,CAAC"}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import vm from "node:vm";
|
|
2
|
+
import { generateCode, getTypeInfos, normalizeConfig } from "@newmo/graphql-fake-core";
|
|
3
|
+
import { createLogger } from "./logger.js";
|
|
4
|
+
const cloneAsJSON = (obj) => {
|
|
5
|
+
return JSON.parse(JSON.stringify(obj));
|
|
6
|
+
};
|
|
7
|
+
/**
|
|
8
|
+
* Create mock object from schema
|
|
9
|
+
* It supports @example directive
|
|
10
|
+
* @param options
|
|
11
|
+
*/
|
|
12
|
+
export const createMock = async (options) => {
|
|
13
|
+
const logger = createLogger(options.logLevel);
|
|
14
|
+
try {
|
|
15
|
+
const normalizedConfig = normalizeConfig({
|
|
16
|
+
maxFieldRecursionDepth: options.maxFieldRecursionDepth ?? 3,
|
|
17
|
+
});
|
|
18
|
+
const typeInfos = getTypeInfos(normalizedConfig, options.schema);
|
|
19
|
+
const code = generateCode({
|
|
20
|
+
...normalizedConfig,
|
|
21
|
+
outputType: "commonjs",
|
|
22
|
+
}, typeInfos);
|
|
23
|
+
logger.debug("Generated code:");
|
|
24
|
+
logger.debug(code);
|
|
25
|
+
// execute code in vm and get all exports
|
|
26
|
+
const exports = {};
|
|
27
|
+
vm.runInNewContext(code, { exports });
|
|
28
|
+
// Apollo Server does not support Function type in mock object
|
|
29
|
+
const plainObject = cloneAsJSON(exports);
|
|
30
|
+
logger.debug("Exports:");
|
|
31
|
+
logger.debug(JSON.stringify(plainObject, null, 2));
|
|
32
|
+
return plainObject;
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
logger.error(error);
|
|
36
|
+
process.exit(1);
|
|
37
|
+
}
|
|
38
|
+
};
|
|
39
|
+
//# sourceMappingURL=createMock.js.map
|
|
File without changes
|
package/dist/esm/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
+
export type { FakeServerConfig, RequiredFakeServerConfig } from "./config.js";
|
|
2
|
+
export { normalizeFakeServerConfig, validateFakeServerConfig, } from "./config.js";
|
|
3
|
+
export type { ConditionRule, CreateFakeServerOptions, RegisterSequenceNetworkError, RegisterSequenceOperation, RegisterSequenceOptions, } from "./server.js";
|
|
1
4
|
export { createFakeServer } from "./server.js";
|
|
2
|
-
export type { CreateFakeServerOptions } from "./server.js";
|
|
3
|
-
export type { FakeServerConfig, RequiredFakeServerConfig, } from "./config.js";
|
|
4
|
-
export { normalizeFakeServerConfig, validateFakeServerConfig } from "./config.js";
|
|
5
5
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,gBAAgB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,EACH,yBAAyB,EACzB,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AACrB,YAAY,EACR,aAAa,EACb,uBAAuB,EACvB,4BAA4B,EAC5B,yBAAyB,EACzB,uBAAuB,GAC1B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/esm/index.js
CHANGED
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AACA,OAAO,EACH,yBAAyB,EACzB,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AAQrB,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC"}
|
package/dist/esm/logger.d.ts.map
CHANGED
|
@@ -1 +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,
|
|
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,GAAI,WAAU,QAAiB;qBAE/B,OAAO,EAAE;oBAKV,OAAO,EAAE;oBAKT,OAAO,EAAE;qBAKR,OAAO,EAAE;CAIjC,CAAC"}
|
package/dist/esm/server.d.ts
CHANGED
|
@@ -19,40 +19,43 @@ type FakeServerInternal = {
|
|
|
19
19
|
logLevel: LogLevel;
|
|
20
20
|
allowedCORSOrigins: string[];
|
|
21
21
|
};
|
|
22
|
-
export type
|
|
23
|
-
type: "
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
export type RegisterSequenceOperation = {
|
|
29
|
-
type: "operation";
|
|
30
|
-
operationName: string;
|
|
31
|
-
data: Record<string, unknown>;
|
|
22
|
+
export type ConditionRule = {
|
|
23
|
+
type: "count";
|
|
24
|
+
value: number;
|
|
25
|
+
} | {
|
|
26
|
+
type: "variables";
|
|
27
|
+
value: Record<string, unknown>;
|
|
32
28
|
};
|
|
33
|
-
export type RegisterSequenceOptions = RegisterSequenceNetworkError | RegisterSequenceOperation;
|
|
34
29
|
export type CalledResult = {
|
|
35
30
|
requestTimestamp: number;
|
|
36
31
|
request: {
|
|
37
|
-
headers: Record<string,
|
|
32
|
+
headers: Record<string, string>;
|
|
38
33
|
body: Record<string, unknown>;
|
|
39
34
|
};
|
|
40
35
|
response: {
|
|
41
36
|
status: number;
|
|
42
|
-
headers: Record<string,
|
|
43
|
-
body:
|
|
37
|
+
headers: Record<string, string>;
|
|
38
|
+
body: unknown;
|
|
44
39
|
};
|
|
45
40
|
};
|
|
46
41
|
export type CalledResultResponse = {
|
|
47
|
-
ok:
|
|
42
|
+
ok: boolean;
|
|
48
43
|
data: CalledResult[];
|
|
49
44
|
};
|
|
50
|
-
export type
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
errors: string[];
|
|
45
|
+
export type RegisterSequenceNetworkError = {
|
|
46
|
+
type: "network-error";
|
|
47
|
+
operationName: string;
|
|
48
|
+
responseStatusCode: number;
|
|
49
|
+
errors: Record<string, unknown>[];
|
|
50
|
+
requestCondition?: ConditionRule;
|
|
55
51
|
};
|
|
52
|
+
export type RegisterSequenceOperation = {
|
|
53
|
+
type: "operation";
|
|
54
|
+
operationName: string;
|
|
55
|
+
data: Record<string, unknown>;
|
|
56
|
+
requestCondition?: ConditionRule;
|
|
57
|
+
};
|
|
58
|
+
export type RegisterSequenceOptions = RegisterSequenceNetworkError | RegisterSequenceOperation;
|
|
56
59
|
export declare const createFakeServer: (options: CreateFakeServerOptions) => Promise<{
|
|
57
60
|
start: () => Promise<{
|
|
58
61
|
urls: {
|
package/dist/esm/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AASA,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAOtD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,aAAa,CAAC;AAI1D,MAAM,MAAM,uBAAuB,GAAG,wBAAwB,GAAG;IAC7D,QAAQ,CAAC,EAAE,QAAQ,CAAC;IACpB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAEF,KAAK,kBAAkB,GAAG;IACtB,UAAU,EAAE,UAAU,CAAC;IACvB,MAAM,EAAE,aAAa,CAAC;IACtB,KAAK,EAAE;QACH,UAAU,EAAE,MAAM,CAAC;QACnB,YAAY,EAAE,MAAM,CAAC;KACxB,CAAC;IACF,aAAa,EAAE,MAAM,CAAC;IACtB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,sBAAsB,EAAE,MAAM,CAAC;IAC/B,QAAQ,EAAE,QAAQ,CAAC;IACnB,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAChC,CAAC;AAsFF,MAAM,MAAM,aAAa,GACnB;IACI,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACjB,GACD;IACI,IAAI,EAAE,WAAW,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAClC,CAAC;AAGR,MAAM,MAAM,YAAY,GAAG;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;IACF,QAAQ,EAAE;QACN,MAAM,EAAE,MAAM,CAAC;QACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,OAAO,CAAC;KACjB,CAAC;CACL,CAAC;AAGF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,EAAE,EAAE,OAAO,CAAC;IACZ,IAAI,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AAEF,MAAM,MAAM,4BAA4B,GAAG;IACvC,IAAI,EAAE,eAAe,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,CAAC;IAElC,gBAAgB,CAAC,EAAE,aAAa,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,yBAAyB,GAAG;IACpC,IAAI,EAAE,WAAW,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAE9B,gBAAgB,CAAC,EAAE,aAAa,CAAC;CACpC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;AA40B/F,eAAO,MAAM,gBAAgB,GAAU,SAAS,uBAAuB;;;;;;;;EAoCtE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,SAAS,kBAAkB;;;;;;;;EAmCzE,CAAC"}
|