url-sanitizer 0.2.1 → 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,16 +634,10 @@ 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
- parsedData = bin;
640
+ parsedData = bin.replace(/\s/g, getUrlEncodedString);
412
641
  } else {
413
642
  parsedData = data;
414
643
  }
@@ -428,7 +657,7 @@ var URISchemes = class {
428
657
  *
429
658
  * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}
430
659
  * - Historical schemes omitted
431
- * - Added 'moz-extension' scheme by default
660
+ * - 'moz-extension' scheme added
432
661
  * @returns {Array.<string>} - array of schemes
433
662
  */
434
663
  get() {
@@ -542,26 +771,80 @@ var URLSanitizer = class extends URISchemes {
542
771
  }
543
772
  }
544
773
  if (bool) {
774
+ const [amp, lt, gt, quot, apos] = ["&", "<", ">", '"', "'"].map(getUrlEncodedString);
775
+ const regChars = /[<>"']/g;
776
+ const regAmp = new RegExp(amp, "g");
777
+ const regEncodedChars = new RegExp(`(${lt}|${gt}|${quot}|${apos})`, "g");
778
+ let type;
545
779
  let urlToSanitize = href;
546
780
  if (schemeParts.includes("data")) {
547
781
  const [header, data] = pathname.split(",");
548
782
  const mediaType = header.split(";");
549
783
  const isBase64 = mediaType.pop() === "base64";
550
784
  if (isBase64) {
551
- const parsedData = parseBase64(data);
785
+ let parsedData = parseBase64(data);
552
786
  if (parsedData !== data) {
787
+ const regDataUrl = /data:[^,]*;?base64,[\dA-Za-z+/\-_=]+/g;
788
+ if (regDataUrl.test(parsedData)) {
789
+ const dataUrlArr = [];
790
+ let arr = regDataUrl.exec(parsedData);
791
+ do {
792
+ if (arr) {
793
+ dataUrlArr.push(arr);
794
+ }
795
+ } while (arr = regDataUrl.exec(parsedData));
796
+ if (dataUrlArr.length) {
797
+ for (const i of dataUrlArr) {
798
+ const [dataUrl] = i;
799
+ const parsedDataUrl = this.sanitize(dataUrl, {
800
+ allow: ["data"]
801
+ });
802
+ if (parsedDataUrl) {
803
+ parsedData = parsedData.replace(dataUrl, parsedDataUrl);
804
+ }
805
+ }
806
+ type = 0;
807
+ }
808
+ } else if (/data:[^,]*,/.test(parsedData) && !(escapeTags ?? true)) {
809
+ const dataArr = parsedData.split(/data:[^,]*,/);
810
+ const l = dataArr.length;
811
+ let i = 1;
812
+ while (i < l) {
813
+ const dataItem = dataArr[i].replace(regEncodedChars, escapeUrlEncodedHtmlChars);
814
+ parsedData = parsedData.replace(dataArr[i], dataItem);
815
+ i++;
816
+ }
817
+ type = 0;
818
+ }
553
819
  urlToSanitize = `${scheme}:${mediaType.join(";")},${parsedData}`;
820
+ if (escapeTags ?? true) {
821
+ type = 1;
822
+ } else if (!Number.isInteger(type)) {
823
+ type = 2;
824
+ }
825
+ } else if (escapeTags ?? true) {
826
+ type = 1;
827
+ } else {
828
+ type = 2;
554
829
  }
830
+ } else if (escapeTags ?? true) {
831
+ type = 1;
832
+ } else {
833
+ type = 2;
555
834
  }
556
- }
557
- const [amp, lt, gt, quot, apos] = ["&", "<", ">", '"', "'"].map(getUrlEncodedString);
558
- const regChars = /[<>"']/g;
559
- const regAmp = new RegExp(amp, "g");
560
- const regEncodedChars = new RegExp(`(${lt}|${gt}|${quot}|${apos})`, "g");
561
- if (schemeParts.includes("data") && !(escapeTags ?? true)) {
562
- sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString).replace(regAmp, escapeUrlEncodedHtmlChars);
563
835
  } else {
564
- sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString).replace(regAmp, escapeUrlEncodedHtmlChars).replace(regEncodedChars, escapeUrlEncodedHtmlChars);
836
+ type = 1;
837
+ }
838
+ switch (type) {
839
+ case 1:
840
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString).replace(regAmp, escapeUrlEncodedHtmlChars).replace(regEncodedChars, escapeUrlEncodedHtmlChars);
841
+ break;
842
+ case 2:
843
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString).replace(regAmp, escapeUrlEncodedHtmlChars);
844
+ break;
845
+ case 0:
846
+ default:
847
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);
565
848
  }
566
849
  }
567
850
  }
