@newmo/graphql-fake-server 0.20.0 → 0.21.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
@@ -109,38 +109,10 @@ You can register fake responses with conditions that determine when they should
109
109
 
110
110
  #### Supported Conditions
111
111
 
112
- - **Count condition**: Return a specific response on the nth call
113
112
  - **Variables condition**: Return a specific response when variables match exactly
114
113
 
115
114
  #### Examples
116
115
 
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,
133
- },
134
- data: {
135
- user: {
136
- id: "user123",
137
- name: "Second Call User",
138
- },
139
- },
140
- }),
141
- });
142
- ```
143
-
144
116
  **Variables-based condition:**
145
117
 
146
118
  ```js
@@ -172,26 +144,12 @@ When no condition matches, the server falls back to the declarative fake data de
172
144
 
173
145
  #### Condition Restrictions
174
146
 
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
147
+ To ensure predictable behavior, variables-based conditions and default (no condition) responses can coexist for the same operation within a sequence.
179
148
 
180
149
  ✅ **Allowed combinations:**
181
150
 
182
151
  - Variables + Default: You can have both variables-specific responses and a default fallback
183
152
  - 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
- ```
195
153
 
196
154
  ## Config
197
155
 
package/dist/esm/cli.js CHANGED
File without changes
@@ -20,8 +20,7 @@ type FakeServerInternal = {
20
20
  allowedCORSOrigins: string[];
21
21
  };
22
22
  export type ConditionRule = {
23
- type: "count";
24
- value: number;
23
+ type: "always";
25
24
  } | {
26
25
  type: "variables";
27
26
  value: Record<string, unknown>;
@@ -47,13 +46,13 @@ export type RegisterSequenceNetworkError = {
47
46
  operationName: string;
48
47
  responseStatusCode: number;
49
48
  errors: Record<string, unknown>[];
50
- requestCondition?: ConditionRule;
49
+ requestCondition: ConditionRule;
51
50
  };
52
51
  export type RegisterSequenceOperation = {
53
52
  type: "operation";
54
53
  operationName: string;
55
54
  data: Record<string, unknown>;
56
- requestCondition?: ConditionRule;
55
+ requestCondition: ConditionRule;
57
56
  };
58
57
  export type RegisterSequenceOptions = RegisterSequenceNetworkError | RegisterSequenceOperation;
59
58
  export declare const createFakeServer: (options: CreateFakeServerOptions) => Promise<{
@@ -1 +1 @@
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"}
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,QAAQ,CAAC;CAClB,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,EAAE,aAAa,CAAC;CACnC,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,EAAE,aAAa,CAAC;CACnC,CAAC;AACF,MAAM,MAAM,uBAAuB,GAAG,4BAA4B,GAAG,yBAAyB,CAAC;AA0qB/F,eAAO,MAAM,gBAAgB,GAAU,SAAS,uBAAuB;;;;;;;;EAoCtE,CAAC;AAEF,eAAO,MAAM,wBAAwB,GAAU,SAAS,kBAAkB;;;;;;;;EAmCzE,CAAC"}
@@ -76,95 +76,7 @@ const creteApolloServer = async (options) => {
76
76
  });
77
77
  };
78
78
  // Allowed condition types
79
- const ALLOWED_CONDITION_TYPES = ["count", "variables"];
80
- /**
81
- * Check if two condition types are conflicting and return specific error message
82
- * Only the following combinations are allowed:
83
- * - count + count
84
- * - variables + variables
85
- * - variables + no condition (undefined)
86
- * - no condition (undefined) + no condition (undefined)
87
- * All other combinations are conflicting
88
- */
89
- const areConditionTypesConflicting = (conditionType1, conditionType2) => {
90
- // Define allowed combinations with their descriptions
91
- const allowedCombinations = new Map([
92
- // Multiple count conditions for the same operation (e.g., 1st call, 2nd call)
93
- ["count,count", "Multiple count-based conditions are allowed for different call counts"],
94
- // Multiple variables conditions for the same operation (e.g., different variable sets)
95
- [
96
- "variables,variables",
97
- "Multiple variable-based conditions are allowed for different variable sets",
98
- ],
99
- // Variables condition can coexist with default fallback
100
- ["variables,undefined", "Variable-based condition can coexist with default fallback"],
101
- // Default fallback can coexist with variables condition
102
- ["undefined,variables", "Default fallback can coexist with variable-based condition"],
103
- // Multiple default conditions - overwrite with the last one
104
- ["undefined,undefined", "Multiple default conditions are allowed (latest will be used)"],
105
- ]);
106
- const combinationKey = `${conditionType1 ?? "undefined"},${conditionType2 ?? "undefined"}`;
107
- // If the combination is allowed, return no conflict
108
- if (allowedCombinations.has(combinationKey)) {
109
- return { isConflicting: false };
110
- }
111
- // Generate specific error message for conflicting combinations
112
- const getTypeDescription = (type) => {
113
- switch (type) {
114
- case "count":
115
- return "count-based condition (e.g., { type: 'count', value: 1 })";
116
- case "variables":
117
- return "variables-based condition (e.g., { type: 'variables', value: {...} })";
118
- case undefined:
119
- return "default condition (no requestCondition specified)";
120
- default:
121
- return `unknown condition type: ${type}`;
122
- }
123
- };
124
- const type1Desc = getTypeDescription(conditionType1);
125
- const type2Desc = getTypeDescription(conditionType2);
126
- // Specific error messages for common problematic combinations
127
- if ((conditionType1 === "count" && conditionType2 === "variables") ||
128
- (conditionType1 === "variables" && conditionType2 === "count")) {
129
- const errorMessage = "Cannot mix count-based and variables-based conditions for the same operation. " +
130
- "Use either multiple count conditions (for different call numbers) or multiple variables conditions (for different variable sets), " +
131
- `but not both. Current conflict: ${type1Desc} vs ${type2Desc}`;
132
- return { isConflicting: true, errorMessage };
133
- }
134
- const errorMessage = `Conflicting condition types detected: ${type1Desc} vs ${type2Desc}. ` +
135
- "Allowed combinations are: count+count, variables+variables, variables+default, or default+default.";
136
- return { isConflicting: true, errorMessage };
137
- };
138
- /**
139
- * Get condition type from a RegisterSequenceOptions
140
- */
141
- const getConditionType = (fake) => {
142
- return fake.requestCondition?.type;
143
- };
144
- /**
145
- * Check for condition conflicts in existing fakes for the same operation
146
- */
147
- const checkConditionConflicts = (newFake, existingConditionalFakes, existingDefaultFake) => {
148
- const errors = [];
149
- const newConditionType = getConditionType(newFake);
150
- // Check conflicts with existing conditional fakes
151
- for (const existingFake of existingConditionalFakes) {
152
- const existingConditionType = getConditionType(existingFake);
153
- const conflictResult = areConditionTypesConflicting(newConditionType, existingConditionType);
154
- if (conflictResult.isConflicting && conflictResult.errorMessage) {
155
- errors.push(conflictResult.errorMessage);
156
- }
157
- }
158
- // Check conflicts with existing default fake (no condition)
159
- if (existingDefaultFake) {
160
- const existingConditionType = getConditionType(existingDefaultFake);
161
- const conflictResult = areConditionTypesConflicting(newConditionType, existingConditionType);
162
- if (conflictResult.isConflicting && conflictResult.errorMessage) {
163
- errors.push(conflictResult.errorMessage);
164
- }
165
- }
166
- return errors;
167
- };
79
+ const ALLOWED_CONDITION_TYPES = ["always", "variables"];
168
80
  /**
169
81
  * Validate condition rule structure
170
82
  */
@@ -185,22 +97,14 @@ const validateConditionRule = (condition) => {
185
97
  error: `Unknown condition type '${condition.type}'. Allowed types: ${ALLOWED_CONDITION_TYPES.join(", ")}`,
186
98
  };
187
99
  }
188
- if (!("value" in condition)) {
189
- return { ok: false, error: "Condition must have a 'value' field" };
190
- }
191
100
  switch (condition.type) {
192
- case "count":
193
- if (typeof condition.value !== "number") {
194
- return { ok: false, error: "Count condition value must be a number" };
195
- }
196
- if (condition.value <= 0) {
197
- return {
198
- ok: false,
199
- error: "Count condition value must be greater than 0",
200
- };
201
- }
101
+ case "always":
102
+ // Always condition doesn't need a value
202
103
  return { ok: true, data: condition };
203
104
  case "variables":
105
+ if (!("value" in condition)) {
106
+ return { ok: false, error: "Variables condition must have a 'value' field" };
107
+ }
204
108
  if (typeof condition.value !== "object" || condition.value === null) {
205
109
  return {
206
110
  ok: false,
@@ -225,15 +129,23 @@ const validateSequenceRegistration = (data) => {
225
129
  if (typeof data !== "object" || data === null) {
226
130
  return { ok: false, error: "Request body must be an object" };
227
131
  }
228
- // Validate request condition
229
- if ("requestCondition" in data && data.requestCondition !== undefined) {
230
- const conditionResult = validateConditionRule(data.requestCondition);
132
+ // Validate request condition (default to "always" if not provided)
133
+ const requestCondition = "requestCondition" in data ? data.requestCondition : { type: "always" };
134
+ if (requestCondition !== undefined) {
135
+ const conditionResult = validateConditionRule(requestCondition);
231
136
  if (!conditionResult.ok) {
232
137
  return {
233
138
  ok: false,
234
- error: `Invalid request condition: ${conditionResult.error}`,
139
+ error: `Invalid request conditions: ${conditionResult.error}`,
235
140
  };
236
141
  }
142
+ return {
143
+ ok: true,
144
+ data: {
145
+ ...data,
146
+ requestCondition: conditionResult.data,
147
+ },
148
+ };
237
149
  }
238
150
  if (!("type" in data) || typeof data.type !== "string") {
239
151
  return {
@@ -269,6 +181,12 @@ const validateSequenceRegistration = (data) => {
269
181
  error: "Operation type must have a 'data' field of type object",
270
182
  };
271
183
  }
184
+ if (Array.isArray(data.data)) {
185
+ return {
186
+ ok: false,
187
+ error: "Array responses are no longer supported. Use single object responses instead.",
188
+ };
189
+ }
272
190
  return { ok: true, data: data };
273
191
  }
274
192
  return {
@@ -430,10 +348,6 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
430
348
  const conditionalFakeResponseMap = new LRUMap({
431
349
  maxSize: maxRegisteredSequences,
432
350
  });
433
- // Track call count
434
- const callCountMap = new LRUMap({
435
- maxSize: maxRegisteredSequences,
436
- });
437
351
  // sequenceId x operationName -> Called Result
438
352
  // CalledResult is first request is index 0, second request is index 1 and so on
439
353
  const sequenceCalledResultLruMap = new LRUMap({
@@ -474,42 +388,30 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
474
388
  sequenceId,
475
389
  operationName,
476
390
  });
477
- // Check for condition conflicts before registration
478
- const existingConditionalFakes = conditionalFakeResponseMap.get(baseKey) || [];
479
- const existingDefaultFake = sequenceFakeResponseLruMap.get(baseKey);
480
- const conflictErrors = checkConditionConflicts(validationResult.data, existingConditionalFakes, existingDefaultFake);
481
- if (conflictErrors.length > 0) {
482
- return Response.json({ ok: false, errors: conflictErrors }, {
483
- status: 400,
484
- });
485
- }
486
- // Register as conditional fake if request condition exists
487
- if (validationResult.data.requestCondition) {
391
+ // Determine if this has specific conditions (not just "always")
392
+ const hasSpecificConditions = validationResult.data.requestCondition.type !== "always";
393
+ if (hasSpecificConditions) {
488
394
  const existingConditionalFakes = conditionalFakeResponseMap.get(baseKey) || [];
489
395
  // Overwrite if same condition exists, otherwise add new
490
- const existingIndex = existingConditionalFakes.findIndex((fake) => fake.requestCondition &&
491
- JSON.stringify(fake.requestCondition) ===
492
- JSON.stringify(validationResult.data.requestCondition));
396
+ const existingIndex = existingConditionalFakes.findIndex((fake) => JSON.stringify(fake.requestCondition) ===
397
+ JSON.stringify(validationResult.data.requestCondition));
493
398
  if (existingIndex >= 0) {
494
399
  existingConditionalFakes[existingIndex] = validationResult.data;
495
400
  }
496
401
  else {
497
402
  existingConditionalFakes.push(validationResult.data);
498
403
  }
499
- // Sort by condition specificity (evaluate more specific conditions first)
404
+ // Sort by condition specificity for deterministic ordering
500
405
  existingConditionalFakes.sort((a, b) => {
501
- const scoreA = a.requestCondition
502
- ? calculateConditionSpecificity(a.requestCondition)
503
- : 0;
504
- const scoreB = b.requestCondition
505
- ? calculateConditionSpecificity(b.requestCondition)
506
- : 0;
507
- return scoreB - scoreA; // Descending order
406
+ const scoreA = calculateConditionSpecificity(a.requestCondition);
407
+ const scoreB = calculateConditionSpecificity(b.requestCondition);
408
+ // Sort by specificity (descending)
409
+ return scoreB - scoreA;
508
410
  });
509
411
  conditionalFakeResponseMap.set(baseKey, existingConditionalFakes);
510
412
  }
511
413
  else {
512
- // Without condition, use traditional approach
414
+ // Without condition or with "always" condition, use traditional approach
513
415
  sequenceFakeResponseLruMap.set(baseKey, validationResult.data);
514
416
  }
515
417
  return Response.json({ ok: true }, {
@@ -562,9 +464,7 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
562
464
  * 2. Does it contain a sequence id?
563
465
  * - if Yes: type is network error → return an error
564
466
  * - if No: Pass through to Apollo Server -> exit
565
- * 3. Send a request to Apollo Server
566
- * 4. Merge the registration data with the response from 3
567
- * 5. Return the merged data
467
+ * 3. Return the fake data directly
568
468
  */
569
469
  const sequenceId = c.req.header("sequence-id");
570
470
  logger.debug("fakeGraphQLQuery: getting request body", { sequenceId });
@@ -595,9 +495,6 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
595
495
  sequenceId,
596
496
  operationName: requestOperationName,
597
497
  });
598
- // Increment call count
599
- const currentCallCount = (callCountMap.get(baseKey) || 0) + 1;
600
- callCountMap.set(baseKey, currentCallCount);
601
498
  // Get request variables
602
499
  const requestVariables = typeof requestBody === "object" &&
603
500
  requestBody !== null &&
@@ -608,11 +505,20 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
608
505
  : undefined;
609
506
  // Check conditional fakes first
610
507
  const conditionalFakes = conditionalFakeResponseMap.get(baseKey);
611
- // Find the first matching conditional fake based on call count and variables
508
+ logger.debug("fakeGraphQLQuery: conditional fakes check", {
509
+ sequenceId,
510
+ operationName: requestOperationName,
511
+ conditionalFakesCount: conditionalFakes?.length || 0,
512
+ conditionalFakes: conditionalFakes?.map((fake) => ({
513
+ type: fake.type,
514
+ requestCondition: fake.requestCondition,
515
+ })),
516
+ requestVariables,
517
+ });
518
+ // Find the first matching conditional fake based on variables
612
519
  // If no conditional fake matches, use the default fake from sequenceFakeResponseLruMap
613
520
  const matchedFake = findMatchedConditionalFake({
614
521
  conditionalFakes: conditionalFakes,
615
- currentCallCount: currentCallCount,
616
522
  requestVariables: requestVariables,
617
523
  logger: logger,
618
524
  sequenceId: sequenceId,
@@ -622,7 +528,6 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
622
528
  matchedFake,
623
529
  sequenceId,
624
530
  operationName: requestOperationName,
625
- callCount: currentCallCount,
626
531
  });
627
532
  if (!matchedFake) {
628
533
  logger.debug("fakeGraphQLQuery: no fake found, passing to Apollo");
@@ -668,41 +573,13 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
668
573
  status: matchedFake.responseStatusCode,
669
574
  });
670
575
  }
671
- // 3. Send a request to Apollo Server
672
- logger.debug("fakeGraphQLQuery: sending request to apollo server", {
673
- sequenceId,
674
- });
675
- const proxyResponse = await proxy(`http://${ENV_HOSTNAME}:${ports.apolloServer}/graphql`, {
676
- raw: c.req.raw,
677
- headers: {
678
- ...c.req.header(),
679
- },
576
+ // 3. Return the fake data directly (no need to call Apollo Server)
577
+ const fakeData = matchedFake.data;
578
+ logger.debug(`fakeGraphQLQuery: returning fake data sequence-id: ${sequenceId}`, {
579
+ fakeData,
680
580
  });
