graphql 1.13.6 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +0 -7
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +0 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +0 -0
- data/lib/generators/graphql/install_generator.rb +1 -1
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +5 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +8 -37
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/enum.erb +5 -1
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -2
- data/lib/generators/graphql/templates/mutation.erb +1 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -9
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/query_complexity.rb +1 -1
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +3 -2
- data/lib/graphql/analysis/ast.rb +0 -10
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/table.rb +0 -18
- data/lib/graphql/backtrace/tracer.rb +1 -2
- data/lib/graphql/backtrace.rb +2 -8
- data/lib/graphql/dataloader/source.rb +2 -2
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/errors.rb +1 -9
- data/lib/graphql/execution/interpreter/runtime.rb +2 -9
- data/lib/graphql/execution/interpreter.rb +0 -22
- data/lib/graphql/execution/lazy.rb +1 -1
- data/lib/graphql/execution/lookahead.rb +6 -13
- data/lib/graphql/execution/multiplex.rb +50 -107
- data/lib/graphql/execution.rb +11 -3
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +2 -15
- data/lib/graphql/introspection.rb +4 -4
- data/lib/graphql/language/document_from_schema_definition.rb +0 -17
- data/lib/graphql/pagination/connections.rb +2 -28
- data/lib/graphql/query/context.rb +1 -185
- data/lib/graphql/query/literal_input.rb +8 -13
- data/lib/graphql/query/validation_pipeline.rb +8 -37
- data/lib/graphql/query/variables.rb +22 -18
- data/lib/graphql/query.rb +5 -35
- data/lib/graphql/railtie.rb +0 -104
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/default_required_true.rb +4 -4
- data/lib/graphql/schema/addition.rb +1 -8
- data/lib/graphql/schema/argument.rb +18 -25
- data/lib/graphql/schema/build_from_definition.rb +0 -1
- data/lib/graphql/schema/directive.rb +4 -21
- data/lib/graphql/schema/enum.rb +1 -18
- data/lib/graphql/schema/enum_value.rb +0 -22
- data/lib/graphql/schema/field.rb +22 -194
- data/lib/graphql/schema/input_object.rb +10 -57
- data/lib/graphql/schema/interface.rb +0 -25
- data/lib/graphql/schema/introspection_system.rb +3 -8
- data/lib/graphql/schema/late_bound_type.rb +2 -2
- data/lib/graphql/schema/list.rb +0 -6
- data/lib/graphql/schema/loader.rb +0 -1
- data/lib/graphql/schema/member/base_dsl_methods.rb +0 -5
- data/lib/graphql/schema/member/build_type.rb +4 -6
- data/lib/graphql/schema/member/has_arguments.rb +14 -18
- data/lib/graphql/schema/member/has_fields.rb +2 -2
- data/lib/graphql/schema/member/has_interfaces.rb +0 -2
- data/lib/graphql/schema/member.rb +0 -6
- data/lib/graphql/schema/mutation.rb +0 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +0 -40
- data/lib/graphql/schema/relay_classic_mutation.rb +17 -28
- data/lib/graphql/schema/scalar.rb +0 -15
- data/lib/graphql/schema/union.rb +0 -16
- data/lib/graphql/schema/warden.rb +1 -1
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +107 -949
- data/lib/graphql/static_validation/base_visitor.rb +4 -21
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +12 -12
- data/lib/graphql/static_validation/validator.rb +2 -24
- data/lib/graphql/static_validation.rb +0 -2
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +38 -1
- data/lib/graphql/subscriptions/event.rb +1 -1
- data/lib/graphql/subscriptions/instrumentation.rb +0 -51
- data/lib/graphql/subscriptions.rb +4 -13
- data/lib/graphql/tracing/platform_tracing.rb +0 -23
- data/lib/graphql/tracing.rb +0 -1
- data/lib/graphql/types/iso_8601_date_time.rb +8 -1
- data/lib/graphql/types/relay/connection_behaviors.rb +4 -7
- data/lib/graphql/types/relay/default_relay.rb +0 -10
- data/lib/graphql/types/relay/node_behaviors.rb +5 -1
- data/lib/graphql/types/relay.rb +0 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +12 -65
- metadata +15 -129
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -131
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backwards_compatibility.rb +0 -61
- data/lib/graphql/base_type.rb +0 -232
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -436
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -215
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -87
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -266
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -682
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -240
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -55
- data/lib/graphql/directive/deprecated_directive.rb +0 -2
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -107
- data/lib/graphql/enum_type.rb +0 -133
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -226
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -128
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -138
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -72
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/non_null_type.rb +0 -71
- data/lib/graphql/object_type.rb +0 -130
- data/lib/graphql/query/arguments.rb +0 -189
- data/lib/graphql/query/arguments_cache.rb +0 -24
- data/lib/graphql/query/executor.rb +0 -52
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -40
- data/lib/graphql/relay/array_connection.rb +0 -83
- data/lib/graphql/relay/base_connection.rb +0 -189
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -41
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -19
- data/lib/graphql/relay/edges_instrumentation.rb +0 -39
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -106
- data/lib/graphql/relay/node.rb +0 -39
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -188
- data/lib/graphql/relay/type_extensions.rb +0 -32
- data/lib/graphql/scalar_type.rb +0 -91
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -17
- data/lib/graphql/schema/member/accepts_definition.rb +0 -164
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -58
- data/lib/graphql/schema/member/instrumentation.rb +0 -131
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -44
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -88
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -313
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/node_field.rb +0 -24
- data/lib/graphql/types/relay/nodes_field.rb +0 -43
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
data/lib/graphql/schema/field.rb
CHANGED
@@ -5,8 +5,6 @@ require "graphql/schema/field/scope_extension"
|
|
5
5
|
module GraphQL
|
6
6
|
class Schema
|
7
7
|
class Field
|
8
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
9
|
-
include GraphQL::Schema::Member::AcceptsDefinition
|
10
8
|
include GraphQL::Schema::Member::HasArguments
|
11
9
|
include GraphQL::Schema::Member::HasAstNode
|
12
10
|
include GraphQL::Schema::Member::HasPath
|
@@ -38,7 +36,9 @@ module GraphQL
|
|
38
36
|
|
39
37
|
# @return [Class] The GraphQL type this field belongs to. (For fields defined on mutations, it's the payload type)
|
40
38
|
def owner_type
|
41
|
-
@owner_type ||= if owner
|
39
|
+
@owner_type ||= if owner.nil?
|
40
|
+
raise GraphQL::InvariantError, "Field #{original_name.inspect} (graphql name: #{graphql_name.inspect}) has no owner, but all fields should have an owner. How did this happen?!"
|
41
|
+
elsif owner < GraphQL::Schema::Mutation
|
42
42
|
owner.payload_type
|
43
43
|
else
|
44
44
|
owner
|
@@ -82,16 +82,6 @@ module GraphQL
|
|
82
82
|
# @return [GraphQL::Schema:Field] an instance of `self
|
83
83
|
# @see {.initialize} for other options
|
84
84
|
def self.from_options(name = nil, type = nil, desc = nil, resolver: nil, mutation: nil, subscription: nil,**kwargs, &block)
|
85
|
-
if kwargs[:field]
|
86
|
-
if kwargs[:field].is_a?(GraphQL::Field) && kwargs[:field] == GraphQL::Types::Relay::NodeField.graphql_definition
|
87
|
-
GraphQL::Deprecation.warn("Legacy-style `GraphQL::Relay::Node.field` is being added to a class-based type. See `GraphQL::Types::Relay::NodeField` for a replacement.")
|
88
|
-
return GraphQL::Types::Relay::NodeField
|
89
|
-
elsif kwargs[:field].is_a?(GraphQL::Field) && kwargs[:field] == GraphQL::Types::Relay::NodesField.graphql_definition
|
90
|
-
GraphQL::Deprecation.warn("Legacy-style `GraphQL::Relay::Node.plural_field` is being added to a class-based type. See `GraphQL::Types::Relay::NodesField` for a replacement.")
|
91
|
-
return GraphQL::Types::Relay::NodesField
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
85
|
if (parent_config = resolver || mutation || subscription)
|
96
86
|
# Get the parent config, merge in local overrides
|
97
87
|
kwargs = parent_config.field_options.merge(kwargs)
|
@@ -104,9 +94,6 @@ module GraphQL
|
|
104
94
|
end
|
105
95
|
|
106
96
|
if !type.nil?
|
107
|
-
if type.is_a?(GraphQL::Field)
|
108
|
-
raise ArgumentError, "A GraphQL::Field was passed as the second argument, use the `field:` keyword for this instead."
|
109
|
-
end
|
110
97
|
if desc
|
111
98
|
if kwargs[:description]
|
112
99
|
raise ArgumentError, "Provide description as a positional argument or `description:` keyword, but not both (#{desc.inspect}, #{kwargs[:description].inspect})"
|
@@ -188,6 +175,7 @@ module GraphQL
|
|
188
175
|
# @param deprecation_reason [String] If present, the field is marked "deprecated" with this message
|
189
176
|
# @param method [Symbol] The method to call on the underlying object to resolve this field (defaults to `name`)
|
190
177
|
# @param hash_key [String, Symbol] The hash key to lookup on the underlying object (if its a Hash) to resolve this field (defaults to `name` or `name.to_s`)
|
178
|
+
# @param dig [Array<String, Symbol>] The nested hash keys to lookup on the underlying hash to resolve this field using dig
|
191
179
|
# @param resolver_method [Symbol] The method on the type to call to resolve this field (defaults to `name`)
|
192
180
|
# @param connection [Boolean] `true` if this field should get automagic connection behavior; default is to infer by `*Connection` in the return type name
|
193
181
|
# @param connection_extension [Class] The extension to add, to implement connections. If `nil`, no extension is added.
|
@@ -209,8 +197,7 @@ module GraphQL
|
|
209
197
|
# @param ast_node [Language::Nodes::FieldDefinition, nil] If this schema was parsed from definition, this AST node defined the field
|
210
198
|
# @param method_conflict_warning [Boolean] If false, skip the warning if this field's method conflicts with a built-in method
|
211
199
|
# @param validates [Array<Hash>] Configurations for validating this field
|
212
|
-
|
213
|
-
def initialize(type: nil, name: nil, owner: nil, null: true, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, hash_key: nil, resolver_method: nil, resolve: nil, connection: nil, max_page_size: :not_given, scope: nil, introspection: false, camelize: true, trace: nil, complexity: 1, ast_node: nil, extras: EMPTY_ARRAY, extensions: EMPTY_ARRAY, connection_extension: self.class.connection_extension, resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, method_conflict_warning: true, broadcastable: nil, arguments: EMPTY_HASH, directives: EMPTY_HASH, validates: EMPTY_ARRAY, legacy_edge_class: nil, &definition_block)
|
200
|
+
def initialize(type: nil, name: nil, owner: nil, null: true, field: nil, function: nil, description: nil, deprecation_reason: nil, method: nil, hash_key: nil, dig: nil, resolver_method: nil, resolve: nil, connection: nil, max_page_size: :not_given, scope: nil, introspection: false, camelize: true, trace: nil, complexity: 1, ast_node: nil, extras: EMPTY_ARRAY, extensions: EMPTY_ARRAY, connection_extension: self.class.connection_extension, resolver_class: nil, subscription_scope: nil, relay_node_field: false, relay_nodes_field: false, method_conflict_warning: true, broadcastable: nil, arguments: EMPTY_HASH, directives: EMPTY_HASH, validates: EMPTY_ARRAY, &definition_block)
|
214
201
|
if name.nil?
|
215
202
|
raise ArgumentError, "missing first `name` argument or keyword `name:`"
|
216
203
|
end
|
@@ -236,8 +223,8 @@ module GraphQL
|
|
236
223
|
@resolve = resolve
|
237
224
|
self.deprecation_reason = deprecation_reason
|
238
225
|
|
239
|
-
if method && hash_key
|
240
|
-
raise ArgumentError, "Provide `method:` _or_ `
|
226
|
+
if method && hash_key && dig
|
227
|
+
raise ArgumentError, "Provide `method:`, `hash_key:` _or_ `dig:`, not multiple. (called with: `method: #{method.inspect}, hash_key: #{hash_key.inspect}, dig: #{dig.inspect}`)"
|
241
228
|
end
|
242
229
|
|
243
230
|
if resolver_method
|
@@ -245,13 +232,14 @@ module GraphQL
|
|
245
232
|
raise ArgumentError, "Provide `method:` _or_ `resolver_method:`, not both. (called with: `method: #{method.inspect}, resolver_method: #{resolver_method.inspect}`)"
|
246
233
|
end
|
247
234
|
|
248
|
-
if hash_key
|
249
|
-
raise ArgumentError, "Provide `hash_key
|
235
|
+
if hash_key || dig
|
236
|
+
raise ArgumentError, "Provide `hash_key:`, `dig:`, _or_ `resolver_method:`, not multiple. (called with: `hash_key: #{hash_key.inspect}, dig: #{dig.inspect}, resolver_method: #{resolver_method.inspect}`)"
|
250
237
|
end
|
251
238
|
end
|
252
239
|
|
253
240
|
# TODO: I think non-string/symbol hash keys are wrongly normalized (eg `1` will not work)
|
254
241
|
method_name = method || hash_key || name_s
|
242
|
+
@dig_keys = dig
|
255
243
|
resolver_method ||= name_s.to_sym
|
256
244
|
|
257
245
|
@method_str = -method_name.to_s
|
@@ -273,7 +261,6 @@ module GraphQL
|
|
273
261
|
@relay_nodes_field = relay_nodes_field
|
274
262
|
@ast_node = ast_node
|
275
263
|
@method_conflict_warning = method_conflict_warning
|
276
|
-
@legacy_edge_class = legacy_edge_class
|
277
264
|
|
278
265
|
arguments.each do |name, arg|
|
279
266
|
case arg
|
@@ -424,11 +411,14 @@ module GraphQL
|
|
424
411
|
elsif connection?
|
425
412
|
arguments = query.arguments_for(nodes.first, self)
|
426
413
|
max_possible_page_size = nil
|
427
|
-
if arguments[
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
414
|
+
if arguments.respond_to?(:[]) # It might have been an error
|
415
|
+
if arguments[:first]
|
416
|
+
max_possible_page_size = arguments[:first]
|
417
|
+
end
|
418
|
+
|
419
|
+
if arguments[:last] && (max_possible_page_size.nil? || arguments[:last] > max_possible_page_size)
|
420
|
+
max_possible_page_size = arguments[:last]
|
421
|
+
end
|
432
422
|
end
|
433
423
|
|
434
424
|
if max_possible_page_size.nil?
|
@@ -501,82 +491,6 @@ module GraphQL
|
|
501
491
|
# @return [Integer, nil] Applied to connections if {#has_max_page_size?}
|
502
492
|
attr_reader :max_page_size
|
503
493
|
|
504
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
505
|
-
|
506
|
-
# @return [GraphQL::Field]
|
507
|
-
def to_graphql
|
508
|
-
field_defn = if @field
|
509
|
-
@field.dup
|
510
|
-
elsif @function
|
511
|
-
GraphQL::Function.build_field(@function)
|
512
|
-
else
|
513
|
-
GraphQL::Field.new
|
514
|
-
end
|
515
|
-
|
516
|
-
field_defn.name = @name
|
517
|
-
if @return_type_expr
|
518
|
-
field_defn.type = -> { type }
|
519
|
-
end
|
520
|
-
|
521
|
-
if @description
|
522
|
-
field_defn.description = @description
|
523
|
-
end
|
524
|
-
|
525
|
-
if self.deprecation_reason
|
526
|
-
field_defn.deprecation_reason = self.deprecation_reason
|
527
|
-
end
|
528
|
-
|
529
|
-
if @resolver_class
|
530
|
-
if @resolver_class < GraphQL::Schema::Mutation
|
531
|
-
field_defn.mutation = @resolver_class
|
532
|
-
end
|
533
|
-
field_defn.metadata[:resolver] = @resolver_class
|
534
|
-
end
|
535
|
-
|
536
|
-
if !@trace.nil?
|
537
|
-
field_defn.trace = @trace
|
538
|
-
end
|
539
|
-
|
540
|
-
if @relay_node_field
|
541
|
-
field_defn.relay_node_field = @relay_node_field
|
542
|
-
end
|
543
|
-
|
544
|
-
if @relay_nodes_field
|
545
|
-
field_defn.relay_nodes_field = @relay_nodes_field
|
546
|
-
end
|
547
|
-
|
548
|
-
if @legacy_edge_class
|
549
|
-
field_defn.edge_class = @legacy_edge_class
|
550
|
-
end
|
551
|
-
|
552
|
-
field_defn.resolve = self.method(:resolve_field)
|
553
|
-
field_defn.connection = connection?
|
554
|
-
field_defn.connection_max_page_size = max_page_size
|
555
|
-
field_defn.introspection = @introspection
|
556
|
-
field_defn.complexity = @complexity
|
557
|
-
field_defn.subscription_scope = @subscription_scope
|
558
|
-
field_defn.ast_node = ast_node
|
559
|
-
|
560
|
-
all_argument_definitions.each do |defn|
|
561
|
-
arg_graphql = defn.deprecated_to_graphql
|
562
|
-
field_defn.arguments[arg_graphql.name] = arg_graphql # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
563
|
-
end
|
564
|
-
|
565
|
-
# Support a passed-in proc, one way or another
|
566
|
-
@resolve_proc = if @resolve
|
567
|
-
@resolve
|
568
|
-
elsif @function
|
569
|
-
@function
|
570
|
-
elsif @field
|
571
|
-
@field.resolve_proc
|
572
|
-
end
|
573
|
-
|
574
|
-
# Ok, `self` isn't a class, but this is for consistency with the classes
|
575
|
-
field_defn.metadata[:type_class] = self
|
576
|
-
field_defn.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(field_defn)
|
577
|
-
field_defn
|
578
|
-
end
|
579
|
-
|
580
494
|
class MissingReturnTypeError < GraphQL::Error; end
|
581
495
|
attr_writer :type
|
582
496
|
|
@@ -659,37 +573,6 @@ module GraphQL
|
|
659
573
|
end
|
660
574
|
end
|
661
575
|
|
662
|
-
# Implement {GraphQL::Field}'s resolve API.
|
663
|
-
#
|
664
|
-
# Eventually, we might hook up field instances to execution in another way. TBD.
|
665
|
-
# @see #resolve for how the interpreter hooks up to it
|
666
|
-
def resolve_field(obj, args, ctx)
|
667
|
-
ctx.schema.after_lazy(obj) do |after_obj|
|
668
|
-
# First, apply auth ...
|
669
|
-
query_ctx = ctx.query.context
|
670
|
-
# Some legacy fields can have `nil` here, not exactly sure why.
|
671
|
-
# @see https://github.com/rmosolgo/graphql-ruby/issues/1990 before removing
|
672
|
-
inner_obj = after_obj && after_obj.object
|
673
|
-
ctx.schema.after_lazy(to_ruby_args(after_obj, args, ctx)) do |ruby_args|
|
674
|
-
if authorized?(inner_obj, ruby_args, query_ctx)
|
675
|
-
# Then if it passed, resolve the field
|
676
|
-
if @resolve_proc
|
677
|
-
# Might be nil, still want to call the func in that case
|
678
|
-
with_extensions(inner_obj, ruby_args, query_ctx) do |extended_obj, extended_args|
|
679
|
-
# Pass the GraphQL args here for compatibility:
|
680
|
-
@resolve_proc.call(extended_obj, args, ctx)
|
681
|
-
end
|
682
|
-
else
|
683
|
-
public_send_field(after_obj, ruby_args, query_ctx)
|
684
|
-
end
|
685
|
-
else
|
686
|
-
err = GraphQL::UnauthorizedFieldError.new(object: inner_obj, type: obj.class, context: ctx, field: self)
|
687
|
-
query_ctx.schema.unauthorized_field(err)
|
688
|
-
end
|
689
|
-
end
|
690
|
-
end
|
691
|
-
end
|
692
|
-
|
693
576
|
# This method is called by the interpreter for each field.
|
694
577
|
# You can extend it in your base field classes.
|
695
578
|
# @param object [GraphQL::Schema::Object] An instance of some type class, wrapping an application object
|
@@ -722,7 +605,7 @@ module GraphQL
|
|
722
605
|
err
|
723
606
|
end
|
724
607
|
|
725
|
-
# @param ctx [GraphQL::Query::Context
|
608
|
+
# @param ctx [GraphQL::Query::Context]
|
726
609
|
def fetch_extra(extra_name, ctx)
|
727
610
|
if extra_name != :path && extra_name != :ast_node && respond_to?(extra_name)
|
728
611
|
self.public_send(extra_name)
|
@@ -735,63 +618,6 @@ module GraphQL
|
|
735
618
|
|
736
619
|
private
|
737
620
|
|
738
|
-
NO_ARGS = {}.freeze
|
739
|
-
|
740
|
-
# Convert a GraphQL arguments instance into a Ruby-style hash.
|
741
|
-
#
|
742
|
-
# @param obj [GraphQL::Schema::Object] The object where this field is being resolved
|
743
|
-
# @param graphql_args [GraphQL::Query::Arguments]
|
744
|
-
# @param field_ctx [GraphQL::Query::Context::FieldResolutionContext]
|
745
|
-
# @return [Hash<Symbol => Any>]
|
746
|
-
def to_ruby_args(obj, graphql_args, field_ctx)
|
747
|
-
if graphql_args.any? || @extras.any?
|
748
|
-
# Splat the GraphQL::Arguments to Ruby keyword arguments
|
749
|
-
ruby_kwargs = graphql_args.to_kwargs
|
750
|
-
maybe_lazies = []
|
751
|
-
# Apply any `prepare` methods. Not great code organization, can this go somewhere better?
|
752
|
-
arguments(field_ctx).each do |name, arg_defn|
|
753
|
-
ruby_kwargs_key = arg_defn.keyword
|
754
|
-
|
755
|
-
if ruby_kwargs.key?(ruby_kwargs_key)
|
756
|
-
loads = arg_defn.loads
|
757
|
-
value = ruby_kwargs[ruby_kwargs_key]
|
758
|
-
loaded_value = if loads && !arg_defn.from_resolver?
|
759
|
-
if arg_defn.type.list?
|
760
|
-
loaded_values = value.map { |val| load_application_object(arg_defn, loads, val, field_ctx.query.context) }
|
761
|
-
field_ctx.schema.after_any_lazies(loaded_values) { |result| result }
|
762
|
-
else
|
763
|
-
load_application_object(arg_defn, loads, value, field_ctx.query.context)
|
764
|
-
end
|
765
|
-
elsif arg_defn.type.list? && value.is_a?(Array)
|
766
|
-
field_ctx.schema.after_any_lazies(value, &:itself)
|
767
|
-
else
|
768
|
-
value
|
769
|
-
end
|
770
|
-
|
771
|
-
maybe_lazies << field_ctx.schema.after_lazy(loaded_value) do |loaded_value|
|
772
|
-
prepared_value = if arg_defn.prepare
|
773
|
-
arg_defn.prepare_value(obj, loaded_value)
|
774
|
-
else
|
775
|
-
loaded_value
|
776
|
-
end
|
777
|
-
|
778
|
-
ruby_kwargs[ruby_kwargs_key] = prepared_value
|
779
|
-
end
|
780
|
-
end
|
781
|
-
end
|
782
|
-
|
783
|
-
@extras.each do |extra_arg|
|
784
|
-
ruby_kwargs[extra_arg] = fetch_extra(extra_arg, field_ctx)
|
785
|
-
end
|
786
|
-
|
787
|
-
field_ctx.schema.after_any_lazies(maybe_lazies) do
|
788
|
-
ruby_kwargs
|
789
|
-
end
|
790
|
-
else
|
791
|
-
NO_ARGS
|
792
|
-
end
|
793
|
-
end
|
794
|
-
|
795
621
|
def public_send_field(unextended_obj, unextended_ruby_kwargs, query_ctx)
|
796
622
|
with_extensions(unextended_obj, unextended_ruby_kwargs, query_ctx) do |obj, ruby_kwargs|
|
797
623
|
begin
|
@@ -822,7 +648,9 @@ module GraphQL
|
|
822
648
|
end
|
823
649
|
elsif obj.object.is_a?(Hash)
|
824
650
|
inner_object = obj.object
|
825
|
-
if
|
651
|
+
if @dig_keys
|
652
|
+
inner_object.dig(*@dig_keys)
|
653
|
+
elsif inner_object.key?(@method_sym)
|
826
654
|
inner_object[@method_sym]
|
827
655
|
else
|
828
656
|
inner_object[@method_str]
|
@@ -2,7 +2,6 @@
|
|
2
2
|
module GraphQL
|
3
3
|
class Schema
|
4
4
|
class InputObject < GraphQL::Schema::Member
|
5
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
6
5
|
extend Forwardable
|
7
6
|
extend GraphQL::Schema::Member::HasArguments
|
8
7
|
extend GraphQL::Schema::Member::HasArguments::ArgumentObjectLoader
|
@@ -13,49 +12,28 @@ module GraphQL
|
|
13
12
|
|
14
13
|
# @return [GraphQL::Query::Context] The context for this query
|
15
14
|
attr_reader :context
|
16
|
-
# @return [GraphQL::
|
15
|
+
# @return [GraphQL::Execution::Interpereter::Arguments] The underlying arguments instance
|
17
16
|
attr_reader :arguments
|
18
17
|
|
19
18
|
# Ruby-like hash behaviors, read-only
|
20
19
|
def_delegators :@ruby_style_hash, :keys, :values, :each, :map, :any?, :empty?
|
21
20
|
|
22
|
-
def initialize(arguments
|
21
|
+
def initialize(arguments, ruby_kwargs:, context:, defaults_used:)
|
23
22
|
@context = context
|
24
|
-
|
25
|
-
|
26
|
-
@arguments = arguments
|
27
|
-
else
|
28
|
-
@arguments = self.class.arguments_class.new(arguments, context: context, defaults_used: defaults_used)
|
29
|
-
# Symbolized, underscored hash:
|
30
|
-
@ruby_style_hash = @arguments.to_kwargs
|
31
|
-
end
|
23
|
+
@ruby_style_hash = ruby_kwargs
|
24
|
+
@arguments = arguments
|
32
25
|
# Apply prepares, not great to have it duplicated here.
|
33
|
-
maybe_lazies = []
|
34
26
|
self.class.arguments(context).each_value do |arg_defn|
|
35
27
|
ruby_kwargs_key = arg_defn.keyword
|
36
|
-
|
37
28
|
if @ruby_style_hash.key?(ruby_kwargs_key)
|
38
|
-
loads = arg_defn.loads
|
39
|
-
# Resolvers do this loading themselves;
|
40
|
-
# With the interpreter, it's done during `coerce_arguments`
|
41
|
-
if loads && !arg_defn.from_resolver? && !context.interpreter?
|
42
|
-
value = @ruby_style_hash[ruby_kwargs_key]
|
43
|
-
loaded_value = arg_defn.load_and_authorize_value(self, value, context)
|
44
|
-
maybe_lazies << context.schema.after_lazy(loaded_value) do |loaded_value|
|
45
|
-
overwrite_argument(ruby_kwargs_key, loaded_value)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
29
|
# Weirdly, procs are applied during coercion, but not methods.
|
50
30
|
# Probably because these methods require a `self`.
|
51
|
-
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
31
|
+
if arg_defn.prepare.is_a?(Symbol) || context.nil?
|
52
32
|
prepared_value = arg_defn.prepare_value(self, @ruby_style_hash[ruby_kwargs_key])
|
53
33
|
overwrite_argument(ruby_kwargs_key, prepared_value)
|
54
34
|
end
|
55
35
|
end
|
56
36
|
end
|
57
|
-
|
58
|
-
@maybe_lazies = maybe_lazies
|
59
37
|
end
|
60
38
|
|
61
39
|
def to_h
|
@@ -68,12 +46,10 @@ module GraphQL
|
|
68
46
|
|
69
47
|
def prepare
|
70
48
|
if @context
|
71
|
-
@context
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
self
|
76
|
-
end
|
49
|
+
object = @context[:current_object]
|
50
|
+
# Pass this object's class with `as` so that messages are rendered correctly from inherited validators
|
51
|
+
Schema::Validator.validate!(self.class.validators, object, @context, @ruby_style_hash, as: self.class)
|
52
|
+
self
|
77
53
|
else
|
78
54
|
self
|
79
55
|
end
|
@@ -81,9 +57,8 @@ module GraphQL
|
|
81
57
|
|
82
58
|
def self.authorized?(obj, value, ctx)
|
83
59
|
# Authorize each argument (but this doesn't apply if `prepare` is implemented):
|
84
|
-
if value.
|
60
|
+
if value.respond_to?(:key?)
|
85
61
|
arguments(ctx).each do |_name, input_obj_arg|
|
86
|
-
input_obj_arg = input_obj_arg.type_class
|
87
62
|
if value.key?(input_obj_arg.keyword) &&
|
88
63
|
!input_obj_arg.authorized?(obj, value[input_obj_arg.keyword], ctx)
|
89
64
|
return false
|
@@ -132,9 +107,6 @@ module GraphQL
|
|
132
107
|
end
|
133
108
|
|
134
109
|
class << self
|
135
|
-
# @return [Class<GraphQL::Arguments>]
|
136
|
-
attr_accessor :arguments_class
|
137
|
-
|
138
110
|
def argument(*args, **kwargs, &block)
|
139
111
|
argument_defn = super(*args, **kwargs, &block)
|
140
112
|
# Add a method access
|
@@ -147,25 +119,6 @@ module GraphQL
|
|
147
119
|
argument_defn
|
148
120
|
end
|
149
121
|
|
150
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
151
|
-
|
152
|
-
def to_graphql
|
153
|
-
type_defn = GraphQL::InputObjectType.new
|
154
|
-
type_defn.name = graphql_name
|
155
|
-
type_defn.description = description
|
156
|
-
type_defn.metadata[:type_class] = self
|
157
|
-
type_defn.mutation = mutation
|
158
|
-
type_defn.ast_node = ast_node
|
159
|
-
all_argument_definitions.each do |arg|
|
160
|
-
type_defn.arguments[arg.graphql_definition(silence_deprecation_warning: true).name] = arg.graphql_definition(silence_deprecation_warning: true) # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
161
|
-
end
|
162
|
-
# Make a reference to a classic-style Arguments class
|
163
|
-
self.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(type_defn)
|
164
|
-
# But use this InputObject class at runtime
|
165
|
-
type_defn.arguments_class = self
|
166
|
-
type_defn
|
167
|
-
end
|
168
|
-
|
169
122
|
def kind
|
170
123
|
GraphQL::TypeKinds::INPUT_OBJECT
|
171
124
|
end
|
@@ -4,8 +4,6 @@ module GraphQL
|
|
4
4
|
module Interface
|
5
5
|
include GraphQL::Schema::Member::GraphQLTypeNames
|
6
6
|
module DefinitionMethods
|
7
|
-
include GraphQL::Schema::Member::CachedGraphQLDefinition
|
8
|
-
include GraphQL::Relay::TypeExtensions
|
9
7
|
include GraphQL::Schema::Member::BaseDSLMethods
|
10
8
|
# ConfigurationExtension's responsibilities are in `def included` below
|
11
9
|
include GraphQL::Schema::Member::TypeSystemHelpers
|
@@ -100,34 +98,11 @@ module GraphQL
|
|
100
98
|
end
|
101
99
|
end
|
102
100
|
|
103
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
104
|
-
|
105
|
-
def to_graphql
|
106
|
-
type_defn = GraphQL::InterfaceType.new
|
107
|
-
type_defn.name = graphql_name
|
108
|
-
type_defn.description = description
|
109
|
-
type_defn.orphan_types = orphan_types
|
110
|
-
type_defn.type_membership_class = self.type_membership_class
|
111
|
-
type_defn.ast_node = ast_node
|
112
|
-
fields.each do |field_name, field_inst| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
113
|
-
field_defn = field_inst.graphql_definition(silence_deprecation_warning: true)
|
114
|
-
type_defn.fields[field_defn.name] = field_defn # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
115
|
-
end
|
116
|
-
type_defn.metadata[:type_class] = self
|
117
|
-
if respond_to?(:resolve_type)
|
118
|
-
type_defn.resolve_type = method(:resolve_type)
|
119
|
-
end
|
120
|
-
type_defn
|
121
|
-
end
|
122
|
-
|
123
101
|
def kind
|
124
102
|
GraphQL::TypeKinds::INTERFACE
|
125
103
|
end
|
126
104
|
end
|
127
105
|
|
128
|
-
# Extend this _after_ `DefinitionMethods` is defined, so it will be used
|
129
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
130
|
-
|
131
106
|
extend DefinitionMethods
|
132
107
|
|
133
108
|
def unwrap
|
@@ -89,9 +89,9 @@ module GraphQL
|
|
89
89
|
case late_bound_type
|
90
90
|
when GraphQL::Schema::LateBoundType
|
91
91
|
@schema.get_type(late_bound_type.name)
|
92
|
-
when GraphQL::Schema::List
|
92
|
+
when GraphQL::Schema::List
|
93
93
|
resolve_late_binding(late_bound_type.of_type).to_list_type
|
94
|
-
when GraphQL::Schema::NonNull
|
94
|
+
when GraphQL::Schema::NonNull
|
95
95
|
resolve_late_binding(late_bound_type.of_type).to_non_null_type
|
96
96
|
when Module
|
97
97
|
# It's a normal type -- no change required
|
@@ -103,12 +103,7 @@ module GraphQL
|
|
103
103
|
|
104
104
|
def load_constant(class_name)
|
105
105
|
const = @custom_namespace.const_get(class_name)
|
106
|
-
|
107
|
-
dup_type_class(const)
|
108
|
-
else
|
109
|
-
# Use `.to_graphql` to get a freshly-made version, not shared between schemas
|
110
|
-
const.deprecated_to_graphql
|
111
|
-
end
|
106
|
+
dup_type_class(const)
|
112
107
|
rescue NameError
|
113
108
|
# Dup the built-in so that the cached fields aren't shared
|
114
109
|
dup_type_class(@built_in_namespace.const_get(class_name))
|
@@ -16,11 +16,11 @@ module GraphQL
|
|
16
16
|
end
|
17
17
|
|
18
18
|
def to_non_null_type
|
19
|
-
@to_non_null_type ||= GraphQL::
|
19
|
+
@to_non_null_type ||= GraphQL::Schema::NonNull.new(self)
|
20
20
|
end
|
21
21
|
|
22
22
|
def to_list_type
|
23
|
-
@to_list_type ||= GraphQL::
|
23
|
+
@to_list_type ||= GraphQL::Schema::List.new(self)
|
24
24
|
end
|
25
25
|
|
26
26
|
def inspect
|
data/lib/graphql/schema/list.rb
CHANGED
@@ -8,12 +8,6 @@ module GraphQL
|
|
8
8
|
class List < GraphQL::Schema::Wrapper
|
9
9
|
include Schema::Member::ValidatesInput
|
10
10
|
|
11
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
12
|
-
|
13
|
-
def to_graphql
|
14
|
-
@of_type.graphql_definition(silence_deprecation_warning: true).to_list_type
|
15
|
-
end
|
16
|
-
|
17
11
|
# @return [GraphQL::TypeKinds::LIST]
|
18
12
|
def kind
|
19
13
|
GraphQL::TypeKinds::LIST
|
@@ -94,11 +94,6 @@ module GraphQL
|
|
94
94
|
end
|
95
95
|
end
|
96
96
|
|
97
|
-
# @return [GraphQL::BaseType] Convert this type to a legacy-style object.
|
98
|
-
def to_graphql
|
99
|
-
raise GraphQL::RequiredImplementationMissingError
|
100
|
-
end
|
101
|
-
|
102
97
|
alias :unwrap :itself
|
103
98
|
|
104
99
|
# Creates the default name for a schema member.
|
@@ -35,18 +35,16 @@ module GraphQL
|
|
35
35
|
else
|
36
36
|
maybe_type = constantize(type_expr)
|
37
37
|
case maybe_type
|
38
|
-
when GraphQL::BaseType
|
39
|
-
maybe_type
|
40
38
|
when Module
|
41
39
|
# This is a way to check that it's the right kind of module:
|
42
|
-
if maybe_type.respond_to?(:
|
40
|
+
if maybe_type.respond_to?(:kind)
|
43
41
|
maybe_type
|
44
42
|
else
|
45
43
|
raise ArgumentError, "Unexpected class/module found for GraphQL type: #{type_expr} (must be type definition class/module)"
|
46
44
|
end
|
47
45
|
end
|
48
46
|
end
|
49
|
-
when GraphQL::
|
47
|
+
when GraphQL::Schema::LateBoundType
|
50
48
|
type_expr
|
51
49
|
when Array
|
52
50
|
case type_expr.length
|
@@ -68,7 +66,7 @@ module GraphQL
|
|
68
66
|
type_expr
|
69
67
|
when Module
|
70
68
|
# This is a way to check that it's the right kind of module:
|
71
|
-
if type_expr.respond_to?(:
|
69
|
+
if type_expr.respond_to?(:kind)
|
72
70
|
type_expr
|
73
71
|
else
|
74
72
|
# Eg `String` => GraphQL::Types::String
|
@@ -100,7 +98,7 @@ module GraphQL
|
|
100
98
|
|
101
99
|
def to_type_name(something)
|
102
100
|
case something
|
103
|
-
when GraphQL::
|
101
|
+
when GraphQL::Schema::LateBoundType
|
104
102
|
something.unwrap.name
|
105
103
|
when Array
|
106
104
|
to_type_name(something.first)
|
@@ -14,7 +14,7 @@ module GraphQL
|
|
14
14
|
end
|
15
15
|
|
16
16
|
# @see {GraphQL::Schema::Argument#initialize} for parameters
|
17
|
-
# @return [GraphQL::Schema::Argument] An instance of {
|
17
|
+
# @return [GraphQL::Schema::Argument] An instance of {argument_class}, created from `*args`
|
18
18
|
def argument(*args, **kwargs, &block)
|
19
19
|
kwargs[:owner] = self
|
20
20
|
loads = kwargs[:loads]
|
@@ -291,26 +291,22 @@ module GraphQL
|
|
291
291
|
# This object was loaded successfully
|
292
292
|
# and resolved to the right type,
|
293
293
|
# now apply the `.authorized?` class method if there is one
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
294
|
+
context.schema.after_lazy(application_object_type.authorized?(application_object, context)) do |authed|
|
295
|
+
if authed
|
296
|
+
application_object
|
297
|
+
else
|
298
|
+
err = GraphQL::UnauthorizedError.new(
|
299
|
+
object: application_object,
|
300
|
+
type: application_object_type,
|
301
|
+
context: context,
|
302
|
+
)
|
303
|
+
if self.respond_to?(:unauthorized_object)
|
304
|
+
err.set_backtrace(caller)
|
305
|
+
unauthorized_object(err)
|
298
306
|
else
|
299
|
-
err
|
300
|
-
object: application_object,
|
301
|
-
type: class_based_type,
|
302
|
-
context: context,
|
303
|
-
)
|
304
|
-
if self.respond_to?(:unauthorized_object)
|
305
|
-
err.set_backtrace(caller)
|
306
|
-
unauthorized_object(err)
|
307
|
-
else
|
308
|
-
raise err
|
309
|
-
end
|
307
|
+
raise err
|
310
308
|
end
|
311
309
|
end
|
312
|
-
else
|
313
|
-
application_object
|
314
310
|
end
|
315
311
|
end
|
316
312
|
end
|
@@ -103,10 +103,10 @@ module GraphQL
|
|
103
103
|
end
|
104
104
|
|
105
105
|
def global_id_field(field_name, **kwargs)
|
106
|
-
|
106
|
+
type = self
|
107
107
|
field field_name, "ID", **kwargs, null: false
|
108
108
|
define_method(field_name) do
|
109
|
-
|
109
|
+
context.schema.id_from_object(object, type, context)
|
110
110
|
end
|
111
111
|
end
|
112
112
|
|