Module: TypesFromSerializers

Defined in:
lib/types_from_serializers/generator.rb,
lib/types_from_serializers/version.rb

Overview

Public: Automatically generates TypeScript interfaces for Ruby serializers.

Defined Under Namespace

Modules: SerializerRefinements Classes: Changes, Config, FieldMetadata, Railtie, SerializerMetadata

Constant Summary collapse

VERSION =

Public: This library adheres to semantic versioning.

"0.1.1"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.force_generationObject (readonly)

Returns the value of attribute force_generation.



190
191
192
# File 'lib/types_from_serializers/generator.rb', line 190

def force_generation
  @force_generation
end

Class Method Details

.configObject

Public: Configuration of the code generator.



193
194
195
196
197
# File 'lib/types_from_serializers/generator.rb', line 193

def config
  (@config ||= default_config(root)).tap do |config|
    yield(config) if block_given?
  end
end

.generate(force: ) ⇒ Object

Public: Generates code for all serializers in the app.



200
201
202
203
204
205
206
207
# File 'lib/types_from_serializers/generator.rb', line 200

def generate(force: ENV["SERIALIZER_TYPES_FORCE"])
  @force_generation = force
  generate_index_file

  loaded_serializers.each do |serializer|
    generate_interface_for(serializer)
  end
end

.generate_changedObject



209
210
211
212
213
214
215
216
# File 'lib/types_from_serializers/generator.rb', line 209

def generate_changed
  if changes.updated?
    config.output_dir.rmtree if changes.any_removed?
    load_serializers(changes.modified_files)
    generate
    changes.clear
  end
end

.generate_index_fileObject

Internal: Allows to import all serializer types from a single file.



237
238
239
240
241
242
243
244
245
246
# File 'lib/types_from_serializers/generator.rb', line 237

def generate_index_file
  write_if_changed(filename: "index", cache_key: all_serializer_files.join) {
    load_serializers(all_serializer_files)
    <<~TS
      //
      // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
      #{loaded_serializers.map { |s| "export type { default as #{s.typescript_interface_name} } from './#{s.typescript_interface_basename}'" }.join("\n")}
    TS
  }
end

.generate_interface_for(serializer) ⇒ Object

Internal: Defines a TypeScript interface for the serializer.



219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
# File 'lib/types_from_serializers/generator.rb', line 219

def generate_interface_for(serializer)
   = serializer.
  filename = serializer.typescript_interface_basename

  write_if_changed(filename: filename, cache_key: .inspect) {
    serializer.typescript_infer_types()
    <<~TS
      //
      // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
      #{serializer.typescript_imports().join}
      export default interface #{serializer.typescript_interface_name} {
      #{serializer.typescript_fields().join("\n")}
      }
    TS
  }
end

.skip_serializer?(name) ⇒ Boolean

Internal: Checks if it should avoid generating an interface.

Returns:

  • (Boolean)


249
250
251
# File 'lib/types_from_serializers/generator.rb', line 249

def skip_serializer?(name)
  name.include?("BaseSerializer") || name.in?(config.base_serializers)
end

.track_changesObject

Internal: Returns an object compatible with FileUpdateChecker.



254
255
256
# File 'lib/types_from_serializers/generator.rb', line 254

def track_changes
  changes
end