class Graphql::Generators::InstallGenerator

Add GraphQL to a Rails app with `rails g graphql:install`.

Setup a folder structure for GraphQL:

“`

“`

(Add `.gitkeep`s by default, support `–skip-keeps`)

Add a controller for serving GraphQL queries:

“` app/controllers/graphql_controller.rb “`

Add a route for that controller:

“`ruby # config/routes.rb post “/graphql”, to: “graphql#execute” “`

Accept a `–batch` option which adds `GraphQL::Batch` setup.

Use `–no-graphiql` to skip `graphiql-rails` installation.

TODO: also add base classes

Public Instance Methods

create_folder_structure() click to toggle source
# File lib/generators/graphql/install_generator.rb, line 100
      def create_folder_structure
        create_dir("#{options[:directory]}/types")
        template("schema.erb", schema_file_path)

        ["base_object", "base_argument", "base_field", "base_enum", "base_input_object", "base_interface", "base_scalar", "base_union"].each do |base_type|
          template("#{base_type}.erb", "#{options[:directory]}/types/#{base_type}.rb")
        end

        # Note: You can't have a schema without the query type, otherwise introspection breaks
        template("query_type.erb", "#{options[:directory]}/types/query_type.rb")
        insert_root_type('query', 'QueryType')

        invoke "graphql:install:mutation_root" unless options.skip_mutation_root_type?

        template("graphql_controller.erb", "app/controllers/graphql_controller.rb")
        route('post "/graphql", to: "graphql#execute"')

        if options[:batch]
          gem("graphql-batch")
          create_dir("#{options[:directory]}/loaders")
        end

        if options.api?
          say("Skipped graphiql, as this rails project is API only")
          say("  You may wish to use GraphiQL.app for development: https://github.com/skevy/graphiql-app")
        elsif !options[:skip_graphiql]
          # `gem(...)` uses `gsub_file(...)` under the hood, which is a no-op for `rails destroy...` (when `behavior == :revoke`).
          # So handle that case by calling `gsub_file` with `force: true`.
          if behavior == :invoke && !File.read(Rails.root.join("Gemfile")).include?("graphiql-rails")
            gem("graphiql-rails", group: :development)
          elsif behavior == :revoke
            gemfile_pattern = /\n\s*gem ('|")graphiql-rails('|"), :?group(:| =>) :development/
            gsub_file Rails.root.join("Gemfile"), gemfile_pattern, "", { force: true }
          end

          # This is a little cheat just to get cleaner shell output:
          log :route, 'graphiql-rails'
          shell.mute do
            # Rails 5.2 has better support for `route`?
            if Rails::VERSION::STRING > "5.2"
              route <<-RUBY
if Rails.env.development?
  mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
end
RUBY
            else
              route <<-RUBY
if Rails.env.development?
    mount GraphiQL::Rails::Engine, at: "/graphiql", graphql_path: "/graphql"
  end
RUBY
            end
          end
        end

        if options[:playground]
          gem("graphql_playground-rails", group: :development)

          log :route, 'graphql_playground-rails'
          shell.mute do
            if Rails::VERSION::STRING > "5.2"
              route <<-RUBY
if Rails.env.development?
  mount GraphqlPlayground::Rails::Engine, at: "/playground", graphql_path: "/graphql"
end
RUBY
            else
              route <<-RUBY
if Rails.env.development?
    mount GraphqlPlayground::Rails::Engine, at: "/playground", graphql_path: "/graphql"
  end
RUBY
            end
          end
        end

        if options[:relay]
          install_relay
        end

        if gemfile_modified?
          say "Gemfile has been modified, make sure you `bundle install`"
        end
      end

Private Instance Methods

gem(*args) click to toggle source
Calls superclass method
# File lib/generators/graphql/install_generator.rb, line 191
def gem(*args)
  @gemfile_modified = true
  super(*args)
end
gemfile_modified?() click to toggle source
# File lib/generators/graphql/install_generator.rb, line 187
def gemfile_modified?
  @gemfile_modified
end