decidim-bulletin_board 0.4.0 → 0.6.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -5,8 +5,8 @@ require_relative "lib/decidim/bulletin_board/version"
5
5
  Gem::Specification.new do |s|
6
6
  s.name = "decidim-bulletin_board"
7
7
  s.version = Decidim::BulletinBoard::VERSION
8
- s.authors = ["David Morcillo", "Svenja Schäfer"]
9
- s.email = ["david@codegram.com", "svenja@codegram.com"]
8
+ s.authors = ["David Morcillo", "Svenja Schäfer", "Leonardo Diez", "Agustí B.R."]
9
+ s.email = ["david@codegram.com", "svenja@codegram.com", "leo@codegram.com", "agusti@codegram.com"]
10
10
 
11
11
  s.summary = ""
12
12
  s.description = ""
@@ -23,8 +23,8 @@ Gem::Specification.new do |s|
23
23
  s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
24
24
  s.require_paths = ["lib"]
25
25
 
26
- s.add_dependency "activemodel", ">= 5.0.0"
27
- s.add_dependency "activesupport", ">= 5.0.0"
26
+ s.add_dependency "rails", ">= 5.0.0"
27
+
28
28
  s.add_dependency "byebug", "~> 11.0"
29
29
  s.add_dependency "graphlient", "~> 0.4.0"
30
30
  s.add_dependency "jwt", "~> 2.2.2"
@@ -1,17 +1,19 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_model"
4
+ require "active_support/configurable"
3
5
  require "decidim/bulletin_board/version"
6
+ require "jwt"
4
7
  require "graphlient"
5
8
  require "wisper"
6
- require "active_model"
9
+
10
+ require "decidim/bulletin_board/engine"
7
11
  require "decidim/bulletin_board/jwk_utils"
8
12
  require "decidim/bulletin_board/message_identifier"
13
+
9
14
  require "decidim/bulletin_board/client"
10
- require "decidim/bulletin_board/graphql/client"
11
- require "decidim/bulletin_board/voter"
12
15
  require "decidim/bulletin_board/authority"
13
- require "active_support/configurable"
14
- require "jwt"
16
+ require "decidim/bulletin_board/voter"
15
17
 
16
18
  module Decidim
17
19
  # This module holds all the logic for the Bulletin Board Ruby Client to connect
@@ -2,3 +2,5 @@
2
2
 
3
3
  require "decidim/bulletin_board/authority/create_election"
4
4
  require "decidim/bulletin_board/authority/get_election_status"
5
+ require "decidim/bulletin_board/authority/open_ballot_box"
6
+ require "decidim/bulletin_board/authority/close_ballot_box"
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module BulletinBoard
5
+ module Authority
6
+ # This command uses the GraphQL client to request the closing of the ballot box.
7
+ class CloseBallotBox < Decidim::BulletinBoard::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # election_id - The local election identifier
11
+ def initialize(election_id)
12
+ @election_id = election_id
13
+ end
14
+
15
+ # Executes the command. Broadcasts these events:
16
+ #
17
+ # - :ok when everything is valid and the query operation is successful.
18
+ # - :error if query operation was not successful.
19
+ #
20
+ # Returns nothing.
21
+ def call
22
+ message_id = message_id(unique_election_id(election_id), "close_ballot_box")
23
+ signed_data = sign_message(message_id, {})
24
+
25
+ begin
26
+ response = client.query do
27
+ mutation do
28
+ closeBallotBox(messageId: message_id, signedData: signed_data) do
29
+ election do
30
+ status
31
+ end
32
+ error
33
+ end
34
+ end
35
+ end
36
+
37
+ return broadcast(:error, response.data.close_ballot_box.error) if response.data.close_ballot_box.error.present?
38
+
39
+ broadcast(:ok, response.data.close_ballot_box.election)
40
+ rescue Graphlient::Errors::ServerError
41
+ broadcast(:error, "Sorry, something went wrong")
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :election_id
48
+ end
49
+ end
50
+ end
51
+ end
@@ -4,49 +4,39 @@ module Decidim
4
4
  module BulletinBoard
5
5
  module Authority
6
6
  # This class handles the creation of an election.
7
- class CreateElection
8
- def initialize(election_data, message_id)
9
- @client = BulletinBoard::Graphql::Client.client
7
+ class CreateElection < Decidim::BulletinBoard::Command
8
+ def initialize(election_id, election_data)
9
+ @election_id = election_id
10
10
  @election_data = election_data
11
- @message_id = message_id
12
- @private_key = private_key
13
- end
14
-
15
- def self.call(election_data, message_id)
16
- new(election_data, message_id).call
17
11
  end
18
12
 
19
13
  def call
20
- args = {
21
- message_id: message_id,
22
- signed_data: encode_data(election_data)
23
- }
24
-
25
- response = client.query do
26
- mutation do
27
- createElection(messageId: args[:message_id], signedData: args[:signed_data]) do
28
- election do
29
- status
14
+ message_id = message_id(unique_election_id(election_id), "create_election")
15
+ signed_data = sign_message(message_id, election_data)
16
+
17
+ begin
18
+ response = client.query do
19
+ mutation do
20
+ createElection(messageId: message_id, signedData: signed_data) do
21
+ election do
22
+ status
23
+ end
24
+ error
30
25
  end
31
- error
32
26
  end
33
27
  end
34
- end
35
28
 
36
- response.data.create_election
29
+ return broadcast(:error, response.data.create_election.error) if response.data.create_election.error.present?
30
+
31
+ broadcast(:ok, response.data.create_election.election)
32
+ rescue Graphlient::Errors::ServerError
33
+ broadcast(:error, "Sorry, something went wrong")
34
+ end
37
35
  end
38
36
 
39
37
  private
40
38
 
41
- attr_reader :client, :election_data, :message_id
42
-
43
- def private_key
44
- @private_key ||= JwkUtils.import_private_key(BulletinBoard.identification_private_key)
45
- end
46
-
47
- def encode_data(election_data)
48
- JWT.encode(election_data, private_key.keypair, "RS256")
49
- end
39
+ attr_reader :election_data, :election_id
50
40
  end
51
41
  end
52
42
  end
@@ -4,11 +4,10 @@ module Decidim
4
4
  module BulletinBoard
5
5
  module Authority
6
6
  # This command uses the GraphQL client to get the status of the election.
7
- class GetElectionStatus
8
- include Wisper::Publisher
7
+ class GetElectionStatus < Decidim::BulletinBoard::Command
9
8
  # Public: Initializes the command.
10
9
  #
11
- # election - The election to receive the status from.
10
+ # election_id - The local election identifier
12
11
  def initialize(election_id)
13
12
  @election_id = election_id
14
13
  end
@@ -20,14 +19,12 @@ module Decidim
20
19
  #
21
20
  # Returns nothing.
22
21
  def call
23
- args = {
24
- unique_id: election_id
25
- }
22
+ unique_id = unique_election_id(election_id)
26
23
 
27
24
  begin
28
25
  response = client.query do
29
26
  query do
30
- election(uniqueId: args[:unique_id]) do
27
+ election(uniqueId: unique_id) do
31
28
  status
32
29
  end
33
30
  end
@@ -42,10 +39,6 @@ module Decidim
42
39
  private
43
40
 
44
41
  attr_reader :election_id
45
-
46
- def client
47
- @client ||= BulletinBoard::Graphql::Client.client
48
- end
49
42
  end
50
43
  end
51
44
  end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Decidim
4
+ module BulletinBoard
5
+ module Authority
6
+ # This command uses the GraphQL client to request the opening of the ballot box.
7
+ class OpenBallotBox < Decidim::BulletinBoard::Command
8
+ # Public: Initializes the command.
9
+ #
10
+ # election_id - The local election identifier
11
+ def initialize(election_id)
12
+ @election_id = election_id
13
+ end
14
+
15
+ # Executes the command. Broadcasts these events:
16
+ #
17
+ # - :ok when everything is valid and the query operation is successful.
18
+ # - :error if query operation was not successful.
19
+ #
20
+ # Returns nothing.
21
+ def call
22
+ message_id = message_id(unique_election_id(election_id), "open_ballot_box")
23
+ signed_data = sign_message(message_id, {})
24
+
25
+ begin
26
+ response = client.query do
27
+ mutation do
28
+ openBallotBox(messageId: message_id, signedData: signed_data) do
29
+ election do
30
+ status
31
+ end
32
+ error
33
+ end
34
+ end
35
+ end
36
+
37
+ return broadcast(:error, response.data.open_ballot_box.error) if response.data.open_ballot_box.error.present?
38
+
39
+ broadcast(:ok, response.data.open_ballot_box.election)
40
+ rescue Graphlient::Errors::ServerError
41
+ broadcast(:error, "Sorry, something went wrong")
42
+ end
43
+ end
44
+
45
+ private
46
+
47
+ attr_reader :election_id
48
+ end
49
+ end
50
+ end
51
+ end
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "decidim/bulletin_board/command"
4
+
3
5
  module Decidim
4
6
  module BulletinBoard
5
7
  # The Bulletin Board client
@@ -16,16 +18,14 @@ module Decidim
16
18
 
17
19
  attr_reader :server, :scheme, :api_key, :number_of_trustees, :authority_name
18
20
 
21
+ delegate :authority_slug, to: Decidim::BulletinBoard::Command
22
+
19
23
  def quorum
20
24
  return 0 if @scheme.dig(:parameters, :quorum).blank?
21
25
 
22
26
  @scheme.dig(:parameters, :quorum)
23
27
  end
24
28
 
25
- def authority_slug
26
- @authority_slug ||= authority_name.parameterize
27
- end
28
-
29
29
  def public_key
30
30
  private_key&.export
31
31
  end
@@ -34,26 +34,36 @@ module Decidim
34
34
  private_key && server && api_key
35
35
  end
36
36
 
