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
data/lib/graphql/query.rb
CHANGED
@@ -1,24 +1,56 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
|
-
require "graphql/query/arguments"
|
3
|
-
require "graphql/query/arguments_cache"
|
4
|
-
require "graphql/query/context"
|
5
|
-
require "graphql/query/executor"
|
6
|
-
require "graphql/query/fingerprint"
|
7
|
-
require "graphql/query/literal_input"
|
8
|
-
require "graphql/query/null_context"
|
9
|
-
require "graphql/query/result"
|
10
|
-
require "graphql/query/serial_execution"
|
11
|
-
require "graphql/query/variables"
|
12
|
-
require "graphql/query/input_validation_result"
|
13
|
-
require "graphql/query/variable_validation_error"
|
14
|
-
require "graphql/query/validation_pipeline"
|
15
2
|
|
16
3
|
module GraphQL
|
17
4
|
# A combination of query string and {Schema} instance which can be reduced to a {#result}.
|
18
5
|
class Query
|
6
|
+
extend Autoload
|
19
7
|
include Tracing::Traceable
|
20
8
|
extend Forwardable
|
21
9
|
|
10
|
+
autoload :Context, "graphql/query/context"
|
11
|
+
autoload :Fingerprint, "graphql/query/fingerprint"
|
12
|
+
autoload :NullContext, "graphql/query/null_context"
|
13
|
+
autoload :Partial, "graphql/query/partial"
|
14
|
+
autoload :Result, "graphql/query/result"
|
15
|
+
autoload :Variables, "graphql/query/variables"
|
16
|
+
autoload :InputValidationResult, "graphql/query/input_validation_result"
|
17
|
+
autoload :VariableValidationError, "graphql/query/variable_validation_error"
|
18
|
+
autoload :ValidationPipeline, "graphql/query/validation_pipeline"
|
19
|
+
|
20
|
+
# Code shared with {Partial}
|
21
|
+
module Runnable
|
22
|
+
def after_lazy(value, &block)
|
23
|
+
if !defined?(@runtime_instance)
|
24
|
+
@runtime_instance = context.namespace(:interpreter_runtime)[:runtime]
|
25
|
+
end
|
26
|
+
|
27
|
+
if @runtime_instance
|
28
|
+
@runtime_instance.minimal_after_lazy(value, &block)
|
29
|
+
else
|
30
|
+
@schema.after_lazy(value, &block)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
# Node-level cache for calculating arguments. Used during execution and query analysis.
|
35
|
+
# @param ast_node [GraphQL::Language::Nodes::AbstractNode]
|
36
|
+
# @param definition [GraphQL::Schema::Field]
|
37
|
+
# @param parent_object [GraphQL::Schema::Object]
|
38
|
+
# @return [Hash{Symbol => Object}]
|
39
|
+
def arguments_for(ast_node, definition, parent_object: nil)
|
40
|
+
arguments_cache.fetch(ast_node, definition, parent_object)
|
41
|
+
end
|
42
|
+
|
43
|
+
def arguments_cache
|
44
|
+
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
45
|
+
end
|
46
|
+
|
47
|
+
# @api private
|
48
|
+
def handle_or_reraise(err)
|
49
|
+
@schema.handle_or_reraise(context, err)
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
include Runnable
|
22
54
|
class OperationNameMissingError < GraphQL::ExecutionError
|
23
55
|
def initialize(name)
|
24
56
|
msg = if name.nil?
|
@@ -39,7 +71,30 @@ module GraphQL
|
|
39
71
|
attr_accessor :operation_name
|
40
72
|
|
41
73
|
# @return [Boolean] if false, static validation is skipped (execution behavior for invalid queries is undefined)
|
42
|
-
|
74
|
+
attr_reader :validate
|
75
|
+
|
76
|
+
# @param new_validate [Boolean] if false, static validation is skipped. This can't be reasssigned after validation.
|
77
|
+
def validate=(new_validate)
|
78
|
+
if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
|
79
|
+
raise ArgumentError, "Can't reassign Query#validate= after validation has run, remove this assignment."
|
80
|
+
else
|
81
|
+
@validate = new_validate
|
82
|
+
end
|
83
|
+
end
|
84
|
+
|
85
|
+
# @return [GraphQL::StaticValidation::Validator] if present, the query will validate with these rules.
|
86
|
+
attr_reader :static_validator
|
87
|
+
|
88
|
+
# @param new_validator [GraphQL::StaticValidation::Validator] if present, the query will validate with these rules. This can't be reasssigned after validation.
|
89
|
+
def static_validator=(new_validator)
|
90
|
+
if defined?(@validation_pipeline) && @validation_pipeline && @validation_pipeline.has_validated?
|
91
|
+
raise ArgumentError, "Can't reassign Query#static_validator= after validation has run, remove this assignment."
|
92
|
+
elsif !new_validator.is_a?(GraphQL::StaticValidation::Validator)
|
93
|
+
raise ArgumentError, "Expected a `GraphQL::StaticValidation::Validator` instance."
|
94
|
+
else
|
95
|
+
@static_validator = new_validator
|
96
|
+
end
|
97
|
+
end
|
43
98
|
|
44
99
|
attr_writer :query_string
|
45
100
|
|
@@ -77,30 +132,40 @@ module GraphQL
|
|
77
132
|
# @param root_value [Object] the object used to resolve fields on the root type
|
78
133
|
# @param max_depth [Numeric] the maximum number of nested selections allowed for this query (falls back to schema-level value)
|
79
134
|
# @param max_complexity [Numeric] the maximum field complexity for this query (falls back to schema-level value)
|
80
|
-
# @param
|
81
|
-
|
82
|
-
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, validate: true, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, except: nil, only: nil, warden: nil)
|
135
|
+
# @param visibility_profile [Symbol] Another way to assign `context[:visibility_profile]`
|
136
|
+
def initialize(schema, query_string = nil, query: nil, document: nil, context: nil, variables: nil, multiplex: nil, validate: true, static_validator: nil, visibility_profile: nil, subscription_topic: nil, operation_name: nil, root_value: nil, max_depth: schema.max_depth, max_complexity: schema.max_complexity, warden: nil, use_visibility_profile: nil)
|
83
137
|
# Even if `variables: nil` is passed, use an empty hash for simpler logic
|
84
138
|
variables ||= {}
|
139
|
+
@multiplex = multiplex
|
140
|
+
@schema = schema
|
141
|
+
@context = schema.context_class.new(query: self, values: context)
|
142
|
+
if visibility_profile
|
143
|
+
@context[:visibility_profile] ||= visibility_profile
|
144
|
+
end
|
85
145
|
|
86
|
-
|
87
|
-
|
88
|
-
schema = schema.graphql_definition
|
146
|
+
if use_visibility_profile.nil?
|
147
|
+
use_visibility_profile = warden ? false : schema.use_visibility_profile?
|
89
148
|
end
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
149
|
+
|
150
|
+
if use_visibility_profile
|
151
|
+
@visibility_profile = @schema.visibility.profile_for(@context)
|
152
|
+
@warden = Schema::Warden::NullWarden.new(context: @context, schema: @schema)
|
153
|
+
else
|
154
|
+
@visibility_profile = nil
|
155
|
+
@warden = warden
|
156
|
+
end
|
157
|
+
|
95
158
|
@subscription_topic = subscription_topic
|
96
159
|
@root_value = root_value
|
97
160
|
@fragments = nil
|
98
161
|
@operations = nil
|
99
162
|
@validate = validate
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
163
|
+
self.static_validator = static_validator if static_validator
|
164
|
+
context_tracers = (context ? context.fetch(:tracers, []) : [])
|
165
|
+
@tracers = schema.tracers + context_tracers
|
166
|
+
|
167
|
+
if !context_tracers.empty? && !(schema.trace_class <= GraphQL::Tracing::CallLegacyTracers)
|
168
|
+
raise ArgumentError, "context[:tracers] are not supported without `trace_with(GraphQL::Tracing::CallLegacyTracers)` in the schema configuration, please add it."
|
104
169
|
end
|
105
170
|
|
106
171
|
@analysis_errors = []
|
@@ -142,10 +207,7 @@ module GraphQL
|
|
142
207
|
@result_values = nil
|
143
208
|
@executed = false
|
144
209
|
|
145
|
-
|
146
|
-
if @schema.respond_to?(:visible?)
|
147
|
-
merge_filters(only: @schema.method(:visible?))
|
148
|
-
end
|
210
|
+
@logger = schema.logger_for(context)
|
149
211
|
end
|
150
212
|
|
151
213
|
# If a document was provided to `GraphQL::Schema#execute` instead of the raw query string, we will need to get it from the document
|
@@ -153,12 +215,16 @@ module GraphQL
|
|
153
215
|
@query_string ||= (document ? document.to_query_string : nil)
|
154
216
|
end
|
155
217
|
|
156
|
-
|
157
|
-
|
158
|
-
end
|
218
|
+
# @return [Symbol, nil]
|
219
|
+
attr_reader :visibility_profile
|
159
220
|
|
160
221
|
attr_accessor :multiplex
|
161
222
|
|
223
|
+
# @return [GraphQL::Tracing::Trace]
|
224
|
+
def current_trace
|
225
|
+
@current_trace ||= context[:trace] || (multiplex ? multiplex.current_trace : schema.new_trace(multiplex: multiplex, query: self))
|
226
|
+
end
|
227
|
+
|
162
228
|
def subscription_update?
|
163
229
|
@subscription_topic && subscription?
|
164
230
|
end
|
@@ -167,10 +233,11 @@ module GraphQL
|
|
167
233
|
# @return [GraphQL::Execution::Lookahead]
|
168
234
|
def lookahead
|
169
235
|
@lookahead ||= begin
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
236
|
+
if selected_operation.nil?
|
237
|
+
GraphQL::Execution::Lookahead::NULL_LOOKAHEAD
|
238
|
+
else
|
239
|
+
GraphQL::Execution::Lookahead.new(query: self, root_type: root_type, ast_nodes: [selected_operation])
|
240
|
+
end
|
174
241
|
end
|
175
242
|
end
|
176
243
|
|
@@ -195,11 +262,23 @@ module GraphQL
|
|
195
262
|
with_prepared_ast { @operations }
|
196
263
|
end
|
197
264
|
|
265
|
+
# Run subtree partials of this query and return their results.
|
266
|
+
# Each partial is identified with a `path:` and `object:`
|
267
|
+
# where the path references a field in the AST and the object will be treated
|
268
|
+
# as the return value from that field. Subfields of the field named by `path`
|
269
|
+
# will be executed with `object` as the starting point
|
270
|
+
# @param partials_hashes [Array<Hash{Symbol => Object}>] Hashes with `path:` and `object:` keys
|
271
|
+
# @return [Array<GraphQL::Query::Result>]
|
272
|
+
def run_partials(partials_hashes)
|
273
|
+
partials = partials_hashes.map { |partial_options| Partial.new(query: self, **partial_options) }
|
274
|
+
Execution::Interpreter.run_all(@schema, partials, context: @context)
|
275
|
+
end
|
276
|
+
|
198
277
|
# Get the result for this query, executing it once
|
199
|
-
# @return [
|
278
|
+
# @return [GraphQL::Query::Result] A Hash-like GraphQL response, with `"data"` and/or `"errors"` keys
|
200
279
|
def result
|
201
280
|
if !@executed
|
202
|
-
Execution::
|
281
|
+
Execution::Interpreter.run_all(@schema, [self], context: @context)
|
203
282
|
end
|
204
283
|
@result ||= Query::Result.new(query: self, values: @result_values)
|
205
284
|
end
|
@@ -237,37 +316,6 @@ module GraphQL
|
|
237
316
|
end
|
238
317
|
end
|
239
318
|
|
240
|
-
def irep_selection
|
241
|
-
@selection ||= begin
|
242
|
-
if selected_operation && internal_representation
|
243
|
-
internal_representation.operation_definitions[selected_operation.name]
|
244
|
-
else
|
245
|
-
nil
|
246
|
-
end
|
247
|
-
end
|
248
|
-
end
|
249
|
-
|
250
|
-
# Node-level cache for calculating arguments. Used during execution and query analysis.
|
251
|
-
# @param ast_node [GraphQL::Language::Nodes::AbstractNode]
|
252
|
-
# @param definition [GraphQL::Schema::Field]
|
253
|
-
# @param parent_object [GraphQL::Schema::Object]
|
254
|
-
# @return Hash{Symbol => Object}
|
255
|
-
def arguments_for(ast_node, definition, parent_object: nil)
|
256
|
-
if interpreter?
|
257
|
-
arguments_cache.fetch(ast_node, definition, parent_object)
|
258
|
-
else
|
259
|
-
arguments_cache[ast_node][definition]
|
260
|
-
end
|
261
|
-
end
|
262
|
-
|
263
|
-
def arguments_cache
|
264
|
-
if interpreter?
|
265
|
-
@arguments_cache ||= Execution::Interpreter::ArgumentsCache.new(self)
|
266
|
-
else
|
267
|
-
@arguments_cache ||= ArgumentsCache.build(self)
|
268
|
-
end
|
269
|
-
end
|
270
|
-
|
271
319
|
# A version of the given query string, with:
|
272
320
|
# - Variables inlined to the query
|
273
321
|
# - Strings replaced with `<REDACTED>`
|
@@ -296,7 +344,7 @@ module GraphQL
|
|
296
344
|
|
297
345
|
# @return [String] An opaque hash for identifying this query's given query string and selected operation
|
298
346
|
def operation_fingerprint
|
299
|
-
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string)}"
|
347
|
+
@operation_fingerprint ||= "#{selected_operation_name || "anonymous"}/#{Fingerprint.generate(query_string || "")}"
|
300
348
|
end
|
301
349
|
|
302
350
|
# @return [String] An opaque hash for identifying this query's given a variable values (not including defaults)
|
@@ -308,8 +356,8 @@ module GraphQL
|
|
308
356
|
with_prepared_ast { @validation_pipeline }
|
309
357
|
end
|
310
358
|
|
311
|
-
def_delegators :validation_pipeline, :validation_errors,
|
312
|
-
:analyzers, :ast_analyzers, :max_depth, :max_complexity
|
359
|
+
def_delegators :validation_pipeline, :validation_errors,
|
360
|
+
:analyzers, :ast_analyzers, :max_depth, :max_complexity, :validate_timeout_remaining
|
313
361
|
|
314
362
|
attr_accessor :analysis_errors
|
315
363
|
def valid?
|
@@ -320,14 +368,45 @@ module GraphQL
|
|
320
368
|
with_prepared_ast { @warden }
|
321
369
|
end
|
322
370
|
|
323
|
-
|
371
|
+
def get_type(type_name)
|
372
|
+
types.type(type_name) # rubocop:disable Development/ContextIsPassedCop
|
373
|
+
end
|
374
|
+
|
375
|
+
def get_field(owner, field_name)
|
376
|
+
types.field(owner, field_name) # rubocop:disable Development/ContextIsPassedCop
|
377
|
+
end
|
378
|
+
|
379
|
+
def possible_types(type)
|
380
|
+
types.possible_types(type) # rubocop:disable Development/ContextIsPassedCop
|
381
|
+
end
|
382
|
+
|
383
|
+
def root_type_for_operation(op_type)
|
384
|
+
case op_type
|
385
|
+
when "query", nil
|
386
|
+
types.query_root # rubocop:disable Development/ContextIsPassedCop
|
387
|
+
when "mutation"
|
388
|
+
types.mutation_root # rubocop:disable Development/ContextIsPassedCop
|
389
|
+
when "subscription"
|
390
|
+
types.subscription_root # rubocop:disable Development/ContextIsPassedCop
|
391
|
+
else
|
392
|
+
raise ArgumentError, "unexpected root type name: #{op_type.inspect}; expected nil, 'query', 'mutation', or 'subscription'"
|
393
|
+
end
|
394
|
+
end
|
395
|
+
|
396
|
+
def root_type
|
397
|
+
root_type_for_operation(selected_operation.operation_type)
|
398
|
+
end
|
399
|
+
|
400
|
+
def types
|
401
|
+
@visibility_profile || warden.visibility_profile
|
402
|
+
end
|
324
403
|
|
325
404
|
# @param abstract_type [GraphQL::UnionType, GraphQL::InterfaceType]
|
326
405
|
# @param value [Object] Any runtime value
|
327
406
|
# @return [GraphQL::ObjectType, nil] The runtime type of `value` from {Schema#resolve_type}
|
328
407
|
# @see {#possible_types} to apply filtering from `only` / `except`
|
329
|
-
def resolve_type(abstract_type, value =
|
330
|
-
if value.is_a?(Symbol) && value ==
|
408
|
+
def resolve_type(abstract_type, value = NOT_CONFIGURED)
|
409
|
+
if value.is_a?(Symbol) && value == NOT_CONFIGURED
|
331
410
|
# Old method signature
|
332
411
|
value = abstract_type
|
333
412
|
abstract_type = nil
|
@@ -346,26 +425,11 @@ module GraphQL
|
|
346
425
|
with_prepared_ast { @query }
|
347
426
|
end
|
348
427
|
|
349
|
-
# @return [void]
|
350
|
-
def merge_filters(only: nil, except: nil)
|
351
|
-
if @prepared_ast
|
352
|
-
raise "Can't add filters after preparing the query"
|
353
|
-
else
|
354
|
-
@filter = @filter.merge(only: only, except: except)
|
355
|
-
end
|
356
|
-
nil
|
357
|
-
end
|
358
|
-
|
359
428
|
def subscription?
|
360
429
|
with_prepared_ast { @subscription }
|
361
430
|
end
|
362
431
|
|
363
|
-
|
364
|
-
def with_error_handling
|
365
|
-
schema.error_handler.with_error_handling(context) do
|
366
|
-
yield
|
367
|
-
end
|
368
|
-
end
|
432
|
+
attr_reader :logger
|
369
433
|
|
370
434
|
private
|
371
435
|
|
@@ -381,11 +445,11 @@ module GraphQL
|
|
381
445
|
|
382
446
|
def prepare_ast
|
383
447
|
@prepared_ast = true
|
384
|
-
@warden ||=
|
448
|
+
@warden ||= @schema.warden_class.new(schema: @schema, context: @context)
|
385
449
|
parse_error = nil
|
386
450
|
@document ||= begin
|
387
451
|
if query_string
|
388
|
-
GraphQL.parse(query_string,
|
452
|
+
GraphQL.parse(query_string, trace: self.current_trace, max_tokens: @schema.max_query_string_tokens)
|
389
453
|
end
|
390
454
|
rescue GraphQL::ParseError => err
|
391
455
|
parse_error = err
|
@@ -417,7 +481,7 @@ module GraphQL
|
|
417
481
|
@mutation = false
|
418
482
|
@subscription = false
|
419
483
|
operation_name_error = nil
|
420
|
-
if
|
484
|
+
if !@operations.empty?
|
421
485
|
@selected_operation = find_operation(@operations, @operation_name)
|
422
486
|
if @selected_operation.nil?
|
423
487
|
operation_name_error = GraphQL::Query::OperationNameMissingError.new(@operation_name)
|
data/lib/graphql/railtie.rb
CHANGED
@@ -1,116 +1,22 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module GraphQL
|
4
|
+
# Support {GraphQL::Parser::Cache} and {GraphQL.eager_load!}
|
5
|
+
#
|
6
|
+
# @example Enable the parser cache with default directory
|
7
|
+
#
|
8
|
+
# config.graphql.parser_cache = true
|
9
|
+
#
|
4
10
|
class Railtie < Rails::Railtie
|
5
|
-
config.
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
rake_tasks do
|
15
|
-
# Defer this so that you only need the `parser` gem when you _run_ the upgrader
|
16
|
-
def load_upgraders
|
17
|
-
require_relative './upgrader/member'
|
18
|
-
require_relative './upgrader/schema'
|
19
|
-
end
|
20
|
-
|
21
|
-
namespace :graphql do
|
22
|
-
task :upgrade, [:dir] do |t, args|
|
23
|
-
unless (dir = args[:dir])
|
24
|
-
fail 'You have to give me a directory where your GraphQL schema and types live. ' \
|
25
|
-
'For example: `bin/rake graphql:upgrade[app/graphql/**/*]`'
|
26
|
-
end
|
27
|
-
|
28
|
-
Dir[dir].each do |file|
|
29
|
-
# Members (types, interfaces, etc.)
|
30
|
-
if file =~ /.*_(type|interface|enum|union|)\.rb$/
|
31
|
-
Rake::Task["graphql:upgrade:member"].execute(Struct.new(:member_file).new(file))
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
puts "Upgrade complete! Note that this is a best-effort approach, and may very well contain some bugs."
|
36
|
-
puts "Don't forget to create the base objects. For example, you could run:"
|
37
|
-
puts "\tbin/rake graphql:upgrade:create_base_objects[app/graphql]"
|
38
|
-
end
|
39
|
-
|
40
|
-
namespace :upgrade do
|
41
|
-
task :create_base_objects, [:base_dir] do |t, args|
|
42
|
-
unless (base_dir = args[:base_dir])
|
43
|
-
fail 'You have to give me a directory where your GraphQL types live. ' \
|
44
|
-
'For example: `bin/rake graphql:upgrade:create_base_objects[app/graphql]`'
|
45
|
-
end
|
46
|
-
|
47
|
-
destination_file = File.join(base_dir, "types", "base_scalar.rb")
|
48
|
-
unless File.exists?(destination_file)
|
49
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
50
|
-
File.open(destination_file, 'w') do |f|
|
51
|
-
f.puts "class Types::BaseScalar < GraphQL::Schema::Scalar\nend"
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
destination_file = File.join(base_dir, "types", "base_input_object.rb")
|
56
|
-
unless File.exists?(destination_file)
|
57
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
58
|
-
File.open(destination_file, 'w') do |f|
|
59
|
-
f.puts "class Types::BaseInputObject < GraphQL::Schema::InputObject\nend"
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
destination_file = File.join(base_dir, "types", "base_enum.rb")
|
64
|
-
unless File.exists?(destination_file)
|
65
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
66
|
-
File.open(destination_file, 'w') do |f|
|
67
|
-
f.puts "class Types::BaseEnum < GraphQL::Schema::Enum\nend"
|
68
|
-
end
|
69
|
-
end
|
70
|
-
|
71
|
-
destination_file = File.join(base_dir, "types", "base_union.rb")
|
72
|
-
unless File.exists?(destination_file)
|
73
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
74
|
-
File.open(destination_file, 'w') do |f|
|
75
|
-
f.puts "class Types::BaseUnion < GraphQL::Schema::Union\nend"
|
76
|
-
end
|
77
|
-
end
|
78
|
-
|
79
|
-
destination_file = File.join(base_dir, "types", "base_interface.rb")
|
80
|
-
unless File.exists?(destination_file)
|
81
|
-
FileUtils.mkdir_p(File.dirname(destination_file))
|
82
|
-
File.open(destination_file, 'w') do |f|
|
83
|
-
f.puts "module Types::BaseInterface\n include GraphQL::Schema::Interface\nend"
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
destination_file = File.join(base_dir, "types", "base_object.rb")
|
88
|
-
unless File.exists?(destination_file)
|
89
|
-
File.open(destination_file, 'w') do |f|
|
90
|
-
f.puts "class Types::BaseObject < GraphQL::Schema::Object\nend"
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
task :schema, [:schema_file] do |t, args|
|
96
|
-
schema_file = args.schema_file
|
97
|
-
load_upgraders
|
98
|
-
upgrader = GraphQL::Upgrader::Schema.new File.read(schema_file)
|
99
|
-
|
100
|
-
puts "- Transforming schema #{schema_file}"
|
101
|
-
File.open(schema_file, 'w') { |f| f.write upgrader.upgrade }
|
102
|
-
end
|
103
|
-
|
104
|
-
task :member, [:member_file] do |t, args|
|
105
|
-
member_file = args.member_file
|
106
|
-
load_upgraders
|
107
|
-
upgrader = GraphQL::Upgrader::Member.new File.read(member_file)
|
108
|
-
next unless upgrader.upgradeable?
|
109
|
-
|
110
|
-
puts "- Transforming member #{member_file}"
|
111
|
-
File.open(member_file, 'w') { |f| f.write upgrader.upgrade }
|
112
|
-
end
|
113
|
-
end
|
11
|
+
config.graphql = ActiveSupport::OrderedOptions.new
|
12
|
+
config.graphql.parser_cache = false
|
13
|
+
config.eager_load_namespaces << GraphQL
|
14
|
+
|
15
|
+
initializer("graphql.cache") do |app|
|
16
|
+
if config.graphql.parser_cache
|
17
|
+
Language::Parser.cache ||= Language::Cache.new(
|
18
|
+
app.root.join("tmp/cache/graphql")
|
19
|
+
)
|
114
20
|
end
|
115
21
|
end
|
116
22
|
end
|
@@ -15,7 +15,7 @@ module GraphQL
|
|
15
15
|
puts "Validating graphql-pro v#{version}"
|
16
16
|
puts " - Checking for graphql-pro credentials..."
|
17
17
|
|
18
|
-
creds = `bundle config gems.graphql.pro`[/[a-z0-9]{11}:[a-z0-9]{11}/]
|
18
|
+
creds = `bundle config gems.graphql.pro --parseable`[/[a-z0-9]{11}:[a-z0-9]{11}/]
|
19
19
|
if creds.nil?
|
20
20
|
puts " #{ex} failed, please set with `bundle config gems.graphql.pro $MY_CREDENTIALS`"
|
21
21
|
exit(1)
|
data/lib/graphql/rake_task.rb
CHANGED
@@ -1,5 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
require "fileutils"
|
3
|
+
require "rake"
|
3
4
|
require "graphql/rake_task/validate"
|
4
5
|
|
5
6
|
module GraphQL
|
@@ -8,8 +9,7 @@ module GraphQL
|
|
8
9
|
# By default, schemas are looked up by name as constants using `schema_name:`.
|
9
10
|
# You can provide a `load_schema` function to return your schema another way.
|
10
11
|
#
|
11
|
-
# `load_context
|
12
|
-
# you can keep an eye on how filters affect your schema.
|
12
|
+
# Use `load_context:` and `visible?` to dump schemas under certain visibility constraints.
|
13
13
|
#
|
14
14
|
# @example Dump a Schema to .graphql + .json files
|
15
15
|
# require "graphql/rake_task"
|
@@ -22,6 +22,10 @@ module GraphQL
|
|
22
22
|
# @example Invoking the task from Ruby
|
23
23
|
# require "rake"
|
24
24
|
# Rake::Task["graphql:schema:dump"].invoke
|
25
|
+
#
|
26
|
+
# @example Providing arguments to build the introspection query
|
27
|
+
# require "graphql/rake_task"
|
28
|
+
# GraphQL::RakeTask.new(schema_name: "MySchema", include_is_one_of: true)
|
25
29
|
class RakeTask
|
26
30
|
include Rake::DSL
|
27
31
|
|
@@ -31,11 +35,14 @@ module GraphQL
|
|
31
35
|
schema_name: nil,
|
32
36
|
load_schema: ->(task) { Object.const_get(task.schema_name) },
|
33
37
|
load_context: ->(task) { {} },
|
34
|
-
only: nil,
|
35
|
-
except: nil,
|
36
38
|
directory: ".",
|
37
39
|
idl_outfile: "schema.graphql",
|
38
40
|
json_outfile: "schema.json",
|
41
|
+
include_deprecated_args: true,
|
42
|
+
include_schema_description: false,
|
43
|
+
include_is_repeatable: false,
|
44
|
+
include_specified_by_url: false,
|
45
|
+
include_is_one_of: false
|
39
46
|
}
|
40
47
|
|
41
48
|
# @return [String] Namespace for generated tasks
|
@@ -58,12 +65,6 @@ module GraphQL
|
|
58
65
|
# @return [<#call(task)>] A callable for loading the query context
|
59
66
|
attr_accessor :load_context
|
60
67
|
|
61
|
-
# @return [<#call(member, ctx)>, nil] A filter for this task
|
62
|
-
attr_accessor :only
|
63
|
-
|
64
|
-
# @return [<#call(member, ctx)>, nil] A filter for this task
|
65
|
-
attr_accessor :except
|
66
|
-
|
67
68
|
# @return [String] target for IDL task
|
68
69
|
attr_accessor :idl_outfile
|
69
70
|
|
@@ -73,6 +74,10 @@ module GraphQL
|
|
73
74
|
# @return [String] directory for IDL & JSON files
|
74
75
|
attr_accessor :directory
|
75
76
|
|
77
|
+
# @return [Boolean] Options for additional fields in the introspection query JSON response
|
78
|
+
# @see GraphQL::Schema.as_json
|
79
|
+
attr_accessor :include_deprecated_args, :include_schema_description, :include_is_repeatable, :include_specified_by_url, :include_is_one_of
|
80
|
+
|
76
81
|
# Set the parameters of this task by passing keyword arguments
|
77
82
|
# or assigning attributes inside the block
|
78
83
|
def initialize(options = {})
|
@@ -95,7 +100,21 @@ module GraphQL
|
|
95
100
|
def write_outfile(method_name, file)
|
96
101
|
schema = @load_schema.call(self)
|
97
102
|
context = @load_context.call(self)
|
98
|
-
result =
|
103
|
+
result = case method_name
|
104
|
+
when :to_json
|
105
|
+
schema.to_json(
|
106
|
+
include_is_one_of: include_is_one_of,
|
107
|
+
include_deprecated_args: include_deprecated_args,
|
108
|
+
include_is_repeatable: include_is_repeatable,
|
109
|
+
include_specified_by_url: include_specified_by_url,
|
110
|
+
include_schema_description: include_schema_description,
|
111
|
+
context: context
|
112
|
+
)
|
113
|
+
when :to_definition
|
114
|
+
schema.to_definition(context: context)
|
115
|
+
else
|
116
|
+
raise ArgumentError, "Unexpected schema dump method: #{method_name.inspect}"
|
117
|
+
end
|
99
118
|
dir = File.dirname(file)
|
100
119
|
FileUtils.mkdir_p(dir)
|
101
120
|
if !result.end_with?("\n")
|
@@ -31,29 +31,18 @@ module GraphQL
|
|
31
31
|
|
32
32
|
# @param collection [Object] The list of items to wrap in a connection
|
33
33
|
# @param item [Object] The newly-added item (will be wrapped in `edge_class`)
|
34
|
+
# @param context [GraphQL::Query::Context] The surrounding `ctx`, will be passed to the connection
|
34
35
|
# @param parent [Object] The owner of `collection`, will be passed to the connection if provided
|
35
|
-
# @param context [GraphQL::Query::Context] The surrounding `ctx`, will be passed to the connection if provided (this is required for cursor encoders)
|
36
36
|
# @param edge_class [Class] The class to wrap `item` with (defaults to the connection's edge class)
|
37
|
-
def initialize(collection:, item:, parent: nil,
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
# The rest will be added by ConnectionExtension
|
45
|
-
@connection = conn_class.new(collection, parent: parent, context: context, edge_class: edge_class)
|
46
|
-
# Check if this connection supports it, to support old versions of GraphQL-Pro
|
47
|
-
@edge = if @connection.respond_to?(:range_add_edge)
|
48
|
-
@connection.range_add_edge(item)
|
49
|
-
else
|
50
|
-
@connection.edge_class.new(item, @connection)
|
51
|
-
end
|
37
|
+
def initialize(collection:, item:, context:, parent: nil, edge_class: nil)
|
38
|
+
conn_class = context.schema.connections.wrapper_for(collection)
|
39
|
+
# The rest will be added by ConnectionExtension
|
40
|
+
@connection = conn_class.new(collection, parent: parent, context: context, edge_class: edge_class)
|
41
|
+
# Check if this connection supports it, to support old versions of GraphQL-Pro
|
42
|
+
@edge = if @connection.respond_to?(:range_add_edge)
|
43
|
+
@connection.range_add_edge(item)
|
52
44
|
else
|
53
|
-
|
54
|
-
@connection = connection_class.new(collection, {}, parent: parent, context: context)
|
55
|
-
edge_class ||= Relay::Edge
|
56
|
-
@edge = edge_class.new(item, @connection)
|
45
|
+
@connection.edge_class.new(item, @connection)
|
57
46
|
end
|
58
47
|
|
59
48
|
@parent = parent
|
data/lib/graphql/relay.rb
CHANGED
@@ -1,18 +1,3 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require 'graphql/relay/page_info'
|
4
|
-
require 'graphql/relay/edge'
|
5
|
-
require 'graphql/relay/edge_type'
|
6
|
-
require 'graphql/relay/edges_instrumentation'
|
7
|
-
require 'graphql/relay/base_connection'
|
8
|
-
require 'graphql/relay/array_connection'
|
9
3
|
require 'graphql/relay/range_add'
|
10
|
-
require 'graphql/relay/relation_connection'
|
11
|
-
require 'graphql/relay/mongo_relation_connection'
|
12
|
-
require 'graphql/relay/global_id_resolve'
|
13
|
-
require 'graphql/relay/mutation'
|
14
|
-
require 'graphql/relay/node'
|
15
|
-
require 'graphql/relay/connection_instrumentation'
|
16
|
-
require 'graphql/relay/connection_resolve'
|
17
|
-
require 'graphql/relay/connection_type'
|
18
|
-
require 'graphql/relay/type_extensions'
|