{"id":16659491,"url":"https://github.com/r0man/grafeo","last_synced_at":"2025-04-09T18:42:13.143Z","repository":{"id":57713703,"uuid":"165384712","full_name":"r0man/grafeo","owner":"r0man","description":"A GraphQL document and schema language based on S-expressions in Clojure \u0026 ClojureScript","archived":false,"fork":false,"pushed_at":"2020-04-25T09:42:29.000Z","size":67,"stargazers_count":11,"open_issues_count":0,"forks_count":0,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-23T20:43:33.155Z","etag":null,"topics":["alumbra","clojure","clojurescript","dsl","graphql","lisp"],"latest_commit_sha":null,"homepage":"","language":"Clojure","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"epl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/r0man.png","metadata":{"files":{"readme":"README.org","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":["r0man"]}},"created_at":"2019-01-12T12:20:17.000Z","updated_at":"2024-04-23T22:44:29.000Z","dependencies_parsed_at":"2022-08-25T12:51:35.516Z","dependency_job_id":null,"html_url":"https://github.com/r0man/grafeo","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r0man%2Fgrafeo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r0man%2Fgrafeo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r0man%2Fgrafeo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/r0man%2Fgrafeo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/r0man","download_url":"https://codeload.github.com/r0man/grafeo/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":247648913,"owners_count":20972944,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["alumbra","clojure","clojurescript","dsl","graphql","lisp"],"created_at":"2024-10-12T10:25:25.103Z","updated_at":"2025-04-09T18:42:13.115Z","avatar_url":"https://github.com/r0man.png","language":"Clojure","funding_links":["https://github.com/sponsors/r0man"],"categories":[],"sub_categories":[],"readme":"* Grafeo\n\n  #+author: r0man\n  #+LANGUAGE: en\n\n  [[https://clojars.org/grafeo][https://img.shields.io/clojars/v/grafeo.svg]]\n  [[https://travis-ci.org/r0man/grafeo][https://travis-ci.org/r0man/grafeo.svg]]\n  [[https://versions.deps.co/r0man/grafeo][https://versions.deps.co/r0man/grafeo/status.svg]]\n  [[https://versions.deps.co/r0man/grafeo][https://versions.deps.co/r0man/grafeo/downloads.svg]]\n\n  /Grafeo/ is [[https://clojure.org][Clojure]] and [[https://github.com/clojure/clojurescript][ClojureScript]] library that provides a\n  S-expression based language for [[https://graphql.org/][GraphQL]] documents and schemas.\n\n** Usage\n\n   Require the library.\n\n   #+BEGIN_SRC clojure :exports code :results silent\n     (require '[clojure.pprint :refer [pprint]])\n     (require '[grafeo.core :as gql])\n   #+END_SRC\n\n   Define a GraphQL document in s-expression format. Take a look at\n   the [[https://github.com/r0man/grafeo/tree/master/doc][doc]] folder to learn how to write GraphQL documents and schemas\n   in S-expression format.\n\n   #+BEGIN_SRC clojure :exports code :results silent\n     (def my-document\n       '((human\n          [(id \"1000\")]\n          name\n          (height [(unit FOOT)]))))\n   #+END_SRC\n\n*** Pretty printing\n\n    Pretty print the GraphQL document.\n\n    #+BEGIN_SRC clojure :exports both :results output\n     (gql/pprint my-document)\n    #+END_SRC\n\n    #+RESULTS:\n    : query {\n    :   human(id: \"1000\") {\n    :     name\n    :     height(unit: FOOT)\n    :   }\n    : }\n\n*** Alumbra\n\n    [[https://github.com/alumbra][Alumbra]] is a very complete GraphQL library for Clojure. It\n    provides an [[https://github.com/alumbra/alumbra.analyzer][analyzer]], a [[https://github.com/alumbra/alumbra.parser][parser]] and Clojure [[https://clojure.org/guides/spec][Specs]] around\n    GraphQL. When parsing a /Grafeo/ GraphQL document in S-expressions\n    format it is converted into Alumbra's AST format.\n\n    The following example parses the GraphQL document and prints the\n    [[https://github.com/alumbra][Alumbra]] AST.\n\n    #+BEGIN_SRC clojure :exports both :results output\n     (binding [*print-namespace-maps* false]\n       (pprint (gql/parse-document my-document)))\n    #+END_SRC\n\n    #+RESULTS:\n    #+begin_example\n    {:alumbra/metadata {:column 0, :row 0},\n     :alumbra/operations\n     [{:alumbra/metadata {:column 0, :row 0},\n       :alumbra/operation-type \"query\",\n       :alumbra/selection-set\n       [{:alumbra/field-name \"human\",\n         :alumbra/metadata {:column 0, :row 0},\n         :alumbra/arguments\n         [{:alumbra/argument-name \"id\",\n           :alumbra/argument-value\n           {:alumbra/metadata {:column 0, :row 0},\n            :alumbra/string \"1000\",\n            :alumbra/value-type :string},\n           :alumbra/metadata {:column 0, :row 0}}],\n         :alumbra/selection-set\n         [{:alumbra/field-name \"name\",\n           :alumbra/metadata {:column 0, :row 0}}\n          {:alumbra/field-name \"height\",\n           :alumbra/metadata {:column 0, :row 0},\n           :alumbra/arguments\n           [{:alumbra/argument-name \"unit\",\n             :alumbra/argument-value\n             {:alumbra/enum \"FOOT\",\n              :alumbra/metadata {:column 0, :row 0},\n              :alumbra/value-type :enum},\n             :alumbra/metadata {:column 0, :row 0}}]}]}]}]}\n    #+end_example\n\n*** JavaScript\n\n    In the JavaScript world, GraphQL clients like [[https://www.apollographql.com/docs/react/][Apollo]] and [[https://facebook.github.io/relay/][Relay]] use\n    a different AST format. /Grafeo/ can translate between the Alumbra\n    and JavaScript formats.\n\n    The following example parses the GraphQL document and prints the\n    JavaScript AST.\n\n    #+BEGIN_SRC clojure :exports both :results output\n     (pprint (gql/parse-document-js my-document))\n    #+END_SRC\n\n    #+RESULTS:\n    #+begin_example\n    {:definitions\n     [{:directives [],\n       :kind \"OperationDefinition\",\n       :loc {:startToken {:column 0, :line 0, :start nil}},\n       :name nil,\n       :operation \"query\",\n       :selectionSet\n       {:kind \"SelectionSet\",\n        :selections\n        [{:alias nil,\n          :arguments\n          [{:kind \"Argument\",\n            :loc {:startToken {:column 0, :line 0, :start nil}},\n            :name\n            {:kind \"Name\",\n             :loc {:startToken {:column 0, :line 0, :start nil}},\n             :value \"id\"},\n            :value\n            {:block false,\n             :kind \"StringValue\",\n             :loc {:startToken {:column 0, :line 0, :start nil}},\n             :value \"1000\"}}],\n          :directives [],\n          :kind \"Field\",\n          :loc {:startToken {:column 0, :line 0, :start nil}},\n          :name\n          {:kind \"Name\",\n           :loc {:startToken {:column 0, :line 0, :start nil}},\n           :value \"human\"},\n          :selectionSet\n          {:kind \"SelectionSet\",\n           :selections\n           [{:alias nil,\n             :arguments [],\n             :directives [],\n             :kind \"Field\",\n             :loc {:startToken {:column 0, :line 0, :start nil}},\n             :name\n             {:kind \"Name\",\n              :loc {:startToken {:column 0, :line 0, :start nil}},\n              :value \"name\"},\n             :selectionSet nil}\n            {:alias nil,\n             :arguments\n             [{:kind \"Argument\",\n               :loc {:startToken {:column 0, :line 0, :start nil}},\n               :name\n               {:kind \"Name\",\n                :loc {:startToken {:column 0, :line 0, :start nil}},\n                :value \"unit\"},\n               :value\n               {:kind \"EnumValue\",\n                :loc {:startToken {:column 0, :line 0, :start nil}},\n                :value \"FOOT\"}}],\n             :directives [],\n             :kind \"Field\",\n             :loc {:startToken {:column 0, :line 0, :start nil}},\n             :name\n             {:kind \"Name\",\n              :loc {:startToken {:column 0, :line 0, :start nil}},\n              :value \"height\"},\n             :selectionSet nil}]}}]},\n       :variableDefinitions []}],\n     :kind \"Document\",\n     :loc {:startToken {:column 0, :line 0, :start nil}}}\n    #+end_example\n\n*** HTTP Client\n\n    /Grafeo/ provides a [[https://github.com/dakrone/clj-http][clj-http]] based HTTP client for GraphQL. The\n    following example show how to query a GraphQL based server. Start\n    the SWAPI server in this repository on\n    [[http://localhost:4000/graphql][http://localhost:4000/graphql]].\n\n    #+BEGIN_SRC clojure :exports both :results silent\n      node server.js\n    #+END_SRC\n\n    Require the HTTP client.\n\n    #+BEGIN_SRC clojure :exports both :results silent\n      (require '[grafeo.http :as http])\n    #+END_SRC\n\n    Define the server we are talking to.\n\n    #+BEGIN_SRC clojure :exports both :results silent\n      (def my-server\n        {:scheme :http\n         :server-name \"localhost\"\n         :server-port 4000})\n    #+END_SRC\n\n    Query the local Star Wars API server and print the result.\n\n    #+BEGIN_SRC clojure :exports both :results output\n      (-\u003e\u003e (http/request my-server my-document) :body pprint)\n    #+END_SRC\n\n    #+RESULTS:\n    : {:data {:human {:name \"Luke Skywalker\", :height 5.6430448}}}\n\n    With variables.\n\n    #+BEGIN_SRC clojure :exports both :results output\n      (-\u003e\u003e (http/request\n            my-server\n            '((query\n               HeroNameAndFriends\n               [($episode Episode)]\n               (hero\n                [(episode $episode)]\n                name\n                (friends name))))\n            {:variables {:episode \"JEDI\"}})\n           :body pprint)\n    #+END_SRC\n\n    #+RESULTS:\n    : {:data\n    :  {:hero\n    :   {:name \"R2-D2\",\n    :    :friends\n    :    [{:name \"Luke Skywalker\"}\n    :     {:name \"Han Solo\"}\n    :     {:name \"Leia Organa\"}]}}}\n\n** License\n\n   Copyright © 2019 [[https://github.com/r0man][r0man]]\n\n   Distributed under the Eclipse Public License, the same as Clojure.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr0man%2Fgrafeo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fr0man%2Fgrafeo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fr0man%2Fgrafeo/lists"}