@@ -74,6 +74,62 @@ export function generateDtsTypes(sourceCode: string): string {
74
74
return result
75
75
}
76
76
77
+ function parseObjectLiteral ( objectLiteral : string ) : string {
78
+ // Remove the opening and closing braces
79
+ const content = objectLiteral . slice ( 1 , - 1 ) . trim ( )
80
+
81
+ const pairs = [ ]
82
+ let currentPair = ''
83
+ let inQuotes = false
84
+ let bracketCount = 0
85
+
86
+ for ( let i = 0 ; i < content . length ; i ++ ) {
87
+ const char = content [ i ]
88
+
89
+ if ( char === '"' || char === '\'' ) {
90
+ inQuotes = ! inQuotes
91
+ }
92
+ else if ( ! inQuotes ) {
93
+ if ( char === '{' )
94
+ bracketCount ++
95
+ if ( char === '}' )
96
+ bracketCount --
97
+ }
98
+
99
+ if ( char === ',' && ! inQuotes && bracketCount === 0 ) {
100
+ pairs . push ( currentPair . trim ( ) )
101
+ currentPair = ''
102
+ }
103
+ else {
104
+ currentPair += char
105
+ }
106
+ }
107
+
108
+ if ( currentPair . trim ( ) ) {
109
+ pairs . push ( currentPair . trim ( ) )
110
+ }
111
+
112
+ const parsedProperties = pairs . map ( ( pair ) => {
113
+ const colonIndex = pair . indexOf ( ':' )
114
+ if ( colonIndex === - 1 )
115
+ return null // Invalid pair
116
+
117
+ const key = pair . slice ( 0 , colonIndex ) . trim ( )
118
+ const value = pair . slice ( colonIndex + 1 ) . trim ( )
119
+
120
+ // If the value is a string literal, keep it as is
121
+ if ( value . startsWith ( '\'' ) || value . startsWith ( '"' ) ) {
122
+ return ` ${ key } : ${ value } ;`
123
+ }
124
+
125
+ // For other types, use preserveValueType
126
+ const preservedValue = preserveValueType ( value )
127
+ return ` ${ key } : ${ preservedValue } ;`
128
+ } ) . filter ( Boolean )
129
+
130
+ return `{\n${ parsedProperties . join ( '\n' ) } \n}`
131
+ }
132
+
77
133
function processDeclaration ( declaration : string ) : string {
78
134
// Remove comments
79
135
const declWithoutComments = declaration . replace ( / \/ \/ .* $ / gm, '' ) . trim ( )
@@ -90,16 +146,10 @@ function processDeclaration(declaration: string): string {
90
146
91
147
// Handle multi-line object literals
92
148
if ( value . startsWith ( '{' ) ) {
93
- let bracketCount = 1
94
- let i = 1
95
- while ( bracketCount > 0 && i < value . length ) {
96
- if ( value [ i ] === '{' )
97
- bracketCount ++
98
- if ( value [ i ] === '}' )
99
- bracketCount --
100
- i ++
149
+ const lastBracketIndex = trimmed . lastIndexOf ( '}' )
150
+ if ( lastBracketIndex !== - 1 ) {
151
+ value = trimmed . slice ( equalIndex + 1 , lastBracketIndex + 1 ) . trim ( )
101
152
}
102
- value = value . slice ( 0 , i )
103
153
}
104
154
105
155
const declaredType = name . includes ( ':' ) ? name . split ( ':' ) [ 1 ] . trim ( ) : null
@@ -127,74 +177,33 @@ function processDeclaration(declaration: string): string {
127
177
}
128
178
}
129
179
130
- // Handle other declarations (interfaces, types, functions)
131
- if ( trimmed . startsWith ( 'export' ) ) {
132
- return trimmed . endsWith ( ';' ) ? trimmed : ` ${ trimmed } ;`
180
+ // Handle interface declarations
181
+ if ( trimmed . startsWith ( 'export interface ' ) ) {
182
+ return `export declare interface ${ trimmed . slice ( 'export interface' . length ) . trim ( ) } ;`
133
183
}
134
184
135
- return ''
136
- }
137
-
138
- function parseObjectLiteral ( objectLiteral : string ) : string {
139
- // Remove the opening and closing braces
140
- const content = objectLiteral . slice ( 1 , - 1 ) . trim ( )
141
-
142
- const pairs = [ ]
143
- let currentPair = ''
144
- let inQuotes = false
145
- let bracketCount = 0
146
- let escapeNext = false
147
-
148
- for ( let i = 0 ; i < content . length ; i ++ ) {
149
- const char = content [ i ]
150
-
151
- if ( ! escapeNext && ( char === '"' || char === '\'' ) ) {
152
- inQuotes = ! inQuotes
153
- }
154
- else if ( ! inQuotes ) {
155
- if ( char === '{' )
156
- bracketCount ++
157
- if ( char === '}' )
158
- bracketCount --
159
- }
160
-
161
- if ( char === ',' && ! inQuotes && bracketCount === 0 ) {
162
- pairs . push ( currentPair . trim ( ) )
163
- currentPair = ''
164
- }
165
- else {
166
- currentPair += char
167
- }
168
-
169
- escapeNext = char === '\\' && ! escapeNext
185
+ // Handle type declarations
186
+ if ( trimmed . startsWith ( 'export type' ) ) {
187
+ return `export declare type ${ trimmed . slice ( 'export type' . length ) . trim ( ) } ;`
170
188
}
171
189
172
- if ( currentPair . trim ( ) ) {
173
- pairs . push ( currentPair . trim ( ) )
190
+ // Handle function declarations
191
+ if ( trimmed . startsWith ( 'export function' ) ) {
192
+ const functionSignature = trimmed . split ( '{' ) [ 0 ] . trim ( )
193
+ return `export declare ${ functionSignature . slice ( 'export' . length ) . trim ( ) } ;`
174
194
}
175
195
176
- const parsedProperties = pairs . map ( ( pair ) => {
177
- const colonIndex = pair . indexOf ( ':' )
178
- if ( colonIndex === - 1 )
179
- return null // Invalid pair
180
-
181
- const key = pair . slice ( 0 , colonIndex ) . trim ( )
182
- const value = pair . slice ( colonIndex + 1 ) . trim ( )
183
-
184
- const sanitizedValue = preserveValueType ( value )
185
- return ` ${ key } : ${ sanitizedValue } ;`
186
- } ) . filter ( Boolean )
196
+ // Handle other declarations
197
+ if ( trimmed . startsWith ( 'export' ) ) {
198
+ return trimmed . endsWith ( ';' ) ? trimmed : `${ trimmed } ;`
199
+ }
187
200
188
- return `{\n ${ parsedProperties . join ( '\n' ) } \n}`
201
+ return ''
189
202
}
190
203
191
204
function preserveValueType ( value : string ) : string {
192
205
value = value . trim ( )
193
- if ( value . startsWith ( '\'' ) || value . startsWith ( '"' ) ) {
194
- // Handle string literals, including URLs
195
- return value // Keep the original string as is, including quotes
196
- }
197
- else if ( value === 'true' || value === 'false' ) {
206
+ if ( value === 'true' || value === 'false' ) {
198
207
return value // Keep true and false as literal types
199
208
}
200
209
else if ( ! Number . isNaN ( Number ( value ) ) ) {
0 commit comments