graphql 1.13.24 → 2.5.11
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.
- checksums.yaml +4 -4
- data/lib/generators/graphql/install/mutation_root_generator.rb +2 -2
- data/lib/generators/graphql/install/templates/base_mutation.erb +2 -0
- data/lib/generators/graphql/install/templates/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +50 -1
- data/lib/generators/graphql/mutation_delete_generator.rb +1 -1
- data/lib/generators/graphql/mutation_update_generator.rb +1 -1
- data/lib/generators/graphql/orm_mutations_base.rb +1 -1
- data/lib/generators/graphql/relay.rb +21 -18
- 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/graphql_controller.erb +2 -0
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +2 -0
- data/lib/generators/graphql/templates/node_type.erb +2 -0
- data/lib/generators/graphql/templates/query_type.erb +2 -0
- data/lib/generators/graphql/templates/schema.erb +8 -0
- data/lib/generators/graphql/type_generator.rb +1 -1
- data/lib/graphql/analysis/analyzer.rb +90 -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 +236 -61
- data/lib/graphql/analysis/query_depth.rb +38 -23
- data/lib/graphql/analysis/visitor.rb +280 -0
- data/lib/graphql/analysis.rb +93 -6
- data/lib/graphql/autoload.rb +38 -0
- data/lib/graphql/backtrace/table.rb +118 -73
- data/lib/graphql/backtrace.rb +2 -25
- data/lib/graphql/coercion_error.rb +1 -9
- data/lib/graphql/current.rb +57 -0
- data/lib/graphql/dashboard/detailed_traces.rb +47 -0
- data/lib/graphql/dashboard/installable.rb +22 -0
- data/lib/graphql/dashboard/limiters.rb +93 -0
- data/lib/graphql/dashboard/operation_store.rb +199 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.css +6 -0
- data/lib/graphql/dashboard/statics/bootstrap-5.3.3.min.js +7 -0
- data/lib/graphql/dashboard/statics/charts.min.css +1 -0
- data/lib/graphql/dashboard/statics/dashboard.css +30 -0
- data/lib/graphql/dashboard/statics/dashboard.js +143 -0
- data/lib/graphql/dashboard/statics/header-icon.png +0 -0
- data/lib/graphql/dashboard/statics/icon.png +0 -0
- data/lib/graphql/dashboard/subscriptions.rb +96 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/detailed_traces/traces/index.html.erb +45 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/landings/show.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/limiters/limiters/show.html.erb +62 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/not_installed.html.erb +18 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/_form.html.erb +23 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/edit.html.erb +21 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/index.html.erb +69 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/clients/new.html.erb +7 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/index.html.erb +39 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/index_entries/show.html.erb +32 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/index.html.erb +81 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/operation_store/operations/show.html.erb +71 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/subscriptions/show.html.erb +41 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/index.html.erb +55 -0
- data/lib/graphql/dashboard/views/graphql/dashboard/subscriptions/topics/show.html.erb +40 -0
- data/lib/graphql/dashboard/views/layouts/graphql/dashboard/application.html.erb +108 -0
- data/lib/graphql/dashboard.rb +158 -0
- data/lib/graphql/dataloader/active_record_association_source.rb +84 -0
- data/lib/graphql/dataloader/active_record_source.rb +47 -0
- data/lib/graphql/dataloader/async_dataloader.rb +101 -0
- data/lib/graphql/dataloader/null_dataloader.rb +11 -2
- data/lib/graphql/dataloader/request.rb +5 -0
- data/lib/graphql/dataloader/source.rb +103 -47
- data/lib/graphql/dataloader.rb +174 -148
- data/lib/graphql/dig.rb +3 -2
- data/lib/graphql/duration_encoding_error.rb +16 -0
- data/lib/graphql/execution/errors.rb +12 -82
- data/lib/graphql/execution/interpreter/argument_value.rb +5 -1
- data/lib/graphql/execution/interpreter/arguments.rb +1 -1
- data/lib/graphql/execution/interpreter/arguments_cache.rb +30 -35
- data/lib/graphql/execution/interpreter/resolve.rb +32 -2
- data/lib/graphql/execution/interpreter/runtime/graphql_result.rb +215 -0
- data/lib/graphql/execution/interpreter/runtime.rb +525 -502
- data/lib/graphql/execution/interpreter.rb +127 -81
- data/lib/graphql/execution/lazy.rb +7 -21
- data/lib/graphql/execution/lookahead.rb +133 -55
- data/lib/graphql/execution/multiplex.rb +6 -176
- data/lib/graphql/execution.rb +11 -4
- data/lib/graphql/introspection/directive_location_enum.rb +1 -1
- data/lib/graphql/introspection/directive_type.rb +1 -1
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +10 -17
- data/lib/graphql/introspection/field_type.rb +1 -1
- data/lib/graphql/introspection/schema_type.rb +8 -11
- data/lib/graphql/introspection/type_type.rb +13 -6
- data/lib/graphql/introspection.rb +4 -3
- data/lib/graphql/invalid_name_error.rb +1 -1
- data/lib/graphql/invalid_null_error.rb +20 -17
- data/lib/graphql/language/block_string.rb +34 -18
- 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 +114 -80
- data/lib/graphql/language/lexer.rb +375 -1489
- data/lib/graphql/language/nodes.rb +189 -104
- data/lib/graphql/language/parser.rb +807 -1941
- data/lib/graphql/language/printer.rb +366 -163
- data/lib/graphql/language/sanitized_printer.rb +21 -23
- data/lib/graphql/language/static_visitor.rb +171 -0
- data/lib/graphql/language/visitor.rb +189 -138
- data/lib/graphql/language.rb +62 -1
- data/lib/graphql/load_application_object_failed_error.rb +5 -1
- data/lib/graphql/pagination/active_record_relation_connection.rb +0 -8
- data/lib/graphql/pagination/array_connection.rb +8 -6
- data/lib/graphql/pagination/connection.rb +61 -7
- data/lib/graphql/pagination/connections.rb +3 -28
- data/lib/graphql/pagination/mongoid_relation_connection.rb +1 -2
- data/lib/graphql/pagination/relation_connection.rb +2 -0
- data/lib/graphql/query/context/scoped_context.rb +101 -0
- data/lib/graphql/query/context.rb +131 -225
- data/lib/graphql/query/input_validation_result.rb +1 -1
- data/lib/graphql/query/null_context.rb +11 -33
- data/lib/graphql/query/partial.rb +179 -0
- data/lib/graphql/query/validation_pipeline.rb +14 -37
- data/lib/graphql/query/variable_validation_error.rb +1 -1
- data/lib/graphql/query/variables.rb +6 -19
- data/lib/graphql/query.rb +162 -98
- 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 -20
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +1 -1
- 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 +2 -0
- data/lib/graphql/schema/addition.rb +70 -33
- data/lib/graphql/schema/always_visible.rb +15 -0
- data/lib/graphql/schema/argument.rb +104 -59
- data/lib/graphql/schema/base_64_encoder.rb +3 -5
- data/lib/graphql/schema/build_from_definition.rb +154 -74
- data/lib/graphql/schema/directive/flagged.rb +4 -2
- data/lib/graphql/schema/directive/one_of.rb +24 -0
- data/lib/graphql/schema/directive/specified_by.rb +14 -0
- data/lib/graphql/schema/directive/transform.rb +1 -1
- data/lib/graphql/schema/directive.rb +47 -24
- data/lib/graphql/schema/enum.rb +137 -65
- data/lib/graphql/schema/enum_value.rb +11 -26
- data/lib/graphql/schema/field/connection_extension.rb +6 -16
- data/lib/graphql/schema/field/scope_extension.rb +8 -1
- data/lib/graphql/schema/field.rb +399 -404
- data/lib/graphql/schema/field_extension.rb +2 -5
- data/lib/graphql/schema/find_inherited_value.rb +2 -7
- data/lib/graphql/schema/has_single_input_argument.rb +160 -0
- data/lib/graphql/schema/input_object.rb +144 -99
- data/lib/graphql/schema/interface.rb +34 -51
- 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 +3 -9
- data/lib/graphql/schema/loader.rb +4 -6
- data/lib/graphql/schema/member/base_dsl_methods.rb +32 -18
- data/lib/graphql/schema/member/build_type.rb +15 -9
- data/lib/graphql/schema/member/has_arguments.rb +192 -96
- data/lib/graphql/schema/member/has_ast_node.rb +12 -0
- data/lib/graphql/schema/member/has_dataloader.rb +62 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +18 -4
- data/lib/graphql/schema/member/has_directives.rb +81 -61
- data/lib/graphql/schema/member/has_fields.rb +119 -39
- data/lib/graphql/schema/member/has_interfaces.rb +66 -23
- 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 +32 -2
- data/lib/graphql/schema/member/validates_input.rb +4 -4
- data/lib/graphql/schema/member.rb +1 -6
- data/lib/graphql/schema/mutation.rb +7 -9
- data/lib/graphql/schema/non_null.rb +1 -7
- data/lib/graphql/schema/object.rb +42 -49
- data/lib/graphql/schema/printer.rb +12 -8
- data/lib/graphql/schema/ractor_shareable.rb +79 -0
- data/lib/graphql/schema/relay_classic_mutation.rb +12 -124
- data/lib/graphql/schema/resolver/has_payload_type.rb +20 -10
- data/lib/graphql/schema/resolver.rb +96 -81
- data/lib/graphql/schema/scalar.rb +10 -30
- data/lib/graphql/schema/subscription.rb +60 -14
- data/lib/graphql/schema/timeout.rb +44 -31
- data/lib/graphql/schema/type_expression.rb +2 -2
- data/lib/graphql/schema/type_membership.rb +3 -0
- data/lib/graphql/schema/union.rb +12 -19
- 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/required_validator.rb +60 -10
- data/lib/graphql/schema/validator.rb +5 -3
- data/lib/graphql/schema/visibility/migration.rb +188 -0
- data/lib/graphql/schema/visibility/profile.rb +445 -0
- data/lib/graphql/schema/visibility/visit.rb +190 -0
- data/lib/graphql/schema/visibility.rb +311 -0
- data/lib/graphql/schema/warden.rb +318 -94
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +1148 -1085
- data/lib/graphql/static_validation/all_rules.rb +4 -3
- data/lib/graphql/static_validation/base_visitor.rb +11 -27
- data/lib/graphql/static_validation/definition_dependencies.rb +7 -1
- data/lib/graphql/static_validation/error.rb +2 -2
- 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 +3 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +13 -7
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -12
- 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 +48 -6
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +90 -27
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +10 -2
- 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_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/not_single_subscription_error.rb +25 -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 +1 -1
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +5 -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_and_single_subscription_selection.rb +26 -0
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +19 -9
- 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 +2 -2
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +11 -2
- data/lib/graphql/static_validation/validation_context.rb +21 -5
- data/lib/graphql/static_validation/validator.rb +12 -26
- data/lib/graphql/static_validation.rb +0 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +14 -6
- 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 +24 -12
- data/lib/graphql/subscriptions/serialize.rb +3 -1
- data/lib/graphql/subscriptions.rb +48 -32
- data/lib/graphql/testing/helpers.rb +158 -0
- data/lib/graphql/testing.rb +2 -0
- data/lib/graphql/tracing/active_support_notifications_trace.rb +27 -0
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +1 -1
- data/lib/graphql/tracing/appoptics_trace.rb +259 -0
- data/lib/graphql/tracing/appoptics_tracing.rb +9 -2
- data/lib/graphql/tracing/appsignal_trace.rb +54 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +2 -0
- data/lib/graphql/tracing/call_legacy_tracers.rb +66 -0
- data/lib/graphql/tracing/data_dog_trace.rb +71 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +3 -0
- data/lib/graphql/tracing/detailed_trace/memory_backend.rb +60 -0
- data/lib/graphql/tracing/detailed_trace/redis_backend.rb +72 -0
- data/lib/graphql/tracing/detailed_trace.rb +93 -0
- 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/monitor_trace.rb +283 -0
- data/lib/graphql/tracing/new_relic_trace.rb +68 -0
- data/lib/graphql/tracing/new_relic_tracing.rb +2 -0
- data/lib/graphql/tracing/notifications_trace.rb +195 -0
- data/lib/graphql/tracing/notifications_tracing.rb +2 -0
- data/lib/graphql/tracing/null_trace.rb +9 -0
- data/lib/graphql/tracing/perfetto_trace/trace.proto +141 -0
- data/lib/graphql/tracing/perfetto_trace/trace_pb.rb +33 -0
- data/lib/graphql/tracing/perfetto_trace.rb +734 -0
- data/lib/graphql/tracing/platform_trace.rb +123 -0
- data/lib/graphql/tracing/platform_tracing.rb +28 -41
- data/lib/graphql/tracing/{prometheus_tracing → prometheus_trace}/graphql_collector.rb +6 -2
- data/lib/graphql/tracing/prometheus_trace.rb +93 -0
- data/lib/graphql/tracing/prometheus_tracing.rb +5 -3
- data/lib/graphql/tracing/scout_trace.rb +49 -0
- data/lib/graphql/tracing/scout_tracing.rb +2 -0
- data/lib/graphql/tracing/sentry_trace.rb +80 -0
- data/lib/graphql/tracing/statsd_trace.rb +48 -0
- data/lib/graphql/tracing/statsd_tracing.rb +2 -0
- data/lib/graphql/tracing/trace.rb +186 -0
- data/lib/graphql/tracing.rb +32 -52
- data/lib/graphql/type_kinds.rb +8 -4
- data/lib/graphql/types/iso_8601_date.rb +4 -1
- data/lib/graphql/types/iso_8601_date_time.rb +4 -0
- 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 +65 -23
- data/lib/graphql/types/relay/edge_behaviors.rb +33 -5
- 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 +1 -1
- data/lib/graphql/types.rb +18 -10
- data/lib/graphql/unauthorized_enum_value_error.rb +13 -0
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +76 -123
- data/readme.md +13 -3
- metadata +225 -142
- 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 -55
- 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 -230
- data/lib/graphql/analysis/ast/query_depth.rb +0 -56
- data/lib/graphql/analysis/ast/visitor.rb +0 -269
- 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/inspect_result.rb +0 -50
- data/lib/graphql/backtrace/legacy_tracer.rb +0 -56
- data/lib/graphql/backtrace/tracer.rb +0 -81
- 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 -255
- 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/deprecation.rb +0 -9
- 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/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 -260
- data/lib/graphql/language/parser.y +0 -550
- data/lib/graphql/language/token.rb +0 -34
- 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 -54
- 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 -17
- 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 -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/null_mask.rb +0 -11
- 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/rules/subscription_root_exists.rb +0 -17
- 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 -31
- 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
@@ -4,14 +4,34 @@ module GraphQL
|
|
4
4
|
class Schema
|
5
5
|
class Member
|
6
6
|
module TypeSystemHelpers
|
7
|
+
def initialize(...)
|
8
|
+
super
|
9
|
+
@to_non_null_type ||= nil
|
10
|
+
@to_list_type ||= nil
|
11
|
+
end
|
12
|
+
|
7
13
|
# @return [Schema::NonNull] Make a non-null-type representation of this type
|
8
14
|
def to_non_null_type
|
9
|
-
@to_non_null_type
|
15
|
+
@to_non_null_type || begin
|
16
|
+
t = GraphQL::Schema::NonNull.new(self)
|
17
|
+
if frozen?
|
18
|
+
t
|
19
|
+
else
|
20
|
+
@to_non_null_type = t
|
21
|
+
end
|
22
|
+
end
|
10
23
|
end
|
11
24
|
|
12
25
|
# @return [Schema::List] Make a list-type representation of this type
|
13
26
|
def to_list_type
|
14
|
-
@to_list_type
|
27
|
+
@to_list_type || begin
|
28
|
+
t = GraphQL::Schema::List.new(self)
|
29
|
+
if frozen?
|
30
|
+
t
|
31
|
+
else
|
32
|
+
@to_list_type = t
|
33
|
+
end
|
34
|
+
end
|
15
35
|
end
|
16
36
|
|
17
37
|
# @return [Boolean] true if this is a non-nullable type. A nullable list of non-nullables is considered nullable.
|
@@ -32,6 +52,16 @@ module GraphQL
|
|
32
52
|
def kind
|
33
53
|
raise GraphQL::RequiredImplementationMissingError, "No `.kind` defined for #{self}"
|
34
54
|
end
|
55
|
+
|
56
|
+
private
|
57
|
+
|
58
|
+
def inherited(subclass)
|
59
|
+
subclass.class_exec do
|
60
|
+
@to_non_null_type ||= nil
|
61
|
+
@to_list_type ||= nil
|
62
|
+
end
|
63
|
+
super
|
64
|
+
end
|
35
65
|
end
|
36
66
|
end
|
37
67
|
end
|
@@ -10,22 +10,22 @@ module GraphQL
|
|
10
10
|
|
11
11
|
def validate_input(val, ctx, max_errors: nil)
|
12
12
|
if val.nil?
|
13
|
-
|
13
|
+
Query::InputValidationResult::VALID
|
14
14
|
else
|
15
15
|
validate_non_null_input(val, ctx, max_errors: max_errors) || Query::InputValidationResult::VALID
|
16
16
|
end
|
17
17
|
end
|
18
18
|
|
19
19
|
def valid_isolated_input?(v)
|
20
|
-
valid_input?(v, GraphQL::Query::NullContext)
|
20
|
+
valid_input?(v, GraphQL::Query::NullContext.instance)
|
21
21
|
end
|
22
22
|
|
23
23
|
def coerce_isolated_input(v)
|
24
|
-
coerce_input(v, GraphQL::Query::NullContext)
|
24
|
+
coerce_input(v, GraphQL::Query::NullContext.instance)
|
25
25
|
end
|
26
26
|
|
27
27
|
def coerce_isolated_result(v)
|
28
|
-
coerce_result(v, GraphQL::Query::NullContext)
|
28
|
+
coerce_result(v, GraphQL::Query::NullContext.instance)
|
29
29
|
end
|
30
30
|
end
|
31
31
|
end
|
@@ -1,9 +1,8 @@
|
|
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'
|
6
4
|
require 'graphql/schema/member/has_ast_node'
|
5
|
+
require 'graphql/schema/member/has_dataloader'
|
7
6
|
require 'graphql/schema/member/has_directives'
|
8
7
|
require 'graphql/schema/member/has_deprecation_reason'
|
9
8
|
require 'graphql/schema/member/has_interfaces'
|
@@ -14,7 +13,6 @@ require 'graphql/schema/member/relay_shortcuts'
|
|
14
13
|
require 'graphql/schema/member/scoped'
|
15
14
|
require 'graphql/schema/member/type_system_helpers'
|
16
15
|
require 'graphql/schema/member/validates_input'
|
17
|
-
require "graphql/relay/type_extensions"
|
18
16
|
|
19
17
|
module GraphQL
|
20
18
|
class Schema
|
@@ -24,8 +22,6 @@ module GraphQL
|
|
24
22
|
# @api private
|
25
23
|
class Member
|
26
24
|
include GraphQLTypeNames
|
27
|
-
extend CachedGraphQLDefinition
|
28
|
-
extend GraphQL::Relay::TypeExtensions
|
29
25
|
extend BaseDSLMethods
|
30
26
|
extend BaseDSLMethods::ConfigurationExtension
|
31
27
|
introspection(false)
|
@@ -41,5 +37,4 @@ end
|
|
41
37
|
|
42
38
|
require 'graphql/schema/member/has_arguments'
|
43
39
|
require 'graphql/schema/member/has_fields'
|
44
|
-
require 'graphql/schema/member/instrumentation'
|
45
40
|
require 'graphql/schema/member/build_type'
|
@@ -62,16 +62,14 @@ module GraphQL
|
|
62
62
|
extend GraphQL::Schema::Member::HasFields
|
63
63
|
extend GraphQL::Schema::Resolver::HasPayloadType
|
64
64
|
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
super
|
72
|
-
end
|
73
|
-
end
|
65
|
+
# @api private
|
66
|
+
def call_resolve(_args_hash)
|
67
|
+
# Clear any cached values from `loads` or authorization:
|
68
|
+
dataloader.clear_cache
|
69
|
+
super
|
70
|
+
end
|
74
71
|
|
72
|
+
class << self
|
75
73
|
def visible?(context)
|
76
74
|
true
|
77
75
|
end
|
@@ -8,13 +8,7 @@ module GraphQL
|
|
8
8
|
class NonNull < GraphQL::Schema::Wrapper
|
9
9
|
include Schema::Member::ValidatesInput
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
def to_graphql
|
14
|
-
@of_type.graphql_definition(silence_deprecation_warning: true).to_non_null_type
|
15
|
-
end
|
16
|
-
|
17
|
-
# @return [GraphQL::TypeKinds::NON_NULL]
|
11
|
+
# @return [GraphQL::TypeKinds::NON_NULL]
|
18
12
|
def kind
|
19
13
|
GraphQL::TypeKinds::NON_NULL
|
20
14
|
end
|
@@ -5,9 +5,17 @@ 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
|
10
9
|
extend GraphQL::Schema::Member::HasInterfaces
|
10
|
+
include Member::HasDataloader
|
11
|
+
|
12
|
+
# Raised when an Object doesn't have any field defined and hasn't explicitly opted out of this requirement
|
13
|
+
class FieldsAreRequiredError < GraphQL::Error
|
14
|
+
def initialize(object_type)
|
15
|
+
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."
|
16
|
+
super(message)
|
17
|
+
end
|
18
|
+
end
|
11
19
|
|
12
20
|
# @return [Object] the application object this type is wrapping
|
13
21
|
attr_reader :object
|
@@ -31,6 +39,15 @@ module GraphQL
|
|
31
39
|
# @see authorized_new to make instances
|
32
40
|
protected :new
|
33
41
|
|
42
|
+
def wrap_scoped(object, context)
|
43
|
+
scoped_new(object, context)
|
44
|
+
end
|
45
|
+
|
46
|
+
# This is called by the runtime to return an object to call methods on.
|
47
|
+
def wrap(object, context)
|
48
|
+
authorized_new(object, context)
|
49
|
+
end
|
50
|
+
|
34
51
|
# Make a new instance of this type _if_ the auth check passes,
|
35
52
|
# otherwise, raise an error.
|
36
53
|
#
|
@@ -49,29 +66,35 @@ module GraphQL
|
|
49
66
|
# @return [GraphQL::Schema::Object, GraphQL::Execution::Lazy]
|
50
67
|
# @raise [GraphQL::UnauthorizedError] if the user-provided hook returns `false`
|
51
68
|
def authorized_new(object, context)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
context.query.with_error_handling do
|
69
|
+
context.query.current_trace.begin_authorized(self, object, context)
|
70
|
+
begin
|
71
|
+
maybe_lazy_auth_val = context.query.current_trace.authorized(query: context.query, type: self, object: object) do
|
56
72
|
begin
|
57
73
|
authorized?(object, context)
|
58
74
|
rescue GraphQL::UnauthorizedError => err
|
59
75
|
context.schema.unauthorized_object(err)
|
76
|
+
rescue StandardError => err
|
77
|
+
context.query.handle_or_reraise(err)
|
60
78
|
end
|
61
79
|
end
|
80
|
+
ensure
|
81
|
+
context.query.current_trace.end_authorized(self, object, context, maybe_lazy_auth_val)
|
62
82
|
end
|
63
83
|
|
64
84
|
auth_val = if context.schema.lazy?(maybe_lazy_auth_val)
|
65
85
|
GraphQL::Execution::Lazy.new do
|
66
|
-
context.query.
|
67
|
-
|
86
|
+
context.query.current_trace.begin_authorized(self, object, context)
|
87
|
+
context.query.current_trace.authorized_lazy(query: context.query, type: self, object: object) do
|
88
|
+
res = context.schema.sync_lazy(maybe_lazy_auth_val)
|
89
|
+
context.query.current_trace.end_authorized(self, object, context, res)
|
90
|
+
res
|
68
91
|
end
|
69
92
|
end
|
70
93
|
else
|
71
94
|
maybe_lazy_auth_val
|
72
95
|
end
|
73
96
|
|
74
|
-
context.
|
97
|
+
context.query.after_lazy(auth_val) do |is_authorized|
|
75
98
|
if is_authorized
|
76
99
|
self.new(object, context)
|
77
100
|
else
|
@@ -89,6 +112,10 @@ module GraphQL
|
|
89
112
|
end
|
90
113
|
end
|
91
114
|
end
|
115
|
+
|
116
|
+
def scoped_new(object, context)
|
117
|
+
self.new(object, context)
|
118
|
+
end
|
92
119
|
end
|
93
120
|
|
94
121
|
def initialize(object, context)
|
@@ -99,48 +126,14 @@ module GraphQL
|
|
99
126
|
class << self
|
100
127
|
# Set up a type-specific invalid null error to use when this object's non-null fields wrongly return `nil`.
|
101
128
|
# It should help with debugging and bug tracker integrations.
|
102
|
-
def
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
def fields(context = GraphQL::Query::NullContext)
|
110
|
-
all_fields = super
|
111
|
-
# This adds fields from legacy-style interfaces only.
|
112
|
-
# Multi-fields are not supported here.
|
113
|
-
interfaces.each do |int|
|
114
|
-
if int.is_a?(GraphQL::InterfaceType)
|
115
|
-
int_f = {}
|
116
|
-
int.fields.each do |name, legacy_field| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
117
|
-
int_f[name] = field_class.from_options(name, field: legacy_field)
|
118
|
-
end
|
119
|
-
all_fields = int_f.merge(all_fields)
|
120
|
-
end
|
121
|
-
end
|
122
|
-
all_fields
|
123
|
-
end
|
124
|
-
|
125
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
126
|
-
|
127
|
-
# @return [GraphQL::ObjectType]
|
128
|
-
def to_graphql
|
129
|
-
obj_type = GraphQL::ObjectType.new
|
130
|
-
obj_type.name = graphql_name
|
131
|
-
obj_type.description = description
|
132
|
-
obj_type.structural_interface_type_memberships = interface_type_memberships
|
133
|
-
obj_type.introspection = introspection
|
134
|
-
obj_type.mutation = mutation
|
135
|
-
obj_type.ast_node = ast_node
|
136
|
-
fields.each do |field_name, field_inst| # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
137
|
-
field_defn = field_inst.to_graphql(silence_deprecation_warning: true)
|
138
|
-
obj_type.fields[field_defn.name] = field_defn # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
129
|
+
def const_missing(name)
|
130
|
+
if name == :InvalidNullError
|
131
|
+
custom_err_class = GraphQL::InvalidNullError.subclass_for(self)
|
132
|
+
const_set(:InvalidNullError, custom_err_class)
|
133
|
+
custom_err_class
|
134
|
+
else
|
135
|
+
super
|
139
136
|
end
|
140
|
-
|
141
|
-
obj_type.metadata[:type_class] = self
|
142
|
-
|
143
|
-
obj_type
|
144
137
|
end
|
145
138
|
|
146
139
|
def kind
|
@@ -36,15 +36,11 @@ module GraphQL
|
|
36
36
|
|
37
37
|
# @param schema [GraphQL::Schema]
|
38
38
|
# @param context [Hash]
|
39
|
-
# @param only [<#call(member, ctx)>]
|
40
|
-
# @param except [<#call(member, ctx)>]
|
41
39
|
# @param introspection [Boolean] Should include the introspection types in the string?
|
42
|
-
def initialize(schema, context: nil,
|
40
|
+
def initialize(schema, context: nil, introspection: false)
|
43
41
|
@document_from_schema = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
44
42
|
schema,
|
45
43
|
context: context,
|
46
|
-
only: only,
|
47
|
-
except: except,
|
48
44
|
include_introspection_types: introspection,
|
49
45
|
)
|
50
46
|
|
@@ -57,12 +53,20 @@ module GraphQL
|
|
57
53
|
query_root = Class.new(GraphQL::Schema::Object) do
|
58
54
|
graphql_name "Root"
|
59
55
|
field :throwaway_field, String
|
56
|
+
def self.visible?(ctx)
|
57
|
+
false
|
58
|
+
end
|
60
59
|
end
|
61
|
-
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
|
+
}
|
62
67
|
|
63
68
|
introspection_schema_ast = GraphQL::Language::DocumentFromSchemaDefinition.new(
|
64
69
|
schema,
|
65
|
-
except: ->(member, _) { member.graphql_name == "Root" },
|
66
70
|
include_introspection_types: true,
|
67
71
|
include_built_in_directives: true,
|
68
72
|
).document
|
@@ -92,7 +96,7 @@ module GraphQL
|
|
92
96
|
|
93
97
|
class IntrospectionPrinter < GraphQL::Language::Printer
|
94
98
|
def print_schema_definition(schema)
|
95
|
-
"schema {\n query: Root\n}"
|
99
|
+
print_string("schema {\n query: Root\n}")
|
96
100
|
end
|
97
101
|
end
|
98
102
|
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
module RactorShareable
|
5
|
+
def self.extended(schema_class)
|
6
|
+
schema_class.extend(SchemaExtension)
|
7
|
+
schema_class.freeze_schema
|
8
|
+
end
|
9
|
+
|
10
|
+
module SchemaExtension
|
11
|
+
|
12
|
+
def freeze_error_handlers(handlers)
|
13
|
+
handlers[:subclass_handlers].default_proc = nil
|
14
|
+
handlers[:subclass_handlers].each do |_class, subclass_handlers|
|
15
|
+
freeze_error_handlers(subclass_handlers)
|
16
|
+
end
|
17
|
+
Ractor.make_shareable(handlers)
|
18
|
+
end
|
19
|
+
|
20
|
+
def freeze_schema
|
21
|
+
# warm some ivars:
|
22
|
+
default_analysis_engine
|
23
|
+
default_execution_strategy
|
24
|
+
GraphQL.default_parser
|
25
|
+
default_logger
|
26
|
+
freeze_error_handlers(error_handlers)
|
27
|
+
# TODO: this freezes errors of parent classes which could cause trouble
|
28
|
+
parent_class = superclass
|
29
|
+
while parent_class.respond_to?(:error_handlers)
|
30
|
+
freeze_error_handlers(parent_class.error_handlers)
|
31
|
+
parent_class = parent_class.superclass
|
32
|
+
end
|
33
|
+
|
34
|
+
own_tracers.freeze
|
35
|
+
@frozen_tracers = tracers.freeze
|
36
|
+
own_trace_modes.each do |m|
|
37
|
+
trace_options_for(m)
|
38
|
+
build_trace_mode(m)
|
39
|
+
end
|
40
|
+
build_trace_mode(:default)
|
41
|
+
Ractor.make_shareable(@trace_options_for_mode)
|
42
|
+
Ractor.make_shareable(own_trace_modes)
|
43
|
+
Ractor.make_shareable(own_multiplex_analyzers)
|
44
|
+
@frozen_multiplex_analyzers = Ractor.make_shareable(multiplex_analyzers)
|
45
|
+
Ractor.make_shareable(own_query_analyzers)
|
46
|
+
@frozen_query_analyzers = Ractor.make_shareable(query_analyzers)
|
47
|
+
Ractor.make_shareable(own_plugins)
|
48
|
+
own_plugins.each do |(plugin, options)|
|
49
|
+
Ractor.make_shareable(plugin)
|
50
|
+
Ractor.make_shareable(options)
|
51
|
+
end
|
52
|
+
@frozen_plugins = Ractor.make_shareable(plugins)
|
53
|
+
Ractor.make_shareable(own_references_to)
|
54
|
+
@frozen_directives = Ractor.make_shareable(directives)
|
55
|
+
|
56
|
+
Ractor.make_shareable(visibility)
|
57
|
+
Ractor.make_shareable(introspection_system)
|
58
|
+
extend(FrozenMethods)
|
59
|
+
|
60
|
+
Ractor.make_shareable(self)
|
61
|
+
superclass.respond_to?(:freeze_schema) && superclass.freeze_schema
|
62
|
+
end
|
63
|
+
|
64
|
+
module FrozenMethods
|
65
|
+
def tracers; @frozen_tracers; end
|
66
|
+
def multiplex_analyzers; @frozen_multiplex_analyzers; end
|
67
|
+
def query_analyzers; @frozen_query_analyzers; end
|
68
|
+
def plugins; @frozen_plugins; end
|
69
|
+
def directives; @frozen_directives; end
|
70
|
+
|
71
|
+
# This actually accumulates info during execution...
|
72
|
+
# How to support it?
|
73
|
+
def lazy?(_obj); false; end
|
74
|
+
def sync_lazy(obj); obj; end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
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,6 +20,10 @@ 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
28
|
field(:client_mutation_id, String, "A unique identifier for the client performing the mutation.")
|
26
29
|
# Relay classic default:
|
@@ -29,140 +32,25 @@ module GraphQL
|
|
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 = {}
|
41
|
+
inputs[:input] = input_kwargs
|
61
42
|
end
|
62
43
|
|
63
|
-
return_value =
|
64
|
-
super(**input_kwargs)
|
65
|
-
else
|
66
|
-
super()
|
67
|
-
end
|
44
|
+
return_value = super(**inputs)
|
68
45
|
|
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
|
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
|
77
50
|
end
|
78
|
-
|
79
|
-
return_value
|
51
|
+
return_hash
|
80
52
|
end
|
81
53
|
end
|
82
|
-
|
83
|
-
class << self
|
84
|
-
|
85
|
-
# Also apply this argument to the input type:
|
86
|
-
def argument(*args, **kwargs, &block)
|
87
|
-
it = input_type # make sure any inherited arguments are already added to it
|
88
|
-
arg = super
|
89
|
-
|
90
|
-
# This definition might be overriding something inherited;
|
91
|
-
# if it is, remove the inherited definition so it's not confused at runtime as having multiple definitions
|
92
|
-
prev_args = it.own_arguments[arg.graphql_name]
|
93
|
-
case prev_args
|
94
|
-
when GraphQL::Schema::Argument
|
95
|
-
if prev_args.owner != self
|
96
|
-
it.own_arguments.delete(arg.graphql_name)
|
97
|
-
end
|
98
|
-
when Array
|
99
|
-
prev_args.reject! { |a| a.owner != self }
|
100
|
-
if prev_args.empty?
|
101
|
-
it.own_arguments.delete(arg.graphql_name)
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
|
-
it.add_argument(arg)
|
106
|
-
arg
|
107
|
-
end
|
108
|
-
|
109
|
-
# The base class for generated input object types
|
110
|
-
# @param new_class [Class] The base class to use for generating input object definitions
|
111
|
-
# @return [Class] The base class for this mutation's generated input object (default is {GraphQL::Schema::InputObject})
|
112
|
-
def input_object_class(new_class = nil)
|
113
|
-
if new_class
|
114
|
-
@input_object_class = new_class
|
115
|
-
end
|
116
|
-
@input_object_class || (superclass.respond_to?(:input_object_class) ? superclass.input_object_class : GraphQL::Schema::InputObject)
|
117
|
-
end
|
118
|
-
|
119
|
-
# @param new_input_type [Class, nil] If provided, it configures this mutation to accept `new_input_type` instead of generating an input type
|
120
|
-
# @return [Class] The generated {Schema::InputObject} class for this mutation's `input`
|
121
|
-
def input_type(new_input_type = nil)
|
122
|
-
if new_input_type
|
123
|
-
@input_type = new_input_type
|
124
|
-
end
|
125
|
-
@input_type ||= generate_input_type
|
126
|
-
end
|
127
|
-
|
128
|
-
# Extend {Schema::Mutation.field_options} to add the `input` argument
|
129
|
-
def field_options
|
130
|
-
sig = super
|
131
|
-
# Arguments were added at the root, but they should be nested
|
132
|
-
sig[:arguments].clear
|
133
|
-
sig[:arguments][:input] = { type: input_type, required: true, description: "Parameters for #{graphql_name}" }
|
134
|
-
sig
|
135
|
-
end
|
136
|
-
|
137
|
-
private
|
138
|
-
|
139
|
-
# Generate the input type for the `input:` argument
|
140
|
-
# To customize how input objects are generated, override this method
|
141
|
-
# @return [Class] a subclass of {.input_object_class}
|
142
|
-
def generate_input_type
|
143
|
-
mutation_args = all_argument_definitions
|
144
|
-
mutation_name = graphql_name
|
145
|
-
mutation_class = self
|
146
|
-
Class.new(input_object_class) do
|
147
|
-
graphql_name("#{mutation_name}Input")
|
148
|
-
description("Autogenerated input type of #{mutation_name}")
|
149
|
-
mutation(mutation_class)
|
150
|
-
# these might be inherited:
|
151
|
-
mutation_args.each do |arg|
|
152
|
-
add_argument(arg)
|
153
|
-
end
|
154
|
-
argument :client_mutation_id, String, "A unique identifier for the client performing the mutation.", required: false
|
155
|
-
end
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
private
|
160
|
-
|
161
|
-
def authorize_arguments(args, values)
|
162
|
-
# remove the `input` wrapper to match values
|
163
|
-
input_args = args["input"].type.unwrap.arguments(context)
|
164
|
-
super(input_args, values)
|
165
|
-
end
|
166
54
|
end
|
167
55
|
end
|
168
56
|
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)
|
@@ -79,16 +89,16 @@ module GraphQL
|
|
79
89
|
def generate_payload_type
|
80
90
|
resolver_name = graphql_name
|
81
91
|
resolver_fields = all_field_definitions
|
82
|
-
Class.new(object_class)
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
end
|
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)
|
91
100
|
end
|
101
|
+
pt
|
92
102
|
end
|
93
103
|
end
|
94
104
|
end
|