export const BLOCKED_CODE_EXTENSIONS = new Set([ "py", "pyc", "pyo", "pyw", "pyx", "ipynb", "js", "mjs", "cjs", "jsx", "ts", "tsx", "php", "phtml", "php3", "php4", "php5", "rb", "erb", "pl", "pm", "lua", "sh", "bash", "zsh", "ksh", "fish", "ps1", "psm1", "psd1", "bat", "cmd", "vbs", "applescript", "ahk", "au3", "tcl", "c", "h", "cpp", "cc", "cxx", "hpp", "hh", "hxx", "cs", "vb", "java", "class", "jar", "go", "rs", "swift", "kt", "kts", "scala", "groovy", "gradle", "d", "nim", "cr", "zig", "v", "vhd", "vhdl", "asm", "s", "f", "f90", "f95", "for", "pas", "pp", "ada", "adb", "ads", "cob", "cbl", "hs", "lhs", "ml", "mli", "fs", "fsx", "fsi", "clj", "cljs", "cljc", "edn", "lisp", "lsp", "scm", "ss", "rkt", "ex", "exs", "erl", "hrl", "jl", "elm", "purs", "re", "rei", "sol", "move", "pro", "m", "html", "htm", "css", "scss", "sass", "less", "vue", "svelte", "json5", "o", "so", "dll", "exe", "dylib", "wasm", "wat", "bin", "out", "deb", "rpm", "app", "apk", "ipa", "sql", "psql", "ino", "pde", "sas", "do", ]) export function getAllExtensions(name: string): string[] { const parts = name.split(".") if (parts.length <= 1) return [] return parts.slice(1).map((ext) => ext.toLowerCase()) } export function hasBlockedCodeExtension(name: string): boolean { const exts = getAllExtensions(name) return exts.some((ext) => BLOCKED_CODE_EXTENSIONS.has(ext)) } export function filterBlockedFiles( files: T[], ): { allowed: T[]; rejected: T[] } { const allowed: T[] = [] const rejected: T[] = [] for (const f of files) { if (hasBlockedCodeExtension(f.name)) { rejected.push(f) } else { allowed.push(f) } } return { allowed, rejected } }