Skip to content

Commit 08a47b4

Browse files
skryukovrdavid1099
andauthored
Add filename_mapper config (#110)
Co-authored-by: Ryan Workman <19210117+rdavid1099@users.noreply.github.com>
1 parent 44c7af8 commit 08a47b4

File tree

3 files changed

+31
-1
lines changed

3 files changed

+31
-1
lines changed

lib/typelizer/config.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ module Typelizer
4141
# Config keys that don't affect file content (runtime behavior, or effects captured via properties).
4242
CONFIGS_NOT_AFFECTING_OUTPUT = %i[
4343
serializer_name_mapper
44+
filename_mapper
4445
serializer_model_mapper
4546
properties_transformer
4647
model_plugin
@@ -56,6 +57,7 @@ module Typelizer
5657

5758
Config = Struct.new(
5859
:serializer_name_mapper,
60+
:filename_mapper,
5961
:serializer_model_mapper,
6062
:properties_transformer,
6163
:properties_sort_order,
@@ -95,6 +97,8 @@ def self.defaults
9597
name.sub(/(Serializer|Resource)\z/, "")
9698
end,
9799

100+
filename_mapper: nil,
101+
98102
serializer_model_mapper: lambda do |serializer|
99103
base_class = serializer_name_mapper.call(serializer)
100104
Object.const_get(base_class) if Object.const_defined?(base_class)

lib/typelizer/interface.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,11 @@ def name
3636
end
3737

3838
def filename
39-
name.gsub("::", "/")
39+
if config.filename_mapper
40+
config.filename_mapper.call(config.serializer_name_mapper.call(serializer))
41+
else
42+
name.gsub("::", "/")
43+
end
4044
end
4145

4246
def index_path(index_dir)

spec/typelizer/generator_spec.rb

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,28 @@ def restore_defaults!
8888
FileUtils.rm_rf(custom_output_dir)
8989
end
9090

91+
it "uses filename_mapper to generate nested file paths" do
92+
nested_dir = default_output_dir.parent.join("generator_nested")
93+
94+
configuration.writer(:nested) do |c|
95+
c.output_dir = nested_dir
96+
c.filename_mapper = ->(name) { name.gsub("::", "/") }
97+
end
98+
99+
generator.call(force: true)
100+
101+
# Alba::UserSerializer mapped name is "Alba::User", filename becomes "Alba/User"
102+
expect(nested_dir.join("Alba/User.ts")).to exist
103+
expect(nested_dir.join("AlbaUser.ts")).not_to exist
104+
105+
# Type name in index.ts is still flat
106+
index_content = File.read(nested_dir.join("index.ts"))
107+
expect(index_content).to include("AlbaUser")
108+
expect(index_content).to include("'./Alba/User'")
109+
ensure
110+
FileUtils.rm_rf(nested_dir)
111+
end
112+
91113
it "generates files for all writers and applies writer-specific transformers" do
92114
expect { generator.call(force: true) }.not_to raise_error
93115

0 commit comments

Comments
 (0)