lighthouse-graphql 0.1.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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +47 -0
- data/LICENSE.txt +21 -0
- data/README.md +134 -0
- data/docs/authorization.md +109 -0
- data/docs/best-practices.md +75 -0
- data/docs/configuration.md +70 -0
- data/docs/custom-directives.md +129 -0
- data/docs/directives.md +298 -0
- data/docs/federation.md +108 -0
- data/docs/filtering-and-ordering.md +128 -0
- data/docs/getting-started.md +152 -0
- data/docs/relationships.md +95 -0
- data/lib/lighthouse/config.rb +112 -0
- data/lib/lighthouse/contracts/arg_builder.rb +17 -0
- data/lib/lighthouse/contracts/arg_manipulator.rb +17 -0
- data/lib/lighthouse/contracts/directive.rb +17 -0
- data/lib/lighthouse/contracts/field_manipulator.rb +17 -0
- data/lib/lighthouse/contracts/field_middleware.rb +16 -0
- data/lib/lighthouse/contracts/field_resolver.rb +18 -0
- data/lib/lighthouse/dataloader_sources/association_loader.rb +25 -0
- data/lib/lighthouse/dataloader_sources/model_loader.rb +19 -0
- data/lib/lighthouse/directive_resolvers/aggregate_resolver.rb +86 -0
- data/lib/lighthouse/directive_resolvers/all_resolver.rb +73 -0
- data/lib/lighthouse/directive_resolvers/auth_resolver.rb +44 -0
- data/lib/lighthouse/directive_resolvers/base.rb +92 -0
- data/lib/lighthouse/directive_resolvers/belongs_to_many_resolver.rb +56 -0
- data/lib/lighthouse/directive_resolvers/belongs_to_resolver.rb +47 -0
- data/lib/lighthouse/directive_resolvers/builder_applier.rb +63 -0
- data/lib/lighthouse/directive_resolvers/can_resolver.rb +86 -0
- data/lib/lighthouse/directive_resolvers/count_resolver.rb +56 -0
- data/lib/lighthouse/directive_resolvers/field_resolver.rb +78 -0
- data/lib/lighthouse/directive_resolvers/find_resolver.rb +65 -0
- data/lib/lighthouse/directive_resolvers/first_resolver.rb +53 -0
- data/lib/lighthouse/directive_resolvers/guard_resolver.rb +32 -0
- data/lib/lighthouse/directive_resolvers/has_many_resolver.rb +109 -0
- data/lib/lighthouse/directive_resolvers/has_one_resolver.rb +43 -0
- data/lib/lighthouse/directive_resolvers/method_resolver.rb +35 -0
- data/lib/lighthouse/directive_resolvers/paginate_resolver.rb +147 -0
- data/lib/lighthouse/directive_resolvers/rename_resolver.rb +35 -0
- data/lib/lighthouse/directive_resolvers/resolution.rb +35 -0
- data/lib/lighthouse/directive_resolvers/where_conditions_applier.rb +169 -0
- data/lib/lighthouse/directives/arguments/base.rb +40 -0
- data/lib/lighthouse/directives/arguments/filters.rb +101 -0
- data/lib/lighthouse/directives/arguments/order_by.rb +48 -0
- data/lib/lighthouse/directives/registry.rb +168 -0
- data/lib/lighthouse/directives/relation_directive.rb +332 -0
- data/lib/lighthouse/directives/where_conditions_directive.rb +208 -0
- data/lib/lighthouse/graphql/version.rb +7 -0
- data/lib/lighthouse/graphql.rb +8 -0
- data/lib/lighthouse/rb_lighthouse.rb +88 -0
- data/lib/lighthouse/reference_resolver.rb +24 -0
- data/lib/lighthouse/schema_factory.rb +46 -0
- data/lib/lighthouse/schema_generator.rb +244 -0
- data/lib/lighthouse/schema_implementation.rb +119 -0
- data/lib/lighthouse/sdl_loader.rb +27 -0
- data/lib/lighthouse/support/authorization.rb +26 -0
- data/lib/lighthouse/support/directive_args.rb +33 -0
- data/lib/lighthouse/support/model_resolver.rb +61 -0
- data/lib/lighthouse/support/naming.rb +71 -0
- data/lib/lighthouse/where_conditions/operator_map.rb +35 -0
- data/lib/lighthouse-graphql.rb +10 -0
- metadata +195 -0
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Minimal SchemaImplementation used when the app doesn't provide one.
|
|
4
|
+
# It delegates runtime resolution to either:
|
|
5
|
+
# - singleton resolver methods attached to schema types (e.g. `Inbox.resolve_field_conversations`),
|
|
6
|
+
# - the field's resolve proc (if present),
|
|
7
|
+
# - or the object's method matching the field name.
|
|
8
|
+
class SchemaImplementation
|
|
9
|
+
attr_accessor :schema
|
|
10
|
+
|
|
11
|
+
def initialize
|
|
12
|
+
@schema = nil
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
# Called by graphql-ruby as the default resolver: (type, field, obj, args, ctx)
|
|
16
|
+
def call(type, field, obj, args, ctx)
|
|
17
|
+
field_name = extract_field_name(field)
|
|
18
|
+
|
|
19
|
+
# Prefer singleton resolver methods attached during post_process
|
|
20
|
+
owner_candidates = [type]
|
|
21
|
+
if type.respond_to?(:metadata) && type.metadata.is_a?(Hash) && type.metadata[:type_class]
|
|
22
|
+
owner_candidates << type.metadata[:type_class]
|
|
23
|
+
end
|
|
24
|
+
owner_candidates << lookup_owner_type(type)
|
|
25
|
+
|
|
26
|
+
resolver_method_name = "resolve_field_#{field_name}"
|
|
27
|
+
owner = owner_candidates.compact.find do |cand|
|
|
28
|
+
next false unless cand.respond_to?(resolver_method_name)
|
|
29
|
+
m = cand.method(resolver_method_name)
|
|
30
|
+
source_file, = m.source_location
|
|
31
|
+
source_file && source_file.include?('/lib/lighthouse/')
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
if owner
|
|
35
|
+
resolver = owner.method(resolver_method_name)
|
|
36
|
+
param_count = resolver.parameters.length
|
|
37
|
+
return resolver.call(obj, args) if param_count == 2
|
|
38
|
+
resolver.call(obj, args, ctx)
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
# Use field-level resolve proc if available
|
|
42
|
+
if field.respond_to?(:resolve_proc) && field.resolve_proc
|
|
43
|
+
return field.resolve_proc.call(obj, args, ctx)
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
if obj.is_a?(Hash)
|
|
47
|
+
return obj[field_name.to_s] if obj.key?(field_name.to_s)
|
|
48
|
+
return obj[field_name.to_sym] if obj.key?(field_name.to_sym)
|
|
49
|
+
|
|
50
|
+
snake = naming_attribute(field_name)
|
|
51
|
+
return obj[snake] if obj.key?(snake)
|
|
52
|
+
return obj[snake.to_sym] if obj.key?(snake.to_sym)
|
|
53
|
+
|
|
54
|
+
return nil
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
# Fallback to reading the attribute off the Ruby object. Map the GraphQL
|
|
58
|
+
# field name (camelCase) to the Rails attribute (snake_case) when the object
|
|
59
|
+
# does not respond to the literal name, so e.g. `customAttributes` resolves
|
|
60
|
+
# to `custom_attributes` without a per-field resolver.
|
|
61
|
+
return obj.public_send(field_name) if obj.respond_to?(field_name)
|
|
62
|
+
|
|
63
|
+
snake = naming_attribute(field_name)
|
|
64
|
+
return obj.public_send(snake) if snake != field_name.to_s && obj.respond_to?(snake)
|
|
65
|
+
|
|
66
|
+
nil
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def resolve_type(abstract_type, obj, ctx)
|
|
70
|
+
# Try to resolve to a Ruby type class under Types::<Name>Type
|
|
71
|
+
type_name = abstract_type.respond_to?(:name) ? abstract_type.name : abstract_type.to_s
|
|
72
|
+
begin
|
|
73
|
+
Object.const_get("Types::#{type_name}Type")
|
|
74
|
+
rescue StandardError
|
|
75
|
+
nil
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
def coerce_input(type, value, ctx)
|
|
80
|
+
value
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def coerce_result(type, value, ctx)
|
|
84
|
+
value
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
private
|
|
88
|
+
|
|
89
|
+
def naming_attribute(field_name)
|
|
90
|
+
if defined?(Lighthouse::Support::Naming)
|
|
91
|
+
Lighthouse::Support::Naming.attribute(field_name)
|
|
92
|
+
else
|
|
93
|
+
field_name.to_s.underscore
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
def extract_field_name(field)
|
|
98
|
+
if field.respond_to?(:graphql_name)
|
|
99
|
+
field.graphql_name.to_s
|
|
100
|
+
elsif field.respond_to?(:name)
|
|
101
|
+
field.name.to_s
|
|
102
|
+
else
|
|
103
|
+
field.to_s
|
|
104
|
+
end
|
|
105
|
+
end
|
|
106
|
+
|
|
107
|
+
def lookup_owner_type(type)
|
|
108
|
+
return nil unless @schema
|
|
109
|
+
type_name = if type.respond_to?(:graphql_name)
|
|
110
|
+
type.graphql_name
|
|
111
|
+
elsif type.respond_to?(:name)
|
|
112
|
+
type.name.to_s
|
|
113
|
+
else
|
|
114
|
+
type.to_s
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
@schema.types[type_name]
|
|
118
|
+
end
|
|
119
|
+
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lighthouse
|
|
4
|
+
module GraphQL
|
|
5
|
+
module SDLLoader
|
|
6
|
+
module_function
|
|
7
|
+
|
|
8
|
+
def load_from_folder(folder)
|
|
9
|
+
files = Dir[File.join(folder, '**', '*.graphql')].sort
|
|
10
|
+
if files.empty?
|
|
11
|
+
# fallback to the monolithic schema.graphql in apps/chatwoot
|
|
12
|
+
# schema.graphql is located at apps/chatwoot/schema.graphql
|
|
13
|
+
default = File.expand_path('../../..//schema.graphql', __dir__)
|
|
14
|
+
return File.read(default) if File.exist?(default)
|
|
15
|
+
return ''
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
files.map! { |f| File.read(f) }
|
|
19
|
+
files.join("\n\n")
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def load_from_file(path)
|
|
23
|
+
File.read(path)
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lighthouse
|
|
4
|
+
module Support
|
|
5
|
+
# Thin wrapper over the configurable authorization seams, used by the @guard
|
|
6
|
+
# and @can directives so they stay framework-agnostic.
|
|
7
|
+
module Authorization
|
|
8
|
+
module_function
|
|
9
|
+
|
|
10
|
+
def authenticated_user(context)
|
|
11
|
+
Lighthouse::Config.authenticated_user.call(context)
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
def authenticated?(context)
|
|
15
|
+
!authenticated_user(context).nil?
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
# Returns true/false for `ability` against `record` for the current policy
|
|
19
|
+
# user. Defaults to Pundit (see Config#authorizer).
|
|
20
|
+
def authorized?(context, record, ability)
|
|
21
|
+
user = Lighthouse::Config.policy_user.call(context)
|
|
22
|
+
Lighthouse::Config.authorizer.call(user, record, ability)
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lighthouse
|
|
4
|
+
module Support
|
|
5
|
+
# Extracts argument values from a GraphQL directive AST node, unwrapping the
|
|
6
|
+
# various value-node shapes (scalar literals, enums, lists) into plain Ruby
|
|
7
|
+
# values. Consolidates the repeated
|
|
8
|
+
# `arg.value.respond_to?(:value) ? arg.value.value : arg.value` pattern.
|
|
9
|
+
module DirectiveArgs
|
|
10
|
+
module_function
|
|
11
|
+
|
|
12
|
+
# Return the literal value of directive argument `name`, or nil.
|
|
13
|
+
def literal(directive_node, name)
|
|
14
|
+
return nil unless directive_node.respond_to?(:arguments)
|
|
15
|
+
|
|
16
|
+
arg = directive_node.arguments&.find { |a| a.name == name.to_s }
|
|
17
|
+
return nil unless arg
|
|
18
|
+
|
|
19
|
+
unwrap(arg.value)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def unwrap(value)
|
|
23
|
+
if value.respond_to?(:value)
|
|
24
|
+
value.value
|
|
25
|
+
elsif value.is_a?(Array)
|
|
26
|
+
value.map { |item| unwrap(item) }
|
|
27
|
+
else
|
|
28
|
+
value
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
end
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lighthouse
|
|
4
|
+
module Support
|
|
5
|
+
# Resolves a class name string (from a directive argument such as
|
|
6
|
+
# `@field(resolver: "Resolvers::ContactPerson")` or `@all(model: "Contact")`)
|
|
7
|
+
# into an actual constant.
|
|
8
|
+
#
|
|
9
|
+
# The list of namespaces to try is configurable via
|
|
10
|
+
# `Lighthouse::Config.resolver_namespaces`, so the library does not need to
|
|
11
|
+
# know any app-specific namespace. This is a key seam for extracting the
|
|
12
|
+
# library into a standalone gem.
|
|
13
|
+
module ModelResolver
|
|
14
|
+
module_function
|
|
15
|
+
|
|
16
|
+
DEFAULT_NAMESPACES = ['App::Graphql'].freeze
|
|
17
|
+
|
|
18
|
+
def namespaces
|
|
19
|
+
if defined?(Lighthouse::Config) &&
|
|
20
|
+
Lighthouse::Config.respond_to?(:resolver_namespaces) &&
|
|
21
|
+
Lighthouse::Config.resolver_namespaces
|
|
22
|
+
Array(Lighthouse::Config.resolver_namespaces)
|
|
23
|
+
else
|
|
24
|
+
DEFAULT_NAMESPACES
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def constantize(name)
|
|
29
|
+
return nil unless name
|
|
30
|
+
|
|
31
|
+
raw = name.to_s.strip
|
|
32
|
+
return nil if raw.empty?
|
|
33
|
+
|
|
34
|
+
candidates_for(raw).each do |candidate|
|
|
35
|
+
klass = try_constantize(candidate)
|
|
36
|
+
return klass if klass
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
nil
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def candidates_for(raw)
|
|
43
|
+
if raw.include?('::')
|
|
44
|
+
[raw]
|
|
45
|
+
else
|
|
46
|
+
namespaces.map { |ns| "#{ns}::#{raw}" } + [raw]
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def try_constantize(candidate)
|
|
51
|
+
ActiveSupport::Dependencies.constantize(candidate)
|
|
52
|
+
rescue NameError, LoadError
|
|
53
|
+
begin
|
|
54
|
+
Object.const_get(candidate)
|
|
55
|
+
rescue NameError
|
|
56
|
+
nil
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lighthouse
|
|
4
|
+
module Support
|
|
5
|
+
# Central rule for translating GraphQL (camelCase) names into Rails
|
|
6
|
+
# (snake_case) attributes/columns, and for tolerant argument lookup.
|
|
7
|
+
#
|
|
8
|
+
# This is the single home for casing logic; every directive/resolver that
|
|
9
|
+
# needs to map a GraphQL name to a model attribute or DB column routes here
|
|
10
|
+
# instead of re-implementing `.underscore` fallbacks.
|
|
11
|
+
module Naming
|
|
12
|
+
module_function
|
|
13
|
+
|
|
14
|
+
# GraphQL field name -> Rails attribute/method name.
|
|
15
|
+
# e.g. "customAttributes" -> "custom_attributes"
|
|
16
|
+
#
|
|
17
|
+
# This is the default field-reader rule and the basis for relation method
|
|
18
|
+
# name derivation. The `@rename(attribute:)` directive is the explicit
|
|
19
|
+
# override that bypasses this.
|
|
20
|
+
def attribute(graphql_name)
|
|
21
|
+
graphql_name.to_s.underscore
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
# Resolve a GraphQL "column" token (often an ALLCAPS enum key, or a raw
|
|
25
|
+
# string) to a usable column name.
|
|
26
|
+
#
|
|
27
|
+
# NOTE: kept behavior-compatible with the historical `resolve_column_name`
|
|
28
|
+
# so existing whereConditions queries are unaffected. Word-boundary
|
|
29
|
+
# recovery for enum keys is handled separately by generating column enums
|
|
30
|
+
# with explicit `@enum(value:)` mappings.
|
|
31
|
+
def column(graphql_name, _relation = nil)
|
|
32
|
+
name = graphql_name.to_s
|
|
33
|
+
name = name.downcase if name == name.upcase
|
|
34
|
+
name = name.tr('-', '_')
|
|
35
|
+
name = name.underscore if name.include?(' ')
|
|
36
|
+
name
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
# Fetch an argument value from a hash tolerant of camelCase/snake_case and
|
|
40
|
+
# string/symbol keys. Replaces the ad-hoc `args[:x] || args['x'] || ...`
|
|
41
|
+
# chains scattered across resolvers.
|
|
42
|
+
def fetch_arg(args_h, name)
|
|
43
|
+
return nil if args_h.nil?
|
|
44
|
+
|
|
45
|
+
candidate_keys(name).each do |key|
|
|
46
|
+
value = args_h[key]
|
|
47
|
+
return value unless value.nil?
|
|
48
|
+
end
|
|
49
|
+
nil
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
def candidate_keys(name)
|
|
53
|
+
raw = name.to_s
|
|
54
|
+
snake = raw.underscore
|
|
55
|
+
[raw.to_sym, raw, snake.to_sym, snake].uniq
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Derive an Eloquent-style relation name from a `has<Relation>` argument
|
|
59
|
+
# name, e.g. "hasContact" -> "contacts". Returns nil when the argument does
|
|
60
|
+
# not follow the `has` convention.
|
|
61
|
+
def derive_relation_name(arg_name)
|
|
62
|
+
return nil unless arg_name.to_s.match?(/^has/i)
|
|
63
|
+
|
|
64
|
+
trailing = arg_name.to_s.sub(/^has/i, '')
|
|
65
|
+
return nil if trailing.empty?
|
|
66
|
+
|
|
67
|
+
trailing.underscore.pluralize
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Lighthouse
|
|
4
|
+
module WhereConditions
|
|
5
|
+
# Maps the GraphQL SQLOperator enum values to Arel predicate methods.
|
|
6
|
+
# Extracted from WhereConditionsApplier so that simple argument-filter
|
|
7
|
+
# directives (@eq, @neq, @in, @notIn, @like, @where) can share the same
|
|
8
|
+
# operator semantics.
|
|
9
|
+
module OperatorMap
|
|
10
|
+
OPERATORS = {
|
|
11
|
+
'EQ' => :eq,
|
|
12
|
+
'NEQ' => :not_eq,
|
|
13
|
+
'GT' => :gt,
|
|
14
|
+
'GTE' => :gteq,
|
|
15
|
+
'LT' => :lt,
|
|
16
|
+
'LTE' => :lteq,
|
|
17
|
+
'IN' => :in,
|
|
18
|
+
'NIN' => :not_in,
|
|
19
|
+
'CONTAINS' => :matches,
|
|
20
|
+
'STARTS_WITH' => :matches,
|
|
21
|
+
'ENDS_WITH' => :matches,
|
|
22
|
+
'IS_NULL' => :eq,
|
|
23
|
+
'IS_NOT_NULL' => :not_eq
|
|
24
|
+
}.freeze
|
|
25
|
+
|
|
26
|
+
def self.[](operator)
|
|
27
|
+
OPERATORS[operator]
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def self.supported?(operator)
|
|
31
|
+
OPERATORS.key?(operator)
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
35
|
+
end
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# Canonical entrypoint for the `lighthouse-graphql` gem.
|
|
4
|
+
#
|
|
5
|
+
# require 'lighthouse-graphql'
|
|
6
|
+
#
|
|
7
|
+
# Lighthouse brings PHP Lighthouse's SDL-first, directive-driven approach to
|
|
8
|
+
# building GraphQL APIs to Ruby on Rails. See docs/ for the full guide.
|
|
9
|
+
require_relative 'lighthouse/graphql/version'
|
|
10
|
+
require_relative 'lighthouse/rb_lighthouse'
|
metadata
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: lighthouse-graphql
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Vaz Innovation
|
|
8
|
+
bindir: bin
|
|
9
|
+
cert_chain: []
|
|
10
|
+
date: 1980-01-02 00:00:00.000000000 Z
|
|
11
|
+
dependencies:
|
|
12
|
+
- !ruby/object:Gem::Dependency
|
|
13
|
+
name: activesupport
|
|
14
|
+
requirement: !ruby/object:Gem::Requirement
|
|
15
|
+
requirements:
|
|
16
|
+
- - ">="
|
|
17
|
+
- !ruby/object:Gem::Version
|
|
18
|
+
version: '6.0'
|
|
19
|
+
type: :runtime
|
|
20
|
+
prerelease: false
|
|
21
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
22
|
+
requirements:
|
|
23
|
+
- - ">="
|
|
24
|
+
- !ruby/object:Gem::Version
|
|
25
|
+
version: '6.0'
|
|
26
|
+
- !ruby/object:Gem::Dependency
|
|
27
|
+
name: graphql
|
|
28
|
+
requirement: !ruby/object:Gem::Requirement
|
|
29
|
+
requirements:
|
|
30
|
+
- - "~>"
|
|
31
|
+
- !ruby/object:Gem::Version
|
|
32
|
+
version: '2.5'
|
|
33
|
+
type: :runtime
|
|
34
|
+
prerelease: false
|
|
35
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
36
|
+
requirements:
|
|
37
|
+
- - "~>"
|
|
38
|
+
- !ruby/object:Gem::Version
|
|
39
|
+
version: '2.5'
|
|
40
|
+
- !ruby/object:Gem::Dependency
|
|
41
|
+
name: rspec
|
|
42
|
+
requirement: !ruby/object:Gem::Requirement
|
|
43
|
+
requirements:
|
|
44
|
+
- - "~>"
|
|
45
|
+
- !ruby/object:Gem::Version
|
|
46
|
+
version: '3.0'
|
|
47
|
+
type: :development
|
|
48
|
+
prerelease: false
|
|
49
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
50
|
+
requirements:
|
|
51
|
+
- - "~>"
|
|
52
|
+
- !ruby/object:Gem::Version
|
|
53
|
+
version: '3.0'
|
|
54
|
+
- !ruby/object:Gem::Dependency
|
|
55
|
+
name: activerecord
|
|
56
|
+
requirement: !ruby/object:Gem::Requirement
|
|
57
|
+
requirements:
|
|
58
|
+
- - ">="
|
|
59
|
+
- !ruby/object:Gem::Version
|
|
60
|
+
version: '6.0'
|
|
61
|
+
type: :development
|
|
62
|
+
prerelease: false
|
|
63
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
64
|
+
requirements:
|
|
65
|
+
- - ">="
|
|
66
|
+
- !ruby/object:Gem::Version
|
|
67
|
+
version: '6.0'
|
|
68
|
+
- !ruby/object:Gem::Dependency
|
|
69
|
+
name: sqlite3
|
|
70
|
+
requirement: !ruby/object:Gem::Requirement
|
|
71
|
+
requirements:
|
|
72
|
+
- - ">="
|
|
73
|
+
- !ruby/object:Gem::Version
|
|
74
|
+
version: '1.4'
|
|
75
|
+
type: :development
|
|
76
|
+
prerelease: false
|
|
77
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
78
|
+
requirements:
|
|
79
|
+
- - ">="
|
|
80
|
+
- !ruby/object:Gem::Version
|
|
81
|
+
version: '1.4'
|
|
82
|
+
- !ruby/object:Gem::Dependency
|
|
83
|
+
name: apollo-federation
|
|
84
|
+
requirement: !ruby/object:Gem::Requirement
|
|
85
|
+
requirements:
|
|
86
|
+
- - "~>"
|
|
87
|
+
- !ruby/object:Gem::Version
|
|
88
|
+
version: '3.0'
|
|
89
|
+
type: :development
|
|
90
|
+
prerelease: false
|
|
91
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
92
|
+
requirements:
|
|
93
|
+
- - "~>"
|
|
94
|
+
- !ruby/object:Gem::Version
|
|
95
|
+
version: '3.0'
|
|
96
|
+
description: |
|
|
97
|
+
Lighthouse lets you build a GraphQL API for your Rails app primarily through
|
|
98
|
+
schema (SDL) and server-side directives — @all, @find, @paginate, @hasMany,
|
|
99
|
+
@belongsTo, @whereConditions, @orderBy, @field, @auth and more — instead of
|
|
100
|
+
hand-writing a resolver for every field. It is a Ruby adaptation of the PHP
|
|
101
|
+
Lighthouse library (nuwave/lighthouse) built on top of graphql-ruby, with
|
|
102
|
+
first-class Apollo Federation support so a Rails service can act as a subgraph.
|
|
103
|
+
email:
|
|
104
|
+
- engineering@vazinnovation.com
|
|
105
|
+
executables: []
|
|
106
|
+
extensions: []
|
|
107
|
+
extra_rdoc_files: []
|
|
108
|
+
files:
|
|
109
|
+
- CHANGELOG.md
|
|
110
|
+
- LICENSE.txt
|
|
111
|
+
- README.md
|
|
112
|
+
- docs/authorization.md
|
|
113
|
+
- docs/best-practices.md
|
|
114
|
+
- docs/configuration.md
|
|
115
|
+
- docs/custom-directives.md
|
|
116
|
+
- docs/directives.md
|
|
117
|
+
- docs/federation.md
|
|
118
|
+
- docs/filtering-and-ordering.md
|
|
119
|
+
- docs/getting-started.md
|
|
120
|
+
- docs/relationships.md
|
|
121
|
+
- lib/lighthouse-graphql.rb
|
|
122
|
+
- lib/lighthouse/config.rb
|
|
123
|
+
- lib/lighthouse/contracts/arg_builder.rb
|
|
124
|
+
- lib/lighthouse/contracts/arg_manipulator.rb
|
|
125
|
+
- lib/lighthouse/contracts/directive.rb
|
|
126
|
+
- lib/lighthouse/contracts/field_manipulator.rb
|
|
127
|
+
- lib/lighthouse/contracts/field_middleware.rb
|
|
128
|
+
- lib/lighthouse/contracts/field_resolver.rb
|
|
129
|
+
- lib/lighthouse/dataloader_sources/association_loader.rb
|
|
130
|
+
- lib/lighthouse/dataloader_sources/model_loader.rb
|
|
131
|
+
- lib/lighthouse/directive_resolvers/aggregate_resolver.rb
|
|
132
|
+
- lib/lighthouse/directive_resolvers/all_resolver.rb
|
|
133
|
+
- lib/lighthouse/directive_resolvers/auth_resolver.rb
|
|
134
|
+
- lib/lighthouse/directive_resolvers/base.rb
|
|
135
|
+
- lib/lighthouse/directive_resolvers/belongs_to_many_resolver.rb
|
|
136
|
+
- lib/lighthouse/directive_resolvers/belongs_to_resolver.rb
|
|
137
|
+
- lib/lighthouse/directive_resolvers/builder_applier.rb
|
|
138
|
+
- lib/lighthouse/directive_resolvers/can_resolver.rb
|
|
139
|
+
- lib/lighthouse/directive_resolvers/count_resolver.rb
|
|
140
|
+
- lib/lighthouse/directive_resolvers/field_resolver.rb
|
|
141
|
+
- lib/lighthouse/directive_resolvers/find_resolver.rb
|
|
142
|
+
- lib/lighthouse/directive_resolvers/first_resolver.rb
|
|
143
|
+
- lib/lighthouse/directive_resolvers/guard_resolver.rb
|
|
144
|
+
- lib/lighthouse/directive_resolvers/has_many_resolver.rb
|
|
145
|
+
- lib/lighthouse/directive_resolvers/has_one_resolver.rb
|
|
146
|
+
- lib/lighthouse/directive_resolvers/method_resolver.rb
|
|
147
|
+
- lib/lighthouse/directive_resolvers/paginate_resolver.rb
|
|
148
|
+
- lib/lighthouse/directive_resolvers/rename_resolver.rb
|
|
149
|
+
- lib/lighthouse/directive_resolvers/resolution.rb
|
|
150
|
+
- lib/lighthouse/directive_resolvers/where_conditions_applier.rb
|
|
151
|
+
- lib/lighthouse/directives/arguments/base.rb
|
|
152
|
+
- lib/lighthouse/directives/arguments/filters.rb
|
|
153
|
+
- lib/lighthouse/directives/arguments/order_by.rb
|
|
154
|
+
- lib/lighthouse/directives/registry.rb
|
|
155
|
+
- lib/lighthouse/directives/relation_directive.rb
|
|
156
|
+
- lib/lighthouse/directives/where_conditions_directive.rb
|
|
157
|
+
- lib/lighthouse/graphql.rb
|
|
158
|
+
- lib/lighthouse/graphql/version.rb
|
|
159
|
+
- lib/lighthouse/rb_lighthouse.rb
|
|
160
|
+
- lib/lighthouse/reference_resolver.rb
|
|
161
|
+
- lib/lighthouse/schema_factory.rb
|
|
162
|
+
- lib/lighthouse/schema_generator.rb
|
|
163
|
+
- lib/lighthouse/schema_implementation.rb
|
|
164
|
+
- lib/lighthouse/sdl_loader.rb
|
|
165
|
+
- lib/lighthouse/support/authorization.rb
|
|
166
|
+
- lib/lighthouse/support/directive_args.rb
|
|
167
|
+
- lib/lighthouse/support/model_resolver.rb
|
|
168
|
+
- lib/lighthouse/support/naming.rb
|
|
169
|
+
- lib/lighthouse/where_conditions/operator_map.rb
|
|
170
|
+
homepage: https://github.com/Vaz-Innovation/lighthouse-graphql
|
|
171
|
+
licenses:
|
|
172
|
+
- MIT
|
|
173
|
+
metadata:
|
|
174
|
+
source_code_uri: https://github.com/Vaz-Innovation/lighthouse-graphql
|
|
175
|
+
changelog_uri: https://github.com/Vaz-Innovation/lighthouse-graphql/blob/main/CHANGELOG.md
|
|
176
|
+
documentation_uri: https://github.com/Vaz-Innovation/lighthouse-graphql/tree/main/docs
|
|
177
|
+
rubygems_mfa_required: 'true'
|
|
178
|
+
rdoc_options: []
|
|
179
|
+
require_paths:
|
|
180
|
+
- lib
|
|
181
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
182
|
+
requirements:
|
|
183
|
+
- - ">="
|
|
184
|
+
- !ruby/object:Gem::Version
|
|
185
|
+
version: '3.0'
|
|
186
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
187
|
+
requirements:
|
|
188
|
+
- - ">="
|
|
189
|
+
- !ruby/object:Gem::Version
|
|
190
|
+
version: '0'
|
|
191
|
+
requirements: []
|
|
192
|
+
rubygems_version: 3.6.7
|
|
193
|
+
specification_version: 4
|
|
194
|
+
summary: SDL-first, directive-driven GraphQL for Ruby on Rails — a port of PHP Lighthouse.
|
|
195
|
+
test_files: []
|