@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 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
- method: "POST",
48
- headers: {
49
- "Content-Type": "application/json",
50
- "sequence-id": sequenceId,
51
- },
52
- body: JSON.stringify({
53
- operationName: "CreateBook",
54
- query: `
55
- mutation CreateBook($title: String!) {
56
- createBook(title: $title) {
57
- id
58
- title
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 the fake data for `sequence-id` and `operationName`.
67
+ Register fake response for GraphQL operation.
72
68
 
73
69
  ```js
74
70
  await fetch(`${urls.fakeServer}/fake`, {
75
- method: "POST",
76
- headers: {
77
- "Content-Type": "application/json",
78
- "sequence-id": sequenceId,
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
- body: JSON.stringify({
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
- method: "POST",
100
- headers: {
101
- "Content-Type": "application/json",
102
- "sequence-id": sequenceId,
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
- body: JSON.stringify({
105
- operationName: "CreateBook",
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
- schemaFilePath: "./api/api.graphql",
123
- ports: {
124
- fakeServer: 4000,
125
- apolloServer: 4002,
126
- },
127
- maxRegisteredSequences: 1000,
128
- maxFieldRecursionDepth: 9,
129
- maxQueryDepth: 10,
130
- defaultValues: {
131
- String: "string",
132
- Int: 1,
133
- Float: 1.1,
134
- Boolean: true,
135
- },
136
- allowedCORSOrigins: ["http://eample.localhost:3000"]
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
- * Configuration for the fake server.
146
- */
147
- export type FakeServerConfig = {
148
- /**
149
- * The path to the GraphQL schema file from cwd.
150
- */
151
- schemaFilePath: string;
152
- /**
153
- * The ports for the fake server and Apollo Server.
154
- */
155
- ports?:
156
- | {
157
- /**
158
- * Fake Server port.
159
- * Default is 4000.
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
@@ -1 +1 @@
1
- {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli.ts"],"names":[],"mappings":";AA+BA,eAAO,MAAM,GAAG;;;;;;;;;CA0Bd,CAAC;AACH,eAAO,MAAM,GAAG,iBAEb,OAAO,GAAG,KAAS,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"}
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, } from "./config.js";
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 = `
@@ -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 +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,WAAY,gBAAgB,KAAG,wBAcpE,CAAC;AACF,eAAO,MAAM,wBAAwB,WAAY,gBAAgB,KAAG,gBA+CnE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,UAAU,QACd,MAAM,cACC,MAAM,KACnB,OAAO,CAAC,wBAAwB,CAMlC,CAAC;AACF;;;GAGG;AACH,eAAO,MAAM,2BAA2B,kCAGrC;IACC,cAAc,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,QAAQ,CAAC,EAAE,QAAQ,GAAG,SAAS,CAAC;CACnC,KAAG,wBAYH,CAAC"}
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
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAC/C,YAAY,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC3D,YAAY,EACR,gBAAgB,EAChB,wBAAwB,GAC3B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
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
@@ -1,3 +1,3 @@
1
+ export { normalizeFakeServerConfig, validateFakeServerConfig, } from "./config.js";
1
2
  export { createFakeServer } from "./server.js";
2
- export { normalizeFakeServerConfig, validateFakeServerConfig } from "./config.js";
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAM/C,OAAO,EAAE,yBAAyB,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC"}
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"}
@@ -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,cAAc,QAAQ;qBAEtB,OAAO,EAAE;oBAKV,OAAO,EAAE;oBAKT,OAAO,EAAE;qBAKR,OAAO,EAAE;CAIjC,CAAC"}
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"}
@@ -19,40 +19,43 @@ type FakeServerInternal = {
19
19
  logLevel: LogLevel;
20
20
  allowedCORSOrigins: string[];
21
21
  };
22
- export type RegisterSequenceNetworkError = {
23
- type: "network-error";
24
- operationName: string;
25
- responseStatusCode: number;
26
- errors: Record<string, unknown>[];
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, unknown>;
32
+ headers: Record<string, string>;
38
33
  body: Record<string, unknown>;
39
34
  };
40
35
  response: {
41
36
  status: number;
42
- headers: Record<string, unknown>;
43
- body: Record<string, unknown>;
37
+ headers: Record<string, string>;
38
+ body: unknown;
44
39
  };
45
40
  };
46
41
  export type CalledResultResponse = {
47
- ok: true;
42
+ ok: boolean;
48
43
  data: CalledResult[];
49
44
  };
50
- export type RegisterOperationResponse = {
51
- ok: true;
52
- } | {
53
- ok: false;
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: {
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,KAAK,UAAU,EAAc,MAAM,0BAA0B,CAAC;AAKvE,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAItD,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,aAAa,CAAC;AAC5D,OAAO,EAAE,KAAK,QAAQ,EAAgB,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;AA8EF,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;CACrC,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;CACjC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;AAC/F,MAAM,MAAM,YAAY,GAAG;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,OAAO,EAAE;QACL,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACjC,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,OAAO,CAAC,CAAC;QACjC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;KACjC,CAAC;CACL,CAAC;AACF,MAAM,MAAM,oBAAoB,GAAG;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,IAAI,EAAE,YAAY,EAAE,CAAC;CACxB,CAAC;AACF,MAAM,MAAM,yBAAyB,GAC/B;IACI,EAAE,EAAE,IAAI,CAAC;CACZ,GACD;IACI,EAAE,EAAE,KAAK,CAAC;IACV,MAAM,EAAE,MAAM,EAAE,CAAC;CACpB,CAAC;AAkaR,eAAO,MAAM,gBAAgB,YAAmB,uBAAuB;;;;;;;;EAoCtE,CAAC;AAEF,eAAO,MAAM,wBAAwB,YAAmB,kBAAkB;;;;;;;;EAmCzE,CAAC"}
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"}