
    Pi@d                        d dl mZ d dlZd dlZd dlZd dlZd dlZd dlmZ  G d de	          Z
 G d dej                  ZdddZddZedk    r!d dlZd Z eed          Z ee           dS dS )    )annotationsN)Callablec                  *     e Zd ZdZ	 	 dd	 fdZ xZS )
TranspilerErrorzIException raised when transpilation fails or encounters ambiguous syntax.Nissues!list[tuple[int, str, str]] | Nonemessage
str | Nonec           	     (   |pg | _         |r#t                                          |           d S t          | j                   }| d|dk    rdnd d}| j         D ]\  }}}|d| d| d| d	z  }t                                          |           d S )
Nz issue   s z	 found:

z* Line : z
>> 
)r   super__init__len)selfr   r	   issue_countissues_textline_nocode	__class__s          e/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/groovy/transpiler.pyr   zTranspilerError.__init__   s    
 l 		*GGW%%%%%dk**KRR[A-=-=cc2RRR  +/+ K K&$JJJGJJ$JJJJGG[)))))    )NN)r   r   r	   r
   )__name__
__module____qualname____doc__r   __classcell__r   s   @r   r   r      sP        SS 59"* * * * * * * * * * *r   r   c                  r    e Zd Zd ZdXdZ fd	Zd
 ZdYdZdZdZd[dZ	d\dZ
d]dZd^dZd_dZd`dZdadZdbdZdcd Zddd"Zded$Zdfd&Zdgd(Zdhd*Zdid,Zdjd.Zdkd0Zdld2Zdmd4Zdnd6Zdod8Zdod9Zdpd:Zdpd;Z dqd=Z!drd?Z"dsdAZ#dtdCZ$dudEZ%dvdGZ&dwdIZ'dxdKZ(dydMZ)dzdOZ*d{dQZ+d|dSZ,d}dUZ-d~dWZ. xZ/S )PythonToJSVisitorc                    g | _         d| _        t                      | _        g | _        g | _        i | _        | j        | j        d| _	        d S )Nr   )ranger   )
js_linesindent_levelsetdeclared_varsr   source_lines	var_typestransform_rangetransform_lenbuiltin_transformsr   s    r   r   zPythonToJSVisitor.__init__!   sV     UU24')13 )%#
 #
r   nodeast.ASTr	   strreturnNonec                    t          |d          rH|j        }| j        |dz
                                           }| j                            |||f           dS dS )z3Add a transpilation issue with source code context.linenor   N)hasattrr6   r*   stripr   append)r   r0   r	   r   	line_texts        r   	add_issuezPythonToJSVisitor.add_issue/   se    4"" 	>kG)'A+6<<>>IK)<=====	> 	>r   c                    	 t                                          |          S # t          $ r1}|j        r| j                            |j                   Y d }~dS d }~ww xY w)Nr   )r   visitr   r   extend)r   r0   er   s      r   r=   zPythonToJSVisitor.visit6   sl    	77==&&& 	 	 	x -""18,,,22222	s    $ 
A&AAc                \    |                      |dt          |          j                    dS )NzUnsupported syntax: r   )r;   typer   r   r0   s     r   generic_visitzPythonToJSVisitor.generic_visit>   s-    tIDJJ4GIIJJJrr   c                    d| j         z  S )Nz    )r'   r/   s    r   indentzPythonToJSVisitor.indentB   s    )))r   ast.FunctionDefc           	     |   g }|j         j         D ]}|                    |j                   |j        rrt	          |j        t
          j                  rS|j        j        }t                      	                    |t          t          |d                     }||| j        |j        <   d|j         dd                    |           ddz   }| j                            |           | xj        dz  c_        |j        D ]}|                     |           | xj        dz  c_        | j                            d           d S )Nz	function (, ) {r   })argsr9   arg
annotation
isinstanceastNameidglobalsgetgetattrbuiltinsr+   namejoinr&   r'   bodyr=   )r   r0   paramsrN   	type_nametype_objheaderstmts           r   visit_FunctionDefz#PythonToJSVisitor.visit_FunctionDefF   s;   9> 	7 	7CMM#'"""~ 7*S^SX"F"F 7N-	"99==GHiQU4V4VWW'.6DN37+>TY>>6):):>>>DV$$$QI 	 	DJJtQS!!!!!r   ast.Attributec                N    |                      |j                  }| d|j         S )N.)r=   valueattr)r   r0   rd   s      r   visit_Attributez!PythonToJSVisitor.visit_Attribute[   s+    

4:&&%%$)%%%r   
ast.Returnc                    |j         dn|                     |j                   }| j                            |                                  d| d           d S )Nr   return ;)rd   r=   r&   r9   rE   )r   r0   ret_vals      r   visit_ReturnzPythonToJSVisitor.visit_Returna   sU    
*""

4:0F0F@@g@@@AAAAAr   ast.Exprc                    |                      |j                  }| j                            |                                  | d           d S )Nrj   )r=   rd   r&   r9   rE   )r   r0   exprs      r   
visit_ExprzPythonToJSVisitor.visit_Exprf   sG    zz$*%%6t66677777r   
ast.Assignc                   t          |j                  dk    rt          d          |j        d         }|                     |          }|                     |j                  }t          |t          j                  r|j        | j	        vr| j	        
                    |j                   |                     |j                  }||| j        |j        <   | j                            |                                  d| d| d           d S | j                            |                                  | d| d           d S )Nr   z2Multiple assignment targets are not supported yet.r   zlet z = rj   )r   targetsr   r=   rd   rP   rQ   rR   rS   r)   addget_expr_typer+   r&   r9   rE   )r   r0   target_nodetargetrd   	expr_types         r   visit_AssignzPythonToJSVisitor.visit_Assignk   s5   t|!!!"VWWWl1oK((

4:&& {CH--
	Hd&888"";>222**4:66I$1:{~.M  DKKMM!J!Jv!J!J%!J!J!JKKKKKM  DKKMM!F6!F!Fe!F!F!FGGGGGr   exprscontextc                    fd|D             t          d D                       r(                     |d| d           t                      t                    dk    ret	          fdD                       sLd D             }                     |dd	                    |           d
| d           t                      dS dS )z|
        Check if an operation is type-safe.
        Raises TranspilerError if types are ambiguous or incompatible.
        c                :    g | ]}                     |          S  )ru   ).0ro   r   s     r   
<listcomp>z7PythonToJSVisitor.check_type_safety.<locals>.<listcomp>   s'    <<<d##D))<<<r   c              3     K   | ]}|d u V  	d S Nr~   r   ts     r   	<genexpr>z6PythonToJSVisitor.check_type_safety.<locals>.<genexpr>   s&      ((QqDy((((((r   z0Ambiguous operation: Cannot determine types for z=. Operation behavior may differ in JavaScript based on types.r   c              3  0   K   | ]}|d          k    V  dS )r   Nr~   )r   r   typess     r   r   z6PythonToJSVisitor.check_type_safety.<locals>.<genexpr>   s+      %C%Ca58m%C%C%C%C%C%Cr   c                    g | ]	}|j         
S r~   )r   r   s     r   r   z7PythonToJSVisitor.check_type_safety.<locals>.<listcomp>   s    444!*444r   z"Ambiguous operation: Mixed types (rI   z) in z$. Behavior may differ in JavaScript.N)anyr;   r   r   allrY   )r   r0   r{   rz   
type_namesr   s   `    @r   check_type_safetyz#PythonToJSVisitor.check_type_safety   s'   
 =<<<e<<< ((%((((( 	$NNN7 N N N  
 "### u::>>#%C%C%C%CU%C%C%C"C"C>44e444JNN5TYYz5J5J 5 5QX 5 5 5  
 "### >>>r   	ast.BinOpc                   |                      |j                  }|                      |j                  }|                      |j                  }|                     ||j        |j        d| d| d| d           d| d| d| dS )N' r{   rH   ))r=   leftrightopr   )r   r0   r   r   r   s        r   visit_BinOpzPythonToJSVisitor.visit_BinOp   s    zz$)$$

4:&&ZZ  $)TZ1IT1I1IB1I1I1I1I1I 	 	
 	
 	
 (4''"''u''''r   ast.Addc                    dS )N+r~   rB   s     r   	visit_AddzPythonToJSVisitor.visit_Add       sr   ast.Subc                    dS )N-r~   rB   s     r   	visit_SubzPythonToJSVisitor.visit_Sub   r   r   ast.Multc                    dS )N*r~   rB   s     r   
visit_MultzPythonToJSVisitor.visit_Mult   r   r   ast.Divc                    dS )N/r~   rB   s     r   	visit_DivzPythonToJSVisitor.visit_Div   r   r   ast.Comparec                d   t          |j                  dk    st          |j                  dk    rt          d          |j        d         }|                     |j                  }|                     |j        d                   }t          |t          j                  r| d| dS t          |t          j	                  r	d| d| dS | 
                    ||j        |j        d         d| d|                     |           d| 	           |                     |          }d
| d| d| dS )Nr   z%Only single comparisons are supportedr   z
.includes(r   !zcomparison r   r   rH   )r   opscomparatorsr   r=   r   rP   rQ   InNotInr   )r   r0   r   r   r   op_strs         r   visit_ComparezPythonToJSVisitor.visit_Compare   sQ   tx==AT%5!6!6!!;!;!"IJJJXa[zz$)$$

