-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Schema Coordinates #794
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Schema Coordinates #794
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks for your hard work on this!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good to me; a few optional tweaks suggested.
spec/Section 3 -- Type System.md
Outdated
Schema Coordinates are always unique. Each type, field, argument, enum value, or | ||
directive may be referenced by exactly one possible Schema Coordinate. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
feels like something worth highlighting and being clear about as a guarantee in the spec
spec/Section 3 -- Type System.md
Outdated
For example, the following is *not* a valid Schema Coordinate: | ||
|
||
```graphql counter-example | ||
Entity.Business | ||
``` | ||
|
||
In this counter example, both `Entity.Business` and `Business` would refer to | ||
the `Business` type. Since it would be ambiguous what the "primary key" should | ||
be in an application that uses Schema Coordinates to reference types, this is | ||
not allowed. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
is this waffle? thought it might be helpful to have a little explanation/demonstration of this property
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Could just be
- Since it would be ambiguous what the "primary key" should be in an application that uses Schema Coordinates to reference types, this is not allowed.
+ Such ambiguity is disallowed (and hence why this is is invalid syntax).
(More terse, but doesn't walk the reader through why this is bad)
Voting lines are now open!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
In this counter example,
Entity.Business
is redundant sinceBusiness
already uniquely identifies theBusiness
type. Such redundancy is disallowed by this spec - every type, field, field argument, enum value, directive, and directive argument has exactly one canonical Schema Coordinate.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
👍 thanks benjie, stealing this wording
Happy new year! 🥳 It's possible we still want more time for the RFC to marinate, but I'll attend so I can be available to folks to discuss the schema coordinates rfc/spec edit in person. graphql/graphql-spec#794 Thanks!
At Indeed we log usage of schema elements to 1) support deprecation and 2) understand usage from a product management perspective (i.e. is this API we built adding value?). We defined our own coordinate system that is not quite as complete as this spec. A nice benefit of formalizing a coordinate system is that shared tools can be built to solve these and other use cases. 👍 👍 👍 |
4f854af
to
c0b82d5
Compare
I made some fairly significant edits to the prose and examples section in an attempt to simplify. @magicmark please take a look and let me know what you think. |
81ef020
to
4299d8c
Compare
IIRC the only thing holding this from Approval stage is a landed GraphQL.js PR? |
Co-authored-by: Benoit 'BoD' Lubek <[email protected]>
Co-authored-by: Benoit 'BoD' Lubek <[email protected]>
Co-authored-by: Benjie <[email protected]>
Co-authored-by: Benoit 'BoD' Lubek <[email protected]>
Co-authored-by: Martin Bonnin <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There has been discussion around whether having the coordinate for a field and an enum value be the same makes sense. I propose that we change the syntax used for enum values from .
to ::
:
Type # Any named type
Type.field # A field (e.g. on an object, interface, or inputObject type)
Type.field(argName:) # An argument (on an object or interface type)
Type::value # an Enum value (on an enum type)
::
is the syntax used to reference an enum value in C++, Rust, PHP, Perl and others, so it seems pretty natural.
I also think that doing this will make it more obvious for users reading a schema coordinate that it's an enum value being referenced rather than a field (and vice versa).
I have raised a PR to implement these changes here: magicmark#1 |
Use `::` syntax for enum values
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Everyone who has previously approved this PR should re-approve it with the new Type::VALUE
syntax for enum values.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks great!
Just left a few unimportant nitpicks.
My main question is still around meta fields. I still think we should include them for consistency, simplicity and also because I want to monitor usage of meta fields as well.
In my opinion, using
|
Conclusion from the WG was to: a) support meta fields Sorry @JoviDeCroock, you were outvoted! I think your concerns have merit and hopefully I represented them well, but equally what we're primarily doing here is encoding a pattern we already see in the ecosystem and apparently people are actively encoding enum values like this (who knew? I only ever see schema coordinates used for types, fields, arguments and directives!) so "member" it is! 🤷 |
I didn't voice it during the call because we were already over time, but there are legitimate reasons why enum values might not always be |
This reverts commit 1cbad5d.
Updates June 6th 2025:
Implementation changes here: graphql/graphql-js#4432 |
This PR is applied to the `schema-coordinates` branch PR here: #3044 Implements schema coordinate spec changes per the June 5th 2025 WG discussion graphql/graphql-spec#794 - Add support for meta-fields (e.g. `__typename`) - Add support for introspection types - Revert back from FieldCoordinate+ValueCoordinate -> MemberCoordinate cc @benjie
👋
I've pulled out the proposed spec edits for Schema Coordinates (issue: #735) into this PR.
(The RFC now lives in the original PR: https://github.com/graphql/graphql-spec/pull/746/files)
@leebyron you mentioned it might be possible to simplify the grammar - I played around a bit since the original PR, but I think I need some help here. What did you have in mind?
As suggested, tagging @eapache @mjmahone as additional reviewers as we had some good conversation in last WG meeting about this.
Thanks!
GraphQL.js PR: graphql/graphql-js#3044