Skip to content

Commit 5cd2dab

Browse files
feat: Allow recursive type definition
Let's say we have the following type: ```typescript type Chapter = { title: string next: Chapter | null } ``` Here, `Chapter` type is recursive, referencing itself. Typelizer can generate this kind of type, but currently it tries to import itself and causes an error. This commit fixes this issue by ignoring itself from import target. Note that I added spec for Alba only since that was my case, but please tell me if I should add more specs for other serializers.
1 parent 6ac726e commit 5cd2dab

File tree

4 files changed

+17
-3
lines changed

4 files changed

+17
-3
lines changed

lib/typelizer/interface.rb

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def imports
6666
.uniq
6767
.reject { |type| global_type?(type) }
6868

69-
(custom_type_imports + serializer_types).uniq
69+
(custom_type_imports + serializer_types).uniq - Array(self_type_name)
7070
end
7171

7272
def inspect
@@ -75,6 +75,10 @@ def inspect
7575

7676
private
7777

78+
def self_type_name
79+
serializer.name.match(/(\w+::)?(\w+)(Serializer|Resource)/)[2]
80+
end
81+
7882
def extract_typescript_types(type)
7983
type.split(/[<>\[\],\s|]+/)
8084
end

spec/__snapshots__/AlbaPost.ts.snap

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
// Typelizer digest a9453a41deef37fc65276aad80c95e46
1+
// Typelizer digest c272bbef7d366eb5882788757480509d
22
//
33
// DO NOT MODIFY: This file was automatically generated by Typelizer.
44
import type {AlbaUser} from '@/types'
@@ -10,6 +10,7 @@ type AlbaPost = {
1010
body?: string | null;
1111
published_at?: string | null;
1212
user: AlbaUser;
13+
next_post: Post;
1314
}
1415

1516
export default AlbaPost;

spec/app/app/models/post.rb

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,8 @@ class Post < ApplicationRecord
22
belongs_to :user
33

44
enum category: {news: 1, article: 2, blog: 3}
5+
6+
def next_post
7+
# Returns Post
8+
end
59
end

spec/app/app/serializers/alba/post_serializer.rb

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,16 @@ class PostSerializer
55

66
typelizer_config do |c|
77
c.null_strategy = :nullable_and_optional
8-
c.serializer_model_mapper = ->(serializer) { Object.const_get(serializer.name.gsub("Serializer", "").gsub("Alba::", "")) }
8+
c.serializer_model_mapper = lambda { |serializer|
9+
Object.const_get(serializer.name.gsub("Serializer", "").gsub("Alba::", ""))
10+
}
911
end
1012

1113
attributes :id, :title, :category, :body, :published_at
1214

1315
has_one :user, serializer: UserSerializer
16+
17+
attributes :next_post
18+
typelize next_post: "Post"
1419
end
1520
end

0 commit comments

Comments
 (0)