From 1020b14c921435c775d60808df91aca11cc59803 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 21 Oct 2020 05:46:01 +0300
Subject: [PATCH 01/27] Redesign Code Page
---
data/js-graphql-clients.json | 72 ++
data/js-server-libraries.json | 26 +
data/tools.json | 99 ++
gatsby-node.js | 29 +-
scripts/sort-libraries.js | 144 +++
src/{content/code/code.md => pages/code.tsx} | 841 +++++++++-------
static/img/clojure.svg | 50 +
static/img/csharp.svg | 10 +
static/img/elixir.svg | 1 +
static/img/elm.svg | 36 +
static/img/erlang.svg | 61 ++
static/img/golang.svg | 1 +
static/img/groovy.svg | 449 +++++++++
static/img/java.svg | 1 +
static/img/julia.svg | 1 +
static/img/kotlin.svg | 34 +
static/img/node.svg | 1 +
static/img/ocaml.svg | 116 +++
static/img/perl.svg | 23 +
static/img/php.svg | 96 ++
static/img/python.svg | 113 +++
static/img/r.svg | 14 +
static/img/ruby.svg | 947 +++++++++++++++++++
static/img/rust.svg | 19 +
static/img/scala.svg | 20 +
static/img/swift.svg | 10 +
26 files changed, 2861 insertions(+), 353 deletions(-)
create mode 100644 data/js-graphql-clients.json
create mode 100644 data/js-server-libraries.json
create mode 100644 data/tools.json
create mode 100644 scripts/sort-libraries.js
rename src/{content/code/code.md => pages/code.tsx} (55%)
create mode 100644 static/img/clojure.svg
create mode 100644 static/img/csharp.svg
create mode 100644 static/img/elixir.svg
create mode 100644 static/img/elm.svg
create mode 100644 static/img/erlang.svg
create mode 100644 static/img/golang.svg
create mode 100644 static/img/groovy.svg
create mode 100644 static/img/java.svg
create mode 100644 static/img/julia.svg
create mode 100644 static/img/kotlin.svg
create mode 100644 static/img/node.svg
create mode 100644 static/img/ocaml.svg
create mode 100644 static/img/perl.svg
create mode 100644 static/img/php.svg
create mode 100644 static/img/python.svg
create mode 100644 static/img/r.svg
create mode 100644 static/img/ruby.svg
create mode 100644 static/img/rust.svg
create mode 100644 static/img/scala.svg
create mode 100644 static/img/swift.svg
diff --git a/data/js-graphql-clients.json b/data/js-graphql-clients.json
new file mode 100644
index 0000000000..8229754fcf
--- /dev/null
+++ b/data/js-graphql-clients.json
@@ -0,0 +1,72 @@
+[
+ {
+ "name": "Relay",
+ "description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
+ "url": "https://facebook.github.io/relay/",
+ "npm": "react-relay",
+ "github": "facebook/relay"
+ },
+ {
+ "name": "Apollo Client",
+ "description": "A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.",
+ "url": "http://apollographql.com/client/",
+ "npm": "@apollo/client",
+ "github": "apollographql/apollo-client"
+ },
+ {
+ "name": "GraphQL Request",
+ "description": "A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.",
+ "url": "https://github.com/prisma/graphql-request",
+ "npm": "graphql-request",
+ "github": "prisma-labs/graphql-request"
+ },
+ {
+ "name": "Lokka",
+ "description": "A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).",
+ "url": "https://github.com/kadirahq/lokka",
+ "npm": "lokka",
+ "github": "kadirahq/lokka"
+ },
+ {
+ "name": "nanogql",
+ "description": "Tiny GraphQL client library using template strings.",
+ "url": "https://github.com/yoshuawuyts/nanogql",
+ "npm": "nanographql",
+ "github": "yoshuawuyts/nanographql"
+ },
+ {
+ "name": "gq-loader",
+ "description": "A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.",
+ "url": "https://github.com/Houfeng/gq-loader",
+ "npm": "gq-loader",
+ "github": "Houfeng/gq-loader"
+ },
+ {
+ "name": "AWS Amplify",
+ "description": "A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.",
+ "url": "https://docs.amplify.aws/",
+ "npm": "aws-amplify",
+ "github": "aws-amplify/amplify-js"
+ },
+ {
+ "name": "Grafoo",
+ "description": "An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.",
+ "url": "https://github.com/grafoojs/grafoo",
+ "npm": "@grafoo/core",
+ "github": "grafoojs/grafoo"
+ },
+ {
+ "name": "urql",
+ "description": "A highly customizable and versatile GraphQL client for React.",
+ "url": "https://formidable.com/open-source/urql/",
+ "npm": "urql",
+ "github": "FormidableLabs/urql"
+ },
+ {
+ "name": "graphqurl",
+ "description": "curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.",
+ "url": "https://github.com/hasura/graphqurl",
+ "npm": "graphqurl",
+ "github": "hasura/graphqurl"
+ }
+]
\ No newline at end of file
diff --git a/data/js-server-libraries.json b/data/js-server-libraries.json
new file mode 100644
index 0000000000..848ab3623a
--- /dev/null
+++ b/data/js-server-libraries.json
@@ -0,0 +1,26 @@
+[
+ {
+ "name": "GraphQL.js",
+ "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
+ "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
+ "url": "/graphql-js/",
+ "npm": "graphql",
+ "github": "graphql/graphql-js"
+ },
+ {
+ "name": "Express GraphQL",
+ "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
+ "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
+ "url": "/graphql-js/running-an-express-graphql-server/",
+ "npm": "express-graphql",
+ "github": "graphql/express-graphql"
+ },
+ {
+ "name": "Apollo Server",
+ "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
+ "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
+ "url": "https://www.apollographql.com/docs/apollo-server/",
+ "npm": "apollo-server-express",
+ "github": "apollographql/apollo-server"
+ }
+]
\ No newline at end of file
diff --git a/data/tools.json b/data/tools.json
new file mode 100644
index 0000000000..f60b6ac77a
--- /dev/null
+++ b/data/tools.json
@@ -0,0 +1,99 @@
+[
+ {
+ "name": "GraphiQL",
+ "description": "An interactive in-browser GraphQL IDE.",
+ "url": "https://github.com/graphql/graphiql",
+ "npm": "graphiql",
+ "github": "graphql/graphiql"
+ },
+ {
+ "name": "libgraphqlparser",
+ "description": "A GraphQL query language parser in C++ with C and C++ APIs.",
+ "url": "https://github.com/graphql/libgraphqlparser",
+ "github": "graphql/libgraphqlparser"
+ },
+ {
+ "name": "GraphQL Language Service",
+ "description": "An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).",
+ "url": "https://github.com/graphql/graphql-language-service",
+ "npm": "graphql-language-service",
+ "github": "graphql/graphql-language-service"
+ },
+ {
+ "name": "quicktype",
+ "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
+ "url": "https://quicktype.io/",
+ "npm": "quicktype",
+ "github": "quicktype/quicktype"
+ },
+ {
+ "name": "GraphQL-ESLint",
+ "description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
+ "url": "https://github.com/dotansimha/graphql-eslint/",
+ "npm": "@graphql-eslint/eslint-plugin",
+ "github": "dotansimha/graphql-eslint/"
+ },
+ {
+ "name": "GraphQL Modules",
+ "description": "GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.",
+ "url": "https://graphql-modules.com",
+ "npm": "graphql-modules",
+ "github": "Urigo/graphql-modules"
+ },
+ {
+ "name": "GraphQL Tools",
+ "description": "A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).",
+ "url": "https://graphql-tools.com",
+ "npm": "graphql-tools",
+ "github": "ardatan/graphql-tools"
+ },
+ {
+ "name": "GraphQL Config",
+ "description": "One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).",
+ "url": "https://graphql-config.com",
+ "npm": "graphql-config",
+ "github": "kamilkisiela/graphql-config"
+ },
+ {
+ "name": "GraphQL Mesh",
+ "description": "GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.",
+ "url": "https://graphql-mesh.com",
+ "npm": "@graphql-mesh/cli",
+ "github": "Urigo/graphql-mesh"
+ },
+ {
+ "name": "GraphQL Code Generator",
+ "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
+ "url": "https://graphql-code-generator.com",
+ "npm": "@graphql-codegen/cli",
+ "github": "dotansimha/graphql-code-generator"
+ },
+ {
+ "name": "GraphQL CLI",
+ "description": "A command line tool for common GraphQL development workflows.",
+ "url": "https://graphql-cli.com",
+ "npm": "graphql-cli",
+ "github": "Urigo/graphql-cli"
+ },
+ {
+ "name": "GraphQL Inspector",
+ "description": "Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.",
+ "url": "https://graphql-inspector.com/",
+ "npm": "@graphql-inspector/cli",
+ "github": "kamilkisiela/graphql-inspector"
+ },
+ {
+ "name": "GraphQL Scalars",
+ "description": "A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.",
+ "url": "https://github.com/Urigo/graphql-scalars",
+ "npm": "graphql-scalars",
+ "github": "Urigo/graphql-scalars"
+ },
+ {
+ "name": "SOFA",
+ "description": "Generate REST API from your GraphQL API.",
+ "url": "https://sofa-api.com/",
+ "npm": "sofa-api",
+ "github": "Urigo/SOFA"
+ }
+]
\ No newline at end of file
diff --git a/gatsby-node.js b/gatsby-node.js
index 1f01018018..82b904ee78 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -1,14 +1,35 @@
const path = require("path")
+const { readFileSync } = require("fs")
+const sortLibs = require("./scripts/sort-libraries")
exports.onCreatePage = async ({ page, actions }) => {
const { createPage, deletePage } = actions
deletePage(page)
+ let context = {
+ ...page.context,
+ sourcePath: path.relative(__dirname, page.componentPath),
+ }
+ if (page.path === "/code" || page.path === "/code/") {
+ const [jsGraphQLClients, jsServerLibraries, tools] = await Promise.all([
+ sortLibs(
+ JSON.parse(readFileSync("./data/js-graphql-clients.json", "utf8"))
+ ),
+ sortLibs(
+ JSON.parse(readFileSync("./data/js-server-libraries.json", "utf8"))
+ ),
+ sortLibs(JSON.parse(readFileSync("./data/tools.json", "utf8"))),
+ ])
+
+ context = {
+ ...context,
+ jsGraphQLClients,
+ jsServerLibraries,
+ tools,
+ }
+ }
createPage({
...page,
- context: {
- ...page.context,
- sourcePath: path.relative(__dirname, page.componentPath),
- },
+ context,
})
}
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
new file mode 100644
index 0000000000..ef187c2cc8
--- /dev/null
+++ b/scripts/sort-libraries.js
@@ -0,0 +1,144 @@
+const fetch = require(`node-fetch`)
+
+const getGitHubStats = async githubRepo => {
+ const [owner, repoName] = githubRepo.split("/")
+ const accessToken = process.env.GITHUB_ACCESS_TOKEN;
+ if (!accessToken) {
+ throw new Error(`You must have GITHUB_ACCESS_TOKEN env variable defined!`);
+ }
+ const query = /* GraphQL */ `
+ fragment defaultBranchRef on Ref {
+ target {
+ ... on Commit {
+ history(since: $since) {
+ edges {
+ node {
+ author {
+ name
+ }
+ pushedDate
+ }
+ }
+ }
+ }
+ }
+ }
+ query($owner: String!, $repoName: String!, $since: GitTimestamp!) {
+ repositoryOwner(login: $owner) {
+ repository(name: $repoName) {
+ mainRef: ref(qualifiedName: "main") {
+ ...defaultBranchRef
+ }
+ sourceRef: ref(qualifiedName: "source") {
+ ...defaultBranchRef
+ }
+ masterRef: ref(qualifiedName: "master") {
+ ...defaultBranchRef
+ }
+ stargazers {
+ totalCount
+ }
+ updatedAt
+ forkCount
+ pullRequests {
+ totalCount
+ }
+ description
+ }
+ }
+ }
+ `
+ const lastMonth = new Date();
+ lastMonth.setMonth(lastMonth.getMonth() - 1);
+ const response = await fetch("https://api.github.com/graphql", {
+ method: "POST",
+ body: JSON.stringify({
+ query,
+ variables: { owner, repoName, since: lastMonth },
+ }),
+ headers: {
+ Authorization: `Bearer ${accessToken}`,
+ "Content-Type": "application/json",
+ },
+ })
+ const responseJson = await response.json()
+ const repo = responseJson.data.repositoryOwner.repository
+ const stars = repo.stargazers.totalCount
+ const commitHistory = (repo.mainRef || repo.sourceRef || repo.masterRef)
+ .target.history.edges
+ let commitCount = 0, daysWithCommitSet = new Set(), finalUpdatedTime;
+ commitHistory.forEach(commit => {
+ if (!commit.node.author.name.match(/bot/i)) {
+ commitCount++
+ daysWithCommitSet.add(new Date(commit.node.pushedDate).getDate())
+ }
+ })
+ return {
+ commitCount,
+ daysWithCommit: daysWithCommitSet.size,
+ stars,
+ }
+}
+
+const getNpmStats = async packageName => {
+ const response = await fetch(
+ `https://api.npmjs.org/downloads/point/last-week/${encodeURIComponent(
+ packageName
+ )}`
+ )
+ const responseJson = await response.json()
+ const downloadCount = responseJson.downloads
+ return { downloadCount }
+}
+
+const sortLibs = async libs => {
+ const libsWithScores = await Promise.all(
+ libs.map(async lib => {
+ const [npmStats = {}, githubStats = {}] = await Promise.all([
+ lib.npm && getNpmStats(lib.npm),
+ lib.github && getGitHubStats(lib.github),
+ ])
+ return {
+ ...lib,
+ ...npmStats,
+ ...githubStats,
+ }
+ })
+ )
+ return libsWithScores.sort((a, b) => {
+ let aScore = 0,
+ bScore = 0
+ if (a.npm && b.npm) {
+ if (a.downloadCount > b.downloadCount) {
+ aScore += 40;
+ } else if (b.downloadCount > a.downloadCount) {
+ bScore += 40;
+ }
+ }
+ if (a.github && b.github) {
+ if (a.daysWithCommit > b.daysWithCommit) {
+ aScore += 20
+ } else if (a.daysWithCommit < b.daysWithCommit) {
+ bScore += 20
+ }
+ if (a.commitCount > b.commitCount) {
+ aScore += 20;
+ } else if (a.commitCount < b.commitCount) {
+ bScore += 20;
+ }
+ if (a.stars > b.stars) {
+ aScore += 30;
+ } else if (a.stars < b.stars) {
+ bScore += 30;
+ }
+ }
+ if (bScore > aScore) {
+ return 1
+ } else if (bScore < aScore) {
+ return -1
+ }
+ return 0
+ })
+}
+
+module.exports = sortLibs
diff --git a/src/content/code/code.md b/src/pages/code.tsx
similarity index 55%
rename from src/content/code/code.md
rename to src/pages/code.tsx
index 29e381a0f9..9ad5447d36 100644
--- a/src/content/code/code.md
+++ b/src/pages/code.tsx
@@ -1,42 +1,365 @@
----
-title: Code
-layout: code
-permalink: /code/
----
-
-Many different programming languages support GraphQL. This list contains some of the more popular server-side frameworks, client libraries, services, and other useful stuff.
-
-## Server Libraries
-
-In addition to the GraphQL [reference implementations in JavaScript](#javascript), server libraries include:
-
-- [C# / .NET](#c-net)
-- [Clojure](#clojure)
-- [D](#d)
-- [Elixir](#elixir)
-- [Erlang](#erlang)
-- [Go](#go)
-- [Groovy](#groovy)
-- [Haskell](#haskell)
-- [Java](#java)
-- [JavaScript](#javascript)
-- [Julia](#julia)
-- [Kotlin](#kotlin)
-- [Perl](#perl)
-- [PHP](#php)
-- [Python](#python)
-- [R](#r)
-- [Ruby](#ruby)
-- [Rust](#rust)
-- [Scala](#scala)
-- [Swift](#swift)
-- [OCaml / Reason](#ocaml-reason)
-
-### C# / .NET
-
+import React from "react"
+import Layout from "../components/Layout"
+import Marked from "../components/Marked"
+
+export default ({ pageContext }) => {
+ return (
+
+
+
+
+
+
+
+ Because GraphQL is a communication pattern, there are many tools
+ to help you get started working which support GraphQL in all
+ sorts of languages.
+ {" "}
+
+
{`
+## Languages
+`}
+
+ This page will help you get started with GraphQL in languages
+ you are already using.
+
+
+
+
+ {/* C# */}
+
+ {/* Clojure */}
+
+ {/* Elixir */}
+
+ {/* Elm */}
+
+
+
+
+
+
+ {/* Erlang */}
+
+ {/* Go */}
+
+ {/* Groovy */}
+
+ {/* Java */}
+
+
+
+
+
+
+ {/* JavaScript */}
+
+ {/* Julia */}
+
+ {/* Kotlin */}
+
+ {/* OCaml */}
+
+
+
+
+
+
+ {/* Perl */}
+
+ {/* PHP */}
+
+ {/* Python */}
+
+ {/* R */}
+
+
+
+
+
+
+ {/* Ruby */}
+
+ {/* Rust */}
+
+ {/* Scala */}
+
+ {/* Swift */}
+
+
+
+
+
{`
+## C# / .NET
+### Server Libraries
#### [graphql-dotnet](https://github.com/graphql-dotnet/graphql-dotnet): GraphQL for .NET
-
-```csharp
+\`\`\`csharp
using System;
using GraphQL;
using GraphQL.Types;
@@ -59,22 +382,24 @@ public class Program
Console.WriteLine(json);
}
-}
-```
-
+}
+\`\`\`
- [graphql-net](https://github.com/ckimes89/graphql-net): Convert GraphQL to IQueryable
- [Entity GraphQL](https://github.com/lukemurray/EntityGraphQL): .NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)
- [DotNetGraphQLQueryGen](https://github.com/lukemurray/DotNetGraphQLQueryGen): .NET Core library to generate classes from a GraphQL schema for type-safe querying in dotnet
- [Hot Chocolate](https://github.com/ChilliCream/hotchocolate): GraphQL Server for .NET core and .NET classic
- [NGraphQL](https://github.com/rivantsov/starwars): GraphQL Server for .NET Core and full framework
-
-### Clojure
-#### [alumbra](https://github.com/alumbra/alumbra)
+### GraphQL Clients
+ - [GraphQL.Client](https://github.com/graphql-dotnet/graphql-client): A GraphQL Client for .NET.
+ - [graphql-net-client](https://github.com/bkniffler/graphql-net-client): Basic example GraphQL client for .NET.
+ - [SAHB.GraphQLClient](https://github.com/sahb1239/SAHB.GraphQLClient): GraphQL client which supports generating queries from C# classes
+## Clojure
+### Server Libraries
+#### [alumbra](https://github.com/alumbra/alumbra)
A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).
-
-```clojure
+\`\`\`clojure
(require '[alumbra.core :as alumbra]
'[claro.data :as data])
@@ -100,22 +425,19 @@ A set of reusable GraphQL components for Clojure conforming to the data structur
(defonce my-graphql-server
(aleph.http/start-server #'app {:port 3000}))
-```
+\`\`\`
-```bash
+\`\`\`bash
$ curl -XPOST "http://0:3000" -H'Content-Type: application/json' -d'{
"query": "{ me { name, friends { name } } }"
}'
{"data":{"me":{"name":"Person #0","friends":[{"name":"Person #1"},{"name":"Person #2"}]}}}
-```
+\`\`\`
#### [graphql-clj](https://github.com/tendant/graphql-clj)
-
A Clojure library that provides a GraphQL implementation.
-
-Code that executes a hello world GraphQL query with `graphql-clj`:
-
-```clojure
+Code that executes a hello world GraphQL query with \`graphql-clj\`:
+\`\`\`clojure
(def schema "type QueryRoot {
hello: String
@@ -129,52 +451,59 @@ Code that executes a hello world GraphQL query with `graphql-clj`:
(require '[graphql-clj.executor :as executor])
(executor/execute nil schema resolver-fn "{ hello }")
-```
-
+\`\`\`
#### [lacinia](https://github.com/walmartlabs/lacinia)
-
A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.
+### GraphQL Clients
+ - [re-graph](https://github.com/oliyh/re-graph/): A GraphQL client implemented in Clojurescript with support for websockets.
+
### D
- [graphqld](https://github.com/burner/graphqld): A GraphQL implementaiton for the D Programming Language.
### Elixir
-
+### Server Libraries
- [absinthe](https://github.com/absinthe-graphql/absinthe): GraphQL implementation for Elixir.
- [graphql-elixir](https://github.com/graphql-elixir/graphql): An Elixir implementation of Facebook's GraphQL.
-### Erlang
+## Elm
+### GraphQL Clients
+ - [dillonkearns/elm-graphql](https://github.com/dillonkearns/elm-graphql): Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.
+## Erlang
+### Server Libraries
- [graphql-erlang](https://github.com/shopgun/graphql-erlang): GraphQL implementation in Erlang.
-### Go
+## Flutter
+### GraphQL Clients
+ - [graphql](https://github.com/zino-app/graphql-flutter#readme): A GraphQL client implementation in Flutter.
+## Go
+### Server Libraries
- [graphql-go](https://github.com/graphql-go/graphql): An implementation of GraphQL for Go / Golang.
- [graph-gophers/graphql-go](https://github.com/graph-gophers/graphql-go): An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).
- [99designs/gqlgen](https://github.com/99designs/gqlgen) - Go generate based graphql server library.
- [graphql-relay-go](https://github.com/graphql-go/relay): A Go/Golang library to help construct a graphql-go server supporting react-relay.
+ - [machinebox/graphql](https://github.com/machinebox/graphql): An elegant low-level HTTP client for GraphQL.
- [samsarahq/thunder](https://github.com/samsarahq/thunder): A GraphQL implementation with easy schema building, live queries, and batching.
- [appointy/jaal](https://github.com/appointy/jaal): Develop spec compliant GraphQL servers in Go.
-### Groovy
+### GraphQL Clients
+ - [graphql](https://github.com/shurcooL/graphql#readme): A GraphQL client implementation in Go.
+## Groovy
+### Server Libraries
#### [gorm-graphql](https://github.com/grails/gorm-graphql/)
-
**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of "data fetchers" to query, update, and delete data through executions of the schema.
-
**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:
-
- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.
- Generates the schema at startup with spring bean configuration to make it easy to extend.
- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.
- Overrides the default data binder to use the data binding provided by Grails
- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier
-
See [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.
-
#### [GQL](https://grooviter.github.io/gql/)
-
GQL is a Groovy library for GraphQL
### Haskell
@@ -244,16 +573,13 @@ api = interpreter rootResolver
See [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.
-
-### Java
-
+## Java / Android
+### Server Libraries
#### [graphql-java](https://github.com/graphql-java/graphql-java)
-
A Java library for building GraphQL APIs.
+Code that executes a hello world GraphQL query with \`graphql-java\`:
-Code that executes a hello world GraphQL query with `graphql-java`:
-
-```java
+\`\`\`java
import graphql.ExecutionResult;
import graphql.GraphQL;
import graphql.schema.GraphQLSchema;
@@ -287,129 +613,53 @@ public class HelloWorld {
// Prints: {hello=world}
}
}
-```
+\`\`\`
See [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.
-### JavaScript
-
-#### [GraphQL.js](/graphql-js/) ([github](https://github.com/graphql/graphql-js/)) ([npm](https://www.npmjs.com/package/graphql))
-
-The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.
-
-To run a `GraphQL.js` hello world script from the command line:
-
-```bash
-npm install graphql
-```
-
-Then run `node hello.js` with this code in `hello.js`:
-
-```js
-var { graphql, buildSchema } = require('graphql');
-
-var schema = buildSchema(`
- type Query {
- hello: String
- }
-`);
-
-var root = { hello: () => 'Hello world!' };
-
-graphql(schema, '{ hello }', root).then((response) => {
- console.log(response);
-});
-```
-
-#### [express-graphql](/graphql-js/running-an-express-graphql-server/) ([github](https://github.com/graphql/express-graphql)) ([npm](https://www.npmjs.com/package/express-graphql))
-
-The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.
-
-To run an `express-graphql` hello world server:
-
-```bash
-npm install express express-graphql graphql
-```
-
-Then run `node server.js` with this code in `server.js`:
-
-```js
-var express = require('express');
-var { graphqlHTTP } = require('express-graphql');
-var { buildSchema } = require('graphql');
-
-var schema = buildSchema(`
- type Query {
- hello: String
- }
-`);
-
-var root = { hello: () => 'Hello world!' };
-
-var app = express();
-app.use('/graphql', graphqlHTTP({
- schema: schema,
- rootValue: root,
- graphiql: true,
-}));
-app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));
-```
-
-#### [apollo-server](https://www.apollographql.com/docs/apollo-server/) ([github](https://github.com/apollographql/apollo-server)) ([npm](https://www.npmjs.com/package/apollo-server-express))
-
-A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).
-
-To run a hello world server with apollo-server-express:
-
-```bash
-npm install apollo-server-express express
-```
-
-Then run `node server.js` with this code in `server.js`:
-
-```js
-const express = require('express');
-const { ApolloServer, gql } = require('apollo-server-express');
-
-const typeDefs = gql`
- type Query {
- hello: String
- }
-`;
-
-const resolvers = {
- Query: {
- hello: () => 'Hello world!',
- },
-};
-
-const server = new ApolloServer({ typeDefs, resolvers });
-
-const app = express();
-server.applyMiddleware({ app });
-
-app.listen({ port: 4000 }, () =>
- console.log('Now browse to http://localhost:4000' + server.graphqlPath)
-);
-```
-
-Apollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.
+### GraphQL Clients
+ - [Apollo Android](https://github.com/apollographql/apollo-android): A strongly-typed, caching GraphQL client for Android, written in Java.
+ - [Nodes](https://github.com/americanexpress/nodes): A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.
-### Kotlin
+## JavaScript
+### Server Libraries
+${pageContext.jsServerLibraries
+ .map(
+ (
+ library: any
+ ) => `#### [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([npm](https://www.npmjs.com/package/${library.npm}))
+${library.description}
+${library.howto}`
+ )
+ .join("\n")}
+
+### GraphQL Clients
+${pageContext.jsGraphQLClients
+ .map(
+ (library: any) =>
+ `- [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([npm](https://www.npmjs.com/package/${library.npm})): ${library.description}`
+ )
+ .join("\n")}
+
+## Julia
+### GraphQL Clients
+ - [Diana.jl](https://github.com/codeneomatrix/Diana.jl): A Julia GraphQL server implementation.
+## Kotlin
+### Server Libraries
- [graphql-kotlin](https://github.com/ExpediaGroup/graphql-kotlin/): A set of libraries for running GraphQL server in Kotlin.
- [KGraphQL](https://github.com/aPureBase/KGraphQL): Pure Kotlin implementation to setup a GraphQL server.
-### Perl
-
+## Perl
+### Server Libraries
- [graphql-perl](https://github.com/graphql-perl/graphql-perl): A Perl port of GraphQL reference implementation
- [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)
- [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app
- [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL
- [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL
-### PHP
-
+## PHP
+### Server Libraries
- [graphql-php](https://github.com/webonyx/graphql-php): A PHP port of GraphQL reference implementation
- [graphql-relay-php](https://github.com/ivome/graphql-relay-php): A library to help construct a graphql-php server supporting react-relay.
- [Railt](https://github.com/railt/railt): A PHP GraphQL Framework.
@@ -420,11 +670,10 @@ Apollo Server also supports all Node.js HTTP server frameworks: Express, Connect
- [GraPHPinator](https://github.com/infinityloop-dev/graphpinator): A GraphQL implementation for modern PHP
#### [API Platform](https://api-platform.com) ([github](https://github.com/api-platform/api-platform))
-
API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.
The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):
-```php
+\`\`\`php
$err->getMessage(),
]);
})()->run();
-```
-
+\`\`\`
It also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.
-### Swift
-
- - [Graphiti](https://github.com/GraphQLSwift/Graphiti): Swift library for building GraphQL schemas/types fast, safely and easily.
-
-### Python
-
+## Python
+### Server Libraries
#### [Graphene](http://graphene-python.org/) ([github](https://github.com/graphql-python/graphene))
-
A Python library for building GraphQL APIs.
-
To run a Graphene hello world script:
-```bash
+\`\`\`bash
pip install graphene
-```
+\`\`\`
-Then run `python hello.py` with this code in `hello.py`:
+Then run \`python hello.py\` with this code in \`hello.py\`:
-```python
+\`\`\`python
import graphene
class Query(graphene.ObjectType):
@@ -566,25 +798,31 @@ class Query(graphene.ObjectType):
schema = graphene.Schema(query=Query)
result = schema.execute('{ hello }')
print(result.data['hello']) # "Hello World"
-```
+\`\`\`
There are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.
+### GraphQL Clients
+ - [GQL](https://github.com/graphql-python/gql): A GraphQL client in Python.
+ - [python-graphql-client](https://github.com/prisma/python-graphql-client): Simple GraphQL client for Python 2.7+.
+ - [sgqlc](https://github.com/profusion/sgqlc): A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.
-### Ruby
-#### [graphql-ruby](https://github.com/rmosolgo/graphql-ruby)
+## R
+### GraphQL Clients
+ - [ghql](https://github.com/ropensci/ghql): General purpose GraphQL R client.
+## Ruby
+### Server Libraries
+#### [graphql-ruby](https://github.com/rmosolgo/graphql-ruby)
A Ruby library for building GraphQL APIs.
-
-To run a hello world script with `graphql-ruby`:
-
-```bash
+To run a hello world script with \`graphql-ruby\`:
+\`\`\`bash
gem install graphql
-```
+\`\`\`
-Then run `ruby hello.rb` with this code in `hello.rb`:
+Then run \`ruby hello.rb\` with this code in \`hello.rb\`:
-```ruby
+\`\`\`ruby
require 'graphql'
class QueryType < GraphQL::Schema::Object
@@ -600,15 +838,11 @@ class Schema < GraphQL::Schema
end
puts Schema.execute('{ hello }').to_json
-```
-
+\`\`\`
There are also nice bindings for Relay and Rails.
-
#### [Agoo](https://github.com/ohler55/agoo)
-
A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.
-
-```ruby
+\`\`\`ruby
require 'agoo'
class Query
@@ -636,19 +870,17 @@ sleep
# a URL of localhost:6464/graphql?query={hello}
#
# ruby hello.rb
-```
-
-### Rust
+\`\`\`
+## Rust
+### Server Libraries
- [graphql-rust/juniper](https://github.com/graphql-rust/juniper): GraphQL server library for Rust
-### Scala
-
+## Scala
+### Server Libraries
#### [Sangria](http://sangria-graphql.org/) ([github](https://github.com/sangria-graphql/sangria)): A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).
-
-An example of a hello world GraphQL schema and query with `sangria`:
-
-```scala
+An example of a hello world GraphQL schema and query with \`sangria\`:
+\`\`\`scala
import sangria.schema._
import sangria.execution._
import sangria.macros._
@@ -662,123 +894,30 @@ val schema = Schema(QueryType)
val query = graphql"{ hello }"
Executor.execute(schema, query) map println
-```
-
-### OCaml / Reason
+\`\`\`
+## OCaml / Reason
+### Server Libraries
#### [ocaml-graphql-server](https://github.com/andreas/ocaml-graphql-server): GraphQL server library for OCaml and Reason
-## GraphQL Clients
-
-- [C# / .NET](#c-net-1)
-- [Clojurescript](#clojurescript-1)
-- [Elixir](#elixir-1)
-- [Elm](#elm)
-- [Flutter](#flutter)
-- [Go](#go-1)
-- [Haskell](#haskell)
-- [Java / Android](#java-android)
-- [JavaScript](#javascript-1)
-- [Julia](#julia)
-- [Kotlin](#kotlin)
-- [Swift / Objective-C iOS](#swift-objective-c-ios)
-- [Python](#python-1)
-- [R](#r)
-
-### C# / .NET
-
- - [GraphQL.Client](https://github.com/graphql-dotnet/graphql-client): A GraphQL Client for .NET.
- - [graphql-net-client](https://github.com/bkniffler/graphql-net-client): Basic example GraphQL client for .NET.
- - [SAHB.GraphQLClient](https://github.com/sahb1239/SAHB.GraphQLClient): GraphQL client which supports generating queries from C# classes
-
-### Clojurescript
-
- - [re-graph](https://github.com/oliyh/re-graph/): A GraphQL client implemented in Clojurescript with support for websockets.
-
-### Elixir
-
- - [Neuron](https://github.com/uesteibar/neuron): A GraphQL client for Elixir
- - [common_graphql_client](https://github.com/annkissam/common_graphql_client): Elixir GraphQL Client with HTTP and WebSocket support
-
-### Elm
+## Swift / Objective-C iOS
+### Server Libraries
+ - [Graphiti](https://github.com/GraphQLSwift/Graphiti): Swift library for building GraphQL schemas/types fast, safely and easily.
- - [dillonkearns/elm-graphql](https://github.com/dillonkearns/elm-graphql): Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.
-
-### Flutter
-
- - [graphql](https://github.com/zino-app/graphql-flutter#readme): A GraphQL client implementation in Flutter.
-
-### Go
-
- - [graphql](https://github.com/shurcooL/graphql#readme): A GraphQL client implementation in Go.
- - [machinebox/graphql](https://github.com/machinebox/graphql): An elegant low-level HTTP client for GraphQL.
-
-### Haskell
-
- - [morpheus-graphql-client](https://github.com/morpheusgraphql/morpheus-graphql): A strongly-typed GraphQL client implementation in Haksell.
-
-### Java / Android
-
- - [Apollo Android](https://github.com/apollographql/apollo-android): A strongly-typed, caching GraphQL client for the JVM, Android and Kotlin native.
-
- - [Nodes](https://github.com/americanexpress/nodes): A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.
-
-### JavaScript
-
- - [Relay](https://facebook.github.io/relay/) ([github](https://github.com/facebook/relay)) ([npm](https://www.npmjs.com/package/react-relay)): Facebook's framework for building React applications that talk to a GraphQL backend.
- - [Apollo Client](http://apollographql.com/client/) ([github](https://github.com/apollographql/apollo-client)): A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.
- - [graphql-request](https://github.com/prisma/graphql-request): A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.
- - [Lokka](https://github.com/kadirahq/lokka): A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).
- - [nanogql](https://github.com/yoshuawuyts/nanogql): Tiny GraphQL client library using template strings.
- - [gq-loader](https://github.com/Houfeng/gq-loader): A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.
- - [AWS Amplify](https://aws.github.io/aws-amplify): A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.
- - [Grafoo](https://github.com/grafoojs/grafoo): An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.
- - [urql](https://formidable.com/open-source/urql/) ([github](https://github.com/FormidableLabs/urql)): A highly customizable and versatile GraphQL client for React.
- - [graphqurl](https://github.com/hasura/graphqurl) ([npm](https://www.npmjs.com/package/graphqurl)): curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.
-
-### Julia
-
- - [Diana.jl](https://github.com/codeneomatrix/Diana.jl): A Julia GraphQL server implementation.
-
-### Kotlin
-
- - [graphql-kotlin](https://github.com/ExpediaGroup/graphql-kotlin/): A set of GraphQL libraries that includes a lightweight, typesafe GraphQL HTTP client.
-
-### Swift / Objective-C iOS
-
+### GraphQL Clients
- [Apollo iOS](https://www.apollographql.com/docs/ios/) ([github](https://github.com/apollographql/apollo-ios)): A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.
- [GraphQL iOS](https://github.com/funcompany/graphql-ios): An Objective-C GraphQL client for iOS.
- [Graphaello](https://github.com/nerdsupremacist/Graphaello): A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo
-### Python
-
- - [GQL](https://github.com/graphql-python/gql): A GraphQL client in Python.
- - [python-graphql-client](https://github.com/prisma/python-graphql-client): Simple GraphQL client for Python 2.7+.
- - [sgqlc](https://github.com/profusion/sgqlc): A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.
-
-### R
-
- - [ghql](https://github.com/ropensci/ghql): General purpose GraphQL R client.
-
## Tools
-
- - [graphiql](https://github.com/graphql/graphiql) ([npm](https://www.npmjs.com/package/graphiql)): An interactive in-browser GraphQL IDE.
- - [libgraphqlparser](https://github.com/graphql/libgraphqlparser): A GraphQL query language parser in C++ with C and C++ APIs.
- - [Graphql Language Service](https://github.com/graphql/graphql-language-service): An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).
- - [quicktype](https://quicktype.io) ([github](https://github.com/quicktype/quicktype)): Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.
- - [GraphQL Code Generator](https://graphql-code-generator.com): GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.
- - [GraphQL Inspector](https://www.graphql-inspector.com): Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.
- - [GraphQL Config](https://www.graphql-config.com): One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).
- - [GraphQL CLI](https://www.graphql-cli.com): A command line tool for common GraphQL development workflows.
- - [GraphQL Scalars](https://github.com/Urigo/graphql-scalars): A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.
- - [GraphQL Tools](https://www.graphql-tools.com): A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).
- - [SOFA](https://github.com/Urigo/sofa): Generate REST API from your GraphQL API.
- - [GraphQL-ESLint](https://github.com/dotansimha/graphql-eslint): integrates GraphQL AST in the ESLint core (as a parser).
- - [GraphQL Modules](https://www.graphql-modules.com): lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.
- - [GraphQL Mesh](https://www.graphql-mesh.com): allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.
+${pageContext.tools
+ .map(
+ (library: any) =>
+ `- [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([npm](https://www.npmjs.com/package/${library.npm})): ${library.description}`
+ )
+ .join("\n")}
## Services
-
- [Apollo Graph Manager](https://engine.apollographql.com): A cloud service for monitoring the performance and usage of your GraphQL backend.
- [GraphCMS](https://graphcms.com/): A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.
- [Prisma](https://www.prisma.io) ([github](https://github.com/prisma)): A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.
@@ -787,9 +926,13 @@ Executor.execute(schema, query) map println
- [Elide](https://elide.io): A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.
- [Hasura](https://hasura.io) ([github](https://github.com/hasura)): Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.
- [FaunaDB](https://docs.fauna.com/fauna/current/graphql): Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.
- - [Back4App](https://www.back4app.com/docs/parse-graphql/graphql-getting-started): Back4App is a Backend as a Service Platform that helps you Build and Scale modern applications based on GraphQL.
## More Stuff
-
- [awesome-graphql](https://github.com/chentsulin/awesome-graphql): A fantastic community maintained collection of libraries, resources, and more.
-
+ `}
+
+
+
+
+ )
+}
diff --git a/static/img/clojure.svg b/static/img/clojure.svg
new file mode 100644
index 0000000000..5ab8126b90
--- /dev/null
+++ b/static/img/clojure.svg
@@ -0,0 +1,50 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/img/csharp.svg b/static/img/csharp.svg
new file mode 100644
index 0000000000..56f39374dd
--- /dev/null
+++ b/static/img/csharp.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/elixir.svg b/static/img/elixir.svg
new file mode 100644
index 0000000000..797b0114e8
--- /dev/null
+++ b/static/img/elixir.svg
@@ -0,0 +1 @@
+
diff --git a/static/img/elm.svg b/static/img/elm.svg
new file mode 100644
index 0000000000..ef7f61a9b6
--- /dev/null
+++ b/static/img/elm.svg
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/erlang.svg b/static/img/erlang.svg
new file mode 100644
index 0000000000..e8f2bc5dd3
--- /dev/null
+++ b/static/img/erlang.svg
@@ -0,0 +1,61 @@
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/golang.svg b/static/img/golang.svg
new file mode 100644
index 0000000000..ea3c66fca6
--- /dev/null
+++ b/static/img/golang.svg
@@ -0,0 +1 @@
+
diff --git a/static/img/groovy.svg b/static/img/groovy.svg
new file mode 100644
index 0000000000..e4e37042b2
--- /dev/null
+++ b/static/img/groovy.svg
@@ -0,0 +1,449 @@
+
+image/svg+xml
+
\ No newline at end of file
diff --git a/static/img/java.svg b/static/img/java.svg
new file mode 100644
index 0000000000..b39f039ca4
--- /dev/null
+++ b/static/img/java.svg
@@ -0,0 +1 @@
+
diff --git a/static/img/julia.svg b/static/img/julia.svg
new file mode 100644
index 0000000000..2abc433fbf
--- /dev/null
+++ b/static/img/julia.svg
@@ -0,0 +1 @@
+Asset 2
diff --git a/static/img/kotlin.svg b/static/img/kotlin.svg
new file mode 100644
index 0000000000..3480717db7
--- /dev/null
+++ b/static/img/kotlin.svg
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/node.svg b/static/img/node.svg
new file mode 100644
index 0000000000..310150e016
--- /dev/null
+++ b/static/img/node.svg
@@ -0,0 +1 @@
+
diff --git a/static/img/ocaml.svg b/static/img/ocaml.svg
new file mode 100644
index 0000000000..6b1fe9aca6
--- /dev/null
+++ b/static/img/ocaml.svg
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/img/perl.svg b/static/img/perl.svg
new file mode 100644
index 0000000000..3b41afb6bc
--- /dev/null
+++ b/static/img/perl.svg
@@ -0,0 +1,23 @@
+
+
+
+ code
+ Created with Sketch.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ $_
+
+
+
diff --git a/static/img/php.svg b/static/img/php.svg
new file mode 100644
index 0000000000..72e0774892
--- /dev/null
+++ b/static/img/php.svg
@@ -0,0 +1,96 @@
+
+
+ Official PHP Logo
+
+
+
+ image/svg+xml
+
+ Official PHP Logo
+
+
+ Colin Viebrock
+
+
+
+
+
+
+
+
+
+
+
+ Copyright Colin Viebrock 1997 - All rights reserved.
+
+
+ 1997
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/python.svg b/static/img/python.svg
new file mode 100644
index 0000000000..366f52f339
--- /dev/null
+++ b/static/img/python.svg
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/r.svg b/static/img/r.svg
new file mode 100644
index 0000000000..389b03c113
--- /dev/null
+++ b/static/img/r.svg
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/ruby.svg b/static/img/ruby.svg
new file mode 100644
index 0000000000..e7d431ed60
--- /dev/null
+++ b/static/img/ruby.svg
@@ -0,0 +1,947 @@
+
+image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/img/rust.svg b/static/img/rust.svg
new file mode 100644
index 0000000000..81131b74ee
--- /dev/null
+++ b/static/img/rust.svg
@@ -0,0 +1,19 @@
+
+
+
\ No newline at end of file
diff --git a/static/img/scala.svg b/static/img/scala.svg
new file mode 100644
index 0000000000..91acfd11b8
--- /dev/null
+++ b/static/img/scala.svg
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/swift.svg b/static/img/swift.svg
new file mode 100644
index 0000000000..69df9cd20a
--- /dev/null
+++ b/static/img/swift.svg
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
+
+
From c2efe52e63aec71d79af4a93819d9fcad1f162e3 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Fri, 23 Oct 2020 04:38:28 +0300
Subject: [PATCH 02/27] New code.json
---
data/code.json | 271 ++++++++++++++++++++++++++++++++++
data/js-graphql-clients.json | 72 ---------
data/js-server-libraries.json | 26 ----
data/tools.json | 99 -------------
gatsby-node.js | 6 +-
scripts/sort-libraries.js | 8 +
src/pages/code.tsx | 67 ++-------
7 files changed, 293 insertions(+), 256 deletions(-)
create mode 100644 data/code.json
delete mode 100644 data/js-graphql-clients.json
delete mode 100644 data/js-server-libraries.json
delete mode 100644 data/tools.json
diff --git a/data/code.json b/data/code.json
new file mode 100644
index 0000000000..f698d515ff
--- /dev/null
+++ b/data/code.json
@@ -0,0 +1,271 @@
+{
+ "Libraries": {
+ "C# / .NET": {
+ "Server Libraries": [
+ {
+ "name": "graphql-dotnet",
+ "description": "GraphQL for .NET",
+ "howto": "```csharp\nusing System;\nusing GraphQL;\nusing GraphQL.Types;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n var schema = Schema.For(@\"\n type Query {\n hello: String\n }\n \");\n\n var json = schema.Execute(_ =>\n {\n _.Query = \"{ hello }\";\n _.Root = new { Hello = \"Hello World!\" };\n });\n\n Console.WriteLine(json);\n }\n} \n```",
+ "url": "https://github.com/graphql-dotnet/graphql-dotnet",
+ "github": "graphql-dotnet/graphql-dotnet"
+ },
+ {
+ "name": "graphql-net",
+ "description": "Convert GraphQL to IQueryable",
+ "url": "https://github.com/ckimes89/graphql-net",
+ "github": "ckimes89/graphql-net"
+ },
+ {
+ "name": "Entity GraphQL",
+ "description": ".NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)",
+ "url": "https://github.com/lukemurray/EntityGraphQL",
+ "github": "lukemurray/EntityGraphQL"
+ },
+ {
+ "name": "Hot Chocolate",
+ "description": "GraphQL Server for .NET core and .NET classic",
+ "url": "https://github.com/ChilliCream/hotchocolate",
+ "github": "ChilliCream/hotchocolate"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "GraphQL.Client",
+ "description": "A GraphQL Client for .NET.",
+ "url": "https://github.com/graphql-dotnet/graphql-client",
+ "github": "graphql-dotnet/graphql-client"
+ },
+ {
+ "name": "graphql-net-client",
+ "description": "Basic example GraphQL client for .NET.",
+ "url": "https://github.com/bkniffler/graphql-net-client",
+ "github": "bkniffler/graphql-net-client"
+ },
+ {
+ "name": "SAHB.GraphQLClient",
+ "description": "GraphQL client which supports generating queries from C# classes",
+ "url": "https://github.com/sahb1239/SAHB.GraphQLClient",
+ "github": "SAHB.GraphQLClient"
+ }
+ ]
+ },
+ "JavaScript": {
+ "GraphQL Clients": [
+ {
+ "name": "Relay",
+ "description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
+ "url": "https://facebook.github.io/relay/",
+ "npm": "react-relay",
+ "github": "facebook/relay"
+ },
+ {
+ "name": "Apollo Client",
+ "description": "A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.",
+ "url": "http://apollographql.com/client/",
+ "npm": "@apollo/client",
+ "github": "apollographql/apollo-client"
+ },
+ {
+ "name": "GraphQL Request",
+ "description": "A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.",
+ "url": "https://github.com/prisma/graphql-request",
+ "npm": "graphql-request",
+ "github": "prisma-labs/graphql-request"
+ },
+ {
+ "name": "Lokka",
+ "description": "A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).",
+ "url": "https://github.com/kadirahq/lokka",
+ "npm": "lokka",
+ "github": "kadirahq/lokka"
+ },
+ {
+ "name": "nanogql",
+ "description": "Tiny GraphQL client library using template strings.",
+ "url": "https://github.com/yoshuawuyts/nanogql",
+ "npm": "nanographql",
+ "github": "choojs/nanographql"
+ },
+ {
+ "name": "gq-loader",
+ "description": "A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.",
+ "url": "https://github.com/Houfeng/gq-loader",
+ "npm": "gq-loader",
+ "github": "Houfeng/gq-loader"
+ },
+ {
+ "name": "AWS Amplify",
+ "description": "A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.",
+ "url": "https://docs.amplify.aws/",
+ "npm": "aws-amplify",
+ "github": "aws-amplify/amplify-js"
+ },
+ {
+ "name": "Grafoo",
+ "description": "An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.",
+ "url": "https://github.com/grafoojs/grafoo",
+ "npm": "@grafoo/core",
+ "github": "grafoojs/grafoo"
+ },
+ {
+ "name": "urql",
+ "description": "A highly customizable and versatile GraphQL client for React.",
+ "url": "https://formidable.com/open-source/urql/",
+ "npm": "urql",
+ "github": "FormidableLabs/urql"
+ },
+ {
+ "name": "graphqurl",
+ "description": "curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.",
+ "url": "https://github.com/hasura/graphqurl",
+ "npm": "graphqurl",
+ "github": "hasura/graphqurl"
+ }
+ ],
+ "Server Libraries": [
+ {
+ "name": "GraphQL.js",
+ "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
+ "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
+ "url": "/graphql-js/",
+ "npm": "graphql",
+ "github": "graphql/graphql-js"
+ },
+ {
+ "name": "Express GraphQL",
+ "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
+ "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
+ "url": "/graphql-js/running-an-express-graphql-server/",
+ "npm": "express-graphql",
+ "github": "graphql/express-graphql"
+ },
+ {
+ "name": "Apollo Server",
+ "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
+ "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
+ "url": "https://www.apollographql.com/docs/apollo-server/",
+ "npm": "apollo-server-express",
+ "github": "apollographql/apollo-server"
+ }
+ ]
+ },
+ "Ruby": {
+ "Server Libraries": [
+ {
+ "name": "graphql-ruby",
+ "description": "A Ruby library for building GraphQL APIs.",
+ "howto": "To run a hello world script with `graphql-ruby`:\n```bash\ngem install graphql\n```\n\nThen run `ruby hello.rb` with this code in `hello.rb`:\n\n```ruby\nrequire 'graphql'\n\nclass QueryType < GraphQL::Schema::Object\n graphql_name 'Query'\n field :hello do\n type types.String\n resolve -> (obj, args, ctx) { 'Hello world!' }\n end\nend\n\nclass Schema < GraphQL::Schema\n query QueryType\nend\n\nputs Schema.execute('{ hello }').to_json\n```\nThere are also nice bindings for Relay and Rails.",
+ "url": "https://github.com/rmosolgo/graphql-ruby",
+ "gem": "graphql",
+ "github": "rmosolgo/graphql-ruby"
+ },
+ {
+ "name": "Agoo",
+ "description": "A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.",
+ "howto": "```ruby\nrequire 'agoo'\n\nclass Query\n def hello\n 'hello'\n end\nend\n\nclass Schema\n attr_reader :query\n\n def initialize\n @query = Query.new()\n end\nend\n\nAgoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql')\nAgoo::Server.start()\nAgoo::GraphQL.schema(Schema.new) {\n Agoo::GraphQL.load(%^type Query { hello: String }^)\n}\nsleep\n\n# To run this GraphQL example type the following then go to a browser and enter\n# a URL of localhost:6464/graphql?query={hello}\n#\n# ruby hello.rb\n```",
+ "gem": "agoo",
+ "github": "ohler55/agoo"
+ }
+ ]
+ }
+ },
+ "Tools": [
+ {
+ "name": "GraphiQL",
+ "description": "An interactive in-browser GraphQL IDE.",
+ "url": "https://github.com/graphql/graphiql",
+ "npm": "graphiql",
+ "github": "graphql/graphiql"
+ },
+ {
+ "name": "libgraphqlparser",
+ "description": "A GraphQL query language parser in C++ with C and C++ APIs.",
+ "url": "https://github.com/graphql/libgraphqlparser",
+ "github": "graphql/libgraphqlparser"
+ },
+ {
+ "name": "GraphQL Language Service",
+ "description": "An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).",
+ "url": "https://github.com/graphql/graphql-language-service",
+ "npm": "graphql-language-service",
+ "github": "graphql/graphql-language-service"
+ },
+ {
+ "name": "quicktype",
+ "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
+ "url": "https://quicktype.io/",
+ "npm": "quicktype",
+ "github": "quicktype/quicktype"
+ },
+ {
+ "name": "GraphQL-ESLint",
+ "description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
+ "url": "https://github.com/dotansimha/graphql-eslint/",
+ "npm": "@graphql-eslint/eslint-plugin",
+ "github": "dotansimha/graphql-eslint/"
+ },
+ {
+ "name": "GraphQL Modules",
+ "description": "GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.",
+ "url": "https://graphql-modules.com",
+ "npm": "graphql-modules",
+ "github": "Urigo/graphql-modules"
+ },
+ {
+ "name": "GraphQL Tools",
+ "description": "A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).",
+ "url": "https://graphql-tools.com",
+ "npm": "graphql-tools",
+ "github": "ardatan/graphql-tools"
+ },
+ {
+ "name": "GraphQL Config",
+ "description": "One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).",
+ "url": "https://graphql-config.com",
+ "npm": "graphql-config",
+ "github": "kamilkisiela/graphql-config"
+ },
+ {
+ "name": "GraphQL Mesh",
+ "description": "GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.",
+ "url": "https://graphql-mesh.com",
+ "npm": "@graphql-mesh/cli",
+ "github": "Urigo/graphql-mesh"
+ },
+ {
+ "name": "GraphQL Code Generator",
+ "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
+ "url": "https://graphql-code-generator.com",
+ "npm": "@graphql-codegen/cli",
+ "github": "dotansimha/graphql-code-generator"
+ },
+ {
+ "name": "GraphQL CLI",
+ "description": "A command line tool for common GraphQL development workflows.",
+ "url": "https://graphql-cli.com",
+ "npm": "graphql-cli",
+ "github": "Urigo/graphql-cli"
+ },
+ {
+ "name": "GraphQL Inspector",
+ "description": "Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.",
+ "url": "https://graphql-inspector.com/",
+ "npm": "@graphql-inspector/cli",
+ "github": "kamilkisiela/graphql-inspector"
+ },
+ {
+ "name": "GraphQL Scalars",
+ "description": "A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.",
+ "url": "https://github.com/Urigo/graphql-scalars",
+ "npm": "graphql-scalars",
+ "github": "Urigo/graphql-scalars"
+ },
+ {
+ "name": "SOFA",
+ "description": "Generate REST API from your GraphQL API.",
+ "url": "https://sofa-api.com/",
+ "npm": "sofa-api",
+ "github": "Urigo/SOFA"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/data/js-graphql-clients.json b/data/js-graphql-clients.json
deleted file mode 100644
index 8229754fcf..0000000000
--- a/data/js-graphql-clients.json
+++ /dev/null
@@ -1,72 +0,0 @@
-[
- {
- "name": "Relay",
- "description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
- "url": "https://facebook.github.io/relay/",
- "npm": "react-relay",
- "github": "facebook/relay"
- },
- {
- "name": "Apollo Client",
- "description": "A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.",
- "url": "http://apollographql.com/client/",
- "npm": "@apollo/client",
- "github": "apollographql/apollo-client"
- },
- {
- "name": "GraphQL Request",
- "description": "A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.",
- "url": "https://github.com/prisma/graphql-request",
- "npm": "graphql-request",
- "github": "prisma-labs/graphql-request"
- },
- {
- "name": "Lokka",
- "description": "A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).",
- "url": "https://github.com/kadirahq/lokka",
- "npm": "lokka",
- "github": "kadirahq/lokka"
- },
- {
- "name": "nanogql",
- "description": "Tiny GraphQL client library using template strings.",
- "url": "https://github.com/yoshuawuyts/nanogql",
- "npm": "nanographql",
- "github": "yoshuawuyts/nanographql"
- },
- {
- "name": "gq-loader",
- "description": "A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.",
- "url": "https://github.com/Houfeng/gq-loader",
- "npm": "gq-loader",
- "github": "Houfeng/gq-loader"
- },
- {
- "name": "AWS Amplify",
- "description": "A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.",
- "url": "https://docs.amplify.aws/",
- "npm": "aws-amplify",
- "github": "aws-amplify/amplify-js"
- },
- {
- "name": "Grafoo",
- "description": "An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.",
- "url": "https://github.com/grafoojs/grafoo",
- "npm": "@grafoo/core",
- "github": "grafoojs/grafoo"
- },
- {
- "name": "urql",
- "description": "A highly customizable and versatile GraphQL client for React.",
- "url": "https://formidable.com/open-source/urql/",
- "npm": "urql",
- "github": "FormidableLabs/urql"
- },
- {
- "name": "graphqurl",
- "description": "curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.",
- "url": "https://github.com/hasura/graphqurl",
- "npm": "graphqurl",
- "github": "hasura/graphqurl"
- }
-]
\ No newline at end of file
diff --git a/data/js-server-libraries.json b/data/js-server-libraries.json
deleted file mode 100644
index 848ab3623a..0000000000
--- a/data/js-server-libraries.json
+++ /dev/null
@@ -1,26 +0,0 @@
-[
- {
- "name": "GraphQL.js",
- "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
- "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
- "url": "/graphql-js/",
- "npm": "graphql",
- "github": "graphql/graphql-js"
- },
- {
- "name": "Express GraphQL",
- "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
- "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
- "url": "/graphql-js/running-an-express-graphql-server/",
- "npm": "express-graphql",
- "github": "graphql/express-graphql"
- },
- {
- "name": "Apollo Server",
- "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
- "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
- "url": "https://www.apollographql.com/docs/apollo-server/",
- "npm": "apollo-server-express",
- "github": "apollographql/apollo-server"
- }
-]
\ No newline at end of file
diff --git a/data/tools.json b/data/tools.json
deleted file mode 100644
index f60b6ac77a..0000000000
--- a/data/tools.json
+++ /dev/null
@@ -1,99 +0,0 @@
-[
- {
- "name": "GraphiQL",
- "description": "An interactive in-browser GraphQL IDE.",
- "url": "https://github.com/graphql/graphiql",
- "npm": "graphiql",
- "github": "graphql/graphiql"
- },
- {
- "name": "libgraphqlparser",
- "description": "A GraphQL query language parser in C++ with C and C++ APIs.",
- "url": "https://github.com/graphql/libgraphqlparser",
- "github": "graphql/libgraphqlparser"
- },
- {
- "name": "GraphQL Language Service",
- "description": "An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).",
- "url": "https://github.com/graphql/graphql-language-service",
- "npm": "graphql-language-service",
- "github": "graphql/graphql-language-service"
- },
- {
- "name": "quicktype",
- "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
- "url": "https://quicktype.io/",
- "npm": "quicktype",
- "github": "quicktype/quicktype"
- },
- {
- "name": "GraphQL-ESLint",
- "description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
- "url": "https://github.com/dotansimha/graphql-eslint/",
- "npm": "@graphql-eslint/eslint-plugin",
- "github": "dotansimha/graphql-eslint/"
- },
- {
- "name": "GraphQL Modules",
- "description": "GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.",
- "url": "https://graphql-modules.com",
- "npm": "graphql-modules",
- "github": "Urigo/graphql-modules"
- },
- {
- "name": "GraphQL Tools",
- "description": "A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).",
- "url": "https://graphql-tools.com",
- "npm": "graphql-tools",
- "github": "ardatan/graphql-tools"
- },
- {
- "name": "GraphQL Config",
- "description": "One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).",
- "url": "https://graphql-config.com",
- "npm": "graphql-config",
- "github": "kamilkisiela/graphql-config"
- },
- {
- "name": "GraphQL Mesh",
- "description": "GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.",
- "url": "https://graphql-mesh.com",
- "npm": "@graphql-mesh/cli",
- "github": "Urigo/graphql-mesh"
- },
- {
- "name": "GraphQL Code Generator",
- "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
- "url": "https://graphql-code-generator.com",
- "npm": "@graphql-codegen/cli",
- "github": "dotansimha/graphql-code-generator"
- },
- {
- "name": "GraphQL CLI",
- "description": "A command line tool for common GraphQL development workflows.",
- "url": "https://graphql-cli.com",
- "npm": "graphql-cli",
- "github": "Urigo/graphql-cli"
- },
- {
- "name": "GraphQL Inspector",
- "description": "Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.",
- "url": "https://graphql-inspector.com/",
- "npm": "@graphql-inspector/cli",
- "github": "kamilkisiela/graphql-inspector"
- },
- {
- "name": "GraphQL Scalars",
- "description": "A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.",
- "url": "https://github.com/Urigo/graphql-scalars",
- "npm": "graphql-scalars",
- "github": "Urigo/graphql-scalars"
- },
- {
- "name": "SOFA",
- "description": "Generate REST API from your GraphQL API.",
- "url": "https://sofa-api.com/",
- "npm": "sofa-api",
- "github": "Urigo/SOFA"
- }
-]
\ No newline at end of file
diff --git a/gatsby-node.js b/gatsby-node.js
index 82b904ee78..177f44f490 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -10,13 +10,16 @@ exports.onCreatePage = async ({ page, actions }) => {
sourcePath: path.relative(__dirname, page.componentPath),
}
if (page.path === "/code" || page.path === "/code/") {
- const [jsGraphQLClients, jsServerLibraries, tools] = await Promise.all([
+ const [jsGraphQLClients, jsServerLibraries, rubyServerLibraries, tools] = await Promise.all([
sortLibs(
JSON.parse(readFileSync("./data/js-graphql-clients.json", "utf8"))
),
sortLibs(
JSON.parse(readFileSync("./data/js-server-libraries.json", "utf8"))
),
+ sortLibs(
+ JSON.parse(readFileSync("./data/ruby-server-libraries.json", "utf8"))
+ ),
sortLibs(JSON.parse(readFileSync("./data/tools.json", "utf8"))),
])
@@ -24,6 +27,7 @@ exports.onCreatePage = async ({ page, actions }) => {
...context,
jsGraphQLClients,
jsServerLibraries,
+ rubyServerLibraries,
tools,
}
}
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index ef187c2cc8..46d392b6db 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -91,11 +91,19 @@ const getNpmStats = async packageName => {
return { downloadCount }
}
+const getGemStats = async packageName => {
+ const response = await fetch(`https://rubygems.org/api/v1/gems/${encodeURIComponent(packageName)}.json`);
+ const responseJson = await response.json()
+ const downloadCount = responseJson.downloads
+ return { downloadCount }
+}
+
const sortLibs = async libs => {
const libsWithScores = await Promise.all(
libs.map(async lib => {
const [npmStats = {}, githubStats = {}] = await Promise.all([
lib.npm && getNpmStats(lib.npm),
+ lib.gem && getGemStats(lib.gem),
lib.github && getGitHubStats(lib.github),
])
return {
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 9ad5447d36..0b89384e96 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -813,64 +813,15 @@ There are also nice bindings for [Relay](https://facebook.github.io/relay/), Dja
## Ruby
### Server Libraries
-#### [graphql-ruby](https://github.com/rmosolgo/graphql-ruby)
-A Ruby library for building GraphQL APIs.
-To run a hello world script with \`graphql-ruby\`:
-\`\`\`bash
-gem install graphql
-\`\`\`
-
-Then run \`ruby hello.rb\` with this code in \`hello.rb\`:
-
-\`\`\`ruby
-require 'graphql'
-
-class QueryType < GraphQL::Schema::Object
- graphql_name 'Query'
- field :hello do
- type types.String
- resolve -> (obj, args, ctx) { 'Hello world!' }
- end
-end
-
-class Schema < GraphQL::Schema
- query QueryType
-end
-
-puts Schema.execute('{ hello }').to_json
-\`\`\`
-There are also nice bindings for Relay and Rails.
-#### [Agoo](https://github.com/ohler55/agoo)
-A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.
-\`\`\`ruby
-require 'agoo'
-
-class Query
- def hello
- 'hello'
- end
-end
-
-class Schema
- attr_reader :query
-
- def initialize
- @query = Query.new()
- end
-end
-
-Agoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql')
-Agoo::Server.start()
-Agoo::GraphQL.schema(Schema.new) {
- Agoo::GraphQL.load(%^type Query { hello: String }^)
-}
-sleep
-
-# To run this GraphQL example type the following then go to a browser and enter
-# a URL of localhost:6464/graphql?query={hello}
-#
-# ruby hello.rb
-\`\`\`
+${pageContext.rubyServerLibraries
+ .map(
+ (
+ library: any
+ ) => `#### [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([gem](https://rubygems.org/gems/${library.npm}))
+${library.description}
+${library.howto}`
+ )
+ .join("\n")}
## Rust
### Server Libraries
From 8729d1dac5633018df6bb4d1d80c9ffe4f3ae107 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 26 Oct 2020 19:56:55 +0300
Subject: [PATCH 03/27] Move all libraries to data.json
---
data/code.json | 527 +++++++++++-
gatsby-node.js | 30 +-
scripts/sort-libraries.js | 55 +-
src/pages/code.tsx | 952 +++------------------
static/img/d.svg | 215 +++++
static/img/{golang.svg => go.svg} | 0
static/img/haskell.svg | 12 +
static/img/{java.svg => java-android.svg} | 0
static/img/{node.svg => javascript.svg} | 0
static/img/{ocaml.svg => ocaml-reason.svg} | 0
10 files changed, 906 insertions(+), 885 deletions(-)
create mode 100644 static/img/d.svg
rename static/img/{golang.svg => go.svg} (100%)
create mode 100644 static/img/haskell.svg
rename static/img/{java.svg => java-android.svg} (100%)
rename static/img/{node.svg => javascript.svg} (100%)
rename static/img/{ocaml.svg => ocaml-reason.svg} (100%)
diff --git a/data/code.json b/data/code.json
index f698d515ff..067c12e2c3 100644
--- a/data/code.json
+++ b/data/code.json
@@ -13,7 +13,7 @@
"name": "graphql-net",
"description": "Convert GraphQL to IQueryable",
"url": "https://github.com/ckimes89/graphql-net",
- "github": "ckimes89/graphql-net"
+ "github": "chkimes/graphql-net"
},
{
"name": "Entity GraphQL",
@@ -45,11 +45,253 @@
"name": "SAHB.GraphQLClient",
"description": "GraphQL client which supports generating queries from C# classes",
"url": "https://github.com/sahb1239/SAHB.GraphQLClient",
- "github": "SAHB.GraphQLClient"
+ "github": "sahb1239/SAHB.GraphQLClient"
}
]
},
+ "Clojure": {
+ "Server Libraries": [
+ {
+ "name": "alumbra",
+ "description": "A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).",
+ "howto": "```clojure\n(require '[alumbra.core :as alumbra]\n '[claro.data :as data])\n\n(def schema\n \"type Person { name: String!, friends: [Person!]! }\n type QueryRoot { person(id: ID!): Person, me: Person! }\n schema { query: QueryRoot }\")\n\n(defrecord Person [id]\n data/Resolvable\n (resolve! [_ _]\n {:name (str \"Person #\" id)\n :friends (map ->Person (range (inc id) (+ id 3)))}))\n\n(def QueryRoot\n {:person (map->Person {})\n :me (map->Person {:id 0})})\n\n(def app\n (alumbra/handler\n {:schema schema\n :query QueryRoot}))\n\n(defonce my-graphql-server\n (aleph.http/start-server #'app {:port 3000}))\n```\n\n```bash\n$ curl -XPOST \"http://0:3000\" -H'Content-Type: application/json' -d'{\n \"query\": \"{ me { name, friends { name } } }\"\n}'\n{\"data\":{\"me\":{\"name\":\"Person #0\",\"friends\":[{\"name\":\"Person #1\"},{\"name\":\"Person #2\"}]}}}\n```",
+ "url": "https://github.com/alumbra/alumbra",
+ "github": "alumbra/alumbra"
+ },
+ {
+ "name": "graphql-clj",
+ "description": "A Clojure library that provides a GraphQL implementation.",
+ "howto": "Code that executes a hello world GraphQL query with `graphql-clj`:\n```clojure\n\n(def schema \"type QueryRoot {\n hello: String\n }\")\n\n(defn resolver-fn [type-name field-name]\n (get-in {\"QueryRoot\" {\"hello\" (fn [context parent & rest]\n \"Hello world!\")}}\n [type-name field-name]))\n\n(require '[graphql-clj.executor :as executor])\n\n(executor/execute nil schema resolver-fn \"{ hello }\")\n```",
+ "url": "https://github.com/tendant/graphql-clj",
+ "github": "tendant/graphql-clj"
+ },
+ {
+ "name": "lacinia",
+ "description": "A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.",
+ "github": "walmartlabs/lacinia",
+ "url": "https://github.com/walmartlabs/lacinia"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "regraph",
+ "description": "A GraphQL client implemented in Clojurescript with support for websockets.",
+ "github": "oliyh/re-graph",
+ "url": "https://github.com/oliyh/re-graph/"
+ }
+ ]
+ },
+ "D": {
+ "Server Libraries": [
+ {
+ "name": "graphqld",
+ "description": "A GraphQL implementaiton for the D Programming Language.",
+ "github": "https://github.com/burner/graphqld",
+ "url": "https://github.com/burner/graphqld"
+ }
+ ]
+ },
+ "Elixir": {
+ "GraphQL Clients": [
+ {
+ "name": "Neuron",
+ "description": "A GraphQL client for Elixir",
+ "github": "https://github.com/uesteibar/neuron",
+ "url": "https://github.com/uesteibar/neuron"
+ },
+ {
+ "name": "common_graphql_client",
+ "description": "Elixir GraphQL Client with HTTP and WebSocket support",
+ "github": "https://github.com/annkissam/common_graphql_client",
+ "url": "https://github.com/annkissam/common_graphql_client"
+ }
+ ],
+ "Server Libraries": [
+ {
+ "name": "absinthe",
+ "description": "GraphQL implementation for Elixir.",
+ "github": "absinthe-graphql/absinthe",
+ "url": "https://github.com/absinthe-graphql/absinthe"
+ },
+ {
+ "name": "graphql-elixir",
+ "description": "An Elixir implementation of Facebook's GraphQL.",
+ "github": "graphql-elixir/graphql",
+ "url": "https://github.com/graphql-elixir/graphql"
+ }
+ ]
+ },
+ "Elm": {
+ "GraphQL Clients": [
+ {
+ "name": "dillonkearns/elm-graphql",
+ "description": "Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.",
+ "url": "https://github.com/dillonkearns/elm-graphql",
+ "github": "dillonkearns/elm-graphql"
+ }
+ ]
+ },
+ "Erlang": {
+ "Server Libraries": [
+ {
+ "name": "graphql-erlang",
+ "description": "GraphQL implementation in Erlang.",
+ "url": "https://github.com/shopgun/graphql-erlang",
+ "github": "jlouis/graphql-erlang"
+ }
+ ]
+ },
+ "Flutter": {
+ "GraphQL Clients": [
+ {
+ "name": "graphql",
+ "description": "A GraphQL client implementation in Flutter.",
+ "url": "https://github.com/zino-app/graphql-flutter#readme",
+ "github": "zino-app/graphql-flutter"
+ }
+ ]
+ },
+ "Go": {
+ "Server Libraries": [
+ {
+ "name": "graphql-go",
+ "description": "An implementation of GraphQL for Go / Golang.",
+ "url": "https://github.com/graphql-go/graphql",
+ "github": "graphql-go/graphql"
+ },
+ {
+ "name": "graph-gophers/graphql-go",
+ "description": "An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).",
+ "url": "https://github.com/graph-gophers/graphql-go",
+ "github": "graph-gophers/graphql-go"
+ },
+ {
+ "name": "99designs/gqlgen",
+ "description": "Go generate based graphql server library.",
+ "url": "https://github.com/99designs/gqlgen",
+ "github": "99designs/gqlgen"
+ },
+ {
+ "name": "graphql-relay-go",
+ "description": "A Go/Golang library to help construct a graphql-go server supporting react-relay.",
+ "url": "https://github.com/graphql-go/relay",
+ "github": "graphql-go/relay"
+ },
+ {
+ "name": "machinebox/graphql",
+ "description": "An elegant low-level HTTP client for GraphQL.",
+ "url": "https://github.com/machinebox/graphql",
+ "github": "machinebox/graphql"
+ },
+ {
+ "name": "samsarahq/thunder",
+ "description": "A GraphQL implementation with easy schema building, live queries, and batching.",
+ "url": "https://github.com/samsarahq/thunder",
+ "github": "samsarahq/thunder"
+ },
+ {
+ "name": "appointy/jaal",
+ "description": "Develop spec compliant GraphQL servers in Go.",
+ "url": "https://github.com/appointy/jaal",
+ "github": "appointy/jaal"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "graphql",
+ "description": "A GraphQL client implementation in Go.",
+ "url": "https://github.com/shurcooL/graphql#readme",
+ "github": "shurcooL/graphql"
+ }
+ ]
+ },
+ "Groovy": {
+ "Server Libraries": [
+ {
+ "name": "gorm-graphql",
+ "howto": "**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of \"data fetchers\" to query, update, and delete data through executions of the schema.\n\n**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:\n\n- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.\n\n- Generates the schema at startup with spring bean configuration to make it easy to extend.\n\n- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.\n\n- Overrides the default data binder to use the data binding provided by Grails\n- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier\n\nSee [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.",
+ "github": "grails/gorm-graphql",
+ "url": "https://github.com/grails/gorm-graphql/"
+ },
+ {
+ "name": "GQL",
+ "description": "GQL is a Groove library for GraphQL",
+ "url": "https://grooviter.github.io/gql/",
+ "github": "grooviter/gql"
+ }
+ ]
+ },
+ "Haskell": {
+ "Server Libraries": [
+ {
+ "name": "Morpheus GraphQL",
+ "description": "A Haskell library for building GraphQL APIs.",
+ "howto": "\nHello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.\n",
+ "url": "https://github.com/morpheusgraphql/morpheus-graphql",
+ "github": "https://github.com/morpheusgraphql/morpheus-graphql"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "morpheus-graphql-client",
+ "description": "A strongly-typed GraphQL client implementation in Haksell.",
+ "url": "https://github.com/morpheusgraphql/morpheus-graphql",
+ "github": "https://github.com/morpheusgraphql/morpheus-graphql"
+ }
+ ]
+ },
+ "Java / Android": {
+ "Server Libraries": [
+ {
+ "name": "graphql-java",
+ "description": "A Java library for building GraphQL APIs.",
+ "howto": "Code that executes a hello world GraphQL query with `graphql-java`:\n\n```java\nimport graphql.ExecutionResult;\nimport graphql.GraphQL;\nimport graphql.schema.GraphQLSchema;\nimport graphql.schema.StaticDataFetcher;\nimport graphql.schema.idl.RuntimeWiring;\nimport graphql.schema.idl.SchemaGenerator;\nimport graphql.schema.idl.SchemaParser;\nimport graphql.schema.idl.TypeDefinitionRegistry;\n\nimport static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;\n\npublic class HelloWorld {\n\n public static void main(String[] args) {\n String schema = \"type Query{hello: String} schema{query: Query}\";\n\n SchemaParser schemaParser = new SchemaParser();\n TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);\n\n RuntimeWiring runtimeWiring = new RuntimeWiring()\n .type(\"Query\", builder -> builder.dataFetcher(\"hello\", new StaticDataFetcher(\"world\")))\n .build();\n\n SchemaGenerator schemaGenerator = new SchemaGenerator();\n GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);\n\n GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();\n ExecutionResult executionResult = build.execute(\"{hello}\");\n\n System.out.println(executionResult.getData().toString());\n // Prints: {hello=world}\n }\n}\n```\n\nSee [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.\n",
+ "github": "graphql-java/graphql-java",
+ "url": "https://github.com/graphql-java/graphql-java"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "Apollo Android",
+ "description": "A strongly-typed, caching GraphQL client for Android, written in Java.",
+ "github": "apollographql/apollo-android",
+ "url": "https://github.com/apollographql/apollo-android"
+ },
+ {
+ "name": "Nodes",
+ "description": "A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.",
+ "github": "americanexpress/nodes",
+ "url": "https://github.com/americanexpress/nodes"
+ }
+ ]
+ },
"JavaScript": {
+ "Server Libraries": [
+ {
+ "name": "GraphQL.js",
+ "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
+ "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
+ "url": "/graphql-js/",
+ "npm": "graphql",
+ "github": "graphql/graphql-js"
+ },
+ {
+ "name": "Express GraphQL",
+ "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
+ "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
+ "url": "/graphql-js/running-an-express-graphql-server/",
+ "npm": "express-graphql",
+ "github": "graphql/express-graphql"
+ },
+ {
+ "name": "Apollo Server",
+ "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
+ "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
+ "url": "https://www.apollographql.com/docs/apollo-server/",
+ "npm": "apollo-server-express",
+ "github": "apollographql/apollo-server"
+ }
+ ],
"GraphQL Clients": [
{
"name": "Relay",
@@ -121,34 +363,153 @@
"npm": "graphqurl",
"github": "hasura/graphqurl"
}
- ],
- "Server Libraries": [
- {
- "name": "GraphQL.js",
- "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
- "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
- "url": "/graphql-js/",
- "npm": "graphql",
- "github": "graphql/graphql-js"
- },
- {
- "name": "Express GraphQL",
- "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
- "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
- "url": "/graphql-js/running-an-express-graphql-server/",
- "npm": "express-graphql",
- "github": "graphql/express-graphql"
- },
- {
- "name": "Apollo Server",
- "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
- "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
- "url": "https://www.apollographql.com/docs/apollo-server/",
- "npm": "apollo-server-express",
- "github": "apollographql/apollo-server"
- }
]
},
+ "Julia": {
+ "GraphQL Clients": [
+ {
+ "name": "Diana.jl",
+ "description": "A Julia GraphQL server implementation.",
+ "url": "https://github.com/codeneomatrix/Diana.jl",
+ "github": "codeneomatrix/Diana.jl"
+ }
+ ]
+ },
+ "Kotlin": {
+ "Server Libraries": [
+ {
+ "name": "graphql-kotlin",
+ "description": "A set of libraries for running GraphQL server in Kotlin.",
+ "url": "https://github.com/ExpediaGroup/graphql-kotlin/",
+ "github": "ExpediaGroup/graphql-kotlin"
+ }
+ ]
+ },
+ "Perl": {
+ "Server Libraries": [
+ {
+ "name": "graphql-perl",
+ "description": "A Perl port of GraphQL reference implementation",
+ "howto": "- [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)\n\n - [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app\n\n - [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL\n\n - [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL\n\n",
+ "url": "https://github.com/graphql-perl/graphql-perl",
+ "github": "graphql-perl/graphql-perl"
+ }
+ ]
+ },
+ "PHP": {
+ "Server Libraries": [
+ {
+ "name": "graphql-php",
+ "description": "A PHP port of GraphQL reference implementation",
+ "url": "https://github.com/webonyx/graphql-php",
+ "github": "webonyx/graphql-php"
+ },
+ {
+ "name": "graphql-relay-php",
+ "description": "A library to help construct a graphql-php server supporting react-relay.",
+ "url": "https://github.com/ivome/graphql-relay-php",
+ "github": "ivome/graphql-relay-php"
+ },
+ {
+ "name": "Railt",
+ "description": "A PHP GraphQL Framework.",
+ "url": "https://github.com/railt/railt",
+ "github": "railt/railt"
+ },
+ {
+ "name": "Lighthouse",
+ "description": "A GraphQL server for Laravel",
+ "url": "https://github.com/nuwave/lighthouse",
+ "github": "nuwave/lighthouse"
+ },
+ {
+ "name": "GraphQLBundle",
+ "description": "A GraphQL server for Symfony",
+ "url": "https://github.com/overblog/GraphQLBundle",
+ "github": "overblog/GraphQLBundle"
+ },
+ {
+ "name": "WPGraphQL",
+ "description": "A free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site ",
+ "github": "wp-graphql/wp-graphql",
+ "url": "https://github.com/wp-graphql/wp-graphql"
+ },
+ {
+ "name": "API Platform",
+ "description": "API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.",
+ "howto": "The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):\n\n```php\nname;\n }\n // ...\n}\n```\nOther GraphQLite features include validation, security, error handling, loading via data-loader pattern...",
+ "github": "thecodingmachine/graphqlite",
+ "url": "https://graphqlite.thecodingmachine.io"
+ },
+ {
+ "name": "Siler",
+ "description": "Siler is a PHP library powered with high-level abstractions to work with GraphQL.",
+ "howto": "To run a Siler hello world script:\n```graphql\ntype Query {\n hello: String\n}\n```\n\n```php\n [\n 'hello' => 'world',\n ],\n];\n$schema = Graphqlschema($typeDefs, $resolvers);\n\necho \"Server running at http://127.0.0.1:8080\";\n\nHttpserver(Graphqlpsr7($schema), function (Throwable $err) {\n var_dump($err);\n return Diactorosjson([\n 'error' => true,\n 'message' => $err->getMessage(),\n ]);\n})()->run();\n```\nIt also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.\n",
+ "github": "leocavalcante/siler",
+ "url": "https://siler.leocavalcante.com/graphql/"
+ },
+ {
+ "name": "GraphQL API for WordPress",
+ "description": "A GraphQL server for WordPress",
+ "github": "https://github.com/GraphQLAPI/graphql-api-for-wp",
+ "url": "https://github.com/GraphQLAPI/graphql-api-for-wp"
+ },
+ {
+ "name": "GraPHPinator",
+ "description": "A GraphQL implementation for modern PHP",
+ "github": "https://github.com/infinityloop-dev/graphpinator",
+ "url": "https://github.com/infinityloop-dev/graphpinator"
+ }
+ ]
+ },
+ "Python": {
+ "Server Libraries": [
+ {
+ "name": "Graphene",
+ "description": "A Python library for building GraphQL APIs.",
+ "howto": "To run a Graphene hello world script:\n\n```bash\npip install graphene\n```\n\nThen run `python hello.py` with this code in `hello.py`:\n\n```python\nimport graphene\n\nclass Query(graphene.ObjectType):\n hello = graphene.String(name=graphene.String(default_value=\"World\"))\n\n def resolve_hello(self, info, name):\n return 'Hello ' + name\n\nschema = graphene.Schema(query=Query)\nresult = schema.execute('{ hello }')\nprint(result.data['hello']) # \"Hello World\"\n```\n\nThere are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.",
+ "url": "http://graphene-python.org/",
+ "github": "graphql-python/graphene"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "GQL",
+ "description": "A GraphQL client in Python.",
+ "url": "https://github.com/graphql-python/gql",
+ "github": "graphql-python/gql"
+ },
+ {
+ "name": "python-graphql-client",
+ "description": "Simple GraphQL client for Python 2.7+.",
+ "github": "prisma-labs/python-graphql-client",
+ "url": "https://github.com/prisma/python-graphql-client"
+ },
+ {
+ "name": "sgqlc",
+ "description": "A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.",
+ "github": "profusion/sgqlc",
+ "url": "https://github.com/profusion/sgqlc"
+ }
+ ]
+ },
+ "R": {
+ "Server Libraries": [
+ {
+ "name": "ghql",
+ "description": "General purpose GraphQL R client",
+ "github": "ropensci/ghql",
+ "url": "https://github.com/ropensci/ghql"
+ }
+ ]
+ },
"Ruby": {
"Server Libraries": [
{
@@ -167,6 +528,67 @@
"github": "ohler55/agoo"
}
]
+ },
+ "Rust": {
+ "Server Libraries": [
+ {
+ "name": "graphql-rust/juniper",
+ "description": "GraphQL server library for Rust",
+ "github": "graphql-rust/juniper",
+ "url": "https://github.com/graphql-rust/juniper"
+ }
+ ]
+ },
+ "Scala": {
+ "Server Libraries": [
+ {
+ "name": "Sangria",
+ "description": "A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).",
+ "howto": "An example of a hello world GraphQL schema and query with `sangria`:\n```scala\nimport sangria.schema._\nimport sangria.execution._\nimport sangria.macros._\n\nval QueryType = ObjectType(\"Query\", fields[Unit, Unit](\n Field(\"hello\", StringType, resolve = _ ⇒ \"Hello world!\")\n))\n\nval schema = Schema(QueryType)\n\nval query = graphql\"{ hello }\"\n\nExecutor.execute(schema, query) map println\n```",
+ "url": "http://sangria-graphql.org/",
+ "github": "sangria-graphql/sangria"
+ }
+ ]
+ },
+ "OCaml / Reason": {
+ "Server Libraries": [
+ {
+ "name": "ocaml-graphql-server",
+ "description": "GraphQL server library for OCaml and Reason",
+ "url": "https://github.com/andreas/ocaml-graphql-server",
+ "github": "andreas/ocaml-graphql-server"
+ }
+ ]
+ },
+ "Swift / Objective-C iOS": {
+ "Server Libraries": [
+ {
+ "name": "Graphiti",
+ "description": "Swift library for building GraphQL schemas/types fast, safely and easily.",
+ "url": "https://github.com/GraphQLSwift/Graphiti",
+ "github": "GraphQLSwift/Graphiti"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "Apollo iOS",
+ "description": "A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.",
+ "url": "https://www.apollographql.com/docs/ios/",
+ "github": "apollographql/apollo-ios"
+ },
+ {
+ "name": "GraphQL iOS",
+ "description": "An Objective-C GraphQL client for iOS.",
+ "url": "https://github.com/funcompany/graphql-ios",
+ "github": "funcompany/graphql-ios"
+ },
+ {
+ "name": "Graphaello",
+ "description": "A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo",
+ "github": "nerdsupremacist/Graphaello",
+ "url": "https://github.com/nerdsupremacist/Graphaello"
+ }
+ ]
}
},
"Tools": [
@@ -267,5 +689,54 @@
"npm": "sofa-api",
"github": "Urigo/SOFA"
}
+ ],
+ "Services": [
+ {
+ "name": "Apollo Graph Manager",
+ "description": "A cloud service for monitoring the performance and usage of your GraphQL backend.",
+ "url": "https://engine.apollographql.com"
+ },
+ {
+ "name": "GraphCMS",
+ "description": "A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.",
+ "url": "https://graphcms.com/"
+ },
+ {
+ "name": "Prisma",
+ "description": "([github](https://github.com/prisma)) A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
+ "url": "https://www.prisma.io"
+ },
+ {
+ "name": "Tipe",
+ "description": "([github](https://github.com/tipeio)) A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
+ "url": "https://tipe.io"
+ },
+ {
+ "name": "AWS AppSync",
+ "description": "Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls.",
+ "url": "https://aws.amazon.com/appsync/"
+ },
+ {
+ "name": "Elide",
+ "description": "A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.",
+ "url": "https://elide.io"
+ },
+ {
+ "name": "Hasura",
+ "description": "([github](https://github.com/hasura)) Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.",
+ "url": "https://hasura.io"
+ },
+ {
+ "name": "FaunaDB",
+ "description": "Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.",
+ "url": "https://docs.fauna.com/fauna/current/graphql"
+ }
+ ],
+ "More Stuff": [
+ {
+ "name": "awesome-graphql",
+ "description": "A fantastic community maintained collection of libraries, resources, and more.",
+ "url": "https://github.com/chentsulin/awesome-graphql"
+ }
]
}
\ No newline at end of file
diff --git a/gatsby-node.js b/gatsby-node.js
index 177f44f490..9c635cf8ad 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -10,25 +10,25 @@ exports.onCreatePage = async ({ page, actions }) => {
sourcePath: path.relative(__dirname, page.componentPath),
}
if (page.path === "/code" || page.path === "/code/") {
- const [jsGraphQLClients, jsServerLibraries, rubyServerLibraries, tools] = await Promise.all([
- sortLibs(
- JSON.parse(readFileSync("./data/js-graphql-clients.json", "utf8"))
- ),
- sortLibs(
- JSON.parse(readFileSync("./data/js-server-libraries.json", "utf8"))
- ),
- sortLibs(
- JSON.parse(readFileSync("./data/ruby-server-libraries.json", "utf8"))
- ),
- sortLibs(JSON.parse(readFileSync("./data/tools.json", "utf8"))),
+ const codeData = JSON.parse(readFileSync("./data/code.json", "utf8"));
+ await Promise.all([
+ Promise.all(Object.keys(codeData.Libraries).map(async languageName => {
+ const libraryCategoryMap = codeData.Libraries[languageName];
+ await Promise.all(
+ Object.keys(libraryCategoryMap).map(async libraryCategoryName => {
+ const libraries = libraryCategoryMap[libraryCategoryName]
+ libraryCategoryMap[libraryCategoryName] = await sortLibs(libraries)
+ })
+ )
+ })),
+ sortLibs(codeData.Tools).then(sortedTools => {
+ codeData.Tools = sortedTools;
+ }),
])
context = {
...context,
- jsGraphQLClients,
- jsServerLibraries,
- rubyServerLibraries,
- tools,
+ codeData,
}
}
createPage({
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index 46d392b6db..ef63664a6c 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -2,9 +2,9 @@ const fetch = require(`node-fetch`)
const getGitHubStats = async githubRepo => {
const [owner, repoName] = githubRepo.split("/")
- const accessToken = process.env.GITHUB_ACCESS_TOKEN;
+ const accessToken = process.env.GITHUB_ACCESS_TOKEN
if (!accessToken) {
- throw new Error(`You must have GITHUB_ACCESS_TOKEN env variable defined!`);
+ throw new Error(`You must have GITHUB_ACCESS_TOKEN env variable defined!`)
}
const query = /* GraphQL */ `
fragment defaultBranchRef on Ref {
@@ -35,6 +35,9 @@ const getGitHubStats = async githubRepo => {
masterRef: ref(qualifiedName: "master") {
...defaultBranchRef
}
+ developRef: ref(qualifiedName: "develop") {
+ ...defaultBranchRef
+ }
stargazers {
totalCount
}
@@ -48,8 +51,8 @@ const getGitHubStats = async githubRepo => {
}
}
`
- const lastMonth = new Date();
- lastMonth.setMonth(lastMonth.getMonth() - 1);
+ const lastMonth = new Date()
+ lastMonth.setMonth(lastMonth.getMonth() - 1)
const response = await fetch("https://api.github.com/graphql", {
method: "POST",
body: JSON.stringify({
@@ -62,11 +65,26 @@ const getGitHubStats = async githubRepo => {
},
})
const responseJson = await response.json()
- const repo = responseJson.data.repositoryOwner.repository
+ if (!responseJson?.data) {
+ throw `GitHub returned empty response for ${owner}/${repoName}`
+ }
+ const { repositoryOwner } = responseJson.data
+ if (!repositoryOwner) {
+ throw `No GitHub user found for ${owner}/${repoName}`
+ }
+ const { repository: repo } = repositoryOwner
+ if (!repo) {
+ throw `No GitHub repo found ${owner}/${repoName}`
+ }
const stars = repo.stargazers.totalCount
- const commitHistory = (repo.mainRef || repo.sourceRef || repo.masterRef)
- .target.history.edges
- let commitCount = 0, daysWithCommitSet = new Set(), finalUpdatedTime;
+ const actualDefaultBranch =
+ repo.mainRef || repo.sourceRef || repo.developRef || repo.masterRef
+ if (!actualDefaultBranch) {
+ throw `No default branch found for ${owner}/${repoName}`
+ }
+ const commitHistory = actualDefaultBranch.target.history.edges
+ let commitCount = 0,
+ daysWithCommitSet = new Set()
commitHistory.forEach(commit => {
if (!commit.node.author.name.match(/bot/i)) {
commitCount++
@@ -92,16 +110,21 @@ const getNpmStats = async packageName => {
}
const getGemStats = async packageName => {
- const response = await fetch(`https://rubygems.org/api/v1/gems/${encodeURIComponent(packageName)}.json`);
+ const response = await fetch(
+ `https://rubygems.org/api/v1/gems/${encodeURIComponent(packageName)}.json`
+ )
const responseJson = await response.json()
const downloadCount = responseJson.downloads
return { downloadCount }
}
const sortLibs = async libs => {
+ if (libs.length === 1) {
+ return libs;
+ }
const libsWithScores = await Promise.all(
libs.map(async lib => {
- const [npmStats = {}, githubStats = {}] = await Promise.all([
+ const [npmStats = {}, gemStars = {}, githubStats = {}] = await Promise.all([
lib.npm && getNpmStats(lib.npm),
lib.gem && getGemStats(lib.gem),
lib.github && getGitHubStats(lib.github),
@@ -118,9 +141,9 @@ const sortLibs = async libs => {
bScore = 0
if (a.npm && b.npm) {
if (a.downloadCount > b.downloadCount) {
- aScore += 40;
+ aScore += 40
} else if (b.downloadCount > a.downloadCount) {
- bScore += 40;
+ bScore += 40
}
}
if (a.github && b.github) {
@@ -130,14 +153,14 @@ const sortLibs = async libs => {
bScore += 20
}
if (a.commitCount > b.commitCount) {
- aScore += 20;
+ aScore += 20
} else if (a.commitCount < b.commitCount) {
- bScore += 20;
+ bScore += 20
}
if (a.stars > b.stars) {
- aScore += 30;
+ aScore += 30
} else if (a.stars < b.stars) {
- bScore += 30;
+ bScore += 30
}
}
if (bScore > aScore) {
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 0b89384e96..df982e4f76 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -1,6 +1,115 @@
import React from "react"
import Layout from "../components/Layout"
import Marked from "../components/Marked"
+import { toSlug } from "../utils/slug"
+
+export function buildLanguagesMenu(pageContext: any) {
+ let lastRow: string[]
+ const rows: string[][] = []
+ Object.keys(pageContext.codeData.Libraries).forEach((languageName, index) => {
+ if (index % 5 === 0) {
+ lastRow = []
+ rows.push(lastRow)
+ } else {
+ lastRow.push(languageName)
+ }
+ })
+ return (
+
+ {rows.map(row => (
+ <>
+
+ {row.map(languageName => {
+ const slug = toSlug(languageName)
+ return (
+
+ )
+ })}
+
+
+ >
+ ))}
+
+ )
+}
+
+export function buildLibraryListMarkdown(libraries: any[]) {
+ let markdown = ""
+ for (const library of libraries) {
+ if ("howto" in library) {
+ markdown += `#### [${library.name}](${library.url}) `
+ } else {
+ markdown += ` - [${library.name}](${library.url}) `
+ }
+ if ("github" in library) {
+ markdown += `([github](https://github.com/${library.github})) `
+ }
+ if ("npm" in library) {
+ markdown += `([npm](https://www.npmjs.com/package/${library.npm})) `
+ }
+ if ("gem" in library) {
+ markdown += `([gem](https://rubygems.org/gems/${library.gem})) `
+ }
+ if ("howto" in library) {
+ if (library.description) {
+ markdown += "\n"
+ markdown += library.description || ""
+ markdown += "\n"
+ }
+ markdown += "\n"
+ markdown += library.howto
+ markdown += "\n"
+ } else if (library.description) {
+ markdown += ": "
+ markdown += library.description || ""
+ }
+ markdown += "\n\n"
+ }
+ return markdown
+}
+
+export function buildLibraryCategoriesMarkdown(
+ libraryCategories: any[],
+ libraryCategoryName: string
+) {
+ let markdown = ""
+ if (libraryCategoryName in libraryCategories) {
+ markdown += `### ${libraryCategoryName}\n`
+ const libraries = libraryCategories[libraryCategoryName]
+ markdown += buildLibraryListMarkdown(libraries)
+ markdown += "\n"
+ }
+ return markdown
+}
+
+export function buildLanguagesContent(pageContext: any) {
+ let markdown = ""
+ for (const languageName in pageContext.codeData.Libraries) {
+ const libraryCategories = pageContext.codeData.Libraries[languageName]
+ markdown += `## ${languageName}\n`
+ markdown += buildLibraryCategoriesMarkdown(
+ libraryCategories,
+ 'Server Libraries'
+ )
+ markdown += buildLibraryCategoriesMarkdown(
+ libraryCategories,
+ "GraphQL Clients"
+ )
+ }
+ return {markdown}
+}
export default ({ pageContext }) => {
return (
@@ -50,837 +159,28 @@ export default ({ pageContext }) => {
you are already using.
-
-
- {/* C# */}
-
- {/* Clojure */}
-
- {/* Elixir */}
-
- {/* Elm */}
-
-
-
-
-
-
- {/* Erlang */}
-
- {/* Go */}
-
- {/* Groovy */}
-
- {/* Java */}
-
-
-
-
-
-
- {/* JavaScript */}
-
- {/* Julia */}
-
- {/* Kotlin */}
-
- {/* OCaml */}
-
-
-
-
-
-
- {/* Perl */}
-
- {/* PHP */}
-
- {/* Python */}
-
- {/* R */}
-
-
-
-
-
-
- {/* Ruby */}
-
- {/* Rust */}
-
- {/* Scala */}
-
- {/* Swift */}
-
-
-
-
- {`
-## C# / .NET
-### Server Libraries
-#### [graphql-dotnet](https://github.com/graphql-dotnet/graphql-dotnet): GraphQL for .NET
-\`\`\`csharp
-using System;
-using GraphQL;
-using GraphQL.Types;
-
-public class Program
-{
- public static void Main(string[] args)
- {
- var schema = Schema.For(@"
- type Query {
- hello: String
- }
- ");
-
- var json = schema.Execute(_ =>
- {
- _.Query = "{ hello }";
- _.Root = new { Hello = "Hello World!" };
- });
-
- Console.WriteLine(json);
- }
-}
-\`\`\`
- - [graphql-net](https://github.com/ckimes89/graphql-net): Convert GraphQL to IQueryable
- - [Entity GraphQL](https://github.com/lukemurray/EntityGraphQL): .NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)
- - [DotNetGraphQLQueryGen](https://github.com/lukemurray/DotNetGraphQLQueryGen): .NET Core library to generate classes from a GraphQL schema for type-safe querying in dotnet
- - [Hot Chocolate](https://github.com/ChilliCream/hotchocolate): GraphQL Server for .NET core and .NET classic
- - [NGraphQL](https://github.com/rivantsov/starwars): GraphQL Server for .NET Core and full framework
-
-### GraphQL Clients
- - [GraphQL.Client](https://github.com/graphql-dotnet/graphql-client): A GraphQL Client for .NET.
- - [graphql-net-client](https://github.com/bkniffler/graphql-net-client): Basic example GraphQL client for .NET.
- - [SAHB.GraphQLClient](https://github.com/sahb1239/SAHB.GraphQLClient): GraphQL client which supports generating queries from C# classes
-
-## Clojure
-### Server Libraries
-#### [alumbra](https://github.com/alumbra/alumbra)
-A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).
-\`\`\`clojure
-(require '[alumbra.core :as alumbra]
- '[claro.data :as data])
-
-(def schema
- "type Person { name: String!, friends: [Person!]! }
- type QueryRoot { person(id: ID!): Person, me: Person! }
- schema { query: QueryRoot }")
-
-(defrecord Person [id]
- data/Resolvable
- (resolve! [_ _]
- {:name (str "Person #" id)
- :friends (map ->Person (range (inc id) (+ id 3)))}))
-
-(def QueryRoot
- {:person (map->Person {})
- :me (map->Person {:id 0})})
-
-(def app
- (alumbra/handler
- {:schema schema
- :query QueryRoot}))
-
-(defonce my-graphql-server
- (aleph.http/start-server #'app {:port 3000}))
-\`\`\`
-
-\`\`\`bash
-$ curl -XPOST "http://0:3000" -H'Content-Type: application/json' -d'{
- "query": "{ me { name, friends { name } } }"
-}'
-{"data":{"me":{"name":"Person #0","friends":[{"name":"Person #1"},{"name":"Person #2"}]}}}
-\`\`\`
-
-#### [graphql-clj](https://github.com/tendant/graphql-clj)
-A Clojure library that provides a GraphQL implementation.
-Code that executes a hello world GraphQL query with \`graphql-clj\`:
-\`\`\`clojure
-
-(def schema "type QueryRoot {
- hello: String
- }")
-
-(defn resolver-fn [type-name field-name]
- (get-in {"QueryRoot" {"hello" (fn [context parent & rest]
- "Hello world!")}}
- [type-name field-name]))
-
-(require '[graphql-clj.executor :as executor])
-
-(executor/execute nil schema resolver-fn "{ hello }")
-\`\`\`
-#### [lacinia](https://github.com/walmartlabs/lacinia)
-A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.
-
-### GraphQL Clients
- - [re-graph](https://github.com/oliyh/re-graph/): A GraphQL client implemented in Clojurescript with support for websockets.
-### D
-
- - [graphqld](https://github.com/burner/graphqld): A GraphQL implementaiton for the D Programming Language.
-
-### Elixir
-### Server Libraries
- - [absinthe](https://github.com/absinthe-graphql/absinthe): GraphQL implementation for Elixir.
- - [graphql-elixir](https://github.com/graphql-elixir/graphql): An Elixir implementation of Facebook's GraphQL.
-
-## Elm
-### GraphQL Clients
- - [dillonkearns/elm-graphql](https://github.com/dillonkearns/elm-graphql): Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.
-
-## Erlang
-### Server Libraries
- - [graphql-erlang](https://github.com/shopgun/graphql-erlang): GraphQL implementation in Erlang.
-
-## Flutter
-### GraphQL Clients
- - [graphql](https://github.com/zino-app/graphql-flutter#readme): A GraphQL client implementation in Flutter.
-
-## Go
-### Server Libraries
- - [graphql-go](https://github.com/graphql-go/graphql): An implementation of GraphQL for Go / Golang.
- - [graph-gophers/graphql-go](https://github.com/graph-gophers/graphql-go): An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).
- - [99designs/gqlgen](https://github.com/99designs/gqlgen) - Go generate based graphql server library.
- - [graphql-relay-go](https://github.com/graphql-go/relay): A Go/Golang library to help construct a graphql-go server supporting react-relay.
- - [machinebox/graphql](https://github.com/machinebox/graphql): An elegant low-level HTTP client for GraphQL.
- - [samsarahq/thunder](https://github.com/samsarahq/thunder): A GraphQL implementation with easy schema building, live queries, and batching.
- - [appointy/jaal](https://github.com/appointy/jaal): Develop spec compliant GraphQL servers in Go.
-
-### GraphQL Clients
- - [graphql](https://github.com/shurcooL/graphql#readme): A GraphQL client implementation in Go.
-
-## Groovy
-### Server Libraries
-#### [gorm-graphql](https://github.com/grails/gorm-graphql/)
-**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of "data fetchers" to query, update, and delete data through executions of the schema.
-**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:
-- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.
-- Generates the schema at startup with spring bean configuration to make it easy to extend.
-- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.
-- Overrides the default data binder to use the data binding provided by Grails
-- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier
-See [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.
-#### [GQL](https://grooviter.github.io/gql/)
-GQL is a Groovy library for GraphQL
-
-### Haskell
-
-#### [Morpheus GraphQL](https://github.com/morpheusgraphql/morpheus-graphql)
-
-A Haskell library for building GraphQL APIs.
-
-Hello world example with `morpheus-graphql`:
-
-```graphql
-# schema.gql
-"""
-A supernatural being considered divine and sacred
-"""
-type Deity {
- name: String!
- power: String @deprecated(reason: "no more supported")
-}
-
-type Query {
- deity(name: String! = "Morpheus"): Deity!
-}
-```
-
-
-```haskell
-{-# LANGUAGE DeriveGeneric #-}
-{-# LANGUAGE DuplicateRecordFields #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE FlexibleInstances #-}
-{-# LANGUAGE MultiParamTypeClasses #-}
-{-# LANGUAGE NamedFieldPuns #-}
-{-# LANGUAGE OverloadedStrings #-}
-{-# LANGUAGE ScopedTypeVariables #-}
-{-# LANGUAGE TemplateHaskell #-}
-{-# LANGUAGE TypeFamilies #-}
-
-module API (api) where
-
-import Data.ByteString.Lazy.Char8 (ByteString)
-import Data.Morpheus (interpreter)
-import Data.Morpheus.Document (importGQLDocument)
-import Data.Morpheus.Types (RootResolver (..), Undefined (..))
-import Data.Text (Text)
-
-importGQLDocument "schema.gql"
-
-rootResolver :: RootResolver IO () Query Undefined Undefined
-rootResolver =
- RootResolver
- { queryResolver = Query {deity},
- mutationResolver = Undefined,
- subscriptionResolver = Undefined
- }
- where
- deity DeityArgs {name} =
- pure
- Deity
- { name = pure name,
- power = pure (Just "Shapeshifting")
- }
-
-api :: ByteString -> IO ByteString
-api = interpreter rootResolver
-```
-
-See [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.
-
-## Java / Android
-### Server Libraries
-#### [graphql-java](https://github.com/graphql-java/graphql-java)
-A Java library for building GraphQL APIs.
-Code that executes a hello world GraphQL query with \`graphql-java\`:
-
-\`\`\`java
-import graphql.ExecutionResult;
-import graphql.GraphQL;
-import graphql.schema.GraphQLSchema;
-import graphql.schema.StaticDataFetcher;
-import graphql.schema.idl.RuntimeWiring;
-import graphql.schema.idl.SchemaGenerator;
-import graphql.schema.idl.SchemaParser;
-import graphql.schema.idl.TypeDefinitionRegistry;
-
-import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;
-
-public class HelloWorld {
-
- public static void main(String[] args) {
- String schema = "type Query{hello: String} schema{query: Query}";
-
- SchemaParser schemaParser = new SchemaParser();
- TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
-
- RuntimeWiring runtimeWiring = new RuntimeWiring()
- .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")))
- .build();
-
- SchemaGenerator schemaGenerator = new SchemaGenerator();
- GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
-
- GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();
- ExecutionResult executionResult = build.execute("{hello}");
-
- System.out.println(executionResult.getData().toString());
- // Prints: {hello=world}
- }
-}
-\`\`\`
-
-See [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.
-
-### GraphQL Clients
- - [Apollo Android](https://github.com/apollographql/apollo-android): A strongly-typed, caching GraphQL client for Android, written in Java.
- - [Nodes](https://github.com/americanexpress/nodes): A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.
-
-## JavaScript
-### Server Libraries
-${pageContext.jsServerLibraries
- .map(
- (
- library: any
- ) => `#### [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([npm](https://www.npmjs.com/package/${library.npm}))
-${library.description}
-${library.howto}`
- )
- .join("\n")}
-
-### GraphQL Clients
-${pageContext.jsGraphQLClients
- .map(
- (library: any) =>
- `- [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([npm](https://www.npmjs.com/package/${library.npm})): ${library.description}`
- )
- .join("\n")}
-
-## Julia
-### GraphQL Clients
- - [Diana.jl](https://github.com/codeneomatrix/Diana.jl): A Julia GraphQL server implementation.
-
-## Kotlin
-### Server Libraries
- - [graphql-kotlin](https://github.com/ExpediaGroup/graphql-kotlin/): A set of libraries for running GraphQL server in Kotlin.
- - [KGraphQL](https://github.com/aPureBase/KGraphQL): Pure Kotlin implementation to setup a GraphQL server.
-
-## Perl
-### Server Libraries
- - [graphql-perl](https://github.com/graphql-perl/graphql-perl): A Perl port of GraphQL reference implementation
- - [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)
- - [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app
- - [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL
- - [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL
-
-## PHP
-### Server Libraries
- - [graphql-php](https://github.com/webonyx/graphql-php): A PHP port of GraphQL reference implementation
- - [graphql-relay-php](https://github.com/ivome/graphql-relay-php): A library to help construct a graphql-php server supporting react-relay.
- - [Railt](https://github.com/railt/railt): A PHP GraphQL Framework.
- - [Lighthouse](https://github.com/nuwave/lighthouse): A GraphQL server for Laravel
- - [GraphQLBundle](https://github.com/overblog/GraphQLBundle): A GraphQL server for Symfony
- - [WPGraphQL](https://github.com/wp-graphql/wp-graphql): A free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site
- - [GraphQL API for WordPress](https://github.com/GraphQLAPI/graphql-api-for-wp): A GraphQL server for WordPress
- - [GraPHPinator](https://github.com/infinityloop-dev/graphpinator): A GraphQL implementation for modern PHP
-
-#### [API Platform](https://api-platform.com) ([github](https://github.com/api-platform/api-platform))
-API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.
-The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):
-
-\`\`\`php
-name;
- }
- // ...
-}
-\`\`\`
-Other GraphQLite features include validation, security, error handling, loading via data-loader pattern...
-#### [Siler](https://siler.leocavalcante.com/graphql/) ([github](https://github.com/leocavalcante/siler))
-Siler is a PHP library powered with high-level abstractions to work with GraphQL.
-To run a Siler hello world script:
-\`\`\`graphql
-type Query {
- hello: String
-}
-\`\`\`
-
-\`\`\`php
- [
- 'hello' => 'world',
- ],
-];
-$schema = Graphql\schema($typeDefs, $resolvers);
-
-echo "Server running at http://127.0.0.1:8080";
-
-Http\server(Graphql\psr7($schema), function (\Throwable $err) {
- var_dump($err);
- return Diactoros\json([
- 'error' => true,
- 'message' => $err->getMessage(),
- ]);
-})()->run();
-\`\`\`
-It also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.
-
-## Python
-### Server Libraries
-#### [Graphene](http://graphene-python.org/) ([github](https://github.com/graphql-python/graphene))
-A Python library for building GraphQL APIs.
-To run a Graphene hello world script:
-
-\`\`\`bash
-pip install graphene
-\`\`\`
-
-Then run \`python hello.py\` with this code in \`hello.py\`:
-
-\`\`\`python
-import graphene
-
-class Query(graphene.ObjectType):
- hello = graphene.String(name=graphene.String(default_value="World"))
-
- def resolve_hello(self, info, name):
- return 'Hello ' + name
-
-schema = graphene.Schema(query=Query)
-result = schema.execute('{ hello }')
-print(result.data['hello']) # "Hello World"
-\`\`\`
-
-There are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.
-### GraphQL Clients
- - [GQL](https://github.com/graphql-python/gql): A GraphQL client in Python.
- - [python-graphql-client](https://github.com/prisma/python-graphql-client): Simple GraphQL client for Python 2.7+.
- - [sgqlc](https://github.com/profusion/sgqlc): A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.
-
-
-## R
-### GraphQL Clients
- - [ghql](https://github.com/ropensci/ghql): General purpose GraphQL R client.
-
-## Ruby
-### Server Libraries
-${pageContext.rubyServerLibraries
- .map(
- (
- library: any
- ) => `#### [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([gem](https://rubygems.org/gems/${library.npm}))
-${library.description}
-${library.howto}`
- )
- .join("\n")}
-
-## Rust
-### Server Libraries
- - [graphql-rust/juniper](https://github.com/graphql-rust/juniper): GraphQL server library for Rust
-
-## Scala
-### Server Libraries
-#### [Sangria](http://sangria-graphql.org/) ([github](https://github.com/sangria-graphql/sangria)): A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).
-An example of a hello world GraphQL schema and query with \`sangria\`:
-\`\`\`scala
-import sangria.schema._
-import sangria.execution._
-import sangria.macros._
-
-val QueryType = ObjectType("Query", fields[Unit, Unit](
- Field("hello", StringType, resolve = _ ⇒ "Hello world!")
-))
-
-val schema = Schema(QueryType)
-
-val query = graphql"{ hello }"
-
-Executor.execute(schema, query) map println
-\`\`\`
-
-## OCaml / Reason
-### Server Libraries
-#### [ocaml-graphql-server](https://github.com/andreas/ocaml-graphql-server): GraphQL server library for OCaml and Reason
-
-## Swift / Objective-C iOS
-### Server Libraries
- - [Graphiti](https://github.com/GraphQLSwift/Graphiti): Swift library for building GraphQL schemas/types fast, safely and easily.
-
-### GraphQL Clients
- - [Apollo iOS](https://www.apollographql.com/docs/ios/) ([github](https://github.com/apollographql/apollo-ios)): A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.
- - [GraphQL iOS](https://github.com/funcompany/graphql-ios): An Objective-C GraphQL client for iOS.
- - [Graphaello](https://github.com/nerdsupremacist/Graphaello): A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo
+ {buildLanguagesMenu(pageContext)}
+ {buildLanguagesContent(pageContext)}
+
+ {`
## Tools
-${pageContext.tools
- .map(
- (library: any) =>
- `- [${library.name}](${library.url}) ([github](https://github.com/${library.github})) ([npm](https://www.npmjs.com/package/${library.npm})): ${library.description}`
- )
- .join("\n")}
-
+${buildLibraryListMarkdown(pageContext.codeData.Tools)}
+`}
+
+
+ {`
## Services
- - [Apollo Graph Manager](https://engine.apollographql.com): A cloud service for monitoring the performance and usage of your GraphQL backend.
- - [GraphCMS](https://graphcms.com/): A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.
- - [Prisma](https://www.prisma.io) ([github](https://github.com/prisma)): A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.
- - [Tipe](https://tipe.io) ([github](https://github.com/tipeio)): A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.
- - [AWS AppSync](https://aws.amazon.com/appsync/): Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls.
- - [Elide](https://elide.io): A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.
- - [Hasura](https://hasura.io) ([github](https://github.com/hasura)): Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.
- - [FaunaDB](https://docs.fauna.com/fauna/current/graphql): Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.
-
+${buildLibraryListMarkdown(pageContext.codeData.Services)}
+`}
+
+
+ {`
## More Stuff
- - [awesome-graphql](https://github.com/chentsulin/awesome-graphql): A fantastic community maintained collection of libraries, resources, and more.
- `}
+${buildLibraryListMarkdown(pageContext.codeData["More Stuff"])}
+`}
+
diff --git a/static/img/d.svg b/static/img/d.svg
new file mode 100644
index 0000000000..3ba85274c6
--- /dev/null
+++ b/static/img/d.svg
@@ -0,0 +1,215 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ image/svg+xml
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/golang.svg b/static/img/go.svg
similarity index 100%
rename from static/img/golang.svg
rename to static/img/go.svg
diff --git a/static/img/haskell.svg b/static/img/haskell.svg
new file mode 100644
index 0000000000..8c8a97a6a3
--- /dev/null
+++ b/static/img/haskell.svg
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/java.svg b/static/img/java-android.svg
similarity index 100%
rename from static/img/java.svg
rename to static/img/java-android.svg
diff --git a/static/img/node.svg b/static/img/javascript.svg
similarity index 100%
rename from static/img/node.svg
rename to static/img/javascript.svg
diff --git a/static/img/ocaml.svg b/static/img/ocaml-reason.svg
similarity index 100%
rename from static/img/ocaml.svg
rename to static/img/ocaml-reason.svg
From 0194af4fd323d994bf3aa5f6184fc648ef2f188f Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 2 Nov 2020 18:42:48 +0300
Subject: [PATCH 04/27] Do not use new syntax
---
scripts/sort-libraries.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index ef63664a6c..062e391793 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -65,7 +65,7 @@ const getGitHubStats = async githubRepo => {
},
})
const responseJson = await response.json()
- if (!responseJson?.data) {
+ if (!responseJson || !responseJson.data) {
throw `GitHub returned empty response for ${owner}/${repoName}`
}
const { repositoryOwner } = responseJson.data
From 23c2bc9a7523440e5ba4aa93c1c4db526f6ae66c Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Tue, 3 Nov 2020 16:09:17 +0300
Subject: [PATCH 05/27] Move Tools under Languages
---
data/code.json | 1484 +++++++++--------
gatsby-node.js | 3 -
src/components/Footer/index.tsx | 6 +-
src/pages/code.tsx | 21 +-
static/img/c-c.svg | 25 +
static/img/{csharp.svg => c-net.svg} | 0
static/img/flutter.svg | 1 +
.../{swift.svg => swift-objective-c-ios.svg} | 0
8 files changed, 778 insertions(+), 762 deletions(-)
create mode 100644 static/img/c-c.svg
rename static/img/{csharp.svg => c-net.svg} (100%)
create mode 100644 static/img/flutter.svg
rename static/img/{swift.svg => swift-objective-c-ios.svg} (100%)
diff --git a/data/code.json b/data/code.json
index 067c12e2c3..f37c154013 100644
--- a/data/code.json
+++ b/data/code.json
@@ -1,742 +1,746 @@
-{
- "Libraries": {
- "C# / .NET": {
- "Server Libraries": [
- {
- "name": "graphql-dotnet",
- "description": "GraphQL for .NET",
- "howto": "```csharp\nusing System;\nusing GraphQL;\nusing GraphQL.Types;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n var schema = Schema.For(@\"\n type Query {\n hello: String\n }\n \");\n\n var json = schema.Execute(_ =>\n {\n _.Query = \"{ hello }\";\n _.Root = new { Hello = \"Hello World!\" };\n });\n\n Console.WriteLine(json);\n }\n} \n```",
- "url": "https://github.com/graphql-dotnet/graphql-dotnet",
- "github": "graphql-dotnet/graphql-dotnet"
- },
- {
- "name": "graphql-net",
- "description": "Convert GraphQL to IQueryable",
- "url": "https://github.com/ckimes89/graphql-net",
- "github": "chkimes/graphql-net"
- },
- {
- "name": "Entity GraphQL",
- "description": ".NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)",
- "url": "https://github.com/lukemurray/EntityGraphQL",
- "github": "lukemurray/EntityGraphQL"
- },
- {
- "name": "Hot Chocolate",
- "description": "GraphQL Server for .NET core and .NET classic",
- "url": "https://github.com/ChilliCream/hotchocolate",
- "github": "ChilliCream/hotchocolate"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "GraphQL.Client",
- "description": "A GraphQL Client for .NET.",
- "url": "https://github.com/graphql-dotnet/graphql-client",
- "github": "graphql-dotnet/graphql-client"
- },
- {
- "name": "graphql-net-client",
- "description": "Basic example GraphQL client for .NET.",
- "url": "https://github.com/bkniffler/graphql-net-client",
- "github": "bkniffler/graphql-net-client"
- },
- {
- "name": "SAHB.GraphQLClient",
- "description": "GraphQL client which supports generating queries from C# classes",
- "url": "https://github.com/sahb1239/SAHB.GraphQLClient",
- "github": "sahb1239/SAHB.GraphQLClient"
- }
- ]
- },
- "Clojure": {
- "Server Libraries": [
- {
- "name": "alumbra",
- "description": "A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).",
- "howto": "```clojure\n(require '[alumbra.core :as alumbra]\n '[claro.data :as data])\n\n(def schema\n \"type Person { name: String!, friends: [Person!]! }\n type QueryRoot { person(id: ID!): Person, me: Person! }\n schema { query: QueryRoot }\")\n\n(defrecord Person [id]\n data/Resolvable\n (resolve! [_ _]\n {:name (str \"Person #\" id)\n :friends (map ->Person (range (inc id) (+ id 3)))}))\n\n(def QueryRoot\n {:person (map->Person {})\n :me (map->Person {:id 0})})\n\n(def app\n (alumbra/handler\n {:schema schema\n :query QueryRoot}))\n\n(defonce my-graphql-server\n (aleph.http/start-server #'app {:port 3000}))\n```\n\n```bash\n$ curl -XPOST \"http://0:3000\" -H'Content-Type: application/json' -d'{\n \"query\": \"{ me { name, friends { name } } }\"\n}'\n{\"data\":{\"me\":{\"name\":\"Person #0\",\"friends\":[{\"name\":\"Person #1\"},{\"name\":\"Person #2\"}]}}}\n```",
- "url": "https://github.com/alumbra/alumbra",
- "github": "alumbra/alumbra"
- },
- {
- "name": "graphql-clj",
- "description": "A Clojure library that provides a GraphQL implementation.",
- "howto": "Code that executes a hello world GraphQL query with `graphql-clj`:\n```clojure\n\n(def schema \"type QueryRoot {\n hello: String\n }\")\n\n(defn resolver-fn [type-name field-name]\n (get-in {\"QueryRoot\" {\"hello\" (fn [context parent & rest]\n \"Hello world!\")}}\n [type-name field-name]))\n\n(require '[graphql-clj.executor :as executor])\n\n(executor/execute nil schema resolver-fn \"{ hello }\")\n```",
- "url": "https://github.com/tendant/graphql-clj",
- "github": "tendant/graphql-clj"
- },
- {
- "name": "lacinia",
- "description": "A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.",
- "github": "walmartlabs/lacinia",
- "url": "https://github.com/walmartlabs/lacinia"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "regraph",
- "description": "A GraphQL client implemented in Clojurescript with support for websockets.",
- "github": "oliyh/re-graph",
- "url": "https://github.com/oliyh/re-graph/"
- }
- ]
- },
- "D": {
- "Server Libraries": [
- {
- "name": "graphqld",
- "description": "A GraphQL implementaiton for the D Programming Language.",
- "github": "https://github.com/burner/graphqld",
- "url": "https://github.com/burner/graphqld"
- }
- ]
- },
- "Elixir": {
- "GraphQL Clients": [
- {
- "name": "Neuron",
- "description": "A GraphQL client for Elixir",
- "github": "https://github.com/uesteibar/neuron",
- "url": "https://github.com/uesteibar/neuron"
- },
- {
- "name": "common_graphql_client",
- "description": "Elixir GraphQL Client with HTTP and WebSocket support",
- "github": "https://github.com/annkissam/common_graphql_client",
- "url": "https://github.com/annkissam/common_graphql_client"
- }
- ],
- "Server Libraries": [
- {
- "name": "absinthe",
- "description": "GraphQL implementation for Elixir.",
- "github": "absinthe-graphql/absinthe",
- "url": "https://github.com/absinthe-graphql/absinthe"
- },
- {
- "name": "graphql-elixir",
- "description": "An Elixir implementation of Facebook's GraphQL.",
- "github": "graphql-elixir/graphql",
- "url": "https://github.com/graphql-elixir/graphql"
- }
- ]
- },
- "Elm": {
- "GraphQL Clients": [
- {
- "name": "dillonkearns/elm-graphql",
- "description": "Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.",
- "url": "https://github.com/dillonkearns/elm-graphql",
- "github": "dillonkearns/elm-graphql"
- }
- ]
- },
- "Erlang": {
- "Server Libraries": [
- {
- "name": "graphql-erlang",
- "description": "GraphQL implementation in Erlang.",
- "url": "https://github.com/shopgun/graphql-erlang",
- "github": "jlouis/graphql-erlang"
- }
- ]
- },
- "Flutter": {
- "GraphQL Clients": [
- {
- "name": "graphql",
- "description": "A GraphQL client implementation in Flutter.",
- "url": "https://github.com/zino-app/graphql-flutter#readme",
- "github": "zino-app/graphql-flutter"
- }
- ]
- },
- "Go": {
- "Server Libraries": [
- {
- "name": "graphql-go",
- "description": "An implementation of GraphQL for Go / Golang.",
- "url": "https://github.com/graphql-go/graphql",
- "github": "graphql-go/graphql"
- },
- {
- "name": "graph-gophers/graphql-go",
- "description": "An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).",
- "url": "https://github.com/graph-gophers/graphql-go",
- "github": "graph-gophers/graphql-go"
- },
- {
- "name": "99designs/gqlgen",
- "description": "Go generate based graphql server library.",
- "url": "https://github.com/99designs/gqlgen",
- "github": "99designs/gqlgen"
- },
- {
- "name": "graphql-relay-go",
- "description": "A Go/Golang library to help construct a graphql-go server supporting react-relay.",
- "url": "https://github.com/graphql-go/relay",
- "github": "graphql-go/relay"
- },
- {
- "name": "machinebox/graphql",
- "description": "An elegant low-level HTTP client for GraphQL.",
- "url": "https://github.com/machinebox/graphql",
- "github": "machinebox/graphql"
- },
- {
- "name": "samsarahq/thunder",
- "description": "A GraphQL implementation with easy schema building, live queries, and batching.",
- "url": "https://github.com/samsarahq/thunder",
- "github": "samsarahq/thunder"
- },
- {
- "name": "appointy/jaal",
- "description": "Develop spec compliant GraphQL servers in Go.",
- "url": "https://github.com/appointy/jaal",
- "github": "appointy/jaal"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "graphql",
- "description": "A GraphQL client implementation in Go.",
- "url": "https://github.com/shurcooL/graphql#readme",
- "github": "shurcooL/graphql"
- }
- ]
- },
- "Groovy": {
- "Server Libraries": [
- {
- "name": "gorm-graphql",
- "howto": "**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of \"data fetchers\" to query, update, and delete data through executions of the schema.\n\n**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:\n\n- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.\n\n- Generates the schema at startup with spring bean configuration to make it easy to extend.\n\n- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.\n\n- Overrides the default data binder to use the data binding provided by Grails\n- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier\n\nSee [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.",
- "github": "grails/gorm-graphql",
- "url": "https://github.com/grails/gorm-graphql/"
- },
- {
- "name": "GQL",
- "description": "GQL is a Groove library for GraphQL",
- "url": "https://grooviter.github.io/gql/",
- "github": "grooviter/gql"
- }
- ]
- },
- "Haskell": {
- "Server Libraries": [
- {
- "name": "Morpheus GraphQL",
- "description": "A Haskell library for building GraphQL APIs.",
- "howto": "\nHello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.\n",
- "url": "https://github.com/morpheusgraphql/morpheus-graphql",
- "github": "https://github.com/morpheusgraphql/morpheus-graphql"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "morpheus-graphql-client",
- "description": "A strongly-typed GraphQL client implementation in Haksell.",
- "url": "https://github.com/morpheusgraphql/morpheus-graphql",
- "github": "https://github.com/morpheusgraphql/morpheus-graphql"
- }
- ]
- },
- "Java / Android": {
- "Server Libraries": [
- {
- "name": "graphql-java",
- "description": "A Java library for building GraphQL APIs.",
- "howto": "Code that executes a hello world GraphQL query with `graphql-java`:\n\n```java\nimport graphql.ExecutionResult;\nimport graphql.GraphQL;\nimport graphql.schema.GraphQLSchema;\nimport graphql.schema.StaticDataFetcher;\nimport graphql.schema.idl.RuntimeWiring;\nimport graphql.schema.idl.SchemaGenerator;\nimport graphql.schema.idl.SchemaParser;\nimport graphql.schema.idl.TypeDefinitionRegistry;\n\nimport static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;\n\npublic class HelloWorld {\n\n public static void main(String[] args) {\n String schema = \"type Query{hello: String} schema{query: Query}\";\n\n SchemaParser schemaParser = new SchemaParser();\n TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);\n\n RuntimeWiring runtimeWiring = new RuntimeWiring()\n .type(\"Query\", builder -> builder.dataFetcher(\"hello\", new StaticDataFetcher(\"world\")))\n .build();\n\n SchemaGenerator schemaGenerator = new SchemaGenerator();\n GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);\n\n GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();\n ExecutionResult executionResult = build.execute(\"{hello}\");\n\n System.out.println(executionResult.getData().toString());\n // Prints: {hello=world}\n }\n}\n```\n\nSee [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.\n",
- "github": "graphql-java/graphql-java",
- "url": "https://github.com/graphql-java/graphql-java"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "Apollo Android",
- "description": "A strongly-typed, caching GraphQL client for Android, written in Java.",
- "github": "apollographql/apollo-android",
- "url": "https://github.com/apollographql/apollo-android"
- },
- {
- "name": "Nodes",
- "description": "A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.",
- "github": "americanexpress/nodes",
- "url": "https://github.com/americanexpress/nodes"
- }
- ]
- },
- "JavaScript": {
- "Server Libraries": [
- {
- "name": "GraphQL.js",
- "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
- "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
- "url": "/graphql-js/",
- "npm": "graphql",
- "github": "graphql/graphql-js"
- },
- {
- "name": "Express GraphQL",
- "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
- "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
- "url": "/graphql-js/running-an-express-graphql-server/",
- "npm": "express-graphql",
- "github": "graphql/express-graphql"
- },
- {
- "name": "Apollo Server",
- "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
- "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
- "url": "https://www.apollographql.com/docs/apollo-server/",
- "npm": "apollo-server-express",
- "github": "apollographql/apollo-server"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "Relay",
- "description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
- "url": "https://facebook.github.io/relay/",
- "npm": "react-relay",
- "github": "facebook/relay"
- },
- {
- "name": "Apollo Client",
- "description": "A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.",
- "url": "http://apollographql.com/client/",
- "npm": "@apollo/client",
- "github": "apollographql/apollo-client"
- },
- {
- "name": "GraphQL Request",
- "description": "A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.",
- "url": "https://github.com/prisma/graphql-request",
- "npm": "graphql-request",
- "github": "prisma-labs/graphql-request"
- },
- {
- "name": "Lokka",
- "description": "A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).",
- "url": "https://github.com/kadirahq/lokka",
- "npm": "lokka",
- "github": "kadirahq/lokka"
- },
- {
- "name": "nanogql",
- "description": "Tiny GraphQL client library using template strings.",
- "url": "https://github.com/yoshuawuyts/nanogql",
- "npm": "nanographql",
- "github": "choojs/nanographql"
- },
- {
- "name": "gq-loader",
- "description": "A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.",
- "url": "https://github.com/Houfeng/gq-loader",
- "npm": "gq-loader",
- "github": "Houfeng/gq-loader"
- },
- {
- "name": "AWS Amplify",
- "description": "A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.",
- "url": "https://docs.amplify.aws/",
- "npm": "aws-amplify",
- "github": "aws-amplify/amplify-js"
- },
- {
- "name": "Grafoo",
- "description": "An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.",
- "url": "https://github.com/grafoojs/grafoo",
- "npm": "@grafoo/core",
- "github": "grafoojs/grafoo"
- },
- {
- "name": "urql",
- "description": "A highly customizable and versatile GraphQL client for React.",
- "url": "https://formidable.com/open-source/urql/",
- "npm": "urql",
- "github": "FormidableLabs/urql"
- },
- {
- "name": "graphqurl",
- "description": "curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.",
- "url": "https://github.com/hasura/graphqurl",
- "npm": "graphqurl",
- "github": "hasura/graphqurl"
- }
- ]
- },
- "Julia": {
- "GraphQL Clients": [
- {
- "name": "Diana.jl",
- "description": "A Julia GraphQL server implementation.",
- "url": "https://github.com/codeneomatrix/Diana.jl",
- "github": "codeneomatrix/Diana.jl"
- }
- ]
- },
- "Kotlin": {
- "Server Libraries": [
- {
- "name": "graphql-kotlin",
- "description": "A set of libraries for running GraphQL server in Kotlin.",
- "url": "https://github.com/ExpediaGroup/graphql-kotlin/",
- "github": "ExpediaGroup/graphql-kotlin"
- }
- ]
- },
- "Perl": {
- "Server Libraries": [
- {
- "name": "graphql-perl",
- "description": "A Perl port of GraphQL reference implementation",
- "howto": "- [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)\n\n - [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app\n\n - [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL\n\n - [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL\n\n",
- "url": "https://github.com/graphql-perl/graphql-perl",
- "github": "graphql-perl/graphql-perl"
- }
- ]
- },
- "PHP": {
- "Server Libraries": [
- {
- "name": "graphql-php",
- "description": "A PHP port of GraphQL reference implementation",
- "url": "https://github.com/webonyx/graphql-php",
- "github": "webonyx/graphql-php"
- },
- {
- "name": "graphql-relay-php",
- "description": "A library to help construct a graphql-php server supporting react-relay.",
- "url": "https://github.com/ivome/graphql-relay-php",
- "github": "ivome/graphql-relay-php"
- },
- {
- "name": "Railt",
- "description": "A PHP GraphQL Framework.",
- "url": "https://github.com/railt/railt",
- "github": "railt/railt"
- },
- {
- "name": "Lighthouse",
- "description": "A GraphQL server for Laravel",
- "url": "https://github.com/nuwave/lighthouse",
- "github": "nuwave/lighthouse"
- },
- {
- "name": "GraphQLBundle",
- "description": "A GraphQL server for Symfony",
- "url": "https://github.com/overblog/GraphQLBundle",
- "github": "overblog/GraphQLBundle"
- },
- {
- "name": "WPGraphQL",
- "description": "A free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site ",
- "github": "wp-graphql/wp-graphql",
- "url": "https://github.com/wp-graphql/wp-graphql"
- },
- {
- "name": "API Platform",
- "description": "API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.",
- "howto": "The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):\n\n```php\nname;\n }\n // ...\n}\n```\nOther GraphQLite features include validation, security, error handling, loading via data-loader pattern...",
- "github": "thecodingmachine/graphqlite",
- "url": "https://graphqlite.thecodingmachine.io"
- },
- {
- "name": "Siler",
- "description": "Siler is a PHP library powered with high-level abstractions to work with GraphQL.",
- "howto": "To run a Siler hello world script:\n```graphql\ntype Query {\n hello: String\n}\n```\n\n```php\n [\n 'hello' => 'world',\n ],\n];\n$schema = Graphqlschema($typeDefs, $resolvers);\n\necho \"Server running at http://127.0.0.1:8080\";\n\nHttpserver(Graphqlpsr7($schema), function (Throwable $err) {\n var_dump($err);\n return Diactorosjson([\n 'error' => true,\n 'message' => $err->getMessage(),\n ]);\n})()->run();\n```\nIt also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.\n",
- "github": "leocavalcante/siler",
- "url": "https://siler.leocavalcante.com/graphql/"
- },
- {
- "name": "GraphQL API for WordPress",
- "description": "A GraphQL server for WordPress",
- "github": "https://github.com/GraphQLAPI/graphql-api-for-wp",
- "url": "https://github.com/GraphQLAPI/graphql-api-for-wp"
- },
- {
- "name": "GraPHPinator",
- "description": "A GraphQL implementation for modern PHP",
- "github": "https://github.com/infinityloop-dev/graphpinator",
- "url": "https://github.com/infinityloop-dev/graphpinator"
- }
- ]
- },
- "Python": {
- "Server Libraries": [
- {
- "name": "Graphene",
- "description": "A Python library for building GraphQL APIs.",
- "howto": "To run a Graphene hello world script:\n\n```bash\npip install graphene\n```\n\nThen run `python hello.py` with this code in `hello.py`:\n\n```python\nimport graphene\n\nclass Query(graphene.ObjectType):\n hello = graphene.String(name=graphene.String(default_value=\"World\"))\n\n def resolve_hello(self, info, name):\n return 'Hello ' + name\n\nschema = graphene.Schema(query=Query)\nresult = schema.execute('{ hello }')\nprint(result.data['hello']) # \"Hello World\"\n```\n\nThere are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.",
- "url": "http://graphene-python.org/",
- "github": "graphql-python/graphene"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "GQL",
- "description": "A GraphQL client in Python.",
- "url": "https://github.com/graphql-python/gql",
- "github": "graphql-python/gql"
- },
- {
- "name": "python-graphql-client",
- "description": "Simple GraphQL client for Python 2.7+.",
- "github": "prisma-labs/python-graphql-client",
- "url": "https://github.com/prisma/python-graphql-client"
- },
- {
- "name": "sgqlc",
- "description": "A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.",
- "github": "profusion/sgqlc",
- "url": "https://github.com/profusion/sgqlc"
- }
- ]
- },
- "R": {
- "Server Libraries": [
- {
- "name": "ghql",
- "description": "General purpose GraphQL R client",
- "github": "ropensci/ghql",
- "url": "https://github.com/ropensci/ghql"
- }
- ]
- },
- "Ruby": {
- "Server Libraries": [
- {
- "name": "graphql-ruby",
- "description": "A Ruby library for building GraphQL APIs.",
- "howto": "To run a hello world script with `graphql-ruby`:\n```bash\ngem install graphql\n```\n\nThen run `ruby hello.rb` with this code in `hello.rb`:\n\n```ruby\nrequire 'graphql'\n\nclass QueryType < GraphQL::Schema::Object\n graphql_name 'Query'\n field :hello do\n type types.String\n resolve -> (obj, args, ctx) { 'Hello world!' }\n end\nend\n\nclass Schema < GraphQL::Schema\n query QueryType\nend\n\nputs Schema.execute('{ hello }').to_json\n```\nThere are also nice bindings for Relay and Rails.",
- "url": "https://github.com/rmosolgo/graphql-ruby",
- "gem": "graphql",
- "github": "rmosolgo/graphql-ruby"
- },
- {
- "name": "Agoo",
- "description": "A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.",
- "howto": "```ruby\nrequire 'agoo'\n\nclass Query\n def hello\n 'hello'\n end\nend\n\nclass Schema\n attr_reader :query\n\n def initialize\n @query = Query.new()\n end\nend\n\nAgoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql')\nAgoo::Server.start()\nAgoo::GraphQL.schema(Schema.new) {\n Agoo::GraphQL.load(%^type Query { hello: String }^)\n}\nsleep\n\n# To run this GraphQL example type the following then go to a browser and enter\n# a URL of localhost:6464/graphql?query={hello}\n#\n# ruby hello.rb\n```",
- "gem": "agoo",
- "github": "ohler55/agoo"
- }
- ]
- },
- "Rust": {
- "Server Libraries": [
- {
- "name": "graphql-rust/juniper",
- "description": "GraphQL server library for Rust",
- "github": "graphql-rust/juniper",
- "url": "https://github.com/graphql-rust/juniper"
- }
- ]
- },
- "Scala": {
- "Server Libraries": [
- {
- "name": "Sangria",
- "description": "A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).",
- "howto": "An example of a hello world GraphQL schema and query with `sangria`:\n```scala\nimport sangria.schema._\nimport sangria.execution._\nimport sangria.macros._\n\nval QueryType = ObjectType(\"Query\", fields[Unit, Unit](\n Field(\"hello\", StringType, resolve = _ ⇒ \"Hello world!\")\n))\n\nval schema = Schema(QueryType)\n\nval query = graphql\"{ hello }\"\n\nExecutor.execute(schema, query) map println\n```",
- "url": "http://sangria-graphql.org/",
- "github": "sangria-graphql/sangria"
- }
- ]
- },
- "OCaml / Reason": {
- "Server Libraries": [
- {
- "name": "ocaml-graphql-server",
- "description": "GraphQL server library for OCaml and Reason",
- "url": "https://github.com/andreas/ocaml-graphql-server",
- "github": "andreas/ocaml-graphql-server"
- }
- ]
- },
- "Swift / Objective-C iOS": {
- "Server Libraries": [
- {
- "name": "Graphiti",
- "description": "Swift library for building GraphQL schemas/types fast, safely and easily.",
- "url": "https://github.com/GraphQLSwift/Graphiti",
- "github": "GraphQLSwift/Graphiti"
- }
- ],
- "GraphQL Clients": [
- {
- "name": "Apollo iOS",
- "description": "A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.",
- "url": "https://www.apollographql.com/docs/ios/",
- "github": "apollographql/apollo-ios"
- },
- {
- "name": "GraphQL iOS",
- "description": "An Objective-C GraphQL client for iOS.",
- "url": "https://github.com/funcompany/graphql-ios",
- "github": "funcompany/graphql-ios"
- },
- {
- "name": "Graphaello",
- "description": "A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo",
- "github": "nerdsupremacist/Graphaello",
- "url": "https://github.com/nerdsupremacist/Graphaello"
- }
- ]
+{
+ "Libraries": {
+ "C / C++": {
+ "Tools": [
+ {
+ "name": "libgraphqlparser",
+ "description": "A GraphQL query language parser in C++ with C and C++ APIs.",
+ "url": "https://github.com/graphql/libgraphqlparser",
+ "github": "graphql/libgraphqlparser"
}
+ ]
},
- "Tools": [
- {
- "name": "GraphiQL",
- "description": "An interactive in-browser GraphQL IDE.",
- "url": "https://github.com/graphql/graphiql",
- "npm": "graphiql",
- "github": "graphql/graphiql"
- },
- {
- "name": "libgraphqlparser",
- "description": "A GraphQL query language parser in C++ with C and C++ APIs.",
- "url": "https://github.com/graphql/libgraphqlparser",
- "github": "graphql/libgraphqlparser"
- },
- {
- "name": "GraphQL Language Service",
- "description": "An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).",
- "url": "https://github.com/graphql/graphql-language-service",
- "npm": "graphql-language-service",
- "github": "graphql/graphql-language-service"
- },
- {
- "name": "quicktype",
- "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
- "url": "https://quicktype.io/",
- "npm": "quicktype",
- "github": "quicktype/quicktype"
- },
- {
- "name": "GraphQL-ESLint",
- "description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
- "url": "https://github.com/dotansimha/graphql-eslint/",
- "npm": "@graphql-eslint/eslint-plugin",
- "github": "dotansimha/graphql-eslint/"
- },
- {
- "name": "GraphQL Modules",
- "description": "GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.",
- "url": "https://graphql-modules.com",
- "npm": "graphql-modules",
- "github": "Urigo/graphql-modules"
- },
- {
- "name": "GraphQL Tools",
- "description": "A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).",
- "url": "https://graphql-tools.com",
- "npm": "graphql-tools",
- "github": "ardatan/graphql-tools"
- },
- {
- "name": "GraphQL Config",
- "description": "One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).",
- "url": "https://graphql-config.com",
- "npm": "graphql-config",
- "github": "kamilkisiela/graphql-config"
- },
- {
- "name": "GraphQL Mesh",
- "description": "GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.",
- "url": "https://graphql-mesh.com",
- "npm": "@graphql-mesh/cli",
- "github": "Urigo/graphql-mesh"
- },
- {
- "name": "GraphQL Code Generator",
- "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
- "url": "https://graphql-code-generator.com",
- "npm": "@graphql-codegen/cli",
- "github": "dotansimha/graphql-code-generator"
- },
- {
- "name": "GraphQL CLI",
- "description": "A command line tool for common GraphQL development workflows.",
- "url": "https://graphql-cli.com",
- "npm": "graphql-cli",
- "github": "Urigo/graphql-cli"
- },
- {
- "name": "GraphQL Inspector",
- "description": "Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.",
- "url": "https://graphql-inspector.com/",
- "npm": "@graphql-inspector/cli",
- "github": "kamilkisiela/graphql-inspector"
- },
- {
- "name": "GraphQL Scalars",
- "description": "A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.",
- "url": "https://github.com/Urigo/graphql-scalars",
- "npm": "graphql-scalars",
- "github": "Urigo/graphql-scalars"
- },
- {
- "name": "SOFA",
- "description": "Generate REST API from your GraphQL API.",
- "url": "https://sofa-api.com/",
- "npm": "sofa-api",
- "github": "Urigo/SOFA"
- }
- ],
- "Services": [
- {
- "name": "Apollo Graph Manager",
- "description": "A cloud service for monitoring the performance and usage of your GraphQL backend.",
- "url": "https://engine.apollographql.com"
- },
- {
- "name": "GraphCMS",
- "description": "A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.",
- "url": "https://graphcms.com/"
- },
- {
- "name": "Prisma",
- "description": "([github](https://github.com/prisma)) A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
- "url": "https://www.prisma.io"
- },
- {
- "name": "Tipe",
- "description": "([github](https://github.com/tipeio)) A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
- "url": "https://tipe.io"
- },
- {
- "name": "AWS AppSync",
- "description": "Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls.",
- "url": "https://aws.amazon.com/appsync/"
- },
- {
- "name": "Elide",
- "description": "A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.",
- "url": "https://elide.io"
- },
- {
- "name": "Hasura",
- "description": "([github](https://github.com/hasura)) Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.",
- "url": "https://hasura.io"
- },
- {
- "name": "FaunaDB",
- "description": "Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.",
- "url": "https://docs.fauna.com/fauna/current/graphql"
- }
- ],
- "More Stuff": [
- {
- "name": "awesome-graphql",
- "description": "A fantastic community maintained collection of libraries, resources, and more.",
- "url": "https://github.com/chentsulin/awesome-graphql"
- }
- ]
-}
\ No newline at end of file
+ "C# / .NET": {
+ "Server Libraries": [
+ {
+ "name": "graphql-dotnet",
+ "description": "GraphQL for .NET",
+ "howto": "```csharp\nusing System;\nusing GraphQL;\nusing GraphQL.Types;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n var schema = Schema.For(@\"\n type Query {\n hello: String\n }\n \");\n\n var json = schema.Execute(_ =>\n {\n _.Query = \"{ hello }\";\n _.Root = new { Hello = \"Hello World!\" };\n });\n\n Console.WriteLine(json);\n }\n} \n```",
+ "url": "https://github.com/graphql-dotnet/graphql-dotnet",
+ "github": "graphql-dotnet/graphql-dotnet"
+ },
+ {
+ "name": "graphql-net",
+ "description": "Convert GraphQL to IQueryable",
+ "url": "https://github.com/ckimes89/graphql-net",
+ "github": "chkimes/graphql-net"
+ },
+ {
+ "name": "Entity GraphQL",
+ "description": ".NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)",
+ "url": "https://github.com/lukemurray/EntityGraphQL",
+ "github": "lukemurray/EntityGraphQL"
+ },
+ {
+ "name": "Hot Chocolate",
+ "description": "GraphQL Server for .NET core and .NET classic",
+ "url": "https://github.com/ChilliCream/hotchocolate",
+ "github": "ChilliCream/hotchocolate"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "GraphQL.Client",
+ "description": "A GraphQL Client for .NET.",
+ "url": "https://github.com/graphql-dotnet/graphql-client",
+ "github": "graphql-dotnet/graphql-client"
+ },
+ {
+ "name": "graphql-net-client",
+ "description": "Basic example GraphQL client for .NET.",
+ "url": "https://github.com/bkniffler/graphql-net-client",
+ "github": "bkniffler/graphql-net-client"
+ },
+ {
+ "name": "SAHB.GraphQLClient",
+ "description": "GraphQL client which supports generating queries from C# classes",
+ "url": "https://github.com/sahb1239/SAHB.GraphQLClient",
+ "github": "sahb1239/SAHB.GraphQLClient"
+ }
+ ]
+ },
+ "Clojure": {
+ "Server Libraries": [
+ {
+ "name": "alumbra",
+ "description": "A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).",
+ "howto": "```clojure\n(require '[alumbra.core :as alumbra]\n '[claro.data :as data])\n\n(def schema\n \"type Person { name: String!, friends: [Person!]! }\n type QueryRoot { person(id: ID!): Person, me: Person! }\n schema { query: QueryRoot }\")\n\n(defrecord Person [id]\n data/Resolvable\n (resolve! [_ _]\n {:name (str \"Person #\" id)\n :friends (map ->Person (range (inc id) (+ id 3)))}))\n\n(def QueryRoot\n {:person (map->Person {})\n :me (map->Person {:id 0})})\n\n(def app\n (alumbra/handler\n {:schema schema\n :query QueryRoot}))\n\n(defonce my-graphql-server\n (aleph.http/start-server #'app {:port 3000}))\n```\n\n```bash\n$ curl -XPOST \"http://0:3000\" -H'Content-Type: application/json' -d'{\n \"query\": \"{ me { name, friends { name } } }\"\n}'\n{\"data\":{\"me\":{\"name\":\"Person #0\",\"friends\":[{\"name\":\"Person #1\"},{\"name\":\"Person #2\"}]}}}\n```",
+ "url": "https://github.com/alumbra/alumbra",
+ "github": "alumbra/alumbra"
+ },
+ {
+ "name": "graphql-clj",
+ "description": "A Clojure library that provides a GraphQL implementation.",
+ "howto": "Code that executes a hello world GraphQL query with `graphql-clj`:\n```clojure\n\n(def schema \"type QueryRoot {\n hello: String\n }\")\n\n(defn resolver-fn [type-name field-name]\n (get-in {\"QueryRoot\" {\"hello\" (fn [context parent & rest]\n \"Hello world!\")}}\n [type-name field-name]))\n\n(require '[graphql-clj.executor :as executor])\n\n(executor/execute nil schema resolver-fn \"{ hello }\")\n```",
+ "url": "https://github.com/tendant/graphql-clj",
+ "github": "tendant/graphql-clj"
+ },
+ {
+ "name": "lacinia",
+ "description": "A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.",
+ "github": "walmartlabs/lacinia",
+ "url": "https://github.com/walmartlabs/lacinia"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "regraph",
+ "description": "A GraphQL client implemented in Clojurescript with support for websockets.",
+ "github": "oliyh/re-graph",
+ "url": "https://github.com/oliyh/re-graph/"
+ }
+ ]
+ },
+ "D": {
+ "Server Libraries": [
+ {
+ "name": "graphqld",
+ "description": "A GraphQL implementaiton for the D Programming Language.",
+ "github": "https://github.com/burner/graphqld",
+ "url": "https://github.com/burner/graphqld"
+ }
+ ]
+ },
+ "Elixir": {
+ "GraphQL Clients": [
+ {
+ "name": "Neuron",
+ "description": "A GraphQL client for Elixir",
+ "github": "https://github.com/uesteibar/neuron",
+ "url": "https://github.com/uesteibar/neuron"
+ },
+ {
+ "name": "common_graphql_client",
+ "description": "Elixir GraphQL Client with HTTP and WebSocket support",
+ "github": "https://github.com/annkissam/common_graphql_client",
+ "url": "https://github.com/annkissam/common_graphql_client"
+ }
+ ],
+ "Server Libraries": [
+ {
+ "name": "absinthe",
+ "description": "GraphQL implementation for Elixir.",
+ "github": "absinthe-graphql/absinthe",
+ "url": "https://github.com/absinthe-graphql/absinthe"
+ },
+ {
+ "name": "graphql-elixir",
+ "description": "An Elixir implementation of Facebook's GraphQL.",
+ "github": "graphql-elixir/graphql",
+ "url": "https://github.com/graphql-elixir/graphql"
+ }
+ ]
+ },
+ "Elm": {
+ "GraphQL Clients": [
+ {
+ "name": "dillonkearns/elm-graphql",
+ "description": "Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.",
+ "url": "https://github.com/dillonkearns/elm-graphql",
+ "github": "dillonkearns/elm-graphql"
+ }
+ ]
+ },
+ "Erlang": {
+ "Server Libraries": [
+ {
+ "name": "graphql-erlang",
+ "description": "GraphQL implementation in Erlang.",
+ "url": "https://github.com/shopgun/graphql-erlang",
+ "github": "jlouis/graphql-erlang"
+ }
+ ]
+ },
+ "Flutter": {
+ "GraphQL Clients": [
+ {
+ "name": "graphql",
+ "description": "A GraphQL client implementation in Flutter.",
+ "url": "https://github.com/zino-app/graphql-flutter#readme",
+ "github": "zino-app/graphql-flutter"
+ }
+ ]
+ },
+ "Go": {
+ "Server Libraries": [
+ {
+ "name": "graphql-go",
+ "description": "An implementation of GraphQL for Go / Golang.",
+ "url": "https://github.com/graphql-go/graphql",
+ "github": "graphql-go/graphql"
+ },
+ {
+ "name": "graph-gophers/graphql-go",
+ "description": "An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).",
+ "url": "https://github.com/graph-gophers/graphql-go",
+ "github": "graph-gophers/graphql-go"
+ },
+ {
+ "name": "99designs/gqlgen",
+ "description": "Go generate based graphql server library.",
+ "url": "https://github.com/99designs/gqlgen",
+ "github": "99designs/gqlgen"
+ },
+ {
+ "name": "graphql-relay-go",
+ "description": "A Go/Golang library to help construct a graphql-go server supporting react-relay.",
+ "url": "https://github.com/graphql-go/relay",
+ "github": "graphql-go/relay"
+ },
+ {
+ "name": "machinebox/graphql",
+ "description": "An elegant low-level HTTP client for GraphQL.",
+ "url": "https://github.com/machinebox/graphql",
+ "github": "machinebox/graphql"
+ },
+ {
+ "name": "samsarahq/thunder",
+ "description": "A GraphQL implementation with easy schema building, live queries, and batching.",
+ "url": "https://github.com/samsarahq/thunder",
+ "github": "samsarahq/thunder"
+ },
+ {
+ "name": "appointy/jaal",
+ "description": "Develop spec compliant GraphQL servers in Go.",
+ "url": "https://github.com/appointy/jaal",
+ "github": "appointy/jaal"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "graphql",
+ "description": "A GraphQL client implementation in Go.",
+ "url": "https://github.com/shurcooL/graphql#readme",
+ "github": "shurcooL/graphql"
+ }
+ ]
+ },
+ "Groovy": {
+ "Server Libraries": [
+ {
+ "name": "gorm-graphql",
+ "howto": "**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of \"data fetchers\" to query, update, and delete data through executions of the schema.\n\n**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:\n\n- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.\n\n- Generates the schema at startup with spring bean configuration to make it easy to extend.\n\n- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.\n\n- Overrides the default data binder to use the data binding provided by Grails\n- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier\n\nSee [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.",
+ "github": "grails/gorm-graphql",
+ "url": "https://github.com/grails/gorm-graphql/"
+ },
+ {
+ "name": "GQL",
+ "description": "GQL is a Groove library for GraphQL",
+ "url": "https://grooviter.github.io/gql/",
+ "github": "grooviter/gql"
+ }
+ ]
+ },
+ "Haskell": {
+ "Server Libraries": [
+ {
+ "name": "Morpheus GraphQL",
+ "description": "A Haskell library for building GraphQL APIs.",
+ "howto": "\nHello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.\n",
+ "url": "https://github.com/morpheusgraphql/morpheus-graphql",
+ "github": "https://github.com/morpheusgraphql/morpheus-graphql"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "morpheus-graphql-client",
+ "description": "A strongly-typed GraphQL client implementation in Haksell.",
+ "url": "https://github.com/morpheusgraphql/morpheus-graphql",
+ "github": "https://github.com/morpheusgraphql/morpheus-graphql"
+ }
+ ]
+ },
+ "Java / Android": {
+ "Server Libraries": [
+ {
+ "name": "graphql-java",
+ "description": "A Java library for building GraphQL APIs.",
+ "howto": "Code that executes a hello world GraphQL query with `graphql-java`:\n\n```java\nimport graphql.ExecutionResult;\nimport graphql.GraphQL;\nimport graphql.schema.GraphQLSchema;\nimport graphql.schema.StaticDataFetcher;\nimport graphql.schema.idl.RuntimeWiring;\nimport graphql.schema.idl.SchemaGenerator;\nimport graphql.schema.idl.SchemaParser;\nimport graphql.schema.idl.TypeDefinitionRegistry;\n\nimport static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;\n\npublic class HelloWorld {\n\n public static void main(String[] args) {\n String schema = \"type Query{hello: String} schema{query: Query}\";\n\n SchemaParser schemaParser = new SchemaParser();\n TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);\n\n RuntimeWiring runtimeWiring = new RuntimeWiring()\n .type(\"Query\", builder -> builder.dataFetcher(\"hello\", new StaticDataFetcher(\"world\")))\n .build();\n\n SchemaGenerator schemaGenerator = new SchemaGenerator();\n GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);\n\n GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();\n ExecutionResult executionResult = build.execute(\"{hello}\");\n\n System.out.println(executionResult.getData().toString());\n // Prints: {hello=world}\n }\n}\n```\n\nSee [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.\n",
+ "github": "graphql-java/graphql-java",
+ "url": "https://github.com/graphql-java/graphql-java"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "Apollo Android",
+ "description": "A strongly-typed, caching GraphQL client for Android, written in Java.",
+ "github": "apollographql/apollo-android",
+ "url": "https://github.com/apollographql/apollo-android"
+ },
+ {
+ "name": "Nodes",
+ "description": "A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.",
+ "github": "americanexpress/nodes",
+ "url": "https://github.com/americanexpress/nodes"
+ }
+ ]
+ },
+ "JavaScript": {
+ "Server Libraries": [
+ {
+ "name": "GraphQL.js",
+ "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
+ "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
+ "url": "/graphql-js/",
+ "npm": "graphql",
+ "github": "graphql/graphql-js"
+ },
+ {
+ "name": "Express GraphQL",
+ "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
+ "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
+ "url": "/graphql-js/running-an-express-graphql-server/",
+ "npm": "express-graphql",
+ "github": "graphql/express-graphql"
+ },
+ {
+ "name": "Apollo Server",
+ "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
+ "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
+ "url": "https://www.apollographql.com/docs/apollo-server/",
+ "npm": "apollo-server-express",
+ "github": "apollographql/apollo-server"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "Relay",
+ "description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
+ "url": "https://facebook.github.io/relay/",
+ "npm": "react-relay",
+ "github": "facebook/relay"
+ },
+ {
+ "name": "Apollo Client",
+ "description": "A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.",
+ "url": "http://apollographql.com/client/",
+ "npm": "@apollo/client",
+ "github": "apollographql/apollo-client"
+ },
+ {
+ "name": "GraphQL Request",
+ "description": "A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.",
+ "url": "https://github.com/prisma/graphql-request",
+ "npm": "graphql-request",
+ "github": "prisma-labs/graphql-request"
+ },
+ {
+ "name": "Lokka",
+ "description": "A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).",
+ "url": "https://github.com/kadirahq/lokka",
+ "npm": "lokka",
+ "github": "kadirahq/lokka"
+ },
+ {
+ "name": "nanogql",
+ "description": "Tiny GraphQL client library using template strings.",
+ "url": "https://github.com/yoshuawuyts/nanogql",
+ "npm": "nanographql",
+ "github": "choojs/nanographql"
+ },
+ {
+ "name": "gq-loader",
+ "description": "A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.",
+ "url": "https://github.com/Houfeng/gq-loader",
+ "npm": "gq-loader",
+ "github": "Houfeng/gq-loader"
+ },
+ {
+ "name": "AWS Amplify",
+ "description": "A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.",
+ "url": "https://docs.amplify.aws/",
+ "npm": "aws-amplify",
+ "github": "aws-amplify/amplify-js"
+ },
+ {
+ "name": "Grafoo",
+ "description": "An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.",
+ "url": "https://github.com/grafoojs/grafoo",
+ "npm": "@grafoo/core",
+ "github": "grafoojs/grafoo"
+ },
+ {
+ "name": "urql",
+ "description": "A highly customizable and versatile GraphQL client for React.",
+ "url": "https://formidable.com/open-source/urql/",
+ "npm": "urql",
+ "github": "FormidableLabs/urql"
+ },
+ {
+ "name": "graphqurl",
+ "description": "curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.",
+ "url": "https://github.com/hasura/graphqurl",
+ "npm": "graphqurl",
+ "github": "hasura/graphqurl"
+ }
+ ],
+ "Tools": [
+ {
+ "name": "GraphiQL",
+ "description": "An interactive in-browser GraphQL IDE.",
+ "url": "https://github.com/graphql/graphiql",
+ "npm": "graphiql",
+ "github": "graphql/graphiql"
+ },
+ {
+ "name": "GraphQL Language Service",
+ "description": "An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).",
+ "url": "https://github.com/graphql/graphql-language-service",
+ "npm": "graphql-language-service",
+ "github": "graphql/graphql-language-service"
+ },
+ {
+ "name": "quicktype",
+ "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
+ "url": "https://quicktype.io/",
+ "npm": "quicktype",
+ "github": "quicktype/quicktype"
+ },
+ {
+ "name": "GraphQL-ESLint",
+ "description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
+ "url": "https://github.com/dotansimha/graphql-eslint/",
+ "npm": "@graphql-eslint/eslint-plugin",
+ "github": "dotansimha/graphql-eslint/"
+ },
+ {
+ "name": "GraphQL Modules",
+ "description": "GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.",
+ "url": "https://graphql-modules.com",
+ "npm": "graphql-modules",
+ "github": "Urigo/graphql-modules"
+ },
+ {
+ "name": "GraphQL Tools",
+ "description": "A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).",
+ "url": "https://graphql-tools.com",
+ "npm": "graphql-tools",
+ "github": "ardatan/graphql-tools"
+ },
+ {
+ "name": "GraphQL Config",
+ "description": "One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).",
+ "url": "https://graphql-config.com",
+ "npm": "graphql-config",
+ "github": "kamilkisiela/graphql-config"
+ },
+ {
+ "name": "GraphQL Mesh",
+ "description": "GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.",
+ "url": "https://graphql-mesh.com",
+ "npm": "@graphql-mesh/cli",
+ "github": "Urigo/graphql-mesh"
+ },
+ {
+ "name": "GraphQL Code Generator",
+ "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
+ "url": "https://graphql-code-generator.com",
+ "npm": "@graphql-codegen/cli",
+ "github": "dotansimha/graphql-code-generator"
+ },
+ {
+ "name": "GraphQL CLI",
+ "description": "A command line tool for common GraphQL development workflows.",
+ "url": "https://graphql-cli.com",
+ "npm": "graphql-cli",
+ "github": "Urigo/graphql-cli"
+ },
+ {
+ "name": "GraphQL Inspector",
+ "description": "Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.",
+ "url": "https://graphql-inspector.com/",
+ "npm": "@graphql-inspector/cli",
+ "github": "kamilkisiela/graphql-inspector"
+ },
+ {
+ "name": "GraphQL Scalars",
+ "description": "A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.",
+ "url": "https://github.com/Urigo/graphql-scalars",
+ "npm": "graphql-scalars",
+ "github": "Urigo/graphql-scalars"
+ },
+ {
+ "name": "SOFA",
+ "description": "Generate REST API from your GraphQL API.",
+ "url": "https://sofa-api.com/",
+ "npm": "sofa-api",
+ "github": "Urigo/SOFA"
+ }
+ ]
+ },
+ "Julia": {
+ "GraphQL Clients": [
+ {
+ "name": "Diana.jl",
+ "description": "A Julia GraphQL server implementation.",
+ "url": "https://github.com/codeneomatrix/Diana.jl",
+ "github": "codeneomatrix/Diana.jl"
+ }
+ ]
+ },
+ "Kotlin": {
+ "Server Libraries": [
+ {
+ "name": "graphql-kotlin",
+ "description": "A set of libraries for running GraphQL server in Kotlin.",
+ "url": "https://github.com/ExpediaGroup/graphql-kotlin/",
+ "github": "ExpediaGroup/graphql-kotlin"
+ }
+ ]
+ },
+ "Perl": {
+ "Server Libraries": [
+ {
+ "name": "graphql-perl",
+ "description": "A Perl port of GraphQL reference implementation",
+ "howto": "- [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)\n\n - [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app\n\n - [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL\n\n - [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL\n\n",
+ "url": "https://github.com/graphql-perl/graphql-perl",
+ "github": "graphql-perl/graphql-perl"
+ }
+ ]
+ },
+ "PHP": {
+ "Server Libraries": [
+ {
+ "name": "graphql-php",
+ "description": "A PHP port of GraphQL reference implementation",
+ "url": "https://github.com/webonyx/graphql-php",
+ "github": "webonyx/graphql-php"
+ },
+ {
+ "name": "graphql-relay-php",
+ "description": "A library to help construct a graphql-php server supporting react-relay.",
+ "url": "https://github.com/ivome/graphql-relay-php",
+ "github": "ivome/graphql-relay-php"
+ },
+ {
+ "name": "Railt",
+ "description": "A PHP GraphQL Framework.",
+ "url": "https://github.com/railt/railt",
+ "github": "railt/railt"
+ },
+ {
+ "name": "Lighthouse",
+ "description": "A GraphQL server for Laravel",
+ "url": "https://github.com/nuwave/lighthouse",
+ "github": "nuwave/lighthouse"
+ },
+ {
+ "name": "GraphQLBundle",
+ "description": "A GraphQL server for Symfony",
+ "url": "https://github.com/overblog/GraphQLBundle",
+ "github": "overblog/GraphQLBundle"
+ },
+ {
+ "name": "WPGraphQL",
+ "description": "A free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site ",
+ "github": "wp-graphql/wp-graphql",
+ "url": "https://github.com/wp-graphql/wp-graphql"
+ },
+ {
+ "name": "API Platform",
+ "description": "API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.",
+ "howto": "The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):\n\n```php\nname;\n }\n // ...\n}\n```\nOther GraphQLite features include validation, security, error handling, loading via data-loader pattern...",
+ "github": "thecodingmachine/graphqlite",
+ "url": "https://graphqlite.thecodingmachine.io"
+ },
+ {
+ "name": "Siler",
+ "description": "Siler is a PHP library powered with high-level abstractions to work with GraphQL.",
+ "howto": "To run a Siler hello world script:\n```graphql\ntype Query {\n hello: String\n}\n```\n\n```php\n [\n 'hello' => 'world',\n ],\n];\n$schema = Graphqlschema($typeDefs, $resolvers);\n\necho \"Server running at http://127.0.0.1:8080\";\n\nHttpserver(Graphqlpsr7($schema), function (Throwable $err) {\n var_dump($err);\n return Diactorosjson([\n 'error' => true,\n 'message' => $err->getMessage(),\n ]);\n})()->run();\n```\nIt also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.\n",
+ "github": "leocavalcante/siler",
+ "url": "https://siler.leocavalcante.com/graphql/"
+ },
+ {
+ "name": "GraphQL API for WordPress",
+ "description": "A GraphQL server for WordPress",
+ "github": "https://github.com/GraphQLAPI/graphql-api-for-wp",
+ "url": "https://github.com/GraphQLAPI/graphql-api-for-wp"
+ },
+ {
+ "name": "GraPHPinator",
+ "description": "A GraphQL implementation for modern PHP",
+ "github": "https://github.com/infinityloop-dev/graphpinator",
+ "url": "https://github.com/infinityloop-dev/graphpinator"
+ }
+ ]
+ },
+ "Python": {
+ "Server Libraries": [
+ {
+ "name": "Graphene",
+ "description": "A Python library for building GraphQL APIs.",
+ "howto": "To run a Graphene hello world script:\n\n```bash\npip install graphene\n```\n\nThen run `python hello.py` with this code in `hello.py`:\n\n```python\nimport graphene\n\nclass Query(graphene.ObjectType):\n hello = graphene.String(name=graphene.String(default_value=\"World\"))\n\n def resolve_hello(self, info, name):\n return 'Hello ' + name\n\nschema = graphene.Schema(query=Query)\nresult = schema.execute('{ hello }')\nprint(result.data['hello']) # \"Hello World\"\n```\n\nThere are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.",
+ "url": "http://graphene-python.org/",
+ "github": "graphql-python/graphene"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "GQL",
+ "description": "A GraphQL client in Python.",
+ "url": "https://github.com/graphql-python/gql",
+ "github": "graphql-python/gql"
+ },
+ {
+ "name": "python-graphql-client",
+ "description": "Simple GraphQL client for Python 2.7+.",
+ "github": "prisma-labs/python-graphql-client",
+ "url": "https://github.com/prisma/python-graphql-client"
+ },
+ {
+ "name": "sgqlc",
+ "description": "A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.",
+ "github": "profusion/sgqlc",
+ "url": "https://github.com/profusion/sgqlc"
+ }
+ ]
+ },
+ "R": {
+ "Server Libraries": [
+ {
+ "name": "ghql",
+ "description": "General purpose GraphQL R client",
+ "github": "ropensci/ghql",
+ "url": "https://github.com/ropensci/ghql"
+ }
+ ]
+ },
+ "Ruby": {
+ "Server Libraries": [
+ {
+ "name": "graphql-ruby",
+ "description": "A Ruby library for building GraphQL APIs.",
+ "howto": "To run a hello world script with `graphql-ruby`:\n```bash\ngem install graphql\n```\n\nThen run `ruby hello.rb` with this code in `hello.rb`:\n\n```ruby\nrequire 'graphql'\n\nclass QueryType < GraphQL::Schema::Object\n graphql_name 'Query'\n field :hello do\n type types.String\n resolve -> (obj, args, ctx) { 'Hello world!' }\n end\nend\n\nclass Schema < GraphQL::Schema\n query QueryType\nend\n\nputs Schema.execute('{ hello }').to_json\n```\nThere are also nice bindings for Relay and Rails.",
+ "url": "https://github.com/rmosolgo/graphql-ruby",
+ "gem": "graphql",
+ "github": "rmosolgo/graphql-ruby"
+ },
+ {
+ "name": "Agoo",
+ "description": "A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.",
+ "howto": "```ruby\nrequire 'agoo'\n\nclass Query\n def hello\n 'hello'\n end\nend\n\nclass Schema\n attr_reader :query\n\n def initialize\n @query = Query.new()\n end\nend\n\nAgoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql')\nAgoo::Server.start()\nAgoo::GraphQL.schema(Schema.new) {\n Agoo::GraphQL.load(%^type Query { hello: String }^)\n}\nsleep\n\n# To run this GraphQL example type the following then go to a browser and enter\n# a URL of localhost:6464/graphql?query={hello}\n#\n# ruby hello.rb\n```",
+ "gem": "agoo",
+ "github": "ohler55/agoo"
+ }
+ ]
+ },
+ "Rust": {
+ "Server Libraries": [
+ {
+ "name": "graphql-rust/juniper",
+ "description": "GraphQL server library for Rust",
+ "github": "graphql-rust/juniper",
+ "url": "https://github.com/graphql-rust/juniper"
+ }
+ ]
+ },
+ "Scala": {
+ "Server Libraries": [
+ {
+ "name": "Sangria",
+ "description": "A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).",
+ "howto": "An example of a hello world GraphQL schema and query with `sangria`:\n```scala\nimport sangria.schema._\nimport sangria.execution._\nimport sangria.macros._\n\nval QueryType = ObjectType(\"Query\", fields[Unit, Unit](\n Field(\"hello\", StringType, resolve = _ ⇒ \"Hello world!\")\n))\n\nval schema = Schema(QueryType)\n\nval query = graphql\"{ hello }\"\n\nExecutor.execute(schema, query) map println\n```",
+ "url": "http://sangria-graphql.org/",
+ "github": "sangria-graphql/sangria"
+ }
+ ]
+ },
+ "OCaml / Reason": {
+ "Server Libraries": [
+ {
+ "name": "ocaml-graphql-server",
+ "description": "GraphQL server library for OCaml and Reason",
+ "url": "https://github.com/andreas/ocaml-graphql-server",
+ "github": "andreas/ocaml-graphql-server"
+ }
+ ]
+ },
+ "Swift / Objective-C iOS": {
+ "Server Libraries": [
+ {
+ "name": "Graphiti",
+ "description": "Swift library for building GraphQL schemas/types fast, safely and easily.",
+ "url": "https://github.com/GraphQLSwift/Graphiti",
+ "github": "GraphQLSwift/Graphiti"
+ }
+ ],
+ "GraphQL Clients": [
+ {
+ "name": "Apollo iOS",
+ "description": "A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.",
+ "url": "https://www.apollographql.com/docs/ios/",
+ "github": "apollographql/apollo-ios"
+ },
+ {
+ "name": "GraphQL iOS",
+ "description": "An Objective-C GraphQL client for iOS.",
+ "url": "https://github.com/funcompany/graphql-ios",
+ "github": "funcompany/graphql-ios"
+ },
+ {
+ "name": "Graphaello",
+ "description": "A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo",
+ "github": "nerdsupremacist/Graphaello",
+ "url": "https://github.com/nerdsupremacist/Graphaello"
+ }
+ ]
+ }
+ },
+ "Services": [
+ {
+ "name": "Apollo Graph Manager",
+ "description": "A cloud service for monitoring the performance and usage of your GraphQL backend.",
+ "url": "https://engine.apollographql.com"
+ },
+ {
+ "name": "GraphCMS",
+ "description": "A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.",
+ "url": "https://graphcms.com/"
+ },
+ {
+ "name": "Prisma",
+ "description": "([github](https://github.com/prisma)) A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
+ "url": "https://www.prisma.io"
+ },
+ {
+ "name": "Tipe",
+ "description": "([github](https://github.com/tipeio)) A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
+ "url": "https://tipe.io"
+ },
+ {
+ "name": "AWS AppSync",
+ "description": "Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls.",
+ "url": "https://aws.amazon.com/appsync/"
+ },
+ {
+ "name": "Elide",
+ "description": "A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.",
+ "url": "https://elide.io"
+ },
+ {
+ "name": "Hasura",
+ "description": "([github](https://github.com/hasura)) Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.",
+ "url": "https://hasura.io"
+ },
+ {
+ "name": "FaunaDB",
+ "description": "Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.",
+ "url": "https://docs.fauna.com/fauna/current/graphql"
+ }
+ ],
+ "More Stuff": [
+ {
+ "name": "awesome-graphql",
+ "description": "A fantastic community maintained collection of libraries, resources, and more.",
+ "url": "https://github.com/chentsulin/awesome-graphql"
+ }
+ ]
+}
diff --git a/gatsby-node.js b/gatsby-node.js
index 9c635cf8ad..4b57789f5a 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -21,9 +21,6 @@ exports.onCreatePage = async ({ page, actions }) => {
})
)
})),
- sortLibs(codeData.Tools).then(sortedTools => {
- codeData.Tools = sortedTools;
- }),
])
context = {
diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx
index 85fb641136..73633c4704 100644
--- a/src/components/Footer/index.tsx
+++ b/src/components/Footer/index.tsx
@@ -27,11 +27,7 @@ const getLinks = (sourcePath: string): FooterLinks[] => [
{
text: "Code",
href: "/code",
- subsections: [
- { text: "Servers", href: "/code/#server-libraries" },
- { text: "Clients", href: "/code/#graphql-clients" },
- { text: "Tools", href: "/code/#tools" },
- ],
+ subsections: [],
},
{
text: "Community",
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index df982e4f76..82e73de8a2 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -7,8 +7,8 @@ export function buildLanguagesMenu(pageContext: any) {
let lastRow: string[]
const rows: string[][] = []
Object.keys(pageContext.codeData.Libraries).forEach((languageName, index) => {
- if (index % 5 === 0) {
- lastRow = []
+ if (index % 4 === 0) {
+ lastRow = [languageName]
rows.push(lastRow)
} else {
lastRow.push(languageName)
@@ -31,7 +31,7 @@ export function buildLanguagesMenu(pageContext: any) {
style={{ width: 92, height: 92 }}
/>
- {languageName}
+ {languageName}
@@ -107,6 +107,10 @@ export function buildLanguagesContent(pageContext: any) {
libraryCategories,
"GraphQL Clients"
)
+ markdown += buildLibraryCategoriesMarkdown(
+ libraryCategories,
+ "Tools"
+ )
}
return {markdown}
}
@@ -135,11 +139,6 @@ export default ({ pageContext }) => {
Languages
-
Services
@@ -165,12 +164,6 @@ export default ({ pageContext }) => {
{buildLanguagesContent(pageContext)}
{`
-## Tools
-${buildLibraryListMarkdown(pageContext.codeData.Tools)}
-`}
-
-
- {`
## Services
${buildLibraryListMarkdown(pageContext.codeData.Services)}
`}
diff --git a/static/img/c-c.svg b/static/img/c-c.svg
new file mode 100644
index 0000000000..5e117077e1
--- /dev/null
+++ b/static/img/c-c.svg
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/img/csharp.svg b/static/img/c-net.svg
similarity index 100%
rename from static/img/csharp.svg
rename to static/img/c-net.svg
diff --git a/static/img/flutter.svg b/static/img/flutter.svg
new file mode 100644
index 0000000000..617a4d4e48
--- /dev/null
+++ b/static/img/flutter.svg
@@ -0,0 +1 @@
+
diff --git a/static/img/swift.svg b/static/img/swift-objective-c-ios.svg
similarity index 100%
rename from static/img/swift.svg
rename to static/img/swift-objective-c-ios.svg
From cbd1b420c9f588cbca5ae3ee193f7553e003504f Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 4 Nov 2020 10:22:14 +0300
Subject: [PATCH 06/27] Add Tools back
---
data/code.json | 30 ++++++++++++++++--------------
gatsby-node.js | 3 +++
src/components/Footer/index.tsx | 7 ++++++-
src/pages/code.tsx | 11 +++++++++++
4 files changed, 36 insertions(+), 15 deletions(-)
diff --git a/data/code.json b/data/code.json
index f37c154013..50c9dc6647 100644
--- a/data/code.json
+++ b/data/code.json
@@ -389,13 +389,6 @@
"npm": "graphql-language-service",
"github": "graphql/graphql-language-service"
},
- {
- "name": "quicktype",
- "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
- "url": "https://quicktype.io/",
- "npm": "quicktype",
- "github": "quicktype/quicktype"
- },
{
"name": "GraphQL-ESLint",
"description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
@@ -431,13 +424,6 @@
"npm": "@graphql-mesh/cli",
"github": "Urigo/graphql-mesh"
},
- {
- "name": "GraphQL Code Generator",
- "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
- "url": "https://graphql-code-generator.com",
- "npm": "@graphql-codegen/cli",
- "github": "dotansimha/graphql-code-generator"
- },
{
"name": "GraphQL CLI",
"description": "A command line tool for common GraphQL development workflows.",
@@ -694,6 +680,22 @@
]
}
},
+ "Tools": [
+ {
+ "name": "quicktype",
+ "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
+ "url": "https://quicktype.io/",
+ "npm": "quicktype",
+ "github": "quicktype/quicktype"
+ },
+ {
+ "name": "GraphQL Code Generator",
+ "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
+ "url": "https://graphql-code-generator.com",
+ "npm": "@graphql-codegen/cli",
+ "github": "dotansimha/graphql-code-generator"
+ }
+ ],
"Services": [
{
"name": "Apollo Graph Manager",
diff --git a/gatsby-node.js b/gatsby-node.js
index 4b57789f5a..9c635cf8ad 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -21,6 +21,9 @@ exports.onCreatePage = async ({ page, actions }) => {
})
)
})),
+ sortLibs(codeData.Tools).then(sortedTools => {
+ codeData.Tools = sortedTools;
+ }),
])
context = {
diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx
index 73633c4704..0c2d3cb8d4 100644
--- a/src/components/Footer/index.tsx
+++ b/src/components/Footer/index.tsx
@@ -27,7 +27,12 @@ const getLinks = (sourcePath: string): FooterLinks[] => [
{
text: "Code",
href: "/code",
- subsections: [],
+ subsections: [
+ { text: "Languages", href: "/code/#languages" },
+ { text: "Tools", href: "/code/#tools" },
+ { text: "Services", href: "/code/#services" },
+ { text: "More Stuff", href: "/code/#more-stuff" },
+ ],
},
{
text: "Community",
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 82e73de8a2..5fc2c25935 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -139,6 +139,11 @@ export default ({ pageContext }) => {
Languages
+
From e368125492060d4c703b9efeee444ef71c33f616 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 4 Nov 2020 17:46:02 +0300
Subject: [PATCH 08/27] Fix Tools link
---
src/components/BlogLayout/index.tsx | 18 ++++++++++++------
src/components/BlogPost/index.tsx | 4 +++-
src/components/CodeLayout/index.tsx | 4 ++--
src/components/DocsLayout/index.tsx | 5 +++--
src/components/Marked/index.tsx | 5 +++--
src/pages/code.tsx | 14 +++++++-------
6 files changed, 30 insertions(+), 20 deletions(-)
diff --git a/src/components/BlogLayout/index.tsx b/src/components/BlogLayout/index.tsx
index 7f69784438..8111e5bd1b 100644
--- a/src/components/BlogLayout/index.tsx
+++ b/src/components/BlogLayout/index.tsx
@@ -10,6 +10,7 @@ interface Props {
guestBio: string
rawMarkdownBody: string
sideBarData: any
+ pageContext: any
}
const index = ({
@@ -20,6 +21,7 @@ const index = ({
guestBio,
rawMarkdownBody,
sideBarData,
+ pageContext
}: Props) => {
return (
@@ -32,17 +34,21 @@ const index = ({
guestBio={guestBio}
rawMarkdownBody={rawMarkdownBody}
isPermalink={true}
+ pageContext={pageContext}
/>
- {
- const aDate = new Date(a.frontmatter.date);
+ {
+ const aDate = new Date(a.frontmatter.date)
const bDate = new Date(b.frontmatter.date)
if (aDate > bDate) {
- return -1;
+ return -1
} else if (aDate < bDate) {
- return 1;
+ return 1
}
- return 0;
- }))} currentPermalink={permalink} />
+ return 0
+ })}
+ currentPermalink={permalink}
+ />
)
diff --git a/src/components/BlogPost/index.tsx b/src/components/BlogPost/index.tsx
index 5c22cda2fc..6793594ad0 100644
--- a/src/components/BlogPost/index.tsx
+++ b/src/components/BlogPost/index.tsx
@@ -9,6 +9,7 @@ interface Props {
guestBio: string
rawMarkdownBody: string
isPermalink: boolean
+ pageContext: any
}
const BlogPost = ({
@@ -19,6 +20,7 @@ const BlogPost = ({
guestBio,
rawMarkdownBody,
isPermalink,
+ pageContext
}: Props) => (
{isPermalink ? title : {title} }
@@ -29,7 +31,7 @@ const BlogPost = ({
{guestBio && (
{`This guest article contributed by ${byline}, ${guestBio}.`}
)}
-
{rawMarkdownBody}
+
{rawMarkdownBody}
)
diff --git a/src/components/CodeLayout/index.tsx b/src/components/CodeLayout/index.tsx
index 3364e24bcc..a6ead78a0a 100644
--- a/src/components/CodeLayout/index.tsx
+++ b/src/components/CodeLayout/index.tsx
@@ -1,12 +1,12 @@
import React from 'react'
import Marked from "../Marked";
-export default ({ title, rawMarkdownBody }: any) => (
+export default ({ title, rawMarkdownBody, pageContext }: any) => (
{title}
- {rawMarkdownBody}
+ {rawMarkdownBody}
diff --git a/src/components/DocsLayout/index.tsx b/src/components/DocsLayout/index.tsx
index bc057a8a1b..f0d6e9b321 100644
--- a/src/components/DocsLayout/index.tsx
+++ b/src/components/DocsLayout/index.tsx
@@ -9,15 +9,16 @@ interface Props {
permalink: string
sideBarData: any
rawMarkdownBody: string
+ pageContext: any
}
-const index = ({ title, nextDoc, sideBarData, rawMarkdownBody }: Props) => {
+const index = ({ title, nextDoc, sideBarData, rawMarkdownBody, pageContext }: Props) => {
return (
{title}
-
{rawMarkdownBody}
+
{rawMarkdownBody}
{nextDoc?.frontmatter?.permalink && (
diff --git a/src/components/Marked/index.tsx b/src/components/Marked/index.tsx
index 7c43477620..05d49e3fbf 100644
--- a/src/components/Marked/index.tsx
+++ b/src/components/Marked/index.tsx
@@ -14,7 +14,7 @@ import MiniGraphiQL from "./MiniGraphiQL"
import { StarWarsSchema } from "./swapiSchema"
import { UsersSchema } from './usersSchema';
-export default function Marked(props) {
+export default function Marked(props: { pageContext: any; children: any; }) {
return {marked(props.children, props)}
}
@@ -759,7 +759,8 @@ function Parser(options) {
this.tokens = []
this.token = null
this.options = options || marked.defaults
- this.usedSlugs = {}
+ this.options.pageContext.usedSlugs = this.options.pageContext.usedSlugs || {}
+ this.usedSlugs = this.options.pageContext.usedSlugs
}
/**
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 4e182ea072..7114e15b4b 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -87,7 +87,7 @@ export function buildLibraryCategoriesMarkdown(
let markdown = ""
if (libraryCategoryName in libraryCategories) {
markdown += `### ${libraryCategoryName}\n`
- const libraries = libraryCategories[libraryCategoryName]
+ const libraries = libraryCategories[libraryCategoryName as any]
markdown += buildLibraryListMarkdown(libraries)
markdown += "\n"
}
@@ -112,10 +112,10 @@ export function buildLanguagesContent(pageContext: any) {
"Tools"
)
}
- return {markdown}
+ return {markdown}
}
-export default ({ pageContext }) => {
+export default ({ pageContext }: any) => {
return (
@@ -155,7 +155,7 @@ export default ({ pageContext }) => {
-
{`
+ {`
## Languages
`}
@@ -167,19 +167,19 @@ export default ({ pageContext }) => {
{buildLanguagesMenu(pageContext)}
{buildLanguagesContent(pageContext)}
-
+
{`
## Tools
${buildLibraryListMarkdown(pageContext.codeData.Tools)}
`}
-
+
{`
## Services
${buildLibraryListMarkdown(pageContext.codeData.Services)}
`}
-
+
{`
## More Stuff
${buildLibraryListMarkdown(pageContext.codeData["More Stuff"])}
From 9b2aa58a3151a4bf67723db7481572db68d96758 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 4 Nov 2020 17:51:52 +0300
Subject: [PATCH 09/27] Give a custom slug for generic tools section
---
src/pages/code.tsx | 11 ++++++++---
src/templates/doc.tsx | 1 +
2 files changed, 9 insertions(+), 3 deletions(-)
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 7114e15b4b..2ed0ac8225 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -140,7 +140,7 @@ export default ({ pageContext }: any) => {
@@ -165,11 +165,16 @@ export default ({ pageContext }: any) => {
{buildLanguagesMenu(pageContext)}
-
{buildLanguagesContent(pageContext)}
+
+
+ Tools
+
+ #
+
+
{`
-## Tools
${buildLibraryListMarkdown(pageContext.codeData.Tools)}
`}
diff --git a/src/templates/doc.tsx b/src/templates/doc.tsx
index e877216ccc..d179668dfa 100644
--- a/src/templates/doc.tsx
+++ b/src/templates/doc.tsx
@@ -39,6 +39,7 @@ const Blog = ({ data, pageContext }: Props) => {
rawMarkdownBody={rawMarkdownBody}
nextDoc={nextDoc}
sideBarData={pageContext.sideBarData}
+ pageContext={pageContext}
/>
)
From d0af7cff37add2829f8296150f6d5912ea582c34 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 4 Nov 2020 18:06:48 +0300
Subject: [PATCH 10/27] Fix blogs page
---
src/components/Marked/index.tsx | 3 +--
src/pages/blog.tsx | 3 ++-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/components/Marked/index.tsx b/src/components/Marked/index.tsx
index 05d49e3fbf..f0a9e6becf 100644
--- a/src/components/Marked/index.tsx
+++ b/src/components/Marked/index.tsx
@@ -759,8 +759,7 @@ function Parser(options) {
this.tokens = []
this.token = null
this.options = options || marked.defaults
- this.options.pageContext.usedSlugs = this.options.pageContext.usedSlugs || {}
- this.usedSlugs = this.options.pageContext.usedSlugs
+ this.usedSlugs = {}
}
/**
diff --git a/src/pages/blog.tsx b/src/pages/blog.tsx
index 65b349e946..ffed462814 100644
--- a/src/pages/blog.tsx
+++ b/src/pages/blog.tsx
@@ -4,7 +4,7 @@ import BlogPost from "../components/BlogPost"
import BlogSidebar from "../components/BlogSidebar"
import { graphql } from "gatsby"
-export default ({ pageContext, data }) => {
+export default ({ pageContext, data }: any) => {
const posts = data.allMarkdownRemark.edges
.map((e: any) => e.node)
.sort((a: any, b: any) => {
@@ -39,6 +39,7 @@ export default ({ pageContext, data }) => {
guestBio={guestBio}
rawMarkdownBody={rawMarkdownBody}
isPermalink={false}
+ pageContext={pageContext}
/>
)
)}
From 0a7d6fb9acd5dfcfd216c0db56d2e09c88331bb9 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 4 Nov 2020 18:57:27 +0300
Subject: [PATCH 11/27] Add codegen back to JS tools
---
data/code.json | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/data/code.json b/data/code.json
index 50c9dc6647..b083c8d2af 100644
--- a/data/code.json
+++ b/data/code.json
@@ -389,6 +389,13 @@
"npm": "graphql-language-service",
"github": "graphql/graphql-language-service"
},
+ {
+ "name": "GraphQL Code Generator",
+ "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
+ "url": "https://graphql-code-generator.com",
+ "npm": "@graphql-codegen/cli",
+ "github": "dotansimha/graphql-code-generator"
+ },
{
"name": "GraphQL-ESLint",
"description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
From eaf5ec8149b341aafb579444adc3529a8105d49c Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 9 Nov 2020 12:35:22 +0300
Subject: [PATCH 12/27] Fix github links
---
data/code.json | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/data/code.json b/data/code.json
index b083c8d2af..85acee9304 100644
--- a/data/code.json
+++ b/data/code.json
@@ -96,7 +96,7 @@
{
"name": "graphqld",
"description": "A GraphQL implementaiton for the D Programming Language.",
- "github": "https://github.com/burner/graphqld",
+ "github": "burner/graphqld",
"url": "https://github.com/burner/graphqld"
}
]
@@ -106,13 +106,13 @@
{
"name": "Neuron",
"description": "A GraphQL client for Elixir",
- "github": "https://github.com/uesteibar/neuron",
+ "github": "uesteibar/neuron",
"url": "https://github.com/uesteibar/neuron"
},
{
"name": "common_graphql_client",
"description": "Elixir GraphQL Client with HTTP and WebSocket support",
- "github": "https://github.com/annkissam/common_graphql_client",
+ "github": "annkissam/common_graphql_client",
"url": "https://github.com/annkissam/common_graphql_client"
}
],
@@ -238,7 +238,7 @@
"description": "A Haskell library for building GraphQL APIs.",
"howto": "\nHello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.\n",
"url": "https://github.com/morpheusgraphql/morpheus-graphql",
- "github": "https://github.com/morpheusgraphql/morpheus-graphql"
+ "github": "morpheusgraphql/morpheus-graphql"
}
],
"GraphQL Clients": [
@@ -246,7 +246,7 @@
"name": "morpheus-graphql-client",
"description": "A strongly-typed GraphQL client implementation in Haksell.",
"url": "https://github.com/morpheusgraphql/morpheus-graphql",
- "github": "https://github.com/morpheusgraphql/morpheus-graphql"
+ "github": "morpheusgraphql/morpheus-graphql"
}
]
},
@@ -554,13 +554,13 @@
{
"name": "GraphQL API for WordPress",
"description": "A GraphQL server for WordPress",
- "github": "https://github.com/GraphQLAPI/graphql-api-for-wp",
+ "github": "GraphQLAPI/graphql-api-for-wp",
"url": "https://github.com/GraphQLAPI/graphql-api-for-wp"
},
{
"name": "GraPHPinator",
"description": "A GraphQL implementation for modern PHP",
- "github": "https://github.com/infinityloop-dev/graphpinator",
+ "github": "infinityloop-dev/graphpinator",
"url": "https://github.com/infinityloop-dev/graphpinator"
}
]
From ef0191fee8b6df96288934b8c059232df6cf2f79 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 11 Nov 2020 01:46:58 +0300
Subject: [PATCH 13/27] Enhance algorithm
---
data/code.json | 7 ++++
scripts/sort-libraries.js | 68 +++++++++++++++------------------------
2 files changed, 33 insertions(+), 42 deletions(-)
diff --git a/data/code.json b/data/code.json
index 85acee9304..61c7d1d03b 100644
--- a/data/code.json
+++ b/data/code.json
@@ -452,6 +452,13 @@
"npm": "graphql-scalars",
"github": "Urigo/graphql-scalars"
},
+ {
+ "name": "Postgraphile",
+ "description": "builds a powerful, extensible and performant GraphQL API from a PostgreSQL schema in seconds; saving you weeks if not months of development time.",
+ "url": "https://www.graphile.org/postgraphile",
+ "npm": "postgraphile",
+ "github": "graphile/postgraphile"
+ },
{
"name": "SOFA",
"description": "Generate REST API from your GraphQL API.",
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index 062e391793..e83fd576e8 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -4,10 +4,10 @@ const getGitHubStats = async githubRepo => {
const [owner, repoName] = githubRepo.split("/")
const accessToken = process.env.GITHUB_ACCESS_TOKEN
if (!accessToken) {
- throw new Error(`You must have GITHUB_ACCESS_TOKEN env variable defined!`)
+ return {};
}
const query = /* GraphQL */ `
- fragment defaultBranchRef on Ref {
+ fragment defaultBranchRefFragment on Ref {
target {
... on Commit {
history(since: $since) {
@@ -26,17 +26,8 @@ const getGitHubStats = async githubRepo => {
query($owner: String!, $repoName: String!, $since: GitTimestamp!) {
repositoryOwner(login: $owner) {
repository(name: $repoName) {
- mainRef: ref(qualifiedName: "main") {
- ...defaultBranchRef
- }
- sourceRef: ref(qualifiedName: "source") {
- ...defaultBranchRef
- }
- masterRef: ref(qualifiedName: "master") {
- ...defaultBranchRef
- }
- developRef: ref(qualifiedName: "develop") {
- ...defaultBranchRef
+ defaultBranchRef {
+ ...defaultBranchRefFragment
}
stargazers {
totalCount
@@ -52,7 +43,7 @@ const getGitHubStats = async githubRepo => {
}
`
const lastMonth = new Date()
- lastMonth.setMonth(lastMonth.getMonth() - 1)
+ lastMonth.setMonth(lastMonth.getMonth() - 3)
const response = await fetch("https://api.github.com/graphql", {
method: "POST",
body: JSON.stringify({
@@ -77,23 +68,15 @@ const getGitHubStats = async githubRepo => {
throw `No GitHub repo found ${owner}/${repoName}`
}
const stars = repo.stargazers.totalCount
- const actualDefaultBranch =
- repo.mainRef || repo.sourceRef || repo.developRef || repo.masterRef
- if (!actualDefaultBranch) {
- throw `No default branch found for ${owner}/${repoName}`
- }
- const commitHistory = actualDefaultBranch.target.history.edges
- let commitCount = 0,
- daysWithCommitSet = new Set()
+ const commitHistory = repo.defaultBranchRef.target.history.edges
+ let hasCommitsInLast3Months = false;
commitHistory.forEach(commit => {
if (!commit.node.author.name.match(/bot/i)) {
- commitCount++
- daysWithCommitSet.add(new Date(commit.node.pushedDate).getDate())
+ hasCommitsInLast3Months = true;
}
})
return {
- commitCount,
- daysWithCommit: daysWithCommitSet.size,
+ hasCommitsInLast3Months,
stars,
}
}
@@ -120,11 +103,15 @@ const getGemStats = async packageName => {
const sortLibs = async libs => {
if (libs.length === 1) {
- return libs;
+ return libs
}
const libsWithScores = await Promise.all(
libs.map(async lib => {
- const [npmStats = {}, gemStars = {}, githubStats = {}] = await Promise.all([
+ const [
+ npmStats = {},
+ gemStars = {},
+ githubStats = {},
+ ] = await Promise.all([
lib.npm && getNpmStats(lib.npm),
lib.gem && getGemStats(lib.gem),
lib.github && getGitHubStats(lib.github),
@@ -132,6 +119,7 @@ const sortLibs = async libs => {
return {
...lib,
...npmStats,
+ ...gemStars,
...githubStats,
}
})
@@ -139,28 +127,24 @@ const sortLibs = async libs => {
return libsWithScores.sort((a, b) => {
let aScore = 0,
bScore = 0
- if (a.npm && b.npm) {
+ if ("downloadCount" in a && 'downloadCount' in b) {
if (a.downloadCount > b.downloadCount) {
aScore += 40
} else if (b.downloadCount > a.downloadCount) {
bScore += 40
}
}
- if (a.github && b.github) {
- if (a.daysWithCommit > b.daysWithCommit) {
- aScore += 20
- } else if (a.daysWithCommit < b.daysWithCommit) {
- bScore += 20
- }
- if (a.commitCount > b.commitCount) {
- aScore += 20
- } else if (a.commitCount < b.commitCount) {
- bScore += 20
- }
+ if ("hasCommitsInLast3Months" in a && a.hasCommitsInLast3Months) {
+ aScore += 30
+ }
+ if ("hasCommitsInLast3Months" in b && b.hasCommitsInLast3Months) {
+ bScore += 30
+ }
+ if ('stars' in a && 'stars' in b) {
if (a.stars > b.stars) {
- aScore += 30
+ aScore += 40
} else if (a.stars < b.stars) {
- bScore += 30
+ bScore += 40
}
}
if (bScore > aScore) {
From 54869560d7448e742c58ee8876e548b0c8b31b8f Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 11 Nov 2020 02:14:36 +0300
Subject: [PATCH 14/27] Design improvements
---
src/assets/css/_css/code.less | 38 +++++++++++++++++++++++++++++++++++
src/pages/code.tsx | 30 ++++++++++-----------------
2 files changed, 49 insertions(+), 19 deletions(-)
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index 139da22628..45cace93fa 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -54,8 +54,46 @@
}
.intro-note {
margin-top: 20px;
+ display: flex;
+ strong {
+ width: 50%;
+ margin-right: 5%;
+ font-size: 24px;
+ line-height: 36px;
+ }
+ .goto-section {
+ display: flex;
+ flex-direction: row;
+ width: 40%;
+ p {
+ width: 20%;
+ margin: 0;
+ color: #8C8C8C;
+ font-weight: bold;
+ }
+ .sections {
+ display: flex;
+ width: 80%;
+ flex-direction: column;
+ a {
+ h3 {
+ margin: 0 0 14px 0;
+ border-left: 1px solid #B7B7B7;
+ font-weight: bold;
+ padding-left: 15px;
+ }
+ }
+ }
+ }
}
.inner-content {
max-width: 100%;
}
+ .language-box {
+ border: 1px inset #979797;
+ .article_title {
+ text-align: left;
+ font-size: 24px;
+ }
+ }
}
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 2ed0ac8225..faaa388c2e 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -23,7 +23,7 @@ export function buildLanguagesMenu(pageContext: any) {
const slug = toSlug(languageName)
return (
-
+
{
to help you get started working which support GraphQL in all
sorts of languages.
{" "}
-
-
-
+
-
{`
-## Languages
-`}
-
- This page will help you get started with GraphQL in languages
- you are already using.
-
+
{`
+## Language Support
+`}
+
+ This page will help you get started with GraphQL in languages you
+ are already using.
+
{buildLanguagesMenu(pageContext)}
{buildLanguagesContent(pageContext)}
From 59472bb866b7c3125574c1228df7eafbf1a65ac4 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Wed, 11 Nov 2020 02:18:59 +0300
Subject: [PATCH 15/27] Pixelperfect
---
src/assets/css/_css/code.less | 11 ++++++-----
src/pages/code.tsx | 3 +++
2 files changed, 9 insertions(+), 5 deletions(-)
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index 45cace93fa..ec13688f09 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -53,7 +53,7 @@
left: 0;
}
.intro-note {
- margin-top: 20px;
+ margin-top: 43px;
display: flex;
strong {
width: 50%;
@@ -77,10 +77,11 @@
flex-direction: column;
a {
h3 {
- margin: 0 0 14px 0;
- border-left: 1px solid #B7B7B7;
- font-weight: bold;
- padding-left: 15px;
+ margin: 0 0 15px 0;
+ border-left: 1px solid #B7B7B7;
+ font-weight: bold;
+ padding-left: 15px;
+ line-height: 28px;
}
}
}
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index faaa388c2e..fcb782456c 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -136,6 +136,9 @@ export default ({ pageContext }: any) => {
Go to
+
+ Languages
+
Tools
From 7b0b8e4e5d4ed08177b2128a6b6681d3bfcde9f7 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Thu, 12 Nov 2020 03:14:17 +0300
Subject: [PATCH 16/27] Fix language boxes
---
data/code.json | 64 +-
package.json | 4 +-
scripts/sort-libraries.js | 26 +-
src/assets/css/_css/code.less | 113 +++-
src/components/Marked/index.tsx | 2 +-
src/pages/code.tsx | 215 +++---
static/img/c-c.svg | 25 -
static/img/c-net.svg | 10 -
static/img/clojure.svg | 50 --
static/img/d.svg | 215 ------
static/img/elixir.svg | 1 -
static/img/elm.svg | 36 -
static/img/erlang.svg | 61 --
static/img/flutter.svg | 1 -
static/img/go.svg | 1 -
static/img/groovy.svg | 449 -------------
static/img/haskell.svg | 12 -
static/img/java-android.svg | 1 -
static/img/javascript.svg | 1 -
static/img/julia.svg | 1 -
static/img/kotlin.svg | 34 -
static/img/ocaml-reason.svg | 116 ----
static/img/perl.svg | 23 -
static/img/php.svg | 96 ---
static/img/python.svg | 113 ----
static/img/r.svg | 14 -
static/img/ruby.svg | 947 ---------------------------
static/img/rust.svg | 19 -
static/img/scala.svg | 20 -
static/img/swift-objective-c-ios.svg | 10 -
yarn.lock | 17 +
31 files changed, 314 insertions(+), 2383 deletions(-)
delete mode 100644 static/img/c-c.svg
delete mode 100644 static/img/c-net.svg
delete mode 100644 static/img/clojure.svg
delete mode 100644 static/img/d.svg
delete mode 100644 static/img/elixir.svg
delete mode 100644 static/img/elm.svg
delete mode 100644 static/img/erlang.svg
delete mode 100644 static/img/flutter.svg
delete mode 100644 static/img/go.svg
delete mode 100644 static/img/groovy.svg
delete mode 100644 static/img/haskell.svg
delete mode 100644 static/img/java-android.svg
delete mode 100644 static/img/javascript.svg
delete mode 100644 static/img/julia.svg
delete mode 100644 static/img/kotlin.svg
delete mode 100644 static/img/ocaml-reason.svg
delete mode 100644 static/img/perl.svg
delete mode 100644 static/img/php.svg
delete mode 100644 static/img/python.svg
delete mode 100644 static/img/r.svg
delete mode 100644 static/img/ruby.svg
delete mode 100644 static/img/rust.svg
delete mode 100644 static/img/scala.svg
delete mode 100644 static/img/swift-objective-c-ios.svg
diff --git a/data/code.json b/data/code.json
index 61c7d1d03b..c108fb6d1c 100644
--- a/data/code.json
+++ b/data/code.json
@@ -11,7 +11,7 @@
]
},
"C# / .NET": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-dotnet",
"description": "GraphQL for .NET",
@@ -38,7 +38,7 @@
"github": "ChilliCream/hotchocolate"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "GraphQL.Client",
"description": "A GraphQL Client for .NET.",
@@ -60,7 +60,7 @@
]
},
"Clojure": {
- "Server Libraries": [
+ "Server": [
{
"name": "alumbra",
"description": "A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).",
@@ -82,7 +82,7 @@
"url": "https://github.com/walmartlabs/lacinia"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "regraph",
"description": "A GraphQL client implemented in Clojurescript with support for websockets.",
@@ -92,7 +92,7 @@
]
},
"D": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphqld",
"description": "A GraphQL implementaiton for the D Programming Language.",
@@ -102,7 +102,7 @@
]
},
"Elixir": {
- "GraphQL Clients": [
+ "Client": [
{
"name": "Neuron",
"description": "A GraphQL client for Elixir",
@@ -116,7 +116,7 @@
"url": "https://github.com/annkissam/common_graphql_client"
}
],
- "Server Libraries": [
+ "Server": [
{
"name": "absinthe",
"description": "GraphQL implementation for Elixir.",
@@ -132,7 +132,7 @@
]
},
"Elm": {
- "GraphQL Clients": [
+ "Client": [
{
"name": "dillonkearns/elm-graphql",
"description": "Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.",
@@ -142,7 +142,7 @@
]
},
"Erlang": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-erlang",
"description": "GraphQL implementation in Erlang.",
@@ -152,7 +152,7 @@
]
},
"Flutter": {
- "GraphQL Clients": [
+ "Client": [
{
"name": "graphql",
"description": "A GraphQL client implementation in Flutter.",
@@ -162,7 +162,7 @@
]
},
"Go": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-go",
"description": "An implementation of GraphQL for Go / Golang.",
@@ -206,7 +206,7 @@
"github": "appointy/jaal"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "graphql",
"description": "A GraphQL client implementation in Go.",
@@ -216,7 +216,7 @@
]
},
"Groovy": {
- "Server Libraries": [
+ "Server": [
{
"name": "gorm-graphql",
"howto": "**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of \"data fetchers\" to query, update, and delete data through executions of the schema.\n\n**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:\n\n- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.\n\n- Generates the schema at startup with spring bean configuration to make it easy to extend.\n\n- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.\n\n- Overrides the default data binder to use the data binding provided by Grails\n- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier\n\nSee [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.",
@@ -232,7 +232,7 @@
]
},
"Haskell": {
- "Server Libraries": [
+ "Server": [
{
"name": "Morpheus GraphQL",
"description": "A Haskell library for building GraphQL APIs.",
@@ -241,7 +241,7 @@
"github": "morpheusgraphql/morpheus-graphql"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "morpheus-graphql-client",
"description": "A strongly-typed GraphQL client implementation in Haksell.",
@@ -251,7 +251,7 @@
]
},
"Java / Android": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-java",
"description": "A Java library for building GraphQL APIs.",
@@ -260,7 +260,7 @@
"url": "https://github.com/graphql-java/graphql-java"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "Apollo Android",
"description": "A strongly-typed, caching GraphQL client for Android, written in Java.",
@@ -276,7 +276,7 @@
]
},
"JavaScript": {
- "Server Libraries": [
+ "Server": [
{
"name": "GraphQL.js",
"description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
@@ -302,7 +302,7 @@
"github": "apollographql/apollo-server"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "Relay",
"description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
@@ -469,7 +469,7 @@
]
},
"Julia": {
- "GraphQL Clients": [
+ "Client": [
{
"name": "Diana.jl",
"description": "A Julia GraphQL server implementation.",
@@ -479,7 +479,7 @@
]
},
"Kotlin": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-kotlin",
"description": "A set of libraries for running GraphQL server in Kotlin.",
@@ -489,7 +489,7 @@
]
},
"Perl": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-perl",
"description": "A Perl port of GraphQL reference implementation",
@@ -500,7 +500,7 @@
]
},
"PHP": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-php",
"description": "A PHP port of GraphQL reference implementation",
@@ -573,7 +573,7 @@
]
},
"Python": {
- "Server Libraries": [
+ "Server": [
{
"name": "Graphene",
"description": "A Python library for building GraphQL APIs.",
@@ -582,7 +582,7 @@
"github": "graphql-python/graphene"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "GQL",
"description": "A GraphQL client in Python.",
@@ -604,7 +604,7 @@
]
},
"R": {
- "Server Libraries": [
+ "Server": [
{
"name": "ghql",
"description": "General purpose GraphQL R client",
@@ -614,7 +614,7 @@
]
},
"Ruby": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-ruby",
"description": "A Ruby library for building GraphQL APIs.",
@@ -633,7 +633,7 @@
]
},
"Rust": {
- "Server Libraries": [
+ "Server": [
{
"name": "graphql-rust/juniper",
"description": "GraphQL server library for Rust",
@@ -643,7 +643,7 @@
]
},
"Scala": {
- "Server Libraries": [
+ "Server": [
{
"name": "Sangria",
"description": "A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).",
@@ -654,7 +654,7 @@
]
},
"OCaml / Reason": {
- "Server Libraries": [
+ "Server": [
{
"name": "ocaml-graphql-server",
"description": "GraphQL server library for OCaml and Reason",
@@ -664,7 +664,7 @@
]
},
"Swift / Objective-C iOS": {
- "Server Libraries": [
+ "Server": [
{
"name": "Graphiti",
"description": "Swift library for building GraphQL schemas/types fast, safely and easily.",
@@ -672,7 +672,7 @@
"github": "GraphQLSwift/Graphiti"
}
],
- "GraphQL Clients": [
+ "Client": [
{
"name": "Apollo iOS",
"description": "A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.",
diff --git a/package.json b/package.json
index 81fe1469a0..1aa252428f 100644
--- a/package.json
+++ b/package.json
@@ -26,11 +26,13 @@
"gatsby-transformer-remark": "2.9.0",
"graphql": "15.4.0",
"marked": "1.2.2",
+ "numbro": "2.3.2",
"prism-react-renderer": "1.1.1",
"prismjs": "1.22.0",
"react": "17.0.1",
"react-dom": "17.0.1",
- "react-helmet": "6.1.0"
+ "react-helmet": "6.1.0",
+ "timeago.js": "4.0.2"
},
"devDependencies": {
"@types/codemirror": "0.0.98",
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index e83fd576e8..d508764182 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -1,4 +1,6 @@
-const fetch = require(`node-fetch`)
+const fetch = require(`node-fetch`);
+const numbro = require("numbro");
+const timeago = require('timeago.js');
const getGitHubStats = async githubRepo => {
const [owner, repoName] = githubRepo.split("/")
@@ -38,6 +40,14 @@ const getGitHubStats = async githubRepo => {
totalCount
}
description
+ licenseInfo {
+ name
+ }
+ releases(last: 1) {
+ nodes {
+ publishedAt
+ }
+ }
}
}
}
@@ -56,6 +66,9 @@ const getGitHubStats = async githubRepo => {
},
})
const responseJson = await response.json()
+ if (responseJson && responseJson.errors) {
+ throw JSON.stringify(responseJson.errors);
+ }
if (!responseJson || !responseJson.data) {
throw `GitHub returned empty response for ${owner}/${repoName}`
}
@@ -75,9 +88,20 @@ const getGitHubStats = async githubRepo => {
hasCommitsInLast3Months = true;
}
})
+ const formattedStars = numbro(stars).format({
+ average: true,
+ });
+ let lastRelease;
+ if (repo.releases?.nodes?.length) {
+ lastRelease = repo.releases.nodes[0].publishedAt;
+ }
return {
hasCommitsInLast3Months,
stars,
+ formattedStars,
+ license: repo.licenseInfo?.name,
+ lastRelease,
+ formattedLastRelease: lastRelease && timeago.format(lastRelease),
}
}
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index ec13688f09..68decd20a3 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -59,7 +59,8 @@
width: 50%;
margin-right: 5%;
font-size: 24px;
- line-height: 36px;
+ font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ line-height: 32px;
}
.goto-section {
display: flex;
@@ -68,8 +69,10 @@
p {
width: 20%;
margin: 0;
- color: #8C8C8C;
+ color: #8c8c8c;
font-weight: bold;
+ font-size: 24px;
+ font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.sections {
display: flex;
@@ -77,11 +80,13 @@
flex-direction: column;
a {
h3 {
- margin: 0 0 15px 0;
- border-left: 1px solid #B7B7B7;
- font-weight: bold;
- padding-left: 15px;
- line-height: 28px;
+ margin: 0 0 22px 0;
+ border-left: 1px solid #b7b7b7;
+ font-weight: bold;
+ padding-left: 15px;
+ line-height: 28px;
+ font-size: 24px;
+ font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
}
}
@@ -90,11 +95,97 @@
.inner-content {
max-width: 100%;
}
- .language-box {
- border: 1px inset #979797;
- .article_title {
- text-align: left;
+ .languages-title {
+ font-size: 24px;
+ font-weight: bold;
+ margin-top: 94px;
+ font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ }
+ .language-boxes {
+ .language-box {
+ margin-right: 30px;
+ border: 1px solid #979797;
+ width: 120px;
+ height: 120px;
+ display: flex;
+ flex-direction: row;
+ align-items: flex-end;
+ .article_title {
+ text-align: left;
+ font-size: 24px;
+ color: #000;
+ font-weight: bold;
+ font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
+ margin: 0;
+ }
+ }
+ }
+ .language-header {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ margin-top: 65px;
+ margin-bottom: 45px;
+ .language-title {
+ margin: 0;
+ font-size: 48px;
+ font-weight: bold;
+ }
+ .language-categories-permalinks {
+ margin: 0;
font-size: 24px;
+ font-weight: bold;
+ color: #a6a6a6;
+ .language-category-permalink {
+ color: #a6a6a6;
+ }
+ }
+ }
+ .library-category-title {
+ margin-top: 57px;
+ font-size: 24px;
+ color: #a6a6a6;
+ font-weight: bold;
+ }
+ .library-info {
+ display: flex;
+ flex-direction: row;
+ justify-content: space-between;
+ margin-top: 36px;
+ .library-details {
+ width: 30%;
+ .library-name {
+ font-size: 24px;
+ font-weight: bold;
+ p {
+ margin: 0 0 20px 0;
+ }
+ }
+ .library-detail {
+ margin-top: 7px;
+ display: flex;
+ flex-direction: row;
+ b {
+ font-size: 14px;
+ min-width: 90px;
+ }
+ a,
+ span {
+ font-size: 16px;
+ color: #e10098;
+ font-weight: bold;
+ margin-left: 10px;
+ }
+ }
+ .library-description {
+ margin-top: 30px;
+ }
+ }
+ .library-howto {
+ width: 60%;
+ max-height: 550px;
+ overflow-y: auto;
+ overflow-x: hidden;
}
}
}
diff --git a/src/components/Marked/index.tsx b/src/components/Marked/index.tsx
index f0a9e6becf..3e3d88455b 100644
--- a/src/components/Marked/index.tsx
+++ b/src/components/Marked/index.tsx
@@ -15,7 +15,7 @@ import { StarWarsSchema } from "./swapiSchema"
import { UsersSchema } from './usersSchema';
export default function Marked(props: { pageContext: any; children: any; }) {
- return {marked(props.children, props)}
+ return {props.children && marked(props.children, props)}
}
/**
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index fcb782456c..cbc3708abe 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -7,7 +7,7 @@ export function buildLanguagesMenu(pageContext: any) {
let lastRow: string[]
const rows: string[][] = []
Object.keys(pageContext.codeData.Libraries).forEach((languageName, index) => {
- if (index % 4 === 0) {
+ if (index % 7 === 0) {
lastRow = [languageName]
rows.push(lastRow)
} else {
@@ -15,25 +15,17 @@ export function buildLanguagesMenu(pageContext: any) {
}
})
return (
-
+
{rows.map(row => (
<>
-
+
{row.map(languageName => {
const slug = toSlug(languageName)
return (
-
-
+
)
})}
@@ -45,74 +37,141 @@ export function buildLanguagesMenu(pageContext: any) {
)
}
-export function buildLibraryListMarkdown(libraries: any[]) {
- let markdown = ""
- for (const library of libraries) {
- if ("howto" in library) {
- markdown += `#### [${library.name}](${library.url}) `
- } else {
- markdown += ` - [${library.name}](${library.url}) `
- }
- if ("github" in library) {
- markdown += `([github](https://github.com/${library.github})) `
- }
- if ("npm" in library) {
- markdown += `([npm](https://www.npmjs.com/package/${library.npm})) `
- }
- if ("gem" in library) {
- markdown += `([gem](https://rubygems.org/gems/${library.gem})) `
- }
- if ("howto" in library) {
- if (library.description) {
- markdown += "\n"
- markdown += library.description || ""
- markdown += "\n"
- }
- markdown += "\n"
- markdown += library.howto
- markdown += "\n"
- } else if (library.description) {
- markdown += ": "
- markdown += library.description || ""
- }
- markdown += "\n\n"
- }
- return markdown
+export function buildLibraryList(libraries: any[], pageContext: any) {
+ return (
+
+ {libraries.map(library => (
+
+
+
+ {library.name}
+
+ {library.github && (
+
+ )}
+ {library.npm && (
+
+ )}
+ {library.gem && (
+
+ )}
+ {library.lastRelease && (
+
+ Last Release
+ {library.formattedLastRelease}
+
+ )}
+ {library.stars && (
+
+ Stars
+ {library.formattedStars}
+
+ )}
+ {library.license && (
+
+ License
+ {library.license}
+
+ )}
+ {library.howto && (
+
+ {library.description}
+
+ )}
+
+
+
+ {library.howto || library.description}
+
+
+
+ ))}
+
+ )
}
-export function buildLibraryCategoriesMarkdown(
+export function buildLibraryCategoryContent(
libraryCategories: any[],
- libraryCategoryName: string
+ libraryCategoryName: string,
+ slug: string,
+ pageContext: any
) {
- let markdown = ""
if (libraryCategoryName in libraryCategories) {
- markdown += `### ${libraryCategoryName}\n`
const libraries = libraryCategories[libraryCategoryName as any]
- markdown += buildLibraryListMarkdown(libraries)
- markdown += "\n"
+ return (
+
+
{libraryCategoryName}
+ {buildLibraryList(libraries, pageContext)}
+
+ )
}
- return markdown
+ return
}
+const categorySlugMap = [
+ ["Server", toSlug("Server")],
+ ["Client", toSlug("Client")],
+ ["Tools", toSlug("Tools")],
+]
+
export function buildLanguagesContent(pageContext: any) {
- let markdown = ""
+ const elements = []
for (const languageName in pageContext.codeData.Libraries) {
const libraryCategories = pageContext.codeData.Libraries[languageName]
- markdown += `## ${languageName}\n`
- markdown += buildLibraryCategoriesMarkdown(
- libraryCategories,
- 'Server Libraries'
- )
- markdown += buildLibraryCategoriesMarkdown(
- libraryCategories,
- "GraphQL Clients"
- )
- markdown += buildLibraryCategoriesMarkdown(
- libraryCategories,
- "Tools"
+ const filteredCategorySlugMap = categorySlugMap.filter(
+ ([libraryCategoryName]) =>
+ libraryCategories[libraryCategoryName as any]?.length
+ );
+ const languageSlug = toSlug(languageName);
+ elements.push(
+
+
+
{languageName}
+ {filteredCategorySlugMap.length > 1 &&
+ {filteredCategorySlugMap.map(
+ ([libraryCategoryName, categorySlug], i) => (
+ <>
+
+ {libraryCategoryName}
+
+ {i < filteredCategorySlugMap.length - 1 && " / "}
+ >
+ )
+ )}
+
}
+
+
+ {filteredCategorySlugMap.map(([categoryName, categorySlug]) =>
+ buildLibraryCategoryContent(
+ libraryCategories,
+ categoryName,
+ `${languageSlug}-${categorySlug}`,
+ pageContext
+ )
+ )}
+
+
)
}
- return
{markdown}
+ return
{elements}
}
export default ({ pageContext }: any) => {
@@ -132,12 +191,12 @@ export default ({ pageContext }: any) => {
Because GraphQL is a communication pattern, there are many tools
to help you get started working which support GraphQL in all
sorts of languages.
- {" "}
+
-
{`
-## Language Support
-`}
-
- This page will help you get started with GraphQL in languages you
- are already using.
-
+
Language Support
{buildLanguagesMenu(pageContext)}
{buildLanguagesContent(pageContext)}
@@ -168,7 +221,7 @@ export default ({ pageContext }: any) => {
#
-
+{/*
{`
${buildLibraryListMarkdown(pageContext.codeData.Tools)}
`}
@@ -184,7 +237,7 @@ ${buildLibraryListMarkdown(pageContext.codeData.Services)}
## More Stuff
${buildLibraryListMarkdown(pageContext.codeData["More Stuff"])}
`}
-
+ */}
diff --git a/static/img/c-c.svg b/static/img/c-c.svg
deleted file mode 100644
index 5e117077e1..0000000000
--- a/static/img/c-c.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/c-net.svg b/static/img/c-net.svg
deleted file mode 100644
index 56f39374dd..0000000000
--- a/static/img/c-net.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/clojure.svg b/static/img/clojure.svg
deleted file mode 100644
index 5ab8126b90..0000000000
--- a/static/img/clojure.svg
+++ /dev/null
@@ -1,50 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/static/img/d.svg b/static/img/d.svg
deleted file mode 100644
index 3ba85274c6..0000000000
--- a/static/img/d.svg
+++ /dev/null
@@ -1,215 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/elixir.svg b/static/img/elixir.svg
deleted file mode 100644
index 797b0114e8..0000000000
--- a/static/img/elixir.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/static/img/elm.svg b/static/img/elm.svg
deleted file mode 100644
index ef7f61a9b6..0000000000
--- a/static/img/elm.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/erlang.svg b/static/img/erlang.svg
deleted file mode 100644
index e8f2bc5dd3..0000000000
--- a/static/img/erlang.svg
+++ /dev/null
@@ -1,61 +0,0 @@
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/flutter.svg b/static/img/flutter.svg
deleted file mode 100644
index 617a4d4e48..0000000000
--- a/static/img/flutter.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/static/img/go.svg b/static/img/go.svg
deleted file mode 100644
index ea3c66fca6..0000000000
--- a/static/img/go.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/static/img/groovy.svg b/static/img/groovy.svg
deleted file mode 100644
index e4e37042b2..0000000000
--- a/static/img/groovy.svg
+++ /dev/null
@@ -1,449 +0,0 @@
-
-
image/svg+xml
-
\ No newline at end of file
diff --git a/static/img/haskell.svg b/static/img/haskell.svg
deleted file mode 100644
index 8c8a97a6a3..0000000000
--- a/static/img/haskell.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/java-android.svg b/static/img/java-android.svg
deleted file mode 100644
index b39f039ca4..0000000000
--- a/static/img/java-android.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/static/img/javascript.svg b/static/img/javascript.svg
deleted file mode 100644
index 310150e016..0000000000
--- a/static/img/javascript.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/static/img/julia.svg b/static/img/julia.svg
deleted file mode 100644
index 2abc433fbf..0000000000
--- a/static/img/julia.svg
+++ /dev/null
@@ -1 +0,0 @@
-
Asset 2
diff --git a/static/img/kotlin.svg b/static/img/kotlin.svg
deleted file mode 100644
index 3480717db7..0000000000
--- a/static/img/kotlin.svg
+++ /dev/null
@@ -1,34 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/ocaml-reason.svg b/static/img/ocaml-reason.svg
deleted file mode 100644
index 6b1fe9aca6..0000000000
--- a/static/img/ocaml-reason.svg
+++ /dev/null
@@ -1,116 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/static/img/perl.svg b/static/img/perl.svg
deleted file mode 100644
index 3b41afb6bc..0000000000
--- a/static/img/perl.svg
+++ /dev/null
@@ -1,23 +0,0 @@
-
-
-
- code
- Created with Sketch.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- $_
-
-
-
diff --git a/static/img/php.svg b/static/img/php.svg
deleted file mode 100644
index 72e0774892..0000000000
--- a/static/img/php.svg
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
- Official PHP Logo
-
-
-
- image/svg+xml
-
- Official PHP Logo
-
-
- Colin Viebrock
-
-
-
-
-
-
-
-
-
-
-
- Copyright Colin Viebrock 1997 - All rights reserved.
-
-
- 1997
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/python.svg b/static/img/python.svg
deleted file mode 100644
index 366f52f339..0000000000
--- a/static/img/python.svg
+++ /dev/null
@@ -1,113 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/r.svg b/static/img/r.svg
deleted file mode 100644
index 389b03c113..0000000000
--- a/static/img/r.svg
+++ /dev/null
@@ -1,14 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/ruby.svg b/static/img/ruby.svg
deleted file mode 100644
index e7d431ed60..0000000000
--- a/static/img/ruby.svg
+++ /dev/null
@@ -1,947 +0,0 @@
-
-
image/svg+xml
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/static/img/rust.svg b/static/img/rust.svg
deleted file mode 100644
index 81131b74ee..0000000000
--- a/static/img/rust.svg
+++ /dev/null
@@ -1,19 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/static/img/scala.svg b/static/img/scala.svg
deleted file mode 100644
index 91acfd11b8..0000000000
--- a/static/img/scala.svg
+++ /dev/null
@@ -1,20 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/static/img/swift-objective-c-ios.svg b/static/img/swift-objective-c-ios.svg
deleted file mode 100644
index 69df9cd20a..0000000000
--- a/static/img/swift-objective-c-ios.svg
+++ /dev/null
@@ -1,10 +0,0 @@
-
-
-
-
-
-
-
-
-
-
diff --git a/yarn.lock b/yarn.lock
index beb86c53ba..0f482107eb 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -2366,6 +2366,11 @@ big.js@^5.2.2:
resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328"
integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+bignumber.js@^8.1.1:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/bignumber.js/-/bignumber.js-8.1.1.tgz#4b072ae5aea9c20f6730e4e5d529df1271c4d885"
+ integrity sha512-QD46ppGintwPGuL1KqmwhR0O+N2cZUg8JG/VzwI2e28sM9TqHjQB10lI4QAaMHVbLzwVLLAwEglpKPViWX+5NQ==
+
binary-extensions@^1.0.0:
version "1.13.1"
resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz#598afe54755b2868a5330d2aff9d4ebb53209b65"
@@ -8322,6 +8327,13 @@ num2fraction@^1.2.2:
resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede"
integrity sha1-b2gragJ6Tp3fpFZM0lidHU5mnt4=
+numbro@2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/numbro/-/numbro-2.3.2.tgz#4967c631b0ea99b17dd7f88cdd1eaa4ace4d4971"
+ integrity sha512-GHRdsyYs6ugRP0mipuBKTybzTPKdlhzKh271PG3hPwL1fg2DKwK/I2nCsh0gW3FfIKBzWIFoBnousQfiAkOuwQ==
+ dependencies:
+ bignumber.js "^8.1.1"
+
object-assign@^4, object-assign@^4.0.1, object-assign@^4.1.0, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -11321,6 +11333,11 @@ thunky@^1.0.2:
resolved "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz#5abaf714a9405db0504732bbccd2cedd9ef9537d"
integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+timeago.js@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.yarnpkg.com/timeago.js/-/timeago.js-4.0.2.tgz#724e8c8833e3490676c7bb0a75f5daf20e558028"
+ integrity sha512-a7wPxPdVlQL7lqvitHGGRsofhdwtkoSXPGATFuSOA2i1ZNQEPLrGnj68vOp2sOJTCFAQVXPeNMX/GctBaO9L2w==
+
timed-out@^4.0.1:
version "4.0.1"
resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f"
From 92d31af5f19cb149997ffd75a3469325889f166e Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Thu, 12 Nov 2020 15:48:13 +0300
Subject: [PATCH 17/27] Sort languages and small fixes
---
data/code.json | 6 ++-
gatsby-node.js | 30 +++++++++++++--
scripts/sort-libraries.js | 11 +++---
src/assets/css/_css/code.less | 23 +++++++-----
src/pages/code.tsx | 69 +++++++++++++++++++++--------------
5 files changed, 91 insertions(+), 48 deletions(-)
diff --git a/data/code.json b/data/code.json
index c108fb6d1c..8db997e2a5 100644
--- a/data/code.json
+++ b/data/code.json
@@ -723,12 +723,14 @@
},
{
"name": "Prisma",
- "description": "([github](https://github.com/prisma)) A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
+ "description": "A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
+ "github": "https://github.com/prisma",
"url": "https://www.prisma.io"
},
{
"name": "Tipe",
- "description": "([github](https://github.com/tipeio)) A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
+ "description": "A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
+ "github": "https://github.com/tipeio",
"url": "https://tipe.io"
},
{
diff --git a/gatsby-node.js b/gatsby-node.js
index 9c635cf8ad..298f5c8946 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -11,24 +11,46 @@ exports.onCreatePage = async ({ page, actions }) => {
}
if (page.path === "/code" || page.path === "/code/") {
const codeData = JSON.parse(readFileSync("./data/code.json", "utf8"));
+ const languageList = [];
+ let sortedTools = [];
await Promise.all([
Promise.all(Object.keys(codeData.Libraries).map(async languageName => {
const libraryCategoryMap = codeData.Libraries[languageName];
+ let languageTotalStars = 0;
await Promise.all(
Object.keys(libraryCategoryMap).map(async libraryCategoryName => {
const libraries = libraryCategoryMap[libraryCategoryName]
- libraryCategoryMap[libraryCategoryName] = await sortLibs(libraries)
+ const { sortedLibs, totalStars } = await sortLibs(libraries)
+ libraryCategoryMap[libraryCategoryName] = sortedLibs;
+ languageTotalStars += totalStars || 0
})
)
+ languageList.push({
+ name: languageName,
+ totalStars: languageTotalStars,
+ categoryMap: libraryCategoryMap,
+ })
})),
- sortLibs(codeData.Tools).then(sortedTools => {
- codeData.Tools = sortedTools;
+ sortLibs(codeData.Tools).then(({ sortedLibs }) => {
+ sortedTools = sortedLibs
}),
])
context = {
...context,
- codeData,
+ otherLibraries: {
+ Services: codeData.Services,
+ Tools: sortedTools,
+ 'More Stuff': codeData['More Stuff']
+ },
+ languageList: languageList.sort((a, b) => {
+ if (a.totalStars > b.totalStars) {
+ return -1
+ } else if (a.totalStars < b.totalStars) {
+ return 1
+ }
+ return 0
+ }),
}
}
createPage({
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index d508764182..85a06b2368 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -126,9 +126,7 @@ const getGemStats = async packageName => {
}
const sortLibs = async libs => {
- if (libs.length === 1) {
- return libs
- }
+ let totalStars = 0;
const libsWithScores = await Promise.all(
libs.map(async lib => {
const [
@@ -140,15 +138,17 @@ const sortLibs = async libs => {
lib.gem && getGemStats(lib.gem),
lib.github && getGitHubStats(lib.github),
])
- return {
+ const result = {
...lib,
...npmStats,
...gemStars,
...githubStats,
}
+ totalStars += result.stars || 0;
+ return result;
})
)
- return libsWithScores.sort((a, b) => {
+ const sortedLibs = libsWithScores.sort((a, b) => {
let aScore = 0,
bScore = 0
if ("downloadCount" in a && 'downloadCount' in b) {
@@ -178,6 +178,7 @@ const sortLibs = async libs => {
}
return 0
})
+ return { sortedLibs, totalStars }
}
module.exports = sortLibs
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index 68decd20a3..a76ffd7b30 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -95,21 +95,23 @@
.inner-content {
max-width: 100%;
}
+ .language-content {
+ padding-top: 72px;
+ }
.languages-title {
font-size: 24px;
font-weight: bold;
- margin-top: 94px;
font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.language-boxes {
.language-box {
margin-right: 30px;
border: 1px solid #979797;
- width: 120px;
+ min-width: 142px;
height: 120px;
display: flex;
- flex-direction: row;
- align-items: flex-end;
+ flex-direction: row;
+ align-items: flex-end;
.article_title {
text-align: left;
font-size: 24px;
@@ -124,8 +126,6 @@
display: flex;
flex-direction: row;
justify-content: space-between;
- margin-top: 65px;
- margin-bottom: 45px;
.language-title {
margin: 0;
font-size: 48px;
@@ -141,8 +141,11 @@
}
}
}
+ .library-category {
+ padding-top: 50px;
+ }
.library-category-title {
- margin-top: 57px;
+ margin: 0;
font-size: 24px;
color: #a6a6a6;
font-weight: bold;
@@ -183,9 +186,9 @@
}
.library-howto {
width: 60%;
- max-height: 550px;
- overflow-y: auto;
- overflow-x: hidden;
+ // max-height: 550px;
+ // overflow-y: auto;
+ // overflow-x: hidden;
}
}
}
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index cbc3708abe..2096398267 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -6,8 +6,8 @@ import { toSlug } from "../utils/slug"
export function buildLanguagesMenu(pageContext: any) {
let lastRow: string[]
const rows: string[][] = []
- Object.keys(pageContext.codeData.Libraries).forEach((languageName, index) => {
- if (index % 7 === 0) {
+ pageContext.languageList.forEach(({ name: languageName }: any, index: number) => {
+ if (index % 6 === 0) {
lastRow = [languageName]
rows.push(lastRow)
} else {
@@ -43,13 +43,16 @@ export function buildLibraryList(libraries: any[], pageContext: any) {
{libraries.map(library => (
-
+
{library.name}
{library.github && (
@@ -57,7 +60,10 @@ export function buildLibraryList(libraries: any[], pageContext: any) {
{library.npm && (
@@ -65,7 +71,10 @@ export function buildLibraryList(libraries: any[], pageContext: any) {
{library.gem && (
@@ -88,10 +97,12 @@ export function buildLibraryList(libraries: any[], pageContext: any) {
{library.license}
)}
- {library.howto && (
+ {library.howto ? (
{library.description}
+ ) : (
+
)}
@@ -131,8 +142,9 @@ const categorySlugMap = [
export function buildLanguagesContent(pageContext: any) {
const elements = []
- for (const languageName in pageContext.codeData.Libraries) {
- const libraryCategories = pageContext.codeData.Libraries[languageName]
+ for (const languageObj of pageContext.languageList) {
+ const languageName = languageObj.name;
+ const libraryCategories = languageObj.categoryMap;
const filteredCategorySlugMap = categorySlugMap.filter(
([libraryCategoryName]) =>
libraryCategories[libraryCategoryName as any]?.length
@@ -215,29 +227,32 @@ export default ({ pageContext }: any) => {
{buildLanguagesMenu(pageContext)}
{buildLanguagesContent(pageContext)}
-
+
Tools
#
-{/*
- {`
-${buildLibraryListMarkdown(pageContext.codeData.Tools)}
-`}
-
-
- {`
-## Services
-${buildLibraryListMarkdown(pageContext.codeData.Services)}
-`}
-
-
- {`
-## More Stuff
-${buildLibraryListMarkdown(pageContext.codeData["More Stuff"])}
-`}
- */}
+ {buildLibraryList(pageContext.otherLibraries.Tools, pageContext)}
+
+
+ Services
+
+ #
+
+
+ {buildLibraryList(pageContext.otherLibraries.Services, pageContext)}
+
+
+ More Stuff
+
+ #
+
+
+ {buildLibraryList(
+ pageContext.otherLibraries["More Stuff"],
+ pageContext
+ )}
From fd826245029fa1c62f89b4e47d8d22f523c4774b Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Thu, 12 Nov 2020 15:54:53 +0300
Subject: [PATCH 18/27] Fix GitHub links
---
data/code.json | 8 +++++---
1 file changed, 5 insertions(+), 3 deletions(-)
diff --git a/data/code.json b/data/code.json
index 8db997e2a5..022dc14eaf 100644
--- a/data/code.json
+++ b/data/code.json
@@ -724,13 +724,13 @@
{
"name": "Prisma",
"description": "A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
- "github": "https://github.com/prisma",
+ "github": "prisma/prisma",
"url": "https://www.prisma.io"
},
{
"name": "Tipe",
"description": "A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
- "github": "https://github.com/tipeio",
+ "github": "tipeio/tipe",
"url": "https://tipe.io"
},
{
@@ -745,7 +745,8 @@
},
{
"name": "Hasura",
- "description": "([github](https://github.com/hasura)) Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.",
+ "description": "Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.",
+ "github": "hasura/graphql-engine",
"url": "https://hasura.io"
},
{
@@ -758,6 +759,7 @@
{
"name": "awesome-graphql",
"description": "A fantastic community maintained collection of libraries, resources, and more.",
+ "github": "chentsulin/awesome-graphql",
"url": "https://github.com/chentsulin/awesome-graphql"
}
]
From 55beff2c6d32f3490700a686ba89bc5bcee232c9 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Thu, 12 Nov 2020 16:10:11 +0300
Subject: [PATCH 19/27] Add AnchorLink for smooth scrolling
---
src/assets/css/_css/code.less | 1 +
src/pages/code.tsx | 102 +++++++++++++++++++---------------
2 files changed, 57 insertions(+), 46 deletions(-)
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index a76ffd7b30..f379fd005b 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -112,6 +112,7 @@
display: flex;
flex-direction: row;
align-items: flex-end;
+ color: #000;
.article_title {
text-align: left;
font-size: 24px;
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 2096398267..6f15a11fc1 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -1,3 +1,4 @@
+import { AnchorLink } from "gatsby-plugin-anchor-links"
import React from "react"
import Layout from "../components/Layout"
import Marked from "../components/Marked"
@@ -6,14 +7,16 @@ import { toSlug } from "../utils/slug"
export function buildLanguagesMenu(pageContext: any) {
let lastRow: string[]
const rows: string[][] = []
- pageContext.languageList.forEach(({ name: languageName }: any, index: number) => {
- if (index % 6 === 0) {
- lastRow = [languageName]
- rows.push(lastRow)
- } else {
- lastRow.push(languageName)
+ pageContext.languageList.forEach(
+ ({ name: languageName }: any, index: number) => {
+ if (index % 6 === 0) {
+ lastRow = [languageName]
+ rows.push(lastRow)
+ } else {
+ lastRow.push(languageName)
+ }
}
- })
+ )
return (
{rows.map(row => (
@@ -22,11 +25,13 @@ export function buildLanguagesMenu(pageContext: any) {
{row.map(languageName => {
const slug = toSlug(languageName)
return (
-
+
+ {languageName}
+
)
})}
@@ -143,32 +148,35 @@ const categorySlugMap = [
export function buildLanguagesContent(pageContext: any) {
const elements = []
for (const languageObj of pageContext.languageList) {
- const languageName = languageObj.name;
- const libraryCategories = languageObj.categoryMap;
+ const languageName = languageObj.name
+ const libraryCategories = languageObj.categoryMap
const filteredCategorySlugMap = categorySlugMap.filter(
([libraryCategoryName]) =>
libraryCategories[libraryCategoryName as any]?.length
- );
- const languageSlug = toSlug(languageName);
+ )
+ const languageSlug = toSlug(languageName)
elements.push(
{languageName}
- {filteredCategorySlugMap.length > 1 &&
- {filteredCategorySlugMap.map(
- ([libraryCategoryName, categorySlug], i) => (
- <>
-
- {libraryCategoryName}
-
- {i < filteredCategorySlugMap.length - 1 && " / "}
- >
- )
- )}
-
}
+ {filteredCategorySlugMap.length > 1 && (
+
+ {filteredCategorySlugMap.map(
+ ([libraryCategoryName, categorySlug], i) => (
+ <>
+
+ {libraryCategoryName}
+
+ {i < filteredCategorySlugMap.length - 1 && " / "}
+ >
+ )
+ )}
+
+ )}
{filteredCategorySlugMap.map(([categoryName, categorySlug]) =>
@@ -207,47 +215,49 @@ export default ({ pageContext }: any) => {
-
Language Support
+
+ Language Support
+
{buildLanguagesMenu(pageContext)}
{buildLanguagesContent(pageContext)}
{buildLibraryList(pageContext.otherLibraries.Tools, pageContext)}
Services
-
+
#
-
+
{buildLibraryList(pageContext.otherLibraries.Services, pageContext)}
More Stuff
-
+
#
-
+
{buildLibraryList(
pageContext.otherLibraries["More Stuff"],
From 5e839281b0850db2d915b3b0cd6e2e8826cbf3a4 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Thu, 12 Nov 2020 16:43:49 +0300
Subject: [PATCH 20/27] Do not use new JS syntax
---
scripts/sort-libraries.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index 85a06b2368..4d5f8df5ff 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -92,14 +92,14 @@ const getGitHubStats = async githubRepo => {
average: true,
});
let lastRelease;
- if (repo.releases?.nodes?.length) {
+ if (repo.releases && repo.releases.nodes && repo.releases.nodes.length) {
lastRelease = repo.releases.nodes[0].publishedAt;
}
return {
hasCommitsInLast3Months,
stars,
formattedStars,
- license: repo.licenseInfo?.name,
+ license: repo.licenseInfo && repo.licenseInfo.name,
lastRelease,
formattedLastRelease: lastRelease && timeago.format(lastRelease),
}
From 19b1f88808b1b8304f71ea730d2bb7eed86a707a Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 16 Nov 2020 10:09:10 +0300
Subject: [PATCH 21/27] Add more libs to Code page
---
data/code.json | 146 ++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 127 insertions(+), 19 deletions(-)
diff --git a/data/code.json b/data/code.json
index 022dc14eaf..f45cb802a9 100644
--- a/data/code.json
+++ b/data/code.json
@@ -15,7 +15,7 @@
{
"name": "graphql-dotnet",
"description": "GraphQL for .NET",
- "howto": "```csharp\nusing System;\nusing GraphQL;\nusing GraphQL.Types;\n\npublic class Program\n{\n public static void Main(string[] args)\n {\n var schema = Schema.For(@\"\n type Query {\n hello: String\n }\n \");\n\n var json = schema.Execute(_ =>\n {\n _.Query = \"{ hello }\";\n _.Root = new { Hello = \"Hello World!\" };\n });\n\n Console.WriteLine(json);\n }\n} \n```",
+ "howto": "```csharp\nusing System;\nusing System.Threading.Tasks;\nusing GraphQL;\nusing GraphQL.Types;\nusing GraphQL.SystemTextJson; // First add PackageReference to GraphQL.SystemTextJson\n\npublic class Program\n{\n public static async Task Main(string[] args)\n {\n var schema = Schema.For(@\"\n type Query {\n hello: String\n }\n \");\n\n var json = await schema.ExecuteAsync(_ =>\n {\n _.Query = \"{ hello }\";\n _.Root = new { Hello = \"Hello World!\" };\n });\n\n Console.WriteLine(json);\n }\n} \n```",
"url": "https://github.com/graphql-dotnet/graphql-dotnet",
"github": "graphql-dotnet/graphql-dotnet"
},
@@ -187,12 +187,6 @@
"url": "https://github.com/graphql-go/relay",
"github": "graphql-go/relay"
},
- {
- "name": "machinebox/graphql",
- "description": "An elegant low-level HTTP client for GraphQL.",
- "url": "https://github.com/machinebox/graphql",
- "github": "machinebox/graphql"
- },
{
"name": "samsarahq/thunder",
"description": "A GraphQL implementation with easy schema building, live queries, and batching.",
@@ -207,12 +201,26 @@
}
],
"Client": [
+ {
+ "name": "machinebox/graphql",
+ "description": "An elegant low-level HTTP client for GraphQL.",
+ "url": "https://github.com/machinebox/graphql",
+ "github": "machinebox/graphql"
+ },
{
"name": "graphql",
"description": "A GraphQL client implementation in Go.",
"url": "https://github.com/shurcooL/graphql#readme",
"github": "shurcooL/graphql"
}
+ ],
+ "Tools": [
+ {
+ "name": "super-graph",
+ "description": "An instant GraphQL to SQL compiler. Use as a standalone service or a Go library",
+ "url": "https://github.com/dosco/super-graph",
+ "github": "dosco/super-graph"
+ }
]
},
"Groovy": {
@@ -236,7 +244,7 @@
{
"name": "Morpheus GraphQL",
"description": "A Haskell library for building GraphQL APIs.",
- "howto": "\nHello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.\n",
+ "howto": "Hello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.",
"url": "https://github.com/morpheusgraphql/morpheus-graphql",
"github": "morpheusgraphql/morpheus-graphql"
}
@@ -250,7 +258,7 @@
}
]
},
- "Java / Android": {
+ "Java / Kotlin / Android": {
"Server": [
{
"name": "graphql-java",
@@ -258,6 +266,12 @@
"howto": "Code that executes a hello world GraphQL query with `graphql-java`:\n\n```java\nimport graphql.ExecutionResult;\nimport graphql.GraphQL;\nimport graphql.schema.GraphQLSchema;\nimport graphql.schema.StaticDataFetcher;\nimport graphql.schema.idl.RuntimeWiring;\nimport graphql.schema.idl.SchemaGenerator;\nimport graphql.schema.idl.SchemaParser;\nimport graphql.schema.idl.TypeDefinitionRegistry;\n\nimport static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;\n\npublic class HelloWorld {\n\n public static void main(String[] args) {\n String schema = \"type Query{hello: String} schema{query: Query}\";\n\n SchemaParser schemaParser = new SchemaParser();\n TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);\n\n RuntimeWiring runtimeWiring = new RuntimeWiring()\n .type(\"Query\", builder -> builder.dataFetcher(\"hello\", new StaticDataFetcher(\"world\")))\n .build();\n\n SchemaGenerator schemaGenerator = new SchemaGenerator();\n GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);\n\n GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();\n ExecutionResult executionResult = build.execute(\"{hello}\");\n\n System.out.println(executionResult.getData().toString());\n // Prints: {hello=world}\n }\n}\n```\n\nSee [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.\n",
"github": "graphql-java/graphql-java",
"url": "https://github.com/graphql-java/graphql-java"
+ },
+ {
+ "name": "graphql-kotlin",
+ "description": "A set of libraries for running GraphQL server in Kotlin.",
+ "url": "https://github.com/ExpediaGroup/graphql-kotlin/",
+ "github": "ExpediaGroup/graphql-kotlin"
}
],
"Client": [
@@ -273,6 +287,15 @@
"github": "americanexpress/nodes",
"url": "https://github.com/americanexpress/nodes"
}
+ ],
+ "Tools": [
+ {
+ "name": "GraphQL Java Generator",
+ "description": "GraphQL Java Generator is a tool that generates Java code to speed up development for Client and Server of GraphQL APIs",
+ "howto": "* GraphQL Java client: it generates the Java classes that call the GraphQL endpoint, and the POJO that will contain the data returned by the server. \nThe GraphQL endpoint can then be queried by using a simple call to a Java method (see sample below)\n* GraphQL Java server: it is based on [graphql-java](https://github.com/graphql-java/graphql-java) (listed here above). It generates all the boilerplate code. \nYou'll only have to implement what's specific to your server, which are the joins between the GraphQL types.\nGraphQL Java Generator is available as a [Maven Plugin](https://graphql-maven-plugin-project.graphql-java-generator.com/index.html).\nA Gradle plugin is coming soon.\nPlease note that GraphQL Java Generator is an accelerator: the generated code doesn’t depend on any library specific to GraphQL Java Generator. \nSo, it helps you to start building application based on graphql-java. Once the code is generated, you can decide to manually edit it as any standard java application, and get rid of GraphQL Java Generator. \nOf course you can, and should, according to us :), continue using GraphQL Java Generator when your projet evolves.",
+ "github": "graphql-java-generator/graphql-gradle-plugin-project",
+ "url": "https://github.com/graphql-java-generator"
+ }
]
},
"JavaScript": {
@@ -300,6 +323,21 @@
"url": "https://www.apollographql.com/docs/apollo-server/",
"npm": "apollo-server-express",
"github": "apollographql/apollo-server"
+ },
+ {
+ "name": "GraphQL Helix",
+ "description": "A collection of utility functions for building your own GraphQL HTTP server. You can check out [Building a GraphQL server with GraphQL Helix](https://dev.to/danielrearden/building-a-graphql-server-with-graphql-helix-2k44) on DEV for a detailed tutorial on getting started.",
+ "url": "https://github.com/contrawork/graphql-helix",
+ "npm": "graphql-helix",
+ "github": "contrawork/graphql-helix"
+ },
+ {
+ "name": "graphql-yoga",
+ "description": "Fully-featured GraphQL Server with focus on easy setup, performance & great developer experience",
+ "howto": "- Sensible defaults & includes everything you need with minimal setup.\n- Built-in support for GraphQL subscriptions using WebSockets.\n- Works with all GraphQL clients (Apollo, Relay...) and fits seamless in your GraphQL workflow.\n\nTo run a hello world server with graphql-yoga:\n\n```bash\nnpm install graphql-yoga\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nimport { GraphQLServer } from 'graphql-yoga'\n// ... or using \"require()\"\n// const { GraphQLServer } = require('graphql-yoga')\nconst typeDefs = `\n type Query {\n hello(name: String): String!\n }\n`;\nconst resolvers = {\n Query: {\n hello: (_, { name }) => `Hello ${name || 'World'}`,\n },\n};\nconst server = new GraphQLServer({ typeDefs, resolvers })\nserver.start(() => console.log('Server is running on localhost:4000'))\n```",
+ "url": "https://github.com/prisma-labs/graphql-yoga",
+ "npm": "graphql-yoga",
+ "github": "prisma-labs/graphql-yoga"
}
],
"Client": [
@@ -465,6 +503,20 @@
"url": "https://sofa-api.com/",
"npm": "sofa-api",
"github": "Urigo/SOFA"
+ },
+ {
+ "name": "GraphQL-WS",
+ "description": "Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client.",
+ "url": "https://github.com/enisdenjo/graphql-ws",
+ "npm": "graphql-ws",
+ "github": "enisdenjo/graphql-ws"
+ },
+ {
+ "name": "GraphQL Live Query",
+ "description": "Real-Time with GraphQL for any GraphQL schema or transport.",
+ "url": "https://github.com/n1ru4l/graphql-live-query",
+ "npm": "@n1ru4l/graphql-live-query",
+ "github": "n1ru4l/graphql-live-query"
}
]
},
@@ -478,16 +530,6 @@
}
]
},
- "Kotlin": {
- "Server": [
- {
- "name": "graphql-kotlin",
- "description": "A set of libraries for running GraphQL server in Kotlin.",
- "url": "https://github.com/ExpediaGroup/graphql-kotlin/",
- "github": "ExpediaGroup/graphql-kotlin"
- }
- ]
- },
"Perl": {
"Server": [
{
@@ -569,6 +611,12 @@
"description": "A GraphQL implementation for modern PHP",
"github": "infinityloop-dev/graphpinator",
"url": "https://github.com/infinityloop-dev/graphpinator"
+ },
+ {
+ "name": "serge",
+ "description": "Use GraphQL to define your Domain Model for CQRS/ES and let serge generate code to handle GraphQL requests.",
+ "github": "kepawni/serge",
+ "url": "https://github.com/kepawni/serge"
}
]
},
@@ -580,6 +628,20 @@
"howto": "To run a Graphene hello world script:\n\n```bash\npip install graphene\n```\n\nThen run `python hello.py` with this code in `hello.py`:\n\n```python\nimport graphene\n\nclass Query(graphene.ObjectType):\n hello = graphene.String(name=graphene.String(default_value=\"World\"))\n\n def resolve_hello(self, info, name):\n return 'Hello ' + name\n\nschema = graphene.Schema(query=Query)\nresult = schema.execute('{ hello }')\nprint(result.data['hello']) # \"Hello World\"\n```\n\nThere are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.",
"url": "http://graphene-python.org/",
"github": "graphql-python/graphene"
+ },
+ {
+ "name": "Ariadne",
+ "description": "Ariadne is a Python library for implementing GraphQL servers using schema-first approach. It supports both synchronous and asynchronous query execution, ships with batteries included for common GraphQL server problems like query cost validation or performance tracing and has simple API that is easy to extend or replace.",
+ "howto": "Ariadne can be installed with pip:\n\n```bash\npip install ariadne\n```\n\nIt ships with many GraphQL server implementations, enabling easy experimentation:\n\n```python\nfrom ariadne import ObjectType, QueryType, gql, make_executable_schema\nfrom ariadne.asgi import GraphQL\n# Define types using Schema Definition Language (https://graphql.org/learn/schema/)\n# Wrapping string in gql function provides validation and better error traceback\ntype_defs = gql(\"\"\"\n type Query {\n hello: String!\n }\n\"\"\")\n# Bind resolver functions to Query's fields using QueryType\nquery_type = QueryType()\n# Resolvers are simple python functions\n@query_type.field(\"hello\")\ndef resolve_hello(*_):\n return \"Hello world!\"\n# Create executable GraphQL schema\nschema = make_executable_schema(type_defs, query_type)\n# Create an ASGI app using the schema, running in debug mode\napp = GraphQL(schema, debug=True)\n```\n\nAbove server can be ran with uvicorn:\n\n```\npip install uvicorn\nuvicorn example:app\n```",
+ "url": "https://ariadnegraphql.org",
+ "github": "mirumee/ariadne"
+ },
+ {
+ "name": "Tartiflette",
+ "description": "A Python 3.6+ _(asyncio)_ library for building GraphQL APIs.",
+ "howto": "To run a tartiflette hello world script:\n```bash\npip install tartiflette\n```\nThen run `python hello.py` with this code in `hello.py`:\n```python\nimport asyncio\nfrom tartiflette import Engine, Resolver\n@Resolver(\"Query.hello\")\nasync def resolver_hello(parent, args, ctx, info):\n return \"hello \" + args[\"name\"]\nasync def run():\n tftt_engine = Engine(\"\"\"\n type Query {\n hello(name: String): String\n }\n \"\"\")\n result = await tftt_engine.execute(\n query='query { hello(name: \"Chuck\") }'\n )\n print(result)\n # {'data': {'hello': 'hello Chuck'}}\nif __name__ == \"__main__\":\n loop = asyncio.get_event_loop()\n loop.run_until_complete(run())\n```\nThere is also a nice [HTTP wrapper](https://github.com/dailymotion/tartiflette-aiohttp).",
+ "url": "https://tartiflette.io",
+ "github": "tartiflette/tartiflette"
}
],
"Client": [
@@ -639,6 +701,13 @@
"description": "GraphQL server library for Rust",
"github": "graphql-rust/juniper",
"url": "https://github.com/graphql-rust/juniper"
+ },
+ {
+ "name": "Async-graphql",
+ "description": "Async-graphql is a high-performance server-side library that supports all GraphQL specifications.",
+ "howto": "```rust\n use async_graphql::*;\n struct Query;\n #[Object]\n impl Query {\n /// Returns the sum of a and b\n async fn add(&self, a: i32, b: i32) -> i32 {\n a + b\n }\n }\n ```",
+ "github": "async-graphql/async-graphql",
+ "url": "https://github.com/async-graphql/async-graphql"
}
]
},
@@ -670,6 +739,19 @@
"description": "Swift library for building GraphQL schemas/types fast, safely and easily.",
"url": "https://github.com/GraphQLSwift/Graphiti",
"github": "GraphQLSwift/Graphiti"
+ },
+ {
+ "name": "GraphZahl",
+ "description": "Swift library for writing Declarative, Type-Safe GraphQL APIs with Zero Boilerplate.",
+ "url": "https://github.com/nerdsupremacist/GraphZahl",
+ "github": "nerdsupremacist/GraphZahl"
+ },
+ {
+ "name": "Caliban",
+ "description": "Caliban is a purely functional library for building GraphQL servers and clients in Scala",
+ "howto": "An example of a GraphQL schema and query with `caliban`:\n```scala\ncase class Character(name: String, age: Int)\ndef getCharacters(): List[Character] = ???\ndef getCharacter(name: String): Option[Character] = ???\n// schema\ncase class CharacterName(name: String)\ncase class Queries(characters: List[Character],\n character: CharacterName => Option[Character])\n// resolver\nval queries = Queries(getCharacters, args => getCharacter(args.name))\nimport caliban.GraphQL.graphQL\nimport caliban.RootResolver\nval api = graphQL(RootResolver(queries))\nfor {\n interpreter <- api.interpreter\n} yield interpreter\ncase class GraphQLResponse[+E](data: ResponseValue, errors: List[E])\nval query = \"\"\"\n {\n characters {\n name\n }\n }\"\"\"\nfor {\n result <- interpreter.execute(query)\n _ <- zio.console.putStrLn(result.data.toString)\n} yield ()\n```",
+ "url": "https://ghostdogpr.github.io/caliban/",
+ "github": "ghostdogpr/caliban"
}
],
"Client": [
@@ -690,6 +772,12 @@
"description": "A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo",
"github": "nerdsupremacist/Graphaello",
"url": "https://github.com/nerdsupremacist/Graphaello"
+ },
+ {
+ "name": "Caliban",
+ "description": "Functional GraphQL library for Scala, with client code generation and type-safe queries.",
+ "url": "https://ghostdogpr.github.io/caliban/",
+ "github": "ghostdogpr/caliban"
}
]
}
@@ -753,6 +841,26 @@
"name": "FaunaDB",
"description": "Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.",
"url": "https://docs.fauna.com/fauna/current/graphql"
+ },
+ {
+ "name": "LexasCMS",
+ "description": "A headless CMS (Content Management System) that combines powerful content personalisation and scheduling capabilities with a modern content editing experience and a blazing fast GraphQL/REST content delivery API.",
+ "url": "https://www.lexascms.com"
+ },
+ {
+ "name": "Moesif API Analytics",
+ "description": "A GraphQL analaytics and monitoring Service to find functional and performance issues.",
+ "url": "https://www.moesif.com/features/graphql-analytics"
+ },
+ {
+ "name": "Postman",
+ "description": "An HTTP Client that supports editing GraphQL queries.",
+ "url": "https://learning.postman.com/docs/sending-requests/supported-api-frameworks/graphql/"
+ },
+ {
+ "name": "Altair",
+ "description": "An alternative to Postman that supports editing GraphQL queries directly and autoload your GraphQL schema.",
+ "url": "https://altair.sirmuel.design/"
}
],
"More Stuff": [
From b9b2e0f8d0f7c8339928b38f28dfde2dc4df704e Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 16 Nov 2020 12:51:05 +0300
Subject: [PATCH 22/27] Use frontmatter instead of JSON file
---
data/code.json | 874 ------------------
gatsby-node.js | 106 ++-
package.json | 2 +
.../c-c/tools/libgraphqlparser.md | 8 +
.../c-net/client/graphql-client.md | 8 +
.../c-net/client/graphql-net-client.md | 8 +
.../c-net/client/sahb-graphqlclient.md | 8 +
.../c-net/server/entity-graphql.md | 8 +
.../c-net/server/graphql-dotnet.md | 34 +
.../c-net/server/graphql-net.md | 8 +
.../c-net/server/hot-chocolate.md | 8 +
.../clojure/client/regraph.md | 8 +
.../clojure/server/alumbra.md | 41 +
.../clojure/server/graphql-clj.md | 23 +
.../clojure/server/lacinia.md | 8 +
.../language-support/d/server/graphqld.md | 8 +
.../elixir/client/common-graphql-client.md | 8 +
.../language-support/elixir/client/neuron.md | 8 +
.../elixir/server/absinthe.md | 8 +
.../elixir/server/graphql-elixir.md | 8 +
.../elm/client/dillonkearns-elm-graphql.md | 8 +
.../erlang/server/graphql-erlang.md | 8 +
.../flutter/client/graphql.md | 8 +
.../language-support/go/client/graphql.md | 8 +
.../go/client/machinebox-graphql.md | 8 +
.../go/server/99designs-gqlgen.md | 8 +
.../go/server/appointy-jaal.md | 8 +
.../go/server/graph-gophers-graphql-go.md | 8 +
.../language-support/go/server/graphql-go.md | 8 +
.../go/server/graphql-relay-go.md | 8 +
.../go/server/samsarahq-thunder.md | 8 +
.../language-support/go/tools/super-graph.md | 8 +
.../groovy/server/gorm-graphql.md | 21 +
.../language-support/groovy/server/gql.md | 8 +
.../haskell/client/morpheus-graphql-client.md | 8 +
.../haskell/server/morpheus-graphql.md | 61 ++
.../client/apollo-android.md | 8 +
.../java-kotlin-android/client/nodes.md | 8 +
.../server/graphql-java.md | 47 +
.../server/graphql-kotlin.md | 8 +
.../tools/graphql-java-generator.md | 16 +
.../javascript/client/apollo-client.md | 9 +
.../javascript/client/aws-amplify.md | 9 +
.../javascript/client/gq-loader.md | 9 +
.../javascript/client/grafoo.md | 9 +
.../javascript/client/graphql-request.md | 9 +
.../javascript/client/graphqurl.md | 9 +
.../javascript/client/lokka.md | 9 +
.../javascript/client/nanogql.md | 9 +
.../javascript/client/relay.md | 9 +
.../javascript/client/urql.md | 9 +
.../javascript/server/apollo-server.md | 43 +
.../javascript/server/express-graphql.md | 37 +
.../javascript/server/graphql-helix.md | 9 +
.../javascript/server/graphql-js.md | 31 +
.../javascript/server/graphql-yoga.md | 37 +
.../javascript/tools/graphiql.md | 9 +
.../javascript/tools/graphql-cli.md | 9 +
.../tools/graphql-code-generator.md | 9 +
.../javascript/tools/graphql-config.md | 9 +
.../javascript/tools/graphql-eslint.md | 9 +
.../javascript/tools/graphql-inspector.md | 9 +
.../tools/graphql-language-service.md | 9 +
.../javascript/tools/graphql-live-query.md | 9 +
.../javascript/tools/graphql-mesh.md | 9 +
.../javascript/tools/graphql-modules.md | 9 +
.../javascript/tools/graphql-scalars.md | 9 +
.../javascript/tools/graphql-tools.md | 9 +
.../javascript/tools/graphql-ws.md | 9 +
.../javascript/tools/postgraphile.md | 9 +
.../language-support/javascript/tools/sofa.md | 9 +
.../language-support/julia/client/diana-jl.md | 8 +
.../server/ocaml-graphql-server.md | 8 +
.../perl/server/graphql-perl.md | 16 +
.../php/server/api-platform.md | 41 +
.../php/server/graphpinator.md | 8 +
.../php/server/graphql-api-for-wordpress.md | 8 +
.../php/server/graphql-php.md | 8 +
.../php/server/graphql-relay-php.md | 8 +
.../php/server/graphqlbundle.md | 8 +
.../language-support/php/server/graphqlite.md | 37 +
.../language-support/php/server/lighthouse.md | 8 +
.../code/language-support/php/server/railt.md | 8 +
.../code/language-support/php/server/serge.md | 8 +
.../code/language-support/php/server/siler.md | 43 +
.../language-support/php/server/wpgraphql.md | 8 +
.../language-support/python/client/gql.md | 8 +
.../python/client/python-graphql-client.md | 8 +
.../language-support/python/client/sgqlc.md | 8 +
.../language-support/python/server/ariadne.md | 43 +
.../python/server/graphene.md | 30 +
.../python/server/tartiflette.md | 34 +
.../code/language-support/r/server/ghql.md | 8 +
.../code/language-support/ruby/server/agoo.md | 37 +
.../ruby/server/graphql-ruby.md | 33 +
.../rust/server/async-graphql.md | 18 +
.../rust/server/graphql-rust-juniper.md | 8 +
.../language-support/scala/server/sangria.md | 23 +
.../client/apollo-ios.md | 8 +
.../swift-objective-c-ios/client/caliban.md | 8 +
.../client/graphaello.md | 8 +
.../client/graphql-ios.md | 8 +
.../swift-objective-c-ios/server/caliban.md | 36 +
.../swift-objective-c-ios/server/graphiti.md | 8 +
.../swift-objective-c-ios/server/graphzahl.md | 8 +
.../code/more-stuff/awesome-graphql.md | 8 +
src/content/code/services/altair.md | 7 +
.../code/services/apollo-graph-manager.md | 7 +
src/content/code/services/aws-appsync.md | 7 +
src/content/code/services/elide.md | 7 +
src/content/code/services/faunadb.md | 7 +
src/content/code/services/graphcms.md | 7 +
src/content/code/services/hasura.md | 8 +
src/content/code/services/lexascms.md | 7 +
.../code/services/moesif-api-analytics.md | 7 +
src/content/code/services/postman.md | 7 +
src/content/code/services/prisma.md | 8 +
src/content/code/services/tipe.md | 8 +
src/content/code/slug-map.json | 31 +
.../code/tools/graphql-code-generator.md | 9 +
src/content/code/tools/quicktype.md | 9 +
yarn.lock | 68 +-
122 files changed, 1736 insertions(+), 898 deletions(-)
delete mode 100644 data/code.json
create mode 100644 src/content/code/language-support/c-c/tools/libgraphqlparser.md
create mode 100644 src/content/code/language-support/c-net/client/graphql-client.md
create mode 100644 src/content/code/language-support/c-net/client/graphql-net-client.md
create mode 100644 src/content/code/language-support/c-net/client/sahb-graphqlclient.md
create mode 100644 src/content/code/language-support/c-net/server/entity-graphql.md
create mode 100644 src/content/code/language-support/c-net/server/graphql-dotnet.md
create mode 100644 src/content/code/language-support/c-net/server/graphql-net.md
create mode 100644 src/content/code/language-support/c-net/server/hot-chocolate.md
create mode 100644 src/content/code/language-support/clojure/client/regraph.md
create mode 100644 src/content/code/language-support/clojure/server/alumbra.md
create mode 100644 src/content/code/language-support/clojure/server/graphql-clj.md
create mode 100644 src/content/code/language-support/clojure/server/lacinia.md
create mode 100644 src/content/code/language-support/d/server/graphqld.md
create mode 100644 src/content/code/language-support/elixir/client/common-graphql-client.md
create mode 100644 src/content/code/language-support/elixir/client/neuron.md
create mode 100644 src/content/code/language-support/elixir/server/absinthe.md
create mode 100644 src/content/code/language-support/elixir/server/graphql-elixir.md
create mode 100644 src/content/code/language-support/elm/client/dillonkearns-elm-graphql.md
create mode 100644 src/content/code/language-support/erlang/server/graphql-erlang.md
create mode 100644 src/content/code/language-support/flutter/client/graphql.md
create mode 100644 src/content/code/language-support/go/client/graphql.md
create mode 100644 src/content/code/language-support/go/client/machinebox-graphql.md
create mode 100644 src/content/code/language-support/go/server/99designs-gqlgen.md
create mode 100644 src/content/code/language-support/go/server/appointy-jaal.md
create mode 100644 src/content/code/language-support/go/server/graph-gophers-graphql-go.md
create mode 100644 src/content/code/language-support/go/server/graphql-go.md
create mode 100644 src/content/code/language-support/go/server/graphql-relay-go.md
create mode 100644 src/content/code/language-support/go/server/samsarahq-thunder.md
create mode 100644 src/content/code/language-support/go/tools/super-graph.md
create mode 100644 src/content/code/language-support/groovy/server/gorm-graphql.md
create mode 100644 src/content/code/language-support/groovy/server/gql.md
create mode 100644 src/content/code/language-support/haskell/client/morpheus-graphql-client.md
create mode 100644 src/content/code/language-support/haskell/server/morpheus-graphql.md
create mode 100644 src/content/code/language-support/java-kotlin-android/client/apollo-android.md
create mode 100644 src/content/code/language-support/java-kotlin-android/client/nodes.md
create mode 100644 src/content/code/language-support/java-kotlin-android/server/graphql-java.md
create mode 100644 src/content/code/language-support/java-kotlin-android/server/graphql-kotlin.md
create mode 100644 src/content/code/language-support/java-kotlin-android/tools/graphql-java-generator.md
create mode 100644 src/content/code/language-support/javascript/client/apollo-client.md
create mode 100644 src/content/code/language-support/javascript/client/aws-amplify.md
create mode 100644 src/content/code/language-support/javascript/client/gq-loader.md
create mode 100644 src/content/code/language-support/javascript/client/grafoo.md
create mode 100644 src/content/code/language-support/javascript/client/graphql-request.md
create mode 100644 src/content/code/language-support/javascript/client/graphqurl.md
create mode 100644 src/content/code/language-support/javascript/client/lokka.md
create mode 100644 src/content/code/language-support/javascript/client/nanogql.md
create mode 100644 src/content/code/language-support/javascript/client/relay.md
create mode 100644 src/content/code/language-support/javascript/client/urql.md
create mode 100644 src/content/code/language-support/javascript/server/apollo-server.md
create mode 100644 src/content/code/language-support/javascript/server/express-graphql.md
create mode 100644 src/content/code/language-support/javascript/server/graphql-helix.md
create mode 100644 src/content/code/language-support/javascript/server/graphql-js.md
create mode 100644 src/content/code/language-support/javascript/server/graphql-yoga.md
create mode 100644 src/content/code/language-support/javascript/tools/graphiql.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-cli.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-code-generator.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-config.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-eslint.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-inspector.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-language-service.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-live-query.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-mesh.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-modules.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-scalars.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-tools.md
create mode 100644 src/content/code/language-support/javascript/tools/graphql-ws.md
create mode 100644 src/content/code/language-support/javascript/tools/postgraphile.md
create mode 100644 src/content/code/language-support/javascript/tools/sofa.md
create mode 100644 src/content/code/language-support/julia/client/diana-jl.md
create mode 100644 src/content/code/language-support/ocaml-reason/server/ocaml-graphql-server.md
create mode 100644 src/content/code/language-support/perl/server/graphql-perl.md
create mode 100644 src/content/code/language-support/php/server/api-platform.md
create mode 100644 src/content/code/language-support/php/server/graphpinator.md
create mode 100644 src/content/code/language-support/php/server/graphql-api-for-wordpress.md
create mode 100644 src/content/code/language-support/php/server/graphql-php.md
create mode 100644 src/content/code/language-support/php/server/graphql-relay-php.md
create mode 100644 src/content/code/language-support/php/server/graphqlbundle.md
create mode 100644 src/content/code/language-support/php/server/graphqlite.md
create mode 100644 src/content/code/language-support/php/server/lighthouse.md
create mode 100644 src/content/code/language-support/php/server/railt.md
create mode 100644 src/content/code/language-support/php/server/serge.md
create mode 100644 src/content/code/language-support/php/server/siler.md
create mode 100644 src/content/code/language-support/php/server/wpgraphql.md
create mode 100644 src/content/code/language-support/python/client/gql.md
create mode 100644 src/content/code/language-support/python/client/python-graphql-client.md
create mode 100644 src/content/code/language-support/python/client/sgqlc.md
create mode 100644 src/content/code/language-support/python/server/ariadne.md
create mode 100644 src/content/code/language-support/python/server/graphene.md
create mode 100644 src/content/code/language-support/python/server/tartiflette.md
create mode 100644 src/content/code/language-support/r/server/ghql.md
create mode 100644 src/content/code/language-support/ruby/server/agoo.md
create mode 100644 src/content/code/language-support/ruby/server/graphql-ruby.md
create mode 100644 src/content/code/language-support/rust/server/async-graphql.md
create mode 100644 src/content/code/language-support/rust/server/graphql-rust-juniper.md
create mode 100644 src/content/code/language-support/scala/server/sangria.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/client/apollo-ios.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/client/caliban.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/client/graphaello.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/client/graphql-ios.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/server/caliban.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/server/graphiti.md
create mode 100644 src/content/code/language-support/swift-objective-c-ios/server/graphzahl.md
create mode 100644 src/content/code/more-stuff/awesome-graphql.md
create mode 100644 src/content/code/services/altair.md
create mode 100644 src/content/code/services/apollo-graph-manager.md
create mode 100644 src/content/code/services/aws-appsync.md
create mode 100644 src/content/code/services/elide.md
create mode 100644 src/content/code/services/faunadb.md
create mode 100644 src/content/code/services/graphcms.md
create mode 100644 src/content/code/services/hasura.md
create mode 100644 src/content/code/services/lexascms.md
create mode 100644 src/content/code/services/moesif-api-analytics.md
create mode 100644 src/content/code/services/postman.md
create mode 100644 src/content/code/services/prisma.md
create mode 100644 src/content/code/services/tipe.md
create mode 100644 src/content/code/slug-map.json
create mode 100644 src/content/code/tools/graphql-code-generator.md
create mode 100644 src/content/code/tools/quicktype.md
diff --git a/data/code.json b/data/code.json
deleted file mode 100644
index f45cb802a9..0000000000
--- a/data/code.json
+++ /dev/null
@@ -1,874 +0,0 @@
-{
- "Libraries": {
- "C / C++": {
- "Tools": [
- {
- "name": "libgraphqlparser",
- "description": "A GraphQL query language parser in C++ with C and C++ APIs.",
- "url": "https://github.com/graphql/libgraphqlparser",
- "github": "graphql/libgraphqlparser"
- }
- ]
- },
- "C# / .NET": {
- "Server": [
- {
- "name": "graphql-dotnet",
- "description": "GraphQL for .NET",
- "howto": "```csharp\nusing System;\nusing System.Threading.Tasks;\nusing GraphQL;\nusing GraphQL.Types;\nusing GraphQL.SystemTextJson; // First add PackageReference to GraphQL.SystemTextJson\n\npublic class Program\n{\n public static async Task Main(string[] args)\n {\n var schema = Schema.For(@\"\n type Query {\n hello: String\n }\n \");\n\n var json = await schema.ExecuteAsync(_ =>\n {\n _.Query = \"{ hello }\";\n _.Root = new { Hello = \"Hello World!\" };\n });\n\n Console.WriteLine(json);\n }\n} \n```",
- "url": "https://github.com/graphql-dotnet/graphql-dotnet",
- "github": "graphql-dotnet/graphql-dotnet"
- },
- {
- "name": "graphql-net",
- "description": "Convert GraphQL to IQueryable",
- "url": "https://github.com/ckimes89/graphql-net",
- "github": "chkimes/graphql-net"
- },
- {
- "name": "Entity GraphQL",
- "description": ".NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)",
- "url": "https://github.com/lukemurray/EntityGraphQL",
- "github": "lukemurray/EntityGraphQL"
- },
- {
- "name": "Hot Chocolate",
- "description": "GraphQL Server for .NET core and .NET classic",
- "url": "https://github.com/ChilliCream/hotchocolate",
- "github": "ChilliCream/hotchocolate"
- }
- ],
- "Client": [
- {
- "name": "GraphQL.Client",
- "description": "A GraphQL Client for .NET.",
- "url": "https://github.com/graphql-dotnet/graphql-client",
- "github": "graphql-dotnet/graphql-client"
- },
- {
- "name": "graphql-net-client",
- "description": "Basic example GraphQL client for .NET.",
- "url": "https://github.com/bkniffler/graphql-net-client",
- "github": "bkniffler/graphql-net-client"
- },
- {
- "name": "SAHB.GraphQLClient",
- "description": "GraphQL client which supports generating queries from C# classes",
- "url": "https://github.com/sahb1239/SAHB.GraphQLClient",
- "github": "sahb1239/SAHB.GraphQLClient"
- }
- ]
- },
- "Clojure": {
- "Server": [
- {
- "name": "alumbra",
- "description": "A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).",
- "howto": "```clojure\n(require '[alumbra.core :as alumbra]\n '[claro.data :as data])\n\n(def schema\n \"type Person { name: String!, friends: [Person!]! }\n type QueryRoot { person(id: ID!): Person, me: Person! }\n schema { query: QueryRoot }\")\n\n(defrecord Person [id]\n data/Resolvable\n (resolve! [_ _]\n {:name (str \"Person #\" id)\n :friends (map ->Person (range (inc id) (+ id 3)))}))\n\n(def QueryRoot\n {:person (map->Person {})\n :me (map->Person {:id 0})})\n\n(def app\n (alumbra/handler\n {:schema schema\n :query QueryRoot}))\n\n(defonce my-graphql-server\n (aleph.http/start-server #'app {:port 3000}))\n```\n\n```bash\n$ curl -XPOST \"http://0:3000\" -H'Content-Type: application/json' -d'{\n \"query\": \"{ me { name, friends { name } } }\"\n}'\n{\"data\":{\"me\":{\"name\":\"Person #0\",\"friends\":[{\"name\":\"Person #1\"},{\"name\":\"Person #2\"}]}}}\n```",
- "url": "https://github.com/alumbra/alumbra",
- "github": "alumbra/alumbra"
- },
- {
- "name": "graphql-clj",
- "description": "A Clojure library that provides a GraphQL implementation.",
- "howto": "Code that executes a hello world GraphQL query with `graphql-clj`:\n```clojure\n\n(def schema \"type QueryRoot {\n hello: String\n }\")\n\n(defn resolver-fn [type-name field-name]\n (get-in {\"QueryRoot\" {\"hello\" (fn [context parent & rest]\n \"Hello world!\")}}\n [type-name field-name]))\n\n(require '[graphql-clj.executor :as executor])\n\n(executor/execute nil schema resolver-fn \"{ hello }\")\n```",
- "url": "https://github.com/tendant/graphql-clj",
- "github": "tendant/graphql-clj"
- },
- {
- "name": "lacinia",
- "description": "A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.",
- "github": "walmartlabs/lacinia",
- "url": "https://github.com/walmartlabs/lacinia"
- }
- ],
- "Client": [
- {
- "name": "regraph",
- "description": "A GraphQL client implemented in Clojurescript with support for websockets.",
- "github": "oliyh/re-graph",
- "url": "https://github.com/oliyh/re-graph/"
- }
- ]
- },
- "D": {
- "Server": [
- {
- "name": "graphqld",
- "description": "A GraphQL implementaiton for the D Programming Language.",
- "github": "burner/graphqld",
- "url": "https://github.com/burner/graphqld"
- }
- ]
- },
- "Elixir": {
- "Client": [
- {
- "name": "Neuron",
- "description": "A GraphQL client for Elixir",
- "github": "uesteibar/neuron",
- "url": "https://github.com/uesteibar/neuron"
- },
- {
- "name": "common_graphql_client",
- "description": "Elixir GraphQL Client with HTTP and WebSocket support",
- "github": "annkissam/common_graphql_client",
- "url": "https://github.com/annkissam/common_graphql_client"
- }
- ],
- "Server": [
- {
- "name": "absinthe",
- "description": "GraphQL implementation for Elixir.",
- "github": "absinthe-graphql/absinthe",
- "url": "https://github.com/absinthe-graphql/absinthe"
- },
- {
- "name": "graphql-elixir",
- "description": "An Elixir implementation of Facebook's GraphQL.",
- "github": "graphql-elixir/graphql",
- "url": "https://github.com/graphql-elixir/graphql"
- }
- ]
- },
- "Elm": {
- "Client": [
- {
- "name": "dillonkearns/elm-graphql",
- "description": "Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.",
- "url": "https://github.com/dillonkearns/elm-graphql",
- "github": "dillonkearns/elm-graphql"
- }
- ]
- },
- "Erlang": {
- "Server": [
- {
- "name": "graphql-erlang",
- "description": "GraphQL implementation in Erlang.",
- "url": "https://github.com/shopgun/graphql-erlang",
- "github": "jlouis/graphql-erlang"
- }
- ]
- },
- "Flutter": {
- "Client": [
- {
- "name": "graphql",
- "description": "A GraphQL client implementation in Flutter.",
- "url": "https://github.com/zino-app/graphql-flutter#readme",
- "github": "zino-app/graphql-flutter"
- }
- ]
- },
- "Go": {
- "Server": [
- {
- "name": "graphql-go",
- "description": "An implementation of GraphQL for Go / Golang.",
- "url": "https://github.com/graphql-go/graphql",
- "github": "graphql-go/graphql"
- },
- {
- "name": "graph-gophers/graphql-go",
- "description": "An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).",
- "url": "https://github.com/graph-gophers/graphql-go",
- "github": "graph-gophers/graphql-go"
- },
- {
- "name": "99designs/gqlgen",
- "description": "Go generate based graphql server library.",
- "url": "https://github.com/99designs/gqlgen",
- "github": "99designs/gqlgen"
- },
- {
- "name": "graphql-relay-go",
- "description": "A Go/Golang library to help construct a graphql-go server supporting react-relay.",
- "url": "https://github.com/graphql-go/relay",
- "github": "graphql-go/relay"
- },
- {
- "name": "samsarahq/thunder",
- "description": "A GraphQL implementation with easy schema building, live queries, and batching.",
- "url": "https://github.com/samsarahq/thunder",
- "github": "samsarahq/thunder"
- },
- {
- "name": "appointy/jaal",
- "description": "Develop spec compliant GraphQL servers in Go.",
- "url": "https://github.com/appointy/jaal",
- "github": "appointy/jaal"
- }
- ],
- "Client": [
- {
- "name": "machinebox/graphql",
- "description": "An elegant low-level HTTP client for GraphQL.",
- "url": "https://github.com/machinebox/graphql",
- "github": "machinebox/graphql"
- },
- {
- "name": "graphql",
- "description": "A GraphQL client implementation in Go.",
- "url": "https://github.com/shurcooL/graphql#readme",
- "github": "shurcooL/graphql"
- }
- ],
- "Tools": [
- {
- "name": "super-graph",
- "description": "An instant GraphQL to SQL compiler. Use as a standalone service or a Go library",
- "url": "https://github.com/dosco/super-graph",
- "github": "dosco/super-graph"
- }
- ]
- },
- "Groovy": {
- "Server": [
- {
- "name": "gorm-graphql",
- "howto": "**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of \"data fetchers\" to query, update, and delete data through executions of the schema.\n\n**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:\n\n- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.\n\n- Generates the schema at startup with spring bean configuration to make it easy to extend.\n\n- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.\n\n- Overrides the default data binder to use the data binding provided by Grails\n- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier\n\nSee [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.",
- "github": "grails/gorm-graphql",
- "url": "https://github.com/grails/gorm-graphql/"
- },
- {
- "name": "GQL",
- "description": "GQL is a Groove library for GraphQL",
- "url": "https://grooviter.github.io/gql/",
- "github": "grooviter/gql"
- }
- ]
- },
- "Haskell": {
- "Server": [
- {
- "name": "Morpheus GraphQL",
- "description": "A Haskell library for building GraphQL APIs.",
- "howto": "Hello world example with `morpheus-graphql`:\n\n```graphql\n# schema.gql\n\"\"\"\nA supernatural being considered divine and sacred\n\"\"\"\ntype Deity {\n name: String!\n power: String @deprecated(reason: \"no more supported\")\n}\ntype Query {\n deity(name: String! = \"Morpheus\"): Deity!\n}\n```\n\n\n```haskell\n{-# LANGUAGE DeriveGeneric #-}\n{-# LANGUAGE DuplicateRecordFields #-}\n{-# LANGUAGE FlexibleContexts #-}\n{-# LANGUAGE FlexibleInstances #-}\n{-# LANGUAGE MultiParamTypeClasses #-}\n{-# LANGUAGE NamedFieldPuns #-}\n{-# LANGUAGE OverloadedStrings #-}\n{-# LANGUAGE ScopedTypeVariables #-}\n{-# LANGUAGE TemplateHaskell #-}\n{-# LANGUAGE TypeFamilies #-}\nmodule API (api) where\nimport Data.ByteString.Lazy.Char8 (ByteString)\nimport Data.Morpheus (interpreter)\nimport Data.Morpheus.Document (importGQLDocument)\nimport Data.Morpheus.Types (RootResolver (..), Undefined (..))\nimport Data.Text (Text)\nimportGQLDocument \"schema.gql\"\nrootResolver :: RootResolver IO () Query Undefined Undefined\nrootResolver =\n RootResolver\n { queryResolver = Query {deity},\n mutationResolver = Undefined,\n subscriptionResolver = Undefined\n }\n where\n deity DeityArgs {name} =\n pure\n Deity\n { name = pure name,\n power = pure (Just \"Shapeshifting\")\n }\napi :: ByteString -> IO ByteString\napi = interpreter rootResolver\n```\n\nSee [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.",
- "url": "https://github.com/morpheusgraphql/morpheus-graphql",
- "github": "morpheusgraphql/morpheus-graphql"
- }
- ],
- "Client": [
- {
- "name": "morpheus-graphql-client",
- "description": "A strongly-typed GraphQL client implementation in Haksell.",
- "url": "https://github.com/morpheusgraphql/morpheus-graphql",
- "github": "morpheusgraphql/morpheus-graphql"
- }
- ]
- },
- "Java / Kotlin / Android": {
- "Server": [
- {
- "name": "graphql-java",
- "description": "A Java library for building GraphQL APIs.",
- "howto": "Code that executes a hello world GraphQL query with `graphql-java`:\n\n```java\nimport graphql.ExecutionResult;\nimport graphql.GraphQL;\nimport graphql.schema.GraphQLSchema;\nimport graphql.schema.StaticDataFetcher;\nimport graphql.schema.idl.RuntimeWiring;\nimport graphql.schema.idl.SchemaGenerator;\nimport graphql.schema.idl.SchemaParser;\nimport graphql.schema.idl.TypeDefinitionRegistry;\n\nimport static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;\n\npublic class HelloWorld {\n\n public static void main(String[] args) {\n String schema = \"type Query{hello: String} schema{query: Query}\";\n\n SchemaParser schemaParser = new SchemaParser();\n TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);\n\n RuntimeWiring runtimeWiring = new RuntimeWiring()\n .type(\"Query\", builder -> builder.dataFetcher(\"hello\", new StaticDataFetcher(\"world\")))\n .build();\n\n SchemaGenerator schemaGenerator = new SchemaGenerator();\n GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);\n\n GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();\n ExecutionResult executionResult = build.execute(\"{hello}\");\n\n System.out.println(executionResult.getData().toString());\n // Prints: {hello=world}\n }\n}\n```\n\nSee [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.\n",
- "github": "graphql-java/graphql-java",
- "url": "https://github.com/graphql-java/graphql-java"
- },
- {
- "name": "graphql-kotlin",
- "description": "A set of libraries for running GraphQL server in Kotlin.",
- "url": "https://github.com/ExpediaGroup/graphql-kotlin/",
- "github": "ExpediaGroup/graphql-kotlin"
- }
- ],
- "Client": [
- {
- "name": "Apollo Android",
- "description": "A strongly-typed, caching GraphQL client for Android, written in Java.",
- "github": "apollographql/apollo-android",
- "url": "https://github.com/apollographql/apollo-android"
- },
- {
- "name": "Nodes",
- "description": "A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.",
- "github": "americanexpress/nodes",
- "url": "https://github.com/americanexpress/nodes"
- }
- ],
- "Tools": [
- {
- "name": "GraphQL Java Generator",
- "description": "GraphQL Java Generator is a tool that generates Java code to speed up development for Client and Server of GraphQL APIs",
- "howto": "* GraphQL Java client: it generates the Java classes that call the GraphQL endpoint, and the POJO that will contain the data returned by the server. \nThe GraphQL endpoint can then be queried by using a simple call to a Java method (see sample below)\n* GraphQL Java server: it is based on [graphql-java](https://github.com/graphql-java/graphql-java) (listed here above). It generates all the boilerplate code. \nYou'll only have to implement what's specific to your server, which are the joins between the GraphQL types.\nGraphQL Java Generator is available as a [Maven Plugin](https://graphql-maven-plugin-project.graphql-java-generator.com/index.html).\nA Gradle plugin is coming soon.\nPlease note that GraphQL Java Generator is an accelerator: the generated code doesn’t depend on any library specific to GraphQL Java Generator. \nSo, it helps you to start building application based on graphql-java. Once the code is generated, you can decide to manually edit it as any standard java application, and get rid of GraphQL Java Generator. \nOf course you can, and should, according to us :), continue using GraphQL Java Generator when your projet evolves.",
- "github": "graphql-java-generator/graphql-gradle-plugin-project",
- "url": "https://github.com/graphql-java-generator"
- }
- ]
- },
- "JavaScript": {
- "Server": [
- {
- "name": "GraphQL.js",
- "description": "The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.",
- "howto": "To run a `GraphQL.js` hello world script from the command line:\n\n```bash\nnpm install graphql\n```\n\nThen run `node hello.js` with this code in `hello.js`:\n\n```js\nvar { graphql, buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\ngraphql(schema, '{ hello }', root).then((response) => {\n console.log(response);\n});\n```",
- "url": "/graphql-js/",
- "npm": "graphql",
- "github": "graphql/graphql-js"
- },
- {
- "name": "Express GraphQL",
- "description": "The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.",
- "howto": "To run an `express-graphql` hello world server:\n\n```bash\nnpm install express express-graphql graphql\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nvar express = require('express');\nvar { graphqlHTTP } = require('express-graphql');\nvar { buildSchema } = require('graphql');\n\nvar schema = buildSchema(`\n type Query {\n hello: String\n }\n`);\n\nvar root = { hello: () => 'Hello world!' };\n\nvar app = express();\napp.use('/graphql', graphqlHTTP({\n schema: schema,\n rootValue: root,\n graphiql: true,\n}));\napp.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));\n```",
- "url": "/graphql-js/running-an-express-graphql-server/",
- "npm": "express-graphql",
- "github": "graphql/express-graphql"
- },
- {
- "name": "Apollo Server",
- "description": "A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).",
- "howto": "To run a hello world server with apollo-server-express:\n\n```bash\nnpm install apollo-server-express express \n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nconst express = require('express');\nconst { ApolloServer, gql } = require('apollo-server-express');\n\nconst typeDefs = gql`\n type Query {\n hello: String\n }\n`;\n\nconst resolvers = {\n Query: {\n hello: () => 'Hello world!',\n },\n};\n\nconst server = new ApolloServer({ typeDefs, resolvers });\n\nconst app = express();\nserver.applyMiddleware({ app });\n\napp.listen({ port: 4000 }, () =>\n console.log('Now browse to http://localhost:4000' + server.graphqlPath)\n);\n```\n\nApollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.",
- "url": "https://www.apollographql.com/docs/apollo-server/",
- "npm": "apollo-server-express",
- "github": "apollographql/apollo-server"
- },
- {
- "name": "GraphQL Helix",
- "description": "A collection of utility functions for building your own GraphQL HTTP server. You can check out [Building a GraphQL server with GraphQL Helix](https://dev.to/danielrearden/building-a-graphql-server-with-graphql-helix-2k44) on DEV for a detailed tutorial on getting started.",
- "url": "https://github.com/contrawork/graphql-helix",
- "npm": "graphql-helix",
- "github": "contrawork/graphql-helix"
- },
- {
- "name": "graphql-yoga",
- "description": "Fully-featured GraphQL Server with focus on easy setup, performance & great developer experience",
- "howto": "- Sensible defaults & includes everything you need with minimal setup.\n- Built-in support for GraphQL subscriptions using WebSockets.\n- Works with all GraphQL clients (Apollo, Relay...) and fits seamless in your GraphQL workflow.\n\nTo run a hello world server with graphql-yoga:\n\n```bash\nnpm install graphql-yoga\n```\n\nThen run `node server.js` with this code in `server.js`:\n\n```js\nimport { GraphQLServer } from 'graphql-yoga'\n// ... or using \"require()\"\n// const { GraphQLServer } = require('graphql-yoga')\nconst typeDefs = `\n type Query {\n hello(name: String): String!\n }\n`;\nconst resolvers = {\n Query: {\n hello: (_, { name }) => `Hello ${name || 'World'}`,\n },\n};\nconst server = new GraphQLServer({ typeDefs, resolvers })\nserver.start(() => console.log('Server is running on localhost:4000'))\n```",
- "url": "https://github.com/prisma-labs/graphql-yoga",
- "npm": "graphql-yoga",
- "github": "prisma-labs/graphql-yoga"
- }
- ],
- "Client": [
- {
- "name": "Relay",
- "description": "Facebook's framework for building React applications that talk to a GraphQL backend.",
- "url": "https://facebook.github.io/relay/",
- "npm": "react-relay",
- "github": "facebook/relay"
- },
- {
- "name": "Apollo Client",
- "description": "A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.",
- "url": "http://apollographql.com/client/",
- "npm": "@apollo/client",
- "github": "apollographql/apollo-client"
- },
- {
- "name": "GraphQL Request",
- "description": "A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.",
- "url": "https://github.com/prisma/graphql-request",
- "npm": "graphql-request",
- "github": "prisma-labs/graphql-request"
- },
- {
- "name": "Lokka",
- "description": "A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).",
- "url": "https://github.com/kadirahq/lokka",
- "npm": "lokka",
- "github": "kadirahq/lokka"
- },
- {
- "name": "nanogql",
- "description": "Tiny GraphQL client library using template strings.",
- "url": "https://github.com/yoshuawuyts/nanogql",
- "npm": "nanographql",
- "github": "choojs/nanographql"
- },
- {
- "name": "gq-loader",
- "description": "A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.",
- "url": "https://github.com/Houfeng/gq-loader",
- "npm": "gq-loader",
- "github": "Houfeng/gq-loader"
- },
- {
- "name": "AWS Amplify",
- "description": "A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.",
- "url": "https://docs.amplify.aws/",
- "npm": "aws-amplify",
- "github": "aws-amplify/amplify-js"
- },
- {
- "name": "Grafoo",
- "description": "An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.",
- "url": "https://github.com/grafoojs/grafoo",
- "npm": "@grafoo/core",
- "github": "grafoojs/grafoo"
- },
- {
- "name": "urql",
- "description": "A highly customizable and versatile GraphQL client for React.",
- "url": "https://formidable.com/open-source/urql/",
- "npm": "urql",
- "github": "FormidableLabs/urql"
- },
- {
- "name": "graphqurl",
- "description": "curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.",
- "url": "https://github.com/hasura/graphqurl",
- "npm": "graphqurl",
- "github": "hasura/graphqurl"
- }
- ],
- "Tools": [
- {
- "name": "GraphiQL",
- "description": "An interactive in-browser GraphQL IDE.",
- "url": "https://github.com/graphql/graphiql",
- "npm": "graphiql",
- "github": "graphql/graphiql"
- },
- {
- "name": "GraphQL Language Service",
- "description": "An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).",
- "url": "https://github.com/graphql/graphql-language-service",
- "npm": "graphql-language-service",
- "github": "graphql/graphql-language-service"
- },
- {
- "name": "GraphQL Code Generator",
- "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
- "url": "https://graphql-code-generator.com",
- "npm": "@graphql-codegen/cli",
- "github": "dotansimha/graphql-code-generator"
- },
- {
- "name": "GraphQL-ESLint",
- "description": "GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).",
- "url": "https://github.com/dotansimha/graphql-eslint/",
- "npm": "@graphql-eslint/eslint-plugin",
- "github": "dotansimha/graphql-eslint/"
- },
- {
- "name": "GraphQL Modules",
- "description": "GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.",
- "url": "https://graphql-modules.com",
- "npm": "graphql-modules",
- "github": "Urigo/graphql-modules"
- },
- {
- "name": "GraphQL Tools",
- "description": "A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).",
- "url": "https://graphql-tools.com",
- "npm": "graphql-tools",
- "github": "ardatan/graphql-tools"
- },
- {
- "name": "GraphQL Config",
- "description": "One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).",
- "url": "https://graphql-config.com",
- "npm": "graphql-config",
- "github": "kamilkisiela/graphql-config"
- },
- {
- "name": "GraphQL Mesh",
- "description": "GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.",
- "url": "https://graphql-mesh.com",
- "npm": "@graphql-mesh/cli",
- "github": "Urigo/graphql-mesh"
- },
- {
- "name": "GraphQL CLI",
- "description": "A command line tool for common GraphQL development workflows.",
- "url": "https://graphql-cli.com",
- "npm": "graphql-cli",
- "github": "Urigo/graphql-cli"
- },
- {
- "name": "GraphQL Inspector",
- "description": "Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.",
- "url": "https://graphql-inspector.com/",
- "npm": "@graphql-inspector/cli",
- "github": "kamilkisiela/graphql-inspector"
- },
- {
- "name": "GraphQL Scalars",
- "description": "A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.",
- "url": "https://github.com/Urigo/graphql-scalars",
- "npm": "graphql-scalars",
- "github": "Urigo/graphql-scalars"
- },
- {
- "name": "Postgraphile",
- "description": "builds a powerful, extensible and performant GraphQL API from a PostgreSQL schema in seconds; saving you weeks if not months of development time.",
- "url": "https://www.graphile.org/postgraphile",
- "npm": "postgraphile",
- "github": "graphile/postgraphile"
- },
- {
- "name": "SOFA",
- "description": "Generate REST API from your GraphQL API.",
- "url": "https://sofa-api.com/",
- "npm": "sofa-api",
- "github": "Urigo/SOFA"
- },
- {
- "name": "GraphQL-WS",
- "description": "Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client.",
- "url": "https://github.com/enisdenjo/graphql-ws",
- "npm": "graphql-ws",
- "github": "enisdenjo/graphql-ws"
- },
- {
- "name": "GraphQL Live Query",
- "description": "Real-Time with GraphQL for any GraphQL schema or transport.",
- "url": "https://github.com/n1ru4l/graphql-live-query",
- "npm": "@n1ru4l/graphql-live-query",
- "github": "n1ru4l/graphql-live-query"
- }
- ]
- },
- "Julia": {
- "Client": [
- {
- "name": "Diana.jl",
- "description": "A Julia GraphQL server implementation.",
- "url": "https://github.com/codeneomatrix/Diana.jl",
- "github": "codeneomatrix/Diana.jl"
- }
- ]
- },
- "Perl": {
- "Server": [
- {
- "name": "graphql-perl",
- "description": "A Perl port of GraphQL reference implementation",
- "howto": "- [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)\n\n - [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app\n\n - [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL\n\n - [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL\n\n",
- "url": "https://github.com/graphql-perl/graphql-perl",
- "github": "graphql-perl/graphql-perl"
- }
- ]
- },
- "PHP": {
- "Server": [
- {
- "name": "graphql-php",
- "description": "A PHP port of GraphQL reference implementation",
- "url": "https://github.com/webonyx/graphql-php",
- "github": "webonyx/graphql-php"
- },
- {
- "name": "graphql-relay-php",
- "description": "A library to help construct a graphql-php server supporting react-relay.",
- "url": "https://github.com/ivome/graphql-relay-php",
- "github": "ivome/graphql-relay-php"
- },
- {
- "name": "Railt",
- "description": "A PHP GraphQL Framework.",
- "url": "https://github.com/railt/railt",
- "github": "railt/railt"
- },
- {
- "name": "Lighthouse",
- "description": "A GraphQL server for Laravel",
- "url": "https://github.com/nuwave/lighthouse",
- "github": "nuwave/lighthouse"
- },
- {
- "name": "GraphQLBundle",
- "description": "A GraphQL server for Symfony",
- "url": "https://github.com/overblog/GraphQLBundle",
- "github": "overblog/GraphQLBundle"
- },
- {
- "name": "WPGraphQL",
- "description": "A free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site ",
- "github": "wp-graphql/wp-graphql",
- "url": "https://github.com/wp-graphql/wp-graphql"
- },
- {
- "name": "API Platform",
- "description": "API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.",
- "howto": "The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):\n\n```php\nname;\n }\n // ...\n}\n```\nOther GraphQLite features include validation, security, error handling, loading via data-loader pattern...",
- "github": "thecodingmachine/graphqlite",
- "url": "https://graphqlite.thecodingmachine.io"
- },
- {
- "name": "Siler",
- "description": "Siler is a PHP library powered with high-level abstractions to work with GraphQL.",
- "howto": "To run a Siler hello world script:\n```graphql\ntype Query {\n hello: String\n}\n```\n\n```php\n [\n 'hello' => 'world',\n ],\n];\n$schema = Graphqlschema($typeDefs, $resolvers);\n\necho \"Server running at http://127.0.0.1:8080\";\n\nHttpserver(Graphqlpsr7($schema), function (Throwable $err) {\n var_dump($err);\n return Diactorosjson([\n 'error' => true,\n 'message' => $err->getMessage(),\n ]);\n})()->run();\n```\nIt also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.\n",
- "github": "leocavalcante/siler",
- "url": "https://siler.leocavalcante.com/graphql/"
- },
- {
- "name": "GraphQL API for WordPress",
- "description": "A GraphQL server for WordPress",
- "github": "GraphQLAPI/graphql-api-for-wp",
- "url": "https://github.com/GraphQLAPI/graphql-api-for-wp"
- },
- {
- "name": "GraPHPinator",
- "description": "A GraphQL implementation for modern PHP",
- "github": "infinityloop-dev/graphpinator",
- "url": "https://github.com/infinityloop-dev/graphpinator"
- },
- {
- "name": "serge",
- "description": "Use GraphQL to define your Domain Model for CQRS/ES and let serge generate code to handle GraphQL requests.",
- "github": "kepawni/serge",
- "url": "https://github.com/kepawni/serge"
- }
- ]
- },
- "Python": {
- "Server": [
- {
- "name": "Graphene",
- "description": "A Python library for building GraphQL APIs.",
- "howto": "To run a Graphene hello world script:\n\n```bash\npip install graphene\n```\n\nThen run `python hello.py` with this code in `hello.py`:\n\n```python\nimport graphene\n\nclass Query(graphene.ObjectType):\n hello = graphene.String(name=graphene.String(default_value=\"World\"))\n\n def resolve_hello(self, info, name):\n return 'Hello ' + name\n\nschema = graphene.Schema(query=Query)\nresult = schema.execute('{ hello }')\nprint(result.data['hello']) # \"Hello World\"\n```\n\nThere are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.",
- "url": "http://graphene-python.org/",
- "github": "graphql-python/graphene"
- },
- {
- "name": "Ariadne",
- "description": "Ariadne is a Python library for implementing GraphQL servers using schema-first approach. It supports both synchronous and asynchronous query execution, ships with batteries included for common GraphQL server problems like query cost validation or performance tracing and has simple API that is easy to extend or replace.",
- "howto": "Ariadne can be installed with pip:\n\n```bash\npip install ariadne\n```\n\nIt ships with many GraphQL server implementations, enabling easy experimentation:\n\n```python\nfrom ariadne import ObjectType, QueryType, gql, make_executable_schema\nfrom ariadne.asgi import GraphQL\n# Define types using Schema Definition Language (https://graphql.org/learn/schema/)\n# Wrapping string in gql function provides validation and better error traceback\ntype_defs = gql(\"\"\"\n type Query {\n hello: String!\n }\n\"\"\")\n# Bind resolver functions to Query's fields using QueryType\nquery_type = QueryType()\n# Resolvers are simple python functions\n@query_type.field(\"hello\")\ndef resolve_hello(*_):\n return \"Hello world!\"\n# Create executable GraphQL schema\nschema = make_executable_schema(type_defs, query_type)\n# Create an ASGI app using the schema, running in debug mode\napp = GraphQL(schema, debug=True)\n```\n\nAbove server can be ran with uvicorn:\n\n```\npip install uvicorn\nuvicorn example:app\n```",
- "url": "https://ariadnegraphql.org",
- "github": "mirumee/ariadne"
- },
- {
- "name": "Tartiflette",
- "description": "A Python 3.6+ _(asyncio)_ library for building GraphQL APIs.",
- "howto": "To run a tartiflette hello world script:\n```bash\npip install tartiflette\n```\nThen run `python hello.py` with this code in `hello.py`:\n```python\nimport asyncio\nfrom tartiflette import Engine, Resolver\n@Resolver(\"Query.hello\")\nasync def resolver_hello(parent, args, ctx, info):\n return \"hello \" + args[\"name\"]\nasync def run():\n tftt_engine = Engine(\"\"\"\n type Query {\n hello(name: String): String\n }\n \"\"\")\n result = await tftt_engine.execute(\n query='query { hello(name: \"Chuck\") }'\n )\n print(result)\n # {'data': {'hello': 'hello Chuck'}}\nif __name__ == \"__main__\":\n loop = asyncio.get_event_loop()\n loop.run_until_complete(run())\n```\nThere is also a nice [HTTP wrapper](https://github.com/dailymotion/tartiflette-aiohttp).",
- "url": "https://tartiflette.io",
- "github": "tartiflette/tartiflette"
- }
- ],
- "Client": [
- {
- "name": "GQL",
- "description": "A GraphQL client in Python.",
- "url": "https://github.com/graphql-python/gql",
- "github": "graphql-python/gql"
- },
- {
- "name": "python-graphql-client",
- "description": "Simple GraphQL client for Python 2.7+.",
- "github": "prisma-labs/python-graphql-client",
- "url": "https://github.com/prisma/python-graphql-client"
- },
- {
- "name": "sgqlc",
- "description": "A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.",
- "github": "profusion/sgqlc",
- "url": "https://github.com/profusion/sgqlc"
- }
- ]
- },
- "R": {
- "Server": [
- {
- "name": "ghql",
- "description": "General purpose GraphQL R client",
- "github": "ropensci/ghql",
- "url": "https://github.com/ropensci/ghql"
- }
- ]
- },
- "Ruby": {
- "Server": [
- {
- "name": "graphql-ruby",
- "description": "A Ruby library for building GraphQL APIs.",
- "howto": "To run a hello world script with `graphql-ruby`:\n```bash\ngem install graphql\n```\n\nThen run `ruby hello.rb` with this code in `hello.rb`:\n\n```ruby\nrequire 'graphql'\n\nclass QueryType < GraphQL::Schema::Object\n graphql_name 'Query'\n field :hello do\n type types.String\n resolve -> (obj, args, ctx) { 'Hello world!' }\n end\nend\n\nclass Schema < GraphQL::Schema\n query QueryType\nend\n\nputs Schema.execute('{ hello }').to_json\n```\nThere are also nice bindings for Relay and Rails.",
- "url": "https://github.com/rmosolgo/graphql-ruby",
- "gem": "graphql",
- "github": "rmosolgo/graphql-ruby"
- },
- {
- "name": "Agoo",
- "description": "A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.",
- "howto": "```ruby\nrequire 'agoo'\n\nclass Query\n def hello\n 'hello'\n end\nend\n\nclass Schema\n attr_reader :query\n\n def initialize\n @query = Query.new()\n end\nend\n\nAgoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql')\nAgoo::Server.start()\nAgoo::GraphQL.schema(Schema.new) {\n Agoo::GraphQL.load(%^type Query { hello: String }^)\n}\nsleep\n\n# To run this GraphQL example type the following then go to a browser and enter\n# a URL of localhost:6464/graphql?query={hello}\n#\n# ruby hello.rb\n```",
- "gem": "agoo",
- "github": "ohler55/agoo"
- }
- ]
- },
- "Rust": {
- "Server": [
- {
- "name": "graphql-rust/juniper",
- "description": "GraphQL server library for Rust",
- "github": "graphql-rust/juniper",
- "url": "https://github.com/graphql-rust/juniper"
- },
- {
- "name": "Async-graphql",
- "description": "Async-graphql is a high-performance server-side library that supports all GraphQL specifications.",
- "howto": "```rust\n use async_graphql::*;\n struct Query;\n #[Object]\n impl Query {\n /// Returns the sum of a and b\n async fn add(&self, a: i32, b: i32) -> i32 {\n a + b\n }\n }\n ```",
- "github": "async-graphql/async-graphql",
- "url": "https://github.com/async-graphql/async-graphql"
- }
- ]
- },
- "Scala": {
- "Server": [
- {
- "name": "Sangria",
- "description": "A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).",
- "howto": "An example of a hello world GraphQL schema and query with `sangria`:\n```scala\nimport sangria.schema._\nimport sangria.execution._\nimport sangria.macros._\n\nval QueryType = ObjectType(\"Query\", fields[Unit, Unit](\n Field(\"hello\", StringType, resolve = _ ⇒ \"Hello world!\")\n))\n\nval schema = Schema(QueryType)\n\nval query = graphql\"{ hello }\"\n\nExecutor.execute(schema, query) map println\n```",
- "url": "http://sangria-graphql.org/",
- "github": "sangria-graphql/sangria"
- }
- ]
- },
- "OCaml / Reason": {
- "Server": [
- {
- "name": "ocaml-graphql-server",
- "description": "GraphQL server library for OCaml and Reason",
- "url": "https://github.com/andreas/ocaml-graphql-server",
- "github": "andreas/ocaml-graphql-server"
- }
- ]
- },
- "Swift / Objective-C iOS": {
- "Server": [
- {
- "name": "Graphiti",
- "description": "Swift library for building GraphQL schemas/types fast, safely and easily.",
- "url": "https://github.com/GraphQLSwift/Graphiti",
- "github": "GraphQLSwift/Graphiti"
- },
- {
- "name": "GraphZahl",
- "description": "Swift library for writing Declarative, Type-Safe GraphQL APIs with Zero Boilerplate.",
- "url": "https://github.com/nerdsupremacist/GraphZahl",
- "github": "nerdsupremacist/GraphZahl"
- },
- {
- "name": "Caliban",
- "description": "Caliban is a purely functional library for building GraphQL servers and clients in Scala",
- "howto": "An example of a GraphQL schema and query with `caliban`:\n```scala\ncase class Character(name: String, age: Int)\ndef getCharacters(): List[Character] = ???\ndef getCharacter(name: String): Option[Character] = ???\n// schema\ncase class CharacterName(name: String)\ncase class Queries(characters: List[Character],\n character: CharacterName => Option[Character])\n// resolver\nval queries = Queries(getCharacters, args => getCharacter(args.name))\nimport caliban.GraphQL.graphQL\nimport caliban.RootResolver\nval api = graphQL(RootResolver(queries))\nfor {\n interpreter <- api.interpreter\n} yield interpreter\ncase class GraphQLResponse[+E](data: ResponseValue, errors: List[E])\nval query = \"\"\"\n {\n characters {\n name\n }\n }\"\"\"\nfor {\n result <- interpreter.execute(query)\n _ <- zio.console.putStrLn(result.data.toString)\n} yield ()\n```",
- "url": "https://ghostdogpr.github.io/caliban/",
- "github": "ghostdogpr/caliban"
- }
- ],
- "Client": [
- {
- "name": "Apollo iOS",
- "description": "A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.",
- "url": "https://www.apollographql.com/docs/ios/",
- "github": "apollographql/apollo-ios"
- },
- {
- "name": "GraphQL iOS",
- "description": "An Objective-C GraphQL client for iOS.",
- "url": "https://github.com/funcompany/graphql-ios",
- "github": "funcompany/graphql-ios"
- },
- {
- "name": "Graphaello",
- "description": "A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo",
- "github": "nerdsupremacist/Graphaello",
- "url": "https://github.com/nerdsupremacist/Graphaello"
- },
- {
- "name": "Caliban",
- "description": "Functional GraphQL library for Scala, with client code generation and type-safe queries.",
- "url": "https://ghostdogpr.github.io/caliban/",
- "github": "ghostdogpr/caliban"
- }
- ]
- }
- },
- "Tools": [
- {
- "name": "quicktype",
- "description": "Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.",
- "url": "https://quicktype.io/",
- "npm": "quicktype",
- "github": "quicktype/quicktype"
- },
- {
- "name": "GraphQL Code Generator",
- "description": "GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.",
- "url": "https://graphql-code-generator.com",
- "npm": "@graphql-codegen/cli",
- "github": "dotansimha/graphql-code-generator"
- }
- ],
- "Services": [
- {
- "name": "Apollo Graph Manager",
- "description": "A cloud service for monitoring the performance and usage of your GraphQL backend.",
- "url": "https://engine.apollographql.com"
- },
- {
- "name": "GraphCMS",
- "description": "A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.",
- "url": "https://graphcms.com/"
- },
- {
- "name": "Prisma",
- "description": "A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.",
- "github": "prisma/prisma",
- "url": "https://www.prisma.io"
- },
- {
- "name": "Tipe",
- "description": "A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.",
- "github": "tipeio/tipe",
- "url": "https://tipe.io"
- },
- {
- "name": "AWS AppSync",
- "description": "Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls.",
- "url": "https://aws.amazon.com/appsync/"
- },
- {
- "name": "Elide",
- "description": "A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.",
- "url": "https://elide.io"
- },
- {
- "name": "Hasura",
- "description": "Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.",
- "github": "hasura/graphql-engine",
- "url": "https://hasura.io"
- },
- {
- "name": "FaunaDB",
- "description": "Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.",
- "url": "https://docs.fauna.com/fauna/current/graphql"
- },
- {
- "name": "LexasCMS",
- "description": "A headless CMS (Content Management System) that combines powerful content personalisation and scheduling capabilities with a modern content editing experience and a blazing fast GraphQL/REST content delivery API.",
- "url": "https://www.lexascms.com"
- },
- {
- "name": "Moesif API Analytics",
- "description": "A GraphQL analaytics and monitoring Service to find functional and performance issues.",
- "url": "https://www.moesif.com/features/graphql-analytics"
- },
- {
- "name": "Postman",
- "description": "An HTTP Client that supports editing GraphQL queries.",
- "url": "https://learning.postman.com/docs/sending-requests/supported-api-frameworks/graphql/"
- },
- {
- "name": "Altair",
- "description": "An alternative to Postman that supports editing GraphQL queries directly and autoload your GraphQL schema.",
- "url": "https://altair.sirmuel.design/"
- }
- ],
- "More Stuff": [
- {
- "name": "awesome-graphql",
- "description": "A fantastic community maintained collection of libraries, resources, and more.",
- "github": "chentsulin/awesome-graphql",
- "url": "https://github.com/chentsulin/awesome-graphql"
- }
- ]
-}
diff --git a/gatsby-node.js b/gatsby-node.js
index 298f5c8946..4b08795d35 100644
--- a/gatsby-node.js
+++ b/gatsby-node.js
@@ -1,6 +1,9 @@
const path = require("path")
-const { readFileSync } = require("fs")
const sortLibs = require("./scripts/sort-libraries")
+const globby = require('globby');
+const frontmatterParser = require('parser-front-matter');
+const { readFile } = require("fs-extra");
+const { promisify } = require('util');
exports.onCreatePage = async ({ page, actions }) => {
const { createPage, deletePage } = actions
@@ -10,27 +13,83 @@ exports.onCreatePage = async ({ page, actions }) => {
sourcePath: path.relative(__dirname, page.componentPath),
}
if (page.path === "/code" || page.path === "/code/") {
- const codeData = JSON.parse(readFileSync("./data/code.json", "utf8"));
- const languageList = [];
- let sortedTools = [];
+ const markdownFilePaths = await globby('src/content/code/**/*.md');
+ const codeData = {}
+ const slugMap = require('./src/content/code/slug-map.json');
+ const parse$ = promisify(frontmatterParser.parse);
+ await Promise.all(markdownFilePaths.map(async markdownFilePath => {
+
+ const markdownFileContent = await readFile(markdownFilePath, "utf-8")
+ let {
+ data: { name, description, url, github, npm, gem },
+ content: howto,
+ } = await parse$(markdownFileContent, undefined)
+ howto = howto.trim();
+ const pathArr = markdownFilePath.split("/")
+ if (markdownFilePath.includes("language-support")) {
+ const languageSupportDirIndex = pathArr.indexOf("language-support")
+ const languageNameSlugIndex = languageSupportDirIndex + 1
+ const languageNameSlug = pathArr[languageNameSlugIndex]
+ const languageName = slugMap[languageNameSlug]
+ codeData.Languages = codeData.Languages || {}
+ codeData.Languages[languageName] =
+ codeData.Languages[languageName] || {}
+
+ const categoryNameSlugIndex = languageSupportDirIndex + 2
+ const categoryNameSlug = pathArr[categoryNameSlugIndex]
+ const categoryName = slugMap[categoryNameSlug]
+ codeData.Languages[languageName][categoryName] =
+ codeData.Languages[languageName][categoryName] || []
+ codeData.Languages[languageName][categoryName].push({
+ name,
+ description,
+ howto,
+ url,
+ github,
+ npm,
+ gem,
+ sourcePath: markdownFilePath,
+ })
+ } else {
+ const codeDirIndex = pathArr.indexOf("code")
+ const categoryNameSlugIndex = codeDirIndex + 1
+ const categoryNameSlug = pathArr[categoryNameSlugIndex]
+ const categoryName = slugMap[categoryNameSlug]
+ codeData[categoryName] = codeData[categoryName] || []
+ codeData[categoryName].push({
+ name,
+ description,
+ howto,
+ url,
+ github,
+ npm,
+ gem,
+ sourcePath: markdownFilePath,
+ })
+ }
+ }))
+ const languageList = []
+ let sortedTools = []
await Promise.all([
- Promise.all(Object.keys(codeData.Libraries).map(async languageName => {
- const libraryCategoryMap = codeData.Libraries[languageName];
- let languageTotalStars = 0;
- await Promise.all(
- Object.keys(libraryCategoryMap).map(async libraryCategoryName => {
- const libraries = libraryCategoryMap[libraryCategoryName]
- const { sortedLibs, totalStars } = await sortLibs(libraries)
- libraryCategoryMap[libraryCategoryName] = sortedLibs;
- languageTotalStars += totalStars || 0
+ Promise.all(
+ Object.keys(codeData.Languages).map(async languageName => {
+ const libraryCategoryMap = codeData.Languages[languageName]
+ let languageTotalStars = 0
+ await Promise.all(
+ Object.keys(libraryCategoryMap).map(async libraryCategoryName => {
+ const libraries = libraryCategoryMap[libraryCategoryName]
+ const { sortedLibs, totalStars } = await sortLibs(libraries)
+ libraryCategoryMap[libraryCategoryName] = sortedLibs
+ languageTotalStars += totalStars || 0
+ })
+ )
+ languageList.push({
+ name: languageName,
+ totalStars: languageTotalStars,
+ categoryMap: libraryCategoryMap,
})
- )
- languageList.push({
- name: languageName,
- totalStars: languageTotalStars,
- categoryMap: libraryCategoryMap,
})
- })),
+ ),
sortLibs(codeData.Tools).then(({ sortedLibs }) => {
sortedTools = sortedLibs
}),
@@ -41,7 +100,7 @@ exports.onCreatePage = async ({ page, actions }) => {
otherLibraries: {
Services: codeData.Services,
Tools: sortedTools,
- 'More Stuff': codeData['More Stuff']
+ "More Stuff": codeData["More Stuff"],
},
languageList: languageList.sort((a, b) => {
if (a.totalStars > b.totalStars) {
@@ -111,7 +170,10 @@ exports.createPages = async ({ graphql, actions }) => {
parent: { relativeDirectory, sourceInstanceName },
} = node
- if (sourceInstanceName !== "content") {
+ if (
+ sourceInstanceName !== "content" ||
+ relativeDirectory.includes("code")
+ ) {
return
}
@@ -223,7 +285,7 @@ exports.createPages = async ({ graphql, actions }) => {
categoriesMap[currentCategory.name] = currentCategory
}
- sideBardata[folder] = Object.values(categoriesMap);
+ sideBardata[folder] = Object.values(categoriesMap)
})
)
diff --git a/package.json b/package.json
index 1aa252428f..05aec6b240 100644
--- a/package.json
+++ b/package.json
@@ -24,9 +24,11 @@
"gatsby-plugin-webfonts": "1.1.3",
"gatsby-source-filesystem": "2.4.0",
"gatsby-transformer-remark": "2.9.0",
+ "globby": "11.0.1",
"graphql": "15.4.0",
"marked": "1.2.2",
"numbro": "2.3.2",
+ "parser-front-matter": "1.6.4",
"prism-react-renderer": "1.1.1",
"prismjs": "1.22.0",
"react": "17.0.1",
diff --git a/src/content/code/language-support/c-c/tools/libgraphqlparser.md b/src/content/code/language-support/c-c/tools/libgraphqlparser.md
new file mode 100644
index 0000000000..e3681c82fa
--- /dev/null
+++ b/src/content/code/language-support/c-c/tools/libgraphqlparser.md
@@ -0,0 +1,8 @@
+---
+name: libgraphqlparser
+description: A GraphQL query language parser in C++ with C and C++ APIs.
+url: https://github.com/graphql/libgraphqlparser
+github: graphql/libgraphqlparser
+---
+
+
diff --git a/src/content/code/language-support/c-net/client/graphql-client.md b/src/content/code/language-support/c-net/client/graphql-client.md
new file mode 100644
index 0000000000..df6e016432
--- /dev/null
+++ b/src/content/code/language-support/c-net/client/graphql-client.md
@@ -0,0 +1,8 @@
+---
+name: GraphQL.Client
+description: A GraphQL Client for .NET.
+url: https://github.com/graphql-dotnet/graphql-client
+github: graphql-dotnet/graphql-client
+---
+
+
diff --git a/src/content/code/language-support/c-net/client/graphql-net-client.md b/src/content/code/language-support/c-net/client/graphql-net-client.md
new file mode 100644
index 0000000000..5042b5859c
--- /dev/null
+++ b/src/content/code/language-support/c-net/client/graphql-net-client.md
@@ -0,0 +1,8 @@
+---
+name: graphql-net-client
+description: Basic example GraphQL client for .NET.
+url: https://github.com/bkniffler/graphql-net-client
+github: bkniffler/graphql-net-client
+---
+
+
diff --git a/src/content/code/language-support/c-net/client/sahb-graphqlclient.md b/src/content/code/language-support/c-net/client/sahb-graphqlclient.md
new file mode 100644
index 0000000000..2fa58640f7
--- /dev/null
+++ b/src/content/code/language-support/c-net/client/sahb-graphqlclient.md
@@ -0,0 +1,8 @@
+---
+name: SAHB.GraphQLClient
+description: GraphQL client which supports generating queries from C# classes
+url: https://github.com/sahb1239/SAHB.GraphQLClient
+github: sahb1239/SAHB.GraphQLClient
+---
+
+
diff --git a/src/content/code/language-support/c-net/server/entity-graphql.md b/src/content/code/language-support/c-net/server/entity-graphql.md
new file mode 100644
index 0000000000..be3cc954b3
--- /dev/null
+++ b/src/content/code/language-support/c-net/server/entity-graphql.md
@@ -0,0 +1,8 @@
+---
+name: Entity GraphQL
+description: .NET Core GraphQL library. Compiles to IQueryable to easily expose a schema from an existing data model (E.g. from an Entity Framework data model)
+url: https://github.com/lukemurray/EntityGraphQL
+github: lukemurray/EntityGraphQL
+---
+
+
diff --git a/src/content/code/language-support/c-net/server/graphql-dotnet.md b/src/content/code/language-support/c-net/server/graphql-dotnet.md
new file mode 100644
index 0000000000..6ac2e840bb
--- /dev/null
+++ b/src/content/code/language-support/c-net/server/graphql-dotnet.md
@@ -0,0 +1,34 @@
+---
+name: graphql-dotnet
+description: GraphQL for .NET
+url: https://github.com/graphql-dotnet/graphql-dotnet
+github: graphql-dotnet/graphql-dotnet
+---
+
+```csharp
+using System;
+using System.Threading.Tasks;
+using GraphQL;
+using GraphQL.Types;
+using GraphQL.SystemTextJson; // First add PackageReference to GraphQL.SystemTextJson
+
+public class Program
+{
+ public static async Task Main(string[] args)
+ {
+ var schema = Schema.For(@"
+ type Query {
+ hello: String
+ }
+ ");
+
+ var json = await schema.ExecuteAsync(_ =>
+ {
+ _.Query = "{ hello }";
+ _.Root = new { Hello = "Hello World!" };
+ });
+
+ Console.WriteLine(json);
+ }
+}
+```
diff --git a/src/content/code/language-support/c-net/server/graphql-net.md b/src/content/code/language-support/c-net/server/graphql-net.md
new file mode 100644
index 0000000000..9c5d76e671
--- /dev/null
+++ b/src/content/code/language-support/c-net/server/graphql-net.md
@@ -0,0 +1,8 @@
+---
+name: graphql-net
+description: Convert GraphQL to IQueryable
+url: https://github.com/ckimes89/graphql-net
+github: chkimes/graphql-net
+---
+
+
diff --git a/src/content/code/language-support/c-net/server/hot-chocolate.md b/src/content/code/language-support/c-net/server/hot-chocolate.md
new file mode 100644
index 0000000000..e762f13acc
--- /dev/null
+++ b/src/content/code/language-support/c-net/server/hot-chocolate.md
@@ -0,0 +1,8 @@
+---
+name: Hot Chocolate
+description: GraphQL Server for .NET core and .NET classic
+url: https://github.com/ChilliCream/hotchocolate
+github: ChilliCream/hotchocolate
+---
+
+
diff --git a/src/content/code/language-support/clojure/client/regraph.md b/src/content/code/language-support/clojure/client/regraph.md
new file mode 100644
index 0000000000..2c8b73838a
--- /dev/null
+++ b/src/content/code/language-support/clojure/client/regraph.md
@@ -0,0 +1,8 @@
+---
+name: regraph
+description: A GraphQL client implemented in Clojurescript with support for websockets.
+url: https://github.com/oliyh/re-graph/
+github: oliyh/re-graph
+---
+
+
diff --git a/src/content/code/language-support/clojure/server/alumbra.md b/src/content/code/language-support/clojure/server/alumbra.md
new file mode 100644
index 0000000000..c652f0769a
--- /dev/null
+++ b/src/content/code/language-support/clojure/server/alumbra.md
@@ -0,0 +1,41 @@
+---
+name: alumbra
+description: A set of reusable GraphQL components for Clojure conforming to the data structures given in [alumbra.spec](https://github.com/alumbra/alumbra.spec).
+url: https://github.com/alumbra/alumbra
+github: alumbra/alumbra
+---
+
+```clojure
+(require '[alumbra.core :as alumbra]
+ '[claro.data :as data])
+
+(def schema
+ "type Person { name: String!, friends: [Person!]! }
+ type QueryRoot { person(id: ID!): Person, me: Person! }
+ schema { query: QueryRoot }")
+
+(defrecord Person [id]
+ data/Resolvable
+ (resolve! [_ _]
+ {:name (str "Person #" id)
+ :friends (map ->Person (range (inc id) (+ id 3)))}))
+
+(def QueryRoot
+ {:person (map->Person {})
+ :me (map->Person {:id 0})})
+
+(def app
+ (alumbra/handler
+ {:schema schema
+ :query QueryRoot}))
+
+(defonce my-graphql-server
+ (aleph.http/start-server #'app {:port 3000}))
+```
+
+```bash
+$ curl -XPOST "http://0:3000" -H'Content-Type: application/json' -d'{
+ "query": "{ me { name, friends { name } } }"
+}'
+{"data":{"me":{"name":"Person #0","friends":[{"name":"Person #1"},{"name":"Person #2"}]}}}
+```
diff --git a/src/content/code/language-support/clojure/server/graphql-clj.md b/src/content/code/language-support/clojure/server/graphql-clj.md
new file mode 100644
index 0000000000..e7baeea859
--- /dev/null
+++ b/src/content/code/language-support/clojure/server/graphql-clj.md
@@ -0,0 +1,23 @@
+---
+name: graphql-clj
+description: A Clojure library that provides a GraphQL implementation.
+url: https://github.com/tendant/graphql-clj
+github: tendant/graphql-clj
+---
+
+Code that executes a hello world GraphQL query with `graphql-clj`:
+```clojure
+
+(def schema "type QueryRoot {
+ hello: String
+ }")
+
+(defn resolver-fn [type-name field-name]
+ (get-in {"QueryRoot" {"hello" (fn [context parent & rest]
+ "Hello world!")}}
+ [type-name field-name]))
+
+(require '[graphql-clj.executor :as executor])
+
+(executor/execute nil schema resolver-fn "{ hello }")
+```
diff --git a/src/content/code/language-support/clojure/server/lacinia.md b/src/content/code/language-support/clojure/server/lacinia.md
new file mode 100644
index 0000000000..0bb3f22aed
--- /dev/null
+++ b/src/content/code/language-support/clojure/server/lacinia.md
@@ -0,0 +1,8 @@
+---
+name: lacinia
+description: A full implementation of the GraphQL specification that aims to maintain external compliance with the specification.
+url: https://github.com/walmartlabs/lacinia
+github: walmartlabs/lacinia
+---
+
+
diff --git a/src/content/code/language-support/d/server/graphqld.md b/src/content/code/language-support/d/server/graphqld.md
new file mode 100644
index 0000000000..da50567414
--- /dev/null
+++ b/src/content/code/language-support/d/server/graphqld.md
@@ -0,0 +1,8 @@
+---
+name: graphqld
+description: A GraphQL implementaiton for the D Programming Language.
+url: https://github.com/burner/graphqld
+github: burner/graphqld
+---
+
+
diff --git a/src/content/code/language-support/elixir/client/common-graphql-client.md b/src/content/code/language-support/elixir/client/common-graphql-client.md
new file mode 100644
index 0000000000..ec360e651f
--- /dev/null
+++ b/src/content/code/language-support/elixir/client/common-graphql-client.md
@@ -0,0 +1,8 @@
+---
+name: common_graphql_client
+description: Elixir GraphQL Client with HTTP and WebSocket support
+url: https://github.com/annkissam/common_graphql_client
+github: annkissam/common_graphql_client
+---
+
+
diff --git a/src/content/code/language-support/elixir/client/neuron.md b/src/content/code/language-support/elixir/client/neuron.md
new file mode 100644
index 0000000000..c77f230742
--- /dev/null
+++ b/src/content/code/language-support/elixir/client/neuron.md
@@ -0,0 +1,8 @@
+---
+name: Neuron
+description: A GraphQL client for Elixir
+url: https://github.com/uesteibar/neuron
+github: uesteibar/neuron
+---
+
+
diff --git a/src/content/code/language-support/elixir/server/absinthe.md b/src/content/code/language-support/elixir/server/absinthe.md
new file mode 100644
index 0000000000..bc657a90b8
--- /dev/null
+++ b/src/content/code/language-support/elixir/server/absinthe.md
@@ -0,0 +1,8 @@
+---
+name: absinthe
+description: GraphQL implementation for Elixir.
+url: https://github.com/absinthe-graphql/absinthe
+github: absinthe-graphql/absinthe
+---
+
+
diff --git a/src/content/code/language-support/elixir/server/graphql-elixir.md b/src/content/code/language-support/elixir/server/graphql-elixir.md
new file mode 100644
index 0000000000..4ec2bf84b1
--- /dev/null
+++ b/src/content/code/language-support/elixir/server/graphql-elixir.md
@@ -0,0 +1,8 @@
+---
+name: graphql-elixir
+description: An Elixir implementation of Facebook's GraphQL.
+url: https://github.com/graphql-elixir/graphql
+github: graphql-elixir/graphql
+---
+
+
diff --git a/src/content/code/language-support/elm/client/dillonkearns-elm-graphql.md b/src/content/code/language-support/elm/client/dillonkearns-elm-graphql.md
new file mode 100644
index 0000000000..0850dba825
--- /dev/null
+++ b/src/content/code/language-support/elm/client/dillonkearns-elm-graphql.md
@@ -0,0 +1,8 @@
+---
+name: dillonkearns/elm-graphql
+description: Library and command-line code generator to create type-safe Elm code for a GraphQL endpoint.
+url: https://github.com/dillonkearns/elm-graphql
+github: dillonkearns/elm-graphql
+---
+
+
diff --git a/src/content/code/language-support/erlang/server/graphql-erlang.md b/src/content/code/language-support/erlang/server/graphql-erlang.md
new file mode 100644
index 0000000000..9bb34ad549
--- /dev/null
+++ b/src/content/code/language-support/erlang/server/graphql-erlang.md
@@ -0,0 +1,8 @@
+---
+name: graphql-erlang
+description: GraphQL implementation in Erlang.
+url: https://github.com/shopgun/graphql-erlang
+github: jlouis/graphql-erlang
+---
+
+
diff --git a/src/content/code/language-support/flutter/client/graphql.md b/src/content/code/language-support/flutter/client/graphql.md
new file mode 100644
index 0000000000..fa0eb8e3aa
--- /dev/null
+++ b/src/content/code/language-support/flutter/client/graphql.md
@@ -0,0 +1,8 @@
+---
+name: graphql
+description: A GraphQL client implementation in Flutter.
+url: https://github.com/zino-app/graphql-flutter#readme
+github: zino-app/graphql-flutter
+---
+
+
diff --git a/src/content/code/language-support/go/client/graphql.md b/src/content/code/language-support/go/client/graphql.md
new file mode 100644
index 0000000000..3e778eac5d
--- /dev/null
+++ b/src/content/code/language-support/go/client/graphql.md
@@ -0,0 +1,8 @@
+---
+name: graphql
+description: A GraphQL client implementation in Go.
+url: https://github.com/shurcooL/graphql#readme
+github: shurcooL/graphql
+---
+
+
diff --git a/src/content/code/language-support/go/client/machinebox-graphql.md b/src/content/code/language-support/go/client/machinebox-graphql.md
new file mode 100644
index 0000000000..a2f35489d8
--- /dev/null
+++ b/src/content/code/language-support/go/client/machinebox-graphql.md
@@ -0,0 +1,8 @@
+---
+name: machinebox/graphql
+description: An elegant low-level HTTP client for GraphQL.
+url: https://github.com/machinebox/graphql
+github: machinebox/graphql
+---
+
+
diff --git a/src/content/code/language-support/go/server/99designs-gqlgen.md b/src/content/code/language-support/go/server/99designs-gqlgen.md
new file mode 100644
index 0000000000..80b2f9d0f2
--- /dev/null
+++ b/src/content/code/language-support/go/server/99designs-gqlgen.md
@@ -0,0 +1,8 @@
+---
+name: 99designs/gqlgen
+description: Go generate based graphql server library.
+url: https://github.com/99designs/gqlgen
+github: 99designs/gqlgen
+---
+
+
diff --git a/src/content/code/language-support/go/server/appointy-jaal.md b/src/content/code/language-support/go/server/appointy-jaal.md
new file mode 100644
index 0000000000..28095e284e
--- /dev/null
+++ b/src/content/code/language-support/go/server/appointy-jaal.md
@@ -0,0 +1,8 @@
+---
+name: appointy/jaal
+description: Develop spec compliant GraphQL servers in Go.
+url: https://github.com/appointy/jaal
+github: appointy/jaal
+---
+
+
diff --git a/src/content/code/language-support/go/server/graph-gophers-graphql-go.md b/src/content/code/language-support/go/server/graph-gophers-graphql-go.md
new file mode 100644
index 0000000000..2bf5eaad94
--- /dev/null
+++ b/src/content/code/language-support/go/server/graph-gophers-graphql-go.md
@@ -0,0 +1,8 @@
+---
+name: graph-gophers/graphql-go
+description: An active implementation of GraphQL in Golang (was https://github.com/neelance/graphql-go).
+url: https://github.com/graph-gophers/graphql-go
+github: graph-gophers/graphql-go
+---
+
+
diff --git a/src/content/code/language-support/go/server/graphql-go.md b/src/content/code/language-support/go/server/graphql-go.md
new file mode 100644
index 0000000000..6ef7da936f
--- /dev/null
+++ b/src/content/code/language-support/go/server/graphql-go.md
@@ -0,0 +1,8 @@
+---
+name: graphql-go
+description: An implementation of GraphQL for Go / Golang.
+url: https://github.com/graphql-go/graphql
+github: graphql-go/graphql
+---
+
+
diff --git a/src/content/code/language-support/go/server/graphql-relay-go.md b/src/content/code/language-support/go/server/graphql-relay-go.md
new file mode 100644
index 0000000000..423b01719d
--- /dev/null
+++ b/src/content/code/language-support/go/server/graphql-relay-go.md
@@ -0,0 +1,8 @@
+---
+name: graphql-relay-go
+description: A Go/Golang library to help construct a graphql-go server supporting react-relay.
+url: https://github.com/graphql-go/relay
+github: graphql-go/relay
+---
+
+
diff --git a/src/content/code/language-support/go/server/samsarahq-thunder.md b/src/content/code/language-support/go/server/samsarahq-thunder.md
new file mode 100644
index 0000000000..370cd634e2
--- /dev/null
+++ b/src/content/code/language-support/go/server/samsarahq-thunder.md
@@ -0,0 +1,8 @@
+---
+name: samsarahq/thunder
+description: A GraphQL implementation with easy schema building, live queries, and batching.
+url: https://github.com/samsarahq/thunder
+github: samsarahq/thunder
+---
+
+
diff --git a/src/content/code/language-support/go/tools/super-graph.md b/src/content/code/language-support/go/tools/super-graph.md
new file mode 100644
index 0000000000..404e585991
--- /dev/null
+++ b/src/content/code/language-support/go/tools/super-graph.md
@@ -0,0 +1,8 @@
+---
+name: super-graph
+description: An instant GraphQL to SQL compiler. Use as a standalone service or a Go library
+url: https://github.com/dosco/super-graph
+github: dosco/super-graph
+---
+
+
diff --git a/src/content/code/language-support/groovy/server/gorm-graphql.md b/src/content/code/language-support/groovy/server/gorm-graphql.md
new file mode 100644
index 0000000000..a8aaae05fd
--- /dev/null
+++ b/src/content/code/language-support/groovy/server/gorm-graphql.md
@@ -0,0 +1,21 @@
+---
+name: gorm-graphql
+description: undefined
+url: https://github.com/grails/gorm-graphql/
+github: grails/gorm-graphql
+---
+
+**Core Library** - The GORM GraphQL library provides functionality to generate a GraphQL schema based on your GORM entities. In addition to mapping domain classes to a GraphQL schema, the core library also provides default implementations of "data fetchers" to query, update, and delete data through executions of the schema.
+
+**Grails Plugin** - In a addition to the Core Library, the GORM GraphQL Grails Plugin:
+
+- Provides a controller to receive and respond to GraphQL requests through HTTP, based on their guidelines.
+
+- Generates the schema at startup with spring bean configuration to make it easy to extend.
+
+- Includes a [GraphiQL](https://github.com/graphql/graphiql) browser enabled by default in development. The browser is accessible at /graphql/browser.
+
+- Overrides the default data binder to use the data binding provided by Grails
+- Provides a [trait](https://grails.github.io/gorm-graphql/latest/api/org/grails/gorm/graphql/plugin/testing/GraphQLSpec.html) to make integration testing of your GraphQL endpoints easier
+
+See [the documentation](https://grails.github.io/gorm-graphql/latest/guide/index.html) for more information.
diff --git a/src/content/code/language-support/groovy/server/gql.md b/src/content/code/language-support/groovy/server/gql.md
new file mode 100644
index 0000000000..fa32e99e5a
--- /dev/null
+++ b/src/content/code/language-support/groovy/server/gql.md
@@ -0,0 +1,8 @@
+---
+name: GQL
+description: GQL is a Groove library for GraphQL
+url: https://grooviter.github.io/gql/
+github: grooviter/gql
+---
+
+
diff --git a/src/content/code/language-support/haskell/client/morpheus-graphql-client.md b/src/content/code/language-support/haskell/client/morpheus-graphql-client.md
new file mode 100644
index 0000000000..cec77a5e8e
--- /dev/null
+++ b/src/content/code/language-support/haskell/client/morpheus-graphql-client.md
@@ -0,0 +1,8 @@
+---
+name: morpheus-graphql-client
+description: A strongly-typed GraphQL client implementation in Haksell.
+url: https://github.com/morpheusgraphql/morpheus-graphql
+github: morpheusgraphql/morpheus-graphql
+---
+
+
diff --git a/src/content/code/language-support/haskell/server/morpheus-graphql.md b/src/content/code/language-support/haskell/server/morpheus-graphql.md
new file mode 100644
index 0000000000..a53e7216ea
--- /dev/null
+++ b/src/content/code/language-support/haskell/server/morpheus-graphql.md
@@ -0,0 +1,61 @@
+---
+name: Morpheus GraphQL
+description: A Haskell library for building GraphQL APIs.
+url: https://github.com/morpheusgraphql/morpheus-graphql
+github: morpheusgraphql/morpheus-graphql
+---
+
+Hello world example with `morpheus-graphql`:
+
+```graphql
+# schema.gql
+"""
+A supernatural being considered divine and sacred
+"""
+type Deity {
+ name: String!
+ power: String @deprecated(reason: "no more supported")
+}
+type Query {
+ deity(name: String! = "Morpheus"): Deity!
+}
+```
+
+
+```haskell
+{-# LANGUAGE DeriveGeneric #-}
+{-# LANGUAGE DuplicateRecordFields #-}
+{-# LANGUAGE FlexibleContexts #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE MultiParamTypeClasses #-}
+{-# LANGUAGE NamedFieldPuns #-}
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TemplateHaskell #-}
+{-# LANGUAGE TypeFamilies #-}
+module API (api) where
+import Data.ByteString.Lazy.Char8 (ByteString)
+import Data.Morpheus (interpreter)
+import Data.Morpheus.Document (importGQLDocument)
+import Data.Morpheus.Types (RootResolver (..), Undefined (..))
+import Data.Text (Text)
+importGQLDocument "schema.gql"
+rootResolver :: RootResolver IO () Query Undefined Undefined
+rootResolver =
+ RootResolver
+ { queryResolver = Query {deity},
+ mutationResolver = Undefined,
+ subscriptionResolver = Undefined
+ }
+ where
+ deity DeityArgs {name} =
+ pure
+ Deity
+ { name = pure name,
+ power = pure (Just "Shapeshifting")
+ }
+api :: ByteString -> IO ByteString
+api = interpreter rootResolver
+```
+
+See [morpheus-graphql-examples](https://github.com/morpheusgraphql/morpheus-graphql) for more sophisticated APIs.
diff --git a/src/content/code/language-support/java-kotlin-android/client/apollo-android.md b/src/content/code/language-support/java-kotlin-android/client/apollo-android.md
new file mode 100644
index 0000000000..d4e6fc704e
--- /dev/null
+++ b/src/content/code/language-support/java-kotlin-android/client/apollo-android.md
@@ -0,0 +1,8 @@
+---
+name: Apollo Android
+description: A strongly-typed, caching GraphQL client for Android, written in Java.
+url: https://github.com/apollographql/apollo-android
+github: apollographql/apollo-android
+---
+
+
diff --git a/src/content/code/language-support/java-kotlin-android/client/nodes.md b/src/content/code/language-support/java-kotlin-android/client/nodes.md
new file mode 100644
index 0000000000..2840e6a29a
--- /dev/null
+++ b/src/content/code/language-support/java-kotlin-android/client/nodes.md
@@ -0,0 +1,8 @@
+---
+name: Nodes
+description: A GraphQL JVM Client designed for constructing queries from standard model definitions. By American Express.
+url: https://github.com/americanexpress/nodes
+github: americanexpress/nodes
+---
+
+
diff --git a/src/content/code/language-support/java-kotlin-android/server/graphql-java.md b/src/content/code/language-support/java-kotlin-android/server/graphql-java.md
new file mode 100644
index 0000000000..d01ea20a88
--- /dev/null
+++ b/src/content/code/language-support/java-kotlin-android/server/graphql-java.md
@@ -0,0 +1,47 @@
+---
+name: graphql-java
+description: A Java library for building GraphQL APIs.
+url: https://github.com/graphql-java/graphql-java
+github: graphql-java/graphql-java
+---
+
+Code that executes a hello world GraphQL query with `graphql-java`:
+
+```java
+import graphql.ExecutionResult;
+import graphql.GraphQL;
+import graphql.schema.GraphQLSchema;
+import graphql.schema.StaticDataFetcher;
+import graphql.schema.idl.RuntimeWiring;
+import graphql.schema.idl.SchemaGenerator;
+import graphql.schema.idl.SchemaParser;
+import graphql.schema.idl.TypeDefinitionRegistry;
+
+import static graphql.schema.idl.RuntimeWiring.newRuntimeWiring;
+
+public class HelloWorld {
+
+ public static void main(String[] args) {
+ String schema = "type Query{hello: String} schema{query: Query}";
+
+ SchemaParser schemaParser = new SchemaParser();
+ TypeDefinitionRegistry typeDefinitionRegistry = schemaParser.parse(schema);
+
+ RuntimeWiring runtimeWiring = new RuntimeWiring()
+ .type("Query", builder -> builder.dataFetcher("hello", new StaticDataFetcher("world")))
+ .build();
+
+ SchemaGenerator schemaGenerator = new SchemaGenerator();
+ GraphQLSchema graphQLSchema = schemaGenerator.makeExecutableSchema(typeDefinitionRegistry, runtimeWiring);
+
+ GraphQL build = GraphQL.newGraphQL(graphQLSchema).build();
+ ExecutionResult executionResult = build.execute("{hello}");
+
+ System.out.println(executionResult.getData().toString());
+ // Prints: {hello=world}
+ }
+}
+```
+
+See [the graphql-java docs](https://github.com/graphql-java/graphql-java) for more information on setup.
+
diff --git a/src/content/code/language-support/java-kotlin-android/server/graphql-kotlin.md b/src/content/code/language-support/java-kotlin-android/server/graphql-kotlin.md
new file mode 100644
index 0000000000..d2ac52b9b2
--- /dev/null
+++ b/src/content/code/language-support/java-kotlin-android/server/graphql-kotlin.md
@@ -0,0 +1,8 @@
+---
+name: graphql-kotlin
+description: A set of libraries for running GraphQL server in Kotlin.
+url: https://github.com/ExpediaGroup/graphql-kotlin/
+github: ExpediaGroup/graphql-kotlin
+---
+
+
diff --git a/src/content/code/language-support/java-kotlin-android/tools/graphql-java-generator.md b/src/content/code/language-support/java-kotlin-android/tools/graphql-java-generator.md
new file mode 100644
index 0000000000..04f6855ad0
--- /dev/null
+++ b/src/content/code/language-support/java-kotlin-android/tools/graphql-java-generator.md
@@ -0,0 +1,16 @@
+---
+name: GraphQL Java Generator
+description: GraphQL Java Generator is a tool that generates Java code to speed up development for Client and Server of GraphQL APIs
+url: https://github.com/graphql-java-generator
+github: graphql-java-generator/graphql-gradle-plugin-project
+---
+
+* GraphQL Java client: it generates the Java classes that call the GraphQL endpoint, and the POJO that will contain the data returned by the server.
+The GraphQL endpoint can then be queried by using a simple call to a Java method (see sample below)
+* GraphQL Java server: it is based on [graphql-java](https://github.com/graphql-java/graphql-java) (listed here above). It generates all the boilerplate code.
+You'll only have to implement what's specific to your server, which are the joins between the GraphQL types.
+GraphQL Java Generator is available as a [Maven Plugin](https://graphql-maven-plugin-project.graphql-java-generator.com/index.html).
+A Gradle plugin is coming soon.
+Please note that GraphQL Java Generator is an accelerator: the generated code doesn’t depend on any library specific to GraphQL Java Generator.
+So, it helps you to start building application based on graphql-java. Once the code is generated, you can decide to manually edit it as any standard java application, and get rid of GraphQL Java Generator.
+Of course you can, and should, according to us :), continue using GraphQL Java Generator when your projet evolves.
diff --git a/src/content/code/language-support/javascript/client/apollo-client.md b/src/content/code/language-support/javascript/client/apollo-client.md
new file mode 100644
index 0000000000..2de76d9c45
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/apollo-client.md
@@ -0,0 +1,9 @@
+---
+name: Apollo Client
+description: A powerful JavaScript GraphQL client, designed to work well with React, React Native, Angular 2, or just plain JavaScript.
+url: http://apollographql.com/client/
+github: apollographql/apollo-client
+npm: "@apollo/client"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/aws-amplify.md b/src/content/code/language-support/javascript/client/aws-amplify.md
new file mode 100644
index 0000000000..1588f72758
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/aws-amplify.md
@@ -0,0 +1,9 @@
+---
+name: AWS Amplify
+description: A JavaScript library for application development using cloud services, which supports GraphQL backend and React components for working with GraphQL data.
+url: https://docs.amplify.aws/
+github: aws-amplify/amplify-js
+npm: "aws-amplify"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/gq-loader.md b/src/content/code/language-support/javascript/client/gq-loader.md
new file mode 100644
index 0000000000..40a76b1b1a
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/gq-loader.md
@@ -0,0 +1,9 @@
+---
+name: gq-loader
+description: A simple JavaScript GraphQL client,Let the *.gql file be used as a module through webpack loader.
+url: https://github.com/Houfeng/gq-loader
+github: Houfeng/gq-loader
+npm: "gq-loader"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/grafoo.md b/src/content/code/language-support/javascript/client/grafoo.md
new file mode 100644
index 0000000000..792facaee3
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/grafoo.md
@@ -0,0 +1,9 @@
+---
+name: Grafoo
+description: An all purpose GraphQL client with view layer integrations for multiple frameworks in just 1.6kb.
+url: https://github.com/grafoojs/grafoo
+github: grafoojs/grafoo
+npm: "@grafoo/core"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/graphql-request.md b/src/content/code/language-support/javascript/client/graphql-request.md
new file mode 100644
index 0000000000..12e6d10d25
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/graphql-request.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Request
+description: A simple and flexible JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native) - basically a lightweight wrapper around `fetch`.
+url: https://github.com/prisma/graphql-request
+github: prisma-labs/graphql-request
+npm: "graphql-request"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/graphqurl.md b/src/content/code/language-support/javascript/client/graphqurl.md
new file mode 100644
index 0000000000..8d9b83db99
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/graphqurl.md
@@ -0,0 +1,9 @@
+---
+name: graphqurl
+description: curl for GraphQL with autocomplete, subscriptions and GraphiQL. Also a dead-simple universal javascript GraphQL client.
+url: https://github.com/hasura/graphqurl
+github: hasura/graphqurl
+npm: "graphqurl"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/lokka.md b/src/content/code/language-support/javascript/client/lokka.md
new file mode 100644
index 0000000000..6f3c8d3277
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/lokka.md
@@ -0,0 +1,9 @@
+---
+name: Lokka
+description: A simple JavaScript GraphQL client that works in all JavaScript environments (the browser, Node.js, and React Native).
+url: https://github.com/kadirahq/lokka
+github: kadirahq/lokka
+npm: "lokka"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/nanogql.md b/src/content/code/language-support/javascript/client/nanogql.md
new file mode 100644
index 0000000000..14e6761774
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/nanogql.md
@@ -0,0 +1,9 @@
+---
+name: nanogql
+description: Tiny GraphQL client library using template strings.
+url: https://github.com/yoshuawuyts/nanogql
+github: choojs/nanographql
+npm: "nanographql"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/relay.md b/src/content/code/language-support/javascript/client/relay.md
new file mode 100644
index 0000000000..ea2d96a16d
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/relay.md
@@ -0,0 +1,9 @@
+---
+name: Relay
+description: Facebook's framework for building React applications that talk to a GraphQL backend.
+url: https://facebook.github.io/relay/
+github: facebook/relay
+npm: "react-relay"
+---
+
+
diff --git a/src/content/code/language-support/javascript/client/urql.md b/src/content/code/language-support/javascript/client/urql.md
new file mode 100644
index 0000000000..2dcc709cc5
--- /dev/null
+++ b/src/content/code/language-support/javascript/client/urql.md
@@ -0,0 +1,9 @@
+---
+name: urql
+description: A highly customizable and versatile GraphQL client for React.
+url: https://formidable.com/open-source/urql/
+github: FormidableLabs/urql
+npm: "urql"
+---
+
+
diff --git a/src/content/code/language-support/javascript/server/apollo-server.md b/src/content/code/language-support/javascript/server/apollo-server.md
new file mode 100644
index 0000000000..de749042b6
--- /dev/null
+++ b/src/content/code/language-support/javascript/server/apollo-server.md
@@ -0,0 +1,43 @@
+---
+name: Apollo Server
+description: A set of GraphQL server packages from Apollo that work with various Node.js HTTP frameworks (Express, Connect, Hapi, Koa etc).
+url: https://www.apollographql.com/docs/apollo-server/
+github: apollographql/apollo-server
+npm: "apollo-server-express"
+---
+
+To run a hello world server with apollo-server-express:
+
+```bash
+npm install apollo-server-express express
+```
+
+Then run `node server.js` with this code in `server.js`:
+
+```js
+const express = require('express');
+const { ApolloServer, gql } = require('apollo-server-express');
+
+const typeDefs = gql`
+ type Query {
+ hello: String
+ }
+`;
+
+const resolvers = {
+ Query: {
+ hello: () => 'Hello world!',
+ },
+};
+
+const server = new ApolloServer({ typeDefs, resolvers });
+
+const app = express();
+server.applyMiddleware({ app });
+
+app.listen({ port: 4000 }, () =>
+ console.log('Now browse to http://localhost:4000' + server.graphqlPath)
+);
+```
+
+Apollo Server also supports all Node.js HTTP server frameworks: Express, Connect, HAPI, Koa and NestJs.
diff --git a/src/content/code/language-support/javascript/server/express-graphql.md b/src/content/code/language-support/javascript/server/express-graphql.md
new file mode 100644
index 0000000000..ae70681236
--- /dev/null
+++ b/src/content/code/language-support/javascript/server/express-graphql.md
@@ -0,0 +1,37 @@
+---
+name: Express GraphQL
+description: The reference implementation of a GraphQL API server over an Express webserver. You can use this to run GraphQL in conjunction with a regular Express webserver, or as a standalone GraphQL server.
+url: /graphql-js/running-an-express-graphql-server/
+github: graphql/express-graphql
+npm: "express-graphql"
+---
+
+To run an `express-graphql` hello world server:
+
+```bash
+npm install express express-graphql graphql
+```
+
+Then run `node server.js` with this code in `server.js`:
+
+```js
+var express = require('express');
+var { graphqlHTTP } = require('express-graphql');
+var { buildSchema } = require('graphql');
+
+var schema = buildSchema(`
+ type Query {
+ hello: String
+ }
+`);
+
+var root = { hello: () => 'Hello world!' };
+
+var app = express();
+app.use('/graphql', graphqlHTTP({
+ schema: schema,
+ rootValue: root,
+ graphiql: true,
+}));
+app.listen(4000, () => console.log('Now browse to localhost:4000/graphql'));
+```
diff --git a/src/content/code/language-support/javascript/server/graphql-helix.md b/src/content/code/language-support/javascript/server/graphql-helix.md
new file mode 100644
index 0000000000..ed9b8c1bb1
--- /dev/null
+++ b/src/content/code/language-support/javascript/server/graphql-helix.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Helix
+description: A collection of utility functions for building your own GraphQL HTTP server. You can check out [Building a GraphQL server with GraphQL Helix](https://dev.to/danielrearden/building-a-graphql-server-with-graphql-helix-2k44) on DEV for a detailed tutorial on getting started.
+url: https://github.com/contrawork/graphql-helix
+github: contrawork/graphql-helix
+npm: "graphql-helix"
+---
+
+
diff --git a/src/content/code/language-support/javascript/server/graphql-js.md b/src/content/code/language-support/javascript/server/graphql-js.md
new file mode 100644
index 0000000000..9769b78e39
--- /dev/null
+++ b/src/content/code/language-support/javascript/server/graphql-js.md
@@ -0,0 +1,31 @@
+---
+name: GraphQL.js
+description: The reference implementation of the GraphQL specification, designed for running GraphQL in a Node.js environment.
+url: /graphql-js/
+github: graphql/graphql-js
+npm: "graphql"
+---
+
+To run a `GraphQL.js` hello world script from the command line:
+
+```bash
+npm install graphql
+```
+
+Then run `node hello.js` with this code in `hello.js`:
+
+```js
+var { graphql, buildSchema } = require('graphql');
+
+var schema = buildSchema(`
+ type Query {
+ hello: String
+ }
+`);
+
+var root = { hello: () => 'Hello world!' };
+
+graphql(schema, '{ hello }', root).then((response) => {
+ console.log(response);
+});
+```
diff --git a/src/content/code/language-support/javascript/server/graphql-yoga.md b/src/content/code/language-support/javascript/server/graphql-yoga.md
new file mode 100644
index 0000000000..7cac87710a
--- /dev/null
+++ b/src/content/code/language-support/javascript/server/graphql-yoga.md
@@ -0,0 +1,37 @@
+---
+name: graphql-yoga
+description: Fully-featured GraphQL Server with focus on easy setup, performance & great developer experience
+url: https://github.com/prisma-labs/graphql-yoga
+github: prisma-labs/graphql-yoga
+npm: "graphql-yoga"
+---
+
+- Sensible defaults & includes everything you need with minimal setup.
+- Built-in support for GraphQL subscriptions using WebSockets.
+- Works with all GraphQL clients (Apollo, Relay...) and fits seamless in your GraphQL workflow.
+
+To run a hello world server with graphql-yoga:
+
+```bash
+npm install graphql-yoga
+```
+
+Then run `node server.js` with this code in `server.js`:
+
+```js
+import { GraphQLServer } from 'graphql-yoga'
+// ... or using "require()"
+// const { GraphQLServer } = require('graphql-yoga')
+const typeDefs = `
+ type Query {
+ hello(name: String): String!
+ }
+`;
+const resolvers = {
+ Query: {
+ hello: (_, { name }) => `Hello ${name || 'World'}`,
+ },
+};
+const server = new GraphQLServer({ typeDefs, resolvers })
+server.start(() => console.log('Server is running on localhost:4000'))
+```
diff --git a/src/content/code/language-support/javascript/tools/graphiql.md b/src/content/code/language-support/javascript/tools/graphiql.md
new file mode 100644
index 0000000000..b9c2b53ffe
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphiql.md
@@ -0,0 +1,9 @@
+---
+name: GraphiQL
+description: An interactive in-browser GraphQL IDE.
+url: https://github.com/graphql/graphiql
+github: graphql/graphiql
+npm: "graphiql"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-cli.md b/src/content/code/language-support/javascript/tools/graphql-cli.md
new file mode 100644
index 0000000000..3c7ff98d00
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-cli.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL CLI
+description: A command line tool for common GraphQL development workflows.
+url: https://graphql-cli.com
+github: Urigo/graphql-cli
+npm: "graphql-cli"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-code-generator.md b/src/content/code/language-support/javascript/tools/graphql-code-generator.md
new file mode 100644
index 0000000000..ac5bf4fed5
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-code-generator.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Code Generator
+description: GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.
+url: https://graphql-code-generator.com
+github: dotansimha/graphql-code-generator
+npm: "@graphql-codegen/cli"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-config.md b/src/content/code/language-support/javascript/tools/graphql-config.md
new file mode 100644
index 0000000000..8bc7db8659
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-config.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Config
+description: One configuration for all your GraphQL tools (supported by most tools, editors & IDEs).
+url: https://graphql-config.com
+github: kamilkisiela/graphql-config
+npm: "graphql-config"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-eslint.md b/src/content/code/language-support/javascript/tools/graphql-eslint.md
new file mode 100644
index 0000000000..829e4c62eb
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-eslint.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL-ESLint
+description: GraphQL-ESLint integrates GraphQL AST in the ESLint core (as a parser).
+url: https://github.com/dotansimha/graphql-eslint/
+github: dotansimha/graphql-eslint/
+npm: "@graphql-eslint/eslint-plugin"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-inspector.md b/src/content/code/language-support/javascript/tools/graphql-inspector.md
new file mode 100644
index 0000000000..060c06929f
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-inspector.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Inspector
+description: Compare schemas, validate documents, find breaking changes, find similar types, schema coverage, and more.
+url: https://graphql-inspector.com/
+github: kamilkisiela/graphql-inspector
+npm: "@graphql-inspector/cli"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-language-service.md b/src/content/code/language-support/javascript/tools/graphql-language-service.md
new file mode 100644
index 0000000000..443a090ce2
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-language-service.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Language Service
+description: An interface for building GraphQL language services for IDEs (diagnostics, autocomplete etc).
+url: https://github.com/graphql/graphql-language-service
+github: graphql/graphql-language-service
+npm: "graphql-language-service"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-live-query.md b/src/content/code/language-support/javascript/tools/graphql-live-query.md
new file mode 100644
index 0000000000..59eaad5c56
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-live-query.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Live Query
+description: Real-Time with GraphQL for any GraphQL schema or transport.
+url: https://github.com/n1ru4l/graphql-live-query
+github: n1ru4l/graphql-live-query
+npm: "@n1ru4l/graphql-live-query"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-mesh.md b/src/content/code/language-support/javascript/tools/graphql-mesh.md
new file mode 100644
index 0000000000..8bf2de4398
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-mesh.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Mesh
+description: GraphQL Mesh allows you to use GraphQL query language to access data in remote APIs that don't run GraphQL (and also ones that do run GraphQL). It can be used as a gateway to other services, or run as a local GraphQL schema that aggregates data from remote APIs.
+url: https://graphql-mesh.com
+github: Urigo/graphql-mesh
+npm: "@graphql-mesh/cli"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-modules.md b/src/content/code/language-support/javascript/tools/graphql-modules.md
new file mode 100644
index 0000000000..eeec6b18f6
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-modules.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Modules
+description: GraphQL Modules lets you separate your backend implementation to small, reusable, easy-to-implement and easy-to-test pieces.
+url: https://graphql-modules.com
+github: Urigo/graphql-modules
+npm: "graphql-modules"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-scalars.md b/src/content/code/language-support/javascript/tools/graphql-scalars.md
new file mode 100644
index 0000000000..fcbe9a2123
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-scalars.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Scalars
+description: A library of custom GraphQL scalar types for creating precise, type-safe GraphQL schemas.
+url: https://github.com/Urigo/graphql-scalars
+github: Urigo/graphql-scalars
+npm: "graphql-scalars"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-tools.md b/src/content/code/language-support/javascript/tools/graphql-tools.md
new file mode 100644
index 0000000000..393b0568e4
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-tools.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Tools
+description: A set of utils for faster development of GraphQL tools (Schema and documents loading, Schema merging and more).
+url: https://graphql-tools.com
+github: ardatan/graphql-tools
+npm: "graphql-tools"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/graphql-ws.md b/src/content/code/language-support/javascript/tools/graphql-ws.md
new file mode 100644
index 0000000000..1f5222c55c
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/graphql-ws.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL-WS
+description: Coherent, zero-dependency, lazy, simple, GraphQL over WebSocket Protocol compliant server and client.
+url: https://github.com/enisdenjo/graphql-ws
+github: enisdenjo/graphql-ws
+npm: "graphql-ws"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/postgraphile.md b/src/content/code/language-support/javascript/tools/postgraphile.md
new file mode 100644
index 0000000000..79aedc83c7
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/postgraphile.md
@@ -0,0 +1,9 @@
+---
+name: Postgraphile
+description: builds a powerful, extensible and performant GraphQL API from a PostgreSQL schema in seconds; saving you weeks if not months of development time.
+url: https://www.graphile.org/postgraphile
+github: graphile/postgraphile
+npm: "postgraphile"
+---
+
+
diff --git a/src/content/code/language-support/javascript/tools/sofa.md b/src/content/code/language-support/javascript/tools/sofa.md
new file mode 100644
index 0000000000..becc69b471
--- /dev/null
+++ b/src/content/code/language-support/javascript/tools/sofa.md
@@ -0,0 +1,9 @@
+---
+name: SOFA
+description: Generate REST API from your GraphQL API.
+url: https://sofa-api.com/
+github: Urigo/SOFA
+npm: "sofa-api"
+---
+
+
diff --git a/src/content/code/language-support/julia/client/diana-jl.md b/src/content/code/language-support/julia/client/diana-jl.md
new file mode 100644
index 0000000000..1d2bb4d8bd
--- /dev/null
+++ b/src/content/code/language-support/julia/client/diana-jl.md
@@ -0,0 +1,8 @@
+---
+name: Diana.jl
+description: A Julia GraphQL server implementation.
+url: https://github.com/codeneomatrix/Diana.jl
+github: codeneomatrix/Diana.jl
+---
+
+
diff --git a/src/content/code/language-support/ocaml-reason/server/ocaml-graphql-server.md b/src/content/code/language-support/ocaml-reason/server/ocaml-graphql-server.md
new file mode 100644
index 0000000000..8826c9c9a4
--- /dev/null
+++ b/src/content/code/language-support/ocaml-reason/server/ocaml-graphql-server.md
@@ -0,0 +1,8 @@
+---
+name: ocaml-graphql-server
+description: GraphQL server library for OCaml and Reason
+url: https://github.com/andreas/ocaml-graphql-server
+github: andreas/ocaml-graphql-server
+---
+
+
diff --git a/src/content/code/language-support/perl/server/graphql-perl.md b/src/content/code/language-support/perl/server/graphql-perl.md
new file mode 100644
index 0000000000..f9f099c2a1
--- /dev/null
+++ b/src/content/code/language-support/perl/server/graphql-perl.md
@@ -0,0 +1,16 @@
+---
+name: graphql-perl
+description: A Perl port of GraphQL reference implementation
+url: https://github.com/graphql-perl/graphql-perl
+github: graphql-perl/graphql-perl
+---
+
+- [MetaCPAN documentation](https://metacpan.org/pod/GraphQL)
+
+ - [Mojolicious-Plugin-GraphQL](https://github.com/graphql-perl/Mojolicious-Plugin-GraphQL) - connect your GraphQL service to a Mojolicious app
+
+ - [GraphQL-Plugin-Convert-DBIC](https://github.com/graphql-perl/GraphQL-Plugin-Convert-DBIC) - automatically connect your DBIx::Class schema to GraphQL
+
+ - [GraphQL-Plugin-Convert-OpenAPI](https://github.com/graphql-perl/GraphQL-Plugin-Convert-OpenAPI) - automatically connect any OpenAPI service (either local Mojolicious one, or remote) to GraphQL
+
+
diff --git a/src/content/code/language-support/php/server/api-platform.md b/src/content/code/language-support/php/server/api-platform.md
new file mode 100644
index 0000000000..0f5cfd77d5
--- /dev/null
+++ b/src/content/code/language-support/php/server/api-platform.md
@@ -0,0 +1,41 @@
+---
+name: API Platform
+description: API Platform is a fully-featured, flexible and extensible API framework built on top of Symfony.
+url: https://api-platform.com
+github: api-platform/api-platform
+---
+
+The following class is enough to create both a Relay-compatible GraphQL server and a hypermedia API supporting modern REST formats (JSON-LD, JSONAPI...):
+
+```php
+name;
+ }
+ // ...
+}
+```
+Other GraphQLite features include validation, security, error handling, loading via data-loader pattern...
diff --git a/src/content/code/language-support/php/server/lighthouse.md b/src/content/code/language-support/php/server/lighthouse.md
new file mode 100644
index 0000000000..33bfbf7450
--- /dev/null
+++ b/src/content/code/language-support/php/server/lighthouse.md
@@ -0,0 +1,8 @@
+---
+name: Lighthouse
+description: A GraphQL server for Laravel
+url: https://github.com/nuwave/lighthouse
+github: nuwave/lighthouse
+---
+
+
diff --git a/src/content/code/language-support/php/server/railt.md b/src/content/code/language-support/php/server/railt.md
new file mode 100644
index 0000000000..0c4d999cff
--- /dev/null
+++ b/src/content/code/language-support/php/server/railt.md
@@ -0,0 +1,8 @@
+---
+name: Railt
+description: A PHP GraphQL Framework.
+url: https://github.com/railt/railt
+github: railt/railt
+---
+
+
diff --git a/src/content/code/language-support/php/server/serge.md b/src/content/code/language-support/php/server/serge.md
new file mode 100644
index 0000000000..e4a2a0fe96
--- /dev/null
+++ b/src/content/code/language-support/php/server/serge.md
@@ -0,0 +1,8 @@
+---
+name: serge
+description: Use GraphQL to define your Domain Model for CQRS/ES and let serge generate code to handle GraphQL requests.
+url: https://github.com/kepawni/serge
+github: kepawni/serge
+---
+
+
diff --git a/src/content/code/language-support/php/server/siler.md b/src/content/code/language-support/php/server/siler.md
new file mode 100644
index 0000000000..c947260c11
--- /dev/null
+++ b/src/content/code/language-support/php/server/siler.md
@@ -0,0 +1,43 @@
+---
+name: Siler
+description: Siler is a PHP library powered with high-level abstractions to work with GraphQL.
+url: https://siler.leocavalcante.com/graphql/
+github: leocavalcante/siler
+---
+
+To run a Siler hello world script:
+```graphql
+type Query {
+ hello: String
+}
+```
+
+```php
+ [
+ 'hello' => 'world',
+ ],
+];
+$schema = Graphqlschema($typeDefs, $resolvers);
+
+echo "Server running at http://127.0.0.1:8080";
+
+Httpserver(Graphqlpsr7($schema), function (Throwable $err) {
+ var_dump($err);
+ return Diactorosjson([
+ 'error' => true,
+ 'message' => $err->getMessage(),
+ ]);
+})()->run();
+```
+It also provides functionality for the construction of a WebSocket Subscriptions Server based on how Apollo works.
+
diff --git a/src/content/code/language-support/php/server/wpgraphql.md b/src/content/code/language-support/php/server/wpgraphql.md
new file mode 100644
index 0000000000..2fd292b5a5
--- /dev/null
+++ b/src/content/code/language-support/php/server/wpgraphql.md
@@ -0,0 +1,8 @@
+---
+name: WPGraphQL
+description: A free, open-source WordPress plugin that provides an extendable GraphQL schema and API for any WordPress site
+url: https://github.com/wp-graphql/wp-graphql
+github: wp-graphql/wp-graphql
+---
+
+
diff --git a/src/content/code/language-support/python/client/gql.md b/src/content/code/language-support/python/client/gql.md
new file mode 100644
index 0000000000..8cebdc4361
--- /dev/null
+++ b/src/content/code/language-support/python/client/gql.md
@@ -0,0 +1,8 @@
+---
+name: GQL
+description: A GraphQL client in Python.
+url: https://github.com/graphql-python/gql
+github: graphql-python/gql
+---
+
+
diff --git a/src/content/code/language-support/python/client/python-graphql-client.md b/src/content/code/language-support/python/client/python-graphql-client.md
new file mode 100644
index 0000000000..960e042369
--- /dev/null
+++ b/src/content/code/language-support/python/client/python-graphql-client.md
@@ -0,0 +1,8 @@
+---
+name: python-graphql-client
+description: Simple GraphQL client for Python 2.7+.
+url: https://github.com/prisma/python-graphql-client
+github: prisma-labs/python-graphql-client
+---
+
+
diff --git a/src/content/code/language-support/python/client/sgqlc.md b/src/content/code/language-support/python/client/sgqlc.md
new file mode 100644
index 0000000000..20ec654363
--- /dev/null
+++ b/src/content/code/language-support/python/client/sgqlc.md
@@ -0,0 +1,8 @@
+---
+name: sgqlc
+description: A simple Python GraphQL client. Supports generating code generation for types defined in a GraphQL schema.
+url: https://github.com/profusion/sgqlc
+github: profusion/sgqlc
+---
+
+
diff --git a/src/content/code/language-support/python/server/ariadne.md b/src/content/code/language-support/python/server/ariadne.md
new file mode 100644
index 0000000000..aa6f3ca0c1
--- /dev/null
+++ b/src/content/code/language-support/python/server/ariadne.md
@@ -0,0 +1,43 @@
+---
+name: Ariadne
+description: Ariadne is a Python library for implementing GraphQL servers using schema-first approach. It supports both synchronous and asynchronous query execution, ships with batteries included for common GraphQL server problems like query cost validation or performance tracing and has simple API that is easy to extend or replace.
+url: https://ariadnegraphql.org
+github: mirumee/ariadne
+---
+
+Ariadne can be installed with pip:
+
+```bash
+pip install ariadne
+```
+
+It ships with many GraphQL server implementations, enabling easy experimentation:
+
+```python
+from ariadne import ObjectType, QueryType, gql, make_executable_schema
+from ariadne.asgi import GraphQL
+# Define types using Schema Definition Language (https://graphql.org/learn/schema/)
+# Wrapping string in gql function provides validation and better error traceback
+type_defs = gql("""
+ type Query {
+ hello: String!
+ }
+""")
+# Bind resolver functions to Query's fields using QueryType
+query_type = QueryType()
+# Resolvers are simple python functions
+@query_type.field("hello")
+def resolve_hello(*_):
+ return "Hello world!"
+# Create executable GraphQL schema
+schema = make_executable_schema(type_defs, query_type)
+# Create an ASGI app using the schema, running in debug mode
+app = GraphQL(schema, debug=True)
+```
+
+Above server can be ran with uvicorn:
+
+```
+pip install uvicorn
+uvicorn example:app
+```
diff --git a/src/content/code/language-support/python/server/graphene.md b/src/content/code/language-support/python/server/graphene.md
new file mode 100644
index 0000000000..772aaabc70
--- /dev/null
+++ b/src/content/code/language-support/python/server/graphene.md
@@ -0,0 +1,30 @@
+---
+name: Graphene
+description: A Python library for building GraphQL APIs.
+url: http://graphene-python.org/
+github: graphql-python/graphene
+---
+
+To run a Graphene hello world script:
+
+```bash
+pip install graphene
+```
+
+Then run `python hello.py` with this code in `hello.py`:
+
+```python
+import graphene
+
+class Query(graphene.ObjectType):
+ hello = graphene.String(name=graphene.String(default_value="World"))
+
+ def resolve_hello(self, info, name):
+ return 'Hello ' + name
+
+schema = graphene.Schema(query=Query)
+result = schema.execute('{ hello }')
+print(result.data['hello']) # "Hello World"
+```
+
+There are also nice bindings for [Relay](https://facebook.github.io/relay/), Django, SQLAlchemy, and Google App Engine.
diff --git a/src/content/code/language-support/python/server/tartiflette.md b/src/content/code/language-support/python/server/tartiflette.md
new file mode 100644
index 0000000000..b9c78af3eb
--- /dev/null
+++ b/src/content/code/language-support/python/server/tartiflette.md
@@ -0,0 +1,34 @@
+---
+name: Tartiflette
+description: A Python 3.6+ _(asyncio)_ library for building GraphQL APIs.
+url: https://tartiflette.io
+github: tartiflette/tartiflette
+---
+
+To run a tartiflette hello world script:
+```bash
+pip install tartiflette
+```
+Then run `python hello.py` with this code in `hello.py`:
+```python
+import asyncio
+from tartiflette import Engine, Resolver
+@Resolver("Query.hello")
+async def resolver_hello(parent, args, ctx, info):
+ return "hello " + args["name"]
+async def run():
+ tftt_engine = Engine("""
+ type Query {
+ hello(name: String): String
+ }
+ """)
+ result = await tftt_engine.execute(
+ query='query { hello(name: "Chuck") }'
+ )
+ print(result)
+ # {'data': {'hello': 'hello Chuck'}}
+if __name__ == "__main__":
+ loop = asyncio.get_event_loop()
+ loop.run_until_complete(run())
+```
+There is also a nice [HTTP wrapper](https://github.com/dailymotion/tartiflette-aiohttp).
diff --git a/src/content/code/language-support/r/server/ghql.md b/src/content/code/language-support/r/server/ghql.md
new file mode 100644
index 0000000000..b832a4e73b
--- /dev/null
+++ b/src/content/code/language-support/r/server/ghql.md
@@ -0,0 +1,8 @@
+---
+name: ghql
+description: General purpose GraphQL R client
+url: https://github.com/ropensci/ghql
+github: ropensci/ghql
+---
+
+
diff --git a/src/content/code/language-support/ruby/server/agoo.md b/src/content/code/language-support/ruby/server/agoo.md
new file mode 100644
index 0000000000..1f69c728a9
--- /dev/null
+++ b/src/content/code/language-support/ruby/server/agoo.md
@@ -0,0 +1,37 @@
+---
+name: Agoo
+description: A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.
+url: undefined
+github: ohler55/agoo
+gem: agoo
+---
+
+```ruby
+require 'agoo'
+
+class Query
+ def hello
+ 'hello'
+ end
+end
+
+class Schema
+ attr_reader :query
+
+ def initialize
+ @query = Query.new()
+ end
+end
+
+Agoo::Server.init(6464, 'root', thread_count: 1, graphql: '/graphql')
+Agoo::Server.start()
+Agoo::GraphQL.schema(Schema.new) {
+ Agoo::GraphQL.load(%^type Query { hello: String }^)
+}
+sleep
+
+# To run this GraphQL example type the following then go to a browser and enter
+# a URL of localhost:6464/graphql?query={hello}
+#
+# ruby hello.rb
+```
diff --git a/src/content/code/language-support/ruby/server/graphql-ruby.md b/src/content/code/language-support/ruby/server/graphql-ruby.md
new file mode 100644
index 0000000000..847cb44833
--- /dev/null
+++ b/src/content/code/language-support/ruby/server/graphql-ruby.md
@@ -0,0 +1,33 @@
+---
+name: graphql-ruby
+description: A Ruby library for building GraphQL APIs.
+url: https://github.com/rmosolgo/graphql-ruby
+github: rmosolgo/graphql-ruby
+gem: graphql
+---
+
+To run a hello world script with `graphql-ruby`:
+```bash
+gem install graphql
+```
+
+Then run `ruby hello.rb` with this code in `hello.rb`:
+
+```ruby
+require 'graphql'
+
+class QueryType < GraphQL::Schema::Object
+ graphql_name 'Query'
+ field :hello do
+ type types.String
+ resolve -> (obj, args, ctx) { 'Hello world!' }
+ end
+end
+
+class Schema < GraphQL::Schema
+ query QueryType
+end
+
+puts Schema.execute('{ hello }').to_json
+```
+There are also nice bindings for Relay and Rails.
diff --git a/src/content/code/language-support/rust/server/async-graphql.md b/src/content/code/language-support/rust/server/async-graphql.md
new file mode 100644
index 0000000000..77b29bc9c2
--- /dev/null
+++ b/src/content/code/language-support/rust/server/async-graphql.md
@@ -0,0 +1,18 @@
+---
+name: Async-graphql
+description: Async-graphql is a high-performance server-side library that supports all GraphQL specifications.
+url: https://github.com/async-graphql/async-graphql
+github: async-graphql/async-graphql
+---
+
+```rust
+ use async_graphql::*;
+ struct Query;
+ #[Object]
+ impl Query {
+ /// Returns the sum of a and b
+ async fn add(&self, a: i32, b: i32) -> i32 {
+ a + b
+ }
+ }
+ ```
diff --git a/src/content/code/language-support/rust/server/graphql-rust-juniper.md b/src/content/code/language-support/rust/server/graphql-rust-juniper.md
new file mode 100644
index 0000000000..7cf7c961f5
--- /dev/null
+++ b/src/content/code/language-support/rust/server/graphql-rust-juniper.md
@@ -0,0 +1,8 @@
+---
+name: graphql-rust/juniper
+description: GraphQL server library for Rust
+url: https://github.com/graphql-rust/juniper
+github: graphql-rust/juniper
+---
+
+
diff --git a/src/content/code/language-support/scala/server/sangria.md b/src/content/code/language-support/scala/server/sangria.md
new file mode 100644
index 0000000000..c900b46ed6
--- /dev/null
+++ b/src/content/code/language-support/scala/server/sangria.md
@@ -0,0 +1,23 @@
+---
+name: Sangria
+description: A Scala GraphQL library that supports [Relay](https://facebook.github.io/relay/).
+url: http://sangria-graphql.org/
+github: sangria-graphql/sangria
+---
+
+An example of a hello world GraphQL schema and query with `sangria`:
+```scala
+import sangria.schema._
+import sangria.execution._
+import sangria.macros._
+
+val QueryType = ObjectType("Query", fields[Unit, Unit](
+ Field("hello", StringType, resolve = _ ⇒ "Hello world!")
+))
+
+val schema = Schema(QueryType)
+
+val query = graphql"{ hello }"
+
+Executor.execute(schema, query) map println
+```
diff --git a/src/content/code/language-support/swift-objective-c-ios/client/apollo-ios.md b/src/content/code/language-support/swift-objective-c-ios/client/apollo-ios.md
new file mode 100644
index 0000000000..5bc1c64ac8
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/client/apollo-ios.md
@@ -0,0 +1,8 @@
+---
+name: Apollo iOS
+description: A GraphQL client for iOS that returns results as query-specific Swift types, and integrates with Xcode to show your Swift source and GraphQL side by side, with inline validation errors.
+url: https://www.apollographql.com/docs/ios/
+github: apollographql/apollo-ios
+---
+
+
diff --git a/src/content/code/language-support/swift-objective-c-ios/client/caliban.md b/src/content/code/language-support/swift-objective-c-ios/client/caliban.md
new file mode 100644
index 0000000000..881e35a0d5
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/client/caliban.md
@@ -0,0 +1,8 @@
+---
+name: Caliban
+description: Functional GraphQL library for Scala, with client code generation and type-safe queries.
+url: https://ghostdogpr.github.io/caliban/
+github: ghostdogpr/caliban
+---
+
+
diff --git a/src/content/code/language-support/swift-objective-c-ios/client/graphaello.md b/src/content/code/language-support/swift-objective-c-ios/client/graphaello.md
new file mode 100644
index 0000000000..27167b6e00
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/client/graphaello.md
@@ -0,0 +1,8 @@
+---
+name: Graphaello
+description: A Tool for Writing Declarative, Type-Safe and Data-Driven Applications in SwiftUI using GraphQL and Apollo
+url: https://github.com/nerdsupremacist/Graphaello
+github: nerdsupremacist/Graphaello
+---
+
+
diff --git a/src/content/code/language-support/swift-objective-c-ios/client/graphql-ios.md b/src/content/code/language-support/swift-objective-c-ios/client/graphql-ios.md
new file mode 100644
index 0000000000..b4492cd232
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/client/graphql-ios.md
@@ -0,0 +1,8 @@
+---
+name: GraphQL iOS
+description: An Objective-C GraphQL client for iOS.
+url: https://github.com/funcompany/graphql-ios
+github: funcompany/graphql-ios
+---
+
+
diff --git a/src/content/code/language-support/swift-objective-c-ios/server/caliban.md b/src/content/code/language-support/swift-objective-c-ios/server/caliban.md
new file mode 100644
index 0000000000..71722002a1
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/server/caliban.md
@@ -0,0 +1,36 @@
+---
+name: Caliban
+description: Caliban is a purely functional library for building GraphQL servers and clients in Scala
+url: https://ghostdogpr.github.io/caliban/
+github: ghostdogpr/caliban
+---
+
+An example of a GraphQL schema and query with `caliban`:
+```scala
+case class Character(name: String, age: Int)
+def getCharacters(): List[Character] = ???
+def getCharacter(name: String): Option[Character] = ???
+// schema
+case class CharacterName(name: String)
+case class Queries(characters: List[Character],
+ character: CharacterName => Option[Character])
+// resolver
+val queries = Queries(getCharacters, args => getCharacter(args.name))
+import caliban.GraphQL.graphQL
+import caliban.RootResolver
+val api = graphQL(RootResolver(queries))
+for {
+ interpreter <- api.interpreter
+} yield interpreter
+case class GraphQLResponse[+E](data: ResponseValue, errors: List[E])
+val query = """
+ {
+ characters {
+ name
+ }
+ }"""
+for {
+ result <- interpreter.execute(query)
+ _ <- zio.console.putStrLn(result.data.toString)
+} yield ()
+```
diff --git a/src/content/code/language-support/swift-objective-c-ios/server/graphiti.md b/src/content/code/language-support/swift-objective-c-ios/server/graphiti.md
new file mode 100644
index 0000000000..f6a51dd945
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/server/graphiti.md
@@ -0,0 +1,8 @@
+---
+name: Graphiti
+description: Swift library for building GraphQL schemas/types fast, safely and easily.
+url: https://github.com/GraphQLSwift/Graphiti
+github: GraphQLSwift/Graphiti
+---
+
+
diff --git a/src/content/code/language-support/swift-objective-c-ios/server/graphzahl.md b/src/content/code/language-support/swift-objective-c-ios/server/graphzahl.md
new file mode 100644
index 0000000000..dfacfe38aa
--- /dev/null
+++ b/src/content/code/language-support/swift-objective-c-ios/server/graphzahl.md
@@ -0,0 +1,8 @@
+---
+name: GraphZahl
+description: Swift library for writing Declarative, Type-Safe GraphQL APIs with Zero Boilerplate.
+url: https://github.com/nerdsupremacist/GraphZahl
+github: nerdsupremacist/GraphZahl
+---
+
+
diff --git a/src/content/code/more-stuff/awesome-graphql.md b/src/content/code/more-stuff/awesome-graphql.md
new file mode 100644
index 0000000000..bd6f9af7b2
--- /dev/null
+++ b/src/content/code/more-stuff/awesome-graphql.md
@@ -0,0 +1,8 @@
+---
+name: awesome-graphql
+description: A fantastic community maintained collection of libraries, resources, and more.
+url: https://github.com/chentsulin/awesome-graphql
+github: chentsulin/awesome-graphql
+---
+
+
diff --git a/src/content/code/services/altair.md b/src/content/code/services/altair.md
new file mode 100644
index 0000000000..979bb1bf9e
--- /dev/null
+++ b/src/content/code/services/altair.md
@@ -0,0 +1,7 @@
+---
+name: Altair
+description: An alternative to Postman that supports editing GraphQL queries directly and autoload your GraphQL schema.
+url: https://altair.sirmuel.design/
+---
+
+
diff --git a/src/content/code/services/apollo-graph-manager.md b/src/content/code/services/apollo-graph-manager.md
new file mode 100644
index 0000000000..d0283fd22f
--- /dev/null
+++ b/src/content/code/services/apollo-graph-manager.md
@@ -0,0 +1,7 @@
+---
+name: Apollo Graph Manager
+description: A cloud service for monitoring the performance and usage of your GraphQL backend.
+url: https://engine.apollographql.com
+---
+
+
diff --git a/src/content/code/services/aws-appsync.md b/src/content/code/services/aws-appsync.md
new file mode 100644
index 0000000000..21fc42ae78
--- /dev/null
+++ b/src/content/code/services/aws-appsync.md
@@ -0,0 +1,7 @@
+---
+name: AWS AppSync
+description: Fully managed GraphQL service with realtime subscriptions, offline programming & synchronization, and enterprise security features as well as fine grained authorization controls.
+url: https://aws.amazon.com/appsync/
+---
+
+
diff --git a/src/content/code/services/elide.md b/src/content/code/services/elide.md
new file mode 100644
index 0000000000..64ef631169
--- /dev/null
+++ b/src/content/code/services/elide.md
@@ -0,0 +1,7 @@
+---
+name: Elide
+description: A Java library that can expose a JPA annotated data model as a GraphQL service over any relational database.
+url: https://elide.io
+---
+
+
diff --git a/src/content/code/services/faunadb.md b/src/content/code/services/faunadb.md
new file mode 100644
index 0000000000..decd136ab3
--- /dev/null
+++ b/src/content/code/services/faunadb.md
@@ -0,0 +1,7 @@
+---
+name: FaunaDB
+description: Create an instant GraphQL backend by importing a gql schema. The database will create relations and indexes for you, so you'll be ready to query in seconds, without writing any database code. Serverless pricing, free to get started.
+url: https://docs.fauna.com/fauna/current/graphql
+---
+
+
diff --git a/src/content/code/services/graphcms.md b/src/content/code/services/graphcms.md
new file mode 100644
index 0000000000..5ae71b45d8
--- /dev/null
+++ b/src/content/code/services/graphcms.md
@@ -0,0 +1,7 @@
+---
+name: GraphCMS
+description: A BaaS (Backend as a Service) that sets you up with a GraphQL backend as well as tools for content editors to work with the stored data.
+url: https://graphcms.com/
+---
+
+
diff --git a/src/content/code/services/hasura.md b/src/content/code/services/hasura.md
new file mode 100644
index 0000000000..dc72b4317f
--- /dev/null
+++ b/src/content/code/services/hasura.md
@@ -0,0 +1,8 @@
+---
+name: Hasura
+description: Hasura connects to your databases & microservices and instantly gives you a production-ready GraphQL API.
+url: https://hasura.io
+github: hasura/graphql-engine
+---
+
+
diff --git a/src/content/code/services/lexascms.md b/src/content/code/services/lexascms.md
new file mode 100644
index 0000000000..10907871c5
--- /dev/null
+++ b/src/content/code/services/lexascms.md
@@ -0,0 +1,7 @@
+---
+name: LexasCMS
+description: A headless CMS (Content Management System) that combines powerful content personalisation and scheduling capabilities with a modern content editing experience and a blazing fast GraphQL/REST content delivery API.
+url: https://www.lexascms.com
+---
+
+
diff --git a/src/content/code/services/moesif-api-analytics.md b/src/content/code/services/moesif-api-analytics.md
new file mode 100644
index 0000000000..3c903be90d
--- /dev/null
+++ b/src/content/code/services/moesif-api-analytics.md
@@ -0,0 +1,7 @@
+---
+name: Moesif API Analytics
+description: A GraphQL analaytics and monitoring Service to find functional and performance issues.
+url: https://www.moesif.com/features/graphql-analytics
+---
+
+
diff --git a/src/content/code/services/postman.md b/src/content/code/services/postman.md
new file mode 100644
index 0000000000..749a1b49e7
--- /dev/null
+++ b/src/content/code/services/postman.md
@@ -0,0 +1,7 @@
+---
+name: Postman
+description: An HTTP Client that supports editing GraphQL queries.
+url: https://learning.postman.com/docs/sending-requests/supported-api-frameworks/graphql/
+---
+
+
diff --git a/src/content/code/services/prisma.md b/src/content/code/services/prisma.md
new file mode 100644
index 0000000000..a01d88d797
--- /dev/null
+++ b/src/content/code/services/prisma.md
@@ -0,0 +1,8 @@
+---
+name: Prisma
+description: A BaaS (Backend as a Service) providing a GraphQL backend for your applications with a powerful web ui for managing your database and stored data.
+url: https://www.prisma.io
+github: prisma/prisma
+---
+
+
diff --git a/src/content/code/services/tipe.md b/src/content/code/services/tipe.md
new file mode 100644
index 0000000000..eca017351a
--- /dev/null
+++ b/src/content/code/services/tipe.md
@@ -0,0 +1,8 @@
+---
+name: Tipe
+description: A SaaS (Software as a Service) content management system that allows you to create your content with powerful editing tools and access it from anywhere with a GraphQL or REST API.
+url: https://tipe.io
+github: tipeio/tipe
+---
+
+
diff --git a/src/content/code/slug-map.json b/src/content/code/slug-map.json
new file mode 100644
index 0000000000..beec53e07e
--- /dev/null
+++ b/src/content/code/slug-map.json
@@ -0,0 +1,31 @@
+{
+ "c-c": "C / C++",
+ "c-net": "C# / .NET",
+ "clojure": "Clojure",
+ "d": "D",
+ "elixir": "Elixir",
+ "elm": "Elm",
+ "erlang": "Erlang",
+ "flutter": "Flutter",
+ "go": "Go",
+ "groovy": "Groovy",
+ "haskell": "Haskell",
+ "java-kotlin-android": "Java / Kotlin / Android",
+ "javascript": "JavaScript",
+ "julia": "Julia",
+ "perl": "Perl",
+ "php": "PHP",
+ "python": "Python",
+ "r": "R",
+ "ruby": "Ruby",
+ "rust": "Rust",
+ "scala": "Scala",
+ "ocaml-reason": "OCaml / Reason",
+ "swift-objective-c-ios": "Swift / Objective-C iOS",
+ "language-support": "Language Support",
+ "client": "Client",
+ "server": "Server",
+ "tools": "Tools",
+ "services": "Services",
+ "more-stuff": "More Stuff"
+}
diff --git a/src/content/code/tools/graphql-code-generator.md b/src/content/code/tools/graphql-code-generator.md
new file mode 100644
index 0000000000..ac5bf4fed5
--- /dev/null
+++ b/src/content/code/tools/graphql-code-generator.md
@@ -0,0 +1,9 @@
+---
+name: GraphQL Code Generator
+description: GraphQL code generator with flexible support for custom plugins and templates like Typescript (frontend and backend), React Hooks, resolvers signatures and more.
+url: https://graphql-code-generator.com
+github: dotansimha/graphql-code-generator
+npm: "@graphql-codegen/cli"
+---
+
+
diff --git a/src/content/code/tools/quicktype.md b/src/content/code/tools/quicktype.md
new file mode 100644
index 0000000000..e5278b2798
--- /dev/null
+++ b/src/content/code/tools/quicktype.md
@@ -0,0 +1,9 @@
+---
+name: quicktype
+description: Generate types for GraphQL queries in TypeScript, Swift, golang, C#, C++, and more.
+url: https://quicktype.io/
+github: quicktype/quicktype
+npm: "quicktype"
+---
+
+
diff --git a/yarn.lock b/yarn.lock
index 0f482107eb..f223de2497 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -4907,6 +4907,14 @@ file-entry-cache@^5.0.1:
dependencies:
flat-cache "^2.0.1"
+file-is-binary@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/file-is-binary/-/file-is-binary-1.0.0.tgz#5e41806d1bcae458c8fec32fe3ce122dbbbc4356"
+ integrity sha1-XkGAbRvK5FjI/sMv484SLbu8Q1Y=
+ dependencies:
+ is-binary-buffer "^1.0.0"
+ isobject "^3.0.0"
+
file-loader@^1.1.11:
version "1.1.11"
resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-1.1.11.tgz#6fe886449b0f2a936e43cabaac0cdbfb369506f8"
@@ -5963,6 +5971,16 @@ graphql@^14.6.0, graphql@^14.7.0:
dependencies:
iterall "^1.2.2"
+gray-matter@^3.0.2:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-3.1.1.tgz#101f80d9e69eeca6765cdce437705b18f40876ac"
+ integrity sha512-nZ1qjLmayEv0/wt3sHig7I0s3/sJO0dkAaKYQ5YAOApUtYEOonXSFdWvL1khvnZMTvov4UufkqlFsilPnejEXA==
+ dependencies:
+ extend-shallow "^2.0.1"
+ js-yaml "^3.10.0"
+ kind-of "^5.0.2"
+ strip-bom-string "^1.0.0"
+
gray-matter@^4.0.2:
version "4.0.2"
resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-4.0.2.tgz#9aa379e3acaf421193fce7d2a28cebd4518ac454"
@@ -6690,6 +6708,13 @@ is-arrayish@^0.3.1:
resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03"
integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==
+is-binary-buffer@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/is-binary-buffer/-/is-binary-buffer-1.0.0.tgz#bc6031290b65cbf799b9d9502b50fd5375524007"
+ integrity sha1-vGAxKQtly/eZudlQK1D9U3VSQAc=
+ dependencies:
+ is-buffer "^1.1.5"
+
is-binary-path@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898"
@@ -7056,6 +7081,11 @@ is-whitespace-character@^1.0.0:
resolved "https://registry.yarnpkg.com/is-whitespace-character/-/is-whitespace-character-1.0.4.tgz#0858edd94a95594c7c9dd0b5c174ec6e45ee4aa7"
integrity sha512-SDweEzfIZM0SJV0EUga669UTKlmL0Pq8Lno0QDQsPnvECB3IM2aP0gdx5TrU0A01MAPfViaZiI2V1QMZLaKK5w==
+is-whitespace@^0.3.0:
+ version "0.3.0"
+ resolved "https://registry.yarnpkg.com/is-whitespace/-/is-whitespace-0.3.0.tgz#1639ecb1be036aec69a54cbb401cfbed7114ab7f"
+ integrity sha1-Fjnssb4DauxppUy7QBz77XEUq38=
+
is-windows@^1.0.1, is-windows@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
@@ -7180,7 +7210,7 @@ js-tokens@^3.0.2:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b"
integrity sha1-mGbfOVECEw449/mWvOtlRDIJwls=
-js-yaml@^3.11.0, js-yaml@^3.13.1:
+js-yaml@^3.10.0, js-yaml@^3.11.0, js-yaml@^3.13.1:
version "3.14.0"
resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz#a7a34170f26a21bb162424d8adacb4113a69e482"
integrity sha512-/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==
@@ -7314,7 +7344,7 @@ kind-of@^4.0.0:
dependencies:
is-buffer "^1.1.5"
-kind-of@^5.0.0:
+kind-of@^5.0.0, kind-of@^5.0.2:
version "5.1.0"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d"
integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==
@@ -7356,6 +7386,13 @@ latest-version@5.1.0, latest-version@^5.0.0:
dependencies:
package-json "^6.3.0"
+lazy-cache@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/lazy-cache/-/lazy-cache-2.0.2.tgz#b9190a4f913354694840859f8a8f7084d8822264"
+ integrity sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=
+ dependencies:
+ set-getter "^0.1.0"
+
less-loader@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/less-loader/-/less-loader-6.2.0.tgz#8b26f621c155b342eefc24f5bd6e9dc40c42a719"
@@ -8807,6 +8844,19 @@ parseqs@0.0.6:
resolved "https://registry.yarnpkg.com/parseqs/-/parseqs-0.0.6.tgz#8e4bb5a19d1cdc844a08ac974d34e273afa670d5"
integrity sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==
+parser-front-matter@1.6.4:
+ version "1.6.4"
+ resolved "https://registry.yarnpkg.com/parser-front-matter/-/parser-front-matter-1.6.4.tgz#71fe3288a51c7b8734163f3793f3fdc24b0a8a90"
+ integrity sha512-eqtUnI5+COkf1CQOYo8FmykN5Zs+5Yr60f/7GcPgQDZEEjdE/VZ4WMaMo9g37foof8h64t/TH2Uvk2Sq0fDy/g==
+ dependencies:
+ extend-shallow "^2.0.1"
+ file-is-binary "^1.0.0"
+ gray-matter "^3.0.2"
+ isobject "^3.0.1"
+ lazy-cache "^2.0.2"
+ mixin-deep "^1.2.0"
+ trim-leading-lines "^0.1.1"
+
parseuri@0.0.5:
version "0.0.5"
resolved "https://registry.yarnpkg.com/parseuri/-/parseuri-0.0.5.tgz#80204a50d4dbb779bfdc6ebe2778d90e4bce320a"
@@ -10488,6 +10538,13 @@ set-blocking@^2.0.0:
resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7"
integrity sha1-BF+XgtARrppoA93TgrJDkrPYkPc=
+set-getter@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/set-getter/-/set-getter-0.1.0.tgz#d769c182c9d5a51f409145f2fba82e5e86e80376"
+ integrity sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=
+ dependencies:
+ to-object-path "^0.3.0"
+
set-value@^2.0.0, set-value@^2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b"
@@ -11431,6 +11488,13 @@ toidentifier@1.0.0:
resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz#7e1be3470f1e77948bc43d94a3c8f4d7752ba553"
integrity sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==
+trim-leading-lines@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.yarnpkg.com/trim-leading-lines/-/trim-leading-lines-0.1.1.tgz#0e7cac3e83042dcf95a74ed36966f17744d5c169"
+ integrity sha1-DnysPoMELc+Vp07TaWbxd0TVwWk=
+ dependencies:
+ is-whitespace "^0.3.0"
+
trim-lines@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/trim-lines/-/trim-lines-1.1.3.tgz#839514be82428fd9e7ec89e35081afe8f6f93115"
From 97d5b6062ed77b15087b4265a6d3856e67676747 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 16 Nov 2020 13:55:17 +0300
Subject: [PATCH 23/27] Expansible code examples
---
src/assets/css/_css/code.less | 27 ++++-
src/pages/code.tsx | 205 +++++++++++++++++-----------------
static/img/downarrow.svg | 3 +
3 files changed, 129 insertions(+), 106 deletions(-)
create mode 100644 static/img/downarrow.svg
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index f379fd005b..ea3eea171f 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -67,6 +67,7 @@
flex-direction: row;
width: 40%;
p {
+ min-width: 72px;
width: 20%;
margin: 0;
color: #8c8c8c;
@@ -104,8 +105,14 @@
font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
}
.language-boxes {
+ display: grid;
+ grid-row-gap: 20px;
+ grid-column-gap: 30px;
+ grid-template-columns: auto auto auto;
+ @media screen and (min-width: 1020px) {
+ grid-template-columns: auto auto auto auto auto auto;
+ }
.language-box {
- margin-right: 30px;
border: 1px solid #979797;
min-width: 142px;
height: 120px;
@@ -187,9 +194,21 @@
}
.library-howto {
width: 60%;
- // max-height: 550px;
- // overflow-y: auto;
- // overflow-x: hidden;
+ .library-howto-content {
+ transition: max-height 0.25s ease-in;
+ }
+ }
+ .library-howto-expand {
+ border-top-style: solid;
+ border-top-color: #C4C4C4;
+ border-top-width: 3px;
+ background-image: url(../../../../static/img/downarrow.svg);
+ background-position: center;
+ background-repeat: no-repeat;
+ width: 100%;
+ min-height: 40px;
+ display: block;
+ cursor: pointer;
}
}
}
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 6f15a11fc1..0e04933224 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -1,43 +1,115 @@
import { AnchorLink } from "gatsby-plugin-anchor-links"
-import React from "react"
+import React, { useState } from "react"
import Layout from "../components/Layout"
import Marked from "../components/Marked"
import { toSlug } from "../utils/slug"
export function buildLanguagesMenu(pageContext: any) {
- let lastRow: string[]
- const rows: string[][] = []
- pageContext.languageList.forEach(
- ({ name: languageName }: any, index: number) => {
- if (index % 6 === 0) {
- lastRow = [languageName]
- rows.push(lastRow)
- } else {
- lastRow.push(languageName)
- }
- }
+ return (
+
+ {pageContext.languageList.map(({ name: languageName }) => {
+ const slug = toSlug(languageName)
+ return (
+
+ {languageName}
+
+ )
+ })}
+
)
+}
+
+export function buildLibraryContent(library: any, pageContext: any) {
+ const [ overflown, setOverflown ] = useState(false);
+ const [ expanded, setExpanded ] = useState(false);
return (
-
- {rows.map(row => (
- <>
-
- {row.map(languageName => {
- const slug = toSlug(languageName)
- return (
-
- {languageName}
-
- )
- })}
+
+
+
+ {library.name}
+
+ {library.github && (
+
+ )}
+ {library.npm && (
+
+ )}
+ {library.gem && (
+
+ )}
+ {library.lastRelease && (
+
+ Last Release
+ {library.formattedLastRelease}
+
+ )}
+ {library.stars && (
+
+ Stars
+ {library.formattedStars}
+
+ )}
+ {library.license && (
+
+ License
+ {library.license}
+
+ )}
+ {library.howto ? (
+
+ {library.description}
+
+ ) : (
- >
- ))}
+ )}
+
+
+
{
+ if (el && !overflown) {
+ setOverflown(el.clientHeight < el.scrollHeight)
+ }
+ }}
+ >
+
+ {library.howto || library.description}
+
+
+ {overflown &&
setExpanded(!expanded)}
+ /> }
+
)
}
@@ -45,78 +117,7 @@ export function buildLanguagesMenu(pageContext: any) {
export function buildLibraryList(libraries: any[], pageContext: any) {
return (
- {libraries.map(library => (
-
-
-
- {library.name}
-
- {library.github && (
-
- )}
- {library.npm && (
-
- )}
- {library.gem && (
-
- )}
- {library.lastRelease && (
-
- Last Release
- {library.formattedLastRelease}
-
- )}
- {library.stars && (
-
- Stars
- {library.formattedStars}
-
- )}
- {library.license && (
-
- License
- {library.license}
-
- )}
- {library.howto ? (
-
- {library.description}
-
- ) : (
-
- )}
-
-
-
- {library.howto || library.description}
-
-
-
- ))}
+ {libraries.map(library => buildLibraryContent(library, pageContext))}
)
}
diff --git a/static/img/downarrow.svg b/static/img/downarrow.svg
new file mode 100644
index 0000000000..66d1586245
--- /dev/null
+++ b/static/img/downarrow.svg
@@ -0,0 +1,3 @@
+
+
+
From c584a575a66774c22f3ac8ef2476498b84068682 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 16 Nov 2020 14:28:57 +0300
Subject: [PATCH 24/27] Improve CSS
---
src/assets/css/_css/code.less | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index ea3eea171f..7b227ab5bc 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -135,7 +135,7 @@
flex-direction: row;
justify-content: space-between;
.language-title {
- margin: 0;
+ margin: 0 0 50px 0;
font-size: 48px;
font-weight: bold;
}
@@ -150,7 +150,7 @@
}
}
.library-category {
- padding-top: 50px;
+ padding-top: 15px;
}
.library-category-title {
margin: 0;
@@ -163,6 +163,7 @@
flex-direction: row;
justify-content: space-between;
margin-top: 36px;
+ margin-bottom: 50px;
.library-details {
width: 30%;
.library-name {
@@ -195,6 +196,9 @@
.library-howto {
width: 60%;
.library-howto-content {
+ p {
+ margin: 0;
+ }
transition: max-height 0.25s ease-in;
}
}
From 7b9449466897c5df3f3fa97956c01b44455918d4 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Mon, 16 Nov 2020 15:26:41 +0300
Subject: [PATCH 25/27] More CSS
---
src/assets/css/_css/code.less | 73 ++++++++++++++++++++++++++++-------
src/pages/code.tsx | 17 ++++----
2 files changed, 66 insertions(+), 24 deletions(-)
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index 7b227ab5bc..cfa3593c7a 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -135,7 +135,7 @@
flex-direction: row;
justify-content: space-between;
.language-title {
- margin: 0 0 50px 0;
+ margin: 0 0 10px 0;
font-size: 48px;
font-weight: bold;
}
@@ -149,11 +149,9 @@
}
}
}
- .library-category {
- padding-top: 15px;
- }
.library-category-title {
margin: 0;
+ padding-top: 45px;
font-size: 24px;
color: #a6a6a6;
font-weight: bold;
@@ -163,7 +161,7 @@
flex-direction: row;
justify-content: space-between;
margin-top: 36px;
- margin-bottom: 50px;
+ margin-bottom: 40px;
.library-details {
width: 30%;
.library-name {
@@ -195,24 +193,69 @@
}
.library-howto {
width: 60%;
+ position: relative;
.library-howto-content {
+ overflow: hidden;
+ &.not-expanded {
+ max-height: 450px;
+ }
+ &.expanded {
+ max-height: none;
+ border-bottom-style: solid;
+ border-bottom-color: #C4C4C4;
+ border-bottom-width: 3px;
+ }
p {
margin: 0;
}
- transition: max-height 0.25s ease-in;
}
}
.library-howto-expand {
- border-top-style: solid;
- border-top-color: #C4C4C4;
- border-top-width: 3px;
- background-image: url(../../../../static/img/downarrow.svg);
- background-position: center;
- background-repeat: no-repeat;
- width: 100%;
- min-height: 40px;
- display: block;
cursor: pointer;
+
+ &.not-expanded {
+ background: -webkit-linear-gradient(
+ top,
+ rgba(237, 239, 240, 0),
+ rgba(237, 239, 240, 0) 380px,
+ #ffffff 400px
+ );
+ background: linear-gradient(
+ to bottom,
+ rgba(237, 239, 240, 0),
+ rgba(237, 239, 240, 0) 380px,
+ #ffffff 400px
+ );
+ box-sizing: border-box;
+ display: block;
+ height: 450px;
+ padding-top: 400px;
+ position: absolute;
+ top: 0;
+ right: 0;
+ left: 0;
+ text-align: center;
+ .library-howto-expand-anchor {
+ background: #ffffff;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+ border-radius: 9pt 9pt 0 0;
+ color: #8c8c8c;
+ display: inline-block;
+ max-width: 100%;
+ overflow: hidden;
+ padding: 10px;
+ text-decoration: underline;
+ text-overflow: ellipsis;
+ white-space: nowrap;
+ }
+ }
+ &.expanded {
+ width: 100%;
+ height: 30px;
+ text-align: center;
+ transform: rotate(180deg);
+ }
}
}
}
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 0e04933224..518f5d0c26 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -90,11 +90,7 @@ export function buildLibraryContent(library: any, pageContext: any) {
{
if (el && !overflown) {
setOverflown(el.clientHeight < el.scrollHeight)
@@ -105,10 +101,13 @@ export function buildLibraryContent(library: any, pageContext: any) {
{library.howto || library.description}
- {overflown &&
setExpanded(!expanded)}
- /> }
+ {overflown && (
+
setExpanded(!expanded)}>
+
+
+ )}
)
From 135d93b6b67932f9c92c4b40a634c6b3424c4f4c Mon Sep 17 00:00:00 2001
From: Orta Therox
Date: Tue, 17 Nov 2020 10:26:11 -0500
Subject: [PATCH 26/27] Remove 'stuff', add mobile support, some css tweaks and
only allows expanding but not contracting
---
scripts/sort-libraries.js | 29 +++++++++++++--
src/assets/css/_css/code.less | 35 ++++++++++++-------
src/components/Footer/index.tsx | 1 -
.../code/more-stuff/awesome-graphql.md | 8 -----
src/content/code/slug-map.json | 7 ++--
src/pages/code.tsx | 22 +++---------
6 files changed, 57 insertions(+), 45 deletions(-)
delete mode 100644 src/content/code/more-stuff/awesome-graphql.md
diff --git a/scripts/sort-libraries.js b/scripts/sort-libraries.js
index 4d5f8df5ff..a0fd747b63 100644
--- a/scripts/sort-libraries.js
+++ b/scripts/sort-libraries.js
@@ -48,6 +48,20 @@ const getGitHubStats = async githubRepo => {
publishedAt
}
}
+ tags: refs(refPrefix: "refs/tags/", first: 1, orderBy: {field: TAG_COMMIT_DATE, direction: DESC}) {
+ nodes {
+ name
+ target {
+ ... on Tag {
+ target {
+ ... on Commit {
+ pushedDate
+ }
+ }
+ }
+ }
+ }
+ }
}
}
}
@@ -82,6 +96,7 @@ const getGitHubStats = async githubRepo => {
}
const stars = repo.stargazers.totalCount
const commitHistory = repo.defaultBranchRef.target.history.edges
+
let hasCommitsInLast3Months = false;
commitHistory.forEach(commit => {
if (!commit.node.author.name.match(/bot/i)) {
@@ -91,10 +106,20 @@ const getGitHubStats = async githubRepo => {
const formattedStars = numbro(stars).format({
average: true,
});
- let lastRelease;
+
+ const releases = [];
+ if (repo.tags && repo.tags.nodes && repo.tags.nodes.length && repo.tags.nodes[0].target.target && repo.tags.nodes[0].target.target.pushedDate) {
+ releases.push(repo.tags.nodes[0].target.target.pushedDate);
+ }
if (repo.releases && repo.releases.nodes && repo.releases.nodes.length) {
- lastRelease = repo.releases.nodes[0].publishedAt;
+ releases.push(repo.releases.nodes[0].publishedAt)
}
+ if(owner.includes("graphql")) {
+ console.log({ releases, repoName })
+ }
+
+ const lastRelease = releases.filter(Boolean).sort().reverse()[0]
+
return {
hasCommitsInLast3Months,
stars,
diff --git a/src/assets/css/_css/code.less b/src/assets/css/_css/code.less
index cfa3593c7a..7cd96810e9 100644
--- a/src/assets/css/_css/code.less
+++ b/src/assets/css/_css/code.less
@@ -55,10 +55,11 @@
.intro-note {
margin-top: 43px;
display: flex;
- strong {
+ p {
width: 50%;
+ margin-top: 0;
margin-right: 5%;
- font-size: 24px;
+ font-size: 18px;
font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
line-height: 32px;
}
@@ -122,7 +123,7 @@
color: #000;
.article_title {
text-align: left;
- font-size: 24px;
+ font-size: 22px;
color: #000;
font-weight: bold;
font-family: "Rubik", "Helvetica Neue", Helvetica, Arial, sans-serif;
@@ -133,6 +134,9 @@
.language-header {
display: flex;
flex-direction: row;
+ @media screen and (max-width: 600px) {
+ flex-direction: column;
+ }
justify-content: space-between;
.language-title {
margin: 0 0 10px 0;
@@ -159,11 +163,17 @@
.library-info {
display: flex;
flex-direction: row;
+ @media screen and (max-width: 600px) {
+ flex-direction: column;
+ }
justify-content: space-between;
margin-top: 36px;
margin-bottom: 40px;
.library-details {
width: 30%;
+ @media screen and (max-width: 600px) {
+ width: 100%;
+ }
.library-name {
font-size: 24px;
font-weight: bold;
@@ -192,18 +202,22 @@
}
}
.library-howto {
+ @media screen and (max-width: 600px) {
+ width: 100%;
+ }
width: 60%;
position: relative;
.library-howto-content {
overflow: hidden;
+ pre.prism {
+ margin: 1em 0;
+ }
+
&.not-expanded {
max-height: 450px;
}
- &.expanded {
- max-height: none;
- border-bottom-style: solid;
- border-bottom-color: #C4C4C4;
- border-bottom-width: 3px;
+ &.expanded img {
+ display: none;
}
p {
margin: 0;
@@ -251,10 +265,7 @@
}
}
&.expanded {
- width: 100%;
- height: 30px;
- text-align: center;
- transform: rotate(180deg);
+ display: none;
}
}
}
diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx
index 0c2d3cb8d4..b5defcbcf3 100644
--- a/src/components/Footer/index.tsx
+++ b/src/components/Footer/index.tsx
@@ -31,7 +31,6 @@ const getLinks = (sourcePath: string): FooterLinks[] => [
{ text: "Languages", href: "/code/#languages" },
{ text: "Tools", href: "/code/#tools" },
{ text: "Services", href: "/code/#services" },
- { text: "More Stuff", href: "/code/#more-stuff" },
],
},
{
diff --git a/src/content/code/more-stuff/awesome-graphql.md b/src/content/code/more-stuff/awesome-graphql.md
deleted file mode 100644
index bd6f9af7b2..0000000000
--- a/src/content/code/more-stuff/awesome-graphql.md
+++ /dev/null
@@ -1,8 +0,0 @@
----
-name: awesome-graphql
-description: A fantastic community maintained collection of libraries, resources, and more.
-url: https://github.com/chentsulin/awesome-graphql
-github: chentsulin/awesome-graphql
----
-
-
diff --git a/src/content/code/slug-map.json b/src/content/code/slug-map.json
index beec53e07e..a4895135eb 100644
--- a/src/content/code/slug-map.json
+++ b/src/content/code/slug-map.json
@@ -10,7 +10,7 @@
"go": "Go",
"groovy": "Groovy",
"haskell": "Haskell",
- "java-kotlin-android": "Java / Kotlin / Android",
+ "java-kotlin-android": "Java / Kotlin",
"javascript": "JavaScript",
"julia": "Julia",
"perl": "Perl",
@@ -21,11 +21,10 @@
"rust": "Rust",
"scala": "Scala",
"ocaml-reason": "OCaml / Reason",
- "swift-objective-c-ios": "Swift / Objective-C iOS",
+ "swift-objective-c-ios": "Swift / Objective-C",
"language-support": "Language Support",
"client": "Client",
"server": "Server",
"tools": "Tools",
- "services": "Services",
- "more-stuff": "More Stuff"
+ "services": "Services"
}
diff --git a/src/pages/code.tsx b/src/pages/code.tsx
index 518f5d0c26..0e3ae0a916 100644
--- a/src/pages/code.tsx
+++ b/src/pages/code.tsx
@@ -104,7 +104,7 @@ export function buildLibraryContent(library: any, pageContext: any) {
{overflown && (
setExpanded(!expanded)}>
+ onClick={() => setExpanded(true)}>
)}
@@ -196,7 +196,7 @@ export function buildLanguagesContent(pageContext: any) {
export default ({ pageContext }: any) => {
return (
-
+
Code
@@ -207,11 +207,11 @@ export default ({ pageContext }: any) => {
-
+
Because GraphQL is a communication pattern, there are many tools
to help you get started working which support GraphQL in all
sorts of languages.
-
+
Go to
@@ -224,9 +224,6 @@ export default ({ pageContext }: any) => {
Services
-
- More Stuff
-
@@ -252,17 +249,6 @@ export default ({ pageContext }: any) => {
{buildLibraryList(pageContext.otherLibraries.Services, pageContext)}
-
-
- More Stuff
-
- #
-
-
- {buildLibraryList(
- pageContext.otherLibraries["More Stuff"],
- pageContext
- )}
From 99aedfa397f7d71a38d8edcacac3a3a282e4c717 Mon Sep 17 00:00:00 2001
From: Arda TANRIKULU
Date: Tue, 17 Nov 2020 18:56:20 +0300
Subject: [PATCH 27/27] Small fixes
---
.../code/language-support/groovy/server/gorm-graphql.md | 4 ++--
src/content/code/language-support/ruby/server/agoo.md | 2 +-
2 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/src/content/code/language-support/groovy/server/gorm-graphql.md b/src/content/code/language-support/groovy/server/gorm-graphql.md
index a8aaae05fd..9c6ba9c890 100644
--- a/src/content/code/language-support/groovy/server/gorm-graphql.md
+++ b/src/content/code/language-support/groovy/server/gorm-graphql.md
@@ -1,7 +1,7 @@
---
name: gorm-graphql
-description: undefined
-url: https://github.com/grails/gorm-graphql/
+description: An automatic GraphQL schema generator for GORM
+url: https://grails.github.io/gorm-graphql/latest/guide/index.html
github: grails/gorm-graphql
---
diff --git a/src/content/code/language-support/ruby/server/agoo.md b/src/content/code/language-support/ruby/server/agoo.md
index 1f69c728a9..be7b315dd5 100644
--- a/src/content/code/language-support/ruby/server/agoo.md
+++ b/src/content/code/language-support/ruby/server/agoo.md
@@ -1,7 +1,7 @@
---
name: Agoo
description: A high performance web server with support for GraphQL. Agoo strives for a simple, easy to use API for GraphQL.
-url: undefined
+url: https://github.com/ohler55/agoo
github: ohler55/agoo
gem: agoo
---