astFromValue - JavaScript BigInt support#4088
Conversation
✅ Deploy Preview for compassionate-pike-271cb3 ready!
To edit notification comments on pull requests, go to your Netlify site configuration. |
|
Hi @ardatan, I'm @github-actions bot happy to help you with this PR 👋 Supported commandsPlease post this commands in separate comments and only one per comment:
|
|
@saihaj Isn't it for |
Oh I see what you mean, its like we are coercing |
|
In terms of default values, that use case should probably be re-examined after #3814 lands, which should hopefully be soon! We are halfway-through the stack. I suppose we will need to support conversion from BigInt to Int/Float when possible if the received JSON is parsed with a BigInt supporting parser. I think it probably would require some discussion at the WG in terms of whether to include it, but I would be in favor. |
|
In terms of output, I am of two minds in terms of whether we should be supporting conversion from bigint to int, because that means that a custom scalar probably should have been used, in case the value was greater than the int threshold. Maybe it's better to fail overall? For conversion to string or id, I imagine we would want to support it, I can't see why not? |
2268937 to
e78d663
Compare
| value: '123', | ||
| }); | ||
|
|
||
| expect(astFromValue(9007199254740993n, GraphQLFloat)).to.deep.equal({ |
There was a problem hiding this comment.
The change in type of this test is because astFromValue is not safe, set to be replaced by valueToLiteral() for all remaining uses in #3814
But a bigint of sufficient size, -- as far as I know -- cannot be converted to a JS float.
We also in this PR do not properly handle GraphQLFloat scalar parsing and serialization of small BigInts, I will push a failing test to demonstrate what I mean.
We also probably should update the logic within the new valueToLiteral() utility. It's possible that overall we can just delay landing this PR until after #3814
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
building on prior work: - #3109 - #3973 - #4088 - #4223 - #4276 This PR adds bigint support to: - GraphQLInt, including input/output coercion, throwing if out of bounds, and new default value programmatic default value to literal - GraphQLFloat, including input/output coercion, throwing if cannot be represented, including with any loss of precision. - GraphQLString, output coercion only, like number - GraphQLBoolean, output coercion only, like number - GraphQLID, output and input coercion, in parallel to number, and new default value programmatic default value to literal Also, for custom scalars: - updates the `defaultScalarValueToLiteral` to convert a `bigint` to an Int literal - updates for deprecated `astFromValue` for passthrough custom scalars, i.e. scalars that return `bigint` from coerceOutputValue/serialize, to convert `bigint` to an Int literal. cf. also #3913 Co-authored-by: Arda TANRIKULU <ardatanrikulu@gmail.com> Co-authored-by: jdecroock <decroockjovi@gmail.com> Co-authored-by: Hkmu <3169251+hkmu@users.noreply.github.com> Co-authored-by: xonx <119700621+xonx4l@users.noreply.github.com>
|
@yaacovCR is attempting to deploy a commit to the The GraphQL Foundation Team on Vercel. A member of the Team first needs to authorize it. |
I'm hopeful to (finally!) move v17 to beta over the weekend. Reopening to help track, however, as I think now that we have this merged into v17 and we know directionally where the code is headed with the new Ideally this would be a non-change for anyone not using the new functionality. |
This PR adds support for BigInt values to
astFromValue.It coerces whenever possible instead of failing.
This will also allow custom scalars like https://the-guild.dev/graphql/scalars/docs/scalars/big-int to get a
BigIntas a default value. Similar to #4085