@@ -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;\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 * - Added 'moz-extension' scheme by default\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 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 const parsedData = parseBase64(data);\n if (parsedData !== data) {\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n }\n }\n }\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 if (schemeParts.includes('data') && !(escapeTags ?? true)) {\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars);\n } else {\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars)\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\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 async\n *\n * @param {string} uri - URI input\n * @returns {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 async\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {?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 l=e=>Object.prototype.toString.call(e).slice(8,-1),c=e=>typeof e=="string"||e instanceof String;var S=["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 M=16,f=e=>{if(!c(e))throw new TypeError(`Expected String but got ${l(e)}.`);let s=[];for(let i of e)s.push(`%${i.charCodeAt(0).toString(M).toUpperCase()}`);return s.join("")},x=e=>{if(c(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 ${l(e)}.`);let[s,i,a,o,t,m]=["&","#","<",">",'"',"'"].map(f),p;return e===s?p=`${s}amp;`:e===a?p=`${s}lt;`:e===o?p=`${s}gt;`:e===t?p=`${s}quot;`:e===m?p=`${s}${i}39;`:p=e,p},Y=e=>{if(!c(e))throw new TypeError(`Expected String but got ${l(e)}.`);let s=atob(e),i=Uint8Array.from([...s].map(t=>t.charCodeAt(0))),a=new Set([7,8,9,10,11,12,13,27]);for(let t=32;t<127;t++)a.add(t);for(let t=128;t<=255;t++)a.add(t);let o;return i.every(t=>a.has(t))?o=s:o=e,o},y=class{#e;constructor(){this.#e=new Set(S)}get(){return[...this.#e]}has(s){return this.#e.has(s)}add(s){if(c(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 ${l(s)}.`);return this.#e.add(s),[...this.#e]}remove(s){return this.#e.delete(s)}isURI(s){let i;if(c(s))try{let{protocol:a}=new URL(s),o=a.replace(/:$/,""),t=o.split("+");i=/^(?:ext|web)\+[a-z]+$/.test(o)||t.every(m=>this.#e.has(m))}catch{i=!1}return!!i}},b=class extends y{sanitize(s,i={allow:[],deny:[],escapeTags:!0}){let a;if(super.isURI(s)){let{allow:o,deny:t,escapeTags:m}=i??{},{href:p,pathname:j,protocol:A}=new URL(s),g=A.replace(/:$/,""),u=g.split("+"),d=new Map([["data",!1],["file",!1]]);if(Array.isArray(o)&&o.length){let n=Object.values(o);for(let r of n)c(r)&&(r=r.trim(),/(?:java|vb)script/.test(r)?d.set(r,!1):r&&d.set(r,!0))}if(Array.isArray(t)&&t.length){let n=Object.values(t);for(let r of n)c(r)&&(r=r.trim(),r&&d.set(r,!1))}let h;for(let[n,r]of d.entries())if(h=r||g!==n&&u.every(w=>w!==n),!h)break;if(h){let n=p;if(u.includes("data")){let[L,z]=j.split(","),E=L.split(";");if(E.pop()==="base64"){let U=Y(z);U!==z&&(n=`${g}:${E.join(";")},${U}`)}}let[r,w,C,q,I]=["&","<",">",'"',"'"].map(f),k=/[<>"']/g,$=new RegExp(r,"g"),O=new RegExp(`(${w}|${C}|${q}|${I})`,"g");u.includes("data")&&!(m??!0)?a=n.replace(k,f).replace($,x):a=n.replace(k,f).replace($,x).replace(O,x)}}return a||null}},v=new b,T=e=>v.isURI(e),_=async e=>await T(e),R=(e,s)=>v.sanitize(e,s??{allow:[],deny:[],escapeTags:!0}),B=async(e,s)=>await R(e,s);export{v as default,_ as isURI,T as isURISync,B as sanitizeURL,R 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;\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 * - Added 'moz-extension' scheme by default\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 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 const parsedData = parseBase64(data);\n if (parsedData !== data) {\n urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;\n }\n }\n }\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 if (schemeParts.includes('data') && !(escapeTags ?? true)) {\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars);\n } else {\n sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)\n .replace(regAmp, escapeUrlEncodedHtmlChars)\n .replace(regEncodedChars, escapeUrlEncodedHtmlChars);\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 async\n *\n * @param {string} uri - URI input\n * @returns {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 async\n *\n * @param {string} url - URL input\n * @param {object} opt - options\n * @returns {?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", "urlToSanitize", "header", "mediaType", "regChars", "regAmp", "regEncodedChars", "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,21 +36,19 @@
36
36
  "chai": "^4.3.7",
37
37
  "commander": "^10.0.0",
38
38
  "csvtojson": "^2.0.10",
39
- "documentation": "^14.0.1",
40
- "esbuild": "^0.17.3",
39
+ "esbuild": "^0.17.4",
41
40
  "eslint": "^8.32.0",
42
41
  "eslint-config-standard": "^17.0.0",
43
- "eslint-plugin-import": "^2.27.4",
44
- "eslint-plugin-jsdoc": "^39.6.4",
42
+ "eslint-plugin-import": "^2.27.5",
43
+ "eslint-plugin-jsdoc": "^39.6.7",
45
44
  "eslint-plugin-n": "^15.6.1",
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.0"
51
+ "undici": "^5.15.2"
54
52
  },
55
- "version": "0.2.1"
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,16 +74,10 @@ 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
- parsedData = bin;
80
+ parsedData = bin.replace(/\s/g, getUrlEncodedString);
87
81
  } else {
88
82
  parsedData = data;
89
83
  }
@@ -232,31 +226,87 @@ export class URLSanitizer extends URISchemes {
232
226
  }
233
227
  }
