url-sanitizer 0.1.1

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.
@@ -0,0 +1,593 @@
1
+ // src/mjs/common.js
2
+ var TYPE_FROM = 8;
3
+ var TYPE_TO = -1;
4
+ var getType = (o) => Object.prototype.toString.call(o).slice(TYPE_FROM, TYPE_TO);
5
+ var isString = (o) => typeof o === "string" || o instanceof String;
6
+
7
+ // src/lib/iana/uri-schemes.json
8
+ var uri_schemes_default = [
9
+ "aaa",
10
+ "aaas",
11
+ "about",
12
+ "acap",
13
+ "acct",
14
+ "acd",
15
+ "acr",
16
+ "adiumxtra",
17
+ "adt",
18
+ "afp",
19
+ "afs",
20
+ "aim",
21
+ "amss",
22
+ "android",
23
+ "appdata",
24
+ "apt",
25
+ "ar",
26
+ "ark",
27
+ "attachment",
28
+ "aw",
29
+ "barion",
30
+ "beshare",
31
+ "bitcoin",
32
+ "bitcoincash",
33
+ "blob",
34
+ "bolo",
35
+ "browserext",
36
+ "cabal",
37
+ "calculator",
38
+ "callto",
39
+ "cap",
40
+ "cast",
41
+ "casts",
42
+ "chrome",
43
+ "chrome-extension",
44
+ "cid",
45
+ "coap",
46
+ "coaps",
47
+ "com-eventbrite-attendee",
48
+ "content",
49
+ "content-type",
50
+ "crid",
51
+ "cstr",
52
+ "cvs",
53
+ "dab",
54
+ "dat",
55
+ "data",
56
+ "dav",
57
+ "diaspora",
58
+ "dict",
59
+ "did",
60
+ "dis",
61
+ "dlna-playcontainer",
62
+ "dlna-playsingle",
63
+ "dns",
64
+ "dntp",
65
+ "doi",
66
+ "dpp",
67
+ "drm",
68
+ "dtmi",
69
+ "dtn",
70
+ "dvb",
71
+ "dvx",
72
+ "dweb",
73
+ "ed2k",
74
+ "eid",
75
+ "elsi",
76
+ "embedded",
77
+ "ens",
78
+ "ethereum",
79
+ "example",
80
+ "facetime",
81
+ "feed",
82
+ "feedready",
83
+ "fido",
84
+ "file",
85
+ "finger",
86
+ "first-run-pen-experience",
87
+ "fish",
88
+ "fm",
89
+ "ftp",
90
+ "fuchsia-pkg",
91
+ "geo",
92
+ "gg",
93
+ "git",
94
+ "gitoid",
95
+ "gizmoproject",
96
+ "go",
97
+ "gopher",
98
+ "graph",
99
+ "gtalk",
100
+ "h323",
101
+ "ham",
102
+ "hcap",
103
+ "hcp",
104
+ "http",
105
+ "https",
106
+ "hxxp",
107
+ "hxxps",
108
+ "hydrazone",
109
+ "hyper",
110
+ "iax",
111
+ "icap",
112
+ "icon",
113
+ "im",
114
+ "imap",
115
+ "info",
116
+ "iotdisco",
117
+ "ipfs",
118
+ "ipn",
119
+ "ipns",
120
+ "ipp",
121
+ "ipps",
122
+ "irc",
123
+ "irc6",
124
+ "ircs",
125
+ "iris",
126
+ "iris.beep",
127
+ "iris.lwz",
128
+ "iris.xpc",
129
+ "iris.xpcs",
130
+ "isostore",
131
+ "itms",
132
+ "jabber",
133
+ "jar",
134
+ "jms",
135
+ "keyparc",
136
+ "lastfm",
137
+ "lbry",
138
+ "ldap",
139
+ "ldaps",
140
+ "leaptofrogans",
141
+ "lorawan",
142
+ "lpa",
143
+ "lvlt",
144
+ "magnet",
145
+ "mailto",
146
+ "maps",
147
+ "market",
148
+ "matrix",
149
+ "message",
150
+ "microsoft.windows.camera",
151
+ "microsoft.windows.camera.multipicker",
152
+ "microsoft.windows.camera.picker",
153
+ "mid",
154
+ "mms",
155
+ "mongodb",
156
+ "moz",
157
+ "moz-extension",
158
+ "ms-access",
159
+ "ms-appinstaller",
160
+ "ms-browser-extension",
161
+ "ms-calculator",
162
+ "ms-drive-to",
163
+ "ms-enrollment",
164
+ "ms-excel",
165
+ "ms-eyecontrolspeech",
166
+ "ms-gamebarservices",
167
+ "ms-gamingoverlay",
168
+ "ms-getoffice",
169
+ "ms-help",
170
+ "ms-infopath",
171
+ "ms-inputapp",
172
+ "ms-lockscreencomponent-config",
173
+ "ms-media-stream-id",
174
+ "ms-meetnow",
175
+ "ms-mixedrealitycapture",
176
+ "ms-mobileplans",
177
+ "ms-newsandinterests",
178
+ "ms-officeapp",
179
+ "ms-people",
180
+ "ms-powerpoint",
181
+ "ms-project",
182
+ "ms-publisher",
183
+ "ms-remotedesktop-launch",
184
+ "ms-restoretabcompanion",
185
+ "ms-screenclip",
186
+ "ms-screensketch",
187
+ "ms-search",
188
+ "ms-search-repair",
189
+ "ms-secondary-screen-controller",
190
+ "ms-secondary-screen-setup",
191
+ "ms-settings",
192
+ "ms-settings-airplanemode",
193
+ "ms-settings-bluetooth",
194
+ "ms-settings-camera",
195
+ "ms-settings-cellular",
196
+ "ms-settings-cloudstorage",
197
+ "ms-settings-connectabledevices",
198
+ "ms-settings-displays-topology",
199
+ "ms-settings-emailandaccounts",
200
+ "ms-settings-language",
201
+ "ms-settings-location",
202
+ "ms-settings-lock",
203
+ "ms-settings-nfctransactions",
204
+ "ms-settings-notifications",
205
+ "ms-settings-power",
206
+ "ms-settings-privacy",
207
+ "ms-settings-proximity",
208
+ "ms-settings-screenrotation",
209
+ "ms-settings-wifi",
210
+ "ms-settings-workplace",
211
+ "ms-spd",
212
+ "ms-stickers",
213
+ "ms-sttoverlay",
214
+ "ms-transit-to",
215
+ "ms-useractivityset",
216
+ "ms-virtualtouchpad",
217
+ "ms-visio",
218
+ "ms-walk-to",
219
+ "ms-whiteboard",
220
+ "ms-whiteboard-cmd",
221
+ "ms-word",
222
+ "msnim",
223
+ "msrp",
224
+ "msrps",
225
+ "mss",
226
+ "mt",
227
+ "mtqp",
228
+ "mumble",
229
+ "mupdate",
230
+ "mvn",
231
+ "news",
232
+ "nfs",
233
+ "ni",
234
+ "nih",
235
+ "nntp",
236
+ "notes",
237
+ "num",
238
+ "ocf",
239
+ "oid",
240
+ "onenote",
241
+ "onenote-cmd",
242
+ "opaquelocktoken",
243
+ "openpgp4fpr",
244
+ "otpauth",
245
+ "palm",
246
+ "paparazzi",
247
+ "payment",
248
+ "payto",
249
+ "pkcs11",
250
+ "platform",
251
+ "pop",
252
+ "pres",
253
+ "proxy",
254
+ "psyc",
255
+ "pttp",
256
+ "pwid",
257
+ "qb",
258
+ "query",
259
+ "quic-transport",
260
+ "redis",
261
+ "rediss",
262
+ "reload",
263
+ "res",
264
+ "resource",
265
+ "rmi",
266
+ "rsync",
267
+ "rtmfp",
268
+ "rtmp",
269
+ "rtsp",
270
+ "rtsps",
271
+ "rtspu",
272
+ "sarif",
273
+ "secondlife",
274
+ "secret-token",
275
+ "service",
276
+ "session",
277
+ "sftp",
278
+ "sgn",
279
+ "shc",
280
+ "sieve",
281
+ "simpleledger",
282
+ "simplex",
283
+ "sip",
284
+ "sips",
285
+ "skype",
286
+ "smb",
287
+ "smp",
288
+ "sms",
289
+ "smtp",
290
+ "snmp",
291
+ "soap.beep",
292
+ "soap.beeps",
293
+ "soldat",
294
+ "spiffe",
295
+ "spotify",
296
+ "ssb",
297
+ "ssh",
298
+ "starknet",
299
+ "steam",
300
+ "stun",
301
+ "stuns",
302
+ "submit",
303
+ "svn",
304
+ "swh",
305
+ "swid",
306
+ "swidpath",
307
+ "tag",
308
+ "taler",
309
+ "teamspeak",
310
+ "tel",
311
+ "teliaeid",
312
+ "telnet",
313
+ "tftp",
314
+ "things",
315
+ "thismessage",
316
+ "tip",
317
+ "tn3270",
318
+ "tool",
319
+ "turn",
320
+ "turns",
321
+ "tv",
322
+ "udp",
323
+ "unreal",
324
+ "urn",
325
+ "ut2004",
326
+ "uuid-in-package",
327
+ "v-event",
328
+ "vemmi",
329
+ "ventrilo",
330
+ "ves",
331
+ "view-source",
332
+ "vnc",
333
+ "vscode",
334
+ "vscode-insiders",
335
+ "vsls",
336
+ "w3",
337
+ "wcr",
338
+ "web3",
339
+ "webcal",
340
+ "wifi",
341
+ "ws",
342
+ "wss",
343
+ "wtai",
344
+ "wyciwyg",
345
+ "xcon",
346
+ "xcon-userid",
347
+ "xfire",
348
+ "xmlrpc.beep",
349
+ "xmlrpc.beeps",
350
+ "xmpp",
351
+ "xri",
352
+ "ymsgr",
353
+ "z39.50r",
354
+ "z39.50s"
355
+ ];
356
+
357
+ // src/mjs/uri-util.js
358
+ var HEX = 16;
359
+ var getUrlEncodedString = (str) => {
360
+ if (!isString(str)) {
361
+ throw new TypeError(`Expected String but got ${getType(str)}.`);
362
+ }
363
+ const chars = [];
364
+ for (const ch of str) {
365
+ chars.push(`%${ch.charCodeAt(0).toString(HEX).toUpperCase()}`);
366
+ }
367
+ return chars.join("");
368
+ };
369
+ var escapeUrlEncodedHtmlChars = (ch) => {
370
+ if (isString(ch)) {
371
+ if (/^%[\dA-F]{2}$/i.test(ch)) {
372
+ ch = ch.toUpperCase();
373
+ } else {
374
+ throw new Error(`${ch} is not a URL encoded character.`);
375
+ }
376
+ } else {
377
+ throw new TypeError(`Expected String but got ${getType(ch)}.`);
378
+ }
379
+ const [amp, num, lt, gt, quot, apos] = ["&", "#", "<", ">", '"', "'"].map(getUrlEncodedString);
380
+ let escapedChar;
381
+ if (ch === amp) {
382
+ escapedChar = `${amp}amp;`;
383
+ } else if (ch === lt) {
384
+ escapedChar = `${amp}lt;`;
385
+ } else if (ch === gt) {
386
+ escapedChar = `${amp}gt;`;
387
+ } else if (ch === quot) {
388
+ escapedChar = `${amp}quot;`;
389
+ } else if (ch === apos) {
390
+ escapedChar = `${amp}${num}39;`;
391
+ } else {
392
+ escapedChar = ch;
393
+ }
394
+ return escapedChar;
395
+ };
396
+ var parseBase64 = (data) => {
397
+ if (!isString(data)) {
398
+ throw new TypeError(`Expected String but got ${getType(data)}.`);
399
+ }
400
+ const bin = atob(data);
401
+ 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
+ }
409
+ let parsedData;
410
+ if (uint8arr.every((c) => textChars.has(c))) {
411
+ parsedData = bin;
412
+ } else {
413
+ parsedData = data;
414
+ }
415
+ return parsedData;
416
+ };
417
+ var URISchemes = class {
418
+ /* private fields */
419
+ #schemes;
420
+ /**
421
+ * construct
422
+ */
423
+ constructor() {
424
+ this.#schemes = new Set(uri_schemes_default);
425
+ }
426
+ /**
427
+ * get schemes
428
+ *
429
+ * @see {@link https://www.iana.org/assignments/uri-schemes/uri-schemes.xhtml}
430
+ * - Historical schemes omitted
431
+ * - Added 'moz-extension' scheme by default
432
+ * @returns {Array.<string>} - array of schemes
433
+ */
434
+ get() {
435
+ return [...this.#schemes];
436
+ }
437
+ /**
438
+ * has scheme
439
+ *
440
+ * @param {string} scheme - scheme
441
+ * @returns {boolean} - result
442
+ */
443
+ has(scheme) {
444
+ return this.#schemes.has(scheme);
445
+ }
446
+ /**
447
+ * add scheme
448
+ * NOTE: `javascript` and/or `vbscript` schemes can not be registered
449
+ *
450
+ * @param {string} scheme - scheme
451
+ * @returns {Array.<string>} - array of schemes
452
+ */
453
+ add(scheme) {
454
+ if (!isString(scheme)) {
455
+ throw new TypeError(`Expected String but got ${getType(scheme)}.`);
456
+ } else if (/(?:java|vb)script/.test(scheme) || !/^[a-z][a-z0-9+\-.]*$/.test(scheme)) {
457
+ throw new Error(`Invalid scheme: ${scheme}`);
458
+ }
459
+ this.#schemes.add(scheme);
460
+ return [...this.#schemes];
461
+ }
462
+ /**
463
+ * remove scheme
464
+ *
465
+ * @param {string} scheme - scheme
466
+ * @returns {boolean} - result
467
+ */
468
+ remove(scheme) {
469
+ return this.#schemes.delete(scheme);
470
+ }
471
+ /**
472
+ * is URI
473
+ *
474
+ * @param {string} uri - URI input
475
+ * @returns {boolean} - result
476
+ */
477
+ isURI(uri) {
478
+ let res;
479
+ if (isString(uri)) {
480
+ try {
481
+ const { protocol } = new URL(uri);
482
+ const scheme = protocol.replace(/:$/, "");
483
+ const schemeParts = scheme.split("+");
484
+ res = /^(?:ext|web)\+[a-z]+$/.test(scheme) || schemeParts.every((s) => this.#schemes.has(s));
485
+ } catch (e) {
486
+ res = false;
487
+ }
488
+ }
489
+ return !!res;
490
+ }
491
+ };
492
+ var URLSanitizer = class extends URISchemes {
493
+ /**
494
+ * sanitize URL
495
+ * NOTE: `data` and/or `file` schemes must be explicitly allowed
496
+ * `javascript` and/or `vbscript` schemes can not be allowed
497
+ *
498
+ * @param {string} url - URL input
499
+ * @param {object} opt - options
500
+ * @param {Array.<string>} opt.allow - array of allowed schemes
501
+ * @param {Array.<string>} opt.deny - array of denied schemes
502
+ * @param {boolean} opt.escapeTags - escape tags and quotes in data URL
503
+ * @returns {?string} - sanitized URL
504
+ */
505
+ sanitize(url, opt = { allow: [], deny: [], escapeTags: true }) {
506
+ let sanitizedUrl;
507
+ if (super.isURI(url)) {
508
+ const { allow, deny, escapeTags } = opt ?? {};
509
+ const { href, pathname, protocol } = new URL(url);
510
+ const scheme = protocol.replace(/:$/, "");
511
+ const schemeParts = scheme.split("+");
512
+ const schemeMap = /* @__PURE__ */ new Map([["data", false], ["file", false]]);
513
+ if (Array.isArray(allow) && allow.length) {
514
+ const items = Object.values(allow);
515
+ for (let item of items) {
516
+ if (isString(item)) {
517
+ item = item.trim();
518
+ if (/(?:java|vb)script/.test(item)) {
519
+ schemeMap.set(item, false);
520
+ } else if (item) {
521
+ schemeMap.set(item, true);
522
+ }
523
+ }
524
+ }
525
+ }
526
+ if (Array.isArray(deny) && deny.length) {
527
+ const items = Object.values(deny);
528
+ for (let item of items) {
529
+ if (isString(item)) {
530
+ item = item.trim();
531
+ if (item) {
532
+ schemeMap.set(item, false);
533
+ }
534
+ }
535
+ }
536
+ }
537
+ let bool;
538
+ for (const [key, value] of schemeMap.entries()) {
539
+ bool = value || scheme !== key && schemeParts.every((s) => s !== key);
540
+ if (!bool) {
541
+ break;
542
+ }
543
+ }
544
+ if (bool) {
545
+ let urlToSanitize = href;
546
+ if (schemeParts.includes("data")) {
547
+ const [header, data] = pathname.split(",");
548
+ const mediaType = header.split(";");
549
+ const isBase64 = mediaType.pop() === "base64";
550
+ if (isBase64) {
551
+ const parsedData = parseBase64(data);
552
+ if (parsedData !== data) {
553
+ urlToSanitize = `${scheme}:${mediaType.join(";")},${parsedData}`;
554
+ }
555
+ }
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
+ } else {
564
+ sanitizedUrl = urlToSanitize.replace(regChars, getUrlEncodedString).replace(regAmp, escapeUrlEncodedHtmlChars).replace(regEncodedChars, escapeUrlEncodedHtmlChars);
565
+ }
566
+ }
567
+ }
568
+ return sanitizedUrl || null;
569
+ }
570
+ };
571
+ var urlSanitizer = new URLSanitizer();
572
+ var isUri = (uri) => urlSanitizer.isURI(uri);
573
+ var isURI = async (uri) => {
574
+ const res = await isUri(uri);
575
+ return res;
576
+ };
577
+ var sanitizeUrl = (url, opt) => urlSanitizer.sanitize(url, opt ?? {
578
+ allow: [],
579
+ deny: [],
580
+ escapeTags: true
581
+ });
582
+ var sanitizeURL = async (url, opt) => {
583
+ const res = await sanitizeUrl(url, opt);
584
+ return res;
585
+ };
586
+ export {
587
+ urlSanitizer as default,
588
+ isURI,
589
+ isUri as isURISync,
590
+ sanitizeURL,
591
+ sanitizeUrl as sanitizeURLSync
592
+ };
593
+ //# sourceMappingURL=url-sanitizer.js.map
@@ -0,0 +1,7 @@
1
+ {
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;AAAA,EACA;AACF;;;AClVA,IAAM,MAAM;AAQL,IAAM,sBAAsB,SAAO;AACxC,MAAI,CAAC,SAAS,GAAG,GAAG;AAClB,UAAM,IAAI,UAAU,2BAA2B,QAAQ,GAAG,IAAI;AAAA,EAChE;AACA,QAAM,QAAQ,CAAC;AACf,aAAW,MAAM,KAAK;AACpB,UAAM,KAAK,IAAI,GAAG,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,YAAY,GAAG;AAAA,EAC/D;AACA,SAAO,MAAM,KAAK,EAAE;AACtB;AAQO,IAAM,4BAA4B,QAAM;AAC7C,MAAI,SAAS,EAAE,GAAG;AAChB,QAAI,iBAAiB,KAAK,EAAE,GAAG;AAC7B,WAAK,GAAG,YAAY;AAAA,IACtB,OAAO;AACL,YAAM,IAAI,MAAM,GAAG,oCAAoC;AAAA,IACzD;AAAA,EACF,OAAO;AACL,UAAM,IAAI,UAAU,2BAA2B,QAAQ,EAAE,IAAI;AAAA,EAC/D;AACA,QAAM,CAAC,KAAK,KAAK,IAAI,IAAI,MAAM,IAAI,IACjC,CAAC,KAAK,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,mBAAmB;AACxD,MAAI;AACJ,MAAI,OAAO,KAAK;AACd,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,IAAI;AACpB,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,IAAI;AACpB,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,MAAM;AACtB,kBAAc,GAAG;AAAA,EACnB,WAAW,OAAO,MAAM;AACtB,kBAAc,GAAG,MAAM;AAAA,EACzB,OAAO;AACL,kBAAc;AAAA,EAChB;AACA,SAAO;AACT;AASO,IAAM,cAAc,UAAQ;AACjC,MAAI,CAAC,SAAS,IAAI,GAAG;AACnB,UAAM,IAAI,UAAU,2BAA2B,QAAQ,IAAI,IAAI;AAAA,EACjE;AACA,QAAM,MAAM,KAAK,IAAI;AACrB,QAAM,WAAW,WAAW,KAAK,CAAC,GAAG,GAAG,EAAE,IAAI,OAAK,EAAE,WAAW,CAAC,CAAC,CAAC;AACnE,QAAM,YAAY,oBAAI,IAAI,CAAC,GAAM,GAAM,GAAM,IAAM,IAAM,IAAM,IAAM,EAAI,CAAC;AAC1E,WAAS,IAAI,IAAM,IAAI,KAAM,KAAK;AAChC,cAAU,IAAI,CAAC;AAAA,EACjB;AACA,WAAS,IAAI,KAAM,KAAK,KAAM,KAAK;AACjC,cAAU,IAAI,CAAC;AAAA,EACjB;AACA,MAAI;AACJ,MAAI,SAAS,MAAM,OAAK,UAAU,IAAI,CAAC,CAAC,GAAG;AACzC,iBAAa;AAAA,EACf,OAAO;AACL,iBAAa;AAAA,EACf;AACA,SAAO;AACT;AAMO,IAAM,aAAN,MAAiB;AAAA;AAAA,EAEtB;AAAA;AAAA;AAAA;AAAA,EAKA,cAAc;AACZ,SAAK,WAAW,IAAI,IAAI,mBAAU;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,MAAM;AACJ,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,IAAI,QAAQ;AACV,WAAO,KAAK,SAAS,IAAI,MAAM;AAAA,EACjC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,QAAQ;AACV,QAAI,CAAC,SAAS,MAAM,GAAG;AACrB,YAAM,IAAI,UAAU,2BAA2B,QAAQ,MAAM,IAAI;AAAA,IACnE,WAAW,oBAAoB,KAAK,MAAM,KAC/B,CAAC,uBAAuB,KAAK,MAAM,GAAG;AAC/C,YAAM,IAAI,MAAM,mBAAmB,QAAQ;AAAA,IAC7C;AACA,SAAK,SAAS,IAAI,MAAM;AACxB,WAAO,CAAC,GAAG,KAAK,QAAQ;AAAA,EAC1B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,QAAQ;AACb,WAAO,KAAK,SAAS,OAAO,MAAM;AAAA,EACpC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,KAAK;AACT,QAAI;AACJ,QAAI,SAAS,GAAG,GAAG;AACjB,UAAI;AACF,cAAM,EAAE,SAAS,IAAI,IAAI,IAAI,GAAG;AAChC,cAAM,SAAS,SAAS,QAAQ,MAAM,EAAE;AACxC,cAAM,cAAc,OAAO,MAAM,GAAG;AACpC,cAAM,wBAAwB,KAAK,MAAM,KACnC,YAAY,MAAM,OAAK,KAAK,SAAS,IAAI,CAAC,CAAC;AAAA,MACnD,SAAS,GAAP;AACA,cAAM;AAAA,MACR;AAAA,IACF;AACA,WAAO,CAAC,CAAC;AAAA,EACX;AACF;AAGO,IAAM,eAAN,cAA2B,WAAW;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAa3C,SAAS,KAAK,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,GAAG,YAAY,KAAK,GAAG;AAC7D,QAAI;AACJ,QAAI,MAAM,MAAM,GAAG,GAAG;AACpB,YAAM,EAAE,OAAO,MAAM,WAAW,IAAI,OAAO,CAAC;AAC5C,YAAM,EAAE,MAAM,UAAU,SAAS,IAAI,IAAI,IAAI,GAAG;AAChD,YAAM,SAAS,SAAS,QAAQ,MAAM,EAAE;AACxC,YAAM,cAAc,OAAO,MAAM,GAAG;AACpC,YAAM,YAAY,oBAAI,IAAI,CAAC,CAAC,QAAQ,KAAK,GAAG,CAAC,QAAQ,KAAK,CAAC,CAAC;AAC5D,UAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,QAAQ;AACxC,cAAM,QAAQ,OAAO,OAAO,KAAK;AACjC,iBAAS,QAAQ,OAAO;AACtB,cAAI,SAAS,IAAI,GAAG;AAClB,mBAAO,KAAK,KAAK;AACjB,gBAAI,oBAAoB,KAAK,IAAI,GAAG;AAClC,wBAAU,IAAI,MAAM,KAAK;AAAA,YAC3B,WAAW,MAAM;AACf,wBAAU,IAAI,MAAM,IAAI;AAAA,YAC1B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM,QAAQ,IAAI,KAAK,KAAK,QAAQ;AACtC,cAAM,QAAQ,OAAO,OAAO,IAAI;AAChC,iBAAS,QAAQ,OAAO;AACtB,cAAI,SAAS,IAAI,GAAG;AAClB,mBAAO,KAAK,KAAK;AACjB,gBAAI,MAAM;AACR,wBAAU,IAAI,MAAM,KAAK;AAAA,YAC3B;AAAA,UACF;AAAA,QACF;AAAA,MACF;AACA,UAAI;AACJ,iBAAW,CAAC,KAAK,KAAK,KAAK,UAAU,QAAQ,GAAG;AAC9C,eAAO,SAAU,WAAW,OAAO,YAAY,MAAM,OAAK,MAAM,GAAG;AACnE,YAAI,CAAC,MAAM;AACT;AAAA,QACF;AAAA,MACF;AACA,UAAI,MAAM;AACR,YAAI,gBAAgB;AACpB,YAAI,YAAY,SAAS,MAAM,GAAG;AAChC,gBAAM,CAAC,QAAQ,IAAI,IAAI,SAAS,MAAM,GAAG;AACzC,gBAAM,YAAY,OAAO,MAAM,GAAG;AAClC,gBAAM,WAAW,UAAU,IAAI,MAAM;AACrC,cAAI,UAAU;AACZ,kBAAM,aAAa,YAAY,IAAI;AACnC,gBAAI,eAAe,MAAM;AACvB,8BAAgB,GAAG,UAAU,UAAU,KAAK,GAAG,KAAK;AAAA,YACtD;AAAA,UACF;AAAA,QACF;AACA,cAAM,CAAC,KAAK,IAAI,IAAI,MAAM,IAAI,IAC5B,CAAC,KAAK,KAAK,KAAK,KAAK,GAAG,EAAE,IAAI,mBAAmB;AACnD,cAAM,WAAW;AACjB,cAAM,SAAS,IAAI,OAAO,KAAK,GAAG;AAClC,cAAM,kBACJ,IAAI,OAAO,IAAI,MAAM,MAAM,QAAQ,SAAS,GAAG;AACjD,YAAI,YAAY,SAAS,MAAM,KAAK,EAAE,cAAc,OAAO;AACzD,yBAAe,cAAc,QAAQ,UAAU,mBAAmB,EAC/D,QAAQ,QAAQ,yBAAyB;AAAA,QAC9C,OAAO;AACL,yBAAe,cAAc,QAAQ,UAAU,mBAAmB,EAC/D,QAAQ,QAAQ,yBAAyB,EACzC,QAAQ,iBAAiB,yBAAyB;AAAA,QACvD;AAAA,MACF;AAAA,IACF;AACA,WAAO,gBAAgB;AAAA,EACzB;AACF;AAEA,IAAM,eAAe,IAAI,aAAa;AAStC,IAAM,QAAQ,SAAO,aAAa,MAAM,GAAG;AAQpC,IAAM,QAAQ,OAAM,QAAO;AAChC,QAAM,MAAM,MAAM,MAAM,GAAG;AAC3B,SAAO;AACT;AASA,IAAM,cAAc,CAAC,KAAK,QAAQ,aAAa,SAAS,KAAK,OAAO;AAAA,EAClE,OAAO,CAAC;AAAA,EACR,MAAM,CAAC;AAAA,EACP,YAAY;AACd,CAAC;AASM,IAAM,cAAc,OAAO,KAAK,QAAQ;AAC7C,QAAM,MAAM,MAAM,YAAY,KAAK,GAAG;AACtC,SAAO;AACT;",
6
+ "names": []
7
+ }
@@ -0,0 +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};
2
+ //# sourceMappingURL=url-sanitizer.min.js.map