From e5e92682419c5a6159dda5d423c9a8f7d48e9e34 Mon Sep 17 00:00:00 2001 From: Peter Verkinderen Date: Wed, 23 Jul 2025 17:11:59 +0100 Subject: [PATCH 001/284] Load the text reuse panel from GitHub instead of the API --- .../TextReuse/TextReuseData/TableHeader.js | 19 +- .../TextReuse/TextReuseData/TextReuseTable.js | 212 ++++++++++++------ .../Drawer/TextReuse/TextReuseData/index.js | 3 +- .../CorpusMetadata/Drawer/TextReuse/index.js | 2 - src/services/CorpusMetaData.js | 2 +- 5 files changed, 151 insertions(+), 87 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js index 5caac0b..5944c77 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js @@ -23,19 +23,18 @@ const TableHeader = ({ sortingOrder, setSortingOrder }) => { - Author - - - Title + Work + + { +const TextReuseTable = ({ fullData, query, handleRedirectedToChart }) => { const { dataLoading } = useContext(Context); const [sortingOrder, setSortingOrder] = useState("-instances_count"); const [data, setData] = useState([]); - const [page, setPage] = useState(0); - const [rowsPerPage, setRowsPerPage] = useState(10); const [isLoading, setIsLoading] = useState(false); const [total, setTotal] = useState(0); - // set new page - const handlePageChange = (newPage) => { - setPage(newPage); - }; + /** + * Download a csv file containing the text reuse data + * + * @param {Object} b1Metadata full metadata of book1 + * @param {Object} b2Data summary metadata of book2 + */ + const downloadPairwiseCsv = async (b1Metadata, book2Data) => { + // we already have full metadata of book1: + // download the metadata for book 2 and get the ID: + const releaseCode = JSON.parse(localStorage.getItem("release_code")); + const b2Metadata = await getVersionMetadataById(releaseCode, book2Data.id); + // build the URL to the CSV file: + const csvUrl = await buildPairwiseCsvURL(releaseCode, b1Metadata, b2Metadata); + const csvFilename = csvUrl.split("/").pop(); + // create a temporary link to the csv file to trigger the download: + const link = document.createElement('a'); + link.href = csvUrl; + link.setAttribute('download', csvFilename); + document.body.appendChild(link); + // download and clean up: + link.click(); + document.body.removeChild(link); + } + + /** + * Open the pairwise visualization + * + * @param {Object} b1Metadata full metadata of book1 + * @param {Object} b2Data summary metadata of book2 + * @param {Function} handleRedirectedToChart + */ + const openViz = async (b1Metadata, b2Data, handleRedirectedToChart) => { + // we already have full metadata of book1; + // download the metadata for book 2 and get the ID: + const releaseCode = JSON.parse(localStorage.getItem("release_code")); + const b2Metadata = await getVersionMetadataById(releaseCode, b2Data.id); + // build the URL to the CSV file: + const csvUrl = await buildPairwiseCsvURL(releaseCode, b1Metadata, b2Metadata); + b2Data.tsv_url = csvUrl; + handleRedirectedToChart(b2Data); + } - // handle paginatino dropdown rows per page - const handleRowsPerPageChange = (e) => { - setRowsPerPage(e.target.value); - }; - // debounce function for search query + // debounce function for search query: + // make sure the query is not changed after every key stroke: function useDebounce(value, delay) { const [debouncedValue, setDebouncedValue] = useState(value); @@ -46,44 +82,68 @@ const TextReuseTable = ({ fullData, query, handleRedirectedToChart }) => { return debouncedValue; } - // Inside your component + // get the query from the search box with a delay of 300 ms: const debouncedQuery = useDebounce(query, 300); useEffect(() => { + // don't run this code if the book1 metadata is not yet loaded + if (!fullData || !fullData.version_uri) return; + setIsLoading(true); const releaseCode = localStorage.getItem("release_code"); - let isMounted = true; // Add a flag to track if the component is still mounted + /** + * Get the text reuse statistics for book1 from GitHub and parse it. + * + * @returns {Promise} A promise that resolves to a list of reuse statistics objects. + * Each object contains: + * - {string} id: Book 2's version ID (without language or extension) + * - {string} book: Book 2's book URI (date+author+title) + * - {number} alignments: Number of reuse alignments with the primary book + * - {number} ch_match: Number of matched characters in alignments between Book1 and Book2> + */ const fetchData = async () => { - try { - const res = await getAllPairwiseData( - JSON.parse(releaseCode), - fullData?.version_uri, - sortingOrder, - debouncedQuery, - page - ); - - if (isMounted) { - setTotal(res.count); - setData(res.results); + const versionID = fullData?.version_uri?.split(".").pop(); + const statsFile = await getOneBookReuseStats( + JSON.parse(releaseCode), + versionID + ); + // parse the statsFile csv: + Papa.parse(statsFile, { + header: true, + dynamicTyping: true, // should convert numeric fields to integers + skipEmptyLines: true, + complete: (result) => { + let statsData = result.data; + let filtered; + // filter the data based on the user's search query: + if (query) { + filtered = statsData.filter(d => d.book.includes(query)); + } else { + filtered = statsData; + } + // sort the data based on the user's request + // (default= number of alignments, descending): + if (sortingOrder === "instances_count"){ + filtered.sort((a, b) => a.alignments - b.alignments); + } else if (sortingOrder === "book") { + filtered.sort((a, b) => a.book.localeCompare(b.book)); + } else if (sortingOrder === "-book") { + filtered.sort((a, b) => b.book.localeCompare(a.book)); + } else { + filtered.sort((a, b) => b.alignments - a.alignments); + } + // set Context variables: + setTotal(statsData.length); + setData(filtered); setIsLoading(false); } - } catch (error) { - // Handle any errors here - setTotal(0); - setData([]); - setIsLoading(false); - } + }); }; - + fetchData(); - // Cleanup function to cancel any ongoing tasks when the component unmounts - return () => { - isMounted = false; // Set the flag to false when the component unmounts - }; - }, [sortingOrder, fullData, debouncedQuery, page, query]); + }, [sortingOrder, fullData, debouncedQuery, query]); return ( @@ -107,7 +167,14 @@ const TextReuseTable = ({ fullData, query, handleRedirectedToChart }) => { ) : ( - <> + {data.length === 0 ? ( { }} > - {item.book2?.author_lat_prefered} - - { wordBreak: "break-all", }} > - {item?.book2?.title_lat_prefered} + {item.book} { wordBreak: "break-all", }} > - {item?.instances_count} + {item?.alignments} { - + {textAvailable && + ( + + ) + } )} diff --git a/src/components/Visualisation/Chart/index.jsx b/src/components/Visualisation/Chart/index.jsx index e0e6ef6..9cc584d 100644 --- a/src/components/Visualisation/Chart/index.jsx +++ b/src/components/Visualisation/Chart/index.jsx @@ -31,6 +31,7 @@ const Visual = (props) => { downloadedTexts, setDownloadedTexts, releaseCode, + setTextAvailable } = useContext(Context); const [toggle, setToggle] = useState(false); @@ -706,6 +707,7 @@ const Visual = (props) => { // if there isn't, we can't get text from an external source, // only from the uploaded csv file itself console.log("no metadata => can't get milestone text from API!"); + setTextAvailable(false); setBooks({ book1: { @@ -743,6 +745,7 @@ const Visual = (props) => { }); } else { + setTextAvailable(true); setDataLoading({ ...dataLoading, books: true }); let ms1Text = await getMilestoneText( releaseCode, diff --git a/src/functions/setVisualizationData.js b/src/functions/setVisualizationData.js index 3e428a6..5f83266 100644 --- a/src/functions/setVisualizationData.js +++ b/src/functions/setVisualizationData.js @@ -331,7 +331,7 @@ export const setMultiVizData = (values) => { setChartData, setIsError, setIsFileUploaded, - setUrl, + setUrl } = values; if (book1) { try { From d72a06320d8f9acb11b7b451e948ffef108d3925 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 11:30:45 +0100 Subject: [PATCH 011/284] changes to package-lock.json --- package-lock.json | 1725 ++++++++++++++++++++++++++++----------------- 1 file changed, 1063 insertions(+), 662 deletions(-) diff --git a/package-lock.json b/package-lock.json index aad6be5..e741ebb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,9 +37,10 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", - "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", + "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", + "license": "MIT" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -65,11 +66,14 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", + "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", + "license": "MIT", "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/helper-validator-identifier": "^7.27.1", + "js-tokens": "^4.0.0", + "picocolors": "^1.1.1" }, "engines": { "node": ">=6.9.0" @@ -113,9 +117,10 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -146,22 +151,25 @@ } }, "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", - "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", + "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", + "license": "MIT", "dependencies": { - "@babel/types": "^7.22.3", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", - "jsesc": "^2.5.1" + "@babel/parser": "^7.28.0", + "@babel/types": "^7.28.0", + "@jridgewell/gen-mapping": "^0.3.12", + "@jridgewell/trace-mapping": "^0.3.28", + "jsesc": "^3.0.2" }, "engines": { "node": ">=6.9.0" @@ -216,9 +224,10 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -246,9 +255,10 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -270,9 +280,10 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -294,9 +305,10 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -321,6 +333,15 @@ "node": ">=6.9.0" } }, + "node_modules/@babel/helper-globals": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", + "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", @@ -458,17 +479,19 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", + "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", + "license": "MIT", "engines": { "node": ">=6.9.0" } @@ -496,99 +519,26 @@ } }, "node_modules/@babel/helpers": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", - "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", - "dependencies": { - "@babel/template": "^7.21.9", - "@babel/traverse": "^7.22.1", - "@babel/types": "^7.22.3" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", + "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", + "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.2" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "node_modules/@babel/parser": { + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", + "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", + "license": "MIT", "dependencies": { - "has-flag": "^3.0.0" + "@babel/types": "^7.28.0" }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/parser": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", - "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1740,9 +1690,10 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -1988,9 +1939,10 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -2053,69 +2005,66 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", - "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", + "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", + "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.22.3", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.3.tgz", - "integrity": "sha512-6bdmknScYKmt8I9VjsJuKKGr+TwUb555FTf6tT1P/ANlCjTHCiYLhiQ4X/O7J731w5NOqu8c1aYHEVuOwPz7jA==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.2.tgz", + "integrity": "sha512-FVFaVs2/dZgD3Y9ZD+AKNKjyGKzwu0C54laAXWUXgLcVXcCX6YZ6GhK2cp7FogSN2OA0Fu+QT8dP3FUdo9ShSQ==", + "license": "MIT", "dependencies": { - "core-js-pure": "^3.30.2", - "regenerator-runtime": "^0.13.11" + "core-js-pure": "^3.43.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.21.9", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", - "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", + "version": "7.27.2", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", + "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/parser": "^7.21.9", - "@babel/types": "^7.21.5" + "@babel/code-frame": "^7.27.1", + "@babel/parser": "^7.27.2", + "@babel/types": "^7.27.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", - "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", + "version": "7.28.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", + "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", + "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.22.3", - "@babel/helper-environment-visitor": "^7.22.1", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.22.4", - "@babel/types": "^7.22.4", - "debug": "^4.1.0", - "globals": "^11.1.0" + "@babel/code-frame": "^7.27.1", + "@babel/generator": "^7.28.0", + "@babel/helper-globals": "^7.28.0", + "@babel/parser": "^7.28.0", + "@babel/template": "^7.27.2", + "@babel/types": "^7.28.0", + "debug": "^4.3.1" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.22.4", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", - "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", + "version": "7.28.2", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", + "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", + "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", - "to-fast-properties": "^2.0.0" + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.27.1" }, "engines": { "node": ">=6.9.0" @@ -3451,16 +3400,13 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", - "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", + "version": "0.3.12", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", + "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", + "license": "MIT", "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" + "@jridgewell/sourcemap-codec": "^1.5.0", + "@jridgewell/trace-mapping": "^0.3.24" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3471,14 +3417,6 @@ "node": ">=6.0.0" } }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "engines": { - "node": ">=6.0.0" - } - }, "node_modules/@jridgewell/source-map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", @@ -3489,24 +3427,21 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", + "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", + "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.29", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", + "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", + "license": "MIT", "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" - }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -4132,18 +4067,17 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.10", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", - "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", + "version": "0.5.17", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", + "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", + "license": "MIT", "dependencies": { - "ansi-html-community": "^0.0.8", - "common-path-prefix": "^3.0.0", + "ansi-html": "^0.0.9", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", - "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", - "schema-utils": "^3.0.0", + "schema-utils": "^4.2.0", "source-map": "^0.7.3" }, "engines": { @@ -4153,9 +4087,9 @@ "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <4.0.0", + "type-fest": ">=0.17.0 <5.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x", + "webpack-dev-server": "3.x || 4.x || 5.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -4180,6 +4114,59 @@ } } }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -4781,18 +4768,20 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", + "license": "MIT", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "license": "MIT" }, "node_modules/@types/express": { "version": "4.17.17", @@ -4902,9 +4891,10 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "license": "MIT" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4921,11 +4911,6 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, - "node_modules/@types/offscreencanvas": { - "version": "2019.7.1", - "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", - "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==" - }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -5064,9 +5049,10 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "node_modules/@types/ws": { - "version": "8.5.4", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", - "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", + "version": "8.18.1", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", + "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", + "license": "MIT", "dependencies": { "@types/node": "*" } @@ -5303,145 +5289,162 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", - "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", + "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + "@webassemblyjs/helper-numbers": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", - "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", + "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", - "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", + "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", - "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", + "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", - "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", + "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", + "license": "MIT", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/floating-point-hex-parser": "1.13.2", + "@webassemblyjs/helper-api-error": "1.13.2", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", - "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", + "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", + "license": "MIT" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", - "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", + "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/wasm-gen": "1.14.1" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", - "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", + "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", + "license": "MIT", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", - "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", + "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", + "license": "Apache-2.0", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", - "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", + "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", + "license": "MIT" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", - "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", + "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/helper-wasm-section": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-opt": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6", - "@webassemblyjs/wast-printer": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/helper-wasm-section": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-opt": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1", + "@webassemblyjs/wast-printer": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", - "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", + "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", - "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", + "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-buffer": "1.11.6", - "@webassemblyjs/wasm-gen": "1.11.6", - "@webassemblyjs/wasm-parser": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-buffer": "1.14.1", + "@webassemblyjs/wasm-gen": "1.14.1", + "@webassemblyjs/wasm-parser": "1.14.1" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", - "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", + "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", - "@webassemblyjs/helper-api-error": "1.11.6", - "@webassemblyjs/helper-wasm-bytecode": "1.11.6", - "@webassemblyjs/ieee754": "1.11.6", - "@webassemblyjs/leb128": "1.11.6", - "@webassemblyjs/utf8": "1.11.6" + "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/helper-wasm-bytecode": "1.13.2", + "@webassemblyjs/ieee754": "1.13.2", + "@webassemblyjs/leb128": "1.13.2", + "@webassemblyjs/utf8": "1.13.2" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.6", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", - "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", + "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", + "license": "MIT", "dependencies": { - "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/ast": "1.14.1", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", + "license": "BSD-3-Clause" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", + "license": "Apache-2.0" }, "node_modules/abab": { "version": "2.0.6", @@ -5461,9 +5464,10 @@ } }, "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.15.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", + "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", + "license": "MIT", "bin": { "acorn": "bin/acorn" }, @@ -5491,12 +5495,16 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-assertions": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", - "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", + "node_modules/acorn-import-phases": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", + "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + }, "peerDependencies": { - "acorn": "^8" + "acorn": "^8.14.0" } }, "node_modules/acorn-jsx": { @@ -5619,6 +5627,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/ansi-html": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", + "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -5954,22 +5974,26 @@ } }, "node_modules/axios": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", - "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", + "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", + "license": "MIT", "dependencies": { - "follow-redirects": "^1.15.0", - "form-data": "^4.0.0", + "follow-redirects": "^1.15.6", + "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", - "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", + "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -6128,9 +6152,10 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -6326,20 +6351,21 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", - "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", + "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.4", + "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.11.0", - "raw-body": "2.5.1", + "qs": "6.13.0", + "raw-body": "2.5.2", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -6348,18 +6374,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, - "node_modules/body-parser/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6368,6 +6387,7 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6378,7 +6398,8 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/bonjour-service": { "version": "1.1.1", @@ -6397,20 +6418,22 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", + "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -6422,9 +6445,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.21.7", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", - "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", + "version": "4.25.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", + "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", "funding": [ { "type": "opencollective", @@ -6439,11 +6462,12 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001489", - "electron-to-chromium": "^1.4.411", - "node-releases": "^2.0.12", - "update-browserslist-db": "^1.0.11" + "caniuse-lite": "^1.0.30001726", + "electron-to-chromium": "^1.5.173", + "node-releases": "^2.0.19", + "update-browserslist-db": "^1.1.3" }, "bin": { "browserslist": "cli.js" @@ -6524,9 +6548,10 @@ } }, "node_modules/bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -6543,6 +6568,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/call-bound": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", + "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "get-intrinsic": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6591,9 +6645,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001494", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", - "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", + "version": "1.0.30001731", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", + "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", "funding": [ { "type": "opencollective", @@ -6607,14 +6661,15 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ] + ], + "license": "CC-BY-4.0" }, "node_modules/canvg": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-4.0.1.tgz", - "integrity": "sha512-5gD/d6SiCCT7baLnVr0hokYe93DfcHW2rSqdKOuOQD84YMlyfttnZ8iQsThTdX6koYam+PROz/FuQTo500zqGw==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-4.0.3.tgz", + "integrity": "sha512-fKzMoMBwus3CWo1Uy8XJc4tqqn98RoRrGV6CsIkaNiQT5lOeHuMh4fOt+LXLzn2Wqtr4p/c2TOLz4xtu4oBlFA==", + "license": "MIT", "dependencies": { - "@types/offscreencanvas": "^2019.6.4", "@types/raf": "^3.4.0", "raf": "^3.4.1", "rgbcolor": "^1.0.1", @@ -6898,7 +6953,8 @@ "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", + "license": "MIT" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -6919,11 +6975,6 @@ "node": ">= 12" } }, - "node_modules/common-path-prefix": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", - "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" - }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -6963,16 +7014,17 @@ } }, "node_modules/compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", + "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", + "license": "MIT", "dependencies": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", - "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "negotiator": "~0.6.4", + "on-headers": "~1.1.0", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "engines": { @@ -6992,10 +7044,14 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/compression/node_modules/safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "node_modules/compression/node_modules/negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } }, "node_modules/concat-map": { "version": "0.0.1", @@ -7030,6 +7086,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7040,9 +7097,10 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7075,10 +7133,11 @@ } }, "node_modules/core-js-pure": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", - "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", + "version": "3.44.0", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.44.0.tgz", + "integrity": "sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==", "hasInstallScript": true, + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -7128,9 +7187,10 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "version": "7.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", + "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", + "license": "MIT", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8082,6 +8142,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8090,6 +8151,7 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", + "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8307,6 +8369,20 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -8355,12 +8431,14 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", + "license": "MIT" }, "node_modules/ejs": { - "version": "3.1.9", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", - "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", + "version": "3.1.10", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", + "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", + "license": "Apache-2.0", "dependencies": { "jake": "^10.8.5" }, @@ -8372,9 +8450,10 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.419", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", - "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" + "version": "1.5.192", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz", + "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==", + "license": "ISC" }, "node_modules/email-addresses": { "version": "5.0.0", @@ -8406,9 +8485,10 @@ } }, "node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", + "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8422,9 +8502,10 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.14.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", - "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", + "version": "5.18.2", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", + "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", + "license": "MIT", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8509,6 +8590,24 @@ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-get-iterator": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", @@ -8533,14 +8632,28 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" }, "engines": { "node": ">= 0.4" @@ -8571,9 +8684,10 @@ } }, "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", + "license": "MIT", "engines": { "node": ">=6" } @@ -8860,9 +8974,10 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -8920,9 +9035,10 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -8994,9 +9110,10 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -9257,6 +9374,7 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9339,36 +9457,37 @@ } }, "node_modules/express": { - "version": "4.18.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", - "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", + "version": "4.21.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", + "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.1", + "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.5.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.2.0", + "finalhandler": "1.3.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.1", + "merge-descriptors": "1.0.3", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-to-regexp": "0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.11.0", + "qs": "6.13.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "0.19.0", + "serve-static": "1.16.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9377,6 +9496,10 @@ }, "engines": { "node": ">= 0.10.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/array-flatten": { @@ -9450,6 +9573,22 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, + "node_modules/fast-uri": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", + "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fastify" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/fastify" + } + ], + "license": "BSD-3-Clause" + }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -9516,9 +9655,10 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -9567,9 +9707,10 @@ } }, "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9578,12 +9719,13 @@ } }, "node_modules/finalhandler": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", - "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "license": "MIT", "dependencies": { "debug": "2.6.9", - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9598,6 +9740,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9605,7 +9748,8 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -9661,15 +9805,16 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { - "version": "1.15.2", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", - "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "version": "1.15.9", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", + "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], + "license": "MIT", "engines": { "node": ">=4.0" }, @@ -9780,13 +9925,16 @@ } }, "node_modules/form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", + "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", + "license": "MIT", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.35" }, "engines": { "node": ">= 6" @@ -9816,6 +9964,7 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9887,9 +10036,13 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -9933,14 +10086,24 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -9959,6 +10122,19 @@ "node": ">=8.0.0" } }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10086,7 +10262,8 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", + "license": "BSD-2-Clause" }, "node_modules/global-modules": { "version": "2.0.0", @@ -10165,11 +10342,12 @@ } }, "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10264,9 +10442,10 @@ } }, "node_modules/has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", "engines": { "node": ">= 0.4" }, @@ -10275,17 +10454,30 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", - "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.2" + "function-bind": "^1.1.2" }, "engines": { "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" } }, "node_modules/he": { @@ -10462,6 +10654,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10505,9 +10698,10 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", - "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", + "version": "2.0.9", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", + "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", + "license": "MIT", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -10916,6 +11110,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -11154,9 +11349,10 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -13135,14 +13331,15 @@ } }, "node_modules/jsesc": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", - "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=4" + "node": ">=6" } }, "node_modules/json-parse-even-better-errors": { @@ -13650,9 +13847,10 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" } @@ -13665,6 +13863,15 @@ "tmpl": "1.0.5" } }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -13674,6 +13881,7 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", + "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13690,9 +13898,13 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", + "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/merge-stream": { "version": "2.0.0", @@ -13716,11 +13928,12 @@ } }, "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "license": "MIT", "dependencies": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" }, "engines": { @@ -13731,6 +13944,7 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "license": "MIT", "bin": { "mime": "cli.js" }, @@ -13903,15 +14117,16 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -13965,9 +14180,10 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.12", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", - "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" + "version": "2.0.19", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", + "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", + "license": "MIT" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -14040,9 +14256,13 @@ } }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.4", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", + "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14171,6 +14391,7 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", + "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -14179,9 +14400,10 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -14387,9 +14609,10 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", + "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", + "license": "MIT" }, "node_modules/path-type": { "version": "4.0.0", @@ -14405,9 +14628,10 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14587,9 +14811,9 @@ "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" }, "node_modules/postcss": { - "version": "8.4.24", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", - "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", + "version": "8.5.6", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", + "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", "funding": [ { "type": "opencollective", @@ -14604,10 +14828,11 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "nanoid": "^3.3.6", - "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" }, "engines": { "node": "^10 || ^12 || >=14" @@ -15905,11 +16130,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.0.6" }, "engines": { "node": ">=0.6" @@ -15962,14 +16188,16 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", - "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -15980,18 +16208,11 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16272,9 +16493,10 @@ } }, "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -16607,9 +16829,10 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "2.79.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", - "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", + "version": "2.79.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", + "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", + "license": "MIT", "bin": { "rollup": "dist/bin/rollup" }, @@ -16843,12 +17066,10 @@ } }, "node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", - "dependencies": { - "lru-cache": "^6.0.0" - }, + "version": "7.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", + "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", + "license": "ISC", "bin": { "semver": "bin/semver.js" }, @@ -16856,26 +17077,11 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "0.19.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", + "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", + "license": "MIT", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -16899,6 +17105,7 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -16906,17 +17113,29 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/send/node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "license": "MIT" }, "node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", + "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", + "license": "BSD-3-Clause", "dependencies": { "randombytes": "^2.1.0" } @@ -16992,14 +17211,15 @@ } }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "1.16.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", + "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", + "license": "MIT", "dependencies": { - "encodeurl": "~1.0.2", + "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "0.19.0" }, "engines": { "node": ">= 0.8.0" @@ -17013,7 +17233,8 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", + "license": "ISC" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -17043,13 +17264,72 @@ } }, "node_modules/side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", + "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3", + "side-channel-list": "^1.0.0", + "side-channel-map": "^1.0.1", + "side-channel-weakmap": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-list": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", + "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", + "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", + "license": "MIT", + "dependencies": { + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/side-channel-weakmap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", + "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", + "license": "MIT", "dependencies": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" + "call-bound": "^1.0.2", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.5", + "object-inspect": "^1.13.3", + "side-channel-map": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17097,9 +17377,10 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", "engines": { "node": ">=0.10.0" } @@ -17222,6 +17503,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -17820,12 +18102,13 @@ } }, "node_modules/terser": { - "version": "5.17.7", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", - "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", + "version": "5.43.1", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", + "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", + "license": "BSD-2-Clause", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.8.2", + "acorn": "^8.14.0", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -17837,15 +18120,16 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.9", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", - "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", + "version": "5.3.14", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", + "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", + "license": "MIT", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", + "@jridgewell/trace-mapping": "^0.3.25", "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.8" + "schema-utils": "^4.3.0", + "serialize-javascript": "^6.0.2", + "terser": "^5.31.1" }, "engines": { "node": ">= 10.13.0" @@ -17869,6 +18153,59 @@ } } }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -17950,18 +18287,11 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, - "node_modules/to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "engines": { - "node": ">=4" - } - }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -17973,14 +18303,16 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", + "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", + "license": "BSD-3-Clause", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -18135,6 +18467,7 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -18251,6 +18584,7 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", "engines": { "node": ">= 0.8" } @@ -18324,9 +18658,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", + "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", "funding": [ { "type": "opencollective", @@ -18341,9 +18675,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.2.0", + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -18475,9 +18810,10 @@ } }, "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", + "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", + "license": "MIT", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -18508,34 +18844,36 @@ } }, "node_modules/webpack": { - "version": "5.85.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", - "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^1.0.0", - "@webassemblyjs/ast": "^1.11.5", - "@webassemblyjs/wasm-edit": "^1.11.5", - "@webassemblyjs/wasm-parser": "^1.11.5", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.9.0", - "browserslist": "^4.14.5", + "version": "5.101.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", + "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.7", + "@types/estree": "^1.0.8", + "@types/json-schema": "^7.0.15", + "@webassemblyjs/ast": "^1.14.1", + "@webassemblyjs/wasm-edit": "^1.14.1", + "@webassemblyjs/wasm-parser": "^1.14.1", + "acorn": "^8.15.0", + "acorn-import-phases": "^1.0.3", + "browserslist": "^4.24.0", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.1", + "enhanced-resolve": "^5.17.2", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", + "graceful-fs": "^4.2.11", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^4.3.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.7", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" + "terser-webpack-plugin": "^5.3.11", + "watchpack": "^2.4.1", + "webpack-sources": "^3.3.3" }, "bin": { "webpack": "bin/webpack.js" @@ -18554,9 +18892,10 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", - "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", + "version": "5.3.4", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", + "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", + "license": "MIT", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -18576,14 +18915,15 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", "dependencies": { - "fast-deep-equal": "^3.1.1", + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" + "require-from-string": "^2.0.2" }, "funding": { "type": "github", @@ -18594,6 +18934,7 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -18604,12 +18945,14 @@ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", - "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -18617,7 +18960,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 12.13.0" + "node": ">= 10.13.0" }, "funding": { "type": "opencollective", @@ -18625,9 +18968,10 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.0", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", - "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", + "version": "4.15.2", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", + "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", + "license": "MIT", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -18635,7 +18979,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.1", + "@types/ws": "^8.5.5", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -18657,7 +19001,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.1", + "webpack-dev-middleware": "^5.3.4", "ws": "^8.13.0" }, "bin": { @@ -18732,9 +19076,10 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "version": "8.18.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", + "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", + "license": "MIT", "engines": { "node": ">=10.0.0" }, @@ -18787,13 +19132,42 @@ } }, "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", + "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", + "license": "MIT", "engines": { "node": ">=10.13.0" } }, + "node_modules/webpack/node_modules/ajv": { + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", + "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", + "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -18814,6 +19188,31 @@ "node": ">=4.0" } }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "license": "MIT" + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", + "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -18940,9 +19339,10 @@ } }, "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "license": "MIT", "engines": { "node": ">=0.10.0" } @@ -19275,9 +19675,10 @@ } }, "node_modules/ws": { - "version": "7.5.9", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", - "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", + "version": "7.5.10", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", + "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", + "license": "MIT", "engines": { "node": ">=8.3.0" }, From a0df4d17dbe7d44bf93b9f20aa0ec3d8c6beeaa1 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 11:43:58 +0100 Subject: [PATCH 012/284] manual replace of package-lock.json --- package-lock.json | 1725 +++++++++++++++++---------------------------- 1 file changed, 662 insertions(+), 1063 deletions(-) diff --git a/package-lock.json b/package-lock.json index e741ebb..aad6be5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -37,10 +37,9 @@ } }, "node_modules/@adobe/css-tools": { - "version": "4.4.3", - "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.4.3.tgz", - "integrity": "sha512-VQKMkwriZbaOgVCby1UDY/LDk5fIjhQicCvVPFqfe+69fWaPWydbWJ3wRt59/YzIwda1I81loas3oCoHxnqvdA==", - "license": "MIT" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.2.0.tgz", + "integrity": "sha512-E09FiIft46CmH5Qnjb0wsW54/YQd69LsxeKUOWawmws1XWvyFGURnAChH0mlr7YPFR1ofwvUQfcL0J3lMxXqPA==" }, "node_modules/@alloc/quick-lru": { "version": "5.2.0", @@ -66,14 +65,11 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "license": "MIT", + "version": "7.21.4", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", + "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" + "@babel/highlight": "^7.18.6" }, "engines": { "node": ">=6.9.0" @@ -117,10 +113,9 @@ } }, "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -151,25 +146,22 @@ } }, "node_modules/@babel/eslint-parser/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } }, "node_modules/@babel/generator": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.0.tgz", - "integrity": "sha512-lJjzvrbEeWrhB4P3QBsH7tey117PjLZnDbLiQEKjQ/fNJTjuq4HSqgFA+UNSwZT8D7dxxbnuSBMsa1lrWzKlQg==", - "license": "MIT", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.22.3.tgz", + "integrity": "sha512-C17MW4wlk//ES/CJDL51kPNwl+qiBQyN7b9SKyVp11BLGFeSPoVaHrv+MNt8jwQFhQWowW88z1eeBx3pFz9v8A==", "dependencies": { - "@babel/parser": "^7.28.0", - "@babel/types": "^7.28.0", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" + "@babel/types": "^7.22.3", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" }, "engines": { "node": ">=6.9.0" @@ -224,10 +216,9 @@ } }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -255,10 +246,9 @@ } }, "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -280,10 +270,9 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -305,10 +294,9 @@ } }, "node_modules/@babel/helper-define-polyfill-provider/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -333,15 +321,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, "node_modules/@babel/helper-hoist-variables": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", @@ -479,19 +458,17 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "license": "MIT", + "version": "7.21.5", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", + "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "license": "MIT", + "version": "7.19.1", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", + "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", "engines": { "node": ">=6.9.0" } @@ -519,26 +496,99 @@ } }, "node_modules/@babel/helpers": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.2.tgz", - "integrity": "sha512-/V9771t+EgXz62aCcyofnQhGM8DQACbRhvzKFsXKC9QM+5MadF8ZmIm0crDMaz3+o0h0zXfJnd4EhbYbxsrcFw==", - "license": "MIT", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.22.3.tgz", + "integrity": "sha512-jBJ7jWblbgr7r6wYZHMdIqKc73ycaTcCaWRq4/2LpuPHcx7xMlZvpGQkOYc9HeSjn6rcx15CPlgVcBtZ4WZJ2w==", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" + "@babel/template": "^7.21.9", + "@babel/traverse": "^7.22.1", + "@babel/types": "^7.22.3" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/parser": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.0.tgz", - "integrity": "sha512-jVZGvOxOuNSsuQuLRTh13nU0AogFlw32w/MT+LV6D3sP5WdbW61E77RnkbaO2dUvmPAYrBDJXGn5gGS6tH4j8g==", - "license": "MIT", + "node_modules/@babel/highlight": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", + "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "dependencies": { + "@babel/helper-validator-identifier": "^7.18.6", + "chalk": "^2.0.0", + "js-tokens": "^4.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dependencies": { - "@babel/types": "^7.28.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.22.4.tgz", + "integrity": "sha512-VLLsx06XkEYqBtE5YGPwfSGwfrjnyPP5oiGty3S8pQLFDFLaS8VwWSIxkTXpcvr5zeYLE6+MBNl2npl/YnfofA==", "bin": { "parser": "bin/babel-parser.js" }, @@ -1690,10 +1740,9 @@ } }, "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -1939,10 +1988,9 @@ } }, "node_modules/@babel/preset-env/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -2005,66 +2053,69 @@ "integrity": "sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==" }, "node_modules/@babel/runtime": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.28.2.tgz", - "integrity": "sha512-KHp2IflsnGywDjBWDkR9iEqiWSpc8GIi0lgTT3mOElT0PP1tG26P4tmFI2YvAdzgq9RGyoHZQEIEdZy6Ec5xCA==", - "license": "MIT", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.3.tgz", + "integrity": "sha512-XsDuspWKLUsxwCp6r7EhsExHtYfbe5oAGQ19kqngTdCPUoPQzOPdUbD/pB9PJiwb2ptYKQDjSJT3R6dC+EPqfQ==", + "dependencies": { + "regenerator-runtime": "^0.13.11" + }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/runtime-corejs3": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.28.2.tgz", - "integrity": "sha512-FVFaVs2/dZgD3Y9ZD+AKNKjyGKzwu0C54laAXWUXgLcVXcCX6YZ6GhK2cp7FogSN2OA0Fu+QT8dP3FUdo9ShSQ==", - "license": "MIT", + "version": "7.22.3", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.22.3.tgz", + "integrity": "sha512-6bdmknScYKmt8I9VjsJuKKGr+TwUb555FTf6tT1P/ANlCjTHCiYLhiQ4X/O7J731w5NOqu8c1aYHEVuOwPz7jA==", "dependencies": { - "core-js-pure": "^3.43.0" + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.13.11" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "license": "MIT", + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.21.9.tgz", + "integrity": "sha512-MK0X5k8NKOuWRamiEfc3KEJiHMTkGZNUjzMipqCGDDc6ijRl/B7RGSKVGncu4Ro/HdyzzY6cmoXuKI2Gffk7vQ==", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" + "@babel/code-frame": "^7.21.4", + "@babel/parser": "^7.21.9", + "@babel/types": "^7.21.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.0.tgz", - "integrity": "sha512-mGe7UK5wWyh0bKRfupsUchrQGqvDbZDbKJw+kcRGSmdHVYrv+ltd0pnpDTVpiTqnaBru9iEvA8pz8W46v0Amwg==", - "license": "MIT", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.22.4.tgz", + "integrity": "sha512-Tn1pDsjIcI+JcLKq1AVlZEr4226gpuAQTsLMorsYg9tuS/kG7nuwwJ4AB8jfQuEgb/COBwR/DqJxmoiYFu5/rQ==", "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.0", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.0", - "debug": "^4.3.1" + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.22.3", + "@babel/helper-environment-visitor": "^7.22.1", + "@babel/helper-function-name": "^7.21.0", + "@babel/helper-hoist-variables": "^7.18.6", + "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/parser": "^7.22.4", + "@babel/types": "^7.22.4", + "debug": "^4.1.0", + "globals": "^11.1.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "license": "MIT", + "version": "7.22.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.22.4.tgz", + "integrity": "sha512-Tx9x3UBHTTsMSW85WB2kphxYQVvrZ/t1FxD88IpSgIjiUJlCm9z+xWIDwyo1vffTwSqteqyznB8ZE9vYYk16zA==", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" + "@babel/helper-string-parser": "^7.21.5", + "@babel/helper-validator-identifier": "^7.19.1", + "to-fast-properties": "^2.0.0" }, "engines": { "node": ">=6.9.0" @@ -3400,13 +3451,16 @@ } }, "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.12.tgz", - "integrity": "sha512-OuLGC46TjB5BbN1dH8JULVVZY4WTdkF7tV9Ys6wLL1rubZnCMstOhNHueU5bLCrnRuDhKPDM4g6sw4Bel5Gzqg==", - "license": "MIT", + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.3.tgz", + "integrity": "sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==", "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" + "@jridgewell/set-array": "^1.0.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.9" + }, + "engines": { + "node": ">=6.0.0" } }, "node_modules/@jridgewell/resolve-uri": { @@ -3417,6 +3471,14 @@ "node": ">=6.0.0" } }, + "node_modules/@jridgewell/set-array": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", + "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@jridgewell/source-map": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", @@ -3427,21 +3489,24 @@ } }, "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.4", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.4.tgz", - "integrity": "sha512-VT2+G1VQs/9oz078bLrYbecdZKs912zQlkelYpuf+SXF+QvZDYJlbx/LSx+meSAwdDFnF8FVXW92AVjjkVmgFw==", - "license": "MIT" + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.29", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.29.tgz", - "integrity": "sha512-uw6guiW/gcAGPDhLmd77/6lW8QLeiV5RUTsAX46Db6oLhGaVj4lhnPwb184s1bkc8kdVg/+h988dro8GRDpmYQ==", - "license": "MIT", + "version": "0.3.18", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", + "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, + "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.14", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", + "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==" + }, "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", @@ -4067,17 +4132,18 @@ } }, "node_modules/@pmmmwh/react-refresh-webpack-plugin": { - "version": "0.5.17", - "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.17.tgz", - "integrity": "sha512-tXDyE1/jzFsHXjhRZQ3hMl0IVhYe5qula43LDWIhVfjp9G/nT5OQY5AORVOrkEGAUltBJOfOWeETbmhm6kHhuQ==", - "license": "MIT", + "version": "0.5.10", + "resolved": "https://registry.npmjs.org/@pmmmwh/react-refresh-webpack-plugin/-/react-refresh-webpack-plugin-0.5.10.tgz", + "integrity": "sha512-j0Ya0hCFZPd4x40qLzbhGsh9TMtdb+CJQiso+WxLOPNasohq9cc5SNUcwsZaRH6++Xh91Xkm/xHCkuIiIu0LUA==", "dependencies": { - "ansi-html": "^0.0.9", + "ansi-html-community": "^0.0.8", + "common-path-prefix": "^3.0.0", "core-js-pure": "^3.23.3", "error-stack-parser": "^2.0.6", + "find-up": "^5.0.0", "html-entities": "^2.1.0", "loader-utils": "^2.0.4", - "schema-utils": "^4.2.0", + "schema-utils": "^3.0.0", "source-map": "^0.7.3" }, "engines": { @@ -4087,9 +4153,9 @@ "@types/webpack": "4.x || 5.x", "react-refresh": ">=0.10.0 <1.0.0", "sockjs-client": "^1.4.0", - "type-fest": ">=0.17.0 <5.0.0", + "type-fest": ">=0.17.0 <4.0.0", "webpack": ">=4.43.0 <6.0.0", - "webpack-dev-server": "3.x || 4.x || 5.x", + "webpack-dev-server": "3.x || 4.x", "webpack-hot-middleware": "2.x", "webpack-plugin-serve": "0.x || 1.x" }, @@ -4114,59 +4180,6 @@ } } }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/@pmmmwh/react-refresh-webpack-plugin/node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -4768,20 +4781,18 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "license": "MIT", + "version": "3.7.4", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", + "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", "dependencies": { "@types/eslint": "*", "@types/estree": "*" } }, "node_modules/@types/estree": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", - "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", - "license": "MIT" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", + "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==" }, "node_modules/@types/express": { "version": "4.17.17", @@ -4891,10 +4902,9 @@ "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==" }, "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "license": "MIT" + "version": "7.0.12", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", + "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==" }, "node_modules/@types/json5": { "version": "0.0.29", @@ -4911,6 +4921,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-20.2.5.tgz", "integrity": "sha512-JJulVEQXmiY9Px5axXHeYGLSjhkZEnD+MDPDGbCbIAbMslkKwmygtZFy1X6s/075Yo94sf8GuSlFfPzysQrWZQ==" }, + "node_modules/@types/offscreencanvas": { + "version": "2019.7.1", + "resolved": "https://registry.npmjs.org/@types/offscreencanvas/-/offscreencanvas-2019.7.1.tgz", + "integrity": "sha512-+HSrJgjBW77ALieQdMJvXhRZUIRN1597L+BKvsyeiIlHHERnqjcuOLyodK3auJ3Y3zRezNKtKAhuQWYJfEgFHQ==" + }, "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", @@ -5049,10 +5064,9 @@ "integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g==" }, "node_modules/@types/ws": { - "version": "8.18.1", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.18.1.tgz", - "integrity": "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg==", - "license": "MIT", + "version": "8.5.4", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz", + "integrity": "sha512-zdQDHKUgcX/zBc4GrwsE/7dVdAD8JR4EuiAXiiUhhfyIJXXb2+PrGshFyeXWQPMmmZ2XxgaqclgpIC7eTXc1mg==", "dependencies": { "@types/node": "*" } @@ -5289,162 +5303,145 @@ } }, "node_modules/@webassemblyjs/ast": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.14.1.tgz", - "integrity": "sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.6.tgz", + "integrity": "sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==", "dependencies": { - "@webassemblyjs/helper-numbers": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2" + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" } }, "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz", - "integrity": "sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz", + "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==" }, "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz", - "integrity": "sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz", + "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==" }, "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz", - "integrity": "sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.6.tgz", + "integrity": "sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==" }, "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz", - "integrity": "sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz", + "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==", "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.13.2", - "@webassemblyjs/helper-api-error": "1.13.2", + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz", - "integrity": "sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz", + "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==" }, "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz", - "integrity": "sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.6.tgz", + "integrity": "sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/wasm-gen": "1.14.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6" } }, "node_modules/@webassemblyjs/ieee754": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz", - "integrity": "sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz", + "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==", "dependencies": { "@xtuc/ieee754": "^1.2.0" } }, "node_modules/@webassemblyjs/leb128": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.13.2.tgz", - "integrity": "sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw==", - "license": "Apache-2.0", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz", + "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==", "dependencies": { "@xtuc/long": "4.2.2" } }, "node_modules/@webassemblyjs/utf8": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.13.2.tgz", - "integrity": "sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ==", - "license": "MIT" + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz", + "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==" }, "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz", - "integrity": "sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.6.tgz", + "integrity": "sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/helper-wasm-section": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-opt": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1", - "@webassemblyjs/wast-printer": "1.14.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-opt": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6", + "@webassemblyjs/wast-printer": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz", - "integrity": "sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.6.tgz", + "integrity": "sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz", - "integrity": "sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.6.tgz", + "integrity": "sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-buffer": "1.14.1", - "@webassemblyjs/wasm-gen": "1.14.1", - "@webassemblyjs/wasm-parser": "1.14.1" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-buffer": "1.11.6", + "@webassemblyjs/wasm-gen": "1.11.6", + "@webassemblyjs/wasm-parser": "1.11.6" } }, "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz", - "integrity": "sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.6.tgz", + "integrity": "sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", - "@webassemblyjs/helper-api-error": "1.13.2", - "@webassemblyjs/helper-wasm-bytecode": "1.13.2", - "@webassemblyjs/ieee754": "1.13.2", - "@webassemblyjs/leb128": "1.13.2", - "@webassemblyjs/utf8": "1.13.2" + "@webassemblyjs/ast": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" } }, "node_modules/@webassemblyjs/wast-printer": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz", - "integrity": "sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw==", - "license": "MIT", + "version": "1.11.6", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.6.tgz", + "integrity": "sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==", "dependencies": { - "@webassemblyjs/ast": "1.14.1", + "@webassemblyjs/ast": "1.11.6", "@xtuc/long": "4.2.2" } }, "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "license": "BSD-3-Clause" + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "license": "Apache-2.0" + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/abab": { "version": "2.0.6", @@ -5464,10 +5461,9 @@ } }, "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "license": "MIT", + "version": "8.8.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", + "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", "bin": { "acorn": "bin/acorn" }, @@ -5495,16 +5491,12 @@ "node": ">=0.4.0" } }, - "node_modules/acorn-import-phases": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/acorn-import-phases/-/acorn-import-phases-1.0.4.tgz", - "integrity": "sha512-wKmbr/DDiIXzEOiWrTTUcDm24kQ2vGfZQvM2fwg2vXqR5uW6aapr7ObPtj1th32b9u90/Pf4AItvdTh42fBmVQ==", - "license": "MIT", - "engines": { - "node": ">=10.13.0" - }, + "node_modules/acorn-import-assertions": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.9.0.tgz", + "integrity": "sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==", "peerDependencies": { - "acorn": "^8.14.0" + "acorn": "^8" } }, "node_modules/acorn-jsx": { @@ -5627,18 +5619,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-html": { - "version": "0.0.9", - "resolved": "https://registry.npmjs.org/ansi-html/-/ansi-html-0.0.9.tgz", - "integrity": "sha512-ozbS3LuenHVxNRh/wdnN16QapUHzauqSomAl1jwwJRRsGwFwtj644lIhxfWu0Fy0acCij2+AEgHvjscq3dlVXg==", - "engines": [ - "node >= 0.8.0" - ], - "license": "Apache-2.0", - "bin": { - "ansi-html": "bin/ansi-html" - } - }, "node_modules/ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", @@ -5974,26 +5954,22 @@ } }, "node_modules/axios": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.11.0.tgz", - "integrity": "sha512-1Lx3WLFQWm3ooKDYZD1eXmoGO9fxYQjrycfHFC8P0sCfQVXyROp0p9PFWBehewBOdCwHc+f/b8I0fMto5eSfwA==", - "license": "MIT", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.4.0.tgz", + "integrity": "sha512-S4XCWMEmzvo64T9GfvQDOXgYRDJ/wsSZc7Jvdgx5u1sd0JwsuPLqb3SYmusag+edF6ziyMensPVqLTSc1PiSEA==", "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", + "follow-redirects": "^1.15.0", + "form-data": "^4.0.0", "proxy-from-env": "^1.1.0" } }, "node_modules/axios/node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "license": "MIT", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", "mime-types": "^2.1.12" }, "engines": { @@ -6152,10 +6128,9 @@ } }, "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -6351,21 +6326,20 @@ "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", - "license": "MIT", + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.1.tgz", + "integrity": "sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==", "dependencies": { "bytes": "3.1.2", - "content-type": "~1.0.5", + "content-type": "~1.0.4", "debug": "2.6.9", "depd": "2.0.0", "destroy": "1.2.0", "http-errors": "2.0.0", "iconv-lite": "0.4.24", "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "qs": "6.11.0", + "raw-body": "2.5.1", "type-is": "~1.6.18", "unpipe": "1.0.0" }, @@ -6374,11 +6348,18 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/body-parser/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -6387,7 +6368,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -6398,8 +6378,7 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { "version": "1.1.1", @@ -6418,22 +6397,20 @@ "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "license": "MIT", + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "license": "MIT", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "dependencies": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" }, "engines": { "node": ">=8" @@ -6445,9 +6422,9 @@ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, "node_modules/browserslist": { - "version": "4.25.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", - "integrity": "sha512-KGj0KoOMXLpSNkkEI6Z6mShmQy0bc1I+T7K9N81k4WWMrfz+6fQ6es80B/YLAeRoKvjYE1YSHHOW1qe9xIVzHw==", + "version": "4.21.7", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.7.tgz", + "integrity": "sha512-BauCXrQ7I2ftSqd2mvKHGo85XR0u7Ru3C/Hxsy/0TkfCtjrmAbPdzLGasmoiBxplpDXlPvdjX9u7srIMfgasNA==", "funding": [ { "type": "opencollective", @@ -6462,12 +6439,11 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "caniuse-lite": "^1.0.30001726", - "electron-to-chromium": "^1.5.173", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" + "caniuse-lite": "^1.0.30001489", + "electron-to-chromium": "^1.4.411", + "node-releases": "^2.0.12", + "update-browserslist-db": "^1.0.11" }, "bin": { "browserslist": "cli.js" @@ -6548,10 +6524,9 @@ } }, "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", "engines": { "node": ">= 0.8" } @@ -6568,35 +6543,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", @@ -6645,9 +6591,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001731", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001731.tgz", - "integrity": "sha512-lDdp2/wrOmTRWuoB5DpfNkC0rJDU8DqRa6nYL6HK6sytw70QMopt/NIc/9SM7ylItlBWfACXk0tEn37UWM/+mg==", + "version": "1.0.30001494", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001494.tgz", + "integrity": "sha512-sY2B5Qyl46ZzfYDegrl8GBCzdawSLT4ThM9b9F+aDYUrAG2zCOyMbd2Tq34mS1g4ZKBfjRlzOohQMxx28x6wJg==", "funding": [ { "type": "opencollective", @@ -6661,15 +6607,14 @@ "type": "github", "url": "https://github.com/sponsors/ai" } - ], - "license": "CC-BY-4.0" + ] }, "node_modules/canvg": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/canvg/-/canvg-4.0.3.tgz", - "integrity": "sha512-fKzMoMBwus3CWo1Uy8XJc4tqqn98RoRrGV6CsIkaNiQT5lOeHuMh4fOt+LXLzn2Wqtr4p/c2TOLz4xtu4oBlFA==", - "license": "MIT", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/canvg/-/canvg-4.0.1.tgz", + "integrity": "sha512-5gD/d6SiCCT7baLnVr0hokYe93DfcHW2rSqdKOuOQD84YMlyfttnZ8iQsThTdX6koYam+PROz/FuQTo500zqGw==", "dependencies": { + "@types/offscreencanvas": "^2019.6.4", "@types/raf": "^3.4.0", "raf": "^3.4.1", "rgbcolor": "^1.0.1", @@ -6953,8 +6898,7 @@ "node_modules/colorette": { "version": "2.0.20", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz", - "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==", - "license": "MIT" + "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -6975,6 +6919,11 @@ "node": ">= 12" } }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/common-path-prefix/-/common-path-prefix-3.0.0.tgz", + "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==" + }, "node_modules/common-tags": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", @@ -7014,17 +6963,16 @@ } }, "node_modules/compression": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.8.1.tgz", - "integrity": "sha512-9mAqGPHLakhCLeNyxPkK4xVo746zQ/czLH1Ky+vkitMnWfWZps8r0qXuwhwizagCRttsL4lfG4pIOvaWLpAP0w==", - "license": "MIT", + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "dependencies": { - "bytes": "3.1.2", - "compressible": "~2.0.18", + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", "debug": "2.6.9", - "negotiator": "~0.6.4", - "on-headers": "~1.1.0", - "safe-buffer": "5.2.1", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", "vary": "~1.1.2" }, "engines": { @@ -7044,14 +6992,10 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "node_modules/compression/node_modules/negotiator": { - "version": "0.6.4", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", - "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/concat-map": { "version": "0.0.1", @@ -7086,7 +7030,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -7097,10 +7040,9 @@ "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" }, "node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "license": "MIT", + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", "engines": { "node": ">= 0.6" } @@ -7133,11 +7075,10 @@ } }, "node_modules/core-js-pure": { - "version": "3.44.0", - "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.44.0.tgz", - "integrity": "sha512-gvMQAGB4dfVUxpYD0k3Fq8J+n5bB6Ytl15lqlZrOIXFzxOhtPaObfkQGHtMRdyjIf7z2IeNULwi1jEwyS+ltKQ==", + "version": "3.30.2", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.30.2.tgz", + "integrity": "sha512-p/npFUJXXBkCCTIlEGBdghofn00jWG6ZOtdoIXSJmAu2QBvN0IqpZXWweOytcwE6cfx8ZvVUy1vw8zxhe4Y2vg==", "hasInstallScript": true, - "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/core-js" @@ -7187,10 +7128,9 @@ } }, "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -8142,7 +8082,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -8151,7 +8090,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "license": "MIT", "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -8369,20 +8307,6 @@ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-5.1.0.tgz", "integrity": "sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==" }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/duplexer": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.2.tgz", @@ -8431,14 +8355,12 @@ "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/ejs": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", - "integrity": "sha512-UeJmFfOrAQS8OJWPZ4qtgHyWExa088/MtK5UEyoJGFH67cDEXkZSviOiKRCZ4Xij0zxI3JECgYs3oKx+AizQBA==", - "license": "Apache-2.0", + "version": "3.1.9", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.9.tgz", + "integrity": "sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ==", "dependencies": { "jake": "^10.8.5" }, @@ -8450,10 +8372,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.5.192", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.192.tgz", - "integrity": "sha512-rP8Ez0w7UNw/9j5eSXCe10o1g/8B1P5SM90PCCMVkIRQn2R0LEHWz4Eh9RnxkniuDe1W0cTSOB3MLlkTGDcuCg==", - "license": "ISC" + "version": "1.4.419", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.419.tgz", + "integrity": "sha512-jdie3RiEgygvDTyS2sgjq71B36q2cDSBfPlwzUyuOrfYTNoYWyBxxjGJV/HAu3A2hB0Y+HesvCVkVAFoCKwCSw==" }, "node_modules/email-addresses": { "version": "5.0.0", @@ -8485,10 +8406,9 @@ } }, "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "engines": { "node": ">= 0.8" } @@ -8502,10 +8422,9 @@ } }, "node_modules/enhanced-resolve": { - "version": "5.18.2", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.2.tgz", - "integrity": "sha512-6Jw4sE1maoRJo3q8MsSIn2onJFbLTOjY9hlx4DZXmOKvLRd1Ok2kXmAGXaafL2+ijsJZ1ClYbl/pmqr9+k4iUQ==", - "license": "MIT", + "version": "5.14.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.1.tgz", + "integrity": "sha512-Vklwq2vDKtl0y/vtwjSesgJ5MYS7Etuk5txS8VdKL4AOS1aUlD96zqIfsOSLQsdv3xgMRbtkWM8eG9XDfKUPow==", "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -8590,24 +8509,6 @@ "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-get-iterator": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", @@ -8632,28 +8533,14 @@ "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==" }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -8684,10 +8571,9 @@ } }, "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "engines": { "node": ">=6" } @@ -8974,10 +8860,9 @@ } }, "node_modules/eslint-plugin-import/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -9035,10 +8920,9 @@ } }, "node_modules/eslint-plugin-jsx-a11y/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -9110,10 +8994,9 @@ } }, "node_modules/eslint-plugin-react/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -9374,7 +9257,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -9457,37 +9339,36 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", - "license": "MIT", + "version": "4.18.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.18.2.tgz", + "integrity": "sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", + "body-parser": "1.20.1", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", + "cookie": "0.5.0", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", + "finalhandler": "1.2.0", "fresh": "0.5.2", "http-errors": "2.0.0", - "merge-descriptors": "1.0.3", + "merge-descriptors": "1.0.1", "methods": "~1.1.2", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "0.1.7", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "6.11.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "0.18.0", + "serve-static": "1.15.0", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -9496,10 +9377,6 @@ }, "engines": { "node": ">= 0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" } }, "node_modules/express/node_modules/array-flatten": { @@ -9573,22 +9450,6 @@ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, - "node_modules/fast-uri": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.0.6.tgz", - "integrity": "sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/fastq": { "version": "1.15.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", @@ -9655,10 +9516,9 @@ } }, "node_modules/filelist/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } @@ -9707,10 +9567,9 @@ } }, "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "license": "MIT", + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -9719,13 +9578,12 @@ } }, "node_modules/finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", - "license": "MIT", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", "dependencies": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "on-finished": "2.4.1", "parseurl": "~1.3.3", @@ -9740,7 +9598,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -9748,8 +9605,7 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "version": "3.3.2", @@ -9805,16 +9661,15 @@ "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==" }, "node_modules/follow-redirects": { - "version": "1.15.9", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.9.tgz", - "integrity": "sha512-gew4GsXizNgdoRyqmyfMHyAmXsZDk6mHkSxZFCzW9gwlbtOW44CDtYavM+y+72qD/Vq2l550kMF52DT8fOLJqQ==", + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", "funding": [ { "type": "individual", "url": "https://github.com/sponsors/RubenVerborgh" } ], - "license": "MIT", "engines": { "node": ">=4.0" }, @@ -9925,16 +9780,13 @@ } }, "node_modules/form-data": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.4.tgz", - "integrity": "sha512-f0cRzm6dkyVYV3nPoooP8XlccPQukegwhAnpoLcXy+X+A8KfpGOoXwDr9FLZd3wzgLaBGQBE3lY93Zm/i1JvIQ==", - "license": "MIT", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", + "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.35" + "mime-types": "^2.1.12" }, "engines": { "node": ">= 6" @@ -9964,7 +9816,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -10036,13 +9887,9 @@ } }, "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -10086,24 +9933,14 @@ } }, "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10122,19 +9959,6 @@ "node": ">=8.0.0" } }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -10262,8 +10086,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "license": "BSD-2-Clause" + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global-modules": { "version": "2.0.0", @@ -10342,12 +10165,11 @@ } }, "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10442,10 +10264,9 @@ } }, "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", "engines": { "node": ">= 0.4" }, @@ -10454,30 +10275,17 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", "dependencies": { - "function-bind": "^1.1.2" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/he": { @@ -10654,7 +10462,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -10698,10 +10505,9 @@ } }, "node_modules/http-proxy-middleware": { - "version": "2.0.9", - "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.9.tgz", - "integrity": "sha512-c1IyJYLYppU574+YI7R4QyX2ystMtVXZwIdzazUIPIJsHuWNd+mho2j+bKoHftndicGj9yh+xjd+l0yj7VeT1Q==", - "license": "MIT", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", + "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -11110,7 +10916,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "license": "MIT", "engines": { "node": ">=0.12.0" } @@ -11349,10 +11154,9 @@ } }, "node_modules/istanbul-lib-instrument/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -13331,15 +13135,14 @@ } }, "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "license": "MIT", + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", + "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", "bin": { "jsesc": "bin/jsesc" }, "engines": { - "node": ">=6" + "node": ">=4" } }, "node_modules/json-parse-even-better-errors": { @@ -13847,10 +13650,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "license": "ISC", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "bin": { "semver": "bin/semver.js" } @@ -13863,15 +13665,6 @@ "tmpl": "1.0.5" } }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/mdn-data": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz", @@ -13881,7 +13674,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", "engines": { "node": ">= 0.6" } @@ -13898,13 +13690,9 @@ } }, "node_modules/merge-descriptors": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", - "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", @@ -13928,12 +13716,11 @@ } }, "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "license": "MIT", + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", "dependencies": { - "braces": "^3.0.3", + "braces": "^3.0.2", "picomatch": "^2.3.1" }, "engines": { @@ -13944,7 +13731,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "license": "MIT", "bin": { "mime": "cli.js" }, @@ -14117,16 +13903,15 @@ } }, "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", + "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", "funding": [ { "type": "github", "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -14180,10 +13965,9 @@ "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==" }, "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "license": "MIT" + "version": "2.0.12", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.12.tgz", + "integrity": "sha512-QzsYKWhXTWx8h1kIvqfnC++o0pEmpRQA/aenALsL2F4pqNVr7YzcdMlDij5WBnwftRbJCNJL/O7zdKaxKPHqgQ==" }, "node_modules/normalize-path": { "version": "3.0.0", @@ -14256,13 +14040,9 @@ } }, "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -14391,7 +14171,6 @@ "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", "dependencies": { "ee-first": "1.1.1" }, @@ -14400,10 +14179,9 @@ } }, "node_modules/on-headers": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", - "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", "engines": { "node": ">= 0.8" } @@ -14609,10 +14387,9 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { - "version": "0.1.12", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", - "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT" + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", @@ -14628,10 +14405,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -14811,9 +14587,9 @@ "integrity": "sha512-Kjw8nKRl1m+VrSFCoVGPph93W/qrSO7ZkqPpTf7F4bk/sqcfWK019dWBUpE/fBOsOQY1dks/Bmcbfn1heM/IsA==" }, "node_modules/postcss": { - "version": "8.5.6", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz", - "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==", + "version": "8.4.24", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.24.tgz", + "integrity": "sha512-M0RzbcI0sO/XJNucsGjvWU9ERWxb/ytp1w6dKtxTKgixdtQDq4rmx/g8W1hnaheq9jgwL/oyEdH5Bc4WwJKMqg==", "funding": [ { "type": "opencollective", @@ -14828,11 +14604,10 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "nanoid": "^3.3.11", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" + "nanoid": "^3.3.6", + "picocolors": "^1.0.0", + "source-map-js": "^1.0.2" }, "engines": { "node": "^10 || ^12 || >=14" @@ -16130,12 +15905,11 @@ } }, "node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", - "license": "BSD-3-Clause", + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", "dependencies": { - "side-channel": "^1.0.6" + "side-channel": "^1.0.4" }, "engines": { "node": ">=0.6" @@ -16188,16 +15962,14 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", "engines": { "node": ">= 0.6" } }, "node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", - "license": "MIT", + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", + "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -16208,11 +15980,18 @@ "node": ">= 0.8" } }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/raw-body/node_modules/iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16493,10 +16272,9 @@ } }, "node_modules/readdir-glob/node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", "dependencies": { "balanced-match": "^1.0.0" } @@ -16829,10 +16607,9 @@ "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==" }, "node_modules/rollup": { - "version": "2.79.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", - "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", - "license": "MIT", + "version": "2.79.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.1.tgz", + "integrity": "sha512-uKxbd0IhMZOhjAiD5oAFp7BqvkA4Dv47qpOCtaNvng4HBwdbWtdOh8f5nZNuk2rp51PMGk3bzfWu5oayNEuYnw==", "bin": { "rollup": "dist/bin/rollup" }, @@ -17066,10 +16843,12 @@ } }, "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", + "version": "7.5.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", + "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "dependencies": { + "lru-cache": "^6.0.0" + }, "bin": { "semver": "bin/semver.js" }, @@ -17077,11 +16856,26 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, "node_modules/send": { - "version": "0.19.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", - "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", - "license": "MIT", + "version": "0.18.0", + "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", + "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -17105,7 +16899,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "license": "MIT", "dependencies": { "ms": "2.0.0" } @@ -17113,29 +16906,17 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT" - }, - "node_modules/send/node_modules/encodeurl": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz", - "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==", - "license": "BSD-3-Clause", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", + "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", "dependencies": { "randombytes": "^2.1.0" } @@ -17211,15 +16992,14 @@ } }, "node_modules/serve-static": { - "version": "1.16.2", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", - "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", - "license": "MIT", + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", + "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", "dependencies": { - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.19.0" + "send": "0.18.0" }, "engines": { "node": ">= 0.8.0" @@ -17233,8 +17013,7 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -17264,72 +17043,13 @@ } }, "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -17377,10 +17097,9 @@ } }, "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", "engines": { "node": ">=0.10.0" } @@ -17503,7 +17222,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -18102,13 +17820,12 @@ } }, "node_modules/terser": { - "version": "5.43.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.43.1.tgz", - "integrity": "sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg==", - "license": "BSD-2-Clause", + "version": "5.17.7", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.7.tgz", + "integrity": "sha512-/bi0Zm2C6VAexlGgLlVxA0P2lru/sdLyfCVaRMfKVo9nWxbmz7f/sD8VPybPeSUJaJcwmCJis9pBIhcVcG1QcQ==", "dependencies": { "@jridgewell/source-map": "^0.3.3", - "acorn": "^8.14.0", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -18120,16 +17837,15 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.14", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz", - "integrity": "sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw==", - "license": "MIT", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", + "@jridgewell/trace-mapping": "^0.3.17", "jest-worker": "^27.4.5", - "schema-utils": "^4.3.0", - "serialize-javascript": "^6.0.2", - "terser": "^5.31.1" + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.16.8" }, "engines": { "node": ">= 10.13.0" @@ -18153,59 +17869,6 @@ } } }, - "node_modules/terser-webpack-plugin/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, - "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/terser-webpack-plugin/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", @@ -18287,11 +17950,18 @@ "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==" }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", + "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", + "engines": { + "node": ">=4" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -18303,16 +17973,14 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", "engines": { "node": ">=0.6" } }, "node_modules/tough-cookie": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", - "integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==", - "license": "BSD-3-Clause", + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", + "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", "dependencies": { "psl": "^1.1.33", "punycode": "^2.1.1", @@ -18467,7 +18135,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -18584,7 +18251,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", "engines": { "node": ">= 0.8" } @@ -18658,9 +18324,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", + "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", "funding": [ { "type": "opencollective", @@ -18675,10 +18341,9 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -18810,10 +18475,9 @@ } }, "node_modules/watchpack": { - "version": "2.4.4", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.4.tgz", - "integrity": "sha512-c5EGNOiyxxV5qmTtAB7rbiXxi1ooX1pQKMLX/MIabJjRA0SJBQOjKF+KSVfHkr9U1cADPon0mRiVe/riyaiDUA==", - "license": "MIT", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", + "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -18844,36 +18508,34 @@ } }, "node_modules/webpack": { - "version": "5.101.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.101.0.tgz", - "integrity": "sha512-B4t+nJqytPeuZlHuIKTbalhljIFXeNRqrUGAQgTGlfOl2lXXKXw+yZu6bicycP+PUlM44CxBjCFD6aciKFT3LQ==", - "license": "MIT", - "dependencies": { - "@types/eslint-scope": "^3.7.7", - "@types/estree": "^1.0.8", - "@types/json-schema": "^7.0.15", - "@webassemblyjs/ast": "^1.14.1", - "@webassemblyjs/wasm-edit": "^1.14.1", - "@webassemblyjs/wasm-parser": "^1.14.1", - "acorn": "^8.15.0", - "acorn-import-phases": "^1.0.3", - "browserslist": "^4.24.0", + "version": "5.85.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.85.0.tgz", + "integrity": "sha512-7gazTiYqwo5OSqwH1tigLDL2r3qDeP2dOKYgd+LlXpsUMqDTklg6tOghexqky0/+6QY38kb/R/uRPUleuL43zg==", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.0", + "@webassemblyjs/ast": "^1.11.5", + "@webassemblyjs/wasm-edit": "^1.11.5", + "@webassemblyjs/wasm-parser": "^1.11.5", + "acorn": "^8.7.1", + "acorn-import-assertions": "^1.9.0", + "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.2", + "enhanced-resolve": "^5.14.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.11", + "graceful-fs": "^4.2.9", "json-parse-even-better-errors": "^2.3.1", "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^4.3.2", + "schema-utils": "^3.1.2", "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.3.11", - "watchpack": "^2.4.1", - "webpack-sources": "^3.3.3" + "terser-webpack-plugin": "^5.3.7", + "watchpack": "^2.4.0", + "webpack-sources": "^3.2.3" }, "bin": { "webpack": "bin/webpack.js" @@ -18892,10 +18554,9 @@ } }, "node_modules/webpack-dev-middleware": { - "version": "5.3.4", - "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.4.tgz", - "integrity": "sha512-BVdTqhhs+0IfoeAf7EoH5WE+exCmqGerHfDM0IL096Px60Tq2Mn9MAbnaGUe6HiMa41KMCYF19gyzZmBcq/o4Q==", - "license": "MIT", + "version": "5.3.3", + "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", + "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -18915,15 +18576,14 @@ } }, "node_modules/webpack-dev-middleware/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", + "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" }, "funding": { "type": "github", @@ -18934,7 +18594,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -18945,14 +18604,12 @@ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "license": "MIT", + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.1.tgz", + "integrity": "sha512-lELhBAAly9NowEsX0yZBlw9ahZG+sK/1RJ21EpzdYHKEs13Vku3LJ+MIPhh4sMs0oCCeufZQEQbMekiA4vuVIQ==", "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", @@ -18960,7 +18617,7 @@ "ajv-keywords": "^5.1.0" }, "engines": { - "node": ">= 10.13.0" + "node": ">= 12.13.0" }, "funding": { "type": "opencollective", @@ -18968,10 +18625,9 @@ } }, "node_modules/webpack-dev-server": { - "version": "4.15.2", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", - "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", - "license": "MIT", + "version": "4.15.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.0.tgz", + "integrity": "sha512-HmNB5QeSl1KpulTBQ8UT4FPrByYyaLxpJoQ0+s7EvUrMc16m0ZS1sgb1XGqzmgCPk0c9y+aaXxn11tbLzuM7NQ==", "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -18979,7 +18635,7 @@ "@types/serve-index": "^1.9.1", "@types/serve-static": "^1.13.10", "@types/sockjs": "^0.3.33", - "@types/ws": "^8.5.5", + "@types/ws": "^8.5.1", "ansi-html-community": "^0.0.8", "bonjour-service": "^1.0.11", "chokidar": "^3.5.3", @@ -19001,7 +18657,7 @@ "serve-index": "^1.9.1", "sockjs": "^0.3.24", "spdy": "^4.0.2", - "webpack-dev-middleware": "^5.3.4", + "webpack-dev-middleware": "^5.3.1", "ws": "^8.13.0" }, "bin": { @@ -19076,10 +18732,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.18.3", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.18.3.tgz", - "integrity": "sha512-PEIGCY5tSlUt50cqyMXfCzX+oOPqN0vuGqWzbcJ2xvnkzkq46oOpz7dQaTDBdfICb4N14+GARUDw2XV2N4tvzg==", - "license": "MIT", + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "engines": { "node": ">=10.0.0" }, @@ -19132,42 +18787,13 @@ } }, "node_modules/webpack-sources": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.3.3.tgz", - "integrity": "sha512-yd1RBzSGanHkitROoPFd6qsrxt+oFhg/129YzheDGqeustzX0vTZJZsSsQjVQC4yzBQ56K55XU8gaNCtIzOnTg==", - "license": "MIT", + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", "engines": { "node": ">=10.13.0" } }, - "node_modules/webpack/node_modules/ajv": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", - "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/webpack/node_modules/ajv-keywords": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", - "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3" - }, - "peerDependencies": { - "ajv": "^8.8.2" - } - }, "node_modules/webpack/node_modules/eslint-scope": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", @@ -19188,31 +18814,6 @@ "node": ">=4.0" } }, - "node_modules/webpack/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/webpack/node_modules/schema-utils": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.2.tgz", - "integrity": "sha512-Gn/JaSk/Mt9gYubxTtSn/QCV4em9mpAPiR1rqy/Ocu19u/G9J5WWdNoUT4SiV6mFC3y6cxyFcFwdzPM3FgxGAQ==", - "license": "MIT", - "dependencies": { - "@types/json-schema": "^7.0.9", - "ajv": "^8.9.0", - "ajv-formats": "^2.1.1", - "ajv-keywords": "^5.1.0" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, "node_modules/websocket-driver": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", @@ -19339,10 +18940,9 @@ } }, "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "license": "MIT", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", "engines": { "node": ">=0.10.0" } @@ -19675,10 +19275,9 @@ } }, "node_modules/ws": { - "version": "7.5.10", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", - "integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==", - "license": "MIT", + "version": "7.5.9", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.9.tgz", + "integrity": "sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==", "engines": { "node": ">=8.3.0" }, From 6814fe269e8bee50048b539c11e480afb77780f4 Mon Sep 17 00:00:00 2001 From: Peter Date: Tue, 29 Jul 2025 12:04:36 +0100 Subject: [PATCH 013/284] Replace package-lock.json --- package-lock.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package-lock.json b/package-lock.json index 8d6e61f..aad6be5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4965,9 +4965,10 @@ "version": "17.0.60", "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.60.tgz", "integrity": "sha512-pCH7bqWIfzHs3D+PDs3O/COCQJka+Kcw3RnO9rFA2zalqoXg7cNjJDh6mZ7oRtY1wmY4LVwDdAbA1F7Z8tv3BQ==", + "license": "MIT", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", + "@types/scheduler": "^0.16", "csstype": "^3.0.2" } }, @@ -18167,6 +18168,7 @@ "version": "4.9.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "license": "Apache-2.0", "peer": true, "bin": { "tsc": "bin/tsc", From ee6e6f2bda505fdeb748f1d0978dfdfc94d1f8c8 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 12:36:17 +0100 Subject: [PATCH 014/284] added gh-pages workflow --- .github/workflows/deploy_from_branch.yml | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/deploy_from_branch.yml diff --git a/.github/workflows/deploy_from_branch.yml b/.github/workflows/deploy_from_branch.yml new file mode 100644 index 0000000..b16ad7f --- /dev/null +++ b/.github/workflows/deploy_from_branch.yml @@ -0,0 +1,36 @@ +name: Deploy to GitHub Pages from chosen branch + +on: + workflow_dispatch: + + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout current branch + uses: actions/checkout@v3 + with: + ref: ${{ github.ref_name }} + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 22.17.1 # or whatever version your project uses + + - name: Install dependencies + run: npm ci + + - name: Build the app + run: npm run build + + - name: Deploy to GitHub Pages + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + npm exec gh-pages -- \ + -d build \ + -r https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git From af14fc3b4c070b879dfa253928b7fa0203027365 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 12:57:50 +0100 Subject: [PATCH 015/284] changed to download metadata tsv --- .../CorpusMetadata/NavigationAndStats/DownloadData.js | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js b/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js index 3d6f3dc..5f28529 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js +++ b/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js @@ -41,8 +41,8 @@ const DownloadData = ({ data, status }) => { 0 - ? "Download selected metadata in csv format" - : "Download metadata on this page in csv format" + ? "Download selected metadata in tsv format" + : "Download metadata on this page in tsv format" } placement="top" > @@ -55,7 +55,9 @@ const DownloadData = ({ data, status }) => { specificData.length !== 0 && ( Date: Tue, 29 Jul 2025 14:50:16 +0100 Subject: [PATCH 016/284] fixed github fetch for download --- .../NavigationAndStats/index.js | 33 +++++++++++++++---- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index 8cc8c15..a94d632 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -51,6 +51,7 @@ const NavigationAndStats = () => { const [pairwiseLiteUrl, setPairwiseLiteUrl] = useState(null); const [pairwiseUrl, setPairwiseUrl] = useState(null); const [pairwiseFileName, setPairwiseFileName] = useState(null); + const [githubUrl, setGithubUrl] = useState(false); // Check if relevant parts have been loaded before we try to build the URLs and check them // If the lite url is @@ -103,6 +104,7 @@ const NavigationAndStats = () => { const responseGitHub = await fetch(csvUrl, { method: 'HEAD' }); if (responseGitHub.ok) { setPairwiseLiteUrl(csvUrl); + setGithubUrl(true); } else { setPairwiseLiteUrl(null); console.log("No URL found for pairwise Lite data"); @@ -128,13 +130,30 @@ const NavigationAndStats = () => { const downloadTextReuseData = async (downloadUrl) => { if (downloadUrl !== null) { - - const link = document.createElement("a"); - link.href = downloadUrl; - link.download = pairwiseFileName; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); + if (githubUrl) { + // If the URL is a GitHub URL, then we need to download it differently + const response = await fetch(downloadUrl); + if (!response.ok) { + throw new Error("Network response was not ok"); + } + const blob = await response.blob(); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", pairwiseFileName); + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + else { + + const link = document.createElement("a"); + link.href = downloadUrl; + link.download = pairwiseFileName; + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } } } From fc1c4f704ccfb092e818078bb5db8a5517d7943d Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 15:18:47 +0100 Subject: [PATCH 017/284] added loading message and spinner --- .../NavigationAndStats/index.js | 79 +++++++++++-------- 1 file changed, 44 insertions(+), 35 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index a94d632..b5478c6 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -17,6 +17,8 @@ import { buildPairwiseCsvURL } from "../../../utility/Helper" import { setInitialValues } from "../../../functions/setInitialValues"; import { getMetadataObject } from "../../../functions/getMetadataObject"; import { setPairwiseVizData } from "../../../functions/setVisualizationData"; +import { CircularProgress } from "@mui/material"; + // import { csv } from "d3"; const NavigationAndStats = () => { @@ -52,6 +54,7 @@ const NavigationAndStats = () => { const [pairwiseUrl, setPairwiseUrl] = useState(null); const [pairwiseFileName, setPairwiseFileName] = useState(null); const [githubUrl, setGithubUrl] = useState(false); + const [loadingReuseData, setLoadingReuseData] = useState(false); // Check if relevant parts have been loaded before we try to build the URLs and check them // If the lite url is @@ -73,7 +76,8 @@ const NavigationAndStats = () => { return; } - else { + else { + setLoadingReuseData(true); const book1 = checkedBooks[0]; const book2 = checkedBooks[1]; @@ -82,45 +86,46 @@ const NavigationAndStats = () => { const book2Filename = book2?.release_version?.url.split("/").slice(-1)[0]; const book2Code = book2Filename.split(".").slice(2).join("."); - // Create URLs for the selected books - if URL returns a response, then we set the variable - const LiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); - const fullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); - const csvFileName = `${book1Code}_${book2Code}.csv`; - setPairwiseFileName(csvFileName); + // Create URLs for the selected books - if URL returns a response, then we set the variable + const LiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); + const fullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); + const csvFileName = `${book1Code}_${book2Code}.csv`; + setPairwiseFileName(csvFileName); - // Check the URLs - if they are valid then set the state variables - // If the URL is not valid, then set the state variable to null - try { - const responseLite = await fetch(LiteUrl, { method: 'HEAD' }); - if (responseLite.ok) { - setPairwiseLiteUrl(LiteUrl); - } else { - setPairwiseLiteUrl(null); - } - } catch (error) { - - const srtFolder = srtFoldersGitHub[releaseCode]; - const csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; - const responseGitHub = await fetch(csvUrl, { method: 'HEAD' }); - if (responseGitHub.ok) { - setPairwiseLiteUrl(csvUrl); - setGithubUrl(true); + // Check the URLs - if they are valid then set the state variables + // If the URL is not valid, then set the state variable to null + try { + const responseLite = await fetch(LiteUrl, { method: 'HEAD' }); + if (responseLite.ok) { + setPairwiseLiteUrl(LiteUrl); } else { setPairwiseLiteUrl(null); - console.log("No URL found for pairwise Lite data"); - } - }; - try { - const responseFull = await fetch(fullUrl, { method: 'HEAD' }); - if (responseFull.ok) { - setPairwiseUrl(fullUrl); - } else { + } + } catch (error) { + + const srtFolder = srtFoldersGitHub[releaseCode]; + const csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; + const responseGitHub = await fetch(csvUrl, { method: 'HEAD' }); + if (responseGitHub.ok) { + setPairwiseLiteUrl(csvUrl); + setGithubUrl(true); + } else { + setPairwiseLiteUrl(null); + console.log("No URL found for pairwise Lite data"); + } + }; + try { + const responseFull = await fetch(fullUrl, { method: 'HEAD' }); + if (responseFull.ok) { + setPairwiseUrl(fullUrl); + } else { + setPairwiseUrl(null); + } + } catch (error) { + console.log("No URL found for pairwise Full data"); setPairwiseUrl(null); } - } catch (error) { - console.log("No URL found for pairwise Full data"); - setPairwiseUrl(null); - } + setLoadingReuseData(false); } }; checkSelectedUrls(); @@ -329,6 +334,10 @@ const NavigationAndStats = () => { Select a second book to visualise pairwise text reuse + ) : checkedBooks.length < 3 && loadingReuseData == true ? ( + + Loading text reuse data for selected books... + ) : checkedBooks.length < 3 && pairwiseLiteUrl == null ? ( No text reuse data available for selected books From 6b88f9fbab14e2c7f6906ab18b67ac27bee13a5c Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 15:37:01 +0100 Subject: [PATCH 018/284] moved icon for removing selection, changed colour of icon --- .../NavigationAndStats/index.js | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index b5478c6..e630e5e 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -305,6 +305,22 @@ const NavigationAndStats = () => { {checkedBooks.length !== 0 && ( <> Selected: {checkedBooks.length} + + + + + setCheckedBooks([])} + > + + + + + + { ) : ( "" )} - {checkedBooks.length !== 0 && ( - - - - setCheckedBooks([])} - > - - - - - - )} {totalRecords ? ( From e8c7f2fe3215cb6200564552aa00dc93638f12b4 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 15:39:34 +0100 Subject: [PATCH 019/284] added workflow for testing --- .github/workflows/deploy_from_branch.yml | 36 ++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 .github/workflows/deploy_from_branch.yml diff --git a/.github/workflows/deploy_from_branch.yml b/.github/workflows/deploy_from_branch.yml new file mode 100644 index 0000000..b16ad7f --- /dev/null +++ b/.github/workflows/deploy_from_branch.yml @@ -0,0 +1,36 @@ +name: Deploy to GitHub Pages from chosen branch + +on: + workflow_dispatch: + + +jobs: + deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout current branch + uses: actions/checkout@v3 + with: + ref: ${{ github.ref_name }} + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: 22.17.1 # or whatever version your project uses + + - name: Install dependencies + run: npm ci + + - name: Build the app + run: npm run build + + - name: Deploy to GitHub Pages + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + git config user.name "github-actions[bot]" + git config user.email "github-actions[bot]@users.noreply.github.com" + npm exec gh-pages -- \ + -d build \ + -r https://x-access-token:${GH_TOKEN}@github.com/${{ github.repository }}.git From 965aea9b699d71232cd9bac53ddae4c34ba52b28 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 15:43:44 +0100 Subject: [PATCH 020/284] patch error with == --- src/components/CorpusMetadata/NavigationAndStats/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index e630e5e..6868dd6 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -350,11 +350,11 @@ const NavigationAndStats = () => { Select a second book to visualise pairwise text reuse - ) : checkedBooks.length < 3 && loadingReuseData == true ? ( + ) : checkedBooks.length < 3 && loadingReuseData === true ? ( Loading text reuse data for selected books... - ) : checkedBooks.length < 3 && pairwiseLiteUrl == null ? ( + ) : checkedBooks.length < 3 && pairwiseLiteUrl === null ? ( No text reuse data available for selected books From 224efeb18d9e746048b98fdcf87ec5ded09e5733 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 16:34:13 +0100 Subject: [PATCH 021/284] patched request approach - only request once --- .../NavigationAndStats/index.js | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index 6868dd6..dd32fc3 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -77,6 +77,7 @@ const NavigationAndStats = () => { } else { + console.log("Checking selected books for pairwise text reuse data"); setLoadingReuseData(true); const book1 = checkedBooks[0]; @@ -95,16 +96,18 @@ const NavigationAndStats = () => { // Check the URLs - if they are valid then set the state variables // If the URL is not valid, then set the state variable to null try { - const responseLite = await fetch(LiteUrl, { method: 'HEAD' }); - if (responseLite.ok) { + const responseFull = await fetch(fullUrl, { method: 'HEAD' }); + if (responseFull.ok) { setPairwiseLiteUrl(LiteUrl); + setPairwiseUrl(fullUrl) } else { setPairwiseLiteUrl(null); } } catch (error) { - + const srtFolder = srtFoldersGitHub[releaseCode]; const csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; + console.log(`Fetching data from Github with URL:${csvUrl}`); const responseGitHub = await fetch(csvUrl, { method: 'HEAD' }); if (responseGitHub.ok) { setPairwiseLiteUrl(csvUrl); @@ -114,22 +117,22 @@ const NavigationAndStats = () => { console.log("No URL found for pairwise Lite data"); } }; - try { - const responseFull = await fetch(fullUrl, { method: 'HEAD' }); - if (responseFull.ok) { - setPairwiseUrl(fullUrl); - } else { - setPairwiseUrl(null); - } - } catch (error) { - console.log("No URL found for pairwise Full data"); - setPairwiseUrl(null); - } + // try { + // const responseFull = await fetch(fullUrl, { method: 'HEAD' }); + // if (responseFull.ok) { + // setPairwiseUrl(fullUrl); + // } else { + // setPairwiseUrl(null); + // } + // } catch (error) { + // console.log("No URL found for pairwise Full data"); + // setPairwiseUrl(null); + // } setLoadingReuseData(false); } }; checkSelectedUrls(); - }, [checkedBooks, releaseCode, booksReady, pairwiseFileName, pairwiseUrl, pairwiseLiteUrl]); + }, [checkedBooks, releaseCode, booksReady]); // Download the text reuse data from the server - getting the full data file: const downloadTextReuseData = async (downloadUrl) => { From ca9554a60343e7a681b919d116766c9982089968 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 17:09:16 +0100 Subject: [PATCH 022/284] added timeout to avoid page jitter --- .../CorpusMetadata/NavigationAndStats/index.js | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index dd32fc3..cf3657d 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -55,6 +55,7 @@ const NavigationAndStats = () => { const [pairwiseFileName, setPairwiseFileName] = useState(null); const [githubUrl, setGithubUrl] = useState(false); const [loadingReuseData, setLoadingReuseData] = useState(false); + const [showLoadingMessage, setShowLoadingMessage] = useState(false); // Check if relevant parts have been loaded before we try to build the URLs and check them // If the lite url is @@ -64,10 +65,21 @@ const NavigationAndStats = () => { releaseCode && srtFolders[releaseCode]; + // Function to delay showing a loading message - avoids page flickering when data loads quickly + useEffect(() => { + let timer; + if (loadingReuseData === true) { + timer = setTimeout(() => setShowLoadingMessage(true), 1000); + } else { + setShowLoadingMessage(false); + } + + return () => clearTimeout(timer); + }, [loadingReuseData]); + useEffect(() => { if (!booksReady) return; const checkSelectedUrls = async () => { - console.log(checkedBooks); if (checkedBooks.length !== 2) { // If we have not selected two books, then set these pairwise parameters to null setPairwiseLiteUrl(null); @@ -353,11 +365,11 @@ const NavigationAndStats = () => { Select a second book to visualise pairwise text reuse - ) : checkedBooks.length < 3 && loadingReuseData === true ? ( + ) : checkedBooks.length < 3 && showLoadingMessage ? ( Loading text reuse data for selected books... - ) : checkedBooks.length < 3 && pairwiseLiteUrl === null ? ( + ) : checkedBooks.length < 3 && !loadingReuseData && pairwiseLiteUrl === null ? ( No text reuse data available for selected books From 8a5cb34024bef7cd62ac0d9dc40cc9f8036f2c54 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 29 Jul 2025 18:16:07 +0100 Subject: [PATCH 023/284] fixes to clear icons during data load --- src/components/CorpusMetadata/NavigationAndStats/index.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index cf3657d..9ed1939 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -365,6 +365,8 @@ const NavigationAndStats = () => { Select a second book to visualise pairwise text reuse + ) : checkedBooks.length < 3 && !showLoadingMessage &&loadingReuseData ? ( + "" ) : checkedBooks.length < 3 && showLoadingMessage ? ( Loading text reuse data for selected books... From a564d2ca413ec54adb605c94c9ff72c976998d72 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 30 Jul 2025 09:10:07 +0100 Subject: [PATCH 024/284] fix tooltip --- src/components/CorpusMetadata/NavigationAndStats/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index 9ed1939..fe263fb 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -412,7 +412,7 @@ const NavigationAndStats = () => { title={ checkedBooks.length < 3 ? pairwiseUrl === null ? "Pairwise File not available for selected books" - : "Download Pairwise Text Reuse Data (larger file, excl. actual text alignments)" + : "Download Pairwise Text Reuse Data (larger file, incl. actual text alignments)" : "Select 2 books to download a file with pairwise text reuse" } placement="top" From 552f85274aa3fb891a7514a8f6b89f7a4a5c3807 Mon Sep 17 00:00:00 2001 From: Peter Verkinderen Date: Wed, 30 Jul 2025 09:18:54 +0100 Subject: [PATCH 025/284] Create pull_request_template.md --- .../pull_request_template.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/workflows/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/workflows/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/workflows/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 0000000..7ef8c93 --- /dev/null +++ b/.github/workflows/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,23 @@ +# Describe your changes: +* +* + +# This pull requests adresses/closes the following issues: + +# Changes are staged [here]() +(your GitHub Pages site or https://witty-bay-0dafe9a10.4.azurestaticapps.net/) + +# I have checked: +(add x between the brackets to check the box; add checkboxes for checks relevant to your changes): +* [ ] metadata search still works +* [ ] opening pairwise viz from selection of two texts still works +* [ ] opening pairwise viz from text reuse pane still works +* [ ] opening diff from pairwise viz still works +* [ ] opening one-to-many viz from metadata page still works +* [ ] opening diff from one-to-many viz still works +* [ ] ... + +# Reviewer: @... + +# Reviewer should check: +* [ ] ... From 537d5e341b9c9a869a97ea113ead8098a9716aca Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 30 Jul 2025 09:29:11 +0100 Subject: [PATCH 026/284] Update README with new Git workflow --- README.md | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/README.md b/README.md index 3da880b..629357d 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,57 @@ The website is live at https://kitab-project.org/explore - **Explore Text Reuse Data:** visualize the text reuse relations between two books, or between one book and all other books in the corpus. - **Download:** Download OpenITI text files and KITAB text reuse data. +## Branches: +* **main** is the production branch, and served on GitHub pages (with alias https://kitab-project.org/explore) +* **dev** is the main development branch, from which individual feature branches should be created +* **uat** ("Unit Acceptance Testing") is the staging branch; whenever something is pushed to uat, + a [GitHub Actions script](https://github.com/kitab-project-org/explore/blob/uat/.github/workflows/azure-static-web-apps-witty-bay-0dafe9a10.yml) + builds the stable website and deploys to a test website on Azure (https://witty-bay-0dafe9a10.4.azurestaticapps.net/) + +## Git Workflow +NB: we use a forking workflow so you can test the GitHub Pages deployment on your own GitHub Pages site + +The aim is to create small, short-lived feature branches, and have the main branch continuously updated. + +* (only the first time): + - Fork the repo https://kitab-project.org/explore on GitHub + - clone your fork to your local machine: `git clone https://github.com//explore.git` + - create the connection to the original repo - call it "upstream": `git remote add upstream https://github.com/kitab-project-org/explore.git` + if you run the command `git remote -v` now, it should show the remote branch in addition to "origin" - your fork +* Create a feature branch based on the dev branch of the original repo: `git checkout -b upstream/dev` +* (do development work, add and commit changes, test locally) +* Push the changes to your fork: `git push origin ` +* Stage a test instance of the app on your fork's GitHub pages or the Azure staging website (see below) +* Create a pull request ([here](https://github.com/kitab-project-org/explore/compare)) from your feature branch on your fork + to the dev branch on kitab-project-org (click "compare across forks" if your fork does not appear) + - include a link to your staged instance + - assign a reviewer +* Reviewer thoroughly reviews the pull request and the staged website and communicates with the author about changes needed: + - test the new feature + - check whether the main functionality still works (this kind of check should be automated) - see the pull request template +* Reviewer accepts the pull request +* Reviewer pulls the changes to main +* Reviewer deploys the main branch by running the GitHub Actions script (see below) +* Delete your feature branch to keep the repo clean + +## Testing whether the app works:  +* Locally (for testing the dynamic app):  + - In VSCode: run `npm ci` (only the first time), then `npm start` in the terminal; the website should now be served on http://localhost:8080 +* On your own branch's GitHub Pages (for testing the static website): + - NB: this only works if your GitHub username is whitelisted in the API repo (Masoumeh's, Mathew's, Peter's and Sohail's GitHub usernames are all whitelisted) + - In the fork on your GitHub page, go to Actions, and choose "Deploy to Github Pages from current branch" in the left-hand column + - Then, click the "Run workflow" button, choose the name of your feature branch, and click the green "Run workflow" button + - (only the first time: go to the Settings of your GitHub pages fork, choose "Pages", and in the "Branch" section under "Build and deployment", set the branch to "gh-pages" and the folder to "/ (root)".) + - The website should now be deployed to https://.github.io/explore +* On an azure server: + - Pull the changes into the **uat** branch; this will automatically build the static pages and deploy them to an azure page: https://witty-bay-0dafe9a10.4.azurestaticapps.net/ + +## Deploying the app to https://kitab-project.org/explore : +* Test the deployment as described above +* Pull changes to the main branch +* In the kitab-project-org GitHub page, go to [Actions](https://github.com/kitab-project-org/explore/actions), and choose "Deploy to Github Pages from current branch" in the left-hand column +* Click the "Run workflow" button, select the "main" branch from the dropdown, and click the green "Run workflow" button + ## Getting Started To get started with KITAB explore, follow these steps: From 51ec7052b073b07e00cc810a548f3765bb04722e Mon Sep 17 00:00:00 2001 From: Peter Verkinderen Date: Wed, 30 Jul 2025 10:07:37 +0100 Subject: [PATCH 027/284] update instructions for branching --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 629357d..48614d4 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,11 @@ The aim is to create small, short-lived feature branches, and have the main bran - clone your fork to your local machine: `git clone https://github.com//explore.git` - create the connection to the original repo - call it "upstream": `git remote add upstream https://github.com/kitab-project-org/explore.git` if you run the command `git remote -v` now, it should show the remote branch in addition to "origin" - your fork -* Create a feature branch based on the dev branch of the original repo: `git checkout -b upstream/dev` +* Create a feature branch based on the dev branch of the original repo: + ``` + git fetch upstream + git checkout -b upstream/dev + ``` * (do development work, add and commit changes, test locally) * Push the changes to your fork: `git push origin ` * Stage a test instance of the app on your fork's GitHub pages or the Azure staging website (see below) From e201f473f13ba06bfe3cc0e25056cc2e59487b4b Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 30 Jul 2025 10:36:00 +0100 Subject: [PATCH 028/284] clean up grid for wrapping --- .../NavigationAndStats/DownloadData.js | 2 +- .../NavigationAndStats/index.js | 34 ++++++++++--------- 2 files changed, 19 insertions(+), 17 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js b/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js index 3d6f3dc..49de93f 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js +++ b/src/components/CorpusMetadata/NavigationAndStats/DownloadData.js @@ -63,7 +63,7 @@ const DownloadData = ({ data, status }) => { color: "#6b7280", }} > - + { { setCheckedBooks([])} > @@ -344,7 +345,7 @@ const NavigationAndStats = () => { } > setDisplaySelected(!displaySelected)} > {displaySelected ? ( @@ -356,23 +357,23 @@ const NavigationAndStats = () => { )} - + <> {rows && } {checkedBooks.length === 0 ? ( "" ) : checkedBooks.length === 1 ? ( - + Select a second book to visualise pairwise text reuse ) : checkedBooks.length < 3 && !showLoadingMessage &&loadingReuseData ? ( "" ) : checkedBooks.length < 3 && showLoadingMessage ? ( - + Loading text reuse data for selected books... ) : checkedBooks.length < 3 && !loadingReuseData && pairwiseLiteUrl === null ? ( - + No text reuse data available for selected books ) : ( @@ -390,7 +391,7 @@ const NavigationAndStats = () => { loadChartFromSelected()} > @@ -421,7 +422,7 @@ const NavigationAndStats = () => { downloadTextReuseData(pairwiseUrl)} > @@ -451,7 +452,7 @@ const NavigationAndStats = () => { downloadTextReuseData(pairwiseLiteUrl)} > @@ -470,7 +471,7 @@ const NavigationAndStats = () => { )} - + {checkedNotification ? ( { {totalRecords ? ( Date: Wed, 30 Jul 2025 10:56:09 +0100 Subject: [PATCH 029/284] Review contributors documentation --- README.md | 72 ++++--------------------------------------------------- 1 file changed, 4 insertions(+), 68 deletions(-) diff --git a/README.md b/README.md index 48614d4..bc29ee7 100644 --- a/README.md +++ b/README.md @@ -23,13 +23,13 @@ The website is live at https://kitab-project.org/explore a [GitHub Actions script](https://github.com/kitab-project-org/explore/blob/uat/.github/workflows/azure-static-web-apps-witty-bay-0dafe9a10.yml) builds the stable website and deploys to a test website on Azure (https://witty-bay-0dafe9a10.4.azurestaticapps.net/) -## Git Workflow +## Git Workflow for contributors NB: we use a forking workflow so you can test the GitHub Pages deployment on your own GitHub Pages site The aim is to create small, short-lived feature branches, and have the main branch continuously updated. * (only the first time): - - Fork the repo https://kitab-project.org/explore on GitHub + - Fork the repo https://github.com/kitab-project-org/explore/ on GitHub - clone your fork to your local machine: `git clone https://github.com//explore.git` - create the connection to the original repo - call it "upstream": `git remote add upstream https://github.com/kitab-project-org/explore.git` if you run the command `git remote -v` now, it should show the remote branch in addition to "origin" - your fork @@ -61,7 +61,7 @@ The aim is to create small, short-lived feature branches, and have the main bran - In the fork on your GitHub page, go to Actions, and choose "Deploy to Github Pages from current branch" in the left-hand column - Then, click the "Run workflow" button, choose the name of your feature branch, and click the green "Run workflow" button - (only the first time: go to the Settings of your GitHub pages fork, choose "Pages", and in the "Branch" section under "Build and deployment", set the branch to "gh-pages" and the folder to "/ (root)".) - - The website should now be deployed to https://.github.io/explore + - The website should now be deployed to https://\.github.io/explore * On an azure server: - Pull the changes into the **uat** branch; this will automatically build the static pages and deploy them to an azure page: https://witty-bay-0dafe9a10.4.azurestaticapps.net/ @@ -71,74 +71,10 @@ The aim is to create small, short-lived feature branches, and have the main bran * In the kitab-project-org GitHub page, go to [Actions](https://github.com/kitab-project-org/explore/actions), and choose "Deploy to Github Pages from current branch" in the left-hand column * Click the "Run workflow" button, select the "main" branch from the dropdown, and click the green "Run workflow" button -## Getting Started - -To get started with KITAB explore, follow these steps: - -1. **Clone the Repository:** - - ```bash - git clone https://github.com/kitab-project-org/explore.git - ``` - -2. **Install Dependencies:** - - ```bash - cd explore - npm install - ``` - -3. **Run the Application:** - - ```bash - npm start - ``` - -4. **Access the Application:** - - Open your web browser and navigate to http://localhost:8080. - -## Github Pages Build Process - -To build the file for gh-pages, follow these steps: - -1. **Install Github Pages:** - - ```bash - npm install gh-pages - ``` - -2. **Add Scripts Inside package.json File:** - - "predeploy": "npm run build", - "deploy": "gh-pages -d build", - -3. **Build And Publish:** - try to build the app with - - ```bash - npm run build - ``` - - then run this code: - - ```bash - npm run deploy - ``` - -4. **Live Link:** - -You will get the live link at this location - https://your-github-username.github.io/repo-name/ ## Contributing -We welcome contributions to enhance the library and improve its features. To contribute: - - Fork the repository. - Create a new branch for your feature: git checkout -b feature-name. - Commit your changes: git commit -m 'Add some feature'. - Push to the branch: git push origin feature-name. - Submit a pull request. +We welcome contributions to enhance the library and improve its features. If you would like to contribute, contact the KITAB team. ## Issues From 93ca88d6188be39cb792f2610d87816ccf20a57e Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 30 Jul 2025 12:26:33 +0100 Subject: [PATCH 030/284] added function to load pairwise from url in new tab - commented out old func --- .../CorpusMetadata/NavigationAndStats/index.js | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index db29a73..116dfdc 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -54,6 +54,7 @@ const NavigationAndStats = () => { const [pairwiseUrl, setPairwiseUrl] = useState(null); const [pairwiseFileName, setPairwiseFileName] = useState(null); const [githubUrl, setGithubUrl] = useState(false); + const [idPair, setIdPair] = useState(null); const [loadingReuseData, setLoadingReuseData] = useState(false); const [showLoadingMessage, setShowLoadingMessage] = useState(false); @@ -105,6 +106,9 @@ const NavigationAndStats = () => { const csvFileName = `${book1Code}_${book2Code}.csv`; setPairwiseFileName(csvFileName); + const idPair = `${book1Code}_${book2Code}`; + setIdPair(idPair); + // Check the URLs - if they are valid then set the state variables // If the URL is not valid, then set the state variable to null try { @@ -176,6 +180,15 @@ const NavigationAndStats = () => { } } } + + // Load the pairwise visualisation through a URL - builds the URL and opens it in a new tab + const loadChartFromUrl = async () => { + if (pairwiseLiteUrl !== null) { + const baseUrl = window.location.origin; + const vizUrl = `${baseUrl}/#/visualise/${releaseCode}/?books=${idPair}`; + window.open(vizUrl, "_blank"); + } + } // Load the book visualisation from the checked versions in metadata table: @@ -393,7 +406,7 @@ const NavigationAndStats = () => { variant="text" sx={{ fontSize: "15px", padding: "5px"}} disabled={checkedBooks.length < 3 ? false : true} - onClick={() => loadChartFromSelected()} + onClick={() => loadChartFromUrl()} > {checkedBooks.length < 3 ? ( Date: Wed, 30 Jul 2025 14:54:56 +0100 Subject: [PATCH 031/284] refactor into helper func, add func to drawer link --- .../Drawer/TextReuse/TextReuseData/index.js | 114 ++++++++----- .../NavigationAndStats/index.js | 158 +++++++++--------- src/utility/Helper.js | 12 +- 3 files changed, 155 insertions(+), 129 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js index ed7571d..4fd57c8 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js @@ -8,6 +8,7 @@ import { getMetadataObject } from "../../../../../functions/getMetadataObject"; import { setPairwiseVizData } from "../../../../../functions/setVisualizationData"; import { setInitialValues } from "../../../../../functions/setInitialValues"; import { downloadCsvData } from "../../../../../services/TextReuseData"; +import { loadChartFromUrl } from "../../../../../utility/Helper"; // Text Reuse Data tab in the drawer: const TextReuseData = ({ fullData, query, fullDataLoading }) => { @@ -27,7 +28,7 @@ const TextReuseData = ({ fullData, query, fullDataLoading }) => { setUrl, } = useContext(Context); - // redirect to chart page + // load chart in new window - built from the old function that loaded it into the window const handleRedirectToChart = async ({book1, book2, csvUrl}) => { setInitialValues({ dataLoading, @@ -39,56 +40,77 @@ const TextReuseData = ({ fullData, query, fullDataLoading }) => { setBooks, }); - // generate csv file name - const csvFileName = csvUrl.split("/").pop(); + const idPair = csvUrl.split("/").pop(); - // get book names - const book_names = csvFileName.split("_"); + // load the chart in a new tab + await loadChartFromUrl(releaseCode, idPair); + // close the drawer + setIsOpenDrawer(false); + }; - if (book_names[0] && book_names[1]) { - /*// downloading pairwise text reuse is not necessary: - // already downloaded in drawer: - const versionMeta = await getVersionMeta(releaseCode, book_names); - const book1 = versionMeta.book1; - const book2 = versionMeta.book2;*/ + // Original function that loaded the viz into the same window + // // redirect to chart page + // const handleRedirectToChart = async ({book1, book2, csvUrl}) => { + // setInitialValues({ + // dataLoading, + // setIsFileUploaded, + // setDataLoading, + // setMetaData, + // setChartData, + // setBooksAlignment, + // setBooks, + // }); - // First try to download from KITAB webserver: - let passim_folder = lightSrtFolders[releaseCode]; - let url = `${passim_folder}/${book_names[0]}/${csvFileName}`; - let CSVFile = await downloadCsvData(url); - // if this fails: try to download from GitHub: - if (CSVFile instanceof Error) { - passim_folder = srtFoldersGitHub[releaseCode]; - url = `${passim_folder}/${book_names[0]}/${csvFileName}`; - CSVFile = await downloadCsvData(url); - } + // // generate csv file name + // const csvFileName = csvUrl.split("/").pop(); - // store the loaded csv file in memory (context): - setLoadedCsvFile(CSVFile); + // // get book names + // const book_names = csvFileName.split("_"); - // load pairwise visualisation: - setPairwiseVizData({ - book1, - book2, - CSVFile, - dataLoading, - setDataLoading, - setMetaData, - releaseCode, - getMetadataObject, - setChartData, - setIsError, - setIsFileUploaded, - navigate, - csvFileName, - setUrl, - }); - } else { - setDataLoading({ ...dataLoading, uploading: false }); - setIsError(true); - } - setIsOpenDrawer(false); - }; + // if (book_names[0] && book_names[1]) { + // /*// downloading pairwise text reuse is not necessary: + // // already downloaded in drawer: + // const versionMeta = await getVersionMeta(releaseCode, book_names); + // const book1 = versionMeta.book1; + // const book2 = versionMeta.book2;*/ + + // // First try to download from KITAB webserver: + // let passim_folder = lightSrtFolders[releaseCode]; + // let url = `${passim_folder}/${book_names[0]}/${csvFileName}`; + // let CSVFile = await downloadCsvData(url); + // // if this fails: try to download from GitHub: + // if (CSVFile instanceof Error) { + // passim_folder = srtFoldersGitHub[releaseCode]; + // url = `${passim_folder}/${book_names[0]}/${csvFileName}`; + // CSVFile = await downloadCsvData(url); + // } + + // // store the loaded csv file in memory (context): + // setLoadedCsvFile(CSVFile); + + // // load pairwise visualisation: + // setPairwiseVizData({ + // book1, + // book2, + // CSVFile, + // dataLoading, + // setDataLoading, + // setMetaData, + // releaseCode, + // getMetadataObject, + // setChartData, + // setIsError, + // setIsFileUploaded, + // navigate, + // csvFileName, + // setUrl, + // }); + // } else { + // setDataLoading({ ...dataLoading, uploading: false }); + // setIsError(true); + // } + // setIsOpenDrawer(false); + // }; return ( { } } - // Load the pairwise visualisation through a URL - builds the URL and opens it in a new tab - const loadChartFromUrl = async () => { - if (pairwiseLiteUrl !== null) { - const baseUrl = window.location.origin; - const vizUrl = `${baseUrl}/#/visualise/${releaseCode}/?books=${idPair}`; - window.open(vizUrl, "_blank"); - } - } + - // Load the book visualisation from the checked versions in metadata table: - const loadChartFromSelected = async () => { - // reset context values: - setIsOpenDrawer(false); - setInitialValues({ - dataLoading, - setDataLoading, - setIsFileUploaded, - setMetaData, - setChartData, - setBooksAlignment, - setBooks, - setLoadedCsvFile, - }); + // Below function is the original one that was used to load + // the pairwise visualisation from the checked books in the metadata table + // It loads the visualisation in the same window - and duplicates the data loading - replaced by loadChartFromUrl + // // Load the book visualisation from the checked versions in metadata table: + // const loadChartFromSelected = async () => { + // // reset context values: + // setIsOpenDrawer(false); + // setInitialValues({ + // dataLoading, + // setDataLoading, + // setIsFileUploaded, + // setMetaData, + // setChartData, + // setBooksAlignment, + // setBooks, + // setLoadedCsvFile, + // }); - // prepare the metadata for both book versions: - const book1 = checkedBooks[0]; - const book2 = checkedBooks[1]; - - // build the link to the text reuse pair: - const book1Filename = book1?.release_version?.url.split("/").slice(-1)[0]; - const book1Code = book1Filename.split(".").slice(2).join("."); - const book2Filename = book2?.release_version?.url.split("/").slice(-1)[0]; - const book2Code = book2Filename.split(".").slice(2).join("."); - let srtFolder = lightSrtFolders[releaseCode]; - const csvFileName = `${book1Code}_${book2Code}.csv`; - let csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; - - console.log("PairwiseLitUrl: ", pairwiseLiteUrl); - - // Download the pairwise text reuse data from the KITAB webserver: - let CSVFile = await downloadCsvData(pairwiseLiteUrl); - setLoadedCsvFile(CSVFile); - - // if this fails: try to download it from GitHub: - if (CSVFile instanceof Error) { - srtFolder = srtFoldersGitHub[releaseCode]; - csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; - CSVFile = await downloadCsvData(csvUrl); - } + // // prepare the metadata for both book versions: + // const book1 = checkedBooks[0]; + // const book2 = checkedBooks[1]; - if (Error.prototype.isPrototypeOf(CSVFile)) { - // If the csv file is not found on the server, show an error message: - setCheckedNotification("Data Not Available: " + csvUrl); - setTimeout(() => { - setCheckedNotification(""); - }, 10000); - return null; - } else { - // show the visualization - setPairwiseVizData({ - book1, - book2, - CSVFile, - dataLoading, - setDataLoading, - setMetaData, - releaseCode, - getMetadataObject, - setChartData, - setIsError, - setIsFileUploaded, - navigate, - csvFileName, - setUrl, - }); - //showPairwiseData({csvFileName, CSVFile, book1, book2, releaseCode, - // setChartData, setIsError, dataLoading, setDataLoading, navigate}); - // stop the spinners: - setIsFileUploaded(true); - setDataLoading({ ...dataLoading, uploading: false, chart: false }); - } - }; + // // build the link to the text reuse pair: + // const book1Filename = book1?.release_version?.url.split("/").slice(-1)[0]; + // const book1Code = book1Filename.split(".").slice(2).join("."); + // const book2Filename = book2?.release_version?.url.split("/").slice(-1)[0]; + // const book2Code = book2Filename.split(".").slice(2).join("."); + // let srtFolder = lightSrtFolders[releaseCode]; + // const csvFileName = `${book1Code}_${book2Code}.csv`; + // let csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; + + // console.log("PairwiseLitUrl: ", pairwiseLiteUrl); + + // // Download the pairwise text reuse data from the KITAB webserver: + // let CSVFile = await downloadCsvData(pairwiseLiteUrl); + // setLoadedCsvFile(CSVFile); + + // // if this fails: try to download it from GitHub: + // if (CSVFile instanceof Error) { + // srtFolder = srtFoldersGitHub[releaseCode]; + // csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; + // CSVFile = await downloadCsvData(csvUrl); + // } + + // if (Error.prototype.isPrototypeOf(CSVFile)) { + // // If the csv file is not found on the server, show an error message: + // setCheckedNotification("Data Not Available: " + csvUrl); + // setTimeout(() => { + // setCheckedNotification(""); + // }, 10000); + // return null; + // } else { + // // show the visualization + // setPairwiseVizData({ + // book1, + // book2, + // CSVFile, + // dataLoading, + // setDataLoading, + // setMetaData, + // releaseCode, + // getMetadataObject, + // setChartData, + // setIsError, + // setIsFileUploaded, + // navigate, + // csvFileName, + // setUrl, + // }); + // //showPairwiseData({csvFileName, CSVFile, book1, book2, releaseCode, + // // setChartData, setIsError, dataLoading, setDataLoading, navigate}); + // // stop the spinners: + // setIsFileUploaded(true); + // setDataLoading({ ...dataLoading, uploading: false, chart: false }); + // } + // }; const handleChecked = (value) => { const filter = checkedBooks.filter((item) => { @@ -406,7 +402,7 @@ const NavigationAndStats = () => { variant="text" sx={{ fontSize: "15px", padding: "5px"}} disabled={checkedBooks.length < 3 ? false : true} - onClick={() => loadChartFromUrl()} + onClick={() => loadChartFromUrl(releaseCode, idPair)} > {checkedBooks.length < 3 ? ( { + + const baseUrl = window.location.origin; + const vizUrl = `${baseUrl}/#/visualise/${releaseCode}/?books=${idPair}`; + window.open(vizUrl, "_blank"); + +} const pad = (n, width, z) => { z = z || "0"; @@ -358,5 +365,6 @@ export { bisectLeft, getVersionIDfromURI, getVersionIDfromURL, - buildPairwiseCsvURL + buildPairwiseCsvURL, + loadChartFromUrl }; From b99e4b3736f3d33952cc5a55b44391956d88e945 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 30 Jul 2025 15:13:32 +0100 Subject: [PATCH 032/284] comment out unused variables --- .../Drawer/TextReuse/TextReuseData/index.js | 18 ++++---- .../NavigationAndStats/index.js | 46 ++++++++++--------- 2 files changed, 33 insertions(+), 31 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js index 4fd57c8..0c5bb0e 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/index.js @@ -1,22 +1,22 @@ import { useContext } from "react"; -import { useNavigate } from "react-router-dom"; +// import { useNavigate } from "react-router-dom"; import TextReuseTable from "./TextReuseTable"; import { Context } from "../../../../../App"; -import { lightSrtFolders, srtFoldersGitHub } from "../../../../../assets/srtFolders"; -import { getMetadataObject } from "../../../../../functions/getMetadataObject"; -import { setPairwiseVizData } from "../../../../../functions/setVisualizationData"; +// import { lightSrtFolders, srtFoldersGitHub } from "../../../../../assets/srtFolders"; +// import { getMetadataObject } from "../../../../../functions/getMetadataObject"; +// import { setPairwiseVizData } from "../../../../../functions/setVisualizationData"; import { setInitialValues } from "../../../../../functions/setInitialValues"; -import { downloadCsvData } from "../../../../../services/TextReuseData"; +// import { downloadCsvData } from "../../../../../services/TextReuseData"; import { loadChartFromUrl } from "../../../../../utility/Helper"; // Text Reuse Data tab in the drawer: const TextReuseData = ({ fullData, query, fullDataLoading }) => { - const navigate = useNavigate(); + // const navigate = useNavigate(); const { setMetaData, setChartData, - setLoadedCsvFile, + // setLoadedCsvFile, dataLoading, setDataLoading, setBooks, @@ -24,8 +24,8 @@ const TextReuseData = ({ fullData, query, fullDataLoading }) => { releaseCode, setIsFileUploaded, setBooksAlignment, - setIsError, - setUrl, + // setIsError, + // setUrl, } = useContext(Context); // load chart in new window - built from the old function that loaded it into the window diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index 70f7755..451e42b 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -4,31 +4,33 @@ import PaginationComponent from "../../Common/PaginationComponent"; import DownloadData from "./DownloadData"; import FilterNavigation from "./FilterNavigation"; import { Context } from "../../../App"; -import { - //getTextReuseBooksTSV, - downloadCsvData, -} from "../../../services/TextReuseData"; -import { useNavigate } from "react-router-dom"; +// import { +// //getTextReuseBooksTSV, +// // downloadCsvData, +// } from "../../../services/TextReuseData"; +// import { useNavigate } from "react-router-dom"; import { Checkbox } from "@mui/material"; import { useState, useEffect } from "react"; -import { lightSrtFolders, srtFoldersGitHub, srtFolders } from "../../../assets/srtFolders"; +import { + // lightSrtFolders, + srtFoldersGitHub, srtFolders } from "../../../assets/srtFolders"; import { buildPairwiseCsvURL, loadChartFromUrl } from "../../../utility/Helper" -import { setInitialValues } from "../../../functions/setInitialValues"; -import { getMetadataObject } from "../../../functions/getMetadataObject"; -import { setPairwiseVizData } from "../../../functions/setVisualizationData"; +// import { setInitialValues } from "../../../functions/setInitialValues"; +// import { getMetadataObject } from "../../../functions/getMetadataObject"; +// import { setPairwiseVizData } from "../../../functions/setVisualizationData"; import { CircularProgress } from "@mui/material"; // import { csv } from "d3"; const NavigationAndStats = () => { const { - setMetaData, - setChartData, - setLoadedCsvFile, - dataLoading, - setDataLoading, - setBooks, + // setMetaData, + // setChartData, + // setLoadedCsvFile, + // dataLoading, + // setDataLoading, + // setBooks, showFilters, totalRecords, rows, @@ -39,14 +41,14 @@ const NavigationAndStats = () => { setCheckedBooks, releaseCode, checkedNotification, - setCheckedNotification, - setIsOpenDrawer, - setBooksAlignment, - setIsFileUploaded, - setIsError, - setUrl, + // setCheckedNotification, + // setIsOpenDrawer, + // setBooksAlignment, + // setIsFileUploaded, + // setIsError, + // setUrl, } = useContext(Context); - const navigate = useNavigate(); + // const navigate = useNavigate(); const [displaySelected, setDisplaySelected] = useState(false); // Default the URLs to null - if null, no download or visualisation will be possible (and we can show a message): From 876e1e1ce1fc509d00b4d86cdfb7d4e738a04a9f Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 30 Jul 2025 15:24:07 +0100 Subject: [PATCH 033/284] fix url routing --- src/utility/Helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 02658c3..1977c67 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -7,7 +7,7 @@ const { GITHUB_BASE_URL, GITHUB_BASE_RAW_URL } = config; const loadChartFromUrl = async (releaseCode, idPair) => { const baseUrl = window.location.origin; - const vizUrl = `${baseUrl}/#/visualise/${releaseCode}/?books=${idPair}`; + const vizUrl = `${baseUrl}/explore/#/visualise/${releaseCode}/?books=${idPair}`; window.open(vizUrl, "_blank"); } From f2531a5cfa3edaab9f148a06a38ad3c24d7dffa4 Mon Sep 17 00:00:00 2001 From: Mathew Barber <46000359+mabarber92@users.noreply.github.com> Date: Wed, 30 Jul 2025 15:38:59 +0100 Subject: [PATCH 034/284] Move pull_request_template.md --- .../pull_request_template.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE/pull_request_template.md diff --git a/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md new file mode 100644 index 0000000..7ef8c93 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md @@ -0,0 +1,23 @@ +# Describe your changes: +* +* + +# This pull requests adresses/closes the following issues: + +# Changes are staged [here]() +(your GitHub Pages site or https://witty-bay-0dafe9a10.4.azurestaticapps.net/) + +# I have checked: +(add x between the brackets to check the box; add checkboxes for checks relevant to your changes): +* [ ] metadata search still works +* [ ] opening pairwise viz from selection of two texts still works +* [ ] opening pairwise viz from text reuse pane still works +* [ ] opening diff from pairwise viz still works +* [ ] opening one-to-many viz from metadata page still works +* [ ] opening diff from one-to-many viz still works +* [ ] ... + +# Reviewer: @... + +# Reviewer should check: +* [ ] ... From 182ec781d3488e7adccdb91744f0a49eefc8a62e Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 09:57:46 +0100 Subject: [PATCH 035/284] added helper for checking pairwise Urls --- src/utility/Helper.js | 64 +++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 62 insertions(+), 2 deletions(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 1977c67..1ccdcc8 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -2,8 +2,67 @@ import { srtFolders, lightSrtFolders} from "../assets/srtFolders" import { config } from "../config"; const { GITHUB_BASE_URL, GITHUB_BASE_RAW_URL } = config; +/** + * Help to try catch to ensure we return false in all cases of invalid urls + * @param {String} url The URL to check + * @returns {Boolean} True if the URL is valid, false otherwise + */ + +const urlExists = async (url) => { + try { + const response = await fetch(url, { method: "HEAD" }); + return response.ok; + } catch (error) { + return false; + } +}; -// Load the pairwise visualisation through a URL - builds the URL and opens it in a new tab +/** + * Check the response for a pairwise csv - fallback to GitHub if not found + * @param {String} releaseCode OpenITI release version code + * @param {String} book1Code code of book 1 + * @param {String} book2Code code of book 2 + * @param {Boolean} full If true, check for full text reuse data + * + * @returns {Object} {"pairwiseUrl": String, "pairwiseLiteUrl": String} + * If the response fails for either URL, it will return null for that field + */ + +const checkPairwiseCsvResponse = async (releaseCode, book1Code, book2Code, full=false) => { + // Set pairwise lite URL as null - in case we do not find it + const pairwiseLiteUrl = null + // If full is true check for full and set full and lite URLs accordingly + if (full) { + const pairwiseFullUrl = await buildPairwiseCsvURL(releaseCode, book1Code, book2Code, false); + const urlRes = await urlExists(pairwiseFullUrl); + if (urlRes.ok) { + const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1Code, book2Code, true); + return { pairwiseUrl: pairwiseFullUrl, pairwiseLiteUrl: pairwiseLiteUrl}; + } + } else { + // Otherwise just check pairwise URL + const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1Code, book2Code, true); + const urlRes = await urlExists(pairwiseLiteUrl); + if (urlRes.ok) { + return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl}; + } + } + // If we have not returned yet, the response failed so we check GitHub (just lite URL) + const githubUrl = srtFoldersGitHub[releaseCode] + `${book1Code}/${book1Code}_${book2Code}.csv`; + const githubRes = await urlExists(githubUrl); + if (githubRes.ok) { + return { pairwiseUrl: null, pairwiseLiteUrl: githubUrl }; + } else { + // If both responses fail, return null for both URLs} + return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl }; + } +}; + + +/** Load the pairwise visualisation through a URL - builds the URL and opens it in a new tab + * @param {String} releaseCode OpenITI release version code + * @param {String} idPair The pair of book IDs to visualise, e.g. "book1_book2" +*/ const loadChartFromUrl = async (releaseCode, idPair) => { const baseUrl = window.location.origin; @@ -366,5 +425,6 @@ export { getVersionIDfromURI, getVersionIDfromURL, buildPairwiseCsvURL, - loadChartFromUrl + loadChartFromUrl, + checkPairwiseCsvResponse }; From 8ded8743f37cd4692291b25801d81d61bdf7003f Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 10:56:27 +0100 Subject: [PATCH 036/284] update buildPairwiseCsvUrl to build GitHub urls - refactor checkPairwiseCsvResponse to use --- src/utility/Helper.js | 61 +++++++++++++++++++++++++++---------------- 1 file changed, 38 insertions(+), 23 deletions(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 1ccdcc8..f920215 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -1,7 +1,8 @@ -import { srtFolders, lightSrtFolders} from "../assets/srtFolders" +import { srtFolders, lightSrtFolders, srtFoldersGitHub} from "../assets/srtFolders" import { config } from "../config"; const { GITHUB_BASE_URL, GITHUB_BASE_RAW_URL } = config; + /** * Help to try catch to ensure we return false in all cases of invalid urls * @param {String} url The URL to check @@ -20,41 +21,42 @@ const urlExists = async (url) => { /** * Check the response for a pairwise csv - fallback to GitHub if not found * @param {String} releaseCode OpenITI release version code - * @param {String} book1Code code of book 1 - * @param {String} book2Code code of book 2 + * @param {String} book1 metadata obj book 1 + * @param {String} book2 metadata obj book 2 * @param {Boolean} full If true, check for full text reuse data * - * @returns {Object} {"pairwiseUrl": String, "pairwiseLiteUrl": String} - * If the response fails for either URL, it will return null for that field + * @returns {Object} {"pairwiseUrl": String, "pairwiseLiteUrl": String, "githubUrl": boolean} + * If the response fails for either URL, it will return null for that field. If it returns a githubUrl, then githubUrl will be true */ -const checkPairwiseCsvResponse = async (releaseCode, book1Code, book2Code, full=false) => { +const checkPairwiseCsvResponse = async (releaseCode, book1, book2, full=false) => { // Set pairwise lite URL as null - in case we do not find it - const pairwiseLiteUrl = null + const pairwiseLiteUrl = null; // If full is true check for full and set full and lite URLs accordingly if (full) { - const pairwiseFullUrl = await buildPairwiseCsvURL(releaseCode, book1Code, book2Code, false); + const pairwiseFullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); const urlRes = await urlExists(pairwiseFullUrl); - if (urlRes.ok) { - const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1Code, book2Code, true); - return { pairwiseUrl: pairwiseFullUrl, pairwiseLiteUrl: pairwiseLiteUrl}; + if (urlRes) { + console.log("Full text reuse data found at: " + pairwiseFullUrl); + const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); + return { pairwiseUrl: pairwiseFullUrl, pairwiseLiteUrl: pairwiseLiteUrl, githubUrl: false}; } } else { // Otherwise just check pairwise URL - const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1Code, book2Code, true); + const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); const urlRes = await urlExists(pairwiseLiteUrl); - if (urlRes.ok) { - return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl}; + if (urlRes) { + return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl, githubUrl: false}; } } // If we have not returned yet, the response failed so we check GitHub (just lite URL) - const githubUrl = srtFoldersGitHub[releaseCode] + `${book1Code}/${book1Code}_${book2Code}.csv`; + const githubUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false, true); const githubRes = await urlExists(githubUrl); - if (githubRes.ok) { - return { pairwiseUrl: null, pairwiseLiteUrl: githubUrl }; + if (githubRes) { + return { pairwiseUrl: null, pairwiseLiteUrl: githubUrl, githubUrl: true }; } else { // If both responses fail, return null for both URLs} - return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl }; + return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl, githubUrl: false }; } }; @@ -97,16 +99,28 @@ const getVersionIDfromURL = (versionURL, includeExt=true) => { * @param {Object} b1Data full metadata for book 1 * @param {Object} b2Data full metadata for book 2 * @param {Boolean} light Download the light or full text reuse data csv + * @param {Boolean} githubUrl If true, use the GitHub URL instead of the KITAB webserver URL * * @returns String (URL of the pairwise CSV file) */ - const buildPairwiseCsvURL = async (releaseCode, b1Data, b2Data, light=false) => { + const buildPairwiseCsvURL = async (releaseCode, b1Data, b2Data, light=false, githubUrl = false) => { // get the IDs (incl. extension) for both books: const b1ID = getVersionIDfromURL(b1Data.release_version.url, true); const b2ID = getVersionIDfromURL(b2Data.release_version.url, true); - const baseURL = light ? lightSrtFolders[releaseCode] : srtFolders[releaseCode]; - // build the URL: - return `${baseURL}/${b1ID}/${b1ID}_${b2ID}.csv`; + + // if githubUrl is true then we use that for the base URL - otherwise base URL is from webserver + if (githubUrl) { + const baseURL = srtFoldersGitHub[releaseCode]; + + // build the URL: + return `${baseURL}/${b1ID}/${b1ID}_${b2ID}.csv`; + } else { + const baseURL = light ? lightSrtFolders[releaseCode] : srtFolders[releaseCode]; + + // build the URL: + return `${baseURL}/${b1ID}/${b1ID}_${b2ID}.csv`; + } + } /** @@ -426,5 +440,6 @@ export { getVersionIDfromURL, buildPairwiseCsvURL, loadChartFromUrl, - checkPairwiseCsvResponse + checkPairwiseCsvResponse, + }; From 7d18d531293d9298874dd19c721bb487db54252c Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 10:57:29 +0100 Subject: [PATCH 037/284] added testing functionality - to test GitHub fallback --- src/utility/Helper.js | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index f920215..06dda26 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -3,6 +3,33 @@ import { config } from "../config"; const { GITHUB_BASE_URL, GITHUB_BASE_RAW_URL } = config; +/** + * Testing functionality to make a server fetch fail + * To use - call enableMockFetch({ failForMatch: srtFolders[releaseCode] }) to fail for a specific release code + */ +let originalFetch = null; + +function enableMockFetch({ failForMatch = "" } = {}) { + if (originalFetch) return; // already mocked + + originalFetch = global.fetch; + + global.fetch = async (url, options) => { + if (failForMatch && url.includes(failForMatch)) { + console.warn(`[MockFetch] Forcing failure for: ${url}`); + throw new Error("Simulated fetch failure"); + } + + // fallback behavior: all URLs fail + if (!failForMatch) { + console.warn(`[MockFetch] Forcing global failure: ${url}`); + throw new Error("Simulated fetch failure"); + } + + return originalFetch(url, options); // fallback to real fetch + }; +} + /** * Help to try catch to ensure we return false in all cases of invalid urls * @param {String} url The URL to check From 09bd70ff5972cce07cbd2f69c0d2c67ff10f9ca1 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 10:58:07 +0100 Subject: [PATCH 038/284] refactor NavigationAndStats to use checkPairwiseCsvResponse --- .../NavigationAndStats/index.js | 74 +++++++++++-------- 1 file changed, 44 insertions(+), 30 deletions(-) diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index 451e42b..15f380f 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -13,8 +13,9 @@ import { Checkbox } from "@mui/material"; import { useState, useEffect } from "react"; import { // lightSrtFolders, - srtFoldersGitHub, srtFolders } from "../../../assets/srtFolders"; -import { buildPairwiseCsvURL, loadChartFromUrl } from "../../../utility/Helper" + // srtFoldersGitHub, + srtFolders } from "../../../assets/srtFolders"; +import { loadChartFromUrl, checkPairwiseCsvResponse} from "../../../utility/Helper" // import { setInitialValues } from "../../../functions/setInitialValues"; // import { getMetadataObject } from "../../../functions/getMetadataObject"; @@ -83,6 +84,7 @@ const NavigationAndStats = () => { useEffect(() => { if (!booksReady) return; const checkSelectedUrls = async () => { + if (checkedBooks.length !== 2) { // If we have not selected two books, then set these pairwise parameters to null setPairwiseLiteUrl(null); @@ -93,8 +95,11 @@ const NavigationAndStats = () => { } else { console.log("Checking selected books for pairwise text reuse data"); - setLoadingReuseData(true); - + + // Activate the loading function - allows us to show a loading spinner after a delay (to avoid flickering) + setLoadingReuseData(true); + + // Use selected books to get necessary data for building and checking URLs const book1 = checkedBooks[0]; const book2 = checkedBooks[1]; const book1Filename = book1?.release_version?.url.split("/").slice(-1)[0]; @@ -102,39 +107,48 @@ const NavigationAndStats = () => { const book2Filename = book2?.release_version?.url.split("/").slice(-1)[0]; const book2Code = book2Filename.split(".").slice(2).join("."); - // Create URLs for the selected books - if URL returns a response, then we set the variable - const LiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); - const fullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); const csvFileName = `${book1Code}_${book2Code}.csv`; setPairwiseFileName(csvFileName); const idPair = `${book1Code}_${book2Code}`; setIdPair(idPair); - // Check the URLs - if they are valid then set the state variables - // If the URL is not valid, then set the state variable to null - try { - const responseFull = await fetch(fullUrl, { method: 'HEAD' }); - if (responseFull.ok) { - setPairwiseLiteUrl(LiteUrl); - setPairwiseUrl(fullUrl) - } else { - setPairwiseLiteUrl(null); - } - } catch (error) { + // Create and check the URLs - func will return null for either if URL does not exist + const urlObj = await checkPairwiseCsvResponse(releaseCode, book1, book2, true); + console.log(urlObj) + setPairwiseUrl(urlObj.pairwiseUrl); + setPairwiseLiteUrl(urlObj.pairwiseLiteUrl); + setGithubUrl(urlObj.githubUrl); + + // // Create URLs for the selected books - if URL returns a response, then we set the variable + // const LiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); + // const fullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); + + + // // Check the URLs - if they are valid then set the state variables + // // If the URL is not valid, then set the state variable to null + // try { + // const responseFull = await fetch(fullUrl, { method: 'HEAD' }); + // if (responseFull.ok) { + // setPairwiseLiteUrl(LiteUrl); + // setPairwiseUrl(fullUrl) + // } else { + // setPairwiseLiteUrl(null); + // } + // } catch (error) { - const srtFolder = srtFoldersGitHub[releaseCode]; - const csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; - console.log(`Fetching data from Github with URL:${csvUrl}`); - const responseGitHub = await fetch(csvUrl, { method: 'HEAD' }); - if (responseGitHub.ok) { - setPairwiseLiteUrl(csvUrl); - setGithubUrl(true); - } else { - setPairwiseLiteUrl(null); - console.log("No URL found for pairwise Lite data"); - } - }; + // const srtFolder = srtFoldersGitHub[releaseCode]; + // const csvUrl = `${srtFolder}/${book1Code}/${csvFileName}`; + // console.log(`Fetching data from Github with URL:${csvUrl}`); + // const responseGitHub = await fetch(csvUrl, { method: 'HEAD' }); + // if (responseGitHub.ok) { + // setPairwiseLiteUrl(csvUrl); + // setGithubUrl(true); + // } else { + // setPairwiseLiteUrl(null); + // console.log("No URL found for pairwise Lite data"); + // } + // }; // try { // const responseFull = await fetch(fullUrl, { method: 'HEAD' }); // if (responseFull.ok) { From a7961982f909880604a4d2be56693192c470c587 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 10:58:40 +0100 Subject: [PATCH 039/284] ensure we export enableMockFetch --- src/utility/Helper.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 06dda26..3e12867 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -468,5 +468,5 @@ export { buildPairwiseCsvURL, loadChartFromUrl, checkPairwiseCsvResponse, - + enableMockFetch }; From 130e5008c3caa20bdc5e82fd8f4d818ccc91db50 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 12:11:47 +0100 Subject: [PATCH 040/284] refactor Visualisation/index.jsx to use checkPairwiseCsvResponse handle erroronous metadata resp --- src/components/Visualisation/index.jsx | 143 +++++++++++++++++-------- 1 file changed, 100 insertions(+), 43 deletions(-) diff --git a/src/components/Visualisation/index.jsx b/src/components/Visualisation/index.jsx index 303410f..6faf230 100644 --- a/src/components/Visualisation/index.jsx +++ b/src/components/Visualisation/index.jsx @@ -13,9 +13,22 @@ import { setInitialValues } from "../../functions/setInitialValues"; import { getVersionMeta } from "../../functions/getVersionMeta"; import { setPairwiseVizData, setMultiVizData } from "../../functions/setVisualizationData"; import { downloadCsvData, getOneBookReuseStats, getOneBookMsData } from "../../services/TextReuseData"; -import { lightSrtFolders, srtFoldersGitHub } from "../../assets/srtFolders"; +// import { lightSrtFolders, srtFoldersGitHub } from "../../assets/srtFolders"; import { Context } from "../../App"; - +import { checkPairwiseCsvResponse } from "../../utility/Helper"; + +// Check the metadata response from a URL - return an array of failed books +const checkVersionMeta = (versionMeta, bookNames) => { + const failedBooks = []; + for (const [key, value] of Object.entries(versionMeta)) { + if (value instanceof Error || value?.message?.includes("Unexpected token")) { + const failedIndex = key.replace("book", "") - 1; + let failedBook = bookNames[failedIndex]; + failedBooks.push(failedBook); + } + } + return failedBooks; +} // construct the text reuse csv filename based on metadata of both books: const buildCsvFilename = (book1Meta, book2Meta) => { @@ -112,7 +125,7 @@ const VisualisationPage = () => { setBooksAlignment, setMetaData, setChartData, - loadedCsvFile, + // loadedCsvFile, setLoadedCsvFile, releaseCode, chartData, @@ -259,8 +272,14 @@ const VisualisationPage = () => { // download the version metadata of all books in the URL booksParam: const versionMeta = await getVersionMeta(releaseCode, book_names); + // check if there are errors in the returned metadata + const failedBooks = checkVersionMeta(versionMeta, book_names); + if (failedBooks.length > 0) { + setDataLoading({ ...dataLoading, uploading: false }); + setIsError(true); + setIsLoading(false); - if (book_names.length === 1 || book_names[1] === "all") { + } else if (book_names.length === 1 || book_names[1] === "all") { try { // ONE TO ALL VISUALISATION setIsPairwiseViz(false); @@ -300,51 +319,89 @@ const VisualisationPage = () => { setIsLoading(false); } } else if (book_names.length === 2) { - try { + // try { // PAIRWISE VISUALISATION setIsPairwiseViz(true); const book1 = versionMeta.book1; const book2 = versionMeta.book2; - // first, try to download the text reuse data from the KITAB web server: const csvFileName = buildCsvFilename(book1, book2); - let passimFolder = lightSrtFolders[releaseCode]; - let url = `${passimFolder}/${book_names[0]}/${csvFileName}`; + + // Use helper function to build and check csv URL + const pairwiseCsvResponse = await checkPairwiseCsvResponse( + releaseCode, book1, book2, false) + + if (pairwiseCsvResponse.pairwiseLiteUrl !== null) { + // If the pairwise URL is valid, proceed with loading the data + const CSVFile = await downloadCsvData(pairwiseCsvResponse.pairwiseLiteUrl); + // remove the loadedCsvFile blob from memory (context): + setLoadedCsvFile(null); + + setPairwiseVizData({ + book1, + book2, + CSVFile, + dataLoading, + setDataLoading, + setMetaData, + releaseCode, + getMetadataObject, + setChartData, + setIsError, + setIsFileUploaded, + navigate, + csvFileName, + setUrl, + }); + + setIsLoading(false); - // download the pairwise passim data if it was not downloaded/uploaded yet: - let CSVFile = loadedCsvFile || (await downloadCsvData(url)); - - // if this fails: try to download it from GitHub: - if (CSVFile instanceof Error) { - passimFolder = srtFoldersGitHub[releaseCode]; - url = `${passimFolder}/${book_names[0]}/${csvFileName}`; - CSVFile = await downloadCsvData(url); - } - // remove the loadedCsvFile blob from memory (context): - setLoadedCsvFile(null); - - setPairwiseVizData({ - book1, - book2, - CSVFile, - dataLoading, - setDataLoading, - setMetaData, - releaseCode, - getMetadataObject, - setChartData, - setIsError, - setIsFileUploaded, - navigate, - csvFileName, - setUrl, - }); - - setIsLoading(false); - } catch (err) { - setDataLoading({ ...dataLoading, uploading: false }); - setIsError(true); - setIsLoading(false); - } + } else { + // If the pairwise URL is not found then set error state + setDataLoading({ ...dataLoading, uploading: false }); + setIsError(true); + setIsLoading(false); + } + + // // first, try to download the text reuse data from the KITAB web server: + // const csvFileName = buildCsvFilename(book1, book2); + // let passimFolder = lightSrtFolders[releaseCode]; + // let url = `${passimFolder}/${book_names[0]}/${csvFileName}`; + + // // download the pairwise passim data if it was not downloaded/uploaded yet: + // let CSVFile = loadedCsvFile || (await downloadCsvData(url)); + + // // if this fails: try to download it from GitHub: + // if (CSVFile instanceof Error) { + // passimFolder = srtFoldersGitHub[releaseCode]; + // url = `${passimFolder}/${book_names[0]}/${csvFileName}`; + // CSVFile = await downloadCsvData(url); + // } + // // remove the loadedCsvFile blob from memory (context): + // setLoadedCsvFile(null); + + // setPairwiseVizData({ + // book1, + // book2, + // CSVFile, + // dataLoading, + // setDataLoading, + // setMetaData, + // releaseCode, + // getMetadataObject, + // setChartData, + // setIsError, + // setIsFileUploaded, + // navigate, + // csvFileName, + // setUrl, + // }); + + // setIsLoading(false); + // } catch (err) { + // setDataLoading({ ...dataLoading, uploading: false }); + // setIsError(true); + // setIsLoading(false); + // } } else { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); From cdb66de71ca906f78217de57482028981f91b4b3 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 12:42:19 +0100 Subject: [PATCH 041/284] updated error messages to reflect the type of error --- src/App.js | 3 +++ src/components/Visualisation/index.jsx | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/src/App.js b/src/App.js index 3e49895..c1c355c 100644 --- a/src/App.js +++ b/src/App.js @@ -171,6 +171,7 @@ function App() { const [selectedLine, setSelectedLine] = useState({}); const [showWikiEdDiff, setWikiEdDiff] = useState(false); const [isError, setIsError] = useState(false); + const [errorType, setErrorType] = useState("We may not have text reuse data for these texts, or there might be another problem. Error Type: Unknown") const [showOptions, setShowOptions] = useState(false); const [showDownloadOptions, setShowDownloadOptions] = useState(false); const [includeURL, setIncludeURL] = useState(true); @@ -355,6 +356,8 @@ function App() { setFocusedDataIndex, isError, setIsError, + errorType, + setErrorType, showOptions, setShowOptions, showDownloadOptions, diff --git a/src/components/Visualisation/index.jsx b/src/components/Visualisation/index.jsx index 6faf230..604dd95 100644 --- a/src/components/Visualisation/index.jsx +++ b/src/components/Visualisation/index.jsx @@ -17,6 +17,9 @@ import { downloadCsvData, getOneBookReuseStats, getOneBookMsData } from "../../s import { Context } from "../../App"; import { checkPairwiseCsvResponse } from "../../utility/Helper"; + + + // Check the metadata response from a URL - return an array of failed books const checkVersionMeta = (versionMeta, bookNames) => { const failedBooks = []; @@ -133,6 +136,8 @@ const VisualisationPage = () => { setIsFileUploaded, isError, setIsError, + errorType, + setErrorType, setUrl, defaultReleaseCode, setMainVersionCode, @@ -277,6 +282,7 @@ const VisualisationPage = () => { if (failedBooks.length > 0) { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); + setErrorType('The book ids in your URL do not match any books in the KITAB corpus. Please check your URL and try again. Failed ids: ' + failedBooks.join(", ")); setIsLoading(false); } else if (book_names.length === 1 || book_names[1] === "all") { @@ -316,6 +322,7 @@ const VisualisationPage = () => { } catch (err) { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); + setErrorType('There was an error loading the data for the book: ' + book_names[0] + '. Please check your URL and try again.'); setIsLoading(false); } } else if (book_names.length === 2) { @@ -359,6 +366,7 @@ const VisualisationPage = () => { // If the pairwise URL is not found then set error state setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); + setErrorType('The pairwise text reuse data for the book ids: ' + book_names.join(", ") + ' could not be found. There may not be text reuse data for this pair.'); setIsLoading(false); } @@ -405,6 +413,7 @@ const VisualisationPage = () => { } else { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); + setErrorType('You have not supplied a valid URL.') setIsLoading(false); } }; @@ -447,12 +456,11 @@ const VisualisationPage = () => { > No data found to visualize. - We may not have text reuse data for these texts, or there might be - another problem. + {errorType} - + {/* [Please make sure the file name is correct] - + */} ) : ( From 98fe99c58b22f5afd49cf3a0b0eef0c262c004fd Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 12:49:23 +0100 Subject: [PATCH 042/284] clean up error messaging --- src/components/Visualisation/index.jsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Visualisation/index.jsx b/src/components/Visualisation/index.jsx index 604dd95..f24c561 100644 --- a/src/components/Visualisation/index.jsx +++ b/src/components/Visualisation/index.jsx @@ -282,7 +282,7 @@ const VisualisationPage = () => { if (failedBooks.length > 0) { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); - setErrorType('The book ids in your URL do not match any books in the KITAB corpus. Please check your URL and try again. Failed ids: ' + failedBooks.join(", ")); + setErrorType('Some book Ids in your pairwise URL do not match books in the KITAB corpus. Please check your URL and try again. Failed Ids: ' + failedBooks.join(", ")); setIsLoading(false); } else if (book_names.length === 1 || book_names[1] === "all") { From 10b53ce1646c9296c8b6212c300ab2aaee17e69c Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Thu, 31 Jul 2025 12:54:52 +0100 Subject: [PATCH 043/284] tidy up error message --- src/App.js | 2 +- src/components/Visualisation/index.jsx | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/App.js b/src/App.js index c1c355c..99fec64 100644 --- a/src/App.js +++ b/src/App.js @@ -171,7 +171,7 @@ function App() { const [selectedLine, setSelectedLine] = useState({}); const [showWikiEdDiff, setWikiEdDiff] = useState(false); const [isError, setIsError] = useState(false); - const [errorType, setErrorType] = useState("We may not have text reuse data for these texts, or there might be another problem. Error Type: Unknown") + const [errorType, setErrorType] = useState(["We may not have text reuse data for these texts, or there might be another problem.", "Error Type: Unknown"]) const [showOptions, setShowOptions] = useState(false); const [showDownloadOptions, setShowDownloadOptions] = useState(false); const [includeURL, setIncludeURL] = useState(true); diff --git a/src/components/Visualisation/index.jsx b/src/components/Visualisation/index.jsx index f24c561..e125604 100644 --- a/src/components/Visualisation/index.jsx +++ b/src/components/Visualisation/index.jsx @@ -282,7 +282,7 @@ const VisualisationPage = () => { if (failedBooks.length > 0) { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); - setErrorType('Some book Ids in your pairwise URL do not match books in the KITAB corpus. Please check your URL and try again. Failed Ids: ' + failedBooks.join(", ")); + setErrorType(["Some book Ids in your pairwise URL do not match books in the KITAB corpus. Please check your URL and try again.", "Failed Ids: " + failedBooks.join(", ")]); setIsLoading(false); } else if (book_names.length === 1 || book_names[1] === "all") { @@ -322,7 +322,7 @@ const VisualisationPage = () => { } catch (err) { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); - setErrorType('There was an error loading the data for the book: ' + book_names[0] + '. Please check your URL and try again.'); + setErrorType(["There was an error loading the data for the book: " + book_names[0] + ".", "Please check your URL and try again."]); setIsLoading(false); } } else if (book_names.length === 2) { @@ -366,7 +366,7 @@ const VisualisationPage = () => { // If the pairwise URL is not found then set error state setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); - setErrorType('The pairwise text reuse data for the book ids: ' + book_names.join(", ") + ' could not be found. There may not be text reuse data for this pair.'); + setErrorType(["The pairwise text reuse data for the book ids: " + book_names.join(", ") + " could not be found.", "There may not be text reuse data for this pair."]); setIsLoading(false); } @@ -413,7 +413,7 @@ const VisualisationPage = () => { } else { setDataLoading({ ...dataLoading, uploading: false }); setIsError(true); - setErrorType('You have not supplied a valid URL.') + setErrorType(['You have not supplied a valid URL.', '']) setIsLoading(false); } }; @@ -456,11 +456,11 @@ const VisualisationPage = () => { > No data found to visualize. - {errorType} + {errorType[0]} + + + {errorType[1]} - {/* - [Please make sure the file name is correct] - */} ) : ( From e745a4ac6b7557b04f51dd697769e3cd12360ce5 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 31 Jul 2025 13:57:58 +0100 Subject: [PATCH 044/284] include metadata in visualisation outputs --- src/App.js | 72 ++++++--- src/components/Visualisation/Chart/index.jsx | 145 +++++++++++++++--- .../Visualisation/MultiChart/BottomBar.js | 29 ++-- .../Visualisation/MultiChart/ScatterPlot.js | 37 ++++- .../Visualisation/MultiChart/SideBar.js | 17 +- .../Visualisation/MultiChart/index.jsx | 19 ++- .../VisualizationHeader/DownloadPanel.js | 130 +++------------- .../IncludeMetaDropdown.jsx | 106 +++++++++++++ .../VisualizationHeader/OutputDimensions.jsx | 82 ++++++++++ src/components/Visualisation/index.jsx | 40 +++++ src/utility/Helper.js | 34 +++- 11 files changed, 529 insertions(+), 182 deletions(-) create mode 100644 src/components/Visualisation/SectionHeader/VisualizationHeader/IncludeMetaDropdown.jsx create mode 100644 src/components/Visualisation/SectionHeader/VisualizationHeader/OutputDimensions.jsx diff --git a/src/App.js b/src/App.js index 3e49895..5da0abe 100644 --- a/src/App.js +++ b/src/App.js @@ -137,8 +137,11 @@ function App() { const [isFileUploaded, setIsFileUploaded] = useState(false); const [showTickSizeInput, setShowTickSizeInput] = useState(false); const [tickFontSize, setTickFontSize] = useState(12); + const [axisLabelFontSize, setAxisLabelFontSize] = useState(12); const [outputImageWidth, setOutputImageWidth] = useState(120); const [dpi, setDpi] = useState(300); + const [includeMetaInDownload, setIncludeMetaInDownload] = useState("no"); + const [metaPositionInDownload, setMetaPositionInDownload] = useState("left"); const [isFlipped, setIsFlipped] = useState(false); const [flipTimeLoading, setFlipTimeLoading] = useState(false); const focusMilestone1 = useRef(); @@ -173,9 +176,11 @@ function App() { const [isError, setIsError] = useState(false); const [showOptions, setShowOptions] = useState(false); const [showDownloadOptions, setShowDownloadOptions] = useState(false); + const [url, setUrl] = useState(""); const [includeURL, setIncludeURL] = useState(true); + const [defaultMargins, setDefaultMargins] = useState({ top: 40, right: 20, bottom: 20, left: 60 }); + const [visMargins, setVisMargins] = useState({ top: 40, right: 20, bottom: 20, left: 60 }); const [textAvailable, setTextAvailable] = useState(true); - const [url, setUrl] = useState(""); const [highlightMode, setHighlightMode] = useState("diff"); const [nSharedChars, setNSharedChars] = useState(50); const [nRefineChars, setNRefineChars] = useState(3); @@ -234,36 +239,47 @@ function App() { setIsOpenDrawer(true); }; - const downloadPNG = (downloadFileName, svgId, includeURL=false) => { + const downloadPNG = (downloadFileName, svgId) => { //const downloadFileName = `${metaData?.book1?.versionCode}_${metaData?.book2?.versionCode}.png`; const svg = document.getElementById(svgId); const newSvg = svg.cloneNode(true); - if (includeURL) { - // create a text element in the svg that shows the URL: - var textElement = document.createElementNS( - "http://www.w3.org/2000/svg", - "text" - ); - textElement.setAttribute( - "x", - svg.clientWidth - (window.location.origin + url).length * 7.5 - ); // X-coordinate - textElement.setAttribute("y", 20); // Y-coordinate - textElement.setAttribute("font-size", "14px"); // Font size - textElement.setAttribute("fill", "black"); // Fill color - // Create a text node with the URL - var textNode = document.createTextNode(window.location.origin + url); - // Append the text node to the element - textElement.appendChild(textNode); - // Append the element to the SVG - newSvg.appendChild(textElement); + let scale = 3; // default scale: 300 % + + if (outputImageWidth) { // context variable! + const inchPerMM = 1 / 25.4; + const svgPixelWidth = svg.clientWidth; + const outputWidthInInches = outputImageWidth * inchPerMM; + const targetPixelWidth = outputWidthInInches * (dpi || 300); // dpi is also a context variable; use 300 if dpi is undefined + scale = targetPixelWidth / svgPixelWidth / window.devicePixelRatio; + console.log("window.devicePixelRatio: "+window.devicePixelRatio) + + /* + NB: the save-svg-as-png library gets the width of the svg in one of these ways: + * - svg.viewBox.baseVal["width"] : returns 0 in our case + * - newSvg.getAttribute("width") : returns same value as svg.clientWidth + * - svg.getBoundingClientRect()["width"] : returns same value as svg.clientWidth + * - window.getComputedStyle(svg).getPropertyValue("width") : returns same value as svg.clientWidth + + console.log('svg.viewBox.baseVal["width"]: '+svg.viewBox.baseVal["width"]); + console.log('newSvg.getAttribute("width"): '+newSvg.getAttribute("width")); + console.log('svg.getBoundingClientRect()["width"]: '+svg.getBoundingClientRect()["width"]); + console.log('window.getComputedStyle(svg).getPropertyValue("width") '+window.getComputedStyle(svg).getPropertyValue("width")); + + + console.log(`requested image width: ${outputImageWidth} mm`); + console.log(`requested dpi: ${dpi}`); + console.log(`svg width: ${svgPixelWidth}`); + console.log(`svg bounding box width: ${svg.getBBox().width}`); + console.log(`Output width: ${outputWidthInInches} inch`); + console.log(`Output width: ${targetPixelWidth} pixels`); + console.log(`Scale: ${scale}`); + */ } // save the png: saveSvgAsPng.saveSvgAsPng(newSvg, downloadFileName, { - // TODO: set the scale based on the output size and dpi values: - scale: 3, // 300 % + scale: scale, backgroundColor: "white", }); }; @@ -326,10 +342,16 @@ function App() { setShowTickSizeInput, tickFontSize, setTickFontSize, + axisLabelFontSize, + setAxisLabelFontSize, outputImageWidth, setOutputImageWidth, dpi, setDpi, + includeMetaInDownload, + setIncludeMetaInDownload, + metaPositionInDownload, + setMetaPositionInDownload, isFlipped, setIsFlipped, flipTimeLoading, @@ -365,6 +387,10 @@ function App() { setIncludeURL, url, setUrl, + visMargins, + setVisMargins, + defaultMargins, + setDefaultMargins, highlightMode, setHighlightMode, nSharedChars, diff --git a/src/components/Visualisation/Chart/index.jsx b/src/components/Visualisation/Chart/index.jsx index 9cc584d..553e330 100644 --- a/src/components/Visualisation/Chart/index.jsx +++ b/src/components/Visualisation/Chart/index.jsx @@ -7,7 +7,7 @@ import VisualizationHeader from "../SectionHeader/VisualizationHeader"; import { Context } from "../../../App"; import { extractAlignment } from "../../../functions/alignmentFunctions"; import { getMilestoneText } from "../../../functions/getMilestoneText"; -import { getHighestValueInArrayOfObjects } from "../../../utility/Helper"; +import { getHighestValueInArrayOfObjects, wrapText } from "../../../utility/Helper"; import * as d3 from "d3"; @@ -31,7 +31,15 @@ const Visual = (props) => { downloadedTexts, setDownloadedTexts, releaseCode, - setTextAvailable + setTextAvailable, + visMargins, + includeURL, + includeMetaInDownload, + metaPositionInDownload, + url, + axisLabelFontSize, + tickFontSize, + showDownloadOptions, } = useContext(Context); const [toggle, setToggle] = useState(false); @@ -54,7 +62,7 @@ const Visual = (props) => { }, }); - console.log(chartData); + //console.log(chartData); var clipPathId = "clipDrawing"; var clipPath = "url('#clipDrawing')"; @@ -66,7 +74,8 @@ const Visual = (props) => { clipRect, x0ScaleNode, x1ScaleNode, - outerHeight = 530, + startOuterHeight = 530, + outerHeight, outerWidth, innerHeight, innerWidth, @@ -83,18 +92,9 @@ const Visual = (props) => { hoverStrokeWidth = 3, selectedLine = null; - var margin = { - top: 40, - right: 20, - bottom: 20, - left: 60, - }, - padding = { - top: 40, - right: 0, - bottom: 40, - left: 40, - }; + // set the dimensions and margins of the graph + //var margin = { top: 40, right: 20, bottom: 20, left: 60 }; + var padding = { top: 40, right: 0, bottom: 40, left: 40 }; var book1Bars, connections, book2Bars, brushG; var xScale, xScaleIdentity, x0Axis, x1Axis; @@ -120,7 +120,7 @@ const Visual = (props) => { lastMsSecond = getHighestValueInArrayOfObjects(chartData.dataSets, "seq2"); showBookEnd2 = false; } - console.log(`showBookEnd1: ${showBookEnd1}, showBookEnd2: ${showBookEnd2}`); + //console.log(`showBookEnd1: ${showBookEnd1}, showBookEnd2: ${showBookEnd2}`); var maxValues = { @@ -187,8 +187,9 @@ const Visual = (props) => { function setLayout() { outerWidth = chartBox.offsetWidth; - innerWidth = outerWidth - margin.left - margin.right; - innerHeight = outerHeight - margin.top - margin.bottom; + innerWidth = outerWidth - visMargins.left - visMargins.right; + outerHeight = startOuterHeight + visMargins.top + visMargins.bottom; + innerHeight = outerHeight - visMargins.top - visMargins.bottom; width = innerWidth - padding.left - padding.right; height = innerHeight - 20; @@ -196,15 +197,15 @@ const Visual = (props) => { drawingG.attr( "transform", - "translate(" + margin.left + "," + margin.top + ")" + "translate(" + visMargins.left + "," + visMargins.top + ")" ); brushG.attr( "transform", - "translate(" + margin.left + "," + margin.top + ")" + "translate(" + visMargins.left + "," + visMargins.top + ")" ); marksG.attr( "transform", - "translate(" + margin.left + "," + margin.top + ")" + "translate(" + visMargins.left + "," + visMargins.top + ")" ); book2Bars.attr("transform", "translate(0,300)"); @@ -233,8 +234,102 @@ const Visual = (props) => { { x: barMaxHeight, y: 0, yScale: y0Scale, visible: false }, { x: barMaxHeight, y: barMaxHeight * 2, yScale: y0Scale, visible: false }, ]; + + if (showDownloadOptions){ + if (includeURL) { + svgD3.append("text") + .attr("x", visMargins.left) + .attr("y", tickFontSize) // replace with axisLabelFontSize + .attr("text-anchor", "left") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .style("text-decoration", "underline") + .text(window.location.origin + url); + } + if (includeMetaInDownload !== "no") { + // get the metadata to be displayed for each book: + const b1 = isFlipped ? metaData?.book2 : metaData?.book1; + const b2 = isFlipped ? metaData?.book1 : metaData?.book2; + let textContentb1; + let textContentb2; + switch (includeMetaInDownload) { + case "author": + textContentb1 = b1?.bookAuthor; + textContentb2 = b2?.bookAuthor; + break; + case "title": + textContentb1 = b1?.bookTitle?.label; + textContentb2 = b2?.bookTitle?.label; + break; + case "author+title": + textContentb1 = `${b1?.bookAuthor}, ${b1?.bookTitle?.label}`; + textContentb2 = `${b2?.bookAuthor}, ${b2?.bookTitle?.label}`; + break; + case "versionCode": + textContentb1 = b1?.versionCode; + textContentb2 = b2?.versionCode; + break; + default: + console.log("unexpected value: "+includeMetaInDownload); + } + if (metaPositionInDownload === "left") { + // TODO: wrap the label: + const avgCharWidth = Math.max(tickFontSize, axisLabelFontSize) * 0.55; + const maxChars = Math.floor(0.4*innerHeight/avgCharWidth); + console.log("Max. "+maxChars+" per line!"); + const labelLinesb1 = wrapText(textContentb1, maxChars); + console.log(labelLinesb1); + // Add b1 metadata at the top of the Y axis: + let space = axisLabelFontSize; + //textContentb1.split(", ").forEach((textContent) => { + labelLinesb1.forEach((textContent) => { + svgD3.append("text") + .attr("transform", "rotate(-90)") + //.attr("x", (-innerHeight)/3 - visMargins.top) + .attr("x", -200) + .attr("y", space) + .attr("text-anchor", "start") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .text(textContent); + space += 2*axisLabelFontSize; + }) + // Add b2 metadata at the bottom of the Y axis: + space = axisLabelFontSize; + //textContentb1.split(", ").forEach((textContent) => { + const labelLinesb2 = wrapText(textContentb2, maxChars); + console.log(labelLinesb2); + labelLinesb2.forEach((textContent) => { + svgD3.append("text") + .attr("transform", "rotate(-90)") + //.attr("x", -innerHeight + visMargins.top) + .attr("x", -innerHeight + visMargins.top / 2) + .attr("y", space) + .attr("text-anchor", "start") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .text(textContent); + space += 2*axisLabelFontSize; + }) + } else { + // Add b1 metadata at the top: + svgD3.append("text") + .attr("x", visMargins.left) + .attr("y", 2*Math.max(tickFontSize, axisLabelFontSize)) // replace with axisLabelFontSize + .attr("text-anchor", "left") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .text(textContentb1); + // add b2 metadata at the bottom: + svgD3.append("text") + .attr("x", visMargins.left) + .attr("y", innerHeight + 2*Math.max(tickFontSize, axisLabelFontSize)) // replace with axisLabelFontSize + .attr("text-anchor", "left") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .text(textContentb2); + } + + } + } } + function drawChart() { // - Hover Lines :: drawingG @@ -891,6 +986,12 @@ const Visual = (props) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [isFlipped]); + // redraw the chart when the margins change + useEffect(() => { + normalChart(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [visMargins, axisLabelFontSize, tickFontSize, showDownloadOptions]); + return ( <> { const ref = useRef(); + const { tickFontSize } = useContext(Context); let height = props.height - props.margin.top - props.margin.bottom; + let width = props.width + 2*tickFontSize; // initialize the svg on mount: useEffect(() => { @@ -28,7 +30,7 @@ const BottomBar = (props) => { // build X axis scale: let xScale = d3.scaleLinear() .domain([0, props.bookStats.length+2]) // each book will have its own space on the X axis - .range([ 0, props.width ]); + .range([ 0, width ]); // build Y axis scale: let maxTotalChMatch = d3.max(props.bookStats, d => d.ch_match); let yScale = d3.scaleLinear() @@ -58,7 +60,7 @@ const BottomBar = (props) => { .call(d3.axisBottom(xScale) .tickValues(tickIndices) .tickFormat((val,i) => { return tickLabelDict[val]}) - .tickPadding(0) + .tickPadding(2) ); // Add X axis label: see https://stackoverflow.com/a/11194968/4045481 let xLabelText = "Books for which passim detected text reuse with "+props.mainBookURI+" (chronologically arranged)"; @@ -66,8 +68,10 @@ const BottomBar = (props) => { barSvg.append("text") .attr("class", "xLabel") .attr("text-anchor", "end") - .attr("x", props.width) - .attr("y", height + 25) + .attr("x", width) + //.attr("y", height + 25) + .attr("y", height + 20 + tickFontSize) + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize .text(xLabelText); // Add Y axis: @@ -84,16 +88,21 @@ const BottomBar = (props) => { barSvg.append("text") .attr("class", "yLabel") .attr("text-anchor", "end") - .attr("y", 6) + .attr("y", tickFontSize) // replace with axisLabelFontSize .attr("dy", "-4em") .attr("transform", "rotate(-90)") - .text("Characters reused"); + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .text("Characters reused"); + + // update the tick font size + barSvg + .selectAll(`.tick text`).style("font-size", `${tickFontSize}px`); let barPlot = barSvg.append('g') .attr("class", "bottom-bar-plot"); // add/update data: - let barWidth = Math.min(3, props.width/props.bookStats.length); + let barWidth = Math.min(3, width/props.bookStats.length); barPlot .selectAll("rect") .data(props.bookStats, d => d) @@ -162,7 +171,7 @@ const BottomBar = (props) => { ); diff --git a/src/components/Visualisation/MultiChart/ScatterPlot.js b/src/components/Visualisation/MultiChart/ScatterPlot.js index 0ec8ca7..d0794bd 100644 --- a/src/components/Visualisation/MultiChart/ScatterPlot.js +++ b/src/components/Visualisation/MultiChart/ScatterPlot.js @@ -26,9 +26,16 @@ const ScatterPlot = (props) => { setDisplayMs, colors, colorScale, - setColorScale + setColorScale, + tickFontSize, + showDownloadOptions, + includeURL, + url + //axisLabelFontSize } = useContext(Context); + const width = props.width + 2*tickFontSize; + // create the color scale, based on the ch_match values: useEffect(() => { @@ -208,7 +215,7 @@ const ScatterPlot = (props) => { // create X and Y scaling functions: let xScale = d3.scaleLinear() .domain([0, props.bookStats.length+2]) // each book will have its own space on the X axis - .range([ 0, props.width ]); + .range([ 0, width ]); // props.width ]); let yScale = d3.scaleLinear() .domain([props.mainBookMilestones+1,0]) // flip the axis! .range([props.height, 0]); @@ -220,6 +227,7 @@ const ScatterPlot = (props) => { .append("g") .attr("class", "xAxis") .attr("transform", "translate(0," + props.height + ")") + .style("font-size", `${tickFontSize}px`) .call(d3.axisBottom(xScale) .tickFormat((d) => '') // remove tick marks in D3 v4: see https://stackoverflow.com/a/12994876/4045481 .tickSize(0) @@ -240,8 +248,11 @@ const ScatterPlot = (props) => { scatterPlot .append("g") .attr("class", "yAxis") + .style("font-size", `${tickFontSize}px`) .call(d3.axisLeft(yScale) .tickSize(2) + .tickPadding(5) + // remove zero tick: .tickFormat((val,i) => { return val===0 ? null : val}) ); @@ -254,11 +265,27 @@ const ScatterPlot = (props) => { .append("text") .attr("class", "yLabel") .attr("text-anchor", "end") - .attr("y", 6) + .attr("y", tickFontSize) // replace with axisLabelFontSize .attr("dy", "-4em") .attr("transform", "rotate(-90)") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize .text("Milestones in "+props.mainBookURI); + if (showDownloadOptions){ + if (includeURL) { + scatterPlot.append("text") + .attr("x", props.left) + .attr("y", -tickFontSize) // replace with axisLabelFontSize + .attr("text-anchor", "left") + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize + .style("text-decoration", "underline") + .text(window.location.origin + url); + } + } + + // update the tick font size + scatterPlot + .selectAll(`.tick text`).style("font-size", `${tickFontSize}px`); // add/update data: scatterPlot @@ -332,9 +359,9 @@ const ScatterPlot = (props) => { >
diff --git a/src/components/Visualisation/MultiChart/SideBar.js b/src/components/Visualisation/MultiChart/SideBar.js index da695df..4066fd1 100644 --- a/src/components/Visualisation/MultiChart/SideBar.js +++ b/src/components/Visualisation/MultiChart/SideBar.js @@ -1,12 +1,14 @@ -import { useEffect, useRef } from "react"; +import { useEffect, useRef, useContext } from "react"; import * as d3 from "d3"; import "../../../index.css"; import { calculateTooltipPos } from "../../../utility/Helper"; +import { Context } from "../../../App"; const SideBar = (props) => { const ref = useRef(); + const { tickFontSize } = useContext(Context); // add axisLabelFontSize // initialize the svg on mount: useEffect(() => { @@ -45,15 +47,17 @@ const SideBar = (props) => { .tickFormat(d3.format('.2s')) .ticks(4) .tickSize(2) + .tickPadding(5) ); // Add X axis label: see https://stackoverflow.com/a/11194968/4045481 barSvg.selectAll(".xLabel").remove(); barSvg.append("text") .attr("class", "xLabel") - .attr("text-anchor", "end") - .attr("x", 150) + .attr("text-anchor", "middle") + .attr("x", 170-tickFontSize) // replace with axisLabelFontSize .attr("dx", "-4em") /*.attr("y", height + 25)*/ + .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize .text("Characters reused"); // Add Y axis: @@ -65,6 +69,10 @@ const SideBar = (props) => { .tickSize(0) ); + // update the tick font size + barSvg + .selectAll(`.tick text`).style("font-size", `${tickFontSize}px`); + let barPlot = barSvg.append('g') .attr("class", "side-bar-plot"); @@ -121,7 +129,8 @@ const SideBar = (props) => { ) ) - }, [props.msStats, props.height, props.mainBookMilestones, props.width]); + }, [props.msStats, props.height, props.mainBookMilestones, props.width, + tickFontSize]); // axisLabelFontSize return ( { console.log("RENDERING MULTI CHART"); - // set the dimensions and margins of the graph - - var margin = { top: 10, right: 30, bottom: 20, left: 60 }; - var width = 1000 - margin.left - margin.right; - var height = 600 - margin.top - margin.bottom; - const { metaData, chartData, @@ -27,6 +21,7 @@ const MultiVisual = (props) => { setYScale, colorScale, selfReuseOnly, + visMargins, //setChartData, /*Books, setBooks, @@ -45,6 +40,10 @@ const MultiVisual = (props) => { //setColors } = useContext(Context); + // TODO: let user set width/height (with resizable component or input field?) + var width = 1000 - visMargins.left - visMargins.right; + var height = 600 - visMargins.top - visMargins.bottom; + const book1 = metaData.book1; const mainBookURI = book1.bookTitle.path; const mainAuthor = mainBookURI.split(".")[0]; @@ -241,7 +240,7 @@ const MultiVisual = (props) => { msdata={msData} maxChMatch={maxChMatch} minChMatch={minChMatch} - margin={margin} + margin={visMargins} width={width} height={height} dotSize={dotSize} @@ -254,7 +253,7 @@ const MultiVisual = (props) => { style={{ float: "right", position: "absolute", - left: `${width + margin.left + margin.right + 20}px`, + left: `${width + visMargins.left + visMargins.right + 20}px`, }} > { msStats={msStats} width={100} height={height} - margin={margin} + margin={visMargins} />
{ const { downloadPNG, tickFontSize, - setTickFontSize, - outputImageWidth, - setOutputImageWidth, - dpi, - setDpi, includeURL, setIncludeURL } = useContext(Context); - const tickInputRef = useRef(null); - const widthInputRef = useRef(null); - const dpiInputRef = useRef(null); - const svgSelector = isPairwiseViz ? '#svgChart' : '#scatter-chart'; - - const handleInputChange = (e) => { - setTickFontSize(parseInt(e.target.value) || 12); - }; - - const handleWidthInputChange = (e) => { - setOutputImageWidth(parseInt(e.target.value) || 120); - } - - const handleDpiInputChange = (e) => { - setDpi(parseInt(e.target.value) || 300); - } + + const svgSelector = isPairwiseViz ? 'svgChart' : 'scatterChart'; - const handleIncludeURL = () => { + const handleIncludeUrlChange = (e) => { setIncludeURL((prev) => !prev); } // Apply font size when it changes useEffect(() => { // TODO: fix the font size for one-to-many chart! - console.log(`${svgSelector} .tick text`); - d3.selectAll(`${svgSelector} .tick text`).style("font-size", `${tickFontSize}px`); - }, [tickFontSize, svgSelector]); + console.log("Updating font size"); + d3.selectAll(`#chartBox .tick text`).style("font-size", `${tickFontSize}px`); + /*const selectors = [`#chartBox`, ".bottom-bar", ".side-bar"]; + selectors.map((item) => { + console.log(item); + d3.selectAll(`${item} .tick text`).style("font-size", `${tickFontSize}px`); + })*/ + }, [tickFontSize]); - const handleDownload = () => { - if (isPairwiseViz) { - downloadPNG(downloadFileName, "svgChart", includeURL); - } else { - downloadPNG(downloadFileName, "scatter-chart", includeURL); - } - }; - console.log("downloadFileName: "+downloadFileName); - console.log("isPairwiseViz: "+isPairwiseViz); - return ( <> @@ -72,77 +50,14 @@ const DownloadPanel = ( {isPairwiseViz, downloadFileName} ) => { borderRadius: "5px", position: "relative", borderTop: "1px solid white", + padding: "5px" }} > - Download options: - - - Width: - - mm - - - - - Resolution: - - dpi - - - - - Axis labels size: - - px - - + Download options: + + - diff --git a/src/components/Visualisation/SectionHeader/VisualizationHeader/IncludeMetaDropdown.jsx b/src/components/Visualisation/SectionHeader/VisualizationHeader/IncludeMetaDropdown.jsx new file mode 100644 index 0000000..d0c42e0 --- /dev/null +++ b/src/components/Visualisation/SectionHeader/VisualizationHeader/IncludeMetaDropdown.jsx @@ -0,0 +1,106 @@ +import { useContext, useEffect } from "react"; +import { + FormControl, + InputLabel, + MenuItem, + Select, + Box, + Tooltip, +} from "@mui/material"; +import { Context } from "../../../../App"; + + +const IncludeMetaDropdown = () => { + const { + includeMetaInDownload, + setIncludeMetaInDownload, + metaPositionInDownload, + setMetaPositionInDownload, + } = useContext(Context); + + + const handleInclMetaChange = (e) => { + setIncludeMetaInDownload(e.target.value); + } + + const handlePosChange = (e) => { + setMetaPositionInDownload(e.target.value); + }; + + const metadataOptions = [ + { value: "no", label: "No" }, + { value: "author", label: "Author" }, + { value: "title", label: "Title" }, + { value: "author+title", label: "Author + Title" }, + { value: "versionCode", label: "Version Code" }, + ]; + + const positionOptions = [ + { value: "left", label: "Left side" }, + { value: "topbottom", label: "Top and bottom" }, + ]; + + useEffect(() => { + console.log("Initial metadataType:", includeMetaInDownload); + }, [includeMetaInDownload]); + + return ( + + + + Include metadata: + + + + + {includeMetaInDownload !== "no" && ( + + + Position + + + + )} + + ); +}; + +export default IncludeMetaDropdown; \ No newline at end of file diff --git a/src/components/Visualisation/SectionHeader/VisualizationHeader/OutputDimensions.jsx b/src/components/Visualisation/SectionHeader/VisualizationHeader/OutputDimensions.jsx new file mode 100644 index 0000000..626e952 --- /dev/null +++ b/src/components/Visualisation/SectionHeader/VisualizationHeader/OutputDimensions.jsx @@ -0,0 +1,82 @@ +import { useContext } from "react"; +import { + FormControl, + //InputLabel, + TextField, + Box, + Tooltip, +} from "@mui/material"; +import { Context } from "../../../../App"; + + +const OutputDimensions = () => { + const { + tickFontSize, + setTickFontSize, + outputImageWidth, + setOutputImageWidth, + dpi, + setDpi + } = useContext(Context); + + return ( + + + + setOutputImageWidth(e.target.value)} + sx={{ + width: 100, + ml: 1, + "& .MuiInputBase-input": { + padding: "6px 8px", + fontSize: "0.85rem", + }, + }} + /> + + + + + setDpi(e.target.value)} + sx={{ + width: 120, + ml: 1, + "& .MuiInputBase-input": { + padding: "6px 8px", + fontSize: "0.85rem", + }, + }} + /> + + + + + setTickFontSize(e.target.value)} + sx={{ + width: 120, + ml: 1, + "& .MuiInputBase-input": { + padding: "6px 8px", + fontSize: "0.85rem", + }, + }} + /> + + + + ); +}; + +export default OutputDimensions; \ No newline at end of file diff --git a/src/components/Visualisation/index.jsx b/src/components/Visualisation/index.jsx index 303410f..70215ff 100644 --- a/src/components/Visualisation/index.jsx +++ b/src/components/Visualisation/index.jsx @@ -123,6 +123,13 @@ const VisualisationPage = () => { setUrl, defaultReleaseCode, setMainVersionCode, + setVisMargins, + defaultMargins, + includeURL, + includeMetaInDownload, + metaPositionInDownload, + axisLabelFontSize, + tickFontSize } = useContext(Context); const [isPairwiseViz, setIsPairwiseViz] = useState(false); @@ -131,6 +138,39 @@ const VisualisationPage = () => { const navigate = useNavigate(); const { version } = useParams(); + useEffect(() => { + const updateMargins = () => { + const margins = { ...defaultMargins }; + if (includeURL) { + console.log("Making space for URL"); + margins.top += Math.max(axisLabelFontSize, tickFontSize); + //margins.top += tickFontSize; + console.log(margins); + } + // update the margins of the graph: + if (includeMetaInDownload !== "no") { + if (metaPositionInDownload === "left") { + margins.left += Math.max(axisLabelFontSize, tickFontSize); + //margins.left += tickFontSize; + } else { + margins.top += Math.max(axisLabelFontSize, tickFontSize); + //margins.top += tickFontSize; + } + } + setVisMargins(margins); + console.log(margins); + }; + updateMargins(); + }, [ + setVisMargins, + defaultMargins, + includeURL, + includeMetaInDownload, + metaPositionInDownload, + axisLabelFontSize, + tickFontSize + ]); + const handleUpload = async (upload) => { setInitialValues({ dataLoading, diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 306e683..b85b126 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -339,6 +339,37 @@ function bisectLeft(array, value) { return low; } + +/* + * wrap a string into lines based on a maximum + * number of characters per line +*/ +function wrapText(text, maxChars) { + const words = text.split(" "); + const lines = []; + let currentLine = ""; + + for (const word of words) { + // If adding this word would exceed the limit + if ((currentLine + " " + word).trim().length > maxChars) { + // Push the current line and start a new one + lines.push(currentLine.trim()); + currentLine = word; + } else { + // Otherwise, add the word to the current line + currentLine += " " + word; + } + } + + // Push the last line + if (currentLine) { + lines.push(currentLine.trim()); + } + + return lines; +} + + export { getHighestValueInArrayOfObjects, calculateTooltipPos, @@ -358,5 +389,6 @@ export { bisectLeft, getVersionIDfromURI, getVersionIDfromURL, - buildPairwiseCsvURL + buildPairwiseCsvURL, + wrapText }; From a0406d7fddb270721260282f531e37481679d21c Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 31 Jul 2025 13:58:50 +0100 Subject: [PATCH 045/284] Remove confusing visualisation toggle --- .../Visualisation/SectionHeader/SectionHeaderLayout.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/components/Visualisation/SectionHeader/SectionHeaderLayout.js b/src/components/Visualisation/SectionHeader/SectionHeaderLayout.js index 7fe1c67..7e09b27 100644 --- a/src/components/Visualisation/SectionHeader/SectionHeaderLayout.js +++ b/src/components/Visualisation/SectionHeader/SectionHeaderLayout.js @@ -1,6 +1,6 @@ import { useContext } from "react"; import { Box, Typography } from "@mui/material"; -import ToggleButton from "./ToggleButton"; +//import ToggleButton from "./ToggleButton"; import BAExtra from "./BookAlignmentHeader/BAExtra"; import DownloadPanel from "./VisualizationHeader/DownloadPanel"; import { Context } from "../../../App"; @@ -49,9 +49,9 @@ const SectionHeaderLayout = ({ item, children, toggle, setToggle }) => {
{children} - + {/* - + */}
{item.title === "Books" && showOptions && } {item.title === "Pairwise Visualization" && showDownloadOptions && Date: Thu, 31 Jul 2025 16:21:54 +0100 Subject: [PATCH 046/284] Wrap words on space and hyphen --- src/utility/Helper.js | 54 ++++++++++++++++++++++++++++++++----------- 1 file changed, 41 insertions(+), 13 deletions(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 399259b..13d8b3c 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -352,23 +352,31 @@ function bisectLeft(array, value) { * number of characters per line */ function wrapText(text, maxChars) { - const words = text.split(" "); const lines = []; + let currentWord = ""; let currentLine = ""; - for (const word of words) { - // If adding this word would exceed the limit - if ((currentLine + " " + word).trim().length > maxChars) { - // Push the current line and start a new one - lines.push(currentLine.trim()); - currentLine = word; - } else { - // Otherwise, add the word to the current line - currentLine += " " + word; - } + for (const char of text) { + currentWord += char + // use space or hyphen to delimit a word: + if (char === " " || char === "-") { + // If adding this word would exceed the limit + if ((currentLine + " " + currentWord).trim().length > maxChars) { + lines.push(currentLine.trim()); + // Push the current line and start a new one + currentLine = currentWord; + } else { + // Otherwise, add the word to the current line + currentLine += currentWord; + } + currentWord = ""; + } } - // Push the last line + // Push the last word and line: + if (currentWord){ + currentLine += currentWord; + } if (currentLine) { lines.push(currentLine.trim()); } @@ -376,6 +384,25 @@ function wrapText(text, maxChars) { return lines; } +/* + * get the metadata label to be displayed + * in the pairwise visualisation + */ +function getMetaLabel(d, metaType) { + switch (metaType) { + case "author": + return d?.bookAuthor; + case "title": + return d?.bookTitle?.label; + case "author+title": + return `${d?.bookAuthor}, ${d?.bookTitle?.label}`; + case "versionCode": + return d?.versionCode; + default: + console.log("unexpected value: "+metaType); + } +} + export { getHighestValueInArrayOfObjects, @@ -398,5 +425,6 @@ export { getVersionIDfromURL, buildPairwiseCsvURL, wrapText, - loadChartFromUrl + loadChartFromUrl, + getMetaLabel, }; From 965b3c1ec20ce02944ebd9b1ed95696893112d39 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 31 Jul 2025 17:17:37 +0100 Subject: [PATCH 047/284] set defaults for CHAB visualisation outputs --- src/App.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/App.js b/src/App.js index 5da0abe..ada6521 100644 --- a/src/App.js +++ b/src/App.js @@ -136,8 +136,8 @@ function App() { const bookSectionRef = useRef(); const [isFileUploaded, setIsFileUploaded] = useState(false); const [showTickSizeInput, setShowTickSizeInput] = useState(false); - const [tickFontSize, setTickFontSize] = useState(12); - const [axisLabelFontSize, setAxisLabelFontSize] = useState(12); + const [tickFontSize, setTickFontSize] = useState(16); + const [axisLabelFontSize, setAxisLabelFontSize] = useState(16); const [outputImageWidth, setOutputImageWidth] = useState(120); const [dpi, setDpi] = useState(300); const [includeMetaInDownload, setIncludeMetaInDownload] = useState("no"); @@ -177,7 +177,7 @@ function App() { const [showOptions, setShowOptions] = useState(false); const [showDownloadOptions, setShowDownloadOptions] = useState(false); const [url, setUrl] = useState(""); - const [includeURL, setIncludeURL] = useState(true); + const [includeURL, setIncludeURL] = useState(false); const [defaultMargins, setDefaultMargins] = useState({ top: 40, right: 20, bottom: 20, left: 60 }); const [visMargins, setVisMargins] = useState({ top: 40, right: 20, bottom: 20, left: 60 }); const [textAvailable, setTextAvailable] = useState(true); From 7371501684bc09f8f795c87c949fb8ab04eb3c25 Mon Sep 17 00:00:00 2001 From: Peter Date: Thu, 31 Jul 2025 17:18:23 +0100 Subject: [PATCH 048/284] fix bug in loop --- src/utility/Helper.js | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 13d8b3c..70c6f3a 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -356,7 +356,8 @@ function wrapText(text, maxChars) { let currentWord = ""; let currentLine = ""; - for (const char of text) { + for (let i=0; i Date: Thu, 31 Jul 2025 17:19:13 +0100 Subject: [PATCH 049/284] fix inconsistent margins in svg --- src/components/Visualisation/Chart/index.jsx | 39 +++++++++++--------- src/components/Visualisation/index.jsx | 31 +++++++++++++--- 2 files changed, 47 insertions(+), 23 deletions(-) diff --git a/src/components/Visualisation/Chart/index.jsx b/src/components/Visualisation/Chart/index.jsx index ff6d911..68142b3 100644 --- a/src/components/Visualisation/Chart/index.jsx +++ b/src/components/Visualisation/Chart/index.jsx @@ -246,7 +246,8 @@ const Visual = (props) => { ]; if (showDownloadOptions){ - const lineHeight = Math.max(tickFontSize, axisLabelFontSize) * 1.3; + const charHeight = Math.max(tickFontSize, axisLabelFontSize); + const lineHeight = charHeight * 1.3; if (includeURL) { svgD3.append("text") .attr("x", visMargins.left) @@ -264,34 +265,36 @@ const Visual = (props) => { let textContentb2 = getMetaLabel(b2, includeMetaInDownload); if (metaPositionInDownload === "left") { - const avgCharWidth = Math.max(tickFontSize, axisLabelFontSize) * 0.55; - const maxChars = Math.floor(0.4*innerHeight/avgCharWidth); - console.log("Max. "+maxChars+" per line!"); + // in order to put the metadata along the Y axis, + // we may need to break it into lines. + + // First we calculate the average number of characters + // we can fit in the space (the Y axis is 150px high): + const avgCharWidth = charHeight * 0.55; + const maxChars = Math.floor(200/avgCharWidth); + + // using this measure, we break the metadata into lines: const labelLinesb1 = wrapText(textContentb1, maxChars); - console.log(labelLinesb1); + const labelLinesb2 = wrapText(textContentb2, maxChars); + // Add b1 metadata at the top of the Y axis: let space = lineHeight; - //textContentb1.split(", ").forEach((textContent) => { labelLinesb1.forEach((textContent) => { svgD3.append("text") .attr("transform", "rotate(-90)") - //.attr("x", (-innerHeight)/3 - visMargins.top) .attr("x", -150 - visMargins.top) // 150 being the size of the Y axis .attr("y", space) .attr("text-anchor", "start") .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize .text(textContent); - space += lineHeight; + space += lineHeight; }) + // Add b2 metadata at the bottom of the Y axis: - space = lineHeight; - //textContentb1.split(", ").forEach((textContent) => { - const labelLinesb2 = wrapText(textContentb2, maxChars); - console.log(labelLinesb2); + space = lineHeight; labelLinesb2.forEach((textContent) => { svgD3.append("text") .attr("transform", "rotate(-90)") - //.attr("x", -innerHeight + visMargins.top) .attr("x", -450 - visMargins.top) .attr("y", space) .attr("text-anchor", "start") @@ -299,23 +302,25 @@ const Visual = (props) => { .text(textContent); space += lineHeight; }) + } else { + // Add b1 metadata at the top: svgD3.append("text") .attr("x", visMargins.left) - .attr("y", 3*lineHeight) // replace with axisLabelFontSize + .attr("y", includeURL ? 3*lineHeight : 2*lineHeight) // replace with axisLabelFontSize .attr("text-anchor", "left") .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize .text(textContentb1); - // add b2 metadata at the bottom: + + // add b2 metadata at the bottom: svgD3.append("text") .attr("x", visMargins.left) .attr("y", outerHeight - lineHeight) // replace with axisLabelFontSize .attr("text-anchor", "left") .style("font-size", `${tickFontSize}px`) // replace with axisLabelFontSize .text(textContentb2); - } - + } } } } diff --git a/src/components/Visualisation/index.jsx b/src/components/Visualisation/index.jsx index 70215ff..caa1b28 100644 --- a/src/components/Visualisation/index.jsx +++ b/src/components/Visualisation/index.jsx @@ -14,6 +14,7 @@ import { getVersionMeta } from "../../functions/getVersionMeta"; import { setPairwiseVizData, setMultiVizData } from "../../functions/setVisualizationData"; import { downloadCsvData, getOneBookReuseStats, getOneBookMsData } from "../../services/TextReuseData"; import { lightSrtFolders, srtFoldersGitHub } from "../../assets/srtFolders"; +import { getMetaLabel, wrapText } from "../../utility/Helper"; import { Context } from "../../App"; @@ -110,6 +111,7 @@ const VisualisationPage = () => { setDataLoading, flipTimeLoading, setBooksAlignment, + metaData, setMetaData, setChartData, loadedCsvFile, @@ -141,20 +143,36 @@ const VisualisationPage = () => { useEffect(() => { const updateMargins = () => { const margins = { ...defaultMargins }; + const charHeight = Math.max(axisLabelFontSize, tickFontSize); + const lineHeight = 1.3 * charHeight; if (includeURL) { console.log("Making space for URL"); - margins.top += Math.max(axisLabelFontSize, tickFontSize); + margins.top += lineHeight; //margins.top += tickFontSize; console.log(margins); + } else { + console.log("No space for URL"); + console.log(margins); } // update the margins of the graph: if (includeMetaInDownload !== "no") { if (metaPositionInDownload === "left") { - margins.left += Math.max(axisLabelFontSize, tickFontSize); - //margins.left += tickFontSize; + // in order to put the metadata along the Y axis, + // we may need to break it into lines. + // Calculate into how many lines we will have to break + // the longest of the labels: + const b1Label = getMetaLabel(metaData.book1, includeMetaInDownload); + const b2Label = getMetaLabel(metaData.book2, includeMetaInDownload); + const longestLabel = [b1Label, b2Label].sort((a, b) =>{ + return b.length - a.length + })[0]; + const avgCharWidth = charHeight * 0.55; + const maxChars = Math.floor(200/avgCharWidth); + const nLines = wrapText(longestLabel, maxChars).length; + // add margin space for the required number of lines: + margins.left += nLines * lineHeight; } else { - margins.top += Math.max(axisLabelFontSize, tickFontSize); - //margins.top += tickFontSize; + margins.top += lineHeight; } } setVisMargins(margins); @@ -168,7 +186,8 @@ const VisualisationPage = () => { includeMetaInDownload, metaPositionInDownload, axisLabelFontSize, - tickFontSize + tickFontSize, + metaData ]); const handleUpload = async (upload) => { From 0919c0bd33a8cf4cd8e9944c3554c06f7bce0b7b Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 09:50:22 +0100 Subject: [PATCH 050/284] changed download full-text icon --- .../Drawer/TextReuse/TextReuseData/TextReuseTable.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index 934fcd5..3efbcad 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -281,7 +281,7 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 }} onClick={() => downloadPairwiseCsv(b1Metadata, item.id)} > - + From c373a3b670fda4b0454d5c95ca59be38143622d0 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 10:01:47 +0100 Subject: [PATCH 051/284] add lite file download --- .../TextReuse/TextReuseData/TableHeader.js | 4 +-- .../TextReuse/TextReuseData/TextReuseTable.js | 26 ++++++++++++++++--- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js index 96b71f1..337a0bd 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TableHeader.js @@ -22,7 +22,7 @@ const TableHeader = ({ sortingOrder, setSortingOrder }) => { Work @@ -49,7 +49,7 @@ const TableHeader = ({ sortingOrder, setSortingOrder }) => { setSortingOrder={setSortingOrder} /> - +
); }; diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index 3efbcad..fae6cc4 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -132,13 +132,13 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 * @param {Object} b1Metadata full metadata of book1 * @param {Object} book2ID version ID of book2 */ - const downloadPairwiseCsv = async (b1Metadata, book2ID) => { + const downloadPairwiseCsv = async (b1Metadata, book2ID, light=false, github=false) => { // we already have full metadata of book1; // download the metadata for book 2 and get the ID: const releaseCode = JSON.parse(localStorage.getItem("release_code")); const b2Metadata = await getVersionMetadataById(releaseCode, book2ID); // build the URL to the CSV file: - const csvUrl = await buildPairwiseCsvURL(releaseCode, b1Metadata, b2Metadata); + const csvUrl = await buildPairwiseCsvURL(releaseCode, b1Metadata, b2Metadata, light, github); const csvFilename = csvUrl.split("/").pop(); // create a temporary link to the csv file to trigger the download: const link = document.createElement('a'); @@ -218,7 +218,7 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 }} > + + + + downloadPairwiseCsv(b1Metadata, item.id, true)} + > + + + + + ) From 27f5d58f0311fd2a2f845c56f4f5f4d62c3b6e04 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 10:55:18 +0100 Subject: [PATCH 052/284] update to checkPairwiseCsvResponse to check parent dir - for reuse by drawer --- src/utility/Helper.js | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 3e12867..4df9b69 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -11,7 +11,7 @@ let originalFetch = null; function enableMockFetch({ failForMatch = "" } = {}) { if (originalFetch) return; // already mocked - + console.log(`[MockFetch] Mocking fetch to fail for: ${failForMatch}`); originalFetch = global.fetch; global.fetch = async (url, options) => { @@ -49,19 +49,26 @@ const urlExists = async (url) => { * Check the response for a pairwise csv - fallback to GitHub if not found * @param {String} releaseCode OpenITI release version code * @param {String} book1 metadata obj book 1 - * @param {String} book2 metadata obj book 2 + * @param {String} book2 metadata obj book 2 (if no book2 is provided, it will just check for the parent folder) * @param {Boolean} full If true, check for full text reuse data * * @returns {Object} {"pairwiseUrl": String, "pairwiseLiteUrl": String, "githubUrl": boolean} * If the response fails for either URL, it will return null for that field. If it returns a githubUrl, then githubUrl will be true */ -const checkPairwiseCsvResponse = async (releaseCode, book1, book2, full=false) => { +const checkPairwiseCsvResponse = async (releaseCode, book1, book2=null, full=false) => { // Set pairwise lite URL as null - in case we do not find it const pairwiseLiteUrl = null; // If full is true check for full and set full and lite URLs accordingly - if (full) { - const pairwiseFullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); + if (full || !book2) { + let pairwiseFullUrl + if (!book2) { + const b1ID = getVersionIDfromURL(book1.release_version.url, true); + const baseURL = srtFolders[releaseCode]; + pairwiseFullUrl = `${baseURL}/${b1ID}/`; + } else { + pairwiseFullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); + } const urlRes = await urlExists(pairwiseFullUrl); if (urlRes) { console.log("Full text reuse data found at: " + pairwiseFullUrl); @@ -77,7 +84,15 @@ const checkPairwiseCsvResponse = async (releaseCode, book1, book2, full=false) = } } // If we have not returned yet, the response failed so we check GitHub (just lite URL) - const githubUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false, true); + let githubUrl; + if (!book2) { + // If there is no book2, then we check a response on the tree, not the raw + const b1ID = getVersionIDfromURL(book1.release_version.url, true); + githubUrl = `https://github.com/kitab-project-org/pairwise-light/tree/v${releaseCode}-pri/data/${b1ID}`; + } else { + githubUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false, true); + } + // Check the GitHub URL const githubRes = await urlExists(githubUrl); if (githubRes) { return { pairwiseUrl: null, pairwiseLiteUrl: githubUrl, githubUrl: true }; @@ -85,6 +100,7 @@ const checkPairwiseCsvResponse = async (releaseCode, book1, book2, full=false) = // If both responses fail, return null for both URLs} return { pairwiseUrl: null, pairwiseLiteUrl: pairwiseLiteUrl, githubUrl: false }; } + }; From 577f0bb737b050bd9c7ae707de8358a7c1546281 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 11:53:33 +0100 Subject: [PATCH 053/284] fix errors in GitHub fallback when no b2 --- src/utility/Helper.js | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 4df9b69..3424965 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -58,11 +58,12 @@ const urlExists = async (url) => { const checkPairwiseCsvResponse = async (releaseCode, book1, book2=null, full=false) => { // Set pairwise lite URL as null - in case we do not find it - const pairwiseLiteUrl = null; + let pairwiseLiteUrl = null; // If full is true check for full and set full and lite URLs accordingly - if (full || !book2) { + if (full || book2 === null) { let pairwiseFullUrl - if (!book2) { + if (book2 === null) { + console.log(book1) const b1ID = getVersionIDfromURL(book1.release_version.url, true); const baseURL = srtFolders[releaseCode]; pairwiseFullUrl = `${baseURL}/${b1ID}/`; @@ -72,7 +73,14 @@ const checkPairwiseCsvResponse = async (releaseCode, book1, book2=null, full=fal const urlRes = await urlExists(pairwiseFullUrl); if (urlRes) { console.log("Full text reuse data found at: " + pairwiseFullUrl); - const pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); + if (book2 === null) { + // If there is no book2, then we check a response on the tree, not the raw + const b1ID = getVersionIDfromURL(book1.release_version.url, true); + const baseURL = lightSrtFolders[releaseCode]; + pairwiseLiteUrl = `${baseURL}/${b1ID}/`; + } else { + pairwiseLiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); + } return { pairwiseUrl: pairwiseFullUrl, pairwiseLiteUrl: pairwiseLiteUrl, githubUrl: false}; } } else { @@ -85,10 +93,9 @@ const checkPairwiseCsvResponse = async (releaseCode, book1, book2=null, full=fal } // If we have not returned yet, the response failed so we check GitHub (just lite URL) let githubUrl; - if (!book2) { - // If there is no book2, then we check a response on the tree, not the raw - const b1ID = getVersionIDfromURL(book1.release_version.url, true); - githubUrl = `https://github.com/kitab-project-org/pairwise-light/tree/v${releaseCode}-pri/data/${b1ID}`; + if (book2 === null) { + // If there is no book2, then we just return - as we cannot check the GitHub URL without a book2 + return { pairwiseUrl: null, pairwiseLiteUrl: null, githubUrl: true }; } else { githubUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false, true); } From 2295e06ca9eeb11da732e9fb10768f7df1e2a90b Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 11:54:00 +0100 Subject: [PATCH 054/284] add function to TextReuseTable to check server response --- .../TextReuse/TextReuseData/TextReuseTable.js | 38 ++++++++++++++++++- .../NavigationAndStats/index.js | 5 ++- 2 files changed, 40 insertions(+), 3 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index fae6cc4..2039172 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -3,10 +3,13 @@ import { Box, CircularProgress, IconButton, Tooltip, Typography } from "@mui/mat import TableHeader from "./TableHeader"; import { getVersionMetadataById } from "../../../../../services/CorpusMetaData"; import { getOneBookReuseStats } from "../../../../../services/TextReuseData"; -import { buildPairwiseCsvURL } from "../../../../../utility/Helper"; +import { buildPairwiseCsvURL, checkPairwiseCsvResponse, enableMockFetch } from "../../../../../utility/Helper"; import { Context } from "../../../../../App"; import Papa from "papaparse"; - +import { + // lightSrtFolders, + // srtFoldersGitHub, + srtFolders } from "../../../../../assets/srtFolders"; const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1MetadataLoading }) => { const { isOpenDrawer, setIsOpenDrawer } = useContext(Context); @@ -17,6 +20,37 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 const [isLoading, setIsLoading] = useState(false); const [isError, setIsError] = useState(false); const [total, setTotal] = useState(0); + const [useGithubUrl, setUseGithubUrl] = useState(false); + const [fullDataExists, setFullDataExists] = useState(false); + const [liteDataExists, setLiteDataExists] = useState(false); + + // Check the server response to see if the full and lite data exists + useEffect(() => { + // Prevent from running at closing of the drawer + if (!isOpenDrawer) return; + // If we have book1 - check what kind of data can be fetched (is the server live or are we defaulting to GitHub?) + if (b1Metadata && b1Metadata.version_uri) { + + const releaseCode = JSON.parse(localStorage.getItem("release_code")); + enableMockFetch({ failForMatch: srtFolders[releaseCode] }); + const checkServerResponse = async (book1) => { + const csvObj = await checkPairwiseCsvResponse(releaseCode, book1); + if (csvObj.githubUrl) { + // If the GitHub URL is true, we are using GitHub as a fallback + setUseGithubUrl(true); + setLiteDataExists(true); + } else { + // If the GitHub URL is false, we are using the server + setFullDataExists(csvObj.pairwiseUrl !== null); + setLiteDataExists(csvObj.pairwiseLiteUrl !== null); + } + console.log(csvObj); + } + // Check the server response + checkServerResponse(b1Metadata); + } + }, [b1Metadata, isOpenDrawer]); + // fetch the stats data from GitHub: useEffect(() => { diff --git a/src/components/CorpusMetadata/NavigationAndStats/index.js b/src/components/CorpusMetadata/NavigationAndStats/index.js index 15f380f..1a99ce9 100644 --- a/src/components/CorpusMetadata/NavigationAndStats/index.js +++ b/src/components/CorpusMetadata/NavigationAndStats/index.js @@ -85,6 +85,8 @@ const NavigationAndStats = () => { if (!booksReady) return; const checkSelectedUrls = async () => { + + if (checkedBooks.length !== 2) { // If we have not selected two books, then set these pairwise parameters to null setPairwiseLiteUrl(null); @@ -95,7 +97,7 @@ const NavigationAndStats = () => { } else { console.log("Checking selected books for pairwise text reuse data"); - + // Activate the loading function - allows us to show a loading spinner after a delay (to avoid flickering) setLoadingReuseData(true); @@ -120,6 +122,7 @@ const NavigationAndStats = () => { setPairwiseLiteUrl(urlObj.pairwiseLiteUrl); setGithubUrl(urlObj.githubUrl); + // // Create URLs for the selected books - if URL returns a response, then we set the variable // const LiteUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, true); // const fullUrl = await buildPairwiseCsvURL(releaseCode, book1, book2, false); From 6bb66b80f20f84a652293256ee93c8030cc0d123 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 12:01:12 +0100 Subject: [PATCH 055/284] add and test github fallback for light download --- .../TextReuse/TextReuseData/TextReuseTable.js | 35 ++++++++++++++----- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index 2039172..a9a4174 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -174,14 +174,31 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 // build the URL to the CSV file: const csvUrl = await buildPairwiseCsvURL(releaseCode, b1Metadata, b2Metadata, light, github); const csvFilename = csvUrl.split("/").pop(); - // create a temporary link to the csv file to trigger the download: - const link = document.createElement('a'); - link.href = csvUrl; - link.setAttribute('download', csvFilename); - document.body.appendChild(link); - // download and clean up: - link.click(); - document.body.removeChild(link); + if (github) { + // If the URL is a GitHub URL, then we need to download it differently + const response = await fetch(csvUrl); + if (!response.ok) { + throw new Error("Network response was not ok"); + } + const blob = await response.blob(); + const url = window.URL.createObjectURL(blob); + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", csvFilename); // Set the file name for download + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + } + else { + // create a temporary link to the csv file to trigger the download: + const link = document.createElement('a'); + link.href = csvUrl; + link.setAttribute('download', csvFilename); + document.body.appendChild(link); + // download and clean up: + link.click(); + document.body.removeChild(link); + } } /** @@ -331,7 +348,7 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 fontSize: "18px", color: "#7593af", }} - onClick={() => downloadPairwiseCsv(b1Metadata, item.id, true)} + onClick={() => downloadPairwiseCsv(b1Metadata, item.id, true, useGithubUrl)} > From 28a590ccce5ca9f8029d876121b2c32a9b5222e2 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Fri, 1 Aug 2025 12:12:39 +0100 Subject: [PATCH 056/284] set icon visibility based on data availability --- .../TextReuse/TextReuseData/TextReuseTable.js | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index a9a4174..46434b4 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -3,13 +3,9 @@ import { Box, CircularProgress, IconButton, Tooltip, Typography } from "@mui/mat import TableHeader from "./TableHeader"; import { getVersionMetadataById } from "../../../../../services/CorpusMetaData"; import { getOneBookReuseStats } from "../../../../../services/TextReuseData"; -import { buildPairwiseCsvURL, checkPairwiseCsvResponse, enableMockFetch } from "../../../../../utility/Helper"; +import { buildPairwiseCsvURL, checkPairwiseCsvResponse } from "../../../../../utility/Helper"; import { Context } from "../../../../../App"; import Papa from "papaparse"; -import { - // lightSrtFolders, - // srtFoldersGitHub, - srtFolders } from "../../../../../assets/srtFolders"; const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1MetadataLoading }) => { const { isOpenDrawer, setIsOpenDrawer } = useContext(Context); @@ -29,10 +25,8 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 // Prevent from running at closing of the drawer if (!isOpenDrawer) return; // If we have book1 - check what kind of data can be fetched (is the server live or are we defaulting to GitHub?) - if (b1Metadata && b1Metadata.version_uri) { - + if (b1Metadata && b1Metadata.version_uri) { const releaseCode = JSON.parse(localStorage.getItem("release_code")); - enableMockFetch({ failForMatch: srtFolders[releaseCode] }); const checkServerResponse = async (book1) => { const csvObj = await checkPairwiseCsvResponse(releaseCode, book1); if (csvObj.githubUrl) { @@ -298,6 +292,7 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 display={"flex"} alignItems={"center"} > + { useGithubUrl || liteDataExists ? ( + ); diff --git a/src/utility/Helper.js b/src/utility/Helper.js index 59faa5b..f8e0bd8 100644 --- a/src/utility/Helper.js +++ b/src/utility/Helper.js @@ -1,8 +1,74 @@ +import { saveSvgAsPng, svgAsDataUri } from "save-svg-as-png"; import { srtFolders, lightSrtFolders, srtFoldersGitHub} from "../assets/srtFolders" import { config } from "../config"; + + const { GITHUB_BASE_URL, GITHUB_BASE_RAW_URL } = config; +const downloadSVG = (svgId, downloadFileName) => { + //const downloadFileName = `${metaData?.book1?.versionCode}_${metaData?.book2?.versionCode}.png`; + const svg = document.getElementById(svgId); + + svgAsDataUri(svg) + .then(uri => { + const link = document.createElement('a'); + link.download = downloadFileName.replace(".png", ".svg"); + link.href = uri; // data URI + document.body.appendChild(link); // required for Firefox + link.click(); // trigger download + document.body.removeChild(link); // cleanup + }) + .catch(err => { + console.error("Failed to download SVG:", err); + }); +} + +const downloadPNG = (svgId, downloadFileName, outputImageWidth, dpi) => { + //const downloadFileName = `${metaData?.book1?.versionCode}_${metaData?.book2?.versionCode}.png`; + const svg = document.getElementById(svgId); + const newSvg = svg.cloneNode(true); + + let scale = 3; // default scale: 300 % + + if (outputImageWidth) { // context variable! + const inchPerMM = 1 / 25.4; + const svgPixelWidth = svg.clientWidth; + const outputWidthInInches = outputImageWidth * inchPerMM; + const targetPixelWidth = outputWidthInInches * (dpi || 300); // dpi is also a context variable; use 300 if dpi is undefined + scale = targetPixelWidth / svgPixelWidth / window.devicePixelRatio; + console.log("window.devicePixelRatio: "+window.devicePixelRatio) + + /* + NB: the save-svg-as-png library gets the width of the svg in one of these ways: + * - svg.viewBox.baseVal["width"] : returns 0 in our case + * - newSvg.getAttribute("width") : returns same value as svg.clientWidth + * - svg.getBoundingClientRect()["width"] : returns same value as svg.clientWidth + * - window.getComputedStyle(svg).getPropertyValue("width") : returns same value as svg.clientWidth + + console.log('svg.viewBox.baseVal["width"]: '+svg.viewBox.baseVal["width"]); + console.log('newSvg.getAttribute("width"): '+newSvg.getAttribute("width")); + console.log('svg.getBoundingClientRect()["width"]: '+svg.getBoundingClientRect()["width"]); + console.log('window.getComputedStyle(svg).getPropertyValue("width") '+window.getComputedStyle(svg).getPropertyValue("width")); + + + console.log(`requested image width: ${outputImageWidth} mm`); + console.log(`requested dpi: ${dpi}`); + console.log(`svg width: ${svgPixelWidth}`); + console.log(`svg bounding box width: ${svg.getBBox().width}`); + console.log(`Output width: ${outputWidthInInches} inch`); + console.log(`Output width: ${targetPixelWidth} pixels`); + console.log(`Scale: ${scale}`); + */ + } + + // save the png: + saveSvgAsPng(newSvg, downloadFileName, { + scale: scale, + backgroundColor: "white", + }); +}; + /** * Testing functionality to make a server fetch fail * To use - call enableMockFetch({ failForMatch: srtFolders[releaseCode] }) to fail for a specific release code @@ -567,6 +633,8 @@ function getMetaLabel(d, metaType) { export { + downloadSVG, + downloadPNG, getHighestValueInArrayOfObjects, calculateTooltipPos, cleanSearchPagination, From 70413c60467d7b68d5949f6aa3e0d0978ba2150a Mon Sep 17 00:00:00 2001 From: Peter Date: Wed, 6 Aug 2025 13:19:34 +0100 Subject: [PATCH 082/284] use chevron icon for closing download options --- .../Visualisation/SectionHeader/VisualizationHeader/index.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/Visualisation/SectionHeader/VisualizationHeader/index.js b/src/components/Visualisation/SectionHeader/VisualizationHeader/index.js index 42662eb..7be6462 100644 --- a/src/components/Visualisation/SectionHeader/VisualizationHeader/index.js +++ b/src/components/Visualisation/SectionHeader/VisualizationHeader/index.js @@ -85,7 +85,7 @@ const VisualizationHeader = ({ restoreCanvas, isPairwiseViz, colorScale, width } mr: "10px", }} > - + From 22885a1c50d576448c46992c4e90afb22748d666 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 6 Aug 2025 14:56:18 +0100 Subject: [PATCH 083/284] ensure spinner when drawer loading data --- .../Drawer/TextReuse/TextReuseData/TextReuseTable.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index d6e723d..93948ae 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -96,6 +96,7 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 book_lc: rest.book.toLowerCase() })); setStatsData(stats); + console.log("Stats data loaded: "); } }); }; @@ -103,7 +104,10 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 // fetch the text reuse stats data: try { fetchData(b1Metadata); - setIsLoading(false); + console.log("Stopping spinner") + if (statsData.length > 0) { + setIsLoading(false); + } setIsError(false); } catch { if (isMounted) { @@ -113,7 +117,7 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 setTotal(0); } } - }, [b1Metadata, isOpenDrawer]); + }, [b1Metadata, isOpenDrawer, statsData]); // filter the data whenever the search query changes: // NB: the query has already been lowercased and trimmed! From 23ccc9029895528c661b98bc1a8eea1a9185185d Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 6 Aug 2025 15:21:38 +0100 Subject: [PATCH 084/284] fix advanced params display --- .../SearchFilter/SetSearchField.js | 4 +- .../CorpusMetadata/SearchFilter/index.js | 61 ++++++++++--------- 2 files changed, 34 insertions(+), 31 deletions(-) diff --git a/src/components/CorpusMetadata/SearchFilter/SetSearchField.js b/src/components/CorpusMetadata/SearchFilter/SetSearchField.js index dc47598..d89412d 100644 --- a/src/components/CorpusMetadata/SearchFilter/SetSearchField.js +++ b/src/components/CorpusMetadata/SearchFilter/SetSearchField.js @@ -22,7 +22,7 @@ export default function SetSearchField() { normalizedSearch, setNormalizedSearch, advanceSearchModal, - setAdvanceSearchModal, + setAdvanceSearchModal } = useContext(Context); const [searchParams, setSearchParams] = useSearchParams(); @@ -70,6 +70,8 @@ export default function SetSearchField() { } }, [searchParams, setNormalizedSearch]); + + return ( { fullWidth={true} /> - {advanceParams.length !== 0 && ( - - Advanced Search: - {advanceParams && - advanceParams.map((item, i) => ( - - {item} - {advanceParams.length === i + 1 ? "" : ", "} - - ))} - - - )} + {(searchParams.get("search") || text || searchField) && ( { + {advanceParams.length !== 0 && ( + + Advanced Search: + {advanceParams && + advanceParams.map((item, i) => ( + + {item} + {advanceParams.length === i + 1 ? "" : ", "} + + ))} + + + )} ); From 78ae78ae333c13d78b6fe521590263182809a34a Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 6 Aug 2025 15:29:26 +0100 Subject: [PATCH 085/284] show advanced search queries in advanced search --- src/components/CorpusMetadata/SearchFilter/index.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/components/CorpusMetadata/SearchFilter/index.js b/src/components/CorpusMetadata/SearchFilter/index.js index 5cd78ce..966a3bd 100644 --- a/src/components/CorpusMetadata/SearchFilter/index.js +++ b/src/components/CorpusMetadata/SearchFilter/index.js @@ -121,9 +121,11 @@ const SearchFilters = ({ handleResetFilters, getQuery }) => { let newArr = []; for (let i = 0; i < arr.length; i++) { if (searchParams.has(arr[i]) && isExist(Object.keys(paramMappings)[i])) { - newArr = [...newArr, paramMappings[arr[i]]]; + console.log("searchParams", searchParams.get(arr[i])); + newArr = [...newArr, `${paramMappings[arr[i]]}: ${searchParams.get(arr[i])}`]; } } + console.log("newArr", newArr); setAdvanceParams(newArr); // eslint-disable-next-line react-hooks/exhaustive-deps From 197b6d55ad4ad796b5912c0e1ce716fb1ad76aba Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 6 Aug 2025 15:29:58 +0100 Subject: [PATCH 086/284] clean up code --- src/components/CorpusMetadata/SearchFilter/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/components/CorpusMetadata/SearchFilter/index.js b/src/components/CorpusMetadata/SearchFilter/index.js index 966a3bd..9cbd0f4 100644 --- a/src/components/CorpusMetadata/SearchFilter/index.js +++ b/src/components/CorpusMetadata/SearchFilter/index.js @@ -121,11 +121,9 @@ const SearchFilters = ({ handleResetFilters, getQuery }) => { let newArr = []; for (let i = 0; i < arr.length; i++) { if (searchParams.has(arr[i]) && isExist(Object.keys(paramMappings)[i])) { - console.log("searchParams", searchParams.get(arr[i])); newArr = [...newArr, `${paramMappings[arr[i]]}: ${searchParams.get(arr[i])}`]; } } - console.log("newArr", newArr); setAdvanceParams(newArr); // eslint-disable-next-line react-hooks/exhaustive-deps From 2e4f9f431f5ca7f68758c6c3be0472e6aeb4c4cf Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 6 Aug 2025 15:36:35 +0100 Subject: [PATCH 087/284] clean up logs --- .../Drawer/TextReuse/TextReuseData/TextReuseTable.js | 1 - 1 file changed, 1 deletion(-) diff --git a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js index 93948ae..dae6746 100644 --- a/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js +++ b/src/components/CorpusMetadata/Drawer/TextReuse/TextReuseData/TextReuseTable.js @@ -96,7 +96,6 @@ const TextReuseTable = ({ b1Metadata, normalizedQuery, handleRedirectToChart, b1 book_lc: rest.book.toLowerCase() })); setStatsData(stats); - console.log("Stats data loaded: "); } }); }; From f06ad98a26d3daf283017b6df2ca057c51014d86 Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Wed, 6 Aug 2025 16:07:13 +0100 Subject: [PATCH 088/284] patched issue edition_place missing from advanced params --- .../CorpusMetadata/SearchFilter/AdvanceSearch/index.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/components/CorpusMetadata/SearchFilter/AdvanceSearch/index.js b/src/components/CorpusMetadata/SearchFilter/AdvanceSearch/index.js index 40d31e7..831e832 100644 --- a/src/components/CorpusMetadata/SearchFilter/AdvanceSearch/index.js +++ b/src/components/CorpusMetadata/SearchFilter/AdvanceSearch/index.js @@ -61,6 +61,7 @@ export default function AdvanceSearch() { max_tok_count: tempAdvanceSearch?.max_tok_count, min_tok_count: tempAdvanceSearch?.min_tok_count, editor: tempAdvanceSearch?.editor, + edition_place: tempAdvanceSearch?.edition_place, publisher: tempAdvanceSearch?.publisher, edition_date: tempAdvanceSearch?.edition_date, died_before_AH: tempAdvanceSearch?.died_before_AH, From 7e152557a004069001109536ba1810583e4a2f0a Mon Sep 17 00:00:00 2001 From: Peter Verkinderen Date: Thu, 7 Aug 2025 14:51:50 +0100 Subject: [PATCH 089/284] Add links to the Kanban board and component descriptions --- README.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/README.md b/README.md index bc29ee7..466c917 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,8 @@ NB: we use a forking workflow so you can test the GitHub Pages deployment on you The aim is to create small, short-lived feature branches, and have the main branch continuously updated. +* pick or create an issue you want to work on (and assign it to yourself) +* use [this GitHub Kanban board](https://github.com/orgs/kitab-project-org/projects/2/views/1?layout_template=board) so that others can keep track of who's working on what * (only the first time): - Fork the repo https://github.com/kitab-project-org/explore/ on GitHub - clone your fork to your local machine: `git clone https://github.com//explore.git` @@ -71,6 +73,8 @@ The aim is to create small, short-lived feature branches, and have the main bran * In the kitab-project-org GitHub page, go to [Actions](https://github.com/kitab-project-org/explore/actions), and choose "Deploy to Github Pages from current branch" in the left-hand column * Click the "Run workflow" button, select the "main" branch from the dropdown, and click the green "Run workflow" button +## Description of the component structure +See [this document](https://docs.google.com/presentation/d/1OeujYqQMVfyVTf5daPZLQdqFnynhK84I_kjeUzXL9Bs/edit?usp=sharing) ## Contributing From b1fd118e63d79654066a39852a1015d3a730475b Mon Sep 17 00:00:00 2001 From: mabarber92 Date: Tue, 17 Feb 2026 16:31:14 +0000 Subject: [PATCH 090/284] set up cookie consent and gtag tracking --- public/index.html | 11 +++ src/components/Common/Analytics/index.js | 120 +++++++++++++++++++++++ src/components/Common/Layouts/index.js | 2 + 3 files changed, 133 insertions(+) create mode 100644 src/components/Common/Analytics/index.js diff --git a/public/index.html b/public/index.html index 782e8a0..fd9e877 100644 --- a/public/index.html +++ b/public/index.html @@ -42,6 +42,17 @@ work correctly both with client-side routing and a non-root public URL. Learn how to configure a non-root public URL by running `npm run build`. --> + + + + + + + + KITAB diff --git a/src/components/Common/Analytics/index.js b/src/components/Common/Analytics/index.js new file mode 100644 index 0000000..cd06a50 --- /dev/null +++ b/src/components/Common/Analytics/index.js @@ -0,0 +1,120 @@ +import { useEffect } from "react"; +import { useLocation } from "react-router-dom"; + +const GA_ID = "G-TGJD7641K2"; + +export default function Analytics() { + const location = useLocation(); + + // -------------------------- + // Helpers + // -------------------------- + function getCookie(name) { + const match = document.cookie.match( + "(^|[^;]+)\\s*" + name + "\\s*=\\s*([^;]+)" + ); + return match ? match.pop() : ""; + } + + function ensureGtag() { + window.dataLayer = window.dataLayer || []; + window.gtag = + window.gtag || + function gtag() { + window.dataLayer.push(arguments); + }; + } + + function enableAnalytics() { + ensureGtag(); + + // IMPORTANT: undo hard-disable (set by disableAnalytics) + window[`ga-disable-${GA_ID}`] = false; + + // First-time init only + if (!window.__gaLoaded) { + window.gtag("js", new Date()); + window.__gaLoaded = true; + } + + // Always (re)apply config so re-enable works without refresh + window.gtag("config", GA_ID); + + window.__gaEnabled = true; + console.log("Analytics enabled"); + } + + function disableAnalytics() { + // Immediately prevents GA from sending hits + window[`ga-disable-${GA_ID}`] = true; + + window.__gaEnabled = false; + console.log("Analytics disabled"); + } + + // -------------------------- + // 1️⃣ Initialisation + Consent + // -------------------------- + useEffect(() => { + // Prevent double execution in dev StrictMode + if (window.__analyticsInitialized) return; + window.__analyticsInitialized = true; + + function init() { + if (!window.cookieconsent) { + console.warn("cookieconsent not loaded"); + return; + } + + const consent = getCookie("cookieconsent_status"); + + // Start analytics if user consented or did not deny + if (consent === "allow" || consent === "") { + enableAnalytics(); + } else { + disableAnalytics(); + } + + window.cookieconsent.initialise({ + palette: { + popup: { background: "#efefef", text: "#404040" }, + button: { background: "#2862a5", text: "#ffffff" }, + }, + type: "opt-out", + content: { + allow: "Approve", + dismiss: "Approve", + deny: "Reject", + }, + onStatusChange: function () { + if (this.hasConsented()) enableAnalytics(); + else disableAnalytics(); + }, + // Helps with the little “corner widget” revoke/restore interactions + onRevokeChoice: function () { + if (this.hasConsented()) enableAnalytics(); + else disableAnalytics(); + }, + }); + } + + if (document.readyState === "complete") init(); + else window.addEventListener("load", init); + + return () => window.removeEventListener("load", init); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + // -------------------------- + // 2️⃣ Track Route Changes (SPA pageviews) + // -------------------------- + useEffect(() => { + if (!window.__gaEnabled) return; + + window.gtag("config", GA_ID, { + page_path: location.pathname + location.search, + }); + }, [location]); + + return null; +} diff --git a/src/components/Common/Layouts/index.js b/src/components/Common/Layouts/index.js index 8df29ee..314add8 100644 --- a/src/components/Common/Layouts/index.js +++ b/src/components/Common/Layouts/index.js @@ -1,6 +1,7 @@ import { Box, Grid } from "@mui/material"; import NavigationBar from "../NavigationBar"; import Footer from "../Footer"; +import Analytics from "../Analytics"; const Layout = ({ children }) => { return ( @@ -16,6 +17,7 @@ const Layout = ({ children }) => {