From d6e282fe847d693339b6412d1513fafae647de01 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Lam?=
Date: Sat, 3 Oct 2026 16:27:23 +0200
Subject: [PATCH 01/21] Use leaflet-hotline from npm and update deps within
their ranges
npm 12 refuses git dependencies by default, so a fresh install failed.
The fork only existed to render rails into a chosen pane, which upstream
already allows via L.Hotline.renderer({pane}). Updating the runtime
dependencies within their semver ranges picks up fixes and clears the
high-severity audit findings in shipped code; Vue, vue-router and the
newer @types packages are held back as they need Vue 2.7 or a newer
TypeScript. leaflet-path-transform's in-range 1.9 is a rewrite, but it
keeps the _transformPoints used to rotate Box areas, which still render
identically.
(AI assisted using Claude Opus 5.5)
---
package-lock.json | 434 +++++++++++------------------
package.json | 2 +-
src/components/AppMapDetailsObj.ts | 2 +-
3 files changed, 157 insertions(+), 281 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 35a5f1e..73a268c 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,7 +15,7 @@
"leaflet-contextmenu": "^1.4.0",
"leaflet-defaulticon-compatibility": "^0.1.1",
"leaflet-draw": "^1.0.4",
- "leaflet-hotline": "github:savage13/Leaflet.hotline",
+ "leaflet-hotline": "^0.4.0",
"leaflet-path-transform": "^1.1.3",
"leaflet-rastercoords": "^1.0.3",
"leaflet-sidebar-v2": "^3.2.3",
@@ -3234,7 +3234,8 @@
"node_modules/balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
},
"node_modules/base": {
"version": "0.11.2",
@@ -3446,26 +3447,35 @@
"dev": true
},
"node_modules/bootstrap": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz",
- "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==",
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/bootstrap"
- },
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
+ "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==",
+ "deprecated": "This version of Bootstrap is no longer supported. Please upgrade to the latest version.",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/twbs"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/bootstrap"
+ }
+ ],
+ "license": "MIT",
"peerDependencies": {
"jquery": "1.9.1 - 3",
"popper.js": "^1.16.1"
}
},
"node_modules/bootstrap-vue": {
- "version": "2.21.2",
- "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.21.2.tgz",
- "integrity": "sha512-0Exe+4MZysqhZNXIKf4TzkvXaupxh9EHsoCRez0o5Dc0J7rlafayOEwql63qXv74CgZO8E4U8ugRNJko1vMvNw==",
+ "version": "2.23.1",
+ "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.23.1.tgz",
+ "integrity": "sha512-SEWkG4LzmMuWjQdSYmAQk1G/oOKm37dtNfjB5kxq0YafnL2W6qUAmeDTcIZVbPiQd2OQlIkWOMPBRGySk/zGsg==",
"hasInstallScript": true,
+ "license": "MIT",
"dependencies": {
"@nuxt/opencollective": "^0.3.2",
- "bootstrap": ">=4.5.3 <5.0.0",
+ "bootstrap": "^4.6.1",
"popper.js": "^1.16.1",
"portal-vue": "^2.1.7",
"vue-functional-data-merge": "^3.1.0"
@@ -3475,6 +3485,7 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
"dependencies": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -4093,18 +4104,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/cli": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
- "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
- "dependencies": {
- "exit": "0.1.2",
- "glob": "^7.1.1"
- },
- "engines": {
- "node": ">=0.2.5"
- }
- },
"node_modules/cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -4439,7 +4438,8 @@
"node_modules/concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
},
"node_modules/concat-stream": {
"version": "1.6.2",
@@ -4504,6 +4504,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
"dependencies": {
"date-now": "^0.1.4"
}
@@ -4792,7 +4793,8 @@
"node_modules/core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
},
"node_modules/cosmiconfig": {
"version": "5.2.1",
@@ -5280,7 +5282,8 @@
"node_modules/date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
},
"node_modules/de-indent": {
"version": "1.0.2",
@@ -5737,6 +5740,7 @@
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dev": true,
"dependencies": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
@@ -5746,6 +5750,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+ "dev": true,
"funding": [
{
"type": "github",
@@ -5757,6 +5762,7 @@
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
"integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true,
"funding": {
"url": "https://github.com/fb55/entities?sponsor=1"
}
@@ -5774,24 +5780,8 @@
"node_modules/domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
- },
- "node_modules/domhandler": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
- "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
- "dependencies": {
- "domelementtype": "1"
- }
- },
- "node_modules/domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "dependencies": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
},
"node_modules/dot-prop": {
"version": "5.3.0",
@@ -6020,11 +6010,6 @@
"safe-buffer": "~5.1.0"
}
},
- "node_modules/entities": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
- "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
- },
"node_modules/errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@@ -6441,14 +6426,6 @@
"node": ">=6"
}
},
- "node_modules/exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
"node_modules/expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -7215,7 +7192,8 @@
"node_modules/fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
},
"node_modules/fsevents": {
"version": "1.2.13",
@@ -7314,6 +7292,7 @@
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
"dependencies": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -7824,18 +7803,6 @@
"object-assign": "^4.0.1"
}
},
- "node_modules/htmlparser2": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
- "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
- "dependencies": {
- "domelementtype": "1",
- "domhandler": "2.3",
- "domutils": "1.5",
- "entities": "1.0",
- "readable-stream": "1.1"
- }
- },
"node_modules/http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@@ -8040,9 +8007,10 @@
}
},
"node_modules/immer": {
- "version": "10.0.4",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz",
- "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw==",
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
+ "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw==",
+ "license": "MIT",
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/immer"
@@ -8199,6 +8167,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"dependencies": {
"once": "^1.3.0",
"wrappy": "1"
@@ -8207,7 +8176,8 @@
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
},
"node_modules/inquirer": {
"version": "6.5.2",
@@ -8775,7 +8745,8 @@
"node_modules/isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
},
"node_modules/isexe": {
"version": "2.0.0",
@@ -8877,35 +8848,6 @@
"node": ">=4"
}
},
- "node_modules/jshint": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz",
- "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==",
- "dependencies": {
- "cli": "~1.0.0",
- "console-browserify": "1.1.x",
- "exit": "0.1.x",
- "htmlparser2": "3.8.x",
- "lodash": "~4.17.21",
- "minimatch": "~3.0.2",
- "shelljs": "0.3.x",
- "strip-json-comments": "1.0.x"
- },
- "bin": {
- "jshint": "bin/jshint"
- }
- },
- "node_modules/jshint/node_modules/strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=",
- "bin": {
- "strip-json-comments": "cli.js"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -9036,9 +8978,10 @@
"integrity": "sha1-4r2kga8QJggOq6oymX5TH9RPYFw="
},
"node_modules/leaflet-defaulticon-compatibility": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.1.tgz",
- "integrity": "sha512-vDBFdlUAwjSEGep9ih8kfJilf6yN8V9zTbF5NC/1ZwLeGko3RUQepspPnGCRMFV51dY3Lb3hziboicrFz+rxQA=="
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.2.tgz",
+ "integrity": "sha512-IrKagWxkTwzxUkFIumy/Zmo3ksjuAu3zEadtOuJcKzuXaD76Gwvg2Z1mLyx7y52ykOzM8rAH5ChBs4DnfdGa6Q==",
+ "license": "BSD-2-Clause"
},
"node_modules/leaflet-draw": {
"version": "1.0.4",
@@ -9047,28 +8990,35 @@
},
"node_modules/leaflet-hotline": {
"version": "0.4.0",
- "resolved": "git+ssh://git@github.com/savage13/Leaflet.hotline.git#a4b62bfadf5858214ea42d4ec94dc93bc9a122ae",
+ "resolved": "https://registry.npmjs.org/leaflet-hotline/-/leaflet-hotline-0.4.0.tgz",
+ "integrity": "sha512-+In6c8WxMsRKMmwQ1m2GmbNxbXvA3WsrOilJGK7l4Sj+mUDh1gdyGMYCIoRBtUeX7lMvBc4KKeEVAlwQERKpxg==",
"license": "BSD-2-Clause"
},
"node_modules/leaflet-path-drag": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/leaflet-path-drag/-/leaflet-path-drag-1.1.0.tgz",
- "integrity": "sha512-wd2uNgn3yuMl7HI0YG0z6qhxnRbvCQHE8ncpERfUZ6gTPbM5Xctwzyi+gE8cMnIDlv22GO3slSBupD9GW7jIEQ=="
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/leaflet-path-drag/-/leaflet-path-drag-1.9.5.tgz",
+ "integrity": "sha512-u2oQzU/IR+XezHwREyB4T3Og5DJXgdyxtmK+GEQyrVLUwLlWaFxa0QMGxlWgE4Ch+rSyUeYOq/x8uLnelC3DnQ==",
+ "license": "MIT"
},
"node_modules/leaflet-path-transform": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/leaflet-path-transform/-/leaflet-path-transform-1.1.3.tgz",
- "integrity": "sha512-hmF3igZVyKRcA4RprEUxA08hWN9ORpOK41wuvHWc839IFr9b0kpREzw2u1XmoImJYq67Omb3Q+MKT43tK90S3w==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/leaflet-path-transform/-/leaflet-path-transform-1.9.0.tgz",
+ "integrity": "sha512-QhTwoO4/ycaH5o4b/8OFNpzBXMnTQpWyI6BkkO0IyNrmgHkGMFlW7cQR5E3khrQE1NEFL2/VERD9ettGi/DWnw==",
+ "license": "MIT",
"dependencies": {
- "leaflet-path-drag": "^1.1.0"
+ "leaflet-path-drag": "1.9.5"
+ },
+ "peerDependencies": {
+ "leaflet": ">=1.8.0 <1.10.0"
}
},
"node_modules/leaflet-rastercoords": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/leaflet-rastercoords/-/leaflet-rastercoords-1.0.3.tgz",
- "integrity": "sha512-b3HoPniMUnih0PzKJzowTDXUBbg2Fm/Ry/ZDbZljG1T3E+2IAKGfO5sjCaVSBp4Ca1yKq3whgd6BUHBPFKbzrg==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/leaflet-rastercoords/-/leaflet-rastercoords-1.0.6.tgz",
+ "integrity": "sha512-uoGlGis7tKXdoeueCNwbfaclL38b/jztSwgWejHO+2EimxMbcQIr2PCG0E/kyJ9Z6WFkdoM2ypaypoHeitpKqg==",
+ "license": "MIT",
"dependencies": {
- "leaflet": "^1.3.3"
+ "leaflet": "^1.9.4"
}
},
"node_modules/leaflet-sidebar-v2": {
@@ -9077,13 +9027,10 @@
"integrity": "sha512-narzdn81Y/8YpgHR3jhs93LhrLq0AGSRo7CXHEICHfMeK6IHSbtFOF9CTSfueaumRK0TgvHkiiYJb9dTKta6ZQ=="
},
"node_modules/leaflet.markercluster": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.1.tgz",
- "integrity": "sha512-dRGndfMZibkWMBD7g8h+lJW0R0keTx1GGMErre7uhqnKiYBoMxR2VPX6Sy8oGNzg+FA7FKtTuO1hGh5HtV9s2g==",
- "dependencies": {
- "jshint": "^2.13.1",
- "npm-ci": "0.0.2"
- },
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz",
+ "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==",
+ "license": "MIT",
"peerDependencies": {
"leaflet": "^1.3.1"
}
@@ -9302,9 +9249,10 @@
}
},
"node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==",
+ "license": "MIT"
},
"node_modules/lodash.debounce": {
"version": "4.0.8",
@@ -9723,6 +9671,7 @@
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
"dependencies": {
"brace-expansion": "^1.1.7"
},
@@ -10164,12 +10113,6 @@
"node": ">=4"
}
},
- "node_modules/npm-ci": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/npm-ci/-/npm-ci-0.0.2.tgz",
- "integrity": "sha1-n2t2IMKFeAL7baJoEGnkCinjEHI=",
- "deprecated": "Test package"
- },
"node_modules/npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -10441,6 +10384,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
"dependencies": {
"wrappy": "1"
}
@@ -10820,6 +10764,7 @@
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
"integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true,
"engines": {
"node": ">=0.10.0"
}
@@ -12108,6 +12053,7 @@
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
"dependencies": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
@@ -13021,17 +12967,6 @@
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
- "node_modules/shelljs": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
- "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=",
- "bin": {
- "shjs": "bin/shjs"
- },
- "engines": {
- "node": ">=0.8.0"
- }
- },
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
@@ -13718,7 +13653,8 @@
"node_modules/string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
},
"node_modules/string-width": {
"version": "2.1.1",
@@ -15950,7 +15886,8 @@
"node_modules/wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"node_modules/write": {
"version": "1.0.3",
@@ -18701,7 +18638,8 @@
"balanced-match": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw=="
+ "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
+ "dev": true
},
"base": {
"version": "0.11.2",
@@ -18877,18 +18815,18 @@
"dev": true
},
"bootstrap": {
- "version": "4.6.0",
- "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.0.tgz",
- "integrity": "sha512-Io55IuQY3kydzHtbGvQya3H+KorS/M9rSNyfCGCg9WZ4pyT/lCxIlpJgG1GXW/PswzC84Tr2fBYi+7+jFVQQBw==",
+ "version": "4.6.2",
+ "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.6.2.tgz",
+ "integrity": "sha512-51Bbp/Uxr9aTuy6ca/8FbFloBUJZLHwnhTcnjIeRn2suQWsWzcuJhGjKDB5eppVte/8oCdOL3VuwxvZDUggwGQ==",
"requires": {}
},
"bootstrap-vue": {
- "version": "2.21.2",
- "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.21.2.tgz",
- "integrity": "sha512-0Exe+4MZysqhZNXIKf4TzkvXaupxh9EHsoCRez0o5Dc0J7rlafayOEwql63qXv74CgZO8E4U8ugRNJko1vMvNw==",
+ "version": "2.23.1",
+ "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.23.1.tgz",
+ "integrity": "sha512-SEWkG4LzmMuWjQdSYmAQk1G/oOKm37dtNfjB5kxq0YafnL2W6qUAmeDTcIZVbPiQd2OQlIkWOMPBRGySk/zGsg==",
"requires": {
"@nuxt/opencollective": "^0.3.2",
- "bootstrap": ">=4.5.3 <5.0.0",
+ "bootstrap": "^4.6.1",
"popper.js": "^1.16.1",
"portal-vue": "^2.1.7",
"vue-functional-data-merge": "^3.1.0"
@@ -18898,6 +18836,7 @@
"version": "1.1.11",
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
"integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
"requires": {
"balanced-match": "^1.0.0",
"concat-map": "0.0.1"
@@ -19426,15 +19365,6 @@
}
}
},
- "cli": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz",
- "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=",
- "requires": {
- "exit": "0.1.2",
- "glob": "^7.1.1"
- }
- },
"cli-cursor": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
@@ -19707,7 +19637,8 @@
"concat-map": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s="
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
},
"concat-stream": {
"version": "1.6.2",
@@ -19768,6 +19699,7 @@
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz",
"integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=",
+ "dev": true,
"requires": {
"date-now": "^0.1.4"
}
@@ -19994,7 +19926,8 @@
"core-util-is": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz",
- "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ=="
+ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==",
+ "dev": true
},
"cosmiconfig": {
"version": "5.2.1",
@@ -20392,7 +20325,8 @@
"date-now": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz",
- "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs="
+ "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=",
+ "dev": true
},
"de-indent": {
"version": "1.0.2",
@@ -20751,6 +20685,7 @@
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
"integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
+ "dev": true,
"requires": {
"domelementtype": "^2.0.1",
"entities": "^2.0.0"
@@ -20759,12 +20694,14 @@
"domelementtype": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
- "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A=="
+ "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
+ "dev": true
},
"entities": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz",
- "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A=="
+ "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==",
+ "dev": true
}
}
},
@@ -20777,24 +20714,8 @@
"domelementtype": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
- "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w=="
- },
- "domhandler": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz",
- "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=",
- "requires": {
- "domelementtype": "1"
- }
- },
- "domutils": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz",
- "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=",
- "requires": {
- "dom-serializer": "0",
- "domelementtype": "1"
- }
+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
+ "dev": true
},
"dot-prop": {
"version": "5.3.0",
@@ -21004,11 +20925,6 @@
}
}
},
- "entities": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz",
- "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY="
- },
"errno": {
"version": "0.1.8",
"resolved": "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz",
@@ -21328,11 +21244,6 @@
"strip-eof": "^1.0.0"
}
},
- "exit": {
- "version": "0.1.2",
- "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz",
- "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw="
- },
"expand-brackets": {
"version": "2.1.4",
"resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
@@ -21959,7 +21870,8 @@
"fs.realpath": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8="
+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
+ "dev": true
},
"fsevents": {
"version": "1.2.13",
@@ -22035,6 +21947,7 @@
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
"integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
+ "dev": true,
"requires": {
"fs.realpath": "^1.0.0",
"inflight": "^1.0.4",
@@ -22442,18 +22355,6 @@
}
}
},
- "htmlparser2": {
- "version": "3.8.3",
- "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz",
- "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=",
- "requires": {
- "domelementtype": "1",
- "domhandler": "2.3",
- "domutils": "1.5",
- "entities": "1.0",
- "readable-stream": "1.1"
- }
- },
"http-deceiver": {
"version": "1.2.7",
"resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz",
@@ -22608,9 +22509,9 @@
"optional": true
},
"immer": {
- "version": "10.0.4",
- "resolved": "https://registry.npmjs.org/immer/-/immer-10.0.4.tgz",
- "integrity": "sha512-cuBuGK40P/sk5IzWa9QPUaAdvPHjkk1c+xYsd9oZw+YQQEV+10G0P5uMpGctZZKnyQ+ibRO08bD25nWLmYi2pw=="
+ "version": "10.2.0",
+ "resolved": "https://registry.npmjs.org/immer/-/immer-10.2.0.tgz",
+ "integrity": "sha512-d/+XTN3zfODyjr89gM3mPq1WNX2B8pYsu7eORitdwyA2sBubnTl3laYlBk4sXY5FUa5qTZGBDPJICVbvqzjlbw=="
},
"import-cwd": {
"version": "2.1.0",
@@ -22726,6 +22627,7 @@
"version": "1.0.6",
"resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
"integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
+ "dev": true,
"requires": {
"once": "^1.3.0",
"wrappy": "1"
@@ -22734,7 +22636,8 @@
"inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "dev": true
},
"inquirer": {
"version": "6.5.2",
@@ -23151,7 +23054,8 @@
"isarray": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
- "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8="
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
},
"isexe": {
"version": "2.0.0",
@@ -23232,28 +23136,6 @@
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
- "jshint": {
- "version": "2.13.1",
- "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.13.1.tgz",
- "integrity": "sha512-vymzfR3OysF5P774x6zYv0bD4EpH6NWRxpq54wO9mA9RuY49yb1teKSICkLx2Ryx+mfzlVVNNbTBtsRtg78t7g==",
- "requires": {
- "cli": "~1.0.0",
- "console-browserify": "1.1.x",
- "exit": "0.1.x",
- "htmlparser2": "3.8.x",
- "lodash": "~4.17.21",
- "minimatch": "~3.0.2",
- "shelljs": "0.3.x",
- "strip-json-comments": "1.0.x"
- },
- "dependencies": {
- "strip-json-comments": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz",
- "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E="
- }
- }
- },
"json-parse-better-errors": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
@@ -23371,9 +23253,9 @@
"integrity": "sha1-4r2kga8QJggOq6oymX5TH9RPYFw="
},
"leaflet-defaulticon-compatibility": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.1.tgz",
- "integrity": "sha512-vDBFdlUAwjSEGep9ih8kfJilf6yN8V9zTbF5NC/1ZwLeGko3RUQepspPnGCRMFV51dY3Lb3hziboicrFz+rxQA=="
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/leaflet-defaulticon-compatibility/-/leaflet-defaulticon-compatibility-0.1.2.tgz",
+ "integrity": "sha512-IrKagWxkTwzxUkFIumy/Zmo3ksjuAu3zEadtOuJcKzuXaD76Gwvg2Z1mLyx7y52ykOzM8rAH5ChBs4DnfdGa6Q=="
},
"leaflet-draw": {
"version": "1.0.4",
@@ -23381,28 +23263,29 @@
"integrity": "sha512-rsQ6saQO5ST5Aj6XRFylr5zvarWgzWnrg46zQ1MEOEIHsppdC/8hnN8qMoFvACsPvTioAuysya/TVtog15tyAQ=="
},
"leaflet-hotline": {
- "version": "git+ssh://git@github.com/savage13/Leaflet.hotline.git#a4b62bfadf5858214ea42d4ec94dc93bc9a122ae",
- "from": "leaflet-hotline@github:savage13/Leaflet.hotline"
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/leaflet-hotline/-/leaflet-hotline-0.4.0.tgz",
+ "integrity": "sha512-+In6c8WxMsRKMmwQ1m2GmbNxbXvA3WsrOilJGK7l4Sj+mUDh1gdyGMYCIoRBtUeX7lMvBc4KKeEVAlwQERKpxg=="
},
"leaflet-path-drag": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/leaflet-path-drag/-/leaflet-path-drag-1.1.0.tgz",
- "integrity": "sha512-wd2uNgn3yuMl7HI0YG0z6qhxnRbvCQHE8ncpERfUZ6gTPbM5Xctwzyi+gE8cMnIDlv22GO3slSBupD9GW7jIEQ=="
+ "version": "1.9.5",
+ "resolved": "https://registry.npmjs.org/leaflet-path-drag/-/leaflet-path-drag-1.9.5.tgz",
+ "integrity": "sha512-u2oQzU/IR+XezHwREyB4T3Og5DJXgdyxtmK+GEQyrVLUwLlWaFxa0QMGxlWgE4Ch+rSyUeYOq/x8uLnelC3DnQ=="
},
"leaflet-path-transform": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/leaflet-path-transform/-/leaflet-path-transform-1.1.3.tgz",
- "integrity": "sha512-hmF3igZVyKRcA4RprEUxA08hWN9ORpOK41wuvHWc839IFr9b0kpREzw2u1XmoImJYq67Omb3Q+MKT43tK90S3w==",
+ "version": "1.9.0",
+ "resolved": "https://registry.npmjs.org/leaflet-path-transform/-/leaflet-path-transform-1.9.0.tgz",
+ "integrity": "sha512-QhTwoO4/ycaH5o4b/8OFNpzBXMnTQpWyI6BkkO0IyNrmgHkGMFlW7cQR5E3khrQE1NEFL2/VERD9ettGi/DWnw==",
"requires": {
- "leaflet-path-drag": "^1.1.0"
+ "leaflet-path-drag": "1.9.5"
}
},
"leaflet-rastercoords": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/leaflet-rastercoords/-/leaflet-rastercoords-1.0.3.tgz",
- "integrity": "sha512-b3HoPniMUnih0PzKJzowTDXUBbg2Fm/Ry/ZDbZljG1T3E+2IAKGfO5sjCaVSBp4Ca1yKq3whgd6BUHBPFKbzrg==",
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/leaflet-rastercoords/-/leaflet-rastercoords-1.0.6.tgz",
+ "integrity": "sha512-uoGlGis7tKXdoeueCNwbfaclL38b/jztSwgWejHO+2EimxMbcQIr2PCG0E/kyJ9Z6WFkdoM2ypaypoHeitpKqg==",
"requires": {
- "leaflet": "^1.3.3"
+ "leaflet": "^1.9.4"
}
},
"leaflet-sidebar-v2": {
@@ -23411,13 +23294,10 @@
"integrity": "sha512-narzdn81Y/8YpgHR3jhs93LhrLq0AGSRo7CXHEICHfMeK6IHSbtFOF9CTSfueaumRK0TgvHkiiYJb9dTKta6ZQ=="
},
"leaflet.markercluster": {
- "version": "1.5.1",
- "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.1.tgz",
- "integrity": "sha512-dRGndfMZibkWMBD7g8h+lJW0R0keTx1GGMErre7uhqnKiYBoMxR2VPX6Sy8oGNzg+FA7FKtTuO1hGh5HtV9s2g==",
- "requires": {
- "jshint": "^2.13.1",
- "npm-ci": "0.0.2"
- }
+ "version": "1.5.3",
+ "resolved": "https://registry.npmjs.org/leaflet.markercluster/-/leaflet.markercluster-1.5.3.tgz",
+ "integrity": "sha512-vPTw/Bndq7eQHjLBVlWpnGeLa3t+3zGiuM7fJwCkiMFq+nmRuG3RI3f7f4N4TDX7T4NpbAXpR2+NTRSEGfCSeA==",
+ "requires": {}
},
"less": {
"version": "3.13.1",
@@ -23587,9 +23467,9 @@
}
},
"lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
+ "version": "4.18.1",
+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz",
+ "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q=="
},
"lodash.debounce": {
"version": "4.0.8",
@@ -23942,6 +23822,7 @@
"version": "3.0.8",
"resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz",
"integrity": "sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==",
+ "dev": true,
"requires": {
"brace-expansion": "^1.1.7"
}
@@ -24321,11 +24202,6 @@
"sort-keys": "^1.0.0"
}
},
- "npm-ci": {
- "version": "0.0.2",
- "resolved": "https://registry.npmjs.org/npm-ci/-/npm-ci-0.0.2.tgz",
- "integrity": "sha1-n2t2IMKFeAL7baJoEGnkCinjEHI="
- },
"npm-run-path": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
@@ -24526,6 +24402,7 @@
"version": "1.4.0",
"resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
"integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
+ "dev": true,
"requires": {
"wrappy": "1"
}
@@ -24844,7 +24721,8 @@
"path-is-absolute": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18="
+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
+ "dev": true
},
"path-is-inside": {
"version": "1.0.2",
@@ -25938,6 +25816,7 @@
"version": "1.1.14",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
"integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
"requires": {
"core-util-is": "~1.0.0",
"inherits": "~2.0.1",
@@ -26691,11 +26570,6 @@
"integrity": "sha512-Vpfqwm4EnqGdlsBFNmHhxhElJYrdfcxPThu+ryKS5J8L/fhAwLazFZtq+S+TWZ9ANj2piSQLGj6NQg+lKPmxrw==",
"dev": true
},
- "shelljs": {
- "version": "0.3.0",
- "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz",
- "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E="
- },
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
@@ -27297,7 +27171,8 @@
"string_decoder": {
"version": "0.10.31",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz",
- "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ="
+ "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=",
+ "dev": true
},
"string-width": {
"version": "2.1.1",
@@ -29099,7 +28974,8 @@
"wrappy": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8="
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
},
"write": {
"version": "1.0.3",
diff --git a/package.json b/package.json
index 7ae34e3..9173949 100644
--- a/package.json
+++ b/package.json
@@ -16,7 +16,7 @@
"leaflet-contextmenu": "^1.4.0",
"leaflet-defaulticon-compatibility": "^0.1.1",
"leaflet-draw": "^1.0.4",
- "leaflet-hotline": "github:savage13/Leaflet.hotline",
+ "leaflet-hotline": "^0.4.0",
"leaflet-path-transform": "^1.1.3",
"leaflet-rastercoords": "^1.0.3",
"leaflet-sidebar-v2": "^3.2.3",
diff --git a/src/components/AppMapDetailsObj.ts b/src/components/AppMapDetailsObj.ts
index 3c73e50..0083683 100644
--- a/src/components/AppMapDetailsObj.ts
+++ b/src/components/AppMapDetailsObj.ts
@@ -269,7 +269,7 @@ export default class AppMapDetailsObj extends AppMapDetailsBase [pt[2], pt[0], pt[1]]);
// @ts-ignore
- return L.hotline(pts, opts).addTo(map.m);
+ return L.hotline(pts, { ...opts, renderer: L.Hotline.renderer({ pane: opts.pane }) }).addTo(map.m);
});
if (this.railMarkers.length) {
if (!this.staticData.colorScale) {
From 5a3f2d3bb0501c333e34b022c3fe3d7c47835a37 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Lam?=
Date: Sat, 3 Oct 2026 16:27:23 +0200
Subject: [PATCH 02/21] CI: build every push and PR on Node 26, deploy only
from master
Node 18 and the v3 actions are end-of-life; Node 26 is the newest LTS
line, supported until April 2029. Building every push and PR catches
broken builds before they reach master, and npm ci builds exactly what
the lockfile says. The rsync action moves to 9.0.1, pinned by commit
since it receives the deploy key; its inputs are unchanged.
(AI assisted using Claude Opus 5.5)
---
.github/workflows/deploy.yml | 14 +++++++-------
1 file changed, 7 insertions(+), 7 deletions(-)
diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml
index e20508c..95b53b3 100644
--- a/.github/workflows/deploy.yml
+++ b/.github/workflows/deploy.yml
@@ -1,24 +1,24 @@
name: deploy
on:
push:
- branches:
- - master
+ pull_request:
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- - uses: actions/checkout@v3
- - uses: actions/setup-node@v3
+ - uses: actions/checkout@v7
+ - uses: actions/setup-node@v7
with:
- node-version: 18
+ node-version: 26
cache: 'npm'
- name: install dependencies
- run: npm install --include=dev
+ run: npm ci
- name: build
run: npm run build
- name: deploy build
- uses: burnett01/rsync-deployments@7.0.1
+ if: github.event_name == 'push' && github.ref == 'refs/heads/master'
+ uses: burnett01/rsync-deployments@155b6d6c1219ab2224c20c58d423a3f1b850395f # 9.0.1
with:
switches: -avr
path: dist/
From a8952c344bcfcff0dcafc5c250d67d13a11c3a14 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Lam?=
Date: Sat, 3 Oct 2026 16:27:23 +0200
Subject: [PATCH 03/21] Replace Vue-2-only patterns ahead of the Vue 3
migration
Vue 3 removes $on/$off, `new Component()`, prop mutation and .native.
A typed mitt bus, one helper that mounts the draw popup, local copies of
the popup's props and an explicit click emit from ObjectInfo let the
same call sites work on both versions, so the switch only has to rewrite
the mounting helper. Passing the native event keeps .stop/.prevent
working on ObjectInfo clicks.
(AI assisted using Claude Opus 5.5)
---
package-lock.json | 12 ++++
package.json | 1 +
src/components/AppMap.ts | 102 ++++++++++++++--------------
src/components/AppMap.vue | 2 +-
src/components/AppMapDetailsObj.ts | 5 +-
src/components/AppMapDetailsObj.vue | 10 +--
src/components/AppMapPopup.ts | 47 ++++++++-----
src/components/AppMapPopup.vue | 4 +-
src/components/AppMapSettings.ts | 5 +-
src/components/ObjectInfo.vue | 2 +-
src/util/bus.ts | 31 +++++++++
src/util/mount.ts | 18 +++++
src/util/polyline.ts | 2 +-
13 files changed, 159 insertions(+), 82 deletions(-)
create mode 100644 src/util/bus.ts
create mode 100644 src/util/mount.ts
diff --git a/package-lock.json b/package-lock.json
index 73a268c..3672341 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -21,6 +21,7 @@
"leaflet-sidebar-v2": "^3.2.3",
"leaflet.markercluster": "^1.4.1",
"lodash": "^4.17.21",
+ "mitt": "^3.0.1",
"terser": "^4.8.1",
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
@@ -9716,6 +9717,12 @@
"once": "^1.3.1"
}
},
+ "node_modules/mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==",
+ "license": "MIT"
+ },
"node_modules/mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
@@ -23863,6 +23870,11 @@
}
}
},
+ "mitt": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz",
+ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw=="
+ },
"mixin-deep": {
"version": "1.3.2",
"resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
diff --git a/package.json b/package.json
index 9173949..24584d9 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"leaflet-sidebar-v2": "^3.2.3",
"leaflet.markercluster": "^1.4.1",
"lodash": "^4.17.21",
+ "mitt": "^3.0.1",
"terser": "^4.8.1",
"vue": "^2.6.11",
"vue-class-component": "^7.2.3",
diff --git a/src/components/AppMap.ts b/src/components/AppMap.ts
index 349110d..3a6e7ec 100644
--- a/src/components/AppMap.ts
+++ b/src/components/AppMap.ts
@@ -41,17 +41,13 @@ import { Point } from '@/util/map';
import { Settings } from '@/util/settings';
import * as ui from '@/util/ui';
import { calcLayerLength } from '@/util/polyline';
+import { mountComponent, MountedComponent } from '@/util/mount';
+import { appMapBus, ObjectIdentifier, onAppMapEvents } from '@/util/bus';
import '@/util/leaflet_tile_workaround.js';
-import AppMapPopup from '@/components/AppMapPopup';
+import AppMapPopup, { AppMapPopupProps } from '@/components/AppMapPopup';
import draggable from 'vuedraggable';
-interface ObjectIdentifier {
- mapType: string;
- mapName: string;
- hashId: number;
-}
-
function valueOrDefault(value: T | undefined, defaultValue: T) {
return value === undefined ? defaultValue : value;
}
@@ -175,8 +171,8 @@ function layerSetTooltip(layer: L.Marker | L.Polyline) {
}
}
-function layerSetPopup(layer: L.Marker | L.Polyline, popup: AppMapPopup) {
- layer.bindPopup(popup.$el as HTMLElement, { minWidth: 200 });
+function layerSetPopup(layer: L.Marker | L.Polyline, popup: MountedComponent) {
+ layer.bindPopup(popup.el, { minWidth: 200 });
// @ts-ignore
// popup instance is needed later to update the length
layer.popup = popup;
@@ -184,22 +180,21 @@ function layerSetPopup(layer: L.Marker | L.Polyline, popup: AppMapPopup) {
function addPopupAndTooltip(layer: L.Marker | L.Polyline, root: any) {
if (layer && layer.feature) {
- let popup = new AppMapPopup({ propsData: layer.feature.properties });
- // Initiate the Element as $el
- popup.$mount();
- // Respond to `title` and `text` messages
- popup.$on('title', (txt: string) => {
- if (layer && layer.feature) {
- layer.feature.properties.title = txt;
- layerSetTooltip(layer);
- root.updateDrawLayerOpts({ title: txt, layer });
- }
- });
- popup.$on('text', (txt: string) => {
- if (layer && layer.feature) {
- layer.feature.properties.text = txt;
- root.updateDrawLayerOpts({ txt: txt, layer });
- }
+ const { title, text, pathLength } = layer.feature.properties;
+ const popup = mountComponent(AppMapPopup, { title, text, pathLength }, {
+ title: (txt: string) => {
+ if (layer && layer.feature) {
+ layer.feature.properties.title = txt;
+ layerSetTooltip(layer);
+ root.updateDrawLayerOpts({ title: txt, layer });
+ }
+ },
+ text: (txt: string) => {
+ if (layer && layer.feature) {
+ layer.feature.properties.text = txt;
+ root.updateDrawLayerOpts({ txt: txt, layer });
+ }
+ },
});
// Create Popup and Tooltip
layerSetPopup(layer, popup);
@@ -235,6 +230,8 @@ export default class AppMap extends mixins(MixinUtil) {
private drawLineColor = '#3388ff';
private setLineColorThrottler!: () => void;
+ private offAppMapEvents!: () => void;
+
private previousGotoMarker: L.Marker | null = null;
private greatPlateauBarrierShown = false;
@@ -1168,22 +1165,31 @@ export default class AppMap extends mixins(MixinUtil) {
}
initEvents() {
- this.$on('AppMap:switch-pane', (pane: string) => {
- this.switchPane(pane);
- });
- this.$on('AppMap:toggle-y-values', () => {
- this.toggleY();
- });
- this.$on('AppMap:toggle-xz-values', () => {
- this.toggleXZ();
- });
-
- this.$on('AppMap:open-obj', async (obj: ObjectData) => {
- if (this.tempObjMarker)
- this.tempObjMarker.data.getMarker().remove();
- this.tempObjMarker = new ui.Unobservable(new MapMarkers.MapMarkerObj(this.map, obj, '#e02500', '#ff2a00'));
- this.tempObjMarker.data.getMarker().addTo(this.map.m);
- this.openMarkerDetails(getMarkerDetailsComponent(this.tempObjMarker.data), this.tempObjMarker.data);
+ this.offAppMapEvents = onAppMapEvents({
+ 'AppMap:switch-pane': (pane) => {
+ this.switchPane(pane);
+ },
+ 'AppMap:toggle-y-values': () => {
+ this.toggleY();
+ },
+ 'AppMap:toggle-xz-values': () => {
+ this.toggleXZ();
+ },
+ 'AppMap:open-obj': async (obj) => {
+ if (this.tempObjMarker)
+ this.tempObjMarker.data.getMarker().remove();
+ this.tempObjMarker = new ui.Unobservable(new MapMarkers.MapMarkerObj(this.map, obj, '#e02500', '#ff2a00'));
+ this.tempObjMarker.data.getMarker().addTo(this.map.m);
+ this.openMarkerDetails(getMarkerDetailsComponent(this.tempObjMarker.data), this.tempObjMarker.data);
+ },
+ 'AppMap:show-gen-group': async (id) => {
+ const group = new SearchResultGroup('', `Generation group for ${id.mapType}/${id.mapName}:${id.hashId}`);
+ await group.init(this.map);
+ const objs = await MapMgr.getInstance().getObjGenGroup(id.mapType, id.mapName, id.hashId);
+ group.setObjects(this.map, objs);
+ group.update(SearchResultUpdateMode.UpdateStyle | SearchResultUpdateMode.UpdateVisibility, this.searchExcludedSets);
+ this.searchGroups.push(group);
+ },
});
this.map.m.on('click', () => {
@@ -1191,16 +1197,9 @@ export default class AppMap extends mixins(MixinUtil) {
this.tempObjMarker.data.getMarker().remove();
});
- this.$on('AppMap:show-gen-group', async (id: ObjectIdentifier) => {
- const group = new SearchResultGroup('', `Generation group for ${id.mapType}/${id.mapName}:${id.hashId}`);
- await group.init(this.map);
- const objs = await MapMgr.getInstance().getObjGenGroup(id.mapType, id.mapName, id.hashId);
- group.setObjects(this.map, objs);
- group.update(SearchResultUpdateMode.UpdateStyle | SearchResultUpdateMode.UpdateVisibility, this.searchExcludedSets);
- this.searchGroups.push(group);
- });
this.map.m.on('AppMap:show-gen-group', (args) => {
- this.$emit('AppMap:show-gen-group', args);
+ const { mapType, mapName, hashId } = args as L.LeafletEvent & ObjectIdentifier;
+ appMapBus.emit('AppMap:show-gen-group', { mapType, mapName, hashId });
});
}
@@ -1478,12 +1477,13 @@ export default class AppMap extends mixins(MixinUtil) {
const [mapType, mapName, hashId] = this.$route.query.id.toString().split(',');
MapMgr.getInstance().getObj(mapType, mapName, parseInt(hashId, 0)).then((obj) => {
if (obj)
- this.$emit('AppMap:open-obj', obj);
+ appMapBus.emit('AppMap:open-obj', obj);
});
}
}
beforeDestroy() {
+ this.offAppMapEvents();
this.map.m.remove();
}
diff --git a/src/components/AppMap.vue b/src/components/AppMap.vue
index d91683e..c409a38 100644
--- a/src/components/AppMap.vue
+++ b/src/components/AppMap.vue
@@ -214,7 +214,7 @@
Hide
Link
-
+
diff --git a/src/components/AppMapDetailsObj.ts b/src/components/AppMapDetailsObj.ts
index 0083683..0c09e80 100644
--- a/src/components/AppMapDetailsObj.ts
+++ b/src/components/AppMapDetailsObj.ts
@@ -10,6 +10,7 @@ import ObjectInfo from '@/components/ObjectInfo';
import ShopData from '@/components/ShopData';
import { MapMgr, ObjectData, ObjectMinData, PlacementLink } from '@/services/MapMgr';
import { MsgMgr } from '@/services/MsgMgr';
+import { appMapBus } from '@/util/bus';
import * as ui from '@/util/ui';
import { Settings } from '@/util/settings';
@@ -344,13 +345,13 @@ export default class AppMapDetailsObj extends AppMapDetailsBase
Inputs
-
+
@@ -92,7 +92,7 @@
Linked by
-
+
@@ -100,7 +100,7 @@
Links to
-
+
@@ -108,7 +108,7 @@
Generation group
-
+
diff --git a/src/components/AppMapPopup.ts b/src/components/AppMapPopup.ts
index 2b69b32..c637ac6 100644
--- a/src/components/AppMapPopup.ts
+++ b/src/components/AppMapPopup.ts
@@ -1,21 +1,34 @@
-
import Vue from 'vue';
import Component from 'vue-class-component';
+import { Prop, Watch } from 'vue-property-decorator';
+
+export interface AppMapPopupProps {
+ title?: string;
+ text?: string;
+ pathLength?: number;
+}
+
+@Component
+export default class AppMapPopup extends Vue {
+ @Prop(String)
+ private title!: string;
+
+ @Prop(String)
+ private text!: string;
+
+ @Prop(Number)
+ private pathLength!: number;
+
+ private currentTitle = this.title;
+ private currentText = this.text;
-@Component({
- props: {
- title: String,
- text: String,
- pathLength: Number,
- },
- watch: {
- title: function(new_val: string, old_val: string) {
- this.$emit('title', new_val);
- },
- text: function(new_val: string, old_val: string) {
- this.$emit('text', new_val);
- }
- },
-})
+ @Watch('currentTitle')
+ onTitleChanged(val: string) {
+ this.$emit('title', val);
+ }
-export default class AppMapPopup extends Vue { }
+ @Watch('currentText')
+ onTextChanged(val: string) {
+ this.$emit('text', val);
+ }
+}
diff --git a/src/components/AppMapPopup.vue b/src/components/AppMapPopup.vue
index 3619774..572e6de 100644
--- a/src/components/AppMapPopup.vue
+++ b/src/components/AppMapPopup.vue
@@ -1,7 +1,7 @@
-
-
+
+
Length: {{pathLength.toFixed(2)}}
diff --git a/src/components/AppMapSettings.ts b/src/components/AppMapSettings.ts
index ee6c0af..c3e1299 100644
--- a/src/components/AppMapSettings.ts
+++ b/src/components/AppMapSettings.ts
@@ -3,6 +3,7 @@ import { Prop } from 'vue-property-decorator';
import Component from 'vue-class-component';
import { MsgMgr } from '@/services/MsgMgr';
+import { appMapBus } from '@/util/bus';
import { Settings } from '@/util/settings';
function makeMainFieldDungeonEntry(mapName: string) {
@@ -47,10 +48,10 @@ export default class AppMapSettings extends Vue {
}
toggleY() {
- this.$parent.$emit('AppMap:toggle-y-values');
+ appMapBus.emit('AppMap:toggle-y-values');
}
toggleXZ() {
- this.$parent.$emit('AppMap:toggle-xz-values');
+ appMapBus.emit('AppMap:toggle-xz-values');
}
private loadSettings() {
diff --git a/src/components/ObjectInfo.vue b/src/components/ObjectInfo.vue
index 92c5b42..8252626 100644
--- a/src/components/ObjectInfo.vue
+++ b/src/components/ObjectInfo.vue
@@ -1,5 +1,5 @@
-
+
diff --git a/src/util/bus.ts b/src/util/bus.ts
new file mode 100644
index 0000000..3d5a780
--- /dev/null
+++ b/src/util/bus.ts
@@ -0,0 +1,31 @@
+import mitt, { Handler } from 'mitt';
+
+import { ObjectData } from '@/services/MapMgr';
+
+export interface ObjectIdentifier {
+ mapType: string;
+ mapName: string;
+ hashId: number;
+}
+
+type AppMapEvents = {
+ 'AppMap:switch-pane': string;
+ 'AppMap:toggle-y-values': undefined;
+ 'AppMap:toggle-xz-values': undefined;
+ 'AppMap:open-obj': ObjectData;
+ 'AppMap:show-gen-group': ObjectIdentifier;
+};
+
+type AppMapHandlers = { [K in keyof AppMapEvents]?: Handler };
+
+export const appMapBus = mitt();
+
+export function onAppMapEvents(handlers: AppMapHandlers): () => void {
+ const types = Object.keys(handlers) as Array;
+ for (const type of types)
+ appMapBus.on(type, handlers[type] as Handler);
+ return () => {
+ for (const type of types)
+ appMapBus.off(type, handlers[type] as Handler);
+ };
+}
diff --git a/src/util/mount.ts b/src/util/mount.ts
new file mode 100644
index 0000000..4839cd9
--- /dev/null
+++ b/src/util/mount.ts
@@ -0,0 +1,18 @@
+import Vue, { Component } from 'vue';
+
+export interface MountedComponent {
+ el: HTMLElement;
+ props: Props;
+}
+
+export function mountComponent(
+ component: Component,
+ props: Props,
+ listeners: Record void> = {},
+): MountedComponent {
+ const reactiveProps = Vue.observable({ ...props });
+ const vm = new Vue({
+ render: h => h(component, { props: reactiveProps, on: listeners }),
+ }).$mount();
+ return { el: vm.$el as HTMLElement, props: reactiveProps };
+}
diff --git a/src/util/polyline.ts b/src/util/polyline.ts
index 037c0db..e1355bf 100644
--- a/src/util/polyline.ts
+++ b/src/util/polyline.ts
@@ -41,6 +41,6 @@ export function calcLayerLength(layer: L.Marker | L.Polyline) {
// Tell Popup the length parameter
let z: any = layer;
if (z.popup) {
- z.popup.pathLength = layer.feature.properties.pathLength;
+ z.popup.props.pathLength = layer.feature.properties.pathLength;
}
}
From cd773219ec89bedbfcf11d0c7dc949585a033f23 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Lam?=
Date: Sat, 3 Oct 2026 16:27:23 +0200
Subject: [PATCH 04/21] Upgrade to TypeScript 4.9 and Vue 2.7
TS 3.9 can't parse current @types packages, and Vue 2.7 backports the
Composition API and Vue 3 typings as a stepping stone towards Vue 3.
Types are pinned to their last TS 4.9-compatible releases. Target drops
to es2020 because webpack 4's parser predates the class fields and
static blocks TS emits for esnext, and define semantics stay off for
vue-class-component and Leaflet subclasses. lintOnSave is off because
the old ESLint TS parser crashes under TS 4.9. vuedraggable has no Vue 3
release; vue-draggable-plus keeps its v-model + @update contract but
needs 2.7's Composition API, so the swap happens here.
(AI assisted using Claude Opus 5.5)
---
package-lock.json | 503 +++++++++++++++++++++++++-------------
package.json | 19 +-
src/MapMarker.ts | 4 +-
src/components/AppMap.ts | 6 +-
src/components/AppMap.vue | 4 +-
src/util/CanvasMarker.ts | 2 +-
tsconfig.json | 3 +-
vue.config.js | 5 +-
8 files changed, 359 insertions(+), 187 deletions(-)
diff --git a/package-lock.json b/package-lock.json
index 3672341..72a5db1 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -23,17 +23,17 @@
"lodash": "^4.17.21",
"mitt": "^3.0.1",
"terser": "^4.8.1",
- "vue": "^2.6.11",
+ "vue": "2.7.16",
"vue-class-component": "^7.2.3",
+ "vue-draggable-plus": "^0.6.1",
"vue-property-decorator": "^7.0.0",
- "vue-router": "^3.2.0",
- "vuedraggable": "^2.24.3"
+ "vue-router": "^3.2.0"
},
"devDependencies": {
- "@types/leaflet": "^1.5.21",
- "@types/leaflet-draw": "^0.4.14",
- "@types/leaflet.markercluster": "^1.4.3",
- "@types/lodash": "^4.14.168",
+ "@types/leaflet": "1.9.14",
+ "@types/leaflet-draw": "1.0.11",
+ "@types/leaflet.markercluster": "1.5.5",
+ "@types/lodash": "4.17.13",
"@vue/cli-plugin-babel": "^3.12.1",
"@vue/cli-plugin-eslint": "^3.12.1",
"@vue/cli-plugin-typescript": "^3.12.1",
@@ -45,8 +45,9 @@
"leaflet": "^1.9.4",
"less": "^3.13.1",
"less-loader": "^4.1.0",
- "typescript": "^3.9.7",
- "vue-template-compiler": "^2.6.11"
+ "typescript": "~4.9.5",
+ "vue-loader": "^15.11.1",
+ "vue-template-compiler": "2.7.16"
}
},
"node_modules/@babel/code-frame": {
@@ -391,11 +392,20 @@
"node": ">=6.9.0"
}
},
+ "node_modules/@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.9.0"
+ }
+ },
"node_modules/@babel/helper-validator-identifier": {
- "version": "7.14.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
- "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
- "dev": true,
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==",
+ "license": "MIT",
"engines": {
"node": ">=6.9.0"
}
@@ -453,10 +463,13 @@
}
},
"node_modules/@babel/parser": {
- "version": "7.15.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
- "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==",
- "dev": true,
+ "version": "7.29.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz",
+ "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==",
+ "license": "MIT",
+ "dependencies": {
+ "@babel/types": "^7.29.8"
+ },
"bin": {
"parser": "bin/babel-parser.js"
},
@@ -1258,13 +1271,13 @@
}
},
"node_modules/@babel/types": {
- "version": "7.15.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
- "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
- "dev": true,
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
+ "license": "MIT",
"dependencies": {
- "@babel/helper-validator-identifier": "^7.14.9",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
},
"engines": {
"node": ">=6.9.0"
@@ -1487,37 +1500,41 @@
"dev": true
},
"node_modules/@types/leaflet": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.5.tgz",
- "integrity": "sha512-+Myo00Yb5OuvUyrH+vUwn9DRgOaBJsF/etIMdMcNhWGBMo58Mo1cxLInvCd0ZpvItju/AeDYFB/Od2pLiHB3VA==",
+ "version": "1.9.14",
+ "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.14.tgz",
+ "integrity": "sha512-sx2q6MDJaajwhKeVgPSvqXd8rhNJSTA3tMidQGduZn9S6WBYxDkCpSpV5xXEmSg7Cgdk/5vJGhVF1kMYLzauBg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/geojson": "*"
}
},
"node_modules/@types/leaflet-draw": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/@types/leaflet-draw/-/leaflet-draw-0.4.14.tgz",
- "integrity": "sha512-TyOZtr5SZf9ELR5EMLFwDlZuCGyjG0saUA6hEguZNEoratDiag1G/2eAVeYwK2NOX9N0zxQ9eDCRsjJK420X9g==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@types/leaflet-draw/-/leaflet-draw-1.0.11.tgz",
+ "integrity": "sha512-dyedtNm3aSmnpi6FM6VSl28cQuvP+MD7pgpXyO3Q1ZOCvrJKmzaDq0P3YZTnnBs61fQCKSnNYmbvCkDgFT9FHQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/leaflet": "*"
}
},
"node_modules/@types/leaflet.markercluster": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.4.5.tgz",
- "integrity": "sha512-R9Ql//z6muSGI5mPfr+FaKQQB7EIdQQyivYweVSdOrWr8WyNNFcSwfl+mqGYJFhRRCO/6lbZiM3scEyp9LdaFg==",
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.5.tgz",
+ "integrity": "sha512-TkWOhSHDM1ANxmLi+uK0PjsVcjIKBr8CLV2WoF16dIdeFmC0Cj5P5axkI3C1Xsi4+ht6EU8+BfEbbqEF9icPrg==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@types/leaflet": "*"
}
},
"node_modules/@types/lodash": {
- "version": "4.14.172",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz",
- "integrity": "sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==",
- "dev": true
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
+ "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
+ "dev": true,
+ "license": "MIT"
},
"node_modules/@types/minimatch": {
"version": "3.0.5",
@@ -1543,6 +1560,12 @@
"integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
"dev": true
},
+ "node_modules/@types/sortablejs": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz",
+ "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ==",
+ "license": "MIT"
+ },
"node_modules/@types/webpack-env": {
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.2.tgz",
@@ -2251,6 +2274,29 @@
"typescript": ">=2"
}
},
+ "node_modules/@vue/cli-plugin-typescript/node_modules/fork-ts-checker-webpack-plugin": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz",
+ "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "babel-code-frame": "^6.22.0",
+ "chalk": "^2.4.1",
+ "chokidar": "^2.0.4",
+ "micromatch": "^3.1.10",
+ "minimatch": "^3.0.4",
+ "tapable": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=6.11.5"
+ },
+ "peerDependencies": {
+ "tslint": "^4.0.0 || ^5.0.0",
+ "typescript": "^2.1.0 || ^3.0.0",
+ "webpack": "^2.3.0 || ^3.0.0 || ^4.0.0"
+ }
+ },
"node_modules/@vue/cli-plugin-typescript/node_modules/semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -2372,6 +2418,56 @@
"string.prototype.padstart": "^3.0.0"
}
},
+ "node_modules/@vue/compiler-sfc": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
+ "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
+ "dependencies": {
+ "@babel/parser": "^7.23.5",
+ "postcss": "^8.4.14",
+ "source-map": "^0.6.1"
+ },
+ "optionalDependencies": {
+ "prettier": "^1.18.2 || ^2.0.0"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/postcss": {
+ "version": "8.5.28",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
+ "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
+ "funding": [
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/postcss/"
+ },
+ {
+ "type": "tidelift",
+ "url": "https://tidelift.com/funding/github/npm/postcss"
+ },
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "nanoid": "^3.3.18",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ },
+ "engines": {
+ "node": "^10 || ^12 || >=14"
+ }
+ },
+ "node_modules/@vue/compiler-sfc/node_modules/source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/@vue/component-compiler-utils": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz",
@@ -5256,6 +5352,12 @@
"node": ">=0.10.0"
}
},
+ "node_modules/csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
+ "license": "MIT"
+ },
"node_modules/current-script-polyfill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz",
@@ -7058,28 +7160,6 @@
"node": "*"
}
},
- "node_modules/fork-ts-checker-webpack-plugin": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz",
- "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==",
- "dev": true,
- "dependencies": {
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.4.1",
- "chokidar": "^2.0.4",
- "micromatch": "^3.1.10",
- "minimatch": "^3.0.4",
- "tapable": "^1.0.0"
- },
- "engines": {
- "node": ">=6.11.5"
- },
- "peerDependencies": {
- "tslint": "^4.0.0 || ^5.0.0",
- "typescript": "^2.1.0 || ^3.0.0",
- "webpack": "^2.3.0 || ^3.0.0 || ^4.0.0"
- }
- },
"node_modules/form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
@@ -9823,6 +9903,24 @@
"dev": true,
"optional": true
},
+ "node_modules/nanoid": {
+ "version": "3.3.19",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
+ "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/ai"
+ }
+ ],
+ "license": "MIT",
+ "bin": {
+ "nanoid": "bin/nanoid.cjs"
+ },
+ "engines": {
+ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
+ }
+ },
"node_modules/nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -10846,6 +10944,12 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
+ "node_modules/picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
+ "license": "ISC"
+ },
"node_modules/picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
@@ -11783,7 +11887,6 @@
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
"integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
- "dev": true,
"optional": true,
"bin": {
"prettier": "bin-prettier.js"
@@ -13209,11 +13312,6 @@
"node": ">=0.10.0"
}
},
- "node_modules/sortablejs": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
- "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
- },
"node_modules/source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@@ -13229,6 +13327,15 @@
"node": ">=0.10.0"
}
},
+ "node_modules/source-map-js": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
+ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw==",
+ "license": "BSD-3-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
"node_modules/source-map-resolve": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
@@ -14337,15 +14444,6 @@
"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
"dev": true
},
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true,
- "engines": {
- "node": ">=4"
- }
- },
"node_modules/to-object-path": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
@@ -14572,10 +14670,11 @@
"dev": true
},
"node_modules/typescript": {
- "version": "3.9.10",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
- "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==",
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"dev": true,
+ "license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
@@ -15015,9 +15114,15 @@
"dev": true
},
"node_modules/vue": {
- "version": "2.6.14",
- "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
- "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz",
+ "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
+ "deprecated": "Vue 2 has reached EOL and is no longer actively maintained. See https://v2.vuejs.org/eol/ for more details.",
+ "license": "MIT",
+ "dependencies": {
+ "@vue/compiler-sfc": "2.7.16",
+ "csstype": "^3.1.0"
+ }
},
"node_modules/vue-class-component": {
"version": "7.2.6",
@@ -15027,6 +15132,23 @@
"vue": "^2.0.0"
}
},
+ "node_modules/vue-draggable-plus": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/vue-draggable-plus/-/vue-draggable-plus-0.6.1.tgz",
+ "integrity": "sha512-FbtQ/fuoixiOfTZzG3yoPl4JAo9HJXRHmBQZFB9x2NYCh6pq0TomHf7g5MUmpaDYv+LU2n6BPq2YN9sBO+FbIg==",
+ "license": "MIT",
+ "dependencies": {
+ "@types/sortablejs": "^1.15.8"
+ },
+ "peerDependencies": {
+ "@types/sortablejs": "^1.15.0"
+ },
+ "peerDependenciesMeta": {
+ "@vue/composition-api": {
+ "optional": true
+ }
+ }
+ },
"node_modules/vue-eslint-parser": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz",
@@ -15073,10 +15195,11 @@
"dev": true
},
"node_modules/vue-loader": {
- "version": "15.9.8",
- "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz",
- "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==",
+ "version": "15.11.1",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz",
+ "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"@vue/component-compiler-utils": "^3.1.0",
"hash-sum": "^1.0.2",
@@ -15092,6 +15215,9 @@
"cache-loader": {
"optional": true
},
+ "prettier": {
+ "optional": true
+ },
"vue-template-compiler": {
"optional": true
}
@@ -15126,13 +15252,14 @@
}
},
"node_modules/vue-template-compiler": {
- "version": "2.6.14",
- "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
- "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
+ "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
"dev": true,
+ "license": "MIT",
"dependencies": {
"de-indent": "^1.0.2",
- "he": "^1.1.0"
+ "he": "^1.2.0"
}
},
"node_modules/vue-template-es2015-compiler": {
@@ -15141,14 +15268,6 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
- "node_modules/vuedraggable": {
- "version": "2.24.3",
- "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
- "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
- "dependencies": {
- "sortablejs": "1.10.2"
- }
- },
"node_modules/watchpack": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
@@ -16423,11 +16542,15 @@
"@babel/types": "^7.14.5"
}
},
+ "@babel/helper-string-parser": {
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz",
+ "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw=="
+ },
"@babel/helper-validator-identifier": {
- "version": "7.14.9",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.9.tgz",
- "integrity": "sha512-pQYxPY0UP6IHISRitNe8bsijHex4TWZXi2HwKVsjPiltzlhse2znVcm9Ace510VT1kxIHjGJCZZQBX2gJDbo0g==",
- "dev": true
+ "version": "7.29.7",
+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz",
+ "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg=="
},
"@babel/helper-validator-option": {
"version": "7.14.5",
@@ -16470,10 +16593,12 @@
}
},
"@babel/parser": {
- "version": "7.15.3",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.15.3.tgz",
- "integrity": "sha512-O0L6v/HvqbdJawj0iBEfVQMc3/6WP+AeOsovsIgBFyJaG+W2w7eqvZB7puddATmWuARlm1SX7DwxJ/JJUnDpEA==",
- "dev": true
+ "version": "7.29.9",
+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.9.tgz",
+ "integrity": "sha512-CjXrNHTnvqBVqHgdBysY3vk2T8tpJHb5/RMeHJBTyVa9xgugCB0CJTx/3oO8RV2QRQP391RWpB7D6hLjm8V9uA==",
+ "requires": {
+ "@babel/types": "^7.29.8"
+ }
},
"@babel/plugin-proposal-async-generator-functions": {
"version": "7.14.9",
@@ -17010,13 +17135,12 @@
}
},
"@babel/types": {
- "version": "7.15.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.15.0.tgz",
- "integrity": "sha512-OBvfqnllOIdX4ojTHpwZbpvz4j3EWyjkZEdmjH0/cgsd6QOdSgU8rLSk6ard/pcW7rlmjdVSX/AWOaORR1uNOQ==",
- "dev": true,
+ "version": "7.29.8",
+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.8.tgz",
+ "integrity": "sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==",
"requires": {
- "@babel/helper-validator-identifier": "^7.14.9",
- "to-fast-properties": "^2.0.0"
+ "@babel/helper-string-parser": "^7.29.7",
+ "@babel/helper-validator-identifier": "^7.29.7"
}
},
"@fortawesome/fontawesome-free": {
@@ -17186,36 +17310,36 @@
"dev": true
},
"@types/leaflet": {
- "version": "1.7.5",
- "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.7.5.tgz",
- "integrity": "sha512-+Myo00Yb5OuvUyrH+vUwn9DRgOaBJsF/etIMdMcNhWGBMo58Mo1cxLInvCd0ZpvItju/AeDYFB/Od2pLiHB3VA==",
+ "version": "1.9.14",
+ "resolved": "https://registry.npmjs.org/@types/leaflet/-/leaflet-1.9.14.tgz",
+ "integrity": "sha512-sx2q6MDJaajwhKeVgPSvqXd8rhNJSTA3tMidQGduZn9S6WBYxDkCpSpV5xXEmSg7Cgdk/5vJGhVF1kMYLzauBg==",
"dev": true,
"requires": {
"@types/geojson": "*"
}
},
"@types/leaflet-draw": {
- "version": "0.4.14",
- "resolved": "https://registry.npmjs.org/@types/leaflet-draw/-/leaflet-draw-0.4.14.tgz",
- "integrity": "sha512-TyOZtr5SZf9ELR5EMLFwDlZuCGyjG0saUA6hEguZNEoratDiag1G/2eAVeYwK2NOX9N0zxQ9eDCRsjJK420X9g==",
+ "version": "1.0.11",
+ "resolved": "https://registry.npmjs.org/@types/leaflet-draw/-/leaflet-draw-1.0.11.tgz",
+ "integrity": "sha512-dyedtNm3aSmnpi6FM6VSl28cQuvP+MD7pgpXyO3Q1ZOCvrJKmzaDq0P3YZTnnBs61fQCKSnNYmbvCkDgFT9FHQ==",
"dev": true,
"requires": {
"@types/leaflet": "*"
}
},
"@types/leaflet.markercluster": {
- "version": "1.4.5",
- "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.4.5.tgz",
- "integrity": "sha512-R9Ql//z6muSGI5mPfr+FaKQQB7EIdQQyivYweVSdOrWr8WyNNFcSwfl+mqGYJFhRRCO/6lbZiM3scEyp9LdaFg==",
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/@types/leaflet.markercluster/-/leaflet.markercluster-1.5.5.tgz",
+ "integrity": "sha512-TkWOhSHDM1ANxmLi+uK0PjsVcjIKBr8CLV2WoF16dIdeFmC0Cj5P5axkI3C1Xsi4+ht6EU8+BfEbbqEF9icPrg==",
"dev": true,
"requires": {
"@types/leaflet": "*"
}
},
"@types/lodash": {
- "version": "4.14.172",
- "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.172.tgz",
- "integrity": "sha512-/BHF5HAx3em7/KkzVKm3LrsD6HZAXuXO1AJZQ3cRRBZj4oHZDviWPYu0aEplAqDFNHZPW6d3G7KN+ONcCCC7pw==",
+ "version": "4.17.13",
+ "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
+ "integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
"dev": true
},
"@types/minimatch": {
@@ -17242,6 +17366,11 @@
"integrity": "sha512-L28j2FcJfSZOnL1WBjDYp2vUHCeIFlyYI/53EwD/rKUBQ7MtUUfbQWiyKJGpcnv4/WgrhWsFKrcPstcAt/J0tQ==",
"dev": true
},
+ "@types/sortablejs": {
+ "version": "1.15.9",
+ "resolved": "https://registry.npmjs.org/@types/sortablejs/-/sortablejs-1.15.9.tgz",
+ "integrity": "sha512-7HP+rZGE2p886PKV9c9OJzLBI6BBJu1O7lJGYnPyG3fS4/duUCcngkNCjsLwIMV+WMqANe3tt4irrXHSIe68OQ=="
+ },
"@types/webpack-env": {
"version": "1.16.2",
"resolved": "https://registry.npmjs.org/@types/webpack-env/-/webpack-env-1.16.2.tgz",
@@ -17822,6 +17951,20 @@
"yorkie": "^2.0.0"
},
"dependencies": {
+ "fork-ts-checker-webpack-plugin": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz",
+ "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==",
+ "dev": true,
+ "requires": {
+ "babel-code-frame": "^6.22.0",
+ "chalk": "^2.4.1",
+ "chokidar": "^2.0.4",
+ "micromatch": "^3.1.10",
+ "minimatch": "^3.0.4",
+ "tapable": "^1.0.0"
+ }
+ },
"semver": {
"version": "5.7.1",
"resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
@@ -17927,6 +18070,34 @@
"string.prototype.padstart": "^3.0.0"
}
},
+ "@vue/compiler-sfc": {
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-2.7.16.tgz",
+ "integrity": "sha512-KWhJ9k5nXuNtygPU7+t1rX6baZeqOYLEforUPjgNDBnLicfHCoi48H87Q8XyLZOrNNsmhuwKqtpDQWjEFe6Ekg==",
+ "requires": {
+ "@babel/parser": "^7.23.5",
+ "postcss": "^8.4.14",
+ "prettier": "^1.18.2 || ^2.0.0",
+ "source-map": "^0.6.1"
+ },
+ "dependencies": {
+ "postcss": {
+ "version": "8.5.28",
+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.28.tgz",
+ "integrity": "sha512-RRuzqDtt5Y9h3quz5hWhK+TPnsmVs6WwSU6LkJMeY4HstUEDuYTG8UJSdawMRzmzAtV+KEoG8N3Qg2qLy5vM/A==",
+ "requires": {
+ "nanoid": "^3.3.18",
+ "picocolors": "^1.1.1",
+ "source-map-js": "^1.2.1"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g=="
+ }
+ }
+ },
"@vue/component-compiler-utils": {
"version": "3.2.2",
"resolved": "https://registry.npmjs.org/@vue/component-compiler-utils/-/component-compiler-utils-3.2.2.tgz",
@@ -20308,6 +20479,11 @@
}
}
},
+ "csstype": {
+ "version": "3.2.3",
+ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
+ "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ=="
+ },
"current-script-polyfill": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/current-script-polyfill/-/current-script-polyfill-1.0.0.tgz",
@@ -21763,20 +21939,6 @@
"integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
"dev": true
},
- "fork-ts-checker-webpack-plugin": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-0.5.2.tgz",
- "integrity": "sha512-a5IG+xXyKnpruI0CP/anyRLAoxWtp3lzdG6flxicANnoSzz64b12dJ7ASAVRrI2OaWwZR2JyBaMHFQqInhWhIw==",
- "dev": true,
- "requires": {
- "babel-code-frame": "^6.22.0",
- "chalk": "^2.4.1",
- "chokidar": "^2.0.4",
- "micromatch": "^3.1.10",
- "minimatch": "^3.0.4",
- "tapable": "^1.0.0"
- }
- },
"form-data": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
@@ -23965,6 +24127,11 @@
"dev": true,
"optional": true
},
+ "nanoid": {
+ "version": "3.3.19",
+ "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.19.tgz",
+ "integrity": "sha512-Y2tUNy4ouw6tq5oDSKeQYGOyhkUBhNOcGV/02KC+6kd9eDGqdZd++mjMiIDilrBYvjEnCYvVtsuHCuP+okSfug=="
+ },
"nanomatch": {
"version": "1.2.13",
"resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
@@ -24796,6 +24963,11 @@
"integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
"dev": true
},
+ "picocolors": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
+ "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
+ },
"picomatch": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.0.tgz",
@@ -25595,7 +25767,6 @@
"version": "1.19.1",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-1.19.1.tgz",
"integrity": "sha512-s7PoyDv/II1ObgQunCbB9PdLmUcBZcnWOcxDh7O0N/UwDEsHyqkW+Qh28jW+mVuCdx7gLB0BotYI1Y6uI9iyew==",
- "dev": true,
"optional": true
},
"pretty-error": {
@@ -26788,11 +26959,6 @@
"is-plain-obj": "^1.0.0"
}
},
- "sortablejs": {
- "version": "1.10.2",
- "resolved": "https://registry.npmjs.org/sortablejs/-/sortablejs-1.10.2.tgz",
- "integrity": "sha512-YkPGufevysvfwn5rfdlGyrGjt7/CRHwvRPogD/lC+TnvcN29jDpCifKP+rBqf+LRldfXSTh+0CGLcSg0VIxq3A=="
- },
"source-list-map": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
@@ -26805,6 +26971,11 @@
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
+ "source-map-js": {
+ "version": "1.2.2",
+ "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.2.tgz",
+ "integrity": "sha512-KGj/8Y43x35aZVDtt+J4mK1hoLGHULMYfSkODJNQjNDC3oW1PqPoxMwo0pLUsWM/UEGzON/NxeHywEfNXNP3Vw=="
+ },
"source-map-resolve": {
"version": "0.5.3",
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
@@ -27730,12 +27901,6 @@
"integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
"dev": true
},
- "to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true
- },
"to-object-path": {
"version": "0.3.0",
"resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
@@ -27918,9 +28083,9 @@
"dev": true
},
"typescript": {
- "version": "3.9.10",
- "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.10.tgz",
- "integrity": "sha512-w6fIxVE/H1PkLKcCPsFqKE7Kv7QUwhU8qQY2MueZXWx5cPZdwFupLgKK3vntcK98BtNHZtAF4LA/yl2a7k8R6Q==",
+ "version": "4.9.5",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz",
+ "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==",
"dev": true
},
"uglify-js": {
@@ -28283,9 +28448,13 @@
"dev": true
},
"vue": {
- "version": "2.6.14",
- "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.14.tgz",
- "integrity": "sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ=="
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/vue/-/vue-2.7.16.tgz",
+ "integrity": "sha512-4gCtFXaAA3zYZdTp5s4Hl2sozuySsgz4jy1EnpBHNfpMa9dK1ZCG7viqBPCwXtmgc8nHqUsAu3G4gtmXkkY3Sw==",
+ "requires": {
+ "@vue/compiler-sfc": "2.7.16",
+ "csstype": "^3.1.0"
+ }
},
"vue-class-component": {
"version": "7.2.6",
@@ -28293,6 +28462,14 @@
"integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==",
"requires": {}
},
+ "vue-draggable-plus": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/vue-draggable-plus/-/vue-draggable-plus-0.6.1.tgz",
+ "integrity": "sha512-FbtQ/fuoixiOfTZzG3yoPl4JAo9HJXRHmBQZFB9x2NYCh6pq0TomHf7g5MUmpaDYv+LU2n6BPq2YN9sBO+FbIg==",
+ "requires": {
+ "@types/sortablejs": "^1.15.8"
+ }
+ },
"vue-eslint-parser": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-5.0.0.tgz",
@@ -28332,9 +28509,9 @@
"dev": true
},
"vue-loader": {
- "version": "15.9.8",
- "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.9.8.tgz",
- "integrity": "sha512-GwSkxPrihfLR69/dSV3+5CdMQ0D+jXg8Ma1S4nQXKJAznYFX14vHdc/NetQc34Dw+rBbIJyP7JOuVb9Fhprvog==",
+ "version": "15.11.1",
+ "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.11.1.tgz",
+ "integrity": "sha512-0iw4VchYLePqJfJu9s62ACWUXeSqM30SQqlIftbYWM3C+jpPcEHKSPUZBLjSF9au4HTHQ/naF6OGnO3Q/qGR3Q==",
"dev": true,
"requires": {
"@vue/component-compiler-utils": "^3.1.0",
@@ -28375,13 +28552,13 @@
}
},
"vue-template-compiler": {
- "version": "2.6.14",
- "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz",
- "integrity": "sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==",
+ "version": "2.7.16",
+ "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.7.16.tgz",
+ "integrity": "sha512-AYbUWAJHLGGQM7+cNTELw+KsOG9nl2CnSv467WobS5Cv9uk3wFcnr1Etsz2sEIHEZvw1U+o9mRlEO6QbZvUPGQ==",
"dev": true,
"requires": {
"de-indent": "^1.0.2",
- "he": "^1.1.0"
+ "he": "^1.2.0"
}
},
"vue-template-es2015-compiler": {
@@ -28390,14 +28567,6 @@
"integrity": "sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==",
"dev": true
},
- "vuedraggable": {
- "version": "2.24.3",
- "resolved": "https://registry.npmjs.org/vuedraggable/-/vuedraggable-2.24.3.tgz",
- "integrity": "sha512-6/HDXi92GzB+Hcs9fC6PAAozK1RLt1ewPTLjK0anTYguXLAeySDmcnqE8IC0xa7shvSzRjQXq3/+dsZ7ETGF3g==",
- "requires": {
- "sortablejs": "1.10.2"
- }
- },
"watchpack": {
"version": "1.7.5",
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.5.tgz",
diff --git a/package.json b/package.json
index 24584d9..2b71c95 100644
--- a/package.json
+++ b/package.json
@@ -24,17 +24,17 @@
"lodash": "^4.17.21",
"mitt": "^3.0.1",
"terser": "^4.8.1",
- "vue": "^2.6.11",
+ "vue": "2.7.16",
"vue-class-component": "^7.2.3",
+ "vue-draggable-plus": "^0.6.1",
"vue-property-decorator": "^7.0.0",
- "vue-router": "^3.2.0",
- "vuedraggable": "^2.24.3"
+ "vue-router": "^3.2.0"
},
"devDependencies": {
- "@types/leaflet": "^1.5.21",
- "@types/leaflet-draw": "^0.4.14",
- "@types/leaflet.markercluster": "^1.4.3",
- "@types/lodash": "^4.14.168",
+ "@types/leaflet": "1.9.14",
+ "@types/leaflet-draw": "1.0.11",
+ "@types/leaflet.markercluster": "1.5.5",
+ "@types/lodash": "4.17.13",
"@vue/cli-plugin-babel": "^3.12.1",
"@vue/cli-plugin-eslint": "^3.12.1",
"@vue/cli-plugin-typescript": "^3.12.1",
@@ -46,7 +46,8 @@
"leaflet": "^1.9.4",
"less": "^3.13.1",
"less-loader": "^4.1.0",
- "typescript": "^3.9.7",
- "vue-template-compiler": "^2.6.11"
+ "typescript": "~4.9.5",
+ "vue-loader": "^15.11.1",
+ "vue-template-compiler": "2.7.16"
}
}
diff --git a/src/MapMarker.ts b/src/MapMarker.ts
index 2fc3922..0c8a8f6 100644
--- a/src/MapMarker.ts
+++ b/src/MapMarker.ts
@@ -50,7 +50,7 @@ class MapMarkerImpl extends MapMarker {
}
class MapMarkerCanvasImpl extends MapMarker {
- constructor(mb: MapBase, title: string, pos: Point, options: CanvasMarkerOptions = {}) {
+ constructor(mb: MapBase, title: string, pos: Point, options: Partial = {}) {
super(mb);
this.title = title;
let extra: any = {};
@@ -63,7 +63,7 @@ class MapMarkerCanvasImpl extends MapMarker {
this.marker = new CanvasMarker(mb.fromXYZ(pos), Object.assign(options, {
bubblingMouseEvents: false,
contextmenu: true,
- }));
+ }) as CanvasMarkerOptions);
this.marker.bindTooltip(title, { pane: 'front2', ...extra });
super.commonInit();
}
diff --git a/src/components/AppMap.ts b/src/components/AppMap.ts
index 3a6e7ec..4a2b6ba 100644
--- a/src/components/AppMap.ts
+++ b/src/components/AppMap.ts
@@ -46,7 +46,7 @@ import { appMapBus, ObjectIdentifier, onAppMapEvents } from '@/util/bus';
import '@/util/leaflet_tile_workaround.js';
import AppMapPopup, { AppMapPopupProps } from '@/components/AppMapPopup';
-import draggable from 'vuedraggable';
+import { VueDraggable } from 'vue-draggable-plus';
function valueOrDefault(value: T | undefined, defaultValue: T) {
return value === undefined ? defaultValue : value;
@@ -212,7 +212,7 @@ function addPopupAndTooltip(layer: L.Marker | L.Polyline, root: any) {
AppMapSettings,
ModalGotoCoords,
ObjectInfo,
- draggable,
+ VueDraggable,
},
})
export default class AppMap extends mixins(MixinUtil) {
@@ -707,8 +707,8 @@ export default class AppMap extends mixins(MixinUtil) {
// @ts-ignore
this.drawControl = new L.Control.Draw(options);
this.setLineColorThrottler = debounce(() => this.setLineColor(), 100);
+ // @ts-ignore
this.map.m.on({
- // @ts-ignore
'draw:created': (e: any) => {
addGeoJSONFeatureToLayer(e.layer);
calcLayerLength(e.layer);
diff --git a/src/components/AppMap.vue b/src/components/AppMap.vue
index c409a38..1a5bdf4 100644
--- a/src/components/AppMap.vue
+++ b/src/components/AppMap.vue
@@ -287,7 +287,7 @@
All on
All off
-
+
-
+
diff --git a/src/util/CanvasMarker.ts b/src/util/CanvasMarker.ts
index 9118f89..6b02286 100644
--- a/src/util/CanvasMarker.ts
+++ b/src/util/CanvasMarker.ts
@@ -8,7 +8,7 @@ export interface CanvasMarkerOptions extends L.CircleMarkerOptions {
}
export class CanvasMarker extends L.CircleMarker {
- options!: CanvasMarkerOptions;
+ declare options: CanvasMarkerOptions;
_updatePath() {
if (!this.options.icon) {
diff --git a/tsconfig.json b/tsconfig.json
index 6399eaa..e987ec9 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -1,12 +1,13 @@
{
"compilerOptions": {
- "target": "esnext",
+ "target": "es2020",
"module": "esnext",
"strict": true,
"jsx": "preserve",
"importHelpers": true,
"moduleResolution": "node",
"experimentalDecorators": true,
+ "useDefineForClassFields": false,
"esModuleInterop": true,
"allowSyntheticDefaultImports": true,
"sourceMap": true,
diff --git a/vue.config.js b/vue.config.js
index ce28e3d..97e6aed 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -1,3 +1,4 @@
module.exports = {
- productionSourceMap: false
-}
\ No newline at end of file
+ productionSourceMap: false,
+ lintOnSave: false,
+}
From e947897d100b1846371d2de483b8cd0bb2f456de Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?L=C3=A9o=20Lam?=
Date: Sat, 3 Oct 2026 16:27:23 +0200
Subject: [PATCH 05/21] Keep Leaflet objects out of Vue reactivity and make
Settings reactive
Vue 2 deep-walks any Leaflet layer put into component data, including
the whole L.Map; Vue 3 would proxy them instead, breaking Leaflet's
identity-based bookkeeping and the identity match that removes the
settings exclude sets. markRaw them, and the large lookup collections,
at creation; the component arrays holding them stay reactive. markRaw
also replaces the Unobservable wrapper, so the details pane now gets the
marker itself and re-clicking the open object no longer re-runs its init
(which drew a kept area a second time). Settings was only reactive
because AppMap put it in data(), which Vue 3 no longer observes in
place, so wrap it in reactive() explicitly; its Proxy still fires change
callbacks once per assignment.
(AI assisted using Claude Opus 5.5)
---
src/MapSearch.ts | 41 ++++-----
src/components/AppMap.ts | 111 ++++++++++++------------
src/components/AppMap.vue | 2 +-
src/components/AppMapDetailsBase.ts | 3 +-
src/components/AppMapDetailsDungeon.ts | 2 +-
src/components/AppMapDetailsDungeon.vue | 2 +-
src/components/AppMapDetailsObj.ts | 44 +++++-----
src/components/AppMapDetailsPlace.ts | 2 +-
src/util/settings.ts | 4 +-
src/util/ui.ts | 9 --
10 files changed, 107 insertions(+), 113 deletions(-)
diff --git a/src/MapSearch.ts b/src/MapSearch.ts
index 12b5f27..7812fdc 100644
--- a/src/MapSearch.ts
+++ b/src/MapSearch.ts
@@ -1,4 +1,5 @@
import * as L from 'leaflet';
+import {markRaw} from 'vue';
import {MapBase} from '@/MapBase';
import {SearchResultUpdateMode} from '@/MapMarker';
import * as MapMarkers from '@/MapMarker';
@@ -104,10 +105,10 @@ export class SearchExcludeSet {
return this.ids.size;
}
- ids: Set = new Set();
+ ids: Set = markRaw(new Set());
async init() {
- this.ids = new Set(await MapMgr.getInstance().getObjids(Settings.getInstance().mapType, Settings.getInstance().mapName, this.query));
+ this.ids = markRaw(new Set(await MapMgr.getInstance().getObjids(Settings.getInstance().mapType, Settings.getInstance().mapName, this.query)));
}
}
@@ -116,32 +117,32 @@ export class SearchResultGroup {
}
size() {
- return this.markers.data ? this.markers.data.length : 0;
+ return this.markers.length;
}
getMarkers() {
- return this.markers.data;
+ return this.markers;
}
remove() {
- this.markerGroup.data.remove();
- this.markerGroup.data.clearLayers();
- this.shownMarkers = new ui.Unobservable([]);
+ this.markerGroup.remove();
+ this.markerGroup.clearLayers();
+ this.shownMarkers = markRaw([]);
}
update(mode: SearchResultUpdateMode, excludedSets: SearchExcludeSet[]) {
const isExcluded = (marker: MapMarkers.MapMarkerObj) => {
return excludedSets.some(set => set.ids.has(marker.obj.objid));
};
- for (const [i, marker] of this.markers.data.entries()) {
+ for (const [i, marker] of this.markers.entries()) {
const shouldShow = mode & SearchResultUpdateMode.UpdateVisibility
- ? (this.enabled && !isExcluded(marker)) : this.shownMarkers.data[i];
- if (shouldShow != this.shownMarkers.data[i]) {
+ ? (this.enabled && !isExcluded(marker)) : this.shownMarkers[i];
+ if (shouldShow != this.shownMarkers[i]) {
if (shouldShow)
- this.markerGroup.data.addLayer(marker.getMarker());
+ this.markerGroup.addLayer(marker.getMarker());
else
- this.markerGroup.data.removeLayer(marker.getMarker());
- this.shownMarkers.data[i] = shouldShow;
+ this.markerGroup.removeLayer(marker.getMarker());
+ this.shownMarkers[i] = shouldShow;
}
if (shouldShow)
marker.update(this.fillColor, this.strokeColor, mode);
@@ -149,16 +150,16 @@ export class SearchResultGroup {
}
setObjects(map: MapBase, objs: ObjectMinData[]) {
- this.markers = new ui.Unobservable(
+ this.markers = markRaw(
objs.map(r => new MapMarkers.MapMarkerObj(map, r, this.fillColor, this.strokeColor)));
- this.markerGroup.data.clearLayers();
- this.shownMarkers = new ui.Unobservable([]);
+ this.markerGroup.clearLayers();
+ this.shownMarkers = markRaw([]);
}
async init(map: MapBase) {
this.fillColor = ui.shadeColor(ui.genColor(10, SearchResultGroup.COLOR_COUNTER++), -5);
this.strokeColor = ui.shadeColor(this.fillColor, -20);
- this.markerGroup.data.addTo(map.m);
+ this.markerGroup.addTo(map.m);
if (!this.query)
return;
const results = await MapMgr.getInstance().getObjs(Settings.getInstance().mapType, Settings.getInstance().mapName, this.query);
@@ -166,9 +167,9 @@ export class SearchResultGroup {
}
private static COLOR_COUNTER = 0;
- private markerGroup = new ui.Unobservable(L.layerGroup());
- private markers = new ui.Unobservable([]);
- private shownMarkers: ui.Unobservable = new ui.Unobservable([]);
+ private markerGroup = markRaw(L.layerGroup());
+ private markers = markRaw([]);
+ private shownMarkers = markRaw([]);
private fillColor = '';
private strokeColor = '';
}
diff --git a/src/components/AppMap.ts b/src/components/AppMap.ts
index 4a2b6ba..061578b 100644
--- a/src/components/AppMap.ts
+++ b/src/components/AppMap.ts
@@ -13,7 +13,7 @@ const { isNavigationFailure, NavigationFailureType } = VueRouter;
import debounce from 'lodash/debounce';
import { produce } from 'immer';
-import Vue from 'vue';
+import Vue, { markRaw } from 'vue';
import Component, { mixins } from 'vue-class-component';
import { MapBase, SHOW_ALL_OBJS_FOR_MAP_UNIT_EVENT } from '@/MapBase';
@@ -222,7 +222,7 @@ export default class AppMap extends mixins(MixinUtil) {
private sidebar!: L.Control.Sidebar;
private sidebarActivePane = '';
- private sidebarPaneScrollPos: Map = new Map();
+ private sidebarPaneScrollPos: Map = markRaw(new Map());
private drawControlEnabled = false;
private drawControl: any;
private drawLayer!: L.GeoJSON;
@@ -236,19 +236,19 @@ export default class AppMap extends mixins(MixinUtil) {
private greatPlateauBarrierShown = false;
private detailsComponent = '';
- private detailsMarker: ui.Unobservable | null = null;
+ private detailsMarker: MapMarker | null = null;
private detailsPaneOpened = false;
- private detailsPinMarker: ui.Unobservable | null = null;
+ private detailsPinMarker: L.Marker | null = null;
private markerComponents = MARKER_COMPONENTS;
- private markerGroups: Map = new Map();
+ private markerGroups: Map = markRaw(new Map());
private searching = false;
private searchQuery = '';
private searchThrottler!: () => void;
private searchLastSearchFailed = false;
private searchResults: ObjectMinData[] = [];
- private searchResultMarkers: ui.Unobservable[] = [];
+ private searchResultMarkers: MapMarkers.MapMarkerSearchResult[] = [];
private searchGroups: SearchResultGroup[] = [];
private searchPresets = SEARCH_PRESETS;
private searchExcludedSets: SearchExcludeSet[] = [];
@@ -258,9 +258,9 @@ export default class AppMap extends mixins(MixinUtil) {
private lastBossExcludeSet!: SearchExcludeSet;
private ohoExcludeSet!: SearchExcludeSet;
- private areaMapLayer = new ui.Unobservable(L.layerGroup());
- private areaMapLayersByData: ui.Unobservable