Skip to main content

Merge GraphQL fragments into the parent query

Project description

gql-defrag

Do you have complex GraphQL queries that are made up of lot of fragments? Do you want to figure out who is querying all those fields? Then gql-defrag can help you. It takes in the text of all your queries and fragments, and returns a new query that inlines all the fragments and labels fields with their origin.

Example:

>>> from gql_defrag import Defragmenter
>>> defrag = Defragmenter(["""
... query SomeQuery {
...     field
...     name
...     ...SomeFragment
... }
...
... fragment SomeFragment on SomeType {
...     fragmentField
...     field
... }
... """])
>>> print(defrag.defragment("SomeQuery"))
query SomeQuery {
  field @gql_defrag_source(name: "SomeQuery") @gql_defrag_source(name: "SomeQuery -> SomeFragment")
  fragmentField @gql_defrag_source(name: "SomeQuery -> SomeFragment")
  name @gql_defrag_source(name: "SomeQuery")
}

Programmatic usage

gql_defrag.Defragmenter(documents: Sequence[str])

Instantiate a Defragmenter to start defragmenting some queries. Pass in a series of GraphQL documents. Each may contain one or more queries, fragments, or both.

Defragmenter.add_document(document: str) -> None

Add a document to the Defragmenter. The document may contain any number of queries or fragments.

Defragmenter.defragment(query_name: str, *, add_source: bool = True) -> str

Return a defragmented version of the operation (query, mutation, or subscription) named query_name. If add_source is True, add @gql_defrag_source directives explaining what sequence of fragments triggered each field.

Defragmenter.defragment_all(*, add_source: bool = True) -> Iterable[tuple[str, str]]

Yields pairs of (query name, defragmented query) for all operations that the Defragmenter knows about.

Command-line usage

$ python -m gql_defrag --help
usage: __main__.py [-h] [--js-dir JS_DIR] [--graphql-dir GRAPHQL_DIR] [--relay-dir RELAY_DIR] [--output-dir OUTPUT_DIR] [--include-source]

Defrag GraphQL queries

options:
  -h, --help            show this help message and exit
  --js-dir JS_DIR       Directory with JavaScript files containing GraphQL fragments and queries
  --graphql-dir GRAPHQL_DIR
                        Directory with GraphQL files with .graphql extensions
  --relay-dir RELAY_DIR
                        Directory with Relay files with .graphql.ts extensions
  --output-dir OUTPUT_DIR
                        Directory to write defragmented queries to
  --include-source      Include verbose source information

The command-line interface collects GraphQL queries from one or more directories and outputs defragmented queries to an output directory.

There are three ways to find GraphQL queries:

  • --graphql-dir looks at a directory containing .graphql files that contain GraphQL queries
  • --js-dir looks at a directory containing JavaScript or TypeScript files that contain pieces of GraphQL within template literals prefixed with graphql or gql. The code looks at files with the extensions .js, .jsx, .ts, and .tsx.
  • --relay-dir looks at a directory containing Relay generated files with the .graphql.ts extension.

Defragmented files are placed in the directory specified by --output-dir. If the directory does not exist, it is created. The file names are of the form <query name>.graphql.

If --include-source is given, @gql_defrag_source are added with precise source information for each field.

Changelog

Version 0.1.1 (July 25, 2023)

  • Fix bug with handling of fields that contain "null" in their name

Version 0.1.0 (May 3, 2023)

Initial public release.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

gql_defrag-0.2.0.tar.gz (6.4 kB view details)

Uploaded Source

Built Distribution

gql_defrag-0.2.0-py3-none-any.whl (6.0 kB view details)

Uploaded Python 3

File details

Details for the file gql_defrag-0.2.0.tar.gz.

File metadata

  • Download URL: gql_defrag-0.2.0.tar.gz
  • Upload date:
  • Size: 6.4 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for gql_defrag-0.2.0.tar.gz
Algorithm Hash digest
SHA256 09e3f739fef01909ade7bb111f76990c8709b427f0e043833b44ed3b0400016c
MD5 ac092758c48ee89bee24ea3842e70a79
BLAKE2b-256 d97425abcf983d6303f83d544d9c5dd6c06856d46b2ede1e8d96ca302ad2ef00

See more details on using hashes here.

File details

Details for the file gql_defrag-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: gql_defrag-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 6.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/4.0.2 CPython/3.11.5

File hashes

Hashes for gql_defrag-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 a575bc64a19d6ee9860ccb7ecc661e7e15a5c22eb1a39990882f3e5eed8ba6fd
MD5 78a41942102220e5cd5ca5fe7d6ec53d
BLAKE2b-256 a54dc5b6d4663d48097945793b5fc2b86b894a3ad43dd88d51c61b1d6a26b55e

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page