{"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":["normalize_exports","__export","normalizeUrl","__toCommonJS","DATA_URL_DEFAULT_MIME_TYPE","DATA_URL_DEFAULT_CHARSET","normalizeDataURL","urlString","match","type","data","hash","mediaType","isBase64","mimeType","normalizedMediaType","attribute","val","string","key","value","urlObject","protocolRegex","lastIndex","result","protocol","protocolAtIndex","intermediate","remnant","oldUrlString"]}