graphql 1.12.12 → 2.4.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +3 -8
- 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 +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +60 -4
- 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 +10 -38
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +23 -12
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +2 -0
- data/lib/generators/graphql/templates/base_edge.erb +2 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_resolver.erb +8 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +5 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +4 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -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/node_type.erb +2 -0
- data/lib/generators/graphql/templates/object.erb +4 -2
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/scalar.erb +3 -1
- data/lib/generators/graphql/templates/schema.erb +22 -2
- data/lib/generators/graphql/templates/union.erb +4 -2
- data/lib/generators/graphql/type_generator.rb +46 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/analyzer.rb +89 -0
- data/lib/graphql/analysis/field_usage.rb +65 -28
- data/lib/graphql/analysis/max_query_complexity.rb +11 -17
- data/lib/graphql/analysis/max_query_depth.rb +13 -19
- data/lib/graphql/analysis/query_complexity.rb +156 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +283 -0
- data/lib/graphql/analysis.rb +90 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/inspect_result.rb +0 -12
- data/lib/graphql/backtrace/table.rb +4 -22
- data/lib/graphql/backtrace/trace.rb +93 -0
- data/lib/graphql/backtrace/tracer.rb +8 -6
- data/lib/graphql/backtrace.rb +3 -8
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +52 -0
- data/lib/graphql/dataloader/async_dataloader.rb +89 -0
- data/lib/graphql/dataloader/null_dataloader.rb +4 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +125 -33
- data/lib/graphql/dataloader.rb +193 -143
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -81
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +2 -2
- data/lib/graphql/execution/interpreter/arguments_cache.rb +33 -36
- data/lib/graphql/execution/interpreter/resolve.rb +38 -4
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +175 -0
- data/lib/graphql/execution/interpreter/runtime.rb +447 -403
- data/lib/graphql/execution/interpreter.rb +126 -80
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +4 -172
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +6 -4
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +11 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +4 -4
- data/lib/graphql/introspection/input_value_type.rb +10 -4
- data/lib/graphql/introspection/schema_type.rb +17 -15
- data/lib/graphql/introspection/type_type.rb +29 -16
- data/lib/graphql/introspection.rb +6 -2
- data/lib/graphql/invalid_null_error.rb +1 -1
- data/lib/graphql/language/block_string.rb +37 -25
- data/lib/graphql/language/cache.rb +13 -0
- data/lib/graphql/language/comment.rb +18 -0
- data/lib/graphql/language/definition_slice.rb +1 -1
- data/lib/graphql/language/document_from_schema_definition.rb +122 -81
- data/lib/graphql/language/lexer.rb +364 -1467
- data/lib/graphql/language/nodes.rb +197 -106
- data/lib/graphql/language/parser.rb +799 -1920
- data/lib/graphql/language/printer.rb +372 -160
- data/lib/graphql/language/sanitized_printer.rb +25 -27
- data/lib/graphql/language/static_visitor.rb +167 -0
- data/lib/graphql/language/visitor.rb +188 -141
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/name_validator.rb +0 -4
- data/lib/graphql/pagination/active_record_relation_connection.rb +37 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +22 -23
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +60 -28
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +146 -222
- data/lib/graphql/query/input_validation_result.rb +10 -1
- data/lib/graphql/query/null_context.rb +15 -32
- data/lib/graphql/query/validation_pipeline.rb +15 -39
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +35 -17
- data/lib/graphql/query.rb +149 -82
- data/lib/graphql/railtie.rb +15 -109
- data/lib/graphql/rake_task/validate.rb +1 -1
- data/lib/graphql/rake_task.rb +30 -11
- data/lib/graphql/relay/range_add.rb +9 -16
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/field_type_in_block.rb +144 -0
- data/lib/graphql/rubocop/graphql/root_types_in_block.rb +38 -0
- data/lib/graphql/rubocop.rb +6 -0
- data/lib/graphql/schema/addition.rb +98 -54
- data/lib/graphql/schema/always_visible.rb +14 -0
- data/lib/graphql/schema/argument.rb +179 -82
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +77 -39
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +4 -4
- data/lib/graphql/schema/directive/include.rb +1 -1
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/skip.rb +1 -1
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +2 -2
- data/lib/graphql/schema/directive.rb +36 -22
- data/lib/graphql/schema/enum.rb +158 -63
- data/lib/graphql/schema/enum_value.rb +12 -21
- data/lib/graphql/schema/field/connection_extension.rb +7 -17
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +521 -359
- data/lib/graphql/schema/field_extension.rb +86 -2
- data/lib/graphql/schema/find_inherited_value.rb +3 -7
- data/lib/graphql/schema/finder.rb +5 -5
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +148 -99
- data/lib/graphql/schema/interface.rb +41 -64
- data/lib/graphql/schema/introspection_system.rb +12 -26
- data/lib/graphql/schema/late_bound_type.rb +12 -2
- data/lib/graphql/schema/list.rb +18 -7
- data/lib/graphql/schema/loader.rb +6 -5
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +16 -13
- data/lib/graphql/schema/member/has_arguments.rb +270 -86
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +3 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +169 -31
- data/lib/graphql/schema/member/has_interfaces.rb +143 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +5 -1
- data/lib/graphql/schema/member/has_validators.rb +32 -6
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/scoped.rb +19 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +16 -0
- data/lib/graphql/schema/member/validates_input.rb +6 -6
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +7 -7
- data/lib/graphql/schema/object.rb +38 -119
- data/lib/graphql/schema/printer.rb +24 -25
- data/lib/graphql/schema/relay_classic_mutation.rb +13 -91
- data/lib/graphql/schema/resolver/has_payload_type.rb +46 -11
- data/lib/graphql/schema/resolver.rb +118 -115
- data/lib/graphql/schema/scalar.rb +20 -21
- data/lib/graphql/schema/subscription.rb +95 -21
- data/lib/graphql/schema/timeout.rb +25 -29
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +21 -4
- data/lib/graphql/schema/union.rb +16 -16
- data/lib/graphql/schema/unique_within_type.rb +1 -1
- data/lib/graphql/schema/validator/all_validator.rb +62 -0
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/format_validator.rb +4 -5
- data/lib/graphql/schema/validator/inclusion_validator.rb +3 -1
- data/lib/graphql/schema/validator/length_validator.rb +5 -3
- data/lib/graphql/schema/validator/numericality_validator.rb +13 -2
- data/lib/graphql/schema/validator/required_validator.rb +56 -18
- data/lib/graphql/schema/validator.rb +38 -28
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +359 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +294 -0
- data/lib/graphql/schema/warden.rb +423 -134
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1015 -1057
- data/lib/graphql/static_validation/all_rules.rb +3 -1
- data/lib/graphql/static_validation/base_visitor.rb +15 -28
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -2
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +24 -7
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +1 -1
- data/lib/graphql/static_validation/rules/argument_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +4 -3
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +15 -13
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +12 -2
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +13 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +62 -35
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragment_types_exist.rb +12 -2
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/fragments_are_on_composite_types.rb +1 -1
- data/lib/graphql/static_validation/rules/mutation_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/no_definitions_are_present.rb +1 -1
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid.rb +66 -0
- data/lib/graphql/static_validation/rules/one_of_input_objects_are_valid_error.rb +29 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +7 -5
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +5 -5
- data/lib/graphql/static_validation/rules/subscription_root_exists.rb +1 -1
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +14 -8
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +18 -27
- data/lib/graphql/static_validation/rules/variable_names_are_unique.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +14 -8
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +32 -6
- data/lib/graphql/static_validation/validator.rb +11 -27
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +49 -11
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +11 -5
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +40 -1
- data/lib/graphql/subscriptions/event.rb +87 -38
- data/lib/graphql/subscriptions/serialize.rb +27 -3
- data/lib/graphql/subscriptions.rb +63 -49
- data/lib/graphql/testing/helpers.rb +155 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +6 -20
- data/lib/graphql/tracing/appoptics_trace.rb +253 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +4 -2
- data/lib/graphql/tracing/appsignal_trace.rb +79 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +17 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +185 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +27 -15
- data/lib/graphql/{execution/instrumentation.rb → tracing/legacy_hooks_trace.rb} +11 -28
- data/lib/graphql/tracing/legacy_trace.rb +12 -0
- data/lib/graphql/tracing/new_relic_trace.rb +77 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +45 -0
- data/lib/graphql/tracing/notifications_tracing.rb +61 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/platform_trace.rb +118 -0
- data/lib/graphql/tracing/platform_tracing.rb +46 -49
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +94 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +74 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +114 -0
- data/lib/graphql/tracing/statsd_trace.rb +58 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +79 -0
- data/lib/graphql/tracing.rb +29 -52
- data/lib/graphql/type_kinds.rb +7 -4
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +1 -1
- data/lib/graphql/types/iso_8601_date.rb +17 -6
- data/lib/graphql/types/iso_8601_date_time.rb +12 -1
- data/lib/graphql/types/iso_8601_duration.rb +77 -0
- data/lib/graphql/types/relay/base_connection.rb +16 -6
- data/lib/graphql/types/relay/connection_behaviors.rb +92 -32
- data/lib/graphql/types/relay/edge_behaviors.rb +46 -7
- data/lib/graphql/types/relay/has_node_field.rb +2 -2
- data/lib/graphql/types/relay/has_nodes_field.rb +2 -2
- data/lib/graphql/types/relay/node_behaviors.rb +12 -2
- data/lib/graphql/types/relay/page_info_behaviors.rb +11 -2
- data/lib/graphql/types/relay.rb +0 -3
- data/lib/graphql/types/string.rb +2 -2
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/unauthorized_error.rb +1 -1
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +82 -137
- data/readme.md +13 -6
- metadata +127 -186
- data/lib/graphql/analysis/analyze_query.rb +0 -98
- data/lib/graphql/analysis/ast/analyzer.rb +0 -84
- data/lib/graphql/analysis/ast/field_usage.rb +0 -28
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -23
- data/lib/graphql/analysis/ast/max_query_depth.rb +0 -22
- data/lib/graphql/analysis/ast/query_complexity.rb +0 -234
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -268
- data/lib/graphql/analysis/ast.rb +0 -91
- 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 -230
- 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 -47
- data/lib/graphql/deprecation.rb +0 -13
- 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 -111
- data/lib/graphql/enum_type.rb +0 -129
- data/lib/graphql/execution/execute.rb +0 -333
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/lazy/resolve.rb +0 -91
- 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/filter.rb +0 -53
- 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/language/lexer.rl +0 -262
- data/lib/graphql/language/parser.y +0 -543
- data/lib/graphql/language/token.rb +0 -38
- 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/literal_input.rb +0 -136
- 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 -40
- 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/base_64_bp.rb +0 -26
- 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/invalid_type_error.rb +0 -7
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -31
- 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/static_validation/type_stack.rb +0 -216
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/instrumentation.rb +0 -79
- data/lib/graphql/subscriptions/subscription_root.rb +0 -76
- data/lib/graphql/tracing/skylight_tracing.rb +0 -70
- data/lib/graphql/types/relay/default_relay.rb +0 -27
- data/lib/graphql/types/relay/node_field.rb +0 -25
- data/lib/graphql/types/relay/nodes_field.rb +0 -27
- data/lib/graphql/union_type.rb +0 -115
- data/lib/graphql/upgrader/member.rb +0 -937
- data/lib/graphql/upgrader/schema.rb +0 -38
@@ -8,11 +8,7 @@ module GraphQL
|
|
8
8
|
class NonNull < GraphQL::Schema::Wrapper
|
9
9
|
include Schema::Member::ValidatesInput
|
10
10
|
|
11
|
-
|
12
|
-
@of_type.graphql_definition.to_non_null_type
|
13
|
-
end
|
14
|
-
|
15
|
-
# @return [GraphQL::TypeKinds::NON_NULL]
|
11
|
+
# @return [GraphQL::TypeKinds::NON_NULL]
|
16
12
|
def kind
|
17
13
|
GraphQL::TypeKinds::NON_NULL
|
18
14
|
end
|
@@ -35,13 +31,13 @@ module GraphQL
|
|
35
31
|
"#<#{self.class.name} @of_type=#{@of_type.inspect}>"
|
36
32
|
end
|
37
33
|
|
38
|
-
def validate_input(value, ctx)
|
34
|
+
def validate_input(value, ctx, max_errors: nil)
|
39
35
|
if value.nil?
|
40
36
|
result = GraphQL::Query::InputValidationResult.new
|
41
37
|
result.add_problem("Expected value to not be null")
|
42
38
|
result
|
43
39
|
else
|
44
|
-
of_type.validate_input(value, ctx)
|
40
|
+
of_type.validate_input(value, ctx, max_errors: max_errors)
|
45
41
|
end
|
46
42
|
end
|
47
43
|
|
@@ -51,6 +47,10 @@ module GraphQL
|
|
51
47
|
end
|
52
48
|
|
53
49
|
def coerce_input(value, ctx)
|
50
|
+
# `.validate_input` above is used for variables, but this method is used for arguments
|
51
|
+
if value.nil?
|
52
|
+
raise GraphQL::ExecutionError, "`null` is not a valid input for `#{to_type_signature}`, please provide a value for this argument."
|
53
|
+
end
|
54
54
|
of_type.coerce_input(value, ctx)
|
55
55
|
end
|
56
56
|
|
@@ -5,8 +5,16 @@ require "graphql/query/null_context"
|
|
5
5
|
module GraphQL
|
6
6
|
class Schema
|
7
7
|
class Object < GraphQL::Schema::Member
|
8
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
9
8
|
extend GraphQL::Schema::Member::HasFields
|
9
|
+
extend GraphQL::Schema::Member::HasInterfaces
|
10
|
+
|
11
|
+
# Raised when an Object doesn't have any field defined and hasn't explicitly opted out of this requirement
|
12
|
+
class FieldsAreRequiredError < GraphQL::Error
|
13
|
+
def initialize(object_type)
|
14
|
+
message = "Object types must have fields, but #{object_type.graphql_name} doesn't have any. Define a field for this type, remove it from your schema, or add `has_no_fields(true)` to its definition."
|
15
|
+
super(message)
|
16
|
+
end
|
17
|
+
end
|
10
18
|
|
11
19
|
# @return [Object] the application object this type is wrapping
|
12
20
|
attr_reader :object
|
@@ -30,6 +38,15 @@ module GraphQL
|
|
30
38
|
# @see authorized_new to make instances
|
31
39
|
protected :new
|
32
40
|
|
41
|
+
def wrap_scoped(object, context)
|
42
|
+
scoped_new(object, context)
|
43
|
+
end
|
44
|
+
|
45
|
+
# This is called by the runtime to return an object to call methods on.
|
46
|
+
def wrap(object, context)
|
47
|
+
authorized_new(object, context)
|
48
|
+
end
|
49
|
+
|
33
50
|
# Make a new instance of this type _if_ the auth check passes,
|
34
51
|
# otherwise, raise an error.
|
35
52
|
#
|
@@ -48,21 +65,19 @@ module GraphQL
|
|
48
65
|
# @return [GraphQL::Schema::Object, GraphQL::Execution::Lazy]
|
49
66
|
# @raise [GraphQL::UnauthorizedError] if the user-provided hook returns `false`
|
50
67
|
def authorized_new(object, context)
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
context.schema.unauthorized_object(err)
|
59
|
-
end
|
68
|
+
maybe_lazy_auth_val = context.query.current_trace.authorized(query: context.query, type: self, object: object) do
|
69
|
+
begin
|
70
|
+
authorized?(object, context)
|
71
|
+
rescue GraphQL::UnauthorizedError => err
|
72
|
+
context.schema.unauthorized_object(err)
|
73
|
+
rescue StandardError => err
|
74
|
+
context.query.handle_or_reraise(err)
|
60
75
|
end
|
61
76
|
end
|
62
77
|
|
63
78
|
auth_val = if context.schema.lazy?(maybe_lazy_auth_val)
|
64
79
|
GraphQL::Execution::Lazy.new do
|
65
|
-
context.query.
|
80
|
+
context.query.current_trace.authorized_lazy(query: context.query, type: self, object: object) do
|
66
81
|
context.schema.sync_lazy(maybe_lazy_auth_val)
|
67
82
|
end
|
68
83
|
end
|
@@ -70,7 +85,7 @@ module GraphQL
|
|
70
85
|
maybe_lazy_auth_val
|
71
86
|
end
|
72
87
|
|
73
|
-
context.
|
88
|
+
context.query.after_lazy(auth_val) do |is_authorized|
|
74
89
|
if is_authorized
|
75
90
|
self.new(object, context)
|
76
91
|
else
|
@@ -88,6 +103,10 @@ module GraphQL
|
|
88
103
|
end
|
89
104
|
end
|
90
105
|
end
|
106
|
+
|
107
|
+
def scoped_new(object, context)
|
108
|
+
self.new(object, context)
|
109
|
+
end
|
91
110
|
end
|
92
111
|
|
93
112
|
def initialize(object, context)
|
@@ -98,114 +117,14 @@ module GraphQL
|
|
98
117
|
class << self
|
99
118
|
# Set up a type-specific invalid null error to use when this object's non-null fields wrongly return `nil`.
|
100
119
|
# It should help with debugging and bug tracker integrations.
|
101
|
-
def
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
new_interfaces.each do |int|
|
109
|
-
if int.is_a?(Module)
|
110
|
-
unless int.include?(GraphQL::Schema::Interface)
|
111
|
-
raise "#{int} cannot be implemented since it's not a GraphQL Interface. Use `include` for plain Ruby modules."
|
112
|
-
end
|
113
|
-
|
114
|
-
new_memberships << int.type_membership_class.new(int, self, **options)
|
115
|
-
|
116
|
-
# Include the methods here,
|
117
|
-
# `.fields` will use the inheritance chain
|
118
|
-
# to find inherited fields
|
119
|
-
include(int)
|
120
|
-
elsif int.is_a?(GraphQL::InterfaceType)
|
121
|
-
new_memberships << int.type_membership_class.new(int, self, **options)
|
122
|
-
elsif int.is_a?(String) || int.is_a?(GraphQL::Schema::LateBoundType)
|
123
|
-
if options.any?
|
124
|
-
raise ArgumentError, "`implements(...)` doesn't support options with late-loaded types yet. Remove #{options} and open an issue to request this feature."
|
125
|
-
end
|
126
|
-
new_memberships << int
|
127
|
-
else
|
128
|
-
raise ArgumentError, "Unexpected interface definition (expected module): #{int} (#{int.class})"
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
# Remove any interfaces which are being replaced (late-bound types are updated in place this way)
|
133
|
-
own_interface_type_memberships.reject! { |old_i_m|
|
134
|
-
old_int_type = old_i_m.respond_to?(:abstract_type) ? old_i_m.abstract_type : old_i_m
|
135
|
-
old_name = Schema::Member::BuildType.to_type_name(old_int_type)
|
136
|
-
|
137
|
-
new_memberships.any? { |new_i_m|
|
138
|
-
new_int_type = new_i_m.respond_to?(:abstract_type) ? new_i_m.abstract_type : new_i_m
|
139
|
-
new_name = Schema::Member::BuildType.to_type_name(new_int_type)
|
140
|
-
|
141
|
-
new_name == old_name
|
142
|
-
}
|
143
|
-
}
|
144
|
-
own_interface_type_memberships.concat(new_memberships)
|
145
|
-
end
|
146
|
-
|
147
|
-
def own_interface_type_memberships
|
148
|
-
@own_interface_type_memberships ||= []
|
149
|
-
end
|
150
|
-
|
151
|
-
def interface_type_memberships
|
152
|
-
own_interface_type_memberships + (superclass.respond_to?(:interface_type_memberships) ? superclass.interface_type_memberships : [])
|
153
|
-
end
|
154
|
-
|
155
|
-
# param context [Query::Context] If omitted, skip filtering.
|
156
|
-
def interfaces(context = GraphQL::Query::NullContext)
|
157
|
-
visible_interfaces = []
|
158
|
-
unfiltered = context == GraphQL::Query::NullContext
|
159
|
-
own_interface_type_memberships.each do |type_membership|
|
160
|
-
# During initialization, `type_memberships` can hold late-bound types
|
161
|
-
case type_membership
|
162
|
-
when String, Schema::LateBoundType
|
163
|
-
visible_interfaces << type_membership
|
164
|
-
when Schema::TypeMembership
|
165
|
-
if unfiltered || type_membership.visible?(context)
|
166
|
-
visible_interfaces << type_membership.abstract_type
|
167
|
-
end
|
168
|
-
else
|
169
|
-
raise "Invariant: Unexpected type_membership #{type_membership.class}: #{type_membership.inspect}"
|
170
|
-
end
|
171
|
-
end
|
172
|
-
visible_interfaces + (superclass <= GraphQL::Schema::Object ? superclass.interfaces(context) : [])
|
173
|
-
end
|
174
|
-
|
175
|
-
# @return [Hash<String => GraphQL::Schema::Field>] All of this object's fields, indexed by name
|
176
|
-
# @see get_field A faster way to find one field by name ({#fields} merges hashes of inherited fields; {#get_field} just looks up one field.)
|
177
|
-
def fields
|
178
|
-
all_fields = super
|
179
|
-
interfaces.each do |int|
|
180
|
-
# Include legacy-style interfaces, too
|
181
|
-
if int.is_a?(GraphQL::InterfaceType)
|
182
|
-
int_f = {}
|
183
|
-
int.fields.each do |name, legacy_field|
|
184
|
-
int_f[name] = field_class.from_options(name, field: legacy_field)
|
185
|
-
end
|
186
|
-
all_fields = int_f.merge(all_fields)
|
187
|
-
end
|
188
|
-
end
|
189
|
-
all_fields
|
190
|
-
end
|
191
|
-
|
192
|
-
# @return [GraphQL::ObjectType]
|
193
|
-
def to_graphql
|
194
|
-
obj_type = GraphQL::ObjectType.new
|
195
|
-
obj_type.name = graphql_name
|
196
|
-
obj_type.description = description
|
197
|
-
obj_type.structural_interface_type_memberships = interface_type_memberships
|
198
|
-
obj_type.introspection = introspection
|
199
|
-
obj_type.mutation = mutation
|
200
|
-
obj_type.ast_node = ast_node
|
201
|
-
fields.each do |field_name, field_inst|
|
202
|
-
field_defn = field_inst.to_graphql
|
203
|
-
obj_type.fields[field_defn.name] = field_defn
|
120
|
+
def const_missing(name)
|
121
|
+
if name == :InvalidNullError
|
122
|
+
custom_err_class = GraphQL::InvalidNullError.subclass_for(self)
|
123
|
+
const_set(:InvalidNullError, custom_err_class)
|
124
|
+
custom_err_class
|
125
|
+
else
|
126
|
+
super
|
204
127
|
end
|
205
|
-
|
206
|
-
obj_type.metadata[:type_class] = self
|
207
|
-
|
208
|
-
obj_type
|
209
128
|
end
|
210
129
|
|
211
130
|
def kind
|
@@ -4,52 +4,43 @@ module GraphQL
|
|
4
4
|
# Used to convert your {GraphQL::Schema} to a GraphQL schema string
|
5
5
|
#
|
6
6
|
# @example print your schema to standard output (via helper)
|
7
|
-
# MySchema = GraphQL::Schema.define(query: QueryType)
|
8
7
|
# puts GraphQL::Schema::Printer.print_schema(MySchema)
|
9
8
|
#
|
10
9
|
# @example print your schema to standard output
|
11
|
-
# MySchema = GraphQL::Schema.define(query: QueryType)
|
12
10
|
# puts GraphQL::Schema::Printer.new(MySchema).print_schema
|
13
11
|
#
|
14
12
|
# @example print a single type to standard output
|
15
|
-
#
|
16
|
-
# name "Query"
|
13
|
+
# class Types::Query < GraphQL::Schema::Object
|
17
14
|
# description "The query root of this schema"
|
18
15
|
#
|
19
|
-
# field :post
|
20
|
-
# type post_type
|
21
|
-
# resolve ->(obj, args, ctx) { Post.find(args["id"]) }
|
22
|
-
# end
|
16
|
+
# field :post, Types::Post, null: true
|
23
17
|
# end
|
24
18
|
#
|
25
|
-
#
|
26
|
-
# name "Post"
|
19
|
+
# class Types::Post < GraphQL::Schema::Object
|
27
20
|
# description "A blog post"
|
28
21
|
#
|
29
|
-
# field :id,
|
30
|
-
# field :title,
|
31
|
-
# field :body,
|
22
|
+
# field :id, ID, null: false
|
23
|
+
# field :title, String, null: false
|
24
|
+
# field :body, String, null: false
|
32
25
|
# end
|
33
26
|
#
|
34
|
-
# MySchema
|
27
|
+
# class MySchema < GraphQL::Schema
|
28
|
+
# query(Types::Query)
|
29
|
+
# end
|
35
30
|
#
|
36
31
|
# printer = GraphQL::Schema::Printer.new(MySchema)
|
37
|
-
# puts printer.print_type(
|
32
|
+
# puts printer.print_type(Types::Post)
|
38
33
|
#
|
39
34
|
class Printer < GraphQL::Language::Printer
|
40
35
|
attr_reader :schema, :warden
|
41
36
|
|
42
37
|
# @param schema [GraphQL::Schema]
|
43
38
|
# @param context [Hash]
|
44
|
-
# @param only [<#call(member, ctx)>]
|
45
|
-
# @param except [<#call(member, ctx)>]
|
46
39
|
# @param introspection [Boolean] Should include the introspection types in the string?
|
47
|
-
def initialize(schema, context: nil,
|
40
|
+
def initialize(schema, context: nil, introspection: false)
|
48
41
|
@document_from_schema = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
49
42
|
schema,
|
50
43
|
context: context,
|
51
|
-
only: only,
|
52
|
-
except: except,
|
53
44
|
include_introspection_types: introspection,
|
54
45
|
)
|
55
46
|
|
@@ -61,13 +52,21 @@ module GraphQL
|
|
61
52
|
def self.print_introspection_schema
|
62
53
|
query_root = Class.new(GraphQL::Schema::Object) do
|
63
54
|
graphql_name "Root"
|
64
|
-
field :throwaway_field, String
|
55
|
+
field :throwaway_field, String
|
56
|
+
def self.visible?(ctx)
|
57
|
+
false
|
58
|
+
end
|
65
59
|
end
|
66
|
-
schema = Class.new(GraphQL::Schema) {
|
60
|
+
schema = Class.new(GraphQL::Schema) {
|
61
|
+
use GraphQL::Schema::Visibility
|
62
|
+
query(query_root)
|
63
|
+
def self.visible?(member, _ctx)
|
64
|
+
member.graphql_name != "Root"
|
65
|
+
end
|
66
|
+
}
|
67
67
|
|
68
68
|
introspection_schema_ast = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
69
69
|
schema,
|
70
|
-
except: ->(member, _) { member.graphql_name == "Root" },
|
71
70
|
include_introspection_types: true,
|
72
71
|
include_built_in_directives: true,
|
73
72
|
).document
|
@@ -87,7 +86,7 @@ module GraphQL
|
|
87
86
|
|
88
87
|
# Return a GraphQL schema string for the defined types in the schema
|
89
88
|
def print_schema
|
90
|
-
print(@document)
|
89
|
+
print(@document) + "\n"
|
91
90
|
end
|
92
91
|
|
93
92
|
def print_type(type)
|
@@ -97,7 +96,7 @@ module GraphQL
|
|
97
96
|
|
98
97
|
class IntrospectionPrinter < GraphQL::Language::Printer
|
99
98
|
def print_schema_definition(schema)
|
100
|
-
"schema {\n query: Root\n}"
|
99
|
+
print_string("schema {\n query: Root\n}")
|
101
100
|
end
|
102
101
|
end
|
103
102
|
end
|
@@ -1,5 +1,4 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "graphql/types/string"
|
3
2
|
|
4
3
|
module GraphQL
|
5
4
|
class Schema
|
@@ -21,112 +20,35 @@ module GraphQL
|
|
21
20
|
# @see {GraphQL::Schema::Mutation} for an example, it's basically the same.
|
22
21
|
#
|
23
22
|
class RelayClassicMutation < GraphQL::Schema::Mutation
|
23
|
+
include GraphQL::Schema::HasSingleInputArgument
|
24
|
+
|
25
|
+
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
26
|
+
|
24
27
|
# The payload should always include this field
|
25
|
-
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation."
|
28
|
+
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation.")
|
26
29
|
# Relay classic default:
|
27
30
|
null(true)
|
28
31
|
|
29
32
|
# Override {GraphQL::Schema::Resolver#resolve_with_support} to
|
30
33
|
# delete `client_mutation_id` from the kwargs.
|
31
34
|
def resolve_with_support(**inputs)
|
32
|
-
|
33
|
-
# But when using the interpreter, no instrumenters are applied.
|
34
|
-
if context.interpreter?
|
35
|
-
input = inputs[:input].to_kwargs
|
36
|
-
|
37
|
-
new_extras = field ? field.extras : []
|
38
|
-
all_extras = self.class.extras + new_extras
|
39
|
-
|
40
|
-
# Transfer these from the top-level hash to the
|
41
|
-
# shortcutted `input:` object
|
42
|
-
all_extras.each do |ext|
|
43
|
-
# It's possible that the `extra` was not passed along by this point,
|
44
|
-
# don't re-add it if it wasn't given here.
|
45
|
-
if inputs.key?(ext)
|
46
|
-
input[ext] = inputs[ext]
|
47
|
-
end
|
48
|
-
end
|
49
|
-
else
|
50
|
-
input = inputs
|
51
|
-
end
|
35
|
+
input = inputs[:input].to_kwargs
|
52
36
|
|
53
37
|
if input
|
54
38
|
# This is handled by Relay::Mutation::Resolve, a bit hacky, but here we are.
|
55
39
|
input_kwargs = input.to_h
|
56
40
|
client_mutation_id = input_kwargs.delete(:client_mutation_id)
|
57
|
-
|
58
|
-
# Relay Classic Mutations with no `argument`s
|
59
|
-
# don't require `input:`
|
60
|
-
input_kwargs = {}
|
61
|
-
end
|
62
|
-
|
63
|
-
return_value = if input_kwargs.any?
|
64
|
-
super(**input_kwargs)
|
65
|
-
else
|
66
|
-
super()
|
67
|
-
end
|
68
|
-
|
69
|
-
# Again, this is done by an instrumenter when using non-interpreter execution.
|
70
|
-
if context.interpreter?
|
71
|
-
context.schema.after_lazy(return_value) do |return_hash|
|
72
|
-
# It might be an error
|
73
|
-
if return_hash.is_a?(Hash)
|
74
|
-
return_hash[:client_mutation_id] = client_mutation_id
|
75
|
-
end
|
76
|
-
return_hash
|
77
|
-
end
|
78
|
-
else
|
79
|
-
return_value
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
class << self
|
84
|
-
# The base class for generated input object types
|
85
|
-
# @param new_class [Class] The base class to use for generating input object definitions
|
86
|
-
# @return [Class] The base class for this mutation's generated input object (default is {GraphQL::Schema::InputObject})
|
87
|
-
def input_object_class(new_class = nil)
|
88
|
-
if new_class
|
89
|
-
@input_object_class = new_class
|
90
|
-
end
|
91
|
-
@input_object_class || (superclass.respond_to?(:input_object_class) ? superclass.input_object_class : GraphQL::Schema::InputObject)
|
92
|
-
end
|
93
|
-
|
94
|
-
# @param new_input_type [Class, nil] If provided, it configures this mutation to accept `new_input_type` instead of generating an input type
|
95
|
-
# @return [Class] The generated {Schema::InputObject} class for this mutation's `input`
|
96
|
-
def input_type(new_input_type = nil)
|
97
|
-
if new_input_type
|
98
|
-
@input_type = new_input_type
|
99
|
-
end
|
100
|
-
@input_type ||= generate_input_type
|
101
|
-
end
|
102
|
-
|
103
|
-
# Extend {Schema::Mutation.field_options} to add the `input` argument
|
104
|
-
def field_options
|
105
|
-
sig = super
|
106
|
-
# Arguments were added at the root, but they should be nested
|
107
|
-
sig[:arguments].clear
|
108
|
-
sig[:arguments][:input] = { type: input_type, required: true, description: "Parameters for #{graphql_name}" }
|
109
|
-
sig
|
41
|
+
inputs[:input] = input_kwargs
|
110
42
|
end
|
111
43
|
|
112
|
-
|
44
|
+
return_value = super(**inputs)
|
113
45
|
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
mutation_args = arguments
|
119
|
-
mutation_name = graphql_name
|
120
|
-
mutation_class = self
|
121
|
-
Class.new(input_object_class) do
|
122
|
-
graphql_name("#{mutation_name}Input")
|
123
|
-
description("Autogenerated input type of #{mutation_name}")
|
124
|
-
mutation(mutation_class)
|
125
|
-
mutation_args.each do |_name, arg|
|
126
|
-
add_argument(arg)
|
127
|
-
end
|
128
|
-
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
46
|
+
context.query.after_lazy(return_value) do |return_hash|
|
47
|
+
# It might be an error
|
48
|
+
if return_hash.is_a?(Hash)
|
49
|
+
return_hash[:client_mutation_id] = client_mutation_id
|
129
50
|
end
|
51
|
+
return_hash
|
130
52
|
end
|
131
53
|
end
|
132
54
|
end
|
@@ -20,7 +20,17 @@ module GraphQL
|
|
20
20
|
@payload_type ||= generate_payload_type
|
21
21
|
end
|
22
22
|
|
23
|
-
|
23
|
+
def type(new_type = nil, null: nil)
|
24
|
+
if new_type
|
25
|
+
payload_type(new_type)
|
26
|
+
if !null.nil?
|
27
|
+
self.null(null)
|
28
|
+
end
|
29
|
+
else
|
30
|
+
super()
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
24
34
|
alias :type_expr :payload_type
|
25
35
|
|
26
36
|
def field_class(new_class = nil)
|
@@ -38,6 +48,9 @@ module GraphQL
|
|
38
48
|
# @return [Class]
|
39
49
|
def object_class(new_class = nil)
|
40
50
|
if new_class
|
51
|
+
if defined?(@payload_type)
|
52
|
+
raise "Can't configure `object_class(...)` after the payload type has already been initialized. Move this configuration higher up the class definition."
|
53
|
+
end
|
41
54
|
@object_class = new_class
|
42
55
|
else
|
43
56
|
@object_class || find_inherited_value(:object_class, GraphQL::Schema::Object)
|
@@ -46,6 +59,28 @@ module GraphQL
|
|
46
59
|
|
47
60
|
NO_INTERFACES = [].freeze
|
48
61
|
|
62
|
+
def field(*args, **kwargs, &block)
|
63
|
+
pt = payload_type # make sure it's initialized with any inherited fields
|
64
|
+
field_defn = super
|
65
|
+
|
66
|
+
# Remove any inherited fields to avoid false conflicts at runtime
|
67
|
+
prev_fields = pt.own_fields[field_defn.graphql_name]
|
68
|
+
case prev_fields
|
69
|
+
when GraphQL::Schema::Field
|
70
|
+
if prev_fields.owner != self
|
71
|
+
pt.own_fields.delete(field_defn.graphql_name)
|
72
|
+
end
|
73
|
+
when Array
|
74
|
+
prev_fields.reject! { |f| f.owner != self }
|
75
|
+
if prev_fields.empty?
|
76
|
+
pt.own_fields.delete(field_defn.graphql_name)
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
pt.add_field(field_defn, method_conflict_warning: false)
|
81
|
+
field_defn
|
82
|
+
end
|
83
|
+
|
49
84
|
private
|
50
85
|
|
51
86
|
# Build a subclass of {.object_class} based on `self`.
|
@@ -53,17 +88,17 @@ module GraphQL
|
|
53
88
|
# Override this hook to customize return type generation.
|
54
89
|
def generate_payload_type
|
55
90
|
resolver_name = graphql_name
|
56
|
-
resolver_fields =
|
57
|
-
Class.new(object_class)
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
end
|
91
|
+
resolver_fields = all_field_definitions
|
92
|
+
pt = Class.new(object_class)
|
93
|
+
pt.graphql_name("#{resolver_name}Payload")
|
94
|
+
pt.description("Autogenerated return type of #{resolver_name}.")
|
95
|
+
resolver_fields.each do |f|
|
96
|
+
# Reattach the already-defined field here
|
97
|
+
# (The field's `.owner` will still point to the mutation, not the object type, I think)
|
98
|
+
# Don't re-warn about a method conflict. Since this type is generated, it should be fixed in the resolver instead.
|
99
|
+
pt.add_field(f, method_conflict_warning: false)
|
66
100
|
end
|
101
|
+
pt
|
67
102
|
end
|
68
103
|
end
|
69
104
|
end
|