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
@@ -6,26 +6,42 @@ module GraphQL
|
|
6
6
|
module BuildFromDefinition
|
7
7
|
class << self
|
8
8
|
# @see {Schema.from_definition}
|
9
|
-
def from_definition(definition_string, parser: GraphQL.default_parser, **kwargs)
|
10
|
-
|
9
|
+
def from_definition(schema_superclass, definition_string, parser: GraphQL.default_parser, **kwargs)
|
10
|
+
if defined?(parser::SchemaParser)
|
11
|
+
parser = parser::SchemaParser
|
12
|
+
end
|
13
|
+
from_document(schema_superclass, parser.parse(definition_string), **kwargs)
|
11
14
|
end
|
12
15
|
|
13
|
-
def from_definition_path(definition_path, parser: GraphQL.default_parser, **kwargs)
|
14
|
-
|
16
|
+
def from_definition_path(schema_superclass, definition_path, parser: GraphQL.default_parser, **kwargs)
|
17
|
+
if defined?(parser::SchemaParser)
|
18
|
+
parser = parser::SchemaParser
|
19
|
+
end
|
20
|
+
from_document(schema_superclass, parser.parse_file(definition_path), **kwargs)
|
15
21
|
end
|
16
22
|
|
17
|
-
def from_document(document, default_resolve:, using: {}, relay: false)
|
18
|
-
Builder.build(document, default_resolve: default_resolve || {}, relay: relay, using: using)
|
23
|
+
def from_document(schema_superclass, document, default_resolve:, using: {}, base_types: {}, relay: false)
|
24
|
+
Builder.build(schema_superclass, document, default_resolve: default_resolve || {}, relay: relay, using: using, base_types: base_types)
|
19
25
|
end
|
20
26
|
end
|
21
27
|
|
22
28
|
# @api private
|
23
29
|
module Builder
|
30
|
+
include GraphQL::EmptyObjects
|
24
31
|
extend self
|
25
32
|
|
26
|
-
def build(document, default_resolve:, using: {}, relay:)
|
33
|
+
def build(schema_superclass, document, default_resolve:, using: {}, base_types: {}, relay:)
|
27
34
|
raise InvalidDocumentError.new('Must provide a document ast.') if !document || !document.is_a?(GraphQL::Language::Nodes::Document)
|
28
35
|
|
36
|
+
base_types = {
|
37
|
+
object: GraphQL::Schema::Object,
|
38
|
+
interface: GraphQL::Schema::Interface,
|
39
|
+
union: GraphQL::Schema::Union,
|
40
|
+
scalar: GraphQL::Schema::Scalar,
|
41
|
+
enum: GraphQL::Schema::Enum,
|
42
|
+
input_object: GraphQL::Schema::InputObject,
|
43
|
+
}.merge!(base_types)
|
44
|
+
|
29
45
|
if default_resolve.is_a?(Hash)
|
30
46
|
default_resolve = ResolveMap.new(default_resolve)
|
31
47
|
end
|
@@ -36,7 +52,7 @@ module GraphQL
|
|
36
52
|
end
|
37
53
|
schema_definition = schema_defns.first
|
38
54
|
types = {}
|
39
|
-
directives =
|
55
|
+
directives = schema_superclass.directives.dup
|
40
56
|
type_resolver = build_resolve_type(types, directives, ->(type_name) { types[type_name] ||= Schema::LateBoundType.new(type_name)})
|
41
57
|
# Make a different type resolver because we need to coerce directive arguments
|
42
58
|
# _while_ building the schema.
|
@@ -46,7 +62,7 @@ module GraphQL
|
|
46
62
|
types[type_name] ||= begin
|
47
63
|
defn = document.definitions.find { |d| d.respond_to?(:name) && d.name == type_name }
|
48
64
|
if defn
|
49
|
-
build_definition_from_node(defn, directive_type_resolver, default_resolve)
|
65
|
+
build_definition_from_node(defn, directive_type_resolver, default_resolve, base_types)
|
50
66
|
elsif (built_in_defn = GraphQL::Schema::BUILT_IN_TYPES[type_name])
|
51
67
|
built_in_defn
|
52
68
|
else
|
@@ -55,26 +71,35 @@ module GraphQL
|
|
55
71
|
end
|
56
72
|
})
|
57
73
|
|
74
|
+
directives.merge!(GraphQL::Schema.default_directives)
|
58
75
|
document.definitions.each do |definition|
|
59
76
|
if definition.is_a?(GraphQL::Language::Nodes::DirectiveDefinition)
|
60
77
|
directives[definition.name] = build_directive(definition, directive_type_resolver)
|
61
78
|
end
|
62
79
|
end
|
63
80
|
|
64
|
-
directives = GraphQL::Schema.default_directives.merge(directives)
|
65
|
-
|
66
81
|
# In case any directives referenced built-in types for their arguments:
|
67
82
|
replace_late_bound_types_with_built_in(types)
|
68
83
|
|
84
|
+
schema_extensions = nil
|
69
85
|
document.definitions.each do |definition|
|
70
86
|
case definition
|
71
87
|
when GraphQL::Language::Nodes::SchemaDefinition, GraphQL::Language::Nodes::DirectiveDefinition
|
72
88
|
nil # already handled
|
89
|
+
when GraphQL::Language::Nodes::SchemaExtension,
|
90
|
+
GraphQL::Language::Nodes::ScalarTypeExtension,
|
91
|
+
GraphQL::Language::Nodes::ObjectTypeExtension,
|
92
|
+
GraphQL::Language::Nodes::InterfaceTypeExtension,
|
93
|
+
GraphQL::Language::Nodes::UnionTypeExtension,
|
94
|
+
GraphQL::Language::Nodes::EnumTypeExtension,
|
95
|
+
GraphQL::Language::Nodes::InputObjectTypeExtension
|
96
|
+
schema_extensions ||= []
|
97
|
+
schema_extensions << definition
|
73
98
|
else
|
74
99
|
# It's possible that this was already loaded by the directives
|
75
100
|
prev_type = types[definition.name]
|
76
101
|
if prev_type.nil? || prev_type.is_a?(Schema::LateBoundType)
|
77
|
-
types[definition.name] = build_definition_from_node(definition, type_resolver, default_resolve)
|
102
|
+
types[definition.name] = build_definition_from_node(definition, type_resolver, default_resolve, base_types)
|
78
103
|
end
|
79
104
|
end
|
80
105
|
end
|
@@ -96,6 +121,16 @@ module GraphQL
|
|
96
121
|
raise InvalidDocumentError.new("Specified subscription type \"#{schema_definition.subscription}\" not found in document.") unless types[schema_definition.subscription]
|
97
122
|
subscription_root_type = types[schema_definition.subscription]
|
98
123
|
end
|
124
|
+
|
125
|
+
if schema_definition.query.nil? &&
|
126
|
+
schema_definition.mutation.nil? &&
|
127
|
+
schema_definition.subscription.nil?
|
128
|
+
# This schema may have been given with directives only,
|
129
|
+
# check for defaults:
|
130
|
+
query_root_type = types['Query']
|
131
|
+
mutation_root_type = types['Mutation']
|
132
|
+
subscription_root_type = types['Subscription']
|
133
|
+
end
|
99
134
|
else
|
100
135
|
query_root_type = types['Query']
|
101
136
|
mutation_root_type = types['Mutation']
|
@@ -104,10 +139,43 @@ module GraphQL
|
|
104
139
|
|
105
140
|
raise InvalidDocumentError.new('Must provide schema definition with query type or a type named Query.') unless query_root_type
|
106
141
|
|
107
|
-
|
142
|
+
schema_extensions&.each do |ext|
|
143
|
+
next if ext.is_a?(GraphQL::Language::Nodes::SchemaExtension)
|
144
|
+
|
145
|
+
built_type = types[ext.name]
|
146
|
+
|
147
|
+
case ext
|
148
|
+
when GraphQL::Language::Nodes::ScalarTypeExtension
|
149
|
+
build_directives(built_type, ext, type_resolver)
|
150
|
+
when GraphQL::Language::Nodes::ObjectTypeExtension
|
151
|
+
build_directives(built_type, ext, type_resolver)
|
152
|
+
build_fields(built_type, ext.fields, type_resolver, default_resolve: true)
|
153
|
+
build_interfaces(built_type, ext.interfaces, type_resolver)
|
154
|
+
when GraphQL::Language::Nodes::InterfaceTypeExtension
|
155
|
+
build_directives(built_type, ext, type_resolver)
|
156
|
+
build_fields(built_type, ext.fields, type_resolver, default_resolve: nil)
|
157
|
+
build_interfaces(built_type, ext.interfaces, type_resolver)
|
158
|
+
when GraphQL::Language::Nodes::UnionTypeExtension
|
159
|
+
build_directives(built_type, ext, type_resolver)
|
160
|
+
built_type.possible_types(*ext.types.map { |type_name| type_resolver.call(type_name) })
|
161
|
+
when GraphQL::Language::Nodes::EnumTypeExtension
|
162
|
+
build_directives(built_type, ext, type_resolver)
|
163
|
+
build_values(built_type, ext.values, type_resolver)
|
164
|
+
when GraphQL::Language::Nodes::InputObjectTypeExtension
|
165
|
+
build_directives(built_type, ext, type_resolver)
|
166
|
+
build_arguments(built_type, ext.fields, type_resolver)
|
167
|
+
end
|
168
|
+
end
|
169
|
+
|
170
|
+
builder = self
|
171
|
+
|
172
|
+
found_types = types.values
|
173
|
+
object_types = found_types.select { |t| t.respond_to?(:kind) && t.kind.object? }
|
174
|
+
schema_class = Class.new(schema_superclass) do
|
108
175
|
begin
|
109
176
|
# Add these first so that there's some chance of resolving late-bound types
|
110
|
-
|
177
|
+
add_type_and_traverse(found_types, root: false)
|
178
|
+
orphan_types(object_types)
|
111
179
|
query query_root_type
|
112
180
|
mutation mutation_root_type
|
113
181
|
subscription subscription_root_type
|
@@ -117,6 +185,16 @@ module GraphQL
|
|
117
185
|
raise InvalidDocumentError, "Type \"#{type_name}\" not found in document.", err_backtrace
|
118
186
|
end
|
119
187
|
|
188
|
+
object_types.each do |t|
|
189
|
+
t.interfaces.each do |int_t|
|
190
|
+
if int_t.is_a?(LateBoundType)
|
191
|
+
int_t = types[int_t.graphql_name]
|
192
|
+
t.implements(int_t)
|
193
|
+
end
|
194
|
+
int_t.orphan_types(t)
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
120
198
|
if default_resolve.respond_to?(:resolve_type)
|
121
199
|
def self.resolve_type(*args)
|
122
200
|
self.definition_default_resolve.resolve_type(*args)
|
@@ -131,6 +209,7 @@ module GraphQL
|
|
131
209
|
|
132
210
|
if schema_definition
|
133
211
|
ast_node(schema_definition)
|
212
|
+
builder.build_directives(self, schema_definition, type_resolver)
|
134
213
|
end
|
135
214
|
|
136
215
|
using.each do |plugin, options|
|
@@ -156,28 +235,37 @@ module GraphQL
|
|
156
235
|
|
157
236
|
def self.inherited(child_class)
|
158
237
|
child_class.definition_default_resolve = self.definition_default_resolve
|
238
|
+
super
|
159
239
|
end
|
160
240
|
end
|
241
|
+
|
242
|
+
schema_extensions&.each do |ext|
|
243
|
+
if ext.is_a?(GraphQL::Language::Nodes::SchemaExtension)
|
244
|
+
build_directives(schema_class, ext, type_resolver)
|
245
|
+
end
|
246
|
+
end
|
247
|
+
|
248
|
+
schema_class
|
161
249
|
end
|
162
250
|
|
163
251
|
NullResolveType = ->(type, obj, ctx) {
|
164
252
|
raise(GraphQL::RequiredImplementationMissingError, "Generated Schema cannot use Interface or Union types for execution. Implement resolve_type on your resolver.")
|
165
253
|
}
|
166
254
|
|
167
|
-
def build_definition_from_node(definition, type_resolver, default_resolve)
|
255
|
+
def build_definition_from_node(definition, type_resolver, default_resolve, base_types)
|
168
256
|
case definition
|
169
257
|
when GraphQL::Language::Nodes::EnumTypeDefinition
|
170
|
-
build_enum_type(definition, type_resolver)
|
258
|
+
build_enum_type(definition, type_resolver, base_types[:enum])
|
171
259
|
when GraphQL::Language::Nodes::ObjectTypeDefinition
|
172
|
-
build_object_type(definition, type_resolver)
|
260
|
+
build_object_type(definition, type_resolver, base_types[:object])
|
173
261
|
when GraphQL::Language::Nodes::InterfaceTypeDefinition
|
174
|
-
build_interface_type(definition, type_resolver)
|
262
|
+
build_interface_type(definition, type_resolver, base_types[:interface])
|
175
263
|
when GraphQL::Language::Nodes::UnionTypeDefinition
|
176
|
-
build_union_type(definition, type_resolver)
|
264
|
+
build_union_type(definition, type_resolver, base_types[:union])
|
177
265
|
when GraphQL::Language::Nodes::ScalarTypeDefinition
|
178
|
-
build_scalar_type(definition, type_resolver, default_resolve: default_resolve)
|
266
|
+
build_scalar_type(definition, type_resolver, base_types[:scalar], default_resolve: default_resolve)
|
179
267
|
when GraphQL::Language::Nodes::InputObjectTypeDefinition
|
180
|
-
build_input_object_type(definition, type_resolver)
|
268
|
+
build_input_object_type(definition, type_resolver, base_types[:input_object])
|
181
269
|
end
|
182
270
|
end
|
183
271
|
|
@@ -197,13 +285,18 @@ module GraphQL
|
|
197
285
|
|
198
286
|
def build_directives(definition, ast_node, type_resolver)
|
199
287
|
dirs = prepare_directives(ast_node, type_resolver)
|
200
|
-
dirs.each do |dir_class, options|
|
201
|
-
definition.
|
288
|
+
dirs.each do |(dir_class, options)|
|
289
|
+
if definition.respond_to?(:schema_directive)
|
290
|
+
# it's a schema
|
291
|
+
definition.schema_directive(dir_class, **options)
|
292
|
+
else
|
293
|
+
definition.directive(dir_class, **options)
|
294
|
+
end
|
202
295
|
end
|
203
296
|
end
|
204
297
|
|
205
298
|
def prepare_directives(ast_node, type_resolver)
|
206
|
-
dirs =
|
299
|
+
dirs = []
|
207
300
|
ast_node.directives.each do |dir_node|
|
208
301
|
if dir_node.name == "deprecated"
|
209
302
|
# This is handled using `deprecation_reason`
|
@@ -211,10 +304,10 @@ module GraphQL
|
|
211
304
|
else
|
212
305
|
dir_class = type_resolver.call(dir_node.name)
|
213
306
|
if dir_class.nil?
|
214
|
-
raise ArgumentError, "No definition for @#{dir_node.name} on #{ast_node.name} at #{ast_node.line}:#{ast_node.col}"
|
307
|
+
raise ArgumentError, "No definition for @#{dir_node.name} #{ast_node.respond_to?(:name) ? "on #{ast_node.name} " : ""}at #{ast_node.line}:#{ast_node.col}"
|
215
308
|
end
|
216
309
|
options = args_to_kwargs(dir_class, dir_node)
|
217
|
-
dirs[dir_class
|
310
|
+
dirs << [dir_class, options]
|
218
311
|
end
|
219
312
|
end
|
220
313
|
dirs
|
@@ -238,22 +331,26 @@ module GraphQL
|
|
238
331
|
end
|
239
332
|
end
|
240
333
|
|
241
|
-
def build_enum_type(enum_type_definition, type_resolver)
|
334
|
+
def build_enum_type(enum_type_definition, type_resolver, base_type)
|
242
335
|
builder = self
|
243
|
-
Class.new(
|
336
|
+
Class.new(base_type) do
|
244
337
|
graphql_name(enum_type_definition.name)
|
245
338
|
builder.build_directives(self, enum_type_definition, type_resolver)
|
246
339
|
description(enum_type_definition.description)
|
247
340
|
ast_node(enum_type_definition)
|
248
|
-
enum_type_definition.values
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
341
|
+
builder.build_values(self, enum_type_definition.values, type_resolver)
|
342
|
+
end
|
343
|
+
end
|
344
|
+
|
345
|
+
def build_values(type_class, enum_value_definitions, type_resolver)
|
346
|
+
enum_value_definitions.each do |enum_value_definition|
|
347
|
+
type_class.value(enum_value_definition.name,
|
348
|
+
value: enum_value_definition.name,
|
349
|
+
deprecation_reason: build_deprecation_reason(enum_value_definition.directives),
|
350
|
+
description: enum_value_definition.description,
|
351
|
+
directives: prepare_directives(enum_value_definition, type_resolver),
|
352
|
+
ast_node: enum_value_definition,
|
353
|
+
)
|
257
354
|
end
|
258
355
|
end
|
259
356
|
|
@@ -267,9 +364,9 @@ module GraphQL
|
|
267
364
|
reason.value
|
268
365
|
end
|
269
366
|
|
270
|
-
def build_scalar_type(scalar_type_definition, type_resolver, default_resolve:)
|
367
|
+
def build_scalar_type(scalar_type_definition, type_resolver, base_type, default_resolve:)
|
271
368
|
builder = self
|
272
|
-
Class.new(
|
369
|
+
Class.new(base_type) do
|
273
370
|
graphql_name(scalar_type_definition.name)
|
274
371
|
description(scalar_type_definition.description)
|
275
372
|
ast_node(scalar_type_definition)
|
@@ -290,9 +387,9 @@ module GraphQL
|
|
290
387
|
end
|
291
388
|
end
|
292
389
|
|
293
|
-
def build_union_type(union_type_definition, type_resolver)
|
390
|
+
def build_union_type(union_type_definition, type_resolver, base_type)
|
294
391
|
builder = self
|
295
|
-
Class.new(
|
392
|
+
Class.new(base_type) do
|
296
393
|
graphql_name(union_type_definition.name)
|
297
394
|
description(union_type_definition.description)
|
298
395
|
possible_types(*union_type_definition.types.map { |type_name| type_resolver.call(type_name) })
|
@@ -301,27 +398,28 @@ module GraphQL
|
|
301
398
|
end
|
302
399
|
end
|
303
400
|
|
304
|
-
def build_object_type(object_type_definition, type_resolver)
|
401
|
+
def build_object_type(object_type_definition, type_resolver, base_type)
|
305
402
|
builder = self
|
306
403
|
|
307
|
-
Class.new(
|
404
|
+
Class.new(base_type) do
|
308
405
|
graphql_name(object_type_definition.name)
|
309
406
|
description(object_type_definition.description)
|
310
407
|
ast_node(object_type_definition)
|
311
408
|
builder.build_directives(self, object_type_definition, type_resolver)
|
312
|
-
|
313
|
-
object_type_definition.interfaces.each do |interface_name|
|
314
|
-
interface_defn = type_resolver.call(interface_name)
|
315
|
-
implements(interface_defn)
|
316
|
-
end
|
317
|
-
|
409
|
+
builder.build_interfaces(self, object_type_definition.interfaces, type_resolver)
|
318
410
|
builder.build_fields(self, object_type_definition.fields, type_resolver, default_resolve: true)
|
319
411
|
end
|
320
412
|
end
|
321
413
|
|
322
|
-
def
|
414
|
+
def build_interfaces(type_class, interface_names, type_resolver)
|
415
|
+
interface_names.each do |interface_name|
|
416
|
+
type_class.implements(type_resolver.call(interface_name))
|
417
|
+
end
|
418
|
+
end
|
419
|
+
|
420
|
+
def build_input_object_type(input_object_type_definition, type_resolver, base_type)
|
323
421
|
builder = self
|
324
|
-
Class.new(
|
422
|
+
Class.new(base_type) do
|
325
423
|
graphql_name(input_object_type_definition.name)
|
326
424
|
description(input_object_type_definition.description)
|
327
425
|
ast_node(input_object_type_definition)
|
@@ -345,8 +443,6 @@ module GraphQL
|
|
345
443
|
end
|
346
444
|
end
|
347
445
|
|
348
|
-
NO_DEFAULT_VALUE = {}.freeze
|
349
|
-
|
350
446
|
def build_arguments(type_class, arguments, type_resolver)
|
351
447
|
builder = self
|
352
448
|
|
@@ -354,7 +450,7 @@ module GraphQL
|
|
354
450
|
default_value_kwargs = if !argument_defn.default_value.nil?
|
355
451
|
{ default_value: builder.build_default_value(argument_defn.default_value) }
|
356
452
|
else
|
357
|
-
|
453
|
+
EMPTY_HASH
|
358
454
|
end
|
359
455
|
|
360
456
|
type_class.argument(
|
@@ -365,7 +461,6 @@ module GraphQL
|
|
365
461
|
deprecation_reason: builder.build_deprecation_reason(argument_defn.directives),
|
366
462
|
ast_node: argument_defn,
|
367
463
|
camelize: false,
|
368
|
-
method_access: false,
|
369
464
|
directives: prepare_directives(argument_defn, type_resolver),
|
370
465
|
**default_value_kwargs
|
371
466
|
)
|
@@ -384,17 +479,13 @@ module GraphQL
|
|
384
479
|
end
|
385
480
|
end
|
386
481
|
|
387
|
-
def build_interface_type(interface_type_definition, type_resolver)
|
482
|
+
def build_interface_type(interface_type_definition, type_resolver, base_type)
|
388
483
|
builder = self
|
389
484
|
Module.new do
|
390
|
-
include
|
485
|
+
include base_type
|
391
486
|
graphql_name(interface_type_definition.name)
|
392
487
|
description(interface_type_definition.description)
|
393
|
-
interface_type_definition.interfaces
|
394
|
-
"Implements: #{interface_type_definition} -> #{interface_name}"
|
395
|
-
interface_defn = type_resolver.call(interface_name)
|
396
|
-
implements(interface_defn)
|
397
|
-
end
|
488
|
+
builder.build_interfaces(self, interface_type_definition.interfaces, type_resolver)
|
398
489
|
ast_node(interface_type_definition)
|
399
490
|
builder.build_directives(self, interface_type_definition, type_resolver)
|
400
491
|
|
@@ -406,14 +497,12 @@ module GraphQL
|
|
406
497
|
builder = self
|
407
498
|
|
408
499
|
field_definitions.each do |field_definition|
|
409
|
-
type_name = resolve_type_name(field_definition.type)
|
410
500
|
resolve_method_name = -"resolve_field_#{field_definition.name}"
|
411
501
|
schema_field_defn = owner.field(
|
412
502
|
field_definition.name,
|
413
503
|
description: field_definition.description,
|
414
504
|
type: type_resolver.call(field_definition.type),
|
415
505
|
null: true,
|
416
|
-
connection: type_name.end_with?("Connection"),
|
417
506
|
connection_extension: nil,
|
418
507
|
deprecation_reason: build_deprecation_reason(field_definition.directives),
|
419
508
|
ast_node: field_definition,
|
@@ -434,7 +523,7 @@ module GraphQL
|
|
434
523
|
|
435
524
|
def define_field_resolve_method(owner, method_name, field_name)
|
436
525
|
owner.define_method(method_name) { |**args|
|
437
|
-
field_instance =
|
526
|
+
field_instance = context.types.field(owner, field_name)
|
438
527
|
context.schema.definition_default_resolve.call(self.class, field_instance, object, args, context)
|
439
528
|
}
|
440
529
|
end
|
@@ -462,15 +551,6 @@ module GraphQL
|
|
462
551
|
}
|
463
552
|
resolve_type_proc
|
464
553
|
end
|
465
|
-
|
466
|
-
def resolve_type_name(type)
|
467
|
-
case type
|
468
|
-
when GraphQL::Language::Nodes::TypeName
|
469
|
-
return type.name
|
470
|
-
else
|
471
|
-
resolve_type_name(type.of_type)
|
472
|
-
end
|
473
|
-
end
|
474
554
|
end
|
475
555
|
|
476
556
|
private_constant :Builder
|
@@ -7,7 +7,7 @@ module GraphQL
|
|
7
7
|
# In this case, the server hides types and fields _entirely_, unless the current context has certain `:flags` present.
|
8
8
|
class Flagged < GraphQL::Schema::Directive
|
9
9
|
def initialize(target, **options)
|
10
|
-
if target.is_a?(Module)
|
10
|
+
if target.is_a?(Module)
|
11
11
|
# This is type class of some kind, `include` will put this module
|
12
12
|
# in between the type class itself and its super class, so `super` will work fine
|
13
13
|
target.include(VisibleByFlag)
|
@@ -37,6 +37,8 @@ module GraphQL
|
|
37
37
|
|
38
38
|
argument :by, [String], "Flags to check for this schema member"
|
39
39
|
|
40
|
+
repeatable(true)
|
41
|
+
|
40
42
|
module VisibleByFlag
|
41
43
|
def self.included(schema_class)
|
42
44
|
schema_class.extend(self)
|
@@ -45,7 +47,7 @@ module GraphQL
|
|
45
47
|
def visible?(context)
|
46
48
|
if dir = self.directives.find { |d| d.is_a?(Flagged) }
|
47
49
|
relevant_flags = (f = context[:flags]) && dir.arguments[:by] & f # rubocop:disable Development/ContextIsPassedCop -- definition-related
|
48
|
-
relevant_flags && relevant_flags.
|
50
|
+
relevant_flags && !relevant_flags.empty? && super
|
49
51
|
else
|
50
52
|
super
|
51
53
|
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
class Directive < GraphQL::Schema::Member
|
5
|
+
class OneOf < GraphQL::Schema::Directive
|
6
|
+
description "Requires that exactly one field must be supplied and that field must not be `null`."
|
7
|
+
locations(GraphQL::Schema::Directive::INPUT_OBJECT)
|
8
|
+
default_directive true
|
9
|
+
|
10
|
+
def initialize(...)
|
11
|
+
super
|
12
|
+
|
13
|
+
owner.extend(IsOneOf)
|
14
|
+
end
|
15
|
+
|
16
|
+
module IsOneOf
|
17
|
+
def one_of?
|
18
|
+
true
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
class Directive < GraphQL::Schema::Member
|
5
|
+
class SpecifiedBy < GraphQL::Schema::Directive
|
6
|
+
description "Exposes a URL that specifies the behavior of this scalar."
|
7
|
+
locations(GraphQL::Schema::Directive::SCALAR)
|
8
|
+
default_directive true
|
9
|
+
|
10
|
+
argument :url, String, description: "The URL that specifies the behavior of this scalar."
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
@@ -39,7 +39,7 @@ module GraphQL
|
|
39
39
|
transform_name = arguments[:by]
|
40
40
|
if TRANSFORMS.include?(transform_name) && return_value.respond_to?(transform_name)
|
41
41
|
return_value = return_value.public_send(transform_name)
|
42
|
-
response = context.namespace(:
|
42
|
+
response = context.namespace(:interpreter_runtime)[:runtime].final_result
|
43
43
|
*keys, last = path
|
44
44
|
keys.each do |key|
|
45
45
|
if response && (response = response[key])
|
@@ -8,7 +8,8 @@ module GraphQL
|
|
8
8
|
# - {.resolve}: Wraps field resolution (so it should call `yield` to continue)
|
9
9
|
class Directive < GraphQL::Schema::Member
|
10
10
|
extend GraphQL::Schema::Member::HasArguments
|
11
|
-
extend GraphQL::Schema::Member::
|
11
|
+
extend GraphQL::Schema::Member::HasArguments::HasDirectiveArguments
|
12
|
+
extend GraphQL::Schema::Member::HasValidators
|
12
13
|
|
13
14
|
class << self
|
14
15
|
# Directives aren't types, they don't have kinds.
|
@@ -24,12 +25,12 @@ module GraphQL
|
|
24
25
|
@default_graphql_name ||= begin
|
25
26
|
camelized_name = super.dup
|
26
27
|
camelized_name[0] = camelized_name[0].downcase
|
27
|
-
camelized_name
|
28
|
+
-camelized_name
|
28
29
|
end
|
29
30
|
end
|
30
31
|
|
31
32
|
def locations(*new_locations)
|
32
|
-
if new_locations.
|
33
|
+
if !new_locations.empty?
|
33
34
|
new_locations.each do |new_loc|
|
34
35
|
if !LOCATIONS.include?(new_loc.to_sym)
|
35
36
|
raise ArgumentError, "#{self} (#{self.graphql_name}) has an invalid directive location: `locations #{new_loc}` "
|
@@ -55,26 +56,6 @@ module GraphQL
|
|
55
56
|
default_directive
|
56
57
|
end
|
57
58
|
|
58
|
-
prepend Schema::Member::CachedGraphQLDefinition::DeprecatedToGraphQL
|
59
|
-
|
60
|
-
def to_graphql
|
61
|
-
defn = GraphQL::Directive.new
|
62
|
-
defn.name = self.graphql_name
|
63
|
-
defn.description = self.description
|
64
|
-
defn.locations = self.locations
|
65
|
-
defn.default_directive = self.default_directive
|
66
|
-
defn.ast_node = ast_node
|
67
|
-
defn.metadata[:type_class] = self
|
68
|
-
all_argument_definitions.each do |arg_defn|
|
69
|
-
arg_graphql = arg_defn.to_graphql(silence_deprecation_warning: true)
|
70
|
-
defn.arguments[arg_graphql.name] = arg_graphql # rubocop:disable Development/ContextIsPassedCop -- legacy-related
|
71
|
-
end
|
72
|
-
# Make a reference to a classic-style Arguments class
|
73
|
-
defn.arguments_class = GraphQL::Query::Arguments.construct_arguments_class(defn)
|
74
|
-
|
75
|
-
defn
|
76
|
-
end
|
77
|
-
|
78
59
|
# If false, this part of the query won't be evaluated
|
79
60
|
def include?(_object, arguments, context)
|
80
61
|
static_include?(arguments, context)
|
@@ -95,6 +76,10 @@ module GraphQL
|
|
95
76
|
yield
|
96
77
|
end
|
97
78
|
|
79
|
+
def validate!(arguments, context)
|
80
|
+
Schema::Validator.validate!(validators, self, context, arguments)
|
81
|
+
end
|
82
|
+
|
98
83
|
def on_field?
|
99
84
|
locations.include?(FIELD)
|
100
85
|
end
|
@@ -114,6 +99,15 @@ module GraphQL
|
|
114
99
|
def repeatable(new_value)
|
115
100
|
@repeatable = new_value
|
116
101
|
end
|
102
|
+
|
103
|
+
private
|
104
|
+
|
105
|
+
def inherited(subclass)
|
106
|
+
super
|
107
|
+
subclass.class_exec do
|
108
|
+
@default_graphql_name ||= nil
|
109
|
+
end
|
110
|
+
end
|
117
111
|
end
|
118
112
|
|
119
113
|
# @return [GraphQL::Schema::Field, GraphQL::Schema::Argument, Class, Module]
|
@@ -122,6 +116,9 @@ module GraphQL
|
|
122
116
|
# @return [GraphQL::Interpreter::Arguments]
|
123
117
|
attr_reader :arguments
|
124
118
|
|
119
|
+
class InvalidArgumentError < GraphQL::Error
|
120
|
+
end
|
121
|
+
|
125
122
|
def initialize(owner, **arguments)
|
126
123
|
@owner = owner
|
127
124
|
assert_valid_owner
|
@@ -130,7 +127,31 @@ module GraphQL
|
|
130
127
|
# - lazy resolution
|
131
128
|
# Probably, those won't be needed here, since these are configuration arguments,
|
132
129
|
# not runtime arguments.
|
133
|
-
|
130
|
+
context = Query::NullContext.instance
|
131
|
+
self.class.all_argument_definitions.each do |arg_defn|
|
132
|
+
if arguments.key?(arg_defn.keyword)
|
133
|
+
value = arguments[arg_defn.keyword]
|
134
|
+
# This is a Ruby-land value; convert it to graphql for validation
|
135
|
+
graphql_value = begin
|
136
|
+
arg_defn.type.unwrap.coerce_isolated_result(value)
|
137
|
+
rescue GraphQL::Schema::Enum::UnresolvedValueError
|
138
|
+
# Let validation handle this
|
139
|
+
value
|
140
|
+
end
|
141
|
+
else
|
142
|
+
value = graphql_value = nil
|
143
|
+
end
|
144
|
+
|
145
|
+
result = arg_defn.type.validate_input(graphql_value, context)
|
146
|
+
if !result.valid?
|
147
|
+
raise InvalidArgumentError, "@#{graphql_name}.#{arg_defn.graphql_name} on #{owner.path} is invalid (#{value.inspect}): #{result.problems.first["explanation"]}"
|
148
|
+
end
|
149
|
+
end
|
150
|
+
self.class.validate!(arguments, context)
|
151
|
+
@arguments = self.class.coerce_arguments(nil, arguments, context)
|
152
|
+
if @arguments.is_a?(GraphQL::ExecutionError)
|
153
|
+
raise @arguments
|
154
|
+
end
|
134
155
|
end
|
135
156
|
|
136
157
|
def graphql_name
|
@@ -199,6 +220,8 @@ module GraphQL
|
|
199
220
|
assert_has_location(SCALAR)
|
200
221
|
elsif @owner < GraphQL::Schema
|
201
222
|
assert_has_location(SCHEMA)
|
223
|
+
elsif @owner < GraphQL::Schema::Resolver
|
224
|
+
assert_has_location(FIELD_DEFINITION)
|
202
225
|
else
|
203
226
|
raise "Unexpected directive owner class: #{@owner}"
|
204
227
|
end
|