@@ -211,13 +211,34 @@ def parse_settings(settings_content: str) -> Dict[str, Any]:
211
211
return settings
212
212
213
213
214
+ def typescript_to_json (ts_str : str ) -> str :
215
+ """Convert a TypeScript-style object/array string to valid JSON."""
216
+ # Remove newlines and excessive spaces for easier regex
217
+ s = ts_str .strip ()
218
+ # Remove trailing commas before closing brackets/braces
219
+ s = re .sub (r",\s*([}\]])" , r"\1" , s )
220
+ # Quote property names (unquoted keys)
221
+ s = re .sub (r"([,{]\s*)([A-Za-z0-9_]+)\s*:" , r'\1"\2":' , s )
222
+ # Quote string values (only those not already quoted)
223
+ s = re .sub (r":\s*([A-Za-z0-9_\-/\.]+)" , r': "\1"' , s )
224
+ # Replace single quotes with double quotes
225
+ s = s .replace ("'" , '"' )
226
+ return s
227
+
228
+
214
229
def extract_default_value (content : str ) -> Any :
215
230
"""Extract default value from setting content."""
216
231
217
232
# Debug output (only for competitors field)
218
233
if "competitors" in content :
219
234
print (f"DEBUG: extract_default_value called with content: { content } " )
220
235
236
+ # Debug output for categories field
237
+ if "categories" in content :
238
+ print (
239
+ f"DEBUG: extract_default_value called with content for categories: { content } "
240
+ )
241
+
221
242
# Look for default: followed by various value types
222
243
# Use a more robust pattern that handles arrays and objects
223
244
default_match = re .search (r"default:\s*(.+?)(?:,|$)" , content , re .DOTALL )
@@ -237,18 +258,24 @@ def extract_default_value(content: str) -> Any:
237
258
# Find the position of the opening bracket in the original content
238
259
default_start = content .find ("default:" )
239
260
if default_start != - 1 :
240
- # Find the opening bracket after "default:"
241
- bracket_start = content .find ("[" , default_start )
261
+ bracket_start = - 1
262
+ if value_str .startswith ("[" ):
263
+ bracket_start = content .find ("[" , default_start )
264
+ elif value_str .startswith ("{" ):
265
+ bracket_start = content .find ("{" , default_start )
266
+
242
267
if bracket_start != - 1 :
243
268
# Find the matching closing bracket
244
269
bracket_count = 0
245
270
complete_value = ""
271
+ open_char = content [bracket_start ]
272
+ close_char = "]" if open_char == "[" else "}"
246
273
247
274
for i , char in enumerate (content [bracket_start :], bracket_start ):
248
275
complete_value += char
249
- if char == "[" :
276
+ if char == open_char :
250
277
bracket_count += 1
251
- elif char == "]" :
278
+ elif char == close_char :
252
279
bracket_count -= 1
253
280
if bracket_count == 0 :
254
281
break
@@ -259,13 +286,26 @@ def extract_default_value(content: str) -> Any:
259
286
if "competitors" in content :
260
287
print (f"DEBUG: Original value_str: { default_match .group (1 ).strip ()} " )
261
288
print (f"DEBUG: Complete value_str: { value_str } " )
289
+
290
+ # Debug output for categories field
291
+ if "categories" in content :
292
+ print (
293
+ f"DEBUG: Original value_str for categories: { default_match .group (1 ).strip ()} "
294
+ )
295
+ print (f"DEBUG: Complete value_str for categories: { value_str } " )
262
296
else :
263
297
# Debug output (only for competitors field)
264
298
if "competitors" in content :
265
299
print (f"DEBUG: Not an array/object, value_str: { value_str } " )
266
300
print (f"DEBUG: value_str starts with '[': { value_str .startswith ('[' )} " )
267
301
print (f"DEBUG: value_str starts with '{{': { value_str .startswith ('{' )} " )
268
302
303
+ # Debug output for categories field
304
+ if "categories" in content :
305
+ print (f"DEBUG: Not an array/object, value_str for categories: { value_str } " )
306
+ print (f"DEBUG: value_str starts with '[': { value_str .startswith ('[' )} " )
307
+ print (f"DEBUG: value_str starts with '{{': { value_str .startswith ('{' )} " )
308
+
269
309
# Handle different value types
270
310
if value_str .startswith ('"' ) and value_str .endswith ('"' ):
271
311
# String value
@@ -286,13 +326,23 @@ def extract_default_value(content: str) -> Any:
286
326
try :
287
327
return json .loads (value_str )
288
328
except :
289
- return []
329
+ # Try to convert TypeScript array to JSON
330
+ try :
331
+ json_str = typescript_to_json (value_str )
332
+ return json .loads (json_str )
333
+ except :
334
+ return []
290
335
elif value_str .startswith ("{" ) and value_str .endswith ("}" ):
291
336
# Object value - try to parse as JSON
292
337
try :
293
338
return json .loads (value_str )
294
339
except :
295
- return {}
340
+ # Try to convert TypeScript object to JSON
341
+ try :
342
+ json_str = typescript_to_json (value_str )
343
+ return json .loads (json_str )
344
+ except :
345
+ return {}
296
346
else :
297
347
return value_str
298
348
@@ -566,15 +616,15 @@ def generate_openapi_schema(evaluators: Dict[str, Any]) -> Dict[str, Any]:
566
616
}
567
617
568
618
default_value = setting .get ("default" )
569
- if isinstance (default_value , str ):
619
+ if isinstance (default_value , bool ):
620
+ property_def ["type" ] = "boolean"
621
+ property_def ["default" ] = default_value
622
+ elif isinstance (default_value , str ):
570
623
property_def ["type" ] = "string"
571
624
property_def ["default" ] = default_value
572
625
elif isinstance (default_value , (int , float )):
573
626
property_def ["type" ] = "number"
574
627
property_def ["default" ] = default_value
575
- elif isinstance (default_value , bool ):
576
- property_def ["type" ] = "boolean"
577
- property_def ["default" ] = default_value
578
628
elif isinstance (default_value , list ):
579
629
property_def ["type" ] = "array"
580
630
# Infer item type for arrays
0 commit comments