class Ratbug::Generators::TypescriptGenerator

Public Class Methods

new(table, options) click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 6
def initialize(table, options)
  @table = table
  @options = options
end

Public Instance Methods

generate() click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 11
def generate
  output = ""
  columns.values.filter { |c| c.enum.present? }.each do |column|
    output << enum_output(column)
  end

  output << "type #{@table.name.singularize.camelize} = {\n"
  columns.values.sort_by(&:name).each do |column|
    output << column_row(column)
  end
  output << "};"

  dirname = File.dirname(output_path)
  unless File.directory?(dirname)
    FileUtils.mkdir_p(dirname)
  end
  File.open(output_path, "w") do |f|
    f.puts(output)
  end

  puts "generated: #{output_path}"
end

Private Instance Methods

column_row(column) click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 44
def column_row(column)
  ret = "  #{column.name.camelize(:lower)}#{column.nullable ? '?' : ''}:"
  if column.enum.present?
    ret << " #{enum_type_name(column)};\n"
  else
    ret << " #{column_type_to_ts_type(column.type)};\n"
  end
  ret
end
column_type_to_ts_type(column_type) click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 78
def column_type_to_ts_type(column_type)
  {
    bigint: 'number',
    binary: 'number',
    boolean: 'boolean',
    date: 'string',
    datetime: 'string',
    decimal: 'number',
    float: 'string',
    integer: 'number',
    json: 'string',
    primary_key: 'number',
    string: 'string',
    text: 'string',
    time: 'string'
  }[column_type.to_sym]
end
columns() click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 36
def columns
  if @options[:omit_timestamps]
    @table.columns.except(:created_at, :updated_at)
  else
    @table.columns
  end
end
enum_output(column) click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 54
def enum_output(column)
  type_name = enum_type_name(column)
  output = ""
  if @options[:ts_enum_output] === 'union_type'
    output << "type #{type_name} = "
    output << column.enum.keys.map do |enum_key|
      "'#{enum_key}'"
    end.join(' | ')
    output << ';'
  else
    # force string enum
    output << "enum #{type_name} {\n"
    column.enum.keys.map do |enum_key|
      output << "#{enum_key.camelize} = '#{enum_key}',\n"
    end.join(' | ')
    output << "}"
  end
  output << "\n\n"
end
enum_type_name(column) click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 74
def enum_type_name(column)
  "#{@table.name}_#{column.name}".pluralize.camelize
end
output_path() click to toggle source
# File lib/ratbug/generators/typescript_generator.rb, line 96
def output_path
  @options[:output_dir].join("_#{@table.name.singularize}.ts")
end