4+A.//b#&!! 	0..t....CI&& 	0/u////// ""	 #EdEETZZ^^EEeEE	 #    ZZ^^F/t//f//u////r   ast.Gtc                    dS )N>r~   rB   s     r   visit_GtzPythonToJSVisitor.visit_Gt   r   r   ast.Ltc                    dS )N<r~   rB   s     r   visit_LtzPythonToJSVisitor.visit_Lt   r   r   ast.GtEc                    dS )Nz>=r~   rB   s     r   	visit_GtEzPythonToJSVisitor.visit_GtE       tr   ast.LtEc                    dS )Nz<=r~   rB   s     r   	visit_LtEzPythonToJSVisitor.visit_LtE   r   r   ast.Eqc                    dS )Nz===r~   rB   s     r   visit_EqzPythonToJSVisitor.visit_Eq       ur   	ast.NotEqc                    dS )Nz!==r~   rB   s     r   visit_NotEqzPythonToJSVisitor.visit_NotEq   r   r   ast.Inc                    dS )Ninr~   rB   s     r   visit_InzPythonToJSVisitor.visit_In   r   r   	ast.NotInc                    dS )Nznot inr~   rB   s     r   visit_NotInzPythonToJSVisitor.visit_NotIn   s    xr   ast.Ifc                   |                      |j                  }| j                            |                                  d| ddz              | xj        dz  c_        |j        D ]}|                      |           | xj        dz  c_        | j                            |                                  dz              |}|j        rOt          |j                  dk    r6t          |j        d         t          j                  r|j        d         }|                      |j                  }| j                            |                                  d| ddz              | xj        dz  c_        |j        D ]}|                      |           | xj        dz  c_        | j                            |                                  dz              |j        r>t          |j                  dk    r&t          |j        d         t          j                  |j        r| j                            |                                  ddz              | xj        dz  c_        |j        D ]}|                      |           | xj        dz  c_        | j                            |                                  dz              d S d S )	Nzif (rJ   rK   r   rL   r   z	else if (zelse )r=   testr&   r9   rE   r'   rZ   orelser   rP   rQ   If)r   r0   r   r_   currents        r   visit_IfzPythonToJSVisitor.visit_If   s   zz$)$$;;4;;;cABBBQI 	 	DJJtQ/#5666 N	;GN##q((7>!,cf55 ) nQ'G::gl++DM  DKKMM!D!DD!D!D!Ds!JKKK" ! !

