graphql 1.9.21 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of graphql might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/lib/generators/graphql/core.rb +21 -10
- data/lib/generators/graphql/enum_generator.rb +4 -10
- data/lib/generators/graphql/field_extractor.rb +31 -0
- data/lib/generators/graphql/input_generator.rb +50 -0
- data/lib/generators/graphql/install/mutation_root_generator.rb +34 -0
- data/lib/generators/graphql/{templates → install/templates}/base_mutation.erb +2 -0
- data/lib/generators/graphql/{templates → install/templates}/mutation_type.erb +2 -0
- data/lib/generators/graphql/install_generator.rb +44 -7
- data/lib/generators/graphql/interface_generator.rb +7 -7
- data/lib/generators/graphql/loader_generator.rb +1 -0
- data/lib/generators/graphql/mutation_create_generator.rb +22 -0
- data/lib/generators/graphql/mutation_delete_generator.rb +22 -0
- data/lib/generators/graphql/mutation_generator.rb +6 -30
- data/lib/generators/graphql/mutation_update_generator.rb +22 -0
- data/lib/generators/graphql/object_generator.rb +28 -12
- data/lib/generators/graphql/orm_mutations_base.rb +40 -0
- data/lib/generators/graphql/relay.rb +63 -0
- data/lib/generators/graphql/relay_generator.rb +21 -0
- data/lib/generators/graphql/scalar_generator.rb +4 -2
- data/lib/generators/graphql/templates/base_argument.erb +2 -0
- data/lib/generators/graphql/templates/base_connection.erb +8 -0
- data/lib/generators/graphql/templates/base_edge.erb +8 -0
- data/lib/generators/graphql/templates/base_enum.erb +2 -0
- data/lib/generators/graphql/templates/base_field.erb +2 -0
- data/lib/generators/graphql/templates/base_input_object.erb +2 -0
- data/lib/generators/graphql/templates/base_interface.erb +2 -0
- data/lib/generators/graphql/templates/base_object.erb +2 -0
- data/lib/generators/graphql/templates/base_scalar.erb +2 -0
- data/lib/generators/graphql/templates/base_union.erb +2 -0
- data/lib/generators/graphql/templates/enum.erb +7 -1
- data/lib/generators/graphql/templates/graphql_controller.erb +16 -12
- data/lib/generators/graphql/templates/input.erb +9 -0
- data/lib/generators/graphql/templates/interface.erb +6 -2
- data/lib/generators/graphql/templates/loader.erb +2 -0
- data/lib/generators/graphql/templates/mutation.erb +3 -1
- data/lib/generators/graphql/templates/mutation_create.erb +20 -0
- data/lib/generators/graphql/templates/mutation_delete.erb +20 -0
- data/lib/generators/graphql/templates/mutation_update.erb +21 -0
- data/lib/generators/graphql/templates/node_type.erb +9 -0
- data/lib/generators/graphql/templates/object.erb +7 -3
- data/lib/generators/graphql/templates/query_type.erb +3 -3
- data/lib/generators/graphql/templates/scalar.erb +5 -1
- data/lib/generators/graphql/templates/schema.erb +22 -27
- data/lib/generators/graphql/templates/union.erb +6 -2
- data/lib/generators/graphql/type_generator.rb +47 -10
- data/lib/generators/graphql/union_generator.rb +5 -5
- data/lib/graphql/analysis/ast/field_usage.rb +29 -2
- data/lib/graphql/analysis/ast/query_complexity.rb +175 -68
- data/lib/graphql/analysis/ast/query_depth.rb +0 -1
- data/lib/graphql/analysis/ast/visitor.rb +17 -8
- data/lib/graphql/analysis/ast.rb +14 -14
- data/lib/graphql/analysis.rb +0 -7
- data/lib/graphql/backtrace/inspect_result.rb +0 -1
- data/lib/graphql/backtrace/table.rb +37 -16
- data/lib/graphql/backtrace/traced_error.rb +0 -1
- data/lib/graphql/backtrace/tracer.rb +39 -9
- data/lib/graphql/backtrace.rb +20 -17
- data/lib/graphql/dataloader/null_dataloader.rb +22 -0
- data/lib/graphql/dataloader/request.rb +19 -0
- data/lib/graphql/dataloader/request_all.rb +19 -0
- data/lib/graphql/dataloader/source.rb +155 -0
- data/lib/graphql/dataloader.rb +308 -0
- data/lib/graphql/date_encoding_error.rb +16 -0
- data/lib/graphql/deprecation.rb +9 -0
- data/lib/graphql/dig.rb +1 -1
- data/lib/graphql/execution/directive_checks.rb +2 -2
- data/lib/graphql/execution/errors.rb +108 -14
- data/lib/graphql/execution/instrumentation.rb +1 -1
- data/lib/graphql/execution/interpreter/argument_value.rb +28 -0
- data/lib/graphql/execution/interpreter/arguments.rb +88 -0
- data/lib/graphql/execution/interpreter/arguments_cache.rb +105 -0
- data/lib/graphql/execution/interpreter/handles_raw_value.rb +18 -0
- data/lib/graphql/execution/interpreter/resolve.rb +37 -25
- data/lib/graphql/execution/interpreter/runtime.rb +715 -387
- data/lib/graphql/execution/interpreter.rb +32 -31
- data/lib/graphql/execution/lazy/lazy_method_map.rb +4 -0
- data/lib/graphql/execution/lazy.rb +5 -1
- data/lib/graphql/execution/lookahead.rb +32 -114
- data/lib/graphql/execution/multiplex.rb +60 -92
- data/lib/graphql/execution.rb +11 -3
- data/lib/graphql/filter.rb +1 -1
- data/lib/graphql/integer_decoding_error.rb +17 -0
- data/lib/graphql/integer_encoding_error.rb +18 -2
- data/lib/graphql/introspection/base_object.rb +2 -5
- data/lib/graphql/introspection/directive_location_enum.rb +2 -2
- data/lib/graphql/introspection/directive_type.rb +11 -5
- data/lib/graphql/introspection/dynamic_fields.rb +3 -8
- data/lib/graphql/introspection/entry_points.rb +5 -18
- data/lib/graphql/introspection/enum_value_type.rb +2 -2
- data/lib/graphql/introspection/field_type.rb +9 -5
- data/lib/graphql/introspection/input_value_type.rb +41 -11
- data/lib/graphql/introspection/introspection_query.rb +6 -92
- data/lib/graphql/introspection/schema_type.rb +10 -10
- data/lib/graphql/introspection/type_type.rb +27 -17
- data/lib/graphql/introspection.rb +99 -0
- data/lib/graphql/invalid_null_error.rb +18 -0
- data/lib/graphql/language/block_string.rb +20 -5
- data/lib/graphql/language/cache.rb +37 -0
- data/lib/graphql/language/definition_slice.rb +21 -10
- data/lib/graphql/language/document_from_schema_definition.rb +99 -63
- data/lib/graphql/language/lexer.rb +53 -27
- data/lib/graphql/language/lexer.rl +5 -3
- data/lib/graphql/language/nodes.rb +64 -93
- data/lib/graphql/language/parser.rb +929 -896
- data/lib/graphql/language/parser.y +125 -102
- data/lib/graphql/language/printer.rb +11 -2
- data/lib/graphql/language/sanitized_printer.rb +222 -0
- data/lib/graphql/language/token.rb +0 -4
- data/lib/graphql/language/visitor.rb +2 -2
- data/lib/graphql/language.rb +3 -1
- data/lib/graphql/name_validator.rb +2 -7
- data/lib/graphql/pagination/active_record_relation_connection.rb +85 -0
- data/lib/graphql/pagination/array_connection.rb +77 -0
- data/lib/graphql/pagination/connection.rb +226 -0
- data/lib/graphql/pagination/connections.rb +134 -0
- data/lib/graphql/pagination/mongoid_relation_connection.rb +25 -0
- data/lib/graphql/pagination/relation_connection.rb +226 -0
- data/lib/graphql/pagination/sequel_dataset_connection.rb +28 -0
- data/lib/graphql/pagination.rb +6 -0
- data/lib/graphql/parse_error.rb +0 -1
- data/lib/graphql/query/context.rb +51 -190
- data/lib/graphql/query/fingerprint.rb +26 -0
- data/lib/graphql/query/input_validation_result.rb +23 -6
- data/lib/graphql/query/literal_input.rb +26 -11
- data/lib/graphql/query/null_context.rb +24 -8
- data/lib/graphql/query/validation_pipeline.rb +12 -38
- data/lib/graphql/query/variable_validation_error.rb +2 -2
- data/lib/graphql/query/variables.rb +26 -9
- data/lib/graphql/query.rb +62 -32
- data/lib/graphql/railtie.rb +6 -102
- data/lib/graphql/rake_task/validate.rb +3 -0
- data/lib/graphql/rake_task.rb +12 -9
- data/lib/graphql/relay/range_add.rb +23 -9
- data/lib/graphql/relay.rb +0 -15
- data/lib/graphql/rubocop/graphql/base_cop.rb +36 -0
- data/lib/graphql/rubocop/graphql/default_null_true.rb +43 -0
- data/lib/graphql/rubocop/graphql/default_required_true.rb +43 -0
- data/lib/graphql/rubocop.rb +4 -0
- data/lib/graphql/schema/addition.rb +240 -0
- data/lib/graphql/schema/argument.rb +262 -28
- data/lib/graphql/schema/base_64_encoder.rb +2 -0
- data/lib/graphql/schema/build_from_definition/resolve_map/default_resolve.rb +1 -1
- data/lib/graphql/schema/build_from_definition/resolve_map.rb +13 -5
- data/lib/graphql/schema/build_from_definition.rb +319 -220
- data/lib/graphql/schema/built_in_types.rb +5 -5
- data/lib/graphql/schema/directive/deprecated.rb +18 -0
- data/lib/graphql/schema/directive/feature.rb +1 -1
- data/lib/graphql/schema/directive/flagged.rb +57 -0
- data/lib/graphql/schema/directive/include.rb +2 -2
- data/lib/graphql/schema/directive/skip.rb +2 -2
- data/lib/graphql/schema/directive/transform.rb +14 -2
- data/lib/graphql/schema/directive.rb +117 -14
- data/lib/graphql/schema/enum.rb +115 -22
- data/lib/graphql/schema/enum_value.rb +16 -21
- data/lib/graphql/schema/field/connection_extension.rb +46 -20
- data/lib/graphql/schema/field/scope_extension.rb +1 -1
- data/lib/graphql/schema/field.rb +376 -291
- data/lib/graphql/schema/field_extension.rb +89 -2
- data/lib/graphql/schema/find_inherited_value.rb +17 -1
- data/lib/graphql/schema/finder.rb +16 -14
- data/lib/graphql/schema/input_object.rb +147 -60
- data/lib/graphql/schema/interface.rb +28 -43
- data/lib/graphql/schema/introspection_system.rb +101 -38
- data/lib/graphql/schema/late_bound_type.rb +3 -2
- data/lib/graphql/schema/list.rb +46 -3
- data/lib/graphql/schema/loader.rb +144 -102
- data/lib/graphql/schema/member/base_dsl_methods.rb +33 -32
- data/lib/graphql/schema/member/build_type.rb +23 -14
- data/lib/graphql/schema/member/has_arguments.rb +212 -23
- data/lib/graphql/schema/member/has_ast_node.rb +20 -0
- data/lib/graphql/schema/member/has_deprecation_reason.rb +25 -0
- data/lib/graphql/schema/member/has_directives.rb +98 -0
- data/lib/graphql/schema/member/has_fields.rb +99 -34
- data/lib/graphql/schema/member/has_interfaces.rb +88 -0
- data/lib/graphql/schema/member/has_unresolved_type_error.rb +15 -0
- data/lib/graphql/schema/member/has_validators.rb +31 -0
- data/lib/graphql/schema/member/type_system_helpers.rb +3 -3
- data/lib/graphql/schema/member/validates_input.rb +33 -0
- data/lib/graphql/schema/member.rb +11 -6
- data/lib/graphql/schema/mutation.rb +4 -9
- data/lib/graphql/schema/non_null.rb +34 -4
- data/lib/graphql/schema/object.rb +38 -65
- data/lib/graphql/schema/printer.rb +16 -35
- data/lib/graphql/schema/relay_classic_mutation.rb +57 -32
- data/lib/graphql/schema/resolver/has_payload_type.rb +34 -4
- data/lib/graphql/schema/resolver.rb +133 -79
- data/lib/graphql/schema/scalar.rb +40 -15
- data/lib/graphql/schema/subscription.rb +57 -21
- data/lib/graphql/schema/timeout.rb +29 -15
- data/lib/graphql/schema/type_expression.rb +21 -13
- data/lib/graphql/schema/type_membership.rb +19 -5
- data/lib/graphql/schema/union.rb +39 -14
- data/lib/graphql/schema/unique_within_type.rb +1 -2
- data/lib/graphql/schema/validator/allow_blank_validator.rb +29 -0
- data/lib/graphql/schema/validator/allow_null_validator.rb +26 -0
- data/lib/graphql/schema/validator/exclusion_validator.rb +33 -0
- data/lib/graphql/schema/validator/format_validator.rb +48 -0
- data/lib/graphql/schema/validator/inclusion_validator.rb +35 -0
- data/lib/graphql/schema/validator/length_validator.rb +59 -0
- data/lib/graphql/schema/validator/numericality_validator.rb +82 -0
- data/lib/graphql/schema/validator/required_validator.rb +82 -0
- data/lib/graphql/schema/validator.rb +171 -0
- data/lib/graphql/schema/warden.rb +182 -32
- data/lib/graphql/schema/wrapper.rb +0 -5
- data/lib/graphql/schema.rb +687 -891
- data/lib/graphql/static_validation/all_rules.rb +2 -0
- data/lib/graphql/static_validation/base_visitor.rb +21 -31
- data/lib/graphql/static_validation/definition_dependencies.rb +0 -1
- data/lib/graphql/static_validation/error.rb +3 -1
- data/lib/graphql/static_validation/literal_validator.rb +51 -26
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible.rb +45 -83
- data/lib/graphql/static_validation/rules/argument_literals_are_compatible_error.rb +22 -6
- data/lib/graphql/static_validation/rules/arguments_are_defined.rb +35 -26
- data/lib/graphql/static_validation/rules/arguments_are_defined_error.rb +4 -2
- data/lib/graphql/static_validation/rules/directives_are_defined.rb +1 -1
- data/lib/graphql/static_validation/rules/directives_are_in_valid_locations.rb +14 -14
- data/lib/graphql/static_validation/rules/fields_are_defined_on_type.rb +4 -4
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +5 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +94 -51
- data/lib/graphql/static_validation/rules/fields_will_merge_error.rb +25 -4
- data/lib/graphql/static_validation/rules/fragment_spreads_are_possible.rb +3 -3
- data/lib/graphql/static_validation/rules/fragments_are_finite.rb +2 -2
- data/lib/graphql/static_validation/rules/input_object_names_are_unique.rb +30 -0
- data/lib/graphql/static_validation/rules/input_object_names_are_unique_error.rb +30 -0
- data/lib/graphql/static_validation/rules/query_root_exists.rb +17 -0
- data/lib/graphql/static_validation/rules/query_root_exists_error.rb +26 -0
- data/lib/graphql/static_validation/rules/required_arguments_are_present.rb +4 -2
- data/lib/graphql/static_validation/rules/required_input_object_attributes_are_present.rb +9 -10
- data/lib/graphql/static_validation/rules/unique_directives_per_location.rb +1 -1
- data/lib/graphql/static_validation/rules/variable_default_values_are_correctly_typed.rb +12 -13
- data/lib/graphql/static_validation/rules/variable_usages_are_allowed.rb +19 -14
- data/lib/graphql/static_validation/rules/variables_are_input_types.rb +1 -1
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +5 -3
- data/lib/graphql/static_validation/type_stack.rb +2 -2
- data/lib/graphql/static_validation/validation_context.rb +13 -3
- data/lib/graphql/static_validation/validation_timeout_error.rb +25 -0
- data/lib/graphql/static_validation/validator.rb +31 -19
- data/lib/graphql/static_validation.rb +1 -2
- data/lib/graphql/string_encoding_error.rb +13 -3
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +123 -22
- data/lib/graphql/subscriptions/broadcast_analyzer.rb +81 -0
- data/lib/graphql/subscriptions/default_subscription_resolve_extension.rb +58 -0
- data/lib/graphql/subscriptions/event.rb +85 -31
- data/lib/graphql/subscriptions/instrumentation.rb +0 -47
- data/lib/graphql/subscriptions/serialize.rb +53 -6
- data/lib/graphql/subscriptions.rb +111 -52
- data/lib/graphql/tracing/active_support_notifications_tracing.rb +8 -17
- data/lib/graphql/tracing/appoptics_tracing.rb +173 -0
- data/lib/graphql/tracing/appsignal_tracing.rb +23 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +14 -1
- data/lib/graphql/tracing/new_relic_tracing.rb +9 -12
- data/lib/graphql/tracing/notifications_tracing.rb +59 -0
- data/lib/graphql/tracing/platform_tracing.rb +57 -29
- data/lib/graphql/tracing/prometheus_tracing/graphql_collector.rb +4 -1
- data/lib/graphql/tracing/prometheus_tracing.rb +8 -0
- data/lib/graphql/tracing/scout_tracing.rb +19 -0
- data/lib/graphql/tracing/statsd_tracing.rb +42 -0
- data/lib/graphql/tracing.rb +15 -36
- data/lib/graphql/types/big_int.rb +5 -1
- data/lib/graphql/types/int.rb +10 -3
- data/lib/graphql/types/iso_8601_date.rb +16 -8
- data/lib/graphql/types/iso_8601_date_time.rb +32 -10
- data/lib/graphql/types/relay/base_connection.rb +6 -88
- data/lib/graphql/types/relay/base_edge.rb +2 -34
- data/lib/graphql/types/relay/connection_behaviors.rb +170 -0
- data/lib/graphql/types/relay/default_relay.rb +21 -0
- data/lib/graphql/types/relay/edge_behaviors.rb +64 -0
- data/lib/graphql/types/relay/has_node_field.rb +41 -0
- data/lib/graphql/types/relay/has_nodes_field.rb +41 -0
- data/lib/graphql/types/relay/node.rb +2 -4
- data/lib/graphql/types/relay/node_behaviors.rb +19 -0
- data/lib/graphql/types/relay/page_info.rb +2 -14
- data/lib/graphql/types/relay/page_info_behaviors.rb +25 -0
- data/lib/graphql/types/relay.rb +11 -5
- data/lib/graphql/types/string.rb +8 -2
- data/lib/graphql/unauthorized_error.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -2
- data/lib/graphql/version.rb +1 -1
- data/lib/graphql.rb +41 -58
- data/readme.md +3 -6
- metadata +97 -231
- data/lib/graphql/analysis/analyze_query.rb +0 -91
- data/lib/graphql/analysis/field_usage.rb +0 -45
- data/lib/graphql/analysis/max_query_complexity.rb +0 -26
- data/lib/graphql/analysis/max_query_depth.rb +0 -26
- data/lib/graphql/analysis/query_complexity.rb +0 -88
- data/lib/graphql/analysis/query_depth.rb +0 -43
- data/lib/graphql/analysis/reducer_state.rb +0 -48
- data/lib/graphql/argument.rb +0 -159
- data/lib/graphql/authorization.rb +0 -82
- data/lib/graphql/backwards_compatibility.rb +0 -60
- data/lib/graphql/base_type.rb +0 -226
- data/lib/graphql/boolean_type.rb +0 -2
- data/lib/graphql/compatibility/execution_specification/counter_schema.rb +0 -53
- data/lib/graphql/compatibility/execution_specification/specification_schema.rb +0 -200
- data/lib/graphql/compatibility/execution_specification.rb +0 -435
- data/lib/graphql/compatibility/lazy_execution_specification/lazy_schema.rb +0 -111
- data/lib/graphql/compatibility/lazy_execution_specification.rb +0 -213
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -91
- data/lib/graphql/compatibility/query_parser_specification/query_assertions.rb +0 -79
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -264
- data/lib/graphql/compatibility/schema_parser_specification.rb +0 -680
- data/lib/graphql/compatibility.rb +0 -5
- data/lib/graphql/define/assign_argument.rb +0 -12
- data/lib/graphql/define/assign_connection.rb +0 -13
- data/lib/graphql/define/assign_enum_value.rb +0 -18
- data/lib/graphql/define/assign_global_id_field.rb +0 -11
- data/lib/graphql/define/assign_mutation_function.rb +0 -34
- data/lib/graphql/define/assign_object_field.rb +0 -42
- data/lib/graphql/define/defined_object_proxy.rb +0 -53
- data/lib/graphql/define/instance_definable.rb +0 -311
- data/lib/graphql/define/no_definition_error.rb +0 -7
- data/lib/graphql/define/non_null_with_bang.rb +0 -16
- data/lib/graphql/define/type_definer.rb +0 -31
- data/lib/graphql/define.rb +0 -31
- data/lib/graphql/deprecated_dsl.rb +0 -42
- data/lib/graphql/directive/deprecated_directive.rb +0 -13
- data/lib/graphql/directive/include_directive.rb +0 -2
- data/lib/graphql/directive/skip_directive.rb +0 -2
- data/lib/graphql/directive.rb +0 -104
- data/lib/graphql/enum_type.rb +0 -193
- data/lib/graphql/execution/execute.rb +0 -326
- data/lib/graphql/execution/flatten.rb +0 -40
- data/lib/graphql/execution/interpreter/hash_response.rb +0 -46
- data/lib/graphql/execution/typecast.rb +0 -50
- data/lib/graphql/field/resolve.rb +0 -59
- data/lib/graphql/field.rb +0 -330
- data/lib/graphql/float_type.rb +0 -2
- data/lib/graphql/function.rb +0 -153
- data/lib/graphql/id_type.rb +0 -2
- data/lib/graphql/input_object_type.rb +0 -154
- data/lib/graphql/int_type.rb +0 -2
- data/lib/graphql/interface_type.rb +0 -86
- data/lib/graphql/internal_representation/document.rb +0 -27
- data/lib/graphql/internal_representation/node.rb +0 -206
- data/lib/graphql/internal_representation/print.rb +0 -51
- data/lib/graphql/internal_representation/rewrite.rb +0 -184
- data/lib/graphql/internal_representation/scope.rb +0 -88
- data/lib/graphql/internal_representation/visit.rb +0 -36
- data/lib/graphql/internal_representation.rb +0 -7
- data/lib/graphql/list_type.rb +0 -80
- data/lib/graphql/literal_validation_error.rb +0 -6
- data/lib/graphql/non_null_type.rb +0 -81
- data/lib/graphql/object_type.rb +0 -141
- data/lib/graphql/query/arguments.rb +0 -187
- data/lib/graphql/query/arguments_cache.rb +0 -25
- data/lib/graphql/query/executor.rb +0 -53
- data/lib/graphql/query/serial_execution/field_resolution.rb +0 -92
- data/lib/graphql/query/serial_execution/operation_resolution.rb +0 -19
- data/lib/graphql/query/serial_execution/selection_resolution.rb +0 -23
- data/lib/graphql/query/serial_execution/value_resolution.rb +0 -87
- data/lib/graphql/query/serial_execution.rb +0 -39
- data/lib/graphql/relay/array_connection.rb +0 -85
- data/lib/graphql/relay/base_connection.rb +0 -172
- data/lib/graphql/relay/connection_instrumentation.rb +0 -54
- data/lib/graphql/relay/connection_resolve.rb +0 -43
- data/lib/graphql/relay/connection_type.rb +0 -40
- data/lib/graphql/relay/edge.rb +0 -27
- data/lib/graphql/relay/edge_type.rb +0 -18
- data/lib/graphql/relay/edges_instrumentation.rb +0 -40
- data/lib/graphql/relay/global_id_resolve.rb +0 -18
- data/lib/graphql/relay/mongo_relation_connection.rb +0 -50
- data/lib/graphql/relay/mutation/instrumentation.rb +0 -23
- data/lib/graphql/relay/mutation/resolve.rb +0 -56
- data/lib/graphql/relay/mutation/result.rb +0 -38
- data/lib/graphql/relay/mutation.rb +0 -190
- data/lib/graphql/relay/node.rb +0 -36
- data/lib/graphql/relay/page_info.rb +0 -7
- data/lib/graphql/relay/relation_connection.rb +0 -190
- data/lib/graphql/relay/type_extensions.rb +0 -30
- data/lib/graphql/scalar_type.rb +0 -133
- data/lib/graphql/schema/catchall_middleware.rb +0 -35
- data/lib/graphql/schema/default_parse_error.rb +0 -10
- data/lib/graphql/schema/default_type_error.rb +0 -15
- data/lib/graphql/schema/member/accepts_definition.rb +0 -152
- data/lib/graphql/schema/member/cached_graphql_definition.rb +0 -26
- data/lib/graphql/schema/member/instrumentation.rb +0 -132
- data/lib/graphql/schema/middleware_chain.rb +0 -82
- data/lib/graphql/schema/possible_types.rb +0 -39
- data/lib/graphql/schema/rescue_middleware.rb +0 -60
- data/lib/graphql/schema/timeout_middleware.rb +0 -86
- data/lib/graphql/schema/traversal.rb +0 -228
- data/lib/graphql/schema/validation.rb +0 -303
- data/lib/graphql/static_validation/default_visitor.rb +0 -15
- data/lib/graphql/static_validation/no_validate_visitor.rb +0 -10
- data/lib/graphql/string_type.rb +0 -2
- data/lib/graphql/subscriptions/subscription_root.rb +0 -74
- data/lib/graphql/tracing/skylight_tracing.rb +0 -62
- data/lib/graphql/types/relay/base_field.rb +0 -22
- data/lib/graphql/types/relay/base_interface.rb +0 -29
- data/lib/graphql/types/relay/base_object.rb +0 -26
- data/lib/graphql/types/relay/node_field.rb +0 -43
- data/lib/graphql/types/relay/nodes_field.rb +0 -45
- data/lib/graphql/union_type.rb +0 -135
- data/lib/graphql/upgrader/member.rb +0 -936
- data/lib/graphql/upgrader/schema.rb +0 -37
@@ -1,184 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module InternalRepresentation
|
4
|
-
# While visiting an AST, build a normalized, flattened tree of {InternalRepresentation::Node}s.
|
5
|
-
#
|
6
|
-
# No unions or interfaces are present in this tree, only object types.
|
7
|
-
#
|
8
|
-
# Selections from the AST are attached to the object types they apply to.
|
9
|
-
#
|
10
|
-
# Inline fragments and fragment spreads are preserved in {InternalRepresentation::Node#ast_spreads},
|
11
|
-
# where they can be used to check for the presence of directives. This might not be sufficient
|
12
|
-
# for future directives, since the selections' grouping is lost.
|
13
|
-
#
|
14
|
-
# The rewritten query tree serves as the basis for the `FieldsWillMerge` validation.
|
15
|
-
#
|
16
|
-
module Rewrite
|
17
|
-
include GraphQL::Language
|
18
|
-
|
19
|
-
NO_DIRECTIVES = [].freeze
|
20
|
-
|
21
|
-
# @return InternalRepresentation::Document
|
22
|
-
attr_reader :rewrite_document
|
23
|
-
|
24
|
-
def initialize(*)
|
25
|
-
super
|
26
|
-
@query = context.query
|
27
|
-
@rewrite_document = InternalRepresentation::Document.new
|
28
|
-
# Hash<Nodes::FragmentSpread => Set<InternalRepresentation::Node>>
|
29
|
-
# A record of fragment spreads and the irep nodes that used them
|
30
|
-
@rewrite_spread_parents = Hash.new { |h, k| h[k] = Set.new }
|
31
|
-
# Hash<Nodes::FragmentSpread => Scope>
|
32
|
-
@rewrite_spread_scopes = {}
|
33
|
-
# Array<Set<InternalRepresentation::Node>>
|
34
|
-
# The current point of the irep_tree during visitation
|
35
|
-
@rewrite_nodes_stack = []
|
36
|
-
# Array<Scope>
|
37
|
-
@rewrite_scopes_stack = []
|
38
|
-
@rewrite_skip_nodes = Set.new
|
39
|
-
|
40
|
-
# Resolve fragment spreads.
|
41
|
-
# Fragment definitions got their own irep trees during visitation.
|
42
|
-
# Those nodes are spliced in verbatim (not copied), but this is OK
|
43
|
-
# because fragments are resolved from the "bottom up", each fragment
|
44
|
-
# can be shared between its usages.
|
45
|
-
context.on_dependency_resolve do |defn_ast_node, spread_ast_nodes, frag_ast_node|
|
46
|
-
frag_name = frag_ast_node.name
|
47
|
-
fragment_node = @rewrite_document.fragment_definitions[frag_name]
|
48
|
-
|
49
|
-
if fragment_node
|
50
|
-
spread_ast_nodes.each do |spread_ast_node|
|
51
|
-
parent_nodes = @rewrite_spread_parents[spread_ast_node]
|
52
|
-
parent_scope = @rewrite_spread_scopes[spread_ast_node]
|
53
|
-
parent_nodes.each do |parent_node|
|
54
|
-
parent_node.deep_merge_node(fragment_node, scope: parent_scope, merge_self: false)
|
55
|
-
end
|
56
|
-
end
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
# @return [Hash<String, Node>] Roots of this query
|
62
|
-
def operations
|
63
|
-
warn "#{self.class}#operations is deprecated; use `document.operation_definitions` instead"
|
64
|
-
@document.operation_definitions
|
65
|
-
end
|
66
|
-
|
67
|
-
def on_operation_definition(ast_node, parent)
|
68
|
-
push_root_node(ast_node, @rewrite_document.operation_definitions) { super }
|
69
|
-
end
|
70
|
-
|
71
|
-
def on_fragment_definition(ast_node, parent)
|
72
|
-
push_root_node(ast_node, @rewrite_document.fragment_definitions) { super }
|
73
|
-
end
|
74
|
-
|
75
|
-
def push_root_node(ast_node, definitions)
|
76
|
-
# Either QueryType or the fragment type condition
|
77
|
-
owner_type = context.type_definition
|
78
|
-
defn_name = ast_node.name
|
79
|
-
|
80
|
-
node = Node.new(
|
81
|
-
parent: nil,
|
82
|
-
name: defn_name,
|
83
|
-
owner_type: owner_type,
|
84
|
-
query: @query,
|
85
|
-
ast_nodes: [ast_node],
|
86
|
-
return_type: owner_type,
|
87
|
-
)
|
88
|
-
|
89
|
-
definitions[defn_name] = node
|
90
|
-
@rewrite_scopes_stack.push(Scope.new(@query, owner_type))
|
91
|
-
@rewrite_nodes_stack.push([node])
|
92
|
-
yield
|
93
|
-
@rewrite_nodes_stack.pop
|
94
|
-
@rewrite_scopes_stack.pop
|
95
|
-
end
|
96
|
-
|
97
|
-
def on_inline_fragment(node, parent)
|
98
|
-
# Inline fragments provide two things to the rewritten tree:
|
99
|
-
# - They _may_ narrow the scope by their type condition
|
100
|
-
# - They _may_ apply their directives to their children
|
101
|
-
if skip?(node)
|
102
|
-
@rewrite_skip_nodes.add(node)
|
103
|
-
end
|
104
|
-
|
105
|
-
if @rewrite_skip_nodes.empty?
|
106
|
-
@rewrite_scopes_stack.push(@rewrite_scopes_stack.last.enter(context.type_definition))
|
107
|
-
end
|
108
|
-
|
109
|
-
super
|
110
|
-
|
111
|
-
if @rewrite_skip_nodes.empty?
|
112
|
-
@rewrite_scopes_stack.pop
|
113
|
-
end
|
114
|
-
|
115
|
-
if @rewrite_skip_nodes.include?(node)
|
116
|
-
@rewrite_skip_nodes.delete(node)
|
117
|
-
end
|
118
|
-
end
|
119
|
-
|
120
|
-
def on_field(ast_node, ast_parent)
|
121
|
-
if skip?(ast_node)
|
122
|
-
@rewrite_skip_nodes.add(ast_node)
|
123
|
-
end
|
124
|
-
|
125
|
-
if @rewrite_skip_nodes.empty?
|
126
|
-
node_name = ast_node.alias || ast_node.name
|
127
|
-
parent_nodes = @rewrite_nodes_stack.last
|
128
|
-
next_nodes = []
|
129
|
-
|
130
|
-
field_defn = context.field_definition
|
131
|
-
if field_defn.nil?
|
132
|
-
# It's a non-existent field
|
133
|
-
new_scope = nil
|
134
|
-
else
|
135
|
-
field_return_type = field_defn.type
|
136
|
-
@rewrite_scopes_stack.last.each do |scope_type|
|
137
|
-
parent_nodes.each do |parent_node|
|
138
|
-
node = parent_node.scoped_children[scope_type][node_name] ||= Node.new(
|
139
|
-
parent: parent_node,
|
140
|
-
name: node_name,
|
141
|
-
owner_type: scope_type,
|
142
|
-
query: @query,
|
143
|
-
return_type: field_return_type,
|
144
|
-
)
|
145
|
-
node.ast_nodes << ast_node
|
146
|
-
node.definitions << field_defn
|
147
|
-
next_nodes << node
|
148
|
-
end
|
149
|
-
end
|
150
|
-
new_scope = Scope.new(@query, field_return_type.unwrap)
|
151
|
-
end
|
152
|
-
|
153
|
-
@rewrite_nodes_stack.push(next_nodes)
|
154
|
-
@rewrite_scopes_stack.push(new_scope)
|
155
|
-
end
|
156
|
-
|
157
|
-
super
|
158
|
-
|
159
|
-
if @rewrite_skip_nodes.empty?
|
160
|
-
@rewrite_nodes_stack.pop
|
161
|
-
@rewrite_scopes_stack.pop
|
162
|
-
end
|
163
|
-
|
164
|
-
if @rewrite_skip_nodes.include?(ast_node)
|
165
|
-
@rewrite_skip_nodes.delete(ast_node)
|
166
|
-
end
|
167
|
-
end
|
168
|
-
|
169
|
-
def on_fragment_spread(ast_node, ast_parent)
|
170
|
-
if @rewrite_skip_nodes.empty? && !skip?(ast_node)
|
171
|
-
# Register the irep nodes that depend on this AST node:
|
172
|
-
@rewrite_spread_parents[ast_node].merge(@rewrite_nodes_stack.last)
|
173
|
-
@rewrite_spread_scopes[ast_node] = @rewrite_scopes_stack.last
|
174
|
-
end
|
175
|
-
super
|
176
|
-
end
|
177
|
-
|
178
|
-
def skip?(ast_node)
|
179
|
-
dir = ast_node.directives
|
180
|
-
dir.any? && !GraphQL::Execution::DirectiveChecks.include?(dir, @query)
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
end
|
@@ -1,88 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module InternalRepresentation
|
4
|
-
# At a point in the AST, selections may apply to one or more types.
|
5
|
-
# {Scope} represents those types which selections may apply to.
|
6
|
-
#
|
7
|
-
# Scopes can be defined by:
|
8
|
-
#
|
9
|
-
# - A single concrete or abstract type
|
10
|
-
# - An array of types
|
11
|
-
# - `nil`
|
12
|
-
#
|
13
|
-
# The AST may be scoped to an array of types when two abstractly-typed
|
14
|
-
# fragments occur in inside one another.
|
15
|
-
class Scope
|
16
|
-
NO_TYPES = [].freeze
|
17
|
-
|
18
|
-
# @param query [GraphQL::Query]
|
19
|
-
# @param type_defn [GraphQL::BaseType, Array<GraphQL::BaseType>, nil]
|
20
|
-
def initialize(query, type_defn)
|
21
|
-
@query = query
|
22
|
-
@type = type_defn
|
23
|
-
@abstract_type = false
|
24
|
-
@types = case type_defn
|
25
|
-
when Array
|
26
|
-
type_defn
|
27
|
-
when GraphQL::BaseType
|
28
|
-
@abstract_type = true
|
29
|
-
nil
|
30
|
-
when nil
|
31
|
-
NO_TYPES
|
32
|
-
else
|
33
|
-
raise "Unexpected scope type: #{type_defn}"
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
# From a starting point of `self`, create a new scope by condition `other_type_defn`.
|
38
|
-
# @param other_type_defn [GraphQL::BaseType, nil]
|
39
|
-
# @return [Scope]
|
40
|
-
def enter(other_type_defn)
|
41
|
-
case other_type_defn
|
42
|
-
when nil
|
43
|
-
# The type wasn't found, who cares
|
44
|
-
Scope.new(@query, nil)
|
45
|
-
when @type
|
46
|
-
# The condition is the same as current, so reuse self
|
47
|
-
self
|
48
|
-
when GraphQL::UnionType, GraphQL::InterfaceType
|
49
|
-
# Make a new scope of the intersection between the previous & next conditions
|
50
|
-
new_types = @query.possible_types(other_type_defn) & concrete_types
|
51
|
-
Scope.new(@query, new_types)
|
52
|
-
when GraphQL::BaseType
|
53
|
-
# If this type is valid within the current scope,
|
54
|
-
# return a new scope of _exactly_ this type.
|
55
|
-
# Otherwise, this type is out-of-scope so the scope is null.
|
56
|
-
if concrete_types.include?(other_type_defn)
|
57
|
-
Scope.new(@query, other_type_defn)
|
58
|
-
else
|
59
|
-
Scope.new(@query, nil)
|
60
|
-
end
|
61
|
-
else
|
62
|
-
raise "Unexpected scope: #{other_type_defn.inspect}"
|
63
|
-
end
|
64
|
-
end
|
65
|
-
|
66
|
-
# Call the block for each type in `self`.
|
67
|
-
# This uses the simplest possible expression of `self`,
|
68
|
-
# so if this scope is defined by an abstract type, it gets yielded.
|
69
|
-
def each
|
70
|
-
if @abstract_type
|
71
|
-
yield(@type)
|
72
|
-
else
|
73
|
-
@types.each { |t| yield(t) }
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
private
|
78
|
-
|
79
|
-
def concrete_types
|
80
|
-
@concrete_types ||= if @abstract_type
|
81
|
-
@query.possible_types(@type)
|
82
|
-
else
|
83
|
-
@types
|
84
|
-
end
|
85
|
-
end
|
86
|
-
end
|
87
|
-
end
|
88
|
-
end
|
@@ -1,36 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
module InternalRepresentation
|
4
|
-
# Traverse a re-written query tree, calling handlers for each node
|
5
|
-
module Visit
|
6
|
-
module_function
|
7
|
-
def visit_each_node(operations, handlers)
|
8
|
-
return if handlers.empty?
|
9
|
-
# Post-validation: make some assertions about the rewritten query tree
|
10
|
-
operations.each do |op_name, op_node|
|
11
|
-
# Yield each node to listeners which were attached by validators
|
12
|
-
op_node.typed_children.each do |obj_type, children|
|
13
|
-
children.each do |name, op_child_node|
|
14
|
-
each_node(op_child_node) do |node|
|
15
|
-
for h in handlers
|
16
|
-
h.call(node)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
end
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
# Traverse a node in a rewritten query tree,
|
25
|
-
# visiting the node itself and each of its typed children.
|
26
|
-
def each_node(node)
|
27
|
-
yield(node)
|
28
|
-
node.typed_children.each do |obj_type, children|
|
29
|
-
children.each do |name, node|
|
30
|
-
each_node(node) { |n| yield(n) }
|
31
|
-
end
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|
35
|
-
end
|
36
|
-
end
|
@@ -1,7 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
require "graphql/internal_representation/document"
|
3
|
-
require "graphql/internal_representation/node"
|
4
|
-
require "graphql/internal_representation/print"
|
5
|
-
require "graphql/internal_representation/rewrite"
|
6
|
-
require "graphql/internal_representation/scope"
|
7
|
-
require "graphql/internal_representation/visit"
|
data/lib/graphql/list_type.rb
DELETED
@@ -1,80 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# A list type modifies another type.
|
4
|
-
#
|
5
|
-
# List types can be created with the type helper (`types[InnerType]`)
|
6
|
-
# or {BaseType#to_list_type} (`InnerType.to_list_type`)
|
7
|
-
#
|
8
|
-
# For return types, it says that the returned value will be a list of the modified.
|
9
|
-
#
|
10
|
-
# @example A field which returns a list of items
|
11
|
-
# field :items, types[ItemType]
|
12
|
-
# # or
|
13
|
-
# field :items, ItemType.to_list_type
|
14
|
-
#
|
15
|
-
# For input types, it says that the incoming value will be a list of the modified type.
|
16
|
-
#
|
17
|
-
# @example A field which accepts a list of strings
|
18
|
-
# field :newNames do
|
19
|
-
# # ...
|
20
|
-
# argument :values, types[types.String]
|
21
|
-
# # or
|
22
|
-
# argument :values, types.String.to_list_type
|
23
|
-
# end
|
24
|
-
#
|
25
|
-
# Given a list type, you can always get the underlying type with {#unwrap}.
|
26
|
-
#
|
27
|
-
class ListType < GraphQL::BaseType
|
28
|
-
include GraphQL::BaseType::ModifiesAnotherType
|
29
|
-
attr_reader :of_type
|
30
|
-
def initialize(of_type:)
|
31
|
-
super()
|
32
|
-
@of_type = of_type
|
33
|
-
end
|
34
|
-
|
35
|
-
def kind
|
36
|
-
GraphQL::TypeKinds::LIST
|
37
|
-
end
|
38
|
-
|
39
|
-
def to_s
|
40
|
-
"[#{of_type.to_s}]"
|
41
|
-
end
|
42
|
-
alias_method :inspect, :to_s
|
43
|
-
alias :to_type_signature :to_s
|
44
|
-
|
45
|
-
def coerce_result(value, ctx = nil)
|
46
|
-
if ctx.nil?
|
47
|
-
warn_deprecated_coerce("coerce_isolated_result")
|
48
|
-
ctx = GraphQL::Query::NullContext
|
49
|
-
end
|
50
|
-
ensure_array(value).map { |item| item.nil? ? nil : of_type.coerce_result(item, ctx) }
|
51
|
-
end
|
52
|
-
|
53
|
-
def list?
|
54
|
-
true
|
55
|
-
end
|
56
|
-
|
57
|
-
private
|
58
|
-
|
59
|
-
def coerce_non_null_input(value, ctx)
|
60
|
-
ensure_array(value).map { |item| of_type.coerce_input(item, ctx) }
|
61
|
-
end
|
62
|
-
|
63
|
-
def validate_non_null_input(value, ctx)
|
64
|
-
result = GraphQL::Query::InputValidationResult.new
|
65
|
-
|
66
|
-
ensure_array(value).each_with_index do |item, index|
|
67
|
-
item_result = of_type.validate_input(item, ctx)
|
68
|
-
if !item_result.valid?
|
69
|
-
result.merge_result!(index, item_result)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
result
|
74
|
-
end
|
75
|
-
|
76
|
-
def ensure_array(value)
|
77
|
-
value.is_a?(Array) ? value : [value]
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
@@ -1,81 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
class DoubleNonNullTypeError < GraphQL::Error
|
4
|
-
end
|
5
|
-
|
6
|
-
# A non-null type modifies another type.
|
7
|
-
#
|
8
|
-
# Non-null types can be created with `!` (`InnerType!`)
|
9
|
-
# or {BaseType#to_non_null_type} (`InnerType.to_non_null_type`)
|
10
|
-
#
|
11
|
-
# For return types, it says that the returned value will _always_ be present.
|
12
|
-
#
|
13
|
-
# @example A field which _always_ returns an error
|
14
|
-
# field :items, !ItemType
|
15
|
-
# # or
|
16
|
-
# field :items, ItemType.to_non_null_type
|
17
|
-
#
|
18
|
-
# (If the application fails to return a value, {InvalidNullError} will be passed to {Schema#type_error}.)
|
19
|
-
#
|
20
|
-
# For input types, it says that the incoming value _must_ be provided by the query.
|
21
|
-
#
|
22
|
-
# @example A field which _requires_ a string input
|
23
|
-
# field :newNames do
|
24
|
-
# # ...
|
25
|
-
# argument :values, !types.String
|
26
|
-
# # or
|
27
|
-
# argument :values, types.String.to_non_null_type
|
28
|
-
# end
|
29
|
-
#
|
30
|
-
# (If a value isn't provided, {Query::VariableValidationError} will be raised).
|
31
|
-
#
|
32
|
-
# Given a non-null type, you can always get the underlying type with {#unwrap}.
|
33
|
-
#
|
34
|
-
class NonNullType < GraphQL::BaseType
|
35
|
-
include GraphQL::BaseType::ModifiesAnotherType
|
36
|
-
extend Forwardable
|
37
|
-
|
38
|
-
attr_reader :of_type
|
39
|
-
def initialize(of_type:)
|
40
|
-
if of_type.is_a?(GraphQL::NonNullType)
|
41
|
-
raise(
|
42
|
-
DoubleNonNullTypeError,
|
43
|
-
"You tried to add a non-null constraint twice (!! instead of !)"
|
44
|
-
)
|
45
|
-
end
|
46
|
-
|
47
|
-
super()
|
48
|
-
@of_type = of_type
|
49
|
-
end
|
50
|
-
|
51
|
-
def valid_input?(value, ctx)
|
52
|
-
validate_input(value, ctx).valid?
|
53
|
-
end
|
54
|
-
|
55
|
-
def validate_input(value, ctx)
|
56
|
-
if value.nil?
|
57
|
-
result = GraphQL::Query::InputValidationResult.new
|
58
|
-
result.add_problem("Expected value to not be null")
|
59
|
-
result
|
60
|
-
else
|
61
|
-
of_type.validate_input(value, ctx)
|
62
|
-
end
|
63
|
-
end
|
64
|
-
|
65
|
-
def_delegators :@of_type, :coerce_input, :coerce_result, :list?
|
66
|
-
|
67
|
-
def kind
|
68
|
-
GraphQL::TypeKinds::NON_NULL
|
69
|
-
end
|
70
|
-
|
71
|
-
def to_s
|
72
|
-
"#{of_type.to_s}!"
|
73
|
-
end
|
74
|
-
alias_method :inspect, :to_s
|
75
|
-
alias :to_type_signature :to_s
|
76
|
-
|
77
|
-
def non_null?
|
78
|
-
true
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
data/lib/graphql/object_type.rb
DELETED
@@ -1,141 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
module GraphQL
|
3
|
-
# This type exposes fields on an object.
|
4
|
-
#
|
5
|
-
# @example defining a type for your IMDB clone
|
6
|
-
# MovieType = GraphQL::ObjectType.define do
|
7
|
-
# name "Movie"
|
8
|
-
# description "A full-length film or a short film"
|
9
|
-
# interfaces [ProductionInterface, DurationInterface]
|
10
|
-
#
|
11
|
-
# field :runtimeMinutes, !types.Int, property: :runtime_minutes
|
12
|
-
# field :director, PersonType
|
13
|
-
# field :cast, CastType
|
14
|
-
# field :starring, types[PersonType] do
|
15
|
-
# argument :limit, types.Int
|
16
|
-
# resolve ->(object, args, ctx) {
|
17
|
-
# stars = object.cast.stars
|
18
|
-
# args[:limit] && stars = stars.limit(args[:limit])
|
19
|
-
# stars
|
20
|
-
# }
|
21
|
-
# end
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
class ObjectType < GraphQL::BaseType
|
25
|
-
accepts_definitions :interfaces, :fields, :mutation, :relay_node_type, field: GraphQL::Define::AssignObjectField
|
26
|
-
accepts_definitions implements: ->(type, *interfaces, inherit: false) { type.implements(interfaces, inherit: inherit) }
|
27
|
-
|
28
|
-
attr_accessor :fields, :mutation, :relay_node_type
|
29
|
-
ensure_defined(:fields, :mutation, :interfaces, :relay_node_type)
|
30
|
-
|
31
|
-
# @!attribute fields
|
32
|
-
# @return [Hash<String => GraphQL::Field>] Map String fieldnames to their {GraphQL::Field} implementations
|
33
|
-
|
34
|
-
# @!attribute mutation
|
35
|
-
# @return [GraphQL::Relay::Mutation, nil] The mutation this object type was derived from, if it is an auto-generated payload type.
|
36
|
-
|
37
|
-
def initialize
|
38
|
-
super
|
39
|
-
@fields = {}
|
40
|
-
@interface_fields = {}
|
41
|
-
@dirty_interfaces = []
|
42
|
-
@dirty_inherited_interfaces = []
|
43
|
-
end
|
44
|
-
|
45
|
-
def initialize_copy(other)
|
46
|
-
super
|
47
|
-
@clean_interfaces = nil
|
48
|
-
@clean_inherited_interfaces = nil
|
49
|
-
@dirty_interfaces = other.dirty_interfaces.dup
|
50
|
-
@dirty_inherited_interfaces = other.dirty_inherited_interfaces.dup
|
51
|
-
@fields = other.fields.dup
|
52
|
-
end
|
53
|
-
|
54
|
-
# This method declares interfaces for this type AND inherits any field definitions
|
55
|
-
# @param new_interfaces [Array<GraphQL::Interface>] interfaces that this type implements
|
56
|
-
# @deprecated Use `implements` instead of `interfaces`.
|
57
|
-
def interfaces=(new_interfaces)
|
58
|
-
@clean_interfaces = nil
|
59
|
-
@clean_inherited_interfaces = nil
|
60
|
-
@clean_inherited_fields = nil
|
61
|
-
|
62
|
-
@dirty_inherited_interfaces = []
|
63
|
-
@dirty_inherited_fields = {}
|
64
|
-
implements(new_interfaces, inherit: true)
|
65
|
-
end
|
66
|
-
|
67
|
-
def interfaces
|
68
|
-
load_interfaces
|
69
|
-
@clean_interfaces
|
70
|
-
end
|
71
|
-
|
72
|
-
def kind
|
73
|
-
GraphQL::TypeKinds::OBJECT
|
74
|
-
end
|
75
|
-
|
76
|
-
# This fields doesnt have instrumenation applied
|
77
|
-
# @see [Schema#get_field] Get field with instrumentation
|
78
|
-
# @return [GraphQL::Field] The field definition for `field_name` (may be inherited from interfaces)
|
79
|
-
def get_field(field_name)
|
80
|
-
fields[field_name] || interface_fields[field_name]
|
81
|
-
end
|
82
|
-
|
83
|
-
# These fields don't have instrumenation applied
|
84
|
-
# @see [Schema#get_fields] Get fields with instrumentation
|
85
|
-
# @return [Array<GraphQL::Field>] All fields, including ones inherited from interfaces
|
86
|
-
def all_fields
|
87
|
-
interface_fields.merge(self.fields).values
|
88
|
-
end
|
89
|
-
|
90
|
-
# Declare that this object implements this interface.
|
91
|
-
# This declaration will be validated when the schema is defined.
|
92
|
-
# @param interfaces [Array<GraphQL::Interface>] add a new interface that this type implements
|
93
|
-
# @param inherits [Boolean] If true, copy the interfaces' field definitions to this type
|
94
|
-
def implements(interfaces, inherit: false)
|
95
|
-
if !interfaces.is_a?(Array)
|
96
|
-
raise ArgumentError, "`implements(interfaces)` must be an array, not #{interfaces.class} (#{interfaces})"
|
97
|
-
end
|
98
|
-
|
99
|
-
@clean_interfaces = nil
|
100
|
-
@clean_inherited_fields = nil
|
101
|
-
dirty_ifaces = inherit ? @dirty_inherited_interfaces : @dirty_interfaces
|
102
|
-
dirty_ifaces.concat(interfaces)
|
103
|
-
end
|
104
|
-
|
105
|
-
def resolve_type_proc
|
106
|
-
nil
|
107
|
-
end
|
108
|
-
|
109
|
-
protected
|
110
|
-
|
111
|
-
attr_reader :dirty_interfaces, :dirty_inherited_interfaces
|
112
|
-
|
113
|
-
private
|
114
|
-
|
115
|
-
def normalize_interfaces(ifaces)
|
116
|
-
ifaces.map { |i_type| GraphQL::BaseType.resolve_related_type(i_type) }
|
117
|
-
end
|
118
|
-
|
119
|
-
def interface_fields
|
120
|
-
load_interfaces
|
121
|
-
@clean_inherited_fields
|
122
|
-
end
|
123
|
-
|
124
|
-
def load_interfaces
|
125
|
-
@clean_interfaces ||= begin
|
126
|
-
ensure_defined
|
127
|
-
clean_ifaces = normalize_interfaces(@dirty_interfaces)
|
128
|
-
clean_inherited_ifaces = normalize_interfaces(@dirty_inherited_interfaces)
|
129
|
-
inherited_fields = {}
|
130
|
-
clean_inherited_ifaces.each do |iface|
|
131
|
-
# This will be found later in schema validation:
|
132
|
-
if iface.is_a?(GraphQL::InterfaceType)
|
133
|
-
inherited_fields.merge!(iface.fields)
|
134
|
-
end
|
135
|
-
end
|
136
|
-
@clean_inherited_fields = inherited_fields
|
137
|
-
clean_inherited_ifaces + clean_ifaces
|
138
|
-
end
|
139
|
-
end
|
140
|
-
end
|
141
|
-
end
|