681
- logger.debug("fakeGraphQLQuery: apollo server response completed", {
682
- sequenceId,
683
- status: proxyResponse.status,
684
- headers: Object.fromEntries(proxyResponse.headers),
685
- });
686
- if (proxyResponse.status === 101)
687
- return proxyResponse;
688
- // 4. Get response body
689
- logger.debug("fakeGraphQLQuery: getting response body");
690
- const responseBody = (await proxyResponse.json());
691
- logger.debug("fakeGraphQLQuery: parsed response body", {
692
- responseBody,
693
- });
694
- // 5. Merge the registration data with the response
695
- const data = matchedFake.data;
696
- logger.debug(`fakeGraphQLQuery: starting data merge sequence-id: ${sequenceId}`, {
697
- data,
698
- responseBody,
699
- });
700
- // Use bracket notation for properties from index signature
701
- const responseData = responseBody["data"];
702
- const merged = {
703
- ...(typeof responseData === "object" && responseData !== null ? responseData : {}),
704
- ...data,
705
- };
581
+ // Handle single response
582
+ const responseData = fakeData;
706
583
  const cacheKey = createMapKey({
707
584
  sequenceId,
708
585
  operationName: requestOperationName,
@@ -716,22 +593,21 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
716
593
  body: requestBody,
717
594
  },
718
595
  response: {
719
- status: proxyResponse.status,
720
- headers: Object.fromEntries(proxyResponse.headers),
596
+ status: 200,
597
+ headers: { "Content-Type": "application/json" },
721
598
  body: {
722
- data: merged,
599
+ data: responseData,
723
600
  },
724
601
  },
725
602
  },
