{"id":13471830,"url":"https://github.com/graph-gophers/graphql-go","last_synced_at":"2026-05-11T11:07:49.093Z","repository":{"id":38343021,"uuid":"71253874","full_name":"graph-gophers/graphql-go","owner":"graph-gophers","description":"GraphQL server with a focus on ease of use","archived":false,"fork":false,"pushed_at":"2026-04-29T11:04:48.000Z","size":2315,"stargazers_count":4748,"open_issues_count":10,"forks_count":493,"subscribers_count":79,"default_branch":"main","last_synced_at":"2026-05-06T13:06:49.916Z","etag":null,"topics":["go","golang","graphql"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"bsd-2-clause","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/graph-gophers.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2016-10-18T13:57:24.000Z","updated_at":"2026-05-02T01:58:37.000Z","dependencies_parsed_at":"2026-04-25T02:10:18.565Z","dependency_job_id":null,"html_url":"https://github.com/graph-gophers/graphql-go","commit_stats":{"total_commits":569,"total_committers":95,"mean_commits":5.989473684210527,"dds":0.5518453427065027,"last_synced_commit":"8fb462468c986c352c3da5e490f573582cc049ee"},"previous_names":["neelance/graphql-go"],"tags_count":13,"template":false,"template_full_name":null,"purl":"pkg:github/graph-gophers/graphql-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graph-gophers%2Fgraphql-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graph-gophers%2Fgraphql-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graph-gophers%2Fgraphql-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graph-gophers%2Fgraphql-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/graph-gophers","download_url":"https://codeload.github.com/graph-gophers/graphql-go/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/graph-gophers%2Fgraphql-go/sbom","scorecard":{"id":443721,"data":{"date":"2025-08-11","repo":{"name":"github.com/graph-gophers/graphql-go","commit":"ee0376e68af239e8d23129377a547b531bf85ff3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":7,"checks":[{"name":"Maintained","score":10,"reason":"18 commit(s) and 1 issue activity found in the last 90 days -- score normalized to 10","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Security-Policy","score":4,"reason":"security policy file detected","details":["Info: security policy file detected: SECURITY.md:1","Warn: no linked content found","Info: Found disclosure, vulnerability, and/or timelines in security policy: SECURITY.md:1","Info: Found text in security policy: SECURITY.md:1"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Code-Review","score":2,"reason":"Found 2/9 approved changesets -- score normalized to 2","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Token-Permissions","score":9,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Info: topLevel 'contents' permission set to 'read': .github/workflows/go.yml:12","Info: topLevel 'pull-requests' permission set to 'read': .github/workflows/go.yml:13","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:41: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:45: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:56: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:70: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/codeql-analysis.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:19: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/go.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/go.yml:22: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/go.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/go.yml:33: update your workflow using https://app.stepsecurity.io/secureworkflow/graph-gophers/graphql-go/go.yml/master?enable=pin","Info:   0 out of   6 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   1 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Fuzzing","score":10,"reason":"project is fuzzed","details":["Info: GoBuiltInFuzzer integration found: fuzz_test.go:11"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: BSD 2-Clause \"Simplified\" License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":9,"reason":"SAST tool detected but not run on all commits","details":["Info: SAST configuration detected: CodeQL","Warn: 28 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":5,"reason":"5 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-19T06:11:28.163Z","repository_id":38343021,"created_at":"2025-08-19T06:11:28.163Z","updated_at":"2025-08-19T06:11:28.163Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32892001,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-10T13:40:02.631Z","status":"online","status_checked_at":"2026-05-11T02:00:05.975Z","response_time":120,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["go","golang","graphql"],"created_at":"2024-07-31T16:00:49.621Z","updated_at":"2026-05-11T11:07:49.087Z","avatar_url":"https://github.com/graph-gophers.png","language":"Go","funding_links":[],"categories":["开源类库","Go","Libraries","Open source library","Implementations","Query Language","Repositories","Relational Databases"],"sub_categories":["查询语言","Go Libraries","Query Language","Go","HTTP Clients"],"readme":"# graphql-go [![Sourcegraph](https://sourcegraph.com/github.com/graph-gophers/graphql-go/-/badge.svg)](https://sourcegraph.com/github.com/graph-gophers/graphql-go?badge) [![Go](https://github.com/graph-gophers/graphql-go/actions/workflows/go.yml/badge.svg)](https://github.com/graph-gophers/graphql-go/actions/workflows/go.yml) [![Go Report](https://goreportcard.com/badge/github.com/graph-gophers/graphql-go)](https://goreportcard.com/report/github.com/graph-gophers/graphql-go) [![GoDoc](https://godoc.org/github.com/graph-gophers/graphql-go?status.svg)](https://godoc.org/github.com/graph-gophers/graphql-go)\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"docs/img/logo.png\" width=\"300\"\u003e\u003c/p\u003e\n\nThe goal of this project is to provide full support of the [September 2025 GraphQL specification](https://spec.graphql.org/September2025/) with a set of idiomatic, easy to use Go packages.\n\nWhile still under development (`internal` APIs are almost certainly subject to change), this library is safe for production use.\n\n## Features\n\n- minimal API\n- support for `context.Context`\n- support for the `OpenTelemetry` and `OpenTracing` standards\n- schema type-checking against resolvers\n- resolvers are matched to the schema based on method sets (can resolve a GraphQL schema with a Go interface or Go struct).\n- handles panics in resolvers\n- parallel execution of resolvers\n- inspect the selected fields and their args to prefetch data and avoid the N+1 query problem\n- subscriptions\n  - [sample WS transport](https://github.com/graph-gophers/graphql-transport-ws)\n\n## (Some) Documentation [![GoDoc](https://godoc.org/github.com/graph-gophers/graphql-go?status.svg)](https://godoc.org/github.com/graph-gophers/graphql-go)\n\n### Getting started\n\nIn order to run a simple GraphQL server locally create a `main.go` file with the following content:\n\n```go\npackage main\n\nimport (\n    \"log\"\n    \"net/http\"\n\n    graphql \"github.com/graph-gophers/graphql-go\"\n    \"github.com/graph-gophers/graphql-go/relay\"\n)\n\ntype query struct{}\n\nfunc (query) Hello() string { return \"Hello, world!\" }\n\nfunc main() {\n    s := `\n        type Query {\n                hello: String!\n        }\n    `\n    schema := graphql.MustParseSchema(s, \u0026query{})\n    http.Handle(\"/query\", \u0026relay.Handler{Schema: schema})\n    log.Fatal(http.ListenAndServe(\":8080\", nil))\n}\n\n```\n\nThen run the file with `go run main.go`. To test:\n\n```sh\ncurl -XPOST -d '{\"query\": \"{ hello }\"}' localhost:8080/query\n```\n\nFor more realistic usecases check our [examples section](https://github.com/graph-gophers/graphql-go/wiki/Examples).\n\n### Resolvers\n\nA resolver must have one method or field for each field of the GraphQL type it resolves. The method or field name has to be [exported](https://golang.org/ref/spec#Exported_identifiers) and match the schema's field's name in a non-case-sensitive way.\nYou can use struct fields as resolvers by using `SchemaOpt: UseFieldResolvers()`. For example,\n\n```go\nopts := []graphql.SchemaOpt{graphql.UseFieldResolvers()}\nschema := graphql.MustParseSchema(s, \u0026query{}, opts...)\n```\n\nWhen using `UseFieldResolvers` schema option, a struct field will be used *only* when:\n\n- there is no method for a struct field\n- a struct field does not implement an interface method\n- a struct field does not have arguments\n\nThe method has up to two arguments:\n\n- Optional `context.Context` argument.\n- Mandatory `*struct { ... }` argument if the corresponding GraphQL field has arguments. The names of the struct fields have to be [exported](https://golang.org/ref/spec#Exported_identifiers) and have to match the names of the GraphQL arguments in a non-case-sensitive way.\n\nThe method has up to two results:\n\n- The GraphQL field's value as determined by the resolver.\n- Optional `error` result.\n\nExample for a simple resolver method:\n\n```go\nfunc (r *helloWorldResolver) Hello() string {\n    return \"Hello world!\"\n}\n```\n\nThe following signature is also allowed:\n\n```go\nfunc (r *helloWorldResolver) Hello(ctx context.Context) (string, error) {\n    return \"Hello world!\", nil\n}\n```\n\n### Separate resolvers for different operations\n\nThis feature was released in `v1.6.0`.\n\nThe GraphQL specification allows for fields with the same name defined in different query types. For example, the schema below is a valid schema definition:\n\n```graphql\nschema {\n  query: Query\n  mutation: Mutation\n}\n\ntype Query {\n  hello: String!\n}\n\ntype Mutation {\n  hello: String!\n}\n```\n\nThe above schema would result in name collision if we use a single resolver struct because fields from both operations correspond to methods in the root resolver (the same Go struct). In order to resolve this issue, the library allows resolvers for query, mutation and subscription operations to be separated using the `Query`, `Mutation` and `Subscription` methods of the root resolver. These special methods are optional and if defined return the resolver for each opeartion. For example, the following is a resolver corresponding to the schema definition above. Note that there is a field named `hello` in both the query and the mutation definitions:\n\n```go\ntype RootResolver struct{}\ntype QueryResolver struct{}\ntype MutationResolver struct{}\n\nfunc(r *RootResolver) Query() *QueryResolver {\n    return \u0026QueryResolver{}\n}\n\nfunc(r *RootResolver) Mutation() *MutationResolver {\n    return \u0026MutationResolver{}\n}\n\nfunc (*QueryResolver) Hello() string {\n    return \"Hello query!\"\n}\n\nfunc (*MutationResolver) Hello() string {\n    return \"Hello mutation!\"\n}\n\nschema := graphql.MustParseSchema(sdl, \u0026RootResolver{}, nil)\n...\n```\n\n### Schema Options\n\n- `UseStringDescriptions()` enables schema/type-system description strings (double and triple quoted). When this is not enabled, schema comments are parsed as descriptions instead.\n- `UseFieldResolvers()` specifies whether to use struct field resolvers.\n- `MaxDepth(n int)` specifies the maximum field nesting depth in a query. The default is 0 which disables max depth checking.\n- `MaxParallelism(n int)` specifies the maximum number of resolvers per request allowed to run in parallel. The default is 10.\n- `MaxPooledBufferCap(n int)` specifies the maximum buffer capacity of buffers stored in the internal memory pool. Defaults to 16KB. Buffers larger than this limit are discarded instead of pooled.\n- `Tracer(tracer trace.Tracer)` is used to trace queries and fields. It defaults to `noop.Tracer`.\n- `Logger(logger log.Logger)` is used to log panics during query execution. It defaults to `exec.DefaultLogger`.\n- `PanicHandler(panicHandler errors.PanicHandler)` is used to transform panics into errors during query execution. It defaults to `errors.DefaultPanicHandler`.\n- `DisableIntrospection()` disables introspection queries.\n- `DisableFieldSelections()` disables capturing child field selections used by helper APIs (see below).\n- `DisableMemoryPooling()` disables internal execution-path memory pooling. Pooling is enabled by default; this option is intended for diagnostics and benchmark comparisons.\n- `OverlapValidationLimit(n int)` sets a hard cap on examined overlap pairs during validation; exceeding it emits `OverlapValidationLimitExceeded` error.\n\n### Field Selection Inspection Helpers\n\nResolvers can introspect which immediate child fields were requested using:\n\n```go\ngraphql.SelectedFieldNames(ctx)       // []string of direct child schema field names\ngraphql.HasSelectedField(ctx, \"name\") // bool\ngraphql.SortedSelectedFieldNames(ctx) // sorted copy\n```\n\nUse cases include building projection lists for databases or conditionally avoiding expensive sub-fetches. The helpers are intentionally shallow (only direct children) and fragment spreads / inline fragments are flattened with duplicates removed; meta fields (e.g. `__typename`) are excluded.\n\nPerformance: selection data is computed lazily only when a helper is called. If you never call them there is effectively no additional overhead. To remove even the small context value insertion you can opt out with `DisableFieldSelections()`; helpers then return empty results.\n\nFor more detail and examples see the [docs](https://godoc.org/github.com/graph-gophers/graphql-go).\n\n### Custom Errors\n\nErrors returned by resolvers can include custom extensions by implementing the `ResolverError` interface:\n\n```go\ntype ResolverError interface {\n    error\n    Extensions() map[string]any\n}\n```\n\nExample of a simple custom error:\n\n```go\ntype droidNotFoundError struct {\n    Code    string `json:\"code\"`\n    Message string `json:\"message\"`\n}\n\nfunc (e droidNotFoundError) Error() string {\n    return fmt.Sprintf(\"error [%s]: %s\", e.Code, e.Message)\n}\n\nfunc (e droidNotFoundError) Extensions() map[string]any {\n    return map[string]any{\n        \"code\":    e.Code,\n        \"message\": e.Message,\n    }\n}\n```\n\nWhich could produce a GraphQL error such as:\n\n```json\n{\n  \"errors\": [\n    {\n      \"message\": \"error [NotFound]: This is not the droid you are looking for\",\n      \"path\": [\n        \"droid\"\n      ],\n      \"extensions\": {\n        \"code\": \"NotFound\",\n        \"message\": \"This is not the droid you are looking for\"\n      }\n    }\n  ],\n  \"data\": null\n}\n```\n\n### Tracing\n\nBy default the library uses `noop.Tracer`. If you want to change that you can use the OpenTelemetry or the OpenTracing implementations, respectively:\n\n```go\n// OpenTelemetry tracer\npackage main\n\nimport (\n    \"github.com/graph-gophers/graphql-go\"\n    \"github.com/graph-gophers/graphql-go/example/starwars\"\n    otelgraphql \"github.com/graph-gophers/graphql-go/trace/otel\"\n    \"github.com/graph-gophers/graphql-go/trace/tracer\"\n)\n// ...\n_, err := graphql.ParseSchema(starwars.Schema, nil, graphql.Tracer(otelgraphql.DefaultTracer()))\n// ...\n```\n\nAlternatively you can pass an existing trace.Tracer instance:\n\n```go\ntr := otel.Tracer(\"example\")\n_, err = graphql.ParseSchema(starwars.Schema, nil, graphql.Tracer(\u0026otelgraphql.Tracer{Tracer: tr}))\n```\n\n```go\n// OpenTracing tracer\npackage main\n\nimport (\n    \"github.com/graph-gophers/graphql-go\"\n    \"github.com/graph-gophers/graphql-go/example/starwars\"\n    \"github.com/graph-gophers/graphql-go/trace/opentracing\"\n    \"github.com/graph-gophers/graphql-go/trace/tracer\"\n)\n// ...\n_, err := graphql.ParseSchema(starwars.Schema, nil, graphql.Tracer(opentracing.Tracer{}))\n\n// ...\n```\n\nIf you need to implement a custom tracer the library would accept any tracer which implements the interface below:\n\n```go\ntype Tracer interface {\n    TraceQuery(ctx context.Context, queryString string, operationName string, variables map[string]any, varTypes map[string]*introspection.Type) (context.Context, func([]*errors.QueryError))\n    TraceField(ctx context.Context, label, typeName, fieldName string, trivial bool, args map[string]any) (context.Context, func(*errors.QueryError))\n    TraceValidation(context.Context) func([]*errors.QueryError)\n}\n```\n\n### [Examples](https://github.com/graph-gophers/graphql-go/wiki/Examples)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraph-gophers%2Fgraphql-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraph-gophers%2Fgraphql-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraph-gophers%2Fgraphql-go/lists"}