url-sanitizer 0.9.0 → 0.9.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -97,8 +97,8 @@ const blob4 = new Blob(['<svg><g onload="alert(1)"/></svg>'], {
97
97
  type: 'image/svg+xml'
98
98
  });
99
99
  const url4 = URL.createObjectURL(blob4);
100
- const res4 = await func(url4, {
101
- allow: ['blob']
100
+ const res4 = await sanitizeURL(url4, {
101
+ allow: ['blob']
102
102
  });
103
103
  // => 'data:image/svg+xml,%3Csvg%3E%3Cg%3E%3C/g%3E%3C/svg%3E'
104
104
 
@@ -162,6 +162,7 @@ Synchronous version of the [sanitizeURL()](#sanitizeurlurl-opt).
162
162
  ## parseURL(url)
163
163
 
164
164
  Parse the given URL.
165
+ * Blob URLs are simply parsed and not yet sanitized.
165
166
 
166
167
  ### Parameters
167
168
 
@@ -250,6 +251,23 @@ const res4 = await parseURL('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAA
250
251
  pathname: 'image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==',
251
252
  ...
252
253
  } */
254
+
255
+ // Note that blob URLs are parsed but not yet sanitized
256
+ const blob5 = new Blob(['<svg><g onload="alert(1)"/></svg>'], {
257
+ type: 'image/svg+xml'
258
+ });
259
+ const url5 = URL.createObjectURL(blob5);
260
+ const res5 = await parseURL(url5);
261
+ /* => {
262
+ input: 'blob:nodedata:82ecc5a4-aea8-48d7-a407-64e2ef0913da',
263
+ valid: true,
264
+ data: null,
265
+ href: 'blob:nodedata:82ecc5a4-aea8-48d7-a407-64e2ef0913da',
266
+ origin: 'null',
267
+ protocol: 'blob:',
268
+ pathname: 'nodedata:82ecc5a4-aea8-48d7-a407-64e2ef0913da',
269
+ ...
270
+ } */
253
271
  ```
254
272
 
255
273
 
@@ -1025,7 +1025,6 @@ var URLSanitizer = class extends URISchemes {
1025
1025
  this.#nest = 0;
1026
1026
  }
1027
1027
  } else {
1028
- sanitizedUrl = urlToSanitize;
1029
1028
  this.#nest = 0;
1030
1029
  }
1031
1030
  }
@@ -1047,12 +1046,20 @@ var URLSanitizer = class extends URISchemes {
1047
1046
  if (!isString(url)) {
1048
1047
  throw new TypeError(`Expected String but got ${getType(url)}.`);
1049
1048
  }
1050
- const sanitizedUrl = this.sanitize(url, opt ?? {
1051
- allow: ["blob", "data", "file"]
1052
- });
1053
1049
  const parsedUrl = /* @__PURE__ */ new Map([
1054
1050
  ["input", url]
1055
1051
  ]);
1052
+ let sanitizedUrl;
1053
+ if (this.verify(url)) {
1054
+ const { protocol } = new URL(url);
1055
+ if (protocol === "blob:") {
1056
+ sanitizedUrl = url;
1057
+ } else {
1058
+ sanitizedUrl = this.sanitize(url, opt ?? {
1059
+ allow: ["data", "file"]
1060
+ });
1061
+ }
1062
+ }
1056
1063
  if (sanitizedUrl) {
1057
1064
  const urlObj = new URL(sanitizedUrl);
1058
1065
  const { pathname, protocol } = urlObj;
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/uri-util.js"],
4
- "sourcesContent": ["[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * dompurify.js\n */\n\nconst { DOMPurify } = window;\n\nexport {\n DOMPurify as default\n};\n", "/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n *\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = window;\n\nexport {\n FileReader\n};\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,/;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_DATA_URL_G = /data:[^,]*,[^\"]+/g;\nconst REG_END_COLON = /:$/;\nconst REG_END_NUM = /(?:#|%23)$/;\nconst REG_END_QUEST = /(?<!(?:#|%23).*)(?:\\?|%3F)$/;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_HTML_URL_ENC_SHORT = /%(?:2(?:2|7)|3(?:C|E))+?/;\nconst REG_MIME_DOM =\n /^(?:text\\/(?:ht|x)ml|application\\/(?:xhtml\\+)?xml|image\\/svg\\+xml)/;\nconst REG_NUM_DECI = /^\\d+/;\nconst REG_NUM_HEAD = /#x?$/;\nconst REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\\d)/;\nconst REG_NUM_HEX = /^x[\\dA-F]+/i;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/* typedef */\n/**\n * object with additional properties based on URL API\n *\n * @typedef {object} ParsedURL\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} [data] - parsed result of data URL, `null`able\n * @property {string} [data.mime] - MIME type\n * @property {boolean} [data.base64] - is base64 encoded\n * @property {string} [data.data] - data part of the data URL\n * @property {string} [href] - sanitized URL input\n * @property {string} [origin] - scheme, domain and port of the sanitized URL\n * @property {string} [protocol] - protocol scheme of the sanitized URL\n * @property {string} [username] - username specified before the domain name\n * @property {string} [password] - password specified before the domain name\n * @property {string} [host] - domain and port of the sanitized URL\n * @property {string} [hostname] - domain of the sanitized URL\n * @property {string} [port] - port number of the sanitized URL\n * @property {string} [pathname] - path of the sanitized URL\n * @property {string} [search] - query string of the sanitized URL\n * @property {string} [hash] - fragment identifier of the sanitized URL\n */\n\n/**\n * get URL encoded string\n *\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getURLEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n *\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeURLEncodedHTMLChars = ch => {\n if (isString(ch) && REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getURLEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n *\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getURLEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n *\n * @param {string} str - string\n * @param {number} [nest] - nest level\n * @returns {string} - parsed string\n */\nexport const parseURLEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (REG_NUM_HEX.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (REG_NUM_DECI.test(value)) {\n num = parseInt(value);\n }\n if (Number.isInteger(num)) {\n const { index } = item;\n const [preNum, postNum] = [\n res.substring(0, index),\n res.substring(index + numCharRef.length)\n ];\n if (textCharCodes.has(num)) {\n res = `${preNum}${String.fromCharCode(num)}${postNum}`;\n if (REG_NUM_HEAD.test(preNum) || REG_NUM_HEAD_ASCII.test(postNum)) {\n res = parseURLEncodedNumCharRef(res, ++nest);\n }\n } else if (num < HEX * HEX) {\n res = `${preNum}${postNum}`;\n }\n }\n }\n }\n return res;\n};\n\n/**\n * create data URL from blob\n *\n * @param {object} blob - blob\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = blob => new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('error', () => reject(reader.error));\n reader.addEventListener('abort', () => resolve(reader.result));\n reader.addEventListener('load', () => resolve(reader.result));\n reader.readAsDataURL(blob);\n});\n\n/**\n * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n *\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n *\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * verify URI\n *\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\n verify(uri) {\n let res;\n if (isString(uri)) {\n try {\n const { protocol } = new URL(uri);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n};\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * replace matched data URLs\n *\n * @param {string} data - data URL\n * @returns {string} - replaced data URL\n */\n replace(data) {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n let replacedData = data;\n if (REG_DATA_URL.test(replacedData)) {\n const matchedDataUrls = replacedData.matchAll(REG_DATA_URL_G);\n const items = [...matchedDataUrls].reverse();\n for (const item of items) {\n let [dataUrl] = item;\n if (REG_DATA_URL_BASE64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_BASE64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n replacedData.substring(0, index),\n replacedData.substring(index + dataUrl.length)\n ];\n if (parsedDataUrl) {\n replacedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n } else {\n replacedData = `${preDataUrl}${postDataUrl}`;\n }\n }\n }\n return replacedData;\n }\n\n /**\n * purify URL encoded DOM\n *\n * @param {string} dom - DOM string\n * @returns {string} - purified DOM string\n */\n purify(dom) {\n if (!isString(dom)) {\n throw new TypeError(`Expected String but got ${getType(dom)}.`);\n }\n let purifiedDom = domPurify.sanitize(decodeURIComponent(dom));\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom =\n purifiedDom.replace(REG_END_NUM, '').replace(REG_END_QUEST, '');\n return encodeURI(purifiedDom);\n };\n\n /**\n * sanitize URL\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` URLs should be converted to `data` URLs\n * `javascript` and `vbscript` schemes can not be allowed\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, remove } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.verify(url)) {\n const { hash, href, pathname, protocol, search } = new URL(url);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n let bool;\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool = value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n if (bool) {\n const isDataUrl = schemeParts.includes('data');\n let finalize;\n let urlToSanitize = href;\n if (isDataUrl) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n let parsedData = data;\n if (isBase64) {\n parsedData = parseBase64(data);\n }\n try {\n const decodedData = parseURLEncodedNumCharRef(parsedData).trim();\n const { protocol: dataScheme } = new URL(decodedData);\n const dataSchemeParts =\n dataScheme.replace(REG_END_COLON, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n if (!head || REG_MIME_DOM.test(head)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaType.pop();\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove &&\n REG_HTML_URL_ENC_SHORT.test(urlToSanitize)) {\n const item = REG_HTML_URL_ENC_SHORT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getURLEncodedString)\n .replace(REG_URL_ENC_AMP, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_URL_ENC, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n sanitizedUrl = urlToSanitize;\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {ParsedURL} - result with additional props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['blob', 'data', 'file']\n });\n const parsedUrl = new Map([\n ['input', url]\n ]);\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(REG_END_COLON, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (isString(value)) {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n};\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * is URI sync\n *\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/**\n * is URI async\n *\n * @param {string} uri - URI\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = urlSanitizer.verify(uri);\n return res;\n};\n\n/**\n * parse URL sync\n *\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\n * @param {string} url - URL\n * @returns {Promise.<ParsedURL>} - result\n */\nexport const parseURL = async url => {\n const res = urlSanitizer.parse(url);\n return res;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n URL.revokeObjectURL(url);\n } else {\n res = urlSanitizer.sanitize(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n });\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL async\n * NOTE: `blob`, `data` and `file` schemes must be explicitly allowed\n * given a `blob` URL, returns a sanitized `data` URL\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: []\n}) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n const { allow, deny, only } = opt;\n if ((Array.isArray(allow) && allow.includes('blob') &&\n !(Array.isArray(deny) && deny.includes('blob'))) ||\n (Array.isArray(only) && only.includes('blob'))) {\n let data;\n try {\n data =\n await fetch(url).then(r => r.blob()).then(createDataURLFromBlob);\n } catch (e) {\n // fall through\n }\n if (data) {\n if (Array.isArray(only)) {\n if (!only.includes('data')) {\n only.push('data');\n }\n } else if (Array.isArray(allow)) {\n if (!allow.includes('data')) {\n allow.push('data');\n }\n if (Array.isArray(deny) && deny.includes('data')) {\n const i = deny.indexOf('data');\n deny.splice(i, 1);\n }\n }\n res = urlSanitizer.sanitize(data, opt);\n }\n }\n URL.revokeObjectURL(url);\n } else {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/* export instance */\nexport {\n urlSanitizer as default\n};\n"],
5
- "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACxOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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",
4
+ "sourcesContent": ["[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * dompurify.js\n */\n\nconst { DOMPurify } = window;\n\nexport {\n DOMPurify as default\n};\n", "/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n *\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = window;\n\nexport {\n FileReader\n};\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,/;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_DATA_URL_G = /data:[^,]*,[^\"]+/g;\nconst REG_END_COLON = /:$/;\nconst REG_END_NUM = /(?:#|%23)$/;\nconst REG_END_QUEST = /(?<!(?:#|%23).*)(?:\\?|%3F)$/;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_HTML_URL_ENC_SHORT = /%(?:2(?:2|7)|3(?:C|E))+?/;\nconst REG_MIME_DOM =\n /^(?:text\\/(?:ht|x)ml|application\\/(?:xhtml\\+)?xml|image\\/svg\\+xml)/;\nconst REG_NUM_DECI = /^\\d+/;\nconst REG_NUM_HEAD = /#x?$/;\nconst REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\\d)/;\nconst REG_NUM_HEX = /^x[\\dA-F]+/i;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/* typedef */\n/**\n * object with additional properties based on URL API\n *\n * @typedef {object} ParsedURL\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} [data] - parsed result of data URL, `null`able\n * @property {string} [data.mime] - MIME type\n * @property {boolean} [data.base64] - is base64 encoded\n * @property {string} [data.data] - data part of the data URL\n * @property {string} [href] - sanitized URL input\n * @property {string} [origin] - scheme, domain and port of the sanitized URL\n * @property {string} [protocol] - protocol scheme of the sanitized URL\n * @property {string} [username] - username specified before the domain name\n * @property {string} [password] - password specified before the domain name\n * @property {string} [host] - domain and port of the sanitized URL\n * @property {string} [hostname] - domain of the sanitized URL\n * @property {string} [port] - port number of the sanitized URL\n * @property {string} [pathname] - path of the sanitized URL\n * @property {string} [search] - query string of the sanitized URL\n * @property {string} [hash] - fragment identifier of the sanitized URL\n */\n\n/**\n * get URL encoded string\n *\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getURLEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n *\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeURLEncodedHTMLChars = ch => {\n if (isString(ch) && REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getURLEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n *\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getURLEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n *\n * @param {string} str - string\n * @param {number} [nest] - nest level\n * @returns {string} - parsed string\n */\nexport const parseURLEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (REG_NUM_HEX.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (REG_NUM_DECI.test(value)) {\n num = parseInt(value);\n }\n if (Number.isInteger(num)) {\n const { index } = item;\n const [preNum, postNum] = [\n res.substring(0, index),\n res.substring(index + numCharRef.length)\n ];\n if (textCharCodes.has(num)) {\n res = `${preNum}${String.fromCharCode(num)}${postNum}`;\n if (REG_NUM_HEAD.test(preNum) || REG_NUM_HEAD_ASCII.test(postNum)) {\n res = parseURLEncodedNumCharRef(res, ++nest);\n }\n } else if (num < HEX * HEX) {\n res = `${preNum}${postNum}`;\n }\n }\n }\n }\n return res;\n};\n\n/**\n * create data URL from blob\n *\n * @param {object} blob - blob\n * @returns {Promise.<?string>} - data URL\n */\nexport const createDataURLFromBlob = blob => new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.addEventListener('error', () => reject(reader.error));\n reader.addEventListener('abort', () => resolve(reader.result));\n reader.addEventListener('load', () => resolve(reader.result));\n reader.readAsDataURL(blob);\n});\n\n/**\n * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n *\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n *\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * verify URI\n *\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\n verify(uri) {\n let res;\n if (isString(uri)) {\n try {\n const { protocol } = new URL(uri);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n};\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * replace matched data URLs\n *\n * @param {string} data - data URL\n * @returns {string} - replaced data URL\n */\n replace(data) {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n let replacedData = data;\n if (REG_DATA_URL.test(replacedData)) {\n const matchedDataUrls = replacedData.matchAll(REG_DATA_URL_G);\n const items = [...matchedDataUrls].reverse();\n for (const item of items) {\n let [dataUrl] = item;\n if (REG_DATA_URL_BASE64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_BASE64.exec(dataUrl);\n }\n this.#nest++;\n this.#recurse.add(dataUrl);\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n replacedData.substring(0, index),\n replacedData.substring(index + dataUrl.length)\n ];\n if (parsedDataUrl) {\n replacedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n } else {\n replacedData = `${preDataUrl}${postDataUrl}`;\n }\n }\n }\n return replacedData;\n }\n\n /**\n * purify URL encoded DOM\n *\n * @param {string} dom - DOM string\n * @returns {string} - purified DOM string\n */\n purify(dom) {\n if (!isString(dom)) {\n throw new TypeError(`Expected String but got ${getType(dom)}.`);\n }\n let purifiedDom = domPurify.sanitize(decodeURIComponent(dom));\n if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {\n purifiedDom = this.replace(purifiedDom);\n }\n purifiedDom =\n purifiedDom.replace(REG_END_NUM, '').replace(REG_END_QUEST, '');\n return encodeURI(purifiedDom);\n };\n\n /**\n * sanitize URL\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` URLs should be converted to `data` URLs\n * `javascript` and `vbscript` schemes can not be allowed\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only, remove } = opt ?? {};\n const schemeMap = new Map([\n ['blob', false],\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT_BLOB.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.verify(url)) {\n const { hash, href, pathname, protocol, search } = new URL(url);\n const scheme = protocol.replace(REG_END_COLON, '');\n const schemeParts = scheme.split('+');\n let bool;\n if (restrictScheme) {\n bool = schemeParts.every(s => schemeMap.get(s));\n } else {\n for (const [key, value] of schemeMap.entries()) {\n bool = value || (scheme !== key && schemeParts.every(s => s !== key));\n if (!bool) {\n break;\n }\n }\n }\n if (bool) {\n const isDataUrl = schemeParts.includes('data');\n let finalize;\n let urlToSanitize = href;\n if (isDataUrl) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n let parsedData = data;\n if (isBase64) {\n parsedData = parseBase64(data);\n }\n try {\n const decodedData = parseURLEncodedNumCharRef(parsedData).trim();\n const { protocol: dataScheme } = new URL(decodedData);\n const dataSchemeParts =\n dataScheme.replace(REG_END_COLON, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT_BLOB.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n const containsDataUrl = REG_DATA_URL.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n parsedData = this.replace(parsedData);\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n finalize = true;\n }\n if (!head || REG_MIME_DOM.test(head)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaType.pop();\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove &&\n REG_HTML_URL_ENC_SHORT.test(urlToSanitize)) {\n const item = REG_HTML_URL_ENC_SHORT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getURLEncodedString)\n .replace(REG_URL_ENC_AMP, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_URL_ENC, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {ParsedURL} - result with additional props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const parsedUrl = new Map([\n ['input', url]\n ]);\n let sanitizedUrl;\n if (this.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n sanitizedUrl = url;\n } else {\n sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['data', 'file']\n });\n }\n }\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(REG_END_COLON, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (isString(value)) {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n};\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/**\n * is URI sync\n *\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/**\n * is URI async\n *\n * @param {string} uri - URI\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = urlSanitizer.verify(uri);\n return res;\n};\n\n/**\n * parse URL sync\n *\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\n * @param {string} url - URL\n * @returns {Promise.<ParsedURL>} - result\n */\nexport const parseURL = async url => {\n const res = urlSanitizer.parse(url);\n return res;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {?string} - sanitized URL\n */\nexport const sanitizeURLSync = (url, opt) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n URL.revokeObjectURL(url);\n } else {\n res = urlSanitizer.sanitize(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n });\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL async\n * NOTE: `blob`, `data` and `file` schemes must be explicitly allowed\n * given a `blob` URL, returns a sanitized `data` URL\n *\n * @param {string} url - URL\n * @param {object} [opt] - options\n * @param {Array.<string>} [opt.allow] - array of allowed schemes\n * @param {Array.<string>} [opt.deny] - array of denied schemes\n * @param {Array.<string>} [opt.only] - array of specific schemes to allow\n * @param {boolean} [opt.remove] - remove tag and/or quote and the rest\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt = {\n allow: [],\n deny: [],\n only: []\n}) => {\n let res;\n if (urlSanitizer.verify(url)) {\n const { protocol } = new URL(url);\n if (protocol === 'blob:') {\n const { allow, deny, only } = opt;\n if ((Array.isArray(allow) && allow.includes('blob') &&\n !(Array.isArray(deny) && deny.includes('blob'))) ||\n (Array.isArray(only) && only.includes('blob'))) {\n let data;\n try {\n data =\n await fetch(url).then(r => r.blob()).then(createDataURLFromBlob);\n } catch (e) {\n // fall through\n }\n if (data) {\n if (Array.isArray(only)) {\n if (!only.includes('data')) {\n only.push('data');\n }\n } else if (Array.isArray(allow)) {\n if (!allow.includes('data')) {\n allow.push('data');\n }\n if (Array.isArray(deny) && deny.includes('data')) {\n const i = deny.indexOf('data');\n deny.splice(i, 1);\n }\n }\n res = urlSanitizer.sanitize(data, opt);\n }\n }\n URL.revokeObjectURL(url);\n } else {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/* export instance */\nexport {\n urlSanitizer as default\n};\n"],
5
+ "mappings": ";AAAA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACxOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;A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",
6
6
  "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- var T=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var I=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","browserext","cabal","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cvs","dab","dat","data","dav","diaspora","dict","did","dis","dlna-playcontainer","dlna-playsingle","dns","dntp","doi","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","http","https","hxxp","hxxps","hydrazone","hyper","iax","icap","icon","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lorawan","lpa","lvlt","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-powerpoint","ms-project","ms-publisher","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mumble","mupdate","mvn","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openpgp4fpr","otpauth","palm","paparazzi","payment","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcon","xcon-userid","xfire","xmlrpc.beep","xmlrpc.beeps","xmpp","xri","ymsgr","z39.50r","z39.50s"];var{DOMPurify:P}=window;var y=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var{FileReader:H}=window;var R=16,W=/^[\da-z+/\-_=]+$/i,z=/data:[^,]*,/,F=/data:[^,]*;?base64,[\da-z+/\-_=]+/i,Z=/data:[^,]*,[^"]+/g,A=/:$/,ee=/(?:#|%23)$/,te=/(?<!(?:#|%23).*)(?:\?|%3F)$/,se=/[<>"'\s]/g,re=/%(?:2(?:2|7)|3(?:C|E))/g,B=/%(?:2(?:2|7)|3(?:C|E))+?/,ie=/^(?:text\/(?:ht|x)ml|application\/(?:xhtml\+)?xml|image\/svg\+xml)/,ae=/^\d+/,oe=/#x?$/,ne=/^#(?:x(?:00)?[2-7]|\d)/,ce=/^x[\dA-F]+/i,pe=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/ig,le=/^[a-z][\da-z+\-.]*$/,me=/^(?:ext|web)\+[a-z]+$/,q=/(?:java|vb)script/,k=/(?:java|vb)script|blob/,de=/^%[\dA-F]{2}$/i,fe=/%26/g,M=t=>{if(!d(t))throw new TypeError(`Expected String but got ${y(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(R).toUpperCase()}`);return e.join("")},Y=t=>{d(t)&&de.test(t)&&(t=t.toUpperCase());let[e,s,a,i,o,c]=["&","#","<",">",'"',"'"].map(M),r;return t===e?r=`${e}amp;`:t===a?r=`${e}lt;`:t===i?r=`${e}gt;`:t===o?r=`${e}quot;`:t===c?r=`${e}${s}39;`:r=t,r},he=t=>{if(d(t)){if(!W.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${y(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(o=>o.charCodeAt(0))),a=new Set(T),i;return s.every(o=>a.has(o))?i=e.replace(/\s/g,M):i=t,i},X=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${y(t)}.`);if(Number.isInteger(e)){if(e>R)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${y(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let a=new Set(T),i=[...s.matchAll(pe)].reverse();for(let o of i){let[c,r]=o,l;if(ce.test(r)?l=parseInt(`0${r}`,R):ae.test(r)&&(l=parseInt(r)),Number.isInteger(l)){let{index:f}=o,[p,n]=[s.substring(0,f),s.substring(f+c.length)];a.has(l)?(s=`${p}${String.fromCharCode(l)}${n}`,(oe.test(p)||ne.test(n))&&(s=X(s,++e))):l<R*R&&(s=`${p}${n}`)}}}return s},ue=t=>new Promise((e,s)=>{let a=new H;a.addEventListener("error",()=>s(a.error)),a.addEventListener("abort",()=>e(a.result)),a.addEventListener("load",()=>e(a.result)),a.readAsDataURL(t)}),D=class{#e;constructor(){this.#e=new Set(I)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(q.test(e)||!le.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${y(e)}.`);return this.#e.add(e),[...this.#e]}remove(e){return this.#e.delete(e)}verify(e){let s;if(d(e))try{let{protocol:a}=new URL(e),i=a.replace(A,""),o=i.split("+");s=!q.test(i)&&me.test(i)||o.every(c=>this.#e.has(c))}catch{s=!1}return!!s}},j=class extends D{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}replace(e){if(!d(e))throw new TypeError(`Expected String but got ${y(e)}.`);let s=e;if(z.test(s)){let i=[...s.matchAll(Z)].reverse();for(let o of i){let[c]=o;F.test(c)&&([c]=F.exec(c)),this.#e++,this.#t.add(c);let r=this.sanitize(c,{allow:["data"]}),{index:l}=o,[f,p]=[s.substring(0,l),s.substring(l+c.length)];r?s=`${f}${r}${p}`:s=`${f}${p}`}}return s}purify(e){if(!d(e))throw new TypeError(`Expected String but got ${y(e)}.`);let s=P.sanitize(decodeURIComponent(e));return s&&z.test(s)&&(s=this.replace(s)),s=s.replace(ee,"").replace(te,""),encodeURI(s)}sanitize(e,s={allow:[],deny:[],only:[]}){if(this.#e>R)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:a,deny:i,only:o,remove:c}=s??{},r=new Map([["blob",!1],["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),l=!1;if(Array.isArray(o)&&o.length){let p=super.get();for(let m of p)r.set(m,!1);let n=Object.values(o);for(let m of n)if(d(m)&&(m=m.trim(),!k.test(m))){if(super.has(m))r.set(m,!0);else{try{super.add(m)}catch{}super.has(m)&&r.set(m,!0)}!l&&r.has(m)&&(l=r.get(m))}}else{if(Array.isArray(a)&&a.length){let p=Object.values(a);for(let n of p)if(d(n)&&(n=n.trim(),!k.test(n)))if(super.has(n))r.set(n,!0);else{try{super.add(n)}catch{}super.has(n)&&r.set(n,!0)}}if(Array.isArray(i)&&i.length){let p=Object.values(i);for(let n of p)d(n)&&(n=n.trim(),n&&r.set(n,!1))}}let f;if(super.verify(e)){let{hash:p,href:n,pathname:m,protocol:U,search:w}=new URL(e),E=U.replace(A,""),L=E.split("+"),_;if(l)_=L.every(b=>r.get(b));else for(let[b,x]of r.entries())if(_=x||E!==b&&L.every(h=>h!==b),!_)break;if(_){let b=L.includes("data"),x,h=n;if(b){let[v,...C]=m.split(","),$=`${C.join(",")}${w}${p}`,S=v.split(";"),G=S[S.length-1]==="base64",u=$;G&&(u=he($));try{let N=X(u).trim(),{protocol:Q}=new URL(N);Q.replace(A,"").split("+").some(J=>k.test(J))&&(h="")}catch{}let O=z.test(u);u!==$||O?O?u=this.replace(u):this.#t.has(e)?this.#t.delete(e):x=!0:this.#t.has(e)?this.#t.delete(e):x=!0,(!v||ie.test(v))&&(u=this.purify(u)),h&&u?(G&&u!==$&&S.pop(),h=`${E}:${S.join(";")},${u}`):h=""}else x=!0;if(!b&&c&&B.test(h)){let v=B.exec(h),{index:C}=v;h=h.substring(0,C)}h?(f=h.replace(se,M).replace(fe,Y),x&&(b||(f=f.replace(re,Y)),this.#e=0)):(f=h,this.#e=0)}}return f||null}parse(e,s){if(!d(e))throw new TypeError(`Expected String but got ${y(e)}.`);let a=this.sanitize(e,s??{allow:["blob","data","file"]}),i=new Map([["input",e]]);if(a){let o=new URL(a),{pathname:c,protocol:r}=o,f=r.replace(A,"").split("+").includes("data");if(i.set("valid",!0),f){let p=new Map,[n,...m]=c.split(","),U=`${m.join(",")}`,w=n.split(";"),E=w[w.length-1]==="base64";E&&w.pop(),p.set("mime",w.join(";")),p.set("base64",E),p.set("data",U),i.set("data",Object.fromEntries(p))}else i.set("data",null);for(let p in o){let n=o[p];d(n)&&i.set(p,n)}}else i.set("valid",!1);return Object.fromEntries(i)}},g=new j,ge=t=>g.verify(t),ye=async t=>g.verify(t),be=t=>g.parse(t),we=async t=>g.parse(t),Ee=(t,e)=>{let s;if(g.verify(t)){let{protocol:a}=new URL(t);a==="blob:"?URL.revokeObjectURL(t):s=g.sanitize(t,e??{allow:[],deny:[],only:[]})}return s||null},xe=async(t,e={allow:[],deny:[],only:[]})=>{let s;if(g.verify(t)){let{protocol:a}=new URL(t);if(a==="blob:"){let{allow:i,deny:o,only:c}=e;if(Array.isArray(i)&&i.includes("blob")&&!(Array.isArray(o)&&o.includes("blob"))||Array.isArray(c)&&c.includes("blob")){let r;try{r=await fetch(t).then(l=>l.blob()).then(ue)}catch{}if(r){if(Array.isArray(c))c.includes("data")||c.push("data");else if(Array.isArray(i)&&(i.includes("data")||i.push("data"),Array.isArray(o)&&o.includes("data"))){let l=o.indexOf("data");o.splice(l,1)}s=g.sanitize(r,e)}}URL.revokeObjectURL(t)}else s=g.sanitize(t,e)}return s||null};export{g as default,ye as isURI,ge as isURISync,we as parseURL,be as parseURLSync,xe as sanitizeURL,Ee as sanitizeURLSync};
1
+ var T=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var I=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","browserext","cabal","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cvs","dab","dat","data","dav","diaspora","dict","did","dis","dlna-playcontainer","dlna-playsingle","dns","dntp","doi","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","http","https","hxxp","hxxps","hydrazone","hyper","iax","icap","icon","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lorawan","lpa","lvlt","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-powerpoint","ms-project","ms-publisher","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mumble","mupdate","mvn","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openpgp4fpr","otpauth","palm","paparazzi","payment","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcon","xcon-userid","xfire","xmlrpc.beep","xmlrpc.beeps","xmpp","xri","ymsgr","z39.50r","z39.50s"];var{DOMPurify:P}=window;var g=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var{FileReader:H}=window;var R=16,W=/^[\da-z+/\-_=]+$/i,z=/data:[^,]*,/,F=/data:[^,]*;?base64,[\da-z+/\-_=]+/i,Z=/data:[^,]*,[^"]+/g,S=/:$/,ee=/(?:#|%23)$/,te=/(?<!(?:#|%23).*)(?:\?|%3F)$/,se=/[<>"'\s]/g,re=/%(?:2(?:2|7)|3(?:C|E))/g,B=/%(?:2(?:2|7)|3(?:C|E))+?/,ie=/^(?:text\/(?:ht|x)ml|application\/(?:xhtml\+)?xml|image\/svg\+xml)/,ae=/^\d+/,oe=/#x?$/,ne=/^#(?:x(?:00)?[2-7]|\d)/,ce=/^x[\dA-F]+/i,pe=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/ig,le=/^[a-z][\da-z+\-.]*$/,me=/^(?:ext|web)\+[a-z]+$/,q=/(?:java|vb)script/,k=/(?:java|vb)script|blob/,de=/^%[\dA-F]{2}$/i,fe=/%26/g,M=t=>{if(!d(t))throw new TypeError(`Expected String but got ${g(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(R).toUpperCase()}`);return e.join("")},Y=t=>{d(t)&&de.test(t)&&(t=t.toUpperCase());let[e,s,r,o,a,c]=["&","#","<",">",'"',"'"].map(M),i;return t===e?i=`${e}amp;`:t===r?i=`${e}lt;`:t===o?i=`${e}gt;`:t===a?i=`${e}quot;`:t===c?i=`${e}${s}39;`:i=t,i},he=t=>{if(d(t)){if(!W.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${g(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(a=>a.charCodeAt(0))),r=new Set(T),o;return s.every(a=>r.has(a))?o=e.replace(/\s/g,M):o=t,o},X=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${g(t)}.`);if(Number.isInteger(e)){if(e>R)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${g(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let r=new Set(T),o=[...s.matchAll(pe)].reverse();for(let a of o){let[c,i]=a,l;if(ce.test(i)?l=parseInt(`0${i}`,R):ae.test(i)&&(l=parseInt(i)),Number.isInteger(l)){let{index:f}=a,[p,n]=[s.substring(0,f),s.substring(f+c.length)];r.has(l)?(s=`${p}${String.fromCharCode(l)}${n}`,(oe.test(p)||ne.test(n))&&(s=X(s,++e))):l<R*R&&(s=`${p}${n}`)}}}return s},ue=t=>new Promise((e,s)=>{let r=new H;r.addEventListener("error",()=>s(r.error)),r.addEventListener("abort",()=>e(r.result)),r.addEventListener("load",()=>e(r.result)),r.readAsDataURL(t)}),D=class{#e;constructor(){this.#e=new Set(I)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(q.test(e)||!le.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${g(e)}.`);return this.#e.add(e),[...this.#e]}remove(e){return this.#e.delete(e)}verify(e){let s;if(d(e))try{let{protocol:r}=new URL(e),o=r.replace(S,""),a=o.split("+");s=!q.test(o)&&me.test(o)||a.every(c=>this.#e.has(c))}catch{s=!1}return!!s}},j=class extends D{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}replace(e){if(!d(e))throw new TypeError(`Expected String but got ${g(e)}.`);let s=e;if(z.test(s)){let o=[...s.matchAll(Z)].reverse();for(let a of o){let[c]=a;F.test(c)&&([c]=F.exec(c)),this.#e++,this.#t.add(c);let i=this.sanitize(c,{allow:["data"]}),{index:l}=a,[f,p]=[s.substring(0,l),s.substring(l+c.length)];i?s=`${f}${i}${p}`:s=`${f}${p}`}}return s}purify(e){if(!d(e))throw new TypeError(`Expected String but got ${g(e)}.`);let s=P.sanitize(decodeURIComponent(e));return s&&z.test(s)&&(s=this.replace(s)),s=s.replace(ee,"").replace(te,""),encodeURI(s)}sanitize(e,s={allow:[],deny:[],only:[]}){if(this.#e>R)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:r,deny:o,only:a,remove:c}=s??{},i=new Map([["blob",!1],["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),l=!1;if(Array.isArray(a)&&a.length){let p=super.get();for(let m of p)i.set(m,!1);let n=Object.values(a);for(let m of n)if(d(m)&&(m=m.trim(),!k.test(m))){if(super.has(m))i.set(m,!0);else{try{super.add(m)}catch{}super.has(m)&&i.set(m,!0)}!l&&i.has(m)&&(l=i.get(m))}}else{if(Array.isArray(r)&&r.length){let p=Object.values(r);for(let n of p)if(d(n)&&(n=n.trim(),!k.test(n)))if(super.has(n))i.set(n,!0);else{try{super.add(n)}catch{}super.has(n)&&i.set(n,!0)}}if(Array.isArray(o)&&o.length){let p=Object.values(o);for(let n of p)d(n)&&(n=n.trim(),n&&i.set(n,!1))}}let f;if(super.verify(e)){let{hash:p,href:n,pathname:m,protocol:U,search:w}=new URL(e),E=U.replace(S,""),A=E.split("+"),_;if(l)_=A.every(b=>i.get(b));else for(let[b,x]of i.entries())if(_=x||E!==b&&A.every(h=>h!==b),!_)break;if(_){let b=A.includes("data"),x,h=n;if(b){let[v,...C]=m.split(","),$=`${C.join(",")}${w}${p}`,L=v.split(";"),G=L[L.length-1]==="base64",u=$;G&&(u=he($));try{let N=X(u).trim(),{protocol:Q}=new URL(N);Q.replace(S,"").split("+").some(J=>k.test(J))&&(h="")}catch{}let O=z.test(u);u!==$||O?O?u=this.replace(u):this.#t.has(e)?this.#t.delete(e):x=!0:this.#t.has(e)?this.#t.delete(e):x=!0,(!v||ie.test(v))&&(u=this.purify(u)),h&&u?(G&&u!==$&&L.pop(),h=`${E}:${L.join(";")},${u}`):h=""}else x=!0;if(!b&&c&&B.test(h)){let v=B.exec(h),{index:C}=v;h=h.substring(0,C)}h?(f=h.replace(se,M).replace(fe,Y),x&&(b||(f=f.replace(re,Y)),this.#e=0)):this.#e=0}}return f||null}parse(e,s){if(!d(e))throw new TypeError(`Expected String but got ${g(e)}.`);let r=new Map([["input",e]]),o;if(this.verify(e)){let{protocol:a}=new URL(e);a==="blob:"?o=e:o=this.sanitize(e,s??{allow:["data","file"]})}if(o){let a=new URL(o),{pathname:c,protocol:i}=a,f=i.replace(S,"").split("+").includes("data");if(r.set("valid",!0),f){let p=new Map,[n,...m]=c.split(","),U=`${m.join(",")}`,w=n.split(";"),E=w[w.length-1]==="base64";E&&w.pop(),p.set("mime",w.join(";")),p.set("base64",E),p.set("data",U),r.set("data",Object.fromEntries(p))}else r.set("data",null);for(let p in a){let n=a[p];d(n)&&r.set(p,n)}}else r.set("valid",!1);return Object.fromEntries(r)}},y=new j,ye=t=>y.verify(t),ge=async t=>y.verify(t),be=t=>y.parse(t),we=async t=>y.parse(t),Ee=(t,e)=>{let s;if(y.verify(t)){let{protocol:r}=new URL(t);r==="blob:"?URL.revokeObjectURL(t):s=y.sanitize(t,e??{allow:[],deny:[],only:[]})}return s||null},xe=async(t,e={allow:[],deny:[],only:[]})=>{let s;if(y.verify(t)){let{protocol:r}=new URL(t);if(r==="blob:"){let{allow:o,deny:a,only:c}=e;if(Array.isArray(o)&&o.includes("blob")&&!(Array.isArray(a)&&a.includes("blob"))||Array.isArray(c)&&c.includes("blob")){let i;try{i=await fetch(t).then(l=>l.blob()).then(ue)}catch{}if(i){if(Array.isArray(c))c.includes("data")||c.push("data");else if(Array.isArray(o)&&(o.includes("data")||o.push("data"),Array.isArray(a)&&a.includes("data"))){let l=a.indexOf("data");a.splice(l,1)}s=y.sanitize(i,e)}}URL.revokeObjectURL(t)}else s=y.sanitize(t,e)}return s||null};export{y as default,ge as isURI,ye as isURISync,we as parseURL,be as parseURLSync,xe as sanitizeURL,Ee as sanitizeURLSync};
2
2
  /*!
3
3
  * URL Sanitizer
4
4
  *