url-sanitizer 0.5.5 → 0.5.7

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
@@ -122,18 +122,18 @@ Type: [object][3]
122
122
  * `data.mime` **[string][1]** MIME type.
123
123
  * `data.base64` **[boolean][2]** `true` if base64 encoded.
124
124
  * `data.data` **[string][1]** Data part of the data URL.
125
- * `href` **[string][1]** Same as URL API.
126
- * `origin` **[string][1]** Same as URL API.
127
- * `protocol` **[string][1]** Same as URL API.
128
- * `username` **[string][1]** Same as URL API.
129
- * `password` **[string][1]** Same as URL API.
130
- * `host` **[string][1]** Same as URL API.
131
- * `hostname` **[string][1]** Same as URL API.
132
- * `port` **[string][1]** Same as URL API.
133
- * `pathname` **[string][1]** Same as URL API.
134
- * `search` **[string][1]** Same as URL API.
135
- * `searchParams` **[object][3]** Same as URL API.
136
- * `hash` **[string][1]** Same as URL API.
125
+ * `href` **[string][1]** Sanitized URL input.
126
+ * `origin` **[string][1]** Scheme, domain and port of the sanitized URL.
127
+ * `protocol` **[string][1]** Protocol scheme of the sanitized URL.
128
+ * `username` **[string][1]** Username specified before the domain name.
129
+ * `password` **[string][1]** Password specified before the domain name.
130
+ * `host` **[string][1]** Domain and port of the sanitized URL.
131
+ * `hostname` **[string][1]** Domain of the sanitized URL.
132
+ * `port` **[string][1]** Port number of the sanitized URL.
133
+ * `pathname` **[string][1]** Path of the sanitized URL.
134
+ * `search` **[string][1]** Query string of the sanitized URL.
135
+ * `searchParams` **[object][3]** [URLSearchParams](https://developer.mozilla.org/en-US/docs/Web/API/URLSearchParams) object.
136
+ * `hash` **[string][1]** Fragment identifier of the sanitized URL.
137
137
 
138
138
  ```javascript
139
139
  const res1 = await parseURL('javascript:alert(1)');
@@ -237,11 +237,13 @@ Instance of the sanitizer.
237
237
 
238
238
  ### urlSanitizer.get()
239
239
 
240
- Get an array of URI schemes registered at [iana.org](https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml "Uniform Resource Identifier (URI) Schemes").
241
- * Historical schemes omitted.
242
- * `moz-extension` scheme added.
240
+ Get a list of registered URI schemes.
243
241
 
244
242
  Returns **[Array][4]<[string][1]>** Array of registered URI schemes.
243
+ * Includes schemes registered at [iana.org](https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml "Uniform Resource Identifier (URI) Schemes") by default.
244
+ * Historical schemes omitted.
245
+ * `moz-extension` scheme added.
246
+ * Also includes custom schemes added via [urlSanitizer.add()](#urlsanitizeraddscheme).
245
247
 
246
248
  ```javascript
247
249
  const schemes = urlSanitizer.get();
@@ -268,7 +270,7 @@ const res2 = urlSanitizer.has('foo');
268
270
 
269
271
  ### urlSanitizer.add(scheme)
270
272
 
271
- Add a scheme to the list of URI schemes.
273
+ Add a scheme to the list of registered URI schemes.
272
274
  * `javascript` and `vbscript` schemes can not be registered. It throws.
273
275
 
274
276
  #### Parameters
@@ -290,7 +292,7 @@ console.log(isURISync('foo'));
290
292
 
291
293
  ### urlSanitizer.remove(scheme)
292
294
 
293
- Remove a scheme from the list of URI schemes.
295
+ Remove a scheme from the list of registered URI schemes.
294
296
 
295
297
  #### Parameters
296
298
 
@@ -315,6 +317,81 @@ const res2 = urlSanitizer.remove('foo');
315
317
 
316
318
  ---
317
319
 
320
+ ## Reactivate tags and purify DOM
321
+
322
+ It's outside the scope of URL Sanitizer, but escaped tags in sanitized data URL can be inconvenient.
323
+ For example, embedded SVG in a data URL.
324
+
325
+ For such cases, here is a sample code that reactivate tags and purify the DOM.
326
+
327
+ * [dompurify](https://www.npmjs.com/package/dompurify) is required.
328
+ * If you're using Node.js, [jsdom](https://www.npmjs.com/package/jsdom) is also required.
329
+
330
+ ```shell
331
+ npm i dompurify jsdom
332
+ ```
333
+
334
+ ```javascript
335
+ import DOMPurify from 'dompurify';
336
+ import { JSDOM } from 'jsdom';
337
+ import { parseURL } from 'url-sanitizer';
338
+
339
+ const { window } = new JSDOM('');
340
+ const domPurify = DOMPurify(window);
341
+
342
+ /**
343
+ * get purified DOM from a data URL
344
+ *
345
+ * @param {string} url - URL input
346
+ * @returns {?string} - purified DOM, `null` if the given URL is not a data URL
347
+ */
348
+ const getPurifiedDOMFromDataURL = async url => {
349
+ const parsedURL = await parseURL(url);
350
+ const { data: parsedDataURL } = parsedURL;
351
+ let purifiedDOM;
352
+ if (parsedDataURL) {
353
+ const { base64, data, mime } = parsedDataURL;
354
+ if (!base64 &&
355
+ /^(?:text\/(?:ht|x)ml|application\/(?:xhtml\+)?xml|image\/svg\+xml)/
356
+ .test(mime)) {
357
+ let parsedData = data;
358
+ const matchedHTMLChars =
359
+ parsedData.matchAll(/%26(?:(?:l|g|quo)t|%2339);?/g);
360
+ const items = [...matchedHTMLChars].reverse();
361
+ const unescapeURLEncodedHTMLChars = ch => {
362
+ let unescapedChar;
363
+ if (/%26lt;?/.test(ch)) {
364
+ unescapedChar = '<';
365
+ } else if (/%26gt;?/.test(ch)) {
366
+ unescapedChar = '>';
367
+ } else if (/%26quot;?/.test(ch)) {
368
+ unescapedChar = '"';
369
+ } else if (/%26%2339;?/.test(ch)) {
370
+ unescapedChar = "'";
371
+ } else {
372
+ unescapedChar = ch;
373
+ }
374
+ return unescapedChar;
375
+ };
376
+ for (const item of items) {
377
+ const [htmlChar] = item;
378
+ const { index } = item;
379
+ const [preHTMLChar, postHTMLChar] = [
380
+ parsedData.substring(0, index),
381
+ parsedData.substring(index + htmlChar.length)
382
+ ];
383
+ const unescapedHTMLChar = unescapeURLEncodedHTMLChars(htmlChar);
384
+ parsedData = `${preHTMLChar}${unescapedHTMLChar}${postHTMLChar}`;
385
+ }
386
+ purifiedDOM = domPurify.sanitize(decodeURIComponent(parsedData));
387
+ }
388
+ }
389
+ return purifiedDOM ?? null;
390
+ };
391
+ ```
392
+
393
+ ---
394
+
318
395
  ## Acknowledgments
319
396
 
320
397
  The following resources have been of great help in the development of the URL Sanitizer.
@@ -974,30 +974,31 @@ var URLSanitizer = class extends URISchemes {
974
974
  * @property {string} data.mime - MIME type
975
975
  * @property {boolean} data.base64 - `true` if base64 encoded
976
976
  * @property {string} data.data - data part of the data URL
977
- * @property {string} href - same as URL API
978
- * @property {string} origin - same as URL API
979
- * @property {string} protocol - same as URL API
980
- * @property {string} username - same as URL API
981
- * @property {string} password - same as URL API
982
- * @property {string} host - same as URL API
983
- * @property {string} hostname - same as URL API
984
- * @property {string} port - same as URL API
985
- * @property {string} pathname - same as URL API
986
- * @property {string} search - same as URL API
987
- * @property {object} searchParams - same as URL API
988
- * @property {string} hash - same as URL API
977
+ * @property {string} href - sanitized URL input
978
+ * @property {string} origin - scheme, domain and port of the sanitized URL
979
+ * @property {string} protocol - protocol scheme of the sanitized URL
980
+ * @property {string} username - username specified before the domain name
981
+ * @property {string} password - password specified before the domain name
982
+ * @property {string} host - domain and port of the sanitized URL
983
+ * @property {string} hostname - domain of the sanitized URL
984
+ * @property {string} port - port number of the sanitized URL
985
+ * @property {string} pathname - path of the sanitized URL
986
+ * @property {string} search - query string of the sanitized URL
987
+ * @property {object} searchParams - URLSearchParams object
988
+ * @property {string} hash - fragment identifier of the sanitized URL
989
989
  */
990
990
  /**
991
991
  * parse sanitized URL
992
992
  *
993
993
  * @param {string} url - URL input
994
+ * @param {object} opt - options
994
995
  * @returns {ParsedURL} - result with extended props based on URL API
995
996
  */
996
- parse(url) {
997
+ parse(url, opt) {
997
998
  if (!isString(url)) {
998
999
  throw new TypeError(`Expected String but got ${getType(url)}.`);
999
1000
  }
1000
- const sanitizedUrl = this.sanitize(url, {
1001
+ const sanitizedUrl = this.sanitize(url, opt ?? {
1001
1002
  allow: ["data", "file"]
1002
1003
  });
1003
1004
  const parsedUrl = /* @__PURE__ */ new Map([
@@ -1042,19 +1043,34 @@ var isURI = async (uri) => {
1042
1043
  const res = await isUri(uri);
1043
1044
  return res;
1044
1045
  };
1045
- var sanitizeUrl = (url, opt) => urlSanitizer.sanitize(url, opt ?? {
1046
- allow: [],
1047
- deny: [],
1048
- only: []
1049
- });
1046
+ var sanitizeUrl = (url, opt) => {
1047
+ const parsedUrl = urlSanitizer.parse(url, opt ?? {
1048
+ allow: [],
1049
+ deny: [],
1050
+ only: []
1051
+ });
1052
+ let res;
1053
+ if (parsedUrl) {
1054
+ const { href } = parsedUrl;
1055
+ res = href;
1056
+ }
1057
+ return res ?? null;
1058
+ };
1050
1059
  var sanitizeURL = async (url, opt) => {
1051
1060
  const res = await sanitizeUrl(url, opt);
1052
1061
  return res;
1053
1062
  };
1063
+ var parseUrl = (url) => urlSanitizer.parse(url);
1064
+ var parseURL = async (url) => {
1065
+ const res = await parseUrl(url);
1066
+ return res;
1067
+ };
1054
1068
  export {
1055
1069
  urlSanitizer as default,
1056
1070
  isURI,
1057
1071
  isUri as isURISync,
1072
+ parseURL,
1073
+ parseUrl as parseURLSync,
1058
1074
  sanitizeURL,
1059
1075
  sanitizeUrl as sanitizeURLSync
1060
1076
  };
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/mjs/common.js", "../src/lib/file/text-chars.json", "../src/lib/iana/uri-schemes.json", "../src/mjs/uri-util.js"],
4
- "sourcesContent": ["/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n *\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport { getType, isString } from './common.js';\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,[^\"]+/g;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_SP_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/**\n * get URL encoded string\n *\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getUrlEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n *\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeUrlEncodedHtmlChars = ch => {\n if (isString(ch)) {\n if (REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`Invalid URL encoded character: ${ch}`);\n }\n } else {\n throw new TypeError(`Expected String but got ${getType(ch)}.`);\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n *\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n *\n * @param {string} str - string\n * @param {number} nest - nest level\n * @returns {string} - parsed string\n */\nexport const parseUrlEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (/^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 * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n *\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n *\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * is URI\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\n isURI(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_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n};\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * sanitize URL\n * NOTE: `data` and/or `file` schemes must be explicitly allowed\n * `javascript` and/or `vbscript` schemes can not be allowed\n *\n * @param {string} url - URL input\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 * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only } = opt ?? {};\n const schemeMap = new Map([\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.isURI(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 let escapeHtml;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n let parsedData = data;\n if (mediaType[mediaType.length - 1] === 'base64') {\n mediaType.pop();\n parsedData = parseBase64(data);\n } else {\n try {\n const decodedData = parseUrlEncodedNumCharRef(parsedData);\n const { protocol: dataScheme } = new URL(decodedData.trim());\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n }\n const containsDataUrl = /data:[^,]*,/.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n const matchedDataUrls = parsedData.matchAll(REG_DATA_URL);\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 if (parsedDataUrl) {\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n parsedData.substring(0, index),\n parsedData.substring(index + dataUrl.length)\n ];\n parsedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n }\n }\n if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else {\n escapeHtml = true;\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getUrlEncodedString)\n .replace(REG_URL_ENC_AMP, escapeUrlEncodedHtmlChars);\n if (escapeHtml) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_SP_URL_ENC, escapeUrlEncodedHtmlChars);\n this.#nest = 0;\n }\n } else {\n sanitizedUrl = urlToSanitize;\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * object with extended props based on URL API\n *\n * @typedef {object} ParsedURL\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} data - parsed result of data URL, `null`able\n * @property {string} data.mime - MIME type\n * @property {boolean} data.base64 - `true` if base64 encoded\n * @property {string} data.data - data part of the data URL\n * @property {string} href - same as URL API\n * @property {string} origin - same as URL API\n * @property {string} protocol - same as URL API\n * @property {string} username - same as URL API\n * @property {string} password - same as URL API\n * @property {string} host - same as URL API\n * @property {string} hostname - same as URL API\n * @property {string} port - same as URL API\n * @property {string} pathname - same as URL API\n * @property {string} search - same as URL API\n * @property {object} searchParams - same as URL API\n * @property {string} hash - same as URL API\n */\n\n /**\n * parse sanitized URL\n *\n * @param {string} url - URL input\n * @returns {ParsedURL} - result with extended props based on URL API\n */\n parse(url) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const sanitizedUrl = this.sanitize(url, {\n allow: ['data', 'file']\n });\n const parsedUrl = new Map([\n ['input', url]\n ]);\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n parsedUrl.set('valid', true);\n if (schemeParts.includes('data')) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (typeof value !== 'function') {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n};\n\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/* aliases and async wrappers */\n/**\n * is URI sync\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\nconst isUri = uri => urlSanitizer.isURI(uri);\n\n/**\n * is URI async\n *\n * @param {string} uri - URI input\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = await isUri(uri);\n return res;\n};\n\n/**\n * sanitize URL sync\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {?string} - sanitized URL\n */\nconst sanitizeUrl = (url, opt) => urlSanitizer.sanitize(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n});\n\n/**\n * sanitize URL async\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt) => {\n const res = await sanitizeUrl(url, opt);\n return res;\n};\n\n/**\n * parse URL sync\n *\n * @param {string} url - URL input\n * @returns {ParsedURL} - result with extended props based on URL API\n */\nconst parseUrl = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\n * @param {string} url - URL input\n * @returns {Promise.<ParsedURL>} - result with extended props based on URL API\n */\nexport const parseURL = async url => {\n const res = await parseUrl(url);\n return res;\n};\n\n/* export instance and aliases */\nexport {\n urlSanitizer as default,\n isUri as isURISync,\n parseUrl as parseURLSync,\n sanitizeUrl as sanitizeURLSync\n};\n"],
5
- "mappings": ";AAKA,IAAM,YAAY;AAClB,IAAM,UAAU;AAQT,IAAM,UAAU,OACrB,OAAO,UAAU,SAAS,KAAK,CAAC,EAAE,MAAM,WAAW,OAAO;AAQrD,IAAM,WAAW,OAAK,OAAO,MAAM,YAAY,aAAa;;;ACvBnE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACxOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACjVA,IAAM,MAAM;AACZ,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,sBAA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",
4
+ "sourcesContent": ["/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n *\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport { getType, isString } from './common.js';\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,[^\"]+/g;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_SP_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/**\n * get URL encoded string\n *\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getUrlEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n *\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeUrlEncodedHtmlChars = ch => {\n if (isString(ch)) {\n if (REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`Invalid URL encoded character: ${ch}`);\n }\n } else {\n throw new TypeError(`Expected String but got ${getType(ch)}.`);\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n *\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n *\n * @param {string} str - string\n * @param {number} nest - nest level\n * @returns {string} - parsed string\n */\nexport const parseUrlEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (/^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 * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n *\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n *\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * is URI\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\n isURI(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_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n};\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * sanitize URL\n * NOTE: `data` and/or `file` schemes must be explicitly allowed\n * `javascript` and/or `vbscript` schemes can not be allowed\n *\n * @param {string} url - URL input\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 * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only } = opt ?? {};\n const schemeMap = new Map([\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.isURI(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 let escapeHtml;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n let parsedData = data;\n if (mediaType[mediaType.length - 1] === 'base64') {\n mediaType.pop();\n parsedData = parseBase64(data);\n } else {\n try {\n const decodedData = parseUrlEncodedNumCharRef(parsedData);\n const { protocol: dataScheme } = new URL(decodedData.trim());\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n }\n const containsDataUrl = /data:[^,]*,/.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n const matchedDataUrls = parsedData.matchAll(REG_DATA_URL);\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 if (parsedDataUrl) {\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n parsedData.substring(0, index),\n parsedData.substring(index + dataUrl.length)\n ];\n parsedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n }\n }\n if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else {\n escapeHtml = true;\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getUrlEncodedString)\n .replace(REG_URL_ENC_AMP, escapeUrlEncodedHtmlChars);\n if (escapeHtml) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_SP_URL_ENC, escapeUrlEncodedHtmlChars);\n this.#nest = 0;\n }\n } else {\n sanitizedUrl = urlToSanitize;\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * object with extended props based on URL API\n *\n * @typedef {object} ParsedURL\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} data - parsed result of data URL, `null`able\n * @property {string} data.mime - MIME type\n * @property {boolean} data.base64 - `true` if 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 {object} searchParams - URLSearchParams object\n * @property {string} hash - fragment identifier of the sanitized URL\n */\n\n /**\n * parse sanitized URL\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {ParsedURL} - result with extended props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['data', 'file']\n });\n const parsedUrl = new Map([\n ['input', url]\n ]);\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n parsedUrl.set('valid', true);\n if (schemeParts.includes('data')) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (typeof value !== 'function') {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n};\n\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/* aliases and async wrappers */\n/**\n * is URI sync\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\nconst isUri = uri => urlSanitizer.isURI(uri);\n\n/**\n * is URI async\n *\n * @param {string} uri - URI input\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = await isUri(uri);\n return res;\n};\n\n/**\n * sanitize URL sync\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {?string} - sanitized URL\n */\nconst sanitizeUrl = (url, opt) => {\n const parsedUrl = urlSanitizer.parse(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n });\n let res;\n if (parsedUrl) {\n const { href } = parsedUrl;\n res = href;\n }\n return res ?? null;\n};\n\n/**\n * sanitize URL async\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt) => {\n const res = await sanitizeUrl(url, opt);\n return res;\n};\n\n/**\n * parse URL sync\n *\n * @param {string} url - URL input\n * @returns {ParsedURL} - result with extended props based on URL API\n */\nconst parseUrl = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\n * @param {string} url - URL input\n * @returns {Promise.<ParsedURL>} - result with extended props based on URL API\n */\nexport const parseURL = async url => {\n const res = await parseUrl(url);\n return res;\n};\n\n/* export instance and aliases */\nexport {\n urlSanitizer as default,\n isUri as isURISync,\n parseUrl as parseURLSync,\n sanitizeUrl as sanitizeURLSync\n};\n"],
5
+ "mappings": ";AAKA,IAAM,YAAY;AAClB,IAAM,UAAU;AAQT,IAAM,UAAU,OACrB,OAAO,UAAU,SAAS,KAAK,CAAC,EAAE,MAAM,WAAW,OAAO;AAQrD,IAAM,WAAW,OAAK,OAAO,MAAM,YAAY,aAAa;;;ACvBnE;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACxOA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF;;;ACjVA,IAAM,MAAM;AACZ,IAAM,aAAa;AACnB,IAAM,eAAe;AACrB,IAAM,sBAAsB;AAC5B,IAAM,cAAc;AACpB,IAAM,sBAAsB;AAC5B,IAAM,cAAc;AACpB,IAAM,aAAa;AACnB,IAAM,oBAAoB;AAC1B,IAAM,aAAa;AACnB,IAAM,cAAc;AACpB,IAAM,kBAAkB;AAQjB,IAAM,sBAAsB,SAAO;AACxC,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,UAAU,2BAA2B,QAAQ,GAAG,IAAI;AAAA,EAChE;AACA,QAAM,QAAQ,CAAC;AACf,aAAW,MAAM,KAAK;AACpB,UAAM,KAAK,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,YAAY,GAAG;AAAA,EAC/D;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;AAQO,IAAM,4BAA4B,QAAM;AAC7C,MAAI,SAAS,EAAE,GAAG;AAChB,QAAI,YAAY,KAAK,EAAE,GAAG;AACxB,WAAK,GAAG,YAAY;AAAA,IACtB,OAAO;AACL,YAAM,IAAI,MAAM,kCAAkC,IAAI;AAAA,IACxD;AAAA,EACF,OAAO;AACL,UAAM,IAAI,UAAU,2BAA2B,QAAQ,EAAE,IAAI;AAAA,EAC/D;AACA,QAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,IACjC,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,mBAAmB;AACxD,MAAI;AACJ,MAAI,OAAO,KAAK;AACd,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,IAAI;AACpB,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,IAAI;AACpB,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,MAAM;AACtB,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,MAAM;AACtB,kBAAc,GAAG,MAAM;AAAA,EACzB,OAAO;AACL,kBAAc;AAAA,EAChB;AACA,SAAO;AACT;AAQO,IAAM,cAAc,UAAQ;AACjC,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,UAAM,IAAI,UAAU,2BAA2B,QAAQ,IAAI,IAAI;AAAA,EACjE,WAAW,CAAC,WAAW,KAAK,IAAI,GAAG;AACjC,UAAM,IAAI,MAAM,wBAAwB,MAAM;AAAA,EAChD;AACA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,WAAW,KAAK,CAAC,GAAG,GAAG,EAAE,IAAI,OAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AACnE,QAAM,gBAAgB,IAAI,IAAI,kBAAS;AACvC,MAAI;AACJ,MAAI,SAAS,MAAM,OAAK,cAAc,IAAI,CAAC,CAAC,GAAG;AAC7C,iBAAa,IAAI,QAAQ,OAAO,mBAAmB;AAAA,EACrD,OAAO;AACL,iBAAa;AAAA,EACf;AACA,SAAO;AACT;AASO,IAAM,4BAA4B,CAAC,KAAK,OAAO,MAAM;AAC1D,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,UAAU,2BAA2B,QAAQ,GAAG,IAAI;AAAA,EAChE;AACA,MAAI,CAAC,OAAO,UAAU,IAAI,GAAG;AAC3B,UAAM,IAAI,UAAU,2BAA2B,QAAQ,IAAI,IAAI;AAAA,EACjE,WAAW,OAAO,KAAK;AACrB,UAAM,IAAI,MAAM,yCAAyC;AAAA,EAC3D;AACA,MAAI,MAAM,mBAAmB,GAAG;AAChC,MAAI,KAAK,KAAK,GAAG,GAAG;AAClB,UAAM,gBAAgB,IAAI,IAAI,kBAAS;AACvC,UAAM,QAAQ,CAAC,GAAG,IAAI,SAAS,WAAW,CAAC,EAAE,QAAQ;AACrD,eAAW,QAAQ,OAAO;AACxB,YAAM,CAAC,YAAY,KAAK,IAAI;AAC5B,UAAI;AACJ,UAAI,cAAc,KAAK,KAAK,GAAG;AAC7B,cAAM,SAAS,IAAI,SAAS,GAAG;AAAA,MACjC,WAAW,SAAS,KAAK,KAAK,GAAG;AAC/B,cAAM,SAAS,KAAK;AAAA,MACtB;AACA,UAAI,OAAO,UAAU,GAAG,GAAG;AACzB,cAAM,EAAE,MAAM,IAAI;AAClB,cAAM,CAAC,QAAQ,OAAO,IAAI;AAAA,UACxB,IAAI,UAAU,GAAG,KAAK;AAAA,UACtB,IAAI,UAAU,QAAQ,WAAW,MAAM;AAAA,QACzC;AACA,YAAI,cAAc,IAAI,GAAG,GAAG;AAC1B,gBAAM,GAAG,SAAS,OAAO,aAAa,GAAG,IAAI;AAC7C,cAAI,OAAO,KAAK,MAAM,KAAK,yBAAyB,KAAK,OAAO,GAAG;AACjE,kBAAM,0BAA0B,KAAK,EAAE,IAAI;AAAA,UAC7C;AAAA,QACF,WAAW,MAAM,MAAM,KAAK;AAC1B,gBAAM,GAAG,SAAS;AAAA,QACpB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;AAMO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,SAAK,WAAW,IAAI,IAAI,mBAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM;AACJ,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,SAAS,IAAI,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,QAAQ;AACV,QAAI,CAAC,SAAS,MAAM,GAAG;AACrB,YAAM,IAAI,UAAU,2BAA2B,QAAQ,MAAM,IAAI;AAAA,IACnE,WAAW,WAAW,KAAK,MAAM,KAAK,CAAC,WAAW,KAAK,MAAM,GAAG;AAC9D,YAAM,IAAI,MAAM,mBAAmB,QAAQ;AAAA,IAC7C;AACA,SAAK,SAAS,IAAI,MAAM;AACxB,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,QAAQ;AACb,WAAO,KAAK,SAAS,OAAO,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK;AACT,QAAI;AACJ,QAAI,SAAS,GAAG,GAAG;AACjB,UAAI;AACF,cAAM,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG;AAChC,cAAM,SAAS,SAAS,QAAQ,MAAM,EAAE;AACxC,cAAM,cAAc,OAAO,MAAM,GAAG;AACpC,cAAO,CAAC,WAAW,KAAK,MAAM,KAAK,kBAAkB,KAAK,MAAM,KAC1D,YAAY,MAAM,OAAK,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,MACnD,SAAS,GAAP;AACA,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,CAAC,CAAC;AAAA,EACX;AACF;AAGO,IAAM,eAAN,cAA2B,WAAW;AAAA;AAAA,EAE3C;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,UAAM;AACN,SAAK,QAAQ;AACb,SAAK,WAAW,oBAAI,IAAI;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAcA,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,MAAM,CAAC,EAAE,GAAG;AACrD,QAAI,KAAK,QAAQ,KAAK;AACpB,WAAK,QAAQ;AACb,YAAM,IAAI,MAAM,8BAA8B;AAAA,IAChD;AACA,UAAM,EAAE,OAAO,MAAM,KAAK,IAAI,OAAO,CAAC;AACtC,UAAM,YAAY,oBAAI,IAAI;AAAA,MACxB,CAAC,QAAQ,KAAK;AAAA,MACd,CAAC,QAAQ,KAAK;AAAA,MACd,CAAC,aAAa,KAAK;AAAA,MACnB,CAAC,YAAY,KAAK;AAAA,IACpB,CAAC;AACD,QAAI,iBAAiB;AACrB,QAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AACtC,YAAM,UAAU,MAAM,IAAI;AAC1B,iBAAW,QAAQ,SAAS;AAC1B,kBAAU,IAAI,MAAM,KAAK;AAAA,MAC3B;AACA,YAAM,QAAQ,OAAO,OAAO,IAAI;AAChC,eAAS,QAAQ,OAAO;AACtB,YAAI,SAAS,IAAI,GAAG;AAClB,iBAAO,KAAK,KAAK;AACjB,cAAI,CAAC,WAAW,KAAK,IAAI,GAAG;AAC1B,gBAAI,MAAM,IAAI,IAAI,GAAG;AACnB,wBAAU,IAAI,MAAM,IAAI;AAAA,YAC1B,OAAO;AACL,kBAAI;AACF,sBAAM,IAAI,IAAI;AAAA,cAChB,SAAS,GAAP;AAAA,cAEF;AACA,kBAAI,MAAM,IAAI,IAAI,GAAG;AACnB,0BAAU,IAAI,MAAM,IAAI;AAAA,cAC1B;AAAA,YACF;AACA,gBAAI,CAAC,kBAAkB,UAAU,IAAI,IAAI,GAAG;AAC1C,+BAAiB,UAAU,IAAI,IAAI;AAAA,YACrC;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF,OAAO;AACL,UAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ;AACxC,cAAM,QAAQ,OAAO,OAAO,KAAK;AACjC,iBAAS,QAAQ,OAAO;AACtB,cAAI,SAAS,IAAI,GAAG;AAClB,mBAAO,KAAK,KAAK;AACjB,gBAAI,CAAC,WAAW,KAAK,IAAI,GAAG;AAC1B,kBAAI,MAAM,IAAI,IAAI,GAAG;AACnB,0BAAU,IAAI,MAAM,IAAI;AAAA,cAC1B,OAAO;AACL,oBAAI;AACF,wBAAM,IAAI,IAAI;AAAA,gBAChB,SAAS,GAAP;AAAA,gBAEF;AACA,oBAAI,MAAM,IAAI,IAAI,GAAG;AACnB,4BAAU,IAAI,MAAM,IAAI;AAAA,gBAC1B;AAAA,cACF;AAAA,YACF;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AACtC,cAAM,QAAQ,OAAO,OAAO,IAAI;AAChC,iBAAS,QAAQ,OAAO;AACtB,cAAI,SAAS,IAAI,GAAG;AAClB,mBAAO,KAAK,KAAK;AACjB,gBAAI,MAAM;AACR,wBAAU,IAAI,MAAM,KAAK;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AAAA,IACF;AACA,QAAI;AACJ,QAAI,MAAM,MAAM,GAAG,GAAG;AACpB,YAAM,EAAE,MAAM,MAAM,UAAU,UAAU,OAAO,IAAI,IAAI,IAAI,GAAG;AAC9D,YAAM,SAAS,SAAS,QAAQ,MAAM,EAAE;AACxC,YAAM,cAAc,OAAO,MAAM,GAAG;AACpC,UAAI;AACJ,UAAI,gBAAgB;AAClB,eAAO,YAAY,MAAM,OAAK,UAAU,IAAI,CAAC,CAAC;AAAA,MAChD,OAAO;AACL,mBAAW,CAAC,KAAK,KAAK,KAAK,UAAU,QAAQ,GAAG;AAC9C,iBAAO,SAAU,WAAW,OAAO,YAAY,MAAM,OAAK,MAAM,GAAG;AACnE,cAAI,CAAC,MAAM;AACT;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM;AACR,YAAI;AACJ,YAAI,gBAAgB;AACpB,YAAI,YAAY,SAAS,MAAM,GAAG;AAChC,gBAAM,CAAC,MAAM,GAAG,IAAI,IAAI,SAAS,MAAM,GAAG;AAC1C,gBAAM,OAAO,GAAG,KAAK,KAAK,GAAG,IAAI,SAAS;AAC1C,gBAAM,YAAY,KAAK,MAAM,GAAG;AAChC,cAAI,aAAa;AACjB,cAAI,UAAU,UAAU,SAAS,CAAC,MAAM,UAAU;AAChD,sBAAU,IAAI;AACd,yBAAa,YAAY,IAAI;AAAA,UAC/B,OAAO;AACL,gBAAI;AACF,oBAAM,cAAc,0BAA0B,UAAU;AACxD,oBAAM,EAAE,UAAU,WAAW,IAAI,IAAI,IAAI,YAAY,KAAK,CAAC;AAC3D,oBAAM,kBAAkB,WAAW,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG;AAC9D,kBAAI,gBAAgB,KAAK,OAAK,WAAW,KAAK,CAAC,CAAC,GAAG;AACjD,gCAAgB;AAAA,cAClB;AAAA,YACF,SAAS,GAAP;AAAA,YAEF;AAAA,UACF;AACA,gBAAM,kBAAkB,cAAc,KAAK,UAAU;AACrD,cAAI,eAAe,QAAQ,iBAAiB;AAC1C,gBAAI,iBAAiB;AACnB,oBAAM,kBAAkB,WAAW,SAAS,YAAY;AACxD,oBAAM,QAAQ,CAAC,GAAG,eAAe,EAAE,QAAQ;AAC3C,yBAAW,QAAQ,OAAO;AACxB,oBAAI,CAAC,OAAO,IAAI;AAChB,oBAAI,oBAAoB,KAAK,OAAO,GAAG;AACrC,mBAAC,OAAO,IAAI,oBAAoB,KAAK,OAAO;AAAA,gBAC9C;AACA,qBAAK;AACL,qBAAK,SAAS,IAAI,OAAO;AACzB,sBAAM,gBAAgB,KAAK,SAAS,SAAS;AAAA,kBAC3C,OAAO,CAAC,MAAM;AAAA,gBAChB,CAAC;AACD,oBAAI,eAAe;AACjB,wBAAM,EAAE,MAAM,IAAI;AAClB,wBAAM,CAAC,YAAY,WAAW,IAAI;AAAA,oBAChC,WAAW,UAAU,GAAG,KAAK;AAAA,oBAC7B,WAAW,UAAU,QAAQ,QAAQ,MAAM;AAAA,kBAC7C;AACA,+BAAa,GAAG,aAAa,gBAAgB;AAAA,gBAC/C;AAAA,cACF;AACA,kBAAI,KAAK,SAAS,IAAI,GAAG,GAAG;AAC1B,qBAAK,SAAS,OAAO,GAAG;AAAA,cAC1B,OAAO;AACL,6BAAa;AAAA,cACf;AAAA,YACF,WAAW,KAAK,SAAS,IAAI,GAAG,GAAG;AACjC,mBAAK,SAAS,OAAO,GAAG;AAAA,YAC1B,OAAO;AACL,2BAAa;AAAA,YACf;AACA,4BAAgB,GAAG,UAAU,UAAU,KAAK,GAAG,KAAK;AAAA,UACtD,WAAW,KAAK,SAAS,IAAI,GAAG,GAAG;AACjC,iBAAK,SAAS,OAAO,GAAG;AAAA,UAC1B,OAAO;AACL,yBAAa;AAAA,UACf;AAAA,QACF,OAAO;AACL,uBAAa;AAAA,QACf;AACA,YAAI,eAAe;AACjB,yBAAe,cACZ,QAAQ,aAAa,mBAAmB,EACxC,QAAQ,iBAAiB,yBAAyB;AACrD,cAAI,YAAY;AACd,2BAAe,aACZ,QAAQ,qBAAqB,yBAAyB;AACzD,iBAAK,QAAQ;AAAA,UACf;AAAA,QACF,OAAO;AACL,yBAAe;AACf,eAAK,QAAQ;AAAA,QACf;AAAA,MACF;AAAA,IACF;AACA,WAAO,gBAAgB;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAiCA,MAAM,KAAK,KAAK;AACd,QAAI,CAAC,SAAS,GAAG,GAAG;AAClB,YAAM,IAAI,UAAU,2BAA2B,QAAQ,GAAG,IAAI;AAAA,IAChE;AACA,UAAM,eAAe,KAAK,SAAS,KAAK,OAAO;AAAA,MAC7C,OAAO,CAAC,QAAQ,MAAM;AAAA,IACxB,CAAC;AACD,UAAM,YAAY,oBAAI,IAAI;AAAA,MACxB,CAAC,SAAS,GAAG;AAAA,IACf,CAAC;AACD,QAAI,cAAc;AAChB,YAAM,SAAS,IAAI,IAAI,YAAY;AACnC,YAAM,EAAE,UAAU,SAAS,IAAI;AAC/B,YAAM,cAAc,SAAS,QAAQ,MAAM,EAAE,EAAE,MAAM,GAAG;AACxD,gBAAU,IAAI,SAAS,IAAI;AAC3B,UAAI,YAAY,SAAS,MAAM,GAAG;AAChC,cAAM,UAAU,oBAAI,IAAI;AACxB,cAAM,CAAC,MAAM,GAAG,IAAI,IAAI,SAAS,MAAM,GAAG;AAC1C,cAAM,OAAO,GAAG,KAAK,KAAK,GAAG;AAC7B,cAAM,YAAY,KAAK,MAAM,GAAG;AAChC,cAAM,WAAW,UAAU,UAAU,SAAS,CAAC,MAAM;AACrD,YAAI,UAAU;AACZ,oBAAU,IAAI;AAAA,QAChB;AACA,gBAAQ,IAAI,QAAQ,UAAU,KAAK,GAAG,CAAC;AACvC,gBAAQ,IAAI,UAAU,QAAQ;AAC9B,gBAAQ,IAAI,QAAQ,IAAI;AACxB,kBAAU,IAAI,QAAQ,OAAO,YAAY,OAAO,CAAC;AAAA,MACnD,OAAO;AACL,kBAAU,IAAI,QAAQ,IAAI;AAAA,MAC5B;AACA,iBAAW,OAAO,QAAQ;AACxB,cAAM,QAAQ,OAAO,GAAG;AACxB,YAAI,OAAO,UAAU,YAAY;AAC/B,oBAAU,IAAI,KAAK,KAAK;AAAA,QAC1B;AAAA,MACF;AAAA,IACF,OAAO;AACL,gBAAU,IAAI,SAAS,KAAK;AAAA,IAC9B;AACA,WAAO,OAAO,YAAY,SAAS;AAAA,EACrC;AACF;AAGA,IAAM,eAAe,IAAI,aAAa;AAStC,IAAM,QAAQ,SAAO,aAAa,MAAM,GAAG;AAQpC,IAAM,QAAQ,OAAM,QAAO;AAChC,QAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,SAAO;AACT;AASA,IAAM,cAAc,CAAC,KAAK,QAAQ;AAChC,QAAM,YAAY,aAAa,MAAM,KAAK,OAAO;AAAA,IAC/C,OAAO,CAAC;AAAA,IACR,MAAM,CAAC;AAAA,IACP,MAAM,CAAC;AAAA,EACT,CAAC;AACD,MAAI;AACJ,MAAI,WAAW;AACb,UAAM,EAAE,KAAK,IAAI;AACjB,UAAM;AAAA,EACR;AACA,SAAO,OAAO;AAChB;AASO,IAAM,cAAc,OAAO,KAAK,QAAQ;AAC7C,QAAM,MAAM,MAAM,YAAY,KAAK,GAAG;AACtC,SAAO;AACT;AAQA,IAAM,WAAW,SAAO,aAAa,MAAM,GAAG;AAQvC,IAAM,WAAW,OAAM,QAAO;AACnC,QAAM,MAAM,MAAM,SAAS,GAAG;AAC9B,SAAO;AACT;",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var g=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var T=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var O=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","browserext","cabal","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cvs","dab","dat","data","dav","diaspora","dict","did","dis","dlna-playcontainer","dlna-playsingle","dns","dntp","doi","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","http","https","hxxp","hxxps","hydrazone","hyper","iax","icap","icon","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lorawan","lpa","lvlt","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-powerpoint","ms-project","ms-publisher","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mumble","mupdate","mvn","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openpgp4fpr","otpauth","palm","paparazzi","payment","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcon","xcon-userid","xfire","xmlrpc.beep","xmlrpc.beeps","xmpp","xri","ymsgr","z39.50r","z39.50s"];var b=16,Q=/^[\da-z+/\-_=]+$/i,V=/data:[^,]*,[^"]+/g,G=/data:[^,]*;?base64,[\da-z+/\-_=]+/i,W=/[<>"'\s]/g,Z=/%(?:2(?:2|7)|3(?:C|E))/g,ee=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/ig,te=/^[a-z][\da-z+\-.]*$/,se=/^(?:ext|web)\+[a-z]+$/,x=/(?:java|vb)script/,re=/^%[\dA-F]{2}$/i,ae=/%26/g,L=t=>{if(!d(t))throw new TypeError(`Expected String but got ${g(t)}.`);let e=[];for(let s of t)e.push(`%${s.charCodeAt(0).toString(b).toUpperCase()}`);return e.join("")},N=t=>{if(d(t))if(re.test(t))t=t.toUpperCase();else throw new Error(`Invalid URL encoded character: ${t}`);else throw new TypeError(`Expected String but got ${g(t)}.`);let[e,s,o,n,l,c]=["&","#","<",">",'"',"'"].map(L),p;return t===e?p=`${e}amp;`:t===o?p=`${e}lt;`:t===n?p=`${e}gt;`:t===l?p=`${e}quot;`:t===c?p=`${e}${s}39;`:p=t,p},ie=t=>{if(d(t)){if(!Q.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${g(t)}.`);let e=atob(t),s=Uint8Array.from([...e].map(l=>l.charCodeAt(0))),o=new Set(T),n;return s.every(l=>o.has(l))?n=e.replace(/\s/g,L):n=t,n},q=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${g(t)}.`);if(Number.isInteger(e)){if(e>b)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${g(e)}.`);let s=decodeURIComponent(t);if(/&#/.test(s)){let o=new Set(T),n=[...s.matchAll(ee)].reverse();for(let l of n){let[c,p]=l,i;if(/^x[\dA-F]+/i.test(p)?i=parseInt(`0${p}`,b):/^[\d]+/.test(p)&&(i=parseInt(p)),Number.isInteger(i)){let{index:m}=l,[r,a]=[s.substring(0,m),s.substring(m+c.length)];o.has(i)?(s=`${r}${String.fromCharCode(i)}${a}`,(/#x?$/.test(r)||/^#(?:x(?:00)?[2-7]|\d)/.test(a))&&(s=q(s,++e))):i<b*b&&(s=`${r}${a}`)}}}return s},j=class{#e;constructor(){this.#e=new Set(O)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(x.test(e)||!te.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${g(e)}.`);return this.#e.add(e),[...this.#e]}remove(e){return this.#e.delete(e)}isURI(e){let s;if(d(e))try{let{protocol:o}=new URL(e),n=o.replace(/:$/,""),l=n.split("+");s=!x.test(n)&&se.test(n)||l.every(c=>this.#e.has(c))}catch{s=!1}return!!s}},A=class extends j{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}sanitize(e,s={allow:[],deny:[],only:[]}){if(this.#e>b)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:o,deny:n,only:l}=s??{},c=new Map([["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),p=!1;if(Array.isArray(l)&&l.length){let m=super.get();for(let a of m)c.set(a,!1);let r=Object.values(l);for(let a of r)if(d(a)&&(a=a.trim(),!x.test(a))){if(super.has(a))c.set(a,!0);else{try{super.add(a)}catch{}super.has(a)&&c.set(a,!0)}!p&&c.has(a)&&(p=c.get(a))}}else{if(Array.isArray(o)&&o.length){let m=Object.values(o);for(let r of m)if(d(r)&&(r=r.trim(),!x.test(r)))if(super.has(r))c.set(r,!0);else{try{super.add(r)}catch{}super.has(r)&&c.set(r,!0)}}if(Array.isArray(n)&&n.length){let m=Object.values(n);for(let r of m)d(r)&&(r=r.trim(),r&&c.set(r,!1))}}let i;if(super.isURI(e)){let{hash:m,href:r,pathname:a,protocol:w,search:v}=new URL(e),$=w.replace(/:$/,""),R=$.split("+"),E;if(p)E=R.every(f=>c.get(f));else for(let[f,y]of c.entries())if(E=y||$!==f&&R.every(S=>S!==f),!E)break;if(E){let f,y=r;if(R.includes("data")){let[S,...B]=a.split(","),_=`${B.join(",")}${v}${m}`,U=S.split(";"),h=_;if(U[U.length-1]==="base64")U.pop(),h=ie(_);else try{let k=q(h),{protocol:z}=new URL(k.trim());z.replace(/:$/,"").split("+").some(u=>x.test(u))&&(y="")}catch{}let M=/data:[^,]*,/.test(h);if(h!==_||M){if(M){let z=[...h.matchAll(V)].reverse();for(let C of z){let[u]=C;G.test(u)&&([u]=G.exec(u)),this.#e++,this.#t.add(u);let P=this.sanitize(u,{allow:["data"]});if(P){let{index:D}=C,[Y,X]=[h.substring(0,D),h.substring(D+u.length)];h=`${Y}${P}${X}`}}this.#t.has(e)?this.#t.delete(e):f=!0}else this.#t.has(e)?this.#t.delete(e):f=!0;y=`${$}:${U.join(";")},${h}`}else this.#t.has(e)?this.#t.delete(e):f=!0}else f=!0;y?(i=y.replace(W,L).replace(ae,N),f&&(i=i.replace(Z,N),this.#e=0)):(i=y,this.#e=0)}}return i||null}parse(e){if(!d(e))throw new TypeError(`Expected String but got ${g(e)}.`);let s=this.sanitize(e,{allow:["data","file"]}),o=new Map([["input",e]]);if(s){let n=new URL(s),{pathname:l,protocol:c}=n,p=c.replace(/:$/,"").split("+");if(o.set("valid",!0),p.includes("data")){let i=new Map,[m,...r]=l.split(","),a=`${r.join(",")}`,w=m.split(";"),v=w[w.length-1]==="base64";v&&w.pop(),i.set("mime",w.join(";")),i.set("base64",v),i.set("data",a),o.set("data",Object.fromEntries(i))}else o.set("data",null);for(let i in n){let m=n[i];typeof m!="function"&&o.set(i,m)}}else o.set("valid",!1);return Object.fromEntries(o)}},I=new A,H=t=>I.isURI(t),oe=async t=>await H(t),F=(t,e)=>I.sanitize(t,e??{allow:[],deny:[],only:[]}),ne=async(t,e)=>await F(t,e);export{I as default,oe as isURI,H as isURISync,ne as sanitizeURL,F as sanitizeURLSync};
1
+ var g=t=>Object.prototype.toString.call(t).slice(8,-1),d=t=>typeof t=="string"||t instanceof String;var j=[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 O=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","attachment","aw","barion","beshare","bitcoin","bitcoincash","blob","bolo","browserext","cabal","calculator","callto","cap","cast","casts","chrome","chrome-extension","cid","coap","coaps","com-eventbrite-attendee","content","content-type","crid","cstr","cvs","dab","dat","data","dav","diaspora","dict","did","dis","dlna-playcontainer","dlna-playsingle","dns","dntp","doi","dpp","drm","dtmi","dtn","dvb","dvx","dweb","ed2k","eid","elsi","embedded","ens","ethereum","example","facetime","feed","feedready","fido","file","finger","first-run-pen-experience","fish","fm","ftp","fuchsia-pkg","geo","gg","git","gitoid","gizmoproject","go","gopher","graph","gtalk","h323","ham","hcap","hcp","http","https","hxxp","hxxps","hydrazone","hyper","iax","icap","icon","im","imap","info","iotdisco","ipfs","ipn","ipns","ipp","ipps","irc","irc6","ircs","iris","iris.beep","iris.lwz","iris.xpc","iris.xpcs","isostore","itms","jabber","jar","jms","keyparc","lastfm","lbry","ldap","ldaps","leaptofrogans","lorawan","lpa","lvlt","magnet","mailto","maps","market","matrix","message","microsoft.windows.camera","microsoft.windows.camera.multipicker","microsoft.windows.camera.picker","mid","mms","mongodb","moz","moz-extension","ms-access","ms-appinstaller","ms-browser-extension","ms-calculator","ms-drive-to","ms-enrollment","ms-excel","ms-eyecontrolspeech","ms-gamebarservices","ms-gamingoverlay","ms-getoffice","ms-help","ms-infopath","ms-inputapp","ms-lockscreencomponent-config","ms-media-stream-id","ms-meetnow","ms-mixedrealitycapture","ms-mobileplans","ms-newsandinterests","ms-officeapp","ms-people","ms-powerpoint","ms-project","ms-publisher","ms-remotedesktop-launch","ms-restoretabcompanion","ms-screenclip","ms-screensketch","ms-search","ms-search-repair","ms-secondary-screen-controller","ms-secondary-screen-setup","ms-settings","ms-settings-airplanemode","ms-settings-bluetooth","ms-settings-camera","ms-settings-cellular","ms-settings-cloudstorage","ms-settings-connectabledevices","ms-settings-displays-topology","ms-settings-emailandaccounts","ms-settings-language","ms-settings-location","ms-settings-lock","ms-settings-nfctransactions","ms-settings-notifications","ms-settings-power","ms-settings-privacy","ms-settings-proximity","ms-settings-screenrotation","ms-settings-wifi","ms-settings-workplace","ms-spd","ms-stickers","ms-sttoverlay","ms-transit-to","ms-useractivityset","ms-virtualtouchpad","ms-visio","ms-walk-to","ms-whiteboard","ms-whiteboard-cmd","ms-word","msnim","msrp","msrps","mss","mt","mtqp","mumble","mupdate","mvn","news","nfs","ni","nih","nntp","notes","num","ocf","oid","onenote","onenote-cmd","opaquelocktoken","openpgp4fpr","otpauth","palm","paparazzi","payment","payto","pkcs11","platform","pop","pres","proxy","psyc","pttp","pwid","qb","query","quic-transport","redis","rediss","reload","res","resource","rmi","rsync","rtmfp","rtmp","rtsp","rtsps","rtspu","sarif","secondlife","secret-token","service","session","sftp","sgn","shc","sieve","simpleledger","simplex","sip","sips","skype","smb","smp","sms","smtp","snmp","soap.beep","soap.beeps","soldat","spiffe","spotify","ssb","ssh","starknet","steam","stun","stuns","submit","svn","swh","swid","swidpath","tag","taler","teamspeak","tel","teliaeid","telnet","tftp","things","thismessage","tip","tn3270","tool","turn","turns","tv","udp","unreal","urn","ut2004","uuid-in-package","v-event","vemmi","ventrilo","ves","view-source","vnc","vscode","vscode-insiders","vsls","w3","wcr","web3","webcal","wifi","ws","wss","wtai","wyciwyg","xcon","xcon-userid","xfire","xmlrpc.beep","xmlrpc.beeps","xmpp","xri","ymsgr","z39.50r","z39.50s"];var x=16,V=/^[\da-z+/\-_=]+$/i,W=/data:[^,]*,[^"]+/g,G=/data:[^,]*;?base64,[\da-z+/\-_=]+/i,Z=/[<>"'\s]/g,ee=/%(?:2(?:2|7)|3(?:C|E))/g,te=/&#(x(?:00)?[\dA-F]{2}|0?\d{1,3});?/ig,se=/^[a-z][\da-z+\-.]*$/,re=/^(?:ext|web)\+[a-z]+$/,v=/(?:java|vb)script/,ae=/^%[\dA-F]{2}$/i,ie=/%26/g,I=t=>{if(!d(t))throw new TypeError(`Expected String but got ${g(t)}.`);let e=[];for(let r of t)e.push(`%${r.charCodeAt(0).toString(x).toUpperCase()}`);return e.join("")},N=t=>{if(d(t))if(ae.test(t))t=t.toUpperCase();else throw new Error(`Invalid URL encoded character: ${t}`);else throw new TypeError(`Expected String but got ${g(t)}.`);let[e,r,o,a,n,c]=["&","#","<",">",'"',"'"].map(I),p;return t===e?p=`${e}amp;`:t===o?p=`${e}lt;`:t===a?p=`${e}gt;`:t===n?p=`${e}quot;`:t===c?p=`${e}${r}39;`:p=t,p},oe=t=>{if(d(t)){if(!V.test(t))throw new Error(`Invalid base64 data: ${t}`)}else throw new TypeError(`Expected String but got ${g(t)}.`);let e=atob(t),r=Uint8Array.from([...e].map(n=>n.charCodeAt(0))),o=new Set(j),a;return r.every(n=>o.has(n))?a=e.replace(/\s/g,I):a=t,a},q=(t,e=0)=>{if(!d(t))throw new TypeError(`Expected String but got ${g(t)}.`);if(Number.isInteger(e)){if(e>x)throw new Error("Character references nested too deeply.")}else throw new TypeError(`Expected Number but got ${g(e)}.`);let r=decodeURIComponent(t);if(/&#/.test(r)){let o=new Set(j),a=[...r.matchAll(te)].reverse();for(let n of a){let[c,p]=n,m;if(/^x[\dA-F]+/i.test(p)?m=parseInt(`0${p}`,x):/^[\d]+/.test(p)&&(m=parseInt(p)),Number.isInteger(m)){let{index:l}=n,[s,i]=[r.substring(0,l),r.substring(l+c.length)];o.has(m)?(r=`${s}${String.fromCharCode(m)}${i}`,(/#x?$/.test(s)||/^#(?:x(?:00)?[2-7]|\d)/.test(i))&&(r=q(r,++e))):m<x*x&&(r=`${s}${i}`)}}}return r},A=class{#e;constructor(){this.#e=new Set(O)}get(){return[...this.#e]}has(e){return this.#e.has(e)}add(e){if(d(e)){if(v.test(e)||!se.test(e))throw new Error(`Invalid scheme: ${e}`)}else throw new TypeError(`Expected String but got ${g(e)}.`);return this.#e.add(e),[...this.#e]}remove(e){return this.#e.delete(e)}isURI(e){let r;if(d(e))try{let{protocol:o}=new URL(e),a=o.replace(/:$/,""),n=a.split("+");r=!v.test(a)&&re.test(a)||n.every(c=>this.#e.has(c))}catch{r=!1}return!!r}},L=class extends A{#e;#t;constructor(){super(),this.#e=0,this.#t=new Set}sanitize(e,r={allow:[],deny:[],only:[]}){if(this.#e>x)throw this.#e=0,new Error("Data URLs nested too deeply.");let{allow:o,deny:a,only:n}=r??{},c=new Map([["data",!1],["file",!1],["javascrpt",!1],["vbscript",!1]]),p=!1;if(Array.isArray(n)&&n.length){let l=super.get();for(let i of l)c.set(i,!1);let s=Object.values(n);for(let i of s)if(d(i)&&(i=i.trim(),!v.test(i))){if(super.has(i))c.set(i,!0);else{try{super.add(i)}catch{}super.has(i)&&c.set(i,!0)}!p&&c.has(i)&&(p=c.get(i))}}else{if(Array.isArray(o)&&o.length){let l=Object.values(o);for(let s of l)if(d(s)&&(s=s.trim(),!v.test(s)))if(super.has(s))c.set(s,!0);else{try{super.add(s)}catch{}super.has(s)&&c.set(s,!0)}}if(Array.isArray(a)&&a.length){let l=Object.values(a);for(let s of l)d(s)&&(s=s.trim(),s&&c.set(s,!1))}}let m;if(super.isURI(e)){let{hash:l,href:s,pathname:i,protocol:E,search:y}=new URL(e),b=E.replace(/:$/,""),S=b.split("+"),U;if(p)U=S.every(f=>c.get(f));else for(let[f,w]of c.entries())if(U=w||b!==f&&S.every(_=>_!==f),!U)break;if(U){let f,w=s;if(S.includes("data")){let[_,...Y]=i.split(","),k=`${Y.join(",")}${y}${l}`,R=_.split(";"),h=k;if(R[R.length-1]==="base64")R.pop(),h=oe(k);else try{let z=q(h),{protocol:C}=new URL(z.trim());C.replace(/:$/,"").split("+").some(u=>v.test(u))&&(w="")}catch{}let M=/data:[^,]*,/.test(h);if(h!==k||M){if(M){let C=[...h.matchAll(W)].reverse();for(let T of C){let[u]=T;G.test(u)&&([u]=G.exec(u)),this.#e++,this.#t.add(u);let P=this.sanitize(u,{allow:["data"]});if(P){let{index:D}=T,[X,J]=[h.substring(0,D),h.substring(D+u.length)];h=`${X}${P}${J}`}}this.#t.has(e)?this.#t.delete(e):f=!0}else this.#t.has(e)?this.#t.delete(e):f=!0;w=`${b}:${R.join(";")},${h}`}else this.#t.has(e)?this.#t.delete(e):f=!0}else f=!0;w?(m=w.replace(Z,I).replace(ie,N),f&&(m=m.replace(ee,N),this.#e=0)):(m=w,this.#e=0)}}return m||null}parse(e,r){if(!d(e))throw new TypeError(`Expected String but got ${g(e)}.`);let o=this.sanitize(e,r??{allow:["data","file"]}),a=new Map([["input",e]]);if(o){let n=new URL(o),{pathname:c,protocol:p}=n,m=p.replace(/:$/,"").split("+");if(a.set("valid",!0),m.includes("data")){let l=new Map,[s,...i]=c.split(","),E=`${i.join(",")}`,y=s.split(";"),b=y[y.length-1]==="base64";b&&y.pop(),l.set("mime",y.join(";")),l.set("base64",b),l.set("data",E),a.set("data",Object.fromEntries(l))}else a.set("data",null);for(let l in n){let s=n[l];typeof s!="function"&&a.set(l,s)}}else a.set("valid",!1);return Object.fromEntries(a)}},$=new L,H=t=>$.isURI(t),ne=async t=>await H(t),F=(t,e)=>{let r=$.parse(t,e??{allow:[],deny:[],only:[]}),o;if(r){let{href:a}=r;o=a}return o??null},ce=async(t,e)=>await F(t,e),B=t=>$.parse(t),pe=async t=>await B(t);export{$ as default,ne as isURI,H as isURISync,pe as parseURL,B as parseURLSync,ce as sanitizeURL,F as sanitizeURLSync};
2
2
  //# sourceMappingURL=url-sanitizer.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../src/mjs/common.js", "../src/lib/file/text-chars.json", "../src/lib/iana/uri-schemes.json", "../src/mjs/uri-util.js"],
4
- "sourcesContent": ["/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n *\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport { getType, isString } from './common.js';\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,[^\"]+/g;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_SP_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/**\n * get URL encoded string\n *\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getUrlEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n *\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeUrlEncodedHtmlChars = ch => {\n if (isString(ch)) {\n if (REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`Invalid URL encoded character: ${ch}`);\n }\n } else {\n throw new TypeError(`Expected String but got ${getType(ch)}.`);\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n *\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n *\n * @param {string} str - string\n * @param {number} nest - nest level\n * @returns {string} - parsed string\n */\nexport const parseUrlEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (/^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 * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n *\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n *\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * is URI\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\n isURI(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_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n};\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * sanitize URL\n * NOTE: `data` and/or `file` schemes must be explicitly allowed\n * `javascript` and/or `vbscript` schemes can not be allowed\n *\n * @param {string} url - URL input\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 * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only } = opt ?? {};\n const schemeMap = new Map([\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.isURI(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 let escapeHtml;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n let parsedData = data;\n if (mediaType[mediaType.length - 1] === 'base64') {\n mediaType.pop();\n parsedData = parseBase64(data);\n } else {\n try {\n const decodedData = parseUrlEncodedNumCharRef(parsedData);\n const { protocol: dataScheme } = new URL(decodedData.trim());\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n }\n const containsDataUrl = /data:[^,]*,/.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n const matchedDataUrls = parsedData.matchAll(REG_DATA_URL);\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 if (parsedDataUrl) {\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n parsedData.substring(0, index),\n parsedData.substring(index + dataUrl.length)\n ];\n parsedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n }\n }\n if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else {\n escapeHtml = true;\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getUrlEncodedString)\n .replace(REG_URL_ENC_AMP, escapeUrlEncodedHtmlChars);\n if (escapeHtml) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_SP_URL_ENC, escapeUrlEncodedHtmlChars);\n this.#nest = 0;\n }\n } else {\n sanitizedUrl = urlToSanitize;\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * object with extended props based on URL API\n *\n * @typedef {object} ParsedURL\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} data - parsed result of data URL, `null`able\n * @property {string} data.mime - MIME type\n * @property {boolean} data.base64 - `true` if base64 encoded\n * @property {string} data.data - data part of the data URL\n * @property {string} href - same as URL API\n * @property {string} origin - same as URL API\n * @property {string} protocol - same as URL API\n * @property {string} username - same as URL API\n * @property {string} password - same as URL API\n * @property {string} host - same as URL API\n * @property {string} hostname - same as URL API\n * @property {string} port - same as URL API\n * @property {string} pathname - same as URL API\n * @property {string} search - same as URL API\n * @property {object} searchParams - same as URL API\n * @property {string} hash - same as URL API\n */\n\n /**\n * parse sanitized URL\n *\n * @param {string} url - URL input\n * @returns {ParsedURL} - result with extended props based on URL API\n */\n parse(url) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const sanitizedUrl = this.sanitize(url, {\n allow: ['data', 'file']\n });\n const parsedUrl = new Map([\n ['input', url]\n ]);\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n parsedUrl.set('valid', true);\n if (schemeParts.includes('data')) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (typeof value !== 'function') {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n};\n\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/* aliases and async wrappers */\n/**\n * is URI sync\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\nconst isUri = uri => urlSanitizer.isURI(uri);\n\n/**\n * is URI async\n *\n * @param {string} uri - URI input\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = await isUri(uri);\n return res;\n};\n\n/**\n * sanitize URL sync\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {?string} - sanitized URL\n */\nconst sanitizeUrl = (url, opt) => urlSanitizer.sanitize(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n});\n\n/**\n * sanitize URL async\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt) => {\n const res = await sanitizeUrl(url, opt);\n return res;\n};\n\n/**\n * parse URL sync\n *\n * @param {string} url - URL input\n * @returns {ParsedURL} - result with extended props based on URL API\n */\nconst parseUrl = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\n * @param {string} url - URL input\n * @returns {Promise.<ParsedURL>} - result with extended props based on URL API\n */\nexport const parseURL = async url => {\n const res = await parseUrl(url);\n return res;\n};\n\n/* export instance and aliases */\nexport {\n urlSanitizer as default,\n isUri as isURISync,\n parseUrl as parseURLSync,\n sanitizeUrl as sanitizeURLSync\n};\n"],
5
- "mappings": "AAcO,IAAMA,EAAUC,GACrB,OAAO,UAAU,SAAS,KAAKA,CAAC,EAAE,MAAM,EAAW,EAAO,EAQ/CC,EAAWD,GAAK,OAAOA,GAAM,UAAYA,aAAa,OCvBnE,IAAAE,EAAA,CACE,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACF,ECxOA,IAAAC,EAAA,CACE,MACA,OACA,QACA,OACA,OACA,MACA,MACA,YACA,MACA,MACA,MACA,MACA,OACA,UACA,UACA,MACA,KACA,MACA,aACA,KACA,SACA,UACA,UACA,cACA,OACA,OACA,aACA,QACA,aACA,SACA,MACA,OACA,QACA,SACA,mBACA,MACA,OACA,QACA,0BACA,UACA,eACA,OACA,OACA,MACA,MACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,qBACA,kBACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,OACA,OACA,MACA,OACA,WACA,MACA,WACA,UACA,WACA,OACA,YACA,OACA,OACA,SACA,2BACA,OACA,KACA,MACA,cACA,MACA,KACA,MACA,SACA,eACA,KACA,SACA,QACA,QACA,OACA,MACA,OACA,MACA,OACA,QACA,OACA,QACA,YACA,QACA,MACA,OACA,OACA,KACA,OACA,OACA,WACA,OACA,MACA,OACA,MACA,OACA,MACA,OACA,OACA,OACA,YACA,WACA,WACA,YACA,WACA,OACA,SACA,MACA,MACA,UACA,SACA,OACA,OACA,QACA,gBACA,UACA,MACA,OACA,SACA,SACA,OACA,SACA,SACA,UACA,2BACA,uCACA,kCACA,MACA,MACA,UACA,MACA,gBACA,YACA,kBACA,uBACA,gBACA,cACA,gBACA,WACA,sBACA,qBACA,mBACA,eACA,UACA,cACA,cACA,gCACA,qBACA,aACA,yBACA,iBACA,sBACA,eACA,YACA,gBACA,aACA,eACA,0BACA,yBACA,gBACA,kBACA,YACA,mBACA,iCACA,4BACA,cACA,2BACA,wBACA,qBACA,uBACA,2BACA,iCACA,gCACA,+BACA,uBACA,uBACA,mBACA,8BACA,4BACA,oBACA,sBACA,wBACA,6BACA,mBACA,wBACA,SACA,cACA,gBACA,gBACA,qBACA,qBACA,WACA,aACA,gBACA,oBACA,UACA,QACA,OACA,QACA,MACA,KACA,OACA,SACA,UACA,MACA,OACA,MACA,KACA,MACA,OACA,QACA,MACA,MACA,MACA,UACA,cACA,kBACA,cACA,UACA,OACA,YACA,UACA,QACA,SACA,WACA,MACA,OACA,QACA,OACA,OACA,OACA,KACA,QACA,iBACA,QACA,SACA,SACA,MACA,WACA,MACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,aACA,eACA,UACA,UACA,OACA,MACA,MACA,QACA,eACA,UACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,YACA,aACA,SACA,SACA,UACA,MACA,MACA,WACA,QACA,OACA,QACA,SACA,MACA,MACA,OACA,WACA,MACA,QACA,YACA,MACA,WACA,SACA,OACA,SACA,cACA,MACA,SACA,OACA,OACA,QACA,KACA,MACA,SACA,MACA,SACA,kBACA,UACA,QACA,WACA,MACA,cACA,MACA,SACA,kBACA,OACA,KACA,MACA,OACA,SACA,OACA,KACA,MACA,OACA,UACA,OACA,cACA,QACA,cACA,eACA,OACA,MACA,QACA,UACA,SACF,ECjVA,IAAMC,EAAM,GACNC,EAAa,oBACbC,EAAe,oBACfC,EAAsB,qCACtBC,EAAc,YACdC,EAAsB,0BACtBC,GAAc,uCACdC,GAAa,sBACbC,GAAoB,wBACpBC,EAAa,oBACbC,GAAc,iBACdC,GAAkB,OAQXC,EAAsBC,GAAO,CACxC,GAAI,CAACC,EAASD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BE,EAAQF,CAAG,IAAI,EAEhE,IAAMG,EAAQ,CAAC,EACf,QAAWC,KAAMJ,EACfG,EAAM,KAAK,IAAIC,EAAG,WAAW,CAAC,EAAE,SAASjB,CAAG,EAAE,YAAY,GAAG,EAE/D,OAAOgB,EAAM,KAAK,EAAE,CACtB,EAQaE,EAA4BD,GAAM,CAC7C,GAAIH,EAASG,CAAE,EACb,GAAIP,GAAY,KAAKO,CAAE,EACrBA,EAAKA,EAAG,YAAY,MAEpB,OAAM,IAAI,MAAM,kCAA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",
6
- "names": ["getType", "o", "isString", "text_chars_default", "uri_schemes_default", "HEX", "REG_BASE64", "REG_DATA_URL", "REG_DATA_URL_BASE64", "REG_HTML_SP", "REG_HTML_SP_URL_ENC", "REG_NUM_REF", "REG_SCHEME", "REG_SCHEME_CUSTOM", "REG_SCRIPT", "REG_URL_ENC", "REG_URL_ENC_AMP", "getUrlEncodedString", "str", "isString", "getType", "chars", "ch", "escapeUrlEncodedHtmlChars", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "bin", "uint8arr", "c", "textCharCodes", "text_chars_default", "parsedData", "parseUrlEncodedNumCharRef", "nest", "res", "items", "item", "numCharRef", "value", "index", "preNum", "postNum", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "protocol", "schemeParts", "s", "URLSanitizer", "#nest", "#recurse", "url", "opt", "allow", "deny", "only", "schemeMap", "restrictScheme", "schemes", "sanitizedUrl", "hash", "href", "pathname", "search", "bool", "key", "escapeHtml", "urlToSanitize", "head", "body", "mediaType", "decodedData", "dataScheme", "containsDataUrl", "dataUrl", "parsedDataUrl", "preDataUrl", "postDataUrl", "parsedUrl", "urlObj", "isBase64", "urlSanitizer", "isUri", "isURI", "sanitizeUrl", "sanitizeURL"]
4
+ "sourcesContent": ["/**\n * common.js\n */\n\n/* constants */\nconst TYPE_FROM = 8;\nconst TYPE_TO = -1;\n\n/**\n * get type\n *\n * @param {*} o - object to check\n * @returns {string} - type of object\n */\nexport const getType = o =>\n Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);\n\n/**\n * is string\n *\n * @param {*} o - object to check\n * @returns {boolean} - result\n */\nexport const isString = o => typeof o === 'string' || o instanceof String;\n", "[\n 7,\n 8,\n 9,\n 10,\n 11,\n 12,\n 13,\n 27,\n 32,\n 33,\n 34,\n 35,\n 36,\n 37,\n 38,\n 39,\n 40,\n 41,\n 42,\n 43,\n 44,\n 45,\n 46,\n 47,\n 48,\n 49,\n 50,\n 51,\n 52,\n 53,\n 54,\n 55,\n 56,\n 57,\n 58,\n 59,\n 60,\n 61,\n 62,\n 63,\n 64,\n 65,\n 66,\n 67,\n 68,\n 69,\n 70,\n 71,\n 72,\n 73,\n 74,\n 75,\n 76,\n 77,\n 78,\n 79,\n 80,\n 81,\n 82,\n 83,\n 84,\n 85,\n 86,\n 87,\n 88,\n 89,\n 90,\n 91,\n 92,\n 93,\n 94,\n 95,\n 96,\n 97,\n 98,\n 99,\n 100,\n 101,\n 102,\n 103,\n 104,\n 105,\n 106,\n 107,\n 108,\n 109,\n 110,\n 111,\n 112,\n 113,\n 114,\n 115,\n 116,\n 117,\n 118,\n 119,\n 120,\n 121,\n 122,\n 123,\n 124,\n 125,\n 126,\n 128,\n 129,\n 130,\n 131,\n 132,\n 133,\n 134,\n 135,\n 136,\n 137,\n 138,\n 139,\n 140,\n 141,\n 142,\n 143,\n 144,\n 145,\n 146,\n 147,\n 148,\n 149,\n 150,\n 151,\n 152,\n 153,\n 154,\n 155,\n 156,\n 157,\n 158,\n 159,\n 160,\n 161,\n 162,\n 163,\n 164,\n 165,\n 166,\n 167,\n 168,\n 169,\n 170,\n 171,\n 172,\n 173,\n 174,\n 175,\n 176,\n 177,\n 178,\n 179,\n 180,\n 181,\n 182,\n 183,\n 184,\n 185,\n 186,\n 187,\n 188,\n 189,\n 190,\n 191,\n 192,\n 193,\n 194,\n 195,\n 196,\n 197,\n 198,\n 199,\n 200,\n 201,\n 202,\n 203,\n 204,\n 205,\n 206,\n 207,\n 208,\n 209,\n 210,\n 211,\n 212,\n 213,\n 214,\n 215,\n 216,\n 217,\n 218,\n 219,\n 220,\n 221,\n 222,\n 223,\n 224,\n 225,\n 226,\n 227,\n 228,\n 229,\n 230,\n 231,\n 232,\n 233,\n 234,\n 235,\n 236,\n 237,\n 238,\n 239,\n 240,\n 241,\n 242,\n 243,\n 244,\n 245,\n 246,\n 247,\n 248,\n 249,\n 250,\n 251,\n 252,\n 253,\n 254,\n 255\n]\n", "[\n \"aaa\",\n \"aaas\",\n \"about\",\n \"acap\",\n \"acct\",\n \"acd\",\n \"acr\",\n \"adiumxtra\",\n \"adt\",\n \"afp\",\n \"afs\",\n \"aim\",\n \"amss\",\n \"android\",\n \"appdata\",\n \"apt\",\n \"ar\",\n \"ark\",\n \"attachment\",\n \"aw\",\n \"barion\",\n \"beshare\",\n \"bitcoin\",\n \"bitcoincash\",\n \"blob\",\n \"bolo\",\n \"browserext\",\n \"cabal\",\n \"calculator\",\n \"callto\",\n \"cap\",\n \"cast\",\n \"casts\",\n \"chrome\",\n \"chrome-extension\",\n \"cid\",\n \"coap\",\n \"coaps\",\n \"com-eventbrite-attendee\",\n \"content\",\n \"content-type\",\n \"crid\",\n \"cstr\",\n \"cvs\",\n \"dab\",\n \"dat\",\n \"data\",\n \"dav\",\n \"diaspora\",\n \"dict\",\n \"did\",\n \"dis\",\n \"dlna-playcontainer\",\n \"dlna-playsingle\",\n \"dns\",\n \"dntp\",\n \"doi\",\n \"dpp\",\n \"drm\",\n \"dtmi\",\n \"dtn\",\n \"dvb\",\n \"dvx\",\n \"dweb\",\n \"ed2k\",\n \"eid\",\n \"elsi\",\n \"embedded\",\n \"ens\",\n \"ethereum\",\n \"example\",\n \"facetime\",\n \"feed\",\n \"feedready\",\n \"fido\",\n \"file\",\n \"finger\",\n \"first-run-pen-experience\",\n \"fish\",\n \"fm\",\n \"ftp\",\n \"fuchsia-pkg\",\n \"geo\",\n \"gg\",\n \"git\",\n \"gitoid\",\n \"gizmoproject\",\n \"go\",\n \"gopher\",\n \"graph\",\n \"gtalk\",\n \"h323\",\n \"ham\",\n \"hcap\",\n \"hcp\",\n \"http\",\n \"https\",\n \"hxxp\",\n \"hxxps\",\n \"hydrazone\",\n \"hyper\",\n \"iax\",\n \"icap\",\n \"icon\",\n \"im\",\n \"imap\",\n \"info\",\n \"iotdisco\",\n \"ipfs\",\n \"ipn\",\n \"ipns\",\n \"ipp\",\n \"ipps\",\n \"irc\",\n \"irc6\",\n \"ircs\",\n \"iris\",\n \"iris.beep\",\n \"iris.lwz\",\n \"iris.xpc\",\n \"iris.xpcs\",\n \"isostore\",\n \"itms\",\n \"jabber\",\n \"jar\",\n \"jms\",\n \"keyparc\",\n \"lastfm\",\n \"lbry\",\n \"ldap\",\n \"ldaps\",\n \"leaptofrogans\",\n \"lorawan\",\n \"lpa\",\n \"lvlt\",\n \"magnet\",\n \"mailto\",\n \"maps\",\n \"market\",\n \"matrix\",\n \"message\",\n \"microsoft.windows.camera\",\n \"microsoft.windows.camera.multipicker\",\n \"microsoft.windows.camera.picker\",\n \"mid\",\n \"mms\",\n \"mongodb\",\n \"moz\",\n \"moz-extension\",\n \"ms-access\",\n \"ms-appinstaller\",\n \"ms-browser-extension\",\n \"ms-calculator\",\n \"ms-drive-to\",\n \"ms-enrollment\",\n \"ms-excel\",\n \"ms-eyecontrolspeech\",\n \"ms-gamebarservices\",\n \"ms-gamingoverlay\",\n \"ms-getoffice\",\n \"ms-help\",\n \"ms-infopath\",\n \"ms-inputapp\",\n \"ms-lockscreencomponent-config\",\n \"ms-media-stream-id\",\n \"ms-meetnow\",\n \"ms-mixedrealitycapture\",\n \"ms-mobileplans\",\n \"ms-newsandinterests\",\n \"ms-officeapp\",\n \"ms-people\",\n \"ms-powerpoint\",\n \"ms-project\",\n \"ms-publisher\",\n \"ms-remotedesktop-launch\",\n \"ms-restoretabcompanion\",\n \"ms-screenclip\",\n \"ms-screensketch\",\n \"ms-search\",\n \"ms-search-repair\",\n \"ms-secondary-screen-controller\",\n \"ms-secondary-screen-setup\",\n \"ms-settings\",\n \"ms-settings-airplanemode\",\n \"ms-settings-bluetooth\",\n \"ms-settings-camera\",\n \"ms-settings-cellular\",\n \"ms-settings-cloudstorage\",\n \"ms-settings-connectabledevices\",\n \"ms-settings-displays-topology\",\n \"ms-settings-emailandaccounts\",\n \"ms-settings-language\",\n \"ms-settings-location\",\n \"ms-settings-lock\",\n \"ms-settings-nfctransactions\",\n \"ms-settings-notifications\",\n \"ms-settings-power\",\n \"ms-settings-privacy\",\n \"ms-settings-proximity\",\n \"ms-settings-screenrotation\",\n \"ms-settings-wifi\",\n \"ms-settings-workplace\",\n \"ms-spd\",\n \"ms-stickers\",\n \"ms-sttoverlay\",\n \"ms-transit-to\",\n \"ms-useractivityset\",\n \"ms-virtualtouchpad\",\n \"ms-visio\",\n \"ms-walk-to\",\n \"ms-whiteboard\",\n \"ms-whiteboard-cmd\",\n \"ms-word\",\n \"msnim\",\n \"msrp\",\n \"msrps\",\n \"mss\",\n \"mt\",\n \"mtqp\",\n \"mumble\",\n \"mupdate\",\n \"mvn\",\n \"news\",\n \"nfs\",\n \"ni\",\n \"nih\",\n \"nntp\",\n \"notes\",\n \"num\",\n \"ocf\",\n \"oid\",\n \"onenote\",\n \"onenote-cmd\",\n \"opaquelocktoken\",\n \"openpgp4fpr\",\n \"otpauth\",\n \"palm\",\n \"paparazzi\",\n \"payment\",\n \"payto\",\n \"pkcs11\",\n \"platform\",\n \"pop\",\n \"pres\",\n \"proxy\",\n \"psyc\",\n \"pttp\",\n \"pwid\",\n \"qb\",\n \"query\",\n \"quic-transport\",\n \"redis\",\n \"rediss\",\n \"reload\",\n \"res\",\n \"resource\",\n \"rmi\",\n \"rsync\",\n \"rtmfp\",\n \"rtmp\",\n \"rtsp\",\n \"rtsps\",\n \"rtspu\",\n \"sarif\",\n \"secondlife\",\n \"secret-token\",\n \"service\",\n \"session\",\n \"sftp\",\n \"sgn\",\n \"shc\",\n \"sieve\",\n \"simpleledger\",\n \"simplex\",\n \"sip\",\n \"sips\",\n \"skype\",\n \"smb\",\n \"smp\",\n \"sms\",\n \"smtp\",\n \"snmp\",\n \"soap.beep\",\n \"soap.beeps\",\n \"soldat\",\n \"spiffe\",\n \"spotify\",\n \"ssb\",\n \"ssh\",\n \"starknet\",\n \"steam\",\n \"stun\",\n \"stuns\",\n \"submit\",\n \"svn\",\n \"swh\",\n \"swid\",\n \"swidpath\",\n \"tag\",\n \"taler\",\n \"teamspeak\",\n \"tel\",\n \"teliaeid\",\n \"telnet\",\n \"tftp\",\n \"things\",\n \"thismessage\",\n \"tip\",\n \"tn3270\",\n \"tool\",\n \"turn\",\n \"turns\",\n \"tv\",\n \"udp\",\n \"unreal\",\n \"urn\",\n \"ut2004\",\n \"uuid-in-package\",\n \"v-event\",\n \"vemmi\",\n \"ventrilo\",\n \"ves\",\n \"view-source\",\n \"vnc\",\n \"vscode\",\n \"vscode-insiders\",\n \"vsls\",\n \"w3\",\n \"wcr\",\n \"web3\",\n \"webcal\",\n \"wifi\",\n \"ws\",\n \"wss\",\n \"wtai\",\n \"wyciwyg\",\n \"xcon\",\n \"xcon-userid\",\n \"xfire\",\n \"xmlrpc.beep\",\n \"xmlrpc.beeps\",\n \"xmpp\",\n \"xri\",\n \"ymsgr\",\n \"z39.50r\",\n \"z39.50s\"\n]\n", "/**\n * uri-util.js\n */\n\n/* shared */\nimport { getType, isString } from './common.js';\nimport textChars from '../lib/file/text-chars.json' assert { type: 'json' };\nimport uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\n\n/* constants */\nconst HEX = 16;\nconst REG_BASE64 = /^[\\da-z+/\\-_=]+$/i;\nconst REG_DATA_URL = /data:[^,]*,[^\"]+/g;\nconst REG_DATA_URL_BASE64 = /data:[^,]*;?base64,[\\da-z+/\\-_=]+/i;\nconst REG_HTML_SP = /[<>\"'\\s]/g;\nconst REG_HTML_SP_URL_ENC = /%(?:2(?:2|7)|3(?:C|E))/g;\nconst REG_NUM_REF = /&#(x(?:00)?[\\dA-F]{2}|0?\\d{1,3});?/ig;\nconst REG_SCHEME = /^[a-z][\\da-z+\\-.]*$/;\nconst REG_SCHEME_CUSTOM = /^(?:ext|web)\\+[a-z]+$/;\nconst REG_SCRIPT = /(?:java|vb)script/;\nconst REG_URL_ENC = /^%[\\dA-F]{2}$/i;\nconst REG_URL_ENC_AMP = /%26/g;\n\n/**\n * get URL encoded string\n *\n * @param {string} str - string\n * @returns {string} - URL encoded string\n */\nexport const getUrlEncodedString = str => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n const chars = [];\n for (const ch of str) {\n chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);\n }\n return chars.join('');\n};\n\n/**\n * escape URL encoded HTML special chars\n *\n * @param {string} ch - URL encoded (percent encoded) char\n * @returns {string} - escaped URL encoded HTML special char / URL encoded char\n */\nexport const escapeUrlEncodedHtmlChars = ch => {\n if (isString(ch)) {\n if (REG_URL_ENC.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`Invalid URL encoded character: ${ch}`);\n }\n } else {\n throw new TypeError(`Expected String but got ${getType(ch)}.`);\n }\n const [amp, num, lt, gt, quot, apos] =\n ['&', '#', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n let escapedChar;\n if (ch === amp) {\n escapedChar = `${amp}amp;`;\n } else if (ch === lt) {\n escapedChar = `${amp}lt;`;\n } else if (ch === gt) {\n escapedChar = `${amp}gt;`;\n } else if (ch === quot) {\n escapedChar = `${amp}quot;`;\n } else if (ch === apos) {\n escapedChar = `${amp}${num}39;`;\n } else {\n escapedChar = ch;\n }\n return escapedChar;\n};\n\n/**\n * parse base64 encoded data\n *\n * @param {string} data - base64 encoded data\n * @returns {string} - parsed text data / base64 encoded data if binary\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n } else if (!REG_BASE64.test(data)) {\n throw new Error(`Invalid base64 data: ${data}`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textCharCodes = new Set(textChars);\n let parsedData;\n if (uint8arr.every(c => textCharCodes.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\n};\n\n/**\n * parse URL encoded numeric character references in the range 0x00 to 0xFF\n *\n * @param {string} str - string\n * @param {number} nest - nest level\n * @returns {string} - parsed string\n */\nexport const parseUrlEncodedNumCharRef = (str, nest = 0) => {\n if (!isString(str)) {\n throw new TypeError(`Expected String but got ${getType(str)}.`);\n }\n if (!Number.isInteger(nest)) {\n throw new TypeError(`Expected Number but got ${getType(nest)}.`);\n } else if (nest > HEX) {\n throw new Error('Character references nested too deeply.');\n }\n let res = decodeURIComponent(str);\n if (/&#/.test(res)) {\n const textCharCodes = new Set(textChars);\n const items = [...res.matchAll(REG_NUM_REF)].reverse();\n for (const item of items) {\n const [numCharRef, value] = item;\n let num;\n if (/^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 * URI schemes\n *\n */\nexport class URISchemes {\n /* private fields */\n #schemes;\n\n /**\n * construct\n */\n constructor() {\n this.#schemes = new Set(uriSchemes);\n }\n\n /**\n * get schemes\n *\n * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}\n * - Historical schemes omitted\n * - 'moz-extension' scheme added\n * @returns {Array.<string>} - array of schemes\n */\n get() {\n return [...this.#schemes];\n }\n\n /**\n * has scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n has(scheme) {\n return this.#schemes.has(scheme);\n }\n\n /**\n * add scheme\n * NOTE: `javascript` and/or `vbscript` schemes can not be registered\n *\n * @param {string} scheme - scheme\n * @returns {Array.<string>} - array of schemes\n */\n add(scheme) {\n if (!isString(scheme)) {\n throw new TypeError(`Expected String but got ${getType(scheme)}.`);\n } else if (REG_SCRIPT.test(scheme) || !REG_SCHEME.test(scheme)) {\n throw new Error(`Invalid scheme: ${scheme}`);\n }\n this.#schemes.add(scheme);\n return [...this.#schemes];\n }\n\n /**\n * remove scheme\n *\n * @param {string} scheme - scheme\n * @returns {boolean} - result\n */\n remove(scheme) {\n return this.#schemes.delete(scheme);\n }\n\n /**\n * is URI\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\n isURI(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_CUSTOM.test(scheme)) ||\n schemeParts.every(s => this.#schemes.has(s));\n } catch (e) {\n res = false;\n }\n }\n return !!res;\n }\n};\n\n/* URL sanitizer */\nexport class URLSanitizer extends URISchemes {\n /* private fields */\n #nest;\n #recurse;\n\n /**\n * construct\n */\n constructor() {\n super();\n this.#nest = 0;\n this.#recurse = new Set();\n }\n\n /**\n * sanitize URL\n * NOTE: `data` and/or `file` schemes must be explicitly allowed\n * `javascript` and/or `vbscript` schemes can not be allowed\n *\n * @param {string} url - URL input\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 * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], only: [] }) {\n if (this.#nest > HEX) {\n this.#nest = 0;\n throw new Error('Data URLs nested too deeply.');\n }\n const { allow, deny, only } = opt ?? {};\n const schemeMap = new Map([\n ['data', false],\n ['file', false],\n ['javascrpt', false],\n ['vbscript', false]\n ]);\n let restrictScheme = false;\n if (Array.isArray(only) && only.length) {\n const schemes = super.get();\n for (const item of schemes) {\n schemeMap.set(item, false);\n }\n const items = Object.values(only);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n if (!restrictScheme && schemeMap.has(item)) {\n restrictScheme = schemeMap.get(item);\n }\n }\n }\n }\n } else {\n if (Array.isArray(allow) && allow.length) {\n const items = Object.values(allow);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (!REG_SCRIPT.test(item)) {\n if (super.has(item)) {\n schemeMap.set(item, true);\n } else {\n try {\n super.add(item);\n } catch (e) {\n // fall through\n }\n if (super.has(item)) {\n schemeMap.set(item, true);\n }\n }\n }\n }\n }\n }\n if (Array.isArray(deny) && deny.length) {\n const items = Object.values(deny);\n for (let item of items) {\n if (isString(item)) {\n item = item.trim();\n if (item) {\n schemeMap.set(item, false);\n }\n }\n }\n }\n }\n let sanitizedUrl;\n if (super.isURI(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 let escapeHtml;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}${search}${hash}`;\n const mediaType = head.split(';');\n let parsedData = data;\n if (mediaType[mediaType.length - 1] === 'base64') {\n mediaType.pop();\n parsedData = parseBase64(data);\n } else {\n try {\n const decodedData = parseUrlEncodedNumCharRef(parsedData);\n const { protocol: dataScheme } = new URL(decodedData.trim());\n const dataSchemeParts = dataScheme.replace(/:$/, '').split('+');\n if (dataSchemeParts.some(s => REG_SCRIPT.test(s))) {\n urlToSanitize = '';\n }\n } catch (e) {\n // fall through\n }\n }\n const containsDataUrl = /data:[^,]*,/.test(parsedData);\n if (parsedData !== data || containsDataUrl) {\n if (containsDataUrl) {\n const matchedDataUrls = parsedData.matchAll(REG_DATA_URL);\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 if (parsedDataUrl) {\n const { index } = item;\n const [preDataUrl, postDataUrl] = [\n parsedData.substring(0, index),\n parsedData.substring(index + dataUrl.length)\n ];\n parsedData = `${preDataUrl}${parsedDataUrl}${postDataUrl}`;\n }\n }\n if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n } else if (this.#recurse.has(url)) {\n this.#recurse.delete(url);\n } else {\n escapeHtml = true;\n }\n } else {\n escapeHtml = true;\n }\n if (urlToSanitize) {\n sanitizedUrl = urlToSanitize\n .replace(REG_HTML_SP, getUrlEncodedString)\n .replace(REG_URL_ENC_AMP, escapeUrlEncodedHtmlChars);\n if (escapeHtml) {\n sanitizedUrl = sanitizedUrl\n .replace(REG_HTML_SP_URL_ENC, escapeUrlEncodedHtmlChars);\n this.#nest = 0;\n }\n } else {\n sanitizedUrl = urlToSanitize;\n this.#nest = 0;\n }\n }\n }\n return sanitizedUrl || null;\n }\n\n /**\n * object with extended props based on URL API\n *\n * @typedef {object} ParsedURL\n * @property {string} input - URL input\n * @property {boolean} valid - is valid URI\n * @property {object} data - parsed result of data URL, `null`able\n * @property {string} data.mime - MIME type\n * @property {boolean} data.base64 - `true` if 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 {object} searchParams - URLSearchParams object\n * @property {string} hash - fragment identifier of the sanitized URL\n */\n\n /**\n * parse sanitized URL\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {ParsedURL} - result with extended props based on URL API\n */\n parse(url, opt) {\n if (!isString(url)) {\n throw new TypeError(`Expected String but got ${getType(url)}.`);\n }\n const sanitizedUrl = this.sanitize(url, opt ?? {\n allow: ['data', 'file']\n });\n const parsedUrl = new Map([\n ['input', url]\n ]);\n if (sanitizedUrl) {\n const urlObj = new URL(sanitizedUrl);\n const { pathname, protocol } = urlObj;\n const schemeParts = protocol.replace(/:$/, '').split('+');\n parsedUrl.set('valid', true);\n if (schemeParts.includes('data')) {\n const dataUrl = new Map();\n const [head, ...body] = pathname.split(',');\n const data = `${body.join(',')}`;\n const mediaType = head.split(';');\n const isBase64 = mediaType[mediaType.length - 1] === 'base64';\n if (isBase64) {\n mediaType.pop();\n }\n dataUrl.set('mime', mediaType.join(';'));\n dataUrl.set('base64', isBase64);\n dataUrl.set('data', data);\n parsedUrl.set('data', Object.fromEntries(dataUrl));\n } else {\n parsedUrl.set('data', null);\n }\n for (const key in urlObj) {\n const value = urlObj[key];\n if (typeof value !== 'function') {\n parsedUrl.set(key, value);\n }\n }\n } else {\n parsedUrl.set('valid', false);\n }\n return Object.fromEntries(parsedUrl);\n }\n};\n\n/* instance */\nconst urlSanitizer = new URLSanitizer();\n\n/* aliases and async wrappers */\n/**\n * is URI sync\n *\n * @param {string} uri - URI input\n * @returns {boolean} - result\n */\nconst isUri = uri => urlSanitizer.isURI(uri);\n\n/**\n * is URI async\n *\n * @param {string} uri - URI input\n * @returns {Promise.<boolean>} - result\n */\nexport const isURI = async uri => {\n const res = await isUri(uri);\n return res;\n};\n\n/**\n * sanitize URL sync\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {?string} - sanitized URL\n */\nconst sanitizeUrl = (url, opt) => {\n const parsedUrl = urlSanitizer.parse(url, opt ?? {\n allow: [],\n deny: [],\n only: []\n });\n let res;\n if (parsedUrl) {\n const { href } = parsedUrl;\n res = href;\n }\n return res ?? null;\n};\n\n/**\n * sanitize URL async\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {Promise.<?string>} - sanitized URL\n */\nexport const sanitizeURL = async (url, opt) => {\n const res = await sanitizeUrl(url, opt);\n return res;\n};\n\n/**\n * parse URL sync\n *\n * @param {string} url - URL input\n * @returns {ParsedURL} - result with extended props based on URL API\n */\nconst parseUrl = url => urlSanitizer.parse(url);\n\n/**\n * parse URL async\n *\n * @param {string} url - URL input\n * @returns {Promise.<ParsedURL>} - result with extended props based on URL API\n */\nexport const parseURL = async url => {\n const res = await parseUrl(url);\n return res;\n};\n\n/* export instance and aliases */\nexport {\n urlSanitizer as default,\n isUri as isURISync,\n parseUrl as parseURLSync,\n sanitizeUrl as sanitizeURLSync\n};\n"],
5
+ "mappings": "AAcO,IAAMA,EAAUC,GACrB,OAAO,UAAU,SAAS,KAAKA,CAAC,EAAE,MAAM,EAAW,EAAO,EAQ/CC,EAAWD,GAAK,OAAOA,GAAM,UAAYA,aAAa,OCvBnE,IAAAE,EAAA,CACE,EACA,EACA,EACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,GACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,IACA,GACF,ECxOA,IAAAC,EAAA,CACE,MACA,OACA,QACA,OACA,OACA,MACA,MACA,YACA,MACA,MACA,MACA,MACA,OACA,UACA,UACA,MACA,KACA,MACA,aACA,KACA,SACA,UACA,UACA,cACA,OACA,OACA,aACA,QACA,aACA,SACA,MACA,OACA,QACA,SACA,mBACA,MACA,OACA,QACA,0BACA,UACA,eACA,OACA,OACA,MACA,MACA,MACA,OACA,MACA,WACA,OACA,MACA,MACA,qBACA,kBACA,MACA,OACA,MACA,MACA,MACA,OACA,MACA,MACA,MACA,OACA,OACA,MACA,OACA,WACA,MACA,WACA,UACA,WACA,OACA,YACA,OACA,OACA,SACA,2BACA,OACA,KACA,MACA,cACA,MACA,KACA,MACA,SACA,eACA,KACA,SACA,QACA,QACA,OACA,MACA,OACA,MACA,OACA,QACA,OACA,QACA,YACA,QACA,MACA,OACA,OACA,KACA,OACA,OACA,WACA,OACA,MACA,OACA,MACA,OACA,MACA,OACA,OACA,OACA,YACA,WACA,WACA,YACA,WACA,OACA,SACA,MACA,MACA,UACA,SACA,OACA,OACA,QACA,gBACA,UACA,MACA,OACA,SACA,SACA,OACA,SACA,SACA,UACA,2BACA,uCACA,kCACA,MACA,MACA,UACA,MACA,gBACA,YACA,kBACA,uBACA,gBACA,cACA,gBACA,WACA,sBACA,qBACA,mBACA,eACA,UACA,cACA,cACA,gCACA,qBACA,aACA,yBACA,iBACA,sBACA,eACA,YACA,gBACA,aACA,eACA,0BACA,yBACA,gBACA,kBACA,YACA,mBACA,iCACA,4BACA,cACA,2BACA,wBACA,qBACA,uBACA,2BACA,iCACA,gCACA,+BACA,uBACA,uBACA,mBACA,8BACA,4BACA,oBACA,sBACA,wBACA,6BACA,mBACA,wBACA,SACA,cACA,gBACA,gBACA,qBACA,qBACA,WACA,aACA,gBACA,oBACA,UACA,QACA,OACA,QACA,MACA,KACA,OACA,SACA,UACA,MACA,OACA,MACA,KACA,MACA,OACA,QACA,MACA,MACA,MACA,UACA,cACA,kBACA,cACA,UACA,OACA,YACA,UACA,QACA,SACA,WACA,MACA,OACA,QACA,OACA,OACA,OACA,KACA,QACA,iBACA,QACA,SACA,SACA,MACA,WACA,MACA,QACA,QACA,OACA,OACA,QACA,QACA,QACA,aACA,eACA,UACA,UACA,OACA,MACA,MACA,QACA,eACA,UACA,MACA,OACA,QACA,MACA,MACA,MACA,OACA,OACA,YACA,aACA,SACA,SACA,UACA,MACA,MACA,WACA,QACA,OACA,QACA,SACA,MACA,MACA,OACA,WACA,MACA,QACA,YACA,MACA,WACA,SACA,OACA,SACA,cACA,MACA,SACA,OACA,OACA,QACA,KACA,MACA,SACA,MACA,SACA,kBACA,UACA,QACA,WACA,MACA,cACA,MACA,SACA,kBACA,OACA,KACA,MACA,OACA,SACA,OACA,KACA,MACA,OACA,UACA,OACA,cACA,QACA,cACA,eACA,OACA,MACA,QACA,UACA,SACF,ECjVA,IAAMC,EAAM,GACNC,EAAa,oBACbC,EAAe,oBACfC,EAAsB,qCACtBC,EAAc,YACdC,GAAsB,0BACtBC,GAAc,uCACdC,GAAa,sBACbC,GAAoB,wBACpBC,EAAa,oBACbC,GAAc,iBACdC,GAAkB,OAQXC,EAAsBC,GAAO,CACxC,GAAI,CAACC,EAASD,CAAG,EACf,MAAM,IAAI,UAAU,2BAA2BE,EAAQF,CAAG,IAAI,EAEhE,IAAMG,EAAQ,CAAC,EACf,QAAWC,KAAMJ,EACfG,EAAM,KAAK,IAAIC,EAAG,WAAW,CAAC,EAAE,SAASjB,CAAG,EAAE,YAAY,GAAG,EAE/D,OAAOgB,EAAM,KAAK,EAAE,CACtB,EAQaE,EAA4BD,GAAM,CAC7C,GAAIH,EAASG,CAAE,EACb,GAAIP,GAAY,KAAKO,CAAE,EACrBA,EAAKA,EAAG,YAAY,MAEpB,OAAM,IAAI,MAAM,kCAA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",
6
+ "names": ["getType", "o", "isString", "text_chars_default", "uri_schemes_default", "HEX", "REG_BASE64", "REG_DATA_URL", "REG_DATA_URL_BASE64", "REG_HTML_SP", "REG_HTML_SP_URL_ENC", "REG_NUM_REF", "REG_SCHEME", "REG_SCHEME_CUSTOM", "REG_SCRIPT", "REG_URL_ENC", "REG_URL_ENC_AMP", "getUrlEncodedString", "str", "isString", "getType", "chars", "ch", "escapeUrlEncodedHtmlChars", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "bin", "uint8arr", "c", "textCharCodes", "text_chars_default", "parsedData", "parseUrlEncodedNumCharRef", "nest", "res", "items", "item", "numCharRef", "value", "index", "preNum", "postNum", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "protocol", "schemeParts", "s", "URLSanitizer", "#nest", "#recurse", "url", "opt", "allow", "deny", "only", "schemeMap", "restrictScheme", "schemes", "sanitizedUrl", "hash", "href", "pathname", "search", "bool", "key", "escapeHtml", "urlToSanitize", "head", "body", "mediaType", "decodedData", "dataScheme", "containsDataUrl", "dataUrl", "parsedDataUrl", "preDataUrl", "postDataUrl", "parsedUrl", "urlObj", "isBase64", "urlSanitizer", "isUri", "isURI", "sanitizeUrl", "sanitizeURL", "parseUrl", "parseURL"]
7
7
  }
package/index.js CHANGED
@@ -3,5 +3,11 @@
3
3
  */
4
4
 
5
5
  export {
6
- default, isURI, isURISync, sanitizeURL, sanitizeURLSync
6
+ default,
7
+ isURI,
8
+ isURISync,
9
+ parseURL,
10
+ parseURLSync,
11
+ sanitizeURL,
12
+ sanitizeURLSync
7
13
  } from './src/mjs/uri-util.js';
package/package.json CHANGED
@@ -29,6 +29,10 @@
29
29
  "lint": "eslint --fix .",
30
30
  "test": "c8 --reporter=text mocha --exit test/*.test.js"
31
31
  },
32
+ "dependencies": {
33
+ "dompurify": "^2.4.3",
34
+ "jsdom": "^21.1.0"
35
+ },
32
36
  "devDependencies": {
33
37
  "@babel/eslint-parser": "^7.19.1",
34
38
  "@babel/plugin-syntax-import-assertions": "^7.20.0",
@@ -50,5 +54,5 @@
50
54
  "sinon": "^15.0.1",
51
55
  "undici": "^5.16.0"
52
56
  },
53
- "version": "0.5.5"
57
+ "version": "0.5.7"
54
58
  }
@@ -445,31 +445,32 @@ export class URLSanitizer extends URISchemes {
445
445
  * @property {string} data.mime - MIME type
446
446
  * @property {boolean} data.base64 - `true` if base64 encoded
447
447
  * @property {string} data.data - data part of the data URL
448
- * @property {string} href - same as URL API
449
- * @property {string} origin - same as URL API
450
- * @property {string} protocol - same as URL API
451
- * @property {string} username - same as URL API
452
- * @property {string} password - same as URL API
453
- * @property {string} host - same as URL API
454
- * @property {string} hostname - same as URL API
455
- * @property {string} port - same as URL API
456
- * @property {string} pathname - same as URL API
457
- * @property {string} search - same as URL API
458
- * @property {object} searchParams - same as URL API
459
- * @property {string} hash - same as URL API
448
+ * @property {string} href - sanitized URL input
449
+ * @property {string} origin - scheme, domain and port of the sanitized URL
450
+ * @property {string} protocol - protocol scheme of the sanitized URL
451
+ * @property {string} username - username specified before the domain name
452
+ * @property {string} password - password specified before the domain name
453
+ * @property {string} host - domain and port of the sanitized URL
454
+ * @property {string} hostname - domain of the sanitized URL
455
+ * @property {string} port - port number of the sanitized URL
456
+ * @property {string} pathname - path of the sanitized URL
457
+ * @property {string} search - query string of the sanitized URL
458
+ * @property {object} searchParams - URLSearchParams object
459
+ * @property {string} hash - fragment identifier of the sanitized URL
460
460
  */
461
461
 
462
462
  /**
463
463
  * parse sanitized URL
464
464
  *
465
465
  * @param {string} url - URL input
466
+ * @param {object} opt - options
466
467
  * @returns {ParsedURL} - result with extended props based on URL API
467
468
  */
468
- parse(url) {
469
+ parse(url, opt) {
469
470
  if (!isString(url)) {
470
471
  throw new TypeError(`Expected String but got ${getType(url)}.`);
471
472
  }
472
- const sanitizedUrl = this.sanitize(url, {
473
+ const sanitizedUrl = this.sanitize(url, opt ?? {
473
474
  allow: ['data', 'file']
474
475
  });
475
476
  const parsedUrl = new Map([
@@ -539,11 +540,19 @@ export const isURI = async uri => {
539
540
  * @param {object} opt - options
540
541
  * @returns {?string} - sanitized URL
541
542
  */
542
- const sanitizeUrl = (url, opt) => urlSanitizer.sanitize(url, opt ?? {
543
- allow: [],
544
- deny: [],
545
- only: []
546
- });
543
+ const sanitizeUrl = (url, opt) => {
544
+ const parsedUrl = urlSanitizer.parse(url, opt ?? {
545
+ allow: [],
546
+ deny: [],
547
+ only: []
548
+ });
549
+ let res;
550
+ if (parsedUrl) {
551
+ const { href } = parsedUrl;
552
+ res = href;
553
+ }
554
+ return res ?? null;
555
+ };
547
556
 
548
557
  /**
549
558
  * sanitize URL async