graphql-docs 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: c4d60df082629a2051e1f56910ae53e15ac0c2f4
4
- data.tar.gz: abde3dbad6ce9687c95a31d2312fb98fedff8067
3
+ metadata.gz: 57b3bab2a270f24272f4dbd5f01e35b4ca808c69
4
+ data.tar.gz: 40b5d99232276274abc5f96fd0cf3e6a3744ffe1
5
5
  SHA512:
6
- metadata.gz: 8b97023604cff348beee6cbb17fd5175879232d7ac7fdae05711d0ff3cf0e640e97a2a2b78954ec1a4624cdda2ed47e4f183381b6cc21e2badf3065e8db575d4
7
- data.tar.gz: c85ba82b15abdd9f46852e19b96e56e4324ccf28b1c2671be7eb65b5017642458003d88767179c07e21e861342ba345feb478596e9b2f224488bbe9b5e285d36
6
+ metadata.gz: 44dbb949bd168632077b04c060766740929309f04353730d165518241633b5f5f814b01935ad854a1fd1307e4950936b0f054b6be388a96c58c827efd3f15d77
7
+ data.tar.gz: acc2174c4f16ec02f995185c70817e337db9c045b57f9cc91a85c84036f9d1d7cc33692e49d5f2ff2811dec3c5aed6152c66bbf72a7e48d1e99bef1b8772c540
@@ -1,9 +1,26 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.3.1
3
+ - 2.3.4
4
+ - 2.4.0
5
+
6
+ git:
7
+ depth: 10
8
+
9
+ env:
10
+ global:
11
+ - NOKOGIRI_USE_SYSTEM_LIBRARIES=true
4
12
 
5
13
  sudo: false
6
14
  cache: bundler
7
15
 
8
- git:
9
- depth: 10
16
+ addons:
17
+ apt:
18
+ sources:
19
+ - kalakris-cmake
20
+ packages:
21
+ - cmake
22
+
23
+ matrix:
24
+ include:
25
+ - script: bundle exec rake rubocop
26
+ rvm: 2.4.0
data/README.md CHANGED
@@ -134,7 +134,8 @@ The following options are available:
134
134
  | `delete_output` | Deletes `output_dir` before generating content. | `false` |
135
135
  | `pipeline_config` | Defines two sub-keys, `pipeline` and `context`, which are used by `html-pipeline` when rendering your output. | `pipeline` has `ExtendedMarkdownFilter`, `EmojiFilter`, and `TableOfContentsFilter`. `context` has `gfm: false` and `asset_root` set to GitHub's CDN. |
136
136
  | `renderer` | The rendering class to use. | `GraphQLDocs::Renderer`
137
- | `templates` | The templates to use when generating HTML. You may override any of the following keys: `includes`, `objects`, `mutations`, `interfaces`, `enums`, `unions`, `input_objects`, `scalars`, `index`. | The defaults are found in _lib/graphql-docs/layouts/_.
137
+ | `templates` | The templates to use when generating HTML. You may override any of the following keys: `default`, `includes`, `objects`, `mutations`, `interfaces`, `enums`, `unions`, `input_objects`, `scalars`. | The defaults are found in _lib/graphql-docs/layouts/_.
138
+ | `landing_pages` | The landing page to use when generating HTML for each type. You may override any of the following keys: `index`, `query`, `object`, `mutation`, `interface`, `enum`, `union`, `input_object`, `scalar`. | The defaults are found in _lib/graphql-docs/layouts/_.
138
139
  | `classes` | Additional class names you can provide to certain elements. | The full list is found in _lib/graphql-docs/configuration.rb/_.
139
140
 
140
141
  ## Development
data/Rakefile CHANGED
@@ -1,6 +1,10 @@
1
1
  require 'bundler/gem_tasks'
2
2
  require 'rake/testtask'
3
3
 
