{"version":3,"names":["MouseParser","mouseButtonsPressed","Set","SCROLL_DIRECTIONS","reset","clear","decodeInput","data","buf","Buffer","isBuffer","from","buffer","byteOffset","byteLength","toString","parseMouseEvent","str","parsed","parseMouseSequenceAt","event","parseAllMouseEvents","events","offset","length","push","consumed","startsWith","introducer","parseSgrSequence","parseBasicSequence","index","values","part","hasDigit","char","charCode","charCodeAt","decodeSgrEvent","buttonByte","x","y","decodeBasicEvent","rawButtonCode","wireX","wireY","pressRelease","button","isScroll","scrollDirection","undefined","isMotion","modifiers","shift","alt","ctrl","type","scrollInfo","isDragging","size","direction","delta","add","scroll","actualButton"],"sources":["parse-mouse.ts"],"sourcesContent":["/** biome-ignore-all lint/style/noNonNullAssertion: vendored from OpenTUI — array access with known-valid indices in mouse protocol parsing */\nexport type MouseEventType =\n\t| \"down\"\n\t| \"up\"\n\t| \"move\"\n\t| \"drag\"\n\t| \"drag-end\"\n\t| \"drop\"\n\t| \"over\"\n\t| \"out\"\n\t| \"scroll\";\n\nexport interface ScrollInfo {\n\tdelta: number;\n\tdirection: \"up\" | \"down\" | \"left\" | \"right\";\n}\n\nexport type RawMouseEvent = {\n\ttype: MouseEventType;\n\tbutton: number;\n\tx: number;\n\ty: number;\n\tmodifiers: { shift: boolean; alt: boolean; ctrl: boolean };\n\tscroll?: ScrollInfo;\n};\n\ntype ParsedMouseSequence = {\n\tevent: RawMouseEvent;\n\tconsumed: number;\n};\n\nexport class MouseParser {\n\tprivate mouseButtonsPressed = new Set<number>();\n\n\tprivate static readonly SCROLL_DIRECTIONS: Record<\n\t\tnumber,\n\t\t\"up\" | \"down\" | \"left\" | \"right\"\n\t> = {\n\t\t0: \"up\",\n\t\t1: \"down\",\n\t\t2: \"left\",\n\t\t3: \"right\",\n\t};\n\n\tpublic reset(): void {\n\t\tthis.mouseButtonsPressed.clear();\n\t}\n\n\t// Preserve raw byte values so X10 payload bytes >= 0x80 remain intact.\n\t// SGR sequences are ASCII digits + separators and are unaffected either way.\n\tprivate decodeInput(data: Buffer | Uint8Array): string {\n\t\tconst buf = Buffer.isBuffer(data)\n\t\t\t? data\n\t\t\t: Buffer.from(data.buffer, data.byteOffset, data.byteLength);\n\t\treturn buf.toString(\"latin1\");\n\t}\n\n\tpublic parseMouseEvent(data: Buffer | Uint8Array): RawMouseEvent | null {\n\t\tconst str = this.decodeInput(data);\n\t\tconst parsed = this.parseMouseSequenceAt(str, 0);\n\t\treturn parsed?.event ?? null;\n\t}\n\n\tpublic parseAllMouseEvents(data: Buffer | Uint8Array): RawMouseEvent[] {\n\t\tconst str = this.decodeInput(data);\n\t\tconst events: RawMouseEvent[] = [];\n\t\tlet offset = 0;\n\n\t\twhile (offset < str.length) {\n\t\t\tconst parsed = this.parseMouseSequenceAt(str, offset);\n\t\t\tif (!parsed) {\n\t\t\t\t// Stop at the first non-mouse sequence. Callers can decide whether to\n\t\t\t\t// route any remaining data through keyboard/terminal input handling.\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tevents.push(parsed.event);\n\t\t\toffset += parsed.consumed;\n\t\t}\n\n\t\treturn events;\n\t}\n\n\tprivate parseMouseSequenceAt(\n\t\tstr: string,\n\t\toffset: number,\n\t): ParsedMouseSequence | null {\n\t\tif (!str.startsWith(\"\\x1b[\", offset)) return null;\n\t\tconst introducer = str[offset + 2];\n\n\t\tif (introducer === \"<\") {\n\t\t\treturn this.parseSgrSequence(str, offset);\n\t\t}\n\n\t\tif (introducer === \"M\") {\n\t\t\treturn this.parseBasicSequence(str, offset);\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate parseSgrSequence(\n\t\tstr: string,\n\t\toffset: number,\n\t): ParsedMouseSequence | null {\n\t\tlet index = offset + 3;\n\t\tconst values = [0, 0, 0];\n\t\tlet part = 0;\n\t\tlet hasDigit = false;\n\n\t\twhile (index < str.length) {\n\t\t\tconst char = str[index];\n\t\t\tconst charCode = str.charCodeAt(index);\n\n\t\t\tif (charCode >= 48 && charCode <= 57) {\n\t\t\t\thasDigit = true;\n\t\t\t\tvalues[part] = values[part]! * 10 + (charCode - 48);\n\t\t\t\tindex++;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tswitch (char) {\n\t\t\t\tcase \";\": {\n\t\t\t\t\tif (!hasDigit || part >= 2) return null;\n\t\t\t\t\tpart++;\n\t\t\t\t\thasDigit = false;\n\t\t\t\t\tindex++;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tcase \"M\":\n\t\t\t\tcase \"m\": {\n\t\t\t\t\tif (!hasDigit || part !== 2) return null;\n\n\t\t\t\t\treturn {\n\t\t\t\t\t\tevent: this.decodeSgrEvent(\n\t\t\t\t\t\t\tvalues[0]!,\n\t\t\t\t\t\t\tvalues[1]!,\n\t\t\t\t\t\t\tvalues[2]!,\n\t\t\t\t\t\t\tchar,\n\t\t\t\t\t\t),\n\t\t\t\t\t\tconsumed: index - offset + 1,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tdefault:\n\t\t\t\t\treturn null;\n\t\t\t}\n\t\t}\n\n\t\treturn null;\n\t}\n\n\tprivate parseBasicSequence(\n\t\tstr: string,\n\t\toffset: number,\n\t): ParsedMouseSequence | null {\n\t\t// ESC [ M + 3 bytes\n\t\tif (offset + 6 > str.length) return null;\n\n\t\tconst buttonByte = str.charCodeAt(offset + 3) - 32;\n\t\t// Convert from 1-based to 0-based\n\t\tconst x = str.charCodeAt(offset + 4) - 33;\n\t\tconst y = str.charCodeAt(offset + 5) - 33;\n\n\t\treturn {\n\t\t\tevent: this.decodeBasicEvent(buttonByte, x, y),\n\t\t\tconsumed: 6,\n\t\t};\n\t}\n\n\tprivate decodeSgrEvent(\n\t\trawButtonCode: number,\n\t\twireX: number,\n\t\twireY: number,\n\t\tpressRelease: \"M\" | \"m\",\n\t): RawMouseEvent {\n\t\tconst button = rawButtonCode & 3;\n\t\tconst isScroll = (rawButtonCode & 64) !== 0;\n\t\tconst scrollDirection = !isScroll\n\t\t\t? undefined\n\t\t\t: MouseParser.SCROLL_DIRECTIONS[button];\n\n\t\tconst isMotion = (rawButtonCode & 32) !== 0;\n\t\tconst modifiers = {\n\t\t\tshift: (rawButtonCode & 4) !== 0,\n\t\t\talt: (rawButtonCode & 8) !== 0,\n\t\t\tctrl: (rawButtonCode & 16) !== 0,\n\t\t};\n\n\t\tlet type: MouseEventType;\n\t\tlet scrollInfo: ScrollInfo | undefined;\n\n\t\tif (isMotion) {\n\t\t\tconst isDragging = this.mouseButtonsPressed.size > 0;\n\n\t\t\tif (button === 3) {\n\t\t\t\ttype = \"move\";\n\t\t\t} else if (isDragging) {\n\t\t\t\ttype = \"drag\";\n\t\t\t} else {\n\t\t\t\ttype = \"move\";\n\t\t\t}\n\t\t} else if (isScroll && pressRelease === \"M\") {\n\t\t\ttype = \"scroll\";\n\t\t\tscrollInfo = {\n\t\t\t\tdirection: scrollDirection!,\n\t\t\t\tdelta: 1,\n\t\t\t};\n\t\t} else {\n\t\t\ttype = pressRelease === \"M\" ? \"down\" : \"up\";\n\n\t\t\tif (type === \"down\" && button !== 3) {\n\t\t\t\tthis.mouseButtonsPressed.add(button);\n\t\t\t} else if (type === \"up\") {\n\t\t\t\tthis.mouseButtonsPressed.clear();\n\t\t\t}\n\t\t}\n\n\t\treturn {\n\t\t\ttype,\n\t\t\tbutton: button === 3 ? 0 : button,\n\t\t\tx: wireX - 1,\n\t\t\ty: wireY - 1,\n\t\t\tmodifiers,\n\t\t\tscroll: scrollInfo,\n\t\t};\n\t}\n\n\tprivate decodeBasicEvent(\n\t\tbuttonByte: number,\n\t\tx: number,\n\t\ty: number,\n\t): RawMouseEvent {\n\t\tconst button = buttonByte & 3;\n\t\tconst isScroll = (buttonByte & 64) !== 0;\n\t\tconst isMotion = (buttonByte & 32) !== 0;\n\t\tconst scrollDirection = !isScroll\n\t\t\t? undefined\n\t\t\t: MouseParser.SCROLL_DIRECTIONS[button];\n\n\t\tconst modifiers = {\n\t\t\tshift: (buttonByte & 4) !== 0,\n\t\t\talt: (buttonByte & 8) !== 0,\n\t\t\tctrl: (buttonByte & 16) !== 0,\n\t\t};\n\n\t\tlet type: MouseEventType;\n\t\tlet actualButton: number;\n\t\tlet scrollInfo: ScrollInfo | undefined;\n\n\t\tif (isMotion) {\n\t\t\ttype = \"move\";\n\t\t\tactualButton = button === 3 ? -1 : button;\n\t\t} else if (isScroll) {\n\t\t\ttype = \"scroll\";\n\t\t\tactualButton = 0;\n\t\t\tscrollInfo = {\n\t\t\t\tdirection: scrollDirection!,\n\t\t\t\tdelta: 1,\n\t\t\t};\n\t\t} else {\n\t\t\ttype = button === 3 ? \"up\" : \"down\";\n\t\t\tactualButton = button === 3 ? 0 : button;\n\t\t}\n\n\t\treturn {\n\t\t\ttype,\n\t\t\tbutton: actualButton,\n\t\t\tx,\n\t\t\ty,\n\t\t\tmodifiers,\n\t\t\tscroll: scrollInfo,\n\t\t};\n\t}\n}\n"],"mappings":"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","ignoreList":[]}