@coveo/atomic-react 3.11.18 → 3.11.20

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.
@@ -465,7 +465,7 @@ const renderBreadcrumbContainer = ({ props })=>(children)=>{
465
465
  </div>`;
466
466
  };
467
467
 
468
- /*! @license DOMPurify 3.4.0 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.4.0/LICENSE */
468
+ /*! @license DOMPurify 3.4.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.4.1/LICENSE */
469
469
 
470
470
  const {
471
471
  entries,
@@ -514,13 +514,19 @@ const arrayLastIndexOf = unapply(Array.prototype.lastIndexOf);
514
514
  const arrayPop = unapply(Array.prototype.pop);
515
515
  const arrayPush = unapply(Array.prototype.push);
516
516
  const arraySplice = unapply(Array.prototype.splice);
517
+ const arrayIsArray = Array.isArray;
517
518
  const stringToLowerCase = unapply(String.prototype.toLowerCase);
518
519
  const stringToString = unapply(String.prototype.toString);
519
520
  const stringMatch = unapply(String.prototype.match);
520
521
  const stringReplace = unapply(String.prototype.replace);
521
522
  const stringIndexOf = unapply(String.prototype.indexOf);
522
523
  const stringTrim = unapply(String.prototype.trim);
524
+ const numberToString = unapply(Number.prototype.toString);
525
+ const booleanToString = unapply(Boolean.prototype.toString);
526
+ const bigintToString = typeof BigInt === 'undefined' ? null : unapply(BigInt.prototype.toString);
527
+ const symbolToString = typeof Symbol === 'undefined' ? null : unapply(Symbol.prototype.toString);
523
528
  const objectHasOwnProperty = unapply(Object.prototype.hasOwnProperty);
529
+ const objectToString$1 = unapply(Object.prototype.toString);
524
530
  const regExpTest = unapply(RegExp.prototype.test);
525
531
  const typeErrorCreate = unconstruct(TypeError);
526
532
  /**
@@ -570,6 +576,9 @@ function addToSet(set, array) {
570
576
  // Prevent prototype setters from intercepting set as a this value.
571
577
  setPrototypeOf(set, null);
572
578
  }
579
+ if (!arrayIsArray(array)) {
580
+ return set;
581
+ }
573
582
  let l = array.length;
574
583
  while (l--) {
575
584
  let element = array[l];
@@ -613,7 +622,7 @@ function clone$1(object) {
613
622
  for (const [property, value] of entries(object)) {
614
623
  const isPropertyExist = objectHasOwnProperty(object, property);
615
624
  if (isPropertyExist) {
616
- if (Array.isArray(value)) {
625
+ if (arrayIsArray(value)) {
617
626
  newObject[property] = cleanArray(value);
618
627
  } else if (value && typeof value === 'object' && value.constructor === Object) {
619
628
  newObject[property] = clone$1(value);
@@ -624,6 +633,58 @@ function clone$1(object) {
624
633
  }
625
634
  return newObject;
626
635
  }
636
+ /**
637
+ * Convert non-node values into strings without depending on direct property access.
638
+ *
639
+ * @param value - The value to stringify.
640
+ * @returns A string representation of the provided value.
641
+ */
642
+ function stringifyValue(value) {
643
+ switch (typeof value) {
644
+ case 'string':
645
+ {
646
+ return value;
647
+ }
648
+ case 'number':
649
+ {
650
+ return numberToString(value);
651
+ }
652
+ case 'boolean':
653
+ {
654
+ return booleanToString(value);
655
+ }
656
+ case 'bigint':
657
+ {
658
+ return bigintToString ? bigintToString(value) : '0';
659
+ }
660
+ case 'symbol':
661
+ {
662
+ return symbolToString ? symbolToString(value) : 'Symbol()';
663
+ }
664
+ case 'undefined':
665
+ {
666
+ return objectToString$1(value);
667
+ }
668
+ case 'function':
669
+ case 'object':
670
+ {
671
+ if (value === null) {
672
+ return objectToString$1(value);
673
+ }
674
+ const valueAsRecord = value;
675
+ const valueToString = lookupGetter(valueAsRecord, 'toString');
676
+ if (typeof valueToString === 'function') {
677
+ const stringified = valueToString(valueAsRecord);
678
+ return typeof stringified === 'string' ? stringified : objectToString$1(stringified);
679
+ }
680
+ return objectToString$1(value);
681
+ }
682
+ default:
683
+ {
684
+ return objectToString$1(value);
685
+ }
686
+ }
687
+ }
627
688
  /**
628
689
  * This method automatically checks if the prop is function or getter and behaves accordingly.
629
690
  *
@@ -649,6 +710,14 @@ function lookupGetter(object, prop) {
649
710
  }
650
711
  return fallbackValue;
651
712
  }
713
+ function isRegex(value) {
714
+ try {
715
+ regExpTest(value, '');
716
+ return true;
717
+ } catch (_unused) {
718
+ return false;
719
+ }
720
+ }
652
721
 
653
722
  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', 'search', 'section', 'select', 'shadow', 'slot', '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']);
654
723
  const svg$1 = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'enterkeyhint', 'exportparts', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'inputmode', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'part', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'view', 'vkern']);
@@ -664,7 +733,7 @@ const mathMl$1 = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mgly
664
733
  const mathMlDisallowed = freeze(['maction', 'maligngroup', 'malignmark', 'mlongdiv', 'mscarries', 'mscarry', 'msgroup', 'mstack', 'msline', 'msrow', 'semantics', 'annotation', 'annotation-xml', 'mprescripts', 'none']);
665
734
  const text = freeze(['#text']);
666
735
 
667
- const html = freeze(['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', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', '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', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns', 'slot']);
736
+ const html = freeze(['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', 'exportparts', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'inert', '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', 'part', 'pattern', 'placeholder', 'playsinline', 'popover', 'popovertarget', 'popovertargetaction', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'slot', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'translate', 'type', 'usemap', 'valign', 'value', 'width', 'wrap', 'xmlns']);
668
737
  const svg = freeze(['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', 'mask-type', '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']);
669
738
  const mathMl = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnalign', 'columnlines', 'columnspacing', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lquote', 'lspace', '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']);
670
739
  const xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
@@ -684,17 +753,17 @@ const DOCTYPE_NAME = seal(/^html$/i);
684
753
  const CUSTOM_ELEMENT = seal(/^[a-z][.\w]*(-[.\w]+)+$/i);
685
754
 
686
755
  var EXPRESSIONS = /*#__PURE__*/Object.freeze({
687
- __proto__: null,
688
- ARIA_ATTR: ARIA_ATTR,
689
- ATTR_WHITESPACE: ATTR_WHITESPACE,
690
- CUSTOM_ELEMENT: CUSTOM_ELEMENT,
691
- DATA_ATTR: DATA_ATTR,
692
- DOCTYPE_NAME: DOCTYPE_NAME,
693
- ERB_EXPR: ERB_EXPR,
694
- IS_ALLOWED_URI: IS_ALLOWED_URI,
695
- IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
696
- MUSTACHE_EXPR: MUSTACHE_EXPR,
697
- TMPLIT_EXPR: TMPLIT_EXPR
756
+ __proto__: null,
757
+ ARIA_ATTR: ARIA_ATTR,
758
+ ATTR_WHITESPACE: ATTR_WHITESPACE,
759
+ CUSTOM_ELEMENT: CUSTOM_ELEMENT,
760
+ DATA_ATTR: DATA_ATTR,
761
+ DOCTYPE_NAME: DOCTYPE_NAME,
762
+ ERB_EXPR: ERB_EXPR,
763
+ IS_ALLOWED_URI: IS_ALLOWED_URI,
764
+ IS_SCRIPT_OR_DATA: IS_SCRIPT_OR_DATA,
765
+ MUSTACHE_EXPR: MUSTACHE_EXPR,
766
+ TMPLIT_EXPR: TMPLIT_EXPR
698
767
  });
699
768
 
700
769
  /* eslint-disable @typescript-eslint/indent */
@@ -763,7 +832,7 @@ const _createHooksMap = function _createHooksMap() {
763
832
  function createDOMPurify() {
764
833
  let window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
765
834
  const DOMPurify = root => createDOMPurify(root);
766
- DOMPurify.version = '3.4.0';
835
+ DOMPurify.version = '3.4.1';
767
836
  DOMPurify.removed = [];
768
837
  if (!window || !window.document || window.document.nodeType !== NODE_TYPE.document || !window.Element) {
769
838
  // Not running in a browser, provide a factory function
@@ -1011,15 +1080,15 @@ function createDOMPurify() {
1011
1080
  // HTML tags and attributes are not case-sensitive, converting to lowercase. Keeping XHTML as is.
1012
1081
  transformCaseFunc = PARSER_MEDIA_TYPE === 'application/xhtml+xml' ? stringToString : stringToLowerCase;
1013
1082
  /* Set configuration parameters */
1014
- ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
1015
- ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
1016
- ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
1017
- URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') ? addToSet(clone$1(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;
1018
- DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') ? addToSet(clone$1(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;
1019
- FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
1020
- FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone$1({});
1021
- FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone$1({});
1022
- USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES : false;
1083
+ ALLOWED_TAGS = objectHasOwnProperty(cfg, 'ALLOWED_TAGS') && arrayIsArray(cfg.ALLOWED_TAGS) ? addToSet({}, cfg.ALLOWED_TAGS, transformCaseFunc) : DEFAULT_ALLOWED_TAGS;
1084
+ ALLOWED_ATTR = objectHasOwnProperty(cfg, 'ALLOWED_ATTR') && arrayIsArray(cfg.ALLOWED_ATTR) ? addToSet({}, cfg.ALLOWED_ATTR, transformCaseFunc) : DEFAULT_ALLOWED_ATTR;
1085
+ ALLOWED_NAMESPACES = objectHasOwnProperty(cfg, 'ALLOWED_NAMESPACES') && arrayIsArray(cfg.ALLOWED_NAMESPACES) ? addToSet({}, cfg.ALLOWED_NAMESPACES, stringToString) : DEFAULT_ALLOWED_NAMESPACES;
1086
+ URI_SAFE_ATTRIBUTES = objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR) ? addToSet(clone$1(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR, transformCaseFunc) : DEFAULT_URI_SAFE_ATTRIBUTES;
1087
+ DATA_URI_TAGS = objectHasOwnProperty(cfg, 'ADD_DATA_URI_TAGS') && arrayIsArray(cfg.ADD_DATA_URI_TAGS) ? addToSet(clone$1(DEFAULT_DATA_URI_TAGS), cfg.ADD_DATA_URI_TAGS, transformCaseFunc) : DEFAULT_DATA_URI_TAGS;
1088
+ FORBID_CONTENTS = objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS) ? addToSet({}, cfg.FORBID_CONTENTS, transformCaseFunc) : DEFAULT_FORBID_CONTENTS;
1089
+ FORBID_TAGS = objectHasOwnProperty(cfg, 'FORBID_TAGS') && arrayIsArray(cfg.FORBID_TAGS) ? addToSet({}, cfg.FORBID_TAGS, transformCaseFunc) : clone$1({});
1090
+ FORBID_ATTR = objectHasOwnProperty(cfg, 'FORBID_ATTR') && arrayIsArray(cfg.FORBID_ATTR) ? addToSet({}, cfg.FORBID_ATTR, transformCaseFunc) : clone$1({});
1091
+ USE_PROFILES = objectHasOwnProperty(cfg, 'USE_PROFILES') ? cfg.USE_PROFILES && typeof cfg.USE_PROFILES === 'object' ? clone$1(cfg.USE_PROFILES) : cfg.USE_PROFILES : false;
1023
1092
  ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true
1024
1093
  ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
1025
1094
  ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
@@ -1035,19 +1104,20 @@ function createDOMPurify() {
1035
1104
  SANITIZE_NAMED_PROPS = cfg.SANITIZE_NAMED_PROPS || false; // Default false
1036
1105
  KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
1037
1106
  IN_PLACE = cfg.IN_PLACE || false; // Default false
1038
- IS_ALLOWED_URI$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI;
1039
- NAMESPACE = cfg.NAMESPACE || HTML_NAMESPACE;
1040
- MATHML_TEXT_INTEGRATION_POINTS = cfg.MATHML_TEXT_INTEGRATION_POINTS || MATHML_TEXT_INTEGRATION_POINTS;
1041
- HTML_INTEGRATION_POINTS = cfg.HTML_INTEGRATION_POINTS || HTML_INTEGRATION_POINTS;
1042
- CUSTOM_ELEMENT_HANDLING = cfg.CUSTOM_ELEMENT_HANDLING || create(null);
1043
- if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck)) {
1044
- CUSTOM_ELEMENT_HANDLING.tagNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.tagNameCheck;
1107
+ IS_ALLOWED_URI$1 = isRegex(cfg.ALLOWED_URI_REGEXP) ? cfg.ALLOWED_URI_REGEXP : IS_ALLOWED_URI; // Default regexp
1108
+ NAMESPACE = typeof cfg.NAMESPACE === 'string' ? cfg.NAMESPACE : HTML_NAMESPACE; // Default HTML namespace
1109
+ MATHML_TEXT_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'MATHML_TEXT_INTEGRATION_POINTS') && cfg.MATHML_TEXT_INTEGRATION_POINTS && typeof cfg.MATHML_TEXT_INTEGRATION_POINTS === 'object' ? clone$1(cfg.MATHML_TEXT_INTEGRATION_POINTS) : addToSet({}, ['mi', 'mo', 'mn', 'ms', 'mtext']); // Default built-in map
1110
+ HTML_INTEGRATION_POINTS = objectHasOwnProperty(cfg, 'HTML_INTEGRATION_POINTS') && cfg.HTML_INTEGRATION_POINTS && typeof cfg.HTML_INTEGRATION_POINTS === 'object' ? clone$1(cfg.HTML_INTEGRATION_POINTS) : addToSet({}, ['annotation-xml']); // Default built-in map
1111
+ const customElementHandling = objectHasOwnProperty(cfg, 'CUSTOM_ELEMENT_HANDLING') && cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING === 'object' ? clone$1(cfg.CUSTOM_ELEMENT_HANDLING) : create(null);
1112
+ CUSTOM_ELEMENT_HANDLING = create(null);
1113
+ if (objectHasOwnProperty(customElementHandling, 'tagNameCheck') && isRegexOrFunction(customElementHandling.tagNameCheck)) {
1114
+ CUSTOM_ELEMENT_HANDLING.tagNameCheck = customElementHandling.tagNameCheck; // Default undefined
1045
1115
  }
1046
- if (cfg.CUSTOM_ELEMENT_HANDLING && isRegexOrFunction(cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck)) {
1047
- CUSTOM_ELEMENT_HANDLING.attributeNameCheck = cfg.CUSTOM_ELEMENT_HANDLING.attributeNameCheck;
1116
+ if (objectHasOwnProperty(customElementHandling, 'attributeNameCheck') && isRegexOrFunction(customElementHandling.attributeNameCheck)) {
1117
+ CUSTOM_ELEMENT_HANDLING.attributeNameCheck = customElementHandling.attributeNameCheck; // Default undefined
1048
1118
  }
1049
- if (cfg.CUSTOM_ELEMENT_HANDLING && typeof cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements === 'boolean') {
1050
- CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = cfg.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements;
1119
+ if (objectHasOwnProperty(customElementHandling, 'allowCustomizedBuiltInElements') && typeof customElementHandling.allowCustomizedBuiltInElements === 'boolean') {
1120
+ CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements = customElementHandling.allowCustomizedBuiltInElements; // Default undefined
1051
1121
  }
1052
1122
  if (SAFE_FOR_TEMPLATES) {
1053
1123
  ALLOW_DATA_ATTR = false;
@@ -1084,36 +1154,36 @@ function createDOMPurify() {
1084
1154
  EXTRA_ELEMENT_HANDLING.tagCheck = null;
1085
1155
  EXTRA_ELEMENT_HANDLING.attributeCheck = null;
1086
1156
  /* Merge configuration parameters */
1087
- if (cfg.ADD_TAGS) {
1157
+ if (objectHasOwnProperty(cfg, 'ADD_TAGS')) {
1088
1158
  if (typeof cfg.ADD_TAGS === 'function') {
1089
1159
  EXTRA_ELEMENT_HANDLING.tagCheck = cfg.ADD_TAGS;
1090
- } else {
1160
+ } else if (arrayIsArray(cfg.ADD_TAGS)) {
1091
1161
  if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
1092
1162
  ALLOWED_TAGS = clone$1(ALLOWED_TAGS);
1093
1163
  }
1094
1164
  addToSet(ALLOWED_TAGS, cfg.ADD_TAGS, transformCaseFunc);
1095
1165
  }
1096
1166
  }
1097
- if (cfg.ADD_ATTR) {
1167
+ if (objectHasOwnProperty(cfg, 'ADD_ATTR')) {
1098
1168
  if (typeof cfg.ADD_ATTR === 'function') {
1099
1169
  EXTRA_ELEMENT_HANDLING.attributeCheck = cfg.ADD_ATTR;
1100
- } else {
1170
+ } else if (arrayIsArray(cfg.ADD_ATTR)) {
1101
1171
  if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
1102
1172
  ALLOWED_ATTR = clone$1(ALLOWED_ATTR);
1103
1173
  }
1104
1174
  addToSet(ALLOWED_ATTR, cfg.ADD_ATTR, transformCaseFunc);
1105
1175
  }
1106
1176
  }
1107
- if (cfg.ADD_URI_SAFE_ATTR) {
1177
+ if (objectHasOwnProperty(cfg, 'ADD_URI_SAFE_ATTR') && arrayIsArray(cfg.ADD_URI_SAFE_ATTR)) {
1108
1178
  addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR, transformCaseFunc);
1109
1179
  }
1110
- if (cfg.FORBID_CONTENTS) {
1180
+ if (objectHasOwnProperty(cfg, 'FORBID_CONTENTS') && arrayIsArray(cfg.FORBID_CONTENTS)) {
1111
1181
  if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
1112
1182
  FORBID_CONTENTS = clone$1(FORBID_CONTENTS);
1113
1183
  }
1114
1184
  addToSet(FORBID_CONTENTS, cfg.FORBID_CONTENTS, transformCaseFunc);
1115
1185
  }
1116
- if (cfg.ADD_FORBID_CONTENTS) {
1186
+ if (objectHasOwnProperty(cfg, 'ADD_FORBID_CONTENTS') && arrayIsArray(cfg.ADD_FORBID_CONTENTS)) {
1117
1187
  if (FORBID_CONTENTS === DEFAULT_FORBID_CONTENTS) {
1118
1188
  FORBID_CONTENTS = clone$1(FORBID_CONTENTS);
1119
1189
  }
@@ -1439,7 +1509,6 @@ function createDOMPurify() {
1439
1509
  const childCount = childNodes.length;
1440
1510
  for (let i = childCount - 1; i >= 0; --i) {
1441
1511
  const childClone = cloneNode(childNodes[i], true);
1442
- childClone.__removalCount = (currentNode.__removalCount || 0) + 1;
1443
1512
  parentNode.insertBefore(childClone, getNextSibling(currentNode));
1444
1513
  }
1445
1514
  }
@@ -1514,6 +1583,10 @@ function createDOMPurify() {
1514
1583
  } else ;
1515
1584
  return true;
1516
1585
  };
1586
+ /* Names the HTML spec reserves from valid-custom-element-name; these must
1587
+ * never be treated as basic custom elements even when a permissive
1588
+ * CUSTOM_ELEMENT_HANDLING.tagNameCheck is configured. */
1589
+ const RESERVED_CUSTOM_ELEMENT_NAMES = addToSet({}, ['annotation-xml', 'color-profile', 'font-face', 'font-face-format', 'font-face-name', 'font-face-src', 'font-face-uri', 'missing-glyph']);
1517
1590
  /**
1518
1591
  * _isBasicCustomElement
1519
1592
  * checks if at least one dash is included in tagName, and it's not the first char
@@ -1523,7 +1596,7 @@ function createDOMPurify() {
1523
1596
  * @returns Returns true if the tag name meets the basic criteria for a custom element, otherwise false.
1524
1597
  */
1525
1598
  const _isBasicCustomElement = function _isBasicCustomElement(tagName) {
1526
- return tagName !== 'annotation-xml' && stringMatch(tagName, CUSTOM_ELEMENT);
1599
+ return !RESERVED_CUSTOM_ELEMENT_NAMES[stringToLowerCase(tagName)] && regExpTest(CUSTOM_ELEMENT, tagName);
1527
1600
  };
1528
1601
  /**
1529
1602
  * _sanitizeAttributes
@@ -1574,12 +1647,14 @@ function createDOMPurify() {
1574
1647
  /* Full DOM Clobbering protection via namespace isolation,
1575
1648
  * Prefix id and name attributes with `user-content-`
1576
1649
  */
1577
- if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name')) {
1650
+ if (SANITIZE_NAMED_PROPS && (lcName === 'id' || lcName === 'name') && stringIndexOf(value, SANITIZE_NAMED_PROPS_PREFIX) !== 0) {
1578
1651
  // Remove the attribute with this value
1579
1652
  _removeAttribute(name, currentNode);
1580
1653
  // Prefix the value and later re-create the attribute with the sanitized value
1581
1654
  value = SANITIZE_NAMED_PROPS_PREFIX + value;
1582
1655
  }
1656
+ // Else: already prefixed, leave the attribute alone — the prefix is
1657
+ // itself the clobbering protection, and re-applying it is incorrect.
1583
1658
  /* Work around a security issue with comments inside attributes */
1584
1659
  if (SAFE_FOR_XML && regExpTest(/((--!?|])>)|<\/(style|script|title|xmp|textarea|noscript|iframe|noembed|noframes)/i, value)) {
1585
1660
  _removeAttribute(name, currentNode);
@@ -1696,13 +1771,9 @@ function createDOMPurify() {
1696
1771
  }
1697
1772
  /* Stringify, in case dirty is an object */
1698
1773
  if (typeof dirty !== 'string' && !_isNode(dirty)) {
1699
- if (typeof dirty.toString === 'function') {
1700
- dirty = dirty.toString();
1701
- if (typeof dirty !== 'string') {
1702
- throw typeErrorCreate('dirty is not a string, aborting');
1703
- }
1704
- } else {
1705
- throw typeErrorCreate('toString is not a function');
1774
+ dirty = stringifyValue(dirty);
1775
+ if (typeof dirty !== 'string') {
1776
+ throw typeErrorCreate('dirty is not a string, aborting');
1706
1777
  }
1707
1778
  }
1708
1779
  /* Return dirty HTML if DOMPurify cannot run */
@@ -1721,8 +1792,9 @@ function createDOMPurify() {
1721
1792
  }
1722
1793
  if (IN_PLACE) {
1723
1794
  /* Do some early pre-sanitization to avoid unsafe root nodes */
1724
- if (dirty.nodeName) {
1725
- const tagName = transformCaseFunc(dirty.nodeName);
1795
+ const nn = dirty.nodeName;
1796
+ if (typeof nn === 'string') {
1797
+ const tagName = transformCaseFunc(nn);
1726
1798
  if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
1727
1799
  throw typeErrorCreate('root node is forbidden and cannot be sanitized in-place');
1728
1800
  }
@@ -2044,6 +2116,7 @@ const ATOMIC_CUSTOM_ELEMENT_TAGS = new Set([
2044
2116
  'atomic-generated-answer',
2045
2117
  'atomic-generated-answer-content',
2046
2118
  'atomic-generated-answer-feedback-modal',
2119
+ 'atomic-generated-answer-inline-link',
2047
2120
  'atomic-generated-answer-thread',
2048
2121
  'atomic-generated-answer-thread-item',
2049
2122
  'atomic-html',
@@ -8478,7 +8551,7 @@ function getWindow() {
8478
8551
  }
8479
8552
  function getAtomicEnvironment(headlessVersion) {
8480
8553
  return {
8481
- version: "3.57.1",
8554
+ version: "3.57.3",
8482
8555
  headlessVersion
8483
8556
  };
8484
8557
  }
@@ -8499,7 +8572,51 @@ function augmentAnalyticsConfigWithAtomicVersion() {
8499
8572
  };
8500
8573
  }
8501
8574
 
8575
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: true } : { done: false, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = true, u = false; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = true, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
8576
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
8577
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
8502
8578
  function _typeof$2(o) { "@babel/helpers - typeof"; return _typeof$2 = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof$2(o); }
8579
+ var UNSAFE_KEYS$1 = ['__proto__', 'constructor', 'prototype'];
8580
+ function isSafeUrlSegmentBase(v) {
8581
+ if (typeof v !== 'string') return false;
8582
+ if (v.length === 0 || v.length > 128) return false;
8583
+ if (UNSAFE_KEYS$1.indexOf(v) > -1) return false;
8584
+ if (v.indexOf('..') > -1) return false;
8585
+ if (v.indexOf('\\') > -1) return false;
8586
+ if (/[?#%\s@]/.test(v)) return false;
8587
+ if (/[\x00-\x1F\x7F]/.test(v)) return false;
8588
+ return true;
8589
+ }
8590
+ function isSafeLangUrlSegment(v) {
8591
+ if (!isSafeUrlSegmentBase(v)) return false;
8592
+ if (v.indexOf('/') > -1) return false;
8593
+ return true;
8594
+ }
8595
+ function isSafeNsUrlSegment(v) {
8596
+ return isSafeUrlSegmentBase(v);
8597
+ }
8598
+ var SAFETY_CHECK_BY_KEY = {
8599
+ lng: isSafeLangUrlSegment,
8600
+ ns: isSafeNsUrlSegment
8601
+ };
8602
+ function sanitizeLogValue(v) {
8603
+ if (typeof v !== 'string') return v;
8604
+ return v.replace(/[\r\n\x00-\x1F\x7F]/g, ' ');
8605
+ }
8606
+ function redactUrlCredentials(u) {
8607
+ if (typeof u !== 'string' || u.length === 0) return u;
8608
+ try {
8609
+ var parsed = new URL(u);
8610
+ if (parsed.username || parsed.password) {
8611
+ parsed.username = '';
8612
+ parsed.password = '';
8613
+ return parsed.toString();
8614
+ }
8615
+ return u;
8616
+ } catch (e) {
8617
+ return u.replace(/(\/\/)[^/@\s]+@/g, '$1');
8618
+ }
8619
+ }
8503
8620
  function hasXMLHttpRequest() {
8504
8621
  return typeof XMLHttpRequest === 'function' || (typeof XMLHttpRequest === "undefined" ? "undefined" : _typeof$2(XMLHttpRequest)) === 'object';
8505
8622
  }
@@ -8513,11 +8630,33 @@ function makePromise(maybePromise) {
8513
8630
  return Promise.resolve(maybePromise);
8514
8631
  }
8515
8632
  var interpolationRegexp = /\{\{(.+?)\}\}/g;
8516
- function interpolate(str, data) {
8517
- return str.replace(interpolationRegexp, function (match, key) {
8518
- var value = data[key.trim()];
8519
- return value != null ? value : match;
8633
+ function interpolateUrl(str, data) {
8634
+ var unsafe = false;
8635
+ var result = str.replace(interpolationRegexp, function (match, key) {
8636
+ var k = key.trim();
8637
+ if (UNSAFE_KEYS$1.indexOf(k) > -1) return match;
8638
+ var value = data[k];
8639
+ if (value == null) return match;
8640
+ var check = SAFETY_CHECK_BY_KEY[k] || isSafeLangUrlSegment;
8641
+ var segments = String(value).split('+');
8642
+ var _iterator = _createForOfIteratorHelper(segments),
8643
+ _step;
8644
+ try {
8645
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
8646
+ var seg = _step.value;
8647
+ if (!check(seg)) {
8648
+ unsafe = true;
8649
+ return match;
8650
+ }
8651
+ }
8652
+ } catch (err) {
8653
+ _iterator.e(err);
8654
+ } finally {
8655
+ _iterator.f();
8656
+ }
8657
+ return segments.join('+');
8520
8658
  });
8659
+ return unsafe ? null : result;
8521
8660
  }
8522
8661
 
8523
8662
  function ownKeys$1(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
@@ -8556,10 +8695,13 @@ if (!fetchApi && !XmlHttpRequestApi && !ActiveXObjectApi) {
8556
8695
  }).catch(function () {});
8557
8696
  } catch (e) {}
8558
8697
  }
8698
+ var UNSAFE_KEYS = ['__proto__', 'constructor', 'prototype'];
8559
8699
  var addQueryString = function addQueryString(url, params) {
8560
8700
  if (params && _typeof$1(params) === 'object') {
8561
8701
  var queryString = '';
8562
- for (var paramName in params) {
8702
+ for (var _i = 0, _Object$keys = Object.keys(params); _i < _Object$keys.length; _i++) {
8703
+ var paramName = _Object$keys[_i];
8704
+ if (UNSAFE_KEYS.indexOf(paramName) > -1) continue;
8563
8705
  queryString += '&' + encodeURIComponent(paramName) + '=' + encodeURIComponent(params[paramName]);
8564
8706
  }
8565
8707
  if (!queryString) return url;
@@ -8592,7 +8734,6 @@ var fetchIt = function fetchIt(url, fetchOptions, callback, altFetch) {
8592
8734
  fetchApi(url, fetchOptions).then(resolver).catch(callback);
8593
8735
  }
8594
8736
  };
8595
- var omitFetchOptions = false;
8596
8737
  var requestWithFetch = function requestWithFetch(options, url, payload, callback) {
8597
8738
  if (options.queryStringParams) {
8598
8739
  url = addQueryString(url, options.queryStringParams);
@@ -8607,7 +8748,7 @@ var requestWithFetch = function requestWithFetch(options, url, payload, callback
8607
8748
  method: payload ? 'POST' : 'GET',
8608
8749
  body: payload ? options.stringify(payload) : undefined,
8609
8750
  headers: headers
8610
- }, omitFetchOptions ? {} : reqOptions);
8751
+ }, options._omitFetchOptions ? {} : reqOptions);
8611
8752
  var altFetch = typeof options.alternateFetch === 'function' && options.alternateFetch.length >= 1 ? options.alternateFetch : undefined;
8612
8753
  try {
8613
8754
  fetchIt(url, fetchOptions, callback, altFetch);
@@ -8620,7 +8761,7 @@ var requestWithFetch = function requestWithFetch(options, url, payload, callback
8620
8761
  delete fetchOptions[opt];
8621
8762
  });
8622
8763
  fetchIt(url, fetchOptions, callback, altFetch);
8623
- omitFetchOptions = true;
8764
+ options._omitFetchOptions = true;
8624
8765
  } catch (err) {
8625
8766
  callback(err);
8626
8767
  }
@@ -8649,7 +8790,9 @@ var requestWithXmlHttpRequest = function requestWithXmlHttpRequest(options, url,
8649
8790
  var h = options.customHeaders;
8650
8791
  h = typeof h === 'function' ? h() : h;
8651
8792
  if (h) {
8652
- for (var i in h) {
8793
+ for (var _i2 = 0, _Object$keys2 = Object.keys(h); _i2 < _Object$keys2.length; _i2++) {
8794
+ var i = _Object$keys2[_i2];
8795
+ if (UNSAFE_KEYS.indexOf(i) > -1) continue;
8653
8796
  x.setRequestHeader(i, h[i]);
8654
8797
  }
8655
8798
  }
@@ -8764,10 +8907,15 @@ var Backend = function () {
8764
8907
  loadPath = makePromise(loadPath);
8765
8908
  loadPath.then(function (resolvedLoadPath) {
8766
8909
  if (!resolvedLoadPath) return callback(null, {});
8767
- var url = interpolate(resolvedLoadPath, {
8910
+ var url = interpolateUrl(resolvedLoadPath, {
8768
8911
  lng: languages.join('+'),
8769
8912
  ns: namespaces.join('+')
8770
8913
  });
8914
+ if (url == null) {
8915
+ var safeLngs = languages.map(sanitizeLogValue).join(', ');
8916
+ var safeNss = namespaces.map(sanitizeLogValue).join(', ');
8917
+ return callback(new Error('i18next-http-backend: unsafe lng/ns value — refusing to build request URL for languages=[' + safeLngs + '] namespaces=[' + safeNss + ']'), false);
8918
+ }
8771
8919
  _this2.loadUrl(url, callback, loadUrlLanguages, loadUrlNamespaces);
8772
8920
  });
8773
8921
  }
@@ -8778,16 +8926,17 @@ var Backend = function () {
8778
8926
  var lng = typeof languages === 'string' ? [languages] : languages;
8779
8927
  var ns = typeof namespaces === 'string' ? [namespaces] : namespaces;
8780
8928
  var payload = this.options.parseLoadPayload(lng, ns);
8929
+ var safeUrl = sanitizeLogValue(redactUrlCredentials(url));
8781
8930
  this.options.request(this.options, url, payload, function (err, res) {
8782
- if (res && (res.status >= 500 && res.status < 600 || !res.status)) return callback('failed loading ' + url + '; status code: ' + res.status, true);
8783
- if (res && res.status >= 400 && res.status < 500) return callback('failed loading ' + url + '; status code: ' + res.status, false);
8931
+ if (res && (res.status >= 500 && res.status < 600 || !res.status)) return callback('failed loading ' + safeUrl + '; status code: ' + res.status, true);
8932
+ if (res && res.status >= 400 && res.status < 500) return callback('failed loading ' + safeUrl + '; status code: ' + res.status, false);
8784
8933
  if (!res && err && err.message) {
8785
8934
  var errorMessage = err.message.toLowerCase();
8786
8935
  var isNetworkError = ['failed', 'fetch', 'network', 'load'].find(function (term) {
8787
8936
  return errorMessage.indexOf(term) > -1;
8788
8937
  });
8789
8938
  if (isNetworkError) {
8790
- return callback('failed loading ' + url + ': ' + err.message, true);
8939
+ return callback('failed loading ' + safeUrl + ': ' + sanitizeLogValue(err.message), true);
8791
8940
  }
8792
8941
  }
8793
8942
  if (err) return callback(err, false);
@@ -8799,7 +8948,7 @@ var Backend = function () {
8799
8948
  ret = res.data;
8800
8949
  }
8801
8950
  } catch (e) {
8802
- parseErr = 'failed parsing ' + url + ' to json';
8951
+ parseErr = 'failed parsing ' + safeUrl + ' to json';
8803
8952
  }
8804
8953
  if (parseErr) return callback(parseErr, false);
8805
8954
  callback(null, ret);
@@ -8820,10 +8969,15 @@ var Backend = function () {
8820
8969
  if (typeof _this4.options.addPath === 'function') {
8821
8970
  addPath = _this4.options.addPath(lng, namespace);
8822
8971
  }
8823
- var url = interpolate(addPath, {
8972
+ var url = interpolateUrl(addPath, {
8824
8973
  lng: lng,
8825
8974
  ns: namespace
8826
8975
  });
8976
+ if (url == null) {
8977
+ finished += 1;
8978
+ if (callback && finished === languages.length) callback(dataArray, resArray);
8979
+ return;
8980
+ }
8827
8981
  _this4.options.request(_this4.options, url, payload, function (data, res) {
8828
8982
  finished += 1;
8829
8983
  dataArray.push(data);