4
+ require 'rubocop/rake_task'
5
+
6
+ RuboCop::RakeTask.new(:rubocop)
7
+
4
8
  Rake::TestTask.new(:test) do |t|
5
9
  t.libs << 'test'
6
10
  t.libs << 'lib'
@@ -33,7 +37,7 @@ task :generate_sample, [:base_url] do |task, args|
33
37
  GraphQLDocs.build(options)
34
38
  end
35
39
 
36
- task :sample => [:generate_sample] do
40
+ task sample: [:generate_sample] do
37
41
  require 'webrick'
38
42
 
39
43
  puts 'Navigate to http://localhost:3000 to see the sample docs'
@@ -1,3 +1,4 @@
1
+ # rubocop:disable Style/FileName
1
2
  require 'graphql-docs/client'
2
3
  require 'graphql-docs/helpers'
3
4
  require 'graphql-docs/renderer'
@@ -36,8 +36,18 @@ module GraphQLDocs
36
36
  unions: "#{File.dirname(__FILE__)}/layouts/graphql_unions.html",
37
37
  input_objects: "#{File.dirname(__FILE__)}/layouts/graphql_input_objects.html",
38
38
  scalars: "#{File.dirname(__FILE__)}/layouts/graphql_scalars.html",
39
+ },
39
40
 
40
- index: "#{File.dirname(__FILE__)}/layouts/index.md",
41
+ landing_pages: {
42
+ index: "#{File.dirname(__FILE__)}/landing_pages/index.md",
43
+ query: "#{File.dirname(__FILE__)}/landing_pages/query.md",
44
+ object: "#{File.dirname(__FILE__)}/landing_pages/object.md",
45
+ mutation: "#{File.dirname(__FILE__)}/landing_pages/mutation.md",
46
+ interface: "#{File.dirname(__FILE__)}/landing_pages/interface.md",
47
+ enum: "#{File.dirname(__FILE__)}/landing_pages/enum.md",
48
+ union: "#{File.dirname(__FILE__)}/landing_pages/union.md",
49
+ input_object: "#{File.dirname(__FILE__)}/landing_pages/input_object.md",
50
+ scalar: "#{File.dirname(__FILE__)}/landing_pages/scalar.md"
41
51
  },
42
52
 
