types_from_serializers 2.4.0 → 2.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: be10a6dcb68468930d839963a8ce27bacde784ff887f0171eb924289d63ec163
4
- data.tar.gz: 03a221ba1c0a452cdbf8214d14d3ebd8dccc37a5a3c7860e5fa46c919bfb2905
3
+ metadata.gz: 5ba3078a6ac5b9c49a435628333f17bcd3136ad469acd9aa074ab5d92f359c75
4
+ data.tar.gz: 8f19bc101b8634b1afbc1d64ef66372a87f448bcaa5a802ad6c6ca39c607749b
5
5
  SHA512:
6
- metadata.gz: 9b05949d6f5355e8e7dad8e22a639dc3e92bcc47e47d379a2695e5530b86a1ed2db66ecd687b96964e06415a58c283475dd6aa4cf77eef4c39c9c1b64bf68782
7
- data.tar.gz: f0132d60528bdca4dc175700aeea04cd31f9e06b22247d3fe9ce98e9eb2cbc0c9d575d1ce2effc8f305cd911179ef70434a8e5c71c90b63de2ddff99d5f7084e
6
+ metadata.gz: e1b5481824e42a2d7721946e9a3d39dd533074d3ef4f7f5d6fd89dbd7a754e8ccb689d30af3ec211f49602ce81c11ac34e79079e6408a1e2a294687757431312
7
+ data.tar.gz: 4d8d66623371ec2fe42effadde394103b6164fec7400af77addcb7abea266ca8bbc1d8587cffa3f0d9f107694328f585aef469161e40428e0169f2972b09037f
data/CHANGELOG.md CHANGED
@@ -1,3 +1,27 @@
1
+ # [2.6.0](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@2.5.0...types_from_serializers@2.6.0) (2026-05-06)
2
+
3
+
4
+ ### Features
5
+
6
+ * relax oj_serializers dependency by removing the upper constraint ([#34](https://github.com/ElMassimo/types_from_serializers/issues/34)) ([3018e89](https://github.com/ElMassimo/types_from_serializers/commit/3018e8937a6808123bf0dd482e730bc666d20137))
7
+ * support multiple generator instances for Rails monolith sub-apps ([#32](https://github.com/ElMassimo/types_from_serializers/issues/32)) ([33ce3c1](https://github.com/ElMassimo/types_from_serializers/commit/33ce3c1cfa78c6c899ef9fdd05a034ccde50431f))
8
+
9
+
10
+
11
+ # [2.5.0](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@2.4.0...types_from_serializers@2.5.0) (2026-01-02)
12
+
13
+
14
+ ### Bug Fixes
15
+
16
+ * generated types for self-referential attributes ([#28](https://github.com/ElMassimo/types_from_serializers/issues/28)) ([abd5073](https://github.com/ElMassimo/types_from_serializers/commit/abd507321da6a796d29c8aab966d18c3c6627002))
17
+
18
+
19
+ ### Features
20
+
21
+ * add 'time' datatype ([#30](https://github.com/ElMassimo/types_from_serializers/issues/30)) ([9427a4a](https://github.com/ElMassimo/types_from_serializers/commit/9427a4a64f8e344416b84007b28e49ec7f8537c3))
22
+
23
+
24
+
1
25
  # [2.4.0](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@2.3.0...types_from_serializers@2.4.0) (2025-04-08)
2
26
 
3
27
 
@@ -127,6 +127,7 @@ module TypesFromSerializers
127
127
  .partition { |type| type.respond_to?(:ts_interface) }
128
128
 
129
129
  serializer_type_imports = association_serializers.map(&:ts_interface)
130
+ .reject { |type| type.name == name } # avoid self-imports (e.g. for recursive types)
130
131
  .map { |type| [type.name, relative_path(type.pathname, pathname)] }
131
132
 
132
133
  custom_type_imports = attribute_types
@@ -264,11 +265,21 @@ module TypesFromSerializers
264
265
 
265
266
  attr_reader :force_generation
266
267
 
268
+ # Public: Registry of named configurations for multi-app setups.
269
+ def configs
270
+ @configs ||= {}
271
+ end
272
+
267
273
  # Public: Configuration of the code generator.
268
- def config
269
- (@config ||= default_config(root)).tap do |config|
270
- yield(config) if block_given?
274
+ # Without a name: returns/modifies the default config (backward compatible).
275
+ # With a name: returns/creates a named config for a specific sub-app.
276
+ def config(name = :default, &block)
277
+ cfg = if name == :default
278
+ @config ||= default_config(root)
279
+ else
280
+ configs[name] ||= default_config(root)
271
281
  end
282
+ cfg.tap { |c| yield(c) if block }
272
283
  end
273
284
 
274
285
  # Public: Generates code for all serializers in the app.
@@ -287,12 +298,36 @@ module TypesFromSerializers
287
298
  end
288
299
  end
289
300
 
301
+ # Public: Generates types for all registered configurations (default + named).
302
+ # Use this in monolith setups with multiple sub-apps.
303
+ def generate_all(force: ENV["SERIALIZER_TYPES_FORCE"])
304
+ all_configs_list.each do |cfg|
305
+ with_active_config(cfg) { generate(force: force) }
306
+ end
307
+ end
308
+
290
309
  def generate_changed
291
- if changes.updated?
292
- config.output_dir.rmtree if changes.any_removed?
293
- load_serializers(changes.modified_files)
310
+ chg = changes_for(config)
311
+ if chg.updated?
312
+ config.output_dir.rmtree if chg.any_removed?
313
+ load_serializers(chg.modified_files)
294
314
  generate
295
- changes.clear
315
+ chg.clear
316
+ end
317
+ end
318
+
319
+ # Public: Like generate_changed but for all registered configurations.
320
+ def generate_all_changed
321
+ all_configs_list.each do |cfg|
322
+ chg = changes_for(cfg)
323
+ if chg.updated?
324
+ with_active_config(cfg) do
325
+ config.output_dir.rmtree if chg.any_removed?
326
+ load_serializers(chg.modified_files)
327
+ generate
328
+ chg.clear
329
+ end
330
+ end
296
331
  end
297
332
  end
298
333
 
@@ -320,9 +355,14 @@ module TypesFromSerializers
320
355
  config.skip_serializer_if.call(serializer)
321
356
  end
322
357
 
323
- # Internal: Returns an object compatible with FileUpdateChecker.
358
+ # Internal: Returns the Changes tracker for the default config (backward compatible).
324
359
  def track_changes
325
- changes
360
+ changes_for(config)
361
+ end
362
+
363
+ # Public: Returns Changes trackers for all registered configurations.
364
+ def all_changes
365
+ all_configs_list.map { |cfg| changes_for(cfg) }
326
366
  end
327
367
 
328
368
  private
@@ -331,8 +371,23 @@ module TypesFromSerializers
331
371
  defined?(Rails) ? Rails.root : Pathname.new(Dir.pwd)
332
372
  end
333
373
 
334
- def changes
335
- @changes ||= Changes.new(config.serializers_dirs)
374
+ def changes_for(cfg)
375
+ @changes_registry ||= {}
376
+ @changes_registry[cfg.object_id] ||= Changes.new(cfg.serializers_dirs)
377
+ end
378
+
379
+ # Internal: Returns the default config followed by all named configs.
380
+ def all_configs_list
381
+ [(@config || default_config(root))] + configs.values
382
+ end
383
+
384
+ # Internal: Temporarily sets the active config for the duration of a block,
385
+ # so all internal methods and refinements pick up the correct config.
386
+ def with_active_config(cfg)
387
+ saved, @config = @config, cfg
388
+ yield
389
+ ensure
390
+ @config = saved
336
391
  end
337
392
 
338
393
  def all_serializer_files
@@ -385,6 +440,7 @@ module TypesFromSerializers
385
440
  # Maps SQL column types to TypeScript native and custom types.
386
441
  sql_to_typescript_type_mapping: {
387
442
  boolean: :boolean,
443
+ time: "string | Date",
388
444
  date: "string | Date",
389
445
  datetime: "string | Date",
390
446
  decimal: "string | number",
@@ -14,15 +14,17 @@ class TypesFromSerializers::Railtie < Rails::Railtie
14
14
  require "listen"
15
15
 
16
16
  app.config.after_initialize do
17
- app.reloaders << TypesFromSerializers.track_changes
17
+ TypesFromSerializers.all_changes.each do |changes|
18
+ app.reloaders << changes
19
+ end
18
20
  end
19
21
 
20
22
  app.config.to_prepare do
21
- TypesFromSerializers.generate_changed
23
+ TypesFromSerializers.generate_all_changed
22
24
  end
23
25
  else
24
26
  app.config.to_prepare do
25
- TypesFromSerializers.generate
27
+ TypesFromSerializers.generate_all
26
28
  end
27
29
 
28
30
  Rails.logger.warn "Add 'listen' to your Gemfile to automatically generate code on serializer changes."
@@ -38,10 +40,8 @@ class TypesFromSerializers::Railtie < Rails::Railtie
38
40
  require_relative "generator"
39
41
  start_time = Time.zone.now
40
42
  print "Generating TypeScript interfaces..."
41
- serializers = TypesFromSerializers.generate(force: true)
42
- puts "completed in #{(Time.zone.now - start_time).round(2)} seconds.\n"
43
- puts "Found #{serializers.size} serializers:"
44
- puts serializers.map { |s| "\t#{s.name}" }.join("\n")
43
+ TypesFromSerializers.generate_all(force: true)
44
+ puts "completed in #{(Time.zone.now - start_time).round(2)} seconds."
45
45
  end
46
46
  end
47
47
  end
@@ -2,5 +2,5 @@
2
2
 
3
3
  module TypesFromSerializers
4
4
  # Public: This library adheres to semantic versioning.
5
- VERSION = "2.4.0"
5
+ VERSION = "2.6.0"
6
6
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: types_from_serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.4.0
4
+ version: 2.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Máximo Mussini
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2025-04-08 00:00:00.000000000 Z
11
+ date: 2026-05-06 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -31,9 +31,6 @@ dependencies:
31
31
  - - ">="
32
32
  - !ruby/object:Gem::Version
33
33
  version: 2.0.2
34
- - - "~>"
35
- - !ruby/object:Gem::Version
36
- version: '2.0'
37
34
  type: :runtime
38
35
  prerelease: false
39
36
  version_requirements: !ruby/object:Gem::Requirement
@@ -41,9 +38,6 @@ dependencies:
41
38
  - - ">="
42
39
  - !ruby/object:Gem::Version
43
40
  version: 2.0.2
44
- - - "~>"
45
- - !ruby/object:Gem::Version
46
- version: '2.0'
47
41
  - !ruby/object:Gem::Dependency
48
42
  name: listen
49
43
  requirement: !ruby/object:Gem::Requirement