Transformation functions between Alumbra and JavaScript GraphQL ASTs.
Parse a GraphQL document.
(require '[alumbra.js.ast :as ast])
(require '[alumbra.parser :as parser])
(require '[clojure.pprint :refer [pprint]])
(def my-document
(parser/parse-document "{ human(id: \"1000\") { name height(unit: FOOT) } }"))Convert the Alumbra GraphQL document AST into a JavaScript AST.
(def my-js-ast
(ast/alumbra->js my-document))
(pprint my-js-ast){:definitions
[{:directives [],
:kind "OperationDefinition",
:loc {:startToken {:column 0, :line 0, :start 0}},
:name nil,
:operation "query",
:selectionSet
{:kind "SelectionSet",
:selections
[{:alias nil,
:arguments
[{:kind "Argument",
:loc {:startToken {:column 8, :line 0, :start 8}},
:name
{:kind "Name",
:loc {:startToken {:column 8, :line 0, :start 8}},
:value "id"},
:value
{:block false,
:kind "StringValue",
:loc {:startToken {:column 12, :line 0, :start 12}},
:value "1000"}}],
:directives [],
:kind "Field",
:loc {:startToken {:column 2, :line 0, :start 2}},
:name
{:kind "Name",
:loc {:startToken {:column 2, :line 0, :start 2}},
:value "human"},
:selectionSet
{:kind "SelectionSet",
:selections
[{:alias nil,
:arguments [],
:directives [],
:kind "Field",
:loc {:startToken {:column:value "FOOT"}}],
:directives [],
:kind "Field",
:loc {:startToken {:column 27, :line 0, :start 27}},
:name
{:kind "Name",
:loc {:startToken {:column 27, :line 0, :start 27}},
:value "height"},
:selectionSet nil}]}}]},
:variableDefinitions []}],
:kind "Document",
:loc {:startToken {:column 0, :line 0, :start 0}}}
Convert the JavaScript GraphQL document AST back to an Alumbra AST.
(def my-alumbra-ast
(ast/js->alumbra my-js-ast))
(binding [*print-namespace-maps* false]
(pprint my-alumbra-ast)){:alumbra/metadata {:column 0, :index 0, :row 0},
:alumbra/operations
[{:alumbra/metadata {:column 0, :index 0, :row 0},
:alumbra/operation-type "query",
:alumbra/selection-set
[{:alumbra/field-name "human",
:alumbra/metadata {:column 2, :index 2, :row 0},
:alumbra/arguments
[{:alumbra/argument-name "id",
:alumbra/argument-value
{:alumbra/metadata {:column 12, :index 12, :row 0},
:alumbra/value-type :string,
:alumbra/string "1000"},
:alumbra/metadata {:column 8, :index 8, :row 0}}],
:alumbra/selection-set
[{:alumbra/field-name "name",
:alumbra/metadata {:column 22, :index 22, :row 0}}
{:alumbra/field-name "height",
:alumbra/metadata {:column 27, :index 27, :row 0},
:alumbra/arguments
[{:alumbra/argument-name "unit",
:alumbra/argument-value
{:alumbra/value-type :enum,
:alumbra/enum "FOOT",
:alumbra/metadata {:column 40, :index 40, :row 0}},
:alumbra/metadata {:column 34, :index 34, :row 0}}]}]}]}]}
MIT License, Copyright (c) 2019 r0man