Class: ZeroRailsAdapter::TypeScript::Generator

Inherits:
Object
  • Object
show all
Defined in:
lib/zero_rails_adapter/type_script/generator.rb

Constant Summary collapse

SCHEMA_TYPES =
{
  string: "string()",
  text: "string()",
  uuid: "string()",
  integer: "number()",
  bigint: "number()",
  float: "number()",
  decimal: "number()",
  boolean: "boolean()",
  date: "number()",
  datetime: "number()",
  timestamp: "number()",
  time: "number()",
  json: "json()",
  jsonb: "json()"
}.freeze
ZOD_TYPES =
{
  string: "z.string()",
  text: "z.string()",
  uuid: "z.string().uuid()",
  integer: "z.number()",
  bigint: "z.number()",
  float: "z.number()",
  decimal: "z.number()",
  boolean: "z.boolean()",
  date: "z.number()",
  datetime: "z.number()",
  timestamp: "z.number()",
  time: "z.number()",
  json: "z.json()",
  jsonb: "z.json()"
}.freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(published_schema: nil, crud_models: nil, manual_relationships: nil) ⇒ Generator

Returns a new instance of Generator.



42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/zero_rails_adapter/type_script/generator.rb', line 42

def initialize(published_schema: nil, crud_models: nil, manual_relationships: nil)
  schema = published_schema || ZeroRailsAdapter.configuration.published_schema.call
  @published_schema = PublishedSchema.new(
    schema,
    zero_key: ZeroRailsAdapter.configuration.zero_key
  )
  @models = @published_schema.models.sort_by(&:table_name)
  relationship_definitions = manual_relationships ||
    ZeroRailsAdapter.configuration.relationship_provider.call
  @manual_relationships = Array(relationship_definitions).map do |definition|
    Relationship.from_definition(definition, published_schema: @published_schema)
  end
  requested_crud_models = Array(
    crud_models || ZeroRailsAdapter.configuration.crud_model_provider.call
  )
  unpublished = requested_crud_models - models
  if unpublished.any?
    labels = unpublished.map { |model| model.respond_to?(:name) ? model.name : model.inspect }
    raise UnsafePublicationError,
      "CRUD models must also be published: #{labels.join(', ')}"
  end

  @crud_models = requested_crud_models.uniq.sort_by(&:table_name)
end

Instance Attribute Details

#crud_modelsObject (readonly)

Returns the value of attribute crud_models.



40
41
42
# File 'lib/zero_rails_adapter/type_script/generator.rb', line 40

def crud_models
  @crud_models
end

#modelsObject (readonly)

Returns the value of attribute models.



40
41
42
# File 'lib/zero_rails_adapter/type_script/generator.rb', line 40

def models
  @models
end

Instance Method Details

#mutatorsObject



78
79
80
81
82
83
84
85
86
# File 'lib/zero_rails_adapter/type_script/generator.rb', line 78

def mutators
  sections = [
    "import {defineMutator, defineMutators} from '@rocicorp/zero'\nimport {z} from 'zod'",
    argument_schemas,
    mutator_export
  ]

  sections.reject(&:empty?).join("\n\n") << "\n"
end

#schemaObject



67
68
69
70
71
72
73
74
75
76
# File 'lib/zero_rails_adapter/type_script/generator.rb', line 67

def schema
  sections = [
    "import {#{schema_imports.join(', ')}} from '@rocicorp/zero'",
    table_definitions,
    relationship_definitions,
    schema_export
  ]

  sections.reject(&:empty?).join("\n\n") << "\n"
end