diff --git a/website/package.json b/website/package.json
index ee1f871a..d6cad625 100644
--- a/website/package.json
+++ b/website/package.json
@@ -13,6 +13,7 @@
"@turf/turf": "^7.1.0",
"@types/cors": "^2.8.17",
"@types/d3": "^7.4.0",
+ "@types/jsdom": "^21.1.7",
"@types/node": "^20.11.30",
"@types/react": "^18.2.67",
"@types/topojson": "^3.2.6",
@@ -23,6 +24,7 @@
"fp-ts": "^2.16.0",
"immer": "^9.0.21",
"io-ts": "^2.2.20",
+ "jsdom": "^25.0.0",
"jss": "^10.10.0",
"mapshaper": "^0.6.25",
"next": "^13.2.4",
diff --git a/website/src/domain/municipality-migrations.ts b/website/src/domain/municipality-migrations.ts
new file mode 100644
index 00000000..97b24478
--- /dev/null
+++ b/website/src/domain/municipality-migrations.ts
@@ -0,0 +1,81 @@
+import { groupBy } from "fp-ts/lib/NonEmptyArray";
+import { z } from "zod";
+
+const mutationTypes = {
+ 1: "INCLUSION",
+ 2: "FUSION",
+};
+export const MunicipalityMigrationData = z
+ .object({
+ ds: z.array(
+ z
+ .tuple([
+ z.number(),
+ z.number(),
+ z.string(),
+ z.number(),
+ z.string(),
+ z.number(),
+ z.string(),
+ z.string(),
+ z.string(),
+ ])
+ .transform((val) => ({
+ migrationNumber: val[0],
+ histNumber: val[1],
+ canton: val[2],
+ bezirkNumber: val[3],
+ bezirkName: val[4],
+ ofsNumber: val[5],
+ municipalityName: val[6],
+ radiationReason: val[7],
+ inscriptionReason: val[8],
+ }))
+ ),
+ mutations: z.record(
+ z
+ .object({
+ t: z.number(),
+ d: z.string(),
+ })
+ .transform((val) => ({
+ type: val.t,
+ date: val.d,
+ }))
+ ),
+ })
+ .transform((val) => {
+ const ds = val.ds;
+ const items = ds.map((row) => {
+ const mutation = val.mutations[row.migrationNumber];
+ return {
+ ...row,
+ date: mutation.date,
+ year: Number(mutation.date.split(".")[2]),
+ type: mutationTypes[mutation.type as keyof typeof mutationTypes],
+ };
+ });
+ const grouped = groupBy<(typeof items)[number]>(
+ (x) => `${x.migrationNumber}`
+ )(items);
+ return Object.entries(grouped).map(([migrationNumber, items]) => {
+ const added = items.filter((x) => x.inscriptionReason);
+ const removed = items.filter((x) => x.radiationReason);
+ return {
+ added,
+ removed,
+ year: items[0].year,
+ migrationNumber: Number(migrationNumber),
+ type: items[0].type,
+ label: `+${added.map((x) => x.municipalityName).join(", ")} / -${removed
+ .map((x) => x.municipalityName)
+ .join(", ")}`,
+ };
+ });
+ });
+
+export type MunicipalityMigrationData = z.infer<
+ typeof MunicipalityMigrationData
+>;
+
+export type MunicipalityMigrationDataItem = MunicipalityMigrationData[number];
diff --git a/website/src/pages/api/mutations.ts b/website/src/pages/api/mutations.ts
new file mode 100644
index 00000000..7b677a43
--- /dev/null
+++ b/website/src/pages/api/mutations.ts
@@ -0,0 +1,45 @@
+import { JSDOM } from "jsdom";
+import { NextApiHandler } from "next";
+import { MunicipalityMigrationData } from "src/domain/municipality-migrations";
+
+async function fetchAndParse(dateFrom: string, dateTo: string) {
+ const url = `https://www.agvchapp.bfs.admin.ch/fr/mutations/results?EntriesFrom=${dateFrom}&EntriesTo=${dateTo}`;
+
+ const response = await (await fetch(url)).text();
+ const html = response;
+
+ const dom = new JSDOM(html);
+ const document = dom.window.document;
+
+ const scriptsWithDs = document.querySelectorAll("script");
+ let dsValue;
+
+ scriptsWithDs.forEach((script) => {
+ const content = script.textContent;
+ if (content && content.includes("var ds")) {
+ const trimmed = content.slice(0, content.indexOf("var getGroupLabel"));
+ dsValue = eval(`${trimmed}; ({ ds: ds, mutations: mutations })`);
+ return;
+ }
+ });
+
+ if (dsValue) {
+ return MunicipalityMigrationData.parse(dsValue);
+ } else {
+ throw new Error("Script with var ds not found");
+ }
+}
+
+const handler: NextApiHandler = async (req, res) => {
+ const { from: dateFrom, to: dateTo } = req.query;
+ if (!dateFrom || !dateTo) {
+ return res
+ .status(400)
+ .send('Please provide "from" and "to" query parameters');
+ }
+ const content = await fetchAndParse(dateFrom as string, dateTo as string);
+
+ return res.send(content);
+};
+
+export default handler;
diff --git a/website/src/pages/mutations.tsx b/website/src/pages/mutations.tsx
index 8933a0da..a5c99c1c 100644
--- a/website/src/pages/mutations.tsx
+++ b/website/src/pages/mutations.tsx
@@ -7,135 +7,25 @@ import {
List,
ListItem,
ListItemText,
+ TextField,
Typography,
} from "@material-ui/core";
import dynamic from "next/dynamic";
import { groupBy } from "fp-ts/lib/NonEmptyArray";
import { GeoDataFeature, useGeoData } from "src/domain/geodata";
+import {
+ MunicipalityMigrationData,
+ MunicipalityMigrationDataItem,
+} from "src/domain/municipality-migrations";
import * as turf from "@turf/turf";
import { FlyToInterpolator } from "@deck.gl/core";
import { parse } from "path";
-
-const row = z.object({
- "N° d'hist.": z.string(),
- Canton: z.string(),
- "N° du district": z.string(),
- "Nom du district": z.string(),
- "N° OFS commune": z.string().transform((x) => Number(x)),
- "Nom de la commune": z.string(),
- "Raison de la radiation": z.string(),
- "Raison de l'inscription": z.string(),
-
- "Numéro de mutation": z.string(),
- "Type de mutation": z.string(),
- "Entrée en vigueur": z.string(),
-});
-
-interface CsvRow {
- "N° d'hist.": string;
- Canton: string;
- "N° du district": string;
- "Nom du district": string;
- "N° OFS commune": string;
- "Nom de la commune": string;
- "Raison de la radiation": string;
- "Raison de l'inscription": string;
- "Numéro de mutation": string;
- "Type de mutation": string;
- "Entrée en vigueur": string;
-}
-
-const parseHTML = (htmlContent: string) => {
- const parser = new DOMParser();
- const doc = parser.parseFromString(
- `
${htmlContent}`,
- "text/html"
- );
- const table = doc.querySelector("table");
- if (!table) {
- throw new Error("Could not find table");
- }
- const rows = table.querySelectorAll("tr");
- const headers = Array.from(rows[0].querySelectorAll("th")).map(
- (header) => header.textContent
- );
- const data: CsvRow[] = [];
- for (let i = 1; i < rows.length; i++) {
- const cells = rows[i].querySelectorAll("td");
- const rowData: CsvRow = {} as CsvRow;
- for (let j = 0; j < cells.length; j++) {
- const header = headers[j];
- if (!header) {
- continue;
- }
- rowData[header as NonNullable] = cells[j]
- .textContent as string;
- }
- data.push(rowData);
- }
-
- // Filter out special lines and extract mutation information
- const filteredData: CsvRow[] = [];
- let mutationInfo: { num: string; type: string; date: string } | null = null;
-
- data.forEach((row) => {
- if (row["N° d'hist."].includes("Numéro de mutation :")) {
- mutationInfo = {
- num: "",
- type: "",
- date: "",
- };
- const rx =
- /Numéro de mutation : (.*), Type de mutation : (.*), Entrée en vigueur : (.*)/;
- const match = row["N° d'hist."].match(rx);
- if (match) {
- mutationInfo.num = match[1];
- mutationInfo.type = match[2];
- mutationInfo.date = match[3];
- }
- } else {
- if (mutationInfo) {
- row["Numéro de mutation"] = mutationInfo.num;
- row["Type de mutation"] = mutationInfo.type;
- row["Entrée en vigueur"] = mutationInfo.date;
- }
- filteredData.push(row);
- }
- });
-
- const mutations = z.array(row).parse(filteredData);
- const groupedMutations = groupBy(
- (mutation) => mutation["Numéro de mutation"]
- )(mutations);
-
- return groupedMutations;
-};
-
-type Row = z.infer;
+import { useQuery } from "react-query";
const MutationsMap = dynamic(() => import("../components/Mutations/Map"), {
ssr: false,
});
-const parseMutationRows = (rows: Row[]) => {
- const removed = rows.filter((r) => r["Raison de la radiation"]);
- const added = rows.filter((r) => r["Raison de l'inscription"]);
- return {
- label: `+ ${added
- .map((x) => x["Nom de la commune"])
- .join(", ")} / - ${removed
- .map((x) => x["Nom de la commune"])
- .join(", ")}`,
- added,
- removed,
- year: Number(rows[0]?.["Entrée en vigueur"].split(".")[2]),
- "Entrée en vigueur": rows[0]?.["Entrée en vigueur"],
- "Numéro de mutation": rows[0]?.["Numéro de mutation"],
- };
-};
-
-type Parsed = ReturnType;
-
const INITIAL_VIEW_STATE = {
latitude: 46.8182,
longitude: 8.2275,
@@ -149,22 +39,27 @@ const INITIAL_VIEW_STATE = {
};
export default function Page() {
- const [groupedMutations, setGroupedMutations] = useState<
- ReturnType[]
- >([]);
+ const [year1, setYear1] = useState("2022");
+ const [year2, setYear2] = useState("2024");
+ const { data: groupedMutations } = useQuery({
+ queryKey: ["mutations", year1, year2],
+ queryFn: async () => {
+ const mutations = (await (
+ await fetch(`/api/mutations?from=01.01.${year1}&to=01.01.${year2}`)
+ ).json()) as MunicipalityMigrationData;
+ console.log({ mutations });
+ return mutations;
+ },
+ });
const [highlightedMunicipalities, setHighlightedMunicipalities] =
- useState();
+ useState();
- const handleMutationSelect = (parsed: Parsed) => {
+ const handleMutationSelect = (parsed: MunicipalityMigrationDataItem) => {
setHighlightedMunicipalities(parsed);
- setYear1(`${parsed.year - 1}`);
- setYear2(`${parsed.year}`);
};
const [viewState, setViewState] = useState(INITIAL_VIEW_STATE);
- const [year1, setYear1] = useState("2022");
- const [year2, setYear2] = useState("2024");
const { data: geoData1 } = useGeoData({
year: year1,
format: "topojson",
@@ -188,7 +83,7 @@ export default function Page() {
});
useEffect(() => {
const { added = [], removed = [] } = highlightedMunicipalities ?? {};
- const all = [...added, ...removed].map((x) => x["N° OFS commune"]);
+ const all = [...added, ...removed].map((x) => x.ofsNumber);
const findFeature = (x: GeoDataFeature) => all.includes(x.properties?.id);
const municipality =
geoData1.municipalities?.features.find(findFeature) ??
@@ -213,17 +108,6 @@ export default function Page() {
}
}, [highlightedMunicipalities, geoData1, geoData2]);
- const handleChangeContent = (html: string) => {
- try {
- const data = Object.values(parseHTML(html));
- const groupedMutations = data.map(parseMutationRows);
- setGroupedMutations(groupedMutations);
- setHighlightedMunicipalities(groupedMutations[0]);
- } catch (e) {
- alert(e instanceof Error ? e.message : `${e}`);
- }
- };
-
return (
-
- Copy/paste here the HTML content of the mutation table, see for{" "}
-
- here
-
- . Choose display "100" elements to be able to copy all mutations. .
-
-
- {Object.values(groupedMutations).map((parsed, index) => {
+ {(groupedMutations ?? []).map((parsed, index) => {
return (
handleMutationSelect(parsed)}
>
+
+ {parsed.migrationNumber}
+
+
+ {parsed.label}
+ >
+ }
+ secondary={`${parsed.year}${
+ parsed.type ? `- ${parsed.type?.toLowerCase()}` : ""
+ }`}
/>
);
@@ -306,12 +196,11 @@ export default function Page() {
}
highlightedMunicipalities={{
added:
- highlightedMunicipalities?.added.map(
- (x) => x["N° OFS commune"]
- ) ?? [],
+ highlightedMunicipalities?.added.map((x) => x.ofsNumber) ??
+ [],
removed:
highlightedMunicipalities?.removed.map(
- (x) => x["N° OFS commune"]
+ (x) => x.ofsNumber
) ?? [],
}}
/>
@@ -325,12 +214,11 @@ export default function Page() {
viewState={viewState}
highlightedMunicipalities={{
added:
- highlightedMunicipalities?.added.map(
- (x) => x["N° OFS commune"]
- ) ?? [],
+ highlightedMunicipalities?.added.map((x) => x.ofsNumber) ??
+ [],
removed:
highlightedMunicipalities?.removed.map(
- (x) => x["N° OFS commune"]
+ (x) => x.ofsNumber
) ?? [],
}}
/>
diff --git a/website/yarn.lock b/website/yarn.lock
index 12de6be5..7de50ce9 100644
--- a/website/yarn.lock
+++ b/website/yarn.lock
@@ -2097,6 +2097,15 @@
resolved "https://registry.yarnpkg.com/@types/hammerjs/-/hammerjs-2.0.41.tgz#f6ecf57d1b12d2befcce00e928a6a097c22980aa"
integrity sha512-ewXv/ceBaJprikMcxCmWU1FKyMAQ2X7a9Gtmzw8fcg2kIePI1crERDM818W+XYrxqdBBOdlf2rm137bU+BltCA==
+"@types/jsdom@^21.1.7":
+ version "21.1.7"
+ resolved "https://registry.yarnpkg.com/@types/jsdom/-/jsdom-21.1.7.tgz#9edcb09e0b07ce876e7833922d3274149c898cfa"
+ integrity sha512-yOriVnggzrnQ3a9OKOCxaVuSug3w3/SbOj5i7VwXWZEyUNl3bLF9V3MfxGbZKuwqJOQyRfqXyROBB1CoZLFWzA==
+ dependencies:
+ "@types/node" "*"
+ "@types/tough-cookie" "*"
+ parse5 "^7.0.0"
+
"@types/node@*", "@types/node@^20.11.30":
version "20.11.30"
resolved "https://registry.yarnpkg.com/@types/node/-/node-20.11.30.tgz#9c33467fc23167a347e73834f788f4b9f399d66f"
@@ -2197,6 +2206,11 @@
"@types/topojson-simplify" "*"
"@types/topojson-specification" "*"
+"@types/tough-cookie@*":
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.5.tgz#cb6e2a691b70cb177c6e3ae9c1d2e8b2ea8cd304"
+ integrity sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==
+
"@xmldom/xmldom@^0.8.6":
version "0.8.6"
resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.8.6.tgz#8a1524eb5bd5e965c1e3735476f0262469f71440"
@@ -2207,6 +2221,13 @@ adm-zip@^0.5.9:
resolved "https://registry.yarnpkg.com/adm-zip/-/adm-zip-0.5.10.tgz#4a51d5ab544b1f5ce51e1b9043139b639afff45b"
integrity sha512-x0HvcHqVJNTPk/Bw8JbLWlWoo6Wwnsug0fnYYro1HBrjxZ3G7/AZk7Ahv8JwDe1uIcz8eBqvu86FuF1POiG7vQ==
+agent-base@^7.0.2, agent-base@^7.1.0:
+ version "7.1.1"
+ resolved "https://registry.yarnpkg.com/agent-base/-/agent-base-7.1.1.tgz#bdbded7dfb096b751a2a087eeeb9664725b2e317"
+ integrity sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==
+ dependencies:
+ debug "^4.3.4"
+
asap@~2.0.6:
version "2.0.6"
resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46"
@@ -2284,7 +2305,7 @@ clsx@^2.1.1:
resolved "https://registry.yarnpkg.com/clsx/-/clsx-2.1.1.tgz#eed397c9fd8bd882bfb18deab7102049a2f32999"
integrity sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==
-combined-stream@^1.0.6:
+combined-stream@^1.0.6, combined-stream@^1.0.8:
version "1.0.8"
resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
@@ -2360,6 +2381,13 @@ css-vendor@^2.0.8:
"@babel/runtime" "^7.8.3"
is-in-browser "^1.0.2"
+cssstyle@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/cssstyle/-/cssstyle-4.0.1.tgz#ef29c598a1e90125c870525490ea4f354db0660a"
+ integrity sha512-8ZYiJ3A/3OkDd093CBT/0UKDWry7ak4BdPTFP2+QEP7cmhouyq/Up709ASSj2cK02BbZiMgk7kYjZNS4QP5qrQ==
+ dependencies:
+ rrweb-cssom "^0.6.0"
+
csstype@^2.5.2:
version "2.6.13"
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.13.tgz#a6893015b90e84dd6e85d0e3b442a1e84f2dbe0f"
@@ -2631,6 +2659,26 @@ d3@^7.8.3:
d3-transition "3"
d3-zoom "3"
+data-urls@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/data-urls/-/data-urls-5.0.0.tgz#2f76906bce1824429ffecb6920f45a0b30f00dde"
+ integrity sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==
+ dependencies:
+ whatwg-mimetype "^4.0.0"
+ whatwg-url "^14.0.0"
+
+debug@4, debug@^4.3.4:
+ version "4.3.6"
+ resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.6.tgz#2ab2c38fbaffebf8aa95fdfe6d88438c7a13c52b"
+ integrity sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==
+ dependencies:
+ ms "2.1.2"
+
+decimal.js@^10.4.3:
+ version "10.4.3"
+ resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.4.3.tgz#1044092884d245d1b7f65725fa4ad4c6f781cc23"
+ integrity sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==
+
delaunator@5, delaunator@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/delaunator/-/delaunator-5.0.0.tgz#60f052b28bd91c9b4566850ebf7756efe821d81b"
@@ -2666,6 +2714,11 @@ earcut@^2.2.4:
resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.2.4.tgz#6d02fd4d68160c114825d06890a92ecaae60343a"
integrity sha512-/pjZsA1b4RPHbeWZQn66SWS8nZZWLQQ23oE3Eam7aroEFGEvwKAsJfZ9ytiEMycfzXWpca4FA9QIOehf7PocBQ==
+entities@^4.4.0:
+ version "4.5.0"
+ resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48"
+ integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==
+
fast-deep-equal@^3.1.3:
version "3.1.3"
resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525"
@@ -2697,6 +2750,15 @@ form-data@^2.2.0:
combined-stream "^1.0.6"
mime-types "^2.1.12"
+form-data@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+ integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.8"
+ mime-types "^2.1.12"
+
fp-ts@^2.16.0:
version "2.16.0"
resolved "https://registry.yarnpkg.com/fp-ts/-/fp-ts-2.16.0.tgz#64e03314dfc1c7ce5e975d3496ac14bc3eb7f92e"
@@ -2767,6 +2829,13 @@ hoist-non-react-statics@^3.3.2:
dependencies:
react-is "^16.7.0"
+html-encoding-sniffer@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/html-encoding-sniffer/-/html-encoding-sniffer-4.0.0.tgz#696df529a7cfd82446369dc5193e590a3735b448"
+ integrity sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==
+ dependencies:
+ whatwg-encoding "^3.1.1"
+
http-basic@^6.0.0:
version "6.0.0"
resolved "https://registry.yarnpkg.com/http-basic/-/http-basic-6.0.0.tgz#1d63df8f891e1e25e0c2c84d7a2d94702d6ae229"
@@ -2779,6 +2848,14 @@ http-basic@^6.0.0:
http-response-object "^3.0.1"
parse-cache-control "^1.0.1"
+http-proxy-agent@^7.0.2:
+ version "7.0.2"
+ resolved "https://registry.yarnpkg.com/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz#9a8b1f246866c028509486585f62b8f2c18c270e"
+ integrity sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==
+ dependencies:
+ agent-base "^7.1.0"
+ debug "^4.3.4"
+
http-response-object@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/http-response-object/-/http-response-object-3.0.2.tgz#7f435bb210454e4360d074ef1f989d5ea8aa9810"
@@ -2786,12 +2863,20 @@ http-response-object@^3.0.1:
dependencies:
"@types/node" "^10.0.3"
+https-proxy-agent@^7.0.5:
+ version "7.0.5"
+ resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-7.0.5.tgz#9e8b5013873299e11fab6fd548405da2d6c602b2"
+ integrity sha512-1e4Wqeblerz+tMKPIq2EMGiiWW1dIjZOksyHWSUm1rmuvw/how9hBHZ38lAGj5ID4Ik6EdkOw7NmWPy6LAwalw==
+ dependencies:
+ agent-base "^7.0.2"
+ debug "4"
+
hyphenate-style-name@^1.0.3:
version "1.0.4"
resolved "https://registry.yarnpkg.com/hyphenate-style-name/-/hyphenate-style-name-1.0.4.tgz#691879af8e220aea5750e8827db4ef62a54e361d"
integrity sha512-ygGZLjmXfPHj+ZWh6LwbC37l43MhfztxetbFCoYTM2VjkIUpeHgSNn7QIyVFj7YQ1Wl9Cbw5sholVJPzWvC2MQ==
-iconv-lite@0.6, iconv-lite@^0.6.3:
+iconv-lite@0.6, iconv-lite@0.6.3, iconv-lite@^0.6.3:
version "0.6.3"
resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.6.3.tgz#a52f80bf38da1952eb5c681790719871a1a72501"
integrity sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==
@@ -2838,6 +2923,11 @@ is-in-browser@^1.0.2, is-in-browser@^1.1.3:
resolved "https://registry.yarnpkg.com/is-in-browser/-/is-in-browser-1.1.3.tgz#56ff4db683a078c6082eb95dad7dc62e1d04f835"
integrity sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=
+is-potential-custom-element-name@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz#171ed6f19e3ac554394edf78caa05784a45bebb5"
+ integrity sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==
+
is-wsl@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz#1f16e4aa22b04d1336b66188a66af3c600c3a66d"
@@ -2858,6 +2948,33 @@ js-sha3@0.8.0:
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+jsdom@^25.0.0:
+ version "25.0.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-25.0.0.tgz#d1612b4ddab85af56821b2f731e15faae135f4e1"
+ integrity sha512-OhoFVT59T7aEq75TVw9xxEfkXgacpqAhQaYgP9y/fDqWQCMB/b1H66RfmPm/MaeaAIU9nDwMOVTlPN51+ao6CQ==
+ dependencies:
+ cssstyle "^4.0.1"
+ data-urls "^5.0.0"
+ decimal.js "^10.4.3"
+ form-data "^4.0.0"
+ html-encoding-sniffer "^4.0.0"
+ http-proxy-agent "^7.0.2"
+ https-proxy-agent "^7.0.5"
+ is-potential-custom-element-name "^1.0.1"
+ nwsapi "^2.2.12"
+ parse5 "^7.1.2"
+ rrweb-cssom "^0.7.1"
+ saxes "^6.0.0"
+ symbol-tree "^3.2.4"
+ tough-cookie "^4.1.4"
+ w3c-xmlserializer "^5.0.0"
+ webidl-conversions "^7.0.0"
+ whatwg-encoding "^3.1.1"
+ whatwg-mimetype "^4.0.0"
+ whatwg-url "^14.0.0"
+ ws "^8.18.0"
+ xml-name-validator "^5.0.0"
+
jss-plugin-camel-case@^10.5.1:
version "10.9.0"
resolved "https://registry.yarnpkg.com/jss-plugin-camel-case/-/jss-plugin-camel-case-10.9.0.tgz#4921b568b38d893f39736ee8c4c5f1c64670aaf7"
@@ -3050,6 +3167,11 @@ mproj@0.0.35:
geographiclib "1.48.0"
rw "~1.3.2"
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
msgpackr-extract@^3.0.1:
version "3.0.2"
resolved "https://registry.yarnpkg.com/msgpackr-extract/-/msgpackr-extract-3.0.2.tgz#e05ec1bb4453ddf020551bcd5daaf0092a2c279d"
@@ -3113,6 +3235,11 @@ node-gyp-build-optional-packages@5.0.7:
resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3"
integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==
+nwsapi@^2.2.12:
+ version "2.2.12"
+ resolved "https://registry.yarnpkg.com/nwsapi/-/nwsapi-2.2.12.tgz#fb6af5c0ec35b27b4581eb3bbad34ec9e5c696f8"
+ integrity sha512-qXDmcVlZV4XRtKFzddidpfVP4oMSGhga+xdMc25mv8kaLUHtgzCDhUxkrN8exkGdTlLNaXj7CV3GtON7zuGZ+w==
+
object-assign@^4, object-assign@^4.1.1:
version "4.1.1"
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
@@ -3142,6 +3269,13 @@ parse-cache-control@^1.0.1:
resolved "https://registry.yarnpkg.com/parse-cache-control/-/parse-cache-control-1.0.1.tgz#8eeab3e54fa56920fe16ba38f77fa21aacc2d74e"
integrity sha1-juqz5U+laSD+Fro493+iGqzC104=
+parse5@^7.0.0, parse5@^7.1.2:
+ version "7.1.2"
+ resolved "https://registry.yarnpkg.com/parse5/-/parse5-7.1.2.tgz#0736bebbfd77793823240a23b7fc5e010b7f8e32"
+ integrity sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==
+ dependencies:
+ entities "^4.4.0"
+
path-is-absolute@^1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f"
@@ -3205,11 +3339,26 @@ prop-types@^15.6.2, prop-types@^15.7.2:
object-assign "^4.1.1"
react-is "^16.8.1"
+psl@^1.1.33:
+ version "1.9.0"
+ resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+punycode@^2.1.1, punycode@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5"
+ integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==
+
qs@^6.4.0:
version "6.9.4"
resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.4.tgz#9090b290d1f91728d3c22e54843ca44aea5ab687"
integrity sha512-A1kFqHekCTM7cz0udomYUoYNWjBebHm/5wzU/XqrBRBNWectVH0QIiN+NEcZ0Dte5hvzHwbr8+XQmguPhJ6WdQ==
+querystringify@^2.1.1:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
+ integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
+
quickselect@^1.0.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/quickselect/-/quickselect-1.1.1.tgz#852e412ce418f237ad5b660d70cffac647ae94c2"
@@ -3308,6 +3457,11 @@ remove-accents@0.4.2:
resolved "https://registry.yarnpkg.com/remove-accents/-/remove-accents-0.4.2.tgz#0a43d3aaae1e80db919e07ae254b285d9e1c7bb5"
integrity sha512-7pXIJqJOq5tFgG1A2Zxti3Ht8jJF337m4sowbuHsW30ZnkQFnDzy9qBNhgzX8ZLW4+UBcXiiR7SwR6pokHsxiA==
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
rimraf@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
@@ -3330,6 +3484,16 @@ robust-predicates@^3.0.2:
resolved "https://registry.yarnpkg.com/robust-predicates/-/robust-predicates-3.0.2.tgz#d5b28528c4824d20fc48df1928d41d9efa1ad771"
integrity sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==
+rrweb-cssom@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.6.0.tgz#ed298055b97cbddcdeb278f904857629dec5e0e1"
+ integrity sha512-APM0Gt1KoXBz0iIkkdB/kfvGOwC4UuJFeG/c+yV7wSc7q96cG/kJ0HiYCnzivD9SB53cLV1MlHFNfOuPaadYSw==
+
+rrweb-cssom@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/rrweb-cssom/-/rrweb-cssom-0.7.1.tgz#c73451a484b86dd7cfb1e0b2898df4b703183e4b"
+ integrity sha512-TrEMa7JGdVm0UThDJSx7ddw5nVm3UJS9o9CCIZ72B1vSyEZoziDqBYP3XIoi/12lKrJR8rE3jeFHMok2F/Mnsg==
+
rw@1, rw@~1.3.2, rw@~1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
@@ -3350,6 +3514,13 @@ safe-buffer@~5.1.0, safe-buffer@~5.1.1:
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+saxes@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/saxes/-/saxes-6.0.0.tgz#fe5b4a4768df4f14a201b1ba6a65c1f3d9988cc5"
+ integrity sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==
+ dependencies:
+ xmlchars "^2.2.0"
+
scheduler@^0.23.0:
version "0.23.0"
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.23.0.tgz#ba8041afc3d30eb206a487b6b384002e4e61fdfe"
@@ -3398,6 +3569,11 @@ swiss-maps@^4.5.0:
resolved "https://registry.yarnpkg.com/swiss-maps/-/swiss-maps-4.5.0.tgz#070a1b3e0661556424299d2b0c2ec5fe697d25fe"
integrity sha512-1NfF4mZF5Uf4epd2UbR/L13rZ8DluJ65cSEwWb+eA9mLQM7oE86SpUeKn1POGb+yrHAEZU3yuTtVwN87f5bcDQ==
+symbol-tree@^3.2.4:
+ version "3.2.4"
+ resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2"
+ integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==
+
sync-request@5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/sync-request/-/sync-request-5.0.0.tgz#b815d5c6e16193392ec4139a4881db5e90e88676"
@@ -3491,6 +3667,23 @@ topojson@^3.0.2:
topojson-server "3.0.0"
topojson-simplify "3.0.2"
+tough-cookie@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.4.tgz#945f1461b45b5a8c76821c33ea49c3ac192c1b36"
+ integrity sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==
+ dependencies:
+ psl "^1.1.33"
+ punycode "^2.1.1"
+ universalify "^0.2.0"
+ url-parse "^1.5.3"
+
+tr46@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/tr46/-/tr46-5.0.0.tgz#3b46d583613ec7283020d79019f1335723801cec"
+ integrity sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==
+ dependencies:
+ punycode "^2.3.1"
+
tslib@^2.4.0:
version "2.5.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.5.0.tgz#42bfed86f5787aeb41d031866c8f402429e0fddf"
@@ -3521,6 +3714,11 @@ undici-types@~5.26.4:
resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-5.26.5.tgz#bcd539893d00b56e964fd2657a4866b221a65617"
integrity sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==
+universalify@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
+ integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
+
unload@2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/unload/-/unload-2.2.0.tgz#ccc88fdcad345faa06a92039ec0f80b488880ef7"
@@ -3529,6 +3727,14 @@ unload@2.2.0:
"@babel/runtime" "^7.6.2"
detect-node "^2.0.4"
+url-parse@^1.5.3:
+ version "1.5.10"
+ resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
+ integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
+ dependencies:
+ querystringify "^2.1.1"
+ requires-port "^1.0.0"
+
use-immer@^0.10.0:
version "0.10.0"
resolved "https://registry.yarnpkg.com/use-immer/-/use-immer-0.10.0.tgz#ed23afd424454604cb42bc112a455bddba894309"
@@ -3544,11 +3750,58 @@ vary@^1:
resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc"
integrity sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=
+w3c-xmlserializer@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/w3c-xmlserializer/-/w3c-xmlserializer-5.0.0.tgz#f925ba26855158594d907313cedd1476c5967f6c"
+ integrity sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==
+ dependencies:
+ xml-name-validator "^5.0.0"
+
+webidl-conversions@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz#256b4e1882be7debbf01d05f0aa2039778ea080a"
+ integrity sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==
+
+whatwg-encoding@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/whatwg-encoding/-/whatwg-encoding-3.1.1.tgz#d0f4ef769905d426e1688f3e34381a99b60b76e5"
+ integrity sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==
+ dependencies:
+ iconv-lite "0.6.3"
+
+whatwg-mimetype@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-mimetype/-/whatwg-mimetype-4.0.0.tgz#bc1bf94a985dc50388d54a9258ac405c3ca2fc0a"
+ integrity sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==
+
+whatwg-url@^14.0.0:
+ version "14.0.0"
+ resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-14.0.0.tgz#00baaa7fd198744910c4b1ef68378f2200e4ceb6"
+ integrity sha512-1lfMEm2IEr7RIV+f4lUNPOqfFL+pO+Xw3fJSqmjX9AbXcXcYOkCe1P6+9VBZB6n94af16NfZf+sSk0JCBZC9aw==
+ dependencies:
+ tr46 "^5.0.0"
+ webidl-conversions "^7.0.0"
+
wrappy@1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+ws@^8.18.0:
+ version "8.18.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.18.0.tgz#0d7505a6eafe2b0e712d232b42279f53bc289bbc"
+ integrity sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==
+
+xml-name-validator@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/xml-name-validator/-/xml-name-validator-5.0.0.tgz#82be9b957f7afdacf961e5980f1bf227c0bf7673"
+ integrity sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==
+
+xmlchars@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/xmlchars/-/xmlchars-2.2.0.tgz#060fe1bcb7f9c76fe2a17db86a9bc3ab894210cb"
+ integrity sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==
+
zod@^3.23.8:
version "3.23.8"
resolved "https://registry.yarnpkg.com/zod/-/zod-3.23.8.tgz#e37b957b5d52079769fb8097099b592f0ef4067d"