TINY-12056: update dompurify version and remove patch (#10388)

* TINY-12056: update dompurify version and remove patch

* update regexp

* TINY-12056: add better description

* TINY-12056: fix failing tests

* TINY-12056: fix failing tests

* TINY-12056: code cleanup, remove g flag from regexp

* TINY-12056: add changelog

* TINY-12056: add changelog

* TINY-12056: add changelog

* TINY-12056: add changelog

* TINY-12056: turn on SAFE_FOR_XML

* TINY-12056: update failing test

* TINY-12056: update failing tests

* TINY-12056: update changeset

* TINY-12056: update files with new dompurify version

* TINY-12056: update yarn.lock

* TINY-12056: update changeset and license files
This commit is contained in:
michalnieruchalski-tiugo
2025-06-23 14:12:19 +02:00
committed by GitHub
parent 55882cbb42
commit 3d42343c34
12 changed files with 52 additions and 299 deletions

View File

@ -0,0 +1,7 @@
project: tinymce
kind: Changed
body: Comments with HTML like content, attributes with HTML
like values, elements with HTML Comment like textContent are no longer retained while content sanitization is active.
time: 2025-06-16T15:59:32.909609+02:00
custom:
Issue: TINY-12056

View File

@ -1,10 +1,10 @@
Below is a list of third party libraries that this software uses:
----------------------------------------------------------------
dompurify - Patched by Tiny
dompurify
owner: Mario Heiderich
repo: https://github.com/cure53/DOMPurify
version: 3.2.4
version: 3.2.6
license: MPL-2.0 OR Apache-2.0
prismjs

View File

@ -497,7 +497,6 @@ module.exports = function (grunt) {
'modules/*/.stylelintrc',
'modules/tinymce/tools',
'bin',
'patches',
'.yarnrc',
'LICENSE.md',
'NOTICES.txt',

View File

@ -34,7 +34,7 @@
"@tinymce/oxide": "^3.0.0",
"@tinymce/oxide-icons-default": "^3.0.0",
"@types/prismjs": "^1.16.6",
"dompurify": "3.2.4",
"dompurify": "3.2.6",
"prismjs": "^1.27.0"
},
"devDependencies": {

View File

@ -179,17 +179,14 @@ const setupPurify = (settings: DomParserSettings, schema: Schema, namespaceTrack
};
const getPurifyConfig = (settings: DomParserSettings, mimeType: MimeType): Config => {
// Current dompurify types only cover up to 3.0.5 which does not include this new setting
const basePurifyConfig: Config & { SAFE_FOR_XML: boolean } = {
const basePurifyConfig: Config = {
IN_PLACE: true,
ALLOW_UNKNOWN_PROTOCOLS: true,
// Deliberately ban all tags and attributes by default, and then un-ban them on demand in hooks
// #comment and #cdata-section are always allowed as they aren't controlled via the schema
// body is also allowed due to the DOMPurify checking the root node before sanitizing
ALLOWED_TAGS: [ '#comment', '#cdata-section', 'body' ],
ALLOWED_ATTR: [],
// TINY-11332: New settings for dompurify 3.1.7
SAFE_FOR_XML: false
ALLOWED_ATTR: []
};
const config = { ...basePurifyConfig };

View File

@ -435,7 +435,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with a HTML comment and less than with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><!-- 1 < 2; // --></s' + 'cript>');
@ -443,7 +443,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with a HTML comment and less than', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><!-- 1 < 2; // --></s' + 'cript>');
@ -451,7 +451,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with white space in beginning, comment and less than with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>\n\n<!-- 1 < 2;\n\n--></s' + 'cript>');
@ -459,7 +459,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with white space in beginning, comment and less than', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>\n\n<!-- 1 < 2;\n\n--></s' + 'cript>');
@ -467,7 +467,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with comments and cdata with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>// <![CDATA[1 < 2; // ]]></s' + 'cript>');
@ -475,7 +475,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with comments and cdata', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>// <![CDATA[1 < 2; // ]]></s' + 'cript>');
@ -483,7 +483,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with cdata with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><![CDATA[1 < 2; ]]></s' + 'cript>');
@ -491,7 +491,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with cdata', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><![CDATA[1 < 2; ]]></s' + 'cript>');
@ -499,7 +499,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script whitespace in beginning/end and cdata with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>\n\n<![CDATA[\n\n1 < 2;\n\n]]>\n\n</s' + 'cript>');
@ -507,7 +507,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script whitespace in beginning/end and cdata', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>\n\n<![CDATA[\n\n1 < 2;\n\n]]>\n\n</s' + 'cript>');
@ -531,7 +531,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with HTML comment, comment and CDATA with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><!--// <![CDATA[var hi = "hello";// ]]>--></s' + 'cript>');
@ -539,7 +539,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with HTML comment, comment and CDATA', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><!--// <![CDATA[var hi = "hello";// ]]>--></s' + 'cript>');
@ -547,7 +547,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with block comment around cdata with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>/* <![CDATA[ */\nvar hi = "hello";\n/* ]]> */</s' + 'cript>');
@ -555,7 +555,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with block comment around cdata', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>/* <![CDATA[ */\nvar hi = "hello";\n/* ]]> */</s' + 'cript>');
@ -563,7 +563,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with html comment and block comment around cdata with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><!-- /* <![CDATA[ */\nvar hi = "hello";\n/* ]]>*/--></s' + 'cript>');
@ -571,7 +571,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with html comment and block comment around cdata', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script><!-- /* <![CDATA[ */\nvar hi = "hello";\n/* ]]>*/--></s' + 'cript>');
@ -579,7 +579,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with line comment and html comment with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>// <!--\nvar hi = "hello";\n// --></s' + 'cript>');
@ -587,7 +587,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with line comment and html comment', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>// <!--\nvar hi = "hello";\n// --></s' + 'cript>');
@ -595,7 +595,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with block comment around html comment with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, element_format: 'xhtml', sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>/* <!-- */\nvar hi = "hello";\n/*-->*/</s' + 'cript>');
@ -603,7 +603,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Script with block comment around html comment', () => {
const ser = DomSerializer({ fix_list_elements: true });
const ser = DomSerializer({ fix_list_elements: true, sanitize: false });
ser.setRules('script[type|language|src]');
setTestHtml('<script>/* <!-- */\nvar hi = "hello";\n/*-->*/</s' + 'cript>');
@ -642,7 +642,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Style with cdata with element_format: xhtml', () => {
const ser = DomSerializer({ fix_list_elements: true, valid_children: '+body[style]', element_format: 'xhtml' });
const ser = DomSerializer({ fix_list_elements: true, valid_children: '+body[style]', element_format: 'xhtml', sanitize: false });
ser.setRules('style');
setTestHtml('<style>\r\n<![CDATA[\r\n body { background:#fff }]]></style>');
@ -650,7 +650,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('Style with cdata', () => {
const ser = DomSerializer({ fix_list_elements: true, valid_children: '+body[style]' });
const ser = DomSerializer({ fix_list_elements: true, valid_children: '+body[style]', sanitize: false });
ser.setRules('style');
setTestHtml('<style>\r\n<![CDATA[\r\n body { background:#fff }]]></style>');
@ -658,7 +658,7 @@ describe('browser.tinymce.core.dom.SerializerTest', () => {
});
it('CDATA', () => {
const ser = DomSerializer({ fix_list_elements: true, preserve_cdata: true });
const ser = DomSerializer({ fix_list_elements: true, preserve_cdata: true, sanitize: false });
ser.setRules('span');
setTestHtml('123<!--[CDATA[<test>]]-->abc');

View File

@ -1049,7 +1049,7 @@ describe('browser.tinymce.core.html.DomParserTest', () => {
assert.equal(serializedHtml, '<div><!--[CDATA[<!--x----><!--y-->--&gt;]]&gt;</div>');
const serializedXHtml = serializer.serialize(parser.parse('<div><![CDATA[<!--x--><!--y-->--><!--]]></div>', { format: 'xhtml' }));
assert.equal(serializedXHtml, '<div><![CDATA[<!--x--><!--y-->--><!--]]></div>');
assert.equal(serializedXHtml, scenario.isSanitizeEnabled ? '' : '<div><![CDATA[<!--x--><!--y-->--><!--]]></div>');
});
it('TINY-7756: Parsing invalid nested children', () => {

View File

@ -1,5 +1,4 @@
/**
* This file bundles the code of
* DOMPurify 3.2.4 | (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.4/LICENSE
* The code included in this file has been modified.
* DOMPurify 3.2.6 | (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.6/LICENSE
*/

View File

@ -122,7 +122,6 @@ describe('browser.tinymce.plugins.media.ContentFormatsTest', () => {
'<param name="allowfullscreen" value="true" />' +
'<param name="allowscriptaccess" value="always" />' +
'<param name="flashvars" value="video_src=s" />' +
'<!--[if IE]><param name="movie" value="../../js/tinymce/plugins/media/moxieplayer.swf" /><![endif]-->' +
'</object>' +
'</video>'
);
@ -141,9 +140,6 @@ describe('browser.tinymce.plugins.media.ContentFormatsTest', () => {
'<param name="allowfullscreen" value="true">' +
'<param name="allowscriptaccess" value="always">' +
'<param name="flashvars" value="video_src=s">' +
'<!--[if IE]>' +
'<param name="movie" value="../../js/tinymce/plugins/media/moxieplayer.swf" />' +
'<![endif]-->' +
'</object>' +
'</video>' +
'</p>'

View File

@ -4,7 +4,6 @@
"modules/*"
],
"scripts": {
"postinstall": "patch-package",
"tinymce-grunt": "grunt --gruntfile modules/tinymce/Gruntfile.js",
"tinymce-rollup": "run-s \"tinymce-grunt dev rollup\"",
"oxide-icons-build": "yarn -s --cwd modules/oxide-icons-default build",
@ -73,7 +72,6 @@
"load-grunt-tasks": "^5.1.0",
"moxie-zip": "0.0.4",
"npm-run-all": "^4.1.5",
"patch-package": "^8.0.0",
"postcss": "^8.4.39",
"postcss-preset-env": "^10.1.3",
"resolve": "^1.18.1",

View File

@ -1,132 +0,0 @@
diff --git a/node_modules/dompurify/dist/purify.es.mjs b/node_modules/dompurify/dist/purify.es.mjs
index 86186cf..9b57304 100644
--- a/node_modules/dompurify/dist/purify.es.mjs
+++ b/node_modules/dompurify/dist/purify.es.mjs
@@ -1054,6 +1054,7 @@ function createDOMPurify() {
} = attr;
const lcName = transformCaseFunc(name);
let value = name === 'value' ? attrValue : stringTrim(attrValue);
+ const initValue = value;
/* Execute a hook if present */
hookEvent.attrName = lcName;
hookEvent.attrValue = value;
@@ -1080,9 +1081,9 @@ function createDOMPurify() {
continue;
}
/* Remove attribute */
- _removeAttribute(name, currentNode);
/* Did the hooks approve of the attribute? */
if (!hookEvent.keepAttr) {
+ _removeAttribute(name, currentNode);
continue;
}
/* Work around a security issue in jQuery 3.0 */
@@ -1099,6 +1100,7 @@ function createDOMPurify() {
/* Is `value` valid for this attribute? */
const lcTag = transformCaseFunc(currentNode.nodeName);
if (!_isValidAttribute(lcTag, lcName, value)) {
+ _removeAttribute(name, currentNode);
continue;
}
/* Handle attributes that require Trusted Types */
@@ -1119,19 +1121,21 @@ function createDOMPurify() {
}
}
/* Handle invalid data-* attribute set by try-catching it */
- try {
- if (namespaceURI) {
- currentNode.setAttributeNS(namespaceURI, name, value);
- } else {
- /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
- currentNode.setAttribute(name, value);
- }
- if (_isClobbered(currentNode)) {
- _forceRemove(currentNode);
- } else {
- arrayPop(DOMPurify.removed);
- }
- } catch (_) {}
+ if (value !== initValue) {
+ try {
+ if (namespaceURI) {
+ currentNode.setAttributeNS(namespaceURI, name, value);
+ } else {
+ /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
+ currentNode.setAttribute(name, value);
+ }
+ if (_isClobbered(currentNode)) {
+ _forceRemove(currentNode);
+ } else {
+ arrayPop(DOMPurify.removed);
+ }
+ } catch (_) {}
+ }
}
/* Execute a hook if present */
_executeHooks(hooks.afterSanitizeAttributes, currentNode, null);
diff --git a/node_modules/dompurify/dist/purify.js b/node_modules/dompurify/dist/purify.js
index a03f326..7bcc749 100644
--- a/node_modules/dompurify/dist/purify.js
+++ b/node_modules/dompurify/dist/purify.js
@@ -1060,6 +1060,7 @@
} = attr;
const lcName = transformCaseFunc(name);
let value = name === 'value' ? attrValue : stringTrim(attrValue);
+ const initValue = value;
/* Execute a hook if present */
hookEvent.attrName = lcName;
hookEvent.attrValue = value;
@@ -1086,9 +1087,9 @@
continue;
}
/* Remove attribute */
- _removeAttribute(name, currentNode);
/* Did the hooks approve of the attribute? */
if (!hookEvent.keepAttr) {
+ _removeAttribute(name, currentNode);
continue;
}
/* Work around a security issue in jQuery 3.0 */
@@ -1105,6 +1106,7 @@
/* Is `value` valid for this attribute? */
const lcTag = transformCaseFunc(currentNode.nodeName);
if (!_isValidAttribute(lcTag, lcName, value)) {
+ _removeAttribute(name, currentNode);
continue;
}
/* Handle attributes that require Trusted Types */
@@ -1125,19 +1127,21 @@
}
}
/* Handle invalid data-* attribute set by try-catching it */
- try {
- if (namespaceURI) {
- currentNode.setAttributeNS(namespaceURI, name, value);
- } else {
- /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
- currentNode.setAttribute(name, value);
- }
- if (_isClobbered(currentNode)) {
- _forceRemove(currentNode);
- } else {
- arrayPop(DOMPurify.removed);
- }
- } catch (_) {}
+ if (value !== initValue) {
+ try {
+ if (namespaceURI) {
+ currentNode.setAttributeNS(namespaceURI, name, value);
+ } else {
+ /* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
+ currentNode.setAttribute(name, value);
+ }
+ if (_isClobbered(currentNode)) {
+ _forceRemove(currentNode);
+ } else {
+ arrayPop(DOMPurify.removed);
+ }
+ } catch (_) {}
+ }
}
/* Execute a hook if present */
_executeHooks(hooks.afterSanitizeAttributes, currentNode, null);

141
yarn.lock
View File

@ -883,15 +883,7 @@
resolved "https://registry.yarnpkg.com/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz#519c1549b0e147759e7825701ecffd25e5819f7b"
integrity sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==
"@emnapi/core@^1.1.0":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.3.1.tgz#9c62d185372d1bddc94682b87f376e03dfac3f16"
integrity sha512-pVGjBIt1Y6gg3EJN8jTcfpP/+uuRksIo055oE/OBkDNcjZqVbfkWCksG1Jp4yZnj3iKWyWX8fdG/j6UDYPbFog==
dependencies:
"@emnapi/wasi-threads" "1.0.1"
tslib "^2.4.0"
"@emnapi/core@^1.4.0":
"@emnapi/core@^1.1.0", "@emnapi/core@^1.4.0":
version "1.4.3"
resolved "https://registry.yarnpkg.com/@emnapi/core/-/core-1.4.3.tgz#9ac52d2d5aea958f67e52c40a065f51de59b77d6"
integrity sha512-4m62DuCE07lw01soJwPiBGC0nAww0Q+RY70VZ+n49yDIO13yyinhbWCeNnaob0lakDtWQzSdtNWzJeOJt2ma+g==
@ -899,14 +891,7 @@
"@emnapi/wasi-threads" "1.0.2"
tslib "^2.4.0"
"@emnapi/runtime@^1.1.0":
version "1.3.1"
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.3.1.tgz#0fcaa575afc31f455fd33534c19381cfce6c6f60"
integrity sha512-kEBmG8KyqtxJZv+ygbEim+KCGtIq1fC22Ms3S4ziXmYKm8uyoLX0MHONVKwp+9opg390VaKRNt4a7A9NwmpNhw==
dependencies:
tslib "^2.4.0"
"@emnapi/runtime@^1.4.0":
"@emnapi/runtime@^1.1.0", "@emnapi/runtime@^1.4.0":
version "1.4.3"
resolved "https://registry.yarnpkg.com/@emnapi/runtime/-/runtime-1.4.3.tgz#c0564665c80dc81c448adac23f9dfbed6c838f7d"
integrity sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==
@ -2437,20 +2422,13 @@
dependencies:
"@types/chai" "*"
"@types/chai@*":
"@types/chai@*", "@types/chai@^5.0.1":
version "5.2.1"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.2.1.tgz#85687a58b27eac736ec0e87e5cb98f21e57a0bb1"
integrity sha512-iu1JLYmGmITRzUgNiLMZD3WCoFzpYtueuyAgHTXqgwSRAMIlFTnZqG6/xenkpUGRJEzSfklUTI4GNSzks/dc0w==
dependencies:
"@types/deep-eql" "*"
"@types/chai@^5.0.1":
version "5.0.1"
resolved "https://registry.yarnpkg.com/@types/chai/-/chai-5.0.1.tgz#2c3705555cf11f5f59c836a84c44afcfe4e5689d"
integrity sha512-5T8ajsg3M/FOncpLYW7sdOcD6yf4+722sze/tc4KQV0P8Z2rAr3SAuHCIkYmYpt8VbcQlnz8SxlOlPQYefe4cA==
dependencies:
"@types/deep-eql" "*"
"@types/connect-history-api-fallback@^1.5.4":
version "1.5.4"
resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.5.4.tgz#7de71645a103056b48ac3ce07b3520b819c1d5b3"
@ -3563,11 +3541,6 @@ asynckit@^0.4.0:
resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
at-least-node@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/at-least-node/-/at-least-node-1.0.0.tgz#602cd4b46e844ad4effc92a8011a3c46e0238dc2"
integrity sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==
autoprefixer@^10.4.19:
version "10.4.20"
resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-10.4.20.tgz#5caec14d43976ef42e32dcb4bd62878e96be5b3b"
@ -3924,7 +3897,7 @@ call-bind-apply-helpers@^1.0.0, call-bind-apply-helpers@^1.0.1:
es-errors "^1.3.0"
function-bind "^1.1.2"
call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bind@^1.0.8:
call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7:
version "1.0.8"
resolved "https://registry.yarnpkg.com/call-bind/-/call-bind-1.0.8.tgz#0736a9660f537e3388826f440d5ec45f744eaa4c"
integrity sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==
@ -3934,7 +3907,7 @@ call-bind@^1.0.2, call-bind@^1.0.5, call-bind@^1.0.6, call-bind@^1.0.7, call-bin
get-intrinsic "^1.2.4"
set-function-length "^1.2.2"
call-bound@^1.0.2, call-bound@^1.0.3:
call-bound@^1.0.2:
version "1.0.3"
resolved "https://registry.yarnpkg.com/call-bound/-/call-bound-1.0.3.tgz#41cfd032b593e39176a71533ab4f384aa04fd681"
integrity sha512-YTd+6wGlNlPxSuri7Y6X8tY2dmm12UMH66RpKMhiX6rsk5wXXnYgbUcOt8kiS31/AjfoTOvCsE+w8nZQLQnzHA==
@ -4088,7 +4061,7 @@ chromium-bidi@0.5.8:
mitt "3.0.1"
urlpattern-polyfill "10.0.0"
ci-info@^3.2.0, ci-info@^3.7.0:
ci-info@^3.2.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4"
integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==
@ -4965,10 +4938,10 @@ domhandler@^4.2.0, domhandler@^4.3.1:
dependencies:
domelementtype "^2.2.0"
dompurify@3.2.4:
version "3.2.4"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.4.tgz#af5a5a11407524431456cf18836c55d13441cd8e"
integrity sha512-ysFSFEDVduQpyhzAob/kkuJjf5zWkZD8/A9ywSp1byueyuCfHamrCBa14/Oc2iiB0e51B+NpxSl5gmzn+Ms/mg==
dompurify@3.2.6:
version "3.2.6"
resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-3.2.6.tgz#ca040a6ad2b88e2a92dc45f38c79f84a714a1cad"
integrity sha512-/2GogDQlohXPZe6D6NOgQvXLPSYBqIWMnZ8zzOhn09REE4eyAzb+Hed3jhoM9OkuaJ8P6ZGTTVWQKAi8ieIzfQ==
optionalDependencies:
"@types/trusted-types" "^2.0.7"
@ -5916,13 +5889,6 @@ find-up@^5.0.0:
locate-path "^6.0.0"
path-exists "^4.0.0"
find-yarn-workspace-root@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/find-yarn-workspace-root/-/find-yarn-workspace-root-2.0.0.tgz#f47fb8d239c900eb78179aa81b66673eac88f7bd"
integrity sha512-1IMnbjt4KzsQfnhnzNd8wUEgXZ44IzZaZmnLYx7D5FZlaHt2gW20Cri8Q+E/t5tIj4+epTBub+2Zxu/vNILzqQ==
dependencies:
micromatch "^4.0.2"
findup-sync@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-4.0.0.tgz#956c9cdde804052b881b428512905c4a5f2cdef0"
@ -6129,16 +6095,6 @@ fs-extra@^11.2.0:
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-extra@^9.0.0:
version "9.1.0"
resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-9.1.0.tgz#5954460c764a8da2094ba3554bf839e6b9a7c86d"
integrity sha512-hcg3ZmepS30/7BSFqRvoo3DOMQu7IjqxO5nCDt+zM9XWjb33Wg7ziNT+Qvqbuc3+gWpzO02JubVyk2G4Zvo1OQ==
dependencies:
at-least-node "^1.0.0"
graceful-fs "^4.2.0"
jsonfile "^6.0.1"
universalify "^2.0.0"
fs-minipass@^2.0.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz#7f5036fdbf12c63c169190cbe4199c852271f9fb"
@ -7399,7 +7355,7 @@ is-windows@^1.0.1:
resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d"
integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==
is-wsl@^2.1.1, is-wsl@^2.2.0:
is-wsl@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
@ -7608,17 +7564,6 @@ json-stable-stringify-without-jsonify@^1.0.1:
resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
json-stable-stringify@^1.0.2:
version "1.2.1"
resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.2.1.tgz#addb683c2b78014d0b78d704c2fcbdf0695a60e2"
integrity sha512-Lp6HbbBgosLmJbjx0pBLbgvx68FaFU1sdkmBuckmhhJ88kL13OA51CDtR2yJB50eCNMH9wRqtQNNiAqQH4YXnA==
dependencies:
call-bind "^1.0.8"
call-bound "^1.0.3"
isarray "^2.0.5"
jsonify "^0.0.1"
object-keys "^1.1.1"
json-stringify-nice@^1.1.4:
version "1.1.4"
resolved "https://registry.yarnpkg.com/json-stringify-nice/-/json-stringify-nice-1.1.4.tgz#2c937962b80181d3f317dd39aa323e14f5a60a67"
@ -7671,11 +7616,6 @@ jsonfile@^6.0.1:
optionalDependencies:
graceful-fs "^4.1.6"
jsonify@^0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.1.tgz#2aa3111dae3d34a0f151c63f3a45d995d9420978"
integrity sha512-2/Ki0GcmuqSrgFyelQq9M05y7PS0mEwuIzrf3f1fPqkVDVRvZrPZtVSMHxdgo8Aq0sxAOb/cr2aqqA3LeWHVPg==
jsonparse@^1.2.0, jsonparse@^1.3.1:
version "1.3.1"
resolved "https://registry.yarnpkg.com/jsonparse/-/jsonparse-1.3.1.tgz#3f4dae4a91fac315f71062f8521cc239f1366280"
@ -7720,13 +7660,6 @@ kind-of@^6.0.2, kind-of@^6.0.3:
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd"
integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
klaw-sync@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/klaw-sync/-/klaw-sync-6.0.0.tgz#1fd2cfd56ebb6250181114f0a581167099c2b28c"
integrity sha512-nIeuVSzdCCs6TDPTqI8w1Yre34sSq7AkZ4B3sfOBbI2CgVSB4Du4aLQijFU2+lhAFCwt9+42Hel6lQNIv6AntQ==
dependencies:
graceful-fs "^4.1.11"
known-css-properties@^0.35.0:
version "0.35.0"
resolved "https://registry.yarnpkg.com/known-css-properties/-/known-css-properties-0.35.0.tgz#f6f8e40ab4e5700fa32f5b2ef5218a56bc853bd6"
@ -9063,14 +8996,6 @@ open@^10.0.3:
is-inside-container "^1.0.0"
is-wsl "^3.1.0"
open@^7.4.2:
version "7.4.2"
resolved "https://registry.yarnpkg.com/open/-/open-7.4.2.tgz#b8147e26dcf3e426316c730089fd71edd29c2321"
integrity sha512-MVHddDVweXZF3awtlAS+6pgKLlm/JgxZ90+/NBurBoQctVOOB/zDdVjcyPzQ+0laDGbsWgrRkflI65sQeOgT9Q==
dependencies:
is-docker "^2.0.0"
is-wsl "^2.1.1"
open@^8.4.0:
version "8.4.2"
resolved "https://registry.yarnpkg.com/open/-/open-8.4.2.tgz#5b5ffe2a8f793dcd2aad73e550cb87b59cb084f9"
@ -9405,27 +9330,6 @@ parseurl@~1.3.2, parseurl@~1.3.3:
resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4"
integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
patch-package@^8.0.0:
version "8.0.0"
resolved "https://registry.yarnpkg.com/patch-package/-/patch-package-8.0.0.tgz#d191e2f1b6e06a4624a0116bcb88edd6714ede61"
integrity sha512-da8BVIhzjtgScwDJ2TtKsfT5JFWz1hYoBl9rUQ1f38MC2HwnEIkK8VN3dKMKcP7P7bvvgzNDbfNHtx3MsQb5vA==
dependencies:
"@yarnpkg/lockfile" "^1.1.0"
chalk "^4.1.2"
ci-info "^3.7.0"
cross-spawn "^7.0.3"
find-yarn-workspace-root "^2.0.0"
fs-extra "^9.0.0"
json-stable-stringify "^1.0.2"
klaw-sync "^6.0.0"
minimist "^1.2.6"
open "^7.4.2"
rimraf "^2.6.3"
semver "^7.5.3"
slash "^2.0.0"
tmp "^0.0.33"
yaml "^2.2.2"
path-exists@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515"
@ -10404,7 +10308,7 @@ rgb2hex@0.2.5:
resolved "https://registry.yarnpkg.com/rgb2hex/-/rgb2hex-0.2.5.tgz#f82230cd3ab1364fa73c99be3a691ed688f8dbdc"
integrity sha512-22MOP1Rh7sAo1BZpDG6R5RFYzR2lYEgwq7HEmyW2qcsOqR2lQKmn+O//xV3YG/0rrhMC6KVX2hU+ZXuaw9a5bw==
rimraf@2, rimraf@^2.6.2, rimraf@^2.6.3:
rimraf@2, rimraf@^2.6.2:
version "2.7.1"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz#35797f13a7fdadc566142c29d4f07ccad483e3ec"
integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
@ -10618,12 +10522,7 @@ semver@^6.0.0, semver@^6.3.0, semver@^6.3.1:
resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4"
integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==
semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.6.0:
version "7.7.0"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.0.tgz#9c6fe61d0c6f9fa9e26575162ee5a9180361b09c"
integrity sha512-DrfFnPzblFmNrIZzg5RzHegbiRWg7KMR7btwi2yjHwx06zsUbO5g613sVwEV7FTwmzJu+Io0lJe2GJ3LxqpvBQ==
semver@^7.7.1:
semver@^7.0.0, semver@^7.1.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.7, semver@^7.3.8, semver@^7.5.3, semver@^7.6.0, semver@^7.7.1:
version "7.7.1"
resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f"
integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA==
@ -10829,11 +10728,6 @@ slash@3.0.0, slash@^3.0.0:
resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634"
integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==
slash@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz#de552851a1759df3a8f206535442f5ec4ddeab44"
integrity sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==
slice-ansi@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b"
@ -11604,12 +11498,7 @@ trim-newlines@^3.0.0:
resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-3.0.1.tgz#260a5d962d8b752425b32f3a7db0dcacd176c144"
integrity sha512-c1PTsA3tYrIsLGkJkzHF+w9F2EyxfXGo4UyJc4pFL++FMjnq0HJS69T3M7d//gKrFKwy429bouPescbjecU+Zw==
ts-api-utils@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.0.0.tgz#b9d7d5f7ec9f736f4d0f09758b8607979044a900"
integrity sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==
ts-api-utils@^2.0.1:
ts-api-utils@^2.0.0, ts-api-utils@^2.0.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/ts-api-utils/-/ts-api-utils-2.1.0.tgz#595f7094e46eed364c13fd23e75f9513d29baf91"
integrity sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==
@ -12449,7 +12338,7 @@ yaml@^1.10.0:
resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
yaml@^2.2.2, yaml@^2.6.0:
yaml@^2.6.0:
version "2.7.0"
resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.7.0.tgz#aef9bb617a64c937a9a748803786ad8d3ffe1e98"
integrity sha512-+hSoy/QHluxmC9kCIJyL/uyFmLmc+e5CFR5Wa+bpIhIj85LVb9ZH2nVnqrHoSvKogwODv0ClqZkmiSSaIH5LTA==