types_from_serializers 0.1.0 → 0.1.3

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: ab46cb83091bc01087646a3e9c1eee590d4148ea16f86fcca2c83ad91b24d2a5
4
- data.tar.gz: 95e62afbb4b49ab897434fe33926322964439af03726c570bec6296eb4c51ca1
3
+ metadata.gz: ddc6e7ca4c4edfab72abe33e0a3688871bd8e746f00f0ea00c832e9b4bad700e
4
+ data.tar.gz: cf128002a889f0446b6ddc0c8a212dbbd5885af27c6aee1552a8de9b5f723a22
5
5
  SHA512:
6
- metadata.gz: 8280b0616181a1b13b4192bc6cd9ceb6b43498d31bd83b871d3da0bba924c63b52d67598df83df8d8ccac535999f81a99e42b530cbc0ab6afeddbfa9366928e2
7
- data.tar.gz: ee8d6f445603ef26932c631a2064f337186c6f27451771b2f31577df37c587f318b1abe22e9277e7db48f2d65d47ca7c62f1177a67cbc35df615e5277931bce1
6
+ metadata.gz: 4f05eada087b1d751525c2439ad60918e0179fce0766230d75502e3ad1d8970af74057e1262c89eaf04b372885574b01d645f852b284d56f73bb88eeab6e072e
7
+ data.tar.gz: 98c5830eb74ae87c10313ad07eb4f72f35f444f8f4c75db8e79640200017e67dff65e45464aa24afcfb68fad3261735ee7ae3b9e3a155a090e91160c8bb9fac3
data/CHANGELOG.md CHANGED
@@ -1,15 +1,39 @@
1
- # 0.1.0 (2022-07-12)
1
+ ## [0.1.3](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@0.1.2...types_from_serializers@0.1.3) (2022-07-12)
2
+
3
+
4
+ ### Features
5
+
6
+ * apply the sql mapping fallback as the default ([64898c4](https://github.com/ElMassimo/types_from_serializers/commit/64898c4e3a3f83ea67294f2200f253cd2a64aea9))
7
+
8
+
9
+
10
+ ## [0.1.2](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@0.1.1...types_from_serializers@0.1.2) (2022-07-12)
2
11
 
3
12
 
4
13
  ### Bug Fixes
5
14
 
6
- * handle non-ActiveRecord models and extract types from unions ([ea9b2a7](https://github.com/ElMassimo/types_from_serializers/commit/ea9b2a71cb85503ff691e5ef115ab73f89b005af))
15
+ * avoid having the full file path in the cache key ([556f8f6](https://github.com/ElMassimo/types_from_serializers/commit/556f8f667608fa950a3ad0647540055b1b5f1dc8))
16
+
17
+
18
+
19
+ ## [0.1.1](https://github.com/ElMassimo/types_from_serializers/compare/types_from_serializers@0.1.0...types_from_serializers@0.1.1) (2022-07-12)
20
+
21
+
22
+
23
+ # 0.1.0 (2022-07-12)
7
24
 
8
25
 
9
26
  ### Features
10
27
 
11
- * make the DSL is available without manually requiring ([04a4f3a](https://github.com/ElMassimo/types_from_serializers/commit/04a4f3ad3c96658639cbe75de07f19cc7f79f4c6))
12
- * support specifying base serializers and additional dirs to scan ([164cfe1](https://github.com/ElMassimo/types_from_serializers/commit/164cfe17bb0527c59cf95441381aef7bf797a568))
28
+ - Start simple, no additional syntax required
29
+ - Infers types from a related `ActiveRecord` model, using the SQL schema
30
+ - Understands JS native types and how to map SQL columns: `string`, `boolean`, etc
31
+ - Automatically types [associations](https://github.com/ElMassimo/oj_serializers#associations-dsl-), importing the generated types for the referenced serializers
32
+ - Detects [conditional attributes](https://github.com/ElMassimo/oj_serializers#rendering-an-attribute-conditionally) and marks them as optional: `name?: string`
33
+ - Fallback to a custom interface using `type_from`
34
+ - Supports custom types and automatically adds the necessary imports
35
+ - handle non-ActiveRecord models and extract types from unions ([ea9b2a7](https://github.com/ElMassimo/types_from_serializers/commit/ea9b2a71cb85503ff691e5ef115ab73f89b005af))
36
+ - support specifying base serializers and additional dirs to scan ([164cfe1](https://github.com/ElMassimo/types_from_serializers/commit/164cfe17bb0527c59cf95441381aef7bf797a568))
13
37
 
14
38
 
15
39
 
@@ -15,7 +15,11 @@ module TypesFromSerializers
15
15
  :native_types,
16
16
  :sql_to_typescript_type_mapping,
17
17
  keyword_init: true,
18
- )
18
+ ) do
19
+ def unknown_type
20
+ sql_to_typescript_type_mapping.default
21
+ end
22
+ end
19
23
 
20
24
  # Internal: The type metadata for a serializer.
21
25
  SerializerMetadata = Struct.new(
@@ -47,9 +51,10 @@ module TypesFromSerializers
47
51
  to_s.classify.safe_constantize
48
52
  end
49
53
 
50
- delegate :to_model, to: :to_s
54
+ def to_model
55
+ to_s.to_model
56
+ end
51
57
  end
52
- # rubocop:enable Rails/Delegate
53
58
 
54
59
  refine Class do
55
60
  # Internal: Name of the TypeScript interface.
@@ -133,7 +138,7 @@ module TypesFromSerializers
133
138
 
134
139
  def typescript_fields(metadata)
135
140
  (metadata.attributes + metadata.associations).map { |meta|
136
- type = meta.type.is_a?(Class) ? meta.type.typescript_interface_name : meta.type || :unknown
141
+ type = meta.type.is_a?(Class) ? meta.type.typescript_interface_name : meta.type || TypesFromSerializers.config.unknown_type
137
142
  type = meta.many ? "#{type}[]" : type
138
143
  " #{meta.typescript_name}#{"?" if meta.optional}: #{type}"
139
144
  }
@@ -198,6 +203,7 @@ module TypesFromSerializers
198
203
  # Public: Generates code for all serializers in the app.
199
204
  def generate(force: ENV["SERIALIZER_TYPES_FORCE"])
200
205
  @force_generation = force
206
+ config.output_dir.rmtree if force && config.output_dir.exist?
201
207
  generate_index_file
202
208
 
203
209
  loaded_serializers.each do |serializer|
@@ -221,26 +227,16 @@ module TypesFromSerializers
221
227
 
222
228
  write_if_changed(filename: filename, cache_key: metadata.inspect) {
223
229
  serializer.typescript_infer_types(metadata)
224
- <<~TS
225
- //
226
- // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
227
- #{serializer.typescript_imports(metadata).join}
228
- export default interface #{serializer.typescript_interface_name} {
229
- #{serializer.typescript_fields(metadata).join("\n")}
230
- }
231
- TS
230
+ serializer_interface_content(serializer, metadata)
232
231
  }
233
232
  end
234
233
 
235
234
  # Internal: Allows to import all serializer types from a single file.
236
235
  def generate_index_file
237
- write_if_changed(filename: "index", cache_key: all_serializer_files.join) {
236
+ cache_key = all_serializer_files.map { |file| file.delete_prefix(root.to_s) }.join
237
+ write_if_changed(filename: "index", cache_key: cache_key) {
238
238
  load_serializers(all_serializer_files)
239
- <<~TS
240
- //
241
- // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
242
- #{loaded_serializers.map { |s| "export type { default as #{s.typescript_interface_name} } from './#{s.typescript_interface_basename}'" }.join("\n")}
243
- TS
239
+ serializers_index_content(loaded_serializers)
244
240
  }
245
241
  end
246
242
 
@@ -265,7 +261,7 @@ module TypesFromSerializers
265
261
  end
266
262
 
267
263
  def all_serializer_files
268
- config.serializers_dirs.flat_map { |dir| Dir["#{dir}/**/*.rb"] }
264
+ config.serializers_dirs.flat_map { |dir| Dir["#{dir}/**/*.rb"] }.sort
269
265
  end
270
266
 
271
267
  def load_serializers(files)
@@ -335,6 +331,25 @@ module TypesFromSerializers
335
331
  }
336
332
  end
337
333
 
334
+ def serializers_index_content(serializers)
335
+ <<~TS
336
+ //
337
+ // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
338
+ #{serializers.map { |s| "export type { default as #{s.typescript_interface_name} } from './#{s.typescript_interface_basename}'" }.join("\n")}
339
+ TS
340
+ end
341
+
342
+ def serializer_interface_content(serializer, metadata)
343
+ <<~TS
344
+ //
345
+ // DO NOT MODIFY: This file was automatically generated by TypesFromSerializers.
346
+ #{serializer.typescript_imports(metadata).join}
347
+ export default interface #{serializer.typescript_interface_name} {
348
+ #{serializer.typescript_fields(metadata).join("\n")}
349
+ }
350
+ TS
351
+ end
352
+
338
353
  # Internal: Returns true if the cache key has changed since the last codegen.
339
354
  def stale?(file, cache_key_comment)
340
355
  @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 = "0.1.0"
5
+ VERSION = "0.1.3"
6
6
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: types_from_serializers
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Máximo Mussini
@@ -114,6 +114,20 @@ dependencies:
114
114
  - - "~>"
115
115
  - !ruby/object:Gem::Version
116
116
  version: '3.8'
117
+ - !ruby/object:Gem::Dependency
118
+ name: rspec-snapshot
119
+ requirement: !ruby/object:Gem::Requirement
120
+ requirements:
121
+ - - ">="
122
+ - !ruby/object:Gem::Version
123
+ version: '0'
124
+ type: :development
125
+ prerelease: false
126
+ version_requirements: !ruby/object:Gem::Requirement
127
+ requirements:
128
+ - - ">="
129
+ - !ruby/object:Gem::Version
130
+ version: '0'
117
131
  - !ruby/object:Gem::Dependency
118
132
  name: simplecov
119
133
  requirement: !ruby/object:Gem::Requirement
@@ -142,6 +156,62 @@ dependencies:
142
156
  - - "~>"
143
157
  - !ruby/object:Gem::Version
144
158
  version: '1.0'
159
+ - !ruby/object:Gem::Dependency
160
+ name: activerecord
161
+ requirement: !ruby/object:Gem::Requirement
162
+ requirements:
163
+ - - ">="
164
+ - !ruby/object:Gem::Version
165
+ version: '0'
166
+ type: :development
167
+ prerelease: false
168
+ version_requirements: !ruby/object:Gem::Requirement
169
+ requirements:
170
+ - - ">="
171
+ - !ruby/object:Gem::Version
172
+ version: '0'
173
+ - !ruby/object:Gem::Dependency
174
+ name: js_from_routes
175
+ requirement: !ruby/object:Gem::Requirement
176
+ requirements:
177
+ - - ">="
178
+ - !ruby/object:Gem::Version
179
+ version: '0'
180
+ type: :development
181
+ prerelease: false
182
+ version_requirements: !ruby/object:Gem::Requirement
183
+ requirements:
184
+ - - ">="
185
+ - !ruby/object:Gem::Version
186
+ version: '0'
187
+ - !ruby/object:Gem::Dependency
188
+ name: sqlite3
189
+ requirement: !ruby/object:Gem::Requirement
190
+ requirements:
191
+ - - ">="
192
+ - !ruby/object:Gem::Version
193
+ version: '0'
194
+ type: :development
195
+ prerelease: false
196
+ version_requirements: !ruby/object:Gem::Requirement
197
+ requirements:
198
+ - - ">="
199
+ - !ruby/object:Gem::Version
200
+ version: '0'
201
+ - !ruby/object:Gem::Dependency
202
+ name: rubocop
203
+ requirement: !ruby/object:Gem::Requirement
204
+ requirements:
205
+ - - ">="
206
+ - !ruby/object:Gem::Version
207
+ version: '0'
208
+ type: :development
209
+ prerelease: false
210
+ version_requirements: !ruby/object:Gem::Requirement
211
+ requirements:
212
+ - - ">="
213
+ - !ruby/object:Gem::Version
214
+ version: '0'
145
215
  - !ruby/object:Gem::Dependency
146
216
  name: rubocop-rails
147
217
  requirement: !ruby/object:Gem::Requirement