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
-
.force_generation ⇒ Object
readonly
Returns the value of attribute force_generation.
Class Method Summary collapse
-
.all_changes ⇒ Object
Public: Returns Changes trackers for all registered configurations.
-
.config(name = :default, &block) ⇒ Object
Public: Configuration of the code generator.
-
.configs ⇒ Object
Public: Registry of named configurations for multi-app setups.
-
.generate(force: ) ⇒ Object
Public: Generates code for all serializers in the app.
-
.generate_all(force: ) ⇒ Object
Public: Generates types for all registered configurations (default + named).
-
.generate_all_changed ⇒ Object
Public: Like generate_changed but for all registered configurations.
- .generate_changed ⇒ Object
-
.generate_index_file ⇒ Object
Internal: Allows to import all serializer types from a single file.
-
.generate_interface_for(serializer) ⇒ Object
Internal: Defines a TypeScript interface for the serializer.
-
.skip_serializer?(serializer) ⇒ Boolean
Internal: Checks if it should avoid generating an interface.
-
.track_changes ⇒ Object
Internal: Returns the Changes tracker for the default config (backward compatible).
Class Attribute Details
.force_generation ⇒ Object (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_changes ⇒ Object
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 |
.configs ⇒ Object
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_changed ⇒ Object
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_changed ⇒ Object
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_file ⇒ Object
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.
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_changes ⇒ Object
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 |