234
228
  if (bool) {
229
+ const [amp, lt, gt, quot, apos] =
230
+ ['&', '<', '>', '"', "'"].map(getUrlEncodedString);
231
+ const regChars = /[<>"']/g;
232
+ const regAmp = new RegExp(amp, 'g');
233
+ const regEncodedChars =
234
+ new RegExp(`(${lt}|${gt}|${quot}|${apos})`, 'g');
235
+ let type;
235
236
  let urlToSanitize = href;
236
237
  if (schemeParts.includes('data')) {
237
238
  const [header, data] = pathname.split(',');
238
239
  const mediaType = header.split(';');
239
240
  const isBase64 = mediaType.pop() === 'base64';
240
241
  if (isBase64) {
241
- const parsedData = parseBase64(data);
242
+ let parsedData = parseBase64(data);
242
243
  if (parsedData !== data) {
244
+ const regDataUrl = /data:[^,]*;?base64,[\dA-Za-z+/\-_=]+/g;
245
+ if (regDataUrl.test(parsedData)) {
246
+ const dataUrlArr = [];
247
+ let arr = regDataUrl.exec(parsedData);
248
+ do {
249
+ if (arr) {
250
+ dataUrlArr.push(arr);
251
+ }
252
+ } while ((arr = regDataUrl.exec(parsedData)));
253
+ if (dataUrlArr.length) {
254
+ for (const i of dataUrlArr) {
255
+ const [dataUrl] = i;
256
+ const parsedDataUrl = this.sanitize(dataUrl, {
257
+ allow: ['data']
258
+ });
259
+ if (parsedDataUrl) {
260
+ parsedData = parsedData.replace(dataUrl, parsedDataUrl);
261
+ }
262
+ }
263
+ type = 0;
264
+ }
265
+ } else if (/data:[^,]*,/.test(parsedData) &&
266
+ !(escapeTags ?? true)) {
267
+ const dataArr = parsedData.split(/data:[^,]*,/);
268
+ const l = dataArr.length;
269
+ let i = 1;
270
+ while (i < l) {
271
+ const dataItem = dataArr[i]
272
+ .replace(regEncodedChars, escapeUrlEncodedHtmlChars);
273
+ parsedData = parsedData.replace(dataArr[i], dataItem);
274
+ i++;
275
+ }
276
+ type = 0;
277
+ }
243
278
  urlToSanitize = `${scheme}:${mediaType.join(';')},${parsedData}`;
279
+ if ((escapeTags ?? true)) {
280
+ type = 1;
281
+ } else if (!Number.isInteger(type)) {
282
+ type = 2;
283
+ }
284
+ } else if ((escapeTags ?? true)) {
285
+ type = 1;
286
+ } else {
287
+ type = 2;
244
288
  }
289
+ } else if ((escapeTags ?? true)) {
290
+ type = 1;
291
+ } else {
292
+ type = 2;
245
293
  }
246
- }
247
- const [amp, lt, gt, quot, apos] =
248
- ['&', '<', '>', '"', "'"].map(getUrlEncodedString);
249
- const regChars = /[<>"']/g;
250
- const regAmp = new RegExp(amp, 'g');
251
- const regEncodedChars =
252
- new RegExp(`(${lt}|${gt}|${quot}|${apos})`, 'g');
253
- if (schemeParts.includes('data') && !(escapeTags ?? true)) {
254
- sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)
255
- .replace(regAmp, escapeUrlEncodedHtmlChars);
256
294
  } else {
257
- sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)
258
- .replace(regAmp, escapeUrlEncodedHtmlChars)
259
- .replace(regEncodedChars, escapeUrlEncodedHtmlChars);
295
+ type = 1;
296
+ }
297
+ switch (type) {
298
+ case 1:
299
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)
300
+ .replace(regAmp, escapeUrlEncodedHtmlChars)
301
+ .replace(regEncodedChars, escapeUrlEncodedHtmlChars);
302
+ break;
303
+ case 2:
304
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString)
305
+ .replace(regAmp, escapeUrlEncodedHtmlChars);
306
+ break;
307
+ case 0:
308
+ default:
309
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString);
260
310
  }
261
311
  }
262
312
  }