Skip to content

Commit 56101c1

Browse files
authored
Fix int coercion of ID fields (#33)
* Fix int coercion of ID fields * Bugfixt
1 parent 544b2c9 commit 56101c1

File tree

5 files changed

+44
-19
lines changed

5 files changed

+44
-19
lines changed

dist/vuex-orm-graphql.esm.js

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10183,7 +10183,7 @@ var QueryBuilder = /** @class */ (function () {
1018310183
if (!name)
1018410184
name = (multiple ? model.pluralName : model.singularName);
1018510185
// build query
10186-
var query = type + " " + upcaseFirstLetter(name) + this.buildArguments(model, args, true, false) + " {\n" +
10186+
var query = type + " " + upcaseFirstLetter(name) + this.buildArguments(model, args, true, filter) + " {\n" +
1018710187
(" " + this.buildField(model, multiple, args, [], name, filter, true) + "\n") +
1018810188
"}";
1018910189
return src(query);
@@ -10230,10 +10230,17 @@ var QueryBuilder = /** @class */ (function () {
1023010230
if (value && !(value instanceof Array || skipFieldDueId)) {
1023110231
var typeOrValue = '';
1023210232
if (signature) {
10233+
var schema = Context.getInstance().schema;
10234+
var type = schema.getType(model.singularName + (filter ? 'Filter' : ''));
10235+
var schemaField = (filter ? type.inputFields : type.fields).find(function (f) { return f.name === key; });
1023310236
if (typeof value === 'object' && value.__type) {
1023410237
// Case 2 (User!)
1023510238
typeOrValue = value.__type + 'Input!';
1023610239
}
10240+
else if (schemaField && schemaField.type.name) {
10241+
// Case 1, 3 and 4
10242+
typeOrValue = schemaField.type.name + '!';
10243+
}
1023710244
else if (key === 'id' || isForeignKey) {
1023810245
// Case 1 (ID!)
1023910246
typeOrValue = 'ID!';
@@ -10253,7 +10260,7 @@ var QueryBuilder = /** @class */ (function () {
1025310260
}
1025410261
});
1025510262
if (!first) {
10256-
if (filter)
10263+
if (!signature && filter)
1025710264
returnValue = "filter: { " + returnValue + " }";
1025810265
returnValue = "(" + returnValue + ")";
1025910266
}

src/graphql/query-builder.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ export default class QueryBuilder {
118118

119119
// build query
120120
const query: string =
121-
`${type} ${upcaseFirstLetter(name)}${this.buildArguments(model, args, true, false)} {\n` +
121+
`${type} ${upcaseFirstLetter(name)}${this.buildArguments(model, args, true, filter)} {\n` +
122122
` ${this.buildField(model, multiple, args, [], name, filter, true)}\n` +
123123
`}`;
124124

@@ -168,9 +168,16 @@ export default class QueryBuilder {
168168
let typeOrValue: any = '';
169169

170170
if (signature) {
171+
const schema = Context.getInstance().schema!;
172+
const type = schema.getType(model.singularName + (filter ? 'Filter' : ''));
173+
const schemaField = (filter ? type.inputFields! : type.fields!).find(f => f.name === key);
174+
171175
if (typeof value === 'object' && value.__type) {
172176
// Case 2 (User!)
173177
typeOrValue = value.__type + 'Input!';
178+
} else if (schemaField && schemaField.type.name) {
179+
// Case 1, 3 and 4
180+
typeOrValue = schemaField.type.name + '!';
174181
} else if (key === 'id' || isForeignKey) {
175182
// Case 1 (ID!)
176183
typeOrValue = 'ID!';
@@ -191,7 +198,7 @@ export default class QueryBuilder {
191198
});
192199

193200
if (!first) {
194-
if (filter) returnValue = `filter: { ${returnValue} }`;
201+
if (!signature && filter) returnValue = `filter: { ${returnValue} }`;
195202
returnValue = `(${returnValue})`;
196203
}
197204
}

test/integration/VuexORMGraphQL.spec.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -279,13 +279,13 @@ query User($id: ID!) {
279279
};
280280

281281
const request = await sendWithMockFetch(response, async () => {
282-
await User.fetch({ active: true });
282+
await User.fetch({ specialId: 15 });
283283
});
284284

285-
expect(request.variables).toEqual({ active: true });
285+
expect(request.variables).toEqual({ specialId: 15 });
286286
expect(request.query).toEqual(`
287-
query Users($active: Boolean!) {
288-
users(filter: {active: $active}) {
287+
query Users($specialId: ID!) {
288+
users(filter: {specialId: $specialId}) {
289289
nodes {
290290
id
291291
name

test/support/mock-data.js

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ export const introspectionResult = {
686686
"type": {
687687
"__typename": "__Type",
688688
"kind": "SCALAR",
689-
"name": "Int",
689+
"name": "ID",
690690
},
691691
"isDeprecated": false,
692692
"deprecationReason": null
@@ -1014,7 +1014,7 @@ export const introspectionResult = {
10141014
"type": {
10151015
"__typename": "__Type",
10161016
"kind": "SCALAR",
1017-
"name": "Int",
1017+
"name": "ID",
10181018
},
10191019
"isDeprecated": false,
10201020
"deprecationReason": null
@@ -1196,7 +1196,7 @@ export const introspectionResult = {
11961196
"type": {
11971197
"__typename": "__Type",
11981198
"kind": "SCALAR",
1199-
"name": "Int",
1199+
"name": "ID",
12001200
},
12011201
"isDeprecated": false,
12021202
"deprecationReason": null
@@ -1378,7 +1378,7 @@ export const introspectionResult = {
13781378
"type": {
13791379
"__typename": "__Type",
13801380
"kind": "SCALAR",
1381-
"name": "Int",
1381+
"name": "ID",
13821382
},
13831383
"isDeprecated": false,
13841384
"deprecationReason": null
@@ -1390,7 +1390,7 @@ export const introspectionResult = {
13901390
"type": {
13911391
"__typename": "__Type",
13921392
"kind": "SCALAR",
1393-
"name": "Int",
1393+
"name": "ID",
13941394
},
13951395
"isDeprecated": false,
13961396
"deprecationReason": null
@@ -1762,7 +1762,7 @@ export const introspectionResult = {
17621762
"type": {
17631763
"__typename": "__Type",
17641764
"kind": "SCALAR",
1765-
"name": "Int",
1765+
"name": "ID",
17661766
},
17671767
"isDeprecated": false,
17681768
"deprecationReason": null
@@ -1924,7 +1924,18 @@ export const introspectionResult = {
19241924
"name": "UserFilter",
19251925
"description": null,
19261926
"fields": null,
1927-
"inputFields": [],
1927+
"inputFields": [
1928+
{
1929+
"__typename": "__InputValue",
1930+
"name": "specialId",
1931+
"description": null,
1932+
"type": {
1933+
"__typename": "__Type",
1934+
"name": "ID",
1935+
"kind": "SCALAR"
1936+
}
1937+
}
1938+
],
19281939
"interfaces": null,
19291940
"enumValues": null,
19301941
"possibleTypes": null
@@ -2944,7 +2955,7 @@ export const introspectionResult = {
29442955
"description": null,
29452956
"type": {
29462957
"__typename": "__Type",
2947-
"name": "Int",
2958+
"name": "ID",
29482959
"kind": "SCALAR"
29492960
},
29502961
},
@@ -3012,7 +3023,7 @@ export const introspectionResult = {
30123023
"description": null,
30133024
"type": {
30143025
"__typename": "__Type",
3015-
"name": "Int",
3026+
"name": "ID",
30163027
"kind": "SCALAR"
30173028
},
30183029
},
@@ -3119,7 +3130,7 @@ export const introspectionResult = {
31193130
"type": {
31203131
"__typename": "__Type",
31213132
"kind": "SCALAR",
3122-
"name": "Int",
3133+
"name": "ID",
31233134
},
31243135
},
31253136
],

test/unit/QueryBuilder.spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -388,7 +388,7 @@ mutation DeleteUser($id: ID!) {
388388

389389
it('returns Int for number typed fields', () => {
390390
const model = context.getModel('post');
391-
expect(QueryBuilder.determineAttributeType(model, 'userId', 15)).toEqual('Int');
391+
expect(QueryBuilder.determineAttributeType(model, 'userId', 15)).toEqual('ID');
392392
});
393393

394394
it('returns Boolean for boolean typed fields', () => {

0 commit comments

Comments
 (0)