graphql-data-generator 0.3.0-alpha.21 → 0.3.0-alpha.22

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/esm/proxy.js CHANGED
@@ -100,7 +100,7 @@ const resolveType = (definitions, path) => {
100
100
  }
101
101
  return { parent, definition, type: type };
102
102
  };
103
- const resolveConcreteType = (definitions, definition, patch, prev) => {
103
+ const resolveConcreteType = (definitions, definition, patch, prev, selectionSet) => {
104
104
  const objectDefinitions = definitions.filter((d) => d.kind === Kind.OBJECT_TYPE_DEFINITION);
105
105
  const interfaceDefinitions = definitions.filter((d) => d.kind === Kind.INTERFACE_TYPE_DEFINITION);
106
106
  let options = [];
@@ -121,10 +121,15 @@ const resolveConcreteType = (definitions, definition, patch, prev) => {
121
121
  }
122
122
  if (options.length === 1)
123
123
  return options[0];
124
- for (const field in patch) {
124
+ for (const alias in patch) {
125
+ const field = selectionSet
126
+ ? getSelectionField(definitions, selectionSet, alias)?.name.value ?? alias
127
+ : alias;
125
128
  options = options.filter((o) => field === "__typename"
126
- ? o.name.value === patch[field]
127
- : o.fields?.some((f) => f.name.value === field));
129
+ ? o.name.value === patch[alias]
130
+ : o.fields?.some((f) => f.name.value === field) ||
131
+ (definition.kind === Kind.INTERFACE_TYPE_DEFINITION &&
132
+ definition.fields?.some((f) => f.name.value === field)));
128
133
  if (options.length === 1)
129
134
  return options[0];
130
135
  }
@@ -184,7 +189,9 @@ const getSelectionField = (definitions, selectionSet, selection, typename) => {
184
189
  case Kind.INLINE_FRAGMENT: {
185
190
  if (!s.typeCondition || !typename ||
186
191
  s.typeCondition.name.value === typename) {
187
- return getSelectionField(definitions, s.selectionSet, selection, typename);
192
+ const value = getSelectionField(definitions, s.selectionSet, selection, typename);
193
+ if (value)
194
+ return value;
188
195
  }
189
196
  }
190
197
  }
@@ -241,6 +248,23 @@ const selectionSetToKeys = (definitions, selectionSet, typename) => {
241
248
  }
242
249
  return keys;
243
250
  };
251
+ const getField = (definitions, definition, name) => {
252
+ const field = definition.fields?.find((f) => f.name.value === name);
253
+ if (field)
254
+ return field;
255
+ if (definition.kind !== Kind.OBJECT_TYPE_DEFINITION ||
256
+ !definition.interfaces?.length)
257
+ return;
258
+ for (const interfaceName of definition.interfaces) {
259
+ const interfaceDefinition = definitions.find((d) => d.kind === Kind.INTERFACE_TYPE_DEFINITION &&
260
+ d.name.value === interfaceName.name.value);
261
+ if (!interfaceDefinition)
262
+ continue;
263
+ const field = interfaceDefinition.fields?.find((f) => f.name.value === name);
264
+ if (field)
265
+ return field;
266
+ }
267
+ };
244
268
  const _proxy = (definitions, scalars, path, patches, { prev, resolvedType = resolveType(definitions, path), selectionSet, nonNull, } = {}) => {
245
269
  const { parent = path, definition } = resolvedType;
246
270
  let type = resolvedType.type;
@@ -343,7 +367,7 @@ const _proxy = (definitions, scalars, path, patches, { prev, resolvedType = reso
343
367
  ? getSelectionField(definitions, selectionSet, prop)
344
368
  : undefined;
345
369
  const unaliased = selectionField ? selectionField.name.value : prop;
346
- const field = definition.fields?.find((f) => f.name.value === unaliased);
370
+ const field = getField(definitions, definition, unaliased);
347
371
  if (!field)
348
372
  return target[prop];
349
373
  // Get from patch
@@ -428,7 +452,7 @@ const _proxy = (definitions, scalars, path, patches, { prev, resolvedType = reso
428
452
  case Kind.UNION_TYPE_DEFINITION:
429
453
  case Kind.INTERFACE_TYPE_DEFINITION: {
430
454
  // When creating prev, we need hint the desired type...
431
- const concreteType = resolveConcreteType(definitions, definition, patch, prev);
455
+ const concreteType = resolveConcreteType(definitions, definition, patch, prev, selectionSet);
432
456
  return _proxy(definitions, scalars, concreteType.name.value, patches, {
433
457
  prev,
434
458
  selectionSet,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "graphql-data-generator",
3
- "version": "0.3.0-alpha.21",
3
+ "version": "0.3.0-alpha.22",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git+https://github.com/voces/graphql-data-generator.git"
package/script/proxy.js CHANGED
@@ -104,7 +104,7 @@ const resolveType = (definitions, path) => {
104
104
  }
105
105
  return { parent, definition, type: type };
106
106
  };
107
- const resolveConcreteType = (definitions, definition, patch, prev) => {
107
+ const resolveConcreteType = (definitions, definition, patch, prev, selectionSet) => {
108
108
  const objectDefinitions = definitions.filter((d) => d.kind === graphql_1.Kind.OBJECT_TYPE_DEFINITION);
109
109
  const interfaceDefinitions = definitions.filter((d) => d.kind === graphql_1.Kind.INTERFACE_TYPE_DEFINITION);
110
110
  let options = [];
@@ -125,10 +125,15 @@ const resolveConcreteType = (definitions, definition, patch, prev) => {
125
125
  }
126
126
  if (options.length === 1)
127
127
  return options[0];
128
- for (const field in patch) {
128
+ for (const alias in patch) {
129
+ const field = selectionSet
130
+ ? getSelectionField(definitions, selectionSet, alias)?.name.value ?? alias
131
+ : alias;
129
132
  options = options.filter((o) => field === "__typename"
130
- ? o.name.value === patch[field]
131
- : o.fields?.some((f) => f.name.value === field));
133
+ ? o.name.value === patch[alias]
134
+ : o.fields?.some((f) => f.name.value === field) ||
135
+ (definition.kind === graphql_1.Kind.INTERFACE_TYPE_DEFINITION &&
136
+ definition.fields?.some((f) => f.name.value === field)));
132
137
  if (options.length === 1)
133
138
  return options[0];
134
139
  }
@@ -188,7 +193,9 @@ const getSelectionField = (definitions, selectionSet, selection, typename) => {
188
193
  case graphql_1.Kind.INLINE_FRAGMENT: {
189
194
  if (!s.typeCondition || !typename ||
190
195
  s.typeCondition.name.value === typename) {
191
- return getSelectionField(definitions, s.selectionSet, selection, typename);
196
+ const value = getSelectionField(definitions, s.selectionSet, selection, typename);
197
+ if (value)
198
+ return value;
192
199
  }
193
200
  }
194
201
  }
@@ -245,6 +252,23 @@ const selectionSetToKeys = (definitions, selectionSet, typename) => {
245
252
  }
246
253
  return keys;
247
254
  };
255
+ const getField = (definitions, definition, name) => {
256
+ const field = definition.fields?.find((f) => f.name.value === name);
257
+ if (field)
258
+ return field;
259
+ if (definition.kind !== graphql_1.Kind.OBJECT_TYPE_DEFINITION ||
260
+ !definition.interfaces?.length)
261
+ return;
262
+ for (const interfaceName of definition.interfaces) {
263
+ const interfaceDefinition = definitions.find((d) => d.kind === graphql_1.Kind.INTERFACE_TYPE_DEFINITION &&
264
+ d.name.value === interfaceName.name.value);
265
+ if (!interfaceDefinition)
266
+ continue;
267
+ const field = interfaceDefinition.fields?.find((f) => f.name.value === name);
268
+ if (field)
269
+ return field;
270
+ }
271
+ };
248
272
  const _proxy = (definitions, scalars, path, patches, { prev, resolvedType = resolveType(definitions, path), selectionSet, nonNull, } = {}) => {
249
273
  const { parent = path, definition } = resolvedType;
250
274
  let type = resolvedType.type;
@@ -347,7 +371,7 @@ const _proxy = (definitions, scalars, path, patches, { prev, resolvedType = reso
347
371
  ? getSelectionField(definitions, selectionSet, prop)
348
372
  : undefined;
349
373
  const unaliased = selectionField ? selectionField.name.value : prop;
350
- const field = definition.fields?.find((f) => f.name.value === unaliased);
374
+ const field = getField(definitions, definition, unaliased);
351
375
  if (!field)
352
376
  return target[prop];
353
377
  // Get from patch
@@ -432,7 +456,7 @@ const _proxy = (definitions, scalars, path, patches, { prev, resolvedType = reso
432
456
  case graphql_1.Kind.UNION_TYPE_DEFINITION:
433
457
  case graphql_1.Kind.INTERFACE_TYPE_DEFINITION: {
434
458
  // When creating prev, we need hint the desired type...
435
- const concreteType = resolveConcreteType(definitions, definition, patch, prev);
459
+ const concreteType = resolveConcreteType(definitions, definition, patch, prev, selectionSet);
436
460
  return _proxy(definitions, scalars, concreteType.name.value, patches, {
437
461
  prev,
438
462
  selectionSet,