Skip to content

Commit

Permalink
Add support for defining args at field level in a type
Browse files Browse the repository at this point in the history
  • Loading branch information
larsbs committed Dec 15, 2016
1 parent c63339d commit 10fec06
Show file tree
Hide file tree
Showing 4 changed files with 36 additions and 4 deletions.
2 changes: 1 addition & 1 deletion .eslintrc
Original file line number Diff line number Diff line change
Expand Up @@ -14,8 +14,8 @@
"no-var": 1,
"prefer-const": 1,
"no-trailing-spaces": 1,
"comma-dangle": [1, "always"],
"quotes": [2, "single"],
"comma-dangle": [2, "never"],
"indent": [2, 2, { "SwitchCase": 2 }],
"semi": [2, "always"]
}
Expand Down
24 changes: 22 additions & 2 deletions lib/graysql/type.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ class Type {
listeners = listeners || {};
this._listeners = {
onGenerateType: listeners.onGenerateType || [],
onParseTypeField: listeners.onParseTypeField || []
onParseTypeField: listeners.onParseTypeField || [],
onParseQueryArg: listeners.onParseQueryArg || [],
};
}

Expand Down Expand Up @@ -46,7 +47,26 @@ class Type {
finalField = Object.assign(finalField, listener({ key, field, type, types }));
}
return Object.assign({}, finalField, {
type: Utils.parseType(finalField.type, types)
type: Utils.parseType(finalField.type, types),
args: this._parseArgs(field.args),
});
}

_parseArgs(args) {
const finalArgs = {};
for (const key in args) {
finalArgs[key] = this._parseArg(key, args[key]);
}
return finalArgs;
}

_parseArg(key, arg) {
let finalArg = Object.assign({}, arg);
for (const listener of this._listeners.onParseQueryArg) {
finalArg = Object.assign(finalArg, listener({ key, arg }));
}
return Object.assign({}, finalArg, {
type: Utils.parseType(finalArg.type)
});
}

Expand Down
9 changes: 8 additions & 1 deletion test/support/types/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,14 @@ module.exports = function (GQL) {
fields: {
id: { type: 'Int' },
nick: { type: 'String' },
group: { type: 'Group' }
group: { type: 'Group' },
dummy: {
type: 'String',
args: {
id: { type: 'String' },
},
resolve: () => 'Hello dummy!',
},
},
queries: {
user: {
Expand Down
5 changes: 5 additions & 0 deletions test/unit/graysql/type.js
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,11 @@ module.exports = function (Type) {
expect(finalTypes['User']).to.include.keys(Object.keys(User));
expect(finalTypes['User']._typeConfig.fields()).to.include.keys(Object.keys(User._typeConfig.fields()));
});
it('should parse args in fields', function () {
expect(finalTypes['User']._typeConfig.fields().dummy).to.include.keys(['args']);
expect(finalTypes['User']._typeConfig.fields().dummy.args).to.include.keys(['id']);
expect(finalTypes['User']._typeConfig.fields().dummy.args.id.type.name).to.equal('String');
});
it('should link to other GraphQLObjectTypes if specified', function () {
expect(finalTypes['User']._typeConfig.fields().group.type).to.equal(finalTypes['Group']);
expect(JSON.stringify(finalTypes['Group']._typeConfig.fields().members.type)).to.equal(JSON.stringify(new graphql.GraphQLList(finalTypes['User'])));
Expand Down

0 comments on commit 10fec06

Please sign in to comment.