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"