4    "M  DKKMM!3c!9::: N	;GN##q((7>!,cf55 ) > 	;M  DKKMM!8!8!83!>???" ! !

4    "M  DKKMM!3c!9:::::	; 	;r   ast.Callc                p     fd|j         D             }|j         D ]}                     ||d           t          |          dk    rd|d          dS t          |          dk    rd|d          d	|d          d
|d          dS t          |          dk    rt          d          t          d          )zHTransform Python's range() to an equivalent JavaScript array expression.c                :    g | ]}                     |          S r~   r=   r   rN   r   s     r   r   z5PythonToJSVisitor.transform_range.<locals>.<listcomp>  #    555C

3555r   zrange() argumentr   r   zArray.from({length: r   z}, (_, i) => i)   z - z}, (_, i) => i + r      z/range() with step argument is not supported yetz'Invalid number of arguments for range())rM   r   r   r   )r   r0   rM   rN   s   `   r   r,   z!PythonToJSVisitor.transform_range  s    5555495559 	I 	IC""35G"HHHHt99>>D47DDDDYY!^^\47\\tAw\\RVWXRY\\\\YY!^^!"STTT!"KLLLr   c                    t          |j                  dk    rt          d          |                     |j        d                   }|                     |j        d                   }|t
          u rd| dS | dS )zFTransform Python's len() to the equivalent JavaScript property access.r   z len() takes exactly one argumentr   zObject.keys(z).lengthz.length)r   rM   r   r=   ru   dict)r   r0   arg_coder   s       r   r-   zPythonToJSVisitor.transform_len  s    ty>>Q!"DEEE::dil++ty|,,994(4444 ''''r   c                Z   i }|j         D ]}t          |j        t          j                  r|j        j        d||j        <   8|                     |j                  }	 t          j        |          ||j        <   p# t          $ r |||j        <   Y w xY wd|d<   t          j
        |          S )z=Handle Gradio component calls and return JSON representation.Nupdate__type__)keywordsrP   rd   rQ   ConstantrN   r=   literal_eval	Exceptionjsondumps)r   r0   kwargskwrd   s        r    _handle_gradio_component_updatesz2PythonToJSVisitor._handle_gradio_component_updates!  s    - 
	' 
	'B"(CL11 bhn6L "&rvJJrx((E'!$!1%!8!8rv ' ' '!&rv'%zz&!!!s   A::BBc                    	 dd l }d}n# t          $ r d}Y nw xY wt          |j        t          j                  r|j        j         j        v r   j        |j        j                 |          S |r	 |j        j        dk    r                     |          S t          ||j        j        d           }|r/t          ||j        j                  r                     |          S n# t          $ r Y nw xY w|j        D ](}                     ||d|j        j         d           )                     |d|j        j         d	           d
S t          |j        t          j                  r|r	 t          |j        j        t          j                  r|j        j        j        dv rq|j        j        dk    r                     |          S t          ||j        j        d           }|r/t          ||j        j                  r                     |          S n# t          $ r Y nw xY w                     |j                  } fd|j        D             }t          |j        t          j                  rO                     |j        |j        j        d|            |j        D ]}                     ||d|            | dd                    |           dS )Nr   TFr   zargument in z() callr   zUnsupported function "z()"r   >   grgradioc                :    g | ]}                     |          S r~   r   r   s     r   r   z0PythonToJSVisitor.visit_Call.<locals>.<listcomp>k  r   r   zobject in method call zargument in method call rH   rI   r   )r   ImportErrorrP   funcrQ   rR   rS   r.   r   rV   
issubclassblocksBlockr   rM   r   r;   	Attributerd   re   r=   rY   )r   r0   r   
has_gradiocomponent_classrN   r   rM   s   `       r   
visit_CallzPythonToJSVisitor.visit_Call2  si   	MMMJJ 	 	 	JJJ	 di** 	y|t666<t.ty|<TBBB  y|x//#DDTJJJ&-fdilD&I&IO& K:')<, , K  $DDTJJJ    D y  &&&JTY\&J&J&J '     NN4!K$),!K!K!KLLL2 di// 	J 	diosx88 KTY_=O T > >
 y~11#DDTJJJ&-fdind&K&KO& K:')<, , K  $DDTJJJ    zz$)$$555549555di// 	""	49?4ST4S4S #    y  &&&G&G&G '     ++4++++s?   
 2$C$ AC$ $
C10C1,AH AH 
H"!H"ast.Namec                    |j         S r   )rS   rB   s     r   
visit_NamezPythonToJSVisitor.visit_Namey  s	    wr   ast.Constantc                <    |j         dS t          |j                   S )Nnull)rd   reprrB   s     r   visit_Constantz PythonToJSVisitor.visit_Constant}  s    :6DJr   ast.Forc                   |                      |j                  }|                      |j                  }t          |j        t          j                  rqt          |j        j        t          j                  rM|j        j        j        dk    r8t          |j        t          j                  rt          | j
        |j        j        <   | j                            |                                  d| d| ddz              | xj        dz  c_        |j        D ]}|                      |           | xj        dz  c_        | j                            |                                  dz              d S )Nr%   z	for (let z of rJ   rK   r   rL   )r=   rw   iterrP   rQ   Callr   rR   rS   intr+   r&   r9   rE   r'   rZ   )r   r0   rw   	iter_exprr_   s        r   	visit_ForzPythonToJSVisitor.visit_For  sI   DK((JJty))	 ty#(++	549>3844	5 	!W,,$+sx00 514t{~.QQQQIQQQTWWXXXQI 	 	DJJtQ/#566666r   	ast.Whilec                   |                      |j                  }| j                            |                                  d| ddz              | xj        dz  c_        |j        D ]}|                      |           | xj        dz  c_        | j                            |                                  dz              d S )Nzwhile (rJ   rK   r   rL   )r=   r   r&   r9   rE   r'   rZ   )r   r0   r   r_   s       r   visit_WhilezPythonToJSVisitor.visit_While  s    zz$)$$>>d>>>DEEEQI 	 	DJJtQ/#566666r   ast.Listc                \      fd|j         D             }dd                    |           dS )Nc                :    g | ]}                     |          S r~   r   r   eltr   s     r   r   z0PythonToJSVisitor.visit_List.<locals>.<listcomp>  #    999DJJsOO999r   [rI   ]eltsrY   r   r0   elementss   `  r   
visit_ListzPythonToJSVisitor.visit_List  ;    9999ty999)499X&&))))r   	ast.Tuplec                \      fd|j         D             }dd                    |           dS )Nc                :    g | ]}                     |          S r~   r   r  s     r   r   z1PythonToJSVisitor.visit_Tuple.<locals>.<listcomp>  r  r   r  rI   r  r  r  s   `  r   visit_TuplezPythonToJSVisitor.visit_Tuple  r  r   ast.ListCompc                H    t          |j                  dk    r$                     |d           t                      |j        d         }                     |j                  }                     |j                  }                     |j                  }|j        rwd	                     fd|j        D                       }| d| d| d}t          |j        t          j                  r|j        j        |j        j        k    s|d	| d| dz  }n| d	| d| d}|S )
z
        Transform a Python list comprehension into a combination of filter and map calls.
        For example:
            [x * 2 for x in arr if x > 10]
        becomes:
            arr.filter(x => x > 10).map(x => x * 2)
        r   z7Only single generator list comprehensions are supportedr   z && c              3  B   K   | ]}                     |          V  d S r   r   )r   if_noder   s     r   r   z3PythonToJSVisitor.visit_ListComp.<locals>.<genexpr>  s/      $P$PWTZZ%8%8$P$P$P$P$P$Pr   z.filter(z => r   z.map()r   
generatorsr;   r   r=   r  rw   r  ifsrY   rP   rQ   rR   rS   )r   r0   geniter_js	target_jselt_js
conditionsresults   `       r   visit_ListCompz PythonToJSVisitor.visit_ListComp  sC    t1$$NNO   "###oa **SX&&JJsz**	DH%%7 	?$P$P$P$P$P$P$PPPJEEEE
EEEFtx22 ;tx{cjm7S7S:)::::::>>i>>V>>>Fr   ast.Subscriptc                z    |                      |j                  }|                      |j                  }| d| dS )Nr  r  )r=   rd   slice)r   r0   rd   slice_values       r   visit_Subscriptz!PythonToJSVisitor.visit_Subscript  s?    

4:&&jj,,((+((((r   ast.AugAssignc           	     4   |                      |j                  }|                      |j                                                  }|                      |j                  }| j                            |                                  | d| d| d           d S )Nr   z= rj   )r=   rw   r   r8   rd   r&   r9   rE   )r   r0   rw   r   rd   s        r   visit_AugAssignz!PythonToJSVisitor.visit_AugAssign  s    DK((ZZ  &&((

4:&&FvFFFFeFFFGGGGGr   
ast.BoolOpc                                           |j                  } fd|j        D             }dd| d                    |           dS )Nc                :    g | ]}                     |          S r~   r   )r   rd   r   s     r   r   z2PythonToJSVisitor.visit_BoolOp.<locals>.<listcomp>  s%    ===$**U##===r   rH   r   r   )r=   r   valuesrY   )r   r0   r   r5  s   `   r   visit_BoolOpzPythonToJSVisitor.visit_BoolOp  sV    ZZ  =======,9r999>>&)),,,,r   ast.Andc                    dS )Nz&&r~   rB   s     r   	visit_AndzPythonToJSVisitor.visit_And  r   r   ast.Orc                    dS )Nz||r~   rB   s     r   visit_OrzPythonToJSVisitor.visit_Or  r   r   ast.Dictc                   g }t          |j        |j                  D ]L\  }}||                     |          }|                     |          }|                    | d|            Mdd                    |           dS )Nr   rK   rI   rL   )zipkeysr5  r=   r9   rY   )r   r0   pairskeyrd   key_jsvalue_jss          r   
visit_DictzPythonToJSVisitor.visit_Dict  s    di55 	2 	2JC{ZZ__Fzz%((HLLF00h001111(DIIe$$((((r   type | Nonec                   t          |t          j                  rt          |j                  S t          |t          j                  r"|j        | j        v r| j        |j                 S dS t          |t          j                  r@| 	                    |j
                  }| 	                    |j                  }||k    r||S dS t          |t          j                  rdS t          |t          j                  rt          S t          |t          j                  rt           S t          |t          j                  rt$          S dS )z0Determine the type of an expression if possible.N)rP   rQ   r   rA   rd   rR   rS   r+   BinOpru   r   r   r  ListlistDictr   Tupletuple)r   r0   	left_type
right_types       r   ru   zPythonToJSVisitor.get_expr_type  s   dCL)) 	
###ch'' 	w$.((~dg..4ci(( 	**4955I++DJ77JJ&&9+@  4ch'' 	4ch'' 	Kch'' 	Kci(( 	Ltr   )r0   r1   r	   r2   r3   r4   )r3   r2   )r0   rF   )r0   ra   )r0   rg   )r0   rm   )r0   rq   )r0   r1   rz   r1   r{   r2   r3   r4   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   )r0   r   r3   r2   )r0   r   )r0   r   )r0   r   )r0   r  )r0   r  )r0   r  )r0   r  )r0   r  )r0   r*  )r0   r/  )r0   r2  )r0   r7  )r0   r:  )r0   r=  )r0   r1   r3   rF  )0r   r   r   r   r;   r=   rC   rE   r`   rf   rl   rp   ry   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r,   r-   r   r   r   r   r  r
  r  r  r)  r.  r1  r6  r9  r<  rE  ru   r    r!   s   @r   r#   r#       s       
 
 
> > > >      * * * *" " " "*& & & &B B B B
8 8 8 8
H H H H($ $ $ $4( ( ( (            0 0 0 00                         ;  ;  ;  ;FM M M M( ( ( (" " " ""D, D, D, D,N          7 7 7 7*7 7 7 7* * * *
* * * *
   :) ) ) )H H H H- - - -      ) ) ) )       r   r#   Ffnr   validateboolr3   r2   c                   |rTt          j        |           }|j        r9t          |j                                                  }t          d|           	 t          j        |           }t          j        |          }n## t          $ r}t          d          |d}~ww xY w	 t          j        |          }n## t          $ r}t          d          |d}~ww xY w|r3	 ddl}n# t          $ r t          d          w xY wd}t          j        |          D ]0}	t!          |	t          j                  r|	j        | j        k    r|	} n1|rg }
t          j        |          D ]8}	t!          |	t          j                  r|	j        |
                    |	           9|
st          d          |
D ]b}t/          |j                  sL|j        }|                                |d	z
                                           }t          d
| d|           cd}t          j        |          D ],}	t!          |	t          j        t          j        f          r|	} n-|t          d          t9                      }|                                |_        t!          |t          j                  rd |j        j        D             }|j                            dd                     |           ddz              |xj!        d	z  c_!        |j                            |"                                 d|#                    |j$                   d           |xj!        d	z  c_!        |j                            d           n|#                    |           |j%        rt          |j%                  d                     |j                  S )a5  
    Transpiles a Python function to JavaScript and returns the JavaScript code as a string.

    Parameters:
        fn: The Python function to transpile.
        validate: If True, the function will be validated to ensure it takes no arguments & only returns gradio component property updates. This is used when Groovy is used inside Gradio and `gradio` must be installed to use this.

    Returns:
        The JavaScript code as a string.

    Raises:
        TranspilerError: If the function cannot be transpiled or if the transpiled function is not valid.
    z>Function must take no arguments for client-side use, but got: )r	   z1Could not retrieve source code from the function.Nz Could not parse function source.r   z(Gradio must be installed for validation.zMFunction must return Gradio component updates, but no return statement found.r   zKFunction must only return Gradio component updates. Invalid return at line r   z>No function or lambda definition found in the provided source.c                    g | ]	}|j         
S r~   )rN   )r   rN   s     r   r   ztranspile.<locals>.<listcomp>Y  s    777C777r   z
function (rI   rJ   rK   ri   rj   rL   )r   r   )&inspect	signature
parametersrJ  r@  r   	getsourcetextwrapdedentr   rQ   parseSyntaxErrorr   r   walkrP   FunctionDefrX   r   Returnrd   r9   _is_valid_gradio_returnr6   
splitlinesr8   Lambdar#   r*   rM   r&   rY   r'   rE   r=   rZ   r   )rP  rQ  sigparam_namessourcer?   treer   	func_noder0   return_nodesreturn_noder   r:   visitorrM   s                   r   	transpilerk    sq     ##> 	s~224455K!fYdff   "2&&((   G
 
 
	
Qy   Q Q Q&HIIIqPQ  	VMMMM 	V 	V 	V!*TUUUU	V 	HTNN 	 	D$00 TY"+5M5M 	 	L++ . .dCJ// .DJ4J ''--- %k     ,  .{/@AA )0G & 1 1 3 3GaK @ F F H HI) !Enu  !E  !E  zC  !E  !E    I  dS_cj9:: 	IE	 T
 
 
 	
  !!G!,,..G)SZ(( 
!779>#6777 @TYYt__ @ @ @3 FGGG!~~HHin(E(EHHH	
 	
 	
 	!$$$$i   ~ 5W^444499W%&&&s<   (B 
B!BB!%B: :
CCC!C& &Dr0   r1   c                   t          | t          j                  rt          | j        t          j                  rt          | j        j        t          j                  r| j        j        j        dv r	 ddl}| j        j	        dk    rdS t          || j        j	        d          }|r=t          ||j        j                  r#| j        rdS | j        D ]}|j        dk    r dS dS n# t"          t$          f$ r Y nw xY wdS nt          | j        t          j                  r	 ddl}| j        j        dk    rdS t          || j        j        d          }|r=t          ||j        j                  r#| j        rdS | j        D ]}|j        dk    r dS dS n# t"          t$          f$ r Y nw xY wdS nMt          | t          j        t          j        f          r'| j        sdS t-          d | j        D                       S dS )	z
    Check if a return value is a valid Gradio component or collection of components.

    Args:
        node: The AST node representing the return value

    Returns:
        bool: True if the return value is valid, False otherwise
    >   r   r   r   Nr   TFrd   c              3  4   K   | ]}t          |          V  d S r   )r`  )r   r  s     r   r   z*_is_valid_gradio_return.<locals>.<genexpr>  s+      EEC*3//EEEEEEr   )rP   rQ   r  r   r   rd   rR   rS   r   re   rV   r   r   r   rM   r   rN   r   AttributeErrorrL  rI  r  r   )r0   r   r   r   s       r   r`  r`  j  sV    $!! .Fdi// (	JIOSX5
 5
 (	 y!%555!MMMy~11#t&-fdind&K&KO& $:')<, , $  9 )#(5"&- - -B!v00',uu  1#t#^4   Du' 6( 	38,, 	9<8++4")&$),"E"E"  z/6=CV'W'W  y %$u"m ) )6W,,#(55 -40   5#	& 
D39ch/	0	0 Fy 	5EE49EEEEEE5sH   3C$ 	>C$ 	C$  C$ $C87C8F 4>F 4F F F#"F#__main__c                 0    t          j        ddd           S )Nr   T)selectedvisibleinfo)r   r   r~   r   r   filter_rows_by_termrt    s    y!T====r   T)rQ  )F)rP  r   rQ  rR  r3   r2   )r0   r1   r3   rR  )
__future__r   rQ   rW   rU  r   rY  collections.abcr   r   r   NodeVisitorr#   rk  r`  r   r   r   rt  js_codeprintr~   r   r   <module>rz     sA   " " " " " " 



     $ $ $ $ $ $* * * * *i * * **e e e e e e e eP_' _' _' _' _'D; ; ; ;@ z> > > i+d;;;G	E'NNNNN r   