typelizer 0.5.4 → 0.5.5

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: '0528e1e626a19920401677115cc49d13d3c2a730b8f332e285dcdaada8699a62'
4
- data.tar.gz: 171dde8c90cc46ee6eb5cf434f2c7cd83f15098a233e9e2a5dbb2b5f36ba470c
3
+ metadata.gz: 7b353423e2bc10fd89e3d944692c04b41b69f6b75567821060b5b9e84b5009a0
4
+ data.tar.gz: 6abb793e276d1a6627284ac7e3e5a37888e9d48850f0f74c3475ee5034c06d11
5
5
  SHA512:
6
- metadata.gz: b3785036afe6f23d5f5f830271081d20f99810e3582d853b28bd34e5558e20609615b929a870c6ef518b75389b48c6e092a8043d8c24510ad1a01b9d82449021
7
- data.tar.gz: c0bde62a2756d3b67cba8bf8fa061f898d2837bae191f80fa6960c1fe08c654044807c0c8157cffa6c45edee632716f7c105a54cae4b5f87d3ece6b546c7cda1
6
+ metadata.gz: 92ebe7361f52e8644576b8eabffcf0602f24369e9f6a9bc82837550b123440438befef9fb0d730c8c96cab63e111858aa05088b65aa46ab2a1c6b2c58868fcff
7
+ data.tar.gz: 9ee89e0e1761257e51a97ba4666c3cecc4c02581f1726117f67f5328be510b4fd05653f46effad3d33fb119dcee01c9734160be3b2893d3cf566a2d5079c05f5
data/CHANGELOG.md CHANGED
@@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning].
7
7
 
8
8
  ## [Unreleased]
9
9
 
10
+ ## [0.5.5] - 2025-12-24
11
+
12
+ ### Added
13
+
14
+ - New `properties_sort_order` configuration option for consistent property ordering in generated TypeScript interfaces. ([@skryukov])
15
+
16
+ ```ruby
17
+ Typelizer.configure do |config|
18
+ # Sort properties alphabetically with 'id' first
19
+ config.properties_sort_order = :id_first_alphabetical
20
+ end
21
+ ```
22
+
23
+ Available options:
24
+ - `:none` (default) - preserve serializer definition order
25
+ - `:alphabetical` - sort properties A-Z (case-insensitive)
26
+ - `:id_first_alphabetical` - place `id` first, then sort remaining A-Z
27
+ - `Proc` - custom sorting logic
28
+
29
+ ```ruby
30
+ # Custom sorting example
31
+ config.properties_sort_order = ->(props) {
32
+ priority = %w[id uuid type]
33
+ props.sort_by { |p| [priority.index(p.name) || 999, p.name] }
34
+ }
35
+ ```
36
+
37
+ ### Fixed
38
+
39
+ - Fix self-import issue when using custom `typelize` types for self-referential associations in namespaced serializers. ([@skryukov])
40
+
10
41
  ## [0.5.4] - 2025-12-08
11
42
 
12
43
  ### Added
@@ -279,7 +310,8 @@ and this project adheres to [Semantic Versioning].
279
310
  [@prog-supdex]: https://github.com/prog-supdex
280
311
  [@ventsislaf]: https://github.com/ventsislaf
281
312
 
282
- [Unreleased]: https://github.com/skryukov/typelizer/compare/v0.5.4...HEAD
313
+ [Unreleased]: https://github.com/skryukov/typelizer/compare/v0.5.5...HEAD
314
+ [0.5.5]: https://github.com/skryukov/typelizer/compare/v0.5.4...v0.5.5
283
315
  [0.5.4]: https://github.com/skryukov/typelizer/compare/v0.5.3...v0.5.4
284
316
  [0.5.3]: https://github.com/skryukov/typelizer/compare/v0.5.2...v0.5.3
285
317
  [0.5.2]: https://github.com/skryukov/typelizer/compare/v0.5.1...v0.5.2
data/README.md CHANGED
@@ -486,6 +486,13 @@ Typelizer.configure do |config|
486
486
  # Custom transformation for generated properties
487
487
  config.properties_transformer = ->(properties) { ... }
488
488
 
489
+ # Strategy for ordering properties in generated TypeScript interfaces
490
+ # :none - preserve serializer definition order (default)
491
+ # :alphabetical - sort properties A-Z (case-insensitive)
492
+ # :id_first_alphabetical - place 'id' first, then sort remaining A-Z
493
+ # Proc - custom sorting function receiving array of Property objects
494
+ config.properties_sort_order = :none
495
+
489
496
  # Plugin for model type inference (default: ModelPlugins::Auto)
490
497
  config.model_plugin = Typelizer::ModelPlugins::Auto
