1
1
import ts from "typescript" ;
2
2
3
+ import { IMetadataConstant } from "../../../schemas/metadata/IMetadataConstant" ;
3
4
import { IMetadataTypeTag } from "../../../schemas/metadata/IMetadataTypeTag" ;
4
5
import { Metadata } from "../../../schemas/metadata/Metadata" ;
5
6
import { MetadataAtomic } from "../../../schemas/metadata/MetadataAtomic" ;
@@ -70,21 +71,53 @@ export const iterate_metadata_intersection =
70
71
)
71
72
return false ;
72
73
74
+ // CONSIDER BOOLEAN TYPE CASE
75
+ const booleanLiteral : boolean | null = ( ( ) => {
76
+ const found = children . find (
77
+ ( c ) =>
78
+ c . size ( ) === 1 &&
79
+ c . constants . length === 1 &&
80
+ c . constants [ 0 ] ! . type === "boolean" ,
81
+ ) ?. constants [ 0 ] ?. values [ 0 ] ;
82
+ if ( found === undefined ) return null ;
83
+ return children . every (
84
+ ( c ) =>
85
+ c . atomics . length === 0 ||
86
+ c . atomics . every ( ( a ) => a . type !== "boolean" ) ,
87
+ )
88
+ ? ( found as boolean )
89
+ : null ;
90
+ } ) ( ) ;
91
+ if (
92
+ booleanLiteral !== null &&
93
+ meta . boolean_literal_intersected_ === true
94
+ ) {
95
+ (
96
+ meta . constants . find ( ( c ) => c . type === "boolean" ) !
97
+ . values as boolean [ ]
98
+ ) . push ( booleanLiteral ) ;
99
+ return true ;
100
+ }
101
+
73
102
// VALIDATE EACH TYPES
74
103
const individuals : ( readonly [ Metadata , number ] ) [ ] = children
75
104
. map ( ( child , i ) => [ child , i ] as const )
76
105
. filter (
77
106
( [ c ] ) =>
78
107
c . size ( ) === 1 &&
79
- ( c . atomics . length === 1 || c . arrays . length === 1 ) ,
108
+ ( c . atomics . length === 1 ||
109
+ ( c . constants . length === 1 &&
110
+ c . constants [ 0 ] ! . type === "boolean" ) ||
111
+ c . arrays . length === 1 ) ,
80
112
) ;
81
113
const constants : Metadata [ ] = children . filter (
82
114
( m ) =>
83
115
m . size ( ) ===
84
- m . constants
85
- . map ( ( c ) => c . values . length )
86
- . reduce ( ( a , b ) => a + b , 0 ) +
87
- m . templates . length ,
116
+ m . constants
117
+ . map ( ( c ) => c . values . length )
118
+ . reduce ( ( a , b ) => a + b , 0 ) +
119
+ m . templates . length &&
120
+ ! ( m . size ( ) === 1 && m . constants [ 0 ] ! . type === "boolean" ) ,
88
121
) ;
89
122
const objects : Metadata [ ] = children . filter (
90
123
( c ) =>
@@ -98,7 +131,14 @@ export const iterate_metadata_intersection =
98
131
) ;
99
132
const atomics : Set < "boolean" | "bigint" | "number" | "string" > =
100
133
new Set (
101
- individuals . map ( ( [ c ] ) => c . atomics . map ( ( a ) => a . type ) ) . flat ( ) ,
134
+ individuals
135
+ . map ( ( [ c ] ) => [
136
+ ...c . atomics . map ( ( a ) => a . type ) ,
137
+ ...c . constants
138
+ . filter ( ( l ) => l . type === "boolean" )
139
+ . map ( ( l ) => l . type ) ,
140
+ ] )
141
+ . flat ( ) ,
102
142
) ;
103
143
const arrays : Set < string > = new Set (
104
144
individuals . map ( ( [ c ] ) => c . arrays . map ( ( a ) => a . type . name ) ) . flat ( ) ,
@@ -149,21 +189,35 @@ export const iterate_metadata_intersection =
149
189
150
190
// RE-GENERATE TYPE
151
191
const target : "boolean" | "bigint" | "number" | "string" | "array" =
152
- atomics . size ? atomics . values ( ) . next ( ) . value : "array" ;
192
+ booleanLiteral
193
+ ? "boolean"
194
+ : atomics . size
195
+ ? atomics . values ( ) . next ( ) . value
196
+ : "array" ;
153
197
if (
154
198
target === "boolean" ||
155
199
target === "bigint" ||
156
200
target === "number" ||
157
201
target === "string"
158
202
)
159
- ArrayUtil . add (
160
- meta . atomics ,
161
- MetadataAtomic . create ( {
162
- type : atomics . values ( ) . next ( ) . value as "string" ,
163
- tags : [ ] ,
164
- } ) ,
165
- ( a , b ) => a . type === b . type ,
166
- ) ;
203
+ if ( booleanLiteral === null )
204
+ ArrayUtil . add (
205
+ meta . atomics ,
206
+ MetadataAtomic . create ( {
207
+ type : atomics . values ( ) . next ( ) . value as "string" ,
208
+ tags : [ ] ,
209
+ } ) ,
210
+ ( a , b ) => a . type === b . type ,
211
+ ) ;
212
+ else
213
+ ArrayUtil . take < IMetadataConstant > (
214
+ meta . constants ,
215
+ ( x ) => x . type === "boolean" ,
216
+ ( ) => ( {
217
+ type : "boolean" ,
218
+ values : [ booleanLiteral ] ,
219
+ } ) ,
220
+ ) ;
167
221
else if ( target === "array" ) {
168
222
const name : string = arrays . values ( ) . next ( ) . value ;
169
223
if ( ! meta . arrays . some ( ( a ) => a . type . name === name ) ) {
@@ -182,16 +236,24 @@ export const iterate_metadata_intersection =
182
236
}
183
237
184
238
// ASSIGN TAGS
185
- if ( objects . length && target !== "boolean" ) {
239
+ if ( objects . length ) {
186
240
const tags : IMetadataTypeTag [ ] = MetadataTypeTagFactory . analyze (
187
241
errors ,
188
242
) ( target ) ( objects . map ( ( om ) => om . objects ) . flat ( ) , explore ) ;
189
243
if ( tags . length )
190
244
if ( target === "array" ) meta . arrays . at ( - 1 ) ! . tags . push ( tags ) ;
191
- else
245
+ else if ( booleanLiteral === null )
192
246
meta . atomics
193
247
. find ( ( a ) => a . type === target ) !
194
248
. tags . push ( tags ) ;
249
+ else {
250
+ const constant : IMetadataConstant = meta . constants . find (
251
+ ( c ) => c . type === "boolean" ,
252
+ ) ! ;
253
+ constant . tags ??= [ ] ;
254
+ constant . tags . push ( tags ) ;
255
+ }
195
256
}
257
+ if ( booleanLiteral !== null ) meta . boolean_literal_intersected_ = true ;
196
258
return true ;
197
259
} ;
0 commit comments