Comments (7)
Could you describe use case for this a bit more?
from typegql.
Also, note you could just:
import { Arg } from 'typegql'
const paramIndex = 3;
Arg({
type: String,
isNullable: true
})(targetClass, fieldName, paramIndex);
And I think it's very similar to what you've written in your example :) The only difference is that you'd need to set paramIndex
as number instead of name.
from typegql.
@pie6k I tried that exact thing on a dynamically added property and it did not work. It might work if I call it on a property which is defined at design time. I'd like to add both the property and the param decorator at runtime.
I will put together a testcase.
from typegql.
Could you please describe why exactly you need this?
from typegql.
sure. For our production API at @LeapLabs we use objection.js as our abstraction over a database. We have many models-around 40 with many relations between them. Usually a model has at least 1, but we have many which have 4-6 and more.
We could have gone and added a relation @Field()
resolver for each relation in every model, but that would just be copy pasting the same code all over the place. So instead we've got a custom class decorator which we put on a objection.js class. This decorator at runtime adds @Field()
resolver for each relation in that class by inspecting static relationMappings
on that class.
It basically adds a @Field()
which gives us the relations themselves and it adds another @Field()
for getting a count of those related entities.
For these fields which are added at runtime I would like to have Arguments as well and that's where I face this issue.
from typegql.
I've added test case and it works:
it('Will allow registering argument at runtime', () => {
@ObjectType()
class Foo {
@Field()
bar(
baz: string,
bazRequired: string,
): string {
return baz;
}
}
Arg({type: String, isNullable: true})(Foo.prototype, 'bar', 0);
Arg({type: String, isNullable: false})(Foo.prototype, 'bar', 1);
const [bazArg, bazRequiredArg] = compileObjectType(
Foo,
).getFields().bar.args;
expect(bazArg.type).toBe(GraphQLString);
expect(bazRequiredArg.type).toEqual(new GraphQLNonNull(GraphQLString));
});
Note that decorator is fired on target.prototype
and it might be reason it didnt work for you :)
from typegql.
@pie6k that works indeed, but my issue is when I have a Field added at runtime also. So it would need to be like:
it('Will allow registering a Field and Arg at runtime', () => {
@ObjectType()
class Foo { }
Foo.prototype.bar = function(baz: string, bazRequired: string) {}
Field({
type: String,
isNullable
})(Foo.prototype, 'bar')
Arg({type: String, isNullable: true})(Foo.prototype, 'bar', 0);
Arg({type: String, isNullable: false})(Foo.prototype, 'bar', 1);
const [bazArg, bazRequiredArg] = compileObjectType(
Foo,
).getFields().bar.args;
expect(bazArg.type).toBe(GraphQLString);
expect(bazRequiredArg.type).toEqual(new GraphQLNonNull(GraphQLString));
});
this is failing for me.
from typegql.
Related Issues (20)
- fields defined on a third level and farther of function prototype chain are not registered into schema HOT 2
- [question] returning an instance of a class HOT 4
- make InputField nullable by default HOT 2
- graphql-tools 3.0.2 HOT 2
- Documentation: Client Interfaces HOT 10
- Example of having resolvers in separate files HOT 4
- feature request: @MutationField and @QueryField HOT 7
- Falsy values are being treated as `null`
- Differences from type-graphql HOT 2
- feature request: browser shim
- default params break the compileFieldArgs function
- support Date type by default HOT 4
- mixin support HOT 4
- pls update graphql dependency to latest v14 HOT 1
- Can I somehow pass context directly to resolver? HOT 1
- Pagination Count in Query HOT 1
- Question: Why is the Arg decorator not nullable by default? HOT 2
- Arguments To Query Type Not Exposed/Compiled? HOT 2
- How to use mutation with array? HOT 1
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from typegql.