Files
OmniRoute/open-sse/services/compression/engines/rtk/codeStripper.ts
Diego Rodrigues de Sa e Souza 3d75fb3fae Release v3.8.0 (#2073)
Integrated into release/v3.8.0
2026-05-10 00:55:06 -03:00

95 lines
2.8 KiB
TypeScript

export type CodeLanguage =
| "javascript"
| "typescript"
| "python"
| "rust"
| "go"
| "ruby"
| "java"
| "unknown";
export interface CodeStripperOptions {
removeComments?: boolean;
removeEmptyLines?: boolean;
collapseWhitespace?: boolean;
preserveDocstrings?: boolean;
}
const LANGUAGE_ALIASES: Record<string, CodeLanguage> = {
js: "javascript",
jsx: "javascript",
javascript: "javascript",
ts: "typescript",
tsx: "typescript",
typescript: "typescript",
py: "python",
python: "python",
rs: "rust",
rust: "rust",
go: "go",
rb: "ruby",
ruby: "ruby",
java: "java",
};
export function normalizeCodeLanguage(language?: string | null): CodeLanguage {
if (!language) return "unknown";
return LANGUAGE_ALIASES[language.trim().toLowerCase()] ?? "unknown";
}
export function detectCodeLanguage(text: string): CodeLanguage {
if (/\b(?:interface|type)\s+\w+\s*=|:\s*(?:string|number|boolean)\b/.test(text)) {
return "typescript";
}
if (/\b(?:const|let|function|import|export)\b|=>/.test(text)) return "javascript";
if (/\bdef\s+\w+\(|\bimport\s+\w+|print\(/.test(text)) return "python";
if (/\bfn\s+\w+\(|\blet\s+mut\b|println!\(/.test(text)) return "rust";
if (/\bfunc\s+\w+\(|package\s+\w+/.test(text)) return "go";
if (/\bclass\s+\w+|System\.out\.println/.test(text)) return "java";
if (/\bdef\s+\w+|puts\s+|end\s*$/.test(text)) return "ruby";
return "unknown";
}
export function stripCode(
text: string,
language: CodeLanguage = "unknown",
options: CodeStripperOptions = {}
): {
text: string;
strippedLines: number;
language: CodeLanguage;
} {
const resolvedLanguage = language === "unknown" ? detectCodeLanguage(text) : language;
const opts: Required<CodeStripperOptions> = {
removeComments: options.removeComments !== false,
removeEmptyLines: options.removeEmptyLines !== false,
collapseWhitespace: options.collapseWhitespace !== false,
preserveDocstrings: options.preserveDocstrings === true,
};
const originalLines = text.split(/\r?\n/).length;
let result = text;
if (opts.removeEmptyLines) result = result.replace(/^\s*$(?:\r?\n)?/gm, "");
if (opts.collapseWhitespace) {
result = result
.split(/\r?\n/)
.map((line) => line.replace(/[ \t]+$/g, ""))
.join("\n");
}
result = result.replace(/^\s*\n/, "").replace(/\n\s*$/, "");
const strippedLines = Math.max(0, originalLines - (result ? result.split(/\r?\n/).length : 0));
return { text: result, strippedLines, language: resolvedLanguage };
}
export function stripCodeComments(
text: string,
language = "typescript"
): {
text: string;
stripped: boolean;
} {
const result = stripCode(text, normalizeCodeLanguage(language));
return { text: result.text, stripped: result.strippedLines > 0 || result.text !== text };
}