{"id":13726794,"url":"https://github.com/yamafaktory/craftql","last_synced_at":"2025-04-09T20:06:05.936Z","repository":{"id":39859237,"uuid":"286066773","full_name":"yamafaktory/craftql","owner":"yamafaktory","description":"A CLI tool to visualize GraphQL schemas and to output a graph data structure as a graphviz .dot format","archived":false,"fork":false,"pushed_at":"2023-05-18T08:02:16.000Z","size":286,"stargazers_count":109,"open_issues_count":0,"forks_count":2,"subscribers_count":3,"default_branch":"main","last_synced_at":"2025-04-09T20:06:00.616Z","etag":null,"topics":["cli","devops","graph","graphql","graphviz","graphviz-dot","rust","rustlang","schema","schemas","terminal","visualization"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/yamafaktory.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE-MIT","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null}},"created_at":"2020-08-08T15:14:25.000Z","updated_at":"2024-10-12T12:15:42.000Z","dependencies_parsed_at":"2024-02-04T19:43:29.359Z","dependency_job_id":null,"html_url":"https://github.com/yamafaktory/craftql","commit_stats":{"total_commits":119,"total_committers":1,"mean_commits":119.0,"dds":0.0,"last_synced_commit":"49cbf18940bc5e77621c471bd97b6da7624e97a7"},"previous_names":[],"tags_count":26,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamafaktory%2Fcraftql","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamafaktory%2Fcraftql/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamafaktory%2Fcraftql/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/yamafaktory%2Fcraftql/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/yamafaktory","download_url":"https://codeload.github.com/yamafaktory/craftql/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248103871,"owners_count":21048245,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","devops","graph","graphql","graphviz","graphviz-dot","rust","rustlang","schema","schemas","terminal","visualization"],"created_at":"2024-08-03T01:03:22.745Z","updated_at":"2025-04-09T20:06:05.906Z","avatar_url":"https://github.com/yamafaktory.png","language":"Rust","funding_links":[],"categories":["Tools","Neutral Security","Rust"],"sub_categories":["Tools - Editors \u0026 IDEs \u0026 Explorers","Visualizers"],"readme":"# CraftQL\n\n![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/yamafaktory/craftql/ci.yml?branch=main\u0026logo=github\u0026style=flat-square) ![Crates.io](https://img.shields.io/crates/v/craftql?style=flat-square)\n\n\u003e A CLI tool to visualize GraphQL schemas and to output a graph data structure as a graphviz .dot format\n\n## Installation\n\n```sh\ncargo install craftql\n```\n\n## Usage\n\n```sh\nUSAGE:\n    craftql [FLAGS] [OPTIONS] \u003cpath\u003e\n\nARGS:\n    \u003cpath\u003e\n            Path to get files from\n\nFLAGS:\n    -h, --help\n            Prints help information\n\n    -m, --missing-definitions\n            Finds and displays missing definition(s)\n\n    -O, --orphans\n            Finds and displays orphan(s) node(s)\n\n    -V, --version\n            Prints version information\n\n\nOPTIONS:\n    -f, --filter \u003cfilter\u003e...\n            Filter nodes by GraphQL type(s)\n\n            - directive\n            - enum\n            - enum_extension\n            - input_object\n            - input_object_extension\n            - interface\n            - interface_extension\n            - object\n            - object_extension\n            - scalar\n            - scalar_extension\n            - schema\n            - union\n            - union_extension\n    -i, --incoming-dependencies \u003cincoming-dependencies\u003e\n            Finds and displays incoming dependencies of a node\n\n    -n, --node \u003cnode\u003e\n            Finds and displays one node\n\n    -N, --nodes \u003cnodes\u003e...\n            Finds and displays multiple nodes\n\n    -o, --outgoing-dependencies \u003coutgoing-dependencies\u003e\n            Finds and displays outgoing dependencies of a node\n```\n\n### Output a graphviz .dot format\n\n```sh\ncraftql tests/fixtures\n\ndigraph {\n    0 [ label = \"DateTime (Scalar)\" ]\n    1 [ label = \"Character (Interface extension)\\l\\l[Boolean, Character]\" ]\n    2 [ label = \"Human (Object)\\l\\l[Character, Episode, Float, FriendsConnection, ID, Int, LengthUnit, Starship, String]\" ]\n    3 [ label = \"Droid (Object)\\l\\l[Character, Episode, FriendsConnection, ID, Int, String]\" ]\n    4 [ label = \"FriendsConnection (Object)\\l\\l[Character, FriendsEdge, Int, PageInfo]\" ]\n    5 [ label = \"FriendsEdge (Object)\\l\\l[Character, ID]\" ]\n    6 [ label = \"PageInfo (Object)\\l\\l[Boolean, ID, test]\" ]\n    7 [ label = \"Review (Object)\\l\\l[DateTime, Episode, Int, String, test]\" ]\n    8 [ label = \"Orphan (Object)\\l\\l[ID]\" ]\n    9 [ label = \"ColorInput (InputObject extension)\\l\\l[ColorInput, Int]\" ]\n    10 [ label = \"Episode (Enum extension)\\l\\l[Episode]\" ]\n    11 [ label = \"deprecated (Directive)\\l\\l[String]\" ]\n    12 [ label = \"DateTime (Scalar extension)\\l\\l[DateTime, test]\" ]\n    13 [ label = \"SearchResult (Union extension)\\l\\l[Ewok, SearchResult]\" ]\n    14 [ label = \"test (Directive)\\l\\l[Letter]\" ]\n    15 [ label = \"Episode (Enum)\\l\\l[deprecated, test]\" ]\n    16 [ label = \"LengthUnit (Enum)\" ]\n    17 [ label = \"Starship (Object extension)\\l\\l[Boolean, Starship]\" ]\n    18 [ label = \"Query (Object)\\l\\l[Character, Droid, Episode, Human, ID, Review, SearchResult, Starship, String]\" ]\n    19 [ label = \"Mutation (Object)\\l\\l[Episode, Review, ReviewInput]\" ]\n    20 [ label = \"Subscription (Object)\\l\\l[Episode, Review]\" ]\n    21 [ label = \"schema (Schema)\\l\\l[Mutation, Query, Subscription]\" ]\n    22 [ label = \"ReviewInput (InputObject)\\l\\l[ColorInput, Int, ReviewInput, String]\" ]\n    23 [ label = \"ColorInput (InputObject)\\l\\l[ColorInput, deprecated, Int, test]\" ]\n    24 [ label = \"Letter (Enum)\" ]\n    25 [ label = \"Starship (Object)\\l\\l[deprecated, Float, ID, LengthUnit, String]\" ]\n    26 [ label = \"Character (Interface)\\l\\l[Bool, Character, deprecated, Episode, FriendsConnection, ID, Int, String, test]\" ]\n    27 [ label = \"SearchResult (Union)\\l\\l[Droid, Human, Starship, test]\" ]\n    13 -\u003e 27 [ ]\n    14 -\u003e 6 [ ]\n    26 -\u003e 4 [ ]\n    5 -\u003e 4 [ ]\n    6 -\u003e 4 [ ]\n    11 -\u003e 25 [ ]\n    16 -\u003e 25 [ ]\n    26 -\u003e 26 [ ]\n    11 -\u003e 26 [ ]\n    15 -\u003e 26 [ ]\n    4 -\u003e 26 [ ]\n    14 -\u003e 26 [ ]\n    26 -\u003e 3 [ ]\n    15 -\u003e 3 [ ]\n    4 -\u003e 3 [ ]\n    17 -\u003e 25 [ ]\n    15 -\u003e 20 [ ]\n    7 -\u003e 20 [ ]\n    19 -\u003e 21 [ ]\n    18 -\u003e 21 [ ]\n    20 -\u003e 21 [ ]\n    9 -\u003e 23 [ ]\n    26 -\u003e 18 [ ]\n    3 -\u003e 18 [ ]\n    15 -\u003e 18 [ ]\n    2 -\u003e 18 [ ]\n    7 -\u003e 18 [ ]\n    27 -\u003e 18 [ ]\n    25 -\u003e 18 [ ]\n    26 -\u003e 2 [ ]\n    15 -\u003e 2 [ ]\n    4 -\u003e 2 [ ]\n    16 -\u003e 2 [ ]\n    25 -\u003e 2 [ ]\n    1 -\u003e 26 [ ]\n    15 -\u003e 19 [ ]\n    7 -\u003e 19 [ ]\n    22 -\u003e 19 [ ]\n    23 -\u003e 22 [ ]\n    22 -\u003e 22 [ ]\n    23 -\u003e 23 [ ]\n    11 -\u003e 23 [ ]\n    14 -\u003e 23 [ ]\n    24 -\u003e 14 [ ]\n    12 -\u003e 0 [ ]\n    12 -\u003e 14 [ ]\n    11 -\u003e 15 [ ]\n    14 -\u003e 15 [ ]\n    10 -\u003e 15 [ ]\n    0 -\u003e 7 [ ]\n    15 -\u003e 7 [ ]\n    14 -\u003e 7 [ ]\n    26 -\u003e 5 [ ]\n    3 -\u003e 27 [ ]\n    2 -\u003e 27 [ ]\n    25 -\u003e 27 [ ]\n    14 -\u003e 27 [ ]\n}\n```\n\n![graph](graph.svg)\n\n### Filter nodes by GraphQL types(s)\n\n```sh\ncraftql tests/fixtures --filter object object_extension\n\ndigraph {\n    0 [ label = \"Orphan (Object)\\l\\l[ID]\" ]\n    1 [ label = \"Human (Object)\\l\\l[Character, Episode, Float, FriendsConnection, ID, Int, LengthUnit, Starship, String]\" ]\n    2 [ label = \"Droid (Object)\\l\\l[Character, Episode, FriendsConnection, ID, Int, String]\" ]\n    3 [ label = \"FriendsConnection (Object)\\l\\l[Character, FriendsEdge, Int, PageInfo]\" ]\n    4 [ label = \"FriendsEdge (Object)\\l\\l[Character, ID]\" ]\n    5 [ label = \"PageInfo (Object)\\l\\l[@test, Boolean, ID]\" ]\n    6 [ label = \"Review (Object)\\l\\l[@test, DateTime, Episode, Int, String]\" ]\n    7 [ label = \"Query (Object)\\l\\l[Character, Droid, Episode, Human, ID, Review, SearchResult, Starship, String]\" ]\n    8 [ label = \"Mutation (Object)\\l\\l[Episode, Review, ReviewInput]\" ]\n    9 [ label = \"Subscription (Object)\\l\\l[Episode, Review]\" ]\n    10 [ label = \"Starship (Object extension)\\l\\l[Boolean, Starship]\" ]\n    11 [ label = \"Starship (Object)\\l\\l[@deprecated, Float, ID, LengthUnit, String]\" ]\n    4 -\u003e 3 [ ]\n    5 -\u003e 3 [ ]\n    10 -\u003e 11 [ ]\n    2 -\u003e 7 [ ]\n    1 -\u003e 7 [ ]\n    6 -\u003e 7 [ ]\n    11 -\u003e 7 [ ]\n    6 -\u003e 9 [ ]\n    3 -\u003e 2 [ ]\n    6 -\u003e 8 [ ]\n    3 -\u003e 1 [ ]\n    11 -\u003e 1 [ ]\n}\n```\n\n### Find and display one node\n\n```sh\ncraftql tests/fixtures --node Character\n\n# tests/fixtures/Types/Interfaces/Character.graphql\ninterface Character @test {\n  id: ID!\n  name: String!\n  friends: [Character]\n  friendsConnection(first: Int, after: ID): FriendsConnection!\n  appearsIn: [Episode]!\n  cute: Bool! @deprecated\n}\n```\n\n### Find and display multiple nodes\n\n```sh\ncraftql tests/fixtures --nodes Character Episode\n\n# tests/fixtures/Types/Interfaces/Character.graphql\ninterface Character @test {\n  id: ID!\n  name: String!\n  friends: [Character]\n  friendsConnection(first: Int, after: ID): FriendsConnection!\n  appearsIn: [Episode]!\n  cute: Bool! @deprecated\n}\n\n\n# tests/fixtures/Types/Enums/Episode.gql\nenum Episode @test(letter: B) {\n  NEWHOPE @deprecated\n  EMPIRE\n  JEDI\n}\n```\n\n### Find and display orphan(s) node(s)\n\n```sh\ncraftql tests/fixtures --orphans\n\n# tests/fixtures/Types/Types/orphan.gql\ntype Orphan {\n  id: ID!\n}\n```\n\n### Find and display incoming dependencies of a node\n\n```sh\ncraftql tests/fixtures --incoming-dependencies Starship\n\n# tests/fixtures/Types/Types/extension.graphql\nextend type Starship {\n  antiGravity: Boolean!\n}\n\n\n# tests/fixtures/Types/Enums/LengthUnit.graphql\nenum LengthUnit {\n  METER\n  FOOT\n}\n\n\n# tests/fixtures/Directives/deprecated.graphql\ndirective @deprecated(reason: String = \"No longer supported\") on FIELD_DEFINITION | ENUM_VALUE\n```\n\n### Find and display outgoing dependencies of a node\n\n```sh\ncraftql tests/fixtures --outgoing-dependencies Starship\n\n# tests/fixtures/Types/Types/b.graphql\ntype Human implements Character {\n  id: ID!\n  name: String!\n  homePlanet: String\n  height(unit: LengthUnit = METER): Float\n  mass: Float\n  friends: [Character]\n  friendsConnection(first: Int, after: ID): FriendsConnection!\n  appearsIn: [Episode]!\n  starships: [Starship]\n}\n\n\n# tests/fixtures/Types/Unions/SearchResults.graphql\nunion SearchResult @test = Human | Droid | Starship\n\n\n# tests/fixtures/Types/Types/a.gql\ntype Query {\n  hero(episode: Episode): Character\n  reviews(episode: Episode!): [Review]\n  search(text: String): [SearchResult]\n  character(id: ID!): Character\n  droid(id: ID!): Droid\n  human(id: ID!): Human\n  starship(id: ID!): Starship\n}\n```\n\n### Find and display missing definition(s)\n\n```sh\ncraftql tests/fixtures --orphans\n\n# Color is not defined in:\n# tests/fixtures/Types/Interfaces/Character.graphql\ninterface Character @test {\n  id: ID!\n  name: String!\n  friends: [Character]\n  friendsConnection(first: Int, after: ID): FriendsConnection!\n  appearsIn: [Episode]!\n  cute: Boolean! @deprecated\n  preferedColor: Color\n}\n\n\n# Ewok, Gungan are not defined in:\n# tests/fixtures/Types/Unions/SearchResultExtension.graphql\nextend union SearchResult = Ewok | Gungan\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyamafaktory%2Fcraftql","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fyamafaktory%2Fcraftql","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fyamafaktory%2Fcraftql/lists"}