dompurify 3.2.1 → 3.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
@@ -2,15 +2,13 @@
2
2
 
3
3
  [![npm version](https://badge.fury.io/js/dompurify.svg)](http://badge.fury.io/js/dompurify) ![Build and Test](https://github.com/cure53/DOMPurify/workflows/Build%20and%20Test/badge.svg?branch=main) [![Downloads](https://img.shields.io/npm/dm/dompurify.svg)](https://www.npmjs.com/package/dompurify) ![npm package minimized gzipped size (select exports)](https://img.shields.io/bundlejs/size/dompurify?color=%233C1&label=minified) ![GitHub code size in bytes](https://img.shields.io/github/languages/code-size/cure53/dompurify?color=%233C1) [![dependents](https://badgen.net/github/dependents-repo/cure53/dompurify?color=green&label=dependents)](https://github.com/cure53/DOMPurify/network/dependents)
4
4
 
5
- [![NPM](https://nodei.co/npm/dompurify.png)](https://nodei.co/npm/dompurify/)
6
-
7
5
  DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG.
8
6
 
9
- It's also very simple to use and get started with. DOMPurify was [started in February 2014](https://github.com/cure53/DOMPurify/commit/a630922616927373485e0e787ab19e73e3691b2b) and, meanwhile, has reached version **v3.2.1**.
7
+ It's also very simple to use and get started with. DOMPurify was [started in February 2014](https://github.com/cure53/DOMPurify/commit/a630922616927373485e0e787ab19e73e3691b2b) and, meanwhile, has reached version **v3.2.3**.
10
8
 
11
9
  DOMPurify is written in JavaScript and works in all modern browsers (Safari (10+), Opera (15+), Edge, Firefox and Chrome - as well as almost anything else using Blink, Gecko or WebKit). It doesn't break on MSIE or other legacy browsers. It simply does nothing.
12
10
 
13
- **Note that [DOMPurify v2.5.7](https://github.com/cure53/DOMPurify/releases/tag/2.5.7) is the latest version supporting MSIE. For important security updates compatible with MSIE, please use the [2.x branch](https://github.com/cure53/DOMPurify/tree/2.x).**
11
+ **Note that [DOMPurify v2.5.8](https://github.com/cure53/DOMPurify/releases/tag/2.5.8) is the latest version supporting MSIE. For important security updates compatible with MSIE, please use the [2.x branch](https://github.com/cure53/DOMPurify/tree/2.x).**
14
12
 
15
13
  Our automated tests cover [24 different browsers](https://github.com/cure53/DOMPurify/blob/main/test/karma.custom-launchers.config.js#L5) right now, more to come. We also cover Node.js v16.x, v17.x, v18.x and v19.x, running DOMPurify on [jsdom](https://github.com/jsdom/jsdom). Older Node versions are known to work as well, but hey... no guarantees.
16
14
 
@@ -429,7 +427,7 @@ Feature releases will not be announced to this list.
429
427
 
430
428
  Many people helped and help DOMPurify become what it is and need to be acknowledged here!
431
429
 
432
- [hash_kitten ❤️](https://twitter.com/hash_kitten), [kevin_mizu ❤️](https://twitter.com/kevin_mizu), [icesfont ❤️](https://github.com/icesfont) [dcramer 💸](https://github.com/dcramer), [JGraph 💸](https://github.com/jgraph), [baekilda 💸](https://github.com/baekilda), [Healthchecks 💸](https://github.com/healthchecks), [Sentry 💸](https://github.com/getsentry), [jarrodldavis 💸](https://github.com/jarrodldavis), [CynegeticIO](https://github.com/CynegeticIO), [ssi02014 ❤️](https://github.com/ssi02014), [GrantGryczan](https://github.com/GrantGryczan), [Lowdefy](https://twitter.com/lowdefy), [granlem](https://twitter.com/MaximeVeit), [oreoshake](https://github.com/oreoshake), [tdeekens ❤️](https://github.com/tdeekens), [peernohell ❤️](https://github.com/peernohell), [is2ei](https://github.com/is2ei), [SoheilKhodayari](https://github.com/SoheilKhodayari), [franktopel](https://github.com/franktopel), [NateScarlet](https://github.com/NateScarlet), [neilj](https://github.com/neilj), [fhemberger](https://github.com/fhemberger), [Joris-van-der-Wel](https://github.com/Joris-van-der-Wel), [ydaniv](https://github.com/ydaniv), [terjanq](https://twitter.com/terjanq), [filedescriptor](https://github.com/filedescriptor), [ConradIrwin](https://github.com/ConradIrwin), [gibson042](https://github.com/gibson042), [choumx](https://github.com/choumx), [0xSobky](https://github.com/0xSobky), [styfle](https://github.com/styfle), [koto](https://github.com/koto), [tlau88](https://github.com/tlau88), [strugee](https://github.com/strugee), [oparoz](https://github.com/oparoz), [mathiasbynens](https://github.com/mathiasbynens), [edg2s](https://github.com/edg2s), [dnkolegov](https://github.com/dnkolegov), [dhardtke](https://github.com/dhardtke), [wirehead](https://github.com/wirehead), [thorn0](https://github.com/thorn0), [styu](https://github.com/styu), [mozfreddyb](https://github.com/mozfreddyb), [mikesamuel](https://github.com/mikesamuel), [jorangreef](https://github.com/jorangreef), [jimmyhchan](https://github.com/jimmyhchan), [jameydeorio](https://github.com/jameydeorio), [jameskraus](https://github.com/jameskraus), [hyderali](https://github.com/hyderali), [hansottowirtz](https://github.com/hansottowirtz), [hackvertor](https://github.com/hackvertor), [freddyb](https://github.com/freddyb), [flavorjones](https://github.com/flavorjones), [djfarrelly](https://github.com/djfarrelly), [devd](https://github.com/devd), [camerondunford](https://github.com/camerondunford), [buu700](https://github.com/buu700), [buildog](https://github.com/buildog), [alabiaga](https://github.com/alabiaga), [Vector919](https://github.com/Vector919), [Robbert](https://github.com/Robbert), [GreLI](https://github.com/GreLI), [FuzzySockets](https://github.com/FuzzySockets), [ArtemBernatskyy](https://github.com/ArtemBernatskyy), [@garethheyes](https://twitter.com/garethheyes), [@shafigullin](https://twitter.com/shafigullin), [@mmrupp](https://twitter.com/mmrupp), [@irsdl](https://twitter.com/irsdl),[ShikariSenpai](https://github.com/ShikariSenpai), [ansjdnakjdnajkd](https://github.com/ansjdnakjdnajkd), [@asutherland](https://twitter.com/asutherland), [@mathias](https://twitter.com/mathias), [@cgvwzq](https://twitter.com/cgvwzq), [@robbertatwork](https://twitter.com/robbertatwork), [@giutro](https://twitter.com/giutro), [@CmdEngineer\_](https://twitter.com/CmdEngineer_), [@avr4mit](https://twitter.com/avr4mit) and especially [@securitymb ❤️](https://twitter.com/securitymb) & [@masatokinugawa ❤️](https://twitter.com/masatokinugawa)
430
+ [hash_kitten ❤️](https://twitter.com/hash_kitten), [kevin_mizu ❤️](https://twitter.com/kevin_mizu), [icesfont ❤️](https://github.com/icesfont), [reduckted ❤️](https://github.com/reduckted), [dcramer 💸](https://github.com/dcramer), [JGraph 💸](https://github.com/jgraph), [baekilda 💸](https://github.com/baekilda), [Healthchecks 💸](https://github.com/healthchecks), [Sentry 💸](https://github.com/getsentry), [jarrodldavis 💸](https://github.com/jarrodldavis), [CynegeticIO](https://github.com/CynegeticIO), [ssi02014 ❤️](https://github.com/ssi02014), [GrantGryczan](https://github.com/GrantGryczan), [Lowdefy](https://twitter.com/lowdefy), [granlem](https://twitter.com/MaximeVeit), [oreoshake](https://github.com/oreoshake), [tdeekens ❤️](https://github.com/tdeekens), [peernohell ❤️](https://github.com/peernohell), [is2ei](https://github.com/is2ei), [SoheilKhodayari](https://github.com/SoheilKhodayari), [franktopel](https://github.com/franktopel), [NateScarlet](https://github.com/NateScarlet), [neilj](https://github.com/neilj), [fhemberger](https://github.com/fhemberger), [Joris-van-der-Wel](https://github.com/Joris-van-der-Wel), [ydaniv](https://github.com/ydaniv), [terjanq](https://twitter.com/terjanq), [filedescriptor](https://github.com/filedescriptor), [ConradIrwin](https://github.com/ConradIrwin), [gibson042](https://github.com/gibson042), [choumx](https://github.com/choumx), [0xSobky](https://github.com/0xSobky), [styfle](https://github.com/styfle), [koto](https://github.com/koto), [tlau88](https://github.com/tlau88), [strugee](https://github.com/strugee), [oparoz](https://github.com/oparoz), [mathiasbynens](https://github.com/mathiasbynens), [edg2s](https://github.com/edg2s), [dnkolegov](https://github.com/dnkolegov), [dhardtke](https://github.com/dhardtke), [wirehead](https://github.com/wirehead), [thorn0](https://github.com/thorn0), [styu](https://github.com/styu), [mozfreddyb](https://github.com/mozfreddyb), [mikesamuel](https://github.com/mikesamuel), [jorangreef](https://github.com/jorangreef), [jimmyhchan](https://github.com/jimmyhchan), [jameydeorio](https://github.com/jameydeorio), [jameskraus](https://github.com/jameskraus), [hyderali](https://github.com/hyderali), [hansottowirtz](https://github.com/hansottowirtz), [hackvertor](https://github.com/hackvertor), [freddyb](https://github.com/freddyb), [flavorjones](https://github.com/flavorjones), [djfarrelly](https://github.com/djfarrelly), [devd](https://github.com/devd), [camerondunford](https://github.com/camerondunford), [buu700](https://github.com/buu700), [buildog](https://github.com/buildog), [alabiaga](https://github.com/alabiaga), [Vector919](https://github.com/Vector919), [Robbert](https://github.com/Robbert), [GreLI](https://github.com/GreLI), [FuzzySockets](https://github.com/FuzzySockets), [ArtemBernatskyy](https://github.com/ArtemBernatskyy), [@garethheyes](https://twitter.com/garethheyes), [@shafigullin](https://twitter.com/shafigullin), [@mmrupp](https://twitter.com/mmrupp), [@irsdl](https://twitter.com/irsdl),[ShikariSenpai](https://github.com/ShikariSenpai), [ansjdnakjdnajkd](https://github.com/ansjdnakjdnajkd), [@asutherland](https://twitter.com/asutherland), [@mathias](https://twitter.com/mathias), [@cgvwzq](https://twitter.com/cgvwzq), [@robbertatwork](https://twitter.com/robbertatwork), [@giutro](https://twitter.com/giutro), [@CmdEngineer\_](https://twitter.com/CmdEngineer_), [@avr4mit](https://twitter.com/avr4mit) and especially [@securitymb ❤️](https://twitter.com/securitymb) & [@masatokinugawa ❤️](https://twitter.com/masatokinugawa)
433
431
 
434
432
  ## Testing powered by
435
433
 
@@ -1,4 +1,5 @@
1
- /*! @license DOMPurify 3.2.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.1/LICENSE */
1
+ /// <reference types="trusted-types" />
2
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
2
3
 
3
4
  /**
4
5
  * Configuration to control DOMPurify behavior.
@@ -297,7 +298,21 @@ interface DOMPurify {
297
298
  * @param entryPoint entry point for the hook to add
298
299
  * @param hookFunction function to execute
299
300
  */
300
- addHook(entryPoint: BasicHookName, hookFunction: Hook): void;
301
+ addHook(entryPoint: BasicHookName, hookFunction: NodeHook): void;
302
+ /**
303
+ * Adds a DOMPurify hook.
304
+ *
305
+ * @param entryPoint entry point for the hook to add
306
+ * @param hookFunction function to execute
307
+ */
308
+ addHook(entryPoint: ElementHookName, hookFunction: ElementHook): void;
309
+ /**
310
+ * Adds a DOMPurify hook.
311
+ *
312
+ * @param entryPoint entry point for the hook to add
313
+ * @param hookFunction function to execute
314
+ */
315
+ addHook(entryPoint: DocumentFragmentHookName, hookFunction: DocumentFragmentHook): void;
301
316
  /**
302
317
  * Adds a DOMPurify hook.
303
318
  *
@@ -319,7 +334,23 @@ interface DOMPurify {
319
334
  * @param entryPoint entry point for the hook to remove
320
335
  * @returns removed(popped) hook
321
336
  */
322
- removeHook(entryPoint: BasicHookName): Hook | undefined;
337
+ removeHook(entryPoint: BasicHookName): NodeHook | undefined;
338
+ /**
339
+ * Remove a DOMPurify hook at a given entryPoint
340
+ * (pops it from the stack of hooks if more are present)
341
+ *
342
+ * @param entryPoint entry point for the hook to remove
343
+ * @returns removed(popped) hook
344
+ */
345
+ removeHook(entryPoint: ElementHookName): ElementHook | undefined;
346
+ /**
347
+ * Remove a DOMPurify hook at a given entryPoint
348
+ * (pops it from the stack of hooks if more are present)
349
+ *
350
+ * @param entryPoint entry point for the hook to remove
351
+ * @returns removed(popped) hook
352
+ */
353
+ removeHook(entryPoint: DocumentFragmentHookName): DocumentFragmentHook | undefined;
323
354
  /**
324
355
  * Remove a DOMPurify hook at a given entryPoint
325
356
  * (pops it from the stack of hooks if more are present)
@@ -369,13 +400,17 @@ interface RemovedAttribute {
369
400
  */
370
401
  from: Node;
371
402
  }
372
- type BasicHookName = 'beforeSanitizeElements' | 'afterSanitizeElements' | 'beforeSanitizeAttributes' | 'afterSanitizeAttributes' | 'beforeSanitizeShadowDOM' | 'uponSanitizeShadowNode' | 'afterSanitizeShadowDOM';
403
+ type BasicHookName = 'beforeSanitizeElements' | 'afterSanitizeElements' | 'uponSanitizeShadowNode';
404
+ type ElementHookName = 'beforeSanitizeAttributes' | 'afterSanitizeAttributes';
405
+ type DocumentFragmentHookName = 'beforeSanitizeShadowDOM' | 'afterSanitizeShadowDOM';
373
406
  type UponSanitizeElementHookName = 'uponSanitizeElement';
374
407
  type UponSanitizeAttributeHookName = 'uponSanitizeAttribute';
375
- type HookName = BasicHookName | UponSanitizeElementHookName | UponSanitizeAttributeHookName;
376
- type Hook = (this: DOMPurify, currentNode: Node, hookEvent: null, config: Config) => void;
408
+ type HookName = BasicHookName | ElementHookName | DocumentFragmentHookName | UponSanitizeElementHookName | UponSanitizeAttributeHookName;
409
+ type NodeHook = (this: DOMPurify, currentNode: Node, hookEvent: null, config: Config) => void;
410
+ type ElementHook = (this: DOMPurify, currentNode: Element, hookEvent: null, config: Config) => void;
411
+ type DocumentFragmentHook = (this: DOMPurify, currentNode: DocumentFragment, hookEvent: null, config: Config) => void;
377
412
  type UponSanitizeElementHook = (this: DOMPurify, currentNode: Node, hookEvent: UponSanitizeElementHookEvent, config: Config) => void;
378
- type UponSanitizeAttributeHook = (this: DOMPurify, currentNode: Node, hookEvent: UponSanitizeAttributeHookEvent, config: Config) => void;
413
+ type UponSanitizeAttributeHook = (this: DOMPurify, currentNode: Element, hookEvent: UponSanitizeAttributeHookEvent, config: Config) => void;
379
414
  interface UponSanitizeElementHookEvent {
380
415
  tagName: string;
381
416
  allowedTags: Record<string, boolean>;
@@ -396,7 +431,7 @@ type WindowLike = Pick<typeof globalThis, 'DocumentFragment' | 'HTMLTemplateElem
396
431
  trustedTypes?: typeof window.trustedTypes;
397
432
  };
398
433
 
399
- export { type Config, type DOMPurify, type Hook, type HookName, type RemovedAttribute, type RemovedElement, type UponSanitizeAttributeHook, type UponSanitizeAttributeHookEvent, type UponSanitizeElementHook, type UponSanitizeElementHookEvent, type WindowLike };
434
+ export { type Config, type DOMPurify, type DocumentFragmentHook, type ElementHook, type HookName, type NodeHook, type RemovedAttribute, type RemovedElement, type UponSanitizeAttributeHook, type UponSanitizeAttributeHookEvent, type UponSanitizeElementHook, type UponSanitizeElementHookEvent, type WindowLike };
400
435
 
401
436
  // @ts-ignore
402
437
  export = _default;
@@ -1,4 +1,4 @@
1
- /*! @license DOMPurify 3.2.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.1/LICENSE */
1
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
2
2
 
3
3
  'use strict';
4
4
 
@@ -175,7 +175,6 @@ function lookupGetter(object, prop) {
175
175
  }
176
176
 
177
177
  const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);
178
- // SVG
179
178
  const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);
180
179
  const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);
181
180
  // List of SVG elements that are disallowed by default.
@@ -197,8 +196,8 @@ const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:x
197
196
  // eslint-disable-next-line unicorn/better-regex
198
197
  const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
199
198
  const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
200
- const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
201
- const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
199
+ const TMPLIT_EXPR = seal(/\$\{[\w\W]*}/gm); // eslint-disable-line unicorn/better-regex
200
+ const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/); // eslint-disable-line no-useless-escape
202
201
  const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
203
202
  const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape
204
203
  );
@@ -281,10 +280,23 @@ const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedType
281
280
  return null;
282
281
  }
283
282
  };
283
+ const _createHooksMap = function _createHooksMap() {
284
+ return {
285
+ afterSanitizeAttributes: [],
286
+ afterSanitizeElements: [],
287
+ afterSanitizeShadowDOM: [],
288
+ beforeSanitizeAttributes: [],
289
+ beforeSanitizeElements: [],
290
+ beforeSanitizeShadowDOM: [],
291
+ uponSanitizeAttribute: [],
292
+ uponSanitizeElement: [],
293
+ uponSanitizeShadowNode: []
294
+ };
295
+ };
284
296
  function createDOMPurify() {
285
297
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
286
298
  const DOMPurify = root => createDOMPurify(root);
287
- DOMPurify.version = '3.2.1';
299
+ DOMPurify.version = '3.2.3';
288
300
  DOMPurify.removed = [];
289
301
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document) {
290
302
  // Not running in a browser, provide a factory function
@@ -337,7 +349,7 @@ function createDOMPurify() {
337
349
  const {
338
350
  importNode
339
351
  } = originalDocument;
340
- let hooks = {};
352
+ let hooks = _createHooksMap();
341
353
  /**
342
354
  * Expose whether this browser supports running the full DOMPurify.
343
355
  */
@@ -766,8 +778,8 @@ function createDOMPurify() {
766
778
  });
767
779
  }
768
780
  element.removeAttribute(name);
769
- // We void attribute values for unremovable "is"" attributes
770
- if (name === 'is' && !ALLOWED_ATTR[name]) {
781
+ // We void attribute values for unremovable "is" attributes
782
+ if (name === 'is') {
771
783
  if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
772
784
  try {
773
785
  _forceRemove(element);
@@ -858,11 +870,8 @@ function createDOMPurify() {
858
870
  const _isNode = function _isNode(value) {
859
871
  return typeof Node === 'function' && value instanceof Node;
860
872
  };
861
- function _executeHook(entryPoint, currentNode, data) {
862
- if (!hooks[entryPoint]) {
863
- return;
864
- }
865
- arrayForEach(hooks[entryPoint], hook => {
873
+ function _executeHooks(hooks, currentNode, data) {
874
+ arrayForEach(hooks, hook => {
866
875
  hook.call(DOMPurify, currentNode, data, CONFIG);
867
876
  });
868
877
  }
@@ -878,7 +887,7 @@ function createDOMPurify() {
878
887
  const _sanitizeElements = function _sanitizeElements(currentNode) {
879
888
  let content = null;
880
889
  /* Execute a hook if present */
881
- _executeHook('beforeSanitizeElements', currentNode, null);
890
+ _executeHooks(hooks.beforeSanitizeElements, currentNode, null);
882
891
  /* Check if element is clobbered or can clobber */
883
892
  if (_isClobbered(currentNode)) {
884
893
  _forceRemove(currentNode);
@@ -887,7 +896,7 @@ function createDOMPurify() {
887
896
  /* Now let's check the element's type and name */
888
897
  const tagName = transformCaseFunc(currentNode.nodeName);
889
898
  /* Execute a hook if present */
890
- _executeHook('uponSanitizeElement', currentNode, {
899
+ _executeHooks(hooks.uponSanitizeElement, currentNode, {
891
900
  tagName,
892
901
  allowedTags: ALLOWED_TAGS
893
902
  });
@@ -958,7 +967,7 @@ function createDOMPurify() {
958
967
  }
959
968
  }
960
969
  /* Execute a hook if present */
961
- _executeHook('afterSanitizeElements', currentNode, null);
970
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
962
971
  return false;
963
972
  };
964
973
  /**
@@ -1019,12 +1028,12 @@ function createDOMPurify() {
1019
1028
  */
1020
1029
  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
1021
1030
  /* Execute a hook if present */
1022
- _executeHook('beforeSanitizeAttributes', currentNode, null);
1031
+ _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
1023
1032
  const {
1024
1033
  attributes
1025
1034
  } = currentNode;
1026
1035
  /* Check if we have attributes; if not we might have a text node */
1027
- if (!attributes) {
1036
+ if (!attributes || _isClobbered(currentNode)) {
1028
1037
  return;
1029
1038
  }
1030
1039
  const hookEvent = {
@@ -1050,7 +1059,7 @@ function createDOMPurify() {
1050
1059
  hookEvent.attrValue = value;
1051
1060
  hookEvent.keepAttr = true;
1052
1061
  hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
1053
- _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
1062
+ _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
1054
1063
  value = hookEvent.attrValue;
1055
1064
  /* Full DOM Clobbering protection via namespace isolation,
1056
1065
  * Prefix id and name attributes with `user-content-`
@@ -1125,7 +1134,7 @@ function createDOMPurify() {
1125
1134
  } catch (_) {}
1126
1135
  }
1127
1136
  /* Execute a hook if present */
1128
- _executeHook('afterSanitizeAttributes', currentNode, null);
1137
+ _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
1129
1138
  };
1130
1139
  /**
1131
1140
  * _sanitizeShadowDOM
@@ -1136,23 +1145,21 @@ function createDOMPurify() {
1136
1145
  let shadowNode = null;
1137
1146
  const shadowIterator = _createNodeIterator(fragment);
1138
1147
  /* Execute a hook if present */
1139
- _executeHook('beforeSanitizeShadowDOM', fragment, null);
1148
+ _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
1140
1149
  while (shadowNode = shadowIterator.nextNode()) {
1141
1150
  /* Execute a hook if present */
1142
- _executeHook('uponSanitizeShadowNode', shadowNode, null);
1151
+ _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
1143
1152
  /* Sanitize tags and elements */
1144
- if (_sanitizeElements(shadowNode)) {
1145
- continue;
1146
- }
1153
+ _sanitizeElements(shadowNode);
1154
+ /* Check attributes next */
1155
+ _sanitizeAttributes(shadowNode);
1147
1156
  /* Deep shadow DOM detected */
1148
1157
  if (shadowNode.content instanceof DocumentFragment) {
1149
1158
  _sanitizeShadowDOM(shadowNode.content);
1150
1159
  }
1151
- /* Check attributes, sanitize if necessary */
1152
- _sanitizeAttributes(shadowNode);
1153
1160
  }
1154
1161
  /* Execute a hook if present */
1155
- _executeHook('afterSanitizeShadowDOM', fragment, null);
1162
+ _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
1156
1163
  };
1157
1164
  // eslint-disable-next-line complexity
1158
1165
  DOMPurify.sanitize = function (dirty) {
@@ -1238,15 +1245,13 @@ function createDOMPurify() {
1238
1245
  /* Now start iterating over the created document */
1239
1246
  while (currentNode = nodeIterator.nextNode()) {
1240
1247
  /* Sanitize tags and elements */
1241
- if (_sanitizeElements(currentNode)) {
1242
- continue;
1243
- }
1248
+ _sanitizeElements(currentNode);
1249
+ /* Check attributes next */
1250
+ _sanitizeAttributes(currentNode);
1244
1251
  /* Shadow DOM detected, sanitize it */
1245
1252
  if (currentNode.content instanceof DocumentFragment) {
1246
1253
  _sanitizeShadowDOM(currentNode.content);
1247
1254
  }
1248
- /* Check attributes, sanitize if necessary */
1249
- _sanitizeAttributes(currentNode);
1250
1255
  }
1251
1256
  /* If we sanitized `dirty` in-place, return it. */
1252
1257
  if (IN_PLACE) {
@@ -1310,21 +1315,16 @@ function createDOMPurify() {
1310
1315
  if (typeof hookFunction !== 'function') {
1311
1316
  return;
1312
1317
  }
1313
- hooks[entryPoint] = hooks[entryPoint] || [];
1314
1318
  arrayPush(hooks[entryPoint], hookFunction);
1315
1319
  };
1316
1320
  DOMPurify.removeHook = function (entryPoint) {
1317
- if (hooks[entryPoint]) {
1318
- return arrayPop(hooks[entryPoint]);
1319
- }
1321
+ return arrayPop(hooks[entryPoint]);
1320
1322
  };
1321
1323
  DOMPurify.removeHooks = function (entryPoint) {
1322
- if (hooks[entryPoint]) {
1323
- hooks[entryPoint] = [];
1324
- }
1324
+ hooks[entryPoint] = [];
1325
1325
  };
1326
1326
  DOMPurify.removeAllHooks = function () {
1327
- hooks = {};
1327
+ hooks = _createHooksMap();
1328
1328
  };
1329
1329
  return DOMPurify;
1330
1330
  }
@@ -1,4 +1,5 @@
1
- /*! @license DOMPurify 3.2.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.1/LICENSE */
1
+ /// <reference types="trusted-types" />
2
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
2
3
 
3
4
  /**
4
5
  * Configuration to control DOMPurify behavior.
@@ -297,7 +298,21 @@ interface DOMPurify {
297
298
  * @param entryPoint entry point for the hook to add
298
299
  * @param hookFunction function to execute
299
300
  */
300
- addHook(entryPoint: BasicHookName, hookFunction: Hook): void;
301
+ addHook(entryPoint: BasicHookName, hookFunction: NodeHook): void;
302
+ /**
303
+ * Adds a DOMPurify hook.
304
+ *
305
+ * @param entryPoint entry point for the hook to add
306
+ * @param hookFunction function to execute
307
+ */
308
+ addHook(entryPoint: ElementHookName, hookFunction: ElementHook): void;
309
+ /**
310
+ * Adds a DOMPurify hook.
311
+ *
312
+ * @param entryPoint entry point for the hook to add
313
+ * @param hookFunction function to execute
314
+ */
315
+ addHook(entryPoint: DocumentFragmentHookName, hookFunction: DocumentFragmentHook): void;
301
316
  /**
302
317
  * Adds a DOMPurify hook.
303
318
  *
@@ -319,7 +334,23 @@ interface DOMPurify {
319
334
  * @param entryPoint entry point for the hook to remove
320
335
  * @returns removed(popped) hook
321
336
  */
322
- removeHook(entryPoint: BasicHookName): Hook | undefined;
337
+ removeHook(entryPoint: BasicHookName): NodeHook | undefined;
338
+ /**
339
+ * Remove a DOMPurify hook at a given entryPoint
340
+ * (pops it from the stack of hooks if more are present)
341
+ *
342
+ * @param entryPoint entry point for the hook to remove
343
+ * @returns removed(popped) hook
344
+ */
345
+ removeHook(entryPoint: ElementHookName): ElementHook | undefined;
346
+ /**
347
+ * Remove a DOMPurify hook at a given entryPoint
348
+ * (pops it from the stack of hooks if more are present)
349
+ *
350
+ * @param entryPoint entry point for the hook to remove
351
+ * @returns removed(popped) hook
352
+ */
353
+ removeHook(entryPoint: DocumentFragmentHookName): DocumentFragmentHook | undefined;
323
354
  /**
324
355
  * Remove a DOMPurify hook at a given entryPoint
325
356
  * (pops it from the stack of hooks if more are present)
@@ -369,13 +400,17 @@ interface RemovedAttribute {
369
400
  */
370
401
  from: Node;
371
402
  }
372
- type BasicHookName = 'beforeSanitizeElements' | 'afterSanitizeElements' | 'beforeSanitizeAttributes' | 'afterSanitizeAttributes' | 'beforeSanitizeShadowDOM' | 'uponSanitizeShadowNode' | 'afterSanitizeShadowDOM';
403
+ type BasicHookName = 'beforeSanitizeElements' | 'afterSanitizeElements' | 'uponSanitizeShadowNode';
404
+ type ElementHookName = 'beforeSanitizeAttributes' | 'afterSanitizeAttributes';
405
+ type DocumentFragmentHookName = 'beforeSanitizeShadowDOM' | 'afterSanitizeShadowDOM';
373
406
  type UponSanitizeElementHookName = 'uponSanitizeElement';
374
407
  type UponSanitizeAttributeHookName = 'uponSanitizeAttribute';
375
- type HookName = BasicHookName | UponSanitizeElementHookName | UponSanitizeAttributeHookName;
376
- type Hook = (this: DOMPurify, currentNode: Node, hookEvent: null, config: Config) => void;
408
+ type HookName = BasicHookName | ElementHookName | DocumentFragmentHookName | UponSanitizeElementHookName | UponSanitizeAttributeHookName;
409
+ type NodeHook = (this: DOMPurify, currentNode: Node, hookEvent: null, config: Config) => void;
410
+ type ElementHook = (this: DOMPurify, currentNode: Element, hookEvent: null, config: Config) => void;
411
+ type DocumentFragmentHook = (this: DOMPurify, currentNode: DocumentFragment, hookEvent: null, config: Config) => void;
377
412
  type UponSanitizeElementHook = (this: DOMPurify, currentNode: Node, hookEvent: UponSanitizeElementHookEvent, config: Config) => void;
378
- type UponSanitizeAttributeHook = (this: DOMPurify, currentNode: Node, hookEvent: UponSanitizeAttributeHookEvent, config: Config) => void;
413
+ type UponSanitizeAttributeHook = (this: DOMPurify, currentNode: Element, hookEvent: UponSanitizeAttributeHookEvent, config: Config) => void;
379
414
  interface UponSanitizeElementHookEvent {
380
415
  tagName: string;
381
416
  allowedTags: Record<string, boolean>;
@@ -396,4 +431,4 @@ type WindowLike = Pick<typeof globalThis, 'DocumentFragment' | 'HTMLTemplateElem
396
431
  trustedTypes?: typeof window.trustedTypes;
397
432
  };
398
433
 
399
- export { type Config, type DOMPurify, type Hook, type HookName, type RemovedAttribute, type RemovedElement, type UponSanitizeAttributeHook, type UponSanitizeAttributeHookEvent, type UponSanitizeElementHook, type UponSanitizeElementHookEvent, type WindowLike, _default as default };
434
+ export { type Config, type DOMPurify, type DocumentFragmentHook, type ElementHook, type HookName, type NodeHook, type RemovedAttribute, type RemovedElement, type UponSanitizeAttributeHook, type UponSanitizeAttributeHookEvent, type UponSanitizeElementHook, type UponSanitizeElementHookEvent, type WindowLike, _default as default };
@@ -1,4 +1,4 @@
1
- /*! @license DOMPurify 3.2.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.1/LICENSE */
1
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
2
2
 
3
3
  const {
4
4
  entries,
@@ -173,7 +173,6 @@ function lookupGetter(object, prop) {
173
173
  }
174
174
 
175
175
  const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);
176
- // SVG
177
176
  const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);
178
177
  const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);
179
178
  // List of SVG elements that are disallowed by default.
@@ -195,8 +194,8 @@ const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:x
195
194
  // eslint-disable-next-line unicorn/better-regex
196
195
  const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
197
196
  const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
198
- const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
199
- const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
197
+ const TMPLIT_EXPR = seal(/\$\{[\w\W]*}/gm); // eslint-disable-line unicorn/better-regex
198
+ const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/); // eslint-disable-line no-useless-escape
200
199
  const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
201
200
  const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape
202
201
  );
@@ -279,10 +278,23 @@ const _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedType
279
278
  return null;
280
279
  }
281
280
  };
281
+ const _createHooksMap = function _createHooksMap() {
282
+ return {
283
+ afterSanitizeAttributes: [],
284
+ afterSanitizeElements: [],
285
+ afterSanitizeShadowDOM: [],
286
+ beforeSanitizeAttributes: [],
287
+ beforeSanitizeElements: [],
288
+ beforeSanitizeShadowDOM: [],
289
+ uponSanitizeAttribute: [],
290
+ uponSanitizeElement: [],
291
+ uponSanitizeShadowNode: []
292
+ };
293
+ };
282
294
  function createDOMPurify() {
283
295
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
284
296
  const DOMPurify = root => createDOMPurify(root);
285
- DOMPurify.version = '3.2.1';
297
+ DOMPurify.version = '3.2.3';
286
298
  DOMPurify.removed = [];
287
299
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document) {
288
300
  // Not running in a browser, provide a factory function
@@ -335,7 +347,7 @@ function createDOMPurify() {
335
347
  const {
336
348
  importNode
337
349
  } = originalDocument;
338
- let hooks = {};
350
+ let hooks = _createHooksMap();
339
351
  /**
340
352
  * Expose whether this browser supports running the full DOMPurify.
341
353
  */
@@ -764,8 +776,8 @@ function createDOMPurify() {
764
776
  });
765
777
  }
766
778
  element.removeAttribute(name);
767
- // We void attribute values for unremovable "is"" attributes
768
- if (name === 'is' && !ALLOWED_ATTR[name]) {
779
+ // We void attribute values for unremovable "is" attributes
780
+ if (name === 'is') {
769
781
  if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
770
782
  try {
771
783
  _forceRemove(element);
@@ -856,11 +868,8 @@ function createDOMPurify() {
856
868
  const _isNode = function _isNode(value) {
857
869
  return typeof Node === 'function' && value instanceof Node;
858
870
  };
859
- function _executeHook(entryPoint, currentNode, data) {
860
- if (!hooks[entryPoint]) {
861
- return;
862
- }
863
- arrayForEach(hooks[entryPoint], hook => {
871
+ function _executeHooks(hooks, currentNode, data) {
872
+ arrayForEach(hooks, hook => {
864
873
  hook.call(DOMPurify, currentNode, data, CONFIG);
865
874
  });
866
875
  }
@@ -876,7 +885,7 @@ function createDOMPurify() {
876
885
  const _sanitizeElements = function _sanitizeElements(currentNode) {
877
886
  let content = null;
878
887
  /* Execute a hook if present */
879
- _executeHook('beforeSanitizeElements', currentNode, null);
888
+ _executeHooks(hooks.beforeSanitizeElements, currentNode, null);
880
889
  /* Check if element is clobbered or can clobber */
881
890
  if (_isClobbered(currentNode)) {
882
891
  _forceRemove(currentNode);
@@ -885,7 +894,7 @@ function createDOMPurify() {
885
894
  /* Now let's check the element's type and name */
886
895
  const tagName = transformCaseFunc(currentNode.nodeName);
887
896
  /* Execute a hook if present */
888
- _executeHook('uponSanitizeElement', currentNode, {
897
+ _executeHooks(hooks.uponSanitizeElement, currentNode, {
889
898
  tagName,
890
899
  allowedTags: ALLOWED_TAGS
891
900
  });
@@ -956,7 +965,7 @@ function createDOMPurify() {
956
965
  }
957
966
  }
958
967
  /* Execute a hook if present */
959
- _executeHook('afterSanitizeElements', currentNode, null);
968
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
960
969
  return false;
961
970
  };
962
971
  /**
@@ -1017,12 +1026,12 @@ function createDOMPurify() {
1017
1026
  */
1018
1027
  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
1019
1028
  /* Execute a hook if present */
1020
- _executeHook('beforeSanitizeAttributes', currentNode, null);
1029
+ _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
1021
1030
  const {
1022
1031
  attributes
1023
1032
  } = currentNode;
1024
1033
  /* Check if we have attributes; if not we might have a text node */
1025
- if (!attributes) {
1034
+ if (!attributes || _isClobbered(currentNode)) {
1026
1035
  return;
1027
1036
  }
1028
1037
  const hookEvent = {
@@ -1048,7 +1057,7 @@ function createDOMPurify() {
1048
1057
  hookEvent.attrValue = value;
1049
1058
  hookEvent.keepAttr = true;
1050
1059
  hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
1051
- _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
1060
+ _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
1052
1061
  value = hookEvent.attrValue;
1053
1062
  /* Full DOM Clobbering protection via namespace isolation,
1054
1063
  * Prefix id and name attributes with `user-content-`
@@ -1123,7 +1132,7 @@ function createDOMPurify() {
1123
1132
  } catch (_) {}
1124
1133
  }
1125
1134
  /* Execute a hook if present */
1126
- _executeHook('afterSanitizeAttributes', currentNode, null);
1135
+ _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
1127
1136
  };
1128
1137
  /**
1129
1138
  * _sanitizeShadowDOM
@@ -1134,23 +1143,21 @@ function createDOMPurify() {
1134
1143
  let shadowNode = null;
1135
1144
  const shadowIterator = _createNodeIterator(fragment);
1136
1145
  /* Execute a hook if present */
1137
- _executeHook('beforeSanitizeShadowDOM', fragment, null);
1146
+ _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
1138
1147
  while (shadowNode = shadowIterator.nextNode()) {
1139
1148
  /* Execute a hook if present */
1140
- _executeHook('uponSanitizeShadowNode', shadowNode, null);
1149
+ _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
1141
1150
  /* Sanitize tags and elements */
1142
- if (_sanitizeElements(shadowNode)) {
1143
- continue;
1144
- }
1151
+ _sanitizeElements(shadowNode);
1152
+ /* Check attributes next */
1153
+ _sanitizeAttributes(shadowNode);
1145
1154
  /* Deep shadow DOM detected */
1146
1155
  if (shadowNode.content instanceof DocumentFragment) {
1147
1156
  _sanitizeShadowDOM(shadowNode.content);
1148
1157
  }
1149
- /* Check attributes, sanitize if necessary */
1150
- _sanitizeAttributes(shadowNode);
1151
1158
  }
1152
1159
  /* Execute a hook if present */
1153
- _executeHook('afterSanitizeShadowDOM', fragment, null);
1160
+ _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
1154
1161
  };
1155
1162
  // eslint-disable-next-line complexity
1156
1163
  DOMPurify.sanitize = function (dirty) {
@@ -1236,15 +1243,13 @@ function createDOMPurify() {
1236
1243
  /* Now start iterating over the created document */
1237
1244
  while (currentNode = nodeIterator.nextNode()) {
1238
1245
  /* Sanitize tags and elements */
1239
- if (_sanitizeElements(currentNode)) {
1240
- continue;
1241
- }
1246
+ _sanitizeElements(currentNode);
1247
+ /* Check attributes next */
1248
+ _sanitizeAttributes(currentNode);
1242
1249
  /* Shadow DOM detected, sanitize it */
1243
1250
  if (currentNode.content instanceof DocumentFragment) {
1244
1251
  _sanitizeShadowDOM(currentNode.content);
1245
1252
  }
1246
- /* Check attributes, sanitize if necessary */
1247
- _sanitizeAttributes(currentNode);
1248
1253
  }
1249
1254
  /* If we sanitized `dirty` in-place, return it. */
1250
1255
  if (IN_PLACE) {
@@ -1308,21 +1313,16 @@ function createDOMPurify() {
1308
1313
  if (typeof hookFunction !== 'function') {
1309
1314
  return;
1310
1315
  }
1311
- hooks[entryPoint] = hooks[entryPoint] || [];
1312
1316
  arrayPush(hooks[entryPoint], hookFunction);
1313
1317
  };
1314
1318
  DOMPurify.removeHook = function (entryPoint) {
1315
- if (hooks[entryPoint]) {
1316
- return arrayPop(hooks[entryPoint]);
1317
- }
1319
+ return arrayPop(hooks[entryPoint]);
1318
1320
  };
1319
1321
  DOMPurify.removeHooks = function (entryPoint) {
1320
- if (hooks[entryPoint]) {
1321
- hooks[entryPoint] = [];
1322
- }
1322
+ hooks[entryPoint] = [];
1323
1323
  };
1324
1324
  DOMPurify.removeAllHooks = function () {
1325
- hooks = {};
1325
+ hooks = _createHooksMap();
1326
1326
  };
1327
1327
  return DOMPurify;
1328
1328
  }
package/dist/purify.js CHANGED
@@ -1,4 +1,4 @@
1
- /*! @license DOMPurify 3.2.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.1/LICENSE */
1
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
2
2
 
3
3
  (function (global, factory) {
4
4
  typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
@@ -179,7 +179,6 @@
179
179
  }
180
180
 
181
181
  const html$1 = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dialog', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);
182
- // SVG
183
182
  const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);
184
183
  const svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feDropShadow', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feImage', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);
185
184
  // List of SVG elements that are disallowed by default.
@@ -201,8 +200,8 @@
201
200
  // eslint-disable-next-line unicorn/better-regex
202
201
  const MUSTACHE_EXPR = seal(/\{\{[\w\W]*|[\w\W]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
203
202
  const ERB_EXPR = seal(/<%[\w\W]*|[\w\W]*%>/gm);
204
- const TMPLIT_EXPR = seal(/\${[\w\W]*}/gm);
205
- const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
203
+ const TMPLIT_EXPR = seal(/\$\{[\w\W]*}/gm); // eslint-disable-line unicorn/better-regex
204
+ const DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]+$/); // eslint-disable-line no-useless-escape
206
205
  const ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
207
206
  const IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape
208
207
  );
@@ -285,10 +284,23 @@
285
284
  return null;
286
285
  }
287
286
  };
287
+ const _createHooksMap = function _createHooksMap() {
288
+ return {
289
+ afterSanitizeAttributes: [],
290
+ afterSanitizeElements: [],
291
+ afterSanitizeShadowDOM: [],
292
+ beforeSanitizeAttributes: [],
293
+ beforeSanitizeElements: [],
294
+ beforeSanitizeShadowDOM: [],
295
+ uponSanitizeAttribute: [],
296
+ uponSanitizeElement: [],
297
+ uponSanitizeShadowNode: []
298
+ };
299
+ };
288
300
  function createDOMPurify() {
289
301
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
290
302
  const DOMPurify = root => createDOMPurify(root);
291
- DOMPurify.version = '3.2.1';
303
+ DOMPurify.version = '3.2.3';
292
304
  DOMPurify.removed = [];
293
305
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document) {
294
306
  // Not running in a browser, provide a factory function
@@ -341,7 +353,7 @@
341
353
  const {
342
354
  importNode
343
355
  } = originalDocument;
344
- let hooks = {};
356
+ let hooks = _createHooksMap();
345
357
  /**
346
358
  * Expose whether this browser supports running the full DOMPurify.
347
359
  */
@@ -770,8 +782,8 @@
770
782
  });
771
783
  }
772
784
  element.removeAttribute(name);
773
- // We void attribute values for unremovable "is"" attributes
774
- if (name === 'is' && !ALLOWED_ATTR[name]) {
785
+ // We void attribute values for unremovable "is" attributes
786
+ if (name === 'is') {
775
787
  if (RETURN_DOM || RETURN_DOM_FRAGMENT) {
776
788
  try {
777
789
  _forceRemove(element);
@@ -862,11 +874,8 @@
862
874
  const _isNode = function _isNode(value) {
863
875
  return typeof Node === 'function' && value instanceof Node;
864
876
  };
865
- function _executeHook(entryPoint, currentNode, data) {
866
- if (!hooks[entryPoint]) {
867
- return;
868
- }
869
- arrayForEach(hooks[entryPoint], hook => {
877
+ function _executeHooks(hooks, currentNode, data) {
878
+ arrayForEach(hooks, hook => {
870
879
  hook.call(DOMPurify, currentNode, data, CONFIG);
871
880
  });
872
881
  }
@@ -882,7 +891,7 @@
882
891
  const _sanitizeElements = function _sanitizeElements(currentNode) {
883
892
  let content = null;
884
893
  /* Execute a hook if present */
885
- _executeHook('beforeSanitizeElements', currentNode, null);
894
+ _executeHooks(hooks.beforeSanitizeElements, currentNode, null);
886
895
  /* Check if element is clobbered or can clobber */
887
896
  if (_isClobbered(currentNode)) {
888
897
  _forceRemove(currentNode);
@@ -891,7 +900,7 @@
891
900
  /* Now let's check the element's type and name */
892
901
  const tagName = transformCaseFunc(currentNode.nodeName);
893
902
  /* Execute a hook if present */
894
- _executeHook('uponSanitizeElement', currentNode, {
903
+ _executeHooks(hooks.uponSanitizeElement, currentNode, {
895
904
  tagName,
896
905
  allowedTags: ALLOWED_TAGS
897
906
  });
@@ -962,7 +971,7 @@
962
971
  }
963
972
  }
964
973
  /* Execute a hook if present */
965
- _executeHook('afterSanitizeElements', currentNode, null);
974
+ _executeHooks(hooks.afterSanitizeElements, currentNode, null);
966
975
  return false;
967
976
  };
968
977
  /**
@@ -1023,12 +1032,12 @@
1023
1032
  */
1024
1033
  const _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
1025
1034
  /* Execute a hook if present */
1026
- _executeHook('beforeSanitizeAttributes', currentNode, null);
1035
+ _executeHooks(hooks.beforeSanitizeAttributes, currentNode, null);
1027
1036
  const {
1028
1037
  attributes
1029
1038
  } = currentNode;
1030
1039
  /* Check if we have attributes; if not we might have a text node */
1031
- if (!attributes) {
1040
+ if (!attributes || _isClobbered(currentNode)) {
1032
1041
  return;
1033
1042
  }
1034
1043
  const hookEvent = {
@@ -1054,7 +1063,7 @@
1054
1063
  hookEvent.attrValue = value;
1055
1064
  hookEvent.keepAttr = true;
1056
1065
  hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
1057
- _executeHook('uponSanitizeAttribute', currentNode, hookEvent);
1066
+ _executeHooks(hooks.uponSanitizeAttribute, currentNode, hookEvent);
1058
1067
  value = hookEvent.attrValue;
1059
1068
  /* Full DOM Clobbering protection via namespace isolation,
1060
1069
  * Prefix id and name attributes with `user-content-`
@@ -1129,7 +1138,7 @@
1129
1138
  } catch (_) {}
1130
1139
  }
1131
1140
  /* Execute a hook if present */
1132
- _executeHook('afterSanitizeAttributes', currentNode, null);
1141
+ _executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
1133
1142
  };
1134
1143
  /**
1135
1144
  * _sanitizeShadowDOM
@@ -1140,23 +1149,21 @@
1140
1149
  let shadowNode = null;
1141
1150
  const shadowIterator = _createNodeIterator(fragment);
1142
1151
  /* Execute a hook if present */
1143
- _executeHook('beforeSanitizeShadowDOM', fragment, null);
1152
+ _executeHooks(hooks.beforeSanitizeShadowDOM, fragment, null);
1144
1153
  while (shadowNode = shadowIterator.nextNode()) {
1145
1154
  /* Execute a hook if present */
1146
- _executeHook('uponSanitizeShadowNode', shadowNode, null);
1155
+ _executeHooks(hooks.uponSanitizeShadowNode, shadowNode, null);
1147
1156
  /* Sanitize tags and elements */
1148
- if (_sanitizeElements(shadowNode)) {
1149
- continue;
1150
- }
1157
+ _sanitizeElements(shadowNode);
1158
+ /* Check attributes next */
1159
+ _sanitizeAttributes(shadowNode);
1151
1160
  /* Deep shadow DOM detected */
1152
1161
  if (shadowNode.content instanceof DocumentFragment) {
1153
1162
  _sanitizeShadowDOM(shadowNode.content);
1154
1163
  }
1155
- /* Check attributes, sanitize if necessary */
1156
- _sanitizeAttributes(shadowNode);
1157
1164
  }
1158
1165
  /* Execute a hook if present */
1159
- _executeHook('afterSanitizeShadowDOM', fragment, null);
1166
+ _executeHooks(hooks.afterSanitizeShadowDOM, fragment, null);
1160
1167
  };
1161
1168
  // eslint-disable-next-line complexity
1162
1169
  DOMPurify.sanitize = function (dirty) {
@@ -1242,15 +1249,13 @@
1242
1249
  /* Now start iterating over the created document */
1243
1250
  while (currentNode = nodeIterator.nextNode()) {
1244
1251
  /* Sanitize tags and elements */
1245
- if (_sanitizeElements(currentNode)) {
1246
- continue;
1247
- }
1252
+ _sanitizeElements(currentNode);
1253
+ /* Check attributes next */
1254
+ _sanitizeAttributes(currentNode);
1248
1255
  /* Shadow DOM detected, sanitize it */
1249
1256
  if (currentNode.content instanceof DocumentFragment) {
1250
1257
  _sanitizeShadowDOM(currentNode.content);
1251
1258
  }
1252
- /* Check attributes, sanitize if necessary */
1253
- _sanitizeAttributes(currentNode);
1254
1259
  }
1255
1260
  /* If we sanitized `dirty` in-place, return it. */
1256
1261
  if (IN_PLACE) {
@@ -1314,21 +1319,16 @@
1314
1319
  if (typeof hookFunction !== 'function') {
1315
1320
  return;
1316
1321
  }
1317
- hooks[entryPoint] = hooks[entryPoint] || [];
1318
1322
  arrayPush(hooks[entryPoint], hookFunction);
1319
1323
  };
1320
1324
  DOMPurify.removeHook = function (entryPoint) {
1321
- if (hooks[entryPoint]) {
1322
- return arrayPop(hooks[entryPoint]);
1323
- }
1325
+ return arrayPop(hooks[entryPoint]);
1324
1326
  };
1325
1327
  DOMPurify.removeHooks = function (entryPoint) {
1326
- if (hooks[entryPoint]) {
1327
- hooks[entryPoint] = [];
1328
- }
1328
+ hooks[entryPoint] = [];
1329
1329
  };
1330
1330
  DOMPurify.removeAllHooks = function () {
1331
- hooks = {};
1331
+ hooks = _createHooksMap();
1332
1332
  };
1333
1333
  return DOMPurify;
1334
1334
  }
@@ -1,3 +1,3 @@
1
- /*! @license DOMPurify 3.2.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.1/LICENSE */
2
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=b(Array.prototype.forEach),m=b(Array.prototype.pop),p=b(Array.prototype.push),f=b(String.prototype.toLowerCase),d=b(String.prototype.toString),h=b(String.prototype.match),g=b(String.prototype.replace),T=b(String.prototype.indexOf),y=b(String.prototype.trim),E=b(Object.prototype.hasOwnProperty),_=b(RegExp.prototype.test),A=(N=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return s(N,t)});var N;function b(e){return function(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function S(e,o){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:f;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function R(e){for(let t=0;t<e.length;t++){E(e,t)||(e[t]=null)}return e}function w(t){const n=l(null);for(const[o,r]of e(t)){E(t,o)&&(Array.isArray(r)?n[o]=R(r):r&&"object"==typeof r&&r.constructor===Object?n[o]=w(r):n[o]=r)}return n}function L(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return b(n.get);if("function"==typeof n.value)return b(n.value)}e=o(e)}return function(){return null}}const v=i(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),C=i(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),O=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),D=i(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),x=i(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),k=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),I=i(["#text"]),M=i(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),U=i(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),P=i(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),H=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),F=a(/\{\{[\w\W]*|[\w\W]*\}\}/gm),z=a(/<%[\w\W]*|[\w\W]*%>/gm),B=a(/\${[\w\W]*}/gm),W=a(/^data-[\-\w.\u00B7-\uFFFF]/),G=a(/^aria-[\-\w]+$/),Y=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),j=a(/^(?:\w+script|data):/i),X=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i),K=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var $=Object.freeze({__proto__:null,ARIA_ATTR:G,ATTR_WHITESPACE:X,CUSTOM_ELEMENT:K,DATA_ATTR:W,DOCTYPE_NAME:q,ERB_EXPR:z,IS_ALLOWED_URI:Y,IS_SCRIPT_OR_DATA:j,MUSTACHE_EXPR:F,TMPLIT_EXPR:B});const V=1,Z=3,J=7,Q=8,ee=9,te=function(){return"undefined"==typeof window?null:window};var ne=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:te();const o=e=>t(e);if(o.version="3.2.1",o.removed=[],!n||!n.document||n.document.nodeType!==ee)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:N,Node:b,Element:R,NodeFilter:F,NamedNodeMap:z=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:B,DOMParser:W,trustedTypes:G}=n,j=R.prototype,X=L(j,"cloneNode"),K=L(j,"remove"),ne=L(j,"nextSibling"),oe=L(j,"childNodes"),re=L(j,"parentNode");if("function"==typeof N){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let ie,ae="";const{implementation:le,createNodeIterator:ce,createDocumentFragment:se,getElementsByTagName:ue}=r,{importNode:me}=a;let pe={};o.isSupported="function"==typeof e&&"function"==typeof re&&le&&void 0!==le.createHTMLDocument;const{MUSTACHE_EXPR:fe,ERB_EXPR:de,TMPLIT_EXPR:he,DATA_ATTR:ge,ARIA_ATTR:Te,IS_SCRIPT_OR_DATA:ye,ATTR_WHITESPACE:Ee,CUSTOM_ELEMENT:_e}=$;let{IS_ALLOWED_URI:Ae}=$,Ne=null;const be=S({},[...v,...C,...O,...x,...I]);let Se=null;const Re=S({},[...M,...U,...P,...H]);let we=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Le=null,ve=null,Ce=!0,Oe=!0,De=!1,xe=!0,ke=!1,Ie=!0,Me=!1,Ue=!1,Pe=!1,He=!1,Fe=!1,ze=!1,Be=!0,We=!1,Ge=!0,Ye=!1,je={},Xe=null;const qe=S({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let Ke=null;const $e=S({},["audio","video","img","source","image","track"]);let Ve=null;const Ze=S({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Je="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",et="http://www.w3.org/1999/xhtml";let tt=et,nt=!1,ot=null;const rt=S({},[Je,Qe,et],d);let it=S({},["mi","mo","mn","ms","mtext"]),at=S({},["annotation-xml"]);const lt=S({},["title","style","font","a","script"]);let ct=null;const st=["application/xhtml+xml","text/html"];let ut=null,mt=null;const pt=r.createElement("form"),ft=function(e){return e instanceof RegExp||e instanceof Function},dt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!mt||mt!==e){if(e&&"object"==typeof e||(e={}),e=w(e),ct=-1===st.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,ut="application/xhtml+xml"===ct?d:f,Ne=E(e,"ALLOWED_TAGS")?S({},e.ALLOWED_TAGS,ut):be,Se=E(e,"ALLOWED_ATTR")?S({},e.ALLOWED_ATTR,ut):Re,ot=E(e,"ALLOWED_NAMESPACES")?S({},e.ALLOWED_NAMESPACES,d):rt,Ve=E(e,"ADD_URI_SAFE_ATTR")?S(w(Ze),e.ADD_URI_SAFE_ATTR,ut):Ze,Ke=E(e,"ADD_DATA_URI_TAGS")?S(w($e),e.ADD_DATA_URI_TAGS,ut):$e,Xe=E(e,"FORBID_CONTENTS")?S({},e.FORBID_CONTENTS,ut):qe,Le=E(e,"FORBID_TAGS")?S({},e.FORBID_TAGS,ut):{},ve=E(e,"FORBID_ATTR")?S({},e.FORBID_ATTR,ut):{},je=!!E(e,"USE_PROFILES")&&e.USE_PROFILES,Ce=!1!==e.ALLOW_ARIA_ATTR,Oe=!1!==e.ALLOW_DATA_ATTR,De=e.ALLOW_UNKNOWN_PROTOCOLS||!1,xe=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,ke=e.SAFE_FOR_TEMPLATES||!1,Ie=!1!==e.SAFE_FOR_XML,Me=e.WHOLE_DOCUMENT||!1,He=e.RETURN_DOM||!1,Fe=e.RETURN_DOM_FRAGMENT||!1,ze=e.RETURN_TRUSTED_TYPE||!1,Pe=e.FORCE_BODY||!1,Be=!1!==e.SANITIZE_DOM,We=e.SANITIZE_NAMED_PROPS||!1,Ge=!1!==e.KEEP_CONTENT,Ye=e.IN_PLACE||!1,Ae=e.ALLOWED_URI_REGEXP||Y,tt=e.NAMESPACE||et,it=e.MATHML_TEXT_INTEGRATION_POINTS||it,at=e.HTML_INTEGRATION_POINTS||at,we=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ft(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(we.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ft(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(we.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(we.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),ke&&(Oe=!1),Fe&&(He=!0),je&&(Ne=S({},I),Se=[],!0===je.html&&(S(Ne,v),S(Se,M)),!0===je.svg&&(S(Ne,C),S(Se,U),S(Se,H)),!0===je.svgFilters&&(S(Ne,O),S(Se,U),S(Se,H)),!0===je.mathMl&&(S(Ne,x),S(Se,P),S(Se,H))),e.ADD_TAGS&&(Ne===be&&(Ne=w(Ne)),S(Ne,e.ADD_TAGS,ut)),e.ADD_ATTR&&(Se===Re&&(Se=w(Se)),S(Se,e.ADD_ATTR,ut)),e.ADD_URI_SAFE_ATTR&&S(Ve,e.ADD_URI_SAFE_ATTR,ut),e.FORBID_CONTENTS&&(Xe===qe&&(Xe=w(Xe)),S(Xe,e.FORBID_CONTENTS,ut)),Ge&&(Ne["#text"]=!0),Me&&S(Ne,["html","head","body"]),Ne.table&&(S(Ne,["tbody"]),delete Le.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw A('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ie=e.TRUSTED_TYPES_POLICY,ae=ie.createHTML("")}else void 0===ie&&(ie=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(G,c)),null!==ie&&"string"==typeof ae&&(ae=ie.createHTML(""));i&&i(e),mt=e}},ht=S({},[...C,...O,...D]),gt=S({},[...x,...k]),Tt=function(e){p(o.removed,{element:e});try{re(e).removeChild(e)}catch(t){K(e)}},yt=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e&&!Se[e])if(He||Fe)try{Tt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Et=function(e){let t=null,n=null;if(Pe)e="<remove></remove>"+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===ct&&tt===et&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=ie?ie.createHTML(e):e;if(tt===et)try{t=(new W).parseFromString(o,ct)}catch(e){}if(!t||!t.documentElement){t=le.createDocument(tt,"template",null);try{t.documentElement.innerHTML=nt?ae:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),tt===et?ue.call(t,Me?"html":"body")[0]:Me?t.documentElement:i},_t=function(e){return ce.call(e.ownerDocument||e,e,F.SHOW_ELEMENT|F.SHOW_COMMENT|F.SHOW_TEXT|F.SHOW_PROCESSING_INSTRUCTION|F.SHOW_CDATA_SECTION,null)},At=function(e){return e instanceof B&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof z)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},Nt=function(e){return"function"==typeof b&&e instanceof b};function bt(e,t,n){pe[e]&&u(pe[e],(e=>{e.call(o,t,n,mt)}))}const St=function(e){let t=null;if(bt("beforeSanitizeElements",e,null),At(e))return Tt(e),!0;const n=ut(e.nodeName);if(bt("uponSanitizeElement",e,{tagName:n,allowedTags:Ne}),e.hasChildNodes()&&!Nt(e.firstElementChild)&&_(/<[/\w]/g,e.innerHTML)&&_(/<[/\w]/g,e.textContent))return Tt(e),!0;if(e.nodeType===J)return Tt(e),!0;if(Ie&&e.nodeType===Q&&_(/<[/\w]/g,e.data))return Tt(e),!0;if(!Ne[n]||Le[n]){if(!Le[n]&&wt(n)){if(we.tagNameCheck instanceof RegExp&&_(we.tagNameCheck,n))return!1;if(we.tagNameCheck instanceof Function&&we.tagNameCheck(n))return!1}if(Ge&&!Xe[n]){const t=re(e)||e.parentNode,n=oe(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=X(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,ne(e))}}}return Tt(e),!0}return e instanceof R&&!function(e){let t=re(e);t&&t.tagName||(t={namespaceURI:tt,tagName:"template"});const n=f(e.tagName),o=f(t.tagName);return!!ot[e.namespaceURI]&&(e.namespaceURI===Qe?t.namespaceURI===et?"svg"===n:t.namespaceURI===Je?"svg"===n&&("annotation-xml"===o||it[o]):Boolean(ht[n]):e.namespaceURI===Je?t.namespaceURI===et?"math"===n:t.namespaceURI===Qe?"math"===n&&at[o]:Boolean(gt[n]):e.namespaceURI===et?!(t.namespaceURI===Qe&&!at[o])&&!(t.namespaceURI===Je&&!it[o])&&!gt[n]&&(lt[n]||!ht[n]):!("application/xhtml+xml"!==ct||!ot[e.namespaceURI]))}(e)?(Tt(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!_(/<\/no(script|embed|frames)/i,e.innerHTML)?(ke&&e.nodeType===Z&&(t=e.textContent,u([fe,de,he],(e=>{t=g(t,e," ")})),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),bt("afterSanitizeElements",e,null),!1):(Tt(e),!0)},Rt=function(e,t,n){if(Be&&("id"===t||"name"===t)&&(n in r||n in pt))return!1;if(Oe&&!ve[t]&&_(ge,t));else if(Ce&&_(Te,t));else if(!Se[t]||ve[t]){if(!(wt(e)&&(we.tagNameCheck instanceof RegExp&&_(we.tagNameCheck,e)||we.tagNameCheck instanceof Function&&we.tagNameCheck(e))&&(we.attributeNameCheck instanceof RegExp&&_(we.attributeNameCheck,t)||we.attributeNameCheck instanceof Function&&we.attributeNameCheck(t))||"is"===t&&we.allowCustomizedBuiltInElements&&(we.tagNameCheck instanceof RegExp&&_(we.tagNameCheck,n)||we.tagNameCheck instanceof Function&&we.tagNameCheck(n))))return!1}else if(Ve[t]);else if(_(Ae,g(n,Ee,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==T(n,"data:")||!Ke[e]){if(De&&!_(ye,g(n,Ee,"")));else if(n)return!1}else;return!0},wt=function(e){return"annotation-xml"!==e&&h(e,_e)},Lt=function(e){bt("beforeSanitizeAttributes",e,null);const{attributes:t}=e;if(!t)return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Se,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=ut(a);let p="value"===a?c:y(c);if(n.attrName=s,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,bt("uponSanitizeAttribute",e,n),p=n.attrValue,!We||"id"!==s&&"name"!==s||(yt(a,e),p="user-content-"+p),Ie&&_(/((--!?|])>)|<\/(style|title)/i,p)){yt(a,e);continue}if(n.forceKeepAttr)continue;if(yt(a,e),!n.keepAttr)continue;if(!xe&&_(/\/>/i,p)){yt(a,e);continue}ke&&u([fe,de,he],(e=>{p=g(p,e," ")}));const f=ut(e.nodeName);if(Rt(f,s,p)){if(ie&&"object"==typeof G&&"function"==typeof G.getAttributeType)if(l);else switch(G.getAttributeType(f,s)){case"TrustedHTML":p=ie.createHTML(p);break;case"TrustedScriptURL":p=ie.createScriptURL(p)}try{l?e.setAttributeNS(l,a,p):e.setAttribute(a,p),At(e)?Tt(e):m(o.removed)}catch(e){}}}bt("afterSanitizeAttributes",e,null)},vt=function e(t){let n=null;const o=_t(t);for(bt("beforeSanitizeShadowDOM",t,null);n=o.nextNode();)bt("uponSanitizeShadowNode",n,null),St(n)||(n.content instanceof s&&e(n.content),Lt(n));bt("afterSanitizeShadowDOM",t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(nt=!e,nt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!Nt(e)){if("function"!=typeof e.toString)throw A("toString is not a function");if("string"!=typeof(e=e.toString()))throw A("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Ue||dt(t),o.removed=[],"string"==typeof e&&(Ye=!1),Ye){if(e.nodeName){const t=ut(e.nodeName);if(!Ne[t]||Le[t])throw A("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof b)n=Et("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===V&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!He&&!ke&&!Me&&-1===e.indexOf("<"))return ie&&ze?ie.createHTML(e):e;if(n=Et(e),!n)return He?null:ze?ae:""}n&&Pe&&Tt(n.firstChild);const c=_t(Ye?e:n);for(;i=c.nextNode();)St(i)||(i.content instanceof s&&vt(i.content),Lt(i));if(Ye)return e;if(He){if(Fe)for(l=se.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Se.shadowroot||Se.shadowrootmode)&&(l=me.call(a,l,!0)),l}let m=Me?n.outerHTML:n.innerHTML;return Me&&Ne["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&_(q,n.ownerDocument.doctype.name)&&(m="<!DOCTYPE "+n.ownerDocument.doctype.name+">\n"+m),ke&&u([fe,de,he],(e=>{m=g(m,e," ")})),ie&&ze?ie.createHTML(m):m},o.setConfig=function(){dt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ue=!0},o.clearConfig=function(){mt=null,Ue=!1},o.isValidAttribute=function(e,t,n){mt||dt({});const o=ut(e),r=ut(t);return Rt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&(pe[e]=pe[e]||[],p(pe[e],t))},o.removeHook=function(e){if(pe[e])return m(pe[e])},o.removeHooks=function(e){pe[e]&&(pe[e]=[])},o.removeAllHooks=function(){pe={}},o}();return ne}));
1
+ /*! @license DOMPurify 3.2.3 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.2.3/LICENSE */
2
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).DOMPurify=t()}(this,(function(){"use strict";const{entries:e,setPrototypeOf:t,isFrozen:n,getPrototypeOf:o,getOwnPropertyDescriptor:r}=Object;let{freeze:i,seal:a,create:l}=Object,{apply:c,construct:s}="undefined"!=typeof Reflect&&Reflect;i||(i=function(e){return e}),a||(a=function(e){return e}),c||(c=function(e,t,n){return e.apply(t,n)}),s||(s=function(e,t){return new e(...t)});const u=b(Array.prototype.forEach),m=b(Array.prototype.pop),p=b(Array.prototype.push),f=b(String.prototype.toLowerCase),d=b(String.prototype.toString),h=b(String.prototype.match),g=b(String.prototype.replace),T=b(String.prototype.indexOf),y=b(String.prototype.trim),E=b(Object.prototype.hasOwnProperty),A=b(RegExp.prototype.test),_=(S=TypeError,function(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return s(S,t)});var S;function b(e){return function(t){for(var n=arguments.length,o=new Array(n>1?n-1:0),r=1;r<n;r++)o[r-1]=arguments[r];return c(e,t,o)}}function N(e,o){let r=arguments.length>2&&void 0!==arguments[2]?arguments[2]:f;t&&t(e,null);let i=o.length;for(;i--;){let t=o[i];if("string"==typeof t){const e=r(t);e!==t&&(n(o)||(o[i]=e),t=e)}e[t]=!0}return e}function R(e){for(let t=0;t<e.length;t++){E(e,t)||(e[t]=null)}return e}function w(t){const n=l(null);for(const[o,r]of e(t)){E(t,o)&&(Array.isArray(r)?n[o]=R(r):r&&"object"==typeof r&&r.constructor===Object?n[o]=w(r):n[o]=r)}return n}function O(e,t){for(;null!==e;){const n=r(e,t);if(n){if(n.get)return b(n.get);if("function"==typeof n.value)return b(n.value)}e=o(e)}return function(){return null}}const D=i(["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dialog","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","picture","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr"]),L=i(["svg","a","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","style","switch","symbol","text","textpath","title","tref","tspan","view","vkern"]),v=i(["feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feDistantLight","feDropShadow","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feImage","feMerge","feMergeNode","feMorphology","feOffset","fePointLight","feSpecularLighting","feSpotLight","feTile","feTurbulence"]),C=i(["animate","color-profile","cursor","discard","font-face","font-face-format","font-face-name","font-face-src","font-face-uri","foreignobject","hatch","hatchpath","mesh","meshgradient","meshpatch","meshrow","missing-glyph","script","set","solidcolor","unknown","use"]),x=i(["math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmultiscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mspace","msqrt","mstyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","mprescripts"]),M=i(["maction","maligngroup","malignmark","mlongdiv","mscarries","mscarry","msgroup","mstack","msline","msrow","semantics","annotation","annotation-xml","mprescripts","none"]),k=i(["#text"]),I=i(["accept","action","align","alt","autocapitalize","autocomplete","autopictureinpicture","autoplay","background","bgcolor","border","capture","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","controls","controlslist","coords","crossorigin","datetime","decoding","default","dir","disabled","disablepictureinpicture","disableremoteplayback","download","draggable","enctype","enterkeyhint","face","for","headers","height","hidden","high","href","hreflang","id","inputmode","integrity","ismap","kind","label","lang","list","loading","loop","low","max","maxlength","media","method","min","minlength","multiple","muted","name","nonce","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","playsinline","popover","popovertarget","popovertargetaction","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","role","rows","rowspan","spellcheck","scope","selected","shape","size","sizes","span","srclang","start","src","srcset","step","style","summary","tabindex","title","translate","type","usemap","valign","value","width","wrap","xmlns","slot"]),U=i(["accent-height","accumulate","additive","alignment-baseline","amplitude","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","class","clip","clippathunits","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","exponent","fill","fill-opacity","fill-rule","filter","filterunits","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","height","href","id","image-rendering","in","in2","intercept","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lang","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","media","method","mode","min","name","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","preserveaspectratio","primitiveunits","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","slope","specularconstant","specularexponent","spreadmethod","startoffset","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","style","surfacescale","systemlanguage","tabindex","tablevalues","targetx","targety","transform","transform-origin","text-anchor","text-decoration","text-rendering","textlength","type","u1","u2","unicode","values","viewbox","visibility","version","vert-adv-y","vert-origin-x","vert-origin-y","width","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","xmlns","y","y1","y2","z","zoomandpan"]),z=i(["accent","accentunder","align","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","dir","display","displaystyle","encoding","fence","frame","height","href","id","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","width","xmlns"]),P=i(["xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]),H=a(/\{\{[\w\W]*|[\w\W]*\}\}/gm),F=a(/<%[\w\W]*|[\w\W]*%>/gm),B=a(/\$\{[\w\W]*}/gm),W=a(/^data-[\-\w.\u00B7-\uFFFF]+$/),G=a(/^aria-[\-\w]+$/),Y=a(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i),j=a(/^(?:\w+script|data):/i),X=a(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g),q=a(/^html$/i),$=a(/^[a-z][.\w]*(-[.\w]+)+$/i);var K=Object.freeze({__proto__:null,ARIA_ATTR:G,ATTR_WHITESPACE:X,CUSTOM_ELEMENT:$,DATA_ATTR:W,DOCTYPE_NAME:q,ERB_EXPR:F,IS_ALLOWED_URI:Y,IS_SCRIPT_OR_DATA:j,MUSTACHE_EXPR:H,TMPLIT_EXPR:B});const V=1,Z=3,J=7,Q=8,ee=9,te=function(){return"undefined"==typeof window?null:window};var ne=function t(){let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:te();const o=e=>t(e);if(o.version="3.2.3",o.removed=[],!n||!n.document||n.document.nodeType!==ee)return o.isSupported=!1,o;let{document:r}=n;const a=r,c=a.currentScript,{DocumentFragment:s,HTMLTemplateElement:S,Node:b,Element:R,NodeFilter:H,NamedNodeMap:F=n.NamedNodeMap||n.MozNamedAttrMap,HTMLFormElement:B,DOMParser:W,trustedTypes:G}=n,j=R.prototype,X=O(j,"cloneNode"),$=O(j,"remove"),ne=O(j,"nextSibling"),oe=O(j,"childNodes"),re=O(j,"parentNode");if("function"==typeof S){const e=r.createElement("template");e.content&&e.content.ownerDocument&&(r=e.content.ownerDocument)}let ie,ae="";const{implementation:le,createNodeIterator:ce,createDocumentFragment:se,getElementsByTagName:ue}=r,{importNode:me}=a;let pe={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]};o.isSupported="function"==typeof e&&"function"==typeof re&&le&&void 0!==le.createHTMLDocument;const{MUSTACHE_EXPR:fe,ERB_EXPR:de,TMPLIT_EXPR:he,DATA_ATTR:ge,ARIA_ATTR:Te,IS_SCRIPT_OR_DATA:ye,ATTR_WHITESPACE:Ee,CUSTOM_ELEMENT:Ae}=K;let{IS_ALLOWED_URI:_e}=K,Se=null;const be=N({},[...D,...L,...v,...x,...k]);let Ne=null;const Re=N({},[...I,...U,...z,...P]);let we=Object.seal(l(null,{tagNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},attributeNameCheck:{writable:!0,configurable:!1,enumerable:!0,value:null},allowCustomizedBuiltInElements:{writable:!0,configurable:!1,enumerable:!0,value:!1}})),Oe=null,De=null,Le=!0,ve=!0,Ce=!1,xe=!0,Me=!1,ke=!0,Ie=!1,Ue=!1,ze=!1,Pe=!1,He=!1,Fe=!1,Be=!0,We=!1,Ge=!0,Ye=!1,je={},Xe=null;const qe=N({},["annotation-xml","audio","colgroup","desc","foreignobject","head","iframe","math","mi","mn","mo","ms","mtext","noembed","noframes","noscript","plaintext","script","style","svg","template","thead","title","video","xmp"]);let $e=null;const Ke=N({},["audio","video","img","source","image","track"]);let Ve=null;const Ze=N({},["alt","class","for","id","label","name","pattern","placeholder","role","summary","title","value","style","xmlns"]),Je="http://www.w3.org/1998/Math/MathML",Qe="http://www.w3.org/2000/svg",et="http://www.w3.org/1999/xhtml";let tt=et,nt=!1,ot=null;const rt=N({},[Je,Qe,et],d);let it=N({},["mi","mo","mn","ms","mtext"]),at=N({},["annotation-xml"]);const lt=N({},["title","style","font","a","script"]);let ct=null;const st=["application/xhtml+xml","text/html"];let ut=null,mt=null;const pt=r.createElement("form"),ft=function(e){return e instanceof RegExp||e instanceof Function},dt=function(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};if(!mt||mt!==e){if(e&&"object"==typeof e||(e={}),e=w(e),ct=-1===st.indexOf(e.PARSER_MEDIA_TYPE)?"text/html":e.PARSER_MEDIA_TYPE,ut="application/xhtml+xml"===ct?d:f,Se=E(e,"ALLOWED_TAGS")?N({},e.ALLOWED_TAGS,ut):be,Ne=E(e,"ALLOWED_ATTR")?N({},e.ALLOWED_ATTR,ut):Re,ot=E(e,"ALLOWED_NAMESPACES")?N({},e.ALLOWED_NAMESPACES,d):rt,Ve=E(e,"ADD_URI_SAFE_ATTR")?N(w(Ze),e.ADD_URI_SAFE_ATTR,ut):Ze,$e=E(e,"ADD_DATA_URI_TAGS")?N(w(Ke),e.ADD_DATA_URI_TAGS,ut):Ke,Xe=E(e,"FORBID_CONTENTS")?N({},e.FORBID_CONTENTS,ut):qe,Oe=E(e,"FORBID_TAGS")?N({},e.FORBID_TAGS,ut):{},De=E(e,"FORBID_ATTR")?N({},e.FORBID_ATTR,ut):{},je=!!E(e,"USE_PROFILES")&&e.USE_PROFILES,Le=!1!==e.ALLOW_ARIA_ATTR,ve=!1!==e.ALLOW_DATA_ATTR,Ce=e.ALLOW_UNKNOWN_PROTOCOLS||!1,xe=!1!==e.ALLOW_SELF_CLOSE_IN_ATTR,Me=e.SAFE_FOR_TEMPLATES||!1,ke=!1!==e.SAFE_FOR_XML,Ie=e.WHOLE_DOCUMENT||!1,Pe=e.RETURN_DOM||!1,He=e.RETURN_DOM_FRAGMENT||!1,Fe=e.RETURN_TRUSTED_TYPE||!1,ze=e.FORCE_BODY||!1,Be=!1!==e.SANITIZE_DOM,We=e.SANITIZE_NAMED_PROPS||!1,Ge=!1!==e.KEEP_CONTENT,Ye=e.IN_PLACE||!1,_e=e.ALLOWED_URI_REGEXP||Y,tt=e.NAMESPACE||et,it=e.MATHML_TEXT_INTEGRATION_POINTS||it,at=e.HTML_INTEGRATION_POINTS||at,we=e.CUSTOM_ELEMENT_HANDLING||{},e.CUSTOM_ELEMENT_HANDLING&&ft(e.CUSTOM_ELEMENT_HANDLING.tagNameCheck)&&(we.tagNameCheck=e.CUSTOM_ELEMENT_HANDLING.tagNameCheck),e.CUSTOM_ELEMENT_HANDLING&&ft(e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)&&(we.attributeNameCheck=e.CUSTOM_ELEMENT_HANDLING.attributeNameCheck),e.CUSTOM_ELEMENT_HANDLING&&"boolean"==typeof e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements&&(we.allowCustomizedBuiltInElements=e.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements),Me&&(ve=!1),He&&(Pe=!0),je&&(Se=N({},k),Ne=[],!0===je.html&&(N(Se,D),N(Ne,I)),!0===je.svg&&(N(Se,L),N(Ne,U),N(Ne,P)),!0===je.svgFilters&&(N(Se,v),N(Ne,U),N(Ne,P)),!0===je.mathMl&&(N(Se,x),N(Ne,z),N(Ne,P))),e.ADD_TAGS&&(Se===be&&(Se=w(Se)),N(Se,e.ADD_TAGS,ut)),e.ADD_ATTR&&(Ne===Re&&(Ne=w(Ne)),N(Ne,e.ADD_ATTR,ut)),e.ADD_URI_SAFE_ATTR&&N(Ve,e.ADD_URI_SAFE_ATTR,ut),e.FORBID_CONTENTS&&(Xe===qe&&(Xe=w(Xe)),N(Xe,e.FORBID_CONTENTS,ut)),Ge&&(Se["#text"]=!0),Ie&&N(Se,["html","head","body"]),Se.table&&(N(Se,["tbody"]),delete Oe.tbody),e.TRUSTED_TYPES_POLICY){if("function"!=typeof e.TRUSTED_TYPES_POLICY.createHTML)throw _('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.');if("function"!=typeof e.TRUSTED_TYPES_POLICY.createScriptURL)throw _('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.');ie=e.TRUSTED_TYPES_POLICY,ae=ie.createHTML("")}else void 0===ie&&(ie=function(e,t){if("object"!=typeof e||"function"!=typeof e.createPolicy)return null;let n=null;const o="data-tt-policy-suffix";t&&t.hasAttribute(o)&&(n=t.getAttribute(o));const r="dompurify"+(n?"#"+n:"");try{return e.createPolicy(r,{createHTML:e=>e,createScriptURL:e=>e})}catch(e){return console.warn("TrustedTypes policy "+r+" could not be created."),null}}(G,c)),null!==ie&&"string"==typeof ae&&(ae=ie.createHTML(""));i&&i(e),mt=e}},ht=N({},[...L,...v,...C]),gt=N({},[...x,...M]),Tt=function(e){p(o.removed,{element:e});try{re(e).removeChild(e)}catch(t){$(e)}},yt=function(e,t){try{p(o.removed,{attribute:t.getAttributeNode(e),from:t})}catch(e){p(o.removed,{attribute:null,from:t})}if(t.removeAttribute(e),"is"===e)if(Pe||He)try{Tt(t)}catch(e){}else try{t.setAttribute(e,"")}catch(e){}},Et=function(e){let t=null,n=null;if(ze)e="<remove></remove>"+e;else{const t=h(e,/^[\r\n\t ]+/);n=t&&t[0]}"application/xhtml+xml"===ct&&tt===et&&(e='<html xmlns="http://www.w3.org/1999/xhtml"><head></head><body>'+e+"</body></html>");const o=ie?ie.createHTML(e):e;if(tt===et)try{t=(new W).parseFromString(o,ct)}catch(e){}if(!t||!t.documentElement){t=le.createDocument(tt,"template",null);try{t.documentElement.innerHTML=nt?ae:o}catch(e){}}const i=t.body||t.documentElement;return e&&n&&i.insertBefore(r.createTextNode(n),i.childNodes[0]||null),tt===et?ue.call(t,Ie?"html":"body")[0]:Ie?t.documentElement:i},At=function(e){return ce.call(e.ownerDocument||e,e,H.SHOW_ELEMENT|H.SHOW_COMMENT|H.SHOW_TEXT|H.SHOW_PROCESSING_INSTRUCTION|H.SHOW_CDATA_SECTION,null)},_t=function(e){return e instanceof B&&("string"!=typeof e.nodeName||"string"!=typeof e.textContent||"function"!=typeof e.removeChild||!(e.attributes instanceof F)||"function"!=typeof e.removeAttribute||"function"!=typeof e.setAttribute||"string"!=typeof e.namespaceURI||"function"!=typeof e.insertBefore||"function"!=typeof e.hasChildNodes)},St=function(e){return"function"==typeof b&&e instanceof b};function bt(e,t,n){u(e,(e=>{e.call(o,t,n,mt)}))}const Nt=function(e){let t=null;if(bt(pe.beforeSanitizeElements,e,null),_t(e))return Tt(e),!0;const n=ut(e.nodeName);if(bt(pe.uponSanitizeElement,e,{tagName:n,allowedTags:Se}),e.hasChildNodes()&&!St(e.firstElementChild)&&A(/<[/\w]/g,e.innerHTML)&&A(/<[/\w]/g,e.textContent))return Tt(e),!0;if(e.nodeType===J)return Tt(e),!0;if(ke&&e.nodeType===Q&&A(/<[/\w]/g,e.data))return Tt(e),!0;if(!Se[n]||Oe[n]){if(!Oe[n]&&wt(n)){if(we.tagNameCheck instanceof RegExp&&A(we.tagNameCheck,n))return!1;if(we.tagNameCheck instanceof Function&&we.tagNameCheck(n))return!1}if(Ge&&!Xe[n]){const t=re(e)||e.parentNode,n=oe(e)||e.childNodes;if(n&&t){for(let o=n.length-1;o>=0;--o){const r=X(n[o],!0);r.__removalCount=(e.__removalCount||0)+1,t.insertBefore(r,ne(e))}}}return Tt(e),!0}return e instanceof R&&!function(e){let t=re(e);t&&t.tagName||(t={namespaceURI:tt,tagName:"template"});const n=f(e.tagName),o=f(t.tagName);return!!ot[e.namespaceURI]&&(e.namespaceURI===Qe?t.namespaceURI===et?"svg"===n:t.namespaceURI===Je?"svg"===n&&("annotation-xml"===o||it[o]):Boolean(ht[n]):e.namespaceURI===Je?t.namespaceURI===et?"math"===n:t.namespaceURI===Qe?"math"===n&&at[o]:Boolean(gt[n]):e.namespaceURI===et?!(t.namespaceURI===Qe&&!at[o])&&!(t.namespaceURI===Je&&!it[o])&&!gt[n]&&(lt[n]||!ht[n]):!("application/xhtml+xml"!==ct||!ot[e.namespaceURI]))}(e)?(Tt(e),!0):"noscript"!==n&&"noembed"!==n&&"noframes"!==n||!A(/<\/no(script|embed|frames)/i,e.innerHTML)?(Me&&e.nodeType===Z&&(t=e.textContent,u([fe,de,he],(e=>{t=g(t,e," ")})),e.textContent!==t&&(p(o.removed,{element:e.cloneNode()}),e.textContent=t)),bt(pe.afterSanitizeElements,e,null),!1):(Tt(e),!0)},Rt=function(e,t,n){if(Be&&("id"===t||"name"===t)&&(n in r||n in pt))return!1;if(ve&&!De[t]&&A(ge,t));else if(Le&&A(Te,t));else if(!Ne[t]||De[t]){if(!(wt(e)&&(we.tagNameCheck instanceof RegExp&&A(we.tagNameCheck,e)||we.tagNameCheck instanceof Function&&we.tagNameCheck(e))&&(we.attributeNameCheck instanceof RegExp&&A(we.attributeNameCheck,t)||we.attributeNameCheck instanceof Function&&we.attributeNameCheck(t))||"is"===t&&we.allowCustomizedBuiltInElements&&(we.tagNameCheck instanceof RegExp&&A(we.tagNameCheck,n)||we.tagNameCheck instanceof Function&&we.tagNameCheck(n))))return!1}else if(Ve[t]);else if(A(_e,g(n,Ee,"")));else if("src"!==t&&"xlink:href"!==t&&"href"!==t||"script"===e||0!==T(n,"data:")||!$e[e]){if(Ce&&!A(ye,g(n,Ee,"")));else if(n)return!1}else;return!0},wt=function(e){return"annotation-xml"!==e&&h(e,Ae)},Ot=function(e){bt(pe.beforeSanitizeAttributes,e,null);const{attributes:t}=e;if(!t||_t(e))return;const n={attrName:"",attrValue:"",keepAttr:!0,allowedAttributes:Ne,forceKeepAttr:void 0};let r=t.length;for(;r--;){const i=t[r],{name:a,namespaceURI:l,value:c}=i,s=ut(a);let p="value"===a?c:y(c);if(n.attrName=s,n.attrValue=p,n.keepAttr=!0,n.forceKeepAttr=void 0,bt(pe.uponSanitizeAttribute,e,n),p=n.attrValue,!We||"id"!==s&&"name"!==s||(yt(a,e),p="user-content-"+p),ke&&A(/((--!?|])>)|<\/(style|title)/i,p)){yt(a,e);continue}if(n.forceKeepAttr)continue;if(yt(a,e),!n.keepAttr)continue;if(!xe&&A(/\/>/i,p)){yt(a,e);continue}Me&&u([fe,de,he],(e=>{p=g(p,e," ")}));const f=ut(e.nodeName);if(Rt(f,s,p)){if(ie&&"object"==typeof G&&"function"==typeof G.getAttributeType)if(l);else switch(G.getAttributeType(f,s)){case"TrustedHTML":p=ie.createHTML(p);break;case"TrustedScriptURL":p=ie.createScriptURL(p)}try{l?e.setAttributeNS(l,a,p):e.setAttribute(a,p),_t(e)?Tt(e):m(o.removed)}catch(e){}}}bt(pe.afterSanitizeAttributes,e,null)},Dt=function e(t){let n=null;const o=At(t);for(bt(pe.beforeSanitizeShadowDOM,t,null);n=o.nextNode();)bt(pe.uponSanitizeShadowNode,n,null),Nt(n),Ot(n),n.content instanceof s&&e(n.content);bt(pe.afterSanitizeShadowDOM,t,null)};return o.sanitize=function(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=null,r=null,i=null,l=null;if(nt=!e,nt&&(e="\x3c!--\x3e"),"string"!=typeof e&&!St(e)){if("function"!=typeof e.toString)throw _("toString is not a function");if("string"!=typeof(e=e.toString()))throw _("dirty is not a string, aborting")}if(!o.isSupported)return e;if(Ue||dt(t),o.removed=[],"string"==typeof e&&(Ye=!1),Ye){if(e.nodeName){const t=ut(e.nodeName);if(!Se[t]||Oe[t])throw _("root node is forbidden and cannot be sanitized in-place")}}else if(e instanceof b)n=Et("\x3c!----\x3e"),r=n.ownerDocument.importNode(e,!0),r.nodeType===V&&"BODY"===r.nodeName||"HTML"===r.nodeName?n=r:n.appendChild(r);else{if(!Pe&&!Me&&!Ie&&-1===e.indexOf("<"))return ie&&Fe?ie.createHTML(e):e;if(n=Et(e),!n)return Pe?null:Fe?ae:""}n&&ze&&Tt(n.firstChild);const c=At(Ye?e:n);for(;i=c.nextNode();)Nt(i),Ot(i),i.content instanceof s&&Dt(i.content);if(Ye)return e;if(Pe){if(He)for(l=se.call(n.ownerDocument);n.firstChild;)l.appendChild(n.firstChild);else l=n;return(Ne.shadowroot||Ne.shadowrootmode)&&(l=me.call(a,l,!0)),l}let m=Ie?n.outerHTML:n.innerHTML;return Ie&&Se["!doctype"]&&n.ownerDocument&&n.ownerDocument.doctype&&n.ownerDocument.doctype.name&&A(q,n.ownerDocument.doctype.name)&&(m="<!DOCTYPE "+n.ownerDocument.doctype.name+">\n"+m),Me&&u([fe,de,he],(e=>{m=g(m,e," ")})),ie&&Fe?ie.createHTML(m):m},o.setConfig=function(){dt(arguments.length>0&&void 0!==arguments[0]?arguments[0]:{}),Ue=!0},o.clearConfig=function(){mt=null,Ue=!1},o.isValidAttribute=function(e,t,n){mt||dt({});const o=ut(e),r=ut(t);return Rt(o,r,n)},o.addHook=function(e,t){"function"==typeof t&&p(pe[e],t)},o.removeHook=function(e){return m(pe[e])},o.removeHooks=function(e){pe[e]=[]},o.removeAllHooks=function(){pe={afterSanitizeAttributes:[],afterSanitizeElements:[],afterSanitizeShadowDOM:[],beforeSanitizeAttributes:[],beforeSanitizeElements:[],beforeSanitizeShadowDOM:[],uponSanitizeAttribute:[],uponSanitizeElement:[],uponSanitizeShadowNode:[]}},o}();return ne}));
3
3
  //# sourceMappingURL=purify.min.js.map
package/package.json CHANGED
@@ -7,10 +7,10 @@
7
7
  "commit-amend-build": "scripts/commit-amend-build.sh",
8
8
  "prebuild": "rimraf dist/**",
9
9
  "dev": "cross-env NODE_ENV=development BABEL_ENV=rollup rollup -w -c -o dist/purify.js",
10
- "build": "run-s build:types build:rollup build:fix-cjs-types build:cleanup",
10
+ "build": "run-s build:types build:rollup build:fix-types build:cleanup",
11
11
  "build:types": "tsc --outDir dist/types --declaration --emitDeclarationOnly",
12
12
  "build:rollup": "rollup -c",
13
- "build:fix-cjs-types": "node ./scripts/fix-cjs-types.js",
13
+ "build:fix-types": "node ./scripts/fix-types.js",
14
14
  "build:umd": "rollup -c -f umd -o dist/purify.js",
15
15
  "build:umd:min": "rollup -c -f umd -o dist/purify.min.js -p terser",
16
16
  "build:es": "rollup -c -f es -o dist/purify.es.mjs",
@@ -103,6 +103,7 @@
103
103
  "@rollup/plugin-replace": "^6.0.1",
104
104
  "@rollup/plugin-terser": "^0.4.4",
105
105
  "@types/estree": "^1.0.0",
106
+ "@types/node": "^16.18.120",
106
107
  "cross-env": "^7.0.3",
107
108
  "eslint-config-prettier": "^8.5.0",
108
109
  "eslint-plugin-prettier": "^4.0.0",
@@ -135,7 +136,7 @@
135
136
  },
136
137
  "name": "dompurify",
137
138
  "description": "DOMPurify is a DOM-only, super-fast, uber-tolerant XSS sanitizer for HTML, MathML and SVG. It's written in JavaScript and works in all modern browsers (Safari, Opera (15+), Internet Explorer (10+), Firefox and Chrome - as well as almost anything else using Blink or WebKit). DOMPurify is written by security people who have vast background in web attacks and XSS. Fear not.",
138
- "version": "3.2.1",
139
+ "version": "3.2.3",
139
140
  "directories": {
140
141
  "test": "test"
141
142
  },