url-sanitizer 0.2.2 → 0.2.3

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
@@ -17,7 +17,7 @@ For browsers and web sites, standalone ESM builds are available in `dist/` direc
17
17
  * node_modules/url-sanitizer/dist/url-sanitizer.js
18
18
  * node_modules/url-sanitizer/dist/url-sanitizer.min.js
19
19
 
20
- Or, download the source code from [Releases](https://github.com/asamuzaK/urlSanitizer/releases).
20
+ Or, download them from [Releases](https://github.com/asamuzaK/urlSanitizer/releases).
21
21
 
22
22
  ## Usage
23
23
 
@@ -30,13 +30,16 @@ import urlSanitizer, {
30
30
  ## sanitizeURL(url, opt)
31
31
 
32
32
  Sanitize the given URL.
33
- * `data` and/or `file` schemes must be explicitly allowed.
34
- * `javascript` and/or `vbscript` schemes can not be allowed.
33
+ * `data` and `file` schemes must be explicitly allowed.
34
+ * `javascript` and `vbscript` schemes can not be allowed.
35
35
 
36
36
  ### Parameters
37
37
 
38
38
  * `url` **[string][1]** URL input
39
- * `opt` **[object][4]** options
39
+ * `opt` **[object][3]** options
40
+ * `opt.allow` **[Array][4]<[string][1]>** array of allowed schemes
41
+ * `opt.deny` **[Array][4]<[string][1]>** array of denied schemes
42
+ * `opt.escapeTags` **[boolean][2]** escape tags and quotes in data URL
40
43
 
41
44
  Returns **[Promise][5]<[string][1]?>** sanitized URL, `null`able
42
45
 
@@ -85,8 +88,8 @@ Determines whether the given URI is valid.
85
88
 
86
89
  * `uri` **[string][1]** URI input
87
90
 
88
- Returns **[Promise][5]<[boolean][3]>** result
89
- * Always `true` for `web+*` and/or `ext+*` schemes
91
+ Returns **[Promise][5]<[boolean][2]>** result
92
+ * Always `true` for `web+*` and `ext+*` schemes
90
93
 
91
94
  ```javascript
92
95
  const res1 = await isURI('https://example.com/foo');
@@ -114,7 +117,7 @@ Get an array of URI schemes registered at [iana.org](https://www.iana.org/assign
114
117
  * Historical schemes omitted.
115
118
  * `moz-extension` scheme added.
116
119
 
117
- Returns **[Array][2]<[string][1]>** array of registered URI schemes
120
+ Returns **[Array][4]<[string][1]>** array of registered URI schemes
118
121
 
119
122
  ```javascript
120
123
  const schemes = urlSanitizer.get();
@@ -129,7 +132,7 @@ Check if the given scheme is registered.
129
132
 
130
133
  * `scheme` **[string][1]** scheme
131
134
 
132
- Returns **[boolean][3]** result
135
+ Returns **[boolean][2]** result
133
136
 
134
137
  ```javascript
135
138
  const res1 = urlSanitizer.has('https');
@@ -142,17 +145,23 @@ const res2 = urlSanitizer.has('foo');
142
145
  ### urlSanitizer.add(scheme)
143
146
 
144
147
  Add a scheme to the list of URI schemes.
145
- * `javascript` and/or `vbscript` schemes can not be registered. It throws.
148
+ * `javascript` and `vbscript` schemes can not be registered. It throws.
146
149
 
147
150
  #### Parameters
148
151
 
149
152
  * `scheme` **[string][1]** scheme
150
153
 
151
- Returns **[Array][2]<[string][1]>** array of registered URI schemes
154
+ Returns **[Array][4]<[string][1]>** array of registered URI schemes
152
155
 
153
156
  ```javascript
157
+ console.log(isURISync('foo'));
158
+ // -> false;
159
+
154
160
  const res = urlSanitizer.add('foo');
155
161
  // -> ['aaa', 'aaas', 'about', 'acap', 'acct', 'acd', ... 'foo', ...];
162
+
163
+ console.log(isURISync('foo'));
164
+ // -> true;
156
165
  ```
157
166
 
158
167
  ### urlSanitizer.remove(scheme)
@@ -163,23 +172,29 @@ Remove a scheme from the list of URI schemes.
163
172
 
164
173
  * `scheme` **[string][1]** scheme
165
174
 
166
- Returns **[boolean][3]** result
175
+ Returns **[boolean][2]** result
167
176
  * `true` if the scheme is successfully removed, `false` otherwise.
168
177
 
169
178
  ```javascript
179
+ console.log(isURISync('aaa'));
180
+ // -> true;
181
+
170
182
  const res1 = urlSanitizer.remove('aaa');
171
183
  // -> true
172
184
 
185
+ console.log(isURISync('aaa'));
186
+ // -> false;
187
+
173
188
  const res2 = urlSanitizer.remove('foo');
174
189
  // -> false
175
190
  ```
176
191
 
177
192
  [1]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/String
178
193
 
179
- [2]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array
194
+ [2]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean
180
195
 
181
- [3]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Boolean
196
+ [3]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
182
197
 
183
- [4]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object
198
+ [4]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Array
184
199
 
185
200
  [5]: https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Promise
@@ -4,6 +4,241 @@ var TYPE_TO = -1;
4
4
  var getType = (o) => Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);
5
5
  var isString = (o) => typeof o === "string" || o instanceof String;
6
6
 
7
+ // src/lib/file/text-chars.json
8
+ var text_chars_default = [
9
+ 7,
10
+ 8,
11
+ 9,
12
+ 10,
13
+ 11,
14
+ 12,
15
+ 13,
16
+ 27,
17
+ 32,
18
+ 33,
19
+ 34,
20
+ 35,
21
+ 36,
22
+ 37,
23
+ 38,
24
+ 39,
25
+ 40,
26
+ 41,
27
+ 42,
28
+ 43,
29
+ 44,
30
+ 45,
31
+ 46,
32
+ 47,
33
+ 48,
34
+ 49,
35
+ 50,
36
+ 51,
37
+ 52,
38
+ 53,
39
+ 54,
40
+ 55,
41
+ 56,
42
+ 57,
43
+ 58,
44
+ 59,
45
+ 60,
46
+ 61,
47
+ 62,
48
+ 63,
49
+ 64,
50
+ 65,
51
+ 66,
52
+ 67,
53
+ 68,
54
+ 69,
55
+ 70,
56
+ 71,
57
+ 72,
58
+ 73,
59
+ 74,
60
+ 75,
61
+ 76,
62
+ 77,
63
+ 78,
64
+ 79,
65
+ 80,
66
+ 81,
67
+ 82,
68
+ 83,
69
+ 84,
70
+ 85,
71
+ 86,
72
+ 87,
73
+ 88,
74
+ 89,
75
+ 90,
76
+ 91,
77
+ 92,
78
+ 93,
79
+ 94,
80
+ 95,
81
+ 96,
82
+ 97,
83
+ 98,
84
+ 99,
85
+ 100,
86
+ 101,
87
+ 102,
88
+ 103,
89
+ 104,
90
+ 105,
91
+ 106,
92
+ 107,
93
+ 108,
94
+ 109,
95
+ 110,
96
+ 111,
97
+ 112,
98
+ 113,
99
+ 114,
100
+ 115,
101
+ 116,
102
+ 117,
103
+ 118,
104
+ 119,
105
+ 120,
106
+ 121,
107
+ 122,
108
+ 123,
109
+ 124,
110
+ 125,
111
+ 126,
112
+ 128,
113
+ 129,
114
+ 130,
115
+ 131,
116
+ 132,
117
+ 133,
118
+ 134,
119
+ 135,
120
+ 136,
121
+ 137,
122
+ 138,
123
+ 139,
124
+ 140,
125
+ 141,
126
+ 142,
127
+ 143,
128
+ 144,
129
+ 145,
130
+ 146,
131
+ 147,
132
+ 148,
133
+ 149,
134
+ 150,
135
+ 151,
136
+ 152,
137
+ 153,
138
+ 154,
139
+ 155,
140
+ 156,
141
+ 157,
142
+ 158,
143
+ 159,
144
+ 160,
145
+ 161,
146
+ 162,
147
+ 163,
148
+ 164,
149
+ 165,
150
+ 166,
151
+ 167,
152
+ 168,
153
+ 169,
154
+ 170,
155
+ 171,
156
+ 172,
157
+ 173,
158
+ 174,
159
+ 175,
160
+ 176,
161
+ 177,
162
+ 178,
163
+ 179,
164
+ 180,
165
+ 181,
166
+ 182,
167
+ 183,
168
+ 184,
169
+ 185,
170
+ 186,
171
+ 187,
172
+ 188,
173
+ 189,
174
+ 190,
175
+ 191,
176
+ 192,
177
+ 193,
178
+ 194,
179
+ 195,
180
+ 196,
181
+ 197,
182
+ 198,
183
+ 199,
184
+ 200,
185
+ 201,
186
+ 202,
187
+ 203,
188
+ 204,
189
+ 205,
190
+ 206,
191
+ 207,
192
+ 208,
193
+ 209,
194
+ 210,
195
+ 211,
196
+ 212,
197
+ 213,
198
+ 214,
199
+ 215,
200
+ 216,
201
+ 217,
202
+ 218,
203
+ 219,
204
+ 220,
205
+ 221,
206
+ 222,
207
+ 223,
208
+ 224,
209
+ 225,
210
+ 226,
211
+ 227,
212
+ 228,
213
+ 229,
214
+ 230,
215
+ 231,
216
+ 232,
217
+ 233,
218
+ 234,
219
+ 235,
220
+ 236,
221
+ 237,
222
+ 238,
223
+ 239,
224
+ 240,
225
+ 241,
226
+ 242,
227
+ 243,
228
+ 244,
229
+ 245,
230
+ 246,
231
+ 247,
232
+ 248,
233
+ 249,
234
+ 250,
235
+ 251,
236
+ 252,
237
+ 253,
238
+ 254,
239
+ 255
240
+ ];
241
+
7
242
  // src/lib/iana/uri-schemes.json
8
243
  var uri_schemes_default = [
9
244
  "aaa",
@@ -399,13 +634,7 @@ var parseBase64 = (data) => {
399
634
  }
400
635
  const bin = atob(data);
401
636
  const uint8arr = Uint8Array.from([...bin].map((c) => c.charCodeAt(0)));
402
- const textChars = /* @__PURE__ */ new Set([7, 8, 9, 10, 11, 12, 13, 27]);
403
- for (let i = 32; i < 127; i++) {
404
- textChars.add(i);
405
- }
406
- for (let i = 128; i <= 255; i++) {
407
- textChars.add(i);
408
- }
637
+ const textChars = new Set(text_chars_default);
409
638
  let parsedData;
410
639
  if (uint8arr.every((c) => textChars.has(c))) {
411
640
  parsedData = bin.replace(/\s/g, getUrlEncodedString);
@@ -573,8 +802,8 @@ var URLSanitizer = class extends URISchemes {
573
802
  if (parsedDataUrl) {
574
803
  parsedData = parsedData.replace(dataUrl, parsedDataUrl);
575
804
  }
576
- type = 0;
577
805
  }
806
+ type = 0;
578
807
  }
579
808
  } else if (/data:[^,]*,/.test(parsedData) && !(escapeTags ?? true)) {
580
809
  const dataArr = parsedData.split(/data:[^,]*,/);
@@ -613,6 +842,7 @@ var URLSanitizer = class extends URISchemes {
613
842
  case 2:
614
843
  sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString).replace(regAmp, escapeUrlEncodedHtmlChars);
615
844
  break;
845
+ case 0:
616
846
  default:
617
847
  sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);
618
848
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/mjs/common.js", "../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 \"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 uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\n\n/* constants */\nconst HEX = 16;\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 (/^%[\\dA-F]{2}$/i.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`${ch} is not a URL encoded character.`);\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\n *\n * @see {@link https://github.com/file/file/blob/master/src/encoding.c}\n * @param {string} data - base64 data\n * @returns {string} - parsed data / base64 data\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textChars = new Set([0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1b]);\n for (let i = 0x20; i < 0x7f; i++) {\n textChars.add(i);\n }\n for (let i = 0x80; i <= 0xff; i++) {\n textChars.add(i);\n }\n let parsedData;\n if (uint8arr.every(c => textChars.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\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 (/(?:java|vb)script/.test(scheme) ||\n !/^[a-z][a-z0-9+\\-.]*$/.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 = /^(?:ext|web)\\+[a-z]+$/.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 /**\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 {boolean} opt.escapeTags - escape tags and quotes in data URL\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], escapeTags: true }) {\n let sanitizedUrl;\n if (super.isURI(url)) {\n const { allow, deny, escapeTags } = opt ?? {};\n const { href, pathname, protocol } = new URL(url);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n const schemeMap = new Map([['data', false], ['file', false]]);\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 (/(?:java|vb)script/.test(item)) {\n schemeMap.set(item, false);\n } else if (item) {\n schemeMap.set(item, true);\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 let bool;\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 if (bool) {\n const [amp, lt, gt, quot, apos] =\n ['&', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n const regChars = /[<>\"']/g;\n const regAmp = new RegExp(amp, 'g');\n const regEncodedChars =\n new RegExp(`(${lt}|${gt}|${quot}|${apos})`, 'g');\n let type;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [header, data] = pathname.split(',');\n const mediaType = header.split(';');\n const isBase64 = mediaType.pop() === 'base64';\n if (isBase64) {\n let parsedData = parseBase64(data);\n if (parsedData !== data) {\n const regDataUrl = /data:[^,]*;?base64,[\\dA-Za-z+/\\-_=]+/g;\n if (regDataUrl.test(parsedData)) {\n const dataUrlArr = [];\n let arr = regDataUrl.exec(parsedData);\n do {\n if (arr) {\n dataUrlArr.push(arr);\n }\n } while ((arr = regDataUrl.exec(parsedData)));\n if (dataUrlArr.length) {\n for (const i of dataUrlArr) {\n const [dataUrl] = i;\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n if (parsedDataUrl) {\n parsedData = parsedData.replace(dataUrl, parsedDataUrl);\n }\n type = 0;\n }\n }\n } else if (/data:[^,]*,/.test(parsedData) &&\n !(escapeTags ?? true)) {\n const dataArr = parsedData.split(/data:[^,]*,/);\n const l = dataArr.length;\n let i = 1;\n while (i < l) {\n const dataItem = dataArr[i]\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n parsedData = parsedData.replace(dataArr[i], dataItem);\n i++;\n }\n type = 0;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n if ((escapeTags ?? true)) {\n type = 1;\n } else if (!Number.isInteger(type)) {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else {\n type = 1;\n }\n switch (type) {\n case 1:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars)\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n break;\n case 2:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars);\n break;\n default:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);\n }\n }\n }\n return sanitizedUrl || null;\n }\n}\n\nconst urlSanitizer = new URLSanitizer();\n\n/* alias */\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\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 escapeTags: true\n});\n\n/**\n * sanitize URL\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\nexport {\n urlSanitizer as default,\n isUri as isURISync,\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;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AA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",
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 textCharTable 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;\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 (/^%[\\dA-F]{2}$/i.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`${ch} is not a URL encoded character.`);\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\n *\n * @param {string} data - base64 data\n * @returns {string} - parsed data / base64 data\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textChars = new Set(textCharTable);\n let parsedData;\n if (uint8arr.every(c => textChars.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\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 (/(?:java|vb)script/.test(scheme) ||\n !/^[a-z][a-z0-9+\\-.]*$/.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 = /^(?:ext|web)\\+[a-z]+$/.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 /**\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 {boolean} opt.escapeTags - escape tags and quotes in data URL\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], escapeTags: true }) {\n let sanitizedUrl;\n if (super.isURI(url)) {\n const { allow, deny, escapeTags } = opt ?? {};\n const { href, pathname, protocol } = new URL(url);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n const schemeMap = new Map([['data', false], ['file', false]]);\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 (/(?:java|vb)script/.test(item)) {\n schemeMap.set(item, false);\n } else if (item) {\n schemeMap.set(item, true);\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 let bool;\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 if (bool) {\n const [amp, lt, gt, quot, apos] =\n ['&', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n const regChars = /[<>\"']/g;\n const regAmp = new RegExp(amp, 'g');\n const regEncodedChars =\n new RegExp(`(${lt}|${gt}|${quot}|${apos})`, 'g');\n let type;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [header, data] = pathname.split(',');\n const mediaType = header.split(';');\n const isBase64 = mediaType.pop() === 'base64';\n if (isBase64) {\n let parsedData = parseBase64(data);\n if (parsedData !== data) {\n const regDataUrl = /data:[^,]*;?base64,[\\dA-Za-z+/\\-_=]+/g;\n if (regDataUrl.test(parsedData)) {\n const dataUrlArr = [];\n let arr = regDataUrl.exec(parsedData);\n do {\n if (arr) {\n dataUrlArr.push(arr);\n }\n } while ((arr = regDataUrl.exec(parsedData)));\n if (dataUrlArr.length) {\n for (const i of dataUrlArr) {\n const [dataUrl] = i;\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n if (parsedDataUrl) {\n parsedData = parsedData.replace(dataUrl, parsedDataUrl);\n }\n }\n type = 0;\n }\n } else if (/data:[^,]*,/.test(parsedData) &&\n !(escapeTags ?? true)) {\n const dataArr = parsedData.split(/data:[^,]*,/);\n const l = dataArr.length;\n let i = 1;\n while (i < l) {\n const dataItem = dataArr[i]\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n parsedData = parsedData.replace(dataArr[i], dataItem);\n i++;\n }\n type = 0;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n if ((escapeTags ?? true)) {\n type = 1;\n } else if (!Number.isInteger(type)) {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else {\n type = 1;\n }\n switch (type) {\n case 1:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars)\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n break;\n case 2:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars);\n break;\n case 0:\n default:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);\n }\n }\n }\n return sanitizedUrl || null;\n }\n}\n\nconst urlSanitizer = new URLSanitizer();\n\n/* alias */\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\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 escapeTags: true\n});\n\n/**\n * sanitize URL\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\nexport {\n urlSanitizer as default,\n isUri as isURISync,\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;AAQL,IAAM,sBAAsB,SAAO;AACxC,MAAI,CAAC,SAAS,GAA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",
6
6
  "names": []
7
7
  }
@@ -1,2 +1,2 @@
1
- var w=e=>Object.prototype.toString.call(e).slice(8,-1),d=e=>typeof e=="string"||e instanceof String;var L=["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 N=16,u=e=>{if(!d(e))throw new TypeError(`Expected String but got ${w(e)}.`);let s=[];for(let i of e)s.push(`%${i.charCodeAt(0).toString(N).toUpperCase()}`);return s.join("")},v=e=>{if(d(e))if(/^%[\dA-F]{2}$/i.test(e))e=e.toUpperCase();else throw new Error(`${e} is not a URL encoded character.`);else throw new TypeError(`Expected String but got ${w(e)}.`);let[s,i,r,o,t,l]=["&","#","<",">",'"',"'"].map(u),c;return e===s?c=`${s}amp;`:e===r?c=`${s}lt;`:e===o?c=`${s}gt;`:e===t?c=`${s}quot;`:e===l?c=`${s}${i}39;`:c=e,c},X=e=>{if(!d(e))throw new TypeError(`Expected String but got ${w(e)}.`);let s=atob(e),i=Uint8Array.from([...s].map(t=>t.charCodeAt(0))),r=new Set([7,8,9,10,11,12,13,27]);for(let t=32;t<127;t++)r.add(t);for(let t=128;t<=255;t++)r.add(t);let o;return i.every(t=>r.has(t))?o=s.replace(/\s/g,u):o=e,o},S=class{#e;constructor(){this.#e=new Set(L)}get(){return[...this.#e]}has(s){return this.#e.has(s)}add(s){if(d(s)){if(/(?:java|vb)script/.test(s)||!/^[a-z][a-z0-9+\-.]*$/.test(s))throw new Error(`Invalid scheme: ${s}`)}else throw new TypeError(`Expected String but got ${w(s)}.`);return this.#e.add(s),[...this.#e]}remove(s){return this.#e.delete(s)}isURI(s){let i;if(d(s))try{let{protocol:r}=new URL(s),o=r.replace(/:$/,""),t=o.split("+");i=/^(?:ext|web)\+[a-z]+$/.test(o)||t.every(l=>this.#e.has(l))}catch{i=!1}return!!i}},T=class extends S{sanitize(s,i={allow:[],deny:[],escapeTags:!0}){let r;if(super.isURI(s)){let{allow:o,deny:t,escapeTags:l}=i??{},{href:c,pathname:D,protocol:M}=new URL(s),k=M.replace(/:$/,""),j=k.split("+"),x=new Map([["data",!1],["file",!1]]);if(Array.isArray(o)&&o.length){let m=Object.values(o);for(let a of m)d(a)&&(a=a.trim(),/(?:java|vb)script/.test(a)?x.set(a,!1):a&&x.set(a,!0))}if(Array.isArray(t)&&t.length){let m=Object.values(t);for(let a of m)d(a)&&(a=a.trim(),a&&x.set(a,!1))}let $;for(let[m,a]of x.entries())if($=a||k!==m&&j.every(U=>U!==m),!$)break;if($){let[m,a,U,Y,B]=["&","<",">",'"',"'"].map(u),z=/[<>"']/g,A=new RegExp(m,"g"),C=new RegExp(`(${a}|${U}|${Y}|${B})`,"g"),n,b=c;if(j.includes("data")){let[F,I]=D.split(","),q=F.split(";");if(q.pop()==="base64"){let p=X(I);if(p!==I){let E=/data:[^,]*;?base64,[\dA-Za-z+/\-_=]+/g;if(E.test(p)){let f=[],h=E.exec(p);do h&&f.push(h);while(h=E.exec(p));if(f.length)for(let g of f){let[y]=g,O=this.sanitize(y,{allow:["data"]});O&&(p=p.replace(y,O)),n=0}}else if(/data:[^,]*,/.test(p)&&!(l??!0)){let f=p.split(/data:[^,]*,/),h=f.length,g=1;for(;g<h;){let y=f[g].replace(C,v);p=p.replace(f[g],y),g++}n=0}b=`${k}:${q.join(";")},${p}`,l??!0?n=1:Number.isInteger(n)||(n=2)}else l??!0?n=1:n=2}else l??!0?n=1:n=2}else n=1;switch(n){case 1:r=b.replace(z,u).replace(A,v).replace(C,v);break;case 2:r=b.replace(z,u).replace(A,v);break;default:r=b.replace(z,u)}}}return r||null}},R=new T,P=e=>R.isURI(e),Z=async e=>await P(e),_=(e,s)=>R.sanitize(e,s??{allow:[],deny:[],escapeTags:!0}),G=async(e,s)=>await _(e,s);export{R as default,Z as isURI,P as isURISync,G as sanitizeURL,_ as sanitizeURLSync};
1
+ var w=e=>Object.prototype.toString.call(e).slice(8,-1),d=e=>typeof e=="string"||e instanceof String;var L=[7,8,9,10,11,12,13,27,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255];var P=["aaa","aaas","about","acap","acct","acd","acr","adiumxtra","adt","afp","afs","aim","amss","android","appdata","apt","ar","ark","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 Z=16,u=e=>{if(!d(e))throw new TypeError(`Expected String but got ${w(e)}.`);let s=[];for(let r of e)s.push(`%${r.charCodeAt(0).toString(Z).toUpperCase()}`);return s.join("")},v=e=>{if(d(e))if(/^%[\dA-F]{2}$/i.test(e))e=e.toUpperCase();else throw new Error(`${e} is not a URL encoded character.`);else throw new TypeError(`Expected String but got ${w(e)}.`);let[s,r,i,a,o,l]=["&","#","<",">",'"',"'"].map(u),c;return e===s?c=`${s}amp;`:e===i?c=`${s}lt;`:e===a?c=`${s}gt;`:e===o?c=`${s}quot;`:e===l?c=`${s}${r}39;`:c=e,c},G=e=>{if(!d(e))throw new TypeError(`Expected String but got ${w(e)}.`);let s=atob(e),r=Uint8Array.from([...s].map(o=>o.charCodeAt(0))),i=new Set(L),a;return r.every(o=>i.has(o))?a=s.replace(/\s/g,u):a=e,a},T=class{#e;constructor(){this.#e=new Set(P)}get(){return[...this.#e]}has(s){return this.#e.has(s)}add(s){if(d(s)){if(/(?:java|vb)script/.test(s)||!/^[a-z][a-z0-9+\-.]*$/.test(s))throw new Error(`Invalid scheme: ${s}`)}else throw new TypeError(`Expected String but got ${w(s)}.`);return this.#e.add(s),[...this.#e]}remove(s){return this.#e.delete(s)}isURI(s){let r;if(d(s))try{let{protocol:i}=new URL(s),a=i.replace(/:$/,""),o=a.split("+");r=/^(?:ext|web)\+[a-z]+$/.test(a)||o.every(l=>this.#e.has(l))}catch{r=!1}return!!r}},S=class extends T{sanitize(s,r={allow:[],deny:[],escapeTags:!0}){let i;if(super.isURI(s)){let{allow:a,deny:o,escapeTags:l}=r??{},{href:c,pathname:M,protocol:Y}=new URL(s),k=Y.replace(/:$/,""),j=k.split("+"),y=new Map([["data",!1],["file",!1]]);if(Array.isArray(a)&&a.length){let m=Object.values(a);for(let t of m)d(t)&&(t=t.trim(),/(?:java|vb)script/.test(t)?y.set(t,!1):t&&y.set(t,!0))}if(Array.isArray(o)&&o.length){let m=Object.values(o);for(let t of m)d(t)&&(t=t.trim(),t&&y.set(t,!1))}let $;for(let[m,t]of y.entries())if($=t||k!==m&&j.every(U=>U!==m),!$)break;if($){let[m,t,U,B,F]=["&","<",">",'"',"'"].map(u),z=/[<>"']/g,A=new RegExp(m,"g"),C=new RegExp(`(${t}|${U}|${B}|${F})`,"g"),n,b=c;if(j.includes("data")){let[H,I]=M.split(","),q=H.split(";");if(q.pop()==="base64"){let p=G(I);if(p!==I){let E=/data:[^,]*;?base64,[\dA-Za-z+/\-_=]+/g;if(E.test(p)){let f=[],h=E.exec(p);do h&&f.push(h);while(h=E.exec(p));if(f.length){for(let g of f){let[x]=g,O=this.sanitize(x,{allow:["data"]});O&&(p=p.replace(x,O))}n=0}}else if(/data:[^,]*,/.test(p)&&!(l??!0)){let f=p.split(/data:[^,]*,/),h=f.length,g=1;for(;g<h;){let x=f[g].replace(C,v);p=p.replace(f[g],x),g++}n=0}b=`${k}:${q.join(";")},${p}`,l??!0?n=1:Number.isInteger(n)||(n=2)}else l??!0?n=1:n=2}else l??!0?n=1:n=2}else n=1;switch(n){case 1:i=b.replace(z,u).replace(A,v).replace(C,v);break;case 2:i=b.replace(z,u).replace(A,v);break;case 0:default:i=b.replace(z,u)}}}return i||null}},R=new S,_=e=>R.isURI(e),J=async e=>await _(e),D=(e,s)=>R.sanitize(e,s??{allow:[],deny:[],escapeTags:!0}),K=async(e,s)=>await D(e,s);export{R as default,J as isURI,_ as isURISync,K as sanitizeURL,D as sanitizeURLSync};
2
2
  //# sourceMappingURL=url-sanitizer.min.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["../src/mjs/common.js", "../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 \"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 uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };\n\n/* constants */\nconst HEX = 16;\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 (/^%[\\dA-F]{2}$/i.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`${ch} is not a URL encoded character.`);\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\n *\n * @see {@link https://github.com/file/file/blob/master/src/encoding.c}\n * @param {string} data - base64 data\n * @returns {string} - parsed data / base64 data\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textChars = new Set([0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1b]);\n for (let i = 0x20; i < 0x7f; i++) {\n textChars.add(i);\n }\n for (let i = 0x80; i <= 0xff; i++) {\n textChars.add(i);\n }\n let parsedData;\n if (uint8arr.every(c => textChars.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\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 (/(?:java|vb)script/.test(scheme) ||\n !/^[a-z][a-z0-9+\\-.]*$/.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 = /^(?:ext|web)\\+[a-z]+$/.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 /**\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 {boolean} opt.escapeTags - escape tags and quotes in data URL\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], escapeTags: true }) {\n let sanitizedUrl;\n if (super.isURI(url)) {\n const { allow, deny, escapeTags } = opt ?? {};\n const { href, pathname, protocol } = new URL(url);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n const schemeMap = new Map([['data', false], ['file', false]]);\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 (/(?:java|vb)script/.test(item)) {\n schemeMap.set(item, false);\n } else if (item) {\n schemeMap.set(item, true);\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 let bool;\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 if (bool) {\n const [amp, lt, gt, quot, apos] =\n ['&', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n const regChars = /[<>\"']/g;\n const regAmp = new RegExp(amp, 'g');\n const regEncodedChars =\n new RegExp(`(${lt}|${gt}|${quot}|${apos})`, 'g');\n let type;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [header, data] = pathname.split(',');\n const mediaType = header.split(';');\n const isBase64 = mediaType.pop() === 'base64';\n if (isBase64) {\n let parsedData = parseBase64(data);\n if (parsedData !== data) {\n const regDataUrl = /data:[^,]*;?base64,[\\dA-Za-z+/\\-_=]+/g;\n if (regDataUrl.test(parsedData)) {\n const dataUrlArr = [];\n let arr = regDataUrl.exec(parsedData);\n do {\n if (arr) {\n dataUrlArr.push(arr);\n }\n } while ((arr = regDataUrl.exec(parsedData)));\n if (dataUrlArr.length) {\n for (const i of dataUrlArr) {\n const [dataUrl] = i;\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n if (parsedDataUrl) {\n parsedData = parsedData.replace(dataUrl, parsedDataUrl);\n }\n type = 0;\n }\n }\n } else if (/data:[^,]*,/.test(parsedData) &&\n !(escapeTags ?? true)) {\n const dataArr = parsedData.split(/data:[^,]*,/);\n const l = dataArr.length;\n let i = 1;\n while (i < l) {\n const dataItem = dataArr[i]\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n parsedData = parsedData.replace(dataArr[i], dataItem);\n i++;\n }\n type = 0;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n if ((escapeTags ?? true)) {\n type = 1;\n } else if (!Number.isInteger(type)) {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else {\n type = 1;\n }\n switch (type) {\n case 1:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars)\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n break;\n case 2:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars);\n break;\n default:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);\n }\n }\n }\n return sanitizedUrl || null;\n }\n}\n\nconst urlSanitizer = new URLSanitizer();\n\n/* alias */\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\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 escapeTags: true\n});\n\n/**\n * sanitize URL\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\nexport {\n urlSanitizer as default,\n isUri as isURISync,\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,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,EClVA,IAAMC,EAAM,GAQCC,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,SAASN,CAAG,EAAE,YAAY,GAAG,EAE/D,OAAOK,EAAM,KAAK,EAAE,CACtB,EAQaE,EAA4BD,GAAM,CAC7C,GAAIH,EAASG,CAAE,EACb,GAAI,iBAAiB,KAAKA,CAAE,EAC1BA,EAAKA,EAAG,YAAY,MAEpB,OAAM,IAAI,MAAM,GAAGA,mCAAoC,MAGzD,OAAM,IAAI,UAAU,2BAA2BF,EAAQE,CAAE,IAAI,EAE/D,GAAM,CAACE,EAAKC,EAAKC,EAAIC,EAAIC,EAAMC,CAAI,EACjC,CAA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",
6
- "names": ["getType", "o", "isString", "uri_schemes_default", "HEX", "getUrlEncodedString", "str", "isString", "getType", "chars", "ch", "escapeUrlEncodedHtmlChars", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "bin", "uint8arr", "c", "textChars", "i", "parsedData", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "res", "protocol", "schemeParts", "s", "URLSanitizer", "url", "opt", "sanitizedUrl", "allow", "deny", "escapeTags", "href", "pathname", "schemeMap", "items", "item", "bool", "key", "value", "regChars", "regAmp", "regEncodedChars", "type", "urlToSanitize", "header", "mediaType", "regDataUrl", "dataUrlArr", "arr", "dataUrl", "parsedDataUrl", "dataArr", "l", "dataItem", "urlSanitizer", "isUri", "isURI", "sanitizeUrl", "sanitizeURL"]
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 textCharTable 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;\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 (/^%[\\dA-F]{2}$/i.test(ch)) {\n ch = ch.toUpperCase();\n } else {\n throw new Error(`${ch} is not a URL encoded character.`);\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\n *\n * @param {string} data - base64 data\n * @returns {string} - parsed data / base64 data\n */\nexport const parseBase64 = data => {\n if (!isString(data)) {\n throw new TypeError(`Expected String but got ${getType(data)}.`);\n }\n const bin = atob(data);\n const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));\n const textChars = new Set(textCharTable);\n let parsedData;\n if (uint8arr.every(c => textChars.has(c))) {\n parsedData = bin.replace(/\\s/g, getUrlEncodedString);\n } else {\n parsedData = data;\n }\n return parsedData;\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 (/(?:java|vb)script/.test(scheme) ||\n !/^[a-z][a-z0-9+\\-.]*$/.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 = /^(?:ext|web)\\+[a-z]+$/.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 /**\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 {boolean} opt.escapeTags - escape tags and quotes in data URL\n * @returns {?string} - sanitized URL\n */\n sanitize(url, opt = { allow: [], deny: [], escapeTags: true }) {\n let sanitizedUrl;\n if (super.isURI(url)) {\n const { allow, deny, escapeTags } = opt ?? {};\n const { href, pathname, protocol } = new URL(url);\n const scheme = protocol.replace(/:$/, '');\n const schemeParts = scheme.split('+');\n const schemeMap = new Map([['data', false], ['file', false]]);\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 (/(?:java|vb)script/.test(item)) {\n schemeMap.set(item, false);\n } else if (item) {\n schemeMap.set(item, true);\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 let bool;\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 if (bool) {\n const [amp, lt, gt, quot, apos] =\n ['&', '<', '>', '\"', \"'\"].map(getUrlEncodedString);\n const regChars = /[<>\"']/g;\n const regAmp = new RegExp(amp, 'g');\n const regEncodedChars =\n new RegExp(`(${lt}|${gt}|${quot}|${apos})`, 'g');\n let type;\n let urlToSanitize = href;\n if (schemeParts.includes('data')) {\n const [header, data] = pathname.split(',');\n const mediaType = header.split(';');\n const isBase64 = mediaType.pop() === 'base64';\n if (isBase64) {\n let parsedData = parseBase64(data);\n if (parsedData !== data) {\n const regDataUrl = /data:[^,]*;?base64,[\\dA-Za-z+/\\-_=]+/g;\n if (regDataUrl.test(parsedData)) {\n const dataUrlArr = [];\n let arr = regDataUrl.exec(parsedData);\n do {\n if (arr) {\n dataUrlArr.push(arr);\n }\n } while ((arr = regDataUrl.exec(parsedData)));\n if (dataUrlArr.length) {\n for (const i of dataUrlArr) {\n const [dataUrl] = i;\n const parsedDataUrl = this.sanitize(dataUrl, {\n allow: ['data']\n });\n if (parsedDataUrl) {\n parsedData = parsedData.replace(dataUrl, parsedDataUrl);\n }\n }\n type = 0;\n }\n } else if (/data:[^,]*,/.test(parsedData) &&\n !(escapeTags ?? true)) {\n const dataArr = parsedData.split(/data:[^,]*,/);\n const l = dataArr.length;\n let i = 1;\n while (i < l) {\n const dataItem = dataArr[i]\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n parsedData = parsedData.replace(dataArr[i], dataItem);\n i++;\n }\n type = 0;\n }\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n if ((escapeTags ?? true)) {\n type = 1;\n } else if (!Number.isInteger(type)) {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else if ((escapeTags ?? true)) {\n type = 1;\n } else {\n type = 2;\n }\n } else {\n type = 1;\n }\n switch (type) {\n case 1:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars)\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\n break;\n case 2:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars);\n break;\n case 0:\n default:\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);\n }\n }\n }\n return sanitizedUrl || null;\n }\n}\n\nconst urlSanitizer = new URLSanitizer();\n\n/* alias */\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\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 escapeTags: true\n});\n\n/**\n * sanitize URL\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\nexport {\n urlSanitizer as default,\n isUri as isURISync,\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,GAQCC,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,SAASN,CAAG,EAAE,YAAY,GAAG,EAE/D,OAAOK,EAAM,KAAK,EAAE,CACtB,EAQaE,EAA4BD,GAAM,CAC7C,GAAIH,EAASG,CAAE,EACb,GAAI,iBAAiB,KAAKA,CAAE,EAC1BA,EAAKA,EAAG,YAAY,MAEpB,OAAM,IAAI,MAAM,GAAGA,mCAAoC,MAGzD,OAAM,IAAI,UAAU,2BAA2BF,EAAQE,CAAE,IAAI,EAE/D,GAAM,CAACE,EAAKC,EAAKC,EAAIC,EAAIC,EAAMC,CAAI,EACjC,CAAC,IAAK,IAAK,IAAK,IAAK,I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",
6
+ "names": ["getType", "o", "isString", "text_chars_default", "uri_schemes_default", "HEX", "getUrlEncodedString", "str", "isString", "getType", "chars", "ch", "escapeUrlEncodedHtmlChars", "amp", "num", "lt", "gt", "quot", "apos", "escapedChar", "parseBase64", "data", "bin", "uint8arr", "c", "textChars", "text_chars_default", "parsedData", "URISchemes", "#schemes", "uri_schemes_default", "scheme", "uri", "res", "protocol", "schemeParts", "s", "URLSanitizer", "url", "opt", "sanitizedUrl", "allow", "deny", "escapeTags", "href", "pathname", "schemeMap", "items", "item", "bool", "key", "value", "regChars", "regAmp", "regEncodedChars", "type", "urlToSanitize", "header", "mediaType", "regDataUrl", "dataUrlArr", "arr", "i", "dataUrl", "parsedDataUrl", "dataArr", "l", "dataItem", "urlSanitizer", "isUri", "isURI", "sanitizeUrl", "sanitizeURL"]
7
7
  }
package/package.json CHANGED
@@ -24,7 +24,7 @@
24
24
  "bundle": "npm-run-all -s bundle-*",
25
25
  "bundle-src": "esbuild --format=esm --platform=browser --outfile=./dist/url-sanitizer.js --bundle --sourcemap ./index.js",
26
26
  "bundle-min": "esbuild --format=esm --platform=browser --outfile=./dist/url-sanitizer.min.js --bundle --minify --sourcemap ./index.js",
27
- "doc": "documentation build src/mjs/uri-util.js -f md -o doc.md",
27
+ "char": "node ./modules/index char -i",
28
28
  "include": "node ./modules/index include --dir=iana -i",
29
29
  "lint": "eslint --fix .",
30
30
  "test": "c8 --reporter=text mocha --exit test/*.test.js"
@@ -36,7 +36,6 @@
36
36
  "chai": "^4.3.7",
37
37
  "commander": "^10.0.0",
38
38
  "csvtojson": "^2.0.10",
39
- "documentation": "^14.0.1",
40
39
  "esbuild": "^0.17.4",
41
40
  "eslint": "^8.32.0",
42
41
  "eslint-config-standard": "^17.0.0",
@@ -46,11 +45,10 @@
46
45
  "eslint-plugin-node": "^11.1.0",
47
46
  "eslint-plugin-promise": "^6.1.1",
48
47
  "eslint-plugin-unicorn": "^45.0.2",
49
- "jsdoc-to-markdown": "^8.0.0",
50
48
  "mocha": "^10.2.0",
51
49
  "npm-run-all": "^4.1.5",
52
50
  "sinon": "^15.0.1",
53
- "undici": "^5.15.1"
51
+ "undici": "^5.15.2"
54
52
  },
55
- "version": "0.2.2"
53
+ "version": "0.2.3"
56
54
  }
@@ -0,0 +1,233 @@
1
+ [
2
+ 7,
3
+ 8,
4
+ 9,
5
+ 10,
6
+ 11,
7
+ 12,
8
+ 13,
9
+ 27,
10
+ 32,
11
+ 33,
12
+ 34,
13
+ 35,
14
+ 36,
15
+ 37,
16
+ 38,
17
+ 39,
18
+ 40,
19
+ 41,
20
+ 42,
21
+ 43,
22
+ 44,
23
+ 45,
24
+ 46,
25
+ 47,
26
+ 48,
27
+ 49,
28
+ 50,
29
+ 51,
30
+ 52,
31
+ 53,
32
+ 54,
33
+ 55,
34
+ 56,
35
+ 57,
36
+ 58,
37
+ 59,
38
+ 60,
39
+ 61,
40
+ 62,
41
+ 63,
42
+ 64,
43
+ 65,
44
+ 66,
45
+ 67,
46
+ 68,
47
+ 69,
48
+ 70,
49
+ 71,
50
+ 72,
51
+ 73,
52
+ 74,
53
+ 75,
54
+ 76,
55
+ 77,
56
+ 78,
57
+ 79,
58
+ 80,
59
+ 81,
60
+ 82,
61
+ 83,
62
+ 84,
63
+ 85,
64
+ 86,
65
+ 87,
66
+ 88,
67
+ 89,
68
+ 90,
69
+ 91,
70
+ 92,
71
+ 93,
72
+ 94,
73
+ 95,
74
+ 96,
75
+ 97,
76
+ 98,
77
+ 99,
78
+ 100,
79
+ 101,
80
+ 102,
81
+ 103,
82
+ 104,
83
+ 105,
84
+ 106,
85
+ 107,
86
+ 108,
87
+ 109,
88
+ 110,
89
+ 111,
90
+ 112,
91
+ 113,
92
+ 114,
93
+ 115,
94
+ 116,
95
+ 117,
96
+ 118,
97
+ 119,
98
+ 120,
99
+ 121,
100
+ 122,
101
+ 123,
102
+ 124,
103
+ 125,
104
+ 126,
105
+ 128,
106
+ 129,
107
+ 130,
108
+ 131,
109
+ 132,
110
+ 133,
111
+ 134,
112
+ 135,
113
+ 136,
114
+ 137,
115
+ 138,
116
+ 139,
117
+ 140,
118
+ 141,
119
+ 142,
120
+ 143,
121
+ 144,
122
+ 145,
123
+ 146,
124
+ 147,
125
+ 148,
126
+ 149,
127
+ 150,
128
+ 151,
129
+ 152,
130
+ 153,
131
+ 154,
132
+ 155,
133
+ 156,
134
+ 157,
135
+ 158,
136
+ 159,
137
+ 160,
138
+ 161,
139
+ 162,
140
+ 163,
141
+ 164,
142
+ 165,
143
+ 166,
144
+ 167,
145
+ 168,
146
+ 169,
147
+ 170,
148
+ 171,
149
+ 172,
150
+ 173,
151
+ 174,
152
+ 175,
153
+ 176,
154
+ 177,
155
+ 178,
156
+ 179,
157
+ 180,
158
+ 181,
159
+ 182,
160
+ 183,
161
+ 184,
162
+ 185,
163
+ 186,
164
+ 187,
165
+ 188,
166
+ 189,
167
+ 190,
168
+ 191,
169
+ 192,
170
+ 193,
171
+ 194,
172
+ 195,
173
+ 196,
174
+ 197,
175
+ 198,
176
+ 199,
177
+ 200,
178
+ 201,
179
+ 202,
180
+ 203,
181
+ 204,
182
+ 205,
183
+ 206,
184
+ 207,
185
+ 208,
186
+ 209,
187
+ 210,
188
+ 211,
189
+ 212,
190
+ 213,
191
+ 214,
192
+ 215,
193
+ 216,
194
+ 217,
195
+ 218,
196
+ 219,
197
+ 220,
198
+ 221,
199
+ 222,
200
+ 223,
201
+ 224,
202
+ 225,
203
+ 226,
204
+ 227,
205
+ 228,
206
+ 229,
207
+ 230,
208
+ 231,
209
+ 232,
210
+ 233,
211
+ 234,
212
+ 235,
213
+ 236,
214
+ 237,
215
+ 238,
216
+ 239,
217
+ 240,
218
+ 241,
219
+ 242,
220
+ 243,
221
+ 244,
222
+ 245,
223
+ 246,
224
+ 247,
225
+ 248,
226
+ 249,
227
+ 250,
228
+ 251,
229
+ 252,
230
+ 253,
231
+ 254,
232
+ 255
233
+ ]
@@ -4,6 +4,7 @@
4
4
 
5
5
  /* shared */
6
6
  import { getType, isString } from './common.js';
7
+ import textCharTable from '../lib/file/text-chars.json' assert { type: 'json' };
7
8
  import uriSchemes from '../lib/iana/uri-schemes.json' assert { type: 'json' };
8
9
 
9
10
  /* constants */
@@ -64,7 +65,6 @@ export const escapeUrlEncodedHtmlChars = ch => {
64
65
  /**
65
66
  * parse base64
66
67
  *
67
- * @see {@link https://github.com/file/file/blob/master/src/encoding.c}
68
68
  * @param {string} data - base64 data
69
69
  * @returns {string} - parsed data / base64 data
70
70
  */
@@ -74,13 +74,7 @@ export const parseBase64 = data => {
74
74
  }
75
75
  const bin = atob(data);
76
76
  const uint8arr = Uint8Array.from([...bin].map(c => c.charCodeAt(0)));
77
- const textChars = new Set([0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x1b]);
78
- for (let i = 0x20; i < 0x7f; i++) {
79
- textChars.add(i);
80
- }
81
- for (let i = 0x80; i <= 0xff; i++) {
82
- textChars.add(i);
83
- }
77
+ const textChars = new Set(textCharTable);
84
78
  let parsedData;
85
79
  if (uint8arr.every(c => textChars.has(c))) {
86
80
  parsedData = bin.replace(/\s/g, getUrlEncodedString);
@@ -265,8 +259,8 @@ export class URLSanitizer extends URISchemes {
265
259
  if (parsedDataUrl) {
266
260
  parsedData = parsedData.replace(dataUrl, parsedDataUrl);
267
261
  }
268
- type = 0;
269
262
  }
263
+ type = 0;
270
264
  }
271
265
  } else if (/data:[^,]*,/.test(parsedData) &&
272
266
  !(escapeTags ?? true)) {
@@ -310,6 +304,7 @@ export class URLSanitizer extends URISchemes {
310
304
  sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)
311
305
  .replace(regAmp, escapeUrlEncodedHtmlChars);
312
306
  break;
307
+ case 0:
313
308
  default:
314
309
  sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);
315
310
  }