Skip to content

Commit d15f7bb

Browse files
committed
Merge branch 'main' into oneof-v2
2 parents 17f1304 + 646f937 commit d15f7bb

9 files changed

+300
-186
lines changed

.github/algorithm-format-check.mjs

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,9 @@ import { readFile, readdir } from "node:fs/promises";
22

33
const SPEC_DIR = new URL("../spec", import.meta.url).pathname;
44

5+
/** @see {@link https://spec-md.com/#sec-Value-Literals} */
6+
const valueLiteralsRegexp = /\{((?:[^{}]|(?:\{[^{}]*\}))+)\}/g;
7+
58
process.exitCode = 0;
69
const filenames = await readdir(SPEC_DIR);
710
for (const filename of filenames) {
@@ -72,6 +75,33 @@ for (const filename of filenames) {
7275
console.log();
7376
process.exitCode = 1;
7477
}
78+
79+
const stepWithoutValueLiterals = step.replace(
80+
valueLiteralsRegexp,
81+
""
82+
);
83+
if (stepWithoutValueLiterals.match(/\b[A-Z][A-Za-z0-9]+\(/)) {
84+
console.log(
85+
`Bad formatting of '${algorithmName}' step (algorithm call should be wrapped in braces: \`{MyAlgorithm(a, b, c)}\`) in '${filename}':`
86+
);
87+
console.dir(step);
88+
console.log();
89+
process.exitCode = 1;
90+
}
91+
92+
const valueLiterals = step.matchAll(valueLiteralsRegexp, "");
93+
for (const lit of valueLiterals) {
94+
const inner = lit[1];
95+
if (inner.includes("{")) {
96+
console.log(
97+
`Bad formatting of '${algorithmName}' step (algorithm call should not contain braces: \`${lit}\`) in '${filename}':`
98+
);
99+
console.dir(step);
100+
console.log();
101+
process.exitCode = 1;
102+
}
103+
}
104+
75105
const trimmedInnerLine = step.replace(/\s+/g, " ");
76106
if (
77107
trimmedInnerLine.match(

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
[![GraphQLConf 2024 Banner: September 10-12, San Francisco. Hosted by the GraphQL Foundation](https://github.com/user-attachments/assets/0203f10b-ae1e-4fe1-9222-6547fa2bbd5d)](https://graphql.org/conf/2024/?utm_source=github&utm_medium=graphql_spec&utm_campaign=readme)
1+
[![GraphQLConf 2025 Banner: September 08-10, Amsterdam. Hosted by the GraphQL Foundation](./assets/graphql.org_conf_2025_.png)](https://graphql.org/conf/2025/?utm_source=github&utm_medium=graphql_js&utm_campaign=readme)
22

33
# GraphQL
44

assets/graphql.org_conf_2025_.png

488 KB
Loading

spec/Section 2 -- Language.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -466,8 +466,9 @@ These two operations are semantically identical:
466466

467467
Alias : Name :
468468

469-
By default a field's response key in the response object will use that field's
470-
name. However, you can define a different response key by specifying an alias.
469+
:: A _response name_ is the key in the response object which correlates with a
470+
field's result. By default the response name will use the field's name; however,
471+
you can define a different response name by specifying an alias.
471472

472473
In this example, we can fetch two profile pictures of different sizes and ensure
473474
the resulting response object will not have duplicate keys:
@@ -1253,7 +1254,7 @@ Type : Name
12531254

12541255
- Let {name} be the string value of {Name}.
12551256
- Let {type} be the type defined in the Schema named {name}.
1256-
- {type} must not be {null}.
1257+
- {type} must exist.
12571258
- Return {type}.
12581259

12591260
Type : [ Type ]

spec/Section 3 -- Type System.md

Lines changed: 48 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -329,8 +329,8 @@ A GraphQL schema may describe that a field represents a list of another type;
329329
the `List` type is provided for this reason, and wraps another type.
330330

331331
Similarly, the `Non-Null` type wraps another type, and denotes that the
332-
resulting value will never be {null} (and that a _field error_ cannot result in
333-
a {null} value).
332+
resulting value will never be {null} (and that an _execution error_ cannot
333+
result in a {null} value).
334334

335335
These two types are referred to as "wrapping types"; non-wrapping types are
336336
referred to as "named types". A wrapping type has an underlying named type,
@@ -351,7 +351,7 @@ IsInputType(type):
351351

352352
- If {type} is a List type or Non-Null type:
353353
- Let {unwrappedType} be the unwrapped type of {type}.
354-
- Return IsInputType({unwrappedType}).
354+
- Return {IsInputType(unwrappedType)}.
355355
- If {type} is a Scalar, Enum, or Input Object type:
356356
- Return {true}.
357357
- Return {false}.
@@ -360,7 +360,7 @@ IsOutputType(type):
360360

361361
- If {type} is a List type or Non-Null type:
362362
- Let {unwrappedType} be the unwrapped type of {type}.
363-
- Return IsOutputType({unwrappedType}).
363+
- Return {IsOutputType(unwrappedType)}.
364364
- If {type} is a Scalar, Object, Interface, Union, or Enum type:
365365
- Return {true}.
366366
- Return {false}.
@@ -461,14 +461,14 @@ more guidance.
461461

462462
A GraphQL service, when preparing a field of a given scalar type, must uphold
463463
the contract the scalar type describes, either by coercing the value or
464-
producing a _field error_ if a value cannot be coerced or if coercion may result
465-
in data loss.
464+
producing an _execution error_ if a value cannot be coerced or if coercion may
465+
result in data loss.
466466

467467
A GraphQL service may decide to allow coercing different internal types to the
468468
expected return type. For example when coercing a field of type {Int} a boolean
469469
{true} value may produce {1} or a string value {"123"} may be parsed as base-10
470470
{123}. However if internal type coercion cannot be reasonably performed without
471-
losing information, then it must raise a _field error_.
471+
losing information, then it must raise an _execution error_.
472472

473473
Since this coercion behavior is not observable to clients of the GraphQL
474474
service, the precise rules of coercion are left to the implementation. The only
@@ -513,15 +513,15 @@ Fields returning the type {Int} expect to encounter 32-bit integer internal
513513
values.
514514

515515
GraphQL services may coerce non-integer internal values to integers when
516-
reasonable without losing information, otherwise they must raise a _field
516+
reasonable without losing information, otherwise they must raise an _execution
517517
error_. Examples of this may include returning `1` for the floating-point number
518518
`1.0`, or returning `123` for the string `"123"`. In scenarios where coercion
519-
may lose data, raising a field error is more appropriate. For example, a
520-
floating-point number `1.2` should raise a field error instead of being
519+
may lose data, raising an execution error is more appropriate. For example, a
520+
floating-point number `1.2` should raise an execution error instead of being
521521
truncated to `1`.
522522

523523
If the integer internal value represents a value less than -2<sup>31</sup> or
524-
greater than or equal to 2<sup>31</sup>, a _field error_ should be raised.
524+
greater than or equal to 2<sup>31</sup>, an _execution error_ should be raised.
525525

526526
**Input Coercion**
527527

@@ -548,12 +548,12 @@ Fields returning the type {Float} expect to encounter double-precision
548548
floating-point internal values.
549549

550550
GraphQL services may coerce non-floating-point internal values to {Float} when
551-
reasonable without losing information, otherwise they must raise a _field
551+
reasonable without losing information, otherwise they must raise an _execution
552552
error_. Examples of this may include returning `1.0` for the integer number `1`,
553553
or `123.0` for the string `"123"`.
554554

555555
Non-finite floating-point internal values ({NaN} and {Infinity}) cannot be
556-
coerced to {Float} and must raise a _field error_.
556+
coerced to {Float} and must raise an _execution error_.
557557

558558
**Input Coercion**
559559

@@ -579,9 +579,9 @@ that representation must be used to serialize this type.
579579
Fields returning the type {String} expect to encounter Unicode string values.
580580

581581
GraphQL services may coerce non-string raw values to {String} when reasonable
582-
without losing information, otherwise they must raise a _field error_. Examples
583-
of this may include returning the string `"true"` for a boolean true value, or
584-
the string `"1"` for the integer `1`.
582+
without losing information, otherwise they must raise an _execution error_.
583+
Examples of this may include returning the string `"true"` for a boolean true
584+
value, or the string `"1"` for the integer `1`.
585585

586586
**Input Coercion**
587587

@@ -600,8 +600,8 @@ representation of the integers `1` and `0`.
600600
Fields returning the type {Boolean} expect to encounter boolean internal values.
601601

602602
GraphQL services may coerce non-boolean raw values to {Boolean} when reasonable
603-
without losing information, otherwise they must raise a _field error_. Examples
604-
of this may include returning `true` for non-zero numbers.
603+
without losing information, otherwise they must raise an _execution error_.
604+
Examples of this may include returning `true` for non-zero numbers.
605605

606606
**Input Coercion**
607607

@@ -623,7 +623,7 @@ large 128-bit random numbers, to base64 encoded values, or string values of a
623623
format like [GUID](https://en.wikipedia.org/wiki/Globally_unique_identifier).
624624

625625
GraphQL services should coerce as appropriate given the ID formats they expect.
626-
When coercion is not possible they must raise a _field error_.
626+
When coercion is not possible they must raise an _execution error_.
627627

628628
**Input Coercion**
629629

@@ -947,6 +947,7 @@ IsValidImplementation(type, implementedType):
947947
2. Let {implementedFieldType} be the return type of {implementedField}.
948948
3. {IsValidImplementationFieldType(fieldType, implementedFieldType)} must
949949
be {true}.
950+
6. If {field} is deprecated then {implementedField} must also be deprecated.
950951

951952
IsValidImplementationFieldType(fieldType, implementedFieldType):
952953

@@ -1492,7 +1493,7 @@ enum Direction {
14921493
**Result Coercion**
14931494

14941495
GraphQL services must return one of the defined set of possible values. If a
1495-
reasonable coercion is not possible they must raise a _field error_.
1496+
reasonable coercion is not possible they must raise an _execution error_.
14961497

14971498
**Input Coercion**
14981499

@@ -1548,8 +1549,9 @@ Fields may accept arguments to configure their behavior. These inputs are often
15481549
scalars or enums, but they sometimes need to represent more complex values.
15491550

15501551
A GraphQL Input Object defines a set of input fields; the input fields are
1551-
either scalars, enums, or other input objects. This allows arguments to accept
1552-
arbitrarily complex structs.
1552+
scalars, enums, other input objects, or any wrapping type whose underlying base
1553+
type is one of those three. This allows arguments to accept arbitrarily complex
1554+
structs.
15531555

15541556
In this example, an Input Object called `Point2D` describes `x` and `y` inputs:
15551557

@@ -1676,10 +1678,10 @@ is constructed with the following rules:
16761678

16771679
- If a variable is provided for an input object field, the runtime value of that
16781680
variable must be used. If the runtime value is {null} and the field type is
1679-
non-null, a _field error_ must be raised. If no runtime value is provided, the
1680-
variable definition's default value should be used. If the variable definition
1681-
does not provide a default value, the input object field definition's default
1682-
value should be used.
1681+
non-null, an _execution error_ must be raised. If no runtime value is
1682+
provided, the variable definition's default value should be used. If the
1683+
variable definition does not provide a default value, the input object field
1684+
definition's default value should be used.
16831685

16841686
Further, if the input object is a OneOf Input Object, the following additional
16851687
rules apply:
@@ -1828,19 +1830,19 @@ brackets like this: `pets: [Pet]`. Nesting lists is allowed: `matrix: [[Int]]`.
18281830

18291831
GraphQL services must return an ordered list as the result of a list type. Each
18301832
item in the list must be the result of a result coercion of the item type. If a
1831-
reasonable coercion is not possible it must raise a _field error_. In
1833+
reasonable coercion is not possible it must raise an _execution error_. In
18321834
particular, if a non-list is returned, the coercion should fail, as this
18331835
indicates a mismatch in expectations between the type system and the
18341836
implementation.
18351837

18361838
If a list's item type is nullable, then errors occurring during preparation or
18371839
coercion of an individual item in the list must result in a the value {null} at
1838-
that position in the list along with a _field error_ added to the response. If a
1839-
list's item type is non-null, a field error occurring at an individual item in
1840-
the list must result in a field error for the entire list.
1840+
that position in the list along with an _execution error_ added to the response.
1841+
If a list's item type is non-null, an execution error occurring at an individual
1842+
item in the list must result in an execution error for the entire list.
18411843

1842-
Note: See [Handling Field Errors](#sec-Handling-Field-Errors) for more about
1843-
this behavior.
1844+
Note: See [Handling Execution Errors](#sec-Handling-Execution-Errors) for more
1845+
about this behavior.
18441846

18451847
**Input Coercion**
18461848

@@ -1898,12 +1900,13 @@ always optional and non-null types are always required.
18981900
In all of the above result coercions, {null} was considered a valid value. To
18991901
coerce the result of a Non-Null type, the coercion of the wrapped type should be
19001902
performed. If that result was not {null}, then the result of coercing the
1901-
Non-Null type is that result. If that result was {null}, then a _field error_
1902-
must be raised.
1903+
Non-Null type is that result. If that result was {null}, then an _execution
1904+
error_ must be raised.
19031905

1904-
Note: When a _field error_ is raised on a non-null value, the error propagates
1905-
to the parent field. For more information on this process, see
1906-
[Errors and Non-Null Fields](#sec-Executing-Selection-Sets.Errors-and-Non-Null-Fields)
1906+
Note: When an _execution error_ is raised on a non-null _response position_, the
1907+
error propagates to the parent _response position_. For more information on this
1908+
process, see
1909+
[Errors and Non-Null Types](#sec-Executing-Selection-Sets.Errors-and-Non-Null-Types)
19071910
within the Execution section.
19081911

19091912
**Input Coercion**
@@ -2124,19 +2127,20 @@ directive @invalidExample(arg: String @invalidExample) on ARGUMENT_DEFINITION
21242127
Note: The order in which directives appear may be significant, including
21252128
repeatable directives.
21262129

2127-
**Validation**
2130+
**Type Validation**
21282131

2129-
1. A directive definition must not contain the use of a directive which
2132+
1. A Directive definition must include at least one DirectiveLocation.
2133+
2. A Directive definition must not contain the use of a Directive which
21302134
references itself directly.
2131-
2. A directive definition must not contain the use of a directive which
2135+
3. A Directive definition must not contain the use of a Directive which
21322136
references itself indirectly by referencing a Type or Directive which
2133-
transitively includes a reference to this directive.
2134-
3. The directive must not have a name which begins with the characters {"\_\_"}
2137+
transitively includes a reference to this Directive.
2138+
4. The Directive must not have a name which begins with the characters {"\_\_"}
21352139
(two underscores).
2136-
4. For each argument of the directive:
2140+
5. For each argument of the Directive:
21372141
1. The argument must not have a name which begins with the characters
21382142
{"\_\_"} (two underscores).
2139-
2. The argument must have a unique name within that directive; no two
2143+
2. The argument must have a unique name within that Directive; no two
21402144
arguments may share the same name.
21412145
3. The argument must accept a type where {IsInputType(argumentType)} returns
21422146
{true}.

spec/Section 4 -- Introspection.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -138,15 +138,15 @@ type __Type {
138138
name: String
139139
description: String
140140
# must be non-null for OBJECT and INTERFACE, otherwise null.
141-
fields(includeDeprecated: Boolean = false): [__Field!]
141+
fields(includeDeprecated: Boolean! = false): [__Field!]
142142
# must be non-null for OBJECT and INTERFACE, otherwise null.
143143
interfaces: [__Type!]
144144
# must be non-null for INTERFACE and UNION, otherwise null.
145145
possibleTypes: [__Type!]
146146
# must be non-null for ENUM, otherwise null.
147-
enumValues(includeDeprecated: Boolean = false): [__EnumValue!]
147+
enumValues(includeDeprecated: Boolean! = false): [__EnumValue!]
148148
# must be non-null for INPUT_OBJECT, otherwise null.
149-
inputFields(includeDeprecated: Boolean = false): [__InputValue!]
149+
inputFields(includeDeprecated: Boolean! = false): [__InputValue!]
150150
# must be non-null for NON_NULL and LIST, otherwise null.
151151
ofType: __Type
152152
# may be non-null for custom SCALAR, otherwise null.
@@ -169,7 +169,7 @@ enum __TypeKind {
169169
type __Field {
170170
name: String!
171171
description: String
172-
args(includeDeprecated: Boolean = false): [__InputValue!]!
172+
args(includeDeprecated: Boolean! = false): [__InputValue!]!
173173
type: __Type!
174174
isDeprecated: Boolean!
175175
deprecationReason: String
@@ -195,7 +195,7 @@ type __Directive {
195195
name: String!
196196
description: String
197197
locations: [__DirectiveLocation!]!
198-
args(includeDeprecated: Boolean = false): [__InputValue!]!
198+
args(includeDeprecated: Boolean! = false): [__InputValue!]!
199199
isRepeatable: Boolean!
200200
}
201201

0 commit comments

Comments
 (0)