graphql 1.9.17 → 2.0.20
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 +21 -10
- 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 +45 -8
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- 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 +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +49 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- 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 +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -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_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -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 +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +25 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +31 -2
- data/lib/graphql/analysis/ast/max_query_complexity.rb +0 -1
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +54 -38
- data/lib/graphql/analysis/ast.rb +16 -16
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +20 -17
- data/lib/graphql/dataloader/null_dataloader.rb +24 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +164 -0
- data/lib/graphql/dataloader.rb +311 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +77 -45
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +62 -24
- data/lib/graphql/execution/interpreter/runtime.rb +773 -399
- data/lib/graphql/execution/interpreter.rb +206 -74
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +11 -21
- data/lib/graphql/execution/lookahead.rb +65 -136
- data/lib/graphql/execution/multiplex.rb +6 -152
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +12 -6
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +12 -12
- data/lib/graphql/introspection/type_type.rb +34 -17
- data/lib/graphql/introspection.rb +100 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +113 -71
- data/lib/graphql/language/lexer.rb +216 -1462
- data/lib/graphql/language/nodes.rb +128 -131
- data/lib/graphql/language/parser.rb +957 -912
- data/lib/graphql/language/parser.y +148 -120
- data/lib/graphql/language/printer.rb +48 -23
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +192 -84
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +77 -0
- data/lib/graphql/pagination/array_connection.rb +79 -0
- data/lib/graphql/pagination/connection.rb +253 -0
- data/lib/graphql/pagination/connections.rb +135 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +228 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +204 -203
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +33 -7
- data/lib/graphql/query/null_context.rb +21 -8
- data/lib/graphql/query/validation_pipeline.rb +16 -38
- data/lib/graphql/query/variable_validation_error.rb +3 -3
- data/lib/graphql/query/variables.rb +39 -12
- data/lib/graphql/query.rb +88 -40
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +4 -1
- data/lib/graphql/rake_task.rb +41 -10
- data/lib/graphql/relay/range_add.rb +17 -10
- 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.rb +4 -0
- data/lib/graphql/schema/addition.rb +245 -0
- data/lib/graphql/schema/argument.rb +284 -33
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +336 -205
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/one_of.rb +12 -0
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +134 -15
- data/lib/graphql/schema/enum.rb +137 -39
- data/lib/graphql/schema/enum_value.rb +20 -23
- data/lib/graphql/schema/field/connection_extension.rb +50 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +503 -331
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +182 -60
- data/lib/graphql/schema/interface.rb +24 -49
- data/lib/graphql/schema/introspection_system.rb +103 -37
- data/lib/graphql/schema/late_bound_type.rb +9 -2
- data/lib/graphql/schema/list.rb +61 -3
- data/lib/graphql/schema/loader.rb +144 -96
- data/lib/graphql/schema/member/base_dsl_methods.rb +41 -37
- data/lib/graphql/schema/member/build_type.rb +24 -15
- data/lib/graphql/schema/member/has_arguments.rb +310 -26
- data/lib/graphql/schema/member/has_ast_node.rb +32 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +24 -0
- data/lib/graphql/schema/member/has_directives.rb +120 -0
- data/lib/graphql/schema/member/has_fields.rb +112 -34
- data/lib/graphql/schema/member/has_interfaces.rb +129 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +57 -0
- data/lib/graphql/schema/member/relay_shortcuts.rb +47 -2
- data/lib/graphql/schema/member/type_system_helpers.rb +20 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +36 -60
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +91 -44
- data/lib/graphql/schema/resolver/has_payload_type.rb +51 -11
- data/lib/graphql/schema/resolver.rb +147 -94
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +60 -31
- data/lib/graphql/schema/timeout.rb +45 -35
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +23 -6
- data/lib/graphql/schema/union.rb +49 -15
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- 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 +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +211 -35
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +833 -889
- data/lib/graphql/static_validation/all_rules.rb +3 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- 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 +69 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +12 -6
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- 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/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- 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 +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +13 -7
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +32 -20
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +129 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +84 -35
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +137 -57
- data/lib/graphql/tracing/active_support_notifications_trace.rb +16 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_trace.rb +231 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_trace.rb +71 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_trace.rb +148 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +34 -2
- data/lib/graphql/tracing/new_relic_trace.rb +75 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_trace.rb +41 -0
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_trace.rb +107 -0
- data/lib/graphql/tracing/platform_tracing.rb +76 -35
- data/lib/graphql/tracing/prometheus_trace.rb +89 -0
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +11 -3
- data/lib/graphql/tracing/scout_trace.rb +72 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_trace.rb +56 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +143 -67
- data/lib/graphql/type_kinds.rb +6 -3
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +20 -9
- data/lib/graphql/types/iso_8601_date_time.rb +36 -10
- data/lib/graphql/types/relay/base_connection.rb +18 -90
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +176 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +75 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +25 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +30 -0
- data/lib/graphql/types/relay.rb +10 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +60 -66
- data/readme.md +3 -6
- metadata +124 -236
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- 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 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- 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 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- 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 -50
- data/lib/graphql/define/instance_definable.rb +0 -300
- 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 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/instrumentation.rb +0 -92
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- 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 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- 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 -258
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/literal_input.rb +0 -116
- 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 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -172
- 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 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- 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 -190
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -133
- 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 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- 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 -66
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
- data/lib/graphql/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -128
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module GraphQL
|
4
|
+
class Schema
|
5
|
+
class Member
|
6
|
+
module ValidatesInput
|
7
|
+
def valid_input?(val, ctx)
|
8
|
+
validate_input(val, ctx).valid?
|
9
|
+
end
|
10
|
+
|
11
|
+
def validate_input(val, ctx, max_errors: nil)
|
12
|
+
if val.nil?
|
13
|
+
Query::InputValidationResult::VALID
|
14
|
+
else
|
15
|
+
validate_non_null_input(val, ctx, max_errors: max_errors) || Query::InputValidationResult::VALID
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
def valid_isolated_input?(v)
|
20
|
+
valid_input?(v, GraphQL::Query::NullContext)
|
21
|
+
end
|
22
|
+
|
23
|
+
def coerce_isolated_input(v)
|
24
|
+
coerce_input(v, GraphQL::Query::NullContext)
|
25
|
+
end
|
26
|
+
|
27
|
+
def coerce_isolated_result(v)
|
28
|
+
coerce_result(v, GraphQL::Query::NullContext)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -1,13 +1,17 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require 'graphql/schema/member/accepts_definition'
|
3
2
|
require 'graphql/schema/member/base_dsl_methods'
|
4
|
-
require 'graphql/schema/member/cached_graphql_definition'
|
5
3
|
require 'graphql/schema/member/graphql_type_names'
|
4
|
+
require 'graphql/schema/member/has_ast_node'
|
5
|
+
require 'graphql/schema/member/has_directives'
|
6
|
+
require 'graphql/schema/member/has_deprecation_reason'
|
7
|
+
require 'graphql/schema/member/has_interfaces'
|
6
8
|
require 'graphql/schema/member/has_path'
|
9
|
+
require 'graphql/schema/member/has_unresolved_type_error'
|
10
|
+
require 'graphql/schema/member/has_validators'
|
7
11
|
require 'graphql/schema/member/relay_shortcuts'
|
8
12
|
require 'graphql/schema/member/scoped'
|
9
13
|
require 'graphql/schema/member/type_system_helpers'
|
10
|
-
require
|
14
|
+
require 'graphql/schema/member/validates_input'
|
11
15
|
|
12
16
|
module GraphQL
|
13
17
|
class Schema
|
@@ -17,18 +21,19 @@ module GraphQL
|
|
17
21
|
# @api private
|
18
22
|
class Member
|
19
23
|
include GraphQLTypeNames
|
20
|
-
extend CachedGraphQLDefinition
|
21
|
-
extend GraphQL::Relay::TypeExtensions
|
22
24
|
extend BaseDSLMethods
|
25
|
+
extend BaseDSLMethods::ConfigurationExtension
|
26
|
+
introspection(false)
|
23
27
|
extend TypeSystemHelpers
|
24
28
|
extend Scoped
|
25
29
|
extend RelayShortcuts
|
26
30
|
extend HasPath
|
31
|
+
extend HasAstNode
|
32
|
+
extend HasDirectives
|
27
33
|
end
|
28
34
|
end
|
29
35
|
end
|
30
36
|
|
31
37
|
require 'graphql/schema/member/has_arguments'
|
32
38
|
require 'graphql/schema/member/has_fields'
|
33
|
-
require 'graphql/schema/member/instrumentation'
|
34
39
|
require 'graphql/schema/member/build_type'
|
@@ -63,21 +63,16 @@ module GraphQL
|
|
63
63
|
extend GraphQL::Schema::Resolver::HasPayloadType
|
64
64
|
|
65
65
|
class << self
|
66
|
-
# Override this method to handle legacy-style usages of `MyMutation.field`
|
67
|
-
def field(*args, &block)
|
68
|
-
if args.empty?
|
69
|
-
raise ArgumentError, "#{name}.field is used for adding fields to this mutation. Use `mutation: #{name}` to attach this mutation instead."
|
70
|
-
else
|
71
|
-
super
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
66
|
def visible?(context)
|
76
67
|
true
|
77
68
|
end
|
78
69
|
|
79
70
|
private
|
80
71
|
|
72
|
+
def conflict_field_name_warning(field_defn)
|
73
|
+
"#{self.graphql_name}'s `field :#{field_defn.name}` conflicts with a built-in method, use `hash_key:` or `method:` to pick a different resolve behavior for this field (for example, `hash_key: :#{field_defn.resolver_method}_value`, and modify the return hash). Or use `method_conflict_warning: false` to suppress this warning."
|
74
|
+
end
|
75
|
+
|
81
76
|
# Override this to attach self as `mutation`
|
82
77
|
def generate_payload_type
|
83
78
|
payload_class = super
|
@@ -6,11 +6,9 @@ module GraphQL
|
|
6
6
|
# Wraps a {Schema::Member} when it is required.
|
7
7
|
# @see {Schema::Member::TypeSystemHelpers#to_non_null_type}
|
8
8
|
class NonNull < GraphQL::Schema::Wrapper
|
9
|
-
|
10
|
-
@of_type.graphql_definition.to_non_null_type
|
11
|
-
end
|
9
|
+
include Schema::Member::ValidatesInput
|
12
10
|
|
13
|
-
|
11
|
+
# @return [GraphQL::TypeKinds::NON_NULL]
|
14
12
|
def kind
|
15
13
|
GraphQL::TypeKinds::NON_NULL
|
16
14
|
end
|
@@ -32,6 +30,38 @@ module GraphQL
|
|
32
30
|
def inspect
|
33
31
|
"#<#{self.class.name} @of_type=#{@of_type.inspect}>"
|
34
32
|
end
|
33
|
+
|
34
|
+
def validate_input(value, ctx, max_errors: nil)
|
35
|
+
if value.nil?
|
36
|
+
result = GraphQL::Query::InputValidationResult.new
|
37
|
+
result.add_problem("Expected value to not be null")
|
38
|
+
result
|
39
|
+
else
|
40
|
+
of_type.validate_input(value, ctx, max_errors: max_errors)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
# This is for introspection, where it's expected the name will be `null`
|
45
|
+
def graphql_name
|
46
|
+
nil
|
47
|
+
end
|
48
|
+
|
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
|
+
of_type.coerce_input(value, ctx)
|
55
|
+
end
|
56
|
+
|
57
|
+
def coerce_result(value, ctx)
|
58
|
+
of_type.coerce_result(value, ctx)
|
59
|
+
end
|
60
|
+
|
61
|
+
# This is for implementing introspection
|
62
|
+
def description
|
63
|
+
nil
|
64
|
+
end
|
35
65
|
end
|
36
66
|
end
|
37
67
|
end
|
@@ -1,10 +1,12 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
require "graphql/query/null_context"
|
4
|
+
|
3
5
|
module GraphQL
|
4
6
|
class Schema
|
5
7
|
class Object < GraphQL::Schema::Member
|
6
|
-
extend GraphQL::Schema::Member::AcceptsDefinition
|
7
8
|
extend GraphQL::Schema::Member::HasFields
|
9
|
+
extend GraphQL::Schema::Member::HasInterfaces
|
8
10
|
|
9
11
|
# @return [Object] the application object this type is wrapping
|
10
12
|
attr_reader :object
|
@@ -12,6 +14,17 @@ module GraphQL
|
|
12
14
|
# @return [GraphQL::Query::Context] the context instance for this query
|
13
15
|
attr_reader :context
|
14
16
|
|
17
|
+
# @return [GraphQL::Dataloader]
|
18
|
+
def dataloader
|
19
|
+
context.dataloader
|
20
|
+
end
|
21
|
+
|
22
|
+
# Call this in a field method to return a value that should be returned to the client
|
23
|
+
# without any further handling by GraphQL.
|
24
|
+
def raw_value(obj)
|
25
|
+
GraphQL::Execution::Interpreter::RawValue.new(obj)
|
26
|
+
end
|
27
|
+
|
15
28
|
class << self
|
16
29
|
# This is protected so that we can be sure callers use the public method, {.authorized_new}
|
17
30
|
# @see authorized_new to make instances
|
@@ -35,14 +48,26 @@ module GraphQL
|
|
35
48
|
# @return [GraphQL::Schema::Object, GraphQL::Execution::Lazy]
|
36
49
|
# @raise [GraphQL::UnauthorizedError] if the user-provided hook returns `false`
|
37
50
|
def authorized_new(object, context)
|
38
|
-
|
51
|
+
maybe_lazy_auth_val = context.query.current_trace.authorized(query: context.query, type: self, object: object) do
|
39
52
|
begin
|
40
53
|
authorized?(object, context)
|
41
54
|
rescue GraphQL::UnauthorizedError => err
|
42
55
|
context.schema.unauthorized_object(err)
|
56
|
+
rescue StandardError => err
|
57
|
+
context.query.handle_or_reraise(err)
|
43
58
|
end
|
44
59
|
end
|
45
60
|
|
61
|
+
auth_val = if context.schema.lazy?(maybe_lazy_auth_val)
|
62
|
+
GraphQL::Execution::Lazy.new do
|
63
|
+
context.query.current_trace.authorized_lazy(query: context.query, type: self, object: object) do
|
64
|
+
context.schema.sync_lazy(maybe_lazy_auth_val)
|
65
|
+
end
|
66
|
+
end
|
67
|
+
else
|
68
|
+
maybe_lazy_auth_val
|
69
|
+
end
|
70
|
+
|
46
71
|
context.schema.after_lazy(auth_val) do |is_authorized|
|
47
72
|
if is_authorized
|
48
73
|
self.new(object, context)
|
@@ -57,13 +82,9 @@ module GraphQL
|
|
57
82
|
else
|
58
83
|
nil
|
59
84
|
end
|
60
|
-
# rescue GraphQL::ExecutionError => err
|
61
|
-
# err
|
62
85
|
end
|
63
86
|
end
|
64
87
|
end
|
65
|
-
# rescue GraphQL::ExecutionError => err
|
66
|
-
# err
|
67
88
|
end
|
68
89
|
end
|
69
90
|
|
@@ -73,61 +94,16 @@ module GraphQL
|
|
73
94
|
end
|
74
95
|
|
75
96
|
class << self
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
# to find inherited fields
|
86
|
-
include(int)
|
87
|
-
end
|
88
|
-
end
|
89
|
-
own_interfaces.concat(new_interfaces)
|
90
|
-
end
|
91
|
-
|
92
|
-
def interfaces
|
93
|
-
own_interfaces + (superclass <= GraphQL::Schema::Object ? superclass.interfaces : [])
|
94
|
-
end
|
95
|
-
|
96
|
-
def own_interfaces
|
97
|
-
@own_interfaces ||= []
|
98
|
-
end
|
99
|
-
|
100
|
-
# Include legacy-style interfaces, too
|
101
|
-
def fields
|
102
|
-
all_fields = super
|
103
|
-
interfaces.each do |int|
|
104
|
-
if int.is_a?(GraphQL::InterfaceType)
|
105
|
-
int_f = {}
|
106
|
-
int.fields.each do |name, legacy_field|
|
107
|
-
int_f[name] = field_class.from_options(name, field: legacy_field)
|
108
|
-
end
|
109
|
-
all_fields = int_f.merge(all_fields)
|
110
|
-
end
|
111
|
-
end
|
112
|
-
all_fields
|
113
|
-
end
|
114
|
-
|
115
|
-
# @return [GraphQL::ObjectType]
|
116
|
-
def to_graphql
|
117
|
-
obj_type = GraphQL::ObjectType.new
|
118
|
-
obj_type.name = graphql_name
|
119
|
-
obj_type.description = description
|
120
|
-
obj_type.interfaces = interfaces
|
121
|
-
obj_type.introspection = introspection
|
122
|
-
obj_type.mutation = mutation
|
123
|
-
fields.each do |field_name, field_inst|
|
124
|
-
field_defn = field_inst.to_graphql
|
125
|
-
obj_type.fields[field_defn.name] = field_defn
|
97
|
+
# Set up a type-specific invalid null error to use when this object's non-null fields wrongly return `nil`.
|
98
|
+
# It should help with debugging and bug tracker integrations.
|
99
|
+
def const_missing(name)
|
100
|
+
if name == :InvalidNullError
|
101
|
+
custom_err_class = GraphQL::InvalidNullError.subclass_for(self)
|
102
|
+
const_set(:InvalidNullError, custom_err_class)
|
103
|
+
custom_err_class
|
104
|
+
else
|
105
|
+
super
|
126
106
|
end
|
127
|
-
|
128
|
-
obj_type.metadata[:type_class] = self
|
129
|
-
|
130
|
-
obj_type
|
131
107
|
end
|
132
108
|
|
133
109
|
def kind
|
@@ -4,37 +4,32 @@ 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
|
@@ -54,20 +49,20 @@ module GraphQL
|
|
54
49
|
)
|
55
50
|
|
56
51
|
@document = @document_from_schema.document
|
57
|
-
|
58
52
|
@schema = schema
|
59
53
|
end
|
60
54
|
|
61
55
|
# Return the GraphQL schema string for the introspection type system
|
62
56
|
def self.print_introspection_schema
|
63
|
-
query_root =
|
64
|
-
|
57
|
+
query_root = Class.new(GraphQL::Schema::Object) do
|
58
|
+
graphql_name "Root"
|
59
|
+
field :throwaway_field, String
|
65
60
|
end
|
66
|
-
schema = GraphQL::Schema
|
61
|
+
schema = Class.new(GraphQL::Schema) { query(query_root) }
|
67
62
|
|
68
63
|
introspection_schema_ast = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
69
64
|
schema,
|
70
|
-
except: ->(member, _) { member.
|
65
|
+
except: ->(member, _) { member.graphql_name == "Root" },
|
71
66
|
include_introspection_types: true,
|
72
67
|
include_built_in_directives: true,
|
73
68
|
).document
|
@@ -87,7 +82,7 @@ module GraphQL
|
|
87
82
|
|
88
83
|
# Return a GraphQL schema string for the defined types in the schema
|
89
84
|
def print_schema
|
90
|
-
print(@document)
|
85
|
+
print(@document) + "\n"
|
91
86
|
end
|
92
87
|
|
93
88
|
def print_type(type)
|
@@ -95,20 +90,6 @@ module GraphQL
|
|
95
90
|
print(node)
|
96
91
|
end
|
97
92
|
|
98
|
-
def print_directive(directive)
|
99
|
-
if directive.name == "deprecated"
|
100
|
-
reason = directive.arguments.find { |arg| arg.name == "reason" }
|
101
|
-
|
102
|
-
if reason.value == GraphQL::Directive::DEFAULT_DEPRECATION_REASON
|
103
|
-
"@deprecated"
|
104
|
-
else
|
105
|
-
"@deprecated(reason: #{reason.value.to_s.inspect})"
|
106
|
-
end
|
107
|
-
else
|
108
|
-
super
|
109
|
-
end
|
110
|
-
end
|
111
|
-
|
112
93
|
class IntrospectionPrinter < GraphQL::Language::Printer
|
113
94
|
def print_schema_definition(schema)
|
114
95
|
"schema {\n query: Root\n}"
|
@@ -22,32 +22,26 @@ module GraphQL
|
|
22
22
|
#
|
23
23
|
class RelayClassicMutation < GraphQL::Schema::Mutation
|
24
24
|
# The payload should always include this field
|
25
|
-
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation."
|
25
|
+
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation.")
|
26
26
|
# Relay classic default:
|
27
27
|
null(true)
|
28
28
|
|
29
29
|
# Override {GraphQL::Schema::Resolver#resolve_with_support} to
|
30
30
|
# delete `client_mutation_id` from the kwargs.
|
31
31
|
def resolve_with_support(**inputs)
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
#
|
41
|
-
#
|
42
|
-
|
43
|
-
|
44
|
-
# don't re-add it if it wasn't given here.
|
45
|
-
if inputs.key?(ext)
|
46
|
-
input[ext] = inputs[ext]
|
47
|
-
end
|
32
|
+
input = inputs[:input].to_kwargs
|
33
|
+
|
34
|
+
new_extras = field ? field.extras : []
|
35
|
+
all_extras = self.class.extras + new_extras
|
36
|
+
|
37
|
+
# Transfer these from the top-level hash to the
|
38
|
+
# shortcutted `input:` object
|
39
|
+
all_extras.each do |ext|
|
40
|
+
# It's possible that the `extra` was not passed along by this point,
|
41
|
+
# don't re-add it if it wasn't given here.
|
42
|
+
if inputs.key?(ext)
|
43
|
+
input[ext] = inputs[ext]
|
48
44
|
end
|
49
|
-
else
|
50
|
-
input = inputs
|
51
45
|
end
|
52
46
|
|
53
47
|
if input
|
@@ -61,26 +55,71 @@ module GraphQL
|
|
61
55
|
end
|
62
56
|
|
63
57
|
return_value = if input_kwargs.any?
|
64
|
-
super(input_kwargs)
|
58
|
+
super(**input_kwargs)
|
65
59
|
else
|
66
60
|
super()
|
67
61
|
end
|
68
62
|
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
if return_hash.is_a?(Hash)
|
74
|
-
return_hash[:client_mutation_id] = client_mutation_id
|
75
|
-
end
|
76
|
-
return_hash
|
63
|
+
context.schema.after_lazy(return_value) do |return_hash|
|
64
|
+
# It might be an error
|
65
|
+
if return_hash.is_a?(Hash)
|
66
|
+
return_hash[:client_mutation_id] = client_mutation_id
|
77
67
|
end
|
78
|
-
|
79
|
-
return_value
|
68
|
+
return_hash
|
80
69
|
end
|
81
70
|
end
|
82
71
|
|
83
72
|
class << self
|
73
|
+
def dummy
|
74
|
+
@dummy ||= begin
|
75
|
+
d = Class.new(GraphQL::Schema::Resolver)
|
76
|
+
d.argument_class(self.argument_class)
|
77
|
+
# TODO make this lazier?
|
78
|
+
d.argument(:input, input_type, description: "Parameters for #{self.graphql_name}")
|
79
|
+
d
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
83
|
+
def field_arguments(context = GraphQL::Query::NullContext)
|
84
|
+
dummy.arguments(context)
|
85
|
+
end
|
86
|
+
|
87
|
+
def get_field_argument(name, context = GraphQL::Query::NullContext)
|
88
|
+
dummy.get_argument(name, context)
|
89
|
+
end
|
90
|
+
|
91
|
+
def own_field_arguments
|
92
|
+
dummy.own_arguments
|
93
|
+
end
|
94
|
+
|
95
|
+
def all_field_argument_definitions
|
96
|
+
dummy.all_argument_definitions
|
97
|
+
end
|
98
|
+
|
99
|
+
# Also apply this argument to the input type:
|
100
|
+
def argument(*args, own_argument: false, **kwargs, &block)
|
101
|
+
it = input_type # make sure any inherited arguments are already added to it
|
102
|
+
arg = super(*args, **kwargs, &block)
|
103
|
+
|
104
|
+
# This definition might be overriding something inherited;
|
105
|
+
# if it is, remove the inherited definition so it's not confused at runtime as having multiple definitions
|
106
|
+
prev_args = it.own_arguments[arg.graphql_name]
|
107
|
+
case prev_args
|
108
|
+
when GraphQL::Schema::Argument
|
109
|
+
if prev_args.owner != self
|
110
|
+
it.own_arguments.delete(arg.graphql_name)
|
111
|
+
end
|
112
|
+
when Array
|
113
|
+
prev_args.reject! { |a| a.owner != self }
|
114
|
+
if prev_args.empty?
|
115
|
+
it.own_arguments.delete(arg.graphql_name)
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
it.add_argument(arg)
|
120
|
+
arg
|
121
|
+
end
|
122
|
+
|
84
123
|
# The base class for generated input object types
|
85
124
|
# @param new_class [Class] The base class to use for generating input object definitions
|
86
125
|
# @return [Class] The base class for this mutation's generated input object (default is {GraphQL::Schema::InputObject})
|
@@ -100,33 +139,41 @@ module GraphQL
|
|
100
139
|
@input_type ||= generate_input_type
|
101
140
|
end
|
102
141
|
|
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 }
|
109
|
-
sig
|
110
|
-
end
|
111
|
-
|
112
142
|
private
|
113
143
|
|
114
144
|
# Generate the input type for the `input:` argument
|
115
145
|
# To customize how input objects are generated, override this method
|
116
146
|
# @return [Class] a subclass of {.input_object_class}
|
117
147
|
def generate_input_type
|
118
|
-
mutation_args =
|
119
|
-
mutation_name = graphql_name
|
148
|
+
mutation_args = all_argument_definitions
|
120
149
|
mutation_class = self
|
121
150
|
Class.new(input_object_class) do
|
122
|
-
|
123
|
-
|
151
|
+
class << self
|
152
|
+
def default_graphql_name
|
153
|
+
"#{self.mutation.graphql_name}Input"
|
154
|
+
end
|
155
|
+
|
156
|
+
def description(new_desc = nil)
|
157
|
+
super || "Autogenerated input type of #{self.mutation.graphql_name}"
|
158
|
+
end
|
159
|
+
end
|
124
160
|
mutation(mutation_class)
|
125
|
-
|
161
|
+
# these might be inherited:
|
162
|
+
mutation_args.each do |arg|
|
163
|
+
add_argument(arg)
|
164
|
+
end
|
126
165
|
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
127
166
|
end
|
128
167
|
end
|
129
168
|
end
|
169
|
+
|
170
|
+
private
|
171
|
+
|
172
|
+
def authorize_arguments(args, values)
|
173
|
+
# remove the `input` wrapper to match values
|
174
|
+
input_args = args["input"].type.unwrap.arguments(context)
|
175
|
+
super(input_args, values)
|
176
|
+
end
|
130
177
|
end
|
131
178
|
end
|
132
179
|
end
|
@@ -20,14 +20,26 @@ 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)
|
27
37
|
if new_class
|
28
38
|
@field_class = new_class
|
39
|
+
elsif defined?(@field_class) && @field_class
|
40
|
+
@field_class
|
29
41
|
else
|
30
|
-
|
42
|
+
find_inherited_value(:field_class, GraphQL::Schema::Field)
|
31
43
|
end
|
32
44
|
end
|
33
45
|
|
@@ -36,12 +48,39 @@ module GraphQL
|
|
36
48
|
# @return [Class]
|
37
49
|
def object_class(new_class = nil)
|
38
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
|
39
54
|
@object_class = new_class
|
40
55
|
else
|
41
56
|
@object_class || find_inherited_value(:object_class, GraphQL::Schema::Object)
|
42
57
|
end
|
43
58
|
end
|
44
59
|
|
60
|
+
NO_INTERFACES = [].freeze
|
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
|
+
|
45
84
|
private
|
46
85
|
|
47
86
|
# Build a subclass of {.object_class} based on `self`.
|
@@ -49,16 +88,17 @@ module GraphQL
|
|
49
88
|
# Override this hook to customize return type generation.
|
50
89
|
def generate_payload_type
|
51
90
|
resolver_name = graphql_name
|
52
|
-
resolver_fields =
|
53
|
-
Class.new(object_class)
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
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)
|
61
100
|
end
|
101
|
+
pt
|
62
102
|
end
|
63
103
|
end
|
64
104
|
end
|