726
603
  ]);
727
- logger.debug("fakeGraphQLQuery: merge completed, returning response");
728
- // "content-length" should be matched from the response body length
729
- const responseJson = JSON.stringify({ data: merged });
604
+ logger.debug("fakeGraphQLQuery: returning fake response");
605
+ // Let the server automatically calculate Content-Length to avoid issues with multi-byte characters
606
+ const responseJson = JSON.stringify({ data: responseData });
730
607
  return new Response(responseJson, {
731
- status: proxyResponse.status,
608
+ status: 200,
732
609
  headers: {
733
610
  "Content-Type": "application/json",
734
- "Content-Length": responseJson.length.toString(),
735
611
  },
736
612
  });
737
613
  };
@@ -760,7 +636,7 @@ const createRoutingServer = async ({ logLevel, ports, maxRegisteredSequences, al
760
636
  }));
761
637
  app.use("/graphql", fakeGraphQLQuery);
762
638
  app.use("/query", fakeGraphQLQuery);
763
- app.all("*", passToApollo);
639
+ app.all("*", (c) => passToApollo(c));
764
640
  return app;
765
641
  };
766
642
  export const createFakeServer = async (options) => {
@@ -828,8 +704,8 @@ export const createFakeServerInternal = async (options) => {
828
704
  */
829
705
  const evaluateCondition = (condition, context) => {
830
706
  switch (condition.type) {
831
- case "count":
832
- return context.callCount === condition.value;
707
+ case "always":
708
+ return true;
833
709
  case "variables":
834
710
  if (!context.variables)
835
711
  return false;
@@ -843,8 +719,8 @@ const evaluateCondition = (condition, context) => {
843
719
  */
844
720
  const calculateConditionSpecificity = (condition) => {
845
721
  switch (condition.type) {
846
- case "count":
847
- return 10; // count conditions have medium priority
722
+ case "always":
723
+ return 0; // always conditions have lowest priority
848
724
  case "variables":
849
725
  return 20; // variables conditions have high priority
850
726
  default:
@@ -852,28 +728,32 @@ const calculateConditionSpecificity = (condition) => {
852
728
  }
853
729
  };
854
730
  /**
855
- * Find a matching conditional fake based on the current call count and request variables
731
+ * Find a matching conditional fake based on the request variables
856
732
  */
857
- const findMatchedConditionalFake = ({ conditionalFakes, currentCallCount, requestVariables, logger, sequenceId, requestOperationName, }) => {
733
+ const findMatchedConditionalFake = ({ conditionalFakes, requestVariables, logger, sequenceId, requestOperationName, }) => {
858
734
  if (conditionalFakes && conditionalFakes.length > 0) {
859
735
  // Find matching fake (already sorted by specificity in descending order)
860
736
  for (const fake of conditionalFakes) {
861
- if (fake.requestCondition) {
862
- const context = {
863
- callCount: currentCallCount,
864
- ...(requestVariables && { variables: requestVariables }),
865
- };
866
- if (evaluateCondition(fake.requestCondition, context)) {
867
- logger.debug("fakeGraphQLQuery: matched conditional fake", {
868
- sequenceId,
869
- operationName: requestOperationName,
870
- requestCondition: fake.requestCondition,
871
- callCount: currentCallCount,
872
- variables: requestVariables,
873
- });
874
- return fake;
875
- }
737
+ const context = {
738
+ ...(requestVariables && { variables: requestVariables }),
739
+ };
740
+ if (evaluateCondition(fake.requestCondition, context)) {
741
+ logger.debug("fakeGraphQLQuery: matched conditional fake", {
742
+ sequenceId,
743
+ operationName: requestOperationName,
744
+ requestCondition: fake.requestCondition,
745
+ variables: requestVariables,
746
+ evaluationContext: context,
747
+ });
748
+ return fake;
876
749
  }
750
+ logger.debug("fakeGraphQLQuery: conditional fake did not match", {
751
+ sequenceId,
752
+ operationName: requestOperationName,
753
+ requestCondition: fake.requestCondition,
754
+ variables: requestVariables,
755
+ evaluationContext: context,
756
+ });
877
757
  }
878
758
  }
879
759
  return undefined;
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newmo/graphql-fake-server",
3
- "version": "0.20.0",
3
+ "version": "0.21.0",
4
4
  "private": false,
5
5
  "description": "GraphQL fake server for testing",
6
6
  "keywords": [
@@ -52,7 +52,7 @@
52
52
  "@graphql-tools/mock": "^9.0.23",
53
53
  "@graphql-tools/schema": "^10.0.23",
54
54
  "@hono/node-server": "^1.14.4",
55
- "@newmo/graphql-fake-core": "0.20.0",
55
+ "@newmo/graphql-fake-core": "0.21.0",
56
56
  "cors": "^2.8.5",
57
57
  "express": "^5.1.0",
58
58
  "graphql-depth-limit": "^1.1.0",
@@ -80,5 +80,5 @@
80
80
  "access": "public",
81
81
  "registry": "https://registry.npmjs.org/"
82
82
  },
83
- "gitHead": "e7fb0401bb3d6d989adfc98cc15ec4c936bc0cde"
83
+ "gitHead": "251e1b4311a0f070af89abc7e49f6aa1e9b075c0"
84
84
  }
package/src/server.ts CHANGED
@@ -118,7 +118,7 @@ const creteApolloServer = async (options: FakeServerInternal) => {
118
118
  });
119
119
  };
120
120
  // Allowed condition types
121
- const ALLOWED_CONDITION_TYPES = ["count", "variables"] as const;
121
+ const ALLOWED_CONDITION_TYPES = ["always", "variables"] as const;
122
122
  type AllowedConditionType = (typeof ALLOWED_CONDITION_TYPES)[number];
123
123
 
124
124
  // Validation result type for better error messages
@@ -127,9 +127,8 @@ type ValidationResult<T> = { ok: true; data: T } | { ok: false; error: string };
127
127
  // Condition rules for conditional fake responses
128
128
  export type ConditionRule =
129
129
  | {
130
- type: "count";
131
- value: number;
132
- } // Match based on call count (nth call)
130
+ type: "always";
131
+ } // Always match (default condition)
133
132
  | {
134
133
  type: "variables";
135
134
  value: Record<string, unknown>;
@@ -160,134 +159,18 @@ export type RegisterSequenceNetworkError = {
160
159
  operationName: string;
161
160
  responseStatusCode: number;
162
161
  errors: Record<string, unknown>[];
163
- // Add request condition
164
- requestCondition?: ConditionRule;
162
+ // Request condition is now required (defaults to "always" if not specified)
163
+ requestCondition: ConditionRule;
165
164
  };
166
165
  export type RegisterSequenceOperation = {
167
166
  type: "operation";
168
167
  operationName: string;
169
168
  data: Record<string, unknown>;
170
- // Add request condition
171
- requestCondition?: ConditionRule;
169
+ // Request condition is now required (defaults to "always" if not specified)
170
+ requestCondition: ConditionRule;
172
171
  };
173
172
  export type RegisterSequenceOptions = RegisterSequenceNetworkError | RegisterSequenceOperation;
174
173
 
175
- /**
176
- * Check if two condition types are conflicting and return specific error message
177
- * Only the following combinations are allowed:
178
- * - count + count
179
- * - variables + variables
180
- * - variables + no condition (undefined)
181
- * - no condition (undefined) + no condition (undefined)
182
- * All other combinations are conflicting
183
- */
184
- const areConditionTypesConflicting = (
185
- conditionType1: ConditionRule["type"] | undefined,
186
- conditionType2: ConditionRule["type"] | undefined,
187
- ): { isConflicting: boolean; errorMessage?: string } => {
188
- // Define allowed combinations with their descriptions
189
- const allowedCombinations = new Map<string, string>([
190
- // Multiple count conditions for the same operation (e.g., 1st call, 2nd call)
191
- ["count,count", "Multiple count-based conditions are allowed for different call counts"],
192
- // Multiple variables conditions for the same operation (e.g., different variable sets)
193
- [
194
- "variables,variables",
195
- "Multiple variable-based conditions are allowed for different variable sets",
196
- ],
197
- // Variables condition can coexist with default fallback
198
- ["variables,undefined", "Variable-based condition can coexist with default fallback"],
199
- // Default fallback can coexist with variables condition
200
- ["undefined,variables", "Default fallback can coexist with variable-based condition"],
201
- // Multiple default conditions - overwrite with the last one
202
- ["undefined,undefined", "Multiple default conditions are allowed (latest will be used)"],
203
- ]);
204
-
205
- const combinationKey = `${conditionType1 ?? "undefined"},${conditionType2 ?? "undefined"}`;
206
-
207
- // If the combination is allowed, return no conflict
208
- if (allowedCombinations.has(combinationKey)) {
209
- return { isConflicting: false };
210
- }
211
-
212
- // Generate specific error message for conflicting combinations
213
- const getTypeDescription = (type: ConditionRule["type"] | undefined): string => {
214
- switch (type) {
215
- case "count":
216
- return "count-based condition (e.g., { type: 'count', value: 1 })";
217
- case "variables":
218
- return "variables-based condition (e.g., { type: 'variables', value: {...} })";
219
- case undefined:
220
- return "default condition (no requestCondition specified)";
221
- default:
222
- return `unknown condition type: ${type}`;
223
- }
224
- };
225
-
226
- const type1Desc = getTypeDescription(conditionType1);
227
- const type2Desc = getTypeDescription(conditionType2);
228
-
229
- // Specific error messages for common problematic combinations
230
- if (
231
- (conditionType1 === "count" && conditionType2 === "variables") ||
232
- (conditionType1 === "variables" && conditionType2 === "count")
233
- ) {
234
- const errorMessage =
235
- "Cannot mix count-based and variables-based conditions for the same operation. " +
236
- "Use either multiple count conditions (for different call numbers) or multiple variables conditions (for different variable sets), " +
237
- `but not both. Current conflict: ${type1Desc} vs ${type2Desc}`;
238
- return { isConflicting: true, errorMessage };
239
- }
240
- const errorMessage =
241
- `Conflicting condition types detected: ${type1Desc} vs ${type2Desc}. ` +
242
- "Allowed combinations are: count+count, variables+variables, variables+default, or default+default.";
243
- return { isConflicting: true, errorMessage };
244
- };
245
-
246
- /**
247
- * Get condition type from a RegisterSequenceOptions
248
- */
249
- const getConditionType = (fake: RegisterSequenceOptions): ConditionRule["type"] | undefined => {
250
- return fake.requestCondition?.type;
251
- };
252
-
253
- /**
254
- * Check for condition conflicts in existing fakes for the same operation
255
- */
256
- const checkConditionConflicts = (
257
- newFake: RegisterSequenceOptions,
258
- existingConditionalFakes: RegisterSequenceOptions[],
259
- existingDefaultFake: RegisterSequenceOptions | undefined,
260
- ): string[] => {
261
- const errors: string[] = [];
262
- const newConditionType = getConditionType(newFake);
263
-
264
- // Check conflicts with existing conditional fakes
265
- for (const existingFake of existingConditionalFakes) {
266
- const existingConditionType = getConditionType(existingFake);
267
- const conflictResult = areConditionTypesConflicting(
268
- newConditionType,
269
- existingConditionType,
270
- );
271
- if (conflictResult.isConflicting && conflictResult.errorMessage) {
272
- errors.push(conflictResult.errorMessage);
273
- }
274
- }
275
-
276
- // Check conflicts with existing default fake (no condition)
277
- if (existingDefaultFake) {
278
- const existingConditionType = getConditionType(existingDefaultFake);
279
- const conflictResult = areConditionTypesConflicting(
280
- newConditionType,
281
- existingConditionType,
282
- );
283
- if (conflictResult.isConflicting && conflictResult.errorMessage) {
284
- errors.push(conflictResult.errorMessage);
285
- }
286
- }
287
-
288
- return errors;
289
- };
290
-
291
174
  /**
292
175
  * Validate condition rule structure
293
176
  */
@@ -313,24 +196,15 @@ const validateConditionRule = (condition: unknown): ValidationResult<ConditionRu
313
196
  };
314
197
  }
315
198
 
316
- if (!("value" in condition)) {
317
- return { ok: false, error: "Condition must have a 'value' field" };
318
- }
319
-
320
199
  switch (condition.type) {
321
- case "count":
322
- if (typeof condition.value !== "number") {
323
- return { ok: false, error: "Count condition value must be a number" };
324
- }
325
- if (condition.value <= 0) {
326
- return {
327
- ok: false,
328
- error: "Count condition value must be greater than 0",
329
- };
330
- }
200
+ case "always":
201
+ // Always condition doesn't need a value
331
202
  return { ok: true, data: condition as ConditionRule };
332
203
 
333
204
  case "variables":
205
+ if (!("value" in condition)) {
206
+ return { ok: false, error: "Variables condition must have a 'value' field" };
207
+ }
334
208
  if (typeof condition.value !== "object" || condition.value === null) {
335
209
  return {
336
210
  ok: false,
@@ -358,15 +232,25 @@ const validateSequenceRegistration = (data: unknown): ValidationResult<RegisterS
358
232
  return { ok: false, error: "Request body must be an object" };
359
233
  }
360
234
 
361
- // Validate request condition
362
- if ("requestCondition" in data && data.requestCondition !== undefined) {
363
- const conditionResult = validateConditionRule(data.requestCondition);
235
+ // Validate request condition (default to "always" if not provided)
236
+ const requestCondition =
237
+ "requestCondition" in data ? data.requestCondition : { type: "always" };
238
+
239
+ if (requestCondition !== undefined) {
240
+ const conditionResult = validateConditionRule(requestCondition);
364
241
  if (!conditionResult.ok) {
365
242
  return {
366
243
  ok: false,
367
- error: `Invalid request condition: ${conditionResult.error}`,
244
+ error: `Invalid request conditions: ${conditionResult.error}`,
368
245
  };
369
246
  }
247
+ return {
248
+ ok: true,
249
+ data: {
250
+ ...data,
251
+ requestCondition: conditionResult.data,
252
+ } as RegisterSequenceOptions,
253
+ };
370
254
  }
371
255
 
372
256
  if (!("type" in data) || typeof data.type !== "string") {
@@ -406,6 +290,12 @@ const validateSequenceRegistration = (data: unknown): ValidationResult<RegisterS
406
290
  error: "Operation type must have a 'data' field of type object",
407
291
  };
408
292
  }
293
+ if (Array.isArray(data.data)) {
294
+ return {
295
+ ok: false,
296
+ error: "Array responses are no longer supported. Use single object responses instead.",
297
+ };
298
+ }
409
299
  return { ok: true, data: data as RegisterSequenceOptions };
410
300
  }
411
301
 
@@ -602,10 +492,6 @@ const createRoutingServer = async ({
602
492
  const conditionalFakeResponseMap = new LRUMap<string, RegisterSequenceOptions[]>({
603
493
  maxSize: maxRegisteredSequences,
604
494
  });
605
- // Track call count
606
- const callCountMap = new LRUMap<string, number>({
607
- maxSize: maxRegisteredSequences,
608
- });
609
495
  // sequenceId x operationName -> Called Result
610
496
  // CalledResult is first request is index 0, second request is index 1 and so on
611
497
  const sequenceCalledResultLruMap = new LRUMap<string, CalledResult[]>({
@@ -654,34 +540,16 @@ const createRoutingServer = async ({
654
540
  operationName,
655
541
  });
656
542
 
657
- // Check for condition conflicts before registration
658
- const existingConditionalFakes = conditionalFakeResponseMap.get(baseKey) || [];
659
- const existingDefaultFake = sequenceFakeResponseLruMap.get(baseKey);
543
+ // Determine if this has specific conditions (not just "always")
544
+ const hasSpecificConditions = validationResult.data.requestCondition.type !== "always";
660
545
 
661
- const conflictErrors = checkConditionConflicts(
662
- validationResult.data,
663
- existingConditionalFakes,
664
- existingDefaultFake,
665
- );
666
-
667
- if (conflictErrors.length > 0) {
668
- return Response.json(
669
- { ok: false, errors: conflictErrors },
670
- {
671
- status: 400,
672
- },
673
- );
674
- }
675
-
676
- // Register as conditional fake if request condition exists
677
- if (validationResult.data.requestCondition) {
546
+ if (hasSpecificConditions) {
678
547
  const existingConditionalFakes = conditionalFakeResponseMap.get(baseKey) || [];
679
548
  // Overwrite if same condition exists, otherwise add new
680
549
  const existingIndex = existingConditionalFakes.findIndex(
681
550
  (fake) =>
682
- fake.requestCondition &&
683
551
  JSON.stringify(fake.requestCondition) ===
684
- JSON.stringify(validationResult.data.requestCondition),
552
+ JSON.stringify(validationResult.data.requestCondition),
685
553
  );
686
554
 
687
555
  if (existingIndex >= 0) {
@@ -690,20 +558,18 @@ const createRoutingServer = async ({
690
558
  existingConditionalFakes.push(validationResult.data);
691
559
  }
692
560
 
693
- // Sort by condition specificity (evaluate more specific conditions first)
561
+ // Sort by condition specificity for deterministic ordering
694
562
  existingConditionalFakes.sort((a, b) => {
695
- const scoreA = a.requestCondition
696
- ? calculateConditionSpecificity(a.requestCondition)
697
- : 0;
698
- const scoreB = b.requestCondition
699
- ? calculateConditionSpecificity(b.requestCondition)
700
- : 0;
701
- return scoreB - scoreA; // Descending order
563
+ const scoreA = calculateConditionSpecificity(a.requestCondition);
564
+ const scoreB = calculateConditionSpecificity(b.requestCondition);
565
+
566
+ // Sort by specificity (descending)
567
+ return scoreB - scoreA;
702
568
  });
703
569
 
704
570
  conditionalFakeResponseMap.set(baseKey, existingConditionalFakes);
705
571
  } else {
706
- // Without condition, use traditional approach
572
+ // Without condition or with "always" condition, use traditional approach
707
573
  sequenceFakeResponseLruMap.set(baseKey, validationResult.data);
708
574
  }
709
575
  return Response.json(
@@ -771,9 +637,7 @@ const createRoutingServer = async ({
771
637
  * 2. Does it contain a sequence id?
772
638
  * - if Yes: type is network error → return an error
773
639
  * - if No: Pass through to Apollo Server -> exit
774
- * 3. Send a request to Apollo Server
775
- * 4. Merge the registration data with the response from 3
776
- * 5. Return the merged data
640
+ * 3. Return the fake data directly
777
641
  */
778
642
  const sequenceId = c.req.header("sequence-id");
779
643
 
@@ -812,10 +676,6 @@ const createRoutingServer = async ({
812
676
  operationName: requestOperationName,
813
677
  });
814
678
 
815
- // Increment call count
816
- const currentCallCount = (callCountMap.get(baseKey) || 0) + 1;
817
- callCountMap.set(baseKey, currentCallCount);
818
-
819
679
  // Get request variables
820
680
  const requestVariables =
821
681
  typeof requestBody === "object" &&
@@ -828,12 +688,22 @@ const createRoutingServer = async ({
828
688
 
829
689
  // Check conditional fakes first
830
690
  const conditionalFakes = conditionalFakeResponseMap.get(baseKey);
831
- // Find the first matching conditional fake based on call count and variables
691
+
692
+ logger.debug("fakeGraphQLQuery: conditional fakes check", {
693
+ sequenceId,
694
+ operationName: requestOperationName,
695
+ conditionalFakesCount: conditionalFakes?.length || 0,
696
+ conditionalFakes: conditionalFakes?.map((fake) => ({
697
+ type: fake.type,
698
+ requestCondition: fake.requestCondition,
699
+ })),
700
+ requestVariables,
701
+ });
702
+ // Find the first matching conditional fake based on variables
832
703
  // If no conditional fake matches, use the default fake from sequenceFakeResponseLruMap
833
704
  const matchedFake: RegisterSequenceOptions | undefined =
834
705
  findMatchedConditionalFake({
835
706
  conditionalFakes: conditionalFakes,
836
- currentCallCount: currentCallCount,
837
707
  requestVariables: requestVariables,
838
708
  logger: logger,
839
709
  sequenceId: sequenceId,
@@ -848,7 +718,6 @@ const createRoutingServer = async ({
848
718
  matchedFake,
849
719
  sequenceId,
850
720
  operationName: requestOperationName,
851
- callCount: currentCallCount,
852
721
  },
853
722
  );
854
723
 
@@ -907,45 +776,14 @@ const createRoutingServer = async ({
907
776
  );
908
777
  }
909
778
 
910
- // 3. Send a request to Apollo Server
911
- logger.debug("fakeGraphQLQuery: sending request to apollo server", {
912
- sequenceId,
913
- });
914
-
915
- const proxyResponse = await proxy(`http://${ENV_HOSTNAME}:${ports.apolloServer}/graphql`, {
916
- raw: c.req.raw,
917
- headers: {
918
- ...c.req.header(),
919
- },
920
- });
921
-
922
- logger.debug("fakeGraphQLQuery: apollo server response completed", {
923
- sequenceId,
924
- status: proxyResponse.status,
925
- headers: Object.fromEntries(proxyResponse.headers),
779
+ // 3. Return the fake data directly (no need to call Apollo Server)
780
+ const fakeData = matchedFake.data;
781
+ logger.debug(`fakeGraphQLQuery: returning fake data sequence-id: ${sequenceId}`, {
782
+ fakeData,
926
783
  });
927
784
 
928
- if (proxyResponse.status === 101) return proxyResponse;
929
-
930
- // 4. Get response body
931
- logger.debug("fakeGraphQLQuery: getting response body");
932
- const responseBody = (await proxyResponse.json()) as Record<string, unknown>;
933
- logger.debug("fakeGraphQLQuery: parsed response body", {
934
- responseBody,
935
- });
936
-
937
- // 5. Merge the registration data with the response
938
- const data = matchedFake.data;
939
- logger.debug(`fakeGraphQLQuery: starting data merge sequence-id: ${sequenceId}`, {
940
- data,
941
- responseBody,
942
- });
943
- // Use bracket notation for properties from index signature
944
- const responseData = responseBody["data"] as unknown;
945
- const merged = {
946
- ...(typeof responseData === "object" && responseData !== null ? responseData : {}),
947
- ...data,
948
- };
785
+ // Handle single response
786
+ const responseData = fakeData;
949
787
 
950
788
  const cacheKey = createMapKey({
951
789
  sequenceId,
@@ -960,23 +798,22 @@ const createRoutingServer = async ({
960
798
  body: requestBody as Record<string, unknown>,
961
799
  },
962
800
  response: {
963
- status: proxyResponse.status,
964
- headers: Object.fromEntries(proxyResponse.headers),
801
+ status: 200,
802
+ headers: { "Content-Type": "application/json" },
965
803
  body: {
966
- data: merged,
804
+ data: responseData,
967
805
  },
968
806
  },
969
807
  },
970
808
  ]);
971
809
 
972
- logger.debug("fakeGraphQLQuery: merge completed, returning response");
973
- // "content-length" should be matched from the response body length
974
- const responseJson = JSON.stringify({ data: merged });
810
+ logger.debug("fakeGraphQLQuery: returning fake response");
811
+ // Let the server automatically calculate Content-Length to avoid issues with multi-byte characters
812
+ const responseJson = JSON.stringify({ data: responseData });
975
813
  return new Response(responseJson, {
976
- status: proxyResponse.status,
814
+ status: 200,
977
815
  headers: {
978
816
  "Content-Type": "application/json",
979
- "Content-Length": responseJson.length.toString(),
980
817
  },
981
818
  });
982
819
  };
@@ -1011,7 +848,7 @@ const createRoutingServer = async ({
1011
848
  );
1012
849
  app.use("/graphql", fakeGraphQLQuery);
1013
850
  app.use("/query", fakeGraphQLQuery);
1014
- app.all("*", passToApollo);
851
+ app.all("*", (c) => passToApollo(c));
1015
852
  return app;
1016
853
  };
1017
854
  export const createFakeServer = async (options: CreateFakeServerOptions) => {
@@ -1095,13 +932,12 @@ export const createFakeServerInternal = async (options: FakeServerInternal) => {
1095
932
  const evaluateCondition = (
1096
933
  condition: ConditionRule,
1097
934
  context: {
1098
- callCount: number;
1099
935
  variables?: Record<string, unknown>;
1100
936
  },
1101
937
  ): boolean => {
1102
938
  switch (condition.type) {
1103
- case "count":
1104
- return context.callCount === condition.value;
939
+ case "always":
940
+ return true;
1105
941
 
1106
942
  case "variables":
1107
943
  if (!context.variables) return false;
@@ -1117,8 +953,8 @@ const evaluateCondition = (
1117
953
  */
1118
954
  const calculateConditionSpecificity = (condition: ConditionRule): number => {
1119
955
  switch (condition.type) {
1120
- case "count":
1121
- return 10; // count conditions have medium priority
956
+ case "always":
957
+ return 0; // always conditions have lowest priority
1122
958
 
1123
959
  case "variables":
1124
960
  return 20; // variables conditions have high priority
@@ -1129,18 +965,16 @@ const calculateConditionSpecificity = (condition: ConditionRule): number => {
1129
965
  };
1130
966
 
1131
967
  /**
1132
- * Find a matching conditional fake based on the current call count and request variables
968
+ * Find a matching conditional fake based on the request variables
1133
969
  */
1134
970
  const findMatchedConditionalFake = ({
1135
971
  conditionalFakes,
1136
- currentCallCount,
1137
972
  requestVariables,
1138
973
  logger,
1139
974
  sequenceId,
1140
975
  requestOperationName,
1141
976
  }: {
1142
977
  conditionalFakes: RegisterSequenceOptions[] | undefined;
1143
- currentCallCount: number;
1144
978
  requestVariables: Record<string, unknown> | undefined;
1145
979
  logger: ReturnType<typeof createLogger>;
1146
980
  sequenceId: string;
@@ -1149,23 +983,27 @@ const findMatchedConditionalFake = ({
1149
983
  if (conditionalFakes && conditionalFakes.length > 0) {
1150
984
  // Find matching fake (already sorted by specificity in descending order)
1151
985
  for (const fake of conditionalFakes) {
1152
- if (fake.requestCondition) {
1153
- const context = {
1154
- callCount: currentCallCount,
1155
- ...(requestVariables && { variables: requestVariables }),
1156
- };
986
+ const context = {
987
+ ...(requestVariables && { variables: requestVariables }),
988
+ };
1157
989
 
1158
- if (evaluateCondition(fake.requestCondition, context)) {
1159
- logger.debug("fakeGraphQLQuery: matched conditional fake", {
1160
- sequenceId,
1161
- operationName: requestOperationName,
1162
- requestCondition: fake.requestCondition,
1163
- callCount: currentCallCount,
1164
- variables: requestVariables,
1165
- });
1166
- return fake;
1167
- }
990
+ if (evaluateCondition(fake.requestCondition, context)) {
991
+ logger.debug("fakeGraphQLQuery: matched conditional fake", {
992
+ sequenceId,
993
+ operationName: requestOperationName,
994
+ requestCondition: fake.requestCondition,
995
+ variables: requestVariables,
996
+ evaluationContext: context,
997
+ });
998
+ return fake;
1168
999
  }
1000
+ logger.debug("fakeGraphQLQuery: conditional fake did not match", {
1001
+ sequenceId,
1002
+ operationName: requestOperationName,
1003
+ requestCondition: fake.requestCondition,
1004
+ variables: requestVariables,
1005
+ evaluationContext: context,
1006
+ });
1169
1007
  }
1170
1008
  }
1171
1009
  return undefined;
File without changes
File without changes
@@ -1,39 +0,0 @@
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