{"version":3,"sources":["../../../../../src/utils/functions/urls/normalize.ts"],"sourcesContent":["const DATA_URL_DEFAULT_MIME_TYPE = 'text/plain'\nconst DATA_URL_DEFAULT_CHARSET = 'us-ascii'\n\nconst normalizeDataURL = (urlString: string) => {\n\tconst match = /^data:(?<type>[^,]*?),(?<data>[^#]*?)(?:#(?<hash>.*))?$/.exec(urlString)\n\n\tif (!match) throw new Error(`Invalid URL: ${urlString}`)\n\tif (!match.groups) throw new Error(`Invalid URL: ${urlString}`)\n\n\tconst { type, data, hash } = match.groups\n\tconst mediaType = type.split(';')\n\n\tlet isBase64 = false\n\tif (mediaType[mediaType.length - 1] === 'base64') {\n\t\tmediaType.pop()\n\t\tisBase64 = true\n\t}\n\n\t// Lowercase MIME type\n\tconst mimeType = (mediaType.shift() || '').toLowerCase()\n\tconst attributes = mediaType\n\t\t.map((attribute) => {\n\t\t\tconst val = attribute.split('=').map((string) => string.trim())\n\t\t\tconst key = val[0]\n\t\t\tlet value = val[1] ?? ''\n\t\t\tif (key === 'charset') {\n\t\t\t\tvalue = value.toLowerCase()\n\t\t\t\tif (value === DATA_URL_DEFAULT_CHARSET) return ''\n\t\t\t}\n\t\t\treturn `${key}${value ? `=${value}` : ''}`\n\t\t})\n\t\t.filter(Boolean)\n\n\tconst normalizedMediaType = [...attributes]\n\tif (isBase64) normalizedMediaType.push('base64')\n\tif (normalizedMediaType.length > 0 || (mimeType && mimeType !== DATA_URL_DEFAULT_MIME_TYPE)) normalizedMediaType.unshift(mimeType)\n\treturn `data:${normalizedMediaType.join(';')},${isBase64 ? data.trim() : data}${hash ? `#${hash}` : ''}`\n}\n\nexport const normalizeUrl = (urlString: string) => {\n\turlString = urlString.trim()\n\n\tif (/^data:/i.test(urlString)) return normalizeDataURL(urlString)\n\tif (/^view-source:/i.test(urlString)) throw new Error('`view-source:` is not supported as it is a non-standard protocol')\n\n\tconst hasRelativeProtocol = urlString.startsWith('//')\n\tconst isRelativeUrl = !hasRelativeProtocol && /^\\.*\\//.test(urlString)\n\tif (!isRelativeUrl) urlString = urlString.replace(/^(?!(?:\\w+:)?\\/\\/)|^\\/\\//, 'http:')\n\n\tconst urlObject = new URL(urlString)\n\turlObject.username = urlObject.password = ''\n\turlObject.hash = urlObject.hash.replace(/#?:~:text.*?$/i, '')\n\n\tif (urlObject.pathname) {\n\t\tconst protocolRegex = /\\b[a-z][a-z\\d+\\-.]{1,50}:\\/\\//g\n\n\t\tlet lastIndex = 0\n\t\tlet result = ''\n\t\twhile (protocolRegex.exec(urlObject.pathname)) {\n\t\t\tconst match = protocolRegex.exec(urlObject.pathname)!\n\t\t\tconst protocol = match[0]\n\t\t\tconst protocolAtIndex = match.index\n\t\t\tconst intermediate = urlObject.pathname.slice(lastIndex, protocolAtIndex)\n\n\t\t\tresult += intermediate.replace(/\\/{2,}/g, '/')\n\t\t\tresult += protocol\n\t\t\tlastIndex = protocolAtIndex + protocol.length\n\t\t}\n\n\t\tconst remnant = urlObject.pathname.slice(lastIndex, urlObject.pathname.length)\n\t\tresult += remnant.replace(/\\/{2,}/g, '/')\n\n\t\turlObject.pathname = result\n\t}\n\n\t// Decode URI octets\n\tif (urlObject.pathname) urlObject.pathname = decodeURI(urlObject.pathname)\n\tif (urlObject.hostname) urlObject.hostname = urlObject.hostname.replace(/\\.$/, '')\n\turlObject.pathname = urlObject.pathname.replace(/\\/$/, '')\n\n\tconst oldUrlString = urlString\n\turlString = urlObject.toString()\n\n\tif (urlObject.pathname === '/' && !oldUrlString.endsWith('/') && urlObject.hash === '') urlString = urlString.replace(/\\/$/, '')\n\tif (urlObject.pathname === '/' && urlObject.hash === '') urlString = urlString.replace(/\\/$/, '')\n\n\treturn urlString\n}\n"],"mappings":"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","names":[]}