491
498
 
@@ -23,6 +23,7 @@ module Typelizer
23
23
  :serializer_name_mapper,
24
24
  :serializer_model_mapper,
25
25
  :properties_transformer,
26
+ :properties_sort_order,
26
27
  :model_plugin,
27
28
  :serializer_plugin,
28
29
  :plugin_configs,
@@ -77,6 +78,7 @@ module Typelizer
77
78
  types_import_path: "@/types",
78
79
  types_global: DEFAULT_TYPES_GLOBAL,
79
80
  properties_transformer: nil,
81
+ properties_sort_order: :none,
80
82
  verbatim_module_syntax: false
81
83
  }
82
84
  end
@@ -48,7 +48,7 @@ module Typelizer
48
48
  props = serializer_plugin.meta_fields || []
49
49
  props = infer_types(props, :_typelizer_meta_attributes)
50
50
  props = config.properties_transformer.call(props) if config.properties_transformer
51
- props
51
+ PropertySorter.sort(props, config.properties_sort_order)
52
52
  end
53
53
  end
54
54
 
@@ -63,7 +63,7 @@ module Typelizer
63
63
  props = serializer_plugin.properties
64
64
  props = infer_types(props)
65
65
  props = config.properties_transformer.call(props) if config.properties_transformer
66
- props
66
+ PropertySorter.sort(props, config.properties_sort_order)
67
67
  end
68
68
  end
69
69
 
@@ -119,7 +119,7 @@ module Typelizer
119
119
  prop.with_traits.map { |t| "#{prop.type.name}#{t.to_s.camelize}Trait" }
120
120
  end
121
121
 
122
- (custom_type_imports + serializer_types + trait_imports + Array(parent_interface&.name)).uniq - Array(self_type_name)
122
+ (custom_type_imports + serializer_types + trait_imports + Array(parent_interface&.name)).uniq - [self_type_name, name]
123
123
  end
124
124
  end
125
125
 
@@ -0,0 +1,24 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Typelizer
4
+ module PropertySorter
5
+ def self.sort(props, sort_order)
6
+ case sort_order
7
+ when :none, nil
8
+ props
9
+ when :alphabetical
10
+ props.sort_by { |p| p.name.to_s.downcase }
11
+ when :id_first_alphabetical
12
+ props.sort_by { |p| [(p.name.to_s.downcase == "id") ? 0 : 1, p.name.to_s.downcase] }
13
+ when Proc
14
+ result = sort_order.call(props)
15
+ result.is_a?(Array) ? result : props
16
+ else
17
+ props
18
+ end
19
+ rescue => e
20
+ Typelizer.logger.warn("PropertySorter error: #{e.message}, preserving original order")
21
+ props
22
+ end
23
+ end
24
+ end
@@ -24,7 +24,8 @@ module Typelizer
24
24
  def properties
25
25
  @properties ||= begin
26
26
  props, typelizes = plugin.trait_properties(trait_name)
27
- infer_types(props, typelizes)
27
+ props = infer_types(props, typelizes)
28
+ PropertySorter.sort(props, config.properties_sort_order)
28
29
  end
29
30
  end
30
31
 
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Typelizer
4
- VERSION = "0.5.4"
4
+ VERSION = "0.5.5"
5
5
  end
data/lib/typelizer.rb CHANGED
@@ -11,6 +11,7 @@ require_relative "typelizer/serializer_config_layer"
11
11
 
12
12
  require_relative "typelizer/contexts/writer_context"
13
13
  require_relative "typelizer/contexts/scan_context"
14
+ require_relative "typelizer/property_sorter"
14
15
  require_relative "typelizer/interface"
15
16
  require_relative "typelizer/renderer"
16
17
  require_relative "typelizer/writer"
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: typelizer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.4
4
+ version: 0.5.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Svyatoslav Kryukov
@@ -60,6 +60,7 @@ files:
60
60
  - lib/typelizer/model_plugins/auto.rb
61
61
  - lib/typelizer/model_plugins/poro.rb
62
62
  - lib/typelizer/property.rb
63
+ - lib/typelizer/property_sorter.rb
63
64
  - lib/typelizer/railtie.rb
64
65
  - lib/typelizer/renderer.rb
65
66
  - lib/typelizer/serializer_config_layer.rb
@@ -104,7 +105,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
104
105
  - !ruby/object:Gem::Version
105
106
  version: '0'
106
107
  requirements: []
107
- rubygems_version: 4.0.0
108
+ rubygems_version: 3.6.9
108
109
  specification_version: 4
109
110
  summary: A TypeScript type generator for Ruby serializers.
110
111
  test_files: []