37
- def sign_data(data)
38
- JWT.encode(data, private_key.keypair, "RS256")
37
+ def create_election(election_id, election_data)
38
+ create_election = Decidim::BulletinBoard::Authority::CreateElection.new(election_id, election_data)
39
+ create_election.on(:ok) { |election| return election }
40
+ create_election.on(:error) { |error_message| raise StandardError, error_message }
41
+ create_election.call
42
+ end
43
+
44
+ def open_ballot_box(election_id)
45
+ open_ballot_box = Decidim::BulletinBoard::Authority::OpenBallotBox.new(election_id)
46
+ open_ballot_box.on(:ok) { |election| return election }
47
+ open_ballot_box.on(:error) { |error_message| raise StandardError, error_message }
48
+ open_ballot_box.call
39
49
  end
40
50
 
41
- def setup_election(election_data)
42
- message_id = "#{election_data[:election_id]}.create_election+a.#{authority_slug}"
43
- Decidim::BulletinBoard::Authority::CreateElection.call(election_data, message_id)
51
+ def close_ballot_box(election_id)
52
+ close_ballot_box = Decidim::BulletinBoard::Authority::CloseBallotBox.new(election_id)
53
+ close_ballot_box.on(:ok) { |election| return election }
54
+ close_ballot_box.on(:error) { |error_message| raise StandardError, error_message }
55
+ close_ballot_box.call
44
56
  end
45
57
 
46
- def cast_vote(election_data, voter_data, encrypted_vote)
47
- form = Decidim::BulletinBoard::Voter::VoteForm.new(self, election_data, voter_data, encrypted_vote)
48
- cast_vote = Decidim::BulletinBoard::Voter::CastVote.new(form)
58
+ def cast_vote(election_id, voter_id, encrypted_vote)
59
+ cast_vote = Decidim::BulletinBoard::Voter::CastVote.new(election_id, voter_id, encrypted_vote)
49
60
  cast_vote.on(:ok) { |pending_message| return pending_message }
50
61
  cast_vote.on(:error) { |error_message| raise StandardError, error_message }
51
62
  cast_vote.call
52
63
  end
53
64
 
54
65
  def get_status(election_id)
55
- unique_election_id = "#{authority_slug}.#{election_id}"
56
- get_status = Decidim::BulletinBoard::Authority::GetElectionStatus.new(unique_election_id)
66
+ get_status = Decidim::BulletinBoard::Authority::GetElectionStatus.new(election_id)
57
67
  get_status.on(:ok) { |status| return status }
58
68
  get_status.on(:error) { |error_message| raise StandardError, error_message }
