rails-graphql 0.2.1 → 1.0.0.beta

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.
Files changed (297) hide show
  1. checksums.yaml +4 -4
  2. data/ext/console.rb +18 -0
  3. data/ext/extconf.h +3 -0
  4. data/ext/extconf.rb +1 -54
  5. data/ext/gql_parser.c +646 -0
  6. data/ext/shared.c +482 -0
  7. data/ext/shared.h +177 -0
  8. data/lib/gql_parser.so +0 -0
  9. data/lib/rails/graphql/adapters/mysql_adapter.rb +59 -0
  10. data/lib/rails/graphql/adapters/pg_adapter.rb +25 -22
  11. data/lib/rails/graphql/adapters/sqlite_adapter.rb +17 -14
  12. data/lib/rails/graphql/alternative/field_set.rb +36 -0
  13. data/lib/rails/graphql/alternative/mutation.rb +17 -0
  14. data/lib/rails/graphql/alternative/query.rb +93 -0
  15. data/lib/rails/graphql/alternative/subscription.rb +17 -0
  16. data/lib/rails/graphql/alternative.rb +20 -0
  17. data/lib/rails/graphql/argument.rb +21 -24
  18. data/lib/rails/graphql/callback.rb +24 -9
  19. data/lib/rails/graphql/collectors/hash_collector.rb +14 -6
  20. data/lib/rails/graphql/collectors/idented_collector.rb +10 -7
  21. data/lib/rails/graphql/collectors/json_collector.rb +22 -17
  22. data/lib/rails/graphql/collectors.rb +4 -4
  23. data/lib/rails/graphql/config.rb +130 -15
  24. data/lib/rails/graphql/directive/cached_directive.rb +33 -0
  25. data/lib/rails/graphql/directive/deprecated_directive.rb +10 -10
  26. data/lib/rails/graphql/directive/include_directive.rb +5 -4
  27. data/lib/rails/graphql/directive/skip_directive.rb +5 -4
  28. data/lib/rails/graphql/directive.rb +118 -63
  29. data/lib/rails/graphql/errors.rb +33 -4
  30. data/lib/rails/graphql/event.rb +16 -5
  31. data/lib/rails/graphql/field/authorized_field.rb +19 -3
  32. data/lib/rails/graphql/field/input_field.rb +11 -10
  33. data/lib/rails/graphql/field/mutation_field.rb +42 -7
  34. data/lib/rails/graphql/field/output_field.rb +102 -13
  35. data/lib/rails/graphql/field/proxied_field.rb +31 -22
  36. data/lib/rails/graphql/field/resolved_field.rb +26 -24
  37. data/lib/rails/graphql/field/scoped_config.rb +10 -4
  38. data/lib/rails/graphql/field/subscription_field.rb +140 -0
  39. data/lib/rails/graphql/field/typed_field.rb +43 -22
  40. data/lib/rails/graphql/field.rb +70 -56
  41. data/lib/rails/graphql/global_id.rb +85 -0
  42. data/lib/rails/graphql/helpers/attribute_delegator.rb +5 -5
  43. data/lib/rails/graphql/helpers/inherited_collection/array.rb +50 -0
  44. data/lib/rails/graphql/helpers/inherited_collection/base.rb +43 -0
  45. data/lib/rails/graphql/helpers/inherited_collection/hash.rb +87 -0
  46. data/lib/rails/graphql/helpers/inherited_collection.rb +25 -76
  47. data/lib/rails/graphql/helpers/instantiable.rb +15 -0
  48. data/lib/rails/graphql/helpers/leaf_from_ar.rb +7 -7
  49. data/lib/rails/graphql/helpers/registerable.rb +44 -62
  50. data/lib/rails/graphql/helpers/unregisterable.rb +16 -0
  51. data/lib/rails/graphql/helpers/with_arguments.rb +31 -27
  52. data/lib/rails/graphql/helpers/with_assignment.rb +6 -6
  53. data/lib/rails/graphql/helpers/with_callbacks.rb +25 -8
  54. data/lib/rails/graphql/helpers/with_description.rb +71 -0
  55. data/lib/rails/graphql/helpers/with_directives.rb +54 -30
  56. data/lib/rails/graphql/helpers/with_events.rb +21 -23
  57. data/lib/rails/graphql/helpers/with_fields.rb +76 -22
  58. data/lib/rails/graphql/helpers/with_global_id.rb +22 -0
  59. data/lib/rails/graphql/helpers/with_name.rb +43 -0
  60. data/lib/rails/graphql/helpers/with_namespace.rb +7 -4
  61. data/lib/rails/graphql/helpers/with_owner.rb +8 -7
  62. data/lib/rails/graphql/helpers/with_schema_fields.rb +137 -55
  63. data/lib/rails/graphql/helpers/with_validator.rb +9 -9
  64. data/lib/rails/graphql/helpers.rb +10 -3
  65. data/lib/rails/graphql/introspection.rb +43 -36
  66. data/lib/rails/graphql/railtie.rb +88 -33
  67. data/lib/rails/graphql/railties/base_generator.rb +3 -9
  68. data/lib/rails/graphql/railties/channel.rb +157 -0
  69. data/lib/rails/graphql/railties/controller.rb +62 -17
  70. data/lib/rails/graphql/railties/controller_runtime.rb +5 -5
  71. data/lib/rails/graphql/railties/log_subscriber.rb +81 -14
  72. data/lib/rails/graphql/request/arguments.rb +24 -49
  73. data/lib/rails/graphql/request/backtrace.rb +191 -0
  74. data/lib/rails/graphql/request/component/field.rb +86 -65
  75. data/lib/rails/graphql/request/component/fragment.rb +72 -24
  76. data/lib/rails/graphql/request/component/operation/subscription.rb +164 -4
  77. data/lib/rails/graphql/request/component/operation.rb +63 -31
  78. data/lib/rails/graphql/request/component/spread.rb +68 -25
  79. data/lib/rails/graphql/request/component/typename.rb +27 -12
  80. data/lib/rails/graphql/request/component.rb +75 -36
  81. data/lib/rails/graphql/request/context.rb +18 -8
  82. data/lib/rails/graphql/request/errors.rb +16 -6
  83. data/lib/rails/graphql/request/event.rb +19 -8
  84. data/lib/rails/graphql/request/helpers/directives.rb +68 -27
  85. data/lib/rails/graphql/request/helpers/selection_set.rb +51 -25
  86. data/lib/rails/graphql/request/helpers/value_writers.rb +18 -16
  87. data/lib/rails/graphql/request/prepared_data.rb +98 -0
  88. data/lib/rails/graphql/request/steps/authorizable.rb +24 -14
  89. data/lib/rails/graphql/request/steps/organizable.rb +110 -48
  90. data/lib/rails/graphql/request/steps/{prepareable.rb → preparable.rb} +20 -7
  91. data/lib/rails/graphql/request/steps/{resolveable.rb → resolvable.rb} +15 -6
  92. data/lib/rails/graphql/request/strategy/cached_strategy.rb +64 -0
  93. data/lib/rails/graphql/request/strategy/dynamic_instance.rb +6 -6
  94. data/lib/rails/graphql/request/strategy/multi_query_strategy.rb +6 -13
  95. data/lib/rails/graphql/request/strategy/sequenced_strategy.rb +9 -9
  96. data/lib/rails/graphql/request/strategy.rb +131 -75
  97. data/lib/rails/graphql/request/subscription.rb +80 -0
  98. data/lib/rails/graphql/request.rb +305 -86
  99. data/lib/rails/graphql/schema.rb +240 -48
  100. data/lib/rails/graphql/shortcuts.rb +22 -3
  101. data/lib/rails/graphql/source/active_record/builders.rb +49 -35
  102. data/lib/rails/graphql/source/active_record_source.rb +70 -54
  103. data/lib/rails/graphql/source/base.rb +111 -0
  104. data/lib/rails/graphql/source/builder.rb +128 -0
  105. data/lib/rails/graphql/source/scoped_arguments.rb +31 -19
  106. data/lib/rails/graphql/source.rb +89 -213
  107. data/lib/rails/graphql/subscription/provider/action_cable.rb +112 -0
  108. data/lib/rails/graphql/subscription/provider/base.rb +191 -0
  109. data/lib/rails/graphql/subscription/provider.rb +18 -0
  110. data/lib/rails/graphql/subscription/store/base.rb +145 -0
  111. data/lib/rails/graphql/subscription/store/memory.rb +127 -0
  112. data/lib/rails/graphql/subscription/store.rb +19 -0
  113. data/lib/rails/graphql/subscription.rb +17 -0
  114. data/lib/rails/graphql/to_gql.rb +29 -32
  115. data/lib/rails/graphql/type/enum/directive_location_enum.rb +11 -11
  116. data/lib/rails/graphql/type/enum/type_kind_enum.rb +3 -3
  117. data/lib/rails/graphql/type/enum.rb +34 -48
  118. data/lib/rails/graphql/type/input.rb +74 -23
  119. data/lib/rails/graphql/type/interface.rb +16 -26
  120. data/lib/rails/graphql/type/object/directive_object.rb +4 -4
  121. data/lib/rails/graphql/type/object/enum_value_object.rb +3 -3
  122. data/lib/rails/graphql/type/object/field_object.rb +24 -6
  123. data/lib/rails/graphql/type/object/input_value_object.rb +3 -3
  124. data/lib/rails/graphql/type/object/schema_object.rb +5 -8
  125. data/lib/rails/graphql/type/object/type_object.rb +29 -19
  126. data/lib/rails/graphql/type/object.rb +26 -23
  127. data/lib/rails/graphql/type/scalar/any_scalar.rb +30 -0
  128. data/lib/rails/graphql/type/scalar/bigint_scalar.rb +5 -5
  129. data/lib/rails/graphql/type/scalar/binary_scalar.rb +3 -3
  130. data/lib/rails/graphql/type/scalar/boolean_scalar.rb +8 -8
  131. data/lib/rails/graphql/type/scalar/date_scalar.rb +3 -3
  132. data/lib/rails/graphql/type/scalar/date_time_scalar.rb +3 -3
  133. data/lib/rails/graphql/type/scalar/decimal_scalar.rb +3 -3
  134. data/lib/rails/graphql/type/scalar/float_scalar.rb +5 -5
  135. data/lib/rails/graphql/type/scalar/id_scalar.rb +6 -5
  136. data/lib/rails/graphql/type/scalar/int_scalar.rb +6 -5
  137. data/lib/rails/graphql/type/scalar/json_scalar.rb +39 -0
  138. data/lib/rails/graphql/type/scalar/string_scalar.rb +18 -4
  139. data/lib/rails/graphql/type/scalar/time_scalar.rb +5 -5
  140. data/lib/rails/graphql/type/scalar.rb +25 -22
  141. data/lib/rails/graphql/type/union.rb +14 -16
  142. data/lib/rails/graphql/type.rb +34 -25
  143. data/lib/rails/graphql/type_map.rb +256 -164
  144. data/lib/rails/graphql/uri.rb +166 -0
  145. data/lib/rails/graphql/version.rb +15 -3
  146. data/lib/rails/graphql.rake +3 -0
  147. data/lib/rails/graphql.rb +85 -52
  148. data/lib/rails-graphql.rb +1 -1
  149. data/test/assets/en.yml +29 -0
  150. data/test/assets/introspection-mem.txt +1 -1
  151. data/test/assets/mem.gql +18 -45
  152. data/test/assets/mysql.gql +392 -0
  153. data/test/assets/sqlite.gql +21 -12
  154. data/test/assets/translate.gql +335 -0
  155. data/test/config.rb +18 -8
  156. data/test/graphql/schema_test.rb +12 -19
  157. data/test/graphql/source_test.rb +8 -75
  158. data/test/graphql/type/enum_test.rb +207 -203
  159. data/test/graphql/type/input_test.rb +14 -9
  160. data/test/graphql/type/interface_test.rb +4 -4
  161. data/test/graphql/type/scalar/any_scalar_test.rb +38 -0
  162. data/test/graphql/type/scalar/boolean_scalar_test.rb +6 -3
  163. data/test/graphql/type/scalar/json_scalar_test.rb +23 -0
  164. data/test/graphql/type_map_test.rb +51 -66
  165. data/test/graphql/type_test.rb +0 -19
  166. data/test/graphql_test.rb +1 -1
  167. data/test/integration/{authorization/authorization_test.rb → authorization_test.rb} +40 -14
  168. data/test/integration/config.rb +36 -3
  169. data/test/integration/customization_test.rb +39 -0
  170. data/test/integration/global_id_test.rb +99 -0
  171. data/test/integration/memory/star_wars_introspection_test.rb +24 -16
  172. data/test/integration/memory/star_wars_query_test.rb +54 -3
  173. data/test/integration/memory/star_wars_validation_test.rb +1 -1
  174. data/test/integration/mysql/star_wars_introspection_test.rb +25 -0
  175. data/test/integration/persisted_query_test.rb +87 -0
  176. data/test/integration/resolver_precedence_test.rb +154 -0
  177. data/test/integration/schemas/memory.rb +22 -7
  178. data/test/integration/schemas/mysql.rb +62 -0
  179. data/test/integration/schemas/sqlite.rb +21 -12
  180. data/test/integration/sqlite/star_wars_global_id_test.rb +83 -0
  181. data/test/integration/sqlite/star_wars_introspection_test.rb +10 -0
  182. data/test/integration/sqlite/star_wars_query_test.rb +14 -1
  183. data/test/integration/translate_test.rb +61 -0
  184. data/test/test_ext.rb +16 -13
  185. metadata +108 -157
  186. data/ext/depend +0 -3
  187. data/ext/graphqlparser/Ast.cpp +0 -346
  188. data/ext/graphqlparser/Ast.h +0 -1214
  189. data/ext/graphqlparser/AstNode.h +0 -36
  190. data/ext/graphqlparser/AstVisitor.h +0 -137
  191. data/ext/graphqlparser/GraphQLParser.cpp +0 -76
  192. data/ext/graphqlparser/GraphQLParser.h +0 -55
  193. data/ext/graphqlparser/JsonVisitor.cpp +0 -161
  194. data/ext/graphqlparser/JsonVisitor.cpp.inc +0 -456
  195. data/ext/graphqlparser/JsonVisitor.h +0 -121
  196. data/ext/graphqlparser/JsonVisitor.h.inc +0 -110
  197. data/ext/graphqlparser/VERSION +0 -1
  198. data/ext/graphqlparser/c/GraphQLAst.cpp +0 -324
  199. data/ext/graphqlparser/c/GraphQLAst.h +0 -180
  200. data/ext/graphqlparser/c/GraphQLAstForEachConcreteType.h +0 -44
  201. data/ext/graphqlparser/c/GraphQLAstNode.cpp +0 -25
  202. data/ext/graphqlparser/c/GraphQLAstNode.h +0 -33
  203. data/ext/graphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  204. data/ext/graphqlparser/c/GraphQLAstToJSON.h +0 -24
  205. data/ext/graphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  206. data/ext/graphqlparser/c/GraphQLAstVisitor.h +0 -53
  207. data/ext/graphqlparser/c/GraphQLParser.cpp +0 -35
  208. data/ext/graphqlparser/c/GraphQLParser.h +0 -54
  209. data/ext/graphqlparser/dump_json_ast.cpp +0 -48
  210. data/ext/graphqlparser/lexer.lpp +0 -324
  211. data/ext/graphqlparser/parser.ypp +0 -693
  212. data/ext/graphqlparser/parsergen/lexer.cpp +0 -2633
  213. data/ext/graphqlparser/parsergen/lexer.h +0 -528
  214. data/ext/graphqlparser/parsergen/location.hh +0 -189
  215. data/ext/graphqlparser/parsergen/parser.tab.cpp +0 -3300
  216. data/ext/graphqlparser/parsergen/parser.tab.hpp +0 -646
  217. data/ext/graphqlparser/parsergen/position.hh +0 -179
  218. data/ext/graphqlparser/parsergen/stack.hh +0 -156
  219. data/ext/graphqlparser/syntaxdefs.h +0 -19
  220. data/ext/libgraphqlparser/AstNode.h +0 -36
  221. data/ext/libgraphqlparser/CMakeLists.txt +0 -148
  222. data/ext/libgraphqlparser/CONTRIBUTING.md +0 -23
  223. data/ext/libgraphqlparser/GraphQLParser.cpp +0 -76
  224. data/ext/libgraphqlparser/GraphQLParser.h +0 -55
  225. data/ext/libgraphqlparser/JsonVisitor.cpp +0 -161
  226. data/ext/libgraphqlparser/JsonVisitor.h +0 -121
  227. data/ext/libgraphqlparser/LICENSE +0 -22
  228. data/ext/libgraphqlparser/README.clang-tidy +0 -7
  229. data/ext/libgraphqlparser/README.md +0 -84
  230. data/ext/libgraphqlparser/ast/ast.ast +0 -203
  231. data/ext/libgraphqlparser/ast/ast.py +0 -61
  232. data/ext/libgraphqlparser/ast/c.py +0 -100
  233. data/ext/libgraphqlparser/ast/c.pyc +0 -0
  234. data/ext/libgraphqlparser/ast/c_impl.py +0 -61
  235. data/ext/libgraphqlparser/ast/c_impl.pyc +0 -0
  236. data/ext/libgraphqlparser/ast/c_visitor_impl.py +0 -39
  237. data/ext/libgraphqlparser/ast/c_visitor_impl.pyc +0 -0
  238. data/ext/libgraphqlparser/ast/casing.py +0 -26
  239. data/ext/libgraphqlparser/ast/casing.pyc +0 -0
  240. data/ext/libgraphqlparser/ast/cxx.py +0 -197
  241. data/ext/libgraphqlparser/ast/cxx.pyc +0 -0
  242. data/ext/libgraphqlparser/ast/cxx_impl.py +0 -61
  243. data/ext/libgraphqlparser/ast/cxx_impl.pyc +0 -0
  244. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.py +0 -42
  245. data/ext/libgraphqlparser/ast/cxx_json_visitor_header.pyc +0 -0
  246. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.py +0 -80
  247. data/ext/libgraphqlparser/ast/cxx_json_visitor_impl.pyc +0 -0
  248. data/ext/libgraphqlparser/ast/cxx_visitor.py +0 -64
  249. data/ext/libgraphqlparser/ast/cxx_visitor.pyc +0 -0
  250. data/ext/libgraphqlparser/ast/js.py +0 -65
  251. data/ext/libgraphqlparser/ast/license.py +0 -10
  252. data/ext/libgraphqlparser/ast/license.pyc +0 -0
  253. data/ext/libgraphqlparser/c/GraphQLAstNode.cpp +0 -25
  254. data/ext/libgraphqlparser/c/GraphQLAstNode.h +0 -33
  255. data/ext/libgraphqlparser/c/GraphQLAstToJSON.cpp +0 -21
  256. data/ext/libgraphqlparser/c/GraphQLAstToJSON.h +0 -24
  257. data/ext/libgraphqlparser/c/GraphQLAstVisitor.cpp +0 -55
  258. data/ext/libgraphqlparser/c/GraphQLAstVisitor.h +0 -53
  259. data/ext/libgraphqlparser/c/GraphQLParser.cpp +0 -35
  260. data/ext/libgraphqlparser/c/GraphQLParser.h +0 -54
  261. data/ext/libgraphqlparser/clang-tidy-all.sh +0 -3
  262. data/ext/libgraphqlparser/cmake/version.cmake +0 -16
  263. data/ext/libgraphqlparser/dump_json_ast.cpp +0 -48
  264. data/ext/libgraphqlparser/go/README.md +0 -20
  265. data/ext/libgraphqlparser/go/callbacks.go +0 -18
  266. data/ext/libgraphqlparser/go/gotest.go +0 -64
  267. data/ext/libgraphqlparser/lexer.lpp +0 -324
  268. data/ext/libgraphqlparser/libgraphqlparser.pc.in +0 -11
  269. data/ext/libgraphqlparser/parser.ypp +0 -693
  270. data/ext/libgraphqlparser/parsergen/lexer.cpp +0 -2633
  271. data/ext/libgraphqlparser/parsergen/lexer.h +0 -528
  272. data/ext/libgraphqlparser/parsergen/location.hh +0 -189
  273. data/ext/libgraphqlparser/parsergen/parser.tab.cpp +0 -3300
  274. data/ext/libgraphqlparser/parsergen/parser.tab.hpp +0 -646
  275. data/ext/libgraphqlparser/parsergen/position.hh +0 -179
  276. data/ext/libgraphqlparser/parsergen/stack.hh +0 -156
  277. data/ext/libgraphqlparser/python/CMakeLists.txt +0 -14
  278. data/ext/libgraphqlparser/python/README.md +0 -5
  279. data/ext/libgraphqlparser/python/example.py +0 -31
  280. data/ext/libgraphqlparser/syntaxdefs.h +0 -19
  281. data/ext/libgraphqlparser/test/BuildCAPI.c +0 -5
  282. data/ext/libgraphqlparser/test/CMakeLists.txt +0 -25
  283. data/ext/libgraphqlparser/test/JsonVisitorTests.cpp +0 -28
  284. data/ext/libgraphqlparser/test/ParserTests.cpp +0 -352
  285. data/ext/libgraphqlparser/test/kitchen-sink.graphql +0 -59
  286. data/ext/libgraphqlparser/test/kitchen-sink.json +0 -1
  287. data/ext/libgraphqlparser/test/schema-kitchen-sink.graphql +0 -78
  288. data/ext/libgraphqlparser/test/schema-kitchen-sink.json +0 -1
  289. data/ext/libgraphqlparser/test/valgrind.supp +0 -33
  290. data/ext/version.cpp +0 -21
  291. data/lib/graphqlparser.so +0 -0
  292. data/lib/rails/graphql/native/functions.rb +0 -38
  293. data/lib/rails/graphql/native/location.rb +0 -41
  294. data/lib/rails/graphql/native/pointers.rb +0 -23
  295. data/lib/rails/graphql/native/visitor.rb +0 -349
  296. data/lib/rails/graphql/native.rb +0 -56
  297. data/test/integration/schemas/authorization.rb +0 -12
