GQless: A GraphQL client built for rapid iteration
gqless.com
gqless.com
How do you deal with union types? The docs seem completely scant on that.
Otherwise very interesting approach.
My guess is its going to be something like `undefined` means loading and `null` means null.
I also don’t see anything about union types. That definitely seems like the hardest thing to reverse construct based on usage, since the underlying proxy wouldn’t know what you’re doing with __typename.
So your application does not need to "talk in GraphQL".
Does it mean that we get errors at runtime and not build time, too?
It’s pretty killer to open GraphiQL, write a new query, drop it into a graphql file in my repo, rerun the codegen, and be able to have type safe operations on the queried data.
Also makes me completely unsure why anyone would want what the OP is but that’s ok
- Generate type safe client based on your schema.
- Access GraphQL properties as if they were just JS object properties.
So in this solution the codegen step comes before writing a query.You get the same advantages pretty much, and you have less likelihood of querying for unused data.
I prefer this will validate our component for correct schema usage at build time.
Hello {query.me.name}!
query dot me dot name should all have type completion. And in most TS "frameworks" you have some way to type hint this all out. us TS folk are not seeing the type hints in the example. Maybe it works in VSCode like that, but totally confused how it does.Believe me, I'm super interested in this project and it would save a ton of time if it's doing what some of us are hoping :)
Disclosure: I funded the development of version 2, and have written a large app using it. I am very happy with it, and believe it’s the best data fetching solution around.
The "Why" section in the docs is a pretty good summary:
"I wanted a GraphQL client that lets you forget you're using GraphQL, whilst tackling some issues shared across all existing GraphQL clients"
The fact that it's resolved at runtime isn't necessarily an advantage, it locks you out of some performance and security patterns. I believe GQLess is investigating support for static extraction of queries at build time.
It's an interesting API, I'm not entirely sold on the idea of disguising the fact that you're using GraphQL though.
An example might be something like, you have a page showing a user, and you have a ProfilePicture component with certain data requirements (e.g. get picture at 100X100). It would be nice if you could pass down the user and have the ProfilePicture component query the data it needs, with this being merged into the parent request.
In Relay this kind of thing can be done with useFragment.
In this solution it seems you could just pass the user.
Apollo/urql don’t support this pattern, everything must be in one top level query, or multiple queries (bad perf).
I conclude that it will be incompatible with hasura Allow-list (or lead to explosion of Allow-list for all possible combinations which is impossible in practice)
So it could look nice but makes unusable in case you rely on Allow-list for security.
It could be good for prototyping.
Where this might have an issue is with persisted queries. But then you'd need some sort of client/server build tooling to keep them in sync.
It always feels like magic.
Colocating data requirements next to where it is using it without writing it two times is awesome!
Just like with an ORM on top of a DB, if one needs to to performance optimization or support parallel app versions and ensure backwards-compatibility of queries, the actual queries are useful if not essential to know and manage.
You can hoist the query logic if you need to ensure it stays static for some reason.
I’ve built a very large app with this and am perfectly happy with the model, it has many upsides vs having to manually link strings into views, like never overfetching and having fully typed queries without any plugins.