43
53
  classes: {
@@ -33,8 +33,36 @@ module GraphQLDocs
33
33
  create_graphql_input_object_pages
34
34
  create_graphql_scalar_pages
35
35
 
36
- unless @options[:templates][:index].nil?
37
- write_file('static', 'index', File.read(@options[:templates][:index]))
36
+ unless @options[:landing_pages][:index].nil?
37
+ write_file('static', 'index', File.read(@options[:landing_pages][:index]))
38
+ end
39
+
40
+ unless @options[:landing_pages][:object].nil?
41
+ write_file('static', 'object', File.read(@options[:landing_pages][:object]))
42
+ end
43
+
44
+ unless @options[:landing_pages][:mutation].nil?
45
+ write_file('static', 'mutation', File.read(@options[:landing_pages][:mutation]))
46
+ end
47
+
48
+ unless @options[:landing_pages][:interface].nil?
49
+ write_file('static', 'interface', File.read(@options[:landing_pages][:interface]))
50
+ end
51
+
52
+ unless @options[:landing_pages][:enum].nil?
53
+ write_file('static', 'enum', File.read(@options[:landing_pages][:enum]))
54
+ end
55
+
56
+ unless @options[:landing_pages][:union].nil?
57
+ write_file('static', 'union', File.read(@options[:landing_pages][:union]))
58
+ end
59
+
60
+ unless @options[:landing_pages][:input_object].nil?
61
+ write_file('static', 'input_object', File.read(@options[:landing_pages][:input_object]))
62
+ end
63
+
64
+ unless @options[:landing_pages][:scalar].nil?
65
+ write_file('static', 'scalar', File.read(@options[:landing_pages][:scalar]))
38
66
  end
39
67
 
40
68
  if @options[:use_default_styles]
@@ -54,9 +82,32 @@ module GraphQLDocs
54
82
  def create_graphql_object_pages
55
83
  graphql_object_types.each do |object_type|
56
84
  next if object_type['name'].start_with?('__')
57
- opts = default_generator_options(type: object_type)
58
- contents = @graphql_object_template.result(OpenStruct.new(opts).instance_eval { binding })
59
- write_file('object', object_type['name'], contents)
85
+ if object_type['name'] == 'Mutation'
86
+ next unless @options[:landing_pages][:mutation].nil?
87
+ end
88
+ if object_type['name'] == 'Query'
89
+ metadata = ''
90
+ unless @options[:landing_pages][:query].nil?
91
+ query_landing_page = @options[:landing_pages][:query]
92
+ query_landing_page = File.read(query_landing_page)
93
+ if @renderer.respond_to?(:has_yaml?) && \
94
+ @renderer.has_yaml?(query_landing_page) && \
95
+ @renderer.respond_to?(:yaml_split)
96
+ pieces = @renderer.yaml_split(query_landing_page)
97
+ pieces[2] = pieces[2].chomp
98
+ metadata = pieces[1, 3].join("\n")
99
+ query_landing_page = pieces[4]
100
+ end
101
+ object_type['description'] = query_landing_page
102
+ end
103
+ opts = default_generator_options(type: object_type)
104
+ contents = @graphql_object_template.result(OpenStruct.new(opts).instance_eval { binding })
105
+ write_file('static', 'query', metadata + contents)
106
+ else
107
+ opts = default_generator_options(type: object_type)
108
+ contents = @graphql_object_template.result(OpenStruct.new(opts).instance_eval { binding })
109
+ write_file('object', object_type['name'], contents)
110
+ end
60
111
  end
61
112
  end
62
113
 
@@ -131,6 +182,7 @@ module GraphQLDocs
131
182
  path = @options[:output_dir]
132
183
  else
133
184
  path = File.join(@options[:output_dir], name)
185
+ FileUtils.mkdir_p(path)
134
186
  end
135
187
  else
136
188
  path = File.join(@options[:output_dir], type, name.downcase)
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: Enums
3
+ ---
4
+
5
+ # Enums
6
+
7
+ Enums represent a possible set of values for a field. For example, the `Issue` object has a field called `state`. The state of an issue may be `OPEN` or `CLOSED`.
8
+
9
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Enums).
@@ -1,3 +1,7 @@
1
+ ---
2
+ title: GraphQL documentation
3
+ ---
4
+
1
5
  # GraphQL Reference
2
6
 
