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.4.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.



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

def force_generation
  @force_generation
end

Class Method Details

.configObject

Public: Configuration of the code generator.



268
269
270
271
272
# File 'lib/types_from_serializers/generator.rb', line 268

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.



275
276
277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/types_from_serializers/generator.rb', line 275

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



290
291
292
293
294
295
296
297
# File 'lib/types_from_serializers/generator.rb', line 290

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.



309
310
311
312
313
314
315
# File 'lib/types_from_serializers/generator.rb', line 309

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.



300
301
302
303
304
305
306
# File 'lib/types_from_serializers/generator.rb', line 300

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)


318
319
320
321
# File 'lib/types_from_serializers/generator.rb', line 318

def skip_serializer?(serializer)
  serializer.name.in?(config.base_serializers) ||
    config.skip_serializer_if.call(serializer)
end

.track_changesObject

Internal: Returns an object compatible with FileUpdateChecker.



324
325
326
# File 'lib/types_from_serializers/generator.rb', line 324

def track_changes
  changes
end