diff --git a/Dockerfile.frontend b/Dockerfile.frontend index a6e06b9306f84..ddf2c1940235f 100644 --- a/Dockerfile.frontend +++ b/Dockerfile.frontend @@ -3,7 +3,7 @@ ARG USER_UID=1000 ARG USER_GID=1000 -FROM node:22.9.0 AS builder +FROM node:lts AS builder ARG USER_UID ARG USER_GID RUN usermod --uid $USER_UID node && \ diff --git a/gulpfile.ts b/gulpfile.ts index eb770251f5a7d..09728d43aef90 100644 --- a/gulpfile.ts +++ b/gulpfile.ts @@ -84,8 +84,8 @@ export function copyJs() { "./node_modules/foundation-sites/js/vendor/*.js", "./node_modules/foundation-sites/js/foundation.js", "./node_modules/papaparse/papaparse.js", - "./node_modules/osmtogeojson/osmtogeojson.js", "./node_modules/leaflet/dist/leaflet.js", + "./node_modules/leaflet/dist/leaflet-src.esm.js", "./node_modules/leaflet.markercluster/dist/leaflet.markercluster.js", "./node_modules/blueimp-tmpl/js/tmpl.js", "./node_modules/blueimp-load-image/js/load-image.all.min.js", diff --git a/html/js/display-map.js b/html/js/display-map.js index d1422dd138ee5..eaac1b6ac4dc6 100644 --- a/html/js/display-map.js +++ b/html/js/display-map.js @@ -1,7 +1,7 @@ // This file is part of Product Opener. // // Product Opener -// Copyright (C) 2011-2023 Association Open Food Facts +// Copyright (C) 2011-2025 Association Open Food Facts // Contact: contact@openfoodfacts.org // Address: 21 rue des Iles, 94100 Saint-Maur des Fossés, France // @@ -18,10 +18,10 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -/*global L */ -/*exported displayMap*/ +import * as L from './leaflet-src.esm.js'; +import { MarkerClusterGroup } from './leaflet.markercluster.js'; -function displayMap(containerId, pointers) { +export function displayMap(containerId, pointers) { const map = L.map(containerId, { maxZoom: 12 }); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { @@ -30,7 +30,7 @@ function displayMap(containerId, pointers) { }).addTo(map); - const markers = new L.MarkerClusterGroup({ singleMarkerMode: true }); + const markers = new MarkerClusterGroup({ singleMarkerMode: true }); const layers = []; for (const pointer of pointers) { diff --git a/html/js/display-tag.js b/html/js/display-tag.js index 7274b3f438547..bd58d0db64b37 100644 --- a/html/js/display-tag.js +++ b/html/js/display-tag.js @@ -1,7 +1,7 @@ // This file is part of Product Opener. // // Product Opener -// Copyright (C) 2011-2023 Association Open Food Facts +// Copyright (C) 2011-2025 Association Open Food Facts // Contact: contact@openfoodfacts.org // Address: 21 rue des Iles, 94100 Saint-Maur des Fossés, France // @@ -18,15 +18,69 @@ // You should have received a copy of the GNU Affero General Public License // along with this program. If not, see . -/*global L osmtogeojson*/ -/*exported displayMap*/ +import * as L from './leaflet-src.esm.js'; -let map; -function ensureMapIsDisplayed() { - if (map) { - return; +/* (c) mapstertech https://github.com/mapstertech/mapster-right-hand-rule-fixer/blob/d374e4153ba26c2100b509f59e5a5fe616e267dd/lib/rewind-browser.js */ +class GeoJSONRewind { + + static rewindRing(ring, dir) { + let area = 0, + err = 0; + // eslint-disable-next-line no-plusplus + for (let i = 0, len = ring.length, j = len - 1; i < len; j = i++) { + const k = (ring[i][0] - ring[j][0]) * (ring[j][1] + ring[i][1]); + const m = area + k; + err += Math.abs(area) >= Math.abs(k) ? area - m + k : k - m + area; + area = m; + } + // eslint-disable-next-line no-mixed-operators + if (area + err >= 0 !== Boolean(dir)) { + ring.reverse(); + } + } + + rewindRings(rings, outer) { + if (rings.length === 0) { + return; + } + + this.rewindRing(rings[0], outer); + for (let i = 1; i < rings.length; i++) { + this.rewindRing(rings[i], !outer); + } + } + + rewind(gj, outer) { + const type = gj?.type; + let i; + + if (type === 'FeatureCollection') { + for (i = 0; i < gj.features.length; i++) { + this.rewind(gj.features[i], outer); + } + + } else if (type === 'GeometryCollection') { + for (i = 0; i < gj.geometries.length; i++) { + this.rewind(gj.geometries[i], outer); + } + + } else if (type === 'Feature') { + this.rewind(gj.geometry, outer); + + } else if (type === 'Polygon') { + this.rewindRings(gj.coordinates, outer); + + } else if (type === 'MultiPolygon') { + for (i = 0; i < gj.coordinates.length; i++) { + this.rewindRings(gj.coordinates[i], outer); + } + } + + return gj; } +} +function createLeafletMap() { const tagDescription = document.getElementById('tag_description'); if (tagDescription) { tagDescription.classList.remove('large-12'); @@ -38,12 +92,14 @@ function ensureMapIsDisplayed() { tagMap.style.display = ''; } - map = L.map('container'); + const map = L.map('container'); L.tileLayer('https://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png', { maxZoom: 19, attribution: '© OpenStreetMap' }).addTo(map); + + return map; } function fitBoundsToAllLayers(mapToUpdate) { @@ -58,94 +114,85 @@ function fitBoundsToAllLayers(mapToUpdate) { mapToUpdate.fitBounds(latlngbounds); } -function runCallbackOnJson(callback) { - ensureMapIsDisplayed(); - callback(map); -} - -function addWikidataObjectToMap(id) { - getOpenStreetMapFromWikidata(id, function (data) { - const bindings = data.results.bindings; - if (bindings.length === 0) { - return; - } +async function addWikidataObjectToMap(id) { + const wikidata_result = await getOpenStreetMapFromWikidata(id); + const bindings = wikidata_result.results.bindings; + if (bindings.length === 0) { + return; + } - const binding = bindings[0]; - const relationId = binding.OpenStreetMap_Relations_ID.value; - if (!relationId) { - return; - } + const binding = bindings[0]; + const relationId = binding.OpenStreetMap_Relations_ID.value; + if (!relationId) { + return; + } - getGeoJsonFromOsmRelation(relationId, function (geoJson) { - if (geoJson) { - runCallbackOnJson(function (mapToUpdate) { - L.geoJSON(geoJson).addTo(mapToUpdate); - fitBoundsToAllLayers(mapToUpdate); - }); - } - }); - }); + const geoJson = await getGeoJsonFromOsmRelation(relationId); + if (geoJson) { + const map = createLeafletMap(); + L.geoJSON(geoJson).addTo(map); + fitBoundsToAllLayers(map); + } } -function getOpenStreetMapFromWikidata(id, callback) { - const endpointUrl = 'https://query.wikidata.org/sparql', - sparqlQuery = "SELECT ?OpenStreetMap_Relations_ID WHERE {\n" + - " wd:" + id + " wdt:P402 ?OpenStreetMap_Relations_ID.\n" + - "}", - settings = { - headers: { Accept: 'application/sparql-results+json' }, - data: { query: sparqlQuery } - }; - - $.ajax(endpointUrl, settings).then(callback); -} +async function getOpenStreetMapFromWikidata(id) { + const endpointUrl = 'https://query.wikidata.org/sparql'; + const sparqlQuery = `SELECT ?OpenStreetMap_Relations_ID WHERE { + wd:${id} wdt:P402 ?OpenStreetMap_Relations_ID. + }`; + const settings = { + headers: { Accept: 'application/sparql-results+json' } + }; + + const response = await fetch(`${endpointUrl}?query=${encodeURIComponent(sparqlQuery)}`, settings); + const data = await response.json(); -function getOsmDataFromOverpassTurbo(id, callback) { - $.ajax('https://overpass-api.de/api/interpreter?data=relation%28' + id + '%29%3B%0A%28._%3B%3E%3B%29%3B%0Aout%3B').then(callback); + return data; } -function getGeoJsonFromOsmRelation(id, callback) { - getOsmDataFromOverpassTurbo(id, function (xml) { - callback(osmtogeojson(xml)); - }); +async function getGeoJsonFromOsmRelation(id) { + const response = await fetch(`https://polygons.openstreetmap.fr/get_geojson.py?params=0&id=${encodeURIComponent(id)}`); + const data = await response.json(); + const geoJsonRewind = new GeoJSONRewind(); + + return geoJsonRewind.rewind(data); } function displayPointers(pointers) { - runCallbackOnJson(function (actualMap) { - const markers = []; - for (const pointer of pointers) { - let coordinates; - - // If pointer is an array, it just contains (lat, lng) geo coordinates - if (Array.isArray(pointer)) { - coordinates = pointer; - } - // Otherwise we have a structured object - // e.g. from a map element of a knowledge panel - else { - coordinates = [pointer.geo.lat, pointer.geo.lng]; - } - - const marker = new L.marker(coordinates); - markers.push(marker); + const map = createLeafletMap(); + const markers = []; + for (const pointer of pointers) { + let coordinates; + + // If pointer is an array, it just contains (lat, lng) geo coordinates + if (Array.isArray(pointer)) { + coordinates = pointer; } - - if (markers.length > 0) { - L.featureGroup(markers).addTo(actualMap); - fitBoundsToAllLayers(actualMap); - actualMap.setZoom(8); + // Otherwise we have a structured object + // e.g. from a map element of a knowledge panel + else { + coordinates = [pointer.geo.lat, pointer.geo.lng]; } - }); + + const marker = new L.marker(coordinates); + markers.push(marker); + } + + if (markers.length > 0) { + L.featureGroup(markers).addTo(map); + fitBoundsToAllLayers(map); + map.setZoom(8); + } } -function displayMap(pointers, wikidataObjects) { +export async function displayMap(pointers, wikidataObjects) { if (pointers.length > 0) { displayPointers(pointers); } for (const wikidataObject of wikidataObjects) { if (wikidataObject !== null) { - addWikidataObjectToMap(wikidataObject); + await addWikidataObjectToMap(wikidataObject); // eslint-disable-line no-await-in-loop } } -} +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 6a4e0ab4ada23..5ebfcc0a14ebb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28,7 +28,6 @@ "jsvectormap": "^1.6.0", "leaflet": "^1.7.1", "leaflet.markercluster": "1.5.3", - "osmtogeojson": "^3.0.0-beta.4", "papaparse": "^5.5.2", "select2": "~4.0" }, @@ -2272,18 +2271,6 @@ "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@mapbox/geojson-rewind": { - "version": "0.5.2", - "resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.2.tgz", - "integrity": "sha512-tJaT+RbYGJYStt7wI3cq4Nl4SXxG8W7JDG5DMJu97V25RnbNg3QtQtf+KD+VLjNpWKYsRvXDNmNrBgEETr1ifA==", - "dependencies": { - "get-stream": "^6.0.1", - "minimist": "^1.2.6" - }, - "bin": { - "geojson-rewind": "geojson-rewind" - } - }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2356,174 +2343,6 @@ "@parcel/watcher-win32-x64": "2.5.0" } }, - "node_modules/@parcel/watcher-android-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.0.tgz", - "integrity": "sha512-qlX4eS28bUcQCdribHkg/herLe+0A9RyYC+mm2PXpncit8z5b3nSqGVzMNR3CmtAOgRutiZ02eIJJgP/b1iEFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-arm64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.0.tgz", - "integrity": "sha512-hyZ3TANnzGfLpRA2s/4U1kbw2ZI4qGxaRJbBH2DCSREFfubMswheh8TeiC1sGZ3z2jUf3s37P0BBlrD3sjVTUw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-darwin-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.0.tgz", - "integrity": "sha512-9rhlwd78saKf18fT869/poydQK8YqlU26TMiNg7AIu7eBp9adqbJZqmdFOsbZ5cnLp5XvRo9wcFmNHgHdWaGYA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-freebsd-x64": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.0.tgz", - "integrity": "sha512-syvfhZzyM8kErg3VF0xpV8dixJ+RzbUaaGaeb7uDuz0D3FK97/mZ5AJQ3XNnDsXX7KkFNtyQyFrXZzQIcN49Tw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.0.tgz", - "integrity": "sha512-0VQY1K35DQET3dVYWpOaPFecqOT9dbuCfzjxoQyif1Wc574t3kOSkKevULddcR9znz1TcklCE7Ht6NIxjvTqLA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.0.tgz", - "integrity": "sha512-6uHywSIzz8+vi2lAzFeltnYbdHsDm3iIB57d4g5oaB9vKwjb6N6dRIgZMujw4nm5r6v9/BQH0noq6DzHrqr2pA==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-glibc": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.0.tgz", - "integrity": "sha512-BfNjXwZKxBy4WibDb/LDCriWSKLz+jJRL3cM/DllnHH5QUyoiUNEp3GmL80ZqxeumoADfCCP19+qiYiC8gUBjA==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/@parcel/watcher-linux-arm64-musl": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.0.tgz", - "integrity": "sha512-S1qARKOphxfiBEkwLUbHjCY9BWPdWnW9j7f7Hb2jPplu8UZ3nes7zpPOW9bkLbHRvWM0WDTsjdOTUgW0xLBN1Q==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, "node_modules/@parcel/watcher-linux-x64-glibc": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.0.tgz", @@ -2691,12 +2510,6 @@ "integrity": "sha512-Q5Vn3yjTDyCMV50TB6VRIbQNxSE4OmZR86VSbGaNpfUolm0iePBB4KdEEHmxoY5sT2+2DIvXW0rvMDP2nHZ4Mg==", "dev": true }, - "node_modules/@types/geojson": { - "version": "7946.0.14", - "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.14.tgz", - "integrity": "sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==", - "optional": true - }, "node_modules/@types/glob-stream": { "version": "8.0.2", "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-8.0.2.tgz", @@ -3083,14 +2896,6 @@ "resolved": "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.8.0.tgz", "integrity": "sha512-loGD63sacRzOzSJgQnB9ZAhaQGkN7wl2Zuw7tsphI5Isa0irijrRo6EnJii/GgjGefIFO8AIO7UivzRhFaEk9w==" }, - "node_modules/@xmldom/xmldom": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/@xmldom/xmldom/-/xmldom-0.8.3.tgz", - "integrity": "sha512-Lv2vySXypg4nfa51LY1nU8yDAGo/5YwF+EY/rUZgIbfvwVARcd67ttCM8SMsTeJy51YhHYavEq+FS6R0hW9PFQ==", - "engines": { - "node": ">=10.0.0" - } - }, "node_modules/@yaireo/tagify": { "version": "4.33.2", "resolved": "https://registry.npmjs.org/@yaireo/tagify/-/tagify-4.33.2.tgz", @@ -3604,16 +3409,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/blueimp-canvas-to-blob": { "version": "3.29.0", "resolved": "https://registry.npmjs.org/blueimp-canvas-to-blob/-/blueimp-canvas-to-blob-3.29.0.tgz", @@ -3728,7 +3523,8 @@ "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "dev": true }, "node_modules/bytes": { "version": "3.1.2", @@ -4232,7 +4028,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": "9.0.0", @@ -4688,27 +4485,6 @@ "url": "https://github.com/fb55/domhandler?sponsor=1" } }, - "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.2.1", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.2.1.tgz", - "integrity": "sha512-MFFBQFGkyTuNe3vL9WEw9JdlCwIoBYpOGESLeZAvc/jClYNsOl6P1KzevJbWg76GovdEycfR7/2/Ra7NnqtMKw==", - "dependencies": { - "domelementtype": "1" - } - }, - "node_modules/domutils": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.3.0.tgz", - "integrity": "sha512-1UdPmldjSGewOuWE40YYFZB1Q4im4LZoCMXGYeTeLz3R9hvxrDYJPRcPHXR4yBbubQebgGNCY2hwpJxmAiUMzQ==", - "dependencies": { - "domelementtype": "1" - } - }, "node_modules/dotenv": { "version": "16.4.7", "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.4.7.tgz", @@ -5413,13 +5189,6 @@ "node": "^10.12.0 || >=12.0.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -5780,20 +5549,6 @@ "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", "dev": true }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", @@ -5824,45 +5579,6 @@ "node": ">=6.9.0" } }, - "node_modules/geojson-numeric": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/geojson-numeric/-/geojson-numeric-0.2.1.tgz", - "integrity": "sha512-rvItMp3W7pe16o2EQTnRw54v6WHdiE4bYjUsdr3FZskFb6oPC7gjLe4zginP+Wd1B/HLl2acTukfn16Lmwn7lg==", - "dependencies": { - "concat-stream": "2.0.0", - "optimist": "~0.3.5" - }, - "bin": { - "geojson-numeric": "geojson-numeric" - } - }, - "node_modules/geojson-numeric/node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/geojson-numeric/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", @@ -5897,17 +5613,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-value": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", @@ -6168,25 +5873,6 @@ "node": ">=0.10.0" } }, - "node_modules/glob-watcher/node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "The v1 package contains DANGEROUS / INSECURE binaries. Upgrade to safe fsevents v2", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, "node_modules/glob-watcher/node_modules/glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -6856,57 +6542,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/htmlparser2": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.5.1.tgz", - "integrity": "sha512-9ouaQ6sjVJZS4NhPC65zNm2JCJotiH6BVm6iFvI90hRcsIEISMrgjqMUrPpU9G1VS4vTspH4dyaqSRf6JLQPbg==", - "dependencies": { - "domelementtype": "1", - "domhandler": "2.2", - "domutils": "1.3", - "readable-stream": "1.1" - } - }, - "node_modules/htmlparser2/node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==" - }, - "node_modules/htmlparser2/node_modules/readable-stream": { - "version": "1.1.14", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", - "integrity": "sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/htmlparser2/node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==" - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, "node_modules/ignore": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", @@ -6962,7 +6597,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/ini": { "version": "1.3.8", @@ -7417,26 +7053,6 @@ "node": ">=6" } }, - "node_modules/jsonparse": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-0.0.5.tgz", - "integrity": "sha512-fw7Q/8gFR8iSekUi9I+HqWIap6mywuoe7hQIg3buTVjuZgALKj4HAmm0X6f+TaL4c9NJbvyFQdaI2ppr5p6dnQ==", - "engines": [ - "node >= 0.2.0" - ] - }, - "node_modules/JSONStream": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-0.8.0.tgz", - "integrity": "sha512-PiV28BpoUorz9kKFwRbD7+wg0t/k0ITHKn0DgCU44YZ/GaGAZRPt9q5PzoifC85gE55SEPIdMu0Labfxevj8cw==", - "dependencies": { - "jsonparse": "0.0.5", - "through": "~2.2.7" - }, - "engines": { - "node": "*" - } - }, "node_modules/jsvectormap": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/jsvectormap/-/jsvectormap-1.6.0.tgz", @@ -8099,14 +7715,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/minipass": { "version": "7.1.2", "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", @@ -8318,13 +7926,6 @@ "node": ">= 0.10" } }, - "node_modules/nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", - "dev": true, - "optional": true - }, "node_modules/nanoid": { "version": "3.3.7", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", @@ -8632,14 +8233,6 @@ "wrappy": "1" } }, - "node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "dependencies": { - "wordwrap": "~0.0.2" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -8678,63 +8271,6 @@ "node": ">=0.10.0" } }, - "node_modules/osm-polygon-features": { - "version": "0.9.2", - "resolved": "https://registry.npmjs.org/osm-polygon-features/-/osm-polygon-features-0.9.2.tgz", - "integrity": "sha512-5zNEFCq+G6X2TDkqbKYLF1+GtWVCCLA8zX+FVhSogsiTRsGquyaGRy5cYNW4BE3ci0MKOLvNTkFNsjsCNtgz0A==" - }, - "node_modules/osmtogeojson": { - "version": "3.0.0-beta.5", - "resolved": "https://registry.npmjs.org/osmtogeojson/-/osmtogeojson-3.0.0-beta.5.tgz", - "integrity": "sha512-izvaUWnunrYvMB4LB0ZN15O1+g90c628yHS4SeSR3daVSBF9vdTHL7iVHfg0wEr1uEYjQ+lMJHCiYFusL5yKVg==", - "dependencies": { - "@mapbox/geojson-rewind": "0.5.2", - "@xmldom/xmldom": "0.8.3", - "concat-stream": "2.0.0", - "geojson-numeric": "0.2.1", - "htmlparser2": "3.5.1", - "JSONStream": "0.8.0", - "optimist": "~0.3.5", - "osm-polygon-features": "^0.9.1", - "tiny-osmpbf": "^0.1.0" - }, - "bin": { - "osmtogeojson": "osmtogeojson" - }, - "engines": { - "node": ">=0.5" - }, - "optionalDependencies": { - "@types/geojson": "^7946.0" - } - }, - "node_modules/osmtogeojson/node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/osmtogeojson/node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, "node_modules/p-limit": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", @@ -8951,18 +8487,6 @@ "node": ">= 14.16" } }, - "node_modules/pbf": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz", - "integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==", - "dependencies": { - "ieee754": "^1.1.12", - "resolve-protobuf-schema": "^2.1.0" - }, - "bin": { - "pbf": "bin/pbf" - } - }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -9155,11 +8679,6 @@ "react-is": "^16.13.1" } }, - "node_modules/protocol-buffers-schema": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz", - "integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw==" - }, "node_modules/pump": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", @@ -9604,14 +9123,6 @@ "node": ">= 0.10" } }, - "node_modules/resolve-protobuf-schema": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz", - "integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==", - "dependencies": { - "protocol-buffers-schema": "^3.3.1" - } - }, "node_modules/resolve-url": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", @@ -9723,7 +9234,8 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", + "dev": true }, "node_modules/safe-regex": { "version": "1.1.0", @@ -10308,6 +9820,7 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -10922,11 +10435,6 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, - "node_modules/through": { - "version": "2.2.7", - "resolved": "https://registry.npmjs.org/through/-/through-2.2.7.tgz", - "integrity": "sha512-JIR0m0ybkmTcR8URann+HbwKmodP+OE8UCbsifQDYMLD5J3em1Cdn3MYPpbEd5elGDwmP98T+WbqP/tvzA5Mjg==" - }, "node_modules/through2": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", @@ -10984,20 +10492,6 @@ "node": ">=0.12" } }, - "node_modules/tiny-inflate": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", - "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" - }, - "node_modules/tiny-osmpbf": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/tiny-osmpbf/-/tiny-osmpbf-0.1.0.tgz", - "integrity": "sha512-Sl0xuDdM0+bnrYPhTAWnQ5eui8+2cpYCnsBxq0EFR1/IgmfB7+FiC23I8aa7tdP4AjaWvBUMK34kfXdY6C1LCQ==", - "dependencies": { - "pbf": "^3.0.4", - "tiny-inflate": "^1.0.2" - } - }, "node_modules/to-absolute-glob": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", @@ -11172,7 +10666,8 @@ "node_modules/typedarray": { "version": "0.0.6", "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==" + "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", + "dev": true }, "node_modules/typescript": { "version": "5.5.4", @@ -11428,7 +10923,8 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", + "dev": true }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", @@ -11596,14 +11092,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/workerpool": { "version": "6.5.1", "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.5.1.tgz", diff --git a/package.json b/package.json index 4bace0ba2cc3b..d9e43a5fbb6a8 100644 --- a/package.json +++ b/package.json @@ -50,7 +50,6 @@ "jsvectormap": "^1.6.0", "leaflet": "^1.7.1", "leaflet.markercluster": "1.5.3", - "osmtogeojson": "^3.0.0-beta.4", "papaparse": "^5.5.2", "select2": "~4.0", "jsbarcode": "^3.11.6" @@ -95,4 +94,4 @@ "url": "https://opencollective.com/openfoodfacts-server" }, "snyk": true -} \ No newline at end of file +} diff --git a/templates/web/pages/products_map/map_of_products.tt.html b/templates/web/pages/products_map/map_of_products.tt.html index 5484611f93cb0..16315e56b2f86 100644 --- a/templates/web/pages/products_map/map_of_products.tt.html +++ b/templates/web/pages/products_map/map_of_products.tt.html @@ -1,11 +1,8 @@ - - -

[% title %]

@@ -15,7 +12,8 @@

[% edq(lang('search_map_link')) %]

[% END %] - diff --git a/templates/web/pages/tags_map/map_of_tags.tt.html b/templates/web/pages/tags_map/map_of_tags.tt.html index 2e0dd57c8d3b9..b109d825dd008 100644 --- a/templates/web/pages/tags_map/map_of_tags.tt.html +++ b/templates/web/pages/tags_map/map_of_tags.tt.html @@ -1,11 +1,10 @@ - - - - - - + + - - - - - - - - - - - - - - - - - - - - -