3
7
  These docs were generated by [graphql-docs](https://github.com/gjtorikian/graphql-docs).
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: Input Objects
3
+ ---
4
+
5
+ # Input Objects
6
+
7
+ Input objects are best described as "composable objects" in that they contain a set of input fields that define a particular object. For example, the `AuthorInput` takes a field called `emails`. Providing a value for `emails` will transform the `AuthorInput` into a list of `User` objects which contain that email address/
8
+
9
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Input-Objects).
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: Interfaces
3
+ ---
4
+
5
+ # Interfaces
6
+
7
+ GraphQL Interfaces are a sort of "parent object" from which other objects can "inherit" from. For example, `Stars` is considered an interface, because both `Repository` and `Gist` can be starred. An interface has its own list of named fields that are shared by implementing objects.
8
+
9
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Interfaces).
@@ -0,0 +1,11 @@
1
+ ---
2
+ title: Mutations
3
+ ---
4
+
5
+ # Mutations
6
+
7
+ Every GraphQL schema has a root type for both queries and mutations.
8
+
9
+ The mutation type defines how GraphQL operations change data. It is analogous to performing HTTP verbs such as `POST`, `PATCH`, and `DELETE`.
10
+
11
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Type-System).
@@ -0,0 +1,8 @@
1
+ ---
2
+ title: Objects
3
+ ---
4
+ # Objects
5
+
6
+ Objects in GraphQL represent the resources that you can access. Objects can contain a list of fields, which are specifically typed. For example, the `Repository` object has a field called `name`, which is a `String`.
7
+
8
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Objects).
@@ -0,0 +1,4 @@
1
+ ---
2
+ title: Queries
3
+ ---
4
+ Every GraphQL schema has a root type for both queries and mutations. The [query type](https://facebook.github.io/graphql/#sec-Type-System) defines GraphQL operations that retrieve data from the server.
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: Scalars
3
+ ---
4
+
5
+ # Scalars
6
+
7
+ Scalars are primitive values such as `Int` or `String`.
8
+
9
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Scalars).
@@ -0,0 +1,9 @@
1
+ ---
2
+ title: Unions
3
+ ---
4
+
5
+ # Unions
6
+
7
+ A union is a type of object that can represent one of many kinds of objects. For example, a field marked as a `ReactableUnion` could be a `CommitComment`, an `Issue`, an `IssueComment`, or a `PullRequestReviewComment`, because each of those objects can be reacted on.
8
+
9
+ For more information, see [the GraphQL spec](https://facebook.github.io/graphql/#sec-Unions).
@@ -4,7 +4,7 @@
4
4
  <meta charset="utf-8">
5
5
  <meta name="description" content="<%= name %> GraphQL documentation">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
7
- <title><%= name %></title>
7
+ <title><%= title || name %></title>
8
8
  <link rel="stylesheet" href="<%= base_url %>/assets/style.css">
9
9
  <script src="https://cdnjs.cloudflare.com/ajax/libs/anchor-js/3.2.2/anchor.min.js"></script>
10
10
  <script>
@@ -1,4 +1,4 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
4
4
 
@@ -1,4 +1,4 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
4
4
 
@@ -1,10 +1,10 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
4
4
 
5
5
  <% unless type['fields'].empty? %>
6
6
 
7
- ### Fields
7
+ ## Fields
8
8
 
9
9
  <%= include.('fields.html', fields: type['fields']) %>
10
10
 
@@ -1,8 +1,8 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
4
4
 
5
- ## Input fields
5
+ # Input fields
6
6
 
7
7
  <%= include.('/fields.html', fields: input_fields['inputFields']) %>
8
8
 
@@ -1,10 +1,10 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
4
4
 
5
5
  <% unless type['interfaces'].empty? %>
6
6
 
7
- ### Implements
7
+ ## Implements
8
8
 
9
9
  <ul>
10
10
  <% type['interfaces'].each do |interface| %>
@@ -16,7 +16,7 @@
16
16
 
17
17
  <% unless type['connections'].empty? %>
18
18
 
19
- ### Connections
19
+ ## Connections
20
20
 
21
21
  <%= include.('connections.html', connections: type['connections']) %>
22
22
 
@@ -24,7 +24,7 @@
24
24
 
25
25
  <% unless type['fields'].empty? %>
26
26
 
27
- ### Fields
27
+ ## Fields
28
28
 
29
29
  <%= include.('fields.html', fields: type['fields']) %>
30
30
 
@@ -1,3 +1,3 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
@@ -1,4 +1,4 @@
1
- ## <%= type['name'] %>
1
+ # <%= type['name'] %>
2
2
 
3
3
  <%= type['description'] %>
4
4
 
@@ -10,12 +10,12 @@
10
10
  <p>Queries</p>
11
11
  <ul class="menu-root">
12
12
  <li>
13
- <a href="<%= base_url %>/object/query/" class="sidebar-link<% if title == "Query" %> current<% end %>">
14
- RootQuery
13
+ <a href="<%= base_url %>/query/" class="sidebar-link<% if title == "Query" %> current<% end %>">
14
+ Query
15
15
  </a>
16
16
  </li>
17
17
  <li>
18
- <a href="<%= base_url %>/object/mutation" class="sidebar-link<% if title == "Mutation" %> current<% end %>">
18
+ <a href="<%= base_url %>/mutation" class="sidebar-link<% if title == "Mutation" %> current<% end %>">
19
19
  Mutation
20
20
  </a>
21
21
  </li>
@@ -23,7 +23,7 @@
23
23
  </li>
24
24
 
25
25
  <li>
26
- <p>Objects</p>
26
+ <p><a href="<%= base_url %>/object">Objects</a></p>
27
27
  <ul class="menu-root">
28
28
  <% graphql_object_types.().each do |type| %>
29
29
  <% @name = type["name"] %>
@@ -32,13 +32,18 @@
32
32
  <% next %>
33
33
  <% end %>
34
34
 
35
+ <!-- skip mutation stuff -->
36
+ <% if @name == "Mutation" || @name.end_with?("Payload") %>
37
+ <% next %>
38
+ <% end %>
39
+
35
40
  <!-- skip metadata stuff -->
36
41
  <% if @name.start_with?("__") %>
37
42
  <% next %>
38
43
  <% end %>
39
44
 
40
45
  <!-- skip root query stuff -->
41
- <% if @name == "RootQuery" %>
46
+ <% if @name == "Query" %>
42
47
  <% next %>
43
48
  <% end %>
44
49
 
@@ -52,7 +57,25 @@
52
57
  </li>
53
58
 
54
59
  <li>
55
- <p>Interfaces</p>
60
+ <p><a href="<%= base_url %>/mutation">Mutations</a></p>
61
+ <ul class="menu-root">
62
+ <% graphql_mutation_types.().each do |type| %>
63
+ <% @name = type["name"] %>
64
+ <!-- skip metadata stuff -->
65
+ <% if @name.start_with?("__") %>
66
+ <% next %>
67
+ <% end %>
68
+ <li>
69
+ <a href="<%= base_url %>/mutation/<%= @name.downcase %>/" class="sidebar-link<% if title == @name %> current<% end %>">
70
+ <%= @name %>
71
+ </a>
72
+ </li>
73
+ <% end %>
74
+ </ul>
75
+ </li>
76
+
77
+ <li>
78
+ <p><a href="<%= base_url %>/interface">Interfaces</a></p>
56
79
  <ul class="menu-root">
57
80
  <% graphql_interface_types.().each do |type| %>
58
81
  <% @name = type["name"] %>
@@ -66,7 +89,7 @@
66
89
  </li>
67
90
 
68
91
  <li>
69
- <p>Enums</p>
92
+ <p><a href="<%= base_url %>/enum">Enums</a></p>
70
93
  <ul class="menu-root">
71
94
  <% graphql_enum_types.().each do |type| %>
72
95
  <% @name = type["name"] %>
@@ -84,7 +107,7 @@
84
107
  </li>
85
108
 
86
109
  <li>
87
- <p>Unions</p>
110
+ <p><a href="<%= base_url %>/union">Unions</a></p>
88
111
  <ul class="menu-root">
89
112
  <% graphql_union_types.().each do |type| %>
90
113
  <% @name = type["name"] %>
@@ -98,7 +121,7 @@
98
121
  </li>
99
122
 
100
123
  <li>
101
- <p>Input Objects</p>
124
+ <p><a href="<%= base_url %>/input_object">Input Objects</a></p>
102
125
  <ul class="menu-root">
103
126
  <% graphql_input_object_types.().each do |type| %>
104
127
  <% @name = type["name"] %>
@@ -112,7 +135,7 @@
112
135
  </li>
113
136
 
114
137
  <li>
115
- <p>Scalars</p>
138
+ <p><a href="<%= base_url %>/scalar">Scalars</a></p>
116
139
  <ul class="menu-root">
117
140
  <% graphql_scalar_types.().each do |type| %>
118
141
  <% @name = type["name"] %>
@@ -1,4 +1,5 @@
1
1
  require 'html/pipeline'
2
+ require 'yaml'
2
3
  require 'extended-markdown-filter'
3
4
 
4
5
  module GraphQLDocs
@@ -34,12 +35,40 @@ module GraphQLDocs
34
35
  end
35
36
 
36
37
  def render(type, name, contents)
38
+ opts = { base_url: @options[:base_url] }.merge({ type: type, name: name}).merge(helper_methods)
39
+
40
+ if has_yaml?(contents)
41
+ # Split data
42
+ pieces = yaml_split(contents)
43
+ if pieces.size < 4
44
+ raise RuntimeError.new(
45
+ "The file '#{content_filename}' appears to start with a metadata section (three or five dashes at the top) but it does not seem to be in the correct format.",
46
+ )
47
+ end
48
+ # Parse
49
+ begin
50
+ meta = YAML.load(pieces[2]) || {}
51
+ opts = opts.merge(meta)
52
+ rescue Exception => e # rubocop:disable Lint/RescueException
53
+ raise "Could not parse YAML for #{name}: #{e.message}"
54
+ end
55
+ contents = pieces[4]
56
+ end
57
+
37
58
  contents = @pipeline.to_html(contents)
38
59
  return contents if @graphql_default_layout.nil?
39
- opts = { base_url: @options[:base_url] }.merge({ contents: contents, type: type, name: name}).merge(helper_methods)
60
+ opts[:content] = contents
40
61
  @graphql_default_layout.result(OpenStruct.new(opts).instance_eval { binding })
41
62
  end
42
63
 
64
+ def has_yaml?(contents)
65
+ contents =~ /\A-{3,5}\s*$/
66
+ end
67
+
68
+ def yaml_split(contents)
69
+ contents.split(/^(-{5}|-{3})[ \t]*\r?\n?/, 3)
70
+ end
71
+
43
72
  private
44
73
 
45
74
  def filter_key(s)
@@ -1,3 +1,3 @@
1
1
  module GraphQLDocs
2
- VERSION = '0.4.1'
2
+ VERSION = '0.5.0'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: graphql-docs
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Garen Torikian
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-05-09 00:00:00.000000000 Z
11
+ date: 2017-05-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: faraday
@@ -254,6 +254,15 @@ files:
254
254
  - lib/graphql-docs/configuration.rb
255
255
  - lib/graphql-docs/generator.rb
256
256
  - lib/graphql-docs/helpers.rb
257
+ - lib/graphql-docs/landing_pages/enum.md
258
+ - lib/graphql-docs/landing_pages/index.md
259
+ - lib/graphql-docs/landing_pages/input_object.md
260
+ - lib/graphql-docs/landing_pages/interface.md
261
+ - lib/graphql-docs/landing_pages/mutation.md
262
+ - lib/graphql-docs/landing_pages/object.md
263
+ - lib/graphql-docs/landing_pages/query.md
264
+ - lib/graphql-docs/landing_pages/scalar.md
265
+ - lib/graphql-docs/landing_pages/union.md
257
266
  - lib/graphql-docs/layouts/assets/_sass/_api-box.scss
258
267
  - lib/graphql-docs/layouts/assets/_sass/_content.scss
259
268
  - lib/graphql-docs/layouts/assets/_sass/_fonts.scss
@@ -302,7 +311,6 @@ files:
302
311
  - lib/graphql-docs/layouts/includes/possible_types.html
303
312
  - lib/graphql-docs/layouts/includes/sidebar.html
304
313
  - lib/graphql-docs/layouts/includes/values.html
305
- - lib/graphql-docs/layouts/index.md
306
314
  - lib/graphql-docs/parser.rb
307
315
  - lib/graphql-docs/renderer.rb
308
316
  - lib/graphql-docs/version.rb