Commit d1cf876
authored
chore(release): router crates and artifacts (#583)
> [!IMPORTANT]
> Merging this pull request will create these releases
# query-planner 2.1.0 (2025-11-24)
## Features
### Directive-Based Authorization
Introducing directive-based authorization. This allows you to enforce
fine-grained access control directly from your subgraph schemas using
the `@authenticated` and `@requiresScopes` directives.
This new authorization layer runs before the query planner, ensuring
that unauthorized requests are handled efficiently without reaching your
subgraphs.
### Configuration
You can configure how the router handles unauthorized requests with two
modes:
- **`filter`** (default): Silently removes any fields the user is not
authorized to see from the query. The response will contain `null` for
the removed fields and an error in the `errors` array.
- **`reject`**: Rejects the entire GraphQL operation if it requests any
field the user is not authorized to access.
To configure this, add the following to your `router.yaml` configuration
file:
```yaml
authentication:
directives:
unauthorized:
# "filter" (default): Removes unauthorized fields from the query and returns errors.
# "reject": Rejects the entire request if any unauthorized field is requested.
mode: reject
```
If this section is omitted, the router will use `filter` mode by
default.
### JWT Scope Requirements
When using the `@requiresScopes` directive, the router expects the
user's granted scopes to be present in the JWT payload. The scopes
should be in an array of strings or a string (scopes separated by
space), within a claim named `scope`.
Here is an example of a JWT payload with the correct format:
```json
{
"sub": "user-123",
"scope": [
"read:products",
"write:reviews"
],
"iat": 1516239022
}
```
## Fixes
### Avoid extra `query` prefix for anonymous queries
When there is no variable definitions and no operation name, GraphQL
queries can be sent without the `query` prefix. For example, instead of
sending:
```diff
- query {
+ {
user(id: "1") {
name
}
}
```
# config 0.0.12 (2025-11-24)
## Features
### Breaking
Removed `pool_idle_timeout_seconds` from `traffic_shaping`, instead use
`pool_idle_timeout` with duration format.
```diff
traffic_shaping:
- pool_idle_timeout_seconds: 30
+ pool_idle_timeout: 30s
```
#540 by @ardatan
# node-addon 0.0.4 (2025-11-24)
## Fixes
### Avoid extra `query` prefix for anonymous queries
When there is no variable definitions and no operation name, GraphQL
queries can be sent without the `query` prefix. For example, instead of
sending:
```diff
- query {
+ {
user(id: "1") {
name
}
}
```
# executor 6.1.0 (2025-11-24)
## Features
### Directive-Based Authorization
Introducing directive-based authorization. This allows you to enforce
fine-grained access control directly from your subgraph schemas using
the `@authenticated` and `@requiresScopes` directives.
This new authorization layer runs before the query planner, ensuring
that unauthorized requests are handled efficiently without reaching your
subgraphs.
### Configuration
You can configure how the router handles unauthorized requests with two
modes:
- **`filter`** (default): Silently removes any fields the user is not
authorized to see from the query. The response will contain `null` for
the removed fields and an error in the `errors` array.
- **`reject`**: Rejects the entire GraphQL operation if it requests any
field the user is not authorized to access.
To configure this, add the following to your `router.yaml` configuration
file:
```yaml
authentication:
directives:
unauthorized:
# "filter" (default): Removes unauthorized fields from the query and returns errors.
# "reject": Rejects the entire request if any unauthorized field is requested.
mode: reject
```
If this section is omitted, the router will use `filter` mode by
default.
### JWT Scope Requirements
When using the `@requiresScopes` directive, the router expects the
user's granted scopes to be present in the JWT payload. The scopes
should be in an array of strings or a string (scopes separated by
space), within a claim named `scope`.
Here is an example of a JWT payload with the correct format:
```json
{
"sub": "user-123",
"scope": [
"read:products",
"write:reviews"
],
"iat": 1516239022
}
```
### Breaking
Removed `pool_idle_timeout_seconds` from `traffic_shaping`, instead use
`pool_idle_timeout` with duration format.
```diff
traffic_shaping:
- pool_idle_timeout_seconds: 30
+ pool_idle_timeout: 30s
```
#540 by @ardatan
# router 0.0.20 (2025-11-24)
## Features
- support authenticated and requiresScopes directives (#538)
### Directive-Based Authorization
Introducing directive-based authorization. This allows you to enforce
fine-grained access control directly from your subgraph schemas using
the `@authenticated` and `@requiresScopes` directives.
This new authorization layer runs before the query planner, ensuring
that unauthorized requests are handled efficiently without reaching your
subgraphs.
### Configuration
You can configure how the router handles unauthorized requests with two
modes:
- **`filter`** (default): Silently removes any fields the user is not
authorized to see from the query. The response will contain `null` for
the removed fields and an error in the `errors` array.
- **`reject`**: Rejects the entire GraphQL operation if it requests any
field the user is not authorized to access.
To configure this, add the following to your `router.yaml` configuration
file:
```yaml
authentication:
directives:
unauthorized:
# "filter" (default): Removes unauthorized fields from the query and returns errors.
# "reject": Rejects the entire request if any unauthorized field is requested.
mode: reject
```
If this section is omitted, the router will use `filter` mode by
default.
### JWT Scope Requirements
When using the `@requiresScopes` directive, the router expects the
user's granted scopes to be present in the JWT payload. The scopes
should be in an array of strings or a string (scopes separated by
space), within a claim named `scope`.
Here is an example of a JWT payload with the correct format:
```json
{
"sub": "user-123",
"scope": [
"read:products",
"write:reviews"
],
"iat": 1516239022
}
```
### Breaking
Removed `pool_idle_timeout_seconds` from `traffic_shaping`, instead use
`pool_idle_timeout` with duration format.
```diff
traffic_shaping:
- pool_idle_timeout_seconds: 30
+ pool_idle_timeout: 30s
```
#540 by @ardatan
## Fixes
### Avoid extra `query` prefix for anonymous queries
When there is no variable definitions and no operation name, GraphQL
queries can be sent without the `query` prefix. For example, instead of
sending:
```diff
- query {
+ {
user(id: "1") {
name
}
}
```
Co-authored-by: knope-bot[bot] <152252888+knope-bot[bot]@users.noreply.github.com>1 parent 5da9f86 commit d1cf876
File tree
16 files changed
+248
-102
lines changed- .changeset
- bin/router
- lib
- executor
- node-addon
- query-planner
- router-config
16 files changed
+248
-102
lines changedThis file was deleted.
This file was deleted.
This file was deleted.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
116 | 116 | | |
117 | 117 | | |
118 | 118 | | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
| 156 | + | |
| 157 | + | |
| 158 | + | |
| 159 | + | |
| 160 | + | |
| 161 | + | |
| 162 | + | |
| 163 | + | |
| 164 | + | |
| 165 | + | |
| 166 | + | |
| 167 | + | |
| 168 | + | |
| 169 | + | |
| 170 | + | |
| 171 | + | |
| 172 | + | |
| 173 | + | |
| 174 | + | |
| 175 | + | |
| 176 | + | |
| 177 | + | |
| 178 | + | |
| 179 | + | |
| 180 | + | |
| 181 | + | |
| 182 | + | |
| 183 | + | |
| 184 | + | |
| 185 | + | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
| 189 | + | |
| 190 | + | |
| 191 | + | |
| 192 | + | |
| 193 | + | |
| 194 | + | |
119 | 195 | | |
120 | 196 | | |
121 | 197 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
19 | | - | |
20 | | - | |
21 | | - | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
22 | 22 | | |
23 | 23 | | |
24 | 24 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
94 | 94 | | |
95 | 95 | | |
96 | 96 | | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
97 | 156 | | |
98 | 157 | | |
99 | 158 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
16 | | - | |
| 15 | + | |
| 16 | + | |
17 | 17 | | |
18 | 18 | | |
19 | 19 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
2 | 19 | | |
3 | 20 | | |
4 | 21 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | 2 | | |
3 | | - | |
| 3 | + | |
4 | 4 | | |
5 | 5 | | |
6 | 6 | | |
| |||
0 commit comments