59
69
  get_status.call
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "decidim/bulletin_board/graphql/client"
4
+
5
+ module Decidim
6
+ module BulletinBoard
7
+ # The base class for all commands.
8
+ class Command
9
+ include Wisper::Publisher
10
+
11
+ delegate :authority_slug, :private_key, to: :class
12
+
13
+ def unique_election_id(election_id)
14
+ Decidim::BulletinBoard::MessageIdentifier.unique_election_id(authority_slug, election_id)
15
+ end
16
+
17
+ def message_id(unique_election_id, type_subtype, voter_id = nil)
18
+ Decidim::BulletinBoard::MessageIdentifier.format(unique_election_id, type_subtype, voter_id ? :voter : :authority, voter_id || authority_slug)
19
+ end
20
+
21
+ def sign_message(message_id, message)
22
+ JWT.encode(complete_message(message_id, message), private_key.keypair, "RS256")
23
+ end
24
+
25
+ def client
26
+ @client ||= BulletinBoard::Graphql::Client.client
27
+ end
28
+
29
+ def complete_message(message_id, message)
30
+ message.merge({
31
+ iat: Time.now.to_i,
32
+ message_id: message_id
33
+ })
34
+ end
35
+
36
+ class << self
37
+ def self.call(*args)
38
+ new(*args).call
39
+ end
40
+
41
+ def private_key
42
+ @private_key ||= JwkUtils.import_private_key(BulletinBoard.identification_private_key)
43
+ end
44
+
45
+ def authority_slug
46
+ @authority_slug ||= BulletinBoard.authority_name.parameterize
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rails"
4
+
5
+ module Decidim
6
+ module BulletinBoard
7
+ class Engine < ::Rails::Engine
8
+ isolate_namespace Decidim::BulletinBoard
9
+
10
+ initializer "decidim_bulletin_board.assets" do |app|
11
+ app.config.assets.precompile += %w(decidim_bulletin_board_manifest.js)
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,2266 @@
1
+ {
2
+ "data": {
3
+ "__schema": {
4
+ "queryType": {
5
+ "name": "Query"
6
+ },
7
+ "mutationType": {
8
+ "name": "Mutation"
9
+ },
10
+ "subscriptionType": {
11
+ "name": "Subscription"
12
+ },
13
+ "types": [
14
+ {
15
+ "kind": "SCALAR",
16
+ "name": "Boolean",
17
+ "description": "Represents `true` or `false` values.",
18
+ "fields": null,
19
+ "inputFields": null,
20
+ "interfaces": null,
21
+ "enumValues": null,
22
+ "possibleTypes": null
23
+ },
24
+ {
25
+ "kind": "OBJECT",
26
+ "name": "Client",
27
+ "description": null,
28
+ "fields": [
29
+ {
30
+ "name": "id",
31
+ "description": null,
32
+ "args": [
33
+
34
+ ],
35
+ "type": {
36
+ "kind": "NON_NULL",
37
+ "name": null,
38
+ "ofType": {
39
+ "kind": "SCALAR",
40
+ "name": "ID",
41
+ "ofType": null
42
+ }
43
+ },
44
+ "isDeprecated": false,
45
+ "deprecationReason": null
46
+ },
47
+ {
48
+ "name": "name",
49
+ "description": null,
50
+ "args": [
51
+
52
+ ],
53
+ "type": {
54
+ "kind": "NON_NULL",
55
+ "name": null,
56
+ "ofType": {
57
+ "kind": "SCALAR",
58
+ "name": "String",
59
+ "ofType": null
60
+ }
61
+ },
62
+ "isDeprecated": false,
63
+ "deprecationReason": null
64
+ },
65
+ {
66
+ "name": "publicKey",
67
+ "description": null,
68
+ "args": [
69
+
70
+ ],
71
+ "type": {
72
+ "kind": "SCALAR",
73
+ "name": "JSON",
74
+ "ofType": null
75
+ },
76
+ "isDeprecated": false,
77
+ "deprecationReason": null
78
+ },
79
+ {
80
+ "name": "publicKeyThumbprint",
81
+ "description": null,
82
+ "args": [
83
+
84
+ ],
85
+ "type": {
86
+ "kind": "SCALAR",
87
+ "name": "String",
88
+ "ofType": null
89
+ },
90
+ "isDeprecated": false,
91
+ "deprecationReason": null
92
+ },
93
+ {
94
+ "name": "type",
95
+ "description": null,
96
+ "args": [
97
+
98
+ ],
99
+ "type": {
100
+ "kind": "NON_NULL",
101
+ "name": null,
102
+ "ofType": {
103
+ "kind": "SCALAR",
104
+ "name": "String",
105
+ "ofType": null
106
+ }
107
+ },
108
+ "isDeprecated": false,
109
+ "deprecationReason": null
110
+ }
111
+ ],
112
+ "inputFields": null,
113
+ "interfaces": [
114
+
115
+ ],
116
+ "enumValues": null,
117
+ "possibleTypes": null
118
+ },
119
+ {
120
+ "kind": "OBJECT",
121
+ "name": "CloseBallotBoxMutationPayload",
122
+ "description": "Autogenerated return type of CloseBallotBoxMutation",
123
+ "fields": [
124
+ {
125
+ "name": "election",
126
+ "description": null,
127
+ "args": [
128
+
129
+ ],
130
+ "type": {
131
+ "kind": "OBJECT",
132
+ "name": "Election",
133
+ "ofType": null
134
+ },
135
+ "isDeprecated": false,
136
+ "deprecationReason": null
137
+ },
138
+ {
139
+ "name": "error",
140
+ "description": null,
141
+ "args": [
142
+
143
+ ],
144
+ "type": {
145
+ "kind": "SCALAR",
146
+ "name": "String",
147
+ "ofType": null
148
+ },
149
+ "isDeprecated": false,
150
+ "deprecationReason": null
151
+ }
152
+ ],
153
+ "inputFields": null,
154
+ "interfaces": [
155
+
156
+ ],
157
+ "enumValues": null,
158
+ "possibleTypes": null
159
+ },
160
+ {
161
+ "kind": "OBJECT",
162
+ "name": "CreateElectionMutationPayload",
163
+ "description": "Autogenerated return type of CreateElectionMutation",
164
+ "fields": [
165
+ {
166
+ "name": "election",
167
+ "description": null,
168
+ "args": [
169
+
170
+ ],
171
+ "type": {
172
+ "kind": "OBJECT",
173
+ "name": "Election",
174
+ "ofType": null
175
+ },
176
+ "isDeprecated": false,
177
+ "deprecationReason": null
178
+ },
179
+ {
180
+ "name": "error",
181
+ "description": null,
182
+ "args": [
183
+
184
+ ],
185
+ "type": {
186
+ "kind": "SCALAR",
187
+ "name": "String",
188
+ "ofType": null
189
+ },
190
+ "isDeprecated": false,
191
+ "deprecationReason": null
192
+ }
193
+ ],
194
+ "inputFields": null,
195
+ "interfaces": [
196
+
197
+ ],
198
+ "enumValues": null,
199
+ "possibleTypes": null
200
+ },
201
+ {
202
+ "kind": "OBJECT",
203
+ "name": "Election",
204
+ "description": null,
205
+ "fields": [
206
+ {
207
+ "name": "authority",
208
+ "description": null,
209
+ "args": [
210
+
211
+ ],
212
+ "type": {
213
+ "kind": "NON_NULL",
214
+ "name": null,
215
+ "ofType": {
216
+ "kind": "OBJECT",
217
+ "name": "Client",
218
+ "ofType": null
219
+ }
220
+ },
221
+ "isDeprecated": false,
222
+ "deprecationReason": null
223
+ },
224
+ {
225
+ "name": "id",
226
+ "description": null,
227
+ "args": [
228
+
229
+ ],
230
+ "type": {
231
+ "kind": "NON_NULL",
232
+ "name": null,
233
+ "ofType": {
234
+ "kind": "SCALAR",
235
+ "name": "ID",
236
+ "ofType": null
237
+ }
238
+ },
239
+ "isDeprecated": false,
240
+ "deprecationReason": null
241
+ },
242
+ {
243
+ "name": "logEntries",
244
+ "description": "Returns the list of log entries for this election in the bulletin board",
245
+ "args": [
246
+ {
247
+ "name": "after",
248
+ "description": null,
249
+ "type": {
250
+ "kind": "SCALAR",
251
+ "name": "String",
252
+ "ofType": null
253
+ },
254
+ "defaultValue": null
255
+ }
256
+ ],
257
+ "type": {
258
+ "kind": "NON_NULL",
259
+ "name": null,
260
+ "ofType": {
261
+ "kind": "LIST",
262
+ "name": null,
263
+ "ofType": {
264
+ "kind": "NON_NULL",
265
+ "name": null,
266
+ "ofType": {
267
+ "kind": "OBJECT",
268
+ "name": "LogEntry",
269
+ "ofType": null
270
+ }
271
+ }
272
+ }
273
+ },
274
+ "isDeprecated": false,
275
+ "deprecationReason": null
276
+ },
277
+ {
278
+ "name": "status",
279
+ "description": null,
280
+ "args": [
281
+
282
+ ],
283
+ "type": {
284
+ "kind": "NON_NULL",
285
+ "name": null,
286
+ "ofType": {
287
+ "kind": "SCALAR",
288
+ "name": "String",
289
+ "ofType": null
290
+ }
291
+ },
292
+ "isDeprecated": false,
293
+ "deprecationReason": null
294
+ },
295
+ {
296
+ "name": "title",
297
+ "description": null,
298
+ "args": [
299
+
300
+ ],
301
+ "type": {
302
+ "kind": "NON_NULL",
303
+ "name": null,
304
+ "ofType": {
305
+ "kind": "SCALAR",
306
+ "name": "String",
307
+ "ofType": null
308
+ }
309
+ },
310
+ "isDeprecated": false,
311
+ "deprecationReason": null
312
+ },
313
+ {
314
+ "name": "trustees",
315
+ "description": "Returns the list of trustees for this election",
316
+ "args": [
317
+
318
+ ],
319
+ "type": {
320
+ "kind": "NON_NULL",
321
+ "name": null,
322
+ "ofType": {
323
+ "kind": "LIST",
324
+ "name": null,
325
+ "ofType": {
326
+ "kind": "NON_NULL",
327
+ "name": null,
328
+ "ofType": {
329
+ "kind": "OBJECT",
330
+ "name": "Client",
331
+ "ofType": null
332
+ }
333
+ }
334
+ }
335
+ },
336
+ "isDeprecated": false,
337
+ "deprecationReason": null
338
+ }
339
+ ],
340
+ "inputFields": null,
341
+ "interfaces": [
342
+
343
+ ],
344
+ "enumValues": null,
345
+ "possibleTypes": null
346
+ },
347
+ {
348
+ "kind": "OBJECT",
349
+ "name": "ElectionLogEntryAddedPayload",
350
+ "description": "Autogenerated return type of ElectionLogEntryAdded",
351
+ "fields": [
352
+ {
353
+ "name": "logEntry",
354
+ "description": null,
355
+ "args": [
356
+
357
+ ],
358
+ "type": {
359
+ "kind": "NON_NULL",
360
+ "name": null,
361
+ "ofType": {
362
+ "kind": "OBJECT",
363
+ "name": "LogEntry",
364
+ "ofType": null
365
+ }
366
+ },
367
+ "isDeprecated": false,
368
+ "deprecationReason": null
369
+ }
370
+ ],
371
+ "inputFields": null,
372
+ "interfaces": [
373
+
374
+ ],
375
+ "enumValues": null,
376
+ "possibleTypes": null
377
+ },
378
+ {
379
+ "kind": "SCALAR",
380
+ "name": "ID",
381
+ "description": "Represents a unique identifier that is Base64 obfuscated. It is often used to refetch an object or as key for a cache. The ID type appears in a JSON response as a String; however, it is not intended to be human-readable. When expected as an input type, any string (such as `\"VXNlci0xMA==\"`) or integer (such as `4`) input value will be accepted as an ID.",
382
+ "fields": null,
383
+ "inputFields": null,
384
+ "interfaces": null,
385
+ "enumValues": null,
386
+ "possibleTypes": null
387
+ },
388
+ {
389
+ "kind": "SCALAR",
390
+ "name": "JSON",
391
+ "description": "Represents untyped JSON",
392
+ "fields": null,
393
+ "inputFields": null,
394
+ "interfaces": null,
395
+ "enumValues": null,
396
+ "possibleTypes": null
397
+ },
398
+ {
399
+ "kind": "OBJECT",
400
+ "name": "LogEntry",
401
+ "description": null,
402
+ "fields": [
403
+ {
404
+ "name": "chainedHash",
405
+ "description": null,
406
+ "args": [
407
+
408
+ ],
409
+ "type": {
410
+ "kind": "NON_NULL",
411
+ "name": null,
412
+ "ofType": {
413
+ "kind": "SCALAR",
414
+ "name": "String",
415
+ "ofType": null
416
+ }
417
+ },
418
+ "isDeprecated": false,
419
+ "deprecationReason": null
420
+ },
421
+ {
422
+ "name": "client",
423
+ "description": null,
424
+ "args": [
425
+
426
+ ],
427
+ "type": {
428
+ "kind": "NON_NULL",
429
+ "name": null,
430
+ "ofType": {
431
+ "kind": "OBJECT",
432
+ "name": "Client",
433
+ "ofType": null
434
+ }
435
+ },
436
+ "isDeprecated": false,
437
+ "deprecationReason": null
438
+ },
439
+ {
440
+ "name": "contentHash",
441
+ "description": null,
442
+ "args": [
443
+
444
+ ],
445
+ "type": {
446
+ "kind": "SCALAR",
447
+ "name": "String",
448
+ "ofType": null
449
+ },
450
+ "isDeprecated": false,
451
+ "deprecationReason": null
452
+ },
453
+ {
454
+ "name": "election",
455
+ "description": null,
456
+ "args": [
457
+
458
+ ],
459
+ "type": {
460
+ "kind": "NON_NULL",
461
+ "name": null,
462
+ "ofType": {
463
+ "kind": "OBJECT",
464
+ "name": "Election",
465
+ "ofType": null
466
+ }
467
+ },
468
+ "isDeprecated": false,
469
+ "deprecationReason": null
470
+ },
471
+ {
472
+ "name": "id",
473
+ "description": null,
474
+ "args": [
475
+
476
+ ],
477
+ "type": {
478
+ "kind": "NON_NULL",
479
+ "name": null,
480
+ "ofType": {
481
+ "kind": "SCALAR",
482
+ "name": "ID",
483
+ "ofType": null
484
+ }
485
+ },
486
+ "isDeprecated": false,
487
+ "deprecationReason": null
488
+ },
489
+ {
490
+ "name": "messageId",
491
+ "description": null,
492
+ "args": [
493
+
494
+ ],
495
+ "type": {
496
+ "kind": "NON_NULL",
497
+ "name": null,
498
+ "ofType": {
499
+ "kind": "SCALAR",
500
+ "name": "String",
501
+ "ofType": null
502
+ }
503
+ },
504
+ "isDeprecated": false,
505
+ "deprecationReason": null
506
+ },
507
+ {
508
+ "name": "signedData",
509
+ "description": null,
510
+ "args": [
511
+
512
+ ],
513
+ "type": {
514
+ "kind": "NON_NULL",
515
+ "name": null,
516
+ "ofType": {
517
+ "kind": "SCALAR",
518
+ "name": "String",
519
+ "ofType": null
520
+ }
521
+ },
522
+ "isDeprecated": false,
523
+ "deprecationReason": null
524
+ }
525
+ ],
526
+ "inputFields": null,
527
+ "interfaces": [
528
+
529
+ ],
530
+ "enumValues": null,
531
+ "possibleTypes": null
532
+ },
533
+ {
534
+ "kind": "OBJECT",
535
+ "name": "Mutation",
536
+ "description": null,
537
+ "fields": [
538
+ {
539
+ "name": "closeBallotBox",
540
+ "description": null,
541
+ "args": [
542
+ {
543
+ "name": "messageId",
544
+ "description": null,
545
+ "type": {
546
+ "kind": "NON_NULL",
547
+ "name": null,
548
+ "ofType": {
549
+ "kind": "SCALAR",
550
+ "name": "String",
551
+ "ofType": null
552
+ }
553
+ },
554
+ "defaultValue": null
555
+ },
556
+ {
557
+ "name": "signedData",
558
+ "description": null,
559
+ "type": {
560
+ "kind": "NON_NULL",
561
+ "name": null,
562
+ "ofType": {
563
+ "kind": "SCALAR",
564
+ "name": "String",
565
+ "ofType": null
566
+ }
567
+ },
568
+ "defaultValue": null
569
+ }
570
+ ],
571
+ "type": {
572
+ "kind": "OBJECT",
573
+ "name": "CloseBallotBoxMutationPayload",
574
+ "ofType": null
575
+ },
576
+ "isDeprecated": false,
577
+ "deprecationReason": null
578
+ },
579
+ {
580
+ "name": "createElection",
581
+ "description": null,
582
+ "args": [
583
+ {
584
+ "name": "messageId",
585
+ "description": null,
586
+ "type": {
587
+ "kind": "NON_NULL",
588
+ "name": null,
589
+ "ofType": {
590
+ "kind": "SCALAR",
591
+ "name": "String",
592
+ "ofType": null
593
+ }
594
+ },
595
+ "defaultValue": null
596
+ },
597
+ {
598
+ "name": "signedData",
599
+ "description": null,
600
+ "type": {
601
+ "kind": "NON_NULL",
602
+ "name": null,
603
+ "ofType": {
604
+ "kind": "SCALAR",
605
+ "name": "String",
606
+ "ofType": null
607
+ }
608
+ },
609
+ "defaultValue": null
610
+ }
611
+ ],
612
+ "type": {
613
+ "kind": "OBJECT",
614
+ "name": "CreateElectionMutationPayload",
615
+ "ofType": null
616
+ },
617
+ "isDeprecated": false,
618
+ "deprecationReason": null
619
+ },
620
+ {
621
+ "name": "openBallotBox",
622
+ "description": null,
623
+ "args": [
624
+ {
625
+ "name": "messageId",
626
+ "description": null,
627
+ "type": {
628
+ "kind": "NON_NULL",
629
+ "name": null,
630
+ "ofType": {
631
+ "kind": "SCALAR",
632
+ "name": "String",
633
+ "ofType": null
634
+ }
635
+ },
636
+ "defaultValue": null
637
+ },
638
+ {
639
+ "name": "signedData",
640
+ "description": null,
641
+ "type": {
642
+ "kind": "NON_NULL",
643
+ "name": null,
644
+ "ofType": {
645
+ "kind": "SCALAR",
646
+ "name": "String",
647
+ "ofType": null
648
+ }
649
+ },
650
+ "defaultValue": null
651
+ }
652
+ ],
653
+ "type": {
654
+ "kind": "OBJECT",
655
+ "name": "OpenBallotBoxMutationPayload",
656
+ "ofType": null
657
+ },
658
+ "isDeprecated": false,
659
+ "deprecationReason": null
660
+ },
661
+ {
662
+ "name": "processKeyCeremonyStep",
663
+ "description": null,
664
+ "args": [
665
+ {
666
+ "name": "messageId",
667
+ "description": null,
668
+ "type": {
669
+ "kind": "NON_NULL",
670
+ "name": null,
671
+ "ofType": {
672
+ "kind": "SCALAR",
673
+ "name": "String",
674
+ "ofType": null
675
+ }
676
+ },
677
+ "defaultValue": null
678
+ },
679
+ {
680
+ "name": "signedData",
681
+ "description": null,
682
+ "type": {
683
+ "kind": "NON_NULL",
684
+ "name": null,
685
+ "ofType": {
686
+ "kind": "SCALAR",
687
+ "name": "String",
688
+ "ofType": null
689
+ }
690
+ },
691
+ "defaultValue": null
692
+ }
693
+ ],
694
+ "type": {
695
+ "kind": "OBJECT",
696
+ "name": "ProcessKeyCeremonyStepMutationPayload",
697
+ "ofType": null
698
+ },
699
+ "isDeprecated": false,
700
+ "deprecationReason": null
701
+ },
702
+ {
703
+ "name": "vote",
704
+ "description": null,
705
+ "args": [
706
+ {
707
+ "name": "messageId",
708
+ "description": null,
709
+ "type": {
710
+ "kind": "NON_NULL",
711
+ "name": null,
712
+ "ofType": {
713
+ "kind": "SCALAR",
714
+ "name": "String",
715
+ "ofType": null
716
+ }
717
+ },
718
+ "defaultValue": null
719
+ },
720
+ {
721
+ "name": "signedData",
722
+ "description": null,
723
+ "type": {
724
+ "kind": "NON_NULL",
725
+ "name": null,
726
+ "ofType": {
727
+ "kind": "SCALAR",
728
+ "name": "String",
729
+ "ofType": null
730
+ }
731
+ },
732
+ "defaultValue": null
733
+ }
734
+ ],
735
+ "type": {
736
+ "kind": "OBJECT",
737
+ "name": "VoteMutationPayload",
738
+ "ofType": null
739
+ },
740
+ "isDeprecated": false,
741
+ "deprecationReason": null
742
+ }
743
+ ],
744
+ "inputFields": null,
745
+ "interfaces": [
746
+
747
+ ],
748
+ "enumValues": null,
749
+ "possibleTypes": null
750
+ },
751
+ {
752
+ "kind": "OBJECT",
753
+ "name": "OpenBallotBoxMutationPayload",
754
+ "description": "Autogenerated return type of OpenBallotBoxMutation",
755
+ "fields": [
756
+ {
757
+ "name": "election",
758
+ "description": null,
759
+ "args": [
760
+
761
+ ],
762
+ "type": {
763
+ "kind": "OBJECT",
764
+ "name": "Election",
765
+ "ofType": null
766
+ },
767
+ "isDeprecated": false,
768
+ "deprecationReason": null
769
+ },
770
+ {
771
+ "name": "error",
772
+ "description": null,
773
+ "args": [
774
+
775
+ ],
776
+ "type": {
777
+ "kind": "SCALAR",
778
+ "name": "String",
779
+ "ofType": null
780
+ },
781
+ "isDeprecated": false,
782
+ "deprecationReason": null
783
+ }
784
+ ],
785
+ "inputFields": null,
786
+ "interfaces": [
787
+
788
+ ],
789
+ "enumValues": null,
790
+ "possibleTypes": null
791
+ },
792
+ {
793
+ "kind": "OBJECT",
794
+ "name": "PendingMessage",
795
+ "description": null,
796
+ "fields": [
797
+ {
798
+ "name": "client",
799
+ "description": null,
800
+ "args": [
801
+
802
+ ],
803
+ "type": {
804
+ "kind": "NON_NULL",
805
+ "name": null,
806
+ "ofType": {
807
+ "kind": "OBJECT",
808
+ "name": "Client",
809
+ "ofType": null
810
+ }
811
+ },
812
+ "isDeprecated": false,
813
+ "deprecationReason": null
814
+ },
815
+ {
816
+ "name": "election",
817
+ "description": null,
818
+ "args": [
819
+
820
+ ],
821
+ "type": {
822
+ "kind": "OBJECT",
823
+ "name": "Election",
824
+ "ofType": null
825
+ },
826
+ "isDeprecated": false,
827
+ "deprecationReason": null
828
+ },
829
+ {
830
+ "name": "id",
831
+ "description": null,
832
+ "args": [
833
+
834
+ ],
835
+ "type": {
836
+ "kind": "NON_NULL",
837
+ "name": null,
838
+ "ofType": {
839
+ "kind": "SCALAR",
840
+ "name": "ID",
841
+ "ofType": null
842
+ }
843
+ },
844
+ "isDeprecated": false,
845
+ "deprecationReason": null
846
+ },
847
+ {
848
+ "name": "messageId",
849
+ "description": null,
850
+ "args": [
851
+
852
+ ],
853
+ "type": {
854
+ "kind": "NON_NULL",
855
+ "name": null,
856
+ "ofType": {
857
+ "kind": "SCALAR",
858
+ "name": "String",
859
+ "ofType": null
860
+ }
861
+ },
862
+ "isDeprecated": false,
863
+ "deprecationReason": null
864
+ },
865
+ {
866
+ "name": "signedData",
867
+ "description": null,
868
+ "args": [
869
+
870
+ ],
871
+ "type": {
872
+ "kind": "NON_NULL",
873
+ "name": null,
874
+ "ofType": {
875
+ "kind": "SCALAR",
876
+ "name": "String",
877
+ "ofType": null
878
+ }
879
+ },
880
+ "isDeprecated": false,
881
+ "deprecationReason": null
882
+ },
883
+ {
884
+ "name": "status",
885
+ "description": null,
886
+ "args": [
887
+
888
+ ],
889
+ "type": {
890
+ "kind": "NON_NULL",
891
+ "name": null,
892
+ "ofType": {
893
+ "kind": "SCALAR",
894
+ "name": "String",
895
+ "ofType": null
896
+ }
897
+ },
898
+ "isDeprecated": false,
899
+ "deprecationReason": null
900
+ }
901
+ ],
902
+ "inputFields": null,
903
+ "interfaces": [
904
+
905
+ ],
906
+ "enumValues": null,
907
+ "possibleTypes": null
908
+ },
909
+ {
910
+ "kind": "OBJECT",
911
+ "name": "ProcessKeyCeremonyStepMutationPayload",
912
+ "description": "Autogenerated return type of ProcessKeyCeremonyStepMutation",
913
+ "fields": [
914
+ {
915
+ "name": "error",
916
+ "description": null,
917
+ "args": [
918
+
919
+ ],
920
+ "type": {
921
+ "kind": "SCALAR",
922
+ "name": "String",
923
+ "ofType": null
924
+ },
925
+ "isDeprecated": false,
926
+ "deprecationReason": null
927
+ },
928
+ {
929
+ "name": "pendingMessage",
930
+ "description": null,
931
+ "args": [
932
+
933
+ ],
934
+ "type": {
935
+ "kind": "OBJECT",
936
+ "name": "PendingMessage",
937
+ "ofType": null
938
+ },
939
+ "isDeprecated": false,
940
+ "deprecationReason": null
941
+ }
942
+ ],
943
+ "inputFields": null,
944
+ "interfaces": [
945
+
946
+ ],
947
+ "enumValues": null,
948
+ "possibleTypes": null
949
+ },
950
+ {
951
+ "kind": "OBJECT",
952
+ "name": "Query",
953
+ "description": null,
954
+ "fields": [
955
+ {
956
+ "name": "authorities",
957
+ "description": "Returns a list of authorities in the bulletin board",
958
+ "args": [
959
+
960
+ ],
961
+ "type": {
962
+ "kind": "NON_NULL",
963
+ "name": null,
964
+ "ofType": {
965
+ "kind": "LIST",
966
+ "name": null,
967
+ "ofType": {
968
+ "kind": "NON_NULL",
969
+ "name": null,
970
+ "ofType": {
971
+ "kind": "OBJECT",
972
+ "name": "Client",
973
+ "ofType": null
974
+ }
975
+ }
976
+ }
977
+ },
978
+ "isDeprecated": false,
979
+ "deprecationReason": null
980
+ },
981
+ {
982
+ "name": "election",
983
+ "description": "Returns an election given its unique_id",
984
+ "args": [
985
+ {
986
+ "name": "uniqueId",
987
+ "description": null,
988
+ "type": {
989
+ "kind": "NON_NULL",
990
+ "name": null,
991
+ "ofType": {
992
+ "kind": "SCALAR",
993
+ "name": "String",
994
+ "ofType": null
995
+ }
996
+ },
997
+ "defaultValue": null
998
+ }
999
+ ],
1000
+ "type": {
1001
+ "kind": "OBJECT",
1002
+ "name": "Election",
1003
+ "ofType": null
1004
+ },
1005
+ "isDeprecated": false,
1006
+ "deprecationReason": null
1007
+ },
1008
+ {
1009
+ "name": "elections",
1010
+ "description": "Returns a list of elections in the bulletin board",
1011
+ "args": [
1012
+
1013
+ ],
1014
+ "type": {
1015
+ "kind": "NON_NULL",
1016
+ "name": null,
1017
+ "ofType": {
1018
+ "kind": "LIST",
1019
+ "name": null,
1020
+ "ofType": {
1021
+ "kind": "NON_NULL",
1022
+ "name": null,
1023
+ "ofType": {
1024
+ "kind": "OBJECT",
1025
+ "name": "Election",
1026
+ "ofType": null
1027
+ }
1028
+ }
1029
+ }
1030
+ },
1031
+ "isDeprecated": false,
1032
+ "deprecationReason": null
1033
+ },
1034
+ {
1035
+ "name": "logEntry",
1036
+ "description": "Returns the log entry with the given content hash for the given election",
1037
+ "args": [
1038
+ {
1039
+ "name": "electionUniqueId",
1040
+ "description": null,
1041
+ "type": {
1042
+ "kind": "NON_NULL",
1043
+ "name": null,
1044
+ "ofType": {
1045
+ "kind": "SCALAR",
1046
+ "name": "String",
1047
+ "ofType": null
1048
+ }
1049
+ },
1050
+ "defaultValue": null
1051
+ },
1052
+ {
1053
+ "name": "contentHash",
1054
+ "description": null,
1055
+ "type": {
1056
+ "kind": "NON_NULL",
1057
+ "name": null,
1058
+ "ofType": {
1059
+ "kind": "SCALAR",
1060
+ "name": "String",
1061
+ "ofType": null
1062
+ }
1063
+ },
1064
+ "defaultValue": null
1065
+ }
1066
+ ],
1067
+ "type": {
1068
+ "kind": "OBJECT",
1069
+ "name": "LogEntry",
1070
+ "ofType": null
1071
+ },
1072
+ "isDeprecated": false,
1073
+ "deprecationReason": null
1074
+ },
1075
+ {
1076
+ "name": "me",
1077
+ "description": "Returns the information for this bulletin board instance",
1078
+ "args": [
1079
+
1080
+ ],
1081
+ "type": {
1082
+ "kind": "NON_NULL",
1083
+ "name": null,
1084
+ "ofType": {
1085
+ "kind": "OBJECT",
1086
+ "name": "Client",
1087
+ "ofType": null
1088
+ }
1089
+ },
1090
+ "isDeprecated": false,
1091
+ "deprecationReason": null
1092
+ },
1093
+ {
1094
+ "name": "pendingMessage",
1095
+ "description": "Returns the information for a given message",
1096
+ "args": [
1097
+ {
1098
+ "name": "id",
1099
+ "description": null,
1100
+ "type": {
1101
+ "kind": "NON_NULL",
1102
+ "name": null,
1103
+ "ofType": {
1104
+ "kind": "SCALAR",
1105
+ "name": "ID",
1106
+ "ofType": null
1107
+ }
1108
+ },
1109
+ "defaultValue": null
1110
+ }
1111
+ ],
1112
+ "type": {
1113
+ "kind": "OBJECT",
1114
+ "name": "PendingMessage",
1115
+ "ofType": null
1116
+ },
1117
+ "isDeprecated": false,
1118
+ "deprecationReason": null
1119
+ }
1120
+ ],
1121
+ "inputFields": null,
1122
+ "interfaces": [
1123
+
1124
+ ],
1125
+ "enumValues": null,
1126
+ "possibleTypes": null
1127
+ },
1128
+ {
1129
+ "kind": "SCALAR",
1130
+ "name": "String",
1131
+ "description": "Represents textual data as UTF-8 character sequences. This type is most often used by GraphQL to represent free-form human-readable text.",
1132
+ "fields": null,
1133
+ "inputFields": null,
1134
+ "interfaces": null,
1135
+ "enumValues": null,
1136
+ "possibleTypes": null
1137
+ },
1138
+ {
1139
+ "kind": "OBJECT",
1140
+ "name": "Subscription",
1141
+ "description": null,
1142
+ "fields": [
1143
+ {
1144
+ "name": "electionLogEntryAdded",
1145
+ "description": null,
1146
+ "args": [
1147
+ {
1148
+ "name": "electionUniqueId",
1149
+ "description": null,
1150
+ "type": {
1151
+ "kind": "NON_NULL",
1152
+ "name": null,
1153
+ "ofType": {
1154
+ "kind": "SCALAR",
1155
+ "name": "String",
1156
+ "ofType": null
1157
+ }
1158
+ },
1159
+ "defaultValue": null
1160
+ }
1161
+ ],
1162
+ "type": {
1163
+ "kind": "NON_NULL",
1164
+ "name": null,
1165
+ "ofType": {
1166
+ "kind": "OBJECT",
1167
+ "name": "ElectionLogEntryAddedPayload",
1168
+ "ofType": null
1169
+ }
1170
+ },
1171
+ "isDeprecated": false,
1172
+ "deprecationReason": null
1173
+ }
1174
+ ],
1175
+ "inputFields": null,
1176
+ "interfaces": [
1177
+
1178
+ ],
1179
+ "enumValues": null,
1180
+ "possibleTypes": null
1181
+ },
1182
+ {
1183
+ "kind": "OBJECT",
1184
+ "name": "VoteMutationPayload",
1185
+ "description": "Autogenerated return type of VoteMutation",
1186
+ "fields": [
1187
+ {
1188
+ "name": "error",
1189
+ "description": null,
1190
+ "args": [
1191
+
1192
+ ],
1193
+ "type": {
1194
+ "kind": "SCALAR",
1195
+ "name": "String",
1196
+ "ofType": null
1197
+ },
1198
+ "isDeprecated": false,
1199
+ "deprecationReason": null
1200
+ },
1201
+ {
1202
+ "name": "pendingMessage",
1203
+ "description": null,
1204
+ "args": [
1205
+
1206
+ ],
1207
+ "type": {
1208
+ "kind": "OBJECT",
1209
+ "name": "PendingMessage",
1210
+ "ofType": null
1211
+ },
1212
+ "isDeprecated": false,
1213
+ "deprecationReason": null
1214
+ }
1215
+ ],
1216
+ "inputFields": null,
1217
+ "interfaces": [
1218
+
1219
+ ],
1220
+ "enumValues": null,
1221
+ "possibleTypes": null
1222
+ },
1223
+ {
1224
+ "kind": "OBJECT",
1225
+ "name": "__Directive",
1226
+ "description": "A Directive provides a way to describe alternate runtime execution and type validation behavior in a GraphQL document.\n\nIn some cases, you need to provide options to alter GraphQL's execution behavior in ways field arguments will not suffice, such as conditionally including or skipping a field. Directives provide this by describing additional information to the executor.",
1227
+ "fields": [
1228
+ {
1229
+ "name": "args",
1230
+ "description": null,
1231
+ "args": [
1232
+
1233
+ ],
1234
+ "type": {
1235
+ "kind": "NON_NULL",
1236
+ "name": null,
1237
+ "ofType": {
1238
+ "kind": "LIST",
1239
+ "name": null,
1240
+ "ofType": {
1241
+ "kind": "NON_NULL",
1242
+ "name": null,
1243
+ "ofType": {
1244
+ "kind": "OBJECT",
1245
+ "name": "__InputValue",
1246
+ "ofType": null
1247
+ }
1248
+ }
1249
+ }
1250
+ },
1251
+ "isDeprecated": false,
1252
+ "deprecationReason": null
1253
+ },
1254
+ {
1255
+ "name": "description",
1256
+ "description": null,
1257
+ "args": [
1258
+
1259
+ ],
1260
+ "type": {
1261
+ "kind": "SCALAR",
1262
+ "name": "String",
1263
+ "ofType": null
1264
+ },
1265
+ "isDeprecated": false,
1266
+ "deprecationReason": null
1267
+ },
1268
+ {
1269
+ "name": "locations",
1270
+ "description": null,
1271
+ "args": [
1272
+
1273
+ ],
1274
+ "type": {
1275
+ "kind": "NON_NULL",
1276
+ "name": null,
1277
+ "ofType": {
1278
+ "kind": "LIST",
1279
+ "name": null,
1280
+ "ofType": {
1281
+ "kind": "NON_NULL",
1282
+ "name": null,
1283
+ "ofType": {
1284
+ "kind": "ENUM",
1285
+ "name": "__DirectiveLocation",
1286
+ "ofType": null
1287
+ }
1288
+ }
1289
+ }
1290
+ },
1291
+ "isDeprecated": false,
1292
+ "deprecationReason": null
1293
+ },
1294
+ {
1295
+ "name": "name",
1296
+ "description": null,
1297
+ "args": [
1298
+
1299
+ ],
1300
+ "type": {
1301
+ "kind": "NON_NULL",
1302
+ "name": null,
1303
+ "ofType": {
1304
+ "kind": "SCALAR",
1305
+ "name": "String",
1306
+ "ofType": null
1307
+ }
1308
+ },
1309
+ "isDeprecated": false,
1310
+ "deprecationReason": null
1311
+ },
1312
+ {
1313
+ "name": "onField",
1314
+ "description": null,
1315
+ "args": [
1316
+
1317
+ ],
1318
+ "type": {
1319
+ "kind": "NON_NULL",
1320
+ "name": null,
1321
+ "ofType": {
1322
+ "kind": "SCALAR",
1323
+ "name": "Boolean",
1324
+ "ofType": null
1325
+ }
1326
+ },
1327
+ "isDeprecated": true,
1328
+ "deprecationReason": "Use `locations`."
1329
+ },
1330
+ {
1331
+ "name": "onFragment",
1332
+ "description": null,
1333
+ "args": [
1334
+
1335
+ ],
1336
+ "type": {
1337
+ "kind": "NON_NULL",
1338
+ "name": null,
1339
+ "ofType": {
1340
+ "kind": "SCALAR",
1341
+ "name": "Boolean",
1342
+ "ofType": null
1343
+ }
1344
+ },
1345
+ "isDeprecated": true,
1346
+ "deprecationReason": "Use `locations`."
1347
+ },
1348
+ {
1349
+ "name": "onOperation",
1350
+ "description": null,
1351
+ "args": [
1352
+
1353
+ ],
1354
+ "type": {
1355
+ "kind": "NON_NULL",
1356
+ "name": null,
1357
+ "ofType": {
1358
+ "kind": "SCALAR",
1359
+ "name": "Boolean",
1360
+ "ofType": null
1361
+ }
1362
+ },
1363
+ "isDeprecated": true,
1364
+ "deprecationReason": "Use `locations`."
1365
+ }
1366
+ ],
1367
+ "inputFields": null,
1368
+ "interfaces": [
1369
+
1370
+ ],
1371
+ "enumValues": null,
1372
+ "possibleTypes": null
1373
+ },
1374
+ {
1375
+ "kind": "ENUM",
1376
+ "name": "__DirectiveLocation",
1377
+ "description": "A Directive can be adjacent to many parts of the GraphQL language, a __DirectiveLocation describes one such possible adjacencies.",
1378
+ "fields": null,
1379
+ "inputFields": null,
1380
+ "interfaces": null,
1381
+ "enumValues": [
1382
+ {
1383
+ "name": "QUERY",
1384
+ "description": "Location adjacent to a query operation.",
1385
+ "isDeprecated": false,
1386
+ "deprecationReason": null
1387
+ },
1388
+ {
1389
+ "name": "MUTATION",
1390
+ "description": "Location adjacent to a mutation operation.",
1391
+ "isDeprecated": false,
1392
+ "deprecationReason": null
1393
+ },
1394
+ {
1395
+ "name": "SUBSCRIPTION",
1396
+ "description": "Location adjacent to a subscription operation.",
1397
+ "isDeprecated": false,
1398
+ "deprecationReason": null
1399
+ },
1400
+ {
1401
+ "name": "FIELD",
1402
+ "description": "Location adjacent to a field.",
1403
+ "isDeprecated": false,
1404
+ "deprecationReason": null
1405
+ },
1406
+ {
1407
+ "name": "FRAGMENT_DEFINITION",
1408
+ "description": "Location adjacent to a fragment definition.",
1409
+ "isDeprecated": false,
1410
+ "deprecationReason": null
1411
+ },
1412
+ {
1413
+ "name": "FRAGMENT_SPREAD",
1414
+ "description": "Location adjacent to a fragment spread.",
1415
+ "isDeprecated": false,
1416
+ "deprecationReason": null
1417
+ },
1418
+ {
1419
+ "name": "INLINE_FRAGMENT",
1420
+ "description": "Location adjacent to an inline fragment.",
1421
+ "isDeprecated": false,
1422
+ "deprecationReason": null
1423
+ },
1424
+ {
1425
+ "name": "SCHEMA",
1426
+ "description": "Location adjacent to a schema definition.",
1427
+ "isDeprecated": false,
1428
+ "deprecationReason": null
1429
+ },
1430
+ {
1431
+ "name": "SCALAR",
1432
+ "description": "Location adjacent to a scalar definition.",
1433
+ "isDeprecated": false,
1434
+ "deprecationReason": null
1435
+ },
1436
+ {
1437
+ "name": "OBJECT",
1438
+ "description": "Location adjacent to an object type definition.",
1439
+ "isDeprecated": false,
1440
+ "deprecationReason": null
1441
+ },
1442
+ {
1443
+ "name": "FIELD_DEFINITION",
1444
+ "description": "Location adjacent to a field definition.",
1445
+ "isDeprecated": false,
1446
+ "deprecationReason": null
1447
+ },
1448
+ {
1449
+ "name": "ARGUMENT_DEFINITION",
1450
+ "description": "Location adjacent to an argument definition.",
1451
+ "isDeprecated": false,
1452
+ "deprecationReason": null
1453
+ },
1454
+ {
1455
+ "name": "INTERFACE",
1456
+ "description": "Location adjacent to an interface definition.",
1457
+ "isDeprecated": false,
1458
+ "deprecationReason": null
1459
+ },
1460
+ {
1461
+ "name": "UNION",
1462
+ "description": "Location adjacent to a union definition.",
1463
+ "isDeprecated": false,
1464
+ "deprecationReason": null
1465
+ },
1466
+ {
1467
+ "name": "ENUM",
1468
+ "description": "Location adjacent to an enum definition.",
1469
+ "isDeprecated": false,
1470
+ "deprecationReason": null
1471
+ },
1472
+ {
1473
+ "name": "ENUM_VALUE",
1474
+ "description": "Location adjacent to an enum value definition.",
1475
+ "isDeprecated": false,
1476
+ "deprecationReason": null
1477
+ },
1478
+ {
1479
+ "name": "INPUT_OBJECT",
1480
+ "description": "Location adjacent to an input object type definition.",
1481
+ "isDeprecated": false,
1482
+ "deprecationReason": null
1483
+ },
1484
+ {
1485
+ "name": "INPUT_FIELD_DEFINITION",
1486
+ "description": "Location adjacent to an input object field definition.",
1487
+ "isDeprecated": false,
1488
+ "deprecationReason": null
1489
+ }
1490
+ ],
1491
+ "possibleTypes": null
1492
+ },
1493
+ {
1494
+ "kind": "OBJECT",
1495
+ "name": "__EnumValue",
1496
+ "description": "One possible value for a given Enum. Enum values are unique values, not a placeholder for a string or numeric value. However an Enum value is returned in a JSON response as a string.",
1497
+ "fields": [
1498
+ {
1499
+ "name": "deprecationReason",
1500
+ "description": null,
1501
+ "args": [
1502
+
1503
+ ],
1504
+ "type": {
1505
+ "kind": "SCALAR",
1506
+ "name": "String",
1507
+ "ofType": null
1508
+ },
1509
+ "isDeprecated": false,
1510
+ "deprecationReason": null
1511
+ },
1512
+ {
1513
+ "name": "description",
1514
+ "description": null,
1515
+ "args": [
1516
+
1517
+ ],
1518
+ "type": {
1519
+ "kind": "SCALAR",
1520
+ "name": "String",
1521
+ "ofType": null
1522
+ },
1523
+ "isDeprecated": false,
1524
+ "deprecationReason": null
1525
+ },
1526
+ {
1527
+ "name": "isDeprecated",
1528
+ "description": null,
1529
+ "args": [
1530
+
1531
+ ],
1532
+ "type": {
1533
+ "kind": "NON_NULL",
1534
+ "name": null,
1535
+ "ofType": {
1536
+ "kind": "SCALAR",
1537
+ "name": "Boolean",
1538
+ "ofType": null
1539
+ }
1540
+ },
1541
+ "isDeprecated": false,
1542
+ "deprecationReason": null
1543
+ },
1544
+ {
1545
+ "name": "name",
1546
+ "description": null,
1547
+ "args": [
1548
+
1549
+ ],
1550
+ "type": {
1551
+ "kind": "NON_NULL",
1552
+ "name": null,
1553
+ "ofType": {
1554
+ "kind": "SCALAR",
1555
+ "name": "String",
1556
+ "ofType": null
1557
+ }
1558
+ },
1559
+ "isDeprecated": false,
1560
+ "deprecationReason": null
1561
+ }
1562
+ ],
1563
+ "inputFields": null,
1564
+ "interfaces": [
1565
+
1566
+ ],
1567
+ "enumValues": null,
1568
+ "possibleTypes": null
1569
+ },
1570
+ {
1571
+ "kind": "OBJECT",
1572
+ "name": "__Field",
1573
+ "description": "Object and Interface types are described by a list of Fields, each of which has a name, potentially a list of arguments, and a return type.",
1574
+ "fields": [
1575
+ {
1576
+ "name": "args",
1577
+ "description": null,
1578
+ "args": [
1579
+ {
1580
+ "name": "includeDeprecated",
1581
+ "description": null,
1582
+ "type": {
1583
+ "kind": "SCALAR",
1584
+ "name": "Boolean",
1585
+ "ofType": null
1586
+ },
1587
+ "defaultValue": "false"
1588
+ }
1589
+ ],
1590
+ "type": {
1591
+ "kind": "NON_NULL",
1592
+ "name": null,
1593
+ "ofType": {
1594
+ "kind": "LIST",
1595
+ "name": null,
1596
+ "ofType": {
1597
+ "kind": "NON_NULL",
1598
+ "name": null,
1599
+ "ofType": {
1600
+ "kind": "OBJECT",
1601
+ "name": "__InputValue",
1602
+ "ofType": null
1603
+ }
1604
+ }
1605
+ }
1606
+ },
1607
+ "isDeprecated": false,
1608
+ "deprecationReason": null
1609
+ },
1610
+ {
1611
+ "name": "deprecationReason",
1612
+ "description": null,
1613
+ "args": [
1614
+
1615
+ ],
1616
+ "type": {
1617
+ "kind": "SCALAR",
1618
+ "name": "String",
1619
+ "ofType": null
1620
+ },
1621
+ "isDeprecated": false,
1622
+ "deprecationReason": null
1623
+ },
1624
+ {
1625
+ "name": "description",
1626
+ "description": null,
1627
+ "args": [
1628
+
1629
+ ],
1630
+ "type": {
1631
+ "kind": "SCALAR",
1632
+ "name": "String",
1633
+ "ofType": null
1634
+ },
1635
+ "isDeprecated": false,
1636
+ "deprecationReason": null
1637
+ },
1638
+ {
1639
+ "name": "isDeprecated",
1640
+ "description": null,
1641
+ "args": [
1642
+
1643
+ ],
1644
+ "type": {
1645
+ "kind": "NON_NULL",
1646
+ "name": null,
1647
+ "ofType": {
1648
+ "kind": "SCALAR",
1649
+ "name": "Boolean",
1650
+ "ofType": null
1651
+ }
1652
+ },
1653
+ "isDeprecated": false,
1654
+ "deprecationReason": null
1655
+ },
1656
+ {
1657
+ "name": "name",
1658
+ "description": null,
1659
+ "args": [
1660
+
1661
+ ],
1662
+ "type": {
1663
+ "kind": "NON_NULL",
1664
+ "name": null,
1665
+ "ofType": {
1666
+ "kind": "SCALAR",
1667
+ "name": "String",
1668
+ "ofType": null
1669
+ }
1670
+ },
1671
+ "isDeprecated": false,
1672
+ "deprecationReason": null
1673
+ },
1674
+ {
1675
+ "name": "type",
1676
+ "description": null,
1677
+ "args": [
1678
+
1679
+ ],
1680
+ "type": {
1681
+ "kind": "NON_NULL",
1682
+ "name": null,
1683
+ "ofType": {
1684
+ "kind": "OBJECT",
1685
+ "name": "__Type",
1686
+ "ofType": null
1687
+ }
1688
+ },
1689
+ "isDeprecated": false,
1690
+ "deprecationReason": null
1691
+ }
1692
+ ],
1693
+ "inputFields": null,
1694
+ "interfaces": [
1695
+
1696
+ ],
1697
+ "enumValues": null,
1698
+ "possibleTypes": null
1699
+ },
1700
+ {
1701
+ "kind": "OBJECT",
1702
+ "name": "__InputValue",
1703
+ "description": "Arguments provided to Fields or Directives and the input fields of an InputObject are represented as Input Values which describe their type and optionally a default value.",
1704
+ "fields": [
1705
+ {
1706
+ "name": "defaultValue",
1707
+ "description": "A GraphQL-formatted string representing the default value for this input value.",
1708
+ "args": [
1709
+
1710
+ ],
1711
+ "type": {
1712
+ "kind": "SCALAR",
1713
+ "name": "String",
1714
+ "ofType": null
1715
+ },
1716
+ "isDeprecated": false,
1717
+ "deprecationReason": null
1718
+ },
1719
+ {
1720
+ "name": "deprecationReason",
1721
+ "description": null,
1722
+ "args": [
1723
+
1724
+ ],
1725
+ "type": {
1726
+ "kind": "SCALAR",
1727
+ "name": "String",
1728
+ "ofType": null
1729
+ },
1730
+ "isDeprecated": false,
1731
+ "deprecationReason": null
1732
+ },
1733
+ {
1734
+ "name": "description",
1735
+ "description": null,
1736
+ "args": [
1737
+
1738
+ ],
1739
+ "type": {
1740
+ "kind": "SCALAR",
1741
+ "name": "String",
1742
+ "ofType": null
1743
+ },
1744
+ "isDeprecated": false,
1745
+ "deprecationReason": null
1746
+ },
1747
+ {
1748
+ "name": "isDeprecated",
1749
+ "description": null,
1750
+ "args": [
1751
+
1752
+ ],
1753
+ "type": {
1754
+ "kind": "NON_NULL",
1755
+ "name": null,
1756
+ "ofType": {
1757
+ "kind": "SCALAR",
1758
+ "name": "Boolean",
1759
+ "ofType": null
1760
+ }
1761
+ },
1762
+ "isDeprecated": false,
1763
+ "deprecationReason": null
1764
+ },
1765
+ {
1766
+ "name": "name",
1767
+ "description": null,
1768
+ "args": [
1769
+
1770
+ ],
1771
+ "type": {
1772
+ "kind": "NON_NULL",
1773
+ "name": null,
1774
+ "ofType": {
1775
+ "kind": "SCALAR",
1776
+ "name": "String",
1777
+ "ofType": null
1778
+ }
1779
+ },
1780
+ "isDeprecated": false,
1781
+ "deprecationReason": null
1782
+ },
1783
+ {
1784
+ "name": "type",
1785
+ "description": null,
1786
+ "args": [
1787
+
1788
+ ],
1789
+ "type": {
1790
+ "kind": "NON_NULL",
1791
+ "name": null,
1792
+ "ofType": {
1793
+ "kind": "OBJECT",
1794
+ "name": "__Type",
1795
+ "ofType": null
1796
+ }
1797
+ },
1798
+ "isDeprecated": false,
1799
+ "deprecationReason": null
1800
+ }
1801
+ ],
1802
+ "inputFields": null,
1803
+ "interfaces": [
1804
+
1805
+ ],
1806
+ "enumValues": null,
1807
+ "possibleTypes": null
1808
+ },
1809
+ {
1810
+ "kind": "OBJECT",
1811
+ "name": "__Schema",
1812
+ "description": "A GraphQL Schema defines the capabilities of a GraphQL server. It exposes all available types and directives on the server, as well as the entry points for query, mutation, and subscription operations.",
1813
+ "fields": [
1814
+ {
1815
+ "name": "directives",
1816
+ "description": "A list of all directives supported by this server.",
1817
+ "args": [
1818
+
1819
+ ],
1820
+ "type": {
1821
+ "kind": "NON_NULL",
1822
+ "name": null,
1823
+ "ofType": {
1824
+ "kind": "LIST",
1825
+ "name": null,
1826
+ "ofType": {
1827
+ "kind": "NON_NULL",
1828
+ "name": null,
1829
+ "ofType": {
1830
+ "kind": "OBJECT",
1831
+ "name": "__Directive",
1832
+ "ofType": null
1833
+ }
1834
+ }
1835
+ }
1836
+ },
1837
+ "isDeprecated": false,
1838
+ "deprecationReason": null
1839
+ },
1840
+ {
1841
+ "name": "mutationType",
1842
+ "description": "If this server supports mutation, the type that mutation operations will be rooted at.",
1843
+ "args": [
1844
+
1845
+ ],
1846
+ "type": {
1847
+ "kind": "OBJECT",
1848
+ "name": "__Type",
1849
+ "ofType": null
1850
+ },
1851
+ "isDeprecated": false,
1852
+ "deprecationReason": null
1853
+ },
1854
+ {
1855
+ "name": "queryType",
1856
+ "description": "The type that query operations will be rooted at.",
1857
+ "args": [
1858
+
1859
+ ],
1860
+ "type": {
1861
+ "kind": "NON_NULL",
1862
+ "name": null,
1863
+ "ofType": {
1864
+ "kind": "OBJECT",
1865
+ "name": "__Type",
1866
+ "ofType": null
1867
+ }
1868
+ },
1869
+ "isDeprecated": false,
1870
+ "deprecationReason": null
1871
+ },
1872
+ {
1873
+ "name": "subscriptionType",
1874
+ "description": "If this server support subscription, the type that subscription operations will be rooted at.",
1875
+ "args": [
1876
+
1877
+ ],
1878
+ "type": {
1879
+ "kind": "OBJECT",
1880
+ "name": "__Type",
1881
+ "ofType": null
1882
+ },
1883
+ "isDeprecated": false,
1884
+ "deprecationReason": null
1885
+ },
1886
+ {
1887
+ "name": "types",
1888
+ "description": "A list of all types supported by this server.",
1889
+ "args": [
1890
+
1891
+ ],
1892
+ "type": {
1893
+ "kind": "NON_NULL",
1894
+ "name": null,
1895
+ "ofType": {
1896
+ "kind": "LIST",
1897
+ "name": null,
1898
+ "ofType": {
1899
+ "kind": "NON_NULL",
1900
+ "name": null,
1901
+ "ofType": {
1902
+ "kind": "OBJECT",
1903
+ "name": "__Type",
1904
+ "ofType": null
1905
+ }
1906
+ }
1907
+ }
1908
+ },
1909
+ "isDeprecated": false,
1910
+ "deprecationReason": null
1911
+ }
1912
+ ],
1913
+ "inputFields": null,
1914
+ "interfaces": [
1915
+
1916
+ ],
1917
+ "enumValues": null,
1918
+ "possibleTypes": null
1919
+ },
1920
+ {
1921
+ "kind": "OBJECT",
1922
+ "name": "__Type",
1923
+ "description": "The fundamental unit of any GraphQL Schema is the type. There are many kinds of types in GraphQL as represented by the `__TypeKind` enum.\n\nDepending on the kind of a type, certain fields describe information about that type. Scalar types provide no information beyond a name and description, while Enum types provide their values. Object and Interface types provide the fields they describe. Abstract types, Union and Interface, provide the Object types possible at runtime. List and NonNull types compose other types.",
1924
+ "fields": [
1925
+ {
1926
+ "name": "description",
1927
+ "description": null,
1928
+ "args": [
1929
+
1930
+ ],
1931
+ "type": {
1932
+ "kind": "SCALAR",
1933
+ "name": "String",
1934
+ "ofType": null
1935
+ },
1936
+ "isDeprecated": false,
1937
+ "deprecationReason": null
1938
+ },
1939
+ {
1940
+ "name": "enumValues",
1941
+ "description": null,
1942
+ "args": [
1943
+ {
1944
+ "name": "includeDeprecated",
1945
+ "description": null,
1946
+ "type": {
1947
+ "kind": "SCALAR",
1948
+ "name": "Boolean",
1949
+ "ofType": null
1950
+ },
1951
+ "defaultValue": "false"
1952
+ }
1953
+ ],
1954
+ "type": {
1955
+ "kind": "LIST",
1956
+ "name": null,
1957
+ "ofType": {
1958
+ "kind": "NON_NULL",
1959
+ "name": null,
1960
+ "ofType": {
1961
+ "kind": "OBJECT",
1962
+ "name": "__EnumValue",
1963
+ "ofType": null
1964
+ }
1965
+ }
1966
+ },
1967
+ "isDeprecated": false,
1968
+ "deprecationReason": null
1969
+ },
1970
+ {
1971
+ "name": "fields",
1972
+ "description": null,
1973
+ "args": [
1974
+ {
1975
+ "name": "includeDeprecated",
1976
+ "description": null,
1977
+ "type": {
1978
+ "kind": "SCALAR",
1979
+ "name": "Boolean",
1980
+ "ofType": null
1981
+ },
1982
+ "defaultValue": "false"
1983
+ }
1984
+ ],
1985
+ "type": {
1986
+ "kind": "LIST",
1987
+ "name": null,
1988
+ "ofType": {
1989
+ "kind": "NON_NULL",
1990
+ "name": null,
1991
+ "ofType": {
1992
+ "kind": "OBJECT",
1993
+ "name": "__Field",
1994
+ "ofType": null
1995
+ }
1996
+ }
1997
+ },
1998
+ "isDeprecated": false,
1999
+ "deprecationReason": null
2000
+ },
2001
+ {
2002
+ "name": "inputFields",
2003
+ "description": null,
2004
+ "args": [
2005
+ {
2006
+ "name": "includeDeprecated",
2007
+ "description": null,
2008
+ "type": {
2009
+ "kind": "SCALAR",
2010
+ "name": "Boolean",
2011
+ "ofType": null
2012
+ },
2013
+ "defaultValue": "false"
2014
+ }
2015
+ ],
2016
+ "type": {
2017
+ "kind": "LIST",
2018
+ "name": null,
2019
+ "ofType": {
2020
+ "kind": "NON_NULL",
2021
+ "name": null,
2022
+ "ofType": {
2023
+ "kind": "OBJECT",
2024
+ "name": "__InputValue",
2025
+ "ofType": null
2026
+ }
2027
+ }
2028
+ },
2029
+ "isDeprecated": false,
2030
+ "deprecationReason": null
2031
+ },
2032
+ {
2033
+ "name": "interfaces",
2034
+ "description": null,
2035
+ "args": [
2036
+
2037
+ ],
2038
+ "type": {
2039
+ "kind": "LIST",
2040
+ "name": null,
2041
+ "ofType": {
2042
+ "kind": "NON_NULL",
2043
+ "name": null,
2044
+ "ofType": {
2045
+ "kind": "OBJECT",
2046
+ "name": "__Type",
2047
+ "ofType": null
2048
+ }
2049
+ }
2050
+ },
2051
+ "isDeprecated": false,
2052
+ "deprecationReason": null
2053
+ },
2054
+ {
2055
+ "name": "kind",
2056
+ "description": null,
2057
+ "args": [
2058
+
2059
+ ],
2060
+ "type": {
2061
+ "kind": "NON_NULL",
2062
+ "name": null,
2063
+ "ofType": {
2064
+ "kind": "ENUM",
2065
+ "name": "__TypeKind",
2066
+ "ofType": null
2067
+ }
2068
+ },
2069
+ "isDeprecated": false,
2070
+ "deprecationReason": null
2071
+ },
2072
+ {
2073
+ "name": "name",
2074
+ "description": null,
2075
+ "args": [
2076
+
2077
+ ],
2078
+ "type": {
2079
+ "kind": "SCALAR",
2080
+ "name": "String",
2081
+ "ofType": null
2082
+ },
2083
+ "isDeprecated": false,
2084
+ "deprecationReason": null
2085
+ },
2086
+ {
2087
+ "name": "ofType",
2088
+ "description": null,
2089
+ "args": [
2090
+
2091
+ ],
2092
+ "type": {
2093
+ "kind": "OBJECT",
2094
+ "name": "__Type",
2095
+ "ofType": null
2096
+ },
2097
+ "isDeprecated": false,
2098
+ "deprecationReason": null
2099
+ },
2100
+ {
2101
+ "name": "possibleTypes",
2102
+ "description": null,
2103
+ "args": [
2104
+
2105
+ ],
2106
+ "type": {
2107
+ "kind": "LIST",
2108
+ "name": null,
2109
+ "ofType": {
2110
+ "kind": "NON_NULL",
2111
+ "name": null,
2112
+ "ofType": {
2113
+ "kind": "OBJECT",
2114
+ "name": "__Type",
2115
+ "ofType": null
2116
+ }
2117
+ }
2118
+ },
2119
+ "isDeprecated": false,
2120
+ "deprecationReason": null
2121
+ }
2122
+ ],
2123
+ "inputFields": null,
2124
+ "interfaces": [
2125
+
2126
+ ],
2127
+ "enumValues": null,
2128
+ "possibleTypes": null
2129
+ },
2130
+ {
2131
+ "kind": "ENUM",
2132
+ "name": "__TypeKind",
2133
+ "description": "An enum describing what kind of type a given `__Type` is.",
2134
+ "fields": null,
2135
+ "inputFields": null,
2136
+ "interfaces": null,
2137
+ "enumValues": [
2138
+ {
2139
+ "name": "SCALAR",
2140
+ "description": "Indicates this type is a scalar.",
2141
+ "isDeprecated": false,
2142
+ "deprecationReason": null
2143
+ },
2144
+ {
2145
+ "name": "OBJECT",
2146
+ "description": "Indicates this type is an object. `fields` and `interfaces` are valid fields.",
2147
+ "isDeprecated": false,
2148
+ "deprecationReason": null
2149
+ },
2150
+ {
2151
+ "name": "INTERFACE",
2152
+ "description": "Indicates this type is an interface. `fields` and `possibleTypes` are valid fields.",
2153
+ "isDeprecated": false,
2154
+ "deprecationReason": null
2155
+ },
2156
+ {
2157
+ "name": "UNION",
2158
+ "description": "Indicates this type is a union. `possibleTypes` is a valid field.",
2159
+ "isDeprecated": false,
2160
+ "deprecationReason": null
2161
+ },
2162
+ {
2163
+ "name": "ENUM",
2164
+ "description": "Indicates this type is an enum. `enumValues` is a valid field.",
2165
+ "isDeprecated": false,
2166
+ "deprecationReason": null
2167
+ },
2168
+ {
2169
+ "name": "INPUT_OBJECT",
2170
+ "description": "Indicates this type is an input object. `inputFields` is a valid field.",
2171
+ "isDeprecated": false,
2172
+ "deprecationReason": null
2173
+ },
2174
+ {
2175
+ "name": "LIST",
2176
+ "description": "Indicates this type is a list. `ofType` is a valid field.",
2177
+ "isDeprecated": false,
2178
+ "deprecationReason": null
2179
+ },
2180
+ {
2181
+ "name": "NON_NULL",
2182
+ "description": "Indicates this type is a non-null. `ofType` is a valid field.",
2183
+ "isDeprecated": false,
2184
+ "deprecationReason": null
2185
+ }
2186
+ ],
2187
+ "possibleTypes": null
2188
+ }
2189
+ ],
2190
+ "directives": [
2191
+ {
2192
+ "name": "include",
2193
+ "description": "Directs the executor to include this field or fragment only when the `if` argument is true.",
2194
+ "locations": [
2195
+ "FIELD",
2196
+ "FRAGMENT_SPREAD",
2197
+ "INLINE_FRAGMENT"
2198
+ ],
2199
+ "args": [
2200
+ {
2201
+ "name": "if",
2202
+ "description": "Included when true.",
2203
+ "type": {
2204
+ "kind": "NON_NULL",
2205
+ "name": null,
2206
+ "ofType": {
2207
+ "kind": "SCALAR",
2208
+ "name": "Boolean",
2209
+ "ofType": null
2210
+ }
2211
+ },
2212
+ "defaultValue": null
2213
+ }
2214
+ ]
2215
+ },
2216
+ {
2217
+ "name": "skip",
2218
+ "description": "Directs the executor to skip this field or fragment when the `if` argument is true.",
2219
+ "locations": [
2220
+ "FIELD",
2221
+ "FRAGMENT_SPREAD",
2222
+ "INLINE_FRAGMENT"
2223
+ ],
2224
+ "args": [
2225
+ {
2226
+ "name": "if",
2227
+ "description": "Skipped when true.",
2228
+ "type": {
2229
+ "kind": "NON_NULL",
2230
+ "name": null,
2231
+ "ofType": {
2232
+ "kind": "SCALAR",
2233
+ "name": "Boolean",
2234
+ "ofType": null
2235
+ }
2236
+ },
2237
+ "defaultValue": null
2238
+ }
2239
+ ]
2240
+ },
2241
+ {
2242
+ "name": "deprecated",
2243
+ "description": "Marks an element of a GraphQL schema as no longer supported.",
2244
+ "locations": [
2245
+ "FIELD_DEFINITION",
2246
+ "ENUM_VALUE",
2247
+ "ARGUMENT_DEFINITION",
2248
+ "INPUT_FIELD_DEFINITION"
2249
+ ],
2250
+ "args": [
2251
+ {
2252
+ "name": "reason",
2253
+ "description": "Explains why this element was deprecated, usually also including a suggestion for how to access supported similar data. Formatted in [Markdown](https://daringfireball.net/projects/markdown/).",
2254
+ "type": {
2255
+ "kind": "SCALAR",
2256
+ "name": "String",
2257
+ "ofType": null
2258
+ },
2259
+ "defaultValue": "\"No longer supported\""
2260
+ }
2261
+ ]
2262
+ }
2263
+ ]
2264
+ }
2265
+ }
2266
+ }