{"version":3,"file":"tokenizer.mjs","names":[],"sources":["../../src/files-touched/tokenizer.ts"],"sourcesContent":["// ---------------------------------------------------------------------------\n// Shell tokenizer — splits a shell command string into token arrays\n// ---------------------------------------------------------------------------\n\nexport function tokenizeShellCommand(cmd: string): string[] {\n\tconst tokens: string[] = [];\n\tlet current = '';\n\tlet quote: '\"' | \"'\" | null = null;\n\tlet escaped = false;\n\n\tconst flush = () => {\n\t\tif (current) {\n\t\t\ttokens.push(current);\n\t\t\tcurrent = '';\n\t\t}\n\t};\n\n\tfor (let index = 0; index < cmd.length; index += 1) {\n\t\tconst char = cmd[index];\n\t\tconst next = cmd[index + 1] ?? '';\n\n\t\tif (escaped) {\n\t\t\tcurrent += char;\n\t\t\tescaped = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (quote) {\n\t\t\tif (char === '\\\\') {\n\t\t\t\tescaped = true;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (char === quote) {\n\t\t\t\tquote = null;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tcurrent += char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\\\\') {\n\t\t\tescaped = true;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '\"' || char === \"'\") {\n\t\t\tquote = char;\n\t\t\tcontinue;\n\t\t}\n\t\tif (/\\s/.test(char)) {\n\t\t\tflush();\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === ';') {\n\t\t\tflush();\n\t\t\ttokens.push(char);\n\t\t\tcontinue;\n\t\t}\n\t\tif ((char === '&' || char === '|') && next === char) {\n\t\t\tflush();\n\t\t\ttokens.push(char + next);\n\t\t\tindex += 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (char === '&' || char === '|') {\n\t\t\tflush();\n\t\t\ttokens.push(char);\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent += char;\n\t}\n\n\tflush();\n\treturn tokens;\n}\n\nexport function splitShellCommands(cmd: string): string[][] {\n\tconst commands: string[][] = [];\n\tlet current: string[] = [];\n\tfor (const token of tokenizeShellCommand(cmd)) {\n\t\tif (token === ';' || token === '&&' || token === '||' || token === '|' || token === '&') {\n\t\t\tif (current.length > 0) {\n\t\t\t\tcommands.push(current);\n\t\t\t\tcurrent = [];\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\t\tcurrent.push(token);\n\t}\n\tif (current.length > 0) commands.push(current);\n\treturn commands;\n}\n\nexport function stripShellCommandWrappers(tokens: string[]): string[] {\n\tlet current = [...tokens];\n\twhile (current.length > 0 && /^[A-Za-z_][A-Za-z0-9_]*=.*/.test(current[0])) {\n\t\tcurrent = current.slice(1);\n\t}\n\tfor (const wrapper of ['command', 'env', 'noglob', 'sudo']) {\n\t\tif (current[0] !== wrapper) continue;\n\t\tcurrent = current.slice(1);\n\t\twhile (current.length > 0 && /^[A-Za-z_][A-Za-z0-9_]*=.*/.test(current[0])) {\n\t\t\tcurrent = current.slice(1);\n\t\t}\n\t}\n\treturn current;\n}\n\nexport function extractShellOperands(tokens: string[]): string[] {\n\tconst operands: string[] = [];\n\tlet allowFlags = true;\n\tfor (const token of tokens) {\n\t\tif (allowFlags && token === '--') {\n\t\t\tallowFlags = false;\n\t\t\tcontinue;\n\t\t}\n\t\tif (allowFlags && token.startsWith('-')) continue;\n\t\toperands.push(token);\n\t}\n\treturn operands;\n}\n"],"mappings":";AAIA,SAAgB,qBAAqB,KAAuB;CAC3D,MAAM,SAAmB,CAAC;CAC1B,IAAI,UAAU;CACd,IAAI,QAA0B;CAC9B,IAAI,UAAU;CAEd,MAAM,cAAc;EACnB,IAAI,SAAS;GACZ,OAAO,KAAK,OAAO;GACnB,UAAU;EACX;CACD;CAEA,KAAK,IAAI,QAAQ,GAAG,QAAQ,IAAI,QAAQ,SAAS,GAAG;EACnD,MAAM,OAAO,IAAI;EACjB,MAAM,OAAO,IAAI,QAAQ,MAAM;EAE/B,IAAI,SAAS;GACZ,WAAW;GACX,UAAU;GACV;EACD;EACA,IAAI,OAAO;GACV,IAAI,SAAS,MAAM;IAClB,UAAU;IACV;GACD;GACA,IAAI,SAAS,OAAO;IACnB,QAAQ;IACR;GACD;GACA,WAAW;GACX;EACD;EACA,IAAI,SAAS,MAAM;GAClB,UAAU;GACV;EACD;EACA,IAAI,SAAS,QAAO,SAAS,KAAK;GACjC,QAAQ;GACR;EACD;EACA,IAAI,KAAK,KAAK,IAAI,GAAG;GACpB,MAAM;GACN;EACD;EACA,IAAI,SAAS,KAAK;GACjB,MAAM;GACN,OAAO,KAAK,IAAI;GAChB;EACD;EACA,KAAK,SAAS,OAAO,SAAS,QAAQ,SAAS,MAAM;GACpD,MAAM;GACN,OAAO,KAAK,OAAO,IAAI;GACvB,SAAS;GACT;EACD;EACA,IAAI,SAAS,OAAO,SAAS,KAAK;GACjC,MAAM;GACN,OAAO,KAAK,IAAI;GAChB;EACD;EACA,WAAW;CACZ;CAEA,MAAM;CACN,OAAO;AACR;AAEA,SAAgB,mBAAmB,KAAyB;CAC3D,MAAM,WAAuB,CAAC;CAC9B,IAAI,UAAoB,CAAC;CACzB,KAAK,MAAM,SAAS,qBAAqB,GAAG,GAAG;EAC9C,IAAI,UAAU,OAAO,UAAU,QAAQ,UAAU,QAAQ,UAAU,OAAO,UAAU,KAAK;GACxF,IAAI,QAAQ,SAAS,GAAG;IACvB,SAAS,KAAK,OAAO;IACrB,UAAU,CAAC;GACZ;GACA;EACD;EACA,QAAQ,KAAK,KAAK;CACnB;CACA,IAAI,QAAQ,SAAS,GAAG,SAAS,KAAK,OAAO;CAC7C,OAAO;AACR;AAEA,SAAgB,0BAA0B,QAA4B;CACrE,IAAI,UAAU,CAAC,GAAG,MAAM;CACxB,OAAO,QAAQ,SAAS,KAAK,6BAA6B,KAAK,QAAQ,EAAE,GACxE,UAAU,QAAQ,MAAM,CAAC;CAE1B,KAAK,MAAM,WAAW;EAAC;EAAW;EAAO;EAAU;CAAM,GAAG;EAC3D,IAAI,QAAQ,OAAO,SAAS;EAC5B,UAAU,QAAQ,MAAM,CAAC;EACzB,OAAO,QAAQ,SAAS,KAAK,6BAA6B,KAAK,QAAQ,EAAE,GACxE,UAAU,QAAQ,MAAM,CAAC;CAE3B;CACA,OAAO;AACR;AAEA,SAAgB,qBAAqB,QAA4B;CAChE,MAAM,WAAqB,CAAC;CAC5B,IAAI,aAAa;CACjB,KAAK,MAAM,SAAS,QAAQ;EAC3B,IAAI,cAAc,UAAU,MAAM;GACjC,aAAa;GACb;EACD;EACA,IAAI,cAAc,MAAM,WAAW,GAAG,GAAG;EACzC,SAAS,KAAK,KAAK;CACpB;CACA,OAAO;AACR"}