@@ -1,55 +0,0 @@
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 "c/GraphQLAstVisitor.h"
9
- #include "AstVisitor.h"
10
-
11
- using namespace facebook::graphql::ast; // NOLINT
12
-
13
- #include "c/GraphQLAstForEachConcreteType.h"
14
-
15
- #define DECLARE_VISIT(type, snake_type) \
16
- bool visit##type(const type &node) override; \
17
- void endVisit##type(const type &node) override;
18
-
19
- class CVisitorBridge : public visitor::AstVisitor {
20
- const struct GraphQLAstVisitorCallbacks *callbacks_;
21
- void *userData_;
22
- public:
23
- explicit CVisitorBridge(const struct GraphQLAstVisitorCallbacks *callbacks,
24
- void *userData)
25
- : callbacks_(callbacks), userData_(userData) {}
26
-
27
- FOR_EACH_CONCRETE_TYPE(DECLARE_VISIT)
28
- };
29
-
30
- #define IMPLEMENT_VISIT(type, snake_type) \
31
- bool CVisitorBridge::visit##type(const type &node) { \
32
- if (callbacks_->visit_##snake_type) { \
33
- return callbacks_->visit_##snake_type( \
34
- (const struct GraphQLAst##type *)&node, userData_); \
35
- } \
36
- return true; \
37
- } \
38
- void CVisitorBridge::endVisit##type(const type &node) { \
39
- if (callbacks_->end_visit_##snake_type) { \
40
- callbacks_->end_visit_##snake_type( \
41
- (const struct GraphQLAst##type *)&node, userData_); \
42
- } \
43
- }
44
-
45
- FOR_EACH_CONCRETE_TYPE(IMPLEMENT_VISIT)
46
-
47
- void graphql_node_visit(const struct GraphQLAstNode *node,
48
- const struct GraphQLAstVisitorCallbacks *callbacks,
49
- void *userData)
50
- {
51
- CVisitorBridge visitor(callbacks, userData);
52
- if (node) {
53
- reinterpret_cast<const facebook::graphql::ast::Node *>(node)->accept(&visitor);
54
- }
55
- }
@@ -1,53 +0,0 @@
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 "c/GraphQLAst.h"
11
- #include "c/GraphQLAstForEachConcreteType.h"
12
-
13
- #ifdef __cplusplus
14
- extern "C" {
15
- #endif
16
-
17
- #define TYPEDEFS(type, snake_type) \
18
- typedef int (*visit_##snake_type##_func)(const struct GraphQLAst##type *snake_type, void *user_data); \
19
- typedef void (*end_visit_##snake_type##_func)(const struct GraphQLAst##type *snake_type, void *user_data);
20
-
21
- FOR_EACH_CONCRETE_TYPE(TYPEDEFS)
22
-
23
- #define FUNC_MEMBER(type, snake_type) \
24
- visit_##snake_type##_func visit_##snake_type; \
25
- end_visit_##snake_type##_func end_visit_##snake_type;
26
- /**
27
- * Functions to be called when particular AST nodes are encountered.
28
- * visit_* functions are called in pre-order, and may return non-zero to
29
- * continue recursing into children (if any), or zero to skip them. end_visit_*
30
- * functions are called in post-order. Any particular function may be set to
31
- * NULL to indicate that the caller is not interested in the corresponding type
32
- * of AST node. (NULL visit_* functions act as though they simply returned
33
- * non-zero.)
34
- */
35
- struct GraphQLAstVisitorCallbacks {
36
- FOR_EACH_CONCRETE_TYPE(FUNC_MEMBER)
37
- };
38
-
39
- struct GraphQLAstNode;
40
-
41
- /**
42
- * Walk the AST rooted at the given node, issuing callbacks from the given
43
- * callbacks struct as appropriate. userData will be passed as the userData
44
- * argument to each callback.
45
- */
46
- void graphql_node_visit(const struct GraphQLAstNode *node,
47
- const struct GraphQLAstVisitorCallbacks *callbacks,
48
- void *userData);
49
-
50
- #ifdef __cplusplus
51
- }
52
- #endif
53
-
@@ -1,35 +0,0 @@
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
- #include "../GraphQLParser.h"
10
- #include "../AstNode.h"
11
-
12
- #include <cstdlib>
13
-
14
- struct GraphQLAstNode *graphql_parse_string(const char *text, const char **error) {
15
- return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseString(text, error).release());
16
- }
17
-
18
- struct GraphQLAstNode *graphql_parse_string_with_experimental_schema_support(
19
- const char *text, const char **error) {
20
- return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseStringWithExperimentalSchemaSupport(
21
- text, error).release());
22
- }
23
-
24
- struct GraphQLAstNode *graphql_parse_file(FILE *file, const char **error) {
25
- return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseFile(file, error).release());
26
- }
27
-
28
- struct GraphQLAstNode *graphql_parse_file_with_experimental_schema_support(
29
- FILE *file, const char **error) {
30
- return reinterpret_cast<struct GraphQLAstNode *>(facebook::graphql::parseFileWithExperimentalSchemaSupport(file, error).release());
31
- }
32
-
33
- void graphql_error_free(const char *error) {
34
- std::free((void *)(error)); // NOLINT
35
- }
@@ -1,54 +0,0 @@
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 <stdio.h>
11
-
12
- #ifdef __cplusplus
13
- extern "C" {
14
- #endif
15
-
16
- /**
17
- * This file provides C wrappers for ../GraphQLParser.h.
18
- */
19
-
20
- struct GraphQLAstNode;
21
-
22
- /**
23
- * Parse the given GraphQL source string, returning an AST. Returns
24
- * NULL on error. Return value must be freed with
25
- * graphql_node_free(). If NULL is returned and error is not NULL, an
26
- * error message is placed in error and must be freed with
27
- * graphql_error_free().
28
- */
29
- struct GraphQLAstNode *graphql_parse_string(
30
- const char *text, const char **error);
31
-
32
- struct GraphQLAstNode *graphql_parse_string_with_experimental_schema_support(
33
- const char *text, const char **error);
34
-
35
- /**
36
- * Read and parse GraphQL source from the given file, returning an
37
- * AST. Returns nullptr on error. Return value must be freed with
38
- * graphql_node_free(). If NULL is returned and error is not NULL, an
39
- * error message is placed in error and must be freed with
40
- * graphql_error_free().
41
- */
42
- struct GraphQLAstNode *graphql_parse_file(FILE *file, const char **error);
43
-
44
- struct GraphQLAstNode *graphql_parse_file_with_experimental_schema_support(
45
- FILE *file, const char **error);
46
-
47
- /**
48
- * Frees an error.
49
- */
50
- void graphql_error_free(const char *error);
51
-
52
- #ifdef __cplusplus
53
- }
54
- #endif
@@ -1,48 +0,0 @@
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 "AstNode.h"
9
- #include "GraphQLParser.h"
10
- #include "c/GraphQLAstToJSON.h"
11
-
12
- #include <cstdio>
13
- #include <cstdlib>
14
- #include <iostream>
15
-
16
-
17
- using std::cout;
18
- using std::cerr;
19
- using std::endl;
20
- using std::fopen;
21
- using std::fclose;
22
- using std::free;
23
-
24
-
25
- int main(int argc, char **argv) {
26
- const char *error;
27
- FILE * in;
28
- if (argc > 1) {
29
- in = fopen(argv[1], "r"); // NOLINT
30
- } else {
31
- in = stdin;
32
- }
33
- auto AST = facebook::graphql::parseFile(in, &error);
34
- if (argc > 1) {
35
- fclose(in);
36
- }
37
- if (!AST) {
38
- cerr << "Parser failed with error: " << error << endl;
39
- free((void *)error); // NOLINT
40
- return 1;
41
- }
42
-
43
- const char *json = graphql_ast_to_json(reinterpret_cast<const struct GraphQLAstNode *>(AST.get()));
44
- puts(json);
45
- free((void *)json); // NOLINT
46
-
47
- return 0;
48
- }
@@ -1,324 +0,0 @@
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
- #include <algorithm>
10
- #include <cassert>
11
- #include <cctype>
12
- #include <climits>
13
- #include <cstdio>
14
- #include <string>
15
- #include <vector>
16
- #include "location.hh"
17
- #include "position.hh"
18
- #include "parser.tab.hpp"
19
- #include "syntaxdefs.h"
20
-
21
- // Keep track of token lengths.
22
- #define YY_USER_ACTION yyextra->loc.columns(yyleng);
23
-
24
- static void escape(char c, char *buf);
25
-
26
- static std::string clean_up_block_string(const std::string &str);
27
-
28
- %}
29
-
30
- %option bison-bridge bison-locations
31
- %option noyywrap batch noinput nounput
32
- %option reentrant
33
- %option extra-type="struct LexerExtra *"
34
-
35
- %x STRING_STATE
36
- %x BLOCK_STRING_STATE
37
- %x C_COMMENT_STATE
38
- %x LINE_COMMENT_STATE
39
-
40
- FLOAT -?(0|[1-9][0-9]*)(\.[0-9]+)?([eE][+-]?[0-9]+)?
41
- INTEGER -?(0|[1-9][0-9]*)
42
- IDENTIFIER [_A-Za-z][_0-9A-Za-z]*
43
- VARIABLE $[_0-9A-Za-z]+
44
- BOM \xef\xbb\xbf
45
- CRLF \r\n
46
- BADCHAR [\x00-\x08\x0b\x0c\x0e-\x1f]
47
- GOODCHAR [^\x00-\x08\x0b\x0c\x0e-\x1f]
48
- STRINGCHAR [^\x00-\x1f\\\x22]
49
-
50
- blank [ \t,]
51
- newline [\n\r]
52
- notnewline [^\n\r]
53
-
54
- %%
55
-
56
- %{
57
- yyextra->loc.step();
58
- %}
59
-
60
- <STRING_STATE>{
61
- \" {
62
- BEGIN(INITIAL);
63
- yylval->str = yyextra->str.c_str();
64
- *yylloc = yyextra->loc;
65
- return yy::GraphQLParserImpl::token::TOK_STRING;
66
- }
67
-
68
- {newline} {
69
- throw make_error(yyextra->loc, "Unterminated string");
70
- }
71
-
72
- <<EOF>> {
73
- throw make_error(yyextra->loc, "Unterminated string at EOF");
74
- }
75
-
76
- {STRINGCHAR}+ {
77
- char *p = yytext;
78
- while (*p) {
79
- yyextra->str.push_back(*p++);
80
- }
81
- }
82
-
83
- \\\" { yyextra->str.push_back('"'); }
84
- \\\\ { yyextra->str.push_back('\\'); }
85
- \\\/ { yyextra->str.push_back('/'); }
86
- \\n { yyextra->str.push_back('\n'); }
87
- \\t { yyextra->str.push_back('\t'); }
88
- \\r { yyextra->str.push_back('\r'); }
89
- \\b { yyextra->str.push_back('\b'); }
90
- \\f { yyextra->str.push_back('\f'); }
91
-
92
- \\u[0-9A-Fa-f]{4} {
93
- int ch;
94
- sscanf(yytext + 2, "%x", &ch);
95
- yyextra->str.push_back(ch);
96
- }
97
-
98
- \\u { throw make_error(yyextra->loc, "bad Unicode escape sequence"); }
99
- \\. { throw make_error(yyextra->loc, std::string("bad escape sequence \\") + yytext[1]); }
100
-
101
- }
102
-
103
- <BLOCK_STRING_STATE>{
104
- <<EOF>> {
105
- throw make_error(yyextra->loc, "Unterminated block string at EOF");
106
- }
107
-
108
- {BADCHAR} {
109
- throw make_error(yyextra->loc, std::string("Invalid character ") + yytext[0]);
110
- }
111
-
112
- {GOODCHAR} {
113
- /* Can't use {GOODCHAR}+ because that would be a better match for
114
- """ than the explicit rule! */
115
- yyextra->str.push_back(*yytext);
116
- }
117
-
118
- \\\"\"\" {
119
- yyextra->str.append(3, '"');
120
- }
121
-
122
- \"\"\" {
123
- BEGIN(INITIAL);
124
- yyextra->str = clean_up_block_string(yyextra->str);
125
- yylval->str = yyextra->str.c_str();
126
- *yylloc = yyextra->loc;
127
- return yy::GraphQLParserImpl::token::TOK_STRING;
128
- }
129
- }
130
-
131
- <LINE_COMMENT_STATE>{
132
- {CRLF} { yyextra->loc.lines(yyleng / 2); yyextra->loc.step(); BEGIN(INITIAL); }
133
- {newline} { yyextra->loc.lines(yyleng); yyextra->loc.step(); BEGIN(INITIAL); }
134
- {notnewline}+ /* eat comment character */
135
- }
136
-
137
- <INITIAL>{
138
- {blank}+ { yyextra->loc.step(); }
139
- {BOM}+ { yyextra->loc.step(); yyextra->loc.step(); yyextra->loc.step(); }
140
- {CRLF}+ { yyextra->loc.lines(yyleng / 2); yyextra->loc.step(); }
141
- {newline}+ { yyextra->loc.lines(yyleng); yyextra->loc.step(); }
142
-
143
- # {yyextra->loc.step(); BEGIN(LINE_COMMENT_STATE); }
144
-
145
- directive { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_DIRECTIVE; }
146
- enum { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_ENUM; }
147
- extend { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_EXTEND; }
148
- false { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_FALSE; }
149
- fragment { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_FRAGMENT; }
150
- implements { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_IMPLEMENTS; }
151
- input { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_INPUT; }
152
- interface { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_INTERFACE; }
153
- mutation { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_MUTATION; }
154
- null { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_NULL; }
155
- on { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_ON; }
156
- query { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_QUERY; }
157
- scalar { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_SCALAR; }
158
- schema { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_SCHEMA; }
159
- subscription { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_SUBSCRIPTION; }
160
- true { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_TRUE; }
161
- type { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_TYPE; }
162
- union { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_UNION; }
163
-
164
- {INTEGER} { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_INTEGER; }
165
- {FLOAT} { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_FLOAT; }
166
- {IDENTIFIER} { yylval->str = yytext; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_IDENTIFIER; }
167
- {VARIABLE} { yylval->str = yytext + 1; *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_VARIABLE; }
168
-
169
- "!" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_BANG; }
170
- "(" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_LPAREN; }
171
- ")" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_RPAREN; }
172
- "..." { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_ELLIPSIS; }
173
- ":" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_COLON; }
174
- "=" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_EQUAL; }
175
- "@" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_AT; }
176
- "[" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_LBRACKET; }
177
- "]" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_RBRACKET; }
178
- "{" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_LBRACE; }
179
- "|" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_PIPE; }
180
- "}" { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_RBRACE; }
181
-
182
-
183
- <<EOF>> { *yylloc = yyextra->loc; return yy::GraphQLParserImpl::token::TOK_EOF; }
184
-
185
- \"\"\" {
186
- BEGIN(BLOCK_STRING_STATE);
187
- yyextra->str.clear();
188
- }
189
-
190
- \" {
191
- BEGIN(STRING_STATE);
192
- yyextra->str.clear();
193
- }
194
- }
195
-
196
- <INITIAL,STRING_STATE,LINE_COMMENT_STATE>. {
197
- char buf[6];
198
- escape(yytext[0], buf);
199
- throw make_error(
200
- yyextra->loc,
201
- std::string("unrecognized character ") + buf);
202
- }
203
-
204
- %%
205
-
206
- static void escape(char c, char *buf) {
207
- if (std::isgraph(c)) {
208
- *buf = c;
209
- buf[1] = '\0';
210
- } else {
211
- buf[0] = '\\';
212
- buf[2] = '\0';
213
- switch (c) {
214
- case '\a':
215
- buf[1] = 'a';
216
- break;
217
- case '\b':
218
- buf[1] = 'b';
219
- break;
220
- case '\f':
221
- buf[1] = 'f';
222
- break;
223
- case '\n':
224
- buf[1] = 'n';
225
- break;
226
- case '\r':
227
- buf[1] = 'r';
228
- break;
229
- case '\t':
230
- buf[1] = 't';
231
- break;
232
- case '\v':
233
- buf[1] = 'v';
234
- break;
235
- default:
236
- buf[1] = 'x';
237
- std::snprintf(buf + 2, 3, "%x", ((int)c & 0xFF));
238
- break;
239
- }
240
- }
241
- }
242
-
243
- static std::vector<std::string> splitLines(const std::string &str) {
244
- std::vector<std::string> lines;
245
- auto it = str.begin();
246
- while (it != str.end()) {
247
- static char terminators[2] = {'\r', '\n'};
248
- auto nextIt = std::find_first_of(it, str.end(), terminators, terminators + sizeof(terminators));
249
- lines.emplace_back(str.data() + (it - str.begin()), nextIt - it);
250
- if (nextIt != str.end()) {
251
- auto advancedIt = nextIt + 1;
252
- if (advancedIt != str.end()) {
253
- if (*nextIt == '\r' && *advancedIt == '\n') {
254
- ++advancedIt;
255
- }
256
- }
257
- nextIt = std::move(advancedIt);
258
- }
259
- it = std::move(nextIt);
260
- }
261
- return lines;
262
- }
263
-
264
- static int count_leading_whitespace(const std::string &str) {
265
- auto pos = str.find_first_not_of(" \t", 0, strlen(" \t"));
266
- if (pos == std::string::npos) {
267
- return str.length();
268
- }
269
- return pos;
270
- }
271
-
272
- static bool is_all_whitespace(const std::string &str) {
273
- return count_leading_whitespace(str) == str.length();
274
- }
275
-
276
- static std::string clean_up_block_string(const std::string &str) {
277
- auto lines = splitLines(str);
278
- bool first = true;
279
- int commonIndent = INT_MAX;
280
- for (const auto &line : lines) {
281
- if (first) {
282
- first = false;
283
- continue;
284
- }
285
- const auto indent = count_leading_whitespace(line);
286
- if (indent < line.length()) {
287
- if (indent < commonIndent) {
288
- commonIndent = indent;
289
- }
290
- }
291
- }
292
- if (commonIndent != INT_MAX) {
293
- first = true;
294
- for (auto &line : lines) {
295
- if (first) {
296
- first = false;
297
- continue;
298
- }
299
- line.erase(0, commonIndent);
300
- }
301
- }
302
-
303
- const auto firstNonBlankIt = std::find_if(lines.begin(), lines.end(), [](const std::string &line) {
304
- return !is_all_whitespace(line);
305
- });
306
- lines.erase(lines.begin(), firstNonBlankIt);
307
-
308
- const auto firstNonBlankReverseIt = std::find_if(lines.rbegin(), lines.rend(), [](const std::string &line) {
309
- return !is_all_whitespace(line);
310
- });
311
- lines.erase(lines.end() - (firstNonBlankReverseIt - lines.rbegin()), lines.end());
312
-
313
- std::string formatted;
314
- first = true;
315
- for (const auto &line: lines) {
316
- if (first) {
317
- first = false;
318
- } else {
319
- formatted.push_back('\n');
320
- }
321
- formatted.append(line);
322
- }
323
- return formatted;
324
- }