{"version":3,"file":"codeFrame.js","names":[],"sources":["../src/codeFrame.ts"],"sourcesContent":["import os from 'node:os'\n\nimport { codeFrameColumns, type SourceLocation } from '@babel/code-frame'\n\n/**\n * Create a code frame from source code and location\n * @param source source code\n * @param location babel compatible location to highlight\n */\nexport function createFrame(source: string, location: SourceLocation): string {\n return codeFrameColumns(source, location, {\n // worker tty did not fork parent process stdout, let's make a workaround\n forceColor: true,\n })\n .split('\\n')\n .map((line) => ` ${line}`)\n .join(os.EOL)\n}\n\nexport function tsLikeLocToBabelLoc(\n tsLoc: Record<\n 'start' | 'end',\n { line: number; character: number } /** 0-based */\n >,\n): SourceLocation {\n return {\n start: { line: tsLoc.start.line + 1, column: tsLoc.start.character + 1 },\n end: { line: tsLoc.end.line + 1, column: tsLoc.end.character + 1 },\n }\n}\n\nexport function lineColLocToBabelLoc(d: {\n line: number\n column: number\n endLine?: number\n endColumn?: number\n}): SourceLocation {\n return {\n start: { line: d.line, column: d.column },\n end: { line: d.endLine || 0, column: d.endColumn },\n }\n}\n\n/**\n * Convert a [startOffset, length] range into a Babel-compatible SourceLocation.\n * - Lines/columns are 1-based.\n * - Offsets and length are clamped to source bounds.\n * - Single-pass up to the end offset, minimal allocations.\n */\nexport function offsetRangeToBabelLocation(\n source: string,\n offset: number,\n length: number,\n): SourceLocation {\n const defaultPos = { line: 1, column: 1 }\n\n if (!source || source.length === 0) {\n return { start: { ...defaultPos }, end: { ...defaultPos } }\n }\n\n const startIndex = offset\n const endIndex = offset + length\n\n let line = 1\n let column = 1\n\n let start: { line: number; column: number } | null = null\n\n for (let i = 0; i < endIndex; i++) {\n if (i === startIndex) {\n start = { line, column }\n }\n // '\\n' charCode is 10\n if (source[i] === '\\n') {\n line++\n column = 1\n } else {\n column++\n }\n }\n\n start ??= { line, column }\n const end = { line, column }\n\n return { start, end }\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,YAAY,QAAgB,UAAkC;CAC5E,OAAO,iBAAiB,QAAQ,UAAU,EAExC,YAAY,KACd,CAAC,CAAC,CACC,MAAM,IAAI,CAAC,CACX,KAAK,SAAS,KAAK,MAAM,CAAC,CAC1B,KAAK,GAAG,GAAG;AAChB;AAEA,SAAgB,oBACd,OAIgB;CAChB,OAAO;EACL,OAAO;GAAE,MAAM,MAAM,MAAM,OAAO;GAAG,QAAQ,MAAM,MAAM,YAAY;EAAE;EACvE,KAAK;GAAE,MAAM,MAAM,IAAI,OAAO;GAAG,QAAQ,MAAM,IAAI,YAAY;EAAE;CACnE;AACF;AAEA,SAAgB,qBAAqB,GAKlB;CACjB,OAAO;EACL,OAAO;GAAE,MAAM,EAAE;GAAM,QAAQ,EAAE;EAAO;EACxC,KAAK;GAAE,MAAM,EAAE,WAAW;GAAG,QAAQ,EAAE;EAAU;CACnD;AACF;;;;;;;AAQA,SAAgB,2BACd,QACA,QACA,QACgB;CAChB,MAAM,aAAa;EAAE,MAAM;EAAG,QAAQ;CAAE;CAExC,IAAI,CAAC,UAAU,OAAO,WAAW,GAC/B,OAAO;EAAE,OAAO,EAAE,GAAG,WAAW;EAAG,KAAK,EAAE,GAAG,WAAW;CAAE;CAG5D,MAAM,aAAa;CACnB,MAAM,WAAW,SAAS;CAE1B,IAAI,OAAO;CACX,IAAI,SAAS;CAEb,IAAI,QAAiD;CAErD,KAAK,IAAI,IAAI,GAAG,IAAI,UAAU,KAAK;EACjC,IAAI,MAAM,YACR,QAAQ;GAAE;GAAM;EAAO;EAGzB,IAAI,OAAO,OAAO,MAAM;GACtB;GACA,SAAS;EACX,OACE;CAEJ;CAEA,UAAU;EAAE;EAAM;CAAO;CAGzB,OAAO;EAAE;EAAO,KAAA;GAFF;GAAM;EAEF;CAAE;AACtB"}