{"version":3,"file":"parsers-B3DEX1vA.cjs","names":["isNonEmptyString","isPlainObject","punycodeUtilsJS","createMessage"],"sources":["../src/parsers/_private/extensions.ts","../src/parsers/extractFileName.ts"],"sourcesContent":["// ==========================\n// Single extensions\n// ==========================\nexport const EXTENSIONS_FILE = new Set([\n  // 📄 Text & Document\n  \"txt\",\n  \"md\",\n  \"rtf\",\n  \"tex\",\n  \"doc\",\n  \"docx\",\n  \"odt\",\n  \"ott\",\n  \"pdf\",\n  \"djvu\",\n  \"epub\",\n  \"fb2\",\n  \"lit\",\n  \"lrf\",\n  \"xls\",\n  \"xlsx\",\n  \"ods\",\n  \"csv\",\n  \"tsv\",\n  \"ppt\",\n  \"pptx\",\n  \"pps\",\n  \"bib\",\n  \"cba\",\n  \"cbt\",\n  \"cbz\",\n  \"cbr\",\n  \"opds\",\n  \"fodt\",\n  \"pages\",\n  \"rtfd\",\n  \"sxc\",\n  \"sxw\",\n  \"wpd\",\n  \"xps\",\n  \"dotx\",\n  \"dotm\",\n  \"xltx\",\n  \"xltm\",\n  \"sldx\",\n  \"sldm\",\n  \"fods\",\n  \"mdx\",\n  \"markdown\",\n  \"texi\",\n  \"textile\",\n\n  // 🖼️ Image\n  \"jpg\",\n  \"jpeg\",\n  \"png\",\n  \"gif\",\n  \"bmp\",\n  \"tif\",\n  \"tiff\",\n  \"webp\",\n  \"svg\",\n  \"ico\",\n  \"heif\",\n  \"heic\",\n  \"raw\",\n  \"cr2\",\n  \"nef\",\n  \"orf\",\n  \"sr2\",\n  \"dng\",\n  \"dds\",\n  \"psd\",\n  \"exr\",\n  \"xcf\",\n  \"ai\",\n  \"eps\",\n  \"cdr\",\n  \"indd\",\n  \"pcx\",\n  \"pgm\",\n  \"ppm\",\n  \"pbm\",\n  \"pnm\",\n  \"jfif\",\n  \"ras\",\n  \"tga\",\n  \"j2k\",\n  \"jp2\",\n  \"emf\",\n  \"wmf\",\n  \"hdp\",\n  \"mdi\",\n  \"hevc\",\n\n  // 🎵 Audio\n  \"mp3\",\n  \"wav\",\n  \"ogg\",\n  \"flac\",\n  \"aac\",\n  \"m4a\",\n  \"wma\",\n  \"alac\",\n  \"aiff\",\n  \"aif\",\n  \"amr\",\n  \"mid\",\n  \"midi\",\n  \"opus\",\n  \"au\",\n  \"caf\",\n  \"ape\",\n  \"mka\",\n  \"spx\",\n  \"ra\",\n  \"ram\",\n  \"mpc\",\n  \"wv\",\n  \"aifc\",\n  \"mod\",\n  \"it\",\n  \"s3m\",\n  \"xm\",\n  \"kar\",\n  \"m4b\",\n  \"voc\",\n  \"snd\",\n  \"a52\",\n  \"ac3\",\n  \"dts\",\n\n  // 🎥 Video\n  \"mp4\",\n  \"mkv\",\n  \"avi\",\n  \"mov\",\n  \"wmv\",\n  \"webm\",\n  \"mpeg\",\n  \"mpg\",\n  \"3gp\",\n  \"3g2\",\n  \"m4v\",\n  \"ts\",\n  \"mts\",\n  \"asf\",\n  \"rm\",\n  \"rmvb\",\n  \"vob\",\n  \"f4v\",\n  \"ogv\",\n  \"m2ts\",\n  \"dav\",\n  \"mxf\",\n  \"mjpeg\",\n  \"flv\",\n  \"divx\",\n  \"f4a\",\n  \"f4p\",\n  \"m2v\",\n  \"ogm\",\n  \"vp8\",\n  \"vp9\",\n  \"xvid\",\n  \"yuv\",\n  \"mng\",\n  \"dv\",\n  \"m1v\",\n  \"roq\",\n  \"m2t\",\n  \"av1\",\n  \"hevc\",\n  \"m3u\",\n  \"m3u8\",\n\n  // 🗃️ Archive & Compression\n  \"zip\",\n  \"rar\",\n  \"7z\",\n  \"tar\",\n  \"gz\",\n  \"bz\",\n  \"bz2\",\n  \"xz\",\n  \"tgz\",\n  \"tbz2\",\n  \"txz\",\n  \"lz\",\n  \"lzma\",\n  \"z\",\n  \"cab\",\n  \"arj\",\n  \"ace\",\n  \"rpm\",\n  \"deb\",\n  \"pkg\",\n  \"apk\",\n  \"jar\",\n  \"war\",\n  \"ear\",\n  \"sit\",\n  \"sitx\",\n  \"cpgz\",\n  \"tlz\",\n  \"tlzma\",\n  \"tzo\",\n  \"cpio\",\n  \"shar\",\n  \"bzip\",\n  \"gzip\",\n  \"7zip\",\n  \"rar5\",\n  \"tbz\",\n  \"txz\",\n\n  // 💾 Disk Image\n  \"iso\",\n  \"img\",\n  \"vhd\",\n  \"vmdk\",\n  \"qcow2\",\n  \"vhdx\",\n  \"bin\",\n  \"cue\",\n  \"nrg\",\n  \"daa\",\n  \"sdi\",\n  \"vfd\",\n  \"ima\",\n  \"dmg\",\n  \"vdi\",\n  \"toast\",\n  \"ccd\",\n  \"mdf\",\n  \"cdi\",\n  \"bif\",\n  \"bifc\",\n  \"bifd\",\n\n  // 🗃️ Database & Data\n  \"sql\",\n  \"db\",\n  \"dbf\",\n  \"mdb\",\n  \"accdb\",\n  \"json\",\n  \"toml\",\n  \"ini\",\n  \"log\",\n  \"plist\",\n  \"pkl\",\n  \"msgpack\",\n  \"h5\",\n  \"hdf5\",\n  \"parquet\",\n  \"avro\",\n  \"orc\",\n  \"ndjson\",\n  \"pdb\",\n  \"sqlite\",\n  \"sqlite3\",\n  \"dbx\",\n  \"sdf\",\n  \"nc\",\n  \"netcdf\",\n  \"grib\",\n  \"geojson\",\n  \"gml\",\n  \"hjson\",\n  \"cdb\",\n  \"db3\",\n  \"dta\",\n  \"sav\",\n  \"sas7bdat\",\n  \"ldif\",\n  \"fdb\",\n  \"gdb\",\n  \"sqlite2\",\n  \"h5ad\",\n  \"nc4\",\n  \"xmind\",\n  \"drawio\",\n  \"sdc\",\n  \"jsonl\",\n  \"yaml\",\n  \"yml\",\n  \"toml\",\n\n  // 💻 Code & Script\n  \"js\",\n  \"jsx\",\n  \"ts\",\n  \"tsx\",\n  \"c\",\n  \"cpp\",\n  \"net\",\n  \"h\",\n  \"hpp\",\n  \"java\",\n  \"py\",\n  \"rb\",\n  \"go\",\n  \"rs\",\n  \"php\",\n  \"pl\",\n  \"sh\",\n  \"bat\",\n  \"cmd\",\n  \"ps1\",\n  \"lua\",\n  \"swift\",\n  \"kt\",\n  \"scala\",\n  \"cs\",\n  \"vb\",\n  \"dart\",\n  \"m\",\n  \"r\",\n  \"jl\",\n  \"fs\",\n  \"vbproj\",\n  \"sln\",\n  \"pri\",\n  \"gemspec\",\n  \"gradle\",\n  \"coffee\",\n  \"erl\",\n  \"ex\",\n  \"exs\",\n  \"hs\",\n  \"lisp\",\n  \"clj\",\n  \"groovy\",\n  \"scm\",\n  \"vbs\",\n  \"nim\",\n  \"rkt\",\n  \"ml\",\n  \"mli\",\n  \"fsx\",\n  \"psm1\",\n  \"cbl\",\n  \"for\",\n  \"f90\",\n  \"lock\",\n  \"tsconfig\",\n  \"vue\",\n  \"svelte\",\n  \"cjs\",\n  \"mjs\",\n  \"mts\",\n  \"cts\",\n  \"json5\",\n  \"es6\",\n  \"module\",\n  \"systemjs\",\n\n  // 🌐 Web & Config\n  \"html\",\n  \"htm\",\n  \"xhtml\",\n  \"css\",\n  \"scss\",\n  \"sass\",\n  \"less\",\n  \"xml\",\n  \"xlf\",\n  \"po\",\n  \"pot\",\n  \"jsp\",\n  \"asp\",\n  \"aspx\",\n  \"jspf\",\n  \"cgi\",\n  \"cfm\",\n  \"env\",\n  \"babelrc\",\n  \"cfg\",\n  \"config\",\n  \"conf\",\n  \"editorconfig\",\n  \"eslintrc\",\n  \"gitconfig\",\n  \"gitattributes\",\n  \"gitignore\",\n  \"prettierrc\",\n  \"webmanifest\",\n  \"dockerfile\",\n  // \".dockerfile\",\n\n  // 🔠 Font\n  \"ttf\",\n  \"otf\",\n  \"woff\",\n  \"woff2\",\n  \"eot\",\n  \"dfont\",\n  \"pfa\",\n  \"pfb\",\n  \"fon\",\n  \"fnt\",\n  \"bdf\",\n  \"ps\",\n\n  // 🗺️ CAD & GIS\n  \"dwg\",\n  \"dxf\",\n  \"shp\",\n  \"kml\",\n  \"kmz\",\n  \"gpx\",\n  \"stl\",\n  \"step\",\n  \"iges\",\n  \"igs\",\n  \"3ds\",\n  \"3dm\",\n  \"fbx\",\n  \"obj\",\n  \"dae\",\n  \"ifc\",\n\n  // 🔧 System / Binary / Execution\n  \"exe\",\n  \"msi\",\n  \"run\",\n  \"com\",\n  \"app\",\n  \"elf\",\n  \"dll\",\n  \"so\",\n  \"dylib\",\n  \"sys\",\n  \"scr\",\n  \"bin\",\n  \"out\",\n\n  // 🔐 Certificates / Crypto\n  \"pem\",\n  \"crt\",\n  \"cer\",\n  \"der\",\n  \"csr\",\n  \"p12\",\n  \"pfx\",\n  \"jks\",\n  \"asc\",\n  \"gpg\",\n  \"pgp\",\n  \"p7b\",\n  \"p7c\",\n  \"spc\",\n  \"key\",\n  \"pub\",\n  \"cert\",\n  \"p7m\",\n\n  // 🎮 Games & Projects\n  \"nes\",\n  \"sfc\",\n  \"gba\",\n  \"nds\",\n  \"rom\",\n  \"pak\",\n  \"vpk\",\n  \"bik\",\n  \"cso\",\n  \"wad\",\n  \"wadx\",\n  \"smc\",\n  \"gb\",\n  \"gbc\",\n\n  // 🔬 Bioinformatics\n  \"fasta\",\n  \"fa\",\n  \"fas\",\n  \"ffn\",\n  \"faa\",\n  \"fna\",\n  \"frn\",\n  \"fastq\",\n  \"fq\",\n  \"bam\",\n  \"bed\",\n  \"sam\",\n  \"vcf\",\n  \"gff\",\n  \"gff3\",\n  \"gtf\",\n  \"fai\",\n  \"tbi\",\n  \"fast5\",\n  \"fqz\",\n  \"fq5\"\n]);\n\n// ==========================\n// Double extensions\n// ==========================\nexport const DOUBLE_EXTENSIONS_FILE = new Set([\n  \"log.gz\",\n  \"tar.gz\",\n  \"tar.bz2\",\n  \"tar.bz\",\n  \"tar.xz\",\n  \"tar.lz\",\n  \"tar.lzma\",\n  \"tar.Z\",\n  \"tar.zst\",\n  \"tar.lz4\",\n  \"log.gz\",\n  \"sql.gz\",\n  \"csv.gz\",\n  \"tsv.gz\",\n  \"json.gz\",\n  \"ndjson.gz\",\n  \"fq.gz\",\n  \"sam.gz\",\n  \"fasta.gz\",\n  \"fa.gz\",\n  \"ffn.gz\",\n  \"faa.gz\",\n  \"fna.gz\",\n  \"frn.gz\",\n  \"fastq.gz\",\n  \"js.map\",\n  \"css.map\"\n]);\n\n// ==========================\n// Special filenames\n// ==========================\nexport const SPECIAL_FILENAMES = new Set([\n  \"Makefile\",\n  \"Dockerfile\",\n  \".dockerignore\",\n  \".npmrc\",\n  \".envrc\",\n  \".htgroup\",\n  \".eslintignore\",\n  \".env.test\",\n  \".env.local\",\n  \".env.production\",\n  \".env.development\",\n  \".env.example\",\n  \".dockerfile\",\n  \".htaccess\",\n  \".htpasswd\",\n  \".babelrc\",\n  \".eslintrc\",\n  \".editorconfig\",\n  \".prettierignore\",\n  \"docker-compose.override.yml\",\n  \"docker-compose.yml\",\n  \"Vagrantfile\",\n  \"Procfile\",\n  \"Gemfile\",\n  \"Rakefile\",\n  \"package.json\",\n  \"package-lock.json\",\n  \"yarn.lock\",\n  \"pnpm-lock.yaml\",\n  \"tsconfig.json\",\n  \"webpack.config.js\",\n  \"vite.config.js\",\n  \"vite.config.ts\",\n  \"Gruntfile.js\",\n  \"gulpfile.js\",\n  \"babel.config.js\",\n  \"babel.js\",\n  \"rollup.js\",\n\n  // SPECIAL PRESERVE NAME\n  \"CON\",\n  \"NUL\",\n  \"PRN\",\n  \"AUX\",\n  \"COM1\",\n  \"COM2\",\n  \"COM3\",\n  \"COM4\",\n  \"COM5\",\n  \"COM6\",\n  \"COM7\",\n  \"COM8\",\n  \"COM9\",\n  \"LPT1\",\n  \"LPT2\",\n  \"LPT3\",\n  \"LPT4\",\n  \"LPT5\",\n  \"LPT6\",\n  \"LPT7\",\n  \"LPT8\",\n  \"LPT9\"\n]);\n","import { createMessage } from \"@/_private/logger\";\n\nimport { punycodeUtilsJS } from \"@/urls/utils/punyCode\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\n\nimport {\n  DOUBLE_EXTENSIONS_FILE,\n  EXTENSIONS_FILE,\n  SPECIAL_FILENAMES\n} from \"./_private/extensions\";\n\nexport type ExtractFileNameOptions = {\n  /** ------------------------------------------------------------------------------------\n   * * ***Indicates whether the input should be treated as a potential domain string.***\n   * -------------------------------------------------------------------------------------\n   *\n   * - Behavior when `true`:\n   *     - The `domainName` option is required and must be a string and non-empty string.\n   *       If `domainName` is `undefined`, `null`, or an empty string, a `TypeError` will be thrown.\n   *     - The `domainName` is used to determine if the input is a domain-only string.\n   *     - Returns `null` if the input exactly matches `domainName` or any of its subdomains **and** has no additional path or filename.\n   *     - If the input does not match `domainName` or its subdomains, it will be processed as a regular file-like name.\n   *     - Supports **Unicode/IDN domains** (e.g., `tést-ドメイン.com`) and **ASCII filenames**, mixed safely.\n   *\n   * ---\n   * @default false\n   */\n  domainAware?: boolean;\n\n  /** ------------------------------------------------------------------------------------\n   * * ***The base domain name used for comparison (e.g., `\"example.com\"`).***\n   * -------------------------------------------------------------------------------------\n   *\n   * - Required when `domainAware` is `true`.\n   *     - Helps differentiate between a domain-only input (ignored) and a standalone file-like string (processed normally).\n   *     - Must be a string and non-empty string. Invalid values (`undefined`, `null`, or empty string) will trigger a `TypeError`.\n   *     - Works with both **ASCII domains** and **Unicode/IDN domains**.\n   *     - Example:\n   *       ```ts\n   *       // ASCII domain + ASCII filename\n   *       extractFileName(\"resume.com\", {\n   *         domainAware: true,\n   *         domainName: \"example.com\"\n   *       });\n   *       // ➔ \"resume\"\n   *       extractFileName(\"example.com\", {\n   *         domainAware: true,\n   *         domainName: \"example.com\"\n   *       });\n   *       // ➔ null (because input is treated as domain-name)\n   *\n   *       // Unicode domain + ASCII filename\n   *       extractFileName(\"tést-ドメイン.com/file.txt\", {\n   *         domainAware: true,\n   *         domainName: \"ドメイン.com\"\n   *       });\n   *       // ➔ \"file\"\n   *\n   *       // Unicode domain + Unicode filename\n   *       extractFileName(\"tést-ドメイン.com/ファイル名.pdf\", {\n   *         domainAware: true,\n   *         domainName: \"ドメイン.com\"\n   *       });\n   *       // ➔ \"ファイル名\"\n   *\n   *       // Invalid domainName, will throw TypeError\n   *       extractFileName(\"resume.com\", {\n   *         domainAware: true,\n   *         domainName: \"\"\n   *       });\n   *       // ➔ TypeError\n   *       ```\n   *\n   * ---\n   * @default undefined\n   */\n  domainName?: string;\n};\n\n/** ------------------------------------------------------------------------------------\n * * ***Utility: `extractFileName`.***\n * -------------------------------------------------------------------------------------\n * **Extracts the **clean base filename** from nearly any input string, including URLs, local file paths,\n * UNC paths, and plain filenames.**\n *\n * ---\n * - It automatically safely handles extracts the **base file name** (without extension) from:\n *     - File system paths (Windows, Unix, UNC).\n *     - Protocols like http, https, ftp, file, mailto, or custom schemes.\n *     - Percent-encoded, Unicode, and emoji characters.\n *     - Dotfiles, reserved OS names, multi-part extensions.\n *     - Data URIs.\n *     - Optional domain-aware mode to ignore domain-only inputs.\n *     - Plain filenames.\n *\n * ---\n * - Full support for:\n *     - Unicode, emoji, percent-encoding.\n *     - Dotfiles (e.g., `.env`, `.gitignore`).\n *     - Reserved/OS-protected filenames:\n *       `CON`, `PRN`, `AUX`, `NUL`, `COM1`~`COM9`, `LPT1`~`LPT9`.\n *     - Known multi-part extensions:\n *       `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.lz`, `.tar.zst`, `.min.js`, `.js.map`, `.log.gz`, `.sql.gz`,\n *       `.backup.tar`, etc.\n *     - Data URIs (`data:[mime];base64,...` ➔ payload string).\n *     - Domain-aware mode (optional).\n *\n * ---\n * - **Behavior / Features**\n *     - Strips **known extensions**, including multi-part and common double/triple extensions.\n *     - Leaves unknown/custom extensions intact.\n *     - Preserves **dotfiles** as-is (leading dot preserved).\n *     - Returns `null` if:\n *       - input is `null`, `undefined`, or not a string.\n *       - input is empty, whitespace-only, or only slashes.\n *       - input represents a folder path (trailing slash/backslash, drive/folder only).\n *     - input is a **domain-only string** in domain-aware mode.\n *     - Normalizes Windows-style backslashes (`\\`) internally as `/`.\n *     - Supports UNC paths, mixed slashes, and Windows drive letters safely.\n *     - Handles URLs:\n *       - Ignores query strings (`?v=1.2.3`) and hash fragments (`#section`).\n *       - Decodes percent-encoded filenames (`my%20file.txt` ➔ `my file.txt`).\n *       - Supports protocol-relative URLs (`//cdn.example.com/file.jpg`).\n *       - Supports uncommon/custom protocols (`ftp://`, `file://`, `mailto:`, etc.).\n *     - Handles **multiple dots**, **trailing dots**, **triple or more extensions**.\n *     - Supports filenames on mixed Unicode/ASCII domains:\n *       - Domain names can include Unicode characters (IDN / punycode).\n *       - Filenames may contain ASCII, Unicode, and emoji characters.\n *       - Works correctly when domain is Unicode and filename is ASCII, or vice versa.\n *     - Supports extremely long filenames safely (up to OS limits).\n *     - Domain-aware mode (`domainAware: true` + `domainName`):\n *       - Parameter `domainName` must be a string and non-empty string; otherwise a TypeError is thrown.\n *       - Returns `null` if input equals `domainName` or any subdomain with no file path.\n *       - Extracts filename normally if path/file exists on domain or other domain.\n *     - Safe in Node.js and browsers.\n *\n * ---\n * @param {string | null | undefined} input\n *   URL, file path, or plain filename to extract from.\n *\n * @param {ExtractFileNameOptions} [options]\n *   Optional configuration:\n *   - `domainAware?: boolean` – Treat input as a domain string. Requires `domainName` to be a string and non-empty string; otherwise, a TypeError is thrown.\n *   - `domainName?: string` – Base domain for comparison eg (`example.com`), required when `domainAware` is true.\n *\n * ---\n * @returns {string | null}\n *   - Base filename without known extensions\n *   - Original filename if extension unknown\n *   - `null` for invalid inputs, folder paths, or domain-only strings\n *\n * ---\n * @example\n * 1. #### Basic files:\n *     ```ts\n *     extractFileName(\"document.pdf\");\n *     // ➔ \"document\"\n *     extractFileName(\"/files/archive.tar.gz\");\n *     // ➔ \"archive\"\n *     extractFileName(\"C:\\\\path\\\\file.txt\");\n *     // ➔ \"file\"\n *     extractFileName(\".env\");\n *     // ➔ \".env\"\n *     extractFileName(\"folder/\");\n *     // ➔ null\n *     ```\n *     ---\n * 2. #### Not a file:\n *     ```ts\n *     extractFileName(\"not-file\");\n *     // ➔ null\n *     extractFileName(\"not-file/\");\n *     // ➔ null\n *     extractFileName(\"/not-file/\");\n *     // ➔ null\n *     extractFileName(\"/not-file\");\n *     // ➔ null\n *     ```\n *     ---\n * 3. #### URLs with `queries`, `hashes`, `protocols`:\n *     ```ts\n *     extractFileName(\"https://example.com/file.txt?ver=1\");\n *     // ➔ \"file\"\n *     extractFileName(\"https://example.com/archive.tar.gz#part\");\n *     // ➔ \"archive\"\n *     extractFileName(\"//cdn.example.com/image.png\");\n *     // ➔ \"image\"\n *     ```\n *     ---\n * 4. #### Special protocol handling:\n *     ```ts\n *     extractFileName(\"tel:+6212345678\");\n *     // ➔ \"+6212345678\"\n *     extractFileName(\"sms:+6212345678\");\n *     // ➔ \"+6212345678\"\n *     extractFileName(\"mailto:user@domain.com\");\n *     // ➔ \"user@domain\"\n *     extractFileName(\"data:text/plain;base64,SGVsbG8=\");\n *     // ➔ \"SGVsbG8=\"\n *     extractFileName(\"mailto:resume.com\");\n *     // ➔ \"resume\"\n *     extractFileName(\"ftp://example.com/image.jpeg\");\n *     // ➔ \"image\"\n *     extractFileName(\"ftp://files.example.com/app.min.js\");\n *     // ➔ \"app.min\"\n *     extractFileName(\"file:///C:/path/to/document.pdf\");\n *     // ➔ \"document\"\n *     extractFileName(\"custom-scheme://example.com/video.mp4\");\n *     // ➔ \"video\"\n *     ```\n *     ---\n * 5. #### Unicode & emoji:\n *     ```ts\n *     extractFileName(\"emoji-😊.png\");\n *     // ➔ \"emoji-😊\"\n *     extractFileName(\"🔥project.tar.gz\");\n *     // ➔ \"🔥project\"\n *     ```\n * 6. #### Dotfiles:\n *     ```ts\n *     extractFileName(\".gitignore\");\n *     // ➔ \".gitignore\"\n *     extractFileName(\"/path/.bashrc\");\n *     // ➔ \".bashrc\"\n *     ```\n *     ---\n * 7. #### Mixed Unicode domain and ASCII filename:\n *     ```ts\n *     extractFileName(\"https://tést-ドメイン.com/file.txt\");\n *     // ➔ \"file\"\n *     extractFileName(\"https://example.com/ファイル名.pdf\");\n *     // ➔ \"ファイル名\"\n *     extractFileName(\"https://ドメイン例.com/emoji-🔥.png\");\n *     // ➔ \"emoji-🔥\"\n *     ```\n * 8. #### Reserved filenames:\n *     ```ts\n *     extractFileName(\"CON\");\n *     // ➔ \"CON\"\n *     extractFileName(\"NUL.txt\");\n *     // ➔ \"NUL\"\n *     ```\n *     ---\n * 9. #### Domain-aware mode:\n *     ```ts\n *     extractFileName(\"example.com\", {\n *        domainAware: true,\n *        domainName: \"example.com\"\n *     });\n *     // ➔ null\n *     extractFileName(\"cdn.example.com\", {\n *        domainAware: true,\n *        domainName: \"example.com\"\n *     });\n *     // ➔ null\n *     extractFileName(\"resume.com\", {\n *        domainAware: true,\n *        domainName: \"example.com\"\n *     });\n *     // ➔ \"resume\"\n *     extractFileName(\"https://example.com/file.txt\", {\n *        domainAware: true,\n *        domainName: \"example.com\"\n *     });\n *     // ➔ \"file\"\n *     ```\n *     ---\n * 10. #### Windows & UNC paths:\n *     ```ts\n *     extractFileName(\"C:\\\\Users\\\\rzl\\\\Documents\\\\file.txt\");\n *     // ➔ \"file\"\n *     extractFileName(\"\\\\\\\\SERVER\\\\share\\\\logs\\\\output.log\");\n *     // ➔ \"output\"\n *     extractFileName(\"C:/Users\\\\rzl/mix\\\\test.pdf\");\n *     // ➔ \"test\"\n *     ```\n *     ---\n * 11. #### Edge / extreme cases:\n *     ```ts\n *     extractFileName(\"https://example.com/my%20file%20name.txt\");\n *     // ➔ \"my file name\"\n *     extractFileName(\"app.min.js.map\");\n *     // ➔ \"app.min\"\n *     extractFileName(\"backup.tar.bak\");\n *     // ➔ \"backup.tar.bak\" (unknown double extension)\n *     extractFileName(\"filename.\");\n *     // ➔ \"filename.\"\n *     extractFileName(\"a\".repeat(255) + \".txt\");\n *     // ➔ \"a\".repeat(255)\n *     ```\n * ---\n * @note\n * - Robust: never throws, handles unusual inputs safely.\n * - Suitable for display, logging, or safe storage.\n * - Normalizes slashes consistently.\n * - Covers nearly all real-world filename, URL, path, data URI, and domain scenarios.\n * - Handles Windows UNC paths, mixed slashes, percent-encoded, Unicode/emoji filenames.\n * - Known multi-part extensions list can be extended without breaking functionality.\n */\nexport const extractFileName = (\n  input?: string | null,\n  options?: ExtractFileNameOptions\n): string | null => {\n  if (!isNonEmptyString(input)) return null;\n  if (!isPlainObject(options)) options = {};\n\n  const { domainName, domainAware = false } = options;\n\n  assertIsBoolean(domainAware, {\n    message: ({ currentType, validType }) =>\n      errorMsg(\n        `Parameter \\`domainAware\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n      )\n  });\n\n  let pathname = input.trim();\n\n  // Normalize Windows backslashes\n  pathname = pathname.replace(/\\\\/g, \"/\");\n\n  // domain-aware mode\n  if (domainAware) {\n    if (!isNonEmptyString(domainName)) {\n      throw new TypeError(\n        errorMsg(\n          \"If parameter `domainAware` is set to `true`, the option parameter `domainName` is required as string, and cant be an empty-string.\"\n        )\n      );\n    }\n\n    const cleanDomain = punycodeUtilsJS\n      .toASCII(domainName)\n      .replace(/^https?:\\/\\//i, \"\")\n      .replace(/^www\\./, \"\")\n      .replace(/\\/.*$/, \"\")\n      .toLowerCase();\n\n    const inputDomain = punycodeUtilsJS\n      .toASCII(input)\n      .replace(/^https?:\\/\\//i, \"\")\n      .replace(/^www\\./, \"\")\n      .toLowerCase();\n\n    const inputHost = inputDomain.split(\"/\")[0]?.split(/[?#]/)[0];\n    const matchesDomain =\n      inputHost === cleanDomain || inputHost?.endsWith(`.${cleanDomain}`);\n    const hasPath = /\\/[^/]+$/.test(inputDomain);\n\n    if (matchesDomain && !hasPath) return null;\n  }\n\n  // handle special protocol-like strings\n  const protocolMatch = pathname.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):(.+)$/);\n  if (protocolMatch) {\n    const scheme = protocolMatch[1]?.toLowerCase() || \"\";\n    const rest = protocolMatch[2];\n\n    if ([\"tel\", \"sms\"].some((sch) => sch.startsWith(scheme))) {\n      const clean = rest?.split(\"?\")[0]?.split(\"#\")[0];\n      return clean?.trim() || null;\n    } else if (scheme === \"mailto\") {\n      const parts = rest?.split(\"/\");\n      let last = parts?.[parts.length - 1];\n      last = last?.split(\"?\")[0]?.split(\"#\")[0]; // strip query/hash\n      const dotIndex = last?.lastIndexOf(\".\");\n      if (dotIndex && dotIndex > 0) last = last?.slice(0, dotIndex);\n      return last || null;\n    } else if (scheme === \"data\") {\n      const commaIndex = rest?.indexOf(\",\") || -1;\n      if (commaIndex === -1) return null;\n      let payload = rest?.slice(commaIndex + 1);\n      payload = payload?.split?.(\"?\")[0]?.split(\"#\")[0]; // strip query/hash\n      return payload?.trim() || null;\n    }\n  }\n\n  if (/^[a-z][a-z\\d+\\-.]*:\\/{3,}/i.test(pathname)) {\n    // eg https:///file.txt (has more than 2 slash after : protocol)\n    pathname = pathname.replace(/^[a-z][a-z\\d+\\-.]*:\\/{2,}/i, \"\");\n  } else {\n    try {\n      const isProbablyUrl = /^[a-z][a-z\\d+\\-.]*:(\\/\\/)?/i.test(pathname);\n\n      pathname = isProbablyUrl\n        ? new URL(pathname).pathname\n        : new URL(`http://localhost/${pathname}`).pathname;\n    } catch {\n      // Fallback for weird URLs like 'https:///file.txt'\n      // Remove protocol + any number of slashes\n      pathname = pathname.replace(/^[a-z][a-z\\d+\\-.]*:(\\/\\/)?/i, \"\");\n    }\n  }\n\n  // split into non-empty segments\n  const segments = pathname.split(\"/\").filter(Boolean);\n\n  if (segments.length === 0) return null;\n\n  // Take the last segment as candidate filename\n  let lastSegment =\n    segments[segments.length - 1]?.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n  // Strip trailing ? or # that is alone\n  lastSegment = lastSegment?.replace(/[?#]+$/, \"\");\n  if (!lastSegment) return null;\n\n  // Replace encoded slashes and dots\n  lastSegment = lastSegment\n    .replace(/%2F/gi, \"/\")\n    .replace(/%5C/gi, \"\\\\\")\n    .replace(/%2E/gi, \".\");\n\n  // If replacement introduces new slashes, take the new last segment\n  if (lastSegment.includes(\"/\")) {\n    const parts = lastSegment.split(\"/\").filter(Boolean);\n    lastSegment = parts[parts.length - 1] || \"\";\n  }\n\n  let filename = decodeURIComponent(lastSegment);\n\n  if (!filename) return null;\n\n  // Special filenames always returned as-is (even if trailing slash)\n  if (SPECIAL_FILENAMES.has(filename)) return filename;\n\n  // Dotfiles like \".env\" should be returned as-is (single leading dot, no other dot)\n  if (/^\\.[^.\\s][^/]*$/.test(filename)) return filename;\n\n  // If the original pathname ends with \"/\" and the last segment doesn't look like a file\n  // const originalEndsWithSlash = pathname.endsWith(\"/\");\n  if (!filename.includes(\".\")) return null;\n\n  // Strip double extensions first\n  const sortedDouble = [...DOUBLE_EXTENSIONS_FILE].sort(\n    (a, b) => b.length - a.length\n  );\n  for (const ext of sortedDouble) {\n    const dotExt = `.${ext.toLowerCase()}`;\n    if (filename.toLowerCase().endsWith(dotExt)) {\n      filename = filename.slice(0, filename.length - dotExt.length);\n      break;\n    }\n  }\n\n  // Strip single extensions\n  const sortedSingle = [...EXTENSIONS_FILE].sort((a, b) => b.length - a.length);\n  for (const ext of sortedSingle) {\n    const dotExt = `.${ext.toLowerCase()}`;\n    if (filename.toLowerCase().endsWith(dotExt)) {\n      filename = filename.slice(0, filename.length - dotExt.length);\n      break;\n    }\n  }\n\n  return filename || null;\n};\n\n/**\n * @internal ***`Not part of the public API.`***\n */\nconst errorMsg = (msg: string) => createMessage(\"extractFileName\", msg);\n"],"mappings":";;;;;;;;;;;;;;AAGA,MAAa,kCAAkB,IAAI,IAAI;CAErC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAIA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAKD,MAAa,yCAAyB,IAAI,IAAI;CAC5C;CACA;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"}
