types_from_serializers 2.0.2 → 2.2.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: b2d8cc0fd6d5da180f0420fbabea0c24d428de7bec297658740d1ce9fbdbb551
4
- data.tar.gz: 350a9692de1a188757db7b0efbd0be88fa8da038959070e8ff966a27f2d816bd
3
+ metadata.gz: 0e3961bc80ddc72831c77e7cf9ddf0959809a49a845f0d778d0c6ac50148cb87
4
+ data.tar.gz: e676ddfe4c4c51081075bd5bbb3a66990d8ea469dc60305a550175abe8c43c99
5
5
  SHA512:
6
- metadata.gz: a3222cd4804c0cc431b8b300f21b3b0758035cbdd66872b259571e754ad5cba32716a4bb30662809e244a6e5684047172b26712b28bc58c1f192a7e7d6ac5544
7
- data.tar.gz: 1de827c5f9b4981644b2954e5579eeebe2bea02a8a1463c9e57614555e034d4afa998bf2a14518080fced93d3faa2de943dbf9c1b12d9b7977f986086fe45097
6
+ metadata.gz: 01e286a9381c3d8f2e00c4085ba491ab4d4332ee3ac0ea2ebd109a7ff53ddb131b43d1c0839a09459884edc0536cd805d5303be2a80143a12998d6b5839dfc14
7
+ data.tar.gz: a3687e203f27c34a3243f1422588bd2c79362ef4b7f9c2432ec6ce53493c83c11782f784f8acb4a76d7a611fab6ca7e9422f63560c3053739e3b39c3258d91ed
data/CHANGELOG.md CHANGED
@@ -1,3 +1,26 @@
1
+ # [2.2.0](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@2.1.0...types_from_serializers@2.2.0) (2024-08-23)
2
+
3
+
4
+ ### Bug Fixes
5
+
6
+ * be more accurate regarding decimal serialization ([cd63653](https://github.com/ElMassimo/types_from_serializers/commit/cd636530a5710112a14746cc7d0e3f15016cd5e1))
7
+
8
+
9
+ ### Features
10
+
11
+ * infer type from enums ([#20](https://github.com/ElMassimo/types_from_serializers/issues/20)) ([49dc61d](https://github.com/ElMassimo/types_from_serializers/commit/49dc61da2718256e9b5f5743b5a65c4746d64c2f))
12
+
13
+
14
+
15
+ # [2.1.0](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@2.0.2...types_from_serializers@2.1.0) (2023-07-19)
16
+
17
+
18
+ ### Features
19
+
20
+ * add `namespace` option to generate `.d.ts` files ([#9](https://github.com/ElMassimo/types_from_serializers/issues/9)) ([6f67b1a](https://github.com/ElMassimo/types_from_serializers/commit/6f67b1ad9283868e8e3325042645bceccc85b047))
21
+
22
+
23
+
1
24
  ## [2.0.2](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@2.0.1...types_from_serializers@2.0.2) (2023-04-05)
2
25
 
3
26
 
@@ -38,15 +38,12 @@ module TypesFromSerializers
38
38
  TypesFromSerializers.config.name_from_serializer.call(name).gsub("::", "/")
39
39
  end
40
40
 
41
- # Internal: The columns corresponding to the serializer model, if it's a
42
- # record.
43
- def model_columns
44
- @model_columns ||= _serializer_model_name&.to_model.try(:columns_hash) || {}
45
- end
46
-
47
41
  # Internal: The TypeScript properties of the serialzeir interface.
48
42
  def ts_properties
49
43
  @ts_properties ||= begin
44
+ model_class = _serializer_model_name&.to_model
45
+ model_columns = model_class.try(:columns_hash) || {}
46
+ model_enums = model_class.try(:defined_enums) || {}
50
47
  types_from = try(:_serializer_types_from)
51
48
 
52
49
  prepare_attributes(
@@ -64,7 +61,7 @@ module TypesFromSerializers
64
61
  multi: options[:association] == :many,
65
62
  column_name: options.fetch(:value_from),
66
63
  ).tap do |property|
67
- property.infer_type_from(model_columns, types_from)
64
+ property.infer_type_from(model_columns, model_enums, types_from)
68
65
  end
69
66
  end
70
67
  }
@@ -94,6 +91,7 @@ module TypesFromSerializers
94
91
  :sql_to_typescript_type_mapping,
95
92
  :skip_serializer_if,
96
93
  :transform_keys,
94
+ :namespace,
97
95
  keyword_init: true,
98
96
  ) do
99
97
  def relative_custom_types_dir
@@ -140,10 +138,11 @@ module TypesFromSerializers
140
138
  end
141
139
 
142
140
  def as_typescript
143
- <<~TS
141
+ indent = TypesFromSerializers.config.namespace ? 3 : 1
142
+ <<~TS.gsub(/\n$/, "")
144
143
  interface #{name} {
145
- #{properties.index_by(&:name).values.map(&:as_typescript).join("\n ")}
146
- }
144
+ #{" " * indent}#{properties.index_by(&:name).values.map(&:as_typescript).join("\n#{" " * indent}")}
145
+ #{" " * (indent - 1)}}
147
146
  TS
148
147
  end
149
148
 
@@ -188,9 +187,11 @@ module TypesFromSerializers
188
187
 
189
188
  # Internal: Infers the property's type by checking a corresponding SQL
190
189
  # column, or falling back to a TypeScript interface if provided.
191
- def infer_type_from(columns_hash, ts_interface)
190
+ def infer_type_from(columns_hash, defined_enums, ts_interface)
192
191
  if type
193
192
  type
193
+ elsif (enum = defined_enums[column_name.to_s])
194
+ self.type = enum.keys.map(&:inspect).join(" | ")
194
195
  elsif (column = columns_hash[column_name.to_s])
195
196
  self.multi = true if column.try(:array)
196
197
  self.optional = true if column.null && !column.default
@@ -269,7 +270,12 @@ module TypesFromSerializers
269
270
  def generate(force: ENV["SERIALIZER_TYPES_FORCE"])
270
271
  @force_generation = force
271
272
  config.output_dir.rmtree if force && config.output_dir.exist?
272
- generate_index_file
273
+
274
+ if config.namespace
275
+ load_serializers(all_serializer_files) if force
276
+ else
277
+ generate_index_file
278
+ end
273
279
 
274
280
  loaded_serializers.each do |serializer|
275
281
  generate_interface_for(serializer)
@@ -289,7 +295,7 @@ module TypesFromSerializers
289
295
  def generate_interface_for(serializer)
290
296
  interface = serializer.ts_interface
291
297
 
292
- write_if_changed(filename: interface.filename, cache_key: interface.inspect) {
298
+ write_if_changed(filename: interface.filename, cache_key: interface.inspect, extension: config.namespace ? "d.ts" : "ts") {
293
299
  serializer_interface_content(interface)
294
300
  }
295
301
  end
@@ -376,7 +382,7 @@ module TypesFromSerializers
376
382
  boolean: :boolean,
377
383
  date: "string | Date",
378
384
  datetime: "string | Date",
379
- decimal: :number,
385
+ decimal: "string | number",
380
386
  integer: :number,
381
387
  string: :string,
382
388
  text: :string,
@@ -387,6 +393,9 @@ module TypesFromSerializers
387
393
 
388
394
  # Allows to transform keys, useful when converting objects client-side.
389
395
  transform_keys: nil,
396
+
397
+ # Allows scoping typescript definitions to a namespace
398
+ namespace: nil,
390
399
  )
391
400
  end
392
401
 
@@ -394,8 +403,8 @@ module TypesFromSerializers
394
403
  # The cache strategy consists of a comment on the first line of the file.
395
404
  #
396
405
  # Yields to receive the rendered file content when it needs to.
397
- def write_if_changed(filename:, cache_key:)
398
- filename = config.output_dir.join("#{filename}.ts")
406
+ def write_if_changed(filename:, cache_key:, extension: "ts")
407
+ filename = config.output_dir.join("#{filename}.#{extension}")
399
408
  FileUtils.mkdir_p(filename.dirname)
400
409
  cache_key_comment = "// TypesFromSerializers CacheKey #{Digest::MD5.hexdigest(cache_key)}\n"
401
410
  File.open(filename, "a+") { |file|
@@ -418,6 +427,10 @@ module TypesFromSerializers
418
427
  end
419
428
 
420
429
  def serializer_interface_content(interface)
430
+ config.namespace ? declaration_interface_definition(interface) : standard_interface_definition(interface)
431
+ end
432
+
433
+ def standard_interface_definition(interface)
421
434
  <<~TS
422
435
  //
423
436
  // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
@@ -426,6 +439,19 @@ module TypesFromSerializers
426
439
  TS
427
440
  end
428
441
 
442
+ def declaration_interface_definition(interface)
443
+ <<~TS
444
+ //
445
+ // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
446
+ #{interface.used_imports.empty? ? "export {}\n" : interface.used_imports.join}
447
+ declare global {
448
+ namespace #{config.namespace} {
449
+ #{interface.as_typescript}
450
+ }
451
+ }
452
+ TS
453
+ end
454
+
429
455
  # Internal: Returns true if the cache key has changed since the last codegen.
430
456
  def stale?(file, cache_key_comment)
431
457
  @force_generation || file.gets != cache_key_comment
@@ -2,5 +2,5 @@
2
2
 
3
3
  module TypesFromSerializers
4
4
  # Public: This library adheres to semantic versioning.
5
- VERSION = "2.0.2"
5
+ VERSION = "2.2.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.0.2
4
+ version: 2.2.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: 2023-04-05 00:00:00.000000000 Z
11
+ date: 2024-08-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: railties
@@ -277,7 +277,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
277
277
  - !ruby/object:Gem::Version
278
278
  version: '0'
279
279
  requirements: []
280
- rubygems_version: 3.3.7
280
+ rubygems_version: 3.4.10
281
281
  signing_key:
282
282
  specification_version: 4
283
283
  summary: Generate TypeScript interfaces from your JSON serializers.