url-sanitizer 0.10.14 → 0.10.16

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
@@ -5,7 +5,7 @@
5
5
  [![npm](https://img.shields.io/npm/v/url-sanitizer)](https://www.npmjs.com/package/url-sanitizer)
6
6
  [![release](https://img.shields.io/github/v/release/asamuzaK/urlSanitizer)](https://github.com/asamuzaK/urlSanitizer/releases)
7
7
 
8
- URL sanitizer for Node.js (>=18), browsers and web sites.
8
+ URL sanitizer for Node.js, browsers and web sites.
9
9
  Sanitize not only regular URLs, but also data URLs and blob URLs.
10
10
  It also has the ability to parse URLs and verify URIs.
11
11
  **Experimental**
@@ -1,9 +1,27 @@
1
1
  // bundle_wo_dompurify/mjs/dompurify.js
2
2
  var { DOMPurify } = globalThis;
3
+ var dompurify_default = DOMPurify;
3
4
 
4
- // bundle_wo_dompurify/mjs/common.js
5
+ // bundle_wo_dompurify/mjs/constant.js
6
+ var HEX = 16;
5
7
  var TYPE_FROM = 8;
6
8
  var TYPE_TO = -1;
9
+ var REG_B64 = /^[\w+/=-]+$/;
10
+ var REG_DATA_URL = /data:[\w#&+./;=-]*,/;
11
+ var REG_DATA_URL_B64 = /data:[\w#&+./;=^]*base64,[\w+/=-]+/i;
12
+ var REG_DATA_URL_G = /data:[\w#&+./;=-]*,[^"]+/g;
13
+ var REG_NUM_REF = /&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi;
14
+ var REG_MIME_DOM = /^(?:application\/(?:[\w#&.;-]+\+)?x|image\/svg\+x|text\/(?:ht|x))ml;?/;
15
+ var REG_SCHEME = /^[a-z][\da-z+.-]*$/;
16
+ var REG_SCHEME_EXT = /^(?:ext|web)\+[a-z]+$/;
17
+ var REG_SCRIPT = /(?:java|vb)script/;
18
+ var REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;
19
+ var REG_TAG_QUOT = /%(?:2[27]|3[CE])|[<>"']/;
20
+ var REG_TAG_QUOT_ENC_G = /%(?:2[27]|3[CE])/g;
21
+ var REG_TAG_QUOT_SPACE_G = /[<>"'\s]/g;
22
+ var REG_URL_ENC = /^%[\dA-F]{2}$/i;
23
+
24
+ // bundle_wo_dompurify/mjs/common.js
7
25
  var getType = (o) => Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);
8
26
  var isString = (o) => typeof o === "string" || o instanceof String;
9
27
 
@@ -11,24 +29,12 @@ var isString = (o) => typeof o === "string" || o instanceof String;
11
29
  var text_chars_default = [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];
12
30
 
13
31
  // bundle_wo_dompurify/lib/iana/uri-schemes.json
14
- var uri_schemes_default = ["aaa", "aaas", "about", "acap", "acct", "acd", "acr", "adiumxtra", "adt", "afp", "afs", "aim", "amss", "android", "appdata", "apt", "ar", "ark", "at", "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", "dhttp", "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", "lid", "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-launchremotedesktop", "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", "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", "openid", "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"];
32
+ var uri_schemes_default = ["aaa", "aaas", "about", "acap", "acct", "acd", "acr", "adiumxtra", "adt", "afp", "afs", "aim", "amss", "android", "appdata", "apt", "ar", "ark", "at", "attachment", "aw", "barion", "beshare", "bitcoin", "bitcoincash", "blob", "bolo", "brid", "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", "dhttp", "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", "lid", "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-launchremotedesktop", "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", "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", "openid", "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"];
15
33
 
16
34
  // bundle_wo_dompurify/mjs/file-reader.js
17
35
  var { FileReader } = globalThis;
18
36
 
19
37
  // bundle_wo_dompurify/mjs/uri-util.js
20
- var HEX = 16;
21
- var REG_BASE64 = /^[\w+/\-=]+$/;
22
- var REG_END_COLON = /:$/;
23
- var REG_NUM_DECI = /^\d+/;
24
- var REG_NUM_HEAD = /#x?$/;
25
- var REG_NUM_HEAD_ASCII = /^#(?:x(?:00)?[2-7]|\d)/;
26
- var REG_NUM_HEX = /^x[\dA-F]+/i;
27
- var REG_NUM_REF = /&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi;
28
- var REG_SCHEME = /^[a-z][\da-z+\-.]*$/;
29
- var REG_SCHEME_CUSTOM = /^(?:ext|web)\+[a-z]+$/;
30
- var REG_SCRIPT = /(?:java|vb)script/;
31
- var REG_URL_ENC = /^%[\dA-F]{2}$/i;
32
38
  var getURLEncodedString = (str) => {
33
39
  if (!isString(str)) {
34
40
  throw new TypeError(`Expected String but got ${getType(str)}.`);
@@ -63,7 +69,7 @@ var escapeURLEncodedHTMLChars = (ch) => {
63
69
  var parseBase64 = (data) => {
64
70
  if (!isString(data)) {
65
71
  throw new TypeError(`Expected String but got ${getType(data)}.`);
66
- } else if (!REG_BASE64.test(data)) {
72
+ } else if (!REG_B64.test(data)) {
67
73
  throw new Error(`Invalid base64 data: ${data}`);
68
74
  }
69
75
  const bin = atob(data);
@@ -93,9 +99,9 @@ var parseURLEncodedNumCharRef = (str, nest = 0) => {
93
99
  for (const item of items) {
94
100
  const [numCharRef, value] = item;
95
101
  let num;
96
- if (REG_NUM_HEX.test(value)) {
102
+ if (/^x[\dA-F]+/i.test(value)) {
97
103
  num = parseInt(`0${value}`, HEX);
98
- } else if (REG_NUM_DECI.test(value)) {
104
+ } else if (/^\d+/.test(value)) {
99
105
  num = parseInt(value);
100
106
  }
101
107
  if (Number.isInteger(num)) {
@@ -106,7 +112,7 @@ var parseURLEncodedNumCharRef = (str, nest = 0) => {
106
112
  ];
107
113
  if (textCharCodes.has(num)) {
108
114
  res = `${preNum}${String.fromCharCode(num)}${postNum}`;
109
- if (REG_NUM_HEAD.test(preNum) || REG_NUM_HEAD_ASCII.test(postNum)) {
115
+ if (/#x?$/.test(preNum) || /^#(?:x(?:00)?[2-7]|\d)/.test(postNum)) {
110
116
  res = parseURLEncodedNumCharRef(res, ++nest);
111
117
  }
112
118
  } else if (num < HEX * HEX) {
@@ -184,9 +190,9 @@ var URISchemes = class {
184
190
  if (isString(uri)) {
185
191
  try {
186
192
  const { protocol } = new URL(uri);
187
- const scheme = protocol.replace(REG_END_COLON, "");
193
+ const scheme = protocol.replace(/:$/, "");
188
194
  const schemeParts = scheme.split("+");
189
- res = !REG_SCRIPT.test(scheme) && REG_SCHEME_CUSTOM.test(scheme) || schemeParts.every((s) => this.#schemes.has(s));
195
+ res = !REG_SCRIPT.test(scheme) && REG_SCHEME_EXT.test(scheme) || schemeParts.every((s) => this.#schemes.has(s));
190
196
  } catch (e) {
191
197
  res = false;
192
198
  }
@@ -206,19 +212,6 @@ var URISchemes = class {
206
212
  };
207
213
 
208
214
  // bundle_wo_dompurify/mjs/sanitizer.js
209
- var HEX2 = 16;
210
- var REG_DATA_URL = /data:[\w#&+\-./;=]*,/;
211
- var REG_DATA_URL_BASE64 = /data:[\w#&+\-./;=]*base64,[\w+/\-=]+/i;
212
- var REG_DATA_URL_G = /data:[\w#&+\-./;=]*,[^"]+/g;
213
- var REG_END_COLON2 = /:$/;
214
- var REG_END_NUM = /(?:#|%23)$/;
215
- var REG_END_QUEST = /(?<!(?:#|%23).*)(?:\?|%3F)$/;
216
- var REG_HTML_SP = /[<>"'\s]/g;
217
- var REG_HTML_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;
218
- var REG_MIME_DOM = /^(?:text\/(?:ht|x)ml|application\/(?:[\w#&\-.;]+\+)?xml|image\/svg\+xml)/;
219
- var REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;
220
- var REG_TAG_QUOT = /%(?:2(?:2|7)|3(?:C|E))|[<>"']/;
221
- var REG_URL_ENC_AMP = /%26/g;
222
215
  var URLSanitizer = class extends URISchemes {
223
216
  /* private fields */
224
217
  #nest;
@@ -246,8 +239,8 @@ var URLSanitizer = class extends URISchemes {
246
239
  const items = [...matchedDataUrls].reverse();
247
240
  for (const item of items) {
248
241
  let [dataUrl] = item;
249
- if (REG_DATA_URL_BASE64.test(dataUrl)) {
250
- [dataUrl] = REG_DATA_URL_BASE64.exec(dataUrl);
242
+ if (REG_DATA_URL_B64.test(dataUrl)) {
243
+ [dataUrl] = REG_DATA_URL_B64.exec(dataUrl);
251
244
  }
252
245
  this.#nest++;
253
246
  this.#recurse.add(dataUrl);
@@ -277,11 +270,11 @@ var URLSanitizer = class extends URISchemes {
277
270
  if (!isString(dom)) {
278
271
  throw new TypeError(`Expected String but got ${getType(dom)}.`);
279
272
  }
280
- let purifiedDom = DOMPurify.sanitize(decodeURIComponent(dom));
273
+ let purifiedDom = dompurify_default.sanitize(decodeURIComponent(dom));
281
274
  if (purifiedDom && REG_DATA_URL.test(purifiedDom)) {
282
275
  purifiedDom = this.replace(purifiedDom);
283
276
  }
284
- purifiedDom = purifiedDom.replace(REG_END_NUM, "").replace(REG_END_QUEST, "");
277
+ purifiedDom = purifiedDom.replace(/(?:#|%23)$/, "").replace(/(?<!(?:#|%23).*)(?:\?|%3F)$/, "");
285
278
  return encodeURI(purifiedDom);
286
279
  }
287
280
  /**
@@ -298,7 +291,7 @@ var URLSanitizer = class extends URISchemes {
298
291
  * @returns {?string} - sanitized URL
299
292
  */
300
293
  sanitize(url, opt) {
301
- if (this.#nest > HEX2) {
294
+ if (this.#nest > HEX) {
302
295
  this.#nest = 0;
303
296
  throw new Error("Data URLs nested too deeply.");
304
297
  }
@@ -378,7 +371,7 @@ var URLSanitizer = class extends URISchemes {
378
371
  let sanitizedUrl;
379
372
  if (super.verify(url)) {
380
373
  const { hash, href, pathname, protocol, search } = new URL(url);
381
- const scheme = protocol.replace(REG_END_COLON2, "");
374
+ const scheme = protocol.replace(/:$/, "");
382
375
  const schemeParts = scheme.split("+");
383
376
  let bool;
384
377
  if (restrictScheme) {
@@ -407,7 +400,7 @@ var URLSanitizer = class extends URISchemes {
407
400
  try {
408
401
  const decodedData = parseURLEncodedNumCharRef(parsedData).trim();
409
402
  const { protocol: dataScheme } = new URL(decodedData);
410
- const dataSchemeParts = dataScheme.replace(REG_END_COLON2, "").split("+");
403
+ const dataSchemeParts = dataScheme.replace(/:$/, "").split("+");
411
404
  if (dataSchemeParts.some((s) => REG_SCRIPT_BLOB.test(s))) {
412
405
  urlToSanitize = "";
413
406
  }
@@ -447,10 +440,10 @@ var URLSanitizer = class extends URISchemes {
447
440
  urlToSanitize = urlToSanitize.substring(0, index);
448
441
  }
449
442
  if (urlToSanitize) {
450
- sanitizedUrl = urlToSanitize.replace(REG_HTML_SP, getURLEncodedString).replace(REG_URL_ENC_AMP, escapeURLEncodedHTMLChars);
443
+ sanitizedUrl = urlToSanitize.replace(REG_TAG_QUOT_SPACE_G, getURLEncodedString).replace(/%26/g, escapeURLEncodedHTMLChars);
451
444
  if (finalize) {
452
445
  if (!isDataUrl) {
453
- sanitizedUrl = sanitizedUrl.replace(REG_HTML_URL_ENC, escapeURLEncodedHTMLChars);
446
+ sanitizedUrl = sanitizedUrl.replace(REG_TAG_QUOT_ENC_G, escapeURLEncodedHTMLChars);
454
447
  }
455
448
  this.#nest = 0;
456
449
  }
@@ -497,7 +490,7 @@ var URLSanitizer = class extends URISchemes {
497
490
  if (sanitizedUrl) {
498
491
  const urlObj = new URL(sanitizedUrl);
499
492
  const { pathname, protocol } = urlObj;
500
- const schemeParts = protocol.replace(REG_END_COLON2, "").split("+");
493
+ const schemeParts = protocol.replace(/:$/, "").split("+");
501
494
  const isDataUrl = schemeParts.includes("data");
502
495
  parsedUrl.set("valid", true);
503
496
  if (isDataUrl) {
@@ -548,7 +541,7 @@ var sanitizeURL = async (url, opt = {
548
541
  let scheme;
549
542
  try {
550
543
  const { protocol } = new URL(url);
551
- scheme = protocol.replace(REG_END_COLON2, "");
544
+ scheme = protocol.replace(/:$/, "");
552
545
  } catch (e) {
553
546
  }
554
547
  if (scheme === "blob") {
@@ -589,7 +582,7 @@ var sanitizeURLSync = (url, opt) => {
589
582
  let scheme;
590
583
  try {
591
584
  const { protocol } = new URL(url);
592
- scheme = protocol.replace(REG_END_COLON2, "");
585
+ scheme = protocol.replace(/:$/, "");
593
586
  } catch (e) {
594
587
  }
595
588
  if (scheme === "blob") {
@@ -610,8 +603,9 @@ var isURI = async (uri) => {
610
603
  return res;
611
604
  };
612
605
  var isURISync = (uri) => urlSanitizer.verify(uri);
606
+ var sanitizer_default = urlSanitizer;
613
607
  export {
614
- urlSanitizer as default,
608
+ sanitizer_default as default,
615
609
  isURI,
616
610
  isURISync,
617
611
  parseURL,
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/uri-util.js", "../bundle_wo_dompurify/mjs/sanitizer.js"],
4
- "sourcesContent": ["/**\n * dompurify.js\n */\n\nconst { DOMPurify } = globalThis;\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 * @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 * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[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]\n", "[\"aaa\",\"aaas\",\"about\",\"acap\",\"acct\",\"acd\",\"acr\",\"adiumxtra\",\"adt\",\"afp\",\"afs\",\"aim\",\"amss\",\"android\",\"appdata\",\"apt\",\"ar\",\"ark\",\"at\",\"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\",\"dhttp\",\"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\",\"lid\",\"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-launchremotedesktop\",\"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\",\"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\",\"openid\",\"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\"]\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = globalThis;\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 { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\w+/\\-=]+$/;\nconst REG_END_COLON = /:$/;\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});?/gi;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\n\n/**\n * get URL encoded string\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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * @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 * reset schemes\n * @returns {void}\n */\n reset() {\n this.#schemes.clear();\n for (const scheme of uriSchemes) {\n this.#schemes.add(scheme);\n }\n }\n};\n", "/**\n * sanitizer.js\n */\n\n/* shared */\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport {\n createDataURLFromBlob, escapeURLEncodedHTMLChars, getURLEncodedString,\n parseBase64, parseURLEncodedNumCharRef, URISchemes\n} from './uri-util.js';\n\n/* constants */\nconst HEX = 16;\nconst REG_DATA_URL = /data:[\\w#&+\\-./;=]*,/;\nconst REG_DATA_URL_BASE64 = /data:[\\w#&+\\-./;=]*base64,[\\w+/\\-=]+/i;\nconst REG_DATA_URL_G = /data:[\\w#&+\\-./;=]*,[^\"]+/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_MIME_DOM =\n /^(?:text\\/(?:ht|x)ml|application\\/(?:[\\w#&\\-.;]+\\+)?xml|image\\/svg\\+xml)/;\nconst REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nconst REG_TAG_QUOT = /%(?:2(?:2|7)|3(?:C|E))|[<>\"']/;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/* typedef */\n/**\n * @typedef {object} ParsedURL - object with additional props based on URL API\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/* 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 * @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 * @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 * @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) {\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 const tempScheme = new Set();\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 tempScheme.add(item);\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 tempScheme.add(item);\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 [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${search}${hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.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 (!mediaType || REG_MIME_DOM.test(mediaType)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaTypes.pop();\n }\n urlToSanitize = `${scheme}:${mediaTypes.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove && REG_TAG_QUOT.test(urlToSanitize)) {\n const item = REG_TAG_QUOT.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 if (tempScheme.size) {\n tempScheme.forEach(item => {\n super.remove(item);\n });\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\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 [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n if (isBase64) {\n mediaTypes.pop();\n }\n dataUrl.set('mime', mediaTypes.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 * reset sanitizer\n * @returns {void}\n */\n reset() {\n super.reset();\n this.#nest = 0;\n this.#recurse.clear();\n }\n};\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\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 * @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 (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(REG_END_COLON, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === '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 if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\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 (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(REG_END_COLON, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === 'blob') {\n URL.revokeObjectURL(url);\n } else if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * parse URL async\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 * parse URL sync\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * is URI async\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 * is URI sync\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/* export instance */\nexport {\n urlSanitizer as default\n};\n"],
5
- "mappings": "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",
6
- "names": ["HEX", "REG_END_COLON", "REG_END_COLON"]
3
+ "sources": ["../bundle_wo_dompurify/mjs/dompurify.js", "../bundle_wo_dompurify/mjs/constant.js", "../bundle_wo_dompurify/mjs/common.js", "../bundle_wo_dompurify/lib/file/text-chars.json", "../bundle_wo_dompurify/lib/iana/uri-schemes.json", "../bundle_wo_dompurify/mjs/file-reader.js", "../bundle_wo_dompurify/mjs/uri-util.js", "../bundle_wo_dompurify/mjs/sanitizer.js"],
4
+ "sourcesContent": ["/**\n * dompurify.js\n */\n\nconst { DOMPurify } = globalThis;\n\nexport default DOMPurify;\n", "/**\n * constant.js\n */\n\n/* numeric */\nexport const HEX = 16;\nexport const TYPE_FROM = 8;\nexport const TYPE_TO = -1;\n\n/* regexp */\nexport const REG_B64 = /^[\\w+/=-]+$/;\nexport const REG_CHARSET = /^charset=([\\w#&.;-]+)$/;\nexport const REG_DATA_URL = /data:[\\w#&+./;=-]*,/;\nexport const REG_DATA_URL_B64 = /data:[\\w#&+./;=^]*base64,[\\w+/=-]+/i;\nexport const REG_DATA_URL_G = /data:[\\w#&+./;=-]*,[^\"]+/g;\nexport const REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/gi;\nexport const REG_MIME_DOM =\n /^(?:application\\/(?:[\\w#&.;-]+\\+)?x|image\\/svg\\+x|text\\/(?:ht|x))ml;?/;\nexport const REG_MIME_TEXT = /^text\\/[\\w#&.;-]+/;\nexport const REG_SCHEME = /^[a-z][\\da-z+.-]*$/;\nexport const REG_SCHEME_EXT = /^(?:ext|web)\\+[a-z]+$/;\nexport const REG_SCRIPT = /(?:java|vb)script/;\nexport const REG_SCRIPT_BLOB = /(?:java|vb)script|blob/;\nexport const REG_TAG_QUOT = /%(?:2[27]|3[CE])|[<>\"']/;\nexport const REG_TAG_QUOT_ENC_G = /%(?:2[27]|3[CE])/g;\nexport const REG_TAG_QUOT_SPACE_G = /[<>\"'\\s]/g;\nexport const REG_URL_ENC = /^%[\\dA-F]{2}$/i;\n", "/**\n * common.js\n */\n\n/* shared */\nimport { TYPE_FROM, TYPE_TO } from './constant.js';\n\n/**\n * get type\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 * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[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]\n", "[\"aaa\",\"aaas\",\"about\",\"acap\",\"acct\",\"acd\",\"acr\",\"adiumxtra\",\"adt\",\"afp\",\"afs\",\"aim\",\"amss\",\"android\",\"appdata\",\"apt\",\"ar\",\"ark\",\"at\",\"attachment\",\"aw\",\"barion\",\"beshare\",\"bitcoin\",\"bitcoincash\",\"blob\",\"bolo\",\"brid\",\"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\",\"dhttp\",\"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\",\"lid\",\"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-launchremotedesktop\",\"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\",\"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\",\"openid\",\"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\"]\n", "/**\n * file-reader.js\n */\n\nconst { FileReader } = globalThis;\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 { getType, isString } from './common.js';\nimport { FileReader } from './file-reader.js';\nimport {\n HEX, REG_B64, REG_NUM_REF, REG_SCHEME, REG_SCHEME_EXT, REG_SCRIPT, REG_URL_ENC\n} from './constant.js';\n\n/**\n * get URL encoded string\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 * @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 * @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_B64.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 * @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 (/^x[\\dA-F]+/i.test(value)) {\n num = parseInt(`0${value}`, HEX);\n } else if (/^\\d+/.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 (/#x?$/.test(preNum) || /^#(?:x(?:00)?[2-7]|\\d)/.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 * @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 */\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 * @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 * @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 * @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 * @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 * @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(/:$/, '');\n const schemeParts = scheme.split('+');\n res = (!REG_SCRIPT.test(scheme) && REG_SCHEME_EXT.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 * reset schemes\n * @returns {void}\n */\n reset() {\n this.#schemes.clear();\n for (const scheme of uriSchemes) {\n this.#schemes.add(scheme);\n }\n }\n};\n", "/**\n * sanitizer.js\n */\n\n/* shared */\nimport domPurify from './dompurify.js';\nimport { getType, isString } from './common.js';\nimport {\n createDataURLFromBlob, escapeURLEncodedHTMLChars, getURLEncodedString,\n parseBase64, parseURLEncodedNumCharRef, URISchemes\n} from './uri-util.js';\nimport {\n HEX, REG_DATA_URL, REG_DATA_URL_B64, REG_DATA_URL_G, REG_MIME_DOM,\n REG_SCRIPT_BLOB, REG_TAG_QUOT, REG_TAG_QUOT_ENC_G, REG_TAG_QUOT_SPACE_G\n} from './constant.js';\n\n/* typedef */\n/**\n * @typedef {object} ParsedURL - object with additional props based on URL API\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 * URL sanitizer\n */\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 * @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_B64.test(dataUrl)) {\n [dataUrl] = REG_DATA_URL_B64.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 * @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 = purifiedDom.replace(/(?:#|%23)$/, '')\n .replace(/(?<!(?:#|%23).*)(?:\\?|%3F)$/, '');\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 * @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) {\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 const tempScheme = new Set();\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 tempScheme.add(item);\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 tempScheme.add(item);\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(/:$/, '');\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 [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}${search}${hash}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.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 = dataScheme.replace(/:$/, '').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 (!mediaType || REG_MIME_DOM.test(mediaType)) {\n parsedData = this.purify(parsedData);\n }\n if (urlToSanitize && parsedData) {\n if (isBase64 && parsedData !== data) {\n mediaTypes.pop();\n }\n urlToSanitize = `${scheme}:${mediaTypes.join(';')},${parsedData}`;\n } else {\n urlToSanitize = '';\n }\n } else {\n finalize = true;\n }\n if (!isDataUrl && remove && REG_TAG_QUOT.test(urlToSanitize)) {\n const item = REG_TAG_QUOT.exec(urlToSanitize);\n const { index } = item;\n urlToSanitize = urlToSanitize.substring(0, index);\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_TAG_QUOT_SPACE_G, getURLEncodedString)\n .replace(/%26/g, escapeURLEncodedHTMLChars);\n if (finalize) {\n if (!isDataUrl) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_TAG_QUOT_ENC_G, escapeURLEncodedHTMLChars);\n }\n this.#nest = 0;\n }\n } else {\n this.#nest = 0;\n }\n }\n if (tempScheme.size) {\n tempScheme.forEach(item => {\n super.remove(item);\n });\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * parse sanitized URL\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(/:$/, '').split('+');\n const isDataUrl = schemeParts.includes('data');\n parsedUrl.set('valid', true);\n if (isDataUrl) {\n const dataUrl = new Map();\n const [mediaType, ...dataParts] = pathname.split(',');\n const data = `${dataParts.join(',')}`;\n const mediaTypes = mediaType.split(';');\n const isBase64 = mediaTypes[mediaTypes.length - 1] === 'base64';\n if (isBase64) {\n mediaTypes.pop();\n }\n dataUrl.set('mime', mediaTypes.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 * reset sanitizer\n * @returns {void}\n */\n reset() {\n super.reset();\n this.#nest = 0;\n this.#recurse.clear();\n }\n};\n\n/* aliases and async wrappers */\n/* instance */\nconst urlSanitizer = new URLSanitizer();\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 * @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 (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === '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 if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * sanitize URL sync\n * NOTE: `data` and `file` schemes must be explicitly allowed\n * `blob` scheme returns `null`\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 (url && isString(url)) {\n let scheme;\n try {\n const { protocol } = new URL(url);\n scheme = protocol.replace(/:$/, '');\n } catch (e) {\n // fall through;\n }\n if (scheme === 'blob') {\n URL.revokeObjectURL(url);\n } else if (scheme) {\n res = urlSanitizer.sanitize(url, opt);\n }\n }\n return res || null;\n};\n\n/**\n * parse URL async\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 * parse URL sync\n * @param {string} url - URL\n * @returns {ParsedURL} - result\n */\nexport const parseURLSync = url => urlSanitizer.parse(url);\n\n/**\n * is URI async\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 * is URI sync\n * @param {string} uri - URI\n * @returns {boolean} - result\n */\nexport const isURISync = uri => urlSanitizer.verify(uri);\n\n/* export instance */\nexport default urlSanitizer;\n"],
5
+ "mappings": "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",
6
+ "names": []
7
7
  }
@@ -1,4 +1,4 @@
1
- var{DOMPurify:B}=globalThis;var b=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var z=[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 G=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","at","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","dhttp","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","lid","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-launchremotedesktop","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","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","openid","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{FileReader:q}=globalThis;var U=16,te=/^[\w+/\-=]+$/,se=/:$/,re=/^\d+/,ae=/#x?$/,ie=/^#(?:x(?:00)?[2-7]|\d)/,oe=/^x[\dA-F]+/i,ne=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi,ce=/^[a-z][\da-z+\-.]*$/,pe=/^(?:ext|web)\+[a-z]+$/,Y=/(?:java|vb)script/,le=/^%[\dA-F]{2}$/i,T=t=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(U).toUpperCase()}`);return e.join("")},j=t=>{d(t)&&le.test(t)&&(t=t.toUpperCase());let[e,s,r,a,o,n]=["&","#","<",">",'"',"'"].map(T),i;return t===e?i=`${e}amp;`:t===r?i=`${e}lt;`:t===a?i=`${e}gt;`:t===o?i=`${e}quot;`:t===n?i=`${e}${s}39;`:i=t,i},X=t=>{if(d(t)){if(!te.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${b(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(o=>o.charCodeAt(0))),r=new Set(z),a;return s.every(o=>r.has(o))?a=e.replace(/\s/g,T):a=t,a},M=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);if(Number.isInteger(e)){if(e>U)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${b(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let r=new Set(z),a=[...s.matchAll(ne)].reverse();for(let o of a){let[n,i]=o,p;if(oe.test(i)?p=parseInt(`0${i}`,U):re.test(i)&&(p=parseInt(i)),Number.isInteger(p)){let{index:u}=o,[l,f]=[s.substring(0,u),s.substring(u+n.length)];r.has(p)?(s=`${l}${String.fromCharCode(p)}${f}`,(ae.test(l)||ie.test(f))&&(s=M(s,++e))):p<U*U&&(s=`${l}${f}`)}}}return s},Q=t=>new Promise((e,s)=>{let r=new q;r.addEventListener("error",()=>s(r.error)),r.addEventListener("abort",()=>e(r.result)),r.addEventListener("load",()=>e(r.result)),r.readAsDataURL(t)}),A=class{#e;constructor(){this.#e=new Set(G)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(Y.test(e)||!ce.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${b(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),a=r.replace(se,""),o=a.split("+");s=!Y.test(a)&&pe.test(a)||o.every(n=>this.#e.has(n))}catch{s=!1}return!!s}reset(){this.#e.clear();for(let e of G)this.#e.add(e)}};var me=16,O=/data:[\w#&+\-./;=]*,/,J=/data:[\w#&+\-./;=]*base64,[\w+/\-=]+/i,de=/data:[\w#&+\-./;=]*,[^"]+/g,v=/:$/,fe=/(?:#|%23)$/,he=/(?<!(?:#|%23).*)(?:\?|%3F)$/,ue=/[<>"'\s]/g,ge=/%(?:2(?:2|7)|3(?:C|E))/g,ye=/^(?:text\/(?:ht|x)ml|application\/(?:[\w#&\-.;]+\+)?xml|image\/svg\+xml)/,N=/(?:java|vb)script|blob/,K=/%(?:2(?:2|7)|3(?:C|E))|[<>"']/,be=/%26/g,I=class extends A{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}replace(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=e;if(O.test(s)){let a=[...s.matchAll(de)].reverse();for(let o of a){let[n]=o;J.test(n)&&([n]=J.exec(n)),this.#e++,this.#t.add(n);let i=this.sanitize(n,{allow:["data"]}),{index:p}=o,[u,l]=[s.substring(0,p),s.substring(p+n.length)];i?s=`${u}${i}${l}`:s=`${u}${l}`}}return s}purify(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=B.sanitize(decodeURIComponent(e));return s&&O.test(s)&&(s=this.replace(s)),s=s.replace(fe,"").replace(he,""),encodeURI(s)}sanitize(e,s){if(this.#e>me)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:r,deny:a,only:o,remove:n}=s??{},i=new Map([["blob",!1],["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),p=new Set,u=!1;if(Array.isArray(o)&&o.length){let f=super.get();for(let m of f)i.set(m,!1);let c=Object.values(o);for(let m of c)if(d(m)&&(m=m.trim(),!N.test(m))){if(super.has(m))i.set(m,!0);else{try{super.add(m)}catch{}super.has(m)&&(i.set(m,!0),p.add(m))}!u&&i.has(m)&&(u=i.get(m))}}else{if(Array.isArray(r)&&r.length){let f=Object.values(r);for(let c of f)if(d(c)&&(c=c.trim(),!N.test(c)))if(super.has(c))i.set(c,!0);else{try{super.add(c)}catch{}super.has(c)&&(i.set(c,!0),p.add(c))}}if(Array.isArray(a)&&a.length){let f=Object.values(a);for(let c of f)d(c)&&(c=c.trim(),c&&i.set(c,!1))}}let l;if(super.verify(e)){let{hash:f,href:c,pathname:m,protocol:E,search:_}=new URL(e),C=E.replace(v,""),k=C.split("+"),L;if(u)L=k.every(y=>i.get(y));else for(let[y,x]of i.entries())if(L=x||C!==y&&k.every(h=>h!==y),!L)break;if(L){let y=k.includes("data"),x,h=c;if(y){let[R,...D]=m.split(","),S=`${D.join(",")}${_}${f}`,$=R.split(";"),P=$[$.length-1]==="base64",g=S;P&&(g=X(S));try{let H=M(g).trim(),{protocol:V}=new URL(H);V.replace(v,"").split("+").some(W=>N.test(W))&&(h="")}catch{}let F=O.test(g);g!==S||F?F?g=this.replace(g):this.#t.has(e)?this.#t.delete(e):x=!0:this.#t.has(e)?this.#t.delete(e):x=!0,(!R||ye.test(R))&&(g=this.purify(g)),h&&g?(P&&g!==S&&$.pop(),h=`${C}:${$.join(";")},${g}`):h=""}else x=!0;if(!y&&n&&K.test(h)){let R=K.exec(h),{index:D}=R;h=h.substring(0,D)}h?(l=h.replace(ue,T).replace(be,j),x&&(y||(l=l.replace(ge,j)),this.#e=0)):this.#e=0}p.size&&p.forEach(y=>{super.remove(y)})}return l||null}parse(e,s){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let r=new Map([["input",e]]),a;if(this.verify(e)){let{protocol:o}=new URL(e);o==="blob:"?a=e:a=this.sanitize(e,s??{allow:["data","file"]})}if(a){let o=new URL(a),{pathname:n,protocol:i}=o,u=i.replace(v,"").split("+").includes("data");if(r.set("valid",!0),u){let l=new Map,[f,...c]=n.split(","),m=`${c.join(",")}`,E=f.split(";"),_=E[E.length-1]==="base64";_&&E.pop(),l.set("mime",E.join(";")),l.set("base64",_),l.set("data",m),r.set("data",Object.fromEntries(l))}else r.set("data",null);for(let l in o){let f=o[l];d(f)&&r.set(l,f)}}else r.set("valid",!1);return Object.fromEntries(r)}reset(){super.reset(),this.#e=0,this.#t.clear()}},w=new I,we=async(t,e={allow:[],deny:[],only:[]})=>{let s;if(t&&d(t)){let r;try{let{protocol:a}=new URL(t);r=a.replace(v,"")}catch{}if(r==="blob"){let{allow:a,deny:o,only:n}=e;if(Array.isArray(a)&&a.includes("blob")&&!(Array.isArray(o)&&o.includes("blob"))||Array.isArray(n)&&n.includes("blob")){let i;try{i=await fetch(t).then(p=>p.blob()).then(Q)}catch{}if(i){if(Array.isArray(n))n.includes("data")||n.push("data");else if(Array.isArray(a)&&(a.includes("data")||a.push("data"),Array.isArray(o)&&o.includes("data"))){let p=o.indexOf("data");o.splice(p,1)}s=w.sanitize(i,e)}}URL.revokeObjectURL(t)}else r&&(s=w.sanitize(t,e))}return s||null},Ee=(t,e)=>{let s;if(t&&d(t)){let r;try{let{protocol:a}=new URL(t);r=a.replace(v,"")}catch{}r==="blob"?URL.revokeObjectURL(t):r&&(s=w.sanitize(t,e))}return s||null},xe=async t=>w.parse(t),Re=t=>w.parse(t),Ue=async t=>w.verify(t),ve=t=>w.verify(t);export{w as default,Ue as isURI,ve as isURISync,xe as parseURL,Re as parseURLSync,we as sanitizeURL,Ee as sanitizeURLSync};
1
+ var{DOMPurify:ne}=globalThis,Q=ne;var X=/^[\w+/=-]+$/;var A=/data:[\w#&+./;=-]*,/,D=/data:[\w#&+./;=^]*base64,[\w+/=-]+/i,Y=/data:[\w#&+./;=-]*,[^"]+/g,J=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/gi,K=/^(?:application\/(?:[\w#&.;-]+\+)?x|image\/svg\+x|text\/(?:ht|x))ml;?/;var V=/^[a-z][\da-z+.-]*$/,W=/^(?:ext|web)\+[a-z]+$/,O=/(?:java|vb)script/,S=/(?:java|vb)script|blob/,j=/%(?:2[27]|3[CE])|[<>"']/,Z=/%(?:2[27]|3[CE])/g,ee=/[<>"'\s]/g,te=/^%[\dA-F]{2}$/i;var b=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var M=[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 P=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","at","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","brid","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","dhttp","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","lid","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-launchremotedesktop","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","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","openid","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{FileReader:se}=globalThis;var G=t=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(16).toUpperCase()}`);return e.join("")},I=t=>{d(t)&&te.test(t)&&(t=t.toUpperCase());let[e,s,r,i,o,n]=["&","#","<",">",'"',"'"].map(G),a;return t===e?a=`${e}amp;`:t===r?a=`${e}lt;`:t===i?a=`${e}gt;`:t===o?a=`${e}quot;`:t===n?a=`${e}${s}39;`:a=t,a},re=t=>{if(d(t)){if(!X.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${b(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(o=>o.charCodeAt(0))),r=new Set(M),i;return s.every(o=>r.has(o))?i=e.replace(/\s/g,G):i=t,i},B=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${b(t)}.`);if(Number.isInteger(e)){if(e>16)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${b(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let r=new Set(M),i=[...s.matchAll(J)].reverse();for(let o of i){let[n,a]=o,p;if(/^x[\dA-F]+/i.test(a)?p=parseInt(`0${a}`,16):/^\d+/.test(a)&&(p=parseInt(a)),Number.isInteger(p)){let{index:u}=o,[l,f]=[s.substring(0,u),s.substring(u+n.length)];r.has(p)?(s=`${l}${String.fromCharCode(p)}${f}`,(/#x?$/.test(l)||/^#(?:x(?:00)?[2-7]|\d)/.test(f))&&(s=B(s,++e))):p<16*16&&(s=`${l}${f}`)}}}return s},ie=t=>new Promise((e,s)=>{let r=new se;r.addEventListener("error",()=>s(r.error)),r.addEventListener("abort",()=>e(r.result)),r.addEventListener("load",()=>e(r.result)),r.readAsDataURL(t)}),L=class{#e;constructor(){this.#e=new Set(P)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(O.test(e)||!V.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${b(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),i=r.replace(/:$/,""),o=i.split("+");s=!O.test(i)&&W.test(i)||o.every(n=>this.#e.has(n))}catch{s=!1}return!!s}reset(){this.#e.clear();for(let e of P)this.#e.add(e)}};var N=class extends L{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}replace(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=e;if(A.test(s)){let i=[...s.matchAll(Y)].reverse();for(let o of i){let[n]=o;D.test(n)&&([n]=D.exec(n)),this.#e++,this.#t.add(n);let a=this.sanitize(n,{allow:["data"]}),{index:p}=o,[u,l]=[s.substring(0,p),s.substring(p+n.length)];a?s=`${u}${a}${l}`:s=`${u}${l}`}}return s}purify(e){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let s=Q.sanitize(decodeURIComponent(e));return s&&A.test(s)&&(s=this.replace(s)),s=s.replace(/(?:#|%23)$/,"").replace(/(?<!(?:#|%23).*)(?:\?|%3F)$/,""),encodeURI(s)}sanitize(e,s){if(this.#e>16)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:r,deny:i,only:o,remove:n}=s??{},a=new Map([["blob",!1],["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),p=new Set,u=!1;if(Array.isArray(o)&&o.length){let f=super.get();for(let m of f)a.set(m,!1);let c=Object.values(o);for(let m of c)if(d(m)&&(m=m.trim(),!S.test(m))){if(super.has(m))a.set(m,!0);else{try{super.add(m)}catch{}super.has(m)&&(a.set(m,!0),p.add(m))}!u&&a.has(m)&&(u=a.get(m))}}else{if(Array.isArray(r)&&r.length){let f=Object.values(r);for(let c of f)if(d(c)&&(c=c.trim(),!S.test(c)))if(super.has(c))a.set(c,!0);else{try{super.add(c)}catch{}super.has(c)&&(a.set(c,!0),p.add(c))}}if(Array.isArray(i)&&i.length){let f=Object.values(i);for(let c of f)d(c)&&(c=c.trim(),c&&a.set(c,!1))}}let l;if(super.verify(e)){let{hash:f,href:c,pathname:m,protocol:x,search:U}=new URL(e),C=x.replace(/:$/,""),k=C.split("+"),v;if(u)v=k.every(y=>a.get(y));else for(let[y,R]of a.entries())if(v=R||C!==y&&k.every(h=>h!==y),!v)break;if(v){let y=k.includes("data"),R,h=c;if(y){let[_,...z]=m.split(","),T=`${z.join(",")}${U}${f}`,$=_.split(";"),F=$[$.length-1]==="base64",g=T;F&&(g=re(T));try{let q=B(g).trim(),{protocol:ae}=new URL(q);ae.replace(/:$/,"").split("+").some(oe=>S.test(oe))&&(h="")}catch{}let H=A.test(g);g!==T||H?H?g=this.replace(g):this.#t.has(e)?this.#t.delete(e):R=!0:this.#t.has(e)?this.#t.delete(e):R=!0,(!_||K.test(_))&&(g=this.purify(g)),h&&g?(F&&g!==T&&$.pop(),h=`${C}:${$.join(";")},${g}`):h=""}else R=!0;if(!y&&n&&j.test(h)){let _=j.exec(h),{index:z}=_;h=h.substring(0,z)}h?(l=h.replace(ee,G).replace(/%26/g,I),R&&(y||(l=l.replace(Z,I)),this.#e=0)):this.#e=0}p.size&&p.forEach(y=>{super.remove(y)})}return l||null}parse(e,s){if(!d(e))throw new TypeError(`Expected String but got ${b(e)}.`);let r=new Map([["input",e]]),i;if(this.verify(e)){let{protocol:o}=new URL(e);o==="blob:"?i=e:i=this.sanitize(e,s??{allow:["data","file"]})}if(i){let o=new URL(i),{pathname:n,protocol:a}=o,u=a.replace(/:$/,"").split("+").includes("data");if(r.set("valid",!0),u){let l=new Map,[f,...c]=n.split(","),m=`${c.join(",")}`,x=f.split(";"),U=x[x.length-1]==="base64";U&&x.pop(),l.set("mime",x.join(";")),l.set("base64",U),l.set("data",m),r.set("data",Object.fromEntries(l))}else r.set("data",null);for(let l in o){let f=o[l];d(f)&&r.set(l,f)}}else r.set("valid",!1);return Object.fromEntries(r)}reset(){super.reset(),this.#e=0,this.#t.clear()}},w=new N,de=async(t,e={allow:[],deny:[],only:[]})=>{let s;if(t&&d(t)){let r;try{let{protocol:i}=new URL(t);r=i.replace(/:$/,"")}catch{}if(r==="blob"){let{allow:i,deny:o,only:n}=e;if(Array.isArray(i)&&i.includes("blob")&&!(Array.isArray(o)&&o.includes("blob"))||Array.isArray(n)&&n.includes("blob")){let a;try{a=await fetch(t).then(p=>p.blob()).then(ie)}catch{}if(a){if(Array.isArray(n))n.includes("data")||n.push("data");else if(Array.isArray(i)&&(i.includes("data")||i.push("data"),Array.isArray(o)&&o.includes("data"))){let p=o.indexOf("data");o.splice(p,1)}s=w.sanitize(a,e)}}URL.revokeObjectURL(t)}else r&&(s=w.sanitize(t,e))}return s||null},fe=(t,e)=>{let s;if(t&&d(t)){let r;try{let{protocol:i}=new URL(t);r=i.replace(/:$/,"")}catch{}r==="blob"?URL.revokeObjectURL(t):r&&(s=w.sanitize(t,e))}return s||null},he=async t=>w.parse(t),ue=t=>w.parse(t),ge=async t=>w.verify(t),ye=t=>w.verify(t),be=w;export{be as default,ge as isURI,ye as isURISync,he as parseURL,ue as parseURLSync,de as sanitizeURL,fe as sanitizeURLSync};
2
2
  /*!
3
3
  * URL Sanitizer
4
4
  *