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



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

def force_generation
  @force_generation
end

Class Method Details

.all_changesObject

Public: Returns Changes trackers for all registered configurations.



364
365
366
# File 'lib/types_from_serializers/generator.rb', line 364

def all_changes
  all_configs_list.map { |cfg| changes_for(cfg) }
end

.config(name = :default, &block) ⇒ Object

Public: Configuration of the code generator. Without a name: returns/modifies the default config (backward compatible). With a name: returns/creates a named config for a specific sub-app.



276
277
278
279
280
281
282
283
# File 'lib/types_from_serializers/generator.rb', line 276

def config(name = :default, &block)
  cfg = if name == :default
    @config ||= default_config(root)
  else
    configs[name] ||= default_config(root)
  end
  cfg.tap { |c| yield(c) if block }
end

.configsObject

Public: Registry of named configurations for multi-app setups.



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

def configs
  @configs ||= {}
end

.generate(force: ) ⇒ Object

Public: Generates code for all serializers in the app.



286
287
288
289
290
291
292
293
294
295
296
297
298
299
# File 'lib/types_from_serializers/generator.rb', line 286

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_all(force: ) ⇒ Object

Public: Generates types for all registered configurations (default + named). Use this in monolith setups with multiple sub-apps.



303
304
305
306
307
# File 'lib/types_from_serializers/generator.rb', line 303

def generate_all(force: ENV["SERIALIZER_TYPES_FORCE"])
  all_configs_list.each do |cfg|
    with_active_config(cfg) { generate(force: force) }
  end
end

.generate_all_changedObject

Public: Like generate_changed but for all registered configurations.



320
321
322
323
324
325
326
327
328
329
330
331
332
# File 'lib/types_from_serializers/generator.rb', line 320

def generate_all_changed
  all_configs_list.each do |cfg|
    chg = changes_for(cfg)
    if chg.updated?
      with_active_config(cfg) do
        config.output_dir.rmtree if chg.any_removed?
        load_serializers(chg.modified_files)
        generate
        chg.clear
      end
    end
  end
end

.generate_changedObject



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

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

.generate_index_fileObject

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



344
345
346
347
348
349
350
# File 'lib/types_from_serializers/generator.rb', line 344

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.



335
336
337
338
339
340
341
# File 'lib/types_from_serializers/generator.rb', line 335

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)


353
354
355
356
# File 'lib/types_from_serializers/generator.rb', line 353

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

.track_changesObject

Internal: Returns the Changes tracker for the default config (backward compatible).



359
360
361
# File 'lib/types_from_serializers/generator.rb', line 359

def track_changes
  changes_for(config)
end