rails-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/MIT-LICENSE +20 -0
- data/README.rdoc +19 -0
- data/Rakefile +31 -0
- data/ext/depend +3 -0
- data/ext/extconf.rb +57 -0
- data/ext/graphqlparser/Ast.cpp +346 -0
- data/ext/graphqlparser/Ast.h +1214 -0
- data/ext/graphqlparser/AstNode.h +36 -0
- data/ext/graphqlparser/AstVisitor.h +137 -0
- data/ext/graphqlparser/GraphQLParser.cpp +76 -0
- data/ext/graphqlparser/GraphQLParser.h +55 -0
- data/ext/graphqlparser/JsonVisitor.cpp +161 -0
- data/ext/graphqlparser/JsonVisitor.cpp.inc +456 -0
- data/ext/graphqlparser/JsonVisitor.h +121 -0
- data/ext/graphqlparser/JsonVisitor.h.inc +110 -0
- data/ext/graphqlparser/VERSION +1 -0
- data/ext/graphqlparser/c/GraphQLAst.cpp +324 -0
- data/ext/graphqlparser/c/GraphQLAst.h +180 -0
- data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +44 -0
- data/ext/graphqlparser/c/GraphQLAstNode.cpp +25 -0
- data/ext/graphqlparser/c/GraphQLAstNode.h +33 -0
- data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +21 -0
- data/ext/graphqlparser/c/GraphQLAstToJSON.h +24 -0
- data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +55 -0
- data/ext/graphqlparser/c/GraphQLAstVisitor.h +53 -0
- data/ext/graphqlparser/c/GraphQLParser.cpp +35 -0
- data/ext/graphqlparser/c/GraphQLParser.h +54 -0
- data/ext/graphqlparser/dump_json_ast.cpp +48 -0
- data/ext/graphqlparser/lexer.lpp +324 -0
- data/ext/graphqlparser/parser.ypp +693 -0
- data/ext/graphqlparser/parsergen/lexer.cpp +2633 -0
- data/ext/graphqlparser/parsergen/lexer.h +528 -0
- data/ext/graphqlparser/parsergen/location.hh +189 -0
- data/ext/graphqlparser/parsergen/parser.tab.cpp +3300 -0
- data/ext/graphqlparser/parsergen/parser.tab.hpp +646 -0
- data/ext/graphqlparser/parsergen/position.hh +179 -0
- data/ext/graphqlparser/parsergen/stack.hh +156 -0
- data/ext/graphqlparser/syntaxdefs.h +19 -0
- data/ext/libgraphqlparser/AstNode.h +36 -0
- data/ext/libgraphqlparser/CMakeLists.txt +148 -0
- data/ext/libgraphqlparser/CONTRIBUTING.md +23 -0
- data/ext/libgraphqlparser/GraphQLParser.cpp +76 -0
- data/ext/libgraphqlparser/GraphQLParser.h +55 -0
- data/ext/libgraphqlparser/JsonVisitor.cpp +161 -0
- data/ext/libgraphqlparser/JsonVisitor.h +121 -0
- data/ext/libgraphqlparser/LICENSE +22 -0
- data/ext/libgraphqlparser/README.clang-tidy +7 -0
- data/ext/libgraphqlparser/README.md +84 -0
- data/ext/libgraphqlparser/ast/ast.ast +203 -0
- data/ext/libgraphqlparser/ast/ast.py +61 -0
- data/ext/libgraphqlparser/ast/c.py +100 -0
- data/ext/libgraphqlparser/ast/c.pyc +0 -0
- data/ext/libgraphqlparser/ast/c_impl.py +61 -0
- data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/c_visitor_impl.py +39 -0
- data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/casing.py +26 -0
- data/ext/libgraphqlparser/ast/casing.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx.py +197 -0
- data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_impl.py +61 -0
- data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +42 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +80 -0
- data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
- data/ext/libgraphqlparser/ast/cxx_visitor.py +64 -0
- data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
- data/ext/libgraphqlparser/ast/js.py +65 -0
- data/ext/libgraphqlparser/ast/license.py +10 -0
- data/ext/libgraphqlparser/ast/license.pyc +0 -0
- data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +25 -0
- data/ext/libgraphqlparser/c/GraphQLAstNode.h +33 -0
- data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +21 -0
- data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +24 -0
- data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +55 -0
- data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +53 -0
- data/ext/libgraphqlparser/c/GraphQLParser.cpp +35 -0
- data/ext/libgraphqlparser/c/GraphQLParser.h +54 -0
- data/ext/libgraphqlparser/clang-tidy-all.sh +3 -0
- data/ext/libgraphqlparser/cmake/version.cmake +16 -0
- data/ext/libgraphqlparser/dump_json_ast.cpp +48 -0
- data/ext/libgraphqlparser/go/README.md +20 -0
- data/ext/libgraphqlparser/go/callbacks.go +18 -0
- data/ext/libgraphqlparser/go/gotest.go +64 -0
- data/ext/libgraphqlparser/lexer.lpp +324 -0
- data/ext/libgraphqlparser/libgraphqlparser.pc.in +11 -0
- data/ext/libgraphqlparser/parser.ypp +693 -0
- data/ext/libgraphqlparser/parsergen/lexer.cpp +2633 -0
- data/ext/libgraphqlparser/parsergen/lexer.h +528 -0
- data/ext/libgraphqlparser/parsergen/location.hh +189 -0
- data/ext/libgraphqlparser/parsergen/parser.tab.cpp +3300 -0
- data/ext/libgraphqlparser/parsergen/parser.tab.hpp +646 -0
- data/ext/libgraphqlparser/parsergen/position.hh +179 -0
- data/ext/libgraphqlparser/parsergen/stack.hh +156 -0
- data/ext/libgraphqlparser/python/CMakeLists.txt +14 -0
- data/ext/libgraphqlparser/python/README.md +5 -0
- data/ext/libgraphqlparser/python/example.py +31 -0
- data/ext/libgraphqlparser/syntaxdefs.h +19 -0
- data/ext/libgraphqlparser/test/BuildCAPI.c +5 -0
- data/ext/libgraphqlparser/test/CMakeLists.txt +25 -0
- data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +28 -0
- data/ext/libgraphqlparser/test/ParserTests.cpp +352 -0
- data/ext/libgraphqlparser/test/kitchen-sink.graphql +59 -0
- data/ext/libgraphqlparser/test/kitchen-sink.json +1 -0
- data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +78 -0
- data/ext/libgraphqlparser/test/schema-kitchen-sink.json +1 -0
- data/ext/libgraphqlparser/test/valgrind.supp +33 -0
- data/ext/version.cpp +21 -0
- data/lib/generators/graphql/controller_generator.rb +22 -0
- data/lib/generators/graphql/schema_generator.rb +22 -0
- data/lib/generators/graphql/templates/controller.erb +5 -0
- data/lib/generators/graphql/templates/schema.erb +6 -0
- data/lib/graphqlparser.so +0 -0
- data/lib/rails-graphql.rb +2 -0
- data/lib/rails/graphql.rake +1 -0
- data/lib/rails/graphql.rb +185 -0
- data/lib/rails/graphql/adapters/mysql_adapter.rb +0 -0
- data/lib/rails/graphql/adapters/pg_adapter.rb +50 -0
- data/lib/rails/graphql/adapters/sqlite_adapter.rb +39 -0
- data/lib/rails/graphql/argument.rb +220 -0
- data/lib/rails/graphql/callback.rb +124 -0
- data/lib/rails/graphql/collectors.rb +14 -0
- data/lib/rails/graphql/collectors/hash_collector.rb +83 -0
- data/lib/rails/graphql/collectors/idented_collector.rb +73 -0
- data/lib/rails/graphql/collectors/json_collector.rb +114 -0
- data/lib/rails/graphql/config.rb +61 -0
- data/lib/rails/graphql/directive.rb +203 -0
- data/lib/rails/graphql/directive/deprecated_directive.rb +59 -0
- data/lib/rails/graphql/directive/include_directive.rb +24 -0
- data/lib/rails/graphql/directive/skip_directive.rb +24 -0
- data/lib/rails/graphql/errors.rb +42 -0
- data/lib/rails/graphql/event.rb +141 -0
- data/lib/rails/graphql/field.rb +318 -0
- data/lib/rails/graphql/field/input_field.rb +92 -0
- data/lib/rails/graphql/field/mutation_field.rb +52 -0
- data/lib/rails/graphql/field/output_field.rb +96 -0
- data/lib/rails/graphql/field/proxied_field.rb +131 -0
- data/lib/rails/graphql/field/resolved_field.rb +96 -0
- data/lib/rails/graphql/field/scoped_config.rb +22 -0
- data/lib/rails/graphql/field/typed_field.rb +104 -0
- data/lib/rails/graphql/helpers.rb +40 -0
- data/lib/rails/graphql/helpers/attribute_delegator.rb +39 -0
- data/lib/rails/graphql/helpers/inherited_collection.rb +152 -0
- data/lib/rails/graphql/helpers/leaf_from_ar.rb +141 -0
- data/lib/rails/graphql/helpers/registerable.rb +103 -0
- data/lib/rails/graphql/helpers/with_arguments.rb +125 -0
- data/lib/rails/graphql/helpers/with_assignment.rb +113 -0
- data/lib/rails/graphql/helpers/with_callbacks.rb +55 -0
- data/lib/rails/graphql/helpers/with_directives.rb +126 -0
- data/lib/rails/graphql/helpers/with_events.rb +81 -0
- data/lib/rails/graphql/helpers/with_fields.rb +141 -0
- data/lib/rails/graphql/helpers/with_namespace.rb +40 -0
- data/lib/rails/graphql/helpers/with_owner.rb +35 -0
- data/lib/rails/graphql/helpers/with_schema_fields.rb +230 -0
- data/lib/rails/graphql/helpers/with_validator.rb +52 -0
- data/lib/rails/graphql/introspection.rb +53 -0
- data/lib/rails/graphql/native.rb +56 -0
- data/lib/rails/graphql/native/functions.rb +38 -0
- data/lib/rails/graphql/native/location.rb +41 -0
- data/lib/rails/graphql/native/pointers.rb +23 -0
- data/lib/rails/graphql/native/visitor.rb +349 -0
- data/lib/rails/graphql/railtie.rb +85 -0
- data/lib/rails/graphql/railties/base_generator.rb +35 -0
- data/lib/rails/graphql/railties/controller.rb +101 -0
- data/lib/rails/graphql/railties/controller_runtime.rb +40 -0
- data/lib/rails/graphql/railties/log_subscriber.rb +62 -0
- data/lib/rails/graphql/request.rb +343 -0
- data/lib/rails/graphql/request/arguments.rb +93 -0
- data/lib/rails/graphql/request/component.rb +100 -0
- data/lib/rails/graphql/request/component/field.rb +225 -0
- data/lib/rails/graphql/request/component/fragment.rb +118 -0
- data/lib/rails/graphql/request/component/operation.rb +178 -0
- data/lib/rails/graphql/request/component/operation/subscription.rb +16 -0
- data/lib/rails/graphql/request/component/spread.rb +119 -0
- data/lib/rails/graphql/request/component/typename.rb +82 -0
- data/lib/rails/graphql/request/context.rb +51 -0
- data/lib/rails/graphql/request/errors.rb +54 -0
- data/lib/rails/graphql/request/event.rb +112 -0
- data/lib/rails/graphql/request/helpers/directives.rb +64 -0
- data/lib/rails/graphql/request/helpers/selection_set.rb +87 -0
- data/lib/rails/graphql/request/helpers/value_writers.rb +115 -0
- data/lib/rails/graphql/request/steps/organizable.rb +146 -0
- data/lib/rails/graphql/request/steps/prepareable.rb +33 -0
- data/lib/rails/graphql/request/steps/resolveable.rb +32 -0
- data/lib/rails/graphql/request/strategy.rb +249 -0
- data/lib/rails/graphql/request/strategy/dynamic_instance.rb +41 -0
- data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +36 -0
- data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +28 -0
- data/lib/rails/graphql/schema.rb +272 -0
- data/lib/rails/graphql/shortcuts.rb +77 -0
- data/lib/rails/graphql/source.rb +371 -0
- data/lib/rails/graphql/source/active_record/builders.rb +154 -0
- data/lib/rails/graphql/source/active_record_source.rb +231 -0
- data/lib/rails/graphql/source/scoped_arguments.rb +87 -0
- data/lib/rails/graphql/to_gql.rb +368 -0
- data/lib/rails/graphql/type.rb +138 -0
- data/lib/rails/graphql/type/enum.rb +206 -0
- data/lib/rails/graphql/type/enum/directive_location_enum.rb +30 -0
- data/lib/rails/graphql/type/enum/type_kind_enum.rb +57 -0
- data/lib/rails/graphql/type/input.rb +134 -0
- data/lib/rails/graphql/type/interface.rb +82 -0
- data/lib/rails/graphql/type/object.rb +111 -0
- data/lib/rails/graphql/type/object/directive_object.rb +34 -0
- data/lib/rails/graphql/type/object/enum_value_object.rb +25 -0
- data/lib/rails/graphql/type/object/field_object.rb +54 -0
- data/lib/rails/graphql/type/object/input_value_object.rb +49 -0
- data/lib/rails/graphql/type/object/schema_object.rb +40 -0
- data/lib/rails/graphql/type/object/type_object.rb +136 -0
- data/lib/rails/graphql/type/scalar.rb +71 -0
- data/lib/rails/graphql/type/scalar/bigint_scalar.rb +34 -0
- data/lib/rails/graphql/type/scalar/binary_scalar.rb +30 -0
- data/lib/rails/graphql/type/scalar/boolean_scalar.rb +37 -0
- data/lib/rails/graphql/type/scalar/date_scalar.rb +34 -0
- data/lib/rails/graphql/type/scalar/date_time_scalar.rb +32 -0
- data/lib/rails/graphql/type/scalar/decimal_scalar.rb +35 -0
- data/lib/rails/graphql/type/scalar/float_scalar.rb +32 -0
- data/lib/rails/graphql/type/scalar/id_scalar.rb +39 -0
- data/lib/rails/graphql/type/scalar/int_scalar.rb +36 -0
- data/lib/rails/graphql/type/scalar/string_scalar.rb +28 -0
- data/lib/rails/graphql/type/scalar/time_scalar.rb +40 -0
- data/lib/rails/graphql/type/union.rb +87 -0
- data/lib/rails/graphql/type_map.rb +347 -0
- data/lib/rails/graphql/version.rb +7 -0
- data/test/assets/introspection-db.json +0 -0
- data/test/assets/introspection-mem.txt +1 -0
- data/test/assets/introspection.gql +91 -0
- data/test/assets/luke.jpg +0 -0
- data/test/assets/mem.gql +428 -0
- data/test/assets/sqlite.gql +423 -0
- data/test/config.rb +80 -0
- data/test/graphql/request/context_test.rb +70 -0
- data/test/graphql/schema_test.rb +190 -0
- data/test/graphql/source_test.rb +237 -0
- data/test/graphql/type/enum_test.rb +203 -0
- data/test/graphql/type/input_test.rb +138 -0
- data/test/graphql/type/interface_test.rb +72 -0
- data/test/graphql/type/object_test.rb +104 -0
- data/test/graphql/type/scalar/bigint_scalar_test.rb +42 -0
- data/test/graphql/type/scalar/binary_scalar_test.rb +17 -0
- data/test/graphql/type/scalar/boolean_scalar_test.rb +40 -0
- data/test/graphql/type/scalar/date_scalar_test.rb +29 -0
- data/test/graphql/type/scalar/date_time_scalar_test.rb +29 -0
- data/test/graphql/type/scalar/decimal_scalar_test.rb +28 -0
- data/test/graphql/type/scalar/float_scalar_test.rb +22 -0
- data/test/graphql/type/scalar/id_scalar_test.rb +26 -0
- data/test/graphql/type/scalar/int_scalar_test.rb +26 -0
- data/test/graphql/type/scalar/string_scalar_test.rb +17 -0
- data/test/graphql/type/scalar/time_scalar_test.rb +36 -0
- data/test/graphql/type/scalar_test.rb +45 -0
- data/test/graphql/type/union_test.rb +82 -0
- data/test/graphql/type_map_test.rb +362 -0
- data/test/graphql/type_test.rb +68 -0
- data/test/graphql_test.rb +55 -0
- data/test/integration/config.rb +56 -0
- data/test/integration/memory/star_wars_introspection_test.rb +144 -0
- data/test/integration/memory/star_wars_query_test.rb +184 -0
- data/test/integration/memory/star_wars_validation_test.rb +99 -0
- data/test/integration/schemas/memory.rb +232 -0
- data/test/integration/schemas/sqlite.rb +82 -0
- data/test/integration/sqlite/star_wars_introspection_test.rb +15 -0
- data/test/integration/sqlite/star_wars_mutation_test.rb +82 -0
- data/test/integration/sqlite/star_wars_query_test.rb +71 -0
- data/test/test_ext.rb +48 -0
- metadata +509 -0
@@ -0,0 +1,36 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2019-present, GraphQL Foundation
|
3
|
+
*
|
4
|
+
* This source code is licensed under the MIT license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#pragma once
|
9
|
+
|
10
|
+
#include "location.hh"
|
11
|
+
|
12
|
+
namespace facebook {
|
13
|
+
namespace graphql {
|
14
|
+
namespace ast {
|
15
|
+
|
16
|
+
namespace visitor {
|
17
|
+
class AstVisitor;
|
18
|
+
}
|
19
|
+
|
20
|
+
class Node {
|
21
|
+
yy::location location_;
|
22
|
+
public:
|
23
|
+
explicit Node(const yy::location &location)
|
24
|
+
: location_(location) {}
|
25
|
+
|
26
|
+
virtual ~Node() {}
|
27
|
+
|
28
|
+
const yy::location &getLocation() const
|
29
|
+
{ return location_; }
|
30
|
+
|
31
|
+
virtual void accept(visitor::AstVisitor *visitor) const = 0;
|
32
|
+
};
|
33
|
+
|
34
|
+
}
|
35
|
+
}
|
36
|
+
}
|
@@ -0,0 +1,137 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2019-present GraphQL Foundation
|
3
|
+
* This source code is licensed under the MIT license found in the
|
4
|
+
* LICENSE file in the root directory of this source tree.
|
5
|
+
*/
|
6
|
+
/** @generated */
|
7
|
+
|
8
|
+
#pragma once
|
9
|
+
|
10
|
+
#include "Ast.h"
|
11
|
+
|
12
|
+
namespace facebook {
|
13
|
+
namespace graphql {
|
14
|
+
namespace ast {
|
15
|
+
namespace visitor {
|
16
|
+
|
17
|
+
class AstVisitor {
|
18
|
+
public:
|
19
|
+
virtual ~AstVisitor() {}
|
20
|
+
|
21
|
+
virtual bool visitDocument(const Document &document) { return true; }
|
22
|
+
virtual void endVisitDocument(const Document &document) { }
|
23
|
+
|
24
|
+
virtual bool visitOperationDefinition(const OperationDefinition &operationDefinition) { return true; }
|
25
|
+
virtual void endVisitOperationDefinition(const OperationDefinition &operationDefinition) { }
|
26
|
+
|
27
|
+
virtual bool visitVariableDefinition(const VariableDefinition &variableDefinition) { return true; }
|
28
|
+
virtual void endVisitVariableDefinition(const VariableDefinition &variableDefinition) { }
|
29
|
+
|
30
|
+
virtual bool visitSelectionSet(const SelectionSet &selectionSet) { return true; }
|
31
|
+
virtual void endVisitSelectionSet(const SelectionSet &selectionSet) { }
|
32
|
+
|
33
|
+
virtual bool visitField(const Field &field) { return true; }
|
34
|
+
virtual void endVisitField(const Field &field) { }
|
35
|
+
|
36
|
+
virtual bool visitArgument(const Argument &argument) { return true; }
|
37
|
+
virtual void endVisitArgument(const Argument &argument) { }
|
38
|
+
|
39
|
+
virtual bool visitFragmentSpread(const FragmentSpread &fragmentSpread) { return true; }
|
40
|
+
virtual void endVisitFragmentSpread(const FragmentSpread &fragmentSpread) { }
|
41
|
+
|
42
|
+
virtual bool visitInlineFragment(const InlineFragment &inlineFragment) { return true; }
|
43
|
+
virtual void endVisitInlineFragment(const InlineFragment &inlineFragment) { }
|
44
|
+
|
45
|
+
virtual bool visitFragmentDefinition(const FragmentDefinition &fragmentDefinition) { return true; }
|
46
|
+
virtual void endVisitFragmentDefinition(const FragmentDefinition &fragmentDefinition) { }
|
47
|
+
|
48
|
+
virtual bool visitVariable(const Variable &variable) { return true; }
|
49
|
+
virtual void endVisitVariable(const Variable &variable) { }
|
50
|
+
|
51
|
+
virtual bool visitIntValue(const IntValue &intValue) { return true; }
|
52
|
+
virtual void endVisitIntValue(const IntValue &intValue) { }
|
53
|
+
|
54
|
+
virtual bool visitFloatValue(const FloatValue &floatValue) { return true; }
|
55
|
+
virtual void endVisitFloatValue(const FloatValue &floatValue) { }
|
56
|
+
|
57
|
+
virtual bool visitStringValue(const StringValue &stringValue) { return true; }
|
58
|
+
virtual void endVisitStringValue(const StringValue &stringValue) { }
|
59
|
+
|
60
|
+
virtual bool visitBooleanValue(const BooleanValue &booleanValue) { return true; }
|
61
|
+
virtual void endVisitBooleanValue(const BooleanValue &booleanValue) { }
|
62
|
+
|
63
|
+
virtual bool visitNullValue(const NullValue &nullValue) { return true; }
|
64
|
+
virtual void endVisitNullValue(const NullValue &nullValue) { }
|
65
|
+
|
66
|
+
virtual bool visitEnumValue(const EnumValue &enumValue) { return true; }
|
67
|
+
virtual void endVisitEnumValue(const EnumValue &enumValue) { }
|
68
|
+
|
69
|
+
virtual bool visitListValue(const ListValue &listValue) { return true; }
|
70
|
+
virtual void endVisitListValue(const ListValue &listValue) { }
|
71
|
+
|
72
|
+
virtual bool visitObjectValue(const ObjectValue &objectValue) { return true; }
|
73
|
+
virtual void endVisitObjectValue(const ObjectValue &objectValue) { }
|
74
|
+
|
75
|
+
virtual bool visitObjectField(const ObjectField &objectField) { return true; }
|
76
|
+
virtual void endVisitObjectField(const ObjectField &objectField) { }
|
77
|
+
|
78
|
+
virtual bool visitDirective(const Directive &directive) { return true; }
|
79
|
+
virtual void endVisitDirective(const Directive &directive) { }
|
80
|
+
|
81
|
+
virtual bool visitNamedType(const NamedType &namedType) { return true; }
|
82
|
+
virtual void endVisitNamedType(const NamedType &namedType) { }
|
83
|
+
|
84
|
+
virtual bool visitListType(const ListType &listType) { return true; }
|
85
|
+
virtual void endVisitListType(const ListType &listType) { }
|
86
|
+
|
87
|
+
virtual bool visitNonNullType(const NonNullType &nonNullType) { return true; }
|
88
|
+
virtual void endVisitNonNullType(const NonNullType &nonNullType) { }
|
89
|
+
|
90
|
+
virtual bool visitName(const Name &name) { return true; }
|
91
|
+
virtual void endVisitName(const Name &name) { }
|
92
|
+
|
93
|
+
virtual bool visitSchemaDefinition(const SchemaDefinition &schemaDefinition) { return true; }
|
94
|
+
virtual void endVisitSchemaDefinition(const SchemaDefinition &schemaDefinition) { }
|
95
|
+
|
96
|
+
virtual bool visitOperationTypeDefinition(const OperationTypeDefinition &operationTypeDefinition) { return true; }
|
97
|
+
virtual void endVisitOperationTypeDefinition(const OperationTypeDefinition &operationTypeDefinition) { }
|
98
|
+
|
99
|
+
virtual bool visitScalarTypeDefinition(const ScalarTypeDefinition &scalarTypeDefinition) { return true; }
|
100
|
+
virtual void endVisitScalarTypeDefinition(const ScalarTypeDefinition &scalarTypeDefinition) { }
|
101
|
+
|
102
|
+
virtual bool visitObjectTypeDefinition(const ObjectTypeDefinition &objectTypeDefinition) { return true; }
|
103
|
+
virtual void endVisitObjectTypeDefinition(const ObjectTypeDefinition &objectTypeDefinition) { }
|
104
|
+
|
105
|
+
virtual bool visitFieldDefinition(const FieldDefinition &fieldDefinition) { return true; }
|
106
|
+
virtual void endVisitFieldDefinition(const FieldDefinition &fieldDefinition) { }
|
107
|
+
|
108
|
+
virtual bool visitInputValueDefinition(const InputValueDefinition &inputValueDefinition) { return true; }
|
109
|
+
virtual void endVisitInputValueDefinition(const InputValueDefinition &inputValueDefinition) { }
|
110
|
+
|
111
|
+
virtual bool visitInterfaceTypeDefinition(const InterfaceTypeDefinition &interfaceTypeDefinition) { return true; }
|
112
|
+
virtual void endVisitInterfaceTypeDefinition(const InterfaceTypeDefinition &interfaceTypeDefinition) { }
|
113
|
+
|
114
|
+
virtual bool visitUnionTypeDefinition(const UnionTypeDefinition &unionTypeDefinition) { return true; }
|
115
|
+
virtual void endVisitUnionTypeDefinition(const UnionTypeDefinition &unionTypeDefinition) { }
|
116
|
+
|
117
|
+
virtual bool visitEnumTypeDefinition(const EnumTypeDefinition &enumTypeDefinition) { return true; }
|
118
|
+
virtual void endVisitEnumTypeDefinition(const EnumTypeDefinition &enumTypeDefinition) { }
|
119
|
+
|
120
|
+
virtual bool visitEnumValueDefinition(const EnumValueDefinition &enumValueDefinition) { return true; }
|
121
|
+
virtual void endVisitEnumValueDefinition(const EnumValueDefinition &enumValueDefinition) { }
|
122
|
+
|
123
|
+
virtual bool visitInputObjectTypeDefinition(const InputObjectTypeDefinition &inputObjectTypeDefinition) { return true; }
|
124
|
+
virtual void endVisitInputObjectTypeDefinition(const InputObjectTypeDefinition &inputObjectTypeDefinition) { }
|
125
|
+
|
126
|
+
virtual bool visitTypeExtensionDefinition(const TypeExtensionDefinition &typeExtensionDefinition) { return true; }
|
127
|
+
virtual void endVisitTypeExtensionDefinition(const TypeExtensionDefinition &typeExtensionDefinition) { }
|
128
|
+
|
129
|
+
virtual bool visitDirectiveDefinition(const DirectiveDefinition &directiveDefinition) { return true; }
|
130
|
+
virtual void endVisitDirectiveDefinition(const DirectiveDefinition &directiveDefinition) { }
|
131
|
+
|
132
|
+
};
|
133
|
+
|
134
|
+
}
|
135
|
+
}
|
136
|
+
}
|
137
|
+
}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2019-present, GraphQL Foundation
|
3
|
+
*
|
4
|
+
* This source code is licensed under the MIT license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "GraphQLParser.h"
|
9
|
+
|
10
|
+
#include "AstNode.h"
|
11
|
+
|
12
|
+
#include "parser.tab.hpp"
|
13
|
+
#include "lexer.h"
|
14
|
+
#include "syntaxdefs.h"
|
15
|
+
|
16
|
+
namespace facebook {
|
17
|
+
namespace graphql {
|
18
|
+
|
19
|
+
// Given properly-configured yylex, run the parser and return the
|
20
|
+
// result.
|
21
|
+
static std::unique_ptr<ast::Node> doParse(const char **outError, yyscan_t scanner, bool enableSchema) {
|
22
|
+
Node *outAST = nullptr;
|
23
|
+
yy::GraphQLParserImpl parser(enableSchema, &outAST, outError, scanner);
|
24
|
+
int failure = parser.parse();
|
25
|
+
if (failure) {
|
26
|
+
delete outAST;
|
27
|
+
}
|
28
|
+
return !failure ? std::unique_ptr<ast::Node>(outAST) : nullptr;
|
29
|
+
}
|
30
|
+
|
31
|
+
static std::unique_ptr<ast::Node> parseStringImpl(const char *text, const char **error, bool enableSchema) {
|
32
|
+
yyscan_t scanner;
|
33
|
+
struct LexerExtra extra;
|
34
|
+
yylex_init_extra(&extra, &scanner);
|
35
|
+
YY_BUFFER_STATE buffer = yy_scan_string(text, scanner);
|
36
|
+
yy_switch_to_buffer(buffer, scanner);
|
37
|
+
|
38
|
+
auto result = doParse(error, scanner, enableSchema);
|
39
|
+
yylex_destroy(scanner);
|
40
|
+
return result;
|
41
|
+
}
|
42
|
+
|
43
|
+
std::unique_ptr<ast::Node> parseString(const char *text, const char **error) {
|
44
|
+
return parseStringImpl(text, error, false);
|
45
|
+
}
|
46
|
+
|
47
|
+
std::unique_ptr<ast::Node> parseStringWithExperimentalSchemaSupport(
|
48
|
+
const char *text, const char **error) {
|
49
|
+
return parseStringImpl(text, error, true);
|
50
|
+
}
|
51
|
+
|
52
|
+
static std::unique_ptr<ast::Node> parseFileImpl(
|
53
|
+
FILE *file, const char **error, bool enableSchema) {
|
54
|
+
yyscan_t scanner;
|
55
|
+
struct LexerExtra extra;
|
56
|
+
yylex_init_extra(&extra, &scanner);
|
57
|
+
yyset_in(file, scanner);
|
58
|
+
|
59
|
+
auto result = doParse(error, scanner, enableSchema);
|
60
|
+
yylex_destroy(scanner);
|
61
|
+
|
62
|
+
return result;
|
63
|
+
}
|
64
|
+
|
65
|
+
std::unique_ptr<ast::Node> parseFile(FILE *file, const char **error) {
|
66
|
+
return parseFileImpl(file, error, false);
|
67
|
+
}
|
68
|
+
|
69
|
+
std::unique_ptr<ast::Node> parseFileWithExperimentalSchemaSupport(
|
70
|
+
FILE *file, const char **error) {
|
71
|
+
return parseFileImpl(file, error, true);
|
72
|
+
}
|
73
|
+
|
74
|
+
|
75
|
+
} // namespace graphql
|
76
|
+
} // namespace facebook
|
@@ -0,0 +1,55 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2019-present, GraphQL Foundation
|
3
|
+
*
|
4
|
+
* This source code is licensed under the MIT license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
/**
|
9
|
+
* The purpose of this file is to provide a nice interface to parsing
|
10
|
+
* GraphQL, rather than the old-fashioned interface provided by bison
|
11
|
+
* and flex.
|
12
|
+
*/
|
13
|
+
|
14
|
+
#pragma once
|
15
|
+
|
16
|
+
#include <memory>
|
17
|
+
#include <stdio.h>
|
18
|
+
|
19
|
+
namespace facebook {
|
20
|
+
namespace graphql {
|
21
|
+
|
22
|
+
namespace ast {
|
23
|
+
class Node;
|
24
|
+
}
|
25
|
+
|
26
|
+
/**
|
27
|
+
* Parse the given GraphQL source string, returning an AST. Returns
|
28
|
+
* nullptr on error and, if error is not null, places a string
|
29
|
+
* describing what went wrong in error that must be freed with free(3).
|
30
|
+
*/
|
31
|
+
std::unique_ptr<ast::Node> parseString(const char *text, const char **error);
|
32
|
+
|
33
|
+
/**
|
34
|
+
* Like parseString, but enables support for the experimental type
|
35
|
+
* definition syntax from https://github.com/facebook/graphql/pull/90 .
|
36
|
+
*/
|
37
|
+
std::unique_ptr<ast::Node> parseStringWithExperimentalSchemaSupport(
|
38
|
+
const char *text, const char **error);
|
39
|
+
|
40
|
+
/**
|
41
|
+
* Read and parse GraphQL source from the given file, returning an
|
42
|
+
* AST. Returns nullptr on error and, if error is not null, places an
|
43
|
+
* error string in error that must be freed with free(3).
|
44
|
+
*/
|
45
|
+
std::unique_ptr<ast::Node> parseFile(FILE *file, const char **error);
|
46
|
+
|
47
|
+
/**
|
48
|
+
* Like parseFile, but enables support for the experimental type
|
49
|
+
* definition syntax from https://github.com/facebook/graphql/pull/90 .
|
50
|
+
*/
|
51
|
+
std::unique_ptr<ast::Node> parseFileWithExperimentalSchemaSupport(
|
52
|
+
FILE *file, const char **error);
|
53
|
+
|
54
|
+
}
|
55
|
+
}
|
@@ -0,0 +1,161 @@
|
|
1
|
+
/**
|
2
|
+
* Copyright 2019-present, GraphQL Foundation
|
3
|
+
*
|
4
|
+
* This source code is licensed under the MIT license found in the
|
5
|
+
* LICENSE file in the root directory of this source tree.
|
6
|
+
*/
|
7
|
+
|
8
|
+
#include "position.hh"
|
9
|
+
#include "JsonVisitor.h"
|
10
|
+
|
11
|
+
#include <cassert>
|
12
|
+
#include <iterator>
|
13
|
+
|
14
|
+
namespace facebook {
|
15
|
+
namespace graphql {
|
16
|
+
namespace ast {
|
17
|
+
namespace visitor {
|
18
|
+
|
19
|
+
static std::string escape(const char *s) {
|
20
|
+
static char hex[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
|
21
|
+
std::string result;
|
22
|
+
while (unsigned char ch = *s++) {
|
23
|
+
if (ch >= '\0' && ch <= '\x1f') {
|
24
|
+
result.push_back('\\');
|
25
|
+
result.push_back('u');
|
26
|
+
result.push_back('0');
|
27
|
+
result.push_back('0');
|
28
|
+
result.push_back(ch >= 16 ? '1' : '0');
|
29
|
+
result.push_back(hex[ch % 16]);
|
30
|
+
} else if (ch == '"') {
|
31
|
+
result.push_back('\\');
|
32
|
+
result.push_back('"');
|
33
|
+
} else if (ch == '\\') {
|
34
|
+
result.push_back('\\');
|
35
|
+
result.push_back('\\');
|
36
|
+
} else {
|
37
|
+
result.push_back(ch);
|
38
|
+
}
|
39
|
+
}
|
40
|
+
return result;
|
41
|
+
}
|
42
|
+
|
43
|
+
JsonVisitor::NodeFieldPrinter::NodeFieldPrinter(
|
44
|
+
JsonVisitor &visitor,
|
45
|
+
const char *nodeKind,
|
46
|
+
const Node &node)
|
47
|
+
: visitor_(visitor)
|
48
|
+
{
|
49
|
+
if (!visitor_.printed_.empty()) {
|
50
|
+
nextChild_ = visitor_.printed_.back().begin();
|
51
|
+
}
|
52
|
+
// NOTE: If you're an Emacs user and this file's use of C++11 raw
|
53
|
+
// strings doesn't highlight correctly in c++-mode, try upgrading to
|
54
|
+
// Emacs 26 if you can.
|
55
|
+
out_ << R"({"kind":")" << nodeKind << R"(","loc":)";
|
56
|
+
printLocation(out_, node.getLocation());
|
57
|
+
}
|
58
|
+
|
59
|
+
std::string JsonVisitor::NodeFieldPrinter::finishPrinting() {
|
60
|
+
assert(!out_.str().empty());
|
61
|
+
out_ << '}';
|
62
|
+
auto result(out_.str());
|
63
|
+
#ifndef NDEBUG
|
64
|
+
out_.str("");
|
65
|
+
#endif
|
66
|
+
return result;
|
67
|
+
|
68
|
+
}
|
69
|
+
|
70
|
+
void JsonVisitor::NodeFieldPrinter::printFieldSeparator()
|
71
|
+
{
|
72
|
+
out_ << ',';
|
73
|
+
}
|
74
|
+
|
75
|
+
void JsonVisitor::NodeFieldPrinter::printSingularPrimitiveField(
|
76
|
+
const char *fieldName,
|
77
|
+
const char *value) {
|
78
|
+
printFieldSeparator();
|
79
|
+
out_ << '"' << fieldName << R"(":)";
|
80
|
+
out_ << '"' << escape(value) << '"';
|
81
|
+
}
|
82
|
+
|
83
|
+
void JsonVisitor::NodeFieldPrinter::printSingularBooleanField(
|
84
|
+
const char *fieldName,
|
85
|
+
bool value) {
|
86
|
+
printFieldSeparator();
|
87
|
+
out_ << '"' << fieldName << R"(":)";
|
88
|
+
out_ << (value ? "true" : "false");
|
89
|
+
}
|
90
|
+
|
91
|
+
void JsonVisitor::NodeFieldPrinter::printSingularObjectField(const char *fieldName) {
|
92
|
+
printFieldSeparator();
|
93
|
+
out_ << '"' << fieldName << R"(":)";
|
94
|
+
assert(!visitor_.printed_.empty());
|
95
|
+
out_ << *nextChild_++;
|
96
|
+
}
|
97
|
+
|
98
|
+
void JsonVisitor::NodeFieldPrinter::printNullableSingularObjectField(
|
99
|
+
const char *fieldName,
|
100
|
+
const void *value) {
|
101
|
+
printFieldSeparator();
|
102
|
+
out_ << '"' << fieldName << R"(":)";
|
103
|
+
if (value != nullptr) {
|
104
|
+
assert(!visitor_.printed_.empty());
|
105
|
+
out_ << *nextChild_++;
|
106
|
+
} else {
|
107
|
+
out_ << "null";
|
108
|
+
}
|
109
|
+
}
|
110
|
+
|
111
|
+
// Method invariant: printed_ contains strings for this node's children.
|
112
|
+
void JsonVisitor::NodeFieldPrinter::printLocation(
|
113
|
+
std::ostringstream &out,
|
114
|
+
const yy::location &location)
|
115
|
+
{
|
116
|
+
out << R"({"start": {"line": )" << location.begin.line
|
117
|
+
<< R"(,"column":)" << location.begin.column
|
118
|
+
<< R"(}, "end": {"line":)" << location.end.line
|
119
|
+
<< R"(,"column":)" << location.end.column
|
120
|
+
<< "}}";
|
121
|
+
}
|
122
|
+
|
123
|
+
void JsonVisitor::NodeFieldPrinter::printChildList(
|
124
|
+
std::ostringstream &out,
|
125
|
+
const std::vector<std::string>::const_iterator &childIterator,
|
126
|
+
size_t numChildren) {
|
127
|
+
out << '[';
|
128
|
+
for (size_t ii = 0; ii < numChildren; ++ii) {
|
129
|
+
if (ii != 0) {
|
130
|
+
out << ',';
|
131
|
+
}
|
132
|
+
out << *(childIterator + ii);
|
133
|
+
}
|
134
|
+
out << ']';
|
135
|
+
}
|
136
|
+
|
137
|
+
JsonVisitor::JsonVisitor() {
|
138
|
+
printed_.emplace_back();
|
139
|
+
}
|
140
|
+
|
141
|
+
void JsonVisitor::visitNode() {
|
142
|
+
printed_.emplace_back();
|
143
|
+
}
|
144
|
+
|
145
|
+
void JsonVisitor::endVisitNode(std::string &&str) {
|
146
|
+
printed_.pop_back();
|
147
|
+
printed_.back().emplace_back(std::move(str));
|
148
|
+
}
|
149
|
+
|
150
|
+
std::string JsonVisitor::getResult() const {
|
151
|
+
assert(printed_.size() == 1);
|
152
|
+
assert(printed_[0].size() == 1);
|
153
|
+
return printed_[0][0];
|
154
|
+
}
|
155
|
+
|
156
|
+
#include "JsonVisitor.cpp.inc"
|
157
|
+
|
158
|
+
} // namespace visitor
|
159
|
+
} // namespace ast
|
160
|
+
} // namespace graphql
|
161
|
+
} // namespace facebook
|