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 +31 -7
- package/package.json +1 -1
- package/script/proxy.js +31 -7
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
|
|
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[
|
|
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
|
-
|
|
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 =
|
|
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
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
|
|
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[
|
|
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
|
-
|
|
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 =
|
|
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,
|