Skip to content

Commit

Permalink
🐛 Implicitly parse __typename in SDL schema
Browse files Browse the repository at this point in the history
  • Loading branch information
jfrolich committed Mar 25, 2022
1 parent ad3c470 commit eb8648d
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 0 deletions.
13 changes: 13 additions & 0 deletions src/graphql_compiler/graphql_parser_schema.ml
Original file line number Diff line number Diff line change
Expand Up @@ -213,6 +213,17 @@ let parse_implements parser =
parse_implementations parser []
| _ -> Ok []

let add_implicit_typename fields =
let open Schema in
{
fm_name = "__typename";
fm_description = None;
fm_arguments = [];
fm_field_type = NonNull (Named "String");
fm_deprecation_reason = None;
}
:: fields

let parse_object ~description parser =
expect_name parser
|> Result_ext.flat_map (fun _ -> expect_name parser)
Expand All @@ -223,6 +234,7 @@ let parse_object ~description parser =
|> Result_ext.flat_map (fun _ -> parse_fields parser)
|> Result_ext.map (fun fields ->
let open Schema in
let fields = add_implicit_typename fields in
{
om_name = name;
om_description = description;
Expand All @@ -238,6 +250,7 @@ let parse_interface ~description parser =
|> Result_ext.flat_map (fun _ -> parse_fields parser)
|> Result_ext.map (fun fields ->
let open Schema in
let fields = add_implicit_typename fields in
{ im_name = name; im_description = description; im_fields = fields }))

let rec add_to_schema parser (callback : string -> Schema.schema_meta) =
Expand Down
25 changes: 25 additions & 0 deletions tests_native/implicit_typename.ml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
open Test_shared;;

[%graphql
{|
query ImplicitTypename {
variousScalars {
id
__typename
}
users {
id
__typename
}
}
|}]

let test () =
let json =
Json.Read.from_string
{|{ "variousScalars": { "id": "123", "__typename": "VariousScalars" }, "users": {"id": "123", "__typename": "User"} }|}
in
test_json_ json
(ImplicitTypename.unsafe_fromJson json |> ImplicitTypename.toJson)

let tests = [ ("Accepts __typename", test) ]
1 change: 1 addition & 0 deletions tests_native/main.ml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ let suites =
("Partial unions", Union_partial.tests);
("Variant conversion", Variant.tests);
("Fragment union serialization", Fragment_union_serialization.tests);
("Typename", Implicit_typename.tests);
]
;;

Expand Down

0 comments on commit eb8648d

Please sign in to comment.