From f1c702bc14b088af2012820744bc5140296591a1 Mon Sep 17 00:00:00 2001 From: soraefir Date: Thu, 27 Feb 2025 00:55:37 +0100 Subject: [PATCH] Wip --- .gitignore | 1 + package.json | 9 +- public/css/index.css | 247 +++++++++++++++-- src/client/main.ts | 2 +- src/client/old.js | 332 +++++++++++------------ src/client/types/geom.ts | 3 - src/client/types/wrapper.ts | 2 +- src/client/vue.ts | 192 ++++++++++++++ src/server/api.ts | 5 +- template/module/foot.pug | 12 +- template/module/map.pug | 33 ++- tsconfig-client.json | 19 +- yarn.lock | 510 +++++++++++++++++++++++++++++++++++- 13 files changed, 1126 insertions(+), 241 deletions(-) create mode 100644 src/client/vue.ts diff --git a/.gitignore b/.gitignore index 9d3debb..b60d94f 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,4 @@ db/ public/*.js public/*.map .yarnrc.yml +build/ \ No newline at end of file diff --git a/package.json b/package.json index ea3c71d..9aeb0f2 100644 --- a/package.json +++ b/package.json @@ -25,9 +25,14 @@ "esbuild": "^0.25.0", "fastify": "^5.2.1", "jsdom": "^26.0.0", + "leaflet": "^1.9.4", "nodemon": "^3.0.1", "prettier": "^3.5.2", "pug": "^3.0.2", - "undici": "^7.3.0" + "undici": "^7.3.0", + "vue": "2", + "vue-multiselect": "2", + "vue-textarea-autosize": "^1.1.1", + "vue2-leaflet": "^2.7.1" } -} \ No newline at end of file +} diff --git a/public/css/index.css b/public/css/index.css index a04cbc2..73a2fcb 100644 --- a/public/css/index.css +++ b/public/css/index.css @@ -253,7 +253,7 @@ } } -.section + .section { +.section+.section { padding-top: 0; } @@ -424,10 +424,10 @@ a:focus { margin-bottom: 0 !important; } -.text-withSubtitle + .text-huge, -.text-withSubtitle + .text-big, -.text-withSubtitle + .text-medium, -.text-withSubtitle + .text-small { +.text-withSubtitle+.text-huge, +.text-withSubtitle+.text-big, +.text-withSubtitle+.text-medium, +.text-withSubtitle+.text-small { margin-top: 0.5em; } @@ -858,7 +858,7 @@ input:-webkit-autofill { display: none; } -.checkbox input[type="checkbox"]:checked + label::after { +.checkbox input[type="checkbox"]:checked+label::after { -webkit-animation: checkboxAndRadioAnimation 0.25s; animation: checkboxAndRadioAnimation 0.25s; content: ""; @@ -866,7 +866,7 @@ input:-webkit-autofill { transform: scale(1) rotate(45deg); } -.checkbox input[type="checkbox"] + label { +.checkbox input[type="checkbox"]+label { display: block; overflow: hidden; padding-left: 30px; @@ -874,7 +874,7 @@ input:-webkit-autofill { white-space: nowrap; } -.checkbox input[type="checkbox"] + label::before { +.checkbox input[type="checkbox"]+label::before { background-color: #eceff1; border: 1px solid #d5d9db; border-radius: 3px; @@ -888,7 +888,7 @@ input:-webkit-autofill { width: 20px; } -.checkbox input[type="checkbox"] + label::after { +.checkbox input[type="checkbox"]+label::after { border-bottom: 3px solid #03a9f4; border-right: 3px solid #03a9f4; display: block; @@ -911,7 +911,7 @@ input:-webkit-autofill { display: none; } -.radio input[type="radio"]:checked + label::after { +.radio input[type="radio"]:checked+label::after { -webkit-animation: checkboxAndRadioAnimation 0.25s; animation: checkboxAndRadioAnimation 0.25s; content: ""; @@ -919,7 +919,7 @@ input:-webkit-autofill { transform: scale(1) rotate(45deg); } -.radio input[type="radio"] + label { +.radio input[type="radio"]+label { display: block; overflow: hidden; padding-left: 30px; @@ -927,7 +927,7 @@ input:-webkit-autofill { white-space: nowrap; } -.radio input[type="radio"] + label::before { +.radio input[type="radio"]+label::before { background-color: #eceff1; border: 1px solid #d5d9db; border-radius: 20px; @@ -941,7 +941,7 @@ input:-webkit-autofill { width: 20px; } -.radio input[type="radio"] + label::after { +.radio input[type="radio"]+label::after { background-color: #03a9f4; border-radius: 20px; display: block; @@ -960,10 +960,12 @@ input:-webkit-autofill { -webkit-transform: scale(0) rotate(45deg); transform: scale(0) rotate(45deg); } + 50% { -webkit-transform: scale(1.5) rotate(45deg); transform: scale(1.5) rotate(45deg); } + 100% { -webkit-transform: scale(1) rotate(45deg); transform: scale(1) rotate(45deg); @@ -975,10 +977,12 @@ input:-webkit-autofill { -webkit-transform: scale(0) rotate(45deg); transform: scale(0) rotate(45deg); } + 50% { -webkit-transform: scale(1.5) rotate(45deg); transform: scale(1.5) rotate(45deg); } + 100% { -webkit-transform: scale(1) rotate(45deg); transform: scale(1) rotate(45deg); @@ -1140,18 +1144,23 @@ input:-webkit-autofill { left: -300px; width: 30%; } + 50% { width: 30%; } + 70% { width: 70%; } + 80% { left: 50%; } + 95% { left: 120%; } + to { left: 100%; } @@ -1162,18 +1171,23 @@ input:-webkit-autofill { left: -300px; width: 30%; } + 50% { width: 30%; } + 70% { width: 70%; } + 80% { left: 50%; } + 95% { left: 120%; } + to { left: 100%; } @@ -1254,18 +1268,22 @@ input:-webkit-autofill { -webkit-transform: rotate(0); transform: rotate(0); } + 25% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } + 50% { -webkit-transform: rotate(180deg); transform: rotate(180deg); } + 75% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); @@ -1277,18 +1295,22 @@ input:-webkit-autofill { -webkit-transform: rotate(0); transform: rotate(0); } + 25% { -webkit-transform: rotate(90deg); transform: rotate(90deg); } + 50% { -webkit-transform: rotate(180deg); transform: rotate(180deg); } + 75% { -webkit-transform: rotate(270deg); transform: rotate(270deg); } + 100% { -webkit-transform: rotate(360deg); transform: rotate(360deg); @@ -1300,10 +1322,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(4.5px, 4.5px, 0); transform: translate3d(4.5px, 4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1315,10 +1339,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(4.5px, 4.5px, 0); transform: translate3d(4.5px, 4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1330,10 +1356,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(-4.5px, 4.5px, 0); transform: translate3d(-4.5px, 4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1345,10 +1373,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(-4.5px, 4.5px, 0); transform: translate3d(-4.5px, 4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1360,10 +1390,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(-4.5px, -4.5px, 0); transform: translate3d(-4.5px, -4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1375,10 +1407,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(-4.5px, -4.5px, 0); transform: translate3d(-4.5px, -4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1390,10 +1424,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(4.5px, -4.5px, 0); transform: translate3d(4.5px, -4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1405,10 +1441,12 @@ input:-webkit-autofill { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } + 50% { -webkit-transform: translate3d(4.5px, -4.5px, 0); transform: translate3d(4.5px, -4.5px, 0); } + 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); @@ -1641,6 +1679,7 @@ input:-webkit-autofill { } @media (min-width: 576px) { + .table--responsive th, .table--responsive td { border-top: 1px solid #d5d9db; @@ -1797,8 +1836,8 @@ input:-webkit-autofill { margin-right: 0; } -.no-gutters > .col, -.no-gutters > [class*="col-"] { +.no-gutters>.col, +.no-gutters>[class*="col-"] { padding-left: 0; padding-right: 0; } @@ -2054,131 +2093,169 @@ input:-webkit-autofill { flex-grow: 1; max-width: 100%; } + .col-sm-auto { flex: 0 0 auto; width: auto; max-width: none; } + .col-sm-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } + .col-sm-2 { flex: 0 0 16.66667%; max-width: 16.66667%; } + .col-sm-3 { flex: 0 0 25%; max-width: 25%; } + .col-sm-4 { flex: 0 0 33.33333%; max-width: 33.33333%; } + .col-sm-5 { flex: 0 0 41.66667%; max-width: 41.66667%; } + .col-sm-6 { flex: 0 0 50%; max-width: 50%; } + .col-sm-7 { flex: 0 0 58.33333%; max-width: 58.33333%; } + .col-sm-8 { flex: 0 0 66.66667%; max-width: 66.66667%; } + .col-sm-9 { flex: 0 0 75%; max-width: 75%; } + .col-sm-10 { flex: 0 0 83.33333%; max-width: 83.33333%; } + .col-sm-11 { flex: 0 0 91.66667%; max-width: 91.66667%; } + .col-sm-12 { flex: 0 0 100%; max-width: 100%; } + .order-sm-first { order: -1; } + .order-sm-1 { order: 1; } + .order-sm-2 { order: 2; } + .order-sm-3 { order: 3; } + .order-sm-4 { order: 4; } + .order-sm-5 { order: 5; } + .order-sm-6 { order: 6; } + .order-sm-7 { order: 7; } + .order-sm-8 { order: 8; } + .order-sm-9 { order: 9; } + .order-sm-10 { order: 10; } + .order-sm-11 { order: 11; } + .order-sm-12 { order: 12; } + .offset-sm-0 { margin-left: 0; } + .offset-sm-1 { margin-left: 8.33333%; } + .offset-sm-2 { margin-left: 16.66667%; } + .offset-sm-3 { margin-left: 25%; } + .offset-sm-4 { margin-left: 33.33333%; } + .offset-sm-5 { margin-left: 41.66667%; } + .offset-sm-6 { margin-left: 50%; } + .offset-sm-7 { margin-left: 58.33333%; } + .offset-sm-8 { margin-left: 66.66667%; } + .offset-sm-9 { margin-left: 75%; } + .offset-sm-10 { margin-left: 83.33333%; } + .offset-sm-11 { margin-left: 91.66667%; } @@ -2190,131 +2267,169 @@ input:-webkit-autofill { flex-grow: 1; max-width: 100%; } + .col-md-auto { flex: 0 0 auto; width: auto; max-width: none; } + .col-md-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } + .col-md-2 { flex: 0 0 16.66667%; max-width: 16.66667%; } + .col-md-3 { flex: 0 0 25%; max-width: 25%; } + .col-md-4 { flex: 0 0 33.33333%; max-width: 33.33333%; } + .col-md-5 { flex: 0 0 41.66667%; max-width: 41.66667%; } + .col-md-6 { flex: 0 0 50%; max-width: 50%; } + .col-md-7 { flex: 0 0 58.33333%; max-width: 58.33333%; } + .col-md-8 { flex: 0 0 66.66667%; max-width: 66.66667%; } + .col-md-9 { flex: 0 0 75%; max-width: 75%; } + .col-md-10 { flex: 0 0 83.33333%; max-width: 83.33333%; } + .col-md-11 { flex: 0 0 91.66667%; max-width: 91.66667%; } + .col-md-12 { flex: 0 0 100%; max-width: 100%; } + .order-md-first { order: -1; } + .order-md-1 { order: 1; } + .order-md-2 { order: 2; } + .order-md-3 { order: 3; } + .order-md-4 { order: 4; } + .order-md-5 { order: 5; } + .order-md-6 { order: 6; } + .order-md-7 { order: 7; } + .order-md-8 { order: 8; } + .order-md-9 { order: 9; } + .order-md-10 { order: 10; } + .order-md-11 { order: 11; } + .order-md-12 { order: 12; } + .offset-md-0 { margin-left: 0; } + .offset-md-1 { margin-left: 8.33333%; } + .offset-md-2 { margin-left: 16.66667%; } + .offset-md-3 { margin-left: 25%; } + .offset-md-4 { margin-left: 33.33333%; } + .offset-md-5 { margin-left: 41.66667%; } + .offset-md-6 { margin-left: 50%; } + .offset-md-7 { margin-left: 58.33333%; } + .offset-md-8 { margin-left: 66.66667%; } + .offset-md-9 { margin-left: 75%; } + .offset-md-10 { margin-left: 83.33333%; } + .offset-md-11 { margin-left: 91.66667%; } @@ -2326,131 +2441,169 @@ input:-webkit-autofill { flex-grow: 1; max-width: 100%; } + .col-lg-auto { flex: 0 0 auto; width: auto; max-width: none; } + .col-lg-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } + .col-lg-2 { flex: 0 0 16.66667%; max-width: 16.66667%; } + .col-lg-3 { flex: 0 0 25%; max-width: 25%; } + .col-lg-4 { flex: 0 0 33.33333%; max-width: 33.33333%; } + .col-lg-5 { flex: 0 0 41.66667%; max-width: 41.66667%; } + .col-lg-6 { flex: 0 0 50%; max-width: 50%; } + .col-lg-7 { flex: 0 0 58.33333%; max-width: 58.33333%; } + .col-lg-8 { flex: 0 0 66.66667%; max-width: 66.66667%; } + .col-lg-9 { flex: 0 0 75%; max-width: 75%; } + .col-lg-10 { flex: 0 0 83.33333%; max-width: 83.33333%; } + .col-lg-11 { flex: 0 0 91.66667%; max-width: 91.66667%; } + .col-lg-12 { flex: 0 0 100%; max-width: 100%; } + .order-lg-first { order: -1; } + .order-lg-1 { order: 1; } + .order-lg-2 { order: 2; } + .order-lg-3 { order: 3; } + .order-lg-4 { order: 4; } + .order-lg-5 { order: 5; } + .order-lg-6 { order: 6; } + .order-lg-7 { order: 7; } + .order-lg-8 { order: 8; } + .order-lg-9 { order: 9; } + .order-lg-10 { order: 10; } + .order-lg-11 { order: 11; } + .order-lg-12 { order: 12; } + .offset-lg-0 { margin-left: 0; } + .offset-lg-1 { margin-left: 8.33333%; } + .offset-lg-2 { margin-left: 16.66667%; } + .offset-lg-3 { margin-left: 25%; } + .offset-lg-4 { margin-left: 33.33333%; } + .offset-lg-5 { margin-left: 41.66667%; } + .offset-lg-6 { margin-left: 50%; } + .offset-lg-7 { margin-left: 58.33333%; } + .offset-lg-8 { margin-left: 66.66667%; } + .offset-lg-9 { margin-left: 75%; } + .offset-lg-10 { margin-left: 83.33333%; } + .offset-lg-11 { margin-left: 91.66667%; } @@ -2462,131 +2615,169 @@ input:-webkit-autofill { flex-grow: 1; max-width: 100%; } + .col-xl-auto { flex: 0 0 auto; width: auto; max-width: none; } + .col-xl-1 { flex: 0 0 8.33333%; max-width: 8.33333%; } + .col-xl-2 { flex: 0 0 16.66667%; max-width: 16.66667%; } + .col-xl-3 { flex: 0 0 25%; max-width: 25%; } + .col-xl-4 { flex: 0 0 33.33333%; max-width: 33.33333%; } + .col-xl-5 { flex: 0 0 41.66667%; max-width: 41.66667%; } + .col-xl-6 { flex: 0 0 50%; max-width: 50%; } + .col-xl-7 { flex: 0 0 58.33333%; max-width: 58.33333%; } + .col-xl-8 { flex: 0 0 66.66667%; max-width: 66.66667%; } + .col-xl-9 { flex: 0 0 75%; max-width: 75%; } + .col-xl-10 { flex: 0 0 83.33333%; max-width: 83.33333%; } + .col-xl-11 { flex: 0 0 91.66667%; max-width: 91.66667%; } + .col-xl-12 { flex: 0 0 100%; max-width: 100%; } + .order-xl-first { order: -1; } + .order-xl-1 { order: 1; } + .order-xl-2 { order: 2; } + .order-xl-3 { order: 3; } + .order-xl-4 { order: 4; } + .order-xl-5 { order: 5; } + .order-xl-6 { order: 6; } + .order-xl-7 { order: 7; } + .order-xl-8 { order: 8; } + .order-xl-9 { order: 9; } + .order-xl-10 { order: 10; } + .order-xl-11 { order: 11; } + .order-xl-12 { order: 12; } + .offset-xl-0 { margin-left: 0; } + .offset-xl-1 { margin-left: 8.33333%; } + .offset-xl-2 { margin-left: 16.66667%; } + .offset-xl-3 { margin-left: 25%; } + .offset-xl-4 { margin-left: 33.33333%; } + .offset-xl-5 { margin-left: 41.66667%; } + .offset-xl-6 { margin-left: 50%; } + .offset-xl-7 { margin-left: 58.33333%; } + .offset-xl-8 { margin-left: 66.66667%; } + .offset-xl-9 { margin-left: 75%; } + .offset-xl-10 { margin-left: 83.33333%; } + .offset-xl-11 { margin-left: 91.66667%; } @@ -2643,10 +2834,12 @@ body { } @media screen and (max-width: 550px) { + .example1, .example2 { max-width: 100%; } + .example1 img, .example2 img { width: 100% !important; @@ -2657,7 +2850,7 @@ body { font-size: 14px; } -:not(pre) > code[class*="language-"], +:not(pre)>code[class*="language-"], pre[class*="language-"] { background-color: #eceff1 !important; } @@ -2926,3 +3119,25 @@ li { display: block; padding: 0.5rem 1.5rem; } + + + + +.custom-pin { + position: relative; + width: 32px; + height: 32px; + background-color: #ff5733; + border-radius: 50%; +} + +.custom-pin::after { + content: ""; + position: absolute; + bottom: -10px; + left: 50%; + transform: translateX(-50%); + border-left: 10px solid transparent; + border-right: 10px solid transparent; + background-color: 15px solid #ff5733; +} \ No newline at end of file diff --git a/src/client/main.ts b/src/client/main.ts index 10b982f..a443417 100644 --- a/src/client/main.ts +++ b/src/client/main.ts @@ -1,4 +1,4 @@ import "./types/ext"; import "./types/format"; import "./api"; -import "./old.js"; +import "./vue"; diff --git a/src/client/old.js b/src/client/old.js index d92a4d4..42cb379 100644 --- a/src/client/old.js +++ b/src/client/old.js @@ -16,194 +16,172 @@ Vue.component("multiselect", window.VueMultiselect.default); Vue.use(window.VueTextareaAutosize); const app = new Vue({ - el: "#app", - data: { - journey_edit: - ["view", "short"].indexOf(window.location.pathname.split("/")[1]) == -1, - journey: new journey_wrapper(window.location.pathname.split("/").pop() || String.gen_id(16)), + el: "#app", + data: { + journey_edit: + ["view", "short"].indexOf(window.location.pathname.split("/")[1]) == -1, + journey: new journey_wrapper(window.location.pathname.split("/").pop() || String.gen_id(16)), - query: { - type: "", - act: false, - res: [], - }, - impexp: "", - lang: { - format: "ddd D MMM", - formatLocale: { - firstDayOfWeek: 1, - }, - monthBeforeYear: true, - }, - polyline: { - latlngs: [], - color: 'green' - } - }, - methods: { - start_journey: function () { window.location.href = "/" + this.journey.id }, + query: { + type: "", + act: false, + res: [], + }, + impexp: "", + lang: { + format: "ddd D MMM", + formatLocale: { + firstDayOfWeek: 1, + }, + monthBeforeYear: true, + }, + polyline: { + latlngs: [], + color: 'green' + } + }, + methods: { + start_journey: function () { window.location.href = "/" + this.journey.id }, - compute_bb: function () { - const map = this.$refs.map[0].mapObject; - var bounds = map.getBounds(); - var minLng = bounds.getSouthWest().lng; - var minLat = bounds.getSouthWest().lat; - var maxLng = bounds.getNorthEast().lng; - var maxLat = bounds.getNorthEast().lat; - return [[minLng, minLat], [maxLng, maxLat]] - }, + compute_bb: function () { + const bounds = this.$refs.map[0].mapObject.getBounds(); + return [[bounds.getSouthWest().lng, bounds.getSouthWest().lat], + [bounds.getNorthEast().lng, bounds.getNorthEast().lat]] + }, + generate_rotation: function (index, list) { + if (index < 0 || index >= list.length) return 0; + const c0 = list[(index == 0) ? index : (index - 1)] + const c1 = list[(index == list.length - 1) ? index : (index + 1)] + const brng = Math.atan2(c1[1] - c0[1], c1[0] - c0[0]); + return `rotate:${brng - Math.PI / 2}rad`; - generate_marker: function (item, fcolor) { - return L.AwesomeMarkers.icon({ - iconAnchor: [12, 36], - icon: api.icon_type(item) || "star", - prefix: "fa", - markerColor: fcolor || item.color || "blue", - }).createIcon().outerHTML; - }, + }, + generate_marker: function (item, fcolor) { + return ` +
+ + + + ` + }, + generate_icon: function (item, fcolor, styling = "") { + return ``; + }, - generate_rotation: function (index, list) { - if (index < 0 || index >= list.length) return 0; - let c0, c1; - if (index == 0) { - c0 = list[index] - c1 = list[index + 1] - } else if (index == list.length - 1) { - c0 = list[index - 1] - c1 = list[index] - } else { - c0 = list[index - 1]; - c1 = list[index + 1]; - } - const dx = c1[0] - c0[0]; - const dy = c1[1] - c0[1]; - const brng = Math.atan2(dy, dx); - return `rotate:${brng - Math.PI / 2}rad`;// * (180 / Math.PI); // Convert from radians to degrees - }, + import_data: function () { + this.journey.data = Object.assign( + {}, + JSON.parse(this.impexp.toDecoded()), + ); + this.journey.data.main.forEach((e) => { + if (e.date_range) { + e.date_range[0] = new Date(e.date_range[0]); + e.date_range[1] = new Date(e.date_range[1]); + } + }); + }, + export_data: function () { + this.impexp = JSON.stringify(this.journey.data).toEncoded(); + }, + filter_selected: function (list, step) { + return list.filter((e) => + step ? e.step == this.journey.sel_day : e.step >= 0, + ); + }, + filter_unselected: function (list) { + return list.filter((e) => e.step == undefined || e.step < 0); + }, + remove_item: function (list, idx) { + list[idx].step = -1; + list.splice(idx, 1); + }, + log: function (e) { + console.log(e); + }, - generate_icon: function (item, fcolor, styling = "") { - return ``; - }, + get_filter: function (f) { + switch (f) { + case "hotel": return api.is_hotel_type; + case "restaurant": return api.is_restauration_type; + case "place": return api.is_attraction_type; + case "other": + default: return () => true; + } + }, - save_data: function () { - api.throttle(() => { - this.impexp = JSON.stringify(this.journey.data).toEncoded(); - api.save(this.journey.id, this.journey.data); - }, 1000); - }, - import_data: function () { - this.journey.data = Object.assign( - {}, - JSON.parse(this.impexp.toDecoded()), - ); - this.journey.data.main.forEach((e) => { - if (e.date_range) { - e.date_range[0] = new Date(e.date_range[0]); - e.date_range[1] = new Date(e.date_range[1]); - } - }); - }, - export_data: function () { - this.impexp = JSON.stringify(this.journey.data).toEncoded(); - }, - filter_selected: function (list, step) { - return list.filter((e) => - step ? e.step == this.journey.sel_day : e.step >= 0, - ); - }, - filter_unselected: function (list) { - return list.filter((e) => e.step == undefined || e.step < 0); - }, - remove_item: function (list, idx) { - list[idx].step = -1; - list.splice(idx, 1); - }, - log: function (e) { - console.log(e); - }, + search_nominatim: function (f) { + return (q) => { + this.query.act = true; + this.query.type = f; + return api.query_nominatim(q, this.compute_bb(), this.get_filter(f)).catch((_err) => []).then((r) => { + r.forEach((rr) => { + rr.latlon = [parseFloat(rr.lat), parseFloat(rr.lon)]; + rr.sname = rr.display_name.split(",")[0]; + }); + this.query.res = r; + this.query.act = false; + return r + }); + } + }, + search_travel: function (f) { + return (q) => { + this.query.act = true; + this.query.type = f; + return api.query_flight(q).then((r) => { + r.forEach(el => el.path = getGeoLine( + new L.LatLng(el.from_geo.lat, el.from_geo.lon), + new L.LatLng(el.to_geo.lat, el.to_geo.lon), { dist: 5_000_000 }).map(v => [v.lat, v.lng])); + this.query.res = r; + this.query.act = false; + return r; + }); + } + }, - get_filter: function (f) { - switch (f) { - case "hotel": return api.is_hotel_type; - case "restaurant": return api.is_restauration_type; - case "place": return api.is_attraction_type; - case "other": - default: return () => true; - } - }, + keyboardEvent(e) { + if (e.which === 13) { + } + }, + }, + created: function () { - search_nominatim: function (f) { - return (q) => { - this.query.act = true; - this.query.type = f; - return api.query_nominatim(q, this.compute_bb(), this.get_filter(f)).catch((_err) => []).then((r) => { - r.forEach((rr) => { - rr.latlon = [parseFloat(rr.lat), parseFloat(rr.lon)]; - rr.sname = rr.display_name.split(",")[0]; - }); - this.query.res = r; - this.query.act = false; - }); - } - }, - // break; - // case "flight": { - // return api.query_flight(q).then((r) => { - // // r.path = r.map(el => getGeoLine( - // // new L.LatLng(el.from_geo.lat, el.from_geo.lon), - // // new L.LatLng(el.to_geo.lat, el.to_geo.lon), { dist: 10_000_000 }).map(v => [v.lat, v.lng])); - // this.query.res = r; - // this.query.actt = false; - // }); - // } break; - // default: - // console.log(`Query not yet setup: ${k}`) - // } - // } - // }, + this.search_hotel = api.throttle(this.search_nominatim("hotel"), 1000) + this.search_restaurant = api.throttle(this.search_nominatim("restaurant"), 1000) + this.search_place = api.throttle(this.search_nominatim("place"), 1000) + this.save_data = api.throttle(() => { + this.impexp = JSON.stringify(this.journey.data).toEncoded(); + api.save(this.journey.id, this.journey.data); + }, 1000); + this.search_flight = api.throttle(this.search_travel("flight"), 2000) - keyboardEvent(e) { - if (e.which === 13) { - } - }, - }, - created: function () { + window.addEventListener("keydown", (e) => { + switch (e.key) { + case "ArrowLeft": + this.journey.day_prev(); + break; + case "ArrowRight": + this.journey.day_next(); + break; + default: + console.log(e.key); + } + }); - this.search_hotel = api.throttle(this.search_nominatim("hotel"), 1000) - this.search_restaurant = api.throttle(this.search_nominatim("restaurant"), 1000) - this.search_place = api.throttle(this.search_nominatim("place"), 1000) - // this.search_flight = api.throttle(this.search_travel(), 2000) + api.load(this.journey.id).then((r) => (app.journey.data = migrator(r))); - window.addEventListener("keydown", (e) => { - switch (e.key) { - case "ArrowLeft": - this.journey.day_prev(); - break; - case "ArrowRight": - this.journey.day_next(); - break; - default: - console.log(e.key); - } - }); + this.search_travel("flight")("qf1").then(r => { + this.polyline.latlngs = r.map(e => e.path) + }); - api.load(this.journey.id).then((r) => (app.journey.data = migrator(r))); - - // api.query_flight("qf1").then(r => { - // this.polyline.latlngs = r.map(el => getGeoLine( - // new L.LatLng(el.from_geo.lat, el.from_geo.lon), - // new L.LatLng(el.to_geo.lat, el.to_geo.lon), { dist: 5_000_000 }).map(v => [v.lat, v.lng])); - // console.log(this.polyline.latlngs) - // }); - - }, - watch: { - journey: { - handler: function (ndata, odata) { - this.save_data(); - }, - deep: true, - }, - }, + }, + watch: { + journey: { + handler: function (ndata, odata) { + this.save_data(); + }, + deep: true, + }, + }, }); diff --git a/src/client/types/geom.ts b/src/client/types/geom.ts index 628c61b..99fb18d 100644 --- a/src/client/types/geom.ts +++ b/src/client/types/geom.ts @@ -159,7 +159,6 @@ function recursiveMidPoint(src: L.LatLng, dst: L.LatLng, opt: { step?: number, d geom.splice(1, 0, mp); } } else if (opt.dist != undefined) { - // console.log(src, dst, pointDistance(src, dst)) if (pointDistance(src, dst) > opt.dist) { geom.splice(0, 1, ...recursiveMidPoint(src, mp, { dist: opt.dist })); geom.splice(geom.length - 2, 2, ...recursiveMidPoint(mp, dst, { dist: opt.dist })); @@ -167,11 +166,9 @@ function recursiveMidPoint(src: L.LatLng, dst: L.LatLng, opt: { step?: number, d geom.splice(1, 0, mp); } } - console.log(geom) return geom; } export function getGeoLine(src: L.LatLng, dst: L.LatLng, opt: { step: number, dist: number }) { - return recursiveMidPoint(src, dst, opt) } \ No newline at end of file diff --git a/src/client/types/wrapper.ts b/src/client/types/wrapper.ts index 4a84a63..486f6e4 100644 --- a/src/client/types/wrapper.ts +++ b/src/client/types/wrapper.ts @@ -9,7 +9,7 @@ class journey_wrapper { sel_leg: number = 0; sel_day: number = 0; - constructor(id: string) { + constructor(id: String) { this.id = id; } diff --git a/src/client/vue.ts b/src/client/vue.ts new file mode 100644 index 0000000..731f8fe --- /dev/null +++ b/src/client/vue.ts @@ -0,0 +1,192 @@ + +import * as api from "./api"; +import journey_wrapper from "./types/wrapper"; +import { migrator } from "./types/migration"; +import { getGeoLine } from "./types/geom"; + +import Vue from "vue"; +import { LMap, LTileLayer, LMarker, LIcon, LPopup, LTooltip, LPolyline, LControlScale } from "vue2-leaflet"; +import Multiselect from 'vue-multiselect' +import TextareaAutosize from 'vue-textarea-autosize' + +Vue.component("l-map", LMap); +Vue.component("l-tile-layer", LTileLayer); +Vue.component("l-marker", LMarker); +Vue.component("l-icon", LIcon); +Vue.component("l-popup", LPopup); +Vue.component("l-tooltip", LTooltip); +Vue.component("l-polyline", LPolyline); +Vue.component("l-control-scale", LControlScale); +Vue.component("multiselect", Multiselect); +Vue.use(TextareaAutosize); + +const app = new Vue({ + el: "#app", + data: { + journey_edit: + ["view", "short"].indexOf(window.location.pathname.split("/")[1]) == -1, + journey: new journey_wrapper(window.location.pathname.split("/").pop() || String.gen_id(16)), + + query: { + type: "", + act: false, + res: [], + }, + impexp: "", + lang: { + format: "ddd D MMM", + formatLocale: { + firstDayOfWeek: 1, + }, + monthBeforeYear: true, + }, + polyline: { + latlngs: [], + color: 'green' + } + }, + methods: { + start_journey: function () { window.location.href = "/" + this.journey.id }, + + compute_bb: function () { + const bounds = this.$refs.map[0].mapObject.getBounds(); + return [[bounds.getSouthWest().lng, bounds.getSouthWest().lat], + [bounds.getNorthEast().lng, bounds.getNorthEast().lat]] + }, + generate_rotation: function (index, list) { + if (index < 0 || index >= list.length) return 0; + const c0 = list[(index == 0) ? index : (index - 1)] + const c1 = list[(index == list.length - 1) ? index : (index + 1)] + const brng = Math.atan2(c1[1] - c0[1], c1[0] - c0[0]); + return `rotate:${brng - Math.PI / 2}rad`; + + }, + generate_marker: function (item, fcolor) { + return ` +
+ + + + ` + }, + generate_icon: function (item, fcolor, styling = "") { + return ``; + }, + + + import_data: function () { + this.journey.data = Object.assign( + {}, + JSON.parse(this.impexp.toDecoded()), + ); + this.journey.data.main.forEach((e) => { + if (e.date_range) { + e.date_range[0] = new Date(e.date_range[0]); + e.date_range[1] = new Date(e.date_range[1]); + } + }); + }, + export_data: function () { + this.impexp = JSON.stringify(this.journey.data).toEncoded(); + }, + filter_selected: function (list, step) { + return list.filter((e) => + step ? e.step == this.journey.sel_day : e.step >= 0, + ); + }, + filter_unselected: function (list) { + return list.filter((e) => e.step == undefined || e.step < 0); + }, + remove_item: function (list, idx) { + list[idx].step = -1; + list.splice(idx, 1); + }, + log: function (e) { + console.log(e); + }, + + get_filter: function (f) { + switch (f) { + case "hotel": return api.is_hotel_type; + case "restaurant": return api.is_restauration_type; + case "place": return api.is_attraction_type; + case "other": + default: return () => true; + } + }, + + search_nominatim: function (f) { + return (q) => { + this.query.act = true; + this.query.type = f; + return api.query_nominatim(q, this.compute_bb(), this.get_filter(f)).catch((_err) => []).then((r) => { + r.forEach((rr) => { + rr.latlon = [parseFloat(rr.lat), parseFloat(rr.lon)]; + rr.sname = rr.display_name.split(",")[0]; + }); + this.query.res = r; + this.query.act = false; + return r + }); + } + }, + search_travel: function (f) { + return (q) => { + this.query.act = true; + this.query.type = f; + return api.query_flight(q).then((r) => { + r.forEach(el => el.path = getGeoLine( + new L.LatLng(el.from_geo.lat, el.from_geo.lon), + new L.LatLng(el.to_geo.lat, el.to_geo.lon), { dist: 5_000_000 }).map(v => [v.lat, v.lng])); + this.query.res = r; + this.query.act = false; + return r; + }); + } + }, + + keyboardEvent(e) { + if (e.which === 13) { + } + }, + }, + created: function () { + + this.search_hotel = api.throttle(this.search_nominatim("hotel"), 1000) + this.search_restaurant = api.throttle(this.search_nominatim("restaurant"), 1000) + this.search_place = api.throttle(this.search_nominatim("place"), 1000) + this.save_data = api.throttle(() => { + this.impexp = JSON.stringify(this.journey.data).toEncoded(); + api.save(this.journey.id, this.journey.data); + }, 1000); + this.search_flight = api.throttle(this.search_travel("flight"), 2000) + + window.addEventListener("keydown", (e) => { + switch (e.key) { + case "ArrowLeft": + this.journey.day_prev(); + break; + case "ArrowRight": + this.journey.day_next(); + break; + default: + console.log(e.key); + } + }); + + api.load(this.journey.id).then((r) => (app.journey.data = migrator(r))); + + this.search_travel("flight")("qf1").then(r => { + this.polyline.latlngs = r.map(e => e.path) + }); + + }, + watch: { + journey: { + handler: function (ndata, odata) { + this.save_data(); + }, + deep: true, + }, + }, +}); diff --git a/src/server/api.ts b/src/server/api.ts index 88de4d6..9b8b531 100644 --- a/src/server/api.ts +++ b/src/server/api.ts @@ -1,10 +1,9 @@ -import { FastifyInstance } from 'fastify/types/instance'; -import { ProxyAgent, setGlobalDispatcher } from 'undici'; +//import { ProxyAgent, setGlobalDispatcher } from 'undici'; import { flight_get_data } from './api_flight' import { nominatim_get_data } from './api_nominatim'; -setGlobalDispatcher(new ProxyAgent(process.env.HTTPS_PROXY as string)); +//setGlobalDispatcher(new ProxyAgent(process.env.HTTPS_PROXY as string)); export default function (server, opts, done) { diff --git a/template/module/foot.pug b/template/module/foot.pug index 991d48e..c415501 100644 --- a/template/module/foot.pug +++ b/template/module/foot.pug @@ -1,13 +1,11 @@ script(src="https://unpkg.com/leaflet") -script(src="https://unpkg.com/leaflet.awesome-markers") -script(src="https://unpkg.com/leaflet.geodesic") script(src="https://unpkg.com/sortablejs") -script(src="https://unpkg.com/vue@2") -script(src="https://unpkg.com/vue2-datepicker") -script(src="https://unpkg.com/vue-textarea-autosize") -script(src="https://unpkg.com/vue-multiselect@2") -script(src="https://unpkg.com/vue2-leaflet") +//- script(src="https://unpkg.com/vue@2") +//- script(src="https://unpkg.com/vue2-datepicker") +//- script(src="https://unpkg.com/vue-textarea-autosize") +//- script(src="https://unpkg.com/vue-multiselect@2") +//- script(src="https://unpkg.com/vue2-leaflet") script(src="https://unpkg.com/vuedraggable") script(src="/public/main.js", type="text/javascript", charset="utf-8") footer.bg-dark diff --git a/template/module/map.pug b/template/module/map.pug index dc43d7f..4c62135 100644 --- a/template/module/map.pug +++ b/template/module/map.pug @@ -13,8 +13,7 @@ l-map( v-if="journey.data.main[idx].hotel", :lat-lng="journey.data.main[idx].hotel.latlon" ) - l-icon - div(v-html="generate_marker(journey.data.main[idx].hotel, 'darkblue')") + l-icon(v-html="generate_marker(journey.data.main[idx].hotel, 'darkblue')") l-popup h1.row.text-medium.text-center {{ journey.data.main[idx].hotel.sname }} span.row.text-small.text-gray {{ journey.data.main[idx].hotel.display_name }} @@ -28,20 +27,20 @@ l-map( ) span.row.text-small.text-white(v-else) {{ journey.data.main[idx].hotel.notes }} l-marker( - v-for="place in journey.data.main[idx].places.activities", + v-for="(place, index) in journey.data.main[idx].places.activities", + :key="'activities'+index", :lat-lng="place.latlon" ) - l-icon - div( + l-icon( v-if="place.step == journey.sel_day", v-html="generate_marker(place)" ) - div( + l-icon( v-else-if="place.step == -1 || place.step == undefined", v-html="generate_marker(place, 'gray')" ) - div(v-else-if="journey_edit", v-html="generate_marker(place, 'lightgray')") - div(v-else) + l-icon(v-else-if="journey_edit", v-html="generate_marker(place, 'lightgray')") + l-icon(v-else) l-popup h1.row.text-medium.text-center {{ place.sname }} span.row.text-small.text-gray {{ place.display_name }} @@ -65,20 +64,20 @@ l-map( ) + span.row.text-small.text-dark(v-else) {{ place.notes }} l-marker( - v-for="place in journey.data.main[idx].places.restaurants", + v-for="(place, index) in journey.data.main[idx].places.restaurants", + :key="'restaurants'+index" :lat-lng="place.latlon" ) - l-icon - div(v-html="generate_marker(place, 'cadetblue')") + l-icon(v-html="generate_marker(place, 'cadetblue')") l-popup h1.row.text-medium.text-center {{ place.sname }} span.row.text-small.text-gray {{ place.display_name }} span(v-if="journey_edit") .row.input textarea-autosize.col-12.col-sm-12.text-small( - placeholder="Notes", - v-model="place.notes", - :min-height="30", + placeholder="Notes" + v-model="place.notes" + :min-height="30" :max-height="350" ) span.row.text-small.text-dark(v-else) {{ place.notes }} @@ -86,8 +85,8 @@ l-map( div(v-for= "latlngs in polyline.latlngs") l-polyline(:lat-lngs="polyline.latlngs" :color="polyline.color") l-marker( - v-for="(place, index) in latlngs", + v-for="(place, index) in latlngs" + :key="'plane'+index" :lat-lng="place" ) - l-icon - div(v-html="generate_icon('plane', polyline.color, generate_rotation(index,latlngs))") \ No newline at end of file + l-icon(v-html="generate_icon('plane', polyline.color, generate_rotation(index,latlngs))") \ No newline at end of file diff --git a/tsconfig-client.json b/tsconfig-client.json index 6a54986..04b8e7b 100644 --- a/tsconfig-client.json +++ b/tsconfig-client.json @@ -1,12 +1,17 @@ { - "compilerOptions": { "target": "esnext", - "typeRoots": ["./node_modules/@types", "./types/ext"], - "lib": ["esnext", "DOM"], - "noEmit": true, // Disable emitting output (use esbuild to handle this) - "skipLibCheck": true, // Skip type checking of all declaration files (*.d.ts) - "strict": false, // Disable strict type checks if needed + "typeRoots": [ + "./node_modules/@types", + "./types/ext" + ], + "lib": [ + "esnext", + "DOM" + ], + "noEmit": true, // Disable emitting output (use esbuild to handle this) + "skipLibCheck": true, // Skip type checking of all declaration files (*.d.ts) + "strict": false, // Disable strict type checks if needed "moduleResolution": "node", } -} +} \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index 9d38d61..8bc6ed8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5,6 +5,19 @@ __metadata: version: 8 cacheKey: 10c0 +"@asamuzakjp/css-color@npm:^2.8.2": + version: 2.8.3 + resolution: "@asamuzakjp/css-color@npm:2.8.3" + dependencies: + "@csstools/css-calc": "npm:^2.1.1" + "@csstools/css-color-parser": "npm:^3.0.7" + "@csstools/css-parser-algorithms": "npm:^3.0.4" + "@csstools/css-tokenizer": "npm:^3.0.3" + lru-cache: "npm:^10.4.3" + checksum: 10c0/e108c92ee5de6d8510c9aaca8375c0aeab730dc9b6d4bd287aea2a0379cfbaa09f0814dcacb3e2ddc5c79d7deedf3f82ec8d1ce0effd4a8fac8415b1fe553798 + languageName: node + linkType: hard + "@babel/helper-string-parser@npm:^7.25.9": version: 7.25.9 resolution: "@babel/helper-string-parser@npm:7.25.9" @@ -19,7 +32,7 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": +"@babel/parser@npm:^7.23.5, @babel/parser@npm:^7.6.0, @babel/parser@npm:^7.9.6": version: 7.26.9 resolution: "@babel/parser@npm:7.26.9" dependencies: @@ -40,6 +53,52 @@ __metadata: languageName: node linkType: hard +"@csstools/color-helpers@npm:^5.0.2": + version: 5.0.2 + resolution: "@csstools/color-helpers@npm:5.0.2" + checksum: 10c0/bebaddb28b9eb58b0449edd5d0c0318fa88f3cb079602ee27e88c9118070d666dcc4e09a5aa936aba2fde6ba419922ade07b7b506af97dd7051abd08dfb2959b + languageName: node + linkType: hard + +"@csstools/css-calc@npm:^2.1.1, @csstools/css-calc@npm:^2.1.2": + version: 2.1.2 + resolution: "@csstools/css-calc@npm:2.1.2" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/34ced30553968ef5d5f9e00e3b90b48c47480cf130e282e99d57ec9b09f803aab8bc06325683e72a1518b5e7180a3da8b533f1b462062757c21989a53b482e1a + languageName: node + linkType: hard + +"@csstools/css-color-parser@npm:^3.0.7": + version: 3.0.8 + resolution: "@csstools/css-color-parser@npm:3.0.8" + dependencies: + "@csstools/color-helpers": "npm:^5.0.2" + "@csstools/css-calc": "npm:^2.1.2" + peerDependencies: + "@csstools/css-parser-algorithms": ^3.0.4 + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/90722c5a62ca94e9d578ddf59be604a76400b932bd3d4bd23cb1ae9b7ace8fcf83c06995d2b31f96f4afef24a7cefba79beb11ed7ee4999d7ecfec3869368359 + languageName: node + linkType: hard + +"@csstools/css-parser-algorithms@npm:^3.0.4": + version: 3.0.4 + resolution: "@csstools/css-parser-algorithms@npm:3.0.4" + peerDependencies: + "@csstools/css-tokenizer": ^3.0.3 + checksum: 10c0/d411f07765e14eede17bccc6bd4f90ff303694df09aabfede3fd104b2dfacfd4fe3697cd25ddad14684c850328f3f9420ebfa9f78380892492974db24ae47dbd + languageName: node + linkType: hard + +"@csstools/css-tokenizer@npm:^3.0.3": + version: 3.0.3 + resolution: "@csstools/css-tokenizer@npm:3.0.3" + checksum: 10c0/c31bf410e1244b942e71798e37c54639d040cb59e0121b21712b40015fced2b0fb1ffe588434c5f8923c9cd0017cfc1c1c8f3921abc94c96edf471aac2eba5e5 + languageName: node + linkType: hard + "@esbuild/aix-ppc64@npm:0.25.0": version: 0.25.0 resolution: "@esbuild/aix-ppc64@npm:0.25.0" @@ -403,6 +462,21 @@ __metadata: languageName: node linkType: hard +"@vue/compiler-sfc@npm:2.7.16": + version: 2.7.16 + resolution: "@vue/compiler-sfc@npm:2.7.16" + dependencies: + "@babel/parser": "npm:^7.23.5" + postcss: "npm:^8.4.14" + prettier: "npm:^1.18.2 || ^2.0.0" + source-map: "npm:^0.6.1" + dependenciesMeta: + prettier: + optional: true + checksum: 10c0/eaeeef054c939e6cd7591199e2b998ae33d0afd65dc1b5675b54361f0c657c08ae82945791a1a8ca76762e1c1f8e69a00595daf280b854cbc3370ed5c5a34bcd + languageName: node + linkType: hard + "abbrev@npm:^3.0.0": version: 3.0.0 resolution: "abbrev@npm:3.0.0" @@ -527,6 +601,13 @@ __metadata: languageName: node linkType: hard +"asynckit@npm:^0.4.0": + version: 0.4.0 + resolution: "asynckit@npm:0.4.0" + checksum: 10c0/d73e2ddf20c4eb9337e1b3df1a0f6159481050a5de457c55b14ea2e5cb6d90bb69e004c9af54737a5ee0917fcf2c9e25de67777bbe58261847846066ba75bc9d + languageName: node + linkType: hard + "atomic-sleep@npm:^1.0.0": version: 1.0.0 resolution: "atomic-sleep@npm:1.0.0" @@ -710,6 +791,15 @@ __metadata: languageName: node linkType: hard +"combined-stream@npm:^1.0.8": + version: 1.0.8 + resolution: "combined-stream@npm:1.0.8" + dependencies: + delayed-stream: "npm:~1.0.0" + checksum: 10c0/0dbb829577e1b1e839fa82b40c07ffaf7de8a09b935cadd355a73652ae70a88b4320db322f6634a4ad93424292fa80973ac6480986247f1734a1137debf271d5 + languageName: node + linkType: hard + "concat-map@npm:0.0.1": version: 0.0.1 resolution: "concat-map@npm:0.0.1" @@ -743,6 +833,13 @@ __metadata: languageName: node linkType: hard +"core-js@npm:^2.6.5": + version: 2.6.12 + resolution: "core-js@npm:2.6.12" + checksum: 10c0/00128efe427789120a06b819adc94cc72b96955acb331cb71d09287baf9bd37bebd191d91f1ee4939c893a050307ead4faea08876f09115112612b6a05684b63 + languageName: node + linkType: hard + "cross-spawn@npm:^7.0.0": version: 7.0.6 resolution: "cross-spawn@npm:7.0.6" @@ -754,6 +851,33 @@ __metadata: languageName: node linkType: hard +"cssstyle@npm:^4.2.1": + version: 4.2.1 + resolution: "cssstyle@npm:4.2.1" + dependencies: + "@asamuzakjp/css-color": "npm:^2.8.2" + rrweb-cssom: "npm:^0.8.0" + checksum: 10c0/02ba8c47c0caaab57acadacb3eb6c0f5f009000f55d61f6563670e07d389b26edefeed497e6c1847fcd2e6bbe0b6974c2d4291f97fa0c6ec6add13a7fa926d84 + languageName: node + linkType: hard + +"csstype@npm:^3.1.0": + version: 3.1.3 + resolution: "csstype@npm:3.1.3" + checksum: 10c0/80c089d6f7e0c5b2bd83cf0539ab41474198579584fa10d86d0cafe0642202343cbc119e076a0b1aece191989477081415d66c9fefbf3c957fc2fc4b7009f248 + languageName: node + linkType: hard + +"data-urls@npm:^5.0.0": + version: 5.0.0 + resolution: "data-urls@npm:5.0.0" + dependencies: + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.0.0" + checksum: 10c0/1b894d7d41c861f3a4ed2ae9b1c3f0909d4575ada02e36d3d3bc584bdd84278e20709070c79c3b3bff7ac98598cb191eb3e86a89a79ea4ee1ef360e1694f92ad + languageName: node + linkType: hard + "debug@npm:4, debug@npm:^4, debug@npm:^4.3.4": version: 4.4.0 resolution: "debug@npm:4.4.0" @@ -766,6 +890,13 @@ __metadata: languageName: node linkType: hard +"decimal.js@npm:^10.4.3": + version: 10.5.0 + resolution: "decimal.js@npm:10.5.0" + checksum: 10c0/785c35279df32762143914668df35948920b6c1c259b933e0519a69b7003fc0a5ed2a766b1e1dda02574450c566b21738a45f15e274b47c2ac02072c0d1f3ac3 + languageName: node + linkType: hard + "deferred-leveldown@npm:^7.0.0": version: 7.0.0 resolution: "deferred-leveldown@npm:7.0.0" @@ -776,6 +907,13 @@ __metadata: languageName: node linkType: hard +"delayed-stream@npm:~1.0.0": + version: 1.0.0 + resolution: "delayed-stream@npm:1.0.0" + checksum: 10c0/d758899da03392e6712f042bec80aa293bbe9e9ff1b2634baae6a360113e708b91326594c8a486d475c69d6259afb7efacdc3537bfcda1c6c648e390ce601b19 + languageName: node + linkType: hard + "depd@npm:2.0.0": version: 2.0.0 resolution: "depd@npm:2.0.0" @@ -850,6 +988,13 @@ __metadata: languageName: node linkType: hard +"entities@npm:^4.5.0": + version: 4.5.0 + resolution: "entities@npm:4.5.0" + checksum: 10c0/5b039739f7621f5d1ad996715e53d964035f75ad3b9a4d38c6b3804bb226e282ffeae2443624d8fdd9c47d8e926ae9ac009c54671243f0c3294c26af7cc85250 + languageName: node + linkType: hard + "env-paths@npm:^2.2.0": version: 2.2.1 resolution: "env-paths@npm:2.2.1" @@ -887,6 +1032,18 @@ __metadata: languageName: node linkType: hard +"es-set-tostringtag@npm:^2.1.0": + version: 2.1.0 + resolution: "es-set-tostringtag@npm:2.1.0" + dependencies: + es-errors: "npm:^1.3.0" + get-intrinsic: "npm:^1.2.6" + has-tostringtag: "npm:^1.0.2" + hasown: "npm:^2.0.2" + checksum: 10c0/ef2ca9ce49afe3931cb32e35da4dcb6d86ab02592cfc2ce3e49ced199d9d0bb5085fc7e73e06312213765f5efa47cc1df553a6a5154584b21448e9fb8355b1af + languageName: node + linkType: hard + "esbuild@npm:^0.25.0": version: 0.25.0 resolution: "esbuild@npm:0.25.0" @@ -1045,7 +1202,7 @@ __metadata: languageName: node linkType: hard -"fastify@npm:^5.0.0": +"fastify@npm:^5.2.1": version: 5.2.1 resolution: "fastify@npm:5.2.1" dependencies: @@ -1107,6 +1264,18 @@ __metadata: languageName: node linkType: hard +"form-data@npm:^4.0.1": + version: 4.0.2 + resolution: "form-data@npm:4.0.2" + dependencies: + asynckit: "npm:^0.4.0" + combined-stream: "npm:^1.0.8" + es-set-tostringtag: "npm:^2.1.0" + mime-types: "npm:^2.1.12" + checksum: 10c0/e534b0cf025c831a0929bf4b9bbe1a9a6b03e273a8161f9947286b9b13bf8fb279c6944aae0070c4c311100c6d6dbb815cd955dc217728caf73fad8dc5b8ee9c + languageName: node + linkType: hard + "fs-minipass@npm:^3.0.0": version: 3.0.3 resolution: "fs-minipass@npm:3.0.3" @@ -1257,6 +1426,15 @@ __metadata: languageName: node linkType: hard +"html-encoding-sniffer@npm:^4.0.0": + version: 4.0.0 + resolution: "html-encoding-sniffer@npm:4.0.0" + dependencies: + whatwg-encoding: "npm:^3.1.1" + checksum: 10c0/523398055dc61ac9b34718a719cb4aa691e4166f29187e211e1607de63dc25ac7af52ca7c9aead0c4b3c0415ffecb17326396e1202e2e86ff4bca4c0ee4c6140 + languageName: node + linkType: hard + "http-cache-semantics@npm:^4.1.1": version: 4.1.1 resolution: "http-cache-semantics@npm:4.1.1" @@ -1277,7 +1455,7 @@ __metadata: languageName: node linkType: hard -"http-proxy-agent@npm:^7.0.0": +"http-proxy-agent@npm:^7.0.0, http-proxy-agent@npm:^7.0.2": version: 7.0.2 resolution: "http-proxy-agent@npm:7.0.2" dependencies: @@ -1287,7 +1465,7 @@ __metadata: languageName: node linkType: hard -"https-proxy-agent@npm:^7.0.1": +"https-proxy-agent@npm:^7.0.1, https-proxy-agent@npm:^7.0.6": version: 7.0.6 resolution: "https-proxy-agent@npm:7.0.6" dependencies: @@ -1297,7 +1475,7 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -1416,6 +1594,13 @@ __metadata: languageName: node linkType: hard +"is-potential-custom-element-name@npm:^1.0.1": + version: 1.0.1 + resolution: "is-potential-custom-element-name@npm:1.0.1" + checksum: 10c0/b73e2f22bc863b0939941d369486d308b43d7aef1f9439705e3582bfccaa4516406865e32c968a35f97a99396dac84e2624e67b0a16b0a15086a785e16ce7db9 + languageName: node + linkType: hard + "is-promise@npm:^2.0.0": version: 2.2.2 resolution: "is-promise@npm:2.2.2" @@ -1485,6 +1670,40 @@ __metadata: languageName: node linkType: hard +"jsdom@npm:^26.0.0": + version: 26.0.0 + resolution: "jsdom@npm:26.0.0" + dependencies: + cssstyle: "npm:^4.2.1" + data-urls: "npm:^5.0.0" + decimal.js: "npm:^10.4.3" + form-data: "npm:^4.0.1" + html-encoding-sniffer: "npm:^4.0.0" + http-proxy-agent: "npm:^7.0.2" + https-proxy-agent: "npm:^7.0.6" + is-potential-custom-element-name: "npm:^1.0.1" + nwsapi: "npm:^2.2.16" + parse5: "npm:^7.2.1" + rrweb-cssom: "npm:^0.8.0" + saxes: "npm:^6.0.0" + symbol-tree: "npm:^3.2.4" + tough-cookie: "npm:^5.0.0" + w3c-xmlserializer: "npm:^5.0.0" + webidl-conversions: "npm:^7.0.0" + whatwg-encoding: "npm:^3.1.1" + whatwg-mimetype: "npm:^4.0.0" + whatwg-url: "npm:^14.1.0" + ws: "npm:^8.18.0" + xml-name-validator: "npm:^5.0.0" + peerDependencies: + canvas: ^3.0.0 + peerDependenciesMeta: + canvas: + optional: true + checksum: 10c0/e48725ba4027edcfc9bca5799eaec72c6561ecffe3675a8ff87fe9c3541ca4ff9f82b4eff5b3d9c527302da0d859b2f60e9364347a5d42b77f5c76c436c569dc + languageName: node + linkType: hard + "json-schema-ref-resolver@npm:^2.0.0": version: 2.0.1 resolution: "json-schema-ref-resolver@npm:2.0.1" @@ -1511,6 +1730,13 @@ __metadata: languageName: node linkType: hard +"leaflet@npm:^1.9.4": + version: 1.9.4 + resolution: "leaflet@npm:1.9.4" + checksum: 10c0/f639441dbb7eb9ae3fcd29ffd7d3508f6c6106892441634b0232fafb9ffb1588b05a8244ec7085de2c98b5ed703894df246898477836cfd0ce5b96d4717b5ca1 + languageName: node + linkType: hard + "level-codec@npm:^10.0.0": version: 10.0.0 resolution: "level-codec@npm:10.0.0" @@ -1590,7 +1816,7 @@ __metadata: languageName: node linkType: hard -"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0": +"lru-cache@npm:^10.0.1, lru-cache@npm:^10.2.0, lru-cache@npm:^10.4.3": version: 10.4.3 resolution: "lru-cache@npm:10.4.3" checksum: 10c0/ebd04fbca961e6c1d6c0af3799adcc966a1babe798f685bb84e6599266599cd95d94630b10262f5424539bc4640107e8a33aa28585374abf561d30d16f4b39fb @@ -1630,6 +1856,22 @@ __metadata: languageName: node linkType: hard +"mime-db@npm:1.52.0": + version: 1.52.0 + resolution: "mime-db@npm:1.52.0" + checksum: 10c0/0557a01deebf45ac5f5777fe7740b2a5c309c6d62d40ceab4e23da9f821899ce7a900b7ac8157d4548ddbb7beffe9abc621250e6d182b0397ec7f10c7b91a5aa + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12": + version: 2.1.35 + resolution: "mime-types@npm:2.1.35" + dependencies: + mime-db: "npm:1.52.0" + checksum: 10c0/82fb07ec56d8ff1fc999a84f2f217aa46cb6ed1033fefaabd5785b9a974ed225c90dc72fff460259e66b95b73648596dbcc50d51ed69cdf464af2d237d3149b2 + languageName: node + linkType: hard + "mime@npm:^3": version: 3.0.0 resolution: "mime@npm:3.0.0" @@ -1759,6 +2001,15 @@ __metadata: languageName: node linkType: hard +"nanoid@npm:^3.3.8": + version: 3.3.8 + resolution: "nanoid@npm:3.3.8" + bin: + nanoid: bin/nanoid.cjs + checksum: 10c0/4b1bb29f6cfebf3be3bc4ad1f1296fb0a10a3043a79f34fbffe75d1621b4318319211cd420549459018ea3592f0d2f159247a6f874911d6d26eaaadda2478120 + languageName: node + linkType: hard + "napi-macros@npm:~2.0.0": version: 2.0.0 resolution: "napi-macros@npm:2.0.0" @@ -1842,6 +2093,13 @@ __metadata: languageName: node linkType: hard +"nwsapi@npm:^2.2.16": + version: 2.2.16 + resolution: "nwsapi@npm:2.2.16" + checksum: 10c0/0aa0637f4d51043d0183d994e08336bae996b03b42984381bf09ebdf3ff4909c018eda6b2a8aba0a08f3ea8303db8a0dad0608b38dc0bff15fd87017286ae21a + languageName: node + linkType: hard + "object-assign@npm:^4.1.1": version: 4.1.1 resolution: "object-assign@npm:4.1.1" @@ -1870,6 +2128,15 @@ __metadata: languageName: node linkType: hard +"parse5@npm:^7.2.1": + version: 7.2.1 + resolution: "parse5@npm:7.2.1" + dependencies: + entities: "npm:^4.5.0" + checksum: 10c0/829d37a0c709215a887e410a7118d754f8e1afd7edb529db95bc7bbf8045fb0266a7b67801331d8e8d9d073ea75793624ec27ce9ff3b96862c3b9008f4d68e80 + languageName: node + linkType: hard + "path-key@npm:^3.1.0": version: 3.1.1 resolution: "path-key@npm:3.1.1" @@ -1904,6 +2171,13 @@ __metadata: languageName: node linkType: hard +"picocolors@npm:^1.1.1": + version: 1.1.1 + resolution: "picocolors@npm:1.1.1" + checksum: 10c0/e2e3e8170ab9d7c7421969adaa7e1b31434f789afb9b3f115f6b96d91945041ac3ceb02e9ec6fe6510ff036bcc0bf91e69a1772edc0b707e12b19c0f2d6bcf58 + languageName: node + linkType: hard + "picomatch@npm:^2.0.4, picomatch@npm:^2.2.1": version: 2.3.1 resolution: "picomatch@npm:2.3.1" @@ -1948,6 +2222,26 @@ __metadata: languageName: node linkType: hard +"postcss@npm:^8.4.14": + version: 8.5.3 + resolution: "postcss@npm:8.5.3" + dependencies: + nanoid: "npm:^3.3.8" + picocolors: "npm:^1.1.1" + source-map-js: "npm:^1.2.1" + checksum: 10c0/b75510d7b28c3ab728c8733dd01538314a18c52af426f199a3c9177e63eb08602a3938bfb66b62dc01350b9aed62087eabbf229af97a1659eb8d3513cec823b3 + languageName: node + linkType: hard + +"prettier@npm:^1.18.2 || ^2.0.0": + version: 2.8.8 + resolution: "prettier@npm:2.8.8" + bin: + prettier: bin-prettier.js + checksum: 10c0/463ea8f9a0946cd5b828d8cf27bd8b567345cf02f56562d5ecde198b91f47a76b7ac9eae0facd247ace70e927143af6135e8cf411986b8cb8478784a4d6d724a + languageName: node + linkType: hard + "prettier@npm:^3.5.2": version: 3.5.2 resolution: "prettier@npm:3.5.2" @@ -2124,6 +2418,13 @@ __metadata: languageName: node linkType: hard +"punycode@npm:^2.3.1": + version: 2.3.1 + resolution: "punycode@npm:2.3.1" + checksum: 10c0/14f76a8206bc3464f794fb2e3d3cc665ae416c01893ad7a02b23766eb07159144ee612ad67af5e84fa4479ccfe67678c4feb126b0485651b302babf66f04f9e9 + languageName: node + linkType: hard + "queue-microtask@npm:^1.2.3": version: 1.2.3 resolution: "queue-microtask@npm:1.2.3" @@ -2237,6 +2538,13 @@ __metadata: languageName: node linkType: hard +"rrweb-cssom@npm:^0.8.0": + version: 0.8.0 + resolution: "rrweb-cssom@npm:0.8.0" + checksum: 10c0/56f2bfd56733adb92c0b56e274c43f864b8dd48784d6fe946ef5ff8d438234015e59ad837fc2ad54714b6421384141c1add4eb569e72054e350d1f8a50b8ac7b + languageName: node + linkType: hard + "safe-buffer@npm:5.2.1, safe-buffer@npm:~5.2.0": version: 5.2.1 resolution: "safe-buffer@npm:5.2.1" @@ -2267,6 +2575,15 @@ __metadata: languageName: node linkType: hard +"saxes@npm:^6.0.0": + version: 6.0.0 + resolution: "saxes@npm:6.0.0" + dependencies: + xmlchars: "npm:^2.2.0" + checksum: 10c0/3847b839f060ef3476eb8623d099aa502ad658f5c40fd60c105ebce86d244389b0d76fcae30f4d0c728d7705ceb2f7e9b34bb54717b6a7dbedaf5dad2d9a4b74 + languageName: node + linkType: hard + "secure-json-parse@npm:^3.0.1": version: 3.0.2 resolution: "secure-json-parse@npm:3.0.2" @@ -2366,6 +2683,20 @@ __metadata: languageName: node linkType: hard +"source-map-js@npm:^1.2.1": + version: 1.2.1 + resolution: "source-map-js@npm:1.2.1" + checksum: 10c0/7bda1fc4c197e3c6ff17de1b8b2c20e60af81b63a52cb32ec5a5d67a20a7d42651e2cb34ebe93833c5a2a084377e17455854fee3e21e7925c64a51b6a52b0faf + languageName: node + linkType: hard + +"source-map@npm:^0.6.1": + version: 0.6.1 + resolution: "source-map@npm:0.6.1" + checksum: 10c0/ab55398007c5e5532957cb0beee2368529618ac0ab372d789806f5718123cc4367d57de3904b4e6a4170eb5a0b0f41373066d02ca0735a0c4d75c7d328d3e011 + languageName: node + linkType: hard + "split2@npm:^4.0.0": version: 4.2.0 resolution: "split2@npm:4.2.0" @@ -2461,6 +2792,13 @@ __metadata: languageName: node linkType: hard +"symbol-tree@npm:^3.2.4": + version: 3.2.4 + resolution: "symbol-tree@npm:3.2.4" + checksum: 10c0/dfbe201ae09ac6053d163578778c53aa860a784147ecf95705de0cd23f42c851e1be7889241495e95c37cabb058edb1052f141387bef68f705afc8f9dd358509 + languageName: node + linkType: hard + "tar@npm:^7.4.3": version: 7.4.3 resolution: "tar@npm:7.4.3" @@ -2484,6 +2822,24 @@ __metadata: languageName: node linkType: hard +"tldts-core@npm:^6.1.78": + version: 6.1.78 + resolution: "tldts-core@npm:6.1.78" + checksum: 10c0/aea5e664da879cd862ccf5df9286531ddf4c34a9ca832480188bf6cd165cd45654f5b0a0f0f5315e16203ebfb87d52f8630b9419e729b3cfe5eff073c398693e + languageName: node + linkType: hard + +"tldts@npm:^6.1.32": + version: 6.1.78 + resolution: "tldts@npm:6.1.78" + dependencies: + tldts-core: "npm:^6.1.78" + bin: + tldts: bin/cli.js + checksum: 10c0/966f3f5a63405db6abb49b479784baa677510993f21ffbd67571f3d819451d70a603f1246b13f1c309a7573c4d9fbe0241aca6ff6e8399cbe7d2dd70b7ee4052 + languageName: node + linkType: hard + "to-regex-range@npm:^5.0.1": version: 5.0.1 resolution: "to-regex-range@npm:5.0.1" @@ -2523,6 +2879,24 @@ __metadata: languageName: node linkType: hard +"tough-cookie@npm:^5.0.0": + version: 5.1.1 + resolution: "tough-cookie@npm:5.1.1" + dependencies: + tldts: "npm:^6.1.32" + checksum: 10c0/84fe18b7c28ce273c916d95028c00ffff58c285d58e90fbd44eb9380dd1bc21892c675cd1bbd4bfbc95108fe833c406b285844757d41636248bfe264655a6ef8 + languageName: node + linkType: hard + +"tr46@npm:^5.0.0": + version: 5.0.0 + resolution: "tr46@npm:5.0.0" + dependencies: + punycode: "npm:^2.3.1" + checksum: 10c0/1521b6e7bbc8adc825c4561480f9fe48eb2276c81335eed9fa610aa4c44a48a3221f78b10e5f18b875769eb3413e30efbf209ed556a17a42aa8d690df44b7bee + languageName: node + linkType: hard + "undefsafe@npm:^2.0.5": version: 2.0.5 resolution: "undefsafe@npm:2.0.5" @@ -2537,6 +2911,13 @@ __metadata: languageName: node linkType: hard +"undici@npm:^7.3.0": + version: 7.3.0 + resolution: "undici@npm:7.3.0" + checksum: 10c0/62c5e335725cadb02e19950932c7823fc330cbfd80106e6836daa6db1379aa727510b77de0a4e6f912087b288ded93f7daf4b8c154ad36fd5c9c4b96b26888b8 + languageName: node + linkType: hard + "unique-filename@npm:^4.0.0": version: 4.0.0 resolution: "unique-filename@npm:4.0.0" @@ -2579,13 +2960,99 @@ __metadata: "@prettier/plugin-pug": "npm:^3.0.0" "@types/node": "npm:^22.13.5" esbuild: "npm:^0.25.0" - fastify: "npm:^5.0.0" + fastify: "npm:^5.2.1" + jsdom: "npm:^26.0.0" + leaflet: "npm:^1.9.4" nodemon: "npm:^3.0.1" prettier: "npm:^3.5.2" pug: "npm:^3.0.2" + undici: "npm:^7.3.0" + vue: "npm:2" + vue-multiselect: "npm:2" + vue-textarea-autosize: "npm:^1.1.1" + vue2-leaflet: "npm:^2.7.1" languageName: unknown linkType: soft +"vue-multiselect@npm:2": + version: 2.1.9 + resolution: "vue-multiselect@npm:2.1.9" + checksum: 10c0/baecfbb97b4b225bd2e2054f2eed640917b47f448a76a43f084d344764c813a58e825ea2131f6803c125e6e8d4e0b4edb5712da49dd1b8a082f29ac845cc7c2b + languageName: node + linkType: hard + +"vue-textarea-autosize@npm:^1.1.1": + version: 1.1.1 + resolution: "vue-textarea-autosize@npm:1.1.1" + dependencies: + core-js: "npm:^2.6.5" + checksum: 10c0/22614d412b7e592b68c9b127cfc4257985058571d185ef1885acd3666b77381c87a2006b5084d5687b5e3729ad5b8c53ff962eaf43bbefa1dc5ae0e58cada9db + languageName: node + linkType: hard + +"vue2-leaflet@npm:^2.7.1": + version: 2.7.1 + resolution: "vue2-leaflet@npm:2.7.1" + peerDependencies: + "@types/leaflet": ^1.5.7 + leaflet: ^1.3.4 + vue: ^2.5.17 + checksum: 10c0/34ae5cc4b78deaf3ee7f73a210b2e45f9d80b92860d5ac5d831d74fd8a94d06983845f01e6203b4e61bad7f6385715f0ea3cd23b2e39fb6c8ce912fe4d096af6 + languageName: node + linkType: hard + +"vue@npm:2": + version: 2.7.16 + resolution: "vue@npm:2.7.16" + dependencies: + "@vue/compiler-sfc": "npm:2.7.16" + csstype: "npm:^3.1.0" + checksum: 10c0/15bf536c131a863d03c42386a4bbc82316262129421ef70e88d1758bcf951446ef51edeff42e3b27d026015330fe73d90155fca270eb5eadd30b0290735f2c3e + languageName: node + linkType: hard + +"w3c-xmlserializer@npm:^5.0.0": + version: 5.0.0 + resolution: "w3c-xmlserializer@npm:5.0.0" + dependencies: + xml-name-validator: "npm:^5.0.0" + checksum: 10c0/8712774c1aeb62dec22928bf1cdfd11426c2c9383a1a63f2bcae18db87ca574165a0fbe96b312b73652149167ac6c7f4cf5409f2eb101d9c805efe0e4bae798b + languageName: node + linkType: hard + +"webidl-conversions@npm:^7.0.0": + version: 7.0.0 + resolution: "webidl-conversions@npm:7.0.0" + checksum: 10c0/228d8cb6d270c23b0720cb2d95c579202db3aaf8f633b4e9dd94ec2000a04e7e6e43b76a94509cdb30479bd00ae253ab2371a2da9f81446cc313f89a4213a2c4 + languageName: node + linkType: hard + +"whatwg-encoding@npm:^3.1.1": + version: 3.1.1 + resolution: "whatwg-encoding@npm:3.1.1" + dependencies: + iconv-lite: "npm:0.6.3" + checksum: 10c0/273b5f441c2f7fda3368a496c3009edbaa5e43b71b09728f90425e7f487e5cef9eb2b846a31bd760dd8077739c26faf6b5ca43a5f24033172b003b72cf61a93e + languageName: node + linkType: hard + +"whatwg-mimetype@npm:^4.0.0": + version: 4.0.0 + resolution: "whatwg-mimetype@npm:4.0.0" + checksum: 10c0/a773cdc8126b514d790bdae7052e8bf242970cebd84af62fb2f35a33411e78e981f6c0ab9ed1fe6ec5071b09d5340ac9178e05b52d35a9c4bcf558ba1b1551df + languageName: node + linkType: hard + +"whatwg-url@npm:^14.0.0, whatwg-url@npm:^14.1.0": + version: 14.1.1 + resolution: "whatwg-url@npm:14.1.1" + dependencies: + tr46: "npm:^5.0.0" + webidl-conversions: "npm:^7.0.0" + checksum: 10c0/de1e9cc2f04cb000f232c839d4999384ba41b680ef8a89e7c61c9bc40354ba8593c775d068faaf0819f5866e4d6ca3e7b9b386e2123aa475bfd33da02316f476 + languageName: node + linkType: hard + "which@npm:^2.0.1": version: 2.0.2 resolution: "which@npm:2.0.2" @@ -2642,6 +3109,35 @@ __metadata: languageName: node linkType: hard +"ws@npm:^8.18.0": + version: 8.18.1 + resolution: "ws@npm:8.18.1" + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ">=5.0.2" + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + checksum: 10c0/e498965d6938c63058c4310ffb6967f07d4fa06789d3364829028af380d299fe05762961742971c764973dce3d1f6a2633fe8b2d9410c9b52e534b4b882a99fa + languageName: node + linkType: hard + +"xml-name-validator@npm:^5.0.0": + version: 5.0.0 + resolution: "xml-name-validator@npm:5.0.0" + checksum: 10c0/3fcf44e7b73fb18be917fdd4ccffff3639373c7cb83f8fc35df6001fecba7942f1dbead29d91ebb8315e2f2ff786b508f0c9dc0215b6353f9983c6b7d62cb1f5 + languageName: node + linkType: hard + +"xmlchars@npm:^2.2.0": + version: 2.2.0 + resolution: "xmlchars@npm:2.2.0" + checksum: 10c0/b64b535861a6f310c5d9bfa10834cf49127c71922c297da9d4d1b45eeaae40bf9b4363275876088fbe2667e5db028d2cd4f8ee72eed9bede840a67d57dab7593 + languageName: node + linkType: hard + "yallist@npm:^4.0.0": version: 4.0.0 resolution: "yallist@npm:4.0.0"