diff --git a/reacnetgenerator/static/webpack/package.json b/reacnetgenerator/static/webpack/package.json
index 01d4b8265..e86e9462c 100644
--- a/reacnetgenerator/static/webpack/package.json
+++ b/reacnetgenerator/static/webpack/package.json
@@ -37,6 +37,7 @@
"html-inline-css-webpack-plugin": "1.11.2",
"html-webpack-plugin": "5.6.3",
"ifdef-loader": "2.3.2",
+ "jsdom": "^26.1.0",
"mini-css-extract-plugin": "2.9.2",
"postcss": "8.5.6",
"postcss-import": "16.1.0",
diff --git a/reacnetgenerator/static/webpack/reacnetgen.js b/reacnetgenerator/static/webpack/reacnetgen.js
index c6ea935a3..022e383df 100644
--- a/reacnetgenerator/static/webpack/reacnetgen.js
+++ b/reacnetgenerator/static/webpack/reacnetgen.js
@@ -325,6 +325,35 @@ function addnode(spec) {
}
}
+/**
+ * narrow down results by adding species to selections and filtering
+ */
+function narrowSpecies(spec) {
+ // Add species to all relevant selects if not already selected
+ const selectIds = ["#speciesselect", "#reactionsselect", "#reactionsabcdselect"];
+
+ selectIds.forEach((selectId) => {
+ const selectElement = $(selectId);
+ const currentValues = selectElement.val() || [];
+
+ // Only add if not already in selection
+ if (!currentValues.includes(spec)) {
+ currentValues.push(spec);
+ selectElement.val(currentValues);
+ selectElement.selectpicker("refresh");
+ selectElement.trigger("change");
+ }
+ });
+}
+
+/**
+ * add node and narrow results when clicking on species
+ */
+function addnodeAndNarrow(spec) {
+ addnode(spec);
+ narrowSpecies(spec);
+}
+
function storeSVG(spec, callback) {
// load smiles svg
if (spec in svgs) {
@@ -386,6 +415,8 @@ function SimpleLightbox(config) {}
// define global
window.$ = $;
window.addnode = addnode;
+window.narrowSpecies = narrowSpecies;
+window.addnodeAndNarrow = addnodeAndNarrow;
window.savesvg = savesvg;
window.clearnode = clearnode;
window.G = G;
diff --git a/reacnetgenerator/static/webpack/template.html b/reacnetgenerator/static/webpack/template.html
index fb275e8c4..70222b095 100644
--- a/reacnetgenerator/static/webpack/template.html
+++ b/reacnetgenerator/static/webpack/template.html
@@ -119,7 +119,7 @@
Reaction Network
diff --git a/reacnetgenerator/static/webpack/test/test_narrow.js b/reacnetgenerator/static/webpack/test/test_narrow.js
new file mode 100644
index 000000000..ba4f5d568
--- /dev/null
+++ b/reacnetgenerator/static/webpack/test/test_narrow.js
@@ -0,0 +1,252 @@
+// SPDX-License-Identifier: LGPL-3.0-or-later
+// Test for narrow functionality
+
+const assert = require("assert");
+const { JSDOM } = require("jsdom");
+
+describe("Narrow functionality", function() {
+ let window, $, mockGlobal;
+
+ beforeEach(function() {
+ // Set up a mock DOM environment
+ const dom = new JSDOM(`
+
+
+
+
+
+
+
+
+ `);
+
+ global.window = dom.window;
+ global.document = dom.window.document;
+
+ // Mock jQuery and selectpicker
+ $ = function(selector) {
+ const elements = dom.window.document.querySelectorAll(selector);
+ const jqObject = {
+ length: elements.length,
+ val: function(newVal) {
+ if (arguments.length === 0) {
+ // Getter
+ const el = elements[0];
+ if (!el) return null;
+ const selectedOptions = Array.from(el.selectedOptions || []);
+ return selectedOptions.map(opt => opt.value);
+ } else {
+ // Setter
+ elements.forEach(el => {
+ // Clear current selection
+ Array.from(el.options).forEach(opt => opt.selected = false);
+ // Set new selection
+ if (Array.isArray(newVal)) {
+ newVal.forEach(val => {
+ Array.from(el.options).forEach(opt => {
+ if (opt.value === val) opt.selected = true;
+ });
+ });
+ }
+ });
+ return this;
+ }
+ },
+ selectpicker: function(action) {
+ return this; // Mock selectpicker
+ },
+ trigger: function(event) {
+ // Mock trigger
+ if (event === "change") {
+ elements.forEach(el => {
+ const changeEvent = new dom.window.Event("change");
+ el.dispatchEvent(changeEvent);
+ });
+ }
+ return this;
+ },
+ on: function(event, handler) {
+ elements.forEach(el => {
+ el.addEventListener(event, handler);
+ });
+ return this;
+ }
+ };
+ return jqObject;
+ };
+
+ global.$ = $;
+
+ // Create options for the selects
+ ["speciesselect", "reactionsselect", "reactionsabcdselect"].forEach(id => {
+ const select = dom.window.document.getElementById(id);
+ ["C", "O", "H"].forEach(value => {
+ const option = dom.window.document.createElement("option");
+ option.value = value;
+ option.textContent = value;
+ select.appendChild(option);
+ });
+ });
+ });
+
+ it("should add species to selects when narrowSpecies is called", function() {
+ // Define the narrowSpecies function directly for testing
+ const narrowSpecies = function(spec) {
+ const selectIds = ["#speciesselect", "#reactionsselect", "#reactionsabcdselect"];
+
+ selectIds.forEach((selectId) => {
+ const selectElement = $(selectId);
+ const currentValues = selectElement.val() || [];
+
+ if (!currentValues.includes(spec)) {
+ currentValues.push(spec);
+ selectElement.val(currentValues);
+ selectElement.selectpicker("refresh");
+ selectElement.trigger("change");
+ }
+ });
+ };
+
+ // Mock the change event
+ let changeTriggered = 0;
+ $("#speciesselect").on("change", function() {
+ changeTriggered++;
+ });
+ $("#reactionsselect").on("change", function() {
+ changeTriggered++;
+ });
+ $("#reactionsabcdselect").on("change", function() {
+ changeTriggered++;
+ });
+
+ // Call narrowSpecies
+ narrowSpecies("C");
+
+ // Check that the species was added to all selects
+ assert.deepStrictEqual($("#speciesselect").val(), ["C"], "Species should be added to speciesselect");
+ assert.deepStrictEqual($("#reactionsselect").val(), ["C"], "Species should be added to reactionsselect");
+ assert.deepStrictEqual($("#reactionsabcdselect").val(), ["C"], "Species should be added to reactionsabcdselect");
+
+ // Check that change events were triggered
+ assert.strictEqual(changeTriggered, 3, "Change event should be triggered for all three selects");
+ });
+
+ it("should not add duplicate species to selects", function() {
+ // Define the narrowSpecies function directly for testing
+ const narrowSpecies = function(spec) {
+ const selectIds = ["#speciesselect", "#reactionsselect", "#reactionsabcdselect"];
+
+ selectIds.forEach((selectId) => {
+ const selectElement = $(selectId);
+ const currentValues = selectElement.val() || [];
+
+ if (!currentValues.includes(spec)) {
+ currentValues.push(spec);
+ selectElement.val(currentValues);
+ selectElement.selectpicker("refresh");
+ selectElement.trigger("change");
+ }
+ });
+ };
+
+ // Pre-select a species
+ $("#speciesselect").val(["C"]);
+ $("#reactionsselect").val(["C"]);
+ $("#reactionsabcdselect").val(["C"]);
+
+ let changeTriggered = 0;
+ $("#speciesselect").on("change", function() {
+ changeTriggered++;
+ });
+ $("#reactionsselect").on("change", function() {
+ changeTriggered++;
+ });
+ $("#reactionsabcdselect").on("change", function() {
+ changeTriggered++;
+ });
+
+ // Call narrowSpecies with the same species
+ narrowSpecies("C");
+
+ // Check that no duplicates were added
+ assert.deepStrictEqual($("#speciesselect").val(), ["C"], "No duplicate should be added to speciesselect");
+ assert.deepStrictEqual($("#reactionsselect").val(), ["C"], "No duplicate should be added to reactionsselect");
+ assert.deepStrictEqual($("#reactionsabcdselect").val(), ["C"], "No duplicate should be added to reactionsabcdselect");
+
+ // Check that no change events were triggered since no changes were made
+ assert.strictEqual(changeTriggered, 0, "No change events should be triggered for duplicates");
+ });
+
+ it("should call both addnode and narrowSpecies when addnodeAndNarrow is called", function() {
+ // Mock global rngdata and G
+ global.rngdata = {
+ "linkreac": {
+ "C": ["O", "H"]
+ }
+ };
+
+ const mockG = {
+ addNode: function(node) { this.nodes = this.nodes || []; this.nodes.push(node); },
+ addEdge: function(from, to) { this.edges = this.edges || []; this.edges.push([from, to]); },
+ nodes: [],
+ edges: []
+ };
+ global.G = mockG;
+
+ // Define the functions for testing
+ const addSingleNode = function(spec) {
+ mockG.addNode(spec);
+ };
+
+ const addnode = function(spec) {
+ addSingleNode(spec);
+ if (spec in global.rngdata["linkreac"]) {
+ global.rngdata["linkreac"][spec].forEach((rightspec) => {
+ addSingleNode(rightspec);
+ mockG.addEdge(rightspec, spec);
+ });
+ }
+ };
+
+ const narrowSpecies = function(spec) {
+ const selectIds = ["#speciesselect", "#reactionsselect", "#reactionsabcdselect"];
+ selectIds.forEach((selectId) => {
+ const selectElement = $(selectId);
+ const currentValues = selectElement.val() || [];
+ if (!currentValues.includes(spec)) {
+ currentValues.push(spec);
+ selectElement.val(currentValues);
+ selectElement.selectpicker("refresh");
+ selectElement.trigger("change");
+ }
+ });
+ };
+
+ const addnodeAndNarrow = function(spec) {
+ addnode(spec);
+ narrowSpecies(spec);
+ };
+
+ // Mock change events
+ let changeTriggered = 0;
+ $("#speciesselect, #reactionsselect, #reactionsabcdselect").on("change", function() {
+ changeTriggered++;
+ });
+
+ // Call addnodeAndNarrow
+ addnodeAndNarrow("C");
+
+ // Check that nodes were added (addnode functionality)
+ assert(mockG.nodes.includes("C"), "Main species should be added to graph");
+ assert(mockG.nodes.includes("O"), "Linked species O should be added to graph");
+ assert(mockG.nodes.includes("H"), "Linked species H should be added to graph");
+ assert(mockG.edges.some(edge => edge[0] === "O" && edge[1] === "C"), "Edge should be added from O to C");
+ assert(mockG.edges.some(edge => edge[0] === "H" && edge[1] === "C"), "Edge should be added from H to C");
+
+ // Check that filtering was applied (narrowSpecies functionality)
+ assert.deepStrictEqual($("#speciesselect").val(), ["C"], "Species should be added to speciesselect");
+ assert.deepStrictEqual($("#reactionsselect").val(), ["C"], "Species should be added to reactionsselect");
+ assert.deepStrictEqual($("#reactionsabcdselect").val(), ["C"], "Species should be added to reactionsabcdselect");
+ assert.strictEqual(changeTriggered, 3, "Change events should be triggered for filtering");
+ });
+});
\ No newline at end of file
diff --git a/reacnetgenerator/static/webpack/yarn.lock b/reacnetgenerator/static/webpack/yarn.lock
index febec859e..53a13cd51 100644
--- a/reacnetgenerator/static/webpack/yarn.lock
+++ b/reacnetgenerator/static/webpack/yarn.lock
@@ -5,6 +5,19 @@ __metadata:
version: 8
cacheKey: 10
+"@asamuzakjp/css-color@npm:^3.2.0":
+ version: 3.2.0
+ resolution: "@asamuzakjp/css-color@npm:3.2.0"
+ dependencies:
+ "@csstools/css-calc": "npm:^2.1.3"
+ "@csstools/css-color-parser": "npm:^3.0.9"
+ "@csstools/css-parser-algorithms": "npm:^3.0.4"
+ "@csstools/css-tokenizer": "npm:^3.0.3"
+ lru-cache: "npm:^10.4.3"
+ checksum: 10/870f661460173174fef8bfebea0799ba26566f3aa7b307e5adabb7aae84fed2da68e40080104ed0c83b43c5be632ee409e65396af13bfe948a3ef4c2c729ecd9
+ languageName: node
+ linkType: hard
+
"@babel/code-frame@npm:^7.0.0":
version: 7.23.5
resolution: "@babel/code-frame@npm:7.23.5"
@@ -33,6 +46,52 @@ __metadata:
languageName: node
linkType: hard
+"@csstools/color-helpers@npm:^5.0.2":
+ version: 5.0.2
+ resolution: "@csstools/color-helpers@npm:5.0.2"
+ checksum: 10/8763079c54578bd2215c68de0795edb9cfa29bffa29625bff89f3c47d9df420d86296ff3a6fa8c29ca037bbaa64dc10a963461233341de0516a3161a3b549e7b
+ languageName: node
+ linkType: hard
+
+"@csstools/css-calc@npm:^2.1.3, @csstools/css-calc@npm:^2.1.4":
+ version: 2.1.4
+ resolution: "@csstools/css-calc@npm:2.1.4"
+ peerDependencies:
+ "@csstools/css-parser-algorithms": ^3.0.5
+ "@csstools/css-tokenizer": ^3.0.4
+ checksum: 10/06975b650c0f44c60eeb7afdb3fd236f2dd607b2c622e0bc908d3f54de39eb84e0692833320d03dac04bd6c1ab0154aa3fa0dd442bd9e5f917cf14d8e2ba8d74
+ languageName: node
+ linkType: hard
+
+"@csstools/css-color-parser@npm:^3.0.9":
+ version: 3.0.10
+ resolution: "@csstools/css-color-parser@npm:3.0.10"
+ dependencies:
+ "@csstools/color-helpers": "npm:^5.0.2"
+ "@csstools/css-calc": "npm:^2.1.4"
+ peerDependencies:
+ "@csstools/css-parser-algorithms": ^3.0.5
+ "@csstools/css-tokenizer": ^3.0.4
+ checksum: 10/d5619639f067c0a6ac95ecce6ad6adce55a5500599a4444817ac6bb5ed2a9928a08f0978a148d4687de7ebf05c068c1a1c7f9eaa039984830a84148e011cbc05
+ languageName: node
+ linkType: hard
+
+"@csstools/css-parser-algorithms@npm:^3.0.4":
+ version: 3.0.5
+ resolution: "@csstools/css-parser-algorithms@npm:3.0.5"
+ peerDependencies:
+ "@csstools/css-tokenizer": ^3.0.4
+ checksum: 10/e93083b5cb36a3c1e7a47ce10cf62961d05bd1e4c608bb3ee50186ff740157ab0ec16a3956f7b86251efd10703034d849693201eea858ae904848c68d2d46ada
+ languageName: node
+ linkType: hard
+
+"@csstools/css-tokenizer@npm:^3.0.3":
+ version: 3.0.4
+ resolution: "@csstools/css-tokenizer@npm:3.0.4"
+ checksum: 10/eb6c84c086312f6bb8758dfe2c85addd7475b0927333c5e39a4d59fb210b9810f8c346972046f95e60a721329cffe98895abe451e51de753ad1ca7a8c24ec65f
+ languageName: node
+ linkType: hard
+
"@discoveryjs/json-ext@npm:^0.6.1":
version: 0.6.3
resolution: "@discoveryjs/json-ext@npm:0.6.3"
@@ -1543,6 +1602,16 @@ __metadata:
languageName: node
linkType: hard
+"cssstyle@npm:^4.2.1":
+ version: 4.6.0
+ resolution: "cssstyle@npm:4.6.0"
+ dependencies:
+ "@asamuzakjp/css-color": "npm:^3.2.0"
+ rrweb-cssom: "npm:^0.8.0"
+ checksum: 10/1cb25c9d66b87adb165f978b75cdeb6f225d7e31ba30a8934666046a0be037e4e7200d359bfa79d4f1a4aef1083ea09633b81bcdb36a2f2ac888e8c73ea3a289
+ languageName: node
+ linkType: hard
+
"d3@npm:3.5.17":
version: 3.5.17
resolution: "d3@npm:3.5.17"
@@ -1559,6 +1628,16 @@ __metadata:
languageName: node
linkType: hard
+"data-urls@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "data-urls@npm:5.0.0"
+ dependencies:
+ whatwg-mimetype: "npm:^4.0.0"
+ whatwg-url: "npm:^14.0.0"
+ checksum: 10/5c40568c31b02641a70204ff233bc4e42d33717485d074244a98661e5f2a1e80e38fe05a5755dfaf2ee549f2ab509d6a3af2a85f4b2ad2c984e5d176695eaf46
+ languageName: node
+ linkType: hard
+
"debug@npm:4, debug@npm:^4.3.4":
version: 4.4.0
resolution: "debug@npm:4.4.0"
@@ -1583,6 +1662,13 @@ __metadata:
languageName: node
linkType: hard
+"decimal.js@npm:^10.5.0":
+ version: 10.6.0
+ resolution: "decimal.js@npm:10.6.0"
+ checksum: 10/c0d45842d47c311d11b38ce7ccc911121953d4df3ebb1465d92b31970eb4f6738a065426a06094af59bee4b0d64e42e7c8984abd57b6767c64ea90cf90bb4a69
+ languageName: node
+ linkType: hard
+
"delayed-stream@npm:~1.0.0":
version: 1.0.0
resolution: "delayed-stream@npm:1.0.0"
@@ -1793,6 +1879,13 @@ __metadata:
languageName: node
linkType: hard
+"entities@npm:^6.0.0":
+ version: 6.0.1
+ resolution: "entities@npm:6.0.1"
+ checksum: 10/62af1307202884349d2867f0aac5c60d8b57102ea0b0e768b16246099512c28e239254ad772d6834e7e14cb1b6f153fc3d0c031934e3183b086c86d3838d874a
+ languageName: node
+ linkType: hard
+
"env-paths@npm:^2.2.0, env-paths@npm:^2.2.1":
version: 2.2.1
resolution: "env-paths@npm:2.2.1"
@@ -2118,6 +2211,15 @@ __metadata:
languageName: node
linkType: hard
+"html-encoding-sniffer@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "html-encoding-sniffer@npm:4.0.0"
+ dependencies:
+ whatwg-encoding: "npm:^3.1.1"
+ checksum: 10/e86efd493293a5671b8239bd099d42128433bb3c7b0fdc7819282ef8e118a21f5dead0ad6f358e024a4e5c84f17ebb7a9b36075220fac0a6222b207248bede6f
+ languageName: node
+ linkType: hard
+
"html-inline-css-webpack-plugin@npm:1.11.2":
version: 1.11.2
resolution: "html-inline-css-webpack-plugin@npm:1.11.2"
@@ -2187,7 +2289,7 @@ __metadata:
languageName: node
linkType: hard
-"http-proxy-agent@npm:^7.0.0":
+"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2":
version: 7.0.2
resolution: "http-proxy-agent@npm:7.0.2"
dependencies:
@@ -2208,7 +2310,7 @@ __metadata:
languageName: node
linkType: hard
-"https-proxy-agent@npm:^7.0.1":
+"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6":
version: 7.0.6
resolution: "https-proxy-agent@npm:7.0.6"
dependencies:
@@ -2218,7 +2320,7 @@ __metadata:
languageName: node
linkType: hard
-"iconv-lite@npm:^0.6.2":
+"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2":
version: 0.6.3
resolution: "iconv-lite@npm:0.6.3"
dependencies:
@@ -2360,6 +2462,13 @@ __metadata:
languageName: node
linkType: hard
+"is-potential-custom-element-name@npm:^1.0.1":
+ version: 1.0.1
+ resolution: "is-potential-custom-element-name@npm:1.0.1"
+ checksum: 10/ced7bbbb6433a5b684af581872afe0e1767e2d1146b2207ca0068a648fb5cab9d898495d1ac0583524faaf24ca98176a7d9876363097c2d14fee6dd324f3a1ab
+ languageName: node
+ linkType: hard
+
"is-typedarray@npm:~1.0.0":
version: 1.0.0
resolution: "is-typedarray@npm:1.0.0"
@@ -2493,6 +2602,39 @@ __metadata:
languageName: node
linkType: hard
+"jsdom@npm:^26.1.0":
+ version: 26.1.0
+ resolution: "jsdom@npm:26.1.0"
+ dependencies:
+ cssstyle: "npm:^4.2.1"
+ data-urls: "npm:^5.0.0"
+ decimal.js: "npm:^10.5.0"
+ html-encoding-sniffer: "npm:^4.0.0"
+ http-proxy-agent: "npm:^7.0.2"
+ https-proxy-agent: "npm:^7.0.6"
+ is-potential-custom-element-name: "npm:^1.0.1"
+ nwsapi: "npm:^2.2.16"
+ parse5: "npm:^7.2.1"
+ rrweb-cssom: "npm:^0.8.0"
+ saxes: "npm:^6.0.0"
+ symbol-tree: "npm:^3.2.4"
+ tough-cookie: "npm:^5.1.1"
+ w3c-xmlserializer: "npm:^5.0.0"
+ webidl-conversions: "npm:^7.0.0"
+ whatwg-encoding: "npm:^3.1.1"
+ whatwg-mimetype: "npm:^4.0.0"
+ whatwg-url: "npm:^14.1.1"
+ ws: "npm:^8.18.0"
+ xml-name-validator: "npm:^5.0.0"
+ peerDependencies:
+ canvas: ^3.0.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+ checksum: 10/39d78c4889cac20826393400dce1faed1666e9244fe0c8342a8f08c315375878e6be7fcfe339a33d6ff1a083bfe9e71b16d56ecf4d9a87db2da8c795925ea8c1
+ languageName: node
+ linkType: hard
+
"json-parse-even-better-errors@npm:^2.3.0, json-parse-even-better-errors@npm:^2.3.1":
version: 2.3.1
resolution: "json-parse-even-better-errors@npm:2.3.1"
@@ -2679,7 +2821,7 @@ __metadata:
languageName: node
linkType: hard
-"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0":
+"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3":
version: 10.4.3
resolution: "lru-cache@npm:10.4.3"
checksum: 10/e6e90267360476720fa8e83cc168aa2bf0311f3f2eea20a6ba78b90a885ae72071d9db132f40fda4129c803e7dcec3a6b6a6fbb44ca90b081630b810b5d6a41a
@@ -3015,6 +3157,13 @@ __metadata:
languageName: node
linkType: hard
+"nwsapi@npm:^2.2.16":
+ version: 2.2.21
+ resolution: "nwsapi@npm:2.2.21"
+ checksum: 10/3d84e7e0691640028fd7b1e93f3368cb1b5958332cecdcb31f335178177a6efdd00a07fb68b99cc476f0ca835bed5bd79b1010a16b97d33ce6c3c3c94bebd05c
+ languageName: node
+ linkType: hard
+
"oauth-sign@npm:~0.9.0":
version: 0.9.0
resolution: "oauth-sign@npm:0.9.0"
@@ -3106,6 +3255,15 @@ __metadata:
languageName: node
linkType: hard
+"parse5@npm:^7.2.1":
+ version: 7.3.0
+ resolution: "parse5@npm:7.3.0"
+ dependencies:
+ entities: "npm:^6.0.0"
+ checksum: 10/b0e48be20b820c655b138b86fa6fb3a790de6c891aa2aba536524f8027b4dca4fe538f11a0e5cf2f6f847d120dbb9e4822dcaeb933ff1e10850a2ef0154d1d88
+ languageName: node
+ linkType: hard
+
"pascal-case@npm:^3.1.2":
version: 3.1.2
resolution: "pascal-case@npm:3.1.2"
@@ -4039,7 +4197,7 @@ __metadata:
languageName: node
linkType: hard
-"punycode@npm:^2.1.0, punycode@npm:^2.1.1":
+"punycode@npm:^2.1.0, punycode@npm:^2.1.1, punycode@npm:^2.3.1":
version: 2.3.1
resolution: "punycode@npm:2.3.1"
checksum: 10/febdc4362bead22f9e2608ff0171713230b57aff9dddc1c273aa2a651fbd366f94b7d6a71d78342a7c0819906750351ca7f2edd26ea41b626d87d6a13d1bd059
@@ -4080,6 +4238,7 @@ __metadata:
html-webpack-plugin: "npm:5.6.3"
ifdef-loader: "npm:2.3.2"
jquery: "npm:3.7.1"
+ jsdom: "npm:^26.1.0"
jsrender: "npm:1.0.15"
magnific-popup: "npm:1.2.0"
mini-css-extract-plugin: "npm:2.9.2"
@@ -4269,6 +4428,13 @@ __metadata:
languageName: node
linkType: hard
+"rrweb-cssom@npm:^0.8.0":
+ version: 0.8.0
+ resolution: "rrweb-cssom@npm:0.8.0"
+ checksum: 10/07521ee36fb6569c17906afad1ac7ff8f099d49ade9249e190693ac36cdf27f88d9acf0cc66978935d5d0a23fca105643d7e9125b9a9d91ed9db9e02d31d7d80
+ languageName: node
+ linkType: hard
+
"safe-buffer@npm:^5.0.1, safe-buffer@npm:^5.1.0, safe-buffer@npm:^5.1.2, safe-buffer@npm:~5.2.0":
version: 5.2.1
resolution: "safe-buffer@npm:5.2.1"
@@ -4326,6 +4492,15 @@ __metadata:
languageName: node
linkType: hard
+"saxes@npm:^6.0.0":
+ version: 6.0.0
+ resolution: "saxes@npm:6.0.0"
+ dependencies:
+ xmlchars: "npm:^2.2.0"
+ checksum: 10/97b50daf6ca3a153e89842efa18a862e446248296622b7473c169c84c823ee8a16e4a43bac2f73f11fc8cb9168c73fbb0d73340f26552bac17970e9052367aa9
+ languageName: node
+ linkType: hard
+
"schema-utils@npm:^3.0.0":
version: 3.3.0
resolution: "schema-utils@npm:3.3.0"
@@ -4750,6 +4925,13 @@ __metadata:
languageName: node
linkType: hard
+"symbol-tree@npm:^3.2.4":
+ version: 3.2.4
+ resolution: "symbol-tree@npm:3.2.4"
+ checksum: 10/c09a00aadf279d47d0c5c46ca3b6b2fbaeb45f0a184976d599637d412d3a70bbdc043ff33effe1206dea0e36e0ad226cb957112e7ce9a4bf2daedf7fa4f85c53
+ languageName: node
+ linkType: hard
+
"tapable@npm:^2.0.0, tapable@npm:^2.1.1, tapable@npm:^2.2.0, tapable@npm:^2.2.1":
version: 2.2.1
resolution: "tapable@npm:2.2.1"
@@ -4845,6 +5027,24 @@ __metadata:
languageName: node
linkType: hard
+"tldts-core@npm:^6.1.86":
+ version: 6.1.86
+ resolution: "tldts-core@npm:6.1.86"
+ checksum: 10/cb5dff9cc15661ac773a2099e98c99a5cb3cebc35909c23cc4261ff7992032c7501995ae995de3574dbbf3431e59c47496534d52f5e96abcb231f0e72144c020
+ languageName: node
+ linkType: hard
+
+"tldts@npm:^6.1.32":
+ version: 6.1.86
+ resolution: "tldts@npm:6.1.86"
+ dependencies:
+ tldts-core: "npm:^6.1.86"
+ bin:
+ tldts: bin/cli.js
+ checksum: 10/f7e66824e44479ccdda55ea556af14ce61c4d27708be403e3f90631defde49f82a580e1ca07187cc7e3b349e257a30c2808a22903f3a0548e136ebb609ccc109
+ languageName: node
+ linkType: hard
+
"to-regex-range@npm:^5.0.1":
version: 5.0.1
resolution: "to-regex-range@npm:5.0.1"
@@ -4854,6 +5054,15 @@ __metadata:
languageName: node
linkType: hard
+"tough-cookie@npm:^5.1.1":
+ version: 5.1.2
+ resolution: "tough-cookie@npm:5.1.2"
+ dependencies:
+ tldts: "npm:^6.1.32"
+ checksum: 10/de430e6e6d34b794137e05b8ac2aa6b74ebbe6cdceb4126f168cf1e76101162a4b2e0e7587c3b70e728bd8654fc39958b2035be7619ee6f08e7257610ba4cd04
+ languageName: node
+ linkType: hard
+
"tough-cookie@npm:~2.5.0":
version: 2.5.0
resolution: "tough-cookie@npm:2.5.0"
@@ -4864,6 +5073,15 @@ __metadata:
languageName: node
linkType: hard
+"tr46@npm:^5.1.0":
+ version: 5.1.1
+ resolution: "tr46@npm:5.1.1"
+ dependencies:
+ punycode: "npm:^2.3.1"
+ checksum: 10/833a0e1044574da5790148fd17866d4ddaea89e022de50279967bcd6b28b4ce0d30d59eb3acf9702b60918975b3bad481400337e3a2e6326cffa5c77b874753d
+ languageName: node
+ linkType: hard
+
"tslib@npm:^2.0.3, tslib@npm:^2.6.0":
version: 2.6.2
resolution: "tslib@npm:2.6.2"
@@ -5028,6 +5246,15 @@ __metadata:
languageName: node
linkType: hard
+"w3c-xmlserializer@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "w3c-xmlserializer@npm:5.0.0"
+ dependencies:
+ xml-name-validator: "npm:^5.0.0"
+ checksum: 10/d78f59e6b4f924aa53b6dfc56949959229cae7fe05ea9374eb38d11edcec01398b7f5d7a12576bd5acc57ff446abb5c9115cd83b9d882555015437cf858d42f0
+ languageName: node
+ linkType: hard
+
"watchpack@npm:^2.4.1":
version: 2.4.1
resolution: "watchpack@npm:2.4.1"
@@ -5038,6 +5265,13 @@ __metadata:
languageName: node
linkType: hard
+"webidl-conversions@npm:^7.0.0":
+ version: 7.0.0
+ resolution: "webidl-conversions@npm:7.0.0"
+ checksum: 10/4c4f65472c010eddbe648c11b977d048dd96956a625f7f8b9d64e1b30c3c1f23ea1acfd654648426ce5c743c2108a5a757c0592f02902cf7367adb7d14e67721
+ languageName: node
+ linkType: hard
+
"webpack-cdn-plugin@npm:3.3.1":
version: 3.3.1
resolution: "webpack-cdn-plugin@npm:3.3.1"
@@ -5134,6 +5368,32 @@ __metadata:
languageName: node
linkType: hard
+"whatwg-encoding@npm:^3.1.1":
+ version: 3.1.1
+ resolution: "whatwg-encoding@npm:3.1.1"
+ dependencies:
+ iconv-lite: "npm:0.6.3"
+ checksum: 10/bbef815eb67f91487c7f2ef96329743f5fd8357d7d62b1119237d25d41c7e452dff8197235b2d3c031365a17f61d3bb73ca49d0ed1582475aa4a670815e79534
+ languageName: node
+ linkType: hard
+
+"whatwg-mimetype@npm:^4.0.0":
+ version: 4.0.0
+ resolution: "whatwg-mimetype@npm:4.0.0"
+ checksum: 10/894a618e2d90bf444b6f309f3ceb6e58cf21b2beaa00c8b333696958c4076f0c7b30b9d33413c9ffff7c5832a0a0c8569e5bb347ef44beded72aeefd0acd62e8
+ languageName: node
+ linkType: hard
+
+"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.1":
+ version: 14.2.0
+ resolution: "whatwg-url@npm:14.2.0"
+ dependencies:
+ tr46: "npm:^5.1.0"
+ webidl-conversions: "npm:^7.0.0"
+ checksum: 10/f0a95b0601c64f417c471536a2d828b4c16fe37c13662483a32f02f183ed0f441616609b0663fb791e524e8cd56d9a86dd7366b1fc5356048ccb09b576495e7c
+ languageName: node
+ linkType: hard
+
"which@npm:^2.0.1":
version: 2.0.2
resolution: "which@npm:2.0.2"
@@ -5185,6 +5445,35 @@ __metadata:
languageName: node
linkType: hard
+"ws@npm:^8.18.0":
+ version: 8.18.3
+ resolution: "ws@npm:8.18.3"
+ peerDependencies:
+ bufferutil: ^4.0.1
+ utf-8-validate: ">=5.0.2"
+ peerDependenciesMeta:
+ bufferutil:
+ optional: true
+ utf-8-validate:
+ optional: true
+ checksum: 10/725964438d752f0ab0de582cd48d6eeada58d1511c3f613485b5598a83680bedac6187c765b0fe082e2d8cc4341fc57707c813ae780feee82d0c5efe6a4c61b6
+ languageName: node
+ linkType: hard
+
+"xml-name-validator@npm:^5.0.0":
+ version: 5.0.0
+ resolution: "xml-name-validator@npm:5.0.0"
+ checksum: 10/43f30f3f6786e406dd665acf08cd742d5f8a46486bd72517edb04b27d1bcd1599664c2a4a99fc3f1e56a3194bff588b12f178b7972bc45c8047bdc4c3ac8d4a1
+ languageName: node
+ linkType: hard
+
+"xmlchars@npm:^2.2.0":
+ version: 2.2.0
+ resolution: "xmlchars@npm:2.2.0"
+ checksum: 10/4ad5924974efd004a47cce6acf5c0269aee0e62f9a805a426db3337af7bcbd331099df174b024ace4fb18971b8a56de386d2e73a1c4b020e3abd63a4a9b917f1
+ languageName: node
+ linkType: hard
+
"yallist@npm:^4.0.0":
version: 4.0.0
resolution: "yallist@npm:4.0.0"