Module: TypesFromSerializers

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

Overview

Public: Automatically generates TypeScript interfaces for Ruby serializers.

Defined Under Namespace

Modules: DSL, SerializerRefinements Classes: Changes, Config, Interface, Property, Railtie

Constant Summary collapse

VERSION =

Public: This library adheres to semantic versioning.

"2.2.0"
DEFAULT_TRANSFORM_KEYS =
->(key) { key.camelize(:lower).chomp("?") }

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.force_generationObject (readonly)

Returns the value of attribute force_generation.



260
261
262
# File 'lib/types_from_serializers/generator.rb', line 260

def force_generation
  @force_generation
end

Class Method Details

.configObject

Public: Configuration of the code generator.



263
264
265
266
267
# File 'lib/types_from_serializers/generator.rb', line 263

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.



270
271
272
273
274
275
276
277
278
279
280
281
282
283
# File 'lib/types_from_serializers/generator.rb', line 270

def generate(force: ENV["SERIALIZER_TYPES_FORCE"])
  @force_generation = force
  config.output_dir.rmtree if force && config.output_dir.exist?

  if config.namespace
    load_serializers(all_serializer_files) if force
  else
    generate_index_file
  end

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

.generate_changedObject



285
286
287
288
289
290
291
292
# File 'lib/types_from_serializers/generator.rb', line 285

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.



304
305
306
307
308
309
310
# File 'lib/types_from_serializers/generator.rb', line 304

def generate_index_file
  cache_key = all_serializer_files.map { |file| file.delete_prefix(root.to_s) }.join
  write_if_changed(filename: "index", cache_key: cache_key) {
    load_serializers(all_serializer_files)
    serializers_index_content(loaded_serializers)
  }
end

.generate_interface_for(serializer) ⇒ Object

Internal: Defines a TypeScript interface for the serializer.



295
296
297
298
299
300
301
# File 'lib/types_from_serializers/generator.rb', line 295

def generate_interface_for(serializer)
  interface = serializer.ts_interface

  write_if_changed(filename: interface.filename, cache_key: interface.inspect, extension: config.namespace ? "d.ts" : "ts") {
    serializer_interface_content(interface)
  }
end

.skip_serializer?(serializer) ⇒ Boolean

Internal: Checks if it should avoid generating an interface.

Returns:

  • (Boolean)


313
314
315
316
317
318
# File 'lib/types_from_serializers/generator.rb', line 313

def skip_serializer?(serializer)
  serializer.name.in?(config.base_serializers) ||
    config.skip_serializer_if.call(serializer) ||
    # NOTE: Ignore inline serializers.
    serializer.ts_name.include?("Serializer")
end

.track_changesObject

Internal: Returns an object compatible with FileUpdateChecker.



321
322
323
# File 'lib/types_from_serializers/generator.rb', line 321

def track_changes
  changes
end