r0man/alumbra.js

Transformations between Alumbra and JavaScript GraphQL ASTs.


Keywords
alumbra, clojure, clojurescript, graphql
License
MIT

Documentation

alumbra.js

https://img.shields.io/clojars/v/r0man/alumbra.js.svg https://travis-ci.org/r0man/alumbra.js.svg http://jarkeeper.com/r0man/alumbra.js/status.svg https://jarkeeper.com/r0man/alumbra.js/downloads.svg

Transformation functions between Alumbra and JavaScript GraphQL ASTs.

Usage

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}}]}]}]}]}

License

MIT License, Copyright (c) 2019 r0man