python2ts 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/parser/index.ts","../src/transformer/name-mappings.ts","../src/transformer/index.ts","../src/generator/index.ts"],"sourcesContent":["import { parser } from \"@lezer/python\"\nimport type { SyntaxNode, Tree } from \"@lezer/common\"\nimport type { ParseResult } from \"./types.js\"\n\nexport function parse(source: string): ParseResult {\n const tree = parser.parse(source)\n return { tree, source }\n}\n\nexport function getNodeText(node: SyntaxNode, source: string): string {\n return source.slice(node.from, node.to)\n}\n\nexport function getChildren(node: SyntaxNode): SyntaxNode[] {\n const children: SyntaxNode[] = []\n let child = node.firstChild\n while (child) {\n children.push(child)\n child = child.nextSibling\n }\n return children\n}\n\nexport function getChildByType(node: SyntaxNode, type: string): SyntaxNode | null {\n let child = node.firstChild\n while (child) {\n if (child.name === type) {\n return child\n }\n child = child.nextSibling\n }\n return null\n}\n\nexport function getChildrenByType(node: SyntaxNode, type: string): SyntaxNode[] {\n const children: SyntaxNode[] = []\n let child = node.firstChild\n while (child) {\n if (child.name === type) {\n children.push(child)\n }\n child = child.nextSibling\n }\n return children\n}\n\nexport function walkTree(tree: Tree, callback: (node: SyntaxNode) => void): void {\n const cursor = tree.cursor()\n do {\n callback(cursor.node)\n } while (cursor.next())\n}\n\nexport function debugTree(tree: Tree, source: string): string {\n const lines: string[] = []\n const cursor = tree.cursor()\n let depth = 0\n\n do {\n const indent = \" \".repeat(depth)\n const text = source.slice(cursor.from, cursor.to).replace(/\\n/g, \"\\\\n\")\n const preview = text.length > 30 ? text.slice(0, 30) + \"...\" : text\n lines.push(`${indent}${cursor.name} [${String(cursor.from)}-${String(cursor.to)}] \"${preview}\"`)\n\n if (cursor.firstChild()) {\n depth++\n } else {\n while (!cursor.nextSibling()) {\n if (!cursor.parent()) break\n depth--\n }\n }\n } while (depth > 0 || cursor.nextSibling())\n\n return lines.join(\"\\n\")\n}\n\nexport * from \"./types.js\"\n","/**\n * Central mapping from Python snake_case names to JavaScript camelCase names.\n * This is the single source of truth for name transformations.\n */\n\n/**\n * Maps Python snake_case identifiers to JavaScript camelCase equivalents.\n * Only includes names that need transformation (names already in camelCase\n * or single-word names don't need mapping).\n */\nexport const PYTHON_TO_JS_NAMES: Record<string, string> = {\n // ============================================================================\n // functools module\n // ============================================================================\n lru_cache: \"lruCache\",\n cache_info: \"cacheInfo\",\n cache_clear: \"cacheClear\",\n partialmethod: \"partialMethod\",\n singledispatch: \"singleDispatch\",\n attrgetter: \"attrGetter\",\n itemgetter: \"itemGetter\",\n methodcaller: \"methodCaller\",\n cmp_to_key: \"cmpToKey\",\n total_ordering: \"totalOrdering\",\n\n // ============================================================================\n // itertools module\n // ============================================================================\n zip_longest: \"zipLongest\",\n takewhile: \"takeWhile\",\n dropwhile: \"dropWhile\",\n filterfalse: \"filterFalse\",\n combinations_with_replacement: \"combinationsWithReplacement\",\n\n // ============================================================================\n // collections module (deque methods)\n // ============================================================================\n appendleft: \"appendLeft\",\n popleft: \"popLeft\",\n extendleft: \"extendLeft\",\n\n // ============================================================================\n // datetime module\n // ============================================================================\n total_seconds: \"totalSeconds\",\n fromtimestamp: \"fromTimestamp\",\n fromisoformat: \"fromIsoFormat\",\n fromordinal: \"fromOrdinal\",\n toordinal: \"toOrdinal\",\n isoweekday: \"isoWeekday\",\n isocalendar: \"isoCalendar\",\n isoformat: \"isoFormat\",\n utcnow: \"utcNow\",\n utcfromtimestamp: \"utcFromTimestamp\",\n\n // ============================================================================\n // random module\n // ============================================================================\n randint: \"randInt\",\n randrange: \"randRange\",\n betavariate: \"betaVariate\",\n expovariate: \"expoVariate\",\n gammavariate: \"gammaVariate\",\n lognormvariate: \"logNormVariate\",\n vonmisesvariate: \"vonMisesVariate\",\n paretovariate: \"paretoVariate\",\n weibullvariate: \"weibullVariate\",\n normalvariate: \"normalVariate\",\n\n // ============================================================================\n // string module (constants)\n // ============================================================================\n ascii_lowercase: \"asciiLowercase\",\n ascii_uppercase: \"asciiUppercase\",\n ascii_letters: \"asciiLetters\",\n hexdigits: \"hexDigits\",\n octdigits: \"octDigits\",\n\n // ============================================================================\n // string module (methods)\n // ============================================================================\n safe_substitute: \"safeSubstitute\",\n get_identifiers: \"getIdentifiers\",\n capwords: \"capWords\",\n startswith: \"startsWith\",\n endswith: \"endsWith\",\n isalpha: \"isAlpha\",\n isdigit: \"isDigit\",\n isalnum: \"isAlnum\",\n isspace: \"isSpace\",\n isupper: \"isUpper\",\n islower: \"isLower\",\n lstrip: \"lStrip\",\n rstrip: \"rStrip\",\n zfill: \"zFill\",\n ljust: \"lJust\",\n rjust: \"rJust\",\n rpartition: \"rPartition\",\n swapcase: \"swapCase\",\n rfind: \"rFind\",\n rindex: \"rIndex\",\n rsplit: \"rSplit\",\n\n // ============================================================================\n // os module (constants)\n // ============================================================================\n altsep: \"altSep\",\n pathsep: \"pathSep\",\n linesep: \"lineSep\",\n curdir: \"curDir\",\n pardir: \"parDir\",\n extsep: \"extSep\",\n\n // ============================================================================\n // os.path module\n // ============================================================================\n splitext: \"splitExt\",\n extname: \"extName\",\n isabs: \"isAbs\",\n normpath: \"normPath\",\n abspath: \"absPath\",\n realpath: \"realPath\",\n relpath: \"relPath\",\n commonpath: \"commonPath\",\n expanduser: \"expandUser\",\n expandvars: \"expandVars\",\n isfile: \"isFile\",\n isdir: \"isDir\",\n islink: \"isLink\",\n getsize: \"getSize\",\n getmtime: \"getMtime\",\n getatime: \"getAtime\",\n getctime: \"getCtime\",\n\n // ============================================================================\n // os module (functions)\n // ============================================================================\n getcwd: \"getCwd\",\n getcwdb: \"getCwdb\",\n listdir: \"listDir\",\n makedirs: \"makeDirs\",\n removedirs: \"removeDirs\",\n\n // ============================================================================\n // re module\n // ============================================================================\n groupdict: \"groupDict\",\n groupindex: \"groupIndex\",\n lastindex: \"lastIndex\",\n lastgroup: \"lastGroup\",\n fullmatch: \"fullMatch\",\n findall: \"findAll\",\n finditer: \"findIter\",\n\n // ============================================================================\n // dict module\n // ============================================================================\n setdefault: \"setDefault\",\n popitem: \"popItem\",\n fromkeys: \"fromKeys\",\n\n // ============================================================================\n // set module\n // ============================================================================\n issubset: \"isSubset\",\n issuperset: \"isSuperset\",\n isdisjoint: \"isDisjoint\",\n\n // ============================================================================\n // core module\n // ============================================================================\n floordiv: \"floorDiv\",\n divmod: \"divMod\"\n}\n\n/**\n * Convert a Python snake_case name to JavaScript camelCase.\n * Returns the original name if no mapping exists.\n */\nexport function toJsName(pythonName: string): string {\n return PYTHON_TO_JS_NAMES[pythonName] ?? pythonName\n}\n\n/**\n * Convert a JavaScript camelCase name back to Python snake_case.\n * Returns the original name if no mapping exists.\n */\nexport function toPythonName(jsName: string): string {\n for (const [python, js] of Object.entries(PYTHON_TO_JS_NAMES)) {\n if (js === jsName) {\n return python\n }\n }\n return jsName\n}\n","import type { SyntaxNode } from \"@lezer/common\"\nimport { getNodeText, getChildren, parse, type ParseResult } from \"../parser/index.js\"\nimport { toJsName } from \"./name-mappings.js\"\n\nexport interface TransformContext {\n source: string\n indentLevel: number\n usesRuntime: Set<string>\n /** Stack of scopes - each scope is a set of variable names declared in that scope */\n scopeStack: Set<string>[]\n /** Set of class names defined in this module (for adding 'new' on instantiation) */\n definedClasses: Set<string>\n /** Whether currently processing an abstract class (ABC) */\n isAbstractClass?: boolean\n /** Depth counter for function bodies (0 = module level, 1+ = inside function) */\n insideFunctionBody: number\n /** Imports found inside function bodies that need to be hoisted to module level */\n hoistedImports: string[]\n}\n\nexport interface TransformResult {\n code: string\n usesRuntime: Set<string>\n hoistedImports: string[]\n}\n\nfunction createContext(source: string): TransformContext {\n return {\n source,\n indentLevel: 0,\n usesRuntime: new Set(),\n scopeStack: [new Set()], // Start with one global scope\n definedClasses: new Set(),\n insideFunctionBody: 0,\n hoistedImports: []\n }\n}\n\n/** Push a new scope onto the stack */\nfunction pushScope(ctx: TransformContext): void {\n ctx.scopeStack.push(new Set())\n}\n\n/** Pop the current scope from the stack */\nfunction popScope(ctx: TransformContext): void {\n if (ctx.scopeStack.length > 1) {\n ctx.scopeStack.pop()\n }\n}\n\n/** Check if a variable is declared in any accessible scope */\nfunction isVariableDeclared(ctx: TransformContext, name: string): boolean {\n for (const scope of ctx.scopeStack) {\n if (scope.has(name)) return true\n }\n return false\n}\n\n/** Declare a variable in the current (top) scope */\nfunction declareVariable(ctx: TransformContext, name: string): void {\n const currentScope = ctx.scopeStack[ctx.scopeStack.length - 1]\n if (currentScope) {\n currentScope.add(name)\n }\n}\n\n/** Check if a node or any of its descendants contain a yield statement */\nfunction containsYield(node: SyntaxNode): boolean {\n if (node.name === \"YieldStatement\" || node.name === \"YieldExpression\") {\n return true\n }\n // Don't recurse into nested function definitions - their yields are for their own scope\n if (node.name === \"FunctionDefinition\" || node.name === \"LambdaExpression\") {\n return false\n }\n for (const child of getChildren(node)) {\n if (containsYield(child)) {\n return true\n }\n }\n return false\n}\n\n/** Map of Python built-in types to TypeScript types */\nconst PYTHON_TO_TS_TYPES: Record<string, string> = {\n str: \"string\",\n int: \"number\",\n float: \"number\",\n bool: \"boolean\",\n bytes: \"Uint8Array\",\n None: \"null\",\n Any: \"any\",\n object: \"object\"\n}\n\n/**\n * Transform a Python type annotation to TypeScript\n */\nfunction transformPythonType(node: SyntaxNode, ctx: TransformContext): string {\n switch (node.name) {\n case \"VariableName\": {\n const typeName = getNodeText(node, ctx.source)\n return PYTHON_TO_TS_TYPES[typeName] ?? typeName\n }\n\n case \"None\":\n return \"null\"\n\n case \"MemberExpression\": {\n // Generic types like list[str], dict[str, int], Optional[T]\n const children = getChildren(node)\n const baseType = children[0]\n if (!baseType) return getNodeText(node, ctx.source)\n\n const baseName = getNodeText(baseType, ctx.source)\n\n // Extract type arguments between [ and ]\n const bracketStart = children.findIndex((c) => c.name === \"[\")\n const bracketEnd = children.findIndex((c) => c.name === \"]\")\n /* v8 ignore next 3 -- malformed type annotation fallback @preserve */\n if (bracketStart === -1 || bracketEnd === -1) {\n return PYTHON_TO_TS_TYPES[baseName] ?? baseName\n }\n\n // Raw type argument nodes (before transformation)\n const rawTypeArgNodes = children\n .slice(bracketStart + 1, bracketEnd)\n .filter((c) => c.name !== \",\")\n\n // Special handling for Callable to get proper parameter types\n if (baseName === \"Callable\") {\n return transformCallableType(rawTypeArgNodes, ctx)\n }\n\n const typeArgs = rawTypeArgNodes.map((c) => transformPythonType(c, ctx))\n\n // Handle specific Python generic types\n const first = typeArgs[0] ?? \"unknown\"\n const second = typeArgs[1] ?? \"unknown\"\n const last = typeArgs[typeArgs.length - 1] ?? \"unknown\"\n\n switch (baseName) {\n case \"list\":\n case \"List\":\n return typeArgs.length > 0 ? `${first}[]` : \"unknown[]\"\n case \"dict\":\n case \"Dict\":\n return typeArgs.length >= 2 ? `Record<${first}, ${second}>` : \"Record<string, unknown>\"\n case \"set\":\n case \"Set\":\n return typeArgs.length > 0 ? `Set<${first}>` : \"Set<unknown>\"\n case \"frozenset\":\n case \"FrozenSet\":\n /* v8 ignore next -- rare type annotation @preserve */\n return typeArgs.length > 0 ? `ReadonlySet<${first}>` : \"ReadonlySet<unknown>\"\n case \"tuple\":\n case \"Tuple\":\n return `[${typeArgs.join(\", \")}]`\n case \"Optional\":\n return typeArgs.length > 0 ? `${first} | null` : \"unknown | null\"\n case \"Union\":\n return typeArgs.join(\" | \")\n case \"Final\":\n // Final[T] -> T (the 'const' or 'readonly' is handled at declaration level)\n return typeArgs.length > 0 ? first : \"unknown\"\n case \"ClassVar\":\n // ClassVar[T] -> T (the 'static' is handled at declaration level)\n return typeArgs.length > 0 ? first : \"unknown\"\n // Callable is handled specially before the switch via transformCallableType\n /* v8 ignore start -- rare typing module types @preserve */\n case \"Iterable\":\n return typeArgs.length > 0 ? `Iterable<${first}>` : \"Iterable<unknown>\"\n case \"Iterator\":\n return typeArgs.length > 0 ? `Iterator<${first}>` : \"Iterator<unknown>\"\n case \"Generator\":\n // Generator[YieldType, SendType, ReturnType]\n return typeArgs.length > 0 ? `Generator<${typeArgs.join(\", \")}>` : \"Generator<unknown>\"\n case \"AsyncGenerator\":\n return typeArgs.length > 0\n ? `AsyncGenerator<${typeArgs.join(\", \")}>`\n : \"AsyncGenerator<unknown>\"\n case \"Awaitable\":\n return typeArgs.length > 0 ? `Promise<${first}>` : \"Promise<unknown>\"\n case \"Coroutine\":\n return typeArgs.length > 0 ? `Promise<${last}>` : \"Promise<unknown>\"\n case \"Type\":\n return typeArgs.length > 0\n ? `new (...args: unknown[]) => ${first}`\n : \"new (...args: unknown[]) => unknown\"\n /* v8 ignore stop */\n /* v8 ignore start -- Literal type edge cases @preserve */\n case \"Literal\": {\n // Literal[\"a\", \"b\"] -> \"a\" | \"b\"\n // Literal[1, 2, 3] -> 1 | 2 | 3\n const literalValues = typeArgs.map((arg) => {\n // If it's a number, keep as-is\n if (/^-?\\d+(\\.\\d+)?$/.test(arg)) {\n return arg\n }\n // If it's already quoted, keep as-is\n if (arg.startsWith('\"') || arg.startsWith(\"'\")) {\n return arg\n }\n // Otherwise wrap in quotes (it was a string literal)\n return `\"${arg}\"`\n })\n return literalValues.join(\" | \")\n }\n /* v8 ignore stop */\n /* v8 ignore next 3 -- generic fallback for custom types @preserve */\n default:\n // Generic class type: MyClass[T] -> MyClass<T>\n return typeArgs.length > 0 ? `${baseName}<${typeArgs.join(\", \")}>` : baseName\n }\n }\n\n /* v8 ignore start -- rare type annotation patterns @preserve */\n case \"BinaryExpression\": {\n // Union types: int | str | None\n const children = getChildren(node)\n const left = children[0]\n const op = children[1]\n const right = children[2]\n\n if (op && getNodeText(op, ctx.source) === \"|\" && left && right) {\n const leftType = transformPythonType(left, ctx)\n const rightType = transformPythonType(right, ctx)\n return `${leftType} | ${rightType}`\n }\n return getNodeText(node, ctx.source)\n }\n\n case \"String\": {\n // Forward reference: \"MyClass\" -> MyClass\n const text = getNodeText(node, ctx.source)\n // Remove quotes\n return text.slice(1, -1)\n }\n\n case \"TypeDef\": {\n // TypeDef contains : and the actual type\n const children = getChildren(node)\n const typeNode = children.find((c) => c.name !== \":\")\n if (typeNode) {\n return transformPythonType(typeNode, ctx)\n }\n return \"unknown\"\n }\n /* v8 ignore stop */\n\n /* v8 ignore next 2 -- fallback for unhandled type nodes @preserve */\n default:\n return getNodeText(node, ctx.source)\n }\n}\n\n/**\n * Extract type annotation from a TypeDef node, if present\n * Returns null if no type is found\n */\nfunction extractTypeAnnotation(\n typeDef: SyntaxNode | undefined,\n ctx: TransformContext\n): string | null {\n if (!typeDef || typeDef.name !== \"TypeDef\") return null\n const children = getChildren(typeDef)\n const typeNode = children.find((c) => c.name !== \":\" && c.name !== \"->\")\n if (typeNode) {\n return transformPythonType(typeNode, ctx)\n }\n return null\n}\n\ninterface TypeModifiers {\n isFinal: boolean\n isClassVar: boolean\n}\n\n/**\n * Extract type modifiers (Final, ClassVar) from a TypeDef node\n * Returns the modifiers found in the type annotation\n */\nfunction extractTypeModifiers(\n typeDef: SyntaxNode | undefined,\n ctx: TransformContext\n): TypeModifiers {\n const result: TypeModifiers = { isFinal: false, isClassVar: false }\n if (!typeDef || typeDef.name !== \"TypeDef\") return result\n\n const children = getChildren(typeDef)\n const typeNode = children.find((c) => c.name !== \":\" && c.name !== \"->\")\n if (!typeNode) return result\n\n // Check if the type is a MemberExpression (generic type like Final[T])\n if (typeNode.name === \"MemberExpression\") {\n const typeChildren = getChildren(typeNode)\n const baseType = typeChildren[0]\n if (baseType) {\n const baseName = getNodeText(baseType, ctx.source)\n if (baseName === \"Final\") {\n result.isFinal = true\n } else if (baseName === \"ClassVar\") {\n result.isClassVar = true\n }\n }\n } else if (typeNode.name === \"VariableName\") {\n // Could be just \"Final\" without type argument (Final = Final[Any])\n const typeName = getNodeText(typeNode, ctx.source)\n if (typeName === \"Final\") {\n result.isFinal = true\n } else if (typeName === \"ClassVar\") {\n result.isClassVar = true\n }\n }\n\n return result\n}\n\n/**\n * Transform Callable type annotation to TypeScript function type\n * Callable[[int, str], bool] -> (arg0: number, arg1: string) => boolean\n */\nfunction transformCallableType(rawTypeArgNodes: SyntaxNode[], ctx: TransformContext): string {\n if (rawTypeArgNodes.length < 2) {\n return \"(...args: unknown[]) => unknown\"\n }\n\n const paramListNode = rawTypeArgNodes[0]\n const returnTypeNode = rawTypeArgNodes[rawTypeArgNodes.length - 1]\n\n // Extract parameter types from the first argument (should be an array/list)\n let paramTypes: string[] = []\n if (paramListNode) {\n // The first argument should be a list: [int, str]\n const paramListChildren = getChildren(paramListNode)\n const innerTypes = paramListChildren.filter(\n (c) => c.name !== \"[\" && c.name !== \"]\" && c.name !== \",\"\n )\n\n if (innerTypes.length > 0) {\n paramTypes = innerTypes.map((c) => transformPythonType(c, ctx))\n }\n }\n\n const returnType = returnTypeNode ? transformPythonType(returnTypeNode, ctx) : \"unknown\"\n\n // If paramListNode was a proper list (has children like [ and ]), use explicit params\n // Otherwise, fall back to generic args\n if (paramListNode) {\n const paramListChildren = getChildren(paramListNode)\n const hasBrackets = paramListChildren.some((c) => c.name === \"[\" || c.name === \"]\")\n\n if (hasBrackets) {\n // It's a list notation - could be empty or have params\n const params = paramTypes.map((t, i) => `arg${String(i)}: ${t}`).join(\", \")\n return `(${params}) => ${returnType}`\n }\n }\n\n // Fallback for malformed or bare Callable\n return `(...args: unknown[]) => ${returnType}`\n}\n\n// ============================================================================\n// Docstring → JSDoc helpers\n// ============================================================================\n\ninterface ParsedDocstring {\n description: string\n params: Array<{ name: string; description: string }>\n returns: string | null\n throws: Array<{ type: string; description: string }>\n}\n\n/**\n * Check if a node is a docstring (ExpressionStatement containing a String)\n */\nfunction isDocstringNode(node: SyntaxNode, ctx: TransformContext): boolean {\n if (node.name !== \"ExpressionStatement\") return false\n const children = getChildren(node)\n const firstChild = children[0]\n if (!firstChild || firstChild.name !== \"String\") return false\n\n const text = getNodeText(firstChild, ctx.source)\n // Must be a triple-quoted string\n return text.startsWith('\"\"\"') || text.startsWith(\"'''\")\n}\n\n/**\n * Extract docstring content from a triple-quoted string\n */\nfunction extractDocstringContent(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const stringNode = children[0]\n if (!stringNode) return \"\"\n\n const text = getNodeText(stringNode, ctx.source)\n\n // Remove triple quotes (\"\"\" or ''')\n let content = text\n if (content.startsWith('\"\"\"')) {\n content = content.slice(3, -3)\n } else if (content.startsWith(\"'''\")) {\n content = content.slice(3, -3)\n }\n\n // Normalize line endings and trim\n content = content.replace(/\\r\\n/g, \"\\n\").trim()\n\n return content\n}\n\n/**\n * Parse a docstring into structured components (Google-style or NumPy-style)\n */\nfunction parseDocstring(content: string): ParsedDocstring {\n const result: ParsedDocstring = {\n description: \"\",\n params: [],\n returns: null,\n throws: []\n }\n\n const lines = content.split(\"\\n\")\n let currentSection: \"description\" | \"params\" | \"returns\" | \"throws\" = \"description\"\n const descriptionLines: string[] = []\n let currentParamName = \"\"\n let currentParamDesc: string[] = []\n let currentThrowsType = \"\"\n let currentThrowsDesc: string[] = []\n const returnsLines: string[] = []\n\n // Helper to flush current param\n const flushParam = () => {\n if (currentParamName) {\n result.params.push({\n name: currentParamName,\n description: currentParamDesc.join(\" \").trim()\n })\n currentParamName = \"\"\n currentParamDesc = []\n }\n }\n\n // Helper to flush current throws\n const flushThrows = () => {\n if (currentThrowsType || currentThrowsDesc.length > 0) {\n result.throws.push({\n type: currentThrowsType || \"Error\",\n description: currentThrowsDesc.join(\" \").trim()\n })\n currentThrowsType = \"\"\n currentThrowsDesc = []\n }\n }\n\n for (let lineIndex = 0; lineIndex < lines.length; lineIndex++) {\n const line = lines[lineIndex] ?? \"\"\n const trimmed = line.trim()\n\n // Skip NumPy-style dashed underlines (e.g., \"----------\")\n if (/^-+$/.test(trimmed)) {\n continue\n }\n\n // Check for section headers (Google-style with colon, or NumPy-style without)\n // NumPy-style: section name followed by dashed underline on next line\n const nextLine = lines[lineIndex + 1]?.trim() ?? \"\"\n const isNumpySection = /^-+$/.test(nextLine)\n\n if (\n /^(Args|Arguments|Parameters):?$/i.test(trimmed) &&\n (trimmed.endsWith(\":\") || isNumpySection)\n ) {\n currentSection = \"params\"\n continue\n }\n if (/^(Returns?|Yields?):?$/i.test(trimmed) && (trimmed.endsWith(\":\") || isNumpySection)) {\n flushParam()\n currentSection = \"returns\"\n continue\n }\n if (\n /^(Raises?|Throws?|Exceptions?):?$/i.test(trimmed) &&\n (trimmed.endsWith(\":\") || isNumpySection)\n ) {\n flushParam()\n currentSection = \"throws\"\n continue\n }\n\n // Skip other section markers like \"Examples:\", \"Notes:\", \"See Also:\", etc.\n if (/^[A-Z][a-z]+:?$/.test(trimmed) && (trimmed.endsWith(\":\") || isNumpySection)) {\n continue\n }\n\n switch (currentSection) {\n case \"description\":\n descriptionLines.push(trimmed)\n break\n\n case \"params\": {\n // Google-style: \"name (type): description\" or \"name: description\"\n // NumPy-style: \"name : type\" (description on following indented lines)\n const googleMatch = trimmed.match(/^(\\w+)\\s*(?:\\([^)]*\\))?\\s*:\\s*(.*)$/)\n if (googleMatch) {\n flushParam()\n currentParamName = googleMatch[1] ?? \"\"\n const afterColon = googleMatch[2] ?? \"\"\n // Check if this looks like a type (single word or type expression) vs description\n // NumPy puts type after colon, Google puts description\n // If it's a type (e.g., \"str\", \"int\", \"array_like\"), don't add to description\n const looksLikeType = /^[a-z_][a-z0-9_]*(?:\\s+(?:of|or)\\s+[a-z_][a-z0-9_]*)*$/i.test(\n afterColon\n )\n if (afterColon && !looksLikeType) {\n currentParamDesc.push(afterColon)\n }\n } else if (currentParamName && trimmed) {\n // Continuation line for current param\n currentParamDesc.push(trimmed)\n }\n break\n }\n\n case \"returns\": {\n // Skip NumPy-style type-only lines (e.g., \"str\", \"int\", \"ndarray\")\n const looksLikeType = /^[a-z_][a-z0-9_]*$/i.test(trimmed)\n if (looksLikeType && returnsLines.length === 0) {\n // Skip type annotation line in NumPy style\n continue\n }\n // Strip type prefix like \"str: \" or \"(str): \" in Google style\n const stripped = trimmed.replace(/^(?:\\([^)]*\\)|[^:]+):\\s*/, \"\")\n if (stripped || trimmed) {\n returnsLines.push(stripped || trimmed)\n }\n break\n }\n\n case \"throws\": {\n // Google-style: \"ValueError: description\"\n const throwsMatch = trimmed.match(/^(\\w+)\\s*:\\s*(.*)$/)\n if (throwsMatch) {\n flushThrows()\n currentThrowsType = throwsMatch[1] ?? \"Error\"\n const desc = throwsMatch[2] ?? \"\"\n if (desc) currentThrowsDesc.push(desc)\n } else if (/^[A-Z][a-zA-Z]*(?:Error|Exception|Warning)?$/.test(trimmed)) {\n // NumPy-style: exception type on its own line (e.g., \"ValueError\")\n flushThrows()\n currentThrowsType = trimmed\n } else if (trimmed) {\n currentThrowsDesc.push(trimmed)\n }\n break\n }\n }\n }\n\n // Flush any remaining\n flushParam()\n flushThrows()\n\n result.description = descriptionLines.join(\"\\n\").trim()\n if (returnsLines.length > 0) {\n result.returns = returnsLines.join(\" \").trim()\n }\n\n return result\n}\n\n/**\n * Convert a parsed docstring to JSDoc format\n */\nfunction toJSDoc(parsed: ParsedDocstring, indent: string): string {\n const lines: string[] = []\n\n lines.push(`${indent}/**`)\n\n // Description\n if (parsed.description) {\n const descLines = parsed.description.split(\"\\n\")\n for (const line of descLines) {\n if (line.trim()) {\n lines.push(`${indent} * ${line}`)\n } else {\n lines.push(`${indent} *`)\n }\n }\n }\n\n // Add blank line if we have description and other tags\n if (\n parsed.description &&\n (parsed.params.length > 0 || parsed.returns || parsed.throws.length > 0)\n ) {\n lines.push(`${indent} *`)\n }\n\n // Params\n for (const param of parsed.params) {\n if (param.description) {\n lines.push(`${indent} * @param ${param.name} - ${param.description}`)\n } else {\n lines.push(`${indent} * @param ${param.name}`)\n }\n }\n\n // Returns\n if (parsed.returns) {\n lines.push(`${indent} * @returns ${parsed.returns}`)\n }\n\n // Throws\n for (const t of parsed.throws) {\n lines.push(`${indent} * @throws {${t.type}} ${t.description}`)\n }\n\n lines.push(`${indent} */`)\n\n return lines.join(\"\\n\")\n}\n\n/**\n * Extract docstring from a function/class body, returning the JSDoc and remaining body statements\n */\nfunction extractDocstringFromBody(\n bodyNode: SyntaxNode,\n ctx: TransformContext,\n indent: string\n): { jsdoc: string | null; skipFirstStatement: boolean } {\n const children = getChildren(bodyNode)\n const statements = children.filter((c) => c.name !== \":\")\n\n const firstStatement = statements[0]\n if (firstStatement && isDocstringNode(firstStatement, ctx)) {\n const content = extractDocstringContent(firstStatement, ctx)\n const parsed = parseDocstring(content)\n const jsdoc = toJSDoc(parsed, indent)\n return { jsdoc, skipFirstStatement: true }\n }\n\n return { jsdoc: null, skipFirstStatement: false }\n}\n\nexport function transform(input: string | ParseResult): TransformResult {\n const parseResult = typeof input === \"string\" ? parse(input) : input\n const ctx = createContext(parseResult.source)\n const code = transformNode(parseResult.tree.topNode, ctx)\n\n return {\n code,\n usesRuntime: ctx.usesRuntime,\n hoistedImports: ctx.hoistedImports\n }\n}\n\nfunction transformNode(node: SyntaxNode, ctx: TransformContext): string {\n switch (node.name) {\n case \"Script\":\n return transformScript(node, ctx)\n case \"ExpressionStatement\":\n return transformExpressionStatement(node, ctx)\n case \"AssignStatement\":\n return transformAssignStatement(node, ctx)\n case \"BinaryExpression\":\n return transformBinaryExpression(node, ctx)\n case \"UnaryExpression\":\n return transformUnaryExpression(node, ctx)\n case \"ParenthesizedExpression\":\n return transformParenthesizedExpression(node, ctx)\n case \"NamedExpression\":\n return transformNamedExpression(node, ctx)\n case \"ConditionalExpression\":\n return transformConditionalExpression(node, ctx)\n case \"Number\":\n return transformNumber(node, ctx)\n case \"String\":\n return transformString(node, ctx)\n case \"FormatString\":\n return transformFormatString(node, ctx)\n case \"Boolean\":\n return transformBoolean(node, ctx)\n case \"None\":\n return \"null\"\n case \"VariableName\":\n return getNodeText(node, ctx.source)\n case \"CallExpression\":\n return transformCallExpression(node, ctx)\n case \"MemberExpression\":\n return transformMemberExpression(node, ctx)\n case \"ArrayExpression\":\n return transformArrayExpression(node, ctx)\n case \"ArrayComprehensionExpression\":\n return transformArrayComprehension(node, ctx)\n case \"DictionaryExpression\":\n return transformDictionaryExpression(node, ctx)\n case \"DictionaryComprehensionExpression\":\n return transformDictComprehension(node, ctx)\n case \"SetExpression\":\n return transformSetExpression(node, ctx)\n case \"SetComprehensionExpression\":\n return transformSetComprehension(node, ctx)\n case \"ComprehensionExpression\":\n return transformGeneratorExpression(node, ctx)\n case \"TupleExpression\":\n return transformTupleExpression(node, ctx)\n case \"IfStatement\":\n return transformIfStatement(node, ctx)\n case \"WhileStatement\":\n return transformWhileStatement(node, ctx)\n case \"ForStatement\":\n return transformForStatement(node, ctx)\n case \"PassStatement\":\n return \"\"\n case \"BreakStatement\":\n return \"break\"\n case \"ContinueStatement\":\n return \"continue\"\n case \"ReturnStatement\":\n return transformReturnStatement(node, ctx)\n case \"FunctionDefinition\":\n return transformFunctionDefinition(node, ctx)\n case \"ClassDefinition\":\n return transformClassDefinition(node, ctx)\n case \"DecoratedStatement\":\n return transformDecoratedStatement(node, ctx)\n case \"LambdaExpression\":\n return transformLambdaExpression(node, ctx)\n case \"Comment\":\n return transformComment(node, ctx)\n case \"TryStatement\":\n return transformTryStatement(node, ctx)\n case \"RaiseStatement\":\n return transformRaiseStatement(node, ctx)\n case \"ImportStatement\":\n return transformImportStatement(node, ctx)\n case \"AwaitExpression\":\n return transformAwaitExpression(node, ctx)\n case \"WithStatement\":\n return transformWithStatement(node, ctx)\n case \"MatchStatement\":\n return transformMatchStatement(node, ctx)\n case \"ScopeStatement\":\n return transformScopeStatement(node, ctx)\n case \"DeleteStatement\":\n return transformDeleteStatement(node, ctx)\n case \"AssertStatement\":\n return transformAssertStatement(node, ctx)\n case \"YieldStatement\":\n return transformYieldStatement(node, ctx)\n /* v8 ignore next 2 -- fallback for unknown AST nodes @preserve */\n default:\n return getNodeText(node, ctx.source)\n }\n}\n\nfunction transformScript(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const statements = children\n .filter((child) => child.name !== \"Comment\" || getNodeText(child, ctx.source).trim() !== \"\")\n .map((child) => {\n const transformed = transformNode(child, ctx)\n // Skip empty transformations (e.g., pass, TypeVar declarations)\n if (transformed === \"\") {\n return \"\"\n }\n if (\n child.name === \"ExpressionStatement\" ||\n child.name === \"AssignStatement\" ||\n child.name === \"PassStatement\" ||\n child.name === \"BreakStatement\" ||\n child.name === \"ContinueStatement\" ||\n child.name === \"ReturnStatement\" ||\n child.name === \"RaiseStatement\"\n ) {\n return transformed + \";\"\n }\n return transformed\n })\n .filter((s) => s.trim() !== \"\")\n\n return statements.join(\"\\n\")\n}\n\nfunction transformExpressionStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n if (children.length === 0) return \"\"\n const firstChild = children[0]\n if (!firstChild) return \"\"\n return transformNode(firstChild, ctx)\n}\n\nfunction transformAssignStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n if (children.length < 3) return getNodeText(node, ctx.source)\n\n // Find the assignment operator\n const assignOpIndex = children.findIndex((c) => c.name === \"AssignOp\" || c.name === \"=\")\n if (assignOpIndex === -1) return getNodeText(node, ctx.source)\n\n // Find type annotation (TypeDef before AssignOp)\n const typeDef = children.slice(0, assignOpIndex).find((c) => c.name === \"TypeDef\")\n\n // Check for trailing comma before AssignOp (indicates tuple unpacking even for single target)\n const beforeAssign = children.slice(0, assignOpIndex)\n const hasTrailingComma = beforeAssign.some((c) => c.name === \",\")\n\n // Collect targets (before =) and values (after =)\n // Filter out commas and TypeDef nodes (type annotations like `: int`)\n const targets = beforeAssign.filter((c) => c.name !== \",\" && c.name !== \"TypeDef\")\n const values = children.slice(assignOpIndex + 1).filter((c) => c.name !== \",\")\n\n /* v8 ignore next 3 -- defensive: empty targets/values can't occur with valid Python @preserve */\n if (targets.length === 0 || values.length === 0) {\n return getNodeText(node, ctx.source)\n }\n\n // Strip TypeVar declarations - they're only needed for Python type checking\n if (values.length === 1 && values[0]?.name === \"CallExpression\") {\n const callChildren = getChildren(values[0])\n const funcNode = callChildren.find((c) => c.name === \"VariableName\")\n if (funcNode && getNodeText(funcNode, ctx.source) === \"TypeVar\") {\n return \"\"\n }\n }\n\n // Handle TypeAlias: Name: TypeAlias = Type → type Name = Type\n if (typeDef && targets.length === 1 && values.length === 1) {\n const typeDefText = getNodeText(typeDef, ctx.source)\n const target = targets[0]\n const value = values[0]\n if (typeDefText.includes(\"TypeAlias\") && target && value) {\n const aliasName = getNodeText(target, ctx.source)\n const aliasType = transformPythonType(value, ctx)\n return `type ${aliasName} = ${aliasType}`\n }\n }\n\n // Single target assignment (but not if there's a trailing comma, which indicates tuple unpacking)\n if (targets.length === 1 && !hasTrailingComma) {\n const target = targets[0]\n /* v8 ignore next -- @preserve */\n if (!target) return getNodeText(node, ctx.source)\n\n // Check for slice assignment: arr[1:3] = values\n if (target.name === \"MemberExpression\" && isSliceExpression(target)) {\n return transformSliceAssignment(target, values, ctx)\n }\n\n const targetCode = transformNode(target, ctx)\n\n // Extract type annotation if present\n const tsType = extractTypeAnnotation(typeDef, ctx)\n const typeAnnotation = tsType ? `: ${tsType}` : \"\"\n\n // Extract type modifiers (Final, ClassVar) for declaration keyword\n const modifiers = extractTypeModifiers(typeDef, ctx)\n\n // Determine if we need a declaration keyword\n // - MemberExpression (obj.attr or arr[i]) never needs declaration\n // - VariableName needs declaration only if not already declared in an accessible scope\n let needsDeclaration = false\n if (target.name === \"VariableName\") {\n const varName = getNodeText(target, ctx.source)\n if (!isVariableDeclared(ctx, varName)) {\n needsDeclaration = true\n declareVariable(ctx, varName)\n }\n }\n\n // Use 'const' for Final, 'let' otherwise\n const declarationKeyword = modifiers.isFinal ? \"const\" : \"let\"\n\n if (values.length === 1) {\n const value = values[0]\n if (!value) return getNodeText(node, ctx.source)\n const valueCode = transformNode(value, ctx)\n if (needsDeclaration) {\n return `${declarationKeyword} ${targetCode}${typeAnnotation} = ${valueCode}`\n }\n return `${targetCode} = ${valueCode}`\n } else {\n // Multiple values into single target (creates array)\n const valuesCodes = values.map((v) => transformNode(v, ctx))\n if (needsDeclaration) {\n return `${declarationKeyword} ${targetCode}${typeAnnotation} = [${valuesCodes.join(\", \")}]`\n }\n return `${targetCode} = [${valuesCodes.join(\", \")}]`\n }\n }\n\n // Multiple target assignment (destructuring)\n const targetCodes = targets.map((t) => transformAssignTarget(t, ctx))\n const targetPattern = `[${targetCodes.join(\", \")}]`\n\n // Track all variables in destructuring pattern\n const varNames = extractVariableNames(targets, ctx.source)\n // Check if all variables are already declared in accessible scopes\n const allDeclaredAtAccessibleScope = varNames.every((v) => isVariableDeclared(ctx, v))\n if (!allDeclaredAtAccessibleScope) {\n varNames.forEach((v) => {\n declareVariable(ctx, v)\n })\n }\n\n if (values.length === 1) {\n // Unpacking from single value: a, b = point\n const value = values[0]\n /* v8 ignore next -- @preserve */\n if (!value) return getNodeText(node, ctx.source)\n const valueCode = transformNode(value, ctx)\n return allDeclaredAtAccessibleScope\n ? `${targetPattern} = ${valueCode}`\n : `let ${targetPattern} = ${valueCode}`\n } else {\n // Multiple values: a, b = 1, 2\n const valuesCodes = values.map((v) => transformNode(v, ctx))\n return allDeclaredAtAccessibleScope\n ? `${targetPattern} = [${valuesCodes.join(\", \")}]`\n : `let ${targetPattern} = [${valuesCodes.join(\", \")}]`\n }\n}\n\nfunction extractVariableNames(nodes: SyntaxNode[], source: string): string[] {\n const names: string[] = []\n for (const node of nodes) {\n if (node.name === \"VariableName\") {\n names.push(getNodeText(node, source))\n } else if (node.name === \"TupleExpression\") {\n const children = getChildren(node)\n names.push(\n ...extractVariableNames(\n children.filter((c) => c.name !== \"(\" && c.name !== \")\" && c.name !== \",\"),\n source\n )\n )\n }\n }\n return names\n}\n\n/**\n * Check if a MemberExpression contains a slice (colon in the brackets)\n */\nfunction isSliceExpression(node: SyntaxNode): boolean {\n const children = getChildren(node)\n // Look for a colon inside the brackets\n return children.some((c) => c.name === \":\")\n}\n\n/**\n * Transform a slice assignment: arr[1:3] = values -> py.list.sliceAssign(arr, 1, 3, undefined, values)\n */\nfunction transformSliceAssignment(\n target: SyntaxNode,\n values: SyntaxNode[],\n ctx: TransformContext\n): string {\n const children = getChildren(target)\n\n // Find the object being sliced (first child before the bracket)\n const obj = children[0]\n if (!obj) return `/* slice assignment error */`\n\n const objCode = transformNode(obj, ctx)\n\n // Parse slice indices: [start:end:step]\n // Children after \"[\" and before \"]\" contain the slice parts\n const bracketStart = children.findIndex((c) => c.name === \"[\")\n const bracketEnd = children.findIndex((c) => c.name === \"]\")\n\n if (bracketStart === -1 || bracketEnd === -1) return `/* slice assignment error */`\n\n // Extract slice parts between brackets\n const sliceParts = children.slice(bracketStart + 1, bracketEnd)\n\n // Parse the slice notation\n // Possible patterns: [a:b], [:b], [a:], [:], [a:b:c], [::c], etc.\n let start: string | undefined\n let end: string | undefined\n let step: string | undefined\n\n const colonIndices: number[] = []\n for (let i = 0; i < sliceParts.length; i++) {\n if (sliceParts[i]?.name === \":\") {\n colonIndices.push(i)\n }\n }\n\n if (colonIndices.length >= 1) {\n // Parts before first colon = start\n const beforeFirst = sliceParts.slice(0, colonIndices[0])\n if (beforeFirst.length > 0 && beforeFirst[0]?.name !== \":\") {\n start = beforeFirst.map((n) => transformNode(n, ctx)).join(\"\")\n }\n\n const firstColon = colonIndices[0] ?? 0\n const secondColon = colonIndices[1]\n\n if (colonIndices.length === 1) {\n // [start:end]\n const afterFirst = sliceParts.slice(firstColon + 1)\n if (afterFirst.length > 0) {\n end = afterFirst.map((n) => transformNode(n, ctx)).join(\"\")\n }\n } else if (secondColon !== undefined) {\n // [start:end:step]\n const betweenColons = sliceParts.slice(firstColon + 1, secondColon)\n if (betweenColons.length > 0) {\n end = betweenColons.map((n) => transformNode(n, ctx)).join(\"\")\n }\n const afterSecond = sliceParts.slice(secondColon + 1)\n if (afterSecond.length > 0) {\n step = afterSecond.map((n) => transformNode(n, ctx)).join(\"\")\n }\n }\n }\n\n // Transform the values\n const firstValue = values[0]\n const valuesCode =\n values.length === 1 && firstValue\n ? transformNode(firstValue, ctx)\n : `[${values.map((v) => transformNode(v, ctx)).join(\", \")}]`\n\n ctx.usesRuntime.add(\"list.sliceAssign\")\n\n return `list.sliceAssign(${objCode}, ${start ?? \"undefined\"}, ${end ?? \"undefined\"}, ${step ?? \"undefined\"}, ${valuesCode})`\n}\n\nfunction transformAssignTarget(node: SyntaxNode, ctx: TransformContext): string {\n if (node.name === \"VariableName\") {\n return getNodeText(node, ctx.source)\n } else if (node.name === \"TupleExpression\") {\n // Nested destructuring: (a, b) -> [a, b]\n const children = getChildren(node)\n const elements = children.filter((c) => c.name !== \"(\" && c.name !== \")\" && c.name !== \",\")\n return \"[\" + elements.map((e) => transformAssignTarget(e, ctx)).join(\", \") + \"]\"\n }\n return transformNode(node, ctx)\n}\n\nfunction transformBinaryExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n if (children.length < 3) return getNodeText(node, ctx.source)\n\n const left = children[0]\n const op = children[1]\n\n if (!left || !op) return getNodeText(node, ctx.source)\n\n const opText = getNodeText(op, ctx.source)\n\n // Handle 'is not' and 'not in' operators (4 children: left, is/not, not/in, right)\n if ((opText === \"is\" || opText === \"not\") && children.length >= 4) {\n const secondOp = children[2]\n const secondOpText = secondOp ? getNodeText(secondOp, ctx.source) : \"\"\n if (opText === \"is\" && secondOpText === \"not\") {\n // \"is not\" -> \"!==\"\n const right = children[3]\n if (!right) return getNodeText(node, ctx.source)\n const leftCode = transformNode(left, ctx)\n const rightCode = transformNode(right, ctx)\n return `(${leftCode} !== ${rightCode})`\n }\n if (opText === \"not\" && secondOpText === \"in\") {\n // \"not in\" -> \"!contains()\"\n const right = children[3]\n if (!right) return getNodeText(node, ctx.source)\n const leftCode = transformNode(left, ctx)\n const rightCode = transformNode(right, ctx)\n ctx.usesRuntime.add(\"contains\")\n return `!contains(${leftCode}, ${rightCode})`\n }\n }\n\n const right = children[2]\n if (!right) return getNodeText(node, ctx.source)\n\n // Handle chained comparisons (e.g., 1 < 2 < 3 -> (1 < 2) && (2 < 3))\n if (isComparisonOperator(opText) && isChainedComparison(left)) {\n const leftComparison = transformNode(left, ctx)\n const middleValue = extractRightOperand(left, ctx)\n const rightCode = transformNode(right, ctx)\n return `(${leftComparison} && (${middleValue} ${opText} ${rightCode}))`\n }\n\n const leftCode = transformNode(left, ctx)\n const rightCode = transformNode(right, ctx)\n\n switch (opText) {\n case \"//\":\n ctx.usesRuntime.add(\"floorDiv\")\n return `floorDiv(${leftCode}, ${rightCode})`\n case \"**\":\n ctx.usesRuntime.add(\"pow\")\n return `pow(${leftCode}, ${rightCode})`\n case \"%\":\n // Check for string formatting (e.g., \"Hello %s\" % name)\n if (left.name === \"String\" || left.name === \"FormatString\") {\n ctx.usesRuntime.add(\"sprintf\")\n return `sprintf(${leftCode}, ${rightCode})`\n }\n ctx.usesRuntime.add(\"mod\")\n return `mod(${leftCode}, ${rightCode})`\n case \"and\":\n return `(${leftCode} && ${rightCode})`\n case \"or\":\n return `(${leftCode} || ${rightCode})`\n case \"in\":\n ctx.usesRuntime.add(\"contains\")\n return `contains(${leftCode}, ${rightCode})`\n case \"is\":\n return `(${leftCode} === ${rightCode})`\n case \"+\":\n // Check for array concatenation\n if (isArrayLiteral(left) && isArrayLiteral(right)) {\n return `[...${leftCode}, ...${rightCode}]`\n }\n return `(${leftCode} + ${rightCode})`\n case \"*\":\n // Check for string/array repetition (e.g., 'ab' * 3 or [1, 2] * 3)\n if (isStringOrArrayLiteral(left) && isNumberLiteral(right)) {\n ctx.usesRuntime.add(\"repeatValue\")\n return `repeatValue(${leftCode}, ${rightCode})`\n }\n if (isNumberLiteral(left) && isStringOrArrayLiteral(right)) {\n ctx.usesRuntime.add(\"repeatValue\")\n return `repeatValue(${rightCode}, ${leftCode})`\n }\n return `(${leftCode} * ${rightCode})`\n /* v8 ignore next 2 -- pass-through for standard operators @preserve */\n default:\n return `(${leftCode} ${opText} ${rightCode})`\n }\n}\n\nfunction isArrayLiteral(node: SyntaxNode): boolean {\n return node.name === \"ArrayExpression\"\n}\n\nfunction isStringOrArrayLiteral(node: SyntaxNode): boolean {\n return node.name === \"String\" || node.name === \"ArrayExpression\"\n}\n\nfunction isNumberLiteral(node: SyntaxNode): boolean {\n return node.name === \"Number\"\n}\n\nfunction isComparisonOperator(op: string): boolean {\n return [\"<\", \">\", \"<=\", \">=\", \"==\", \"!=\"].includes(op)\n}\n\nfunction isChainedComparison(node: SyntaxNode): boolean {\n // Check if node is a BinaryExpression with a comparison operator\n if (node.name !== \"BinaryExpression\") return false\n const children = getChildren(node)\n const op = children[1]\n if (!op || op.name !== \"CompareOp\") return false\n return true\n}\n\nfunction extractRightOperand(node: SyntaxNode, ctx: TransformContext): string {\n // Extract the right operand from a BinaryExpression\n const children = getChildren(node)\n const right = children[2]\n if (!right) return \"\"\n return transformNode(right, ctx)\n}\n\nfunction transformUnaryExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n if (children.length < 2) return getNodeText(node, ctx.source)\n\n const op = children[0]\n const operand = children[1]\n\n if (!op || !operand) return getNodeText(node, ctx.source)\n\n const opText = getNodeText(op, ctx.source)\n const operandCode = transformNode(operand, ctx)\n\n switch (opText) {\n case \"not\":\n return `(!${operandCode})`\n /* v8 ignore next 2 -- pass-through for unary operators like - and + @preserve */\n default:\n return `(${opText}${operandCode})`\n }\n}\n\nfunction transformParenthesizedExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const inner = children.find((c) => c.name !== \"(\" && c.name !== \")\")\n if (!inner) return \"()\"\n return `(${transformNode(inner, ctx)})`\n}\n\nfunction transformNamedExpression(node: SyntaxNode, ctx: TransformContext): string {\n // Walrus operator: (name := expr) → (name = expr)\n const children = getChildren(node)\n const varName = children.find((c) => c.name === \"VariableName\")\n const value = children.find((c) => c.name !== \"VariableName\" && c.name !== \"AssignOp\")\n\n /* v8 ignore next 3 -- defensive: walrus operator always has name and value @preserve */\n if (!varName || !value) {\n return getNodeText(node, ctx.source)\n }\n\n const name = getNodeText(varName, ctx.source)\n const valueCode = transformNode(value, ctx)\n\n return `${name} = ${valueCode}`\n}\n\nfunction transformConditionalExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n // Python: value_if_true if condition else value_if_false\n // Format: TrueExpr 'if' Condition 'else' FalseExpr\n const exprs = children.filter((c) => c.name !== \"if\" && c.name !== \"else\" && c.name !== \"Keyword\")\n\n if (exprs.length >= 3) {\n const trueExpr = exprs[0]\n const condition = exprs[1]\n const falseExpr = exprs[2]\n\n /* v8 ignore next -- defensive: checked exprs.length >= 3 above @preserve */\n if (trueExpr && condition && falseExpr) {\n const condCode = transformNode(condition, ctx)\n const trueCode = transformNode(trueExpr, ctx)\n const falseCode = transformNode(falseExpr, ctx)\n\n return `(${condCode} ? ${trueCode} : ${falseCode})`\n }\n }\n\n /* v8 ignore next -- @preserve */\n return getNodeText(node, ctx.source)\n}\n\nfunction transformNumber(node: SyntaxNode, ctx: TransformContext): string {\n const text = getNodeText(node, ctx.source)\n // Handle Python numeric literals\n // Remove underscores (Python allows 1_000_000)\n return text.replace(/_/g, \"\")\n}\n\nfunction transformString(node: SyntaxNode, ctx: TransformContext): string {\n const text = getNodeText(node, ctx.source)\n\n // Handle raw strings\n if (text.startsWith('r\"') || text.startsWith(\"r'\")) {\n return text.slice(1)\n }\n if (text.startsWith('R\"') || text.startsWith(\"R'\")) {\n return text.slice(1)\n }\n\n // Handle triple-quoted strings\n if (text.startsWith('\"\"\"') || text.startsWith(\"'''\")) {\n const content = text.slice(3, -3)\n return \"`\" + content.replace(/`/g, \"\\\\`\") + \"`\"\n }\n\n // Regular strings - convert to JS format\n // Python uses same string syntax as JS for basic cases\n return text\n}\n\nfunction transformFormatString(node: SyntaxNode, ctx: TransformContext): string {\n const text = getNodeText(node, ctx.source)\n const children = getChildren(node)\n\n // Find all FormatReplacement nodes\n const replacements = children.filter((c) => c.name === \"FormatReplacement\")\n\n // If no replacements, just convert to template literal\n if (replacements.length === 0) {\n // Handle escaped braces: {{ -> {, }} -> }\n // Remove the 'f' prefix and convert quotes to backticks\n let content: string\n if (text.startsWith('f\"\"\"') || text.startsWith(\"f'''\")) {\n content = text.slice(4, -3)\n } else {\n content = text.slice(2, -1) // Remove f\" and closing \"\n }\n content = content.replace(/\\{\\{/g, \"{\").replace(/\\}\\}/g, \"}\")\n content = content.replace(/`/g, \"\\\\`\")\n return \"`\" + content + \"`\"\n }\n\n // Build template literal with replacements\n let result = \"`\"\n let pos = text.startsWith('f\"\"\"') || text.startsWith(\"f'''\") ? 4 : 2 // Skip f\" or f\"\"\"\n\n for (const replacement of replacements) {\n // Add static text before this replacement\n const staticText = text.slice(pos, replacement.from - node.from)\n // Handle escaped braces in static text\n result += staticText.replace(/\\{\\{/g, \"{\").replace(/\\}\\}/g, \"}\").replace(/`/g, \"\\\\`\")\n\n // Process the replacement\n const replChildren = getChildren(replacement)\n let expr: SyntaxNode | undefined\n let formatSpec: string | undefined\n let conversion: string | undefined\n\n for (const child of replChildren) {\n if (child.name === \"{\" || child.name === \"}\") continue\n if (child.name === \"FormatSpec\") {\n // Get the format spec without the leading colon\n formatSpec = getNodeText(child, ctx.source).slice(1)\n } else if (child.name === \"FormatConversion\") {\n // Get the conversion character (r, s, or a)\n conversion = getNodeText(child, ctx.source).slice(1) // Remove !\n } else {\n expr = child\n }\n }\n\n if (expr) {\n let exprCode = transformNode(expr, ctx)\n\n // Apply conversion first (!r, !s, !a)\n if (conversion === \"r\") {\n exprCode = `repr(${exprCode})`\n ctx.usesRuntime.add(\"repr\")\n } else if (conversion === \"s\") {\n exprCode = `str(${exprCode})`\n ctx.usesRuntime.add(\"str\")\n } else if (conversion === \"a\") {\n exprCode = `ascii(${exprCode})`\n ctx.usesRuntime.add(\"ascii\")\n }\n\n // Apply format spec\n if (formatSpec) {\n ctx.usesRuntime.add(\"format\")\n result += `\\${format(${exprCode}, \"${formatSpec}\")}`\n } else {\n // Simple case - just the expression (with optional conversion already applied)\n result += `\\${${exprCode}}`\n }\n }\n\n pos = replacement.to - node.from\n }\n\n // Add remaining static text\n const endPos =\n text.startsWith('f\"\"\"') || text.startsWith(\"f'''\") ? text.length - 3 : text.length - 1\n const remainingText = text.slice(pos, endPos)\n result += remainingText.replace(/\\{\\{/g, \"{\").replace(/\\}\\}/g, \"}\").replace(/`/g, \"\\\\`\")\n\n result += \"`\"\n return result\n}\n\nfunction transformBoolean(node: SyntaxNode, ctx: TransformContext): string {\n const text = getNodeText(node, ctx.source)\n return text === \"True\" ? \"true\" : \"false\"\n}\n\nfunction transformCallExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const callee = children[0]\n const argList = children.find((c) => c.name === \"ArgList\")\n\n if (!callee) return getNodeText(node, ctx.source)\n\n const calleeName = getNodeText(callee, ctx.source)\n const args = argList ? transformArgList(argList, ctx) : \"\"\n\n // Handle method calls (obj.method())\n if (callee.name === \"MemberExpression\") {\n const methodResult = transformMethodCall(callee, args, ctx)\n if (methodResult !== null) {\n return methodResult\n }\n\n // Handle module-qualified calls (math.sqrt(), random.randint(), json.dumps())\n const moduleCallResult = transformModuleCall(calleeName, args, ctx)\n if (moduleCallResult !== null) {\n return moduleCallResult\n }\n // Fall through to regular call handling if no special mapping\n }\n\n // Check if this is a class instantiation (needs 'new')\n if (callee.name === \"VariableName\" && ctx.definedClasses.has(calleeName)) {\n return `new ${calleeName}(${args})`\n }\n\n // Map Python built-ins to JS/runtime equivalents\n switch (calleeName) {\n case \"print\":\n return `console.log(${args})`\n case \"len\":\n ctx.usesRuntime.add(\"len\")\n return `len(${args})`\n case \"range\":\n ctx.usesRuntime.add(\"range\")\n return `range(${args})`\n case \"int\":\n ctx.usesRuntime.add(\"int\")\n return `int(${args})`\n case \"float\":\n ctx.usesRuntime.add(\"float\")\n return `float(${args})`\n case \"str\":\n ctx.usesRuntime.add(\"str\")\n return `str(${args})`\n case \"bool\":\n ctx.usesRuntime.add(\"bool\")\n return `bool(${args})`\n case \"abs\":\n ctx.usesRuntime.add(\"abs\")\n return `abs(${args})`\n case \"min\":\n ctx.usesRuntime.add(\"min\")\n return `min(${args})`\n case \"max\":\n ctx.usesRuntime.add(\"max\")\n return `max(${args})`\n case \"sum\":\n ctx.usesRuntime.add(\"sum\")\n return `sum(${args})`\n case \"list\":\n ctx.usesRuntime.add(\"list\")\n return `list(${args})`\n case \"dict\":\n ctx.usesRuntime.add(\"dict\")\n return `dict(${args})`\n case \"set\":\n ctx.usesRuntime.add(\"set\")\n return `set(${args})`\n case \"tuple\":\n ctx.usesRuntime.add(\"tuple\")\n return `tuple(${args})`\n case \"enumerate\":\n ctx.usesRuntime.add(\"enumerate\")\n return `enumerate(${args})`\n case \"zip\":\n ctx.usesRuntime.add(\"zip\")\n return `zip(${args})`\n case \"sorted\":\n ctx.usesRuntime.add(\"sorted\")\n return `sorted(${args})`\n case \"reversed\":\n ctx.usesRuntime.add(\"reversed\")\n return `reversed(${args})`\n case \"isinstance\":\n ctx.usesRuntime.add(\"isinstance\")\n return `isinstance(${args})`\n case \"type\":\n ctx.usesRuntime.add(\"type\")\n return `type(${args})`\n case \"input\":\n ctx.usesRuntime.add(\"input\")\n return `input(${args})`\n case \"ord\":\n ctx.usesRuntime.add(\"ord\")\n return `ord(${args})`\n case \"chr\":\n ctx.usesRuntime.add(\"chr\")\n return `chr(${args})`\n case \"all\":\n ctx.usesRuntime.add(\"all\")\n return `all(${args})`\n case \"any\":\n ctx.usesRuntime.add(\"any\")\n return `any(${args})`\n case \"map\":\n ctx.usesRuntime.add(\"map\")\n return `map(${args})`\n case \"filter\":\n ctx.usesRuntime.add(\"filter\")\n return `filter(${args})`\n case \"repr\":\n ctx.usesRuntime.add(\"repr\")\n return `repr(${args})`\n case \"round\":\n ctx.usesRuntime.add(\"round\")\n return `round(${args})`\n case \"divmod\":\n ctx.usesRuntime.add(\"divmod\")\n return `divmod(${args})`\n case \"hex\":\n ctx.usesRuntime.add(\"hex\")\n return `hex(${args})`\n case \"oct\":\n ctx.usesRuntime.add(\"oct\")\n return `oct(${args})`\n case \"bin\":\n ctx.usesRuntime.add(\"bin\")\n return `bin(${args})`\n case \"getattr\":\n ctx.usesRuntime.add(\"getattr\")\n return `getattr(${args})`\n case \"hasattr\":\n ctx.usesRuntime.add(\"hasattr\")\n return `hasattr(${args})`\n case \"setattr\":\n ctx.usesRuntime.add(\"setattr\")\n return `setattr(${args})`\n\n // itertools functions\n case \"chain\":\n ctx.usesRuntime.add(\"itertools/chain\")\n return `chain(${args})`\n case \"combinations\":\n ctx.usesRuntime.add(\"itertools/combinations\")\n return `combinations(${args})`\n case \"permutations\":\n ctx.usesRuntime.add(\"itertools/permutations\")\n return `permutations(${args})`\n case \"product\":\n ctx.usesRuntime.add(\"itertools/product\")\n return `product(${args})`\n case \"cycle\":\n ctx.usesRuntime.add(\"itertools/cycle\")\n return `cycle(${args})`\n case \"repeat\":\n ctx.usesRuntime.add(\"itertools/repeat\")\n return `repeat(${args})`\n case \"islice\":\n ctx.usesRuntime.add(\"itertools/islice\")\n return `islice(${args})`\n case \"takewhile\":\n ctx.usesRuntime.add(\"itertools/takeWhile\")\n return `takeWhile(${args})`\n case \"dropwhile\":\n ctx.usesRuntime.add(\"itertools/dropWhile\")\n return `dropWhile(${args})`\n case \"zip_longest\":\n ctx.usesRuntime.add(\"itertools/zipLongest\")\n return `zipLongest(${args})`\n case \"compress\":\n ctx.usesRuntime.add(\"itertools/compress\")\n return `compress(${args})`\n case \"filterfalse\":\n ctx.usesRuntime.add(\"itertools/filterFalse\")\n return `filterFalse(${args})`\n case \"accumulate\":\n ctx.usesRuntime.add(\"itertools/accumulate\")\n return `accumulate(${args})`\n case \"groupby\":\n ctx.usesRuntime.add(\"itertools/groupby\")\n return `groupby(${args})`\n case \"count\":\n ctx.usesRuntime.add(\"itertools/count\")\n return `count(${args})`\n case \"tee\":\n ctx.usesRuntime.add(\"itertools/tee\")\n return `tee(${args})`\n case \"pairwise\":\n ctx.usesRuntime.add(\"itertools/pairwise\")\n return `pairwise(${args})`\n case \"combinations_with_replacement\":\n ctx.usesRuntime.add(\"itertools/combinationsWithReplacement\")\n return `combinationsWithReplacement(${args})`\n\n // collections classes/functions\n case \"Counter\":\n ctx.usesRuntime.add(\"collections/Counter\")\n return `new Counter(${args})`\n case \"defaultdict\":\n ctx.usesRuntime.add(\"collections/defaultdict\")\n return `defaultdict(${args})`\n case \"deque\":\n ctx.usesRuntime.add(\"collections/deque\")\n return `new deque(${args})`\n\n // functools functions\n case \"partial\":\n ctx.usesRuntime.add(\"functools/partial\")\n return `partial(${args})`\n case \"reduce\":\n ctx.usesRuntime.add(\"functools/reduce\")\n return `reduce(${args})`\n case \"lru_cache\":\n ctx.usesRuntime.add(\"functools/lruCache\")\n return `lruCache(${args})`\n case \"cache\":\n ctx.usesRuntime.add(\"functools/cache\")\n return `cache(${args})`\n case \"wraps\":\n ctx.usesRuntime.add(\"functools/wraps\")\n return `wraps(${args})`\n case \"cmp_to_key\":\n ctx.usesRuntime.add(\"functools/cmpToKey\")\n return `cmpToKey(${args})`\n case \"total_ordering\":\n ctx.usesRuntime.add(\"functools/totalOrdering\")\n return `totalOrdering(${args})`\n\n // json functions\n case \"dumps\":\n ctx.usesRuntime.add(\"json/dumps\")\n return `dumps(${args})`\n case \"loads\":\n ctx.usesRuntime.add(\"json/loads\")\n return `loads(${args})`\n case \"dump\":\n ctx.usesRuntime.add(\"json/dump\")\n return `dump(${args})`\n case \"load\":\n ctx.usesRuntime.add(\"json/load\")\n return `load(${args})`\n\n // datetime classes\n case \"datetime\":\n ctx.usesRuntime.add(\"datetime/datetime\")\n return `new datetime(${args})`\n case \"date\":\n ctx.usesRuntime.add(\"datetime/date\")\n return `new date(${args})`\n case \"time\":\n ctx.usesRuntime.add(\"datetime/time\")\n return `new time(${args})`\n case \"timedelta\":\n ctx.usesRuntime.add(\"datetime/timedelta\")\n return `new timedelta(${args})`\n\n // string module\n case \"Template\":\n ctx.usesRuntime.add(\"string/Template\")\n return `new Template(${args})`\n case \"capwords\":\n ctx.usesRuntime.add(\"string/capWords\")\n return `capWords(${args})`\n\n /* v8 ignore next 3 -- pass-through for user-defined functions @preserve */\n default:\n // Regular function call\n return `${transformNode(callee, ctx)}(${args})`\n }\n}\n\n/**\n * Transform module-qualified function calls (math.sqrt(), random.randint(), etc.)\n * Returns null if no special mapping is needed.\n */\nfunction transformModuleCall(\n calleeName: string,\n args: string,\n ctx: TransformContext\n): string | null {\n // Parse module.function pattern\n const dotIndex = calleeName.indexOf(\".\")\n if (dotIndex === -1) return null\n\n const moduleName = calleeName.slice(0, dotIndex)\n const funcName = calleeName.slice(dotIndex + 1)\n\n // math module\n if (moduleName === \"math\") {\n // Constants (no args) - these need special handling as they're properties not functions\n const mathConstants: Record<string, string> = {\n pi: \"pi\",\n e: \"e\",\n tau: \"tau\",\n inf: \"inf\",\n nan: \"nan\"\n }\n if (funcName in mathConstants) {\n ctx.usesRuntime.add(`math/${funcName}`)\n return mathConstants[funcName] as string\n }\n\n // Functions\n ctx.usesRuntime.add(`math/${funcName}`)\n return `${funcName}(${args})`\n }\n\n // random module\n if (moduleName === \"random\") {\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`random/${jsName}`)\n return `${jsName}(${args})`\n }\n\n // json module\n if (moduleName === \"json\") {\n ctx.usesRuntime.add(`json/${funcName}`)\n return `${funcName}(${args})`\n }\n\n // os module\n if (moduleName === \"os\") {\n // os.path.* functions - keep as namespace since path is a nested module\n if (funcName.startsWith(\"path.\")) {\n const pathFuncName = funcName.slice(5)\n const jsPathFunc = toJsName(pathFuncName)\n ctx.usesRuntime.add(\"os/path\")\n return `path.${jsPathFunc}(${args})`\n }\n // os.* functions\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`os/${jsName}`)\n return `${jsName}(${args})`\n }\n\n // datetime module\n if (moduleName === \"datetime\") {\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`datetime/${jsName}`)\n // Classes need 'new'\n if ([\"datetime\", \"date\", \"time\", \"timedelta\"].includes(funcName)) {\n return `new ${jsName}(${args})`\n }\n return `${jsName}(${args})`\n }\n\n // re module\n if (moduleName === \"re\") {\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`re/${jsName}`)\n return `${jsName}(${args})`\n }\n\n // string module - constants and functions\n if (moduleName === \"string\") {\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`string/${jsName}`)\n // Template is a class\n if (funcName === \"Template\") {\n return `new Template(${args})`\n }\n return funcName.includes(\"(\") ? `${jsName}(${args})` : jsName\n }\n\n // functools module\n if (moduleName === \"functools\") {\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`functools/${jsName}`)\n return `${jsName}(${args})`\n }\n\n // itertools module (for itertools.chain() style calls)\n if (moduleName === \"itertools\") {\n const jsName = toJsName(funcName)\n ctx.usesRuntime.add(`itertools/${jsName}`)\n return `${jsName}(${args})`\n }\n\n // collections module\n if (moduleName === \"collections\") {\n ctx.usesRuntime.add(`collections/${funcName}`)\n // Classes need 'new'\n if ([\"Counter\", \"deque\"].includes(funcName)) {\n return `new ${funcName}(${args})`\n }\n return `${funcName}(${args})`\n }\n\n return null\n}\n\n/**\n * Transform Python method calls to JavaScript equivalents.\n * Returns null if no special mapping is needed.\n */\nfunction transformMethodCall(\n callee: SyntaxNode,\n args: string,\n ctx: TransformContext\n): string | null {\n const children = getChildren(callee)\n if (children.length < 2) return null\n\n const obj = children[0]\n const methodNode = children[children.length - 1]\n if (!obj || !methodNode) return null\n\n // Skip transformation for module-like paths (e.g., os.path.join)\n // These are MemberExpressions that look like module references, not method calls on values\n if (obj.name === \"MemberExpression\") {\n // Could be module.submodule.method() - don't transform\n return null\n }\n\n const objCode = transformNode(obj, ctx)\n const methodName = getNodeText(methodNode, ctx.source)\n\n // String methods\n switch (methodName) {\n // String case conversion\n case \"upper\":\n return `${objCode}.toUpperCase()`\n case \"lower\":\n return `${objCode}.toLowerCase()`\n case \"capitalize\":\n ctx.usesRuntime.add(\"string\")\n return `string.capitalize(${objCode})`\n case \"title\":\n ctx.usesRuntime.add(\"string\")\n return `string.title(${objCode})`\n case \"swapcase\":\n ctx.usesRuntime.add(\"string\")\n return `string.swapCase(${objCode})`\n case \"casefold\":\n return `${objCode}.toLowerCase()`\n\n // String whitespace\n case \"strip\":\n return args ? `${objCode}.split(${args}).join(\"\")` : `${objCode}.trim()`\n case \"lstrip\":\n return args\n ? `${objCode}.replace(new RegExp('^[' + ${args} + ']+'), '')`\n : `${objCode}.trimStart()`\n case \"rstrip\":\n return args\n ? `${objCode}.replace(new RegExp('[' + ${args} + ']+$'), '')`\n : `${objCode}.trimEnd()`\n\n // String search\n case \"startswith\":\n return `${objCode}.startsWith(${args})`\n case \"endswith\":\n return `${objCode}.endsWith(${args})`\n case \"find\":\n return `${objCode}.indexOf(${args})`\n case \"rfind\":\n return `${objCode}.lastIndexOf(${args})`\n case \"index\":\n ctx.usesRuntime.add(\"string\")\n return `string.index(${objCode}, ${args})`\n case \"rindex\":\n ctx.usesRuntime.add(\"string\")\n return `string.rIndex(${objCode}, ${args})`\n case \"count\":\n ctx.usesRuntime.add(\"string\")\n return `string.count(${objCode}, ${args})`\n\n // String testing\n case \"isalpha\":\n return `/^[a-zA-Z]+$/.test(${objCode})`\n case \"isdigit\":\n return `/^[0-9]+$/.test(${objCode})`\n case \"isalnum\":\n return `/^[a-zA-Z0-9]+$/.test(${objCode})`\n case \"isspace\":\n return `/^\\\\s+$/.test(${objCode})`\n case \"isupper\":\n return `(${objCode} === ${objCode}.toUpperCase() && ${objCode} !== ${objCode}.toLowerCase())`\n case \"islower\":\n return `(${objCode} === ${objCode}.toLowerCase() && ${objCode} !== ${objCode}.toUpperCase())`\n\n // String modification\n case \"replace\":\n ctx.usesRuntime.add(\"string\")\n return `string.replace(${objCode}, ${args})`\n case \"zfill\":\n ctx.usesRuntime.add(\"string\")\n return `string.zFill(${objCode}, ${args})`\n case \"center\":\n ctx.usesRuntime.add(\"string\")\n return `string.center(${objCode}, ${args})`\n case \"ljust\":\n return `${objCode}.padEnd(${args})`\n case \"rjust\":\n return `${objCode}.padStart(${args})`\n\n // String split/join - join is special: \"sep\".join(arr) -> arr.join(\"sep\")\n case \"join\":\n return `(${args}).join(${objCode})`\n case \"split\":\n return args ? `${objCode}.split(${args})` : `${objCode}.split(/\\\\s+/)`\n case \"rsplit\":\n ctx.usesRuntime.add(\"string\")\n return `string.rSplit(${objCode}, ${args})`\n case \"splitlines\":\n return `${objCode}.split(/\\\\r?\\\\n/)`\n case \"partition\":\n ctx.usesRuntime.add(\"string\")\n return `string.partition(${objCode}, ${args})`\n case \"rpartition\":\n ctx.usesRuntime.add(\"string\")\n return `string.rPartition(${objCode}, ${args})`\n\n // String format method\n case \"format\":\n ctx.usesRuntime.add(\"strFormat\")\n return `strFormat(${objCode}, ${args})`\n\n // List methods\n case \"append\":\n return `${objCode}.push(${args})`\n case \"extend\":\n return `${objCode}.push(...${args})`\n case \"insert\": {\n const insertArgs = args.split(\",\")\n const index = insertArgs[0] ?? \"0\"\n const value = insertArgs.slice(1).join(\",\")\n return `${objCode}.splice(${index}, 0, ${value})`\n }\n case \"remove\":\n ctx.usesRuntime.add(\"list\")\n return `list.remove(${objCode}, ${args})`\n case \"pop\":\n // pop() with no args works the same, pop(0) needs shift()\n if (!args) return `${objCode}.pop()`\n if (args.trim() === \"0\") return `${objCode}.shift()`\n return `${objCode}.splice(${args}, 1)[0]`\n case \"clear\":\n return `${objCode}.length = 0`\n case \"copy\":\n return `[...${objCode}]`\n case \"reverse\":\n return `${objCode}.reverse()`\n case \"sort\":\n ctx.usesRuntime.add(\"list\")\n return args ? `list.sort(${objCode}, ${args})` : `${objCode}.sort()`\n\n // Dict methods\n case \"keys\":\n return `Object.keys(${objCode})`\n case \"values\":\n return `Object.values(${objCode})`\n case \"items\":\n return `Object.entries(${objCode})`\n case \"get\":\n ctx.usesRuntime.add(\"dict\")\n return `dict.get(${objCode}, ${args})`\n case \"setdefault\":\n ctx.usesRuntime.add(\"dict\")\n return `dict.setdefault(${objCode}, ${args})`\n case \"update\":\n return `Object.assign(${objCode}, ${args})`\n case \"fromkeys\":\n ctx.usesRuntime.add(\"dict\")\n return `dict.fromkeys(${args})`\n\n // Set methods\n case \"add\":\n return `${objCode}.add(${args})`\n case \"discard\":\n return `${objCode}.delete(${args})`\n case \"union\":\n return `new Set([...${objCode}, ...${args}])`\n case \"intersection\":\n ctx.usesRuntime.add(\"set\")\n return `set.intersection(${objCode}, ${args})`\n case \"difference\":\n ctx.usesRuntime.add(\"set\")\n return `set.difference(${objCode}, ${args})`\n case \"symmetric_difference\":\n ctx.usesRuntime.add(\"set\")\n return `set.symmetricDifference(${objCode}, ${args})`\n case \"issubset\":\n ctx.usesRuntime.add(\"set\")\n return `set.issubset(${objCode}, ${args})`\n case \"issuperset\":\n ctx.usesRuntime.add(\"set\")\n return `set.issuperset(${objCode}, ${args})`\n\n /* v8 ignore next 2 -- unknown method, let caller handle @preserve */\n default:\n return null\n }\n}\n\nfunction transformArgList(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const items = children.filter((c) => c.name !== \"(\" && c.name !== \")\" && c.name !== \"ArgList\")\n\n // Check if this is a generator expression inside the arglist (e.g., sum(x for x in items))\n const hasForKeyword = items.some(\n (c) => c.name === \"for\" || (c.name === \"Keyword\" && getNodeText(c, ctx.source) === \"for\")\n )\n\n if (hasForKeyword) {\n // This is a generator expression - parse it\n const nonCommaItems = items.filter((c) => c.name !== \",\")\n const { outputExpr, clauses } = parseComprehensionClauses(nonCommaItems, ctx)\n return buildGeneratorChain(outputExpr, clauses)\n }\n\n // Process arguments, handling keyword arguments (name=value)\n const args: string[] = []\n const kwArgs: { name: string; value: string }[] = []\n let i = 0\n\n while (i < items.length) {\n const item = items[i]\n /* v8 ignore next 4 -- defensive: items from parser are never null @preserve */\n if (!item) {\n i++\n continue\n }\n\n // Skip commas\n if (item.name === \",\") {\n i++\n continue\n }\n\n // Handle spread operators: *args and **kwargs\n if (item.name === \"*\" || (item.name === \"ArithOp\" && getNodeText(item, ctx.source) === \"*\")) {\n const nextItem = items[i + 1]\n if (nextItem) {\n args.push(`...${transformNode(nextItem, ctx)}`)\n i += 2\n continue\n }\n }\n\n if (item.name === \"**\" || (item.name === \"ArithOp\" && getNodeText(item, ctx.source) === \"**\")) {\n const nextItem = items[i + 1]\n if (nextItem) {\n // **kwargs passes object as keyword arguments\n // In TypeScript, we pass the object directly (functions expecting **kwargs\n // are transpiled to accept a Record<string, unknown> parameter)\n kwArgs.push({ name: \"__spread__\", value: transformNode(nextItem, ctx) })\n i += 2\n continue\n }\n }\n\n // Check for keyword argument: VariableName AssignOp Value\n if (item.name === \"VariableName\") {\n const nextItem = items[i + 1]\n if (nextItem && nextItem.name === \"AssignOp\") {\n const valueItem = items[i + 2]\n if (valueItem) {\n const name = getNodeText(item, ctx.source)\n const value = transformNode(valueItem, ctx)\n kwArgs.push({ name, value })\n i += 3\n continue\n }\n }\n }\n\n // Regular positional argument\n args.push(transformNode(item, ctx))\n i++\n }\n\n // Combine positional and keyword arguments\n // Keyword arguments are passed as an options object: { key: value }\n if (kwArgs.length > 0) {\n // Separate spread kwargs from regular keyword args\n const spreadKwargs = kwArgs.filter((kw) => kw.name === \"__spread__\")\n const regularKwargs = kwArgs.filter((kw) => kw.name !== \"__spread__\")\n\n if (regularKwargs.length > 0 && spreadKwargs.length > 0) {\n // Combine regular kwargs with spread: { ...spread, key: value }\n const regularStr = regularKwargs.map((kw) => `${kw.name}: ${kw.value}`).join(\", \")\n const spreadStr = spreadKwargs.map((kw) => `...${kw.value}`).join(\", \")\n args.push(`{ ${spreadStr}, ${regularStr} }`)\n } else if (spreadKwargs.length > 0) {\n // Only spread kwargs - pass the object directly if single, or merge if multiple\n const firstSpread = spreadKwargs[0]\n if (spreadKwargs.length === 1 && firstSpread) {\n args.push(firstSpread.value)\n } else {\n const spreadStr = spreadKwargs.map((kw) => `...${kw.value}`).join(\", \")\n args.push(`{ ${spreadStr} }`)\n }\n } else {\n // Only regular kwargs\n const kwArgsStr = regularKwargs.map((kw) => `${kw.name}: ${kw.value}`).join(\", \")\n args.push(`{ ${kwArgsStr} }`)\n }\n }\n\n return args.join(\", \")\n}\n\nfunction transformMemberExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n if (children.length < 2) return getNodeText(node, ctx.source)\n\n const obj = children[0]\n if (!obj) return getNodeText(node, ctx.source)\n\n // Check if this is subscript syntax (arr[index]) or dot syntax (obj.attr)\n const hasOpenBracket = children.some((c) => c.name === \"[\")\n\n if (hasOpenBracket) {\n // Subscript access: arr[index]\n const objCode = transformNode(obj, ctx)\n\n // Check for slice syntax\n const text = getNodeText(node, ctx.source)\n if (text.includes(\":\")) {\n return transformSliceFromMember(obj, children, ctx)\n }\n\n // Simple index access\n const indexElements = children.filter((c) => c.name !== \"[\" && c.name !== \"]\" && c !== obj)\n const index = indexElements[0]\n\n if (!index) return `${objCode}[]`\n\n const indexCode = transformNode(index, ctx)\n\n // Check if the index is a negative number literal (for py.at() support)\n if (isNegativeIndexLiteral(index, ctx)) {\n ctx.usesRuntime.add(\"at\")\n return `at(${objCode}, ${indexCode})`\n }\n\n return `${objCode}[${indexCode}]`\n } else {\n // Dot access: obj.attr\n const prop = children[children.length - 1]\n if (!prop) return getNodeText(node, ctx.source)\n\n const objName = getNodeText(obj, ctx.source)\n const propName = getNodeText(prop, ctx.source)\n\n // Handle module constants (math.pi, math.e, etc.)\n if (objName === \"math\") {\n ctx.usesRuntime.add(`math/${propName}`)\n return propName\n }\n\n // os module constants (os.sep, os.path, etc.)\n if (objName === \"os\") {\n // os.path is a nested module, needs special handling\n if (propName === \"path\") {\n ctx.usesRuntime.add(\"os/path\")\n return \"path\"\n }\n ctx.usesRuntime.add(`os/${propName}`)\n return propName\n }\n\n // string module (constants like ascii_lowercase, digits, etc.)\n if (objName === \"string\") {\n ctx.usesRuntime.add(`string/${propName}`)\n return propName\n }\n\n // re module flags\n if (objName === \"re\") {\n ctx.usesRuntime.add(`re/${propName}`)\n return propName\n }\n\n // datetime module\n if (objName === \"datetime\") {\n ctx.usesRuntime.add(`datetime/${propName}`)\n return propName\n }\n\n const objCode = transformNode(obj, ctx)\n\n // Map Python special attributes to JavaScript equivalents\n const attrMap: Record<string, string> = {\n __name__: \"name\",\n __doc__: \"undefined\", // JS functions don't have docstrings\n __class__: \"constructor\",\n __dict__: \"this\" // Rough equivalent\n }\n\n const mappedProp = attrMap[propName] ?? propName\n return `${objCode}.${mappedProp}`\n }\n}\n\nfunction transformSliceFromMember(\n obj: SyntaxNode,\n children: SyntaxNode[],\n ctx: TransformContext\n): string {\n ctx.usesRuntime.add(\"slice\")\n const objCode = transformNode(obj, ctx)\n\n // Extract slice content between brackets\n const bracketStart = children.findIndex((c) => c.name === \"[\")\n const bracketEnd = children.findIndex((c) => c.name === \"]\")\n\n /* v8 ignore next 3 -- defensive: subscript always has brackets @preserve */\n if (bracketStart === -1 || bracketEnd === -1) {\n return `slice(${objCode})`\n }\n\n // Get all elements between brackets\n const sliceElements = children.slice(bracketStart + 1, bracketEnd)\n\n // Parse slice notation (start:stop:step)\n const colonIndices: number[] = []\n sliceElements.forEach((el, i) => {\n if (el.name === \":\") colonIndices.push(i)\n })\n\n // Build slice parts\n const parts: string[] = []\n let lastIdx = 0\n for (const colonIdx of colonIndices) {\n const beforeColon = sliceElements.slice(lastIdx, colonIdx)\n if (beforeColon.length > 0 && beforeColon[0]) {\n parts.push(transformNode(beforeColon[0], ctx))\n } else {\n parts.push(\"undefined\")\n }\n lastIdx = colonIdx + 1\n }\n // Handle remaining after last colon\n const afterLastColon = sliceElements.slice(lastIdx)\n if (afterLastColon.length > 0 && afterLastColon[0] && afterLastColon[0].name !== \":\") {\n parts.push(transformNode(afterLastColon[0], ctx))\n } else if (colonIndices.length > 0) {\n parts.push(\"undefined\")\n }\n\n // If no colons, it's not a slice\n /* v8 ignore next 3 -- defensive: slice detection already checked for colons @preserve */\n if (colonIndices.length === 0) {\n return `slice(${objCode})`\n }\n\n return `slice(${objCode}, ${parts.join(\", \")})`\n}\n\nfunction transformArrayExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const elements = children.filter((c) => c.name !== \"[\" && c.name !== \"]\" && c.name !== \",\")\n\n const elementCodes = elements.map((el) => transformNode(el, ctx))\n return `[${elementCodes.join(\", \")}]`\n}\n\nfunction transformDictionaryExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Filter out braces and commas\n const items = children.filter(\n (c) => c.name !== \"{\" && c.name !== \"}\" && c.name !== \",\" && c.name !== \":\"\n )\n\n // Check if all keys are valid TypeScript object literal keys (strings, numbers)\n // If any key is a complex expression (function call, etc.), use Map instead\n const keyNodes: SyntaxNode[] = []\n for (let i = 0; i < items.length; i += 2) {\n const key = items[i]\n if (key) keyNodes.push(key)\n }\n\n const allKeysValidForObjectLiteral = keyNodes.every(\n (key) => key.name === \"String\" || key.name === \"Number\" || key.name === \"VariableName\"\n )\n\n // If any key is not a valid object literal key (e.g., function call), use Map\n if (!allKeysValidForObjectLiteral) {\n const mapPairs: string[] = []\n for (let i = 0; i < items.length; i += 2) {\n const key = items[i]\n const value = items[i + 1]\n if (key && value) {\n const keyCode = transformNode(key, ctx)\n const valueCode = transformNode(value, ctx)\n mapPairs.push(`[${keyCode}, ${valueCode}]`)\n }\n }\n return `new Map([${mapPairs.join(\", \")}])`\n }\n\n // Standard object literal for simple keys\n const pairs: string[] = []\n for (let i = 0; i < items.length; i += 2) {\n const key = items[i]\n const value = items[i + 1]\n\n if (key && value) {\n const keyCode = transformNode(key, ctx)\n const valueCode = transformNode(value, ctx)\n\n // Check if key needs to be computed\n if (key.name === \"VariableName\") {\n pairs.push(`[${keyCode}]: ${valueCode}`)\n } else {\n pairs.push(`${keyCode}: ${valueCode}`)\n }\n }\n }\n\n return `{ ${pairs.join(\", \")} }`\n}\n\nfunction transformTupleExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const elements = children.filter((c) => c.name !== \"(\" && c.name !== \")\" && c.name !== \",\")\n\n ctx.usesRuntime.add(\"tuple\")\n const elementCodes = elements.map((el) => transformNode(el, ctx))\n return `tuple(${elementCodes.join(\", \")})`\n}\n\nfunction isNegativeIndexLiteral(node: SyntaxNode, ctx: TransformContext): boolean {\n // Check for a UnaryExpression with - operator and a Number\n if (node.name === \"UnaryExpression\") {\n const children = getChildren(node)\n const hasMinusOp = children.some(\n (c) => c.name === \"ArithOp\" && getNodeText(c, ctx.source) === \"-\"\n )\n const hasNumber = children.some((c) => c.name === \"Number\")\n return hasMinusOp && hasNumber\n }\n return false\n}\n\nfunction transformIfStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const parts: string[] = []\n\n let i = 0\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n if (\n child.name === \"if\" ||\n (child.name === \"Keyword\" && getNodeText(child, ctx.source) === \"if\")\n ) {\n // Main if\n const condition = children[i + 1]\n const body = children.find((c, idx) => idx > i && c.name === \"Body\")\n\n if (condition && body) {\n const condCode = transformNode(condition, ctx)\n const bodyCode = transformBody(body, ctx)\n parts.push(`if (${condCode}) {\\n${bodyCode}\\n}`)\n }\n } else if (\n child.name === \"elif\" ||\n (child.name === \"Keyword\" && getNodeText(child, ctx.source) === \"elif\")\n ) {\n const condition = children[i + 1]\n const body = children.find((c, idx) => idx > i + 1 && c.name === \"Body\")\n\n if (condition && body) {\n const condCode = transformNode(condition, ctx)\n const bodyCode = transformBody(body, ctx)\n parts.push(` else if (${condCode}) {\\n${bodyCode}\\n}`)\n }\n } else if (\n child.name === \"else\" ||\n (child.name === \"Keyword\" && getNodeText(child, ctx.source) === \"else\")\n ) {\n const body = children.find((c, idx) => idx > i && c.name === \"Body\")\n\n if (body) {\n const bodyCode = transformBody(body, ctx)\n parts.push(` else {\\n${bodyCode}\\n}`)\n }\n }\n i++\n }\n\n return parts.join(\"\")\n}\n\nfunction transformWhileStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const condition = children.find(\n (c) => c.name !== \"while\" && c.name !== \"Body\" && c.name !== \"Keyword\" && c.name !== \":\"\n )\n const body = children.find((c) => c.name === \"Body\")\n\n if (!condition || !body) return getNodeText(node, ctx.source)\n\n const condCode = transformNode(condition, ctx)\n const bodyCode = transformBody(body, ctx)\n\n return `while (${condCode}) {\\n${bodyCode}\\n}`\n}\n\nfunction transformMatchStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Find the subject (what we're matching) and the body (containing clauses)\n let subject: SyntaxNode | null = null\n let matchBody: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"match\" || child.name === \":\") continue\n if (child.name === \"MatchBody\") {\n matchBody = child\n } else if (!subject) {\n subject = child\n }\n }\n\n if (!subject || !matchBody) return getNodeText(node, ctx.source)\n\n const subjectCode = transformNode(subject, ctx)\n\n // Collect all clauses and check if any have complex patterns\n const matchBodyChildren = getChildren(matchBody)\n const clauseNodes = matchBodyChildren.filter((c) => c.name === \"MatchClause\")\n\n const hasComplexPatterns = clauseNodes.some((clause) => {\n const clauseChildren = getChildren(clause)\n const pattern = clauseChildren.find(\n (c) => c.name !== \"case\" && c.name !== \":\" && c.name !== \"Body\" && c.name !== \"Guard\"\n )\n const hasGuard = clauseChildren.some((c) => c.name === \"Guard\")\n\n if (hasGuard) return true\n if (!pattern) return false\n\n // Complex patterns that need if/else\n if (\n pattern.name === \"SequencePattern\" ||\n pattern.name === \"MappingPattern\" ||\n pattern.name === \"ClassPattern\" ||\n pattern.name === \"AsPattern\"\n ) {\n return true\n }\n\n // OrPattern with complex sub-patterns needs if/else\n if (pattern.name === \"OrPattern\") {\n const orChildren = getChildren(pattern)\n return orChildren.some(\n (c) =>\n c.name === \"SequencePattern\" ||\n c.name === \"MappingPattern\" ||\n c.name === \"ClassPattern\" ||\n c.name === \"AsPattern\"\n )\n }\n\n return false\n })\n\n if (hasComplexPatterns) {\n // Use if/else chain for complex patterns\n return transformMatchAsIfElse(subjectCode, clauseNodes, ctx)\n }\n\n // Use switch for simple patterns\n const clauses = transformMatchBody(matchBody, ctx)\n return `switch (${subjectCode}) {\\n${clauses}\\n}`\n}\n\nfunction transformMatchAsIfElse(\n subjectCode: string,\n clauses: SyntaxNode[],\n ctx: TransformContext\n): string {\n const parts: string[] = []\n const indent = \" \".repeat(ctx.indentLevel)\n\n for (let i = 0; i < clauses.length; i++) {\n const clause = clauses[i]\n if (!clause) continue\n\n const children = getChildren(clause)\n\n let pattern: SyntaxNode | null = null\n let body: SyntaxNode | null = null\n let guard: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"case\" || child.name === \":\") continue\n if (child.name === \"Body\") {\n body = child\n } else if (child.name === \"Guard\") {\n guard = child\n } else if (!pattern) {\n pattern = child\n }\n }\n\n if (!pattern || !body) continue\n\n ctx.indentLevel++\n const bodyCode = transformBody(body, ctx)\n ctx.indentLevel--\n\n const patternText = getNodeText(pattern, ctx.source)\n const isWildcard =\n patternText === \"_\" || (pattern.name === \"CapturePattern\" && patternText === \"_\")\n\n // Extract guard condition if present\n let guardCondition: string | null = null\n if (guard) {\n const guardChildren = getChildren(guard)\n const guardExpr = guardChildren.find((c) => c.name !== \"if\")\n if (guardExpr) {\n let guardCode = transformNode(guardExpr, ctx)\n // If pattern is a CapturePattern, substitute the variable with the subject in the guard\n if (pattern.name === \"CapturePattern\") {\n const captureVar = getNodeText(pattern, ctx.source)\n if (captureVar !== \"_\") {\n // Replace the captured variable with the subject in the guard condition\n // Use word boundary regex to avoid partial matches\n const varRegex = new RegExp(`\\\\b${captureVar}\\\\b`, \"g\")\n guardCode = guardCode.replace(varRegex, subjectCode)\n }\n }\n guardCondition = guardCode\n }\n }\n\n if (isWildcard && !guardCondition) {\n // Wildcard/default case without guard\n if (i === 0) {\n parts.push(`${indent}${bodyCode.trim()}`)\n } else {\n parts.push(` else {\\n${indent} ${bodyCode.trim()}\\n${indent}}`)\n }\n } else {\n const { condition, bindings } = transformComplexPattern(pattern, subjectCode, ctx)\n\n // Combine pattern condition with guard condition\n let fullCondition = condition\n if (guardCondition) {\n if (condition === \"true\") {\n fullCondition = guardCondition\n } else {\n fullCondition = `${condition} && ${guardCondition}`\n }\n }\n\n const keyword = i === 0 ? \"if\" : \" else if\"\n const bindingsCode =\n bindings.length > 0 ? `\\n${indent} ${bindings.join(`\\n${indent} `)}` : \"\"\n\n parts.push(\n `${keyword} (${fullCondition}) {${bindingsCode}\\n${indent} ${bodyCode.trim()}\\n${indent}}`\n )\n }\n }\n\n return parts.join(\"\")\n}\n\ninterface PatternResult {\n condition: string\n bindings: string[]\n}\n\nfunction transformComplexPattern(\n pattern: SyntaxNode,\n subject: string,\n ctx: TransformContext\n): PatternResult {\n switch (pattern.name) {\n case \"SequencePattern\":\n return transformSequencePattern(pattern, subject, ctx)\n case \"MappingPattern\":\n return transformMappingPattern(pattern, subject, ctx)\n case \"ClassPattern\":\n return transformClassPattern(pattern, subject, ctx)\n case \"OrPattern\":\n return transformOrPattern(pattern, subject, ctx)\n case \"AsPattern\":\n return transformAsPattern(pattern, subject, ctx)\n case \"LiteralPattern\": {\n const children = getChildren(pattern)\n const literal = children[0]\n const value = literal ? transformNode(literal, ctx) : getNodeText(pattern, ctx.source)\n return { condition: `${subject} === ${value}`, bindings: [] }\n }\n case \"CapturePattern\": {\n const varName = getNodeText(pattern, ctx.source)\n if (varName === \"_\") {\n return { condition: \"true\", bindings: [] }\n }\n return { condition: \"true\", bindings: [`const ${varName} = ${subject};`] }\n }\n /* v8 ignore next 3 -- fallback for unknown match patterns @preserve */\n default:\n // Fallback for unknown patterns\n return { condition: `${subject} === ${getNodeText(pattern, ctx.source)}`, bindings: [] }\n }\n}\n\nfunction transformSequencePattern(\n pattern: SyntaxNode,\n subject: string,\n ctx: TransformContext\n): PatternResult {\n const children = getChildren(pattern)\n const elements = children.filter((c) => c.name !== \"[\" && c.name !== \"]\" && c.name !== \",\")\n\n const conditions: string[] = [`Array.isArray(${subject})`]\n const bindings: string[] = []\n\n // Check for exact length (unless there's a starred pattern)\n const hasStarred = elements.some((e) => e.name === \"StarPattern\")\n if (!hasStarred) {\n conditions.push(`${subject}.length === ${String(elements.length)}`)\n }\n\n // Process each element\n elements.forEach((elem, idx) => {\n const idxStr = String(idx)\n if (elem.name === \"CapturePattern\") {\n const varName = getNodeText(elem, ctx.source)\n if (varName !== \"_\") {\n bindings.push(`const ${varName} = ${subject}[${idxStr}];`)\n }\n } else if (elem.name === \"LiteralPattern\") {\n const childNodes = getChildren(elem)\n const literal = childNodes[0]\n const value = literal ? transformNode(literal, ctx) : getNodeText(elem, ctx.source)\n conditions.push(`${subject}[${idxStr}] === ${value}`)\n }\n })\n\n return { condition: conditions.join(\" && \"), bindings }\n}\n\nfunction transformMappingPattern(\n pattern: SyntaxNode,\n subject: string,\n ctx: TransformContext\n): PatternResult {\n const children = getChildren(pattern)\n const conditions: string[] = [`typeof ${subject} === \"object\"`, `${subject} !== null`]\n const bindings: string[] = []\n\n // Process key-value pairs\n let i = 0\n while (i < children.length) {\n const child = children[i]\n if (child?.name === \"LiteralPattern\" || child?.name === \"String\") {\n // This is a key\n const keyNode = child.name === \"LiteralPattern\" ? getChildren(child)[0] : child\n const key = keyNode ? transformNode(keyNode, ctx) : getNodeText(child, ctx.source)\n\n // Look for the colon and then the value pattern\n const valuePattern = children[i + 2]\n if (children[i + 1]?.name === \":\" && valuePattern) {\n conditions.push(`${key} in ${subject}`)\n\n if (valuePattern.name === \"CapturePattern\") {\n const varName = getNodeText(valuePattern, ctx.source)\n if (varName !== \"_\") {\n bindings.push(`const ${varName} = ${subject}[${key}];`)\n }\n } else if (valuePattern.name === \"LiteralPattern\") {\n const valueChildren = getChildren(valuePattern)\n const literal = valueChildren[0]\n const value = literal\n ? transformNode(literal, ctx)\n : getNodeText(valuePattern, ctx.source)\n conditions.push(`${subject}[${key}] === ${value}`)\n }\n i += 3\n continue\n }\n }\n i++\n }\n\n return { condition: conditions.join(\" && \"), bindings }\n}\n\nfunction transformClassPattern(\n pattern: SyntaxNode,\n subject: string,\n ctx: TransformContext\n): PatternResult {\n const children = getChildren(pattern)\n const className = children.find((c) => c.name === \"VariableName\")\n const argList = children.find((c) => c.name === \"PatternArgList\")\n\n const conditions: string[] = []\n const bindings: string[] = []\n\n if (className) {\n const classNameText = getNodeText(className, ctx.source)\n conditions.push(`${subject} instanceof ${classNameText}`)\n }\n\n if (argList) {\n const argChildren = getChildren(argList)\n for (const arg of argChildren) {\n if (arg.name === \"KeywordPattern\") {\n const kwChildren = getChildren(arg)\n const attrName = kwChildren.find((c) => c.name === \"VariableName\")\n const valuePattern = kwChildren.find(\n (c) => c.name === \"LiteralPattern\" || c.name === \"CapturePattern\"\n )\n\n if (attrName && valuePattern) {\n const attrNameText = getNodeText(attrName, ctx.source)\n\n if (valuePattern.name === \"LiteralPattern\") {\n const litChildren = getChildren(valuePattern)\n const literal = litChildren[0]\n const value = literal\n ? transformNode(literal, ctx)\n : getNodeText(valuePattern, ctx.source)\n conditions.push(`${subject}.${attrNameText} === ${value}`)\n } else if (valuePattern.name === \"CapturePattern\") {\n const varName = getNodeText(valuePattern, ctx.source)\n if (varName !== \"_\") {\n bindings.push(`const ${varName} = ${subject}.${attrNameText};`)\n }\n }\n }\n }\n }\n }\n\n return { condition: conditions.length > 0 ? conditions.join(\" && \") : \"true\", bindings }\n}\n\nfunction transformOrPattern(\n pattern: SyntaxNode,\n subject: string,\n ctx: TransformContext\n): PatternResult {\n const children = getChildren(pattern)\n // Filter out LogicOp (|) tokens, keep only actual patterns\n const subPatterns = children.filter((c) => c.name !== \"LogicOp\")\n\n const conditions: string[] = []\n // OR patterns cannot have bindings (each alternative must bind the same variables)\n // For simplicity, we just create OR conditions\n for (const subPattern of subPatterns) {\n const { condition } = transformComplexPattern(subPattern, subject, ctx)\n conditions.push(condition)\n }\n\n return { condition: conditions.join(\" || \"), bindings: [] }\n}\n\nfunction transformAsPattern(\n pattern: SyntaxNode,\n subject: string,\n ctx: TransformContext\n): PatternResult {\n const children = getChildren(pattern)\n // AsPattern: [inner_pattern, \"as\", VariableName]\n const innerPattern = children.find(\n (c) => c.name !== \"as\" && c.name !== \"VariableName\" && c.name !== \"⚠\"\n )\n const asName = children.find((c) => c.name === \"VariableName\")\n\n if (!innerPattern) {\n return { condition: \"true\", bindings: [] }\n }\n\n // Transform the inner pattern\n const { condition, bindings } = transformComplexPattern(innerPattern, subject, ctx)\n\n // Add the \"as\" binding for the whole subject\n if (asName) {\n const varName = getNodeText(asName, ctx.source)\n bindings.push(`const ${varName} = ${subject};`)\n }\n\n return { condition, bindings }\n}\n\nfunction transformMatchBody(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const clauses: string[] = []\n const indent = \" \".repeat(ctx.indentLevel + 1)\n\n for (const child of children) {\n if (child.name === \"MatchClause\") {\n clauses.push(transformMatchClause(child, ctx, indent))\n }\n }\n\n return clauses.join(\"\\n\")\n}\n\nfunction transformMatchClause(node: SyntaxNode, ctx: TransformContext, indent: string): string {\n const children = getChildren(node)\n\n let pattern: SyntaxNode | null = null\n let body: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"case\" || child.name === \":\") continue\n if (child.name === \"Body\") {\n body = child\n } else if (!pattern) {\n pattern = child\n }\n }\n\n if (!pattern || !body) return \"\"\n\n const patternText = getNodeText(pattern, ctx.source)\n\n // Increase indent for body content\n ctx.indentLevel++\n const bodyCode = transformBody(body, ctx)\n ctx.indentLevel--\n\n const bodyIndent = indent + \" \"\n\n // Handle wildcard pattern (_) as default\n if (patternText === \"_\" || pattern.name === \"CapturePattern\") {\n const captureVar = getNodeText(pattern, ctx.source)\n if (captureVar === \"_\") {\n return `${indent}default:\\n${bodyIndent}${bodyCode.trim()}\\n${bodyIndent}break;`\n }\n }\n\n // Handle OR patterns with multiple case labels\n if (pattern.name === \"OrPattern\") {\n const orChildren = getChildren(pattern)\n const subPatterns = orChildren.filter((c) => c.name !== \"LogicOp\")\n const caseLabels = subPatterns.map((p) => {\n const caseValue = transformMatchPatternSimple(p, ctx)\n return `${indent}case ${caseValue}:`\n })\n // Join all case labels, then add the body after the last one\n return `${caseLabels.join(\"\\n\")}\\n${bodyIndent}${bodyCode.trim()}\\n${bodyIndent}break;`\n }\n\n // Handle literal patterns\n const caseValue = transformMatchPatternSimple(pattern, ctx)\n return `${indent}case ${caseValue}:\\n${bodyIndent}${bodyCode.trim()}\\n${bodyIndent}break;`\n}\n\nfunction transformMatchPatternSimple(node: SyntaxNode, ctx: TransformContext): string {\n switch (node.name) {\n case \"LiteralPattern\": {\n const children = getChildren(node)\n const literal = children[0]\n if (literal) {\n return transformNode(literal, ctx)\n }\n return getNodeText(node, ctx.source)\n }\n case \"CapturePattern\":\n // Variable capture - in switch this would be default\n return getNodeText(node, ctx.source)\n /* v8 ignore next 2 -- fallback for unknown case patterns @preserve */\n default:\n return getNodeText(node, ctx.source)\n }\n}\n\nfunction transformForStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Check for async for\n const isAsync = children.some(\n (c) => c.name === \"async\" || (c.name === \"Keyword\" && getNodeText(c, ctx.source) === \"async\")\n )\n\n // Find the variables (between 'for' and 'in'), iterable (after 'in'), and body\n const varNodes: SyntaxNode[] = []\n let iterableNode: SyntaxNode | null = null\n let bodyNode: SyntaxNode | null = null\n\n let foundFor = false\n let foundIn = false\n\n for (const child of children) {\n if (\n child.name === \"for\" ||\n (child.name === \"Keyword\" && getNodeText(child, ctx.source) === \"for\")\n ) {\n foundFor = true\n } else if (\n child.name === \"in\" ||\n (child.name === \"Keyword\" && getNodeText(child, ctx.source) === \"in\")\n ) {\n foundIn = true\n } else if (child.name === \"Body\") {\n bodyNode = child\n } else if (\n child.name !== \":\" &&\n child.name !== \"Keyword\" &&\n child.name !== \",\" &&\n child.name !== \"async\"\n ) {\n if (foundFor && !foundIn) {\n varNodes.push(child)\n } else if (foundIn && !bodyNode) {\n iterableNode = child\n }\n }\n }\n\n if (varNodes.length === 0 || !iterableNode || !bodyNode) {\n return getNodeText(node, ctx.source)\n }\n\n // Build the variable pattern\n let varCode: string\n if (varNodes.length === 1 && varNodes[0]) {\n // Single variable\n varCode = transformNode(varNodes[0], ctx)\n } else {\n // Tuple unpacking: [x, y] or [i, [a, b]]\n varCode = \"[\" + varNodes.map((v) => transformForLoopVar(v, ctx)).join(\", \") + \"]\"\n }\n\n let iterableCode = transformNode(iterableNode, ctx)\n const bodyCode = transformBody(bodyNode, ctx)\n\n // Wrap plain variable names with py.iter() to handle dict iteration\n // Arrays/strings remain iterable, but dicts need Object.keys()\n if (iterableNode.name === \"VariableName\" && !isAsync) {\n ctx.usesRuntime.add(\"iter\")\n iterableCode = `iter(${iterableCode})`\n }\n\n // Use 'for await' for async iteration\n const forKeyword = isAsync ? \"for await\" : \"for\"\n return `${forKeyword} (const ${varCode} of ${iterableCode}) {\\n${bodyCode}\\n}`\n}\n\nfunction transformForLoopVar(node: SyntaxNode, ctx: TransformContext): string {\n if (node.name === \"VariableName\") {\n return getNodeText(node, ctx.source)\n } else if (node.name === \"TupleExpression\") {\n // Nested tuple: (a, b) -> [a, b]\n const children = getChildren(node)\n const elements = children.filter((c) => c.name !== \"(\" && c.name !== \")\" && c.name !== \",\")\n return \"[\" + elements.map((e) => transformForLoopVar(e, ctx)).join(\", \") + \"]\"\n }\n return transformNode(node, ctx)\n}\n\nfunction transformTryStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const baseIndent = \" \".repeat(ctx.indentLevel)\n\n let tryBody: SyntaxNode | null = null\n const exceptBodies: { type: string | null; varName: string | null; body: SyntaxNode }[] = []\n let finallyBody: SyntaxNode | null = null\n\n let i = 0\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n if (child.name === \"try\") {\n // Next Body is the try block\n const nextBody = children[i + 1]\n if (nextBody && nextBody.name === \"Body\") {\n tryBody = nextBody\n i += 2\n continue\n }\n }\n\n if (child.name === \"except\") {\n // Parse except clause: except [Type] [as name]:\n let exceptType: string | null = null\n let exceptVar: string | null = null\n let exceptBody: SyntaxNode | null = null\n\n let j = i + 1\n while (j < children.length) {\n const next = children[j]\n if (!next) break\n\n if (next.name === \"Body\") {\n exceptBody = next\n j++\n break\n } else if (next.name === \"VariableName\") {\n if (exceptType === null) {\n exceptType = getNodeText(next, ctx.source)\n } else {\n exceptVar = getNodeText(next, ctx.source)\n }\n } else if (next.name === \"as\") {\n // skip 'as' keyword\n } else if (next.name === \"except\" || next.name === \"finally\") {\n break\n }\n j++\n }\n\n if (exceptBody) {\n exceptBodies.push({ type: exceptType, varName: exceptVar, body: exceptBody })\n }\n i = j\n continue\n }\n\n if (child.name === \"finally\") {\n // Next Body is the finally block\n const nextBody = children[i + 1]\n if (nextBody && nextBody.name === \"Body\") {\n finallyBody = nextBody\n i += 2\n continue\n }\n }\n\n i++\n }\n\n if (!tryBody) {\n return getNodeText(node, ctx.source)\n }\n\n // Build the try/catch/finally\n const tryCode = transformBody(tryBody, ctx)\n let result = `try {\\n${tryCode}\\n${baseIndent}}`\n\n // Transform except clauses to catch\n if (exceptBodies.length > 0) {\n const firstExcept = exceptBodies[0]\n if (firstExcept) {\n const catchVar = firstExcept.varName || \"e\"\n const catchBody = transformBody(firstExcept.body, ctx)\n\n if (exceptBodies.length === 1 && !firstExcept.type) {\n // Simple catch-all\n result += ` catch (${catchVar}) {\\n${catchBody}\\n${baseIndent}}`\n } else if (exceptBodies.length === 1) {\n // Single typed except - we still catch everything but could add instanceof check\n result += ` catch (${catchVar}) {\\n${catchBody}\\n${baseIndent}}`\n } else {\n // Multiple except clauses - generate if/else chain\n const innerIndent = \" \".repeat(ctx.indentLevel + 1)\n let catchBodyCode = \"\"\n for (let idx = 0; idx < exceptBodies.length; idx++) {\n const exc = exceptBodies[idx]\n if (!exc) continue\n const excBodyCode = transformBody(exc.body, ctx)\n const excVar = exc.varName || catchVar\n\n if (exc.type) {\n const condition = idx === 0 ? \"if\" : \"} else if\"\n const mappedType = mapExceptionType(exc.type)\n catchBodyCode += `${innerIndent}${condition} (${catchVar} instanceof ${mappedType}) {\\n`\n if (excVar !== catchVar) {\n catchBodyCode += `${innerIndent} const ${excVar} = ${catchVar};\\n`\n }\n catchBodyCode += excBodyCode\n .split(\"\\n\")\n .map((line) => \" \" + line)\n .join(\"\\n\")\n catchBodyCode += \"\\n\"\n } else {\n // Catch-all (except without type)\n if (idx > 0) {\n catchBodyCode += `${innerIndent}} else {\\n`\n }\n catchBodyCode += excBodyCode\n .split(\"\\n\")\n .map((line) => \" \" + line)\n .join(\"\\n\")\n catchBodyCode += \"\\n\"\n }\n }\n if (exceptBodies.some((e) => e.type)) {\n catchBodyCode += `${innerIndent}}`\n }\n result += ` catch (${catchVar}) {\\n${catchBodyCode}${baseIndent}}`\n }\n }\n }\n\n // Add finally block\n if (finallyBody) {\n const finallyCode = transformBody(finallyBody, ctx)\n result += ` finally {\\n${finallyCode}\\n${baseIndent}}`\n }\n\n return result\n}\n\nfunction mapExceptionType(pythonType: string): string {\n // Map Python exception types to JavaScript equivalents\n const mapping: Record<string, string> = {\n Exception: \"Error\",\n BaseException: \"Error\",\n ValueError: \"Error\",\n TypeError: \"TypeError\",\n KeyError: \"Error\",\n IndexError: \"RangeError\",\n AttributeError: \"Error\",\n RuntimeError: \"Error\",\n StopIteration: \"Error\",\n ZeroDivisionError: \"Error\",\n FileNotFoundError: \"Error\",\n IOError: \"Error\",\n OSError: \"Error\",\n NameError: \"ReferenceError\",\n SyntaxError: \"SyntaxError\"\n }\n return mapping[pythonType] || \"Error\"\n}\n\nfunction transformRaiseStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Find the expression after 'raise'\n const exprNode = children.find((c) => c.name !== \"raise\")\n\n if (!exprNode) {\n // raise without argument - re-throw\n return \"throw\"\n }\n\n const expr = transformNode(exprNode, ctx)\n\n // Check if it's a call to an exception type\n if (exprNode.name === \"CallExpression\") {\n const callChildren = getChildren(exprNode)\n const funcName = callChildren.find((c) => c.name === \"VariableName\")\n if (funcName) {\n const name = getNodeText(funcName, ctx.source)\n // Map Python exception to Error\n if (isExceptionType(name)) {\n // Extract message from args\n const argList = callChildren.find((c) => c.name === \"ArgList\")\n if (argList) {\n const args = getChildren(argList).filter(\n (c) => c.name !== \"(\" && c.name !== \")\" && c.name !== \",\"\n )\n if (args.length > 0 && args[0]) {\n const message = transformNode(args[0], ctx)\n return `throw new Error(${message})`\n }\n }\n return \"throw new Error()\"\n }\n }\n }\n\n // For other expressions, wrap in Error if it's a string\n if (exprNode.name === \"String\") {\n return `throw new Error(${expr})`\n }\n\n return `throw ${expr}`\n}\n\nfunction isExceptionType(name: string): boolean {\n const exceptionTypes = [\n \"Exception\",\n \"BaseException\",\n \"ValueError\",\n \"TypeError\",\n \"KeyError\",\n \"IndexError\",\n \"AttributeError\",\n \"RuntimeError\",\n \"StopIteration\",\n \"ZeroDivisionError\",\n \"FileNotFoundError\",\n \"IOError\",\n \"OSError\",\n \"NameError\",\n \"SyntaxError\",\n \"AssertionError\",\n \"NotImplementedError\",\n \"ImportError\",\n \"ModuleNotFoundError\"\n ]\n return exceptionTypes.includes(name)\n}\n\nfunction transformImportStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Determine if this is a \"from X import Y\" or \"import X\" style\n const hasFrom = children.some((c) => c.name === \"from\")\n\n let importCode: string\n if (hasFrom) {\n importCode = transformFromImport(children, ctx)\n } else {\n importCode = transformSimpleImport(children, ctx)\n }\n\n // If we're inside a function body, hoist the import to module level\n if (ctx.insideFunctionBody > 0 && importCode) {\n ctx.hoistedImports.push(importCode)\n return \"\" // Don't include the import in the function body\n }\n\n return importCode\n}\n\nfunction transformSimpleImport(children: SyntaxNode[], ctx: TransformContext): string {\n // import os -> import * as os from \"os\"\n // import numpy as np -> import * as np from \"numpy\"\n\n const names: { module: string; alias: string | null }[] = []\n let i = 0\n\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n if (child.name === \"import\" || child.name === \",\") {\n i++\n continue\n }\n\n if (child.name === \"VariableName\") {\n const moduleName = getNodeText(child, ctx.source)\n let alias: string | null = null\n\n // Check for \"as\" alias\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"as\") {\n const aliasChild = children[i + 2]\n if (aliasChild && aliasChild.name === \"VariableName\") {\n alias = getNodeText(aliasChild, ctx.source)\n i += 3\n names.push({ module: moduleName, alias })\n continue\n }\n }\n\n names.push({ module: moduleName, alias: null })\n i++\n continue\n }\n\n i++\n }\n\n // Filter out runtime modules (provided by py runtime) and typing modules\n const filteredNames = names.filter(\n ({ module }) => !RUNTIME_MODULES.has(module) && !TYPING_MODULES.has(module)\n )\n\n if (filteredNames.length === 0) {\n return \"\"\n }\n\n // Generate import statements\n return filteredNames\n .map(({ module, alias }) => {\n const importName = alias || module\n return `import * as ${importName} from \"${module}\"`\n })\n .join(\"\\n\")\n}\n\n/** Modules whose imports should be ignored (type-only modules) */\nconst TYPING_MODULES = new Set([\n \"typing\",\n \"typing_extensions\",\n \"collections.abc\",\n \"__future__\",\n \"abc\"\n])\n\n/** Runtime modules whose imports should be stripped (provided by runtime) */\nconst RUNTIME_MODULES = new Set([\n \"itertools\",\n \"collections\",\n \"math\",\n \"random\",\n \"json\",\n \"os\",\n \"datetime\",\n \"re\",\n \"string\",\n \"functools\"\n])\n\nfunction transformFromImport(children: SyntaxNode[], ctx: TransformContext): string {\n // from os import path -> import { path } from \"os\"\n // from os import path, getcwd -> import { path, getcwd } from \"os\"\n // from collections import defaultdict as dd -> import { defaultdict as dd } from \"collections\"\n // from math import * -> import * from \"math\"\n // from . import utils -> import * as utils from \"./utils\"\n // from ..utils import helper -> import { helper } from \"../utils\"\n\n // First pass: find the module name to check if it's a typing module\n let preCheckModule = \"\"\n for (const child of children) {\n if (child.name === \"VariableName\") {\n const prevChild = children[children.indexOf(child) - 1]\n // Check if this is after \"from\" (not after \"import\")\n if (prevChild?.name === \"from\" || prevChild?.name === \".\") {\n preCheckModule = getNodeText(child, ctx.source)\n break\n }\n }\n }\n\n // Strip typing module imports entirely - TypeScript has its own type system\n if (TYPING_MODULES.has(preCheckModule)) {\n return \"\"\n }\n\n // Strip runtime module imports - provided by py runtime\n if (RUNTIME_MODULES.has(preCheckModule)) {\n return \"\"\n }\n\n let moduleName = \"\"\n let relativeDots = 0\n const imports: { name: string; alias: string | null }[] = []\n let hasStar = false\n\n let phase: \"from\" | \"module\" | \"import\" | \"names\" = \"from\"\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n if (!child) continue\n\n if (child.name === \"from\") {\n phase = \"module\"\n continue\n }\n\n if (child.name === \".\") {\n relativeDots++\n continue\n }\n\n if (child.name === \"Ellipsis\") {\n // ... is parsed as Ellipsis, treat as 3 dots\n relativeDots += 3\n continue\n }\n\n if (child.name === \"import\") {\n phase = \"names\"\n continue\n }\n\n if (phase === \"module\" && child.name === \"VariableName\") {\n moduleName = getNodeText(child, ctx.source)\n continue\n }\n\n if (phase === \"names\") {\n if (child.name === \"*\") {\n hasStar = true\n continue\n }\n\n if (child.name === \"VariableName\") {\n const name = getNodeText(child, ctx.source)\n\n // Check for \"as\" alias\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"as\") {\n const aliasChild = children[i + 2]\n if (aliasChild && aliasChild.name === \"VariableName\") {\n imports.push({ name, alias: getNodeText(aliasChild, ctx.source) })\n i += 2\n continue\n }\n }\n\n imports.push({ name, alias: null })\n continue\n }\n\n if (child.name === \",\") {\n continue\n }\n }\n }\n\n // Build module path\n let modulePath = \"\"\n if (relativeDots > 0) {\n // Relative import\n if (relativeDots === 1) {\n modulePath = \"./\"\n } else {\n modulePath = \"../\".repeat(relativeDots - 1)\n }\n if (moduleName) {\n modulePath += moduleName\n } else if (imports.length > 0) {\n // from . import utils -> import from \"./utils\"\n modulePath += imports[0]?.name || \"\"\n }\n } else {\n modulePath = moduleName\n }\n\n // Generate import statement\n if (hasStar) {\n return `import * as ${moduleName || \"_\"} from \"${modulePath}\"`\n }\n\n if (relativeDots > 0 && !moduleName && imports.length === 1) {\n // from . import utils -> import * as utils from \"./utils\"\n const imp = imports[0]\n if (imp) {\n const importName = imp.alias || imp.name\n return `import * as ${importName} from \"${modulePath}\"`\n }\n }\n\n const importNames = imports\n .map(({ name, alias }) => (alias ? `${name} as ${alias}` : name))\n .join(\", \")\n\n return `import { ${importNames} } from \"${modulePath}\"`\n}\n\nfunction transformAwaitExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Find the expression after 'await'\n const exprNode = children.find((c) => c.name !== \"await\")\n\n if (!exprNode) {\n return \"await\"\n }\n\n return `await ${transformNode(exprNode, ctx)}`\n}\n\nfunction transformWithStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Check if this is an async with\n const isAsync = children.some((c) => c.name === \"async\")\n\n // Parse context managers: with expr as name, expr2 as name2:\n const contextManagers: { expr: SyntaxNode; varName: string | null }[] = []\n let body: SyntaxNode | null = null\n\n let i = 0\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n // Skip keywords\n if (child.name === \"with\" || child.name === \"async\" || child.name === \",\") {\n i++\n continue\n }\n\n // Body marks the end of context managers\n if (child.name === \"Body\") {\n body = child\n break\n }\n\n // This should be an expression (the context manager)\n if (child.name !== \"as\" && child.name !== \":\" && child.name !== \"VariableName\") {\n const expr = child\n let varName: string | null = null\n\n // Check if next is 'as' followed by variable name\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"as\") {\n const varChild = children[i + 2]\n if (varChild && varChild.name === \"VariableName\") {\n varName = getNodeText(varChild, ctx.source)\n i += 3\n } else {\n i++\n }\n } else {\n i++\n }\n\n contextManagers.push({ expr, varName })\n continue\n }\n\n i++\n }\n\n if (contextManagers.length === 0 || !body) {\n return getNodeText(node, ctx.source)\n }\n\n // Generate try/finally structure\n // For multiple context managers, we nest them\n const bodyCode = transformBody(body, ctx)\n\n // Build from inside out for multiple context managers\n let result = bodyCode\n\n for (let j = contextManagers.length - 1; j >= 0; j--) {\n const cm = contextManagers[j]\n if (!cm) continue\n\n const exprCode = transformNode(cm.expr, ctx)\n const innerIndent = \" \".repeat(ctx.indentLevel + j)\n const innerIndent2 = \" \".repeat(ctx.indentLevel + j + 1)\n\n if (cm.varName) {\n // with expr as name: -> const name = expr; try { ... } finally { name.close?.() }\n const assignment = `${innerIndent}const ${cm.varName} = ${exprCode};\\n`\n const tryBlock = `${innerIndent}try {\\n${result}\\n${innerIndent}}`\n const finallyBlock = ` finally {\\n${innerIndent2}${cm.varName}[Symbol.dispose]?.() ?? ${cm.varName}.close?.();\\n${innerIndent}}`\n\n if (isAsync && j === 0) {\n // For async with, use await on dispose\n const asyncFinallyBlock = ` finally {\\n${innerIndent2}await (${cm.varName}[Symbol.asyncDispose]?.() ?? ${cm.varName}[Symbol.dispose]?.() ?? ${cm.varName}.close?.());\\n${innerIndent}}`\n result = assignment + tryBlock + asyncFinallyBlock\n } else {\n result = assignment + tryBlock + finallyBlock\n }\n } else {\n // with expr: (no variable) -> const _resource = expr; try { ... } finally { _resource.close?.() }\n const tempVar = j > 0 ? `_resource${String(j)}` : \"_resource\"\n const assignment = `${innerIndent}const ${tempVar} = ${exprCode};\\n`\n const tryBlock = `${innerIndent}try {\\n${result}\\n${innerIndent}}`\n const finallyBlock = ` finally {\\n${innerIndent2}${tempVar}[Symbol.dispose]?.() ?? ${tempVar}.close?.();\\n${innerIndent}}`\n result = assignment + tryBlock + finallyBlock\n }\n }\n\n return result\n}\n\n/**\n * Extract parameter names from a ParamList node for scope tracking\n */\nfunction extractParamNames(node: SyntaxNode, source: string): string[] {\n const children = getChildren(node)\n const names: string[] = []\n let i = 0\n\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n // Skip parentheses, commas, and operators\n if (\n child.name === \"(\" ||\n child.name === \")\" ||\n child.name === \",\" ||\n child.name === \"/\" ||\n child.name === \":\"\n ) {\n i++\n continue\n }\n\n // Handle *args\n if (child.name === \"*\" || getNodeText(child, source) === \"*\") {\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"VariableName\") {\n names.push(getNodeText(nextChild, source))\n i += 2\n continue\n }\n i++\n continue\n }\n\n // Handle **kwargs\n if (child.name === \"**\" || getNodeText(child, source) === \"**\") {\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"VariableName\") {\n names.push(getNodeText(nextChild, source))\n i += 2\n continue\n }\n i++\n continue\n }\n\n // Regular parameter\n if (child.name === \"VariableName\") {\n names.push(getNodeText(child, source))\n i++\n continue\n }\n\n // Parameter wrapped in AssignParam or DefaultParam\n if (child.name === \"AssignParam\" || child.name === \"DefaultParam\") {\n const paramChildren = getChildren(child)\n const name = paramChildren.find((c) => c.name === \"VariableName\")\n if (name) {\n names.push(getNodeText(name, source))\n }\n i++\n continue\n }\n\n i++\n }\n\n return names\n}\n\nfunction transformBody(\n node: SyntaxNode,\n ctx: TransformContext,\n skipFirst: boolean = false,\n predeclaredVars: string[] = []\n): string {\n ctx.indentLevel++\n pushScope(ctx) // Each block body gets its own scope\n\n // Pre-declare variables (e.g., function parameters) so reassignments don't create new 'let' declarations\n for (const v of predeclaredVars) {\n declareVariable(ctx, v)\n }\n const children = getChildren(node)\n const indent = \" \".repeat(ctx.indentLevel)\n\n let filteredChildren = children.filter((child) => child.name !== \":\")\n if (skipFirst && filteredChildren.length > 0) {\n filteredChildren = filteredChildren.slice(1)\n }\n\n const statements = filteredChildren\n .map((child) => {\n const transformed = transformNode(child, ctx)\n // Skip empty transformations (e.g., pass, TypeVar declarations)\n if (transformed === \"\") {\n return \"\"\n }\n if (\n child.name === \"ExpressionStatement\" ||\n child.name === \"AssignStatement\" ||\n child.name === \"PassStatement\" ||\n child.name === \"BreakStatement\" ||\n child.name === \"ContinueStatement\" ||\n child.name === \"ReturnStatement\" ||\n child.name === \"RaiseStatement\"\n ) {\n return indent + transformed + \";\"\n }\n return indent + transformed\n })\n .filter((s) => s.trim() !== \"\")\n\n popScope(ctx)\n ctx.indentLevel--\n return statements.join(\"\\n\")\n}\n\nfunction transformReturnStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const value = children.find((c) => c.name !== \"return\" && c.name !== \"Keyword\")\n\n if (!value) {\n return \"return\"\n }\n\n return `return ${transformNode(value, ctx)}`\n}\n\nfunction transformFunctionDefinition(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n let isAsync = false\n let funcName = \"\"\n let paramList: SyntaxNode | null = null\n let body: SyntaxNode | null = null\n let returnTypeDef: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"async\") {\n isAsync = true\n } else if (child.name === \"VariableName\") {\n funcName = getNodeText(child, ctx.source)\n } else if (child.name === \"ParamList\") {\n paramList = child\n } else if (child.name === \"Body\") {\n body = child\n } else if (child.name === \"TypeDef\") {\n // Return type annotation (comes after ParamList, before Body)\n returnTypeDef = child\n }\n }\n\n // Extract docstring and convert to JSDoc\n const indent = \" \".repeat(ctx.indentLevel)\n const { jsdoc, skipFirstStatement } = body\n ? extractDocstringFromBody(body, ctx, indent)\n : { jsdoc: null, skipFirstStatement: false }\n\n const params = paramList ? transformParamList(paramList, ctx) : \"\"\n // Extract parameter names to pre-declare them in the function body scope\n const paramNames = paramList ? extractParamNames(paramList, ctx.source) : []\n // Track that we're inside a function body for import hoisting\n ctx.insideFunctionBody++\n const bodyCode = body ? transformBody(body, ctx, skipFirstStatement, paramNames) : \"\"\n ctx.insideFunctionBody--\n\n // Check if function is a generator (contains yield)\n const isGenerator = body ? containsYield(body) : false\n\n // Get return type annotation\n let returnType = \"\"\n if (returnTypeDef) {\n const typeChildren = getChildren(returnTypeDef)\n const typeNode = typeChildren.find((c) => c.name !== \":\" && c.name !== \"->\")\n if (typeNode) {\n const tsType = transformPythonType(typeNode, ctx)\n // Convert None return type to void for functions\n returnType = `: ${tsType === \"null\" ? \"void\" : tsType}`\n }\n }\n\n const asyncPrefix = isAsync ? \"async \" : \"\"\n const generatorStar = isGenerator ? \"*\" : \"\"\n const funcDecl = `${asyncPrefix}function${generatorStar} ${funcName}(${params})${returnType} {\\n${bodyCode}\\n}`\n\n return jsdoc ? `${jsdoc}\\n${funcDecl}` : funcDecl\n}\n\nfunction transformClassDefinition(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n let className = \"\"\n const parentClasses: string[] = []\n let body: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"VariableName\") {\n className = getNodeText(child, ctx.source)\n // Track class name for 'new' keyword on instantiation\n ctx.definedClasses.add(className)\n } else if (child.name === \"ArgList\") {\n // Inheritance: class Child(Parent) or class Child(A, B, C) or class Child(Generic[T])\n const argChildren = getChildren(child)\n for (const argChild of argChildren) {\n if (argChild.name === \"VariableName\") {\n parentClasses.push(getNodeText(argChild, ctx.source))\n } else if (argChild.name === \"MemberExpression\") {\n // Handle Generic[T], Generic[K, V] etc.\n parentClasses.push(getNodeText(argChild, ctx.source))\n }\n }\n } else if (child.name === \"Body\") {\n body = child\n }\n }\n\n // Extract class docstring and convert to JSDoc\n const indent = \" \".repeat(ctx.indentLevel)\n const { jsdoc, skipFirstStatement } = body\n ? extractDocstringFromBody(body, ctx, indent)\n : { jsdoc: null, skipFirstStatement: false }\n\n // Build class header\n let classHeader = `class ${className}`\n let multipleInheritanceWarning = \"\"\n\n const firstParent = parentClasses[0]\n if (firstParent) {\n // Special handling for NamedTuple\n if (firstParent === \"NamedTuple\") {\n return transformNamedTuple(className, body, ctx)\n }\n\n // Special handling for Enum types\n if (firstParent === \"Enum\" || firstParent === \"IntEnum\" || firstParent === \"StrEnum\") {\n return transformEnum(className, firstParent, body, ctx)\n }\n\n // Special handling for TypedDict\n if (firstParent === \"TypedDict\") {\n const totalFalse = checkTypedDictTotalFalse(node, ctx)\n return transformTypedDict(className, body, totalFalse, ctx)\n }\n\n // Special handling for Protocol\n if (firstParent === \"Protocol\") {\n return transformProtocol(className, parentClasses, body, ctx)\n }\n\n // Special handling for ABC (Abstract Base Class)\n if (firstParent === \"ABC\" || parentClasses.includes(\"ABC\")) {\n return transformAbstractClass(className, parentClasses, body, ctx, jsdoc)\n }\n\n // Check for Generic[T] in parent classes\n const genericParams = extractGenericParams(parentClasses)\n if (genericParams.length > 0) {\n // Filter out Generic[...] from extends\n const filteredParents = parentClasses.filter((p) => !p.startsWith(\"Generic[\"))\n return transformGenericClass(className, genericParams, filteredParents, body, ctx, jsdoc)\n }\n\n // Use first parent for extends\n classHeader += ` extends ${firstParent}`\n\n // Warn about multiple inheritance\n if (parentClasses.length > 1) {\n const ignoredParents = parentClasses.slice(1).join(\", \")\n multipleInheritanceWarning = `/* WARNING: Multiple inheritance not fully supported. Only extends ${firstParent}. Mixins needed for: ${ignoredParents} */\\n`\n }\n }\n\n // Transform class body\n const bodyCode = body ? transformClassBody(body, ctx, skipFirstStatement) : \"\"\n\n const classDecl = `${multipleInheritanceWarning}${classHeader} {\\n${bodyCode}\\n}`\n return jsdoc ? `${jsdoc}\\n${classDecl}` : classDecl\n}\n\nfunction transformClassBody(\n node: SyntaxNode,\n ctx: TransformContext,\n skipFirst: boolean = false\n): string {\n ctx.indentLevel++\n const children = getChildren(node)\n const indent = \" \".repeat(ctx.indentLevel)\n const members: string[] = []\n\n let filteredChildren = children.filter((c) => c.name !== \":\")\n if (skipFirst && filteredChildren.length > 0) {\n filteredChildren = filteredChildren.slice(1)\n }\n\n for (const child of filteredChildren) {\n if (child.name === \"FunctionDefinition\") {\n members.push(transformClassMethod(child, ctx, null))\n } else if (child.name === \"DecoratedStatement\") {\n members.push(transformClassDecoratedMethod(child, ctx))\n } else if (child.name === \"AssignStatement\") {\n // Class-level assignment (class property)\n const transformed = transformClassProperty(child, ctx, indent)\n if (transformed) {\n members.push(transformed)\n }\n } else if (child.name === \"ExpressionStatement\") {\n // Non-docstring expressions (docstrings at class level are handled by transformClassDefinition)\n // Skip any remaining triple-quoted strings that look like docstrings\n if (!isDocstringNode(child, ctx)) {\n const transformed = transformNode(child, ctx)\n if (transformed.trim()) {\n members.push(indent + transformed + \";\")\n }\n }\n } else if (child.name === \"PassStatement\") {\n // Skip pass in class body\n }\n }\n\n ctx.indentLevel--\n return members.filter((m) => m.trim()).join(\"\\n\\n\")\n}\n\n/**\n * Transform a class property assignment\n * Handles Final (readonly) and ClassVar (static) modifiers\n */\nfunction transformClassProperty(node: SyntaxNode, ctx: TransformContext, indent: string): string {\n const children = getChildren(node)\n if (children.length < 2) return \"\"\n\n // Find the assignment operator\n const assignOpIndex = children.findIndex((c) => c.name === \"AssignOp\" || c.name === \"=\")\n\n // Find type annotation\n const typeDef = children.find((c) => c.name === \"TypeDef\")\n\n // Handle type-only declarations (no assignment): value: T\n if (assignOpIndex === -1) {\n // No assignment, just type annotation\n const targets = children.filter((c) => c.name !== \",\" && c.name !== \"TypeDef\" && c.name !== \":\")\n const target = targets[0]\n if (!target) return \"\"\n\n const targetCode = transformNode(target, ctx)\n const tsType = extractTypeAnnotation(typeDef, ctx)\n const typeAnnotation = tsType ? `: ${tsType}` : \"\"\n\n // Extract type modifiers (Final, ClassVar)\n const modifiers = extractTypeModifiers(typeDef, ctx)\n\n // Build property prefix: static for ClassVar, readonly for Final\n let prefix = \"\"\n if (modifiers.isClassVar) {\n prefix = \"static \"\n }\n if (modifiers.isFinal) {\n prefix += \"readonly \"\n }\n\n return `${indent}${prefix}${targetCode}${typeAnnotation};`\n }\n\n // Handle assignments: value: T = default\n const typeDefBeforeAssign = children.slice(0, assignOpIndex).find((c) => c.name === \"TypeDef\")\n\n // Collect targets (before =) and values (after =)\n const targets = children\n .slice(0, assignOpIndex)\n .filter((c) => c.name !== \",\" && c.name !== \"TypeDef\")\n const values = children.slice(assignOpIndex + 1).filter((c) => c.name !== \",\")\n\n if (targets.length === 0 || values.length === 0) return \"\"\n\n const target = targets[0]\n if (!target) return \"\"\n\n const targetCode = transformNode(target, ctx)\n\n // Extract type annotation if present\n const tsType = extractTypeAnnotation(typeDefBeforeAssign, ctx)\n const typeAnnotation = tsType ? `: ${tsType}` : \"\"\n\n // Extract type modifiers (Final, ClassVar)\n const modifiers = extractTypeModifiers(typeDefBeforeAssign, ctx)\n\n // Build property prefix: static for ClassVar, readonly for Final\n let prefix = \"\"\n if (modifiers.isClassVar) {\n prefix = \"static \"\n }\n if (modifiers.isFinal) {\n prefix += \"readonly \"\n }\n\n // Transform value\n const value = values[0]\n const valueCode = value ? transformNode(value, ctx) : \"\"\n\n return `${indent}${prefix}${targetCode}${typeAnnotation} = ${valueCode};`\n}\n\nfunction transformClassMethod(\n node: SyntaxNode,\n ctx: TransformContext,\n decorator: string | null\n): string {\n const children = getChildren(node)\n const indent = \" \".repeat(ctx.indentLevel)\n\n let methodName = \"\"\n let paramList: SyntaxNode | null = null\n let body: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"VariableName\") {\n methodName = getNodeText(child, ctx.source)\n } else if (child.name === \"ParamList\") {\n paramList = child\n } else if (child.name === \"Body\") {\n body = child\n }\n }\n\n // Extract method docstring and convert to JSDoc\n const { jsdoc, skipFirstStatement } = body\n ? extractDocstringFromBody(body, ctx, indent)\n : { jsdoc: null, skipFirstStatement: false }\n\n // Transform parameters, removing 'self' or 'cls'\n const params = paramList ? transformMethodParamList(paramList, ctx) : \"\"\n // Extract parameter names (excluding self/cls) for scope tracking\n const paramNames = paramList\n ? extractParamNames(paramList, ctx.source).filter((n) => n !== \"self\" && n !== \"cls\")\n : []\n\n // Transform body, replacing 'self' with 'this'\n // Track that we're inside a function body for import hoisting\n ctx.insideFunctionBody++\n const bodyCode = body ? transformClassMethodBody(body, ctx, skipFirstStatement, paramNames) : \"\"\n ctx.insideFunctionBody--\n\n // Check if method is a generator (contains yield)\n const isGenerator = body ? containsYield(body) : false\n const generatorStar = isGenerator ? \"*\" : \"\"\n\n // Handle special methods\n if (methodName === \"__init__\") {\n const methodDecl = `${indent}constructor(${params}) {\\n${bodyCode}\\n${indent}}`\n return jsdoc ? `${jsdoc}\\n${methodDecl}` : methodDecl\n }\n\n if (methodName === \"__str__\" || methodName === \"__repr__\") {\n const methodDecl = `${indent}toString() {\\n${bodyCode}\\n${indent}}`\n return jsdoc ? `${jsdoc}\\n${methodDecl}` : methodDecl\n }\n\n // Handle decorators\n let prefix = \"\"\n if (decorator === \"staticmethod\" || decorator === \"classmethod\") {\n prefix = \"static \"\n } else if (decorator === \"property\") {\n prefix = \"get \"\n } else if (decorator === \"setter\") {\n prefix = \"set \"\n } else if (decorator === \"abstractmethod\") {\n // Abstract method: no body, just signature with return type and typed params\n const typedParams = paramList ? transformMethodParamListWithTypes(paramList, ctx) : \"\"\n const returnType = extractMethodReturnType(node, ctx)\n const returnTypeStr = returnType ? `: ${returnType === \"null\" ? \"void\" : returnType}` : \"\"\n const methodDecl = `${indent}abstract ${methodName}(${typedParams})${returnTypeStr}`\n return jsdoc ? `${jsdoc}\\n${methodDecl}` : methodDecl\n }\n\n const methodDecl = `${indent}${prefix}${generatorStar}${methodName}(${params}) {\\n${bodyCode}\\n${indent}}`\n return jsdoc ? `${jsdoc}\\n${methodDecl}` : methodDecl\n}\n\n/**\n * Extract return type from a method's TypeDef (-> ReturnType)\n */\nfunction extractMethodReturnType(node: SyntaxNode, ctx: TransformContext): string | null {\n const children = getChildren(node)\n for (const child of children) {\n if (child.name === \"TypeDef\") {\n return extractTypeAnnotation(child, ctx)\n }\n }\n return null\n}\n\nfunction transformClassDecoratedMethod(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n let decorator: string | null = null\n let funcDef: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"Decorator\") {\n const decChildren = getChildren(child)\n // Check for member expression pattern: @x.setter or @x.deleter\n const varNames = decChildren.filter((c) => c.name === \"VariableName\")\n const hasDot = decChildren.some((c) => c.name === \".\")\n if (varNames.length >= 2 && hasDot) {\n // It's a member expression like @x.setter\n const propName = varNames[varNames.length - 1]\n if (propName) {\n decorator = getNodeText(propName, ctx.source) // \"setter\" or \"deleter\"\n }\n } else {\n // Simple decorator like @property or @staticmethod\n const nameNode = varNames[0]\n if (nameNode) {\n decorator = getNodeText(nameNode, ctx.source)\n }\n }\n } else if (child.name === \"FunctionDefinition\") {\n funcDef = child\n }\n }\n\n if (!funcDef) {\n return getNodeText(node, ctx.source)\n }\n\n return transformClassMethod(funcDef, ctx, decorator)\n}\n\nfunction transformMethodParamList(node: SyntaxNode, ctx: TransformContext): string {\n return transformMethodParamListImpl(node, ctx, false)\n}\n\n/**\n * Transform method parameter list with type annotations (for abstract methods)\n */\nfunction transformMethodParamListWithTypes(node: SyntaxNode, ctx: TransformContext): string {\n return transformMethodParamListImpl(node, ctx, true)\n}\n\nfunction transformMethodParamListImpl(\n node: SyntaxNode,\n ctx: TransformContext,\n includeTypes: boolean\n): string {\n const children = getChildren(node)\n const params: string[] = []\n let i = 0\n let isFirstParam = true\n\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n // Skip parentheses and commas\n if (child.name === \"(\" || child.name === \")\" || child.name === \",\") {\n i++\n continue\n }\n\n // Skip 'self' and 'cls' (first parameter in instance/class methods)\n if (child.name === \"VariableName\" && isFirstParam) {\n const name = getNodeText(child, ctx.source)\n if (name === \"self\" || name === \"cls\") {\n i++\n isFirstParam = false\n continue\n }\n }\n isFirstParam = false\n\n // Check for *args (rest parameter)\n if (child.name === \"*\" || getNodeText(child, ctx.source) === \"*\") {\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"VariableName\") {\n const name = getNodeText(nextChild, ctx.source)\n params.push(`...${name}`)\n i += 2\n continue\n }\n i++\n continue\n }\n\n // Check for **kwargs\n if (child.name === \"**\" || getNodeText(child, ctx.source) === \"**\") {\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"VariableName\") {\n const name = getNodeText(nextChild, ctx.source)\n params.push(name)\n i += 2\n continue\n }\n i++\n continue\n }\n\n // Check for parameter with default value or type annotation\n if (child.name === \"VariableName\") {\n const nameCode = getNodeText(child, ctx.source)\n let typeStr = \"\"\n let defaultStr = \"\"\n let consumed = 1\n\n // Check for type annotation\n const nextChild = children[i + 1]\n if (nextChild?.name === \"TypeDef\" && includeTypes) {\n const t = extractTypeAnnotation(nextChild, ctx)\n if (t) typeStr = `: ${t}`\n consumed++\n\n // Check for default after type\n const afterType = children[i + 2]\n if (afterType?.name === \"AssignOp\") {\n const defaultVal = children[i + 3]\n if (defaultVal) {\n defaultStr = ` = ${transformNode(defaultVal, ctx)}`\n consumed += 2\n }\n }\n } else if (nextChild?.name === \"AssignOp\") {\n const defaultValChild = children[i + 2]\n if (defaultValChild) {\n defaultStr = ` = ${transformNode(defaultValChild, ctx)}`\n consumed += 2\n }\n }\n\n params.push(`${nameCode}${typeStr}${defaultStr}`)\n i += consumed\n continue\n }\n\n i++\n }\n\n return params.join(\", \")\n}\n\nfunction transformClassMethodBody(\n node: SyntaxNode,\n ctx: TransformContext,\n skipFirst: boolean = false,\n predeclaredVars: string[] = []\n): string {\n ctx.indentLevel++\n pushScope(ctx) // Each method body gets its own scope\n\n // Pre-declare variables (e.g., method parameters) so reassignments don't create new 'let' declarations\n for (const v of predeclaredVars) {\n declareVariable(ctx, v)\n }\n\n const children = getChildren(node)\n const indent = \" \".repeat(ctx.indentLevel)\n\n let filteredChildren = children.filter((child) => child.name !== \":\")\n if (skipFirst && filteredChildren.length > 0) {\n filteredChildren = filteredChildren.slice(1)\n }\n\n const statements = filteredChildren\n .map((child) => {\n let transformed: string\n\n // Special handling for AssignStatement to avoid \"let\" on self.x assignments\n if (child.name === \"AssignStatement\") {\n transformed = transformClassAssignment(child, ctx)\n } else {\n transformed = transformNode(child, ctx)\n }\n\n // Skip empty transformations (e.g., pass, TypeVar declarations)\n if (transformed === \"\") {\n return \"\"\n }\n\n // Replace self. and cls. with this.\n transformed = transformed.replace(/\\bself\\./g, \"this.\")\n transformed = transformed.replace(/\\bcls\\./g, \"this.\")\n\n // Handle super().__init__(...) -> super(...)\n transformed = transformed.replace(/super\\(\\)\\.__init__\\(/g, \"super(\")\n\n // Handle cls() -> this() for classmethod\n transformed = transformed.replace(/\\bcls\\(\\)/g, \"new this()\")\n\n if (\n child.name === \"ExpressionStatement\" ||\n child.name === \"AssignStatement\" ||\n child.name === \"PassStatement\" ||\n child.name === \"BreakStatement\" ||\n child.name === \"ContinueStatement\" ||\n child.name === \"ReturnStatement\"\n ) {\n return indent + transformed + \";\"\n }\n return indent + transformed\n })\n .filter((s) => s.trim() !== \"\")\n\n popScope(ctx)\n ctx.indentLevel--\n return statements.join(\"\\n\")\n}\n\nfunction transformClassAssignment(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n if (children.length < 3) return getNodeText(node, ctx.source)\n\n const assignOpIndex = children.findIndex((c) => c.name === \"AssignOp\" || c.name === \"=\")\n if (assignOpIndex === -1) return getNodeText(node, ctx.source)\n\n const targets = children.slice(0, assignOpIndex).filter((c) => c.name !== \",\")\n const values = children.slice(assignOpIndex + 1).filter((c) => c.name !== \",\")\n\n if (targets.length === 0 || values.length === 0) {\n return getNodeText(node, ctx.source)\n }\n\n if (targets.length === 1) {\n const target = targets[0]\n if (!target) return getNodeText(node, ctx.source)\n\n const targetCode = transformNode(target, ctx)\n\n // Check if target is a member expression (like self.x)\n const isMemberAssignment = target.name === \"MemberExpression\"\n\n if (values.length === 1) {\n const value = values[0]\n if (!value) return getNodeText(node, ctx.source)\n // No \"let\" for member expressions (self.x = y -> this.x = y)\n if (isMemberAssignment) {\n return `${targetCode} = ${transformNode(value, ctx)}`\n }\n return `let ${targetCode} = ${transformNode(value, ctx)}`\n } else {\n const valuesCodes = values.map((v) => transformNode(v, ctx))\n if (isMemberAssignment) {\n return `${targetCode} = [${valuesCodes.join(\", \")}]`\n }\n return `let ${targetCode} = [${valuesCodes.join(\", \")}]`\n }\n }\n\n // Multiple target assignment (destructuring)\n const targetCodes = targets.map((t) => transformAssignTarget(t, ctx))\n const targetPattern = `[${targetCodes.join(\", \")}]`\n\n if (values.length === 1) {\n const value = values[0]\n if (!value) return getNodeText(node, ctx.source)\n return `let ${targetPattern} = ${transformNode(value, ctx)}`\n } else {\n const valuesCodes = values.map((v) => transformNode(v, ctx))\n return `let ${targetPattern} = [${valuesCodes.join(\", \")}]`\n }\n}\n\nfunction transformDecoratedStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Collect decorators and find the function/class definition\n const decorators: { name: string; args: string | null }[] = []\n let funcDef: SyntaxNode | null = null\n let classDef: SyntaxNode | null = null\n\n for (const child of children) {\n if (child.name === \"Decorator\") {\n const decChildren = getChildren(child)\n let decoratorName = \"\"\n let decoratorArgs: string | null = null\n\n // Build decorator name from possibly dotted path: @app.route(\"/api\")\n // AST: At, VariableName(\"app\"), \".\", VariableName(\"route\"), ArgList\n const nameParts: string[] = []\n for (const decChild of decChildren) {\n if (decChild.name === \"VariableName\") {\n nameParts.push(getNodeText(decChild, ctx.source))\n } else if (decChild.name === \"MemberExpression\") {\n // Fallback for nested member expressions\n decoratorName = transformNode(decChild, ctx)\n } else if (decChild.name === \"ArgList\") {\n decoratorArgs = transformArgList(decChild, ctx)\n } else if (decChild.name === \"CallExpression\") {\n // Handle nested call expressions if they occur\n const callChildren = getChildren(decChild)\n for (const callChild of callChildren) {\n if (callChild.name === \"VariableName\") {\n nameParts.push(getNodeText(callChild, ctx.source))\n } else if (callChild.name === \"MemberExpression\") {\n decoratorName = transformNode(callChild, ctx)\n } else if (callChild.name === \"ArgList\") {\n decoratorArgs = transformArgList(callChild, ctx)\n }\n }\n }\n }\n // If we collected name parts, join them with dots\n if (nameParts.length > 0) {\n decoratorName = nameParts.join(\".\")\n }\n\n if (decoratorName) {\n decorators.push({ name: decoratorName, args: decoratorArgs })\n }\n } else if (child.name === \"FunctionDefinition\") {\n funcDef = child\n } else if (child.name === \"ClassDefinition\") {\n classDef = child\n }\n }\n\n // Handle decorated class\n if (classDef) {\n return transformDecoratedClass(classDef, decorators, ctx)\n }\n\n if (!funcDef) {\n return getNodeText(node, ctx.source)\n }\n\n // Get function details\n const funcChildren = getChildren(funcDef)\n let funcName = \"\"\n let paramList: SyntaxNode | null = null\n let body: SyntaxNode | null = null\n\n for (const child of funcChildren) {\n if (child.name === \"VariableName\") {\n funcName = getNodeText(child, ctx.source)\n } else if (child.name === \"ParamList\") {\n paramList = child\n } else if (child.name === \"Body\") {\n body = child\n }\n }\n\n const params = paramList ? transformParamList(paramList, ctx) : \"\"\n const paramNames = paramList ? extractParamNames(paramList, ctx.source) : []\n\n // Handle @overload: generate only function signature (no body)\n if (decorators.length === 1 && decorators[0]?.name === \"overload\") {\n const returnType = extractMethodReturnType(funcDef, ctx)\n const returnTypeStr = returnType ? `: ${returnType === \"null\" ? \"void\" : returnType}` : \"\"\n return `function ${funcName}(${params})${returnTypeStr}`\n }\n\n // Track that we're inside a function body for import hoisting\n ctx.insideFunctionBody++\n const bodyCode = body ? transformBody(body, ctx, false, paramNames) : \"\"\n ctx.insideFunctionBody--\n\n // Build the decorated function\n // @decorator def func(): ... -> const func = decorator(function func() { ... })\n // @decorator(args) def func(): ... -> const func = decorator(args)(function func() { ... })\n let funcExpr = `function ${funcName}(${params}) {\\n${bodyCode}\\n}`\n\n // Apply decorators from bottom to top (innermost first)\n for (let i = decorators.length - 1; i >= 0; i--) {\n const dec = decorators[i]\n if (!dec) continue\n\n if (dec.args !== null) {\n funcExpr = `${dec.name}(${dec.args})(${funcExpr})`\n } else {\n funcExpr = `${dec.name}(${funcExpr})`\n }\n }\n\n return `const ${funcName} = ${funcExpr}`\n}\n\n// ============================================================================\n// Class decorator and @dataclass helpers\n// ============================================================================\n\ninterface DataclassField {\n name: string\n tsType: string\n hasDefault: boolean\n defaultValue: string | null\n isFieldFactory: boolean\n}\n\ninterface DataclassOptions {\n frozen: boolean\n}\n\n/**\n * Handle decorated class definitions\n * Routes to either @dataclass special handling or generic class decorator wrapping\n */\nfunction transformDecoratedClass(\n classDef: SyntaxNode,\n decorators: Array<{ name: string; args: string | null }>,\n ctx: TransformContext\n): string {\n // Check for @dataclass decorator\n const dataclassDecorator = decorators.find(\n (d) => d.name === \"dataclass\" || d.name === \"dataclasses.dataclass\"\n )\n\n if (dataclassDecorator) {\n // Filter out the dataclass decorator, apply remaining decorators if any\n const otherDecorators = decorators.filter((d) => d !== dataclassDecorator)\n const dataclassCode = transformDataclass(classDef, dataclassDecorator, ctx)\n\n if (otherDecorators.length === 0) {\n return dataclassCode\n }\n\n // Wrap dataclass with remaining decorators\n const children = getChildren(classDef)\n let className = \"\"\n for (const child of children) {\n if (child.name === \"VariableName\") {\n className = getNodeText(child, ctx.source)\n break\n }\n }\n\n let expr = dataclassCode\n for (let i = otherDecorators.length - 1; i >= 0; i--) {\n const dec = otherDecorators[i]\n if (!dec) continue\n if (dec.args !== null) {\n expr = `${dec.name}(${dec.args})(${expr})`\n } else {\n expr = `${dec.name}(${expr})`\n }\n }\n return `const ${className} = ${expr}`\n }\n\n // Generic class decorator wrapping\n return transformGenericDecoratedClass(classDef, decorators, ctx)\n}\n\n/**\n * Wrap a class with decorators (non-dataclass)\n * @decorator class MyClass: pass -> const MyClass = decorator(class MyClass { })\n */\nfunction transformGenericDecoratedClass(\n classDef: SyntaxNode,\n decorators: Array<{ name: string; args: string | null }>,\n ctx: TransformContext\n): string {\n const children = getChildren(classDef)\n let className = \"\"\n\n for (const child of children) {\n if (child.name === \"VariableName\") {\n className = getNodeText(child, ctx.source)\n ctx.definedClasses.add(className)\n break\n }\n }\n\n // Transform the class definition using existing logic\n let classExpr = transformClassDefinition(classDef, ctx)\n\n // Apply decorators from bottom to top (innermost first)\n for (let i = decorators.length - 1; i >= 0; i--) {\n const dec = decorators[i]\n if (!dec) continue\n\n if (dec.args !== null) {\n classExpr = `${dec.name}(${dec.args})(${classExpr})`\n } else {\n classExpr = `${dec.name}(${classExpr})`\n }\n }\n\n return `const ${className} = ${classExpr}`\n}\n\n/**\n * Parse @dataclass decorator options\n */\nfunction parseDataclassOptions(args: string | null): DataclassOptions {\n const options: DataclassOptions = {\n frozen: false\n }\n\n if (!args) return options\n\n // Parse keyword arguments - args is already transformed\n // e.g., \"frozen: true\" or \"frozen=True\" before transformation\n if (\n args.includes(\"frozen: true\") ||\n args.includes(\"frozen=True\") ||\n args.includes(\"frozen=true\")\n ) {\n options.frozen = true\n }\n\n return options\n}\n\n/**\n * Extract dataclass fields from class body\n * Only considers typed assignments: name: type or name: type = default\n */\nfunction extractDataclassFields(body: SyntaxNode, ctx: TransformContext): DataclassField[] {\n const fields: DataclassField[] = []\n const children = getChildren(body)\n\n for (const child of children) {\n if (child.name === \":\") continue\n\n // Handle typed assignment: name: type = value\n if (child.name === \"AssignStatement\") {\n const field = parseDataclassFieldFromAssignment(child, ctx)\n if (field) fields.push(field)\n }\n // Handle bare type annotation: name: type (ExpressionStatement wrapping TypeAnnotation)\n else if (child.name === \"ExpressionStatement\") {\n const field = parseDataclassFieldFromExpression(child, ctx)\n if (field) fields.push(field)\n }\n }\n\n return fields\n}\n\n/**\n * Parse a field from an assignment statement: name: type = value\n */\nfunction parseDataclassFieldFromAssignment(\n node: SyntaxNode,\n ctx: TransformContext\n): DataclassField | null {\n const children = getChildren(node)\n\n // Look for pattern: VariableName TypeDef AssignOp Value\n let varName: SyntaxNode | null = null\n let typeDef: SyntaxNode | null = null\n let assignOpIndex = -1\n\n for (let i = 0; i < children.length; i++) {\n const child = children[i]\n if (!child) continue\n\n if (child.name === \"VariableName\" && !varName) {\n varName = child\n } else if (child.name === \"TypeDef\") {\n typeDef = child\n } else if (child.name === \"AssignOp\" || child.name === \"=\") {\n assignOpIndex = i\n }\n }\n\n // Must have type annotation to be a dataclass field\n if (!varName || !typeDef) {\n return null\n }\n\n const name = getNodeText(varName, ctx.source)\n const tsType = extractTypeAnnotation(typeDef, ctx) ?? \"unknown\"\n\n let hasDefault = false\n let defaultValue: string | null = null\n let isFieldFactory = false\n\n if (assignOpIndex !== -1) {\n hasDefault = true\n const valueNodes = children.slice(assignOpIndex + 1).filter((c) => c.name !== \",\")\n const firstValue = valueNodes[0]\n\n if (firstValue) {\n // Check for field(default_factory=...) pattern\n if (firstValue.name === \"CallExpression\") {\n const callText = getNodeText(firstValue, ctx.source)\n if (callText.startsWith(\"field(\")) {\n isFieldFactory = true\n defaultValue = parseFieldDefaultFactory(firstValue, ctx)\n } else {\n defaultValue = transformNode(firstValue, ctx)\n }\n } else {\n defaultValue = transformNode(firstValue, ctx)\n }\n }\n }\n\n return { name, tsType, hasDefault, defaultValue, isFieldFactory }\n}\n\n/**\n * Parse a field from an expression statement (bare type annotation): name: type\n */\nfunction parseDataclassFieldFromExpression(\n node: SyntaxNode,\n ctx: TransformContext\n): DataclassField | null {\n const children = getChildren(node)\n\n // Look for VariableName and TypeDef (or a pattern like \"name: type\")\n for (const child of children) {\n // Check if this is an annotated name expression\n if (child.name === \"VariableName\") {\n // Look for TypeDef sibling\n const typeDef = children.find((c) => c.name === \"TypeDef\")\n if (typeDef) {\n const name = getNodeText(child, ctx.source)\n const tsType = extractTypeAnnotation(typeDef, ctx) ?? \"unknown\"\n return { name, tsType, hasDefault: false, defaultValue: null, isFieldFactory: false }\n }\n }\n }\n\n return null\n}\n\n/**\n * Parse field(default_factory=...) to extract the default value\n */\nfunction parseFieldDefaultFactory(callNode: SyntaxNode, ctx: TransformContext): string {\n const text = getNodeText(callNode, ctx.source)\n\n // Extract the factory from field(default_factory=X)\n const factoryMatch = text.match(/default_factory\\s*=\\s*(\\w+)/)\n if (factoryMatch) {\n const factory = factoryMatch[1]\n if (factory === \"list\") return \"[]\"\n if (factory === \"dict\") return \"{}\"\n if (factory === \"set\") return \"new Set()\"\n // For other factories, return the factory call\n if (factory) return `${factory}()`\n }\n\n // Check for default= pattern\n const defaultMatch = text.match(/default\\s*=\\s*([^,)]+)/)\n if (defaultMatch) {\n return defaultMatch[1]?.trim() ?? \"undefined\"\n }\n\n return \"undefined\"\n}\n\n/**\n * Transform @dataclass decorated class\n */\nfunction transformDataclass(\n classDef: SyntaxNode,\n decorator: { name: string; args: string | null },\n ctx: TransformContext\n): string {\n const children = getChildren(classDef)\n\n let className = \"\"\n let body: SyntaxNode | null = null\n const parentClasses: string[] = []\n\n for (const child of children) {\n if (child.name === \"VariableName\") {\n className = getNodeText(child, ctx.source)\n ctx.definedClasses.add(className)\n } else if (child.name === \"ArgList\") {\n // Inheritance\n const argChildren = getChildren(child)\n const parentNodes = argChildren.filter((c) => c.name === \"VariableName\")\n for (const parentNode of parentNodes) {\n parentClasses.push(getNodeText(parentNode, ctx.source))\n }\n } else if (child.name === \"Body\") {\n body = child\n }\n }\n\n // Extract dataclass options\n const options = parseDataclassOptions(decorator.args)\n\n // Extract fields from body\n const fields = body ? extractDataclassFields(body, ctx) : []\n\n // Extract docstring\n const indent = \" \".repeat(ctx.indentLevel)\n const { jsdoc } = body ? extractDocstringFromBody(body, ctx, indent) : { jsdoc: null }\n\n // Generate class code\n return generateDataclassCode(className, parentClasses, fields, options, body, ctx, jsdoc)\n}\n\n/**\n * Generate TypeScript class code from dataclass fields\n */\nfunction generateDataclassCode(\n className: string,\n parentClasses: string[],\n fields: DataclassField[],\n options: DataclassOptions,\n body: SyntaxNode | null,\n ctx: TransformContext,\n jsdoc: string | null\n): string {\n const memberIndent = \" \"\n const bodyIndent = \" \"\n const members: string[] = []\n\n // 1. Generate field declarations\n for (const field of fields) {\n const readonly = options.frozen ? \"readonly \" : \"\"\n if (field.hasDefault && field.defaultValue !== null && !field.isFieldFactory) {\n members.push(\n `${memberIndent}${readonly}${field.name}: ${field.tsType} = ${field.defaultValue};`\n )\n } else {\n members.push(`${memberIndent}${readonly}${field.name}: ${field.tsType};`)\n }\n }\n\n // 2. Generate constructor\n const constructorParams = fields\n .map((f) => {\n if (f.hasDefault && f.defaultValue !== null) {\n return `${f.name}: ${f.tsType} = ${f.defaultValue}`\n }\n return `${f.name}: ${f.tsType}`\n })\n .join(\", \")\n\n const constructorAssignments = fields\n .map((f) => `${bodyIndent}this.${f.name} = ${f.name};`)\n .join(\"\\n\")\n\n let constructorBody = \"\"\n if (parentClasses.length > 0) {\n constructorBody += `${bodyIndent}super();\\n`\n }\n constructorBody += constructorAssignments\n if (options.frozen) {\n constructorBody += `\\n${bodyIndent}Object.freeze(this);`\n }\n\n members.push(\n `\\n${memberIndent}constructor(${constructorParams}) {\\n${constructorBody}\\n${memberIndent}}`\n )\n\n // 3. Extract and add any methods defined in the class body\n if (body) {\n const methodMembers = extractNonFieldMembers(body, ctx, fields)\n if (methodMembers.length > 0) {\n members.push(...methodMembers)\n }\n }\n\n // Build class header\n let classHeader = `class ${className}`\n const firstParent = parentClasses[0]\n if (firstParent) {\n classHeader += ` extends ${firstParent}`\n }\n\n const classCode = `${classHeader} {\\n${members.join(\"\\n\")}\\n}`\n\n if (jsdoc) {\n return `${jsdoc}\\n${classCode}`\n }\n return classCode\n}\n\n/**\n * Extract non-field members (methods) from dataclass body\n */\nfunction extractNonFieldMembers(\n body: SyntaxNode,\n ctx: TransformContext,\n fields: DataclassField[]\n): string[] {\n const members: string[] = []\n const children = getChildren(body)\n const fieldNames = new Set(fields.map((f) => f.name))\n\n // Track if we've seen the docstring already (it's always first)\n let skipFirst = false\n const firstChild = children.find((c) => c.name !== \":\")\n if (firstChild && isDocstringNode(firstChild, ctx)) {\n skipFirst = true\n }\n\n let isFirst = true\n for (const child of children) {\n if (child.name === \":\") continue\n if (isFirst && skipFirst) {\n isFirst = false\n continue\n }\n isFirst = false\n\n // Skip field declarations (AssignStatement and ExpressionStatement with type annotations)\n if (child.name === \"AssignStatement\" || child.name === \"ExpressionStatement\") {\n // Check if this is a field we already processed\n const childChildren = getChildren(child)\n const varName = childChildren.find((c) => c.name === \"VariableName\")\n if (varName && fieldNames.has(getNodeText(varName, ctx.source))) {\n continue\n }\n // Check for type annotation (indicates it's a field)\n const hasTypeDef = childChildren.some((c) => c.name === \"TypeDef\")\n if (hasTypeDef) {\n continue\n }\n }\n\n // Process methods\n if (child.name === \"FunctionDefinition\") {\n const methodName = getMethodName(child, ctx)\n // Skip __init__ as we generate our own constructor\n if (methodName !== \"__init__\") {\n ctx.indentLevel++\n members.push(\"\\n\" + transformClassMethod(child, ctx, null))\n ctx.indentLevel--\n }\n } else if (child.name === \"DecoratedStatement\") {\n ctx.indentLevel++\n members.push(\"\\n\" + transformClassDecoratedMethod(child, ctx))\n ctx.indentLevel--\n }\n }\n\n return members\n}\n\n/**\n * Get method name from a FunctionDefinition node\n */\nfunction getMethodName(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n for (const child of children) {\n if (child.name === \"VariableName\") {\n return getNodeText(child, ctx.source)\n }\n }\n return \"\"\n}\n\n// ============================================================================\n// NamedTuple Transformation\n// ============================================================================\n\n/**\n * Transform a NamedTuple class to a TypeScript class with readonly fields\n * NamedTuple is essentially a frozen dataclass\n */\nfunction transformNamedTuple(\n className: string,\n body: SyntaxNode | null,\n ctx: TransformContext\n): string {\n // Extract fields (reuse dataclass field extraction)\n const fields = body ? extractDataclassFields(body, ctx) : []\n\n // Generate like frozen dataclass (readonly + Object.freeze)\n return generateDataclassCode(\n className,\n [], // no parent classes in output\n fields,\n { frozen: true }, // always frozen\n body,\n ctx,\n null // jsdoc\n )\n}\n\n// ============================================================================\n// Enum Transformation\n// ============================================================================\n\ninterface EnumMember {\n name: string\n value: string\n isString: boolean\n numericValue: number | null\n}\n\n/**\n * Transform a Python Enum class to TypeScript\n * - String values → type union from values\n * - Sequential numeric values → type union from names\n * - Meaningful numeric values → as const object + union type\n */\nfunction transformEnum(\n className: string,\n enumType: string,\n body: SyntaxNode | null,\n ctx: TransformContext\n): string {\n const members = extractEnumMembers(body, ctx)\n\n if (members.length === 0) {\n return `type ${className} = never`\n }\n\n // Determine output format based on enum type and values\n const allStrings = members.every((m) => m.isString)\n\n // StrEnum or all string values → string union from values\n if (enumType === \"StrEnum\" || allStrings) {\n return generateStringUnionEnum(className, members)\n }\n\n // Check if values are sequential (1, 2, 3...) starting from any number\n const isSequential = checkSequentialEnum(members)\n\n // Sequential values → string union from names (values are meaningless)\n if (isSequential) {\n return generateNameUnionEnum(className, members)\n }\n\n // Meaningful numeric values → as const object + union type\n return generateConstObjectEnum(className, members)\n}\n\n/**\n * Extract enum members from class body\n */\nfunction extractEnumMembers(body: SyntaxNode | null, ctx: TransformContext): EnumMember[] {\n if (!body) return []\n\n const members: EnumMember[] = []\n const children = getChildren(body)\n\n for (const child of children) {\n if (child.name === \"AssignStatement\") {\n const member = parseEnumMember(child, ctx)\n if (member) {\n members.push(member)\n }\n }\n }\n\n return members\n}\n\n/**\n * Parse a single enum member from an assignment statement\n */\nfunction parseEnumMember(node: SyntaxNode, ctx: TransformContext): EnumMember | null {\n const children = getChildren(node)\n let name = \"\"\n let value = \"\"\n let isString = false\n let numericValue: number | null = null\n\n for (const child of children) {\n if (child.name === \"VariableName\" && !name) {\n name = getNodeText(child, ctx.source)\n } else if (child.name === \"Number\") {\n value = getNodeText(child, ctx.source)\n numericValue = parseFloat(value)\n isString = false\n } else if (child.name === \"String\") {\n const rawValue = getNodeText(child, ctx.source)\n // Remove quotes and get the actual string content\n value = rawValue.slice(1, -1)\n isString = true\n } else if (child.name === \"CallExpression\") {\n // Handle auto() - treat as sequential\n const callText = getNodeText(child, ctx.source)\n if (callText === \"auto()\") {\n value = \"auto\"\n numericValue = null\n isString = false\n } else {\n // Complex expression, use as-is\n value = callText\n isString = false\n }\n }\n }\n\n if (!name) return null\n\n return { name, value, isString, numericValue }\n}\n\n/**\n * Check if enum values are sequential (1, 2, 3... or any starting point)\n */\nfunction checkSequentialEnum(members: EnumMember[]): boolean {\n if (members.length === 0) return true\n\n // If any member uses auto(), treat as sequential\n if (members.some((m) => m.value === \"auto\")) return true\n\n // Check if all values are numeric and sequential\n const numericMembers = members.filter((m) => m.numericValue !== null)\n if (numericMembers.length !== members.length) return false\n\n // Check for sequential pattern\n const values = numericMembers.map((m) => m.numericValue as number)\n const firstValue = values[0]\n if (firstValue === undefined) return false\n\n for (let i = 1; i < values.length; i++) {\n if (values[i] !== firstValue + i) return false\n }\n\n return true\n}\n\n/**\n * Generate string union from enum member values\n * type Status = \"pending\" | \"active\"\n */\nfunction generateStringUnionEnum(className: string, members: EnumMember[]): string {\n const values = members.map((m) => `\"${m.value}\"`).join(\" | \")\n return `type ${className} = ${values}`\n}\n\n/**\n * Generate string union from enum member names\n * type Color = \"RED\" | \"GREEN\" | \"BLUE\"\n */\nfunction generateNameUnionEnum(className: string, members: EnumMember[]): string {\n const names = members.map((m) => `\"${m.name}\"`).join(\" | \")\n return `type ${className} = ${names}`\n}\n\n/**\n * Generate as const object with union type\n * const HttpStatus = { OK: 200, NOT_FOUND: 404 } as const\n * type HttpStatus = typeof HttpStatus[keyof typeof HttpStatus]\n */\nfunction generateConstObjectEnum(className: string, members: EnumMember[]): string {\n const entries = members.map((m) => ` ${m.name}: ${m.value}`).join(\",\\n\")\n return `const ${className} = {\\n${entries}\\n} as const\\ntype ${className} = typeof ${className}[keyof typeof ${className}]`\n}\n\n// ============================================================================\n// TypedDict Transformation\n// ============================================================================\n\n/**\n * Check if TypedDict has total=False in parent list\n */\nfunction checkTypedDictTotalFalse(node: SyntaxNode, ctx: TransformContext): boolean {\n const children = getChildren(node)\n for (const child of children) {\n if (child.name === \"ArgList\") {\n const argText = getNodeText(child, ctx.source)\n // Check for total=False or total: False\n if (argText.includes(\"total=False\") || argText.includes(\"total: False\")) {\n return true\n }\n }\n }\n return false\n}\n\n/**\n * Transform a TypedDict class to a TypeScript interface\n */\nfunction transformTypedDict(\n className: string,\n body: SyntaxNode | null,\n totalFalse: boolean,\n ctx: TransformContext\n): string {\n const fields = body ? extractDataclassFields(body, ctx) : []\n const memberIndent = \" \"\n\n const members = fields.map((f) => {\n const optional = totalFalse ? \"?\" : \"\"\n return `${memberIndent}${f.name}${optional}: ${f.tsType}`\n })\n\n if (members.length === 0) {\n return `interface ${className} {}`\n }\n\n return `interface ${className} {\\n${members.join(\"\\n\")}\\n}`\n}\n\n// ============================================================================\n// Abstract Class Transformation\n// ============================================================================\n\n/**\n * Transform an ABC (Abstract Base Class) to a TypeScript abstract class\n */\nfunction transformAbstractClass(\n className: string,\n parentClasses: string[],\n body: SyntaxNode | null,\n ctx: TransformContext,\n jsdoc: string | null\n): string {\n // Filter out ABC from parent classes\n const filteredParents = parentClasses.filter((p) => p !== \"ABC\")\n\n // Build class header\n let classHeader = `abstract class ${className}`\n const firstParent = filteredParents[0]\n if (firstParent) {\n classHeader += ` extends ${firstParent}`\n }\n\n // Transform class body with abstract method support\n ctx.isAbstractClass = true\n const bodyCode = body ? transformClassBody(body, ctx, false) : \"\"\n ctx.isAbstractClass = false\n\n const classDecl = `${classHeader} {\\n${bodyCode}\\n}`\n return jsdoc ? `${jsdoc}\\n${classDecl}` : classDecl\n}\n\n// ============================================================================\n// Protocol Transformation\n// ============================================================================\n\n/**\n * Transform a Protocol class to a TypeScript interface\n */\nfunction transformProtocol(\n className: string,\n parentClasses: string[],\n body: SyntaxNode | null,\n ctx: TransformContext\n): string {\n const memberIndent = \" \"\n const members: string[] = []\n\n // Check for Generic[T] in parent classes\n const genericParams = extractGenericParams(parentClasses)\n const genericStr = genericParams.length > 0 ? `<${genericParams.join(\", \")}>` : \"\"\n\n // Find other parent protocols (excluding Protocol and Generic[...])\n const otherParents = parentClasses.filter((p) => p !== \"Protocol\" && !p.startsWith(\"Generic[\"))\n\n if (body) {\n const children = getChildren(body)\n for (const child of children) {\n if (child.name === \":\") continue\n if (child.name === \"PassStatement\") continue\n\n // Handle method definitions\n if (child.name === \"FunctionDefinition\") {\n const sig = extractProtocolMethodSignature(child, ctx)\n if (sig) {\n members.push(`${memberIndent}${sig}`)\n }\n }\n // Handle typed fields\n else if (child.name === \"ExpressionStatement\" || child.name === \"AssignStatement\") {\n const field =\n parseDataclassFieldFromExpression(child, ctx) ||\n parseDataclassFieldFromAssignment(child, ctx)\n if (field) {\n members.push(`${memberIndent}${field.name}: ${field.tsType}`)\n }\n }\n }\n }\n\n // Build interface header\n let header = `interface ${className}${genericStr}`\n if (otherParents.length > 0) {\n header += ` extends ${otherParents.join(\", \")}`\n }\n\n if (members.length === 0) {\n return `${header} {}`\n }\n\n return `${header} {\\n${members.join(\"\\n\")}\\n}`\n}\n\n/**\n * Extract method signature from a FunctionDefinition for Protocol interface\n */\nfunction extractProtocolMethodSignature(node: SyntaxNode, ctx: TransformContext): string | null {\n const children = getChildren(node)\n let methodName = \"\"\n let params: string[] = []\n let returnType = \"void\"\n\n for (const child of children) {\n if (child.name === \"def\") continue\n\n if (child.name === \"VariableName\" && !methodName) {\n methodName = getNodeText(child, ctx.source)\n } else if (child.name === \"ParamList\") {\n params = extractProtocolParams(child, ctx)\n } else if (child.name === \"TypeDef\") {\n const rt = extractTypeAnnotation(child, ctx)\n if (rt) returnType = rt === \"null\" ? \"void\" : rt\n }\n }\n\n if (!methodName || methodName === \"__init__\") return null\n\n return `${methodName}(${params.join(\", \")}): ${returnType}`\n}\n\n/**\n * Extract parameter list for Protocol method (excluding self)\n */\nfunction extractProtocolParams(node: SyntaxNode, ctx: TransformContext): string[] {\n const children = getChildren(node)\n const params: string[] = []\n\n let i = 0\n while (i < children.length) {\n const child = children[i]\n if (!child || child.name === \"(\" || child.name === \")\" || child.name === \",\") {\n i++\n continue\n }\n\n if (child.name === \"VariableName\") {\n const paramName = getNodeText(child, ctx.source)\n // Skip self/cls\n if (paramName === \"self\" || paramName === \"cls\") {\n i++\n continue\n }\n\n // Check for type annotation\n let paramType = \"unknown\"\n const nextChild = children[i + 1]\n if (nextChild?.name === \"TypeDef\") {\n const t = extractTypeAnnotation(nextChild, ctx)\n if (t) paramType = t\n i++\n }\n\n params.push(`${paramName}: ${paramType}`)\n }\n i++\n }\n\n return params\n}\n\n// ============================================================================\n// Generic Class Transformation\n// ============================================================================\n\n/**\n * Extract generic type parameters from parent classes\n * e.g., [\"Generic[T, V]\"] -> [\"T\", \"V\"]\n */\nfunction extractGenericParams(parentClasses: string[]): string[] {\n for (const parent of parentClasses) {\n if (parent.startsWith(\"Generic[\") && parent.endsWith(\"]\")) {\n // Extract \"T, V\" from \"Generic[T, V]\"\n const inner = parent.slice(8, -1) // Remove \"Generic[\" and \"]\"\n return inner.split(\",\").map((p) => p.trim())\n }\n }\n return []\n}\n\n/**\n * Transform a generic class (class Foo(Generic[T])) to TypeScript\n */\nfunction transformGenericClass(\n className: string,\n genericParams: string[],\n parentClasses: string[],\n body: SyntaxNode | null,\n ctx: TransformContext,\n jsdoc: string | null\n): string {\n // Build generic parameters string\n const genericStr = `<${genericParams.join(\", \")}>`\n\n // Build class header\n let classHeader = `class ${className}${genericStr}`\n\n // Add extends if there are other parent classes\n const firstParent = parentClasses[0]\n if (firstParent) {\n classHeader += ` extends ${firstParent}`\n }\n\n // Transform class body\n const bodyCode = body ? transformClassBody(body, ctx, false) : \"\"\n\n const classDecl = `${classHeader} {\\n${bodyCode}\\n}`\n return jsdoc ? `${jsdoc}\\n${classDecl}` : classDecl\n}\n\ninterface ParsedParam {\n name: string\n type: string | null\n defaultValue: string | null\n}\n\nfunction transformParamList(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const params: string[] = []\n const kwOnlyParams: ParsedParam[] = []\n let restParam: string | null = null\n let kwargsParam: string | null = null\n let inKeywordOnly = false\n let i = 0\n\n // Helper to parse a single parameter\n const parseParam = (startIndex: number): { param: ParsedParam; consumed: number } | null => {\n const child = children[startIndex]\n if (!child || child.name !== \"VariableName\") return null\n\n const nameCode = getNodeText(child, ctx.source)\n let tsType: string | null = null\n let defaultValue: string | null = null\n let offset = 1\n\n // Check for type annotation\n const nextChild = children[startIndex + 1]\n if (nextChild && nextChild.name === \"TypeDef\") {\n tsType = extractTypeAnnotation(nextChild, ctx)\n offset = 2\n }\n\n // Check for default value\n const afterType = children[startIndex + offset]\n if (afterType && afterType.name === \"AssignOp\") {\n const defaultValChild = children[startIndex + offset + 1]\n if (defaultValChild) {\n defaultValue = transformNode(defaultValChild, ctx)\n offset += 2\n }\n }\n\n return {\n param: { name: nameCode, type: tsType, defaultValue },\n consumed: offset\n }\n }\n\n // Helper to format a regular parameter\n const formatParam = (p: ParsedParam): string => {\n const typeAnnotation = p.type ? `: ${p.type}` : \"\"\n if (p.defaultValue !== null) {\n return `${p.name}${typeAnnotation} = ${p.defaultValue}`\n }\n return `${p.name}${typeAnnotation}`\n }\n\n while (i < children.length) {\n const child = children[i]\n if (!child) {\n i++\n continue\n }\n\n // Skip parentheses, commas, and positional-only marker (/)\n if (child.name === \"(\" || child.name === \")\" || child.name === \",\" || child.name === \"/\") {\n i++\n continue\n }\n\n // Check for * (either *args or keyword-only marker)\n if (child.name === \"*\" || getNodeText(child, ctx.source) === \"*\") {\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"VariableName\") {\n // This is *args (rest parameter)\n const name = getNodeText(nextChild, ctx.source)\n const typeChild = children[i + 2]\n if (typeChild && typeChild.name === \"TypeDef\") {\n const tsType = extractTypeAnnotation(typeChild, ctx)\n restParam = tsType ? `...${name}: ${tsType}[]` : `...${name}`\n i += 3\n } else {\n restParam = `...${name}`\n i += 2\n }\n // After *args, remaining params are keyword-only\n inKeywordOnly = true\n continue\n }\n // Bare * - keyword-only marker\n inKeywordOnly = true\n i++\n continue\n }\n\n // Check for **kwargs\n if (child.name === \"**\" || getNodeText(child, ctx.source) === \"**\") {\n const nextChild = children[i + 1]\n if (nextChild && nextChild.name === \"VariableName\") {\n kwargsParam = getNodeText(nextChild, ctx.source)\n i += 2\n continue\n }\n i++\n continue\n }\n\n // Handle regular parameter\n if (child.name === \"VariableName\") {\n const result = parseParam(i)\n if (result) {\n if (inKeywordOnly) {\n kwOnlyParams.push(result.param)\n } else {\n params.push(formatParam(result.param))\n }\n i += result.consumed\n continue\n }\n }\n\n // Parameter with default value wrapped in a node (legacy handling)\n if (child.name === \"AssignParam\" || child.name === \"DefaultParam\") {\n const paramChildren = getChildren(child)\n const name = paramChildren.find((c) => c.name === \"VariableName\")\n const typeDef = paramChildren.find((c) => c.name === \"TypeDef\")\n const defaultVal = paramChildren[paramChildren.length - 1]\n\n if (name) {\n const nameCode = getNodeText(name, ctx.source)\n const tsType = extractTypeAnnotation(typeDef, ctx)\n let defaultValue: string | null = null\n\n if (defaultVal && name !== defaultVal && defaultVal.name !== \"TypeDef\") {\n defaultValue = transformNode(defaultVal, ctx)\n }\n\n const param: ParsedParam = { name: nameCode, type: tsType, defaultValue }\n if (inKeywordOnly) {\n kwOnlyParams.push(param)\n } else {\n params.push(formatParam(param))\n }\n }\n i++\n continue\n }\n\n i++\n }\n\n // Build keyword-only params as destructured options object\n if (kwOnlyParams.length > 0) {\n const destructuredNames: string[] = []\n const typeProps: string[] = []\n const defaults: string[] = []\n\n for (const p of kwOnlyParams) {\n destructuredNames.push(p.name)\n // All keyword-only params are optional in the type (they have defaults or caller must provide)\n const propType = p.type ?? \"unknown\"\n typeProps.push(`${p.name}?: ${propType}`)\n if (p.defaultValue !== null) {\n defaults.push(`${p.name} = ${p.defaultValue}`)\n } else {\n defaults.push(p.name)\n }\n }\n\n const destructure = `{ ${defaults.join(\", \")} }`\n const typeAnnotation = `{ ${typeProps.join(\"; \")} }`\n params.push(`${destructure}: ${typeAnnotation} = {}`)\n }\n\n // Add kwargs parameter if present\n if (kwargsParam) {\n const kwargsType = \": Record<string, unknown>\"\n params.push(`${kwargsParam}${kwargsType} = {}`)\n }\n\n // Add rest parameter last (must be last in JS)\n if (restParam) {\n params.push(restParam)\n }\n\n return params.join(\", \")\n}\n\nfunction transformComment(node: SyntaxNode, ctx: TransformContext): string {\n const text = getNodeText(node, ctx.source)\n // Convert Python comment to JS comment\n return \"//\" + text.slice(1)\n}\n\nfunction transformLambdaExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Lambda format: lambda params: body\n // Find the ParamList (or individual params) and the body expression\n let params = \"\"\n let body: SyntaxNode | null = null\n\n // Skip 'lambda' keyword and ':' to find params and body\n let foundLambda = false\n let foundColon = false\n const paramNodes: SyntaxNode[] = []\n\n for (const child of children) {\n const text = getNodeText(child, ctx.source)\n\n if (child.name === \"lambda\" || (child.name === \"Keyword\" && text === \"lambda\")) {\n foundLambda = true\n continue\n }\n\n if (child.name === \":\") {\n foundColon = true\n continue\n }\n\n if (foundLambda && !foundColon) {\n // This is a parameter\n if (child.name === \"ParamList\") {\n params = transformParamList(child, ctx)\n } else if (child.name === \"VariableName\") {\n paramNodes.push(child)\n } else if (child.name !== \",\") {\n paramNodes.push(child)\n }\n } else if (foundColon) {\n // This is the body\n body = child\n break\n }\n }\n\n // If we collected individual param nodes, join them\n if (!params && paramNodes.length > 0) {\n params = paramNodes.map((p) => getNodeText(p, ctx.source)).join(\", \")\n }\n\n const bodyCode = body ? transformNode(body, ctx) : \"\"\n\n // TypeScript arrow function: (params) => body\n if (params) {\n return `(${params}) => ${bodyCode}`\n }\n return `() => ${bodyCode}`\n}\n\n// ============================================================\n// Comprehensions\n// ============================================================\n\ninterface ComprehensionClause {\n type: \"for\" | \"if\"\n variable?: string\n iterable?: string\n condition?: string\n}\n\nfunction parseComprehensionClauses(\n children: SyntaxNode[],\n ctx: TransformContext\n): {\n outputExpr: string\n clauses: ComprehensionClause[]\n} {\n // Skip brackets\n const items = children.filter(\n (c) => c.name !== \"[\" && c.name !== \"]\" && c.name !== \"{\" && c.name !== \"}\"\n )\n\n if (items.length === 0) {\n return { outputExpr: \"\", clauses: [] }\n }\n\n // First item is the output expression\n const outputNode = items[0]\n if (!outputNode) {\n return { outputExpr: \"\", clauses: [] }\n }\n const outputExpr = transformNode(outputNode, ctx)\n\n const clauses: ComprehensionClause[] = []\n let i = 1\n\n while (i < items.length) {\n const item = items[i]\n if (!item) {\n i++\n continue\n }\n\n if (\n item.name === \"for\" ||\n (item.name === \"Keyword\" && getNodeText(item, ctx.source) === \"for\")\n ) {\n // for variable in iterable\n const varNode = items[i + 1]\n // Skip 'in' keyword\n const iterableNode = items[i + 3]\n\n if (varNode && iterableNode) {\n clauses.push({\n type: \"for\",\n variable: transformNode(varNode, ctx),\n iterable: transformNode(iterableNode, ctx)\n })\n i += 4\n } else {\n i++\n }\n } else if (\n item.name === \"if\" ||\n (item.name === \"Keyword\" && getNodeText(item, ctx.source) === \"if\")\n ) {\n // if condition\n const conditionNode = items[i + 1]\n if (conditionNode) {\n clauses.push({\n type: \"if\",\n condition: transformNode(conditionNode, ctx)\n })\n i += 2\n } else {\n i++\n }\n } else if (\n item.name === \"in\" ||\n (item.name === \"Keyword\" && getNodeText(item, ctx.source) === \"in\")\n ) {\n // Skip 'in' keyword (already handled in 'for' case)\n i++\n } else {\n i++\n }\n }\n\n return { outputExpr, clauses }\n}\n\nfunction transformArrayComprehension(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const { outputExpr, clauses } = parseComprehensionClauses(children, ctx)\n\n if (clauses.length === 0) {\n return `[${outputExpr}]`\n }\n\n // Build the comprehension from inside out\n // [expr for x in items if cond] -> items.filter(x => cond).map(x => expr)\n // [expr for x in a for y in b] -> a.flatMap(x => b.map(y => expr))\n\n return buildComprehensionChain(outputExpr, clauses, \"array\")\n}\n\nfunction transformDictComprehension(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n\n // Dict comprehension has key: value as output\n // Find the colon to split key and value\n const items = children.filter((c) => c.name !== \"{\" && c.name !== \"}\")\n\n let keyExpr = \"\"\n let valueExpr = \"\"\n let colonIndex = -1\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]\n if (item?.name === \":\") {\n colonIndex = i\n break\n }\n }\n\n const keyNode = items[0]\n const valueNode = items[colonIndex + 1]\n if (colonIndex > 0 && keyNode && valueNode) {\n keyExpr = transformNode(keyNode, ctx)\n valueExpr = transformNode(valueNode, ctx)\n }\n\n // Parse clauses starting after key: value\n const clauseItems = items.slice(colonIndex + 2)\n const clauses: ComprehensionClause[] = []\n let i = 0\n\n while (i < clauseItems.length) {\n const item = clauseItems[i]\n if (!item) {\n i++\n continue\n }\n\n if (\n item.name === \"for\" ||\n (item.name === \"Keyword\" && getNodeText(item, ctx.source) === \"for\")\n ) {\n // Collect all variables between 'for' and 'in' (handles tuple unpacking like 'for k, v in ...')\n const variables: string[] = []\n let j = i + 1\n while (j < clauseItems.length) {\n const currentItem = clauseItems[j]\n if (\n currentItem?.name === \"in\" ||\n (currentItem && getNodeText(currentItem, ctx.source) === \"in\")\n ) {\n break\n }\n const varItem = clauseItems[j]\n if (varItem && varItem.name !== \",\") {\n variables.push(transformNode(varItem, ctx))\n }\n j++\n }\n\n // Skip 'in' and get iterable\n const iterableNode = clauseItems[j + 1]\n\n const firstVariable = variables[0]\n if (variables.length > 0 && iterableNode && firstVariable) {\n const variable = variables.length === 1 ? firstVariable : `[${variables.join(\", \")}]`\n clauses.push({\n type: \"for\",\n variable,\n iterable: transformNode(iterableNode, ctx)\n })\n i = j + 2\n } else {\n i++\n }\n } else if (\n item.name === \"if\" ||\n (item.name === \"Keyword\" && getNodeText(item, ctx.source) === \"if\")\n ) {\n const conditionNode = clauseItems[i + 1]\n if (conditionNode) {\n clauses.push({\n type: \"if\",\n condition: transformNode(conditionNode, ctx)\n })\n i += 2\n } else {\n i++\n }\n } else {\n i++\n }\n }\n\n ctx.usesRuntime.add(\"dict\")\n return buildDictComprehensionChain(keyExpr, valueExpr, clauses)\n}\n\nfunction transformSetExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const elements = children.filter((c) => c.name !== \"{\" && c.name !== \"}\" && c.name !== \",\")\n\n ctx.usesRuntime.add(\"set\")\n const elementCodes = elements.map((el) => transformNode(el, ctx))\n return `set([${elementCodes.join(\", \")}])`\n}\n\nfunction transformSetComprehension(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const { outputExpr, clauses } = parseComprehensionClauses(children, ctx)\n\n if (clauses.length === 0) {\n ctx.usesRuntime.add(\"set\")\n return `set([${outputExpr}])`\n }\n\n ctx.usesRuntime.add(\"set\")\n const arrayComp = buildComprehensionChain(outputExpr, clauses, \"array\")\n return `set(${arrayComp})`\n}\n\nfunction transformGeneratorExpression(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n // Filter out parentheses\n const items = children.filter((c) => c.name !== \"(\" && c.name !== \")\")\n const { outputExpr, clauses } = parseComprehensionClauses(items, ctx)\n\n if (clauses.length === 0) {\n return outputExpr\n }\n\n // Build generator function: (function*() { for (const x of items) if (cond) yield expr })()\n return buildGeneratorChain(outputExpr, clauses)\n}\n\nfunction buildGeneratorChain(outputExpr: string, clauses: ComprehensionClause[]): string {\n // Separate for-clauses and their associated if-clauses\n const forClauses: { variable: string; iterable: string; conditions: string[] }[] = []\n\n for (const clause of clauses) {\n if (clause.type === \"for\" && clause.variable && clause.iterable) {\n forClauses.push({\n variable: clause.variable,\n iterable: clause.iterable,\n conditions: []\n })\n } else if (clause.type === \"if\" && clause.condition && forClauses.length > 0) {\n const lastFor = forClauses[forClauses.length - 1]\n if (lastFor) {\n lastFor.conditions.push(clause.condition)\n }\n }\n }\n\n if (forClauses.length === 0) {\n return `(function*() { yield ${outputExpr}; })()`\n }\n\n // Build nested for loops with conditions\n // (function*() { for (const x of items) if (cond) yield expr })()\n let body = \"\"\n let indent = \"\"\n const indentStep = \" \"\n\n // Open for loops\n for (const fc of forClauses) {\n body += `${indent}for (const ${fc.variable} of ${fc.iterable}) `\n\n if (fc.conditions.length > 0) {\n const combinedCond = fc.conditions.join(\" && \")\n body += `if (${combinedCond}) `\n }\n\n indent += indentStep\n }\n\n // Add yield\n body += `yield ${outputExpr};`\n\n return `(function*() { ${body} })()`\n}\n\n/**\n * Wrap iterables that don't have array methods (like py.range()) with spread syntax\n * to convert them to arrays that have .map(), .filter(), .flatMap()\n */\nfunction wrapIterableIfNeeded(iterable: string): string {\n // Check if iterable is py.range(), py.enumerate(), py.zip(), py.reversed(), py.filter(), py.map()\n // These return Iterables, not Arrays\n if (\n iterable.startsWith(\"range(\") ||\n iterable.startsWith(\"enumerate(\") ||\n iterable.startsWith(\"zip(\") ||\n iterable.startsWith(\"reversed(\") ||\n iterable.startsWith(\"filter(\") ||\n iterable.startsWith(\"map(\")\n ) {\n return `[...${iterable}]`\n }\n return iterable\n}\n\nfunction buildComprehensionChain(\n outputExpr: string,\n clauses: ComprehensionClause[],\n type: \"array\" | \"generator\"\n): string {\n if (clauses.length === 0) {\n return type === \"array\" ? `[${outputExpr}]` : outputExpr\n }\n\n // Separate for-clauses and their associated if-clauses\n const forClauses: { variable: string; iterable: string; conditions: string[] }[] = []\n\n for (const clause of clauses) {\n if (clause.type === \"for\" && clause.variable && clause.iterable) {\n forClauses.push({\n variable: clause.variable,\n iterable: clause.iterable,\n conditions: []\n })\n } else if (clause.type === \"if\" && clause.condition && forClauses.length > 0) {\n const lastFor = forClauses[forClauses.length - 1]\n if (lastFor) {\n lastFor.conditions.push(clause.condition)\n }\n }\n }\n\n if (forClauses.length === 0) {\n return type === \"array\" ? `[${outputExpr}]` : outputExpr\n }\n\n // Build chain from innermost to outermost\n // Single for: items.filter(...).map(...)\n // Multiple for: a.flatMap(x => b.filter(...).map(...))\n\n if (forClauses.length === 1) {\n const fc = forClauses[0]\n if (!fc) return `[${outputExpr}]`\n\n // Wrap iterables that are not arrays (like py.range()) with spread syntax\n let chain = wrapIterableIfNeeded(fc.iterable)\n\n // Add filters\n for (const cond of fc.conditions) {\n chain = `${chain}.filter((${fc.variable}) => ${cond})`\n }\n\n // Add map\n chain = `${chain}.map((${fc.variable}) => ${outputExpr})`\n\n return chain\n }\n\n // Multiple for-clauses: use flatMap\n // Build from outside in\n let result = \"\"\n\n for (let i = 0; i < forClauses.length; i++) {\n const fc = forClauses[i]\n if (!fc) continue\n\n const isLast = i === forClauses.length - 1\n\n // Wrap iterables that are not arrays (like py.range()) with spread syntax\n let inner = wrapIterableIfNeeded(fc.iterable)\n\n // Add filters\n for (const cond of fc.conditions) {\n inner = `${inner}.filter((${fc.variable}) => ${cond})`\n }\n\n if (isLast) {\n // Innermost: use map\n inner = `${inner}.map((${fc.variable}) => ${outputExpr})`\n } else {\n // Not innermost: will wrap next level\n result = inner\n continue\n }\n\n // Now wrap from inside out\n for (let j = forClauses.length - 2; j >= 0; j--) {\n const outerFc = forClauses[j]\n if (!outerFc) continue\n\n // Wrap iterables that are not arrays (like py.range()) with spread syntax\n let outerChain = wrapIterableIfNeeded(outerFc.iterable)\n for (const cond of outerFc.conditions) {\n outerChain = `${outerChain}.filter((${outerFc.variable}) => ${cond})`\n }\n\n inner = `${outerChain}.flatMap((${outerFc.variable}) => ${inner})`\n }\n\n result = inner\n break\n }\n\n return result\n}\n\nfunction buildDictComprehensionChain(\n keyExpr: string,\n valueExpr: string,\n clauses: ComprehensionClause[]\n): string {\n if (clauses.length === 0) {\n return `dict([[${keyExpr}, ${valueExpr}]])`\n }\n\n // Build array of [key, value] pairs, then wrap with py.dict\n const forClauses: { variable: string; iterable: string; conditions: string[] }[] = []\n\n for (const clause of clauses) {\n if (clause.type === \"for\" && clause.variable && clause.iterable) {\n forClauses.push({\n variable: clause.variable,\n iterable: clause.iterable,\n conditions: []\n })\n } else if (clause.type === \"if\" && clause.condition && forClauses.length > 0) {\n const lastFor = forClauses[forClauses.length - 1]\n if (lastFor) {\n lastFor.conditions.push(clause.condition)\n }\n }\n }\n\n if (forClauses.length === 0) {\n return `dict([[${keyExpr}, ${valueExpr}]])`\n }\n\n const pairExpr = `[${keyExpr}, ${valueExpr}]`\n const arrayComp = buildComprehensionChain(pairExpr, clauses, \"array\")\n\n return `dict(${arrayComp})`\n}\n\n// ============================================================\n// Scope Statements (global, nonlocal)\n// ============================================================\n\nfunction transformScopeStatement(node: SyntaxNode, ctx: TransformContext): string {\n // global and nonlocal don't have direct JS equivalents\n // JS has different scoping rules - these are converted to comments\n const children = getChildren(node)\n const keyword = children.find((c) => c.name === \"global\" || c.name === \"nonlocal\")\n const keywordText = keyword ? getNodeText(keyword, ctx.source) : \"scope\"\n const vars = children\n .filter((c) => c.name === \"VariableName\")\n .map((c) => getNodeText(c, ctx.source))\n\n return `/* ${keywordText} ${vars.join(\", \")} */`\n}\n\n// ============================================================\n// Delete Statement\n// ============================================================\n\nfunction transformDeleteStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const targets = children.filter((c) => c.name !== \"del\" && c.name !== \",\")\n\n const deletions = targets.map((target) => {\n if (target.name === \"MemberExpression\") {\n // del obj[key] or del obj.attr\n const memberChildren = getChildren(target)\n const obj = memberChildren[0]\n const bracket = memberChildren.find((c) => c.name === \"[\")\n\n if (bracket) {\n // del arr[index] - use splice for numeric index, delete for string key\n const objCode = obj ? transformNode(obj, ctx) : \"\"\n const indexNode = memberChildren.find((c) => c.name !== \"[\" && c.name !== \"]\" && c !== obj)\n const indexCode = indexNode ? transformNode(indexNode, ctx) : \"0\"\n\n // Check if index is a simple number\n if (indexNode?.name === \"Number\") {\n return `${objCode}.splice(${indexCode}, 1)`\n }\n // For other cases, use delete\n return `delete ${objCode}[${indexCode}]`\n } else {\n /* v8 ignore next 2 -- del obj.attr edge case @preserve */\n // del obj.attr\n return `delete ${transformNode(target, ctx)}`\n }\n } else if (target.name === \"VariableName\") {\n // del variable - not really possible in JS strict mode\n // Convert to setting undefined\n const varName = getNodeText(target, ctx.source)\n return `${varName} = undefined`\n }\n /* v8 ignore next -- fallback for complex del targets @preserve */\n return `delete ${transformNode(target, ctx)}`\n })\n\n return deletions.join(\";\\n\")\n}\n\n// ============================================================\n// Assert Statement\n// ============================================================\n\nfunction transformAssertStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n // Find the condition (first expression after 'assert')\n const expressions = children.filter((c) => c.name !== \"assert\" && c.name !== \",\")\n\n const condition = expressions[0]\n const message = expressions[1]\n\n const conditionCode = condition ? transformNode(condition, ctx) : \"true\"\n const messageCode = message ? transformNode(message, ctx) : '\"Assertion failed\"'\n\n return `if (!(${conditionCode})) throw new Error(${messageCode})`\n}\n\n// ============================================================\n// Yield Statement (including yield from)\n// ============================================================\n\nfunction transformYieldStatement(node: SyntaxNode, ctx: TransformContext): string {\n const children = getChildren(node)\n const hasFrom = children.some((c) => c.name === \"from\")\n const valueNode = children.find((c) => c.name !== \"yield\" && c.name !== \"from\")\n\n if (hasFrom && valueNode) {\n // yield from expr -> yield* expr\n return `yield* ${transformNode(valueNode, ctx)}`\n } else if (valueNode) {\n // yield expr\n return `yield ${transformNode(valueNode, ctx)}`\n }\n /* v8 ignore next -- bare yield statement @preserve */\n return \"yield\"\n}\n\nexport { transformNode, createContext }\n","import { transform, type TransformResult } from \"../transformer/index.js\"\nimport type { ParseResult } from \"../parser/index.js\"\nimport * as prettier from \"prettier\"\n\nexport interface GeneratorOptions {\n includeRuntime?: boolean\n runtimeImportPath?: string\n}\n\nexport interface GeneratedCode {\n code: string\n runtimeImport: string | null\n usedRuntimeFunctions: string[]\n}\n\nconst defaultOptions: GeneratorOptions = {\n includeRuntime: true,\n runtimeImportPath: \"pythonlib\"\n}\n\n/** Prettier configuration for generated TypeScript code */\nconst prettierOptions: prettier.Options = {\n parser: \"typescript\",\n singleQuote: false,\n tabWidth: 2,\n trailingComma: \"none\",\n printWidth: 100,\n semi: false,\n bracketSpacing: true,\n arrowParens: \"always\",\n endOfLine: \"lf\"\n}\n\n/** List of functions available in the main pythonlib export (builtins + core) */\nconst BUILTINS = new Set([\n // Core operations\n \"floorDiv\",\n \"pow\",\n \"mod\",\n \"sprintf\",\n \"slice\",\n \"at\",\n \"contains\",\n \"repeatValue\",\n \"strFormat\",\n \"divMod\",\n // Collection constructors\n \"list\",\n \"dict\",\n \"set\",\n \"tuple\",\n // Iteration\n \"len\",\n \"range\",\n \"enumerate\",\n \"zip\",\n \"sorted\",\n \"reversed\",\n \"iter\",\n \"map\",\n \"filter\",\n // Aggregation\n \"abs\",\n \"min\",\n \"max\",\n \"sum\",\n \"all\",\n \"any\",\n \"round\",\n // Character/number conversion\n \"ord\",\n \"chr\",\n \"hex\",\n \"oct\",\n \"bin\",\n // Type conversion\n \"int\",\n \"float\",\n \"str\",\n \"bool\",\n \"repr\",\n \"ascii\",\n // Type checking & misc\n \"isinstance\",\n \"type\",\n \"input\",\n \"format\"\n])\n\n/** Mapping of module namespaces that should still use namespace.method() style */\nconst MODULE_NAMESPACES = new Set([\"string\", \"list\", \"dict\", \"set\"])\n\n/**\n * Generate TypeScript code from Python (sync, unformatted)\n * For formatted output, use generateAsync()\n */\nexport function generate(\n input: string | ParseResult,\n options: GeneratorOptions = {}\n): GeneratedCode {\n const opts = { ...defaultOptions, ...options }\n const result: TransformResult = transform(input)\n\n const usedRuntimeFunctions = Array.from(result.usesRuntime).sort()\n\n let runtimeImport: string | null = null\n if (opts.includeRuntime && usedRuntimeFunctions.length > 0) {\n const basePath = opts.runtimeImportPath ?? \"pythonlib\"\n runtimeImport = buildRuntimeImports(usedRuntimeFunctions, basePath)\n }\n\n let code = result.code\n\n // Add hoisted imports (imports that were inside function bodies) at the top\n if (result.hoistedImports.length > 0) {\n const hoistedCode = result.hoistedImports.join(\"\\n\")\n code = hoistedCode + \"\\n\\n\" + code\n }\n\n // Add runtime import at the top if needed\n if (runtimeImport) {\n code = runtimeImport + \"\\n\\n\" + code\n }\n\n return {\n code,\n runtimeImport,\n usedRuntimeFunctions\n }\n}\n\n/**\n * Build import statements from pythonlib based on what's used.\n *\n * Format of usedFunctions:\n * - Builtins: \"len\", \"range\", \"sorted\"\n * - Core ops: \"floordiv\", \"mod\", \"pow\", \"slice\"\n * - Module functions: \"itertools/chain\", \"json/dump\", \"re/match\"\n * - Namespace methods: \"list.append\", \"dict.get\", \"string.join\"\n */\nfunction buildRuntimeImports(usedFunctions: string[], basePath: string): string {\n // Group imports by module\n const mainImports = new Set<string>()\n const moduleImports = new Map<string, Set<string>>()\n\n for (const func of usedFunctions) {\n // Module function: \"itertools/chain\" -> import { chain } from \"pythonlib/itertools\"\n if (func.includes(\"/\")) {\n const [moduleName, funcName] = func.split(\"/\")\n if (moduleName && funcName) {\n let funcs = moduleImports.get(moduleName)\n if (!funcs) {\n funcs = new Set()\n moduleImports.set(moduleName, funcs)\n }\n funcs.add(funcName)\n }\n continue\n }\n\n // Namespace methods: \"list.append\" -> import { list } from \"pythonlib\"\n if (func.includes(\".\")) {\n const [namespace] = func.split(\".\")\n if (namespace && MODULE_NAMESPACES.has(namespace)) {\n mainImports.add(namespace)\n }\n continue\n }\n\n // Module namespaces used directly (for namespace.method() style)\n if (MODULE_NAMESPACES.has(func)) {\n mainImports.add(func)\n continue\n }\n\n // Builtins and core ops -> import from main \"pythonlib\"\n if (BUILTINS.has(func)) {\n mainImports.add(func)\n continue\n }\n\n /* v8 ignore next 2 -- fallback for future/unknown runtime functions @preserve */\n // Unknown - add to main imports (for future compatibility)\n mainImports.add(func)\n }\n\n // Build import statements\n const importStatements: string[] = []\n\n // Main pythonlib imports\n if (mainImports.size > 0) {\n const sorted = Array.from(mainImports).sort()\n importStatements.push(`import { ${sorted.join(\", \")} } from \"${basePath}\"`)\n }\n\n // Module-specific imports (sorted by module name)\n const sortedModules = Array.from(moduleImports.keys()).sort()\n for (const moduleName of sortedModules) {\n const funcSet = moduleImports.get(moduleName)\n if (funcSet) {\n const funcs = Array.from(funcSet).sort()\n importStatements.push(`import { ${funcs.join(\", \")} } from \"${basePath}/${moduleName}\"`)\n }\n }\n\n return importStatements.join(\"\\n\")\n}\n\n/**\n * Transpile Python to TypeScript (sync, unformatted)\n * For formatted output, use transpileAsync()\n */\nexport function transpile(python: string, options: GeneratorOptions = {}): string {\n return generate(python, options).code\n}\n\n/* v8 ignore start -- async wrappers tested via CLI @preserve */\n/**\n * Format TypeScript code using Prettier\n */\nexport async function formatCode(code: string): Promise<string> {\n try {\n return await prettier.format(code, prettierOptions)\n } catch {\n // If formatting fails (e.g., syntax error in generated code), return unformatted\n return code\n }\n}\n\n/**\n * Generate TypeScript code from Python (async, formatted with Prettier)\n */\nexport async function generateAsync(\n input: string | ParseResult,\n options: GeneratorOptions = {}\n): Promise<GeneratedCode> {\n const result = generate(input, options)\n const formattedCode = await formatCode(result.code)\n\n return {\n ...result,\n code: formattedCode\n }\n}\n\n/**\n * Transpile Python to TypeScript (async, formatted with Prettier)\n */\nexport async function transpileAsync(\n python: string,\n options: GeneratorOptions = {}\n): Promise<string> {\n const result = await generateAsync(python, options)\n return result.code\n}\n/* v8 ignore stop */\n"],"mappings":"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","names":["right","leftCode","rightCode","caseValue","targets","target","targetCode","tsType","typeAnnotation","modifiers","prefix","methodDecl","i"]}
|