From 08c68d507b81247b0f398679733b9628ed46844d Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Sun, 14 Jul 2024 10:38:26 +0200 Subject: [PATCH 01/21] let's start from here --- ACCESSIBILITY.md | 1 + CHANGELOG.md | 3 - css/20_map.css | 3 +- css/65_data.css | 25 + data/core.yaml | 32 +- data/qa_data.json | 10 + modules/modes/select_error.js | 11 + modules/renderer/photos.js | 10 +- modules/services/improveOSM.js | 481 ++++++ modules/services/index.js | 3 + modules/services/panoramax.js | 4 - modules/svg/improveOSM.js | 227 +++ modules/svg/layers.js | 4 +- modules/svg/panoramax_images.js | 50 + modules/ui/commit.js | 7 + modules/ui/improveOSM_comments.js | 92 + modules/ui/improveOSM_details.js | 125 ++ modules/ui/improveOSM_editor.js | 200 +++ modules/ui/improveOSM_header.js | 67 + modules/ui/index.js | 4 + modules/ui/sections/data_layers.js | 2 +- modules/ui/sections/photo_overlays.js | 161 ++ modules/ui/sidebar.js | 6 +- package-lock.json | 1568 +++++------------- package.json | 12 +- svg/fontawesome/fas-long-arrow-alt-right.svg | 1 + test/spec/svg/layers.js | 20 +- 27 files changed, 1982 insertions(+), 1147 deletions(-) create mode 100644 modules/services/improveOSM.js create mode 100644 modules/svg/improveOSM.js create mode 100644 modules/ui/improveOSM_comments.js create mode 100644 modules/ui/improveOSM_details.js create mode 100644 modules/ui/improveOSM_editor.js create mode 100644 modules/ui/improveOSM_header.js create mode 100644 svg/fontawesome/fas-long-arrow-alt-right.svg diff --git a/ACCESSIBILITY.md b/ACCESSIBILITY.md index 82eb48ba48..8fd90adc3f 100644 --- a/ACCESSIBILITY.md +++ b/ACCESSIBILITY.md @@ -193,6 +193,7 @@ translated to one or more languages. | ✅ | OSM community index | | | | ✅ | iD validation issues | | | | ✅ | KeepRight issues | | | +| ✅ | ImproveOSM issues | | | | ✅ | Osmose issues | Translated strings are [provided by Osmose](https://www.transifex.com/openstreetmap-france/osmose/) itself, not iD | | ### Language Coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index 2e1553c033..8b56b93d51 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -45,9 +45,7 @@ _Breaking developer changes, which may affect downstream projects or sites that * Sort preset-specific optional fields before universal fields in "Add field" dropdown ([#10181], thanks [@zbycz]) #### :scissors: Operations #### :camera: Street-Level -* Added base functionalities for new Panoramax Street level ([#9941]) #### :white_check_mark: Validation -* Drop deprecated validation service _ImproveOSM_ ([#10302], thanks [@arch0345]) #### :bug: Bugfixes * Fix bug which required a second button click when resolving/reopening of OSM notes ([#8994], thanks [@laigyu]) * Fix API URLs for ImproveOSM QA service ([#9993], thanks [@k-yle]) @@ -72,7 +70,6 @@ _Breaking developer changes, which may affect downstream projects or sites that [#10255]: https://github.com/openstreetmap/iD/pull/10255 [#10257]: https://github.com/openstreetmap/iD/pull/10257 [#10260]: https://github.com/openstreetmap/iD/issues/10260 -[#10302]: https://github.com/openstreetmap/iD/issues/10302 [@zbycz]: https://github.com/zbycz diff --git a/css/20_map.css b/css/20_map.css index 7856a6e581..8f2f6b138d 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -33,7 +33,8 @@ /* No interactivity except what we specifically allow */ .data-layer.osm *, .data-layer.notes *, -.data-layer.keepRight * { +.data-layer.keepRight *, +.data-layer.improveOSM * { pointer-events: none; } diff --git a/css/65_data.css b/css/65_data.css index f3bf3c46fd..d2c0db8bf8 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -3,6 +3,7 @@ .qa-header-icon .qaItem-fill, .layer-keepRight .qaItem .qaItem-fill, +.layer-improveOSM .qaItem .qaItem-fill, .layer-osmose .qaItem .qaItem-fill { stroke: #333; stroke-width: 1.3px; /* NOTE: likely a better way to scale the icon stroke */ @@ -126,6 +127,30 @@ color: #c35; } +/* ImproveOSM Issues +------------------------------------------------------- */ + +.improveOSM.itemType-ow { /* missing one way */ + color: #1E90FF; +} + +.improveOSM.itemType-mr-road { /* missing road */ + color: #B452CD; +} +.improveOSM.itemType-mr-path { /* missing path */ + color: #A0522D; +} +.improveOSM.itemType-mr-parking { /* missing parking */ + color: #EEEE00; +} +.improveOSM.itemType-mr-both { /* missing road+parking */ + color: #FFA500; +} + +.improveOSM.itemType-tr { /* missing turn restriction */ + color: #EC1C24; +} + /* Custom Map Data (geojson, gpx, kml, vector tile) */ .layer-mapdata { pointer-events: none; diff --git a/data/core.yaml b/data/core.yaml index 3c42674dd6..2035f27aa2 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -839,6 +839,9 @@ en: keepRight: tooltip: Data issues detected by keepright.at title: KeepRight Issues + improveOSM: + tooltip: Missing data detected by improveosm.org + title: ImproveOSM Issues osmose: tooltip: Data issues detected by osmose.openstreetmap.fr title: Osmose Issues @@ -1097,6 +1100,33 @@ en: elems_title: Features fix_title: Fix Guidelines trap_title: Common Mistakes + improveOSM: + title: ImproveOSM Detection + geometry_types: + path: paths + parking: parking + road: roads + both: roads and parking + directions: + east: east + north: north + northeast: northeast + northwest: northwest + south: south + southeast: southeast + southwest: southwest + west: west + error_types: + ow: + title: Missing One-way + description: 'Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a "oneway" tag.' + mr: + title: Missing Geometry + description: '{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.' + description_alt: 'Data from a 3rd party suggests there may be unmapped {geometry_type} here.' + tr: + title: Missing Turn Restriction + description: '{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing "{turn_restriction}" restriction.' keepRight: title: KeepRight detail_description: Description @@ -1664,7 +1694,7 @@ en: title: Quality Assurance intro: "*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, open the {data_icon} **{map_data}** panel and enable a specific Q/A layer." tools_h: "Tools" - tools: "The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [Osmose](https://osmose.openstreetmap.fr/)." + tools: "The following tools are currently supported: [KeepRight](https://www.keepright.at/), [ImproveOSM](https://improveosm.org/en/) and [Osmose](https://osmose.openstreetmap.fr/)." issues_h: "Handling Issues" issues: "Handling Q/A issues is similar to handling notes. Select a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue." field: diff --git a/data/qa_data.json b/data/qa_data.json index 029d6a0dea..9091132c65 100644 --- a/data/qa_data.json +++ b/data/qa_data.json @@ -1,4 +1,14 @@ { + "improveOSM": { + "icons": { + "ow": "fas-long-arrow-alt-right", + "mr-both": "maki-car", + "mr-parking": "maki-parking", + "mr-path": "maki-shoe", + "mr-road": "maki-car", + "tr": "temaki-junction" + } + }, "osmose": { "icons": { "0-1": "maki-home", diff --git a/modules/modes/select_error.js b/modules/modes/select_error.js index bde94e2f35..3721259079 100644 --- a/modules/modes/select_error.js +++ b/modules/modes/select_error.js @@ -12,6 +12,7 @@ import { services } from '../services'; import { modeBrowse } from './browse'; import { modeDragNode } from './drag_node'; import { modeDragNote } from './drag_note'; +import { uiImproveOsmEditor } from '../ui/improveOSM_editor'; import { uiKeepRightEditor } from '../ui/keepRight_editor'; import { uiOsmoseEditor } from '../ui/osmose_editor'; import { utilKeybinding } from '../util'; @@ -28,6 +29,16 @@ export function modeSelectError(context, selectedErrorID, selectedErrorService) var errorService = services[selectedErrorService]; var errorEditor; switch (selectedErrorService) { + case 'improveOSM': + errorEditor = uiImproveOsmEditor(context) + .on('change', function() { + context.map().pan([0,0]); // trigger a redraw + var error = checkSelectedID(); + if (!error) return; + context.ui().sidebar + .show(errorEditor.error(error)); + }); + break; case 'keepRight': errorEditor = uiKeepRightEditor(context) .on('change', function() { diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index ff10aa22a4..9a177afab5 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -157,7 +157,15 @@ export function rendererPhotos(context) { } photos.shouldFilterByDate = function() { - return showsLayer('mapillary') || showsLayer('kartaview') || showsLayer('streetside') || showsLayer('vegbilder') || showsLayer('panoramax'); + return showsLayer('mapillary') || showsLayer('kartaview') || showsLayer('streetside') || showsLayer('vegbilder'); + }; + + photos.shouldFilterByMaxAge = function(){ + return false; + }; + + photos.shouldFilterDateBySlider = function(){ + return showsLayer('panoramax'); }; photos.shouldFilterByPhotoType = function() { diff --git a/modules/services/improveOSM.js b/modules/services/improveOSM.js new file mode 100644 index 0000000000..903912619b --- /dev/null +++ b/modules/services/improveOSM.js @@ -0,0 +1,481 @@ +import RBush from 'rbush'; + +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { json as d3_json } from 'd3-fetch'; + +import { fileFetcher } from '../core/file_fetcher'; +import { geoExtent, geoVecAdd, geoVecScale } from '../geo'; +import { QAItem } from '../osm'; +import { serviceOsm } from './index'; +import { t } from '../core/localizer'; +import { utilRebind, utilTiler, utilQsString } from '../util'; + + +const tiler = utilTiler(); +const dispatch = d3_dispatch('loaded'); +const _tileZoom = 14; +const _impOsmUrls = { + ow: 'https://community.improveosm.org/directionOfFlowService', + mr: 'https://community.improveosm.org/missingGeoService', + tr: 'https://community.improveosm.org/turnRestrictionService' +}; +let _impOsmData = { icons: {} }; + + +// This gets reassigned if reset +let _cache; + +function abortRequest(i) { + Object.values(i).forEach(controller => { + if (controller) { + controller.abort(); + } + }); +} + +function abortUnwantedRequests(cache, tiles) { + Object.keys(cache.inflightTile).forEach(k => { + const wanted = tiles.find(tile => k === tile.id); + if (!wanted) { + abortRequest(cache.inflightTile[k]); + delete cache.inflightTile[k]; + } + }); +} + +function encodeIssueRtree(d) { + return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; +} + +// Replace or remove QAItem from rtree +function updateRtree(item, replace) { + _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id); + + if (replace) { + _cache.rtree.insert(item); + } +} + +function linkErrorObject(d) { + return { html: `${d}` }; +} + +function linkEntity(d) { + return { html: `${d}` }; +} + +function pointAverage(points) { + if (points.length) { + const sum = points.reduce( + (acc, point) => geoVecAdd(acc, [point.lon, point.lat]), + [0,0] + ); + return geoVecScale(sum, 1 / points.length); + } else { + return [0,0]; + } +} + +function relativeBearing(p1, p2) { + let angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat); + if (angle < 0) { + angle += 2 * Math.PI; + } + + // Return degrees + return angle * 180 / Math.PI; +} + +// Assuming range [0,360) +function cardinalDirection(bearing) { + const dir = 45 * Math.round(bearing / 45); + const compass = { + 0: 'north', + 45: 'northeast', + 90: 'east', + 135: 'southeast', + 180: 'south', + 225: 'southwest', + 270: 'west', + 315: 'northwest', + 360: 'north' + }; + + return t(`QA.improveOSM.directions.${compass[dir]}`); +} + +// Errors shouldn't obscure each other +function preventCoincident(loc, bumpUp) { + let coincident = false; + do { + // first time, move marker up. after that, move marker right. + let delta = coincident ? [0.00001, 0] : + bumpUp ? [0, 0.00001] : + [0, 0]; + loc = geoVecAdd(loc, delta); + let bbox = geoExtent(loc).bbox(); + coincident = _cache.rtree.search(bbox).length; + } while (coincident); + + return loc; +} + +export default { + title: 'improveOSM', + + init() { + fileFetcher.get('qa_data') + .then(d => _impOsmData = d.improveOSM); + + if (!_cache) { + this.reset(); + } + + this.event = utilRebind(this, dispatch, 'on'); + }, + + reset() { + if (_cache) { + Object.values(_cache.inflightTile).forEach(abortRequest); + } + _cache = { + data: {}, + loadedTile: {}, + inflightTile: {}, + inflightPost: {}, + closed: {}, + rtree: new RBush() + }; + }, + + loadIssues(projection) { + const options = { + client: 'iD', + status: 'OPEN', + zoom: '19' // Use a high zoom so that clusters aren't returned + }; + + // determine the needed tiles to cover the view + const tiles = tiler + .zoomExtent([_tileZoom, _tileZoom]) + .getTiles(projection); + + // abort inflight requests that are no longer needed + abortUnwantedRequests(_cache, tiles); + + // issue new requests.. + tiles.forEach(tile => { + if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) return; + + const [ east, north, west, south ] = tile.extent.rectangle(); + const params = Object.assign({}, options, { east, south, west, north }); + + // 3 separate requests to store for each tile + const requests = {}; + + Object.keys(_impOsmUrls).forEach(k => { + // We exclude WATER from missing geometry as it doesn't seem useful + // We use most confident one-way and turn restrictions only, still have false positives + const kParams = Object.assign({}, + params, + (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' } + ); + const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams); + const controller = new AbortController(); + + requests[k] = controller; + + d3_json(url, { signal: controller.signal }) + .then(data => { + delete _cache.inflightTile[tile.id][k]; + if (!Object.keys(_cache.inflightTile[tile.id]).length) { + delete _cache.inflightTile[tile.id]; + _cache.loadedTile[tile.id] = true; + } + + // Road segments at high zoom == oneways + if (data.roadSegments) { + data.roadSegments.forEach(feature => { + // Position error at the approximate middle of the segment + const { points, wayId, fromNodeId, toNodeId } = feature; + const itemId = `${wayId}${fromNodeId}${toNodeId}`; + let mid = points.length / 2; + let loc; + + // Even number of points, find midpoint of the middle two + // Odd number of points, use position of very middle point + if (mid % 1 === 0) { + loc = pointAverage([points[mid - 1], points[mid]]); + } else { + mid = points[Math.floor(mid)]; + loc = [mid.lon, mid.lat]; + } + + // One-ways can land on same segment in opposite direction + loc = preventCoincident(loc, false); + + let d = new QAItem(loc, this, k, itemId, { + issueKey: k, // used as a category + identifier: { // used to post changes + wayId, + fromNodeId, + toNodeId + }, + objectId: wayId, + objectType: 'way' + }); + + // Variables used in the description + d.replacements = { + percentage: feature.percentOfTrips, + num_trips: feature.numberOfTrips, + highway: linkErrorObject(t('QA.keepRight.error_parts.highway')), + from_node: linkEntity('n' + feature.fromNodeId), + to_node: linkEntity('n' + feature.toNodeId) + }; + + _cache.data[d.id] = d; + _cache.rtree.insert(encodeIssueRtree(d)); + }); + } + + // Tiles at high zoom == missing roads + if (data.tiles) { + data.tiles.forEach(feature => { + const { type, x, y, numberOfTrips } = feature; + const geoType = type.toLowerCase(); + const itemId = `${geoType}${x}${y}${numberOfTrips}`; + + // Average of recorded points should land on the missing geometry + // Missing geometry could happen to land on another error + let loc = pointAverage(feature.points); + loc = preventCoincident(loc, false); + + let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, { + issueKey: k, + identifier: { x, y } + }); + + d.replacements = { + num_trips: numberOfTrips, + geometry_type: t(`QA.improveOSM.geometry_types.${geoType}`) + }; + + // -1 trips indicates data came from a 3rd party + if (numberOfTrips === -1) { + d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements); + } + + _cache.data[d.id] = d; + _cache.rtree.insert(encodeIssueRtree(d)); + }); + } + + // Entities at high zoom == turn restrictions + if (data.entities) { + data.entities.forEach(feature => { + const { point, id, segments, numberOfPasses, turnType } = feature; + const itemId = `${id.replace(/[,:+#]/g, '_')}`; + + // Turn restrictions could be missing at same junction + // We also want to bump the error up so node is accessible + const loc = preventCoincident([point.lon, point.lat], true); + + // Elements are presented in a strange way + const ids = id.split(','); + const from_way = ids[0]; + const via_node = ids[3]; + const to_way = ids[2].split(':')[1]; + + let d = new QAItem(loc, this, k, itemId, { + issueKey: k, + identifier: id, + objectId: via_node, + objectType: 'node' + }); + + // Travel direction along from_way clarifies the turn restriction + const [ p1, p2 ] = segments[0].points; + const dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); + + // Variables used in the description + d.replacements = { + num_passed: numberOfPasses, + num_trips: segments[0].numberOfTrips, + turn_restriction: turnType.toLowerCase(), + from_way: linkEntity('w' + from_way), + to_way: linkEntity('w' + to_way), + travel_direction: dir_of_travel, + junction: linkErrorObject(t('QA.keepRight.error_parts.this_node')) + }; + + _cache.data[d.id] = d; + _cache.rtree.insert(encodeIssueRtree(d)); + dispatch.call('loaded'); + }); + } + }) + .catch(() => { + delete _cache.inflightTile[tile.id][k]; + if (!Object.keys(_cache.inflightTile[tile.id]).length) { + delete _cache.inflightTile[tile.id]; + _cache.loadedTile[tile.id] = true; + } + }); + }); + + _cache.inflightTile[tile.id] = requests; + }); + }, + + getComments(item) { + // If comments already retrieved no need to do so again + if (item.comments) { + return Promise.resolve(item); + } + + const key = item.issueKey; + let qParams = {}; + + if (key === 'ow') { + qParams = item.identifier; + } else if (key === 'mr') { + qParams.tileX = item.identifier.x; + qParams.tileY = item.identifier.y; + } else if (key === 'tr') { + qParams.targetId = item.identifier; + } + + const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams); + const cacheComments = data => { + // Assign directly for immediate use afterwards + // comments are served newest to oldest + item.comments = data.comments ? data.comments.reverse() : []; + this.replaceItem(item); + }; + + return d3_json(url).then(cacheComments).then(() => item); + }, + + postUpdate(d, callback) { + if (!serviceOsm.authenticated()) { // Username required in payload + return callback({ message: 'Not Authenticated', status: -3}, d); + } + if (_cache.inflightPost[d.id]) { + return callback({ message: 'Error update already inflight', status: -2 }, d); + } + + // Payload can only be sent once username is established + serviceOsm.userDetails(sendPayload.bind(this)); + + function sendPayload(err, user) { + if (err) { return callback(err, d); } + + const key = d.issueKey; + const url = `${_impOsmUrls[key]}/comment`; + const payload = { + username: user.display_name, + targetIds: [ d.identifier ] + }; + + if (d.newStatus) { + payload.status = d.newStatus; + payload.text = 'status changed'; + } + + // Comment take place of default text + if (d.newComment) { + payload.text = d.newComment; + } + + const controller = new AbortController(); + _cache.inflightPost[d.id] = controller; + + const options = { + method: 'POST', + signal: controller.signal, + body: JSON.stringify(payload) + }; + + d3_json(url, options) + .then(() => { + delete _cache.inflightPost[d.id]; + + // Just a comment, update error in cache + if (!d.newStatus) { + const now = new Date(); + let comments = d.comments ? d.comments : []; + + comments.push({ + username: payload.username, + text: payload.text, + timestamp: now.getTime() / 1000 + }); + + this.replaceItem(d.update({ + comments: comments, + newComment: undefined + })); + } else { + this.removeItem(d); + if (d.newStatus === 'SOLVED') { + // Keep track of the number of issues closed per type to tag the changeset + if (!(d.issueKey in _cache.closed)) { + _cache.closed[d.issueKey] = 0; + } + _cache.closed[d.issueKey] += 1; + } + } + if (callback) callback(null, d); + }) + .catch(err => { + delete _cache.inflightPost[d.id]; + if (callback) callback(err.message); + }); + } + }, + + + // Get all cached QAItems covering the viewport + getItems(projection) { + const viewport = projection.clipExtent(); + const min = [viewport[0][0], viewport[1][1]]; + const max = [viewport[1][0], viewport[0][1]]; + const bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); + + return _cache.rtree.search(bbox).map(d => d.data); + }, + + // Get a QAItem from cache + // NOTE: Don't change method name until UI v3 is merged + getError(id) { + return _cache.data[id]; + }, + + // get the name of the icon to display for this item + getIcon(itemType) { + return _impOsmData.icons[itemType]; + }, + + // Replace a single QAItem in the cache + replaceItem(issue) { + if (!(issue instanceof QAItem) || !issue.id) return; + + _cache.data[issue.id] = issue; + updateRtree(encodeIssueRtree(issue), true); // true = replace + return issue; + }, + + // Remove a single QAItem from the cache + removeItem(issue) { + if (!(issue instanceof QAItem) || !issue.id) return; + + delete _cache.data[issue.id]; + updateRtree(encodeIssueRtree(issue), false); // false = remove + }, + + // Used to populate `closed:improveosm:*` changeset tags + getClosedCounts() { + return _cache.closed; + } +}; diff --git a/modules/services/index.js b/modules/services/index.js index af98a7c3c7..81fc9036e0 100644 --- a/modules/services/index.js +++ b/modules/services/index.js @@ -1,4 +1,5 @@ import serviceKeepRight from './keepRight'; +import serviceImproveOSM from './improveOSM'; import serviceOsmose from './osmose'; import serviceMapillary from './mapillary'; import serviceMapRules from './maprules'; @@ -20,6 +21,7 @@ import servicePanoramax from './panoramax'; export let services = { geocoder: serviceNominatim, keepRight: serviceKeepRight, + improveOSM: serviceImproveOSM, osmose: serviceOsmose, mapillary: serviceMapillary, nsi: serviceNsi, @@ -39,6 +41,7 @@ export let services = { export { serviceKeepRight, + serviceImproveOSM, serviceOsmose, serviceMapillary, serviceMapRules, diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index 9113966c76..b2bb375fcb 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -330,10 +330,6 @@ export default { } }, - getActiveImage: function(){ - return _activeImage; - }, - // Update the currently highlighted sequence and selected bubble. setStyles: function(context, hovered) { const hoveredImageId = hovered && hovered.id; diff --git a/modules/svg/improveOSM.js b/modules/svg/improveOSM.js new file mode 100644 index 0000000000..b8cd77dbda --- /dev/null +++ b/modules/svg/improveOSM.js @@ -0,0 +1,227 @@ +import _throttle from 'lodash-es/throttle'; +import { select as d3_select } from 'd3-selection'; + +import { modeBrowse } from '../modes/browse'; +import { svgPointTransform } from './helpers'; +import { services } from '../services'; + +let _layerEnabled = false; +let _qaService; + +export function svgImproveOSM(projection, context, dispatch) { + const throttledRedraw = _throttle(() => dispatch.call('change'), 1000); + const minZoom = 12; + + let touchLayer = d3_select(null); + let drawLayer = d3_select(null); + let layerVisible = false; + + function markerPath(selection, klass) { + selection + .attr('class', klass) + .attr('transform', 'translate(-10, -28)') + .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6'); + } + + // Loosely-coupled improveOSM service for fetching issues + function getService() { + if (services.improveOSM && !_qaService) { + _qaService = services.improveOSM; + _qaService.on('loaded', throttledRedraw); + } else if (!services.improveOSM && _qaService) { + _qaService = null; + } + + return _qaService; + } + + // Show the markers + function editOn() { + if (!layerVisible) { + layerVisible = true; + drawLayer + .style('display', 'block'); + } + } + + // Immediately remove the markers and their touch targets + function editOff() { + if (layerVisible) { + layerVisible = false; + drawLayer + .style('display', 'none'); + drawLayer.selectAll('.qaItem.improveOSM') + .remove(); + touchLayer.selectAll('.qaItem.improveOSM') + .remove(); + } + } + + // Enable the layer. This shows the markers and transitions them to visible. + function layerOn() { + editOn(); + + drawLayer + .style('opacity', 0) + .transition() + .duration(250) + .style('opacity', 1) + .on('end interrupt', () => dispatch.call('change')); + } + + // Disable the layer. This transitions the layer invisible and then hides the markers. + function layerOff() { + throttledRedraw.cancel(); + drawLayer.interrupt(); + touchLayer.selectAll('.qaItem.improveOSM') + .remove(); + + drawLayer + .transition() + .duration(250) + .style('opacity', 0) + .on('end interrupt', () => { + editOff(); + dispatch.call('change'); + }); + } + + // Update the issue markers + function updateMarkers() { + if (!layerVisible || !_layerEnabled) return; + + const service = getService(); + const selectedID = context.selectedErrorID(); + const data = (service ? service.getItems(projection) : []); + const getTransform = svgPointTransform(projection); + + // Draw markers.. + const markers = drawLayer.selectAll('.qaItem.improveOSM') + .data(data, d => d.id); + + // exit + markers.exit() + .remove(); + + // enter + const markersEnter = markers.enter() + .append('g') + .attr('class', d => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); + + markersEnter + .append('polygon') + .call(markerPath, 'shadow'); + + markersEnter + .append('ellipse') + .attr('cx', 0) + .attr('cy', 0) + .attr('rx', 4.5) + .attr('ry', 2) + .attr('class', 'stroke'); + + markersEnter + .append('polygon') + .attr('fill', 'currentColor') + .call(markerPath, 'qaItem-fill'); + + markersEnter + .append('use') + .attr('class', 'icon-annotation') + .attr('transform', 'translate(-6, -22)') + .attr('width', '12px') + .attr('height', '12px') + .attr('xlink:href', d => d.icon ? '#' + d.icon : ''); + + // update + markers + .merge(markersEnter) + .sort(sortY) + .classed('selected', d => d.id === selectedID) + .attr('transform', getTransform); + + + // Draw targets.. + if (touchLayer.empty()) return; + const fillClass = context.getDebug('target') ? 'pink ' : 'nocolor '; + + const targets = touchLayer.selectAll('.qaItem.improveOSM') + .data(data, d => d.id); + + // exit + targets.exit() + .remove(); + + // enter/update + targets.enter() + .append('rect') + .attr('width', '20px') + .attr('height', '30px') + .attr('x', '-10px') + .attr('y', '-28px') + .merge(targets) + .sort(sortY) + .attr('class', d => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`) + .attr('transform', getTransform); + + function sortY(a, b) { + return (a.id === selectedID) ? 1 + : (b.id === selectedID) ? -1 + : b.loc[1] - a.loc[1]; + } + } + + // Draw the ImproveOSM layer and schedule loading issues and updating markers. + function drawImproveOSM(selection) { + const service = getService(); + + const surface = context.surface(); + if (surface && !surface.empty()) { + touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers'); + } + + drawLayer = selection.selectAll('.layer-improveOSM') + .data(service ? [0] : []); + + drawLayer.exit() + .remove(); + + drawLayer = drawLayer.enter() + .append('g') + .attr('class', 'layer-improveOSM') + .style('display', _layerEnabled ? 'block' : 'none') + .merge(drawLayer); + + if (_layerEnabled) { + if (service && ~~context.map().zoom() >= minZoom) { + editOn(); + service.loadIssues(projection); + updateMarkers(); + } else { + editOff(); + } + } + } + + // Toggles the layer on and off + drawImproveOSM.enabled = function(val) { + if (!arguments.length) return _layerEnabled; + + _layerEnabled = val; + if (_layerEnabled) { + layerOn(); + } else { + layerOff(); + if (context.selectedErrorID()) { + context.enter(modeBrowse(context)); + } + } + + dispatch.call('change'); + return this; + }; + + drawImproveOSM.supported = () => !!getService(); + + return drawImproveOSM; +} diff --git a/modules/svg/layers.js b/modules/svg/layers.js index 518bc5ce8b..4db0de6292 100644 --- a/modules/svg/layers.js +++ b/modules/svg/layers.js @@ -6,6 +6,7 @@ import { svgLocalPhotos} from './local_photos'; import { svgDebug } from './debug'; import { svgGeolocate } from './geolocate'; import { svgKeepRight } from './keepRight'; +import { svgImproveOSM } from './improveOSM'; import { svgOsmose } from './osmose'; import { svgStreetside } from './streetside'; import { svgVegbilder} from './vegbilder'; @@ -31,6 +32,7 @@ export function svgLayers(projection, context) { { id: 'notes', layer: svgNotes(projection, context, dispatch) }, { id: 'data', layer: svgData(projection, context, dispatch) }, { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch) }, + { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch) }, { id: 'osmose', layer: svgOsmose(projection, context, dispatch) }, { id: 'streetside', layer: svgStreetside(projection, context, dispatch)}, { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch) }, @@ -39,8 +41,8 @@ export function svgLayers(projection, context) { { id: 'mapillary-signs', layer: svgMapillarySigns(projection, context, dispatch) }, { id: 'kartaview', layer: svgKartaviewImages(projection, context, dispatch) }, { id: 'mapilio', layer: svgMapilioImages(projection, context, dispatch) }, - { id: 'vegbilder', layer: svgVegbilder(projection, context, dispatch) }, { id: 'panoramax', layer: svgPanoramaxImages(projection, context, dispatch) }, + { id: 'vegbilder', layer: svgVegbilder(projection, context, dispatch) }, { id: 'local-photos', layer: svgLocalPhotos(projection, context, dispatch) }, { id: 'debug', layer: svgDebug(projection, context, dispatch) }, { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch) }, diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index f5edef387b..2948623cc6 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -10,6 +10,7 @@ export function svgPanoramaxImages(projection, context, dispatch) { const imageMinZoom = 15; const lineMinZoom = 10; const viewFieldZoomLevel = 18; + const maxOldestYear = 2010; let layer = d3_select(null); let _panoramax; let _viewerYaw = 0; @@ -202,6 +203,51 @@ export function svgPanoramaxImages(projection, context, dispatch) { if (service) service.setStyles(context, null); } + function updateYearSlider(minYear){ + let maxYear = new Date(); + maxYear = maxYear.getFullYear(); + let slider = d3_select('.list-option-date-slider'); + + if (slider && minYear){ + let sliderWrap = slider.select(function() { return this.parentNode; }); + let sliderLabel = sliderWrap.select('.year-selected'); + + sliderWrap.selectAll('datalist').remove(); + + let datalist = sliderWrap.append('datalist') + .attr('id', 'dateValues') + .attr('class', 'year-datalist'); + + minYear = parseInt(minYear, 10); + + if (minYear < maxOldestYear) minYear = maxOldestYear; + + let currYear = sliderLabel.html(); + currYear = currYear.substring(0, 4); + currYear = parseInt(currYear, 10); + + let sliderValue = maxYear - (currYear - minYear); + + if (minYear > currYear){ + sliderValue = maxYear; + sliderLabel.html(minYear + ' - ' + maxYear); + } + + slider.attr('value', sliderValue); + slider.attr('min', minYear); + + datalist + .append('option') + .attr('value', minYear) + .attr('label', minYear); + + datalist + .append('option') + .attr('value', maxYear) + .attr('label', maxYear); + } + } + async function update() { const zoom = ~~context.map().zoom(); const showViewfields = (zoom >= viewFieldZoomLevel); @@ -213,6 +259,8 @@ export function svgPanoramaxImages(projection, context, dispatch) { images = await filterImages(images); sequences = await filterSequences(sequences, service); + let oldestDate = (service ? service.getOldestDate() : null); + let traces = layer.selectAll('.sequences').selectAll('.sequence') .data(sequences, function(d) { return d.id; }); @@ -276,6 +324,8 @@ export function svgPanoramaxImages(projection, context, dispatch) { .attr('transform', 'scale(1.5,1.5),translate(-8, -13)') .attr('d', viewfieldPath); + if (oldestDate) updateYearSlider(oldestDate.substring(0, 4)); + function viewfieldPath() { if (this.parentNode.__data__.isPano) { return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; diff --git a/modules/ui/commit.js b/modules/ui/commit.js index 59cbdaf813..326b8202a6 100644 --- a/modules/ui/commit.js +++ b/modules/ui/commit.js @@ -27,6 +27,7 @@ var readOnlyTags = [ /^resolved:/, /^closed:note$/, /^closed:keepright$/, + /^closed:improveosm:/, /^closed:osmose:/ ]; @@ -154,6 +155,12 @@ export function uiCommit(context) { tags['closed:keepright'] = context.cleanTagValue(krClosed.join(';')); } } + if (services.improveOSM) { + var iOsmClosed = services.improveOSM.getClosedCounts(); + for (itemType in iOsmClosed) { + tags['closed:improveosm:' + itemType] = context.cleanTagValue(iOsmClosed[itemType].toString()); + } + } if (services.osmose) { var osmoseClosed = services.osmose.getClosedCounts(); for (itemType in osmoseClosed) { diff --git a/modules/ui/improveOSM_comments.js b/modules/ui/improveOSM_comments.js new file mode 100644 index 0000000000..92bdefc911 --- /dev/null +++ b/modules/ui/improveOSM_comments.js @@ -0,0 +1,92 @@ +import { select as d3_select } from 'd3-selection'; + +import { t, localizer } from '../core/localizer'; +import { svgIcon } from '../svg/icon'; +import { services } from '../services'; + +export function uiImproveOsmComments() { + let _qaItem; + + function issueComments(selection) { + // make the div immediately so it appears above the buttons + let comments = selection.selectAll('.comments-container') + .data([0]); + + comments = comments.enter() + .append('div') + .attr('class', 'comments-container') + .merge(comments); + + // must retrieve comments from API before they can be displayed + services.improveOSM.getComments(_qaItem) + .then(d => { + if (!d.comments) return; // nothing to do here + + const commentEnter = comments.selectAll('.comment') + .data(d.comments) + .enter() + .append('div') + .attr('class', 'comment'); + + commentEnter + .append('div') + .attr('class', 'comment-avatar') + .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon')); + + const mainEnter = commentEnter + .append('div') + .attr('class', 'comment-main'); + + const metadataEnter = mainEnter + .append('div') + .attr('class', 'comment-metadata'); + + metadataEnter + .append('div') + .attr('class', 'comment-author') + .each(function(d) { + const osm = services.osm; + let selection = d3_select(this); + if (osm && d.username) { + selection = selection + .append('a') + .attr('class', 'comment-author-link') + .attr('href', osm.userURL(d.username)) + .attr('target', '_blank'); + } + selection + .text(d => d.username); + }); + + metadataEnter + .append('div') + .attr('class', 'comment-date') + .html(d => t.html('note.status.commented', { when: localeDateString(d.timestamp) })); + + mainEnter + .append('div') + .attr('class', 'comment-text') + .append('p') + .text(d => d.text); + }) + .catch(err => { + console.log(err); // eslint-disable-line no-console + }); + } + + function localeDateString(s) { + if (!s) return null; + const options = { day: 'numeric', month: 'short', year: 'numeric' }; + const d = new Date(s * 1000); // timestamp is served in seconds, date takes ms + if (isNaN(d.getTime())) return null; + return d.toLocaleDateString(localizer.localeCode(), options); + } + + issueComments.issue = function(val) { + if (!arguments.length) return _qaItem; + _qaItem = val; + return issueComments; + }; + + return issueComments; +} diff --git a/modules/ui/improveOSM_details.js b/modules/ui/improveOSM_details.js new file mode 100644 index 0000000000..9f8c3e5438 --- /dev/null +++ b/modules/ui/improveOSM_details.js @@ -0,0 +1,125 @@ +import { + select as d3_select +} from 'd3-selection'; + +import { presetManager } from '../presets'; +import { modeSelect } from '../modes/select'; +import { t } from '../core/localizer'; +import { utilDisplayName, utilHighlightEntities, utilEntityRoot } from '../util'; + +export function uiImproveOsmDetails(context) { + let _qaItem; + + + function issueDetail(d) { + if (d.desc) return d.desc; + const issueKey = d.issueKey; + d.replacements = d.replacements || {}; + d.replacements.default = { html: t.html('inspector.unknown') }; // special key `default` works as a fallback string + return t.html(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements); + } + + + function improveOsmDetails(selection) { + const details = selection.selectAll('.error-details') + .data( + (_qaItem ? [_qaItem] : []), + d => `${d.id}-${d.status || 0}` + ); + + details.exit() + .remove(); + + const detailsEnter = details.enter() + .append('div') + .attr('class', 'error-details qa-details-container'); + + + // description + const descriptionEnter = detailsEnter + .append('div') + .attr('class', 'qa-details-subsection'); + + descriptionEnter + .append('h4') + .call(t.append('QA.keepRight.detail_description')); + + descriptionEnter + .append('div') + .attr('class', 'qa-details-description-text') + .html(issueDetail); + + // If there are entity links in the error message.. + let relatedEntities = []; + descriptionEnter.selectAll('.error_entity_link, .error_object_link') + .attr('href', '#') + .each(function() { + const link = d3_select(this); + const isObjectLink = link.classed('error_object_link'); + const entityID = isObjectLink ? + (utilEntityRoot(_qaItem.objectType) + _qaItem.objectId) + : this.textContent; + const entity = context.hasEntity(entityID); + + relatedEntities.push(entityID); + + // Add click handler + link + .on('mouseenter', () => { + utilHighlightEntities([entityID], true, context); + }) + .on('mouseleave', () => { + utilHighlightEntities([entityID], false, context); + }) + .on('click', (d3_event) => { + d3_event.preventDefault(); + + utilHighlightEntities([entityID], false, context); + + const osmlayer = context.layers().layer('osm'); + if (!osmlayer.enabled()) { + osmlayer.enabled(true); + } + + context.map().centerZoom(_qaItem.loc, 20); + + if (entity) { + context.enter(modeSelect(context, [entityID])); + } else { + context.loadEntity(entityID, (err, result) => { + if (err) return; + const entity = result.data.find(e => e.id === entityID); + if (entity) context.enter(modeSelect(context, [entityID])); + }); + } + }); + + // Replace with friendly name if possible + // (The entity may not yet be loaded into the graph) + if (entity) { + let name = utilDisplayName(entity); // try to use common name + + if (!name && !isObjectLink) { + const preset = presetManager.match(entity, context.graph()); + name = preset && !preset.isFallback() && preset.name(); // fallback to preset name + } + + if (name) { + this.innerText = name; + } + } + }); + + // Don't hide entities related to this error - #5880 + context.features().forceVisible(relatedEntities); + context.map().pan([0,0]); // trigger a redraw + } + + improveOsmDetails.issue = function(val) { + if (!arguments.length) return _qaItem; + _qaItem = val; + return improveOsmDetails; + }; + + return improveOsmDetails; +} diff --git a/modules/ui/improveOSM_editor.js b/modules/ui/improveOSM_editor.js new file mode 100644 index 0000000000..98473b3f46 --- /dev/null +++ b/modules/ui/improveOSM_editor.js @@ -0,0 +1,200 @@ +import { dispatch as d3_dispatch } from 'd3-dispatch'; +import { select as d3_select } from 'd3-selection'; + +import { t } from '../core/localizer'; +import { services } from '../services'; +import { modeBrowse } from '../modes/browse'; +import { svgIcon } from '../svg/icon'; + +import { uiImproveOsmComments } from './improveOSM_comments'; +import { uiImproveOsmDetails } from './improveOSM_details'; +import { uiImproveOsmHeader } from './improveOSM_header'; + +import { utilNoAuto, utilRebind } from '../util'; + +export function uiImproveOsmEditor(context) { + const dispatch = d3_dispatch('change'); + const qaDetails = uiImproveOsmDetails(context); + const qaComments = uiImproveOsmComments(context); + const qaHeader = uiImproveOsmHeader(context); + + let _qaItem; + + function improveOsmEditor(selection) { + + const headerEnter = selection.selectAll('.header') + .data([0]) + .enter() + .append('div') + .attr('class', 'header fillL'); + + headerEnter + .append('button') + .attr('class', 'close') + .attr('title', t('icons.close')) + .on('click', () => context.enter(modeBrowse(context))) + .call(svgIcon('#iD-icon-close')); + + headerEnter + .append('h2') + .call(t.append('QA.improveOSM.title')); + + let body = selection.selectAll('.body') + .data([0]); + + body = body.enter() + .append('div') + .attr('class', 'body') + .merge(body); + + const editor = body.selectAll('.qa-editor') + .data([0]); + + editor.enter() + .append('div') + .attr('class', 'modal-section qa-editor') + .merge(editor) + .call(qaHeader.issue(_qaItem)) + .call(qaDetails.issue(_qaItem)) + .call(qaComments.issue(_qaItem)) + .call(improveOsmSaveSection); + } + + function improveOsmSaveSection(selection) { + const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID()); + const isShown = (_qaItem && (isSelected || _qaItem.newComment || _qaItem.comment)); + let saveSection = selection.selectAll('.qa-save') + .data( + (isShown ? [_qaItem] : []), + d => `${d.id}-${d.status || 0}` + ); + + // exit + saveSection.exit() + .remove(); + + // enter + const saveSectionEnter = saveSection.enter() + .append('div') + .attr('class', 'qa-save save-section cf'); + + saveSectionEnter + .append('h4') + .attr('class', '.qa-save-header') + .call(t.append('note.newComment')); + + saveSectionEnter + .append('textarea') + .attr('class', 'new-comment-input') + .attr('placeholder', t('QA.keepRight.comment_placeholder')) + .attr('maxlength', 1000) + .property('value', d => d.newComment) + .call(utilNoAuto) + .on('input', changeInput) + .on('blur', changeInput); + + // update + saveSection = saveSectionEnter + .merge(saveSection) + .call(qaSaveButtons); + + function changeInput() { + const input = d3_select(this); + let val = input.property('value').trim(); + + if (val === '') { + val = undefined; + } + + // store the unsaved comment with the issue itself + _qaItem = _qaItem.update({ newComment: val }); + + const qaService = services.improveOSM; + if (qaService) { + qaService.replaceItem(_qaItem); + } + + saveSection + .call(qaSaveButtons); + } + } + + function qaSaveButtons(selection) { + const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID()); + let buttonSection = selection.selectAll('.buttons') + .data((isSelected ? [_qaItem] : []), d => d.status + d.id); + + // exit + buttonSection.exit() + .remove(); + + // enter + const buttonEnter = buttonSection.enter() + .append('div') + .attr('class', 'buttons'); + + buttonEnter + .append('button') + .attr('class', 'button comment-button action') + .call(t.append('QA.keepRight.save_comment')); + + buttonEnter + .append('button') + .attr('class', 'button close-button action'); + + buttonEnter + .append('button') + .attr('class', 'button ignore-button action'); + + // update + buttonSection = buttonSection + .merge(buttonEnter); + + buttonSection.select('.comment-button') + .attr('disabled', d => d.newComment ? null : true) + .on('click.comment', function(d3_event, d) { + this.blur(); // avoid keeping focus on the button - #4641 + const qaService = services.improveOSM; + if (qaService) { + qaService.postUpdate(d, (err, item) => dispatch.call('change', item)); + } + }); + + buttonSection.select('.close-button') + .html(d => { + const andComment = (d.newComment ? '_comment' : ''); + return t.html(`QA.keepRight.close${andComment}`); + }) + .on('click.close', function(d3_event, d) { + this.blur(); // avoid keeping focus on the button - #4641 + const qaService = services.improveOSM; + if (qaService) { + d.newStatus = 'SOLVED'; + qaService.postUpdate(d, (err, item) => dispatch.call('change', item)); + } + }); + + buttonSection.select('.ignore-button') + .html(d => { + const andComment = (d.newComment ? '_comment' : ''); + return t.html(`QA.keepRight.ignore${andComment}`); + }) + .on('click.ignore', function(d3_event, d) { + this.blur(); // avoid keeping focus on the button - #4641 + const qaService = services.improveOSM; + if (qaService) { + d.newStatus = 'INVALID'; + qaService.postUpdate(d, (err, item) => dispatch.call('change', item)); + } + }); + } + + // NOTE: Don't change method name until UI v3 is merged + improveOsmEditor.error = function(val) { + if (!arguments.length) return _qaItem; + _qaItem = val; + return improveOsmEditor; + }; + + return utilRebind(improveOsmEditor, dispatch, 'on'); +} diff --git a/modules/ui/improveOSM_header.js b/modules/ui/improveOSM_header.js new file mode 100644 index 0000000000..164eba7946 --- /dev/null +++ b/modules/ui/improveOSM_header.js @@ -0,0 +1,67 @@ +import { t } from '../core/localizer'; + + +export function uiImproveOsmHeader() { + let _qaItem; + + + function issueTitle(d) { + const issueKey = d.issueKey; + d.replacements = d.replacements || {}; + d.replacements.default = { html: t.html('inspector.unknown') }; // special key `default` works as a fallback string + return t.html(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements); + } + + + function improveOsmHeader(selection) { + const header = selection.selectAll('.qa-header') + .data( + (_qaItem ? [_qaItem] : []), + d => `${d.id}-${d.status || 0}` + ); + + header.exit() + .remove(); + + const headerEnter = header.enter() + .append('div') + .attr('class', 'qa-header'); + + const svgEnter = headerEnter + .append('div') + .attr('class', 'qa-header-icon') + .classed('new', d => d.id < 0) + .append('svg') + .attr('width', '20px') + .attr('height', '30px') + .attr('viewbox', '0 0 20 30') + .attr('class', d => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); + + svgEnter + .append('polygon') + .attr('fill', 'currentColor') + .attr('class', 'qaItem-fill') + .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6'); + + svgEnter + .append('use') + .attr('class', 'icon-annotation') + .attr('width', '12px') + .attr('height', '12px') + .attr('transform', 'translate(4, 5.5)') + .attr('xlink:href', d => d.icon ? '#' + d.icon : ''); + + headerEnter + .append('div') + .attr('class', 'qa-header-label') + .html(issueTitle); + } + + improveOsmHeader.issue = function(val) { + if (!arguments.length) return _qaItem; + _qaItem = val; + return improveOsmHeader; + }; + + return improveOsmHeader; +} diff --git a/modules/ui/index.js b/modules/ui/index.js index 2097203e6f..2ffbdd11b0 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -23,6 +23,10 @@ export { uiFlash } from './flash'; export { uiFormFields } from './form_fields'; export { uiFullScreen } from './full_screen'; export { uiGeolocate } from './geolocate'; +export { uiImproveOsmComments } from './improveOSM_comments'; +export { uiImproveOsmDetails } from './improveOSM_details'; +export { uiImproveOsmEditor } from './improveOSM_editor'; +export { uiImproveOsmHeader } from './improveOSM_header'; export { uiInfo } from './info'; export { uiInspector } from './inspector'; export { uiIssuesInfo } from './issues_info'; diff --git a/modules/ui/sections/data_layers.js b/modules/ui/sections/data_layers.js index 4053c3bf17..41afb19f98 100644 --- a/modules/ui/sections/data_layers.js +++ b/modules/ui/sections/data_layers.js @@ -128,7 +128,7 @@ export function uiSectionDataLayers(context) { } function drawQAItems(selection) { - var qaKeys = ['keepRight', 'osmose']; + var qaKeys = ['keepRight', 'improveOSM', 'osmose']; var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; }); var ul = selection diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index 7d5c35ea23..a572b44eb6 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -30,6 +30,7 @@ export function uiSectionPhotoOverlays(context) { .merge(container) .call(drawPhotoItems) .call(drawPhotoTypeItems) + .call(drawDateSlider) .call(drawDateFilter) .call(drawUsernameFilter) .call(drawLocalPhotos); @@ -257,6 +258,166 @@ export function uiSectionPhotoOverlays(context) { .classed('active', filterEnabled); } + function drawMaxAgeFilter(selection){ + function filterEnabled(d) { + return context.photos().maxPhotoAge(d); + } + + var ul = selection + .selectAll('.layer-list-date-age') + .data([0]); + + ul.exit() + .remove(); + + ul = ul.enter() + .append('ul') + .attr('class', 'layer-list layer-list-date-age') + .merge(ul); + + var li = ul.selectAll('.list-item-date-age') + .data(context.photos().shouldFilterByMaxAge() ? ['max-age'] : []); + + li.exit() + .remove(); + + var liEnter = li.enter() + .append('li') + .attr('class', 'list-item-date-age'); + + var labelEnter = liEnter + .append('label') + .each(function() { + d3_select(this) + .call(uiTooltip() + .title(() => t.append('photo_overlays.max_age_filter.tooltip')) + .placement('top') + ); + }); + + labelEnter + .append('span') + .call(t.append('photo_overlays.max_age_filter.title')); + + labelEnter + .append('select') + .attr('type', 'text') + .attr('class', 'list-option') + .call(utilNoAuto); + + var select = labelEnter.selectAll('.list-option'); + + select + .append('option') + .attr('value', -1) + .call(t.append('photo_overlays.max_age_filter.all')); + + select + .append('option') + .attr('value', 7) + .call(t.append('photo_overlays.max_age_filter.week')); + + select + .append('option') + .attr('value', 31) + .call(t.append('photo_overlays.max_age_filter.month')); + + select + .append('option') + .attr('value', 365) + .call(t.append('photo_overlays.max_age_filter.year')); + + select + .on('change', function() { + var value = d3_select(this).property('value'); + context.photos().setMaxPhotoAge(parseInt(value, 10)); + }); + + li + .merge(liEnter) + .classed('active', filterEnabled); + } + + function drawDateSlider(selection){ + + function filterEnabled() { + return context.photos().yearSliderValue(); + } + + var maxYear = new Date(); + maxYear = parseInt(maxYear.getFullYear(), 10); + + let yearSliderValue = context.photos().yearSliderValue(); + let currYear; + + if (yearSliderValue) currYear = yearSliderValue; + else currYear = maxYear; + + var ul = selection + .selectAll('.layer-list-date-slider') + .data([0]); + + ul.exit() + .remove(); + + ul = ul.enter() + .append('ul') + .attr('class', 'layer-list layer-list-date-slider') + .merge(ul); + + var li = ul.selectAll('.list-item-date-slider') + .data(context.photos().shouldFilterDateBySlider() ? ['date-slider'] : []); + + li.exit() + .remove(); + + var liEnter = li.enter() + .append('li') + .attr('class', 'list-item-date-slider'); + + var labelEnter = liEnter + .append('label') + .each(function() { + d3_select(this) + .call(uiTooltip() + .title(() => t.append('photo_overlays.age_slider_filter.tooltip')) + .placement('top') + ); + }); + + labelEnter + .append('span') + .call(t.append('photo_overlays.age_slider_filter.title')); + + let sliderWrap = labelEnter + .append('div') + .attr('class','slider-wrap'); + + let output = sliderWrap + .append('output') + .attr('class','year-selected') + .html(currYear + ' - ' + maxYear); + + sliderWrap + .append('input') + .attr('type', 'range') + .attr('max', maxYear) + .attr('list', 'dateValues') + .attr('class', 'list-option-date-slider') + .call(utilNoAuto) + .on('change', function() { + let value = parseInt(d3_select(this).property('value'), 10); + let minYear = parseInt(d3_select(this).property('min'), 10); + value = minYear + (maxYear - value); + context.photos().setFromYearFilter(value, true); + output.html(value + ' - ' + maxYear); + }); + + li + .merge(liEnter) + .classed('active', filterEnabled); + } + function drawUsernameFilter(selection) { function filterEnabled() { return context.photos().usernames(); diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index 0c7aec564b..418910e8c5 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -12,6 +12,7 @@ import { services } from '../services'; import { uiDataEditor } from './data_editor'; import { uiFeatureList } from './feature_list'; import { uiInspector } from './inspector'; +import { uiImproveOsmEditor } from './improveOSM_editor'; import { uiKeepRightEditor } from './keepRight_editor'; import { uiOsmoseEditor } from './osmose_editor'; import { uiNoteEditor } from './note_editor'; @@ -22,6 +23,7 @@ export function uiSidebar(context) { var inspector = uiInspector(context); var dataEditor = uiDataEditor(context); var noteEditor = uiNoteEditor(context); + var improveOsmEditor = uiImproveOsmEditor(context); var keepRightEditor = uiKeepRightEditor(context); var osmoseEditor = uiOsmoseEditor(context); var _current; @@ -209,8 +211,10 @@ export function uiSidebar(context) { var errEditor; if (datum.service === 'keepRight') { errEditor = keepRightEditor; - } else { + } else if (datum.service === 'osmose') { errEditor = osmoseEditor; + } else { + errEditor = improveOsmEditor; } context.container().selectAll('.qaItem.' + datum.service) diff --git a/package-lock.json b/package-lock.json index ba8d02f933..37e6bdc4da 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,8 @@ "@rapideditor/country-coder": "~5.2.2", "@rapideditor/location-conflation": "~1.3.0", "@tmcw/togeojson": "^5.8.1", - "@turf/bbox": "^7.0.0", - "@turf/bbox-clip": "^7.0.0", + "@turf/bbox": "^6.0.0", + "@turf/bbox-clip": "^6.0.0", "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.2.9", @@ -44,10 +44,10 @@ "@mapbox/maki": "^8.0.1", "@openstreetmap/id-tagging-schema": "^6.7.3", "@rapideditor/mapillary_sprite_source": "^1.8.0", - "@rapideditor/temaki": "^5.9.0", - "@transifex/api": "^7.1.2", + "@rapideditor/temaki": "^5.8.0", + "@transifex/api": "^7.1.0", "autoprefixer": "^10.4.19", - "browserslist": "^4.23.2", + "browserslist": "^4.23.0", "browserslist-to-esbuild": "^2.1.1", "chai": "^4.4.1", "chalk": "^4.1.2", @@ -57,7 +57,7 @@ "d3": "~7.9.0", "dotenv": "^16.4.5", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - "esbuild": "^0.23.0", + "esbuild": "^0.21.4", "esbuild-visualizer": "^0.6.0", "eslint": "^9.4.0", "fetch-mock": "^9.11.0", @@ -593,9 +593,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz", + "integrity": "sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==", "cpu": [ "ppc64" ], @@ -605,13 +605,13 @@ "aix" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.4.tgz", + "integrity": "sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==", "cpu": [ "arm" ], @@ -621,13 +621,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz", + "integrity": "sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==", "cpu": [ "arm64" ], @@ -637,13 +637,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.4.tgz", + "integrity": "sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==", "cpu": [ "x64" ], @@ -653,13 +653,13 @@ "android" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz", + "integrity": "sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==", "cpu": [ "arm64" ], @@ -669,13 +669,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz", + "integrity": "sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==", "cpu": [ "x64" ], @@ -685,13 +685,13 @@ "darwin" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz", + "integrity": "sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==", "cpu": [ "arm64" ], @@ -701,13 +701,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz", + "integrity": "sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==", "cpu": [ "x64" ], @@ -717,13 +717,13 @@ "freebsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz", + "integrity": "sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==", "cpu": [ "arm" ], @@ -733,13 +733,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz", + "integrity": "sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==", "cpu": [ "arm64" ], @@ -749,13 +749,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz", + "integrity": "sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==", "cpu": [ "ia32" ], @@ -765,13 +765,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz", + "integrity": "sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==", "cpu": [ "loong64" ], @@ -781,13 +781,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz", + "integrity": "sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==", "cpu": [ "mips64el" ], @@ -797,13 +797,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz", + "integrity": "sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==", "cpu": [ "ppc64" ], @@ -813,13 +813,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz", + "integrity": "sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==", "cpu": [ "riscv64" ], @@ -829,13 +829,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz", + "integrity": "sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==", "cpu": [ "s390x" ], @@ -845,13 +845,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz", + "integrity": "sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==", "cpu": [ "x64" ], @@ -861,13 +861,13 @@ "linux" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz", + "integrity": "sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==", "cpu": [ "x64" ], @@ -877,29 +877,13 @@ "netbsd" ], "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz", + "integrity": "sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==", "cpu": [ "x64" ], @@ -909,13 +893,13 @@ "openbsd" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz", + "integrity": "sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==", "cpu": [ "x64" ], @@ -925,13 +909,13 @@ "sunos" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz", + "integrity": "sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==", "cpu": [ "arm64" ], @@ -941,13 +925,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz", + "integrity": "sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==", "cpu": [ "ia32" ], @@ -957,13 +941,13 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz", + "integrity": "sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==", "cpu": [ "x64" ], @@ -973,7 +957,7 @@ "win32" ], "engines": { - "node": ">=18" + "node": ">=12" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1438,9 +1422,9 @@ "dev": true }, "node_modules/@rapideditor/temaki": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.9.0.tgz", - "integrity": "sha512-l/ccuN25j4oOjAlrmd20VNQ0Uvwi5sKQ6CikG7e+12qqZRrwywWdFKKopFQMQtGe1Ub8fs8ykaFeUDQn8ic3fQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.8.0.tgz", + "integrity": "sha512-7bBC8wujia9ygZz3KdjVjr1tZbcNysolEB1tbWVi5rM0MI9VvHPSNC7rUzVUge5vu98qEBWIe5h/25DkXM8h8w==", "dev": true, "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" @@ -1710,9 +1694,9 @@ } }, "node_modules/@transifex/api": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.2.tgz", - "integrity": "sha512-OJc2jn/mb5qoSBiMyaPHiUZhIdqeMAW5tFNER+EBK7P0oRvM3twT+C0foMLrEQLKe4mKdvKDAJ0p3PiQgNFqTg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.0.tgz", + "integrity": "sha512-qXH1H8+7nDj4KcNlcxzpU9DGj6WSfap4EgSEQnF2ALRsyHAdfg49ne1+I7aBFaqdnR3tsFK6KTr/lVUCybUmLQ==", "dev": true, "dependencies": { "core-js": "^3.35.0" @@ -1730,61 +1714,49 @@ } }, "node_modules/@turf/bbox": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.0.0.tgz", - "integrity": "sha512-IyXG5HAsn6IZLdAtQo7aWYccjU5WsV+uzIzhGaXrh/qTVylSYmRiWgLdiekHZVED9nv9r7D/EJUMOT4zyA6POA==", + "version": "6.5.0", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.0.0", - "@turf/meta": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/bbox-clip": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.0.0.tgz", - "integrity": "sha512-ZSReB14sSQpP5TE6g5SijVFijxMp8pyrM0PgEN1LR9Bm+nj7BmmGzHafV3lyteml2bmlFdQxkbTqcbvlVXS98g==", + "version": "6.5.0", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.0.0", - "@turf/invariant": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/helpers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", - "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", - "dependencies": { - "deep-equal": "^2.2.3", - "tslib": "^2.6.2" - }, + "version": "6.5.0", + "license": "MIT", "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/invariant": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", - "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", + "version": "6.5.0", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/meta": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.0.0.tgz", - "integrity": "sha512-cEXr13uFwhXq5mFBy0IK1U/QepE5qgk3zXpBYsla3lYV7cB83Vh+NNUR+r0/w/QoJqest1TG4H20F9tGYWPi/g==", + "version": "6.5.0", + "license": "MIT", "dependencies": { - "@turf/helpers": "^7.0.0" + "@turf/helpers": "^6.5.0" }, "funding": { "url": "https://opencollective.com/turf" @@ -2007,21 +1979,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "dependencies": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array-differ": { "version": "1.0.0", "dev": true, @@ -2095,20 +2052,6 @@ "postcss": "^8.1.0" } }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -2209,12 +2152,11 @@ } }, "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "3.0.2", "dev": true, + "license": "MIT", "dependencies": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" }, "engines": { "node": ">=8" @@ -2231,9 +2173,9 @@ "license": "ISC" }, "node_modules/browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "funding": [ { @@ -2250,10 +2192,10 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -2301,18 +2243,12 @@ } }, "node_modules/call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.2", + "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -2353,9 +2289,9 @@ "license": "MIT" }, "node_modules/caniuse-lite": { - "version": "1.0.30001641", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", - "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true, "funding": [ { @@ -3222,63 +3158,11 @@ "node": ">=6" } }, - "node_modules/deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "dependencies": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/deep-equal/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, "license": "MIT" }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/define-lazy-prop": { "version": "2.0.0", "dev": true, @@ -3288,11 +3172,10 @@ } }, "node_modules/define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.1.4", + "dev": true, + "license": "MIT", "dependencies": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3446,9 +3329,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.4.823", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.823.tgz", - "integrity": "sha512-4h+oPeAiGQOHFyUJOqpoEcPj/xxlicxBzOErVeYVMMmAiXUXsGpsFd0QXBMaUUbnD8hhSfLf9uw+MlsoIA7j5w==", + "version": "1.4.673", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", + "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==", "dev": true }, "node_modules/emoji-regex": { @@ -3471,9 +3354,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -3485,7 +3368,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "ws": "~8.11.0" }, "engines": { "node": ">=10.2.0" @@ -3567,49 +3450,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "dependencies": { - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/es-get-iterator/node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - }, "node_modules/es-to-primitive": { "version": "1.2.1", "dev": true, @@ -3627,42 +3467,41 @@ } }, "node_modules/esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.4.tgz", + "integrity": "sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=18" + "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" + "@esbuild/aix-ppc64": "0.21.4", + "@esbuild/android-arm": "0.21.4", + "@esbuild/android-arm64": "0.21.4", + "@esbuild/android-x64": "0.21.4", + "@esbuild/darwin-arm64": "0.21.4", + "@esbuild/darwin-x64": "0.21.4", + "@esbuild/freebsd-arm64": "0.21.4", + "@esbuild/freebsd-x64": "0.21.4", + "@esbuild/linux-arm": "0.21.4", + "@esbuild/linux-arm64": "0.21.4", + "@esbuild/linux-ia32": "0.21.4", + "@esbuild/linux-loong64": "0.21.4", + "@esbuild/linux-mips64el": "0.21.4", + "@esbuild/linux-ppc64": "0.21.4", + "@esbuild/linux-riscv64": "0.21.4", + "@esbuild/linux-s390x": "0.21.4", + "@esbuild/linux-x64": "0.21.4", + "@esbuild/netbsd-x64": "0.21.4", + "@esbuild/openbsd-x64": "0.21.4", + "@esbuild/sunos-x64": "0.21.4", + "@esbuild/win32-arm64": "0.21.4", + "@esbuild/win32-ia32": "0.21.4", + "@esbuild/win32-x64": "0.21.4" } }, "node_modules/esbuild-visualizer": { @@ -3721,10 +3560,9 @@ } }, "node_modules/escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.1.1", "dev": true, + "license": "MIT", "engines": { "node": ">=6" } @@ -4117,10 +3955,9 @@ "license": "MIT" }, "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "version": "7.0.1", "dev": true, + "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4237,14 +4074,6 @@ } } }, - "node_modules/for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dependencies": { - "is-callable": "^1.1.3" - } - }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -4304,27 +4133,10 @@ "dev": true, "license": "ISC" }, - "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", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } + "version": "1.1.1", + "dev": true, + "license": "MIT" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -4345,6 +4157,7 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4404,18 +4217,13 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.1.3", + "dev": true, + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" - }, - "engines": { - "node": ">= 0.4" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4581,17 +4389,6 @@ "node": ">= 0.10" } }, - "node_modules/gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dependencies": { - "get-intrinsic": "^1.1.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/graceful-fs": { "version": "4.2.10", "dev": true, @@ -4751,6 +4548,7 @@ }, "node_modules/has-bigints": { "version": "1.0.2", + "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4776,22 +4574,11 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "engines": { - "node": ">= 0.4" + "get-intrinsic": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4799,6 +4586,7 @@ }, "node_modules/has-symbols": { "version": "1.0.3", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4808,11 +4596,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "version": "1.0.0", + "dev": true, + "license": "MIT", "dependencies": { - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.2" }, "engines": { "node": ">= 0.4" @@ -4821,17 +4609,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/he": { "version": "1.2.0", "dev": true, @@ -4978,12 +4755,12 @@ "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.0.3", + "dev": true, + "license": "MIT", "dependencies": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", "side-channel": "^1.0.4" }, "engines": { @@ -5006,36 +4783,6 @@ "node": ">= 0.10" } }, - "node_modules/is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "dependencies": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "dependencies": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-arrayish": { "version": "0.2.1", "dev": true, @@ -5043,6 +4790,7 @@ }, "node_modules/is-bigint": { "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" @@ -5064,6 +4812,7 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -5078,6 +4827,7 @@ }, "node_modules/is-callable": { "version": "1.2.7", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -5099,6 +4849,7 @@ }, "node_modules/is-date-object": { "version": "1.0.5", + "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -5162,17 +4913,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -5186,15 +4926,15 @@ }, "node_modules/is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, + "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -5233,6 +4973,7 @@ }, "node_modules/is-regex": { "version": "1.1.4", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -5245,19 +4986,9 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2" @@ -5280,6 +5011,7 @@ }, "node_modules/is-string": { "version": "1.0.7", + "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -5298,6 +5030,7 @@ }, "node_modules/is-symbol": { "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" @@ -5325,17 +5058,6 @@ "dev": true, "license": "MIT" }, - "node_modules/is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -5347,21 +5069,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "dependencies": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/is-wsl": { "version": "2.2.0", "dev": true, @@ -6774,33 +6481,20 @@ "dev": true, "license": "MIT", "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.12.2", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "dependencies": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.2", + "dev": true, + "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/object-keys": { "version": "1.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6808,6 +6502,7 @@ }, "node_modules/object.assign": { "version": "4.1.4", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -7080,10 +6775,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true + "version": "1.0.0", + "dev": true, + "license": "ISC" }, "node_modules/picomatch": { "version": "2.3.1", @@ -7169,14 +6863,6 @@ "dev": true, "license": "ISC" }, - "node_modules/possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", - "engines": { - "node": ">= 0.4" - } - }, "node_modules/postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -7653,14 +7339,13 @@ "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.4.3", + "dev": true, + "license": "MIT", "dependencies": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" }, "engines": { "node": ">= 0.4" @@ -7914,36 +7599,6 @@ "randombytes": "^2.1.0" } }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/setprototypeof": { "version": "1.2.0", "dev": true, @@ -8025,6 +7680,7 @@ }, "node_modules/side-channel": { "version": "1.0.4", + "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.0", @@ -8114,13 +7770,13 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", "dev": true, "dependencies": { "debug": "~4.3.4", - "ws": "~8.17.1" + "ws": "~8.11.0" } }, "node_modules/socket.io-parser": { @@ -8338,17 +7994,6 @@ "node": ">= 0.6" } }, - "node_modules/stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dependencies": { - "internal-slot": "^1.0.4" - }, - "engines": { - "node": ">= 0.4" - } - }, "node_modules/streamroller": { "version": "3.1.2", "dev": true, @@ -8738,9 +8383,8 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, + "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -8782,9 +8426,9 @@ } }, "node_modules/tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.4.0", + "dev": true, + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -8880,9 +8524,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -8899,8 +8543,8 @@ } ], "dependencies": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" }, "bin": { "update-browserslist-db": "cli.js" @@ -9034,6 +8678,7 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", + "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", @@ -9046,23 +8691,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "dependencies": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/which-polygon": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/which-polygon/-/which-polygon-2.2.1.tgz", @@ -9083,24 +8711,6 @@ "quickselect": "^1.0.1" } }, - "node_modules/which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/winston": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", @@ -9297,16 +8907,16 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" + "utf-8-validate": "^5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -9798,170 +9408,163 @@ } }, "@esbuild/aix-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", - "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz", + "integrity": "sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", - "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.4.tgz", + "integrity": "sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", - "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz", + "integrity": "sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", - "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.4.tgz", + "integrity": "sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", - "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz", + "integrity": "sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", - "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz", + "integrity": "sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", - "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz", + "integrity": "sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", - "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz", + "integrity": "sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", - "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz", + "integrity": "sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", - "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz", + "integrity": "sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", - "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz", + "integrity": "sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", - "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz", + "integrity": "sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", - "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz", + "integrity": "sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", - "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz", + "integrity": "sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", - "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz", + "integrity": "sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", - "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz", + "integrity": "sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", - "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz", + "integrity": "sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", - "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", - "dev": true, - "optional": true - }, - "@esbuild/openbsd-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", - "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz", + "integrity": "sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", - "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz", + "integrity": "sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", - "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz", + "integrity": "sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", - "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz", + "integrity": "sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", - "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz", + "integrity": "sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", - "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz", + "integrity": "sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==", "dev": true, "optional": true }, @@ -10288,9 +9891,9 @@ "dev": true }, "@rapideditor/temaki": { - "version": "5.9.0", - "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.9.0.tgz", - "integrity": "sha512-l/ccuN25j4oOjAlrmd20VNQ0Uvwi5sKQ6CikG7e+12qqZRrwywWdFKKopFQMQtGe1Ub8fs8ykaFeUDQn8ic3fQ==", + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.8.0.tgz", + "integrity": "sha512-7bBC8wujia9ygZz3KdjVjr1tZbcNysolEB1tbWVi5rM0MI9VvHPSNC7rUzVUge5vu98qEBWIe5h/25DkXM8h8w==", "dev": true }, "@resvg/resvg-js": { @@ -10437,9 +10040,9 @@ "requires": {} }, "@transifex/api": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.2.tgz", - "integrity": "sha512-OJc2jn/mb5qoSBiMyaPHiUZhIdqeMAW5tFNER+EBK7P0oRvM3twT+C0foMLrEQLKe4mKdvKDAJ0p3PiQgNFqTg==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.0.tgz", + "integrity": "sha512-qXH1H8+7nDj4KcNlcxzpU9DGj6WSfap4EgSEQnF2ALRsyHAdfg49ne1+I7aBFaqdnR3tsFK6KTr/lVUCybUmLQ==", "dev": true, "requires": { "core-js": "^3.35.0" @@ -10450,49 +10053,32 @@ "dev": true }, "@turf/bbox": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.0.0.tgz", - "integrity": "sha512-IyXG5HAsn6IZLdAtQo7aWYccjU5WsV+uzIzhGaXrh/qTVylSYmRiWgLdiekHZVED9nv9r7D/EJUMOT4zyA6POA==", + "version": "6.5.0", "requires": { - "@turf/helpers": "^7.0.0", - "@turf/meta": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^6.5.0", + "@turf/meta": "^6.5.0" } }, "@turf/bbox-clip": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.0.0.tgz", - "integrity": "sha512-ZSReB14sSQpP5TE6g5SijVFijxMp8pyrM0PgEN1LR9Bm+nj7BmmGzHafV3lyteml2bmlFdQxkbTqcbvlVXS98g==", + "version": "6.5.0", "requires": { - "@turf/helpers": "^7.0.0", - "@turf/invariant": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^6.5.0", + "@turf/invariant": "^6.5.0" } }, "@turf/helpers": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", - "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", - "requires": { - "deep-equal": "^2.2.3", - "tslib": "^2.6.2" - } + "version": "6.5.0" }, "@turf/invariant": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", - "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", + "version": "6.5.0", "requires": { - "@turf/helpers": "^7.0.0", - "tslib": "^2.6.2" + "@turf/helpers": "^6.5.0" } }, "@turf/meta": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.0.0.tgz", - "integrity": "sha512-cEXr13uFwhXq5mFBy0IK1U/QepE5qgk3zXpBYsla3lYV7cB83Vh+NNUR+r0/w/QoJqest1TG4H20F9tGYWPi/g==", + "version": "6.5.0", "requires": { - "@turf/helpers": "^7.0.0" + "@turf/helpers": "^6.5.0" } }, "@types/cookie": { @@ -10650,15 +10236,6 @@ "version": "2.0.1", "dev": true }, - "array-buffer-byte-length": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", - "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", - "requires": { - "call-bind": "^1.0.5", - "is-array-buffer": "^3.0.4" - } - }, "array-differ": { "version": "1.0.0", "dev": true @@ -10693,14 +10270,6 @@ "postcss-value-parser": "^4.2.0" } }, - "available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "requires": { - "possible-typed-array-names": "^1.0.0" - } - }, "balanced-match": { "version": "1.0.2", "dev": true @@ -10775,12 +10344,10 @@ } }, "braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "version": "3.0.2", "dev": true, "requires": { - "fill-range": "^7.1.1" + "fill-range": "^7.0.1" } }, "browser-split": { @@ -10792,15 +10359,15 @@ "dev": true }, "browserslist": { - "version": "4.23.2", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.2.tgz", - "integrity": "sha512-qkqSyistMYdxAcw+CzbZwlBy8AGmS/eEWs+sEV5TnLRGDOL+C5M2EnH6tlZyg0YoAxGJAFKh61En9BR941GnHA==", + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001640", - "electron-to-chromium": "^1.4.820", + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", "node-releases": "^2.0.14", - "update-browserslist-db": "^1.1.0" + "update-browserslist-db": "^1.0.13" } }, "browserslist-to-esbuild": { @@ -10825,15 +10392,11 @@ "dev": true }, "call-bind": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", - "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", + "version": "1.0.2", + "dev": true, "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.1" + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" } }, "callsites": { @@ -10859,9 +10422,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001641", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001641.tgz", - "integrity": "sha512-Phv5thgl67bHYo1TtMY/MurjkHhV4EDaCosezRXgZ8jzA/Ub+wjxAvbGvjoFENStinwi5kCyOYV3mi5tOGykwA==", + "version": "1.0.30001600", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", + "integrity": "sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==", "dev": true }, "chai": { @@ -11439,62 +11002,18 @@ "type-detect": "^4.0.0" } }, - "deep-equal": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", - "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", - "requires": { - "array-buffer-byte-length": "^1.0.0", - "call-bind": "^1.0.5", - "es-get-iterator": "^1.1.3", - "get-intrinsic": "^1.2.2", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.2", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.5.1", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.13" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, "deep-is": { "version": "0.1.4", "dev": true }, - "define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "requires": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - } - }, "define-lazy-prop": { "version": "2.0.0", "dev": true }, "define-properties": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", - "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", + "version": "1.1.4", + "dev": true, "requires": { - "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -11594,9 +11113,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.823", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.823.tgz", - "integrity": "sha512-4h+oPeAiGQOHFyUJOqpoEcPj/xxlicxBzOErVeYVMMmAiXUXsGpsFd0QXBMaUUbnD8hhSfLf9uw+MlsoIA7j5w==", + "version": "1.4.673", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.673.tgz", + "integrity": "sha512-zjqzx4N7xGdl5468G+vcgzDhaHkaYgVcf9MqgexcTqsl2UHSCmOj/Bi3HAprg4BZCpC7HyD8a6nZl6QAZf72gw==", "dev": true }, "emoji-regex": { @@ -11614,9 +11133,9 @@ "dev": true }, "engine.io": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", - "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -11628,7 +11147,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" + "ws": "~8.11.0" } }, "engine.io-parser": { @@ -11691,42 +11210,6 @@ "unbox-primitive": "^1.0.2" } }, - "es-define-property": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", - "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", - "requires": { - "get-intrinsic": "^1.2.4" - } - }, - "es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" - } - } - }, "es-to-primitive": { "version": "1.2.1", "dev": true, @@ -11737,35 +11220,34 @@ } }, "esbuild": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", - "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.23.0", - "@esbuild/android-arm": "0.23.0", - "@esbuild/android-arm64": "0.23.0", - "@esbuild/android-x64": "0.23.0", - "@esbuild/darwin-arm64": "0.23.0", - "@esbuild/darwin-x64": "0.23.0", - "@esbuild/freebsd-arm64": "0.23.0", - "@esbuild/freebsd-x64": "0.23.0", - "@esbuild/linux-arm": "0.23.0", - "@esbuild/linux-arm64": "0.23.0", - "@esbuild/linux-ia32": "0.23.0", - "@esbuild/linux-loong64": "0.23.0", - "@esbuild/linux-mips64el": "0.23.0", - "@esbuild/linux-ppc64": "0.23.0", - "@esbuild/linux-riscv64": "0.23.0", - "@esbuild/linux-s390x": "0.23.0", - "@esbuild/linux-x64": "0.23.0", - "@esbuild/netbsd-x64": "0.23.0", - "@esbuild/openbsd-arm64": "0.23.0", - "@esbuild/openbsd-x64": "0.23.0", - "@esbuild/sunos-x64": "0.23.0", - "@esbuild/win32-arm64": "0.23.0", - "@esbuild/win32-ia32": "0.23.0", - "@esbuild/win32-x64": "0.23.0" + "version": "0.21.4", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.4.tgz", + "integrity": "sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.21.4", + "@esbuild/android-arm": "0.21.4", + "@esbuild/android-arm64": "0.21.4", + "@esbuild/android-x64": "0.21.4", + "@esbuild/darwin-arm64": "0.21.4", + "@esbuild/darwin-x64": "0.21.4", + "@esbuild/freebsd-arm64": "0.21.4", + "@esbuild/freebsd-x64": "0.21.4", + "@esbuild/linux-arm": "0.21.4", + "@esbuild/linux-arm64": "0.21.4", + "@esbuild/linux-ia32": "0.21.4", + "@esbuild/linux-loong64": "0.21.4", + "@esbuild/linux-mips64el": "0.21.4", + "@esbuild/linux-ppc64": "0.21.4", + "@esbuild/linux-riscv64": "0.21.4", + "@esbuild/linux-s390x": "0.21.4", + "@esbuild/linux-x64": "0.21.4", + "@esbuild/netbsd-x64": "0.21.4", + "@esbuild/openbsd-x64": "0.21.4", + "@esbuild/sunos-x64": "0.21.4", + "@esbuild/win32-arm64": "0.21.4", + "@esbuild/win32-ia32": "0.21.4", + "@esbuild/win32-x64": "0.21.4" } }, "esbuild-visualizer": { @@ -11808,9 +11290,7 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.1.1", "dev": true }, "escape-html": { @@ -12079,9 +11559,7 @@ "dev": true }, "fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "version": "7.0.1", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -12160,14 +11638,6 @@ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "requires": { - "is-callable": "^1.1.3" - } - }, "foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -12205,17 +11675,9 @@ "version": "1.0.0", "dev": true }, - "fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "optional": true - }, "function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + "version": "1.1.1", + "dev": true }, "function.prototype.name": { "version": "1.1.5", @@ -12228,7 +11690,8 @@ } }, "functions-have-names": { - "version": "1.2.3" + "version": "1.2.3", + "dev": true }, "gaze": { "version": "1.1.3", @@ -12263,15 +11726,12 @@ "dev": true }, "get-intrinsic": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", - "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", + "version": "1.1.3", + "dev": true, "requires": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "hasown": "^2.0.0" + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.3" } }, "get-stdin": { @@ -12381,14 +11841,6 @@ "sparkles": "^1.0.0" } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "requires": { - "get-intrinsic": "^1.1.3" - } - }, "graceful-fs": { "version": "4.2.10", "dev": true @@ -12496,7 +11948,8 @@ } }, "has-bigints": { - "version": "1.0.2" + "version": "1.0.2", + "dev": true }, "has-flag": { "version": "4.0.0", @@ -12510,35 +11963,21 @@ } }, "has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", + "version": "1.0.0", + "dev": true, "requires": { - "es-define-property": "^1.0.0" + "get-intrinsic": "^1.1.1" } }, - "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" - }, "has-symbols": { - "version": "1.0.3" + "version": "1.0.3", + "dev": true }, "has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "requires": { - "has-symbols": "^1.0.3" - } - }, - "hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "1.0.0", + "dev": true, "requires": { - "function-bind": "^1.1.2" + "has-symbols": "^1.0.2" } }, "he": { @@ -12633,12 +12072,11 @@ "dev": true }, "internal-slot": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", - "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", + "version": "1.0.3", + "dev": true, "requires": { - "es-errors": "^1.3.0", - "hasown": "^2.0.0", + "get-intrinsic": "^1.1.0", + "has": "^1.0.3", "side-channel": "^1.0.4" } }, @@ -12650,30 +12088,13 @@ "version": "1.4.0", "dev": true }, - "is-arguments": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", - "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-array-buffer": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", - "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.2.1" - } - }, "is-arrayish": { "version": "0.2.1", "dev": true }, "is-bigint": { "version": "1.0.4", + "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -12687,13 +12108,15 @@ }, "is-boolean-object": { "version": "1.1.2", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-callable": { - "version": "1.2.7" + "version": "1.2.7", + "dev": true }, "is-core-module": { "version": "2.10.0", @@ -12704,6 +12127,7 @@ }, "is-date-object": { "version": "1.0.5", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12731,23 +12155,17 @@ "is-extglob": "^2.1.1" } }, - "is-map": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", - "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" - }, "is-negative-zero": { "version": "2.0.2", "dev": true }, "is-number": { "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.0.7", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12768,18 +12186,15 @@ }, "is-regex": { "version": "1.1.4", + "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, - "is-set": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", - "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" - }, "is-shared-array-buffer": { "version": "1.0.2", + "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -12792,6 +12207,7 @@ }, "is-string": { "version": "1.0.7", + "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12802,6 +12218,7 @@ }, "is-symbol": { "version": "1.0.4", + "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -12814,11 +12231,6 @@ "version": "0.2.1", "dev": true }, - "is-weakmap": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", - "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" - }, "is-weakref": { "version": "1.0.2", "dev": true, @@ -12826,15 +12238,6 @@ "call-bind": "^1.0.2" } }, - "is-weakset": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", - "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", - "requires": { - "call-bind": "^1.0.7", - "get-intrinsic": "^1.2.4" - } - }, "is-wsl": { "version": "2.2.0", "dev": true, @@ -13861,22 +13264,16 @@ "dev": true }, "object-inspect": { - "version": "1.12.2" - }, - "object-is": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", - "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", - "requires": { - "call-bind": "^1.0.7", - "define-properties": "^1.2.1" - } + "version": "1.12.2", + "dev": true }, "object-keys": { - "version": "1.1.1" + "version": "1.1.1", + "dev": true }, "object.assign": { "version": "4.1.4", + "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -14054,9 +13451,7 @@ } }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "version": "1.0.0", "dev": true }, "picomatch": { @@ -14118,11 +13513,6 @@ } } }, - "possible-typed-array-names": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", - "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" - }, "postcss": { "version": "8.4.38", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", @@ -14438,14 +13828,12 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.4.3", + "dev": true, "requires": { - "call-bind": "^1.0.6", - "define-properties": "^1.2.1", - "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "functions-have-names": "^1.2.2" } }, "remap-istanbul": { @@ -14622,30 +14010,6 @@ "randombytes": "^2.1.0" } }, - "set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - } - }, - "set-function-name": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", - "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", - "requires": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "functions-have-names": "^1.2.3", - "has-property-descriptors": "^1.0.2" - } - }, "setprototypeof": { "version": "1.2.0", "dev": true @@ -14698,6 +14062,7 @@ }, "side-channel": { "version": "1.0.4", + "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -14766,13 +14131,13 @@ } }, "socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", "dev": true, "requires": { "debug": "~4.3.4", - "ws": "~8.17.1" + "ws": "~8.11.0" } }, "socket.io-parser": { @@ -14912,14 +14277,6 @@ "version": "1.5.0", "dev": true }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "requires": { - "internal-slot": "^1.0.4" - } - }, "streamroller": { "version": "3.1.2", "dev": true, @@ -15187,8 +14544,6 @@ }, "to-regex-range": { "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -15216,9 +14571,8 @@ "dev": true }, "tslib": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", - "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" + "version": "2.4.0", + "dev": true }, "type-check": { "version": "0.4.0", @@ -15271,13 +14625,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", - "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "requires": { - "escalade": "^3.1.2", - "picocolors": "^1.0.1" + "escalade": "^3.1.1", + "picocolors": "^1.0.0" } }, "uri-js": { @@ -15372,6 +14726,7 @@ }, "which-boxed-primitive": { "version": "1.0.2", + "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -15380,17 +14735,6 @@ "is-symbol": "^1.0.3" } }, - "which-collection": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", - "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", - "requires": { - "is-map": "^2.0.3", - "is-set": "^2.0.3", - "is-weakmap": "^2.0.2", - "is-weakset": "^2.0.3" - } - }, "which-polygon": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/which-polygon/-/which-polygon-2.2.1.tgz", @@ -15411,18 +14755,6 @@ } } }, - "which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", - "requires": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.7", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.2" - } - }, "winston": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", @@ -15560,9 +14892,9 @@ "dev": true }, "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 1af0e6c320..63fc40710f 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "@rapideditor/country-coder": "~5.2.2", "@rapideditor/location-conflation": "~1.3.0", "@tmcw/togeojson": "^5.8.1", - "@turf/bbox": "^7.0.0", - "@turf/bbox-clip": "^7.0.0", + "@turf/bbox": "^6.0.0", + "@turf/bbox-clip": "^6.0.0", "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.2.9", @@ -79,10 +79,10 @@ "@mapbox/maki": "^8.0.1", "@openstreetmap/id-tagging-schema": "^6.7.3", "@rapideditor/mapillary_sprite_source": "^1.8.0", - "@rapideditor/temaki": "^5.9.0", - "@transifex/api": "^7.1.2", + "@rapideditor/temaki": "^5.8.0", + "@transifex/api": "^7.1.0", "autoprefixer": "^10.4.19", - "browserslist": "^4.23.2", + "browserslist": "^4.23.0", "browserslist-to-esbuild": "^2.1.1", "chai": "^4.4.1", "chalk": "^4.1.2", @@ -92,7 +92,7 @@ "d3": "~7.9.0", "dotenv": "^16.4.5", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - "esbuild": "^0.23.0", + "esbuild": "^0.21.4", "esbuild-visualizer": "^0.6.0", "eslint": "^9.4.0", "fetch-mock": "^9.11.0", diff --git a/svg/fontawesome/fas-long-arrow-alt-right.svg b/svg/fontawesome/fas-long-arrow-alt-right.svg new file mode 100644 index 0000000000..c0a9f9b09b --- /dev/null +++ b/svg/fontawesome/fas-long-arrow-alt-right.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/test/spec/svg/layers.js b/test/spec/svg/layers.js index 390b59099f..6440d8b2b3 100644 --- a/test/spec/svg/layers.js +++ b/test/spec/svg/layers.js @@ -31,16 +31,16 @@ describe('iD.svgLayers', function () { expect(d3.select(nodes[1]).classed('notes')).to.be.true; expect(d3.select(nodes[2]).classed('data')).to.be.true; expect(d3.select(nodes[3]).classed('keepRight')).to.be.true; - expect(d3.select(nodes[4]).classed('osmose')).to.be.true; - expect(d3.select(nodes[5]).classed('streetside')).to.be.true; - expect(d3.select(nodes[6]).classed('mapillary')).to.be.true; - expect(d3.select(nodes[7]).classed('mapillary-position')).to.be.true; - expect(d3.select(nodes[8]).classed('mapillary-map-features')).to.be.true; - expect(d3.select(nodes[9]).classed('mapillary-signs')).to.be.true; - expect(d3.select(nodes[10]).classed('kartaview')).to.be.true; - expect(d3.select(nodes[11]).classed('mapilio')).to.be.true; - expect(d3.select(nodes[12]).classed('vegbilder')).to.be.true; - expect(d3.select(nodes[13]).classed('panoramax')).to.be.true; + expect(d3.select(nodes[4]).classed('improveOSM')).to.be.true; + expect(d3.select(nodes[5]).classed('osmose')).to.be.true; + expect(d3.select(nodes[6]).classed('streetside')).to.be.true; + expect(d3.select(nodes[7]).classed('mapillary')).to.be.true; + expect(d3.select(nodes[8]).classed('mapillary-position')).to.be.true; + expect(d3.select(nodes[9]).classed('mapillary-map-features')).to.be.true; + expect(d3.select(nodes[10]).classed('mapillary-signs')).to.be.true; + expect(d3.select(nodes[11]).classed('kartaview')).to.be.true; + expect(d3.select(nodes[12]).classed('mapilio')).to.be.true; + expect(d3.select(nodes[13]).classed('vegbilder')).to.be.true; expect(d3.select(nodes[14]).classed('local-photos')).to.be.true; expect(d3.select(nodes[15]).classed('debug')).to.be.true; expect(d3.select(nodes[16]).classed('geolocate')).to.be.true; From d48edf7e26ae669f7c03ae98c017d764e0853f42 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Mon, 15 Jul 2024 19:52:16 +0200 Subject: [PATCH 02/21] year slider 2.0 --- data/core.yaml | 11 +-- modules/svg/panoramax_images.js | 47 ---------- modules/ui/sections/photo_overlays.js | 126 ++++++-------------------- 3 files changed, 31 insertions(+), 153 deletions(-) diff --git a/data/core.yaml b/data/core.yaml index 2035f27aa2..5ba7bb9908 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -886,16 +886,13 @@ en: username_filter: title: "Username" tooltip: "Show only photos by this user" - max_age_filter: - year: "Last year" - month: "Last month" - week: "Last week" - all: "Show all" - title: "Photo age" - tooltip: "Select maximum photo age" age_slider_filter: title: "Year Slider" tooltip: "Select oldest photo year" + one_year: "Last year" + two_year: "Two years" + five_year: "Five years" + all: "Show all" feature: points: description: Points diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index 2948623cc6..4a280e4424 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -203,51 +203,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { if (service) service.setStyles(context, null); } - function updateYearSlider(minYear){ - let maxYear = new Date(); - maxYear = maxYear.getFullYear(); - let slider = d3_select('.list-option-date-slider'); - - if (slider && minYear){ - let sliderWrap = slider.select(function() { return this.parentNode; }); - let sliderLabel = sliderWrap.select('.year-selected'); - - sliderWrap.selectAll('datalist').remove(); - - let datalist = sliderWrap.append('datalist') - .attr('id', 'dateValues') - .attr('class', 'year-datalist'); - - minYear = parseInt(minYear, 10); - - if (minYear < maxOldestYear) minYear = maxOldestYear; - - let currYear = sliderLabel.html(); - currYear = currYear.substring(0, 4); - currYear = parseInt(currYear, 10); - - let sliderValue = maxYear - (currYear - minYear); - - if (minYear > currYear){ - sliderValue = maxYear; - sliderLabel.html(minYear + ' - ' + maxYear); - } - - slider.attr('value', sliderValue); - slider.attr('min', minYear); - - datalist - .append('option') - .attr('value', minYear) - .attr('label', minYear); - - datalist - .append('option') - .attr('value', maxYear) - .attr('label', maxYear); - } - } - async function update() { const zoom = ~~context.map().zoom(); const showViewfields = (zoom >= viewFieldZoomLevel); @@ -324,8 +279,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { .attr('transform', 'scale(1.5,1.5),translate(-8, -13)') .attr('d', viewfieldPath); - if (oldestDate) updateYearSlider(oldestDate.substring(0, 4)); - function viewfieldPath() { if (this.parentNode.__data__.isPano) { return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index a572b44eb6..6a6935f297 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -258,101 +258,12 @@ export function uiSectionPhotoOverlays(context) { .classed('active', filterEnabled); } - function drawMaxAgeFilter(selection){ - function filterEnabled(d) { - return context.photos().maxPhotoAge(d); - } - - var ul = selection - .selectAll('.layer-list-date-age') - .data([0]); - - ul.exit() - .remove(); - - ul = ul.enter() - .append('ul') - .attr('class', 'layer-list layer-list-date-age') - .merge(ul); - - var li = ul.selectAll('.list-item-date-age') - .data(context.photos().shouldFilterByMaxAge() ? ['max-age'] : []); - - li.exit() - .remove(); - - var liEnter = li.enter() - .append('li') - .attr('class', 'list-item-date-age'); - - var labelEnter = liEnter - .append('label') - .each(function() { - d3_select(this) - .call(uiTooltip() - .title(() => t.append('photo_overlays.max_age_filter.tooltip')) - .placement('top') - ); - }); - - labelEnter - .append('span') - .call(t.append('photo_overlays.max_age_filter.title')); - - labelEnter - .append('select') - .attr('type', 'text') - .attr('class', 'list-option') - .call(utilNoAuto); - - var select = labelEnter.selectAll('.list-option'); - - select - .append('option') - .attr('value', -1) - .call(t.append('photo_overlays.max_age_filter.all')); - - select - .append('option') - .attr('value', 7) - .call(t.append('photo_overlays.max_age_filter.week')); - - select - .append('option') - .attr('value', 31) - .call(t.append('photo_overlays.max_age_filter.month')); - - select - .append('option') - .attr('value', 365) - .call(t.append('photo_overlays.max_age_filter.year')); - - select - .on('change', function() { - var value = d3_select(this).property('value'); - context.photos().setMaxPhotoAge(parseInt(value, 10)); - }); - - li - .merge(liEnter) - .classed('active', filterEnabled); - } - function drawDateSlider(selection){ function filterEnabled() { return context.photos().yearSliderValue(); } - var maxYear = new Date(); - maxYear = parseInt(maxYear.getFullYear(), 10); - - let yearSliderValue = context.photos().yearSliderValue(); - let currYear; - - if (yearSliderValue) currYear = yearSliderValue; - else currYear = maxYear; - var ul = selection .selectAll('.layer-list-date-slider') .data([0]); @@ -393,26 +304,43 @@ export function uiSectionPhotoOverlays(context) { .append('div') .attr('class','slider-wrap'); - let output = sliderWrap - .append('output') - .attr('class','year-selected') - .html(currYear + ' - ' + maxYear); - sliderWrap .append('input') .attr('type', 'range') - .attr('max', maxYear) + .attr('min', 0) + .attr('max', 3) .attr('list', 'dateValues') .attr('class', 'list-option-date-slider') .call(utilNoAuto) .on('change', function() { - let value = parseInt(d3_select(this).property('value'), 10); - let minYear = parseInt(d3_select(this).property('min'), 10); - value = minYear + (maxYear - value); + let value = d3_select(this).property('value'); context.photos().setFromYearFilter(value, true); - output.html(value + ' - ' + maxYear); }); + let datalist = sliderWrap.append('datalist') + .attr('id', 'dateValues') + .attr('class', 'year-datalist'); + + datalist + .append('option') + .attr('value', 0) + .call(t.append('photo_overlays.max_age_filter.one_year')); + + datalist + .append('option') + .attr('value', 1) + .call(t.append('photo_overlays.max_age_filter.two_year')); + + datalist + .append('option') + .attr('value', 2) + .call(t.append('photo_overlays.max_age_filter.five_year')); + + datalist + .append('option') + .attr('value', 3) + .call(t.append('photo_overlays.max_age_filter.all')); + li .merge(liEnter) .classed('active', filterEnabled); From 7a6fe1d47f80231ff0621d41d839a46452357446 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Mon, 15 Jul 2024 20:13:28 +0200 Subject: [PATCH 03/21] year slider --- css/60_photos.css | 3 ++- modules/renderer/photos.js | 22 ++++++---------------- modules/ui/sections/photo_overlays.js | 22 +++++++++++----------- 3 files changed, 19 insertions(+), 28 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index 76612928b3..f5f52f6fec 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -351,7 +351,8 @@ label.panoramax-hd { } .list-option-date-slider{ - direction: rtl + direction: rtl; + width: 100%; } diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 9a177afab5..2115240196 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -90,34 +90,24 @@ export function rendererPhotos(context) { } }; - photos.setFromDateFilter = function(date, updateUrl){ - if (date !== -1){ + photos.setFromYearFilter = function(year, updateUrl){ + if (year !== 0) { + let days = 365 * year; var fromDate = new Date(); - fromDate.setDate(fromDate.getDate() - date); + fromDate.setDate(fromDate.getDate() - days); var dd = String(fromDate.getDate()).padStart(2, '0'); var mm = String(fromDate.getMonth() + 1).padStart(2, '0'); var yyyy = fromDate.getFullYear(); fromDate = mm + '/' + dd + '/' + yyyy; photos.setDateFilter('fromDate', fromDate, updateUrl); - _maxPhotoDate = date; + _maxPhotoDate = year; } else { photos.setDateFilter('fromDate', null, updateUrl); + return; } }; - photos.setFromYearFilter = function(currYear, updateUrl){ - if (currYear){ - var fromDate = new Date(currYear, 0, 1); - photos.setDateFilter('fromDate', fromDate, updateUrl); - _yearSliderValue = currYear; - } else { - photos.setDateFilter('fromDate', null, updateUrl); - } - setUrlFilterValue('slider_date', currYear); - }; - - photos.setUsernameFilter = function(val, updateUrl) { if (val && typeof val === 'string') val = val.replace(/;/g, ',').split(','); if (val) { diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index 6a6935f297..a973de5e25 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -307,8 +307,8 @@ export function uiSectionPhotoOverlays(context) { sliderWrap .append('input') .attr('type', 'range') - .attr('min', 0) - .attr('max', 3) + .attr('min', 1) + .attr('max', 5) .attr('list', 'dateValues') .attr('class', 'list-option-date-slider') .call(utilNoAuto) @@ -320,26 +320,26 @@ export function uiSectionPhotoOverlays(context) { let datalist = sliderWrap.append('datalist') .attr('id', 'dateValues') .attr('class', 'year-datalist'); - + datalist .append('option') .attr('value', 0) - .call(t.append('photo_overlays.max_age_filter.one_year')); - + .call(t.append('photo_overlays.age_slider_filter.all')); + datalist .append('option') - .attr('value', 1) - .call(t.append('photo_overlays.max_age_filter.two_year')); - + .attr('value', 5) + .call(t.append('photo_overlays.age_slider_filter.five_year')); + datalist .append('option') .attr('value', 2) - .call(t.append('photo_overlays.max_age_filter.five_year')); + .call(t.append('photo_overlays.age_slider_filter.two_year')); datalist .append('option') - .attr('value', 3) - .call(t.append('photo_overlays.max_age_filter.all')); + .attr('value', 1) + .call(t.append('photo_overlays.age_slider_filter.one_year')); li .merge(liEnter) From 6291c244d52511c80431fcc2733ffe636bf4b097 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Mon, 22 Jul 2024 12:14:15 +0200 Subject: [PATCH 04/21] fixed year slider --- css/60_photos.css | 10 ++++++++++ data/core.yaml | 3 +-- modules/renderer/photos.js | 22 +++++++++++----------- modules/ui/sections/photo_overlays.js | 19 +++++++++++++++---- 4 files changed, 37 insertions(+), 17 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index f5f52f6fec..c3436a8cb6 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -343,6 +343,7 @@ label.panoramax-hd { .slider-wrap { display: inline-block; + width: 100%; } .year-datalist { @@ -355,6 +356,15 @@ label.panoramax-hd { width: 100%; } +.yearSliderSpan{ + padding: 2px; +} + + +.list-item-date-slider label{ + display: block !important; +} + /* Streetside Viewer (pannellum) */ .ms-wrapper .photo-attribution .image-link { diff --git a/data/core.yaml b/data/core.yaml index 5ba7bb9908..b3e4362e09 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -890,8 +890,7 @@ en: title: "Year Slider" tooltip: "Select oldest photo year" one_year: "Last year" - two_year: "Two years" - five_year: "Five years" + three_year: "Three years" all: "Show all" feature: points: diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 2115240196..b4eadd2c99 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -13,7 +13,6 @@ export function rendererPhotos(context) { var _dateFilters = ['fromDate', 'toDate']; var _fromDate; var _toDate; - var _maxPhotoDate; var _yearSliderValue; var _usernames; @@ -48,10 +47,6 @@ export function rendererPhotos(context) { return _dateFilters; }; - photos.maxPhotoAge = function() { - return _maxPhotoDate; - }; - photos.yearSliderValue = function() { return _yearSliderValue; }; @@ -91,7 +86,10 @@ export function rendererPhotos(context) { }; photos.setFromYearFilter = function(year, updateUrl){ - if (year !== 0) { + + _yearSliderValue = year; + + if (year !== 5) { let days = 365 * year; var fromDate = new Date(); fromDate.setDate(fromDate.getDate() - days); @@ -101,10 +99,12 @@ export function rendererPhotos(context) { fromDate = mm + '/' + dd + '/' + yyyy; photos.setDateFilter('fromDate', fromDate, updateUrl); - _maxPhotoDate = year; } else { - photos.setDateFilter('fromDate', null, updateUrl); - return; + photos.setDateFilter('fromDate', null, updateUrl); + } + + if (updateUrl) { + setUrlFilterValue('year_slider', year); } }; @@ -212,8 +212,8 @@ export function rendererPhotos(context) { this.setDateFilter('fromDate', parts && parts.length >= 2 && parts[1], false); this.setDateFilter('toDate', parts && parts.length >= 3 && parts[2], false); } - if (hash.slider_date){ - this.setFromYearFilter(hash.slider_date, false); + if (hash.year_slider){ + this.setFromYearFilter(hash.year_slider, false); } if (hash.photo_username) { this.setUsernameFilter(hash.photo_username, false); diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index a973de5e25..183f44b887 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -298,6 +298,7 @@ export function uiSectionPhotoOverlays(context) { labelEnter .append('span') + .attr('class', 'yearSliderSpan') .call(t.append('photo_overlays.age_slider_filter.title')); let sliderWrap = labelEnter @@ -310,6 +311,7 @@ export function uiSectionPhotoOverlays(context) { .attr('min', 1) .attr('max', 5) .attr('list', 'dateValues') + .attr('value', yearSliderValue) .attr('class', 'list-option-date-slider') .call(utilNoAuto) .on('change', function() { @@ -323,18 +325,21 @@ export function uiSectionPhotoOverlays(context) { datalist .append('option') - .attr('value', 0) + .attr('value', 5) .call(t.append('photo_overlays.age_slider_filter.all')); datalist .append('option') - .attr('value', 5) - .call(t.append('photo_overlays.age_slider_filter.five_year')); + .attr('value', 4) + + datalist + .append('option') + .attr('value', 3) + .call(t.append('photo_overlays.age_slider_filter.three_year')); datalist .append('option') .attr('value', 2) - .call(t.append('photo_overlays.age_slider_filter.two_year')); datalist .append('option') @@ -344,6 +349,12 @@ export function uiSectionPhotoOverlays(context) { li .merge(liEnter) .classed('active', filterEnabled); + + function yearSliderValue() { + var sliderValue = context.photos().yearSliderValue(); + if (sliderValue) return sliderValue; + return 5; + } } function drawUsernameFilter(selection) { From 9fb907493ee7764cee28239124cfd61ac201b523 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Wed, 31 Jul 2024 11:12:25 +0200 Subject: [PATCH 05/21] bug fixes --- css/60_photos.css | 5 +- modules/services/panoramax.js | 93 +++++++++++++++++++-------------- modules/svg/panoramax_images.js | 14 ++--- 3 files changed, 62 insertions(+), 50 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index c3436a8cb6..35559c6852 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -500,9 +500,10 @@ label.streetside-hires { } .photoviewer .plane-frame > img.plane-photo { - width: auto; + width: 100%; height: 100%; - transform-origin: 0 0; + overflow: hidden; + object-fit: cover; } /* photo-controls (step forward, back, rotate) */ diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index b2bb375fcb..fa336d8230 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -273,15 +273,21 @@ export default { loadTiles('line', tileUrl, lineMinZoom, projection); }, - getUserId: async function(username){ - const requestUrl = userIdUrl.replace('{username}', username); + getUserIds: async function(usernames) { + const requestUrls = usernames.map(username => + userIdUrl.replace('{username}', username)); - const response = await fetch(requestUrl, { method: 'GET' }); - if (!response.ok) { + const responses = await Promise.all(requestUrls.map(requestUrl => + fetch(requestUrl, { method: 'GET' }))); + + if (responses.some(response => !response.ok)) { throw new Error(response.status + ' ' + response.statusText); } - const data = await response.json(); - return data.features[0].id; + + const data = await Promise.all(responses.map(response => response.json())); + // in panoramax, a username can have multiple ids, when the same name is + // used on different servers + return data.flatMap((d, i) => d.features.filter(f => f.name === usernames[i]).map(f => f.id)); }, getOldestDate: function(){ @@ -331,37 +337,48 @@ export default { }, // Update the currently highlighted sequence and selected bubble. - setStyles: function(context, hovered) { - const hoveredImageId = hovered && hovered.id; - const hoveredSequenceId = hovered && hovered.sequence_id; - const selectedSequenceId = _activeImage && _activeImage.sequence_id; - const selectedImageId = _activeImage && _activeImage.id; - - const markers = context.container().selectAll('.layer-panoramax .viewfield-group'); - const sequences = context.container().selectAll('.layer-panoramax .sequence'); - - markers - .classed('highlighted', function(d) { return d.id === hoveredImageId; }) - .classed('hovered', function(d) { return d.id === hoveredImageId; }) - .classed('currentView', function(d) { return d.id === selectedImageId; }); - - sequences - .classed('highlighted', function(d) { return d.sequence_id === hoveredSequenceId; }) - .classed('currentView', function(d) { return d.sequence_id === selectedSequenceId; }); - - // update viewfields if needed - context.container().selectAll('.layer-panoramax .viewfield-group .viewfield') - .attr('d', viewfieldPath); - - function viewfieldPath() { - let d = this.parentNode.__data__; - if (d.isPano && d.id !== selectedImageId) { - return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; - } else { - return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; + setStyles: function(context, hovered, reset) { + if (reset) { + context.container().selectAll('.viewfield-group') + .classed('highlighted', false) + .classed('hovered', false) + .classed('currentView', false); + + context.container().selectAll('.sequence') + .classed('highlighted', false) + .classed('currentView', false); + } + else { + const hoveredImageId = hovered && hovered.id; + const hoveredSequenceId = hovered && hovered.sequence_id; + const selectedSequenceId = _activeImage && _activeImage.sequence_id; + const selectedImageId = _activeImage && _activeImage.id; + + const markers = context.container().selectAll('.layer-panoramax .viewfield-group'); + const sequences = context.container().selectAll('.layer-panoramax .sequence'); + + markers + .classed('highlighted', function(d) { return d.id === hoveredImageId; }) + .classed('hovered', function(d) { return d.id === hoveredImageId; }) + .classed('currentView', function(d) { return d.id === selectedImageId; }); + + sequences + .classed('highlighted', function(d) { return d.properties.id === hoveredSequenceId; }) + .classed('currentView', function(d) { return d.properties.id === selectedSequenceId; }); + + // update viewfields if needed + context.container().selectAll('.layer-panoramax .viewfield-group .viewfield') + .attr('d', viewfieldPath); + + function viewfieldPath() { + let d = this.parentNode.__data__; + if (d.isPano && d.id !== selectedImageId) { + return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; + } else { + return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; + } } } - return this; }, @@ -391,7 +408,7 @@ export default { if (!viewer.empty()) viewer.datum(d); - this.setStyles(context, null); + this.setStyles(context, null, true); if (!d) return this; @@ -507,7 +524,7 @@ export default { line2 .append('span') .attr('class', 'captured_by') - .text('Captured by: ' + username); + .text('@' + username); }); } @@ -622,7 +639,7 @@ export default { context.container().selectAll('.viewfield-group, .sequence, .icon-sign') .classed('currentView', false); this.setActiveImage(); - return this.setStyles(context, null); + return this.setStyles(context, null, true); }, cache: function() { diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index 4a280e4424..5e8b1bb397 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -10,7 +10,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { const imageMinZoom = 15; const lineMinZoom = 10; const viewFieldZoomLevel = 18; - const maxOldestYear = 2010; let layer = d3_select(null); let _panoramax; let _viewerYaw = 0; @@ -23,7 +22,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { svgPanoramaxImages.initialized = true; } - function getService() { if (services.panoramax && !_panoramax) { _panoramax = services.panoramax; @@ -160,13 +158,13 @@ export function svgPanoramaxImages(projection, context, dispatch) { return t; } - function editOn() { layer.style('display', 'block'); } - function editOff() { + const service = getService(); + service.hideViewer(context); layer.selectAll('.viewfield-group').remove(); layer.style('display', 'none'); } @@ -179,8 +177,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { _viewerYaw = 0; // reset } - _selectedSequence = image.sequence_id; - service .ensureViewerLoaded(context) .then(function() { @@ -194,13 +190,13 @@ export function svgPanoramaxImages(projection, context, dispatch) { function mouseover(d3_event, image) { const service = getService(); - if (service) service.setStyles(context, image); + if (service) service.setStyles(context, image, false); } function mouseout() { const service = getService(); - if (service) service.setStyles(context, null); + if (service) service.setStyles(context, null, false); } async function update() { @@ -214,8 +210,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { images = await filterImages(images); sequences = await filterSequences(sequences, service); - let oldestDate = (service ? service.getOldestDate() : null); - let traces = layer.selectAll('.sequences').selectAll('.sequence') .data(sequences, function(d) { return d.id; }); From 85d9e0ba0211661702f6b1eda945180c10736e04 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Sat, 3 Aug 2024 13:55:15 +0200 Subject: [PATCH 06/21] streetlevel toggle shortcut --- data/core.yaml | 2 ++ data/shortcuts.json | 5 +++++ modules/svg/touch.js | 4 ++++ modules/ui/sections/photo_overlays.js | 24 ++++++++++++++++++++++++ 4 files changed, 35 insertions(+) diff --git a/data/core.yaml b/data/core.yaml index b3e4362e09..c1c7b51377 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -2409,6 +2409,8 @@ en: way_selected: title: "With way selected" child: "Select child nodes" + enable: + streetlevel: "Toggle streetlevel photo view" editing: title: "Editing" drawing: diff --git a/data/shortcuts.json b/data/shortcuts.json index 8cf0f2d5fb..c87cc88a1c 100644 --- a/data/shortcuts.json +++ b/data/shortcuts.json @@ -97,6 +97,11 @@ { "shortcuts": ["shortcuts.toggle.key", "?"], "text": "shortcuts.browsing.help.keyboard" + }, + { + "modifiers": ["⇧"], + "shortcuts": ["B"], + "text": "shortcuts.browsing.enable.streetlevel" } ] }, diff --git a/modules/svg/touch.js b/modules/svg/touch.js index 860f95bd1b..58a2498c02 100644 --- a/modules/svg/touch.js +++ b/modules/svg/touch.js @@ -6,6 +6,10 @@ export function svgTouch() { .enter() .append('g') .attr('class', function(d) { return 'layer-touch ' + d; }); + + drawTouch.enabled = function(_) { + return this; + }; } return drawTouch; diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index 183f44b887..b81334aa57 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -10,6 +10,10 @@ import { svgIcon } from '../../svg'; export function uiSectionPhotoOverlays(context) { + let _savedLayers = []; + let _layersHidden = false; + const _streetLayerIDs = ['streetside', 'mapillary', 'mapillary-map-features', 'mapillary-signs', 'kartaview', 'mapilio', 'vegbilder', 'panoramax']; + var settingsLocalPhotos = uiSettingsLocalPhotos(context) .on('change', localPhotosChanged); @@ -529,8 +533,28 @@ export function uiSectionPhotoOverlays(context) { localPhotosLayer.fileList(d); } + function toggleStreetSide(){ + if (!_layersHidden){ + layers.all().forEach(d => { + if(_streetLayerIDs.includes(d.id)) { + if(showsLayer(d.id)) _savedLayers.push(d.id); + setLayer(d.id, false); + } + }); + } + else { + _savedLayers.forEach(d => { + setLayer(d, true); + }); + _savedLayers = []; + } + console.log(_savedLayers); + _layersHidden = !_layersHidden; + }; + context.layers().on('change.uiSectionPhotoOverlays', section.reRender); context.photos().on('change.uiSectionPhotoOverlays', section.reRender); + context.keybinding().on('⇧B', toggleStreetSide); context.map() .on('move.photo_overlays', From aa4a4c62c6cbd3a4f36a173c9db35bc2a3788a5a Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Mon, 5 Aug 2024 13:07:53 +0200 Subject: [PATCH 07/21] added test --- modules/renderer/photos.js | 3 +- modules/services/panoramax.js | 83 +++++++++----------- modules/svg/panoramax_images.js | 4 +- modules/svg/touch.js | 1 + modules/ui/sections/photo_overlays.js | 14 ++-- test/spec/services/panoramax.js | 109 ++++++++++++++++++++++++++ test/spec/svg/layers.js | 13 +-- 7 files changed, 163 insertions(+), 64 deletions(-) diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index b4eadd2c99..8a675f688c 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -86,7 +86,6 @@ export function rendererPhotos(context) { }; photos.setFromYearFilter = function(year, updateUrl){ - _yearSliderValue = year; if (year !== 5) { @@ -100,7 +99,7 @@ export function rendererPhotos(context) { fromDate = mm + '/' + dd + '/' + yyyy; photos.setDateFilter('fromDate', fromDate, updateUrl); } else { - photos.setDateFilter('fromDate', null, updateUrl); + photos.setDateFilter('fromDate', null, updateUrl); } if (updateUrl) { diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index fa336d8230..516d7b845e 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -154,7 +154,6 @@ function loadTileDataToCache(data, tile) { sequence_id: feature.properties.sequences.split('\"')[1], heading: parseInt(feature.properties.heading, 10), image_path: '', - resolution: feature.properties.resolution, isPano: feature.properties.type === 'equirectangular', model: feature.properties.model, }; @@ -274,16 +273,16 @@ export default { }, getUserIds: async function(usernames) { - const requestUrls = usernames.map(username => + const requestUrls = usernames.map(username => userIdUrl.replace('{username}', username)); const responses = await Promise.all(requestUrls.map(requestUrl => fetch(requestUrl, { method: 'GET' }))); if (responses.some(response => !response.ok)) { - throw new Error(response.status + ' ' + response.statusText); + throw new Error(responses.status + ' ' + responses.statusText); } - + const data = await Promise.all(responses.map(response => response.json())); // in panoramax, a username can have multiple ids, when the same name is // used on different servers @@ -294,6 +293,10 @@ export default { return _oldestDate; }, + getActiveImage: function(){ + return _activeImage; + }, + // Get visible sequences sequences: function(projection, zoom) { const viewport = projection.clipExtent(); @@ -337,46 +340,34 @@ export default { }, // Update the currently highlighted sequence and selected bubble. - setStyles: function(context, hovered, reset) { - if (reset) { - context.container().selectAll('.viewfield-group') - .classed('highlighted', false) - .classed('hovered', false) - .classed('currentView', false); - - context.container().selectAll('.sequence') - .classed('highlighted', false) - .classed('currentView', false); - } - else { - const hoveredImageId = hovered && hovered.id; - const hoveredSequenceId = hovered && hovered.sequence_id; - const selectedSequenceId = _activeImage && _activeImage.sequence_id; - const selectedImageId = _activeImage && _activeImage.id; - - const markers = context.container().selectAll('.layer-panoramax .viewfield-group'); - const sequences = context.container().selectAll('.layer-panoramax .sequence'); - - markers - .classed('highlighted', function(d) { return d.id === hoveredImageId; }) - .classed('hovered', function(d) { return d.id === hoveredImageId; }) - .classed('currentView', function(d) { return d.id === selectedImageId; }); - - sequences - .classed('highlighted', function(d) { return d.properties.id === hoveredSequenceId; }) - .classed('currentView', function(d) { return d.properties.id === selectedSequenceId; }); - - // update viewfields if needed - context.container().selectAll('.layer-panoramax .viewfield-group .viewfield') - .attr('d', viewfieldPath); - - function viewfieldPath() { - let d = this.parentNode.__data__; - if (d.isPano && d.id !== selectedImageId) { - return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; - } else { - return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; - } + setStyles: function(context, hovered) { + const hoveredImageId = hovered && hovered.id; + const hoveredSequenceId = hovered && hovered.sequence_id; + const selectedSequenceId = _activeImage && _activeImage.sequence_id; + const selectedImageId = _activeImage && _activeImage.id; + + const markers = context.container().selectAll('.layer-panoramax .viewfield-group'); + const sequences = context.container().selectAll('.layer-panoramax .sequence'); + + markers + .classed('highlighted', function(d) { return d.id === hoveredImageId; }) + .classed('hovered', function(d) { return d.id === hoveredImageId; }) + .classed('currentView', function(d) { return d.id === selectedImageId; }); + + sequences + .classed('highlighted', function(d) { return d.properties.id === hoveredSequenceId; }) + .classed('currentView', function(d) { return d.properties.id === selectedSequenceId; }); + + // update viewfields if needed + context.container().selectAll('.layer-panoramax .viewfield-group .viewfield') + .attr('d', viewfieldPath); + + function viewfieldPath() { + let d = this.parentNode.__data__; + if (d.isPano && d.id !== selectedImageId) { + return 'M 8,13 m -10,0 a 10,10 0 1,0 20,0 a 10,10 0 1,0 -20,0'; + } else { + return 'M 6,9 C 8,8.4 8,8.4 10,9 L 16,-2 C 12,-5 4,-5 0,-2 z'; } } return this; @@ -408,7 +399,7 @@ export default { if (!viewer.empty()) viewer.datum(d); - this.setStyles(context, null, true); + this.setStyles(context, null); if (!d) return this; @@ -639,7 +630,7 @@ export default { context.container().selectAll('.viewfield-group, .sequence, .icon-sign') .classed('currentView', false); this.setActiveImage(); - return this.setStyles(context, null, true); + return this.setStyles(context, null); }, cache: function() { diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index 5e8b1bb397..69b3f94bb2 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -190,13 +190,13 @@ export function svgPanoramaxImages(projection, context, dispatch) { function mouseover(d3_event, image) { const service = getService(); - if (service) service.setStyles(context, image, false); + if (service) service.setStyles(context, image); } function mouseout() { const service = getService(); - if (service) service.setStyles(context, null, false); + if (service) service.setStyles(context, null); } async function update() { diff --git a/modules/svg/touch.js b/modules/svg/touch.js index 58a2498c02..f7345d7e64 100644 --- a/modules/svg/touch.js +++ b/modules/svg/touch.js @@ -8,6 +8,7 @@ export function svgTouch() { .attr('class', function(d) { return 'layer-touch ' + d; }); drawTouch.enabled = function(_) { + svgTouch.enabled = _; return this; }; } diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index b81334aa57..a5b42c631c 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -334,7 +334,7 @@ export function uiSectionPhotoOverlays(context) { datalist .append('option') - .attr('value', 4) + .attr('value', 4); datalist .append('option') @@ -343,8 +343,8 @@ export function uiSectionPhotoOverlays(context) { datalist .append('option') - .attr('value', 2) - + .attr('value', 2); + datalist .append('option') .attr('value', 1) @@ -536,19 +536,17 @@ export function uiSectionPhotoOverlays(context) { function toggleStreetSide(){ if (!_layersHidden){ layers.all().forEach(d => { - if(_streetLayerIDs.includes(d.id)) { - if(showsLayer(d.id)) _savedLayers.push(d.id); + if (_streetLayerIDs.includes(d.id)) { + if (showsLayer(d.id)) _savedLayers.push(d.id); setLayer(d.id, false); } }); - } - else { + } else { _savedLayers.forEach(d => { setLayer(d, true); }); _savedLayers = []; } - console.log(_savedLayers); _layersHidden = !_layersHidden; }; diff --git a/test/spec/services/panoramax.js b/test/spec/services/panoramax.js index 24c7176f23..51f2f56dea 100644 --- a/test/spec/services/panoramax.js +++ b/test/spec/services/panoramax.js @@ -51,6 +51,115 @@ describe('iD.servicePanoramax', function() { }); }); + describe('#loadImages', function() { + it('fires loadedImages when images are loaded', function(done) { + var data = { + images:[{ + loc: [10,0], + capture_time: '2020-01-01', + id: 'abc', + account_id: '123', + sequence_id: 'a1b2', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }, { + loc: [10,1], + capture_time: '2020-02-01', + id: 'def', + account_id: 'c3d4', + sequence_id: '', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }, { + loc: [10,2], + capture_time: '2020-02-01', + id: 'ghi', + account_id: '789', + sequence_id: 'e5f6', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }], + }; + + fetchMock.mock(new RegExp('/panoramax-test/'), { + body: JSON.stringify(data), + status: 200, + headers: { 'Content-Type': 'application/json' } + }); + + context.projection.scale(iD.geoZoomToScale(15)); + + panoramax.on('loadedImages', function() { + expect(fetchMock.calls().length).to.eql(1); // 1 nearby-photos + done(); + }).catch(done()); + + panoramax.loadImages(context.projection); + }); + + it('does not load images around null island', function (done) { + var data = { + images:[{ + loc: [10,0], + capture_time: '2020-01-01', + id: 'abc', + account_id: '123', + sequence_id: 'a1b2', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }, { + loc: [10,1], + capture_time: '2020-02-01', + id: 'def', + account_id: 'c3d4', + sequence_id: '', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }, { + loc: [10,2], + capture_time: '2020-02-01', + id: 'ghi', + account_id: '789', + sequence_id: 'e5f6', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }], + }; + + var spy = sinon.spy(); + fetchMock.mock(new RegExp('/panoramax-test/'), { + body: JSON.stringify(data), + status: 200, + headers: { 'Content-Type': 'application/json' } + }); + + context.projection + .scale(iD.geoZoomToScale(15)) + .translate([0, 0]); + + panoramax.on('loadedImages', spy); + panoramax.loadImages(context.projection); + + window.setTimeout(function() { + expect(spy).to.have.been.not.called; + expect(fetchMock.calls().length).to.eql(0); // no tile requests of any kind + done(); + }, 200); + }); + }); + describe('#images', function() { it('returns images in the visible map area', function() { var features = [ diff --git a/test/spec/svg/layers.js b/test/spec/svg/layers.js index 6440d8b2b3..96da0606d3 100644 --- a/test/spec/svg/layers.js +++ b/test/spec/svg/layers.js @@ -26,7 +26,7 @@ describe('iD.svgLayers', function () { it('creates default data layers', function () { container.call(iD.svgLayers(projection, context)); var nodes = container.selectAll('svg .data-layer').nodes(); - expect(nodes.length).to.eql(18); + expect(nodes.length).to.eql(19); expect(d3.select(nodes[0]).classed('osm')).to.be.true; expect(d3.select(nodes[1]).classed('notes')).to.be.true; expect(d3.select(nodes[2]).classed('data')).to.be.true; @@ -40,11 +40,12 @@ describe('iD.svgLayers', function () { expect(d3.select(nodes[10]).classed('mapillary-signs')).to.be.true; expect(d3.select(nodes[11]).classed('kartaview')).to.be.true; expect(d3.select(nodes[12]).classed('mapilio')).to.be.true; - expect(d3.select(nodes[13]).classed('vegbilder')).to.be.true; - expect(d3.select(nodes[14]).classed('local-photos')).to.be.true; - expect(d3.select(nodes[15]).classed('debug')).to.be.true; - expect(d3.select(nodes[16]).classed('geolocate')).to.be.true; - expect(d3.select(nodes[17]).classed('touch')).to.be.true; + expect(d3.select(nodes[13]).classed('panoramax')).to.be.true; + expect(d3.select(nodes[14]).classed('vegbilder')).to.be.true; + expect(d3.select(nodes[15]).classed('local-photos')).to.be.true; + expect(d3.select(nodes[16]).classed('debug')).to.be.true; + expect(d3.select(nodes[17]).classed('geolocate')).to.be.true; + expect(d3.select(nodes[18]).classed('touch')).to.be.true; }); }); From e7d0cc67599ccb354bb597785df685ba1c0d8980 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Wed, 7 Aug 2024 13:50:12 +0200 Subject: [PATCH 08/21] fixed year slider with shortcut --- data/shortcuts.json | 2 +- modules/renderer/photos.js | 23 +++++++++++++++++++++++ modules/ui/sections/photo_overlays.js | 2 +- 3 files changed, 25 insertions(+), 2 deletions(-) diff --git a/data/shortcuts.json b/data/shortcuts.json index c87cc88a1c..68da957e83 100644 --- a/data/shortcuts.json +++ b/data/shortcuts.json @@ -100,7 +100,7 @@ }, { "modifiers": ["⇧"], - "shortcuts": ["B"], + "shortcuts": ["P"], "text": "shortcuts.browsing.enable.streetlevel" } ] diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 5f18a0cbf6..05056e7525 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -104,6 +104,29 @@ export function rendererPhotos(context) { } }; + photos.setFromYearFilter = function(year, updateUrl){ + + _yearSliderValue = year; + + if (year !== 5) { + let days = 365 * year; + var fromDate = new Date(); + fromDate.setDate(fromDate.getDate() - days); + var dd = String(fromDate.getDate()).padStart(2, '0'); + var mm = String(fromDate.getMonth() + 1).padStart(2, '0'); + var yyyy = fromDate.getFullYear(); + + fromDate = mm + '/' + dd + '/' + yyyy; + photos.setDateFilter('fromDate', fromDate, updateUrl); + } else { + photos.setDateFilter('fromDate', null, updateUrl); + } + + if (updateUrl) { + setUrlFilterValue('year_slider', year); + } + }; + function setUrlFilterValue(property, val) { if (!window.mocha) { var hash = utilStringQs(window.location.hash); diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index 0f4febfe3d..ef942c445f 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -552,7 +552,7 @@ export function uiSectionPhotoOverlays(context) { context.layers().on('change.uiSectionPhotoOverlays', section.reRender); context.photos().on('change.uiSectionPhotoOverlays', section.reRender); - context.keybinding().on('⇧B', toggleStreetSide); + context.keybinding().on('⇧P', toggleStreetSide); context.map() .on('move.photo_overlays', From 93c35cfb49f69367390b0b79c6099271d65a8512 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Thu, 8 Aug 2024 22:00:16 +0200 Subject: [PATCH 09/21] added slider for every provider, now shortcut greys out checkboxes --- css/60_photos.css | 5 +++++ modules/renderer/photos.js | 7 ++----- modules/services/panoramax.js | 21 --------------------- modules/ui/sections/photo_overlays.js | 9 ++++++--- svg/fontawesome/fas-flag-checkered.svg | 1 + svg/fontawesome/fas-water-ladder.svg | 1 + 6 files changed, 15 insertions(+), 29 deletions(-) create mode 100644 svg/fontawesome/fas-flag-checkered.svg create mode 100644 svg/fontawesome/fas-water-ladder.svg diff --git a/css/60_photos.css b/css/60_photos.css index 88b11c2da7..38e3e6cb18 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -12,6 +12,11 @@ li.list-item-photos.active:after { left: 0; } +.disabled-panel { + pointer-events: none; + opacity: 0.5; +} + /* photo viewer div */ .photoviewer { position: relative; diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 05056e7525..4b4a79b106 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -147,15 +147,12 @@ export function rendererPhotos(context) { } photos.shouldFilterByDate = function() { - return showsLayer('mapillary') || showsLayer('kartaview') || showsLayer('streetside') || showsLayer('vegbilder'); - }; - - photos.shouldFilterByMaxAge = function(){ return false; }; photos.shouldFilterDateBySlider = function(){ - return showsLayer('panoramax'); + return showsLayer('mapillary') || showsLayer('kartaview') || showsLayer('mapilio') + || showsLayer('streetside') || showsLayer('vegbilder') || showsLayer('panoramax'); }; photos.shouldFilterByPhotoType = function() { diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index dc5f19ebe5..5cd2503633 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -37,8 +37,6 @@ let _planeFrame; let _pannellumFrame; let _currentFrame; -let _oldestDate; - let _currentScene = { currentImage : null, nextImage : null, @@ -161,14 +159,6 @@ function loadTileDataToCache(data, tile, zoom) { features.push({ minX: loc[0], minY: loc[1], maxX: loc[0], maxY: loc[1], data: d }); - - if (_oldestDate){ - if (d.capture_time < _oldestDate){ - _oldestDate = d.capture_time; - } - } else { - _oldestDate = d.capture_time; - } } if (cache.rtree) { cache.rtree.load(features); @@ -190,13 +180,6 @@ function loadTileDataToCache(data, tile, zoom) { } else { cache.lineString[feature.properties.id] = [feature]; } - if (_oldestDate){ - if (feature.properties.date < _oldestDate){ - _oldestDate = feature.properties.date; - } - } else { - _oldestDate = feature.properties.date; - } } } } @@ -285,10 +268,6 @@ export default { return data.flatMap((d, i) => d.features.filter(f => f.name === usernames[i]).map(f => f.id)); }, - getOldestDate: function(){ - return _oldestDate; - }, - getActiveImage: function(){ return _activeImage; }, diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index ef942c445f..c469cddd97 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -355,9 +355,9 @@ export function uiSectionPhotoOverlays(context) { .classed('active', filterEnabled); function yearSliderValue() { - var sliderValue = context.photos().yearSliderValue(); - if (sliderValue) return sliderValue; - return 5; + var sliderValue = context.photos().yearSliderValue(); + if (sliderValue) return sliderValue; + return 5; } } @@ -534,6 +534,7 @@ export function uiSectionPhotoOverlays(context) { } function toggleStreetSide(){ + let layerContainer = d3_select('.photo-overlay-container'); if (!_layersHidden){ layers.all().forEach(d => { if (_streetLayerIDs.includes(d.id)) { @@ -541,11 +542,13 @@ export function uiSectionPhotoOverlays(context) { setLayer(d.id, false); } }); + layerContainer.classed('disabled-panel', true); } else { _savedLayers.forEach(d => { setLayer(d, true); }); _savedLayers = []; + layerContainer.classed('disabled-panel', false); } _layersHidden = !_layersHidden; }; diff --git a/svg/fontawesome/fas-flag-checkered.svg b/svg/fontawesome/fas-flag-checkered.svg new file mode 100644 index 0000000000..3a848b36ea --- /dev/null +++ b/svg/fontawesome/fas-flag-checkered.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/svg/fontawesome/fas-water-ladder.svg b/svg/fontawesome/fas-water-ladder.svg new file mode 100644 index 0000000000..c1aa5e2d0d --- /dev/null +++ b/svg/fontawesome/fas-water-ladder.svg @@ -0,0 +1 @@ + \ No newline at end of file From 2f5920c275244a7627d323f85ebb319b60dd01ca Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Thu, 8 Aug 2024 22:45:38 +0200 Subject: [PATCH 10/21] npm fixes --- package-lock.json | 63 ++++++++++++++++++++++++++++------------------- 1 file changed, 37 insertions(+), 26 deletions(-) diff --git a/package-lock.json b/package-lock.json index 424adf116f..63e80d84b7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1391,10 +1391,11 @@ "dev": true }, "node_modules/@rapideditor/temaki": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.8.0.tgz", - "integrity": "sha512-7bBC8wujia9ygZz3KdjVjr1tZbcNysolEB1tbWVi5rM0MI9VvHPSNC7rUzVUge5vu98qEBWIe5h/25DkXM8h8w==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.9.0.tgz", + "integrity": "sha512-l/ccuN25j4oOjAlrmd20VNQ0Uvwi5sKQ6CikG7e+12qqZRrwywWdFKKopFQMQtGe1Ub8fs8ykaFeUDQn8ic3fQ==", "dev": true, + "license": "CC0-1.0", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -1663,10 +1664,11 @@ } }, "node_modules/@transifex/api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.0.tgz", - "integrity": "sha512-qXH1H8+7nDj4KcNlcxzpU9DGj6WSfap4EgSEQnF2ALRsyHAdfg49ne1+I7aBFaqdnR3tsFK6KTr/lVUCybUmLQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.2.tgz", + "integrity": "sha512-OJc2jn/mb5qoSBiMyaPHiUZhIdqeMAW5tFNER+EBK7P0oRvM3twT+C0foMLrEQLKe4mKdvKDAJ0p3PiQgNFqTg==", "dev": true, + "license": "Apache-2.0", "dependencies": { "core-js": "^3.35.0" }, @@ -3542,7 +3544,9 @@ } }, "node_modules/escalade": { - "version": "3.1.1", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, "license": "MIT", "engines": { @@ -6786,7 +6790,9 @@ } }, "node_modules/picocolors": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true, "license": "ISC" }, @@ -8538,9 +8544,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "funding": [ { @@ -8556,9 +8562,10 @@ "url": "https://github.com/sponsors/ai" } ], + "license": "MIT", "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -9887,9 +9894,9 @@ "dev": true }, "@rapideditor/temaki": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.8.0.tgz", - "integrity": "sha512-7bBC8wujia9ygZz3KdjVjr1tZbcNysolEB1tbWVi5rM0MI9VvHPSNC7rUzVUge5vu98qEBWIe5h/25DkXM8h8w==", + "version": "5.9.0", + "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.9.0.tgz", + "integrity": "sha512-l/ccuN25j4oOjAlrmd20VNQ0Uvwi5sKQ6CikG7e+12qqZRrwywWdFKKopFQMQtGe1Ub8fs8ykaFeUDQn8ic3fQ==", "dev": true }, "@resvg/resvg-js": { @@ -10036,9 +10043,9 @@ "requires": {} }, "@transifex/api": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.0.tgz", - "integrity": "sha512-qXH1H8+7nDj4KcNlcxzpU9DGj6WSfap4EgSEQnF2ALRsyHAdfg49ne1+I7aBFaqdnR3tsFK6KTr/lVUCybUmLQ==", + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.2.tgz", + "integrity": "sha512-OJc2jn/mb5qoSBiMyaPHiUZhIdqeMAW5tFNER+EBK7P0oRvM3twT+C0foMLrEQLKe4mKdvKDAJ0p3PiQgNFqTg==", "dev": true, "requires": { "core-js": "^3.35.0" @@ -11303,7 +11310,9 @@ } }, "escalade": { - "version": "3.1.1", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true }, "escape-html": { @@ -13496,7 +13505,9 @@ } }, "picocolors": { - "version": "1.0.0", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "picomatch": { @@ -14676,13 +14687,13 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.13", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", - "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" + "escalade": "^3.1.2", + "picocolors": "^1.0.1" } }, "uri-js": { From 4e7a0f7541e823be4ffc117e94d3e085301f43df Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Fri, 9 Aug 2024 10:42:41 +0200 Subject: [PATCH 11/21] hfov, pitch and direction is now held between sequences and images as asked in #10392 --- modules/services/pannellum_photo.js | 4 +++- modules/svg/panoramax_images.js | 4 ---- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/modules/services/pannellum_photo.js b/modules/services/pannellum_photo.js index 566358edde..42fd6d91fa 100644 --- a/modules/services/pannellum_photo.js +++ b/modules/services/pannellum_photo.js @@ -135,12 +135,14 @@ export default { let yaw = 0; let pitch = 0; + let hfov = 0; if (keepOrientation) { yaw = this.getYaw(); pitch = _pannellumViewer.getPitch(); + hfov = _pannellumViewer.getHfov(); } - _pannellumViewer.loadScene(key, pitch, yaw); + _pannellumViewer.loadScene(key, pitch, yaw, hfov); dispatch.call('viewerChanged'); if (_currScenes.length > 3) { diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index 351ead2f6f..9b12acf5ce 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -179,10 +179,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { const service = getService(); if (!service) return; - if (image.sequence_id !== _selectedSequence) { - _viewerYaw = 0; // reset - } - service .ensureViewerLoaded(context) .then(function() { From d77cd373f0920f564f158c57ec2caae5025822bc Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Fri, 9 Aug 2024 10:55:53 +0200 Subject: [PATCH 12/21] fix for #10361 (only panoramax) --- modules/svg/panoramax_images.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index 9b12acf5ce..b262fa2c11 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -209,6 +209,10 @@ export function svgPanoramaxImages(projection, context, dispatch) { let sequences = (service ? service.sequences(projection, zoom) : []); let images = (service && zoom >= imageMinZoom ? service.images(projection) : []); + let isHidden = d3_select('.photo-wrapper.panoramax-wrapper.hide').size(); + + if(isHidden) service.setActiveImage(null); + images = await filterImages(images); sequences = await filterSequences(sequences, service); From c6dfe56b584bbc31e6987067b885ecbcd180732b Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Fri, 9 Aug 2024 11:01:20 +0200 Subject: [PATCH 13/21] lint fixes --- modules/renderer/photos.js | 4 ++-- modules/svg/panoramax_images.js | 3 +-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 4b4a79b106..6ac74454ac 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -105,7 +105,7 @@ export function rendererPhotos(context) { }; photos.setFromYearFilter = function(year, updateUrl){ - + _yearSliderValue = year; if (year !== 5) { @@ -119,7 +119,7 @@ export function rendererPhotos(context) { fromDate = mm + '/' + dd + '/' + yyyy; photos.setDateFilter('fromDate', fromDate, updateUrl); } else { - photos.setDateFilter('fromDate', null, updateUrl); + photos.setDateFilter('fromDate', null, updateUrl); } if (updateUrl) { diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index b262fa2c11..9b82f2f17f 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -13,7 +13,6 @@ export function svgPanoramaxImages(projection, context, dispatch) { let layer = d3_select(null); let _panoramax; let _viewerYaw = 0; - let _selectedSequence; let _activeUsernameFilter; let _activeIds; @@ -211,7 +210,7 @@ export function svgPanoramaxImages(projection, context, dispatch) { let isHidden = d3_select('.photo-wrapper.panoramax-wrapper.hide').size(); - if(isHidden) service.setActiveImage(null); + if (isHidden) service.setActiveImage(null); images = await filterImages(images); sequences = await filterSequences(sequences, service); From 9dd4cdd8d4b13ca757bafab80ccea9e90b47a870 Mon Sep 17 00:00:00 2001 From: Martin Raifer Date: Sun, 11 Aug 2024 16:59:00 +0200 Subject: [PATCH 14/21] restore accidental changes from development branch (unrelated to panoramax) --- ACCESSIBILITY.md | 1 - CHANGELOG.md | 1 + css/20_map.css | 3 +- css/65_data.css | 25 - data/core.yaml | 32 +- data/qa_data.json | 10 - modules/modes/select_error.js | 11 - modules/services/improveOSM.js | 481 --------- modules/services/index.js | 3 - modules/services/panoramax.js | 8 +- modules/svg/improveOSM.js | 227 ----- modules/svg/layers.js | 4 +- modules/ui/commit.js | 7 - modules/ui/improveOSM_comments.js | 92 -- modules/ui/improveOSM_details.js | 125 --- modules/ui/improveOSM_editor.js | 200 ---- modules/ui/improveOSM_header.js | 67 -- modules/ui/index.js | 4 - modules/ui/sections/data_layers.js | 2 +- modules/ui/sidebar.js | 6 +- package-lock.json | 1447 ++++++++++++++++++++-------- package.json | 6 +- test/spec/svg/layers.js | 29 +- 23 files changed, 1079 insertions(+), 1712 deletions(-) delete mode 100644 modules/services/improveOSM.js delete mode 100644 modules/svg/improveOSM.js delete mode 100644 modules/ui/improveOSM_comments.js delete mode 100644 modules/ui/improveOSM_details.js delete mode 100644 modules/ui/improveOSM_editor.js delete mode 100644 modules/ui/improveOSM_header.js diff --git a/ACCESSIBILITY.md b/ACCESSIBILITY.md index 8fd90adc3f..82eb48ba48 100644 --- a/ACCESSIBILITY.md +++ b/ACCESSIBILITY.md @@ -193,7 +193,6 @@ translated to one or more languages. | ✅ | OSM community index | | | | ✅ | iD validation issues | | | | ✅ | KeepRight issues | | | -| ✅ | ImproveOSM issues | | | | ✅ | Osmose issues | Translated strings are [provided by Osmose](https://www.transifex.com/openstreetmap-france/osmose/) itself, not iD | | ### Language Coverage diff --git a/CHANGELOG.md b/CHANGELOG.md index a2eb26ab17..efa3e95ebc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -48,6 +48,7 @@ _Breaking developer changes, which may affect downstream projects or sites that * Add Panoramax as new street level imagery provider ([#9941], thanks [@mattiapezzotti]) * Fix intermittent issues with Bing Streetside sometimes returning API results in a undocumented format ([#10341]) #### :white_check_mark: Validation +* Drop deprecated validation service _ImproveOSM_ ([#10302], thanks [@arch0345]) #### :bug: Bugfixes * Fix bug which required a second button click when resolving/reopening of OSM notes ([#8994], thanks [@laigyu]) * Fix API URLs for ImproveOSM QA service ([#9993], thanks [@k-yle]) diff --git a/css/20_map.css b/css/20_map.css index 8f2f6b138d..7856a6e581 100644 --- a/css/20_map.css +++ b/css/20_map.css @@ -33,8 +33,7 @@ /* No interactivity except what we specifically allow */ .data-layer.osm *, .data-layer.notes *, -.data-layer.keepRight *, -.data-layer.improveOSM * { +.data-layer.keepRight * { pointer-events: none; } diff --git a/css/65_data.css b/css/65_data.css index d2c0db8bf8..f3bf3c46fd 100644 --- a/css/65_data.css +++ b/css/65_data.css @@ -3,7 +3,6 @@ .qa-header-icon .qaItem-fill, .layer-keepRight .qaItem .qaItem-fill, -.layer-improveOSM .qaItem .qaItem-fill, .layer-osmose .qaItem .qaItem-fill { stroke: #333; stroke-width: 1.3px; /* NOTE: likely a better way to scale the icon stroke */ @@ -127,30 +126,6 @@ color: #c35; } -/* ImproveOSM Issues -------------------------------------------------------- */ - -.improveOSM.itemType-ow { /* missing one way */ - color: #1E90FF; -} - -.improveOSM.itemType-mr-road { /* missing road */ - color: #B452CD; -} -.improveOSM.itemType-mr-path { /* missing path */ - color: #A0522D; -} -.improveOSM.itemType-mr-parking { /* missing parking */ - color: #EEEE00; -} -.improveOSM.itemType-mr-both { /* missing road+parking */ - color: #FFA500; -} - -.improveOSM.itemType-tr { /* missing turn restriction */ - color: #EC1C24; -} - /* Custom Map Data (geojson, gpx, kml, vector tile) */ .layer-mapdata { pointer-events: none; diff --git a/data/core.yaml b/data/core.yaml index 86fa5b27ab..209d889222 100644 --- a/data/core.yaml +++ b/data/core.yaml @@ -844,9 +844,6 @@ en: keepRight: tooltip: Data issues detected by keepright.at title: KeepRight Issues - improveOSM: - tooltip: Missing data detected by improveosm.org - title: ImproveOSM Issues osmose: tooltip: Data issues detected by osmose.openstreetmap.fr title: Osmose Issues @@ -1101,33 +1098,6 @@ en: elems_title: Features fix_title: Fix Guidelines trap_title: Common Mistakes - improveOSM: - title: ImproveOSM Detection - geometry_types: - path: paths - parking: parking - road: roads - both: roads and parking - directions: - east: east - north: north - northeast: northeast - northwest: northwest - south: south - southeast: southeast - southwest: southwest - west: west - error_types: - ow: - title: Missing One-way - description: 'Along this section of {highway}, {percentage}% of {num_trips} recorded trips travel from {from_node} to {to_node}. There may be missing a "oneway" tag.' - mr: - title: Missing Geometry - description: '{num_trips} recorded trips in this area suggest there may be unmapped {geometry_type} here.' - description_alt: 'Data from a 3rd party suggests there may be unmapped {geometry_type} here.' - tr: - title: Missing Turn Restriction - description: '{num_passed} of {num_trips} recorded trips (travelling {travel_direction}) make a turn from {from_way} to {to_way} at {junction}. There may be a missing "{turn_restriction}" restriction.' keepRight: title: KeepRight detail_description: Description @@ -1696,7 +1666,7 @@ en: title: Quality Assurance intro: "*Quality Assurance* (Q/A) tools can find improper tags, disconnected roads, and other issues with OpenStreetMap, which mappers can then fix. To view existing Q/A issues, open the {data_icon} **{map_data}** panel and enable a specific Q/A layer." tools_h: "Tools" - tools: "The following tools are currently supported: [KeepRight](https://www.keepright.at/), [ImproveOSM](https://improveosm.org/en/) and [Osmose](https://osmose.openstreetmap.fr/)." + tools: "The following tools are currently supported: [KeepRight](https://www.keepright.at/) and [Osmose](https://osmose.openstreetmap.fr/)." issues_h: "Handling Issues" issues: "Handling Q/A issues is similar to handling notes. Select a marker to view the issue details in the sidebar. Each tool has its own capabilities, but generally you can comment and/or close an issue." field: diff --git a/data/qa_data.json b/data/qa_data.json index 9091132c65..029d6a0dea 100644 --- a/data/qa_data.json +++ b/data/qa_data.json @@ -1,14 +1,4 @@ { - "improveOSM": { - "icons": { - "ow": "fas-long-arrow-alt-right", - "mr-both": "maki-car", - "mr-parking": "maki-parking", - "mr-path": "maki-shoe", - "mr-road": "maki-car", - "tr": "temaki-junction" - } - }, "osmose": { "icons": { "0-1": "maki-home", diff --git a/modules/modes/select_error.js b/modules/modes/select_error.js index 3721259079..bde94e2f35 100644 --- a/modules/modes/select_error.js +++ b/modules/modes/select_error.js @@ -12,7 +12,6 @@ import { services } from '../services'; import { modeBrowse } from './browse'; import { modeDragNode } from './drag_node'; import { modeDragNote } from './drag_note'; -import { uiImproveOsmEditor } from '../ui/improveOSM_editor'; import { uiKeepRightEditor } from '../ui/keepRight_editor'; import { uiOsmoseEditor } from '../ui/osmose_editor'; import { utilKeybinding } from '../util'; @@ -29,16 +28,6 @@ export function modeSelectError(context, selectedErrorID, selectedErrorService) var errorService = services[selectedErrorService]; var errorEditor; switch (selectedErrorService) { - case 'improveOSM': - errorEditor = uiImproveOsmEditor(context) - .on('change', function() { - context.map().pan([0,0]); // trigger a redraw - var error = checkSelectedID(); - if (!error) return; - context.ui().sidebar - .show(errorEditor.error(error)); - }); - break; case 'keepRight': errorEditor = uiKeepRightEditor(context) .on('change', function() { diff --git a/modules/services/improveOSM.js b/modules/services/improveOSM.js deleted file mode 100644 index 903912619b..0000000000 --- a/modules/services/improveOSM.js +++ /dev/null @@ -1,481 +0,0 @@ -import RBush from 'rbush'; - -import { dispatch as d3_dispatch } from 'd3-dispatch'; -import { json as d3_json } from 'd3-fetch'; - -import { fileFetcher } from '../core/file_fetcher'; -import { geoExtent, geoVecAdd, geoVecScale } from '../geo'; -import { QAItem } from '../osm'; -import { serviceOsm } from './index'; -import { t } from '../core/localizer'; -import { utilRebind, utilTiler, utilQsString } from '../util'; - - -const tiler = utilTiler(); -const dispatch = d3_dispatch('loaded'); -const _tileZoom = 14; -const _impOsmUrls = { - ow: 'https://community.improveosm.org/directionOfFlowService', - mr: 'https://community.improveosm.org/missingGeoService', - tr: 'https://community.improveosm.org/turnRestrictionService' -}; -let _impOsmData = { icons: {} }; - - -// This gets reassigned if reset -let _cache; - -function abortRequest(i) { - Object.values(i).forEach(controller => { - if (controller) { - controller.abort(); - } - }); -} - -function abortUnwantedRequests(cache, tiles) { - Object.keys(cache.inflightTile).forEach(k => { - const wanted = tiles.find(tile => k === tile.id); - if (!wanted) { - abortRequest(cache.inflightTile[k]); - delete cache.inflightTile[k]; - } - }); -} - -function encodeIssueRtree(d) { - return { minX: d.loc[0], minY: d.loc[1], maxX: d.loc[0], maxY: d.loc[1], data: d }; -} - -// Replace or remove QAItem from rtree -function updateRtree(item, replace) { - _cache.rtree.remove(item, (a, b) => a.data.id === b.data.id); - - if (replace) { - _cache.rtree.insert(item); - } -} - -function linkErrorObject(d) { - return { html: `${d}` }; -} - -function linkEntity(d) { - return { html: `${d}` }; -} - -function pointAverage(points) { - if (points.length) { - const sum = points.reduce( - (acc, point) => geoVecAdd(acc, [point.lon, point.lat]), - [0,0] - ); - return geoVecScale(sum, 1 / points.length); - } else { - return [0,0]; - } -} - -function relativeBearing(p1, p2) { - let angle = Math.atan2(p2.lon - p1.lon, p2.lat - p1.lat); - if (angle < 0) { - angle += 2 * Math.PI; - } - - // Return degrees - return angle * 180 / Math.PI; -} - -// Assuming range [0,360) -function cardinalDirection(bearing) { - const dir = 45 * Math.round(bearing / 45); - const compass = { - 0: 'north', - 45: 'northeast', - 90: 'east', - 135: 'southeast', - 180: 'south', - 225: 'southwest', - 270: 'west', - 315: 'northwest', - 360: 'north' - }; - - return t(`QA.improveOSM.directions.${compass[dir]}`); -} - -// Errors shouldn't obscure each other -function preventCoincident(loc, bumpUp) { - let coincident = false; - do { - // first time, move marker up. after that, move marker right. - let delta = coincident ? [0.00001, 0] : - bumpUp ? [0, 0.00001] : - [0, 0]; - loc = geoVecAdd(loc, delta); - let bbox = geoExtent(loc).bbox(); - coincident = _cache.rtree.search(bbox).length; - } while (coincident); - - return loc; -} - -export default { - title: 'improveOSM', - - init() { - fileFetcher.get('qa_data') - .then(d => _impOsmData = d.improveOSM); - - if (!_cache) { - this.reset(); - } - - this.event = utilRebind(this, dispatch, 'on'); - }, - - reset() { - if (_cache) { - Object.values(_cache.inflightTile).forEach(abortRequest); - } - _cache = { - data: {}, - loadedTile: {}, - inflightTile: {}, - inflightPost: {}, - closed: {}, - rtree: new RBush() - }; - }, - - loadIssues(projection) { - const options = { - client: 'iD', - status: 'OPEN', - zoom: '19' // Use a high zoom so that clusters aren't returned - }; - - // determine the needed tiles to cover the view - const tiles = tiler - .zoomExtent([_tileZoom, _tileZoom]) - .getTiles(projection); - - // abort inflight requests that are no longer needed - abortUnwantedRequests(_cache, tiles); - - // issue new requests.. - tiles.forEach(tile => { - if (_cache.loadedTile[tile.id] || _cache.inflightTile[tile.id]) return; - - const [ east, north, west, south ] = tile.extent.rectangle(); - const params = Object.assign({}, options, { east, south, west, north }); - - // 3 separate requests to store for each tile - const requests = {}; - - Object.keys(_impOsmUrls).forEach(k => { - // We exclude WATER from missing geometry as it doesn't seem useful - // We use most confident one-way and turn restrictions only, still have false positives - const kParams = Object.assign({}, - params, - (k === 'mr') ? { type: 'PARKING,ROAD,BOTH,PATH' } : { confidenceLevel: 'C1' } - ); - const url = `${_impOsmUrls[k]}/search?` + utilQsString(kParams); - const controller = new AbortController(); - - requests[k] = controller; - - d3_json(url, { signal: controller.signal }) - .then(data => { - delete _cache.inflightTile[tile.id][k]; - if (!Object.keys(_cache.inflightTile[tile.id]).length) { - delete _cache.inflightTile[tile.id]; - _cache.loadedTile[tile.id] = true; - } - - // Road segments at high zoom == oneways - if (data.roadSegments) { - data.roadSegments.forEach(feature => { - // Position error at the approximate middle of the segment - const { points, wayId, fromNodeId, toNodeId } = feature; - const itemId = `${wayId}${fromNodeId}${toNodeId}`; - let mid = points.length / 2; - let loc; - - // Even number of points, find midpoint of the middle two - // Odd number of points, use position of very middle point - if (mid % 1 === 0) { - loc = pointAverage([points[mid - 1], points[mid]]); - } else { - mid = points[Math.floor(mid)]; - loc = [mid.lon, mid.lat]; - } - - // One-ways can land on same segment in opposite direction - loc = preventCoincident(loc, false); - - let d = new QAItem(loc, this, k, itemId, { - issueKey: k, // used as a category - identifier: { // used to post changes - wayId, - fromNodeId, - toNodeId - }, - objectId: wayId, - objectType: 'way' - }); - - // Variables used in the description - d.replacements = { - percentage: feature.percentOfTrips, - num_trips: feature.numberOfTrips, - highway: linkErrorObject(t('QA.keepRight.error_parts.highway')), - from_node: linkEntity('n' + feature.fromNodeId), - to_node: linkEntity('n' + feature.toNodeId) - }; - - _cache.data[d.id] = d; - _cache.rtree.insert(encodeIssueRtree(d)); - }); - } - - // Tiles at high zoom == missing roads - if (data.tiles) { - data.tiles.forEach(feature => { - const { type, x, y, numberOfTrips } = feature; - const geoType = type.toLowerCase(); - const itemId = `${geoType}${x}${y}${numberOfTrips}`; - - // Average of recorded points should land on the missing geometry - // Missing geometry could happen to land on another error - let loc = pointAverage(feature.points); - loc = preventCoincident(loc, false); - - let d = new QAItem(loc, this, `${k}-${geoType}`, itemId, { - issueKey: k, - identifier: { x, y } - }); - - d.replacements = { - num_trips: numberOfTrips, - geometry_type: t(`QA.improveOSM.geometry_types.${geoType}`) - }; - - // -1 trips indicates data came from a 3rd party - if (numberOfTrips === -1) { - d.desc = t('QA.improveOSM.error_types.mr.description_alt', d.replacements); - } - - _cache.data[d.id] = d; - _cache.rtree.insert(encodeIssueRtree(d)); - }); - } - - // Entities at high zoom == turn restrictions - if (data.entities) { - data.entities.forEach(feature => { - const { point, id, segments, numberOfPasses, turnType } = feature; - const itemId = `${id.replace(/[,:+#]/g, '_')}`; - - // Turn restrictions could be missing at same junction - // We also want to bump the error up so node is accessible - const loc = preventCoincident([point.lon, point.lat], true); - - // Elements are presented in a strange way - const ids = id.split(','); - const from_way = ids[0]; - const via_node = ids[3]; - const to_way = ids[2].split(':')[1]; - - let d = new QAItem(loc, this, k, itemId, { - issueKey: k, - identifier: id, - objectId: via_node, - objectType: 'node' - }); - - // Travel direction along from_way clarifies the turn restriction - const [ p1, p2 ] = segments[0].points; - const dir_of_travel = cardinalDirection(relativeBearing(p1, p2)); - - // Variables used in the description - d.replacements = { - num_passed: numberOfPasses, - num_trips: segments[0].numberOfTrips, - turn_restriction: turnType.toLowerCase(), - from_way: linkEntity('w' + from_way), - to_way: linkEntity('w' + to_way), - travel_direction: dir_of_travel, - junction: linkErrorObject(t('QA.keepRight.error_parts.this_node')) - }; - - _cache.data[d.id] = d; - _cache.rtree.insert(encodeIssueRtree(d)); - dispatch.call('loaded'); - }); - } - }) - .catch(() => { - delete _cache.inflightTile[tile.id][k]; - if (!Object.keys(_cache.inflightTile[tile.id]).length) { - delete _cache.inflightTile[tile.id]; - _cache.loadedTile[tile.id] = true; - } - }); - }); - - _cache.inflightTile[tile.id] = requests; - }); - }, - - getComments(item) { - // If comments already retrieved no need to do so again - if (item.comments) { - return Promise.resolve(item); - } - - const key = item.issueKey; - let qParams = {}; - - if (key === 'ow') { - qParams = item.identifier; - } else if (key === 'mr') { - qParams.tileX = item.identifier.x; - qParams.tileY = item.identifier.y; - } else if (key === 'tr') { - qParams.targetId = item.identifier; - } - - const url = `${_impOsmUrls[key]}/retrieveComments?` + utilQsString(qParams); - const cacheComments = data => { - // Assign directly for immediate use afterwards - // comments are served newest to oldest - item.comments = data.comments ? data.comments.reverse() : []; - this.replaceItem(item); - }; - - return d3_json(url).then(cacheComments).then(() => item); - }, - - postUpdate(d, callback) { - if (!serviceOsm.authenticated()) { // Username required in payload - return callback({ message: 'Not Authenticated', status: -3}, d); - } - if (_cache.inflightPost[d.id]) { - return callback({ message: 'Error update already inflight', status: -2 }, d); - } - - // Payload can only be sent once username is established - serviceOsm.userDetails(sendPayload.bind(this)); - - function sendPayload(err, user) { - if (err) { return callback(err, d); } - - const key = d.issueKey; - const url = `${_impOsmUrls[key]}/comment`; - const payload = { - username: user.display_name, - targetIds: [ d.identifier ] - }; - - if (d.newStatus) { - payload.status = d.newStatus; - payload.text = 'status changed'; - } - - // Comment take place of default text - if (d.newComment) { - payload.text = d.newComment; - } - - const controller = new AbortController(); - _cache.inflightPost[d.id] = controller; - - const options = { - method: 'POST', - signal: controller.signal, - body: JSON.stringify(payload) - }; - - d3_json(url, options) - .then(() => { - delete _cache.inflightPost[d.id]; - - // Just a comment, update error in cache - if (!d.newStatus) { - const now = new Date(); - let comments = d.comments ? d.comments : []; - - comments.push({ - username: payload.username, - text: payload.text, - timestamp: now.getTime() / 1000 - }); - - this.replaceItem(d.update({ - comments: comments, - newComment: undefined - })); - } else { - this.removeItem(d); - if (d.newStatus === 'SOLVED') { - // Keep track of the number of issues closed per type to tag the changeset - if (!(d.issueKey in _cache.closed)) { - _cache.closed[d.issueKey] = 0; - } - _cache.closed[d.issueKey] += 1; - } - } - if (callback) callback(null, d); - }) - .catch(err => { - delete _cache.inflightPost[d.id]; - if (callback) callback(err.message); - }); - } - }, - - - // Get all cached QAItems covering the viewport - getItems(projection) { - const viewport = projection.clipExtent(); - const min = [viewport[0][0], viewport[1][1]]; - const max = [viewport[1][0], viewport[0][1]]; - const bbox = geoExtent(projection.invert(min), projection.invert(max)).bbox(); - - return _cache.rtree.search(bbox).map(d => d.data); - }, - - // Get a QAItem from cache - // NOTE: Don't change method name until UI v3 is merged - getError(id) { - return _cache.data[id]; - }, - - // get the name of the icon to display for this item - getIcon(itemType) { - return _impOsmData.icons[itemType]; - }, - - // Replace a single QAItem in the cache - replaceItem(issue) { - if (!(issue instanceof QAItem) || !issue.id) return; - - _cache.data[issue.id] = issue; - updateRtree(encodeIssueRtree(issue), true); // true = replace - return issue; - }, - - // Remove a single QAItem from the cache - removeItem(issue) { - if (!(issue instanceof QAItem) || !issue.id) return; - - delete _cache.data[issue.id]; - updateRtree(encodeIssueRtree(issue), false); // false = remove - }, - - // Used to populate `closed:improveosm:*` changeset tags - getClosedCounts() { - return _cache.closed; - } -}; diff --git a/modules/services/index.js b/modules/services/index.js index 81fc9036e0..af98a7c3c7 100644 --- a/modules/services/index.js +++ b/modules/services/index.js @@ -1,5 +1,4 @@ import serviceKeepRight from './keepRight'; -import serviceImproveOSM from './improveOSM'; import serviceOsmose from './osmose'; import serviceMapillary from './mapillary'; import serviceMapRules from './maprules'; @@ -21,7 +20,6 @@ import servicePanoramax from './panoramax'; export let services = { geocoder: serviceNominatim, keepRight: serviceKeepRight, - improveOSM: serviceImproveOSM, osmose: serviceOsmose, mapillary: serviceMapillary, nsi: serviceNsi, @@ -41,7 +39,6 @@ export let services = { export { serviceKeepRight, - serviceImproveOSM, serviceOsmose, serviceMapillary, serviceMapRules, diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index 59ac968a0b..807566da09 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -278,10 +278,6 @@ export default { return data.flatMap((d, i) => d.features.filter(f => f.name === usernames[i]).map(f => f.id)); }, - getActiveImage: function(){ - return _activeImage; - }, - // Get visible sequences sequences: function(projection, zoom) { const viewport = projection.clipExtent(); @@ -324,6 +320,10 @@ export default { } }, + getActiveImage: function(){ + return _activeImage; + }, + // Update the currently highlighted sequence and selected bubble. setStyles: function(context, hovered) { const hoveredImageId = hovered && hovered.id; diff --git a/modules/svg/improveOSM.js b/modules/svg/improveOSM.js deleted file mode 100644 index b8cd77dbda..0000000000 --- a/modules/svg/improveOSM.js +++ /dev/null @@ -1,227 +0,0 @@ -import _throttle from 'lodash-es/throttle'; -import { select as d3_select } from 'd3-selection'; - -import { modeBrowse } from '../modes/browse'; -import { svgPointTransform } from './helpers'; -import { services } from '../services'; - -let _layerEnabled = false; -let _qaService; - -export function svgImproveOSM(projection, context, dispatch) { - const throttledRedraw = _throttle(() => dispatch.call('change'), 1000); - const minZoom = 12; - - let touchLayer = d3_select(null); - let drawLayer = d3_select(null); - let layerVisible = false; - - function markerPath(selection, klass) { - selection - .attr('class', klass) - .attr('transform', 'translate(-10, -28)') - .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6'); - } - - // Loosely-coupled improveOSM service for fetching issues - function getService() { - if (services.improveOSM && !_qaService) { - _qaService = services.improveOSM; - _qaService.on('loaded', throttledRedraw); - } else if (!services.improveOSM && _qaService) { - _qaService = null; - } - - return _qaService; - } - - // Show the markers - function editOn() { - if (!layerVisible) { - layerVisible = true; - drawLayer - .style('display', 'block'); - } - } - - // Immediately remove the markers and their touch targets - function editOff() { - if (layerVisible) { - layerVisible = false; - drawLayer - .style('display', 'none'); - drawLayer.selectAll('.qaItem.improveOSM') - .remove(); - touchLayer.selectAll('.qaItem.improveOSM') - .remove(); - } - } - - // Enable the layer. This shows the markers and transitions them to visible. - function layerOn() { - editOn(); - - drawLayer - .style('opacity', 0) - .transition() - .duration(250) - .style('opacity', 1) - .on('end interrupt', () => dispatch.call('change')); - } - - // Disable the layer. This transitions the layer invisible and then hides the markers. - function layerOff() { - throttledRedraw.cancel(); - drawLayer.interrupt(); - touchLayer.selectAll('.qaItem.improveOSM') - .remove(); - - drawLayer - .transition() - .duration(250) - .style('opacity', 0) - .on('end interrupt', () => { - editOff(); - dispatch.call('change'); - }); - } - - // Update the issue markers - function updateMarkers() { - if (!layerVisible || !_layerEnabled) return; - - const service = getService(); - const selectedID = context.selectedErrorID(); - const data = (service ? service.getItems(projection) : []); - const getTransform = svgPointTransform(projection); - - // Draw markers.. - const markers = drawLayer.selectAll('.qaItem.improveOSM') - .data(data, d => d.id); - - // exit - markers.exit() - .remove(); - - // enter - const markersEnter = markers.enter() - .append('g') - .attr('class', d => `qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); - - markersEnter - .append('polygon') - .call(markerPath, 'shadow'); - - markersEnter - .append('ellipse') - .attr('cx', 0) - .attr('cy', 0) - .attr('rx', 4.5) - .attr('ry', 2) - .attr('class', 'stroke'); - - markersEnter - .append('polygon') - .attr('fill', 'currentColor') - .call(markerPath, 'qaItem-fill'); - - markersEnter - .append('use') - .attr('class', 'icon-annotation') - .attr('transform', 'translate(-6, -22)') - .attr('width', '12px') - .attr('height', '12px') - .attr('xlink:href', d => d.icon ? '#' + d.icon : ''); - - // update - markers - .merge(markersEnter) - .sort(sortY) - .classed('selected', d => d.id === selectedID) - .attr('transform', getTransform); - - - // Draw targets.. - if (touchLayer.empty()) return; - const fillClass = context.getDebug('target') ? 'pink ' : 'nocolor '; - - const targets = touchLayer.selectAll('.qaItem.improveOSM') - .data(data, d => d.id); - - // exit - targets.exit() - .remove(); - - // enter/update - targets.enter() - .append('rect') - .attr('width', '20px') - .attr('height', '30px') - .attr('x', '-10px') - .attr('y', '-28px') - .merge(targets) - .sort(sortY) - .attr('class', d => `qaItem ${d.service} target ${fillClass} itemId-${d.id}`) - .attr('transform', getTransform); - - function sortY(a, b) { - return (a.id === selectedID) ? 1 - : (b.id === selectedID) ? -1 - : b.loc[1] - a.loc[1]; - } - } - - // Draw the ImproveOSM layer and schedule loading issues and updating markers. - function drawImproveOSM(selection) { - const service = getService(); - - const surface = context.surface(); - if (surface && !surface.empty()) { - touchLayer = surface.selectAll('.data-layer.touch .layer-touch.markers'); - } - - drawLayer = selection.selectAll('.layer-improveOSM') - .data(service ? [0] : []); - - drawLayer.exit() - .remove(); - - drawLayer = drawLayer.enter() - .append('g') - .attr('class', 'layer-improveOSM') - .style('display', _layerEnabled ? 'block' : 'none') - .merge(drawLayer); - - if (_layerEnabled) { - if (service && ~~context.map().zoom() >= minZoom) { - editOn(); - service.loadIssues(projection); - updateMarkers(); - } else { - editOff(); - } - } - } - - // Toggles the layer on and off - drawImproveOSM.enabled = function(val) { - if (!arguments.length) return _layerEnabled; - - _layerEnabled = val; - if (_layerEnabled) { - layerOn(); - } else { - layerOff(); - if (context.selectedErrorID()) { - context.enter(modeBrowse(context)); - } - } - - dispatch.call('change'); - return this; - }; - - drawImproveOSM.supported = () => !!getService(); - - return drawImproveOSM; -} diff --git a/modules/svg/layers.js b/modules/svg/layers.js index 4db0de6292..518bc5ce8b 100644 --- a/modules/svg/layers.js +++ b/modules/svg/layers.js @@ -6,7 +6,6 @@ import { svgLocalPhotos} from './local_photos'; import { svgDebug } from './debug'; import { svgGeolocate } from './geolocate'; import { svgKeepRight } from './keepRight'; -import { svgImproveOSM } from './improveOSM'; import { svgOsmose } from './osmose'; import { svgStreetside } from './streetside'; import { svgVegbilder} from './vegbilder'; @@ -32,7 +31,6 @@ export function svgLayers(projection, context) { { id: 'notes', layer: svgNotes(projection, context, dispatch) }, { id: 'data', layer: svgData(projection, context, dispatch) }, { id: 'keepRight', layer: svgKeepRight(projection, context, dispatch) }, - { id: 'improveOSM', layer: svgImproveOSM(projection, context, dispatch) }, { id: 'osmose', layer: svgOsmose(projection, context, dispatch) }, { id: 'streetside', layer: svgStreetside(projection, context, dispatch)}, { id: 'mapillary', layer: svgMapillaryImages(projection, context, dispatch) }, @@ -41,8 +39,8 @@ export function svgLayers(projection, context) { { id: 'mapillary-signs', layer: svgMapillarySigns(projection, context, dispatch) }, { id: 'kartaview', layer: svgKartaviewImages(projection, context, dispatch) }, { id: 'mapilio', layer: svgMapilioImages(projection, context, dispatch) }, - { id: 'panoramax', layer: svgPanoramaxImages(projection, context, dispatch) }, { id: 'vegbilder', layer: svgVegbilder(projection, context, dispatch) }, + { id: 'panoramax', layer: svgPanoramaxImages(projection, context, dispatch) }, { id: 'local-photos', layer: svgLocalPhotos(projection, context, dispatch) }, { id: 'debug', layer: svgDebug(projection, context, dispatch) }, { id: 'geolocate', layer: svgGeolocate(projection, context, dispatch) }, diff --git a/modules/ui/commit.js b/modules/ui/commit.js index 326b8202a6..59cbdaf813 100644 --- a/modules/ui/commit.js +++ b/modules/ui/commit.js @@ -27,7 +27,6 @@ var readOnlyTags = [ /^resolved:/, /^closed:note$/, /^closed:keepright$/, - /^closed:improveosm:/, /^closed:osmose:/ ]; @@ -155,12 +154,6 @@ export function uiCommit(context) { tags['closed:keepright'] = context.cleanTagValue(krClosed.join(';')); } } - if (services.improveOSM) { - var iOsmClosed = services.improveOSM.getClosedCounts(); - for (itemType in iOsmClosed) { - tags['closed:improveosm:' + itemType] = context.cleanTagValue(iOsmClosed[itemType].toString()); - } - } if (services.osmose) { var osmoseClosed = services.osmose.getClosedCounts(); for (itemType in osmoseClosed) { diff --git a/modules/ui/improveOSM_comments.js b/modules/ui/improveOSM_comments.js deleted file mode 100644 index 92bdefc911..0000000000 --- a/modules/ui/improveOSM_comments.js +++ /dev/null @@ -1,92 +0,0 @@ -import { select as d3_select } from 'd3-selection'; - -import { t, localizer } from '../core/localizer'; -import { svgIcon } from '../svg/icon'; -import { services } from '../services'; - -export function uiImproveOsmComments() { - let _qaItem; - - function issueComments(selection) { - // make the div immediately so it appears above the buttons - let comments = selection.selectAll('.comments-container') - .data([0]); - - comments = comments.enter() - .append('div') - .attr('class', 'comments-container') - .merge(comments); - - // must retrieve comments from API before they can be displayed - services.improveOSM.getComments(_qaItem) - .then(d => { - if (!d.comments) return; // nothing to do here - - const commentEnter = comments.selectAll('.comment') - .data(d.comments) - .enter() - .append('div') - .attr('class', 'comment'); - - commentEnter - .append('div') - .attr('class', 'comment-avatar') - .call(svgIcon('#iD-icon-avatar', 'comment-avatar-icon')); - - const mainEnter = commentEnter - .append('div') - .attr('class', 'comment-main'); - - const metadataEnter = mainEnter - .append('div') - .attr('class', 'comment-metadata'); - - metadataEnter - .append('div') - .attr('class', 'comment-author') - .each(function(d) { - const osm = services.osm; - let selection = d3_select(this); - if (osm && d.username) { - selection = selection - .append('a') - .attr('class', 'comment-author-link') - .attr('href', osm.userURL(d.username)) - .attr('target', '_blank'); - } - selection - .text(d => d.username); - }); - - metadataEnter - .append('div') - .attr('class', 'comment-date') - .html(d => t.html('note.status.commented', { when: localeDateString(d.timestamp) })); - - mainEnter - .append('div') - .attr('class', 'comment-text') - .append('p') - .text(d => d.text); - }) - .catch(err => { - console.log(err); // eslint-disable-line no-console - }); - } - - function localeDateString(s) { - if (!s) return null; - const options = { day: 'numeric', month: 'short', year: 'numeric' }; - const d = new Date(s * 1000); // timestamp is served in seconds, date takes ms - if (isNaN(d.getTime())) return null; - return d.toLocaleDateString(localizer.localeCode(), options); - } - - issueComments.issue = function(val) { - if (!arguments.length) return _qaItem; - _qaItem = val; - return issueComments; - }; - - return issueComments; -} diff --git a/modules/ui/improveOSM_details.js b/modules/ui/improveOSM_details.js deleted file mode 100644 index 9f8c3e5438..0000000000 --- a/modules/ui/improveOSM_details.js +++ /dev/null @@ -1,125 +0,0 @@ -import { - select as d3_select -} from 'd3-selection'; - -import { presetManager } from '../presets'; -import { modeSelect } from '../modes/select'; -import { t } from '../core/localizer'; -import { utilDisplayName, utilHighlightEntities, utilEntityRoot } from '../util'; - -export function uiImproveOsmDetails(context) { - let _qaItem; - - - function issueDetail(d) { - if (d.desc) return d.desc; - const issueKey = d.issueKey; - d.replacements = d.replacements || {}; - d.replacements.default = { html: t.html('inspector.unknown') }; // special key `default` works as a fallback string - return t.html(`QA.improveOSM.error_types.${issueKey}.description`, d.replacements); - } - - - function improveOsmDetails(selection) { - const details = selection.selectAll('.error-details') - .data( - (_qaItem ? [_qaItem] : []), - d => `${d.id}-${d.status || 0}` - ); - - details.exit() - .remove(); - - const detailsEnter = details.enter() - .append('div') - .attr('class', 'error-details qa-details-container'); - - - // description - const descriptionEnter = detailsEnter - .append('div') - .attr('class', 'qa-details-subsection'); - - descriptionEnter - .append('h4') - .call(t.append('QA.keepRight.detail_description')); - - descriptionEnter - .append('div') - .attr('class', 'qa-details-description-text') - .html(issueDetail); - - // If there are entity links in the error message.. - let relatedEntities = []; - descriptionEnter.selectAll('.error_entity_link, .error_object_link') - .attr('href', '#') - .each(function() { - const link = d3_select(this); - const isObjectLink = link.classed('error_object_link'); - const entityID = isObjectLink ? - (utilEntityRoot(_qaItem.objectType) + _qaItem.objectId) - : this.textContent; - const entity = context.hasEntity(entityID); - - relatedEntities.push(entityID); - - // Add click handler - link - .on('mouseenter', () => { - utilHighlightEntities([entityID], true, context); - }) - .on('mouseleave', () => { - utilHighlightEntities([entityID], false, context); - }) - .on('click', (d3_event) => { - d3_event.preventDefault(); - - utilHighlightEntities([entityID], false, context); - - const osmlayer = context.layers().layer('osm'); - if (!osmlayer.enabled()) { - osmlayer.enabled(true); - } - - context.map().centerZoom(_qaItem.loc, 20); - - if (entity) { - context.enter(modeSelect(context, [entityID])); - } else { - context.loadEntity(entityID, (err, result) => { - if (err) return; - const entity = result.data.find(e => e.id === entityID); - if (entity) context.enter(modeSelect(context, [entityID])); - }); - } - }); - - // Replace with friendly name if possible - // (The entity may not yet be loaded into the graph) - if (entity) { - let name = utilDisplayName(entity); // try to use common name - - if (!name && !isObjectLink) { - const preset = presetManager.match(entity, context.graph()); - name = preset && !preset.isFallback() && preset.name(); // fallback to preset name - } - - if (name) { - this.innerText = name; - } - } - }); - - // Don't hide entities related to this error - #5880 - context.features().forceVisible(relatedEntities); - context.map().pan([0,0]); // trigger a redraw - } - - improveOsmDetails.issue = function(val) { - if (!arguments.length) return _qaItem; - _qaItem = val; - return improveOsmDetails; - }; - - return improveOsmDetails; -} diff --git a/modules/ui/improveOSM_editor.js b/modules/ui/improveOSM_editor.js deleted file mode 100644 index 98473b3f46..0000000000 --- a/modules/ui/improveOSM_editor.js +++ /dev/null @@ -1,200 +0,0 @@ -import { dispatch as d3_dispatch } from 'd3-dispatch'; -import { select as d3_select } from 'd3-selection'; - -import { t } from '../core/localizer'; -import { services } from '../services'; -import { modeBrowse } from '../modes/browse'; -import { svgIcon } from '../svg/icon'; - -import { uiImproveOsmComments } from './improveOSM_comments'; -import { uiImproveOsmDetails } from './improveOSM_details'; -import { uiImproveOsmHeader } from './improveOSM_header'; - -import { utilNoAuto, utilRebind } from '../util'; - -export function uiImproveOsmEditor(context) { - const dispatch = d3_dispatch('change'); - const qaDetails = uiImproveOsmDetails(context); - const qaComments = uiImproveOsmComments(context); - const qaHeader = uiImproveOsmHeader(context); - - let _qaItem; - - function improveOsmEditor(selection) { - - const headerEnter = selection.selectAll('.header') - .data([0]) - .enter() - .append('div') - .attr('class', 'header fillL'); - - headerEnter - .append('button') - .attr('class', 'close') - .attr('title', t('icons.close')) - .on('click', () => context.enter(modeBrowse(context))) - .call(svgIcon('#iD-icon-close')); - - headerEnter - .append('h2') - .call(t.append('QA.improveOSM.title')); - - let body = selection.selectAll('.body') - .data([0]); - - body = body.enter() - .append('div') - .attr('class', 'body') - .merge(body); - - const editor = body.selectAll('.qa-editor') - .data([0]); - - editor.enter() - .append('div') - .attr('class', 'modal-section qa-editor') - .merge(editor) - .call(qaHeader.issue(_qaItem)) - .call(qaDetails.issue(_qaItem)) - .call(qaComments.issue(_qaItem)) - .call(improveOsmSaveSection); - } - - function improveOsmSaveSection(selection) { - const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID()); - const isShown = (_qaItem && (isSelected || _qaItem.newComment || _qaItem.comment)); - let saveSection = selection.selectAll('.qa-save') - .data( - (isShown ? [_qaItem] : []), - d => `${d.id}-${d.status || 0}` - ); - - // exit - saveSection.exit() - .remove(); - - // enter - const saveSectionEnter = saveSection.enter() - .append('div') - .attr('class', 'qa-save save-section cf'); - - saveSectionEnter - .append('h4') - .attr('class', '.qa-save-header') - .call(t.append('note.newComment')); - - saveSectionEnter - .append('textarea') - .attr('class', 'new-comment-input') - .attr('placeholder', t('QA.keepRight.comment_placeholder')) - .attr('maxlength', 1000) - .property('value', d => d.newComment) - .call(utilNoAuto) - .on('input', changeInput) - .on('blur', changeInput); - - // update - saveSection = saveSectionEnter - .merge(saveSection) - .call(qaSaveButtons); - - function changeInput() { - const input = d3_select(this); - let val = input.property('value').trim(); - - if (val === '') { - val = undefined; - } - - // store the unsaved comment with the issue itself - _qaItem = _qaItem.update({ newComment: val }); - - const qaService = services.improveOSM; - if (qaService) { - qaService.replaceItem(_qaItem); - } - - saveSection - .call(qaSaveButtons); - } - } - - function qaSaveButtons(selection) { - const isSelected = (_qaItem && _qaItem.id === context.selectedErrorID()); - let buttonSection = selection.selectAll('.buttons') - .data((isSelected ? [_qaItem] : []), d => d.status + d.id); - - // exit - buttonSection.exit() - .remove(); - - // enter - const buttonEnter = buttonSection.enter() - .append('div') - .attr('class', 'buttons'); - - buttonEnter - .append('button') - .attr('class', 'button comment-button action') - .call(t.append('QA.keepRight.save_comment')); - - buttonEnter - .append('button') - .attr('class', 'button close-button action'); - - buttonEnter - .append('button') - .attr('class', 'button ignore-button action'); - - // update - buttonSection = buttonSection - .merge(buttonEnter); - - buttonSection.select('.comment-button') - .attr('disabled', d => d.newComment ? null : true) - .on('click.comment', function(d3_event, d) { - this.blur(); // avoid keeping focus on the button - #4641 - const qaService = services.improveOSM; - if (qaService) { - qaService.postUpdate(d, (err, item) => dispatch.call('change', item)); - } - }); - - buttonSection.select('.close-button') - .html(d => { - const andComment = (d.newComment ? '_comment' : ''); - return t.html(`QA.keepRight.close${andComment}`); - }) - .on('click.close', function(d3_event, d) { - this.blur(); // avoid keeping focus on the button - #4641 - const qaService = services.improveOSM; - if (qaService) { - d.newStatus = 'SOLVED'; - qaService.postUpdate(d, (err, item) => dispatch.call('change', item)); - } - }); - - buttonSection.select('.ignore-button') - .html(d => { - const andComment = (d.newComment ? '_comment' : ''); - return t.html(`QA.keepRight.ignore${andComment}`); - }) - .on('click.ignore', function(d3_event, d) { - this.blur(); // avoid keeping focus on the button - #4641 - const qaService = services.improveOSM; - if (qaService) { - d.newStatus = 'INVALID'; - qaService.postUpdate(d, (err, item) => dispatch.call('change', item)); - } - }); - } - - // NOTE: Don't change method name until UI v3 is merged - improveOsmEditor.error = function(val) { - if (!arguments.length) return _qaItem; - _qaItem = val; - return improveOsmEditor; - }; - - return utilRebind(improveOsmEditor, dispatch, 'on'); -} diff --git a/modules/ui/improveOSM_header.js b/modules/ui/improveOSM_header.js deleted file mode 100644 index 164eba7946..0000000000 --- a/modules/ui/improveOSM_header.js +++ /dev/null @@ -1,67 +0,0 @@ -import { t } from '../core/localizer'; - - -export function uiImproveOsmHeader() { - let _qaItem; - - - function issueTitle(d) { - const issueKey = d.issueKey; - d.replacements = d.replacements || {}; - d.replacements.default = { html: t.html('inspector.unknown') }; // special key `default` works as a fallback string - return t.html(`QA.improveOSM.error_types.${issueKey}.title`, d.replacements); - } - - - function improveOsmHeader(selection) { - const header = selection.selectAll('.qa-header') - .data( - (_qaItem ? [_qaItem] : []), - d => `${d.id}-${d.status || 0}` - ); - - header.exit() - .remove(); - - const headerEnter = header.enter() - .append('div') - .attr('class', 'qa-header'); - - const svgEnter = headerEnter - .append('div') - .attr('class', 'qa-header-icon') - .classed('new', d => d.id < 0) - .append('svg') - .attr('width', '20px') - .attr('height', '30px') - .attr('viewbox', '0 0 20 30') - .attr('class', d => `preset-icon-28 qaItem ${d.service} itemId-${d.id} itemType-${d.itemType}`); - - svgEnter - .append('polygon') - .attr('fill', 'currentColor') - .attr('class', 'qaItem-fill') - .attr('points', '16,3 4,3 1,6 1,17 4,20 7,20 10,27 13,20 16,20 19,17.033 19,6'); - - svgEnter - .append('use') - .attr('class', 'icon-annotation') - .attr('width', '12px') - .attr('height', '12px') - .attr('transform', 'translate(4, 5.5)') - .attr('xlink:href', d => d.icon ? '#' + d.icon : ''); - - headerEnter - .append('div') - .attr('class', 'qa-header-label') - .html(issueTitle); - } - - improveOsmHeader.issue = function(val) { - if (!arguments.length) return _qaItem; - _qaItem = val; - return improveOsmHeader; - }; - - return improveOsmHeader; -} diff --git a/modules/ui/index.js b/modules/ui/index.js index 2ffbdd11b0..2097203e6f 100644 --- a/modules/ui/index.js +++ b/modules/ui/index.js @@ -23,10 +23,6 @@ export { uiFlash } from './flash'; export { uiFormFields } from './form_fields'; export { uiFullScreen } from './full_screen'; export { uiGeolocate } from './geolocate'; -export { uiImproveOsmComments } from './improveOSM_comments'; -export { uiImproveOsmDetails } from './improveOSM_details'; -export { uiImproveOsmEditor } from './improveOSM_editor'; -export { uiImproveOsmHeader } from './improveOSM_header'; export { uiInfo } from './info'; export { uiInspector } from './inspector'; export { uiIssuesInfo } from './issues_info'; diff --git a/modules/ui/sections/data_layers.js b/modules/ui/sections/data_layers.js index 41afb19f98..4053c3bf17 100644 --- a/modules/ui/sections/data_layers.js +++ b/modules/ui/sections/data_layers.js @@ -128,7 +128,7 @@ export function uiSectionDataLayers(context) { } function drawQAItems(selection) { - var qaKeys = ['keepRight', 'improveOSM', 'osmose']; + var qaKeys = ['keepRight', 'osmose']; var qaLayers = layers.all().filter(function(obj) { return qaKeys.indexOf(obj.id) !== -1; }); var ul = selection diff --git a/modules/ui/sidebar.js b/modules/ui/sidebar.js index 418910e8c5..0c7aec564b 100644 --- a/modules/ui/sidebar.js +++ b/modules/ui/sidebar.js @@ -12,7 +12,6 @@ import { services } from '../services'; import { uiDataEditor } from './data_editor'; import { uiFeatureList } from './feature_list'; import { uiInspector } from './inspector'; -import { uiImproveOsmEditor } from './improveOSM_editor'; import { uiKeepRightEditor } from './keepRight_editor'; import { uiOsmoseEditor } from './osmose_editor'; import { uiNoteEditor } from './note_editor'; @@ -23,7 +22,6 @@ export function uiSidebar(context) { var inspector = uiInspector(context); var dataEditor = uiDataEditor(context); var noteEditor = uiNoteEditor(context); - var improveOsmEditor = uiImproveOsmEditor(context); var keepRightEditor = uiKeepRightEditor(context); var osmoseEditor = uiOsmoseEditor(context); var _current; @@ -211,10 +209,8 @@ export function uiSidebar(context) { var errEditor; if (datum.service === 'keepRight') { errEditor = keepRightEditor; - } else if (datum.service === 'osmose') { - errEditor = osmoseEditor; } else { - errEditor = improveOsmEditor; + errEditor = osmoseEditor; } context.container().selectAll('.qaItem.' + datum.service) diff --git a/package-lock.json b/package-lock.json index 63e80d84b7..99f7b897c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -15,8 +15,8 @@ "@rapideditor/country-coder": "~5.3.0", "@rapideditor/location-conflation": "~1.4.0", "@tmcw/togeojson": "^5.8.1", - "@turf/bbox": "^6.0.0", - "@turf/bbox-clip": "^6.0.0", + "@turf/bbox": "^7.0.0", + "@turf/bbox-clip": "^7.0.0", "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.3.0", @@ -57,7 +57,7 @@ "d3": "~7.9.0", "dotenv": "^16.4.5", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - "esbuild": "^0.21.4", + "esbuild": "^0.23.0", "esbuild-visualizer": "^0.6.0", "eslint": "^9.8.0", "fetch-mock": "^9.11.0", @@ -593,9 +593,9 @@ } }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz", - "integrity": "sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", "cpu": [ "ppc64" ], @@ -605,13 +605,13 @@ "aix" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.4.tgz", - "integrity": "sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", "cpu": [ "arm" ], @@ -621,13 +621,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz", - "integrity": "sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", "cpu": [ "arm64" ], @@ -637,13 +637,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/android-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.4.tgz", - "integrity": "sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", "cpu": [ "x64" ], @@ -653,13 +653,13 @@ "android" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz", - "integrity": "sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", "cpu": [ "arm64" ], @@ -669,13 +669,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz", - "integrity": "sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", "cpu": [ "x64" ], @@ -685,13 +685,13 @@ "darwin" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz", - "integrity": "sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", "cpu": [ "arm64" ], @@ -701,13 +701,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz", - "integrity": "sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", "cpu": [ "x64" ], @@ -717,13 +717,13 @@ "freebsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz", - "integrity": "sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", "cpu": [ "arm" ], @@ -733,13 +733,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz", - "integrity": "sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", "cpu": [ "arm64" ], @@ -749,13 +749,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz", - "integrity": "sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", "cpu": [ "ia32" ], @@ -765,13 +765,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz", - "integrity": "sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", "cpu": [ "loong64" ], @@ -781,13 +781,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz", - "integrity": "sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", "cpu": [ "mips64el" ], @@ -797,13 +797,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz", - "integrity": "sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", "cpu": [ "ppc64" ], @@ -813,13 +813,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz", - "integrity": "sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", "cpu": [ "riscv64" ], @@ -829,13 +829,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz", - "integrity": "sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", "cpu": [ "s390x" ], @@ -845,13 +845,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/linux-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz", - "integrity": "sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", "cpu": [ "x64" ], @@ -861,13 +861,13 @@ "linux" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz", - "integrity": "sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", "cpu": [ "x64" ], @@ -877,13 +877,29 @@ "netbsd" ], "engines": { - "node": ">=12" + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz", - "integrity": "sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", "cpu": [ "x64" ], @@ -893,13 +909,13 @@ "openbsd" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz", - "integrity": "sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", "cpu": [ "x64" ], @@ -909,13 +925,13 @@ "sunos" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz", - "integrity": "sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", "cpu": [ "arm64" ], @@ -925,13 +941,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz", - "integrity": "sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", "cpu": [ "ia32" ], @@ -941,13 +957,13 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@esbuild/win32-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz", - "integrity": "sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", "cpu": [ "x64" ], @@ -957,7 +973,7 @@ "win32" ], "engines": { - "node": ">=12" + "node": ">=18" } }, "node_modules/@eslint-community/eslint-utils": { @@ -1395,7 +1411,6 @@ "resolved": "https://registry.npmjs.org/@rapideditor/temaki/-/temaki-5.9.0.tgz", "integrity": "sha512-l/ccuN25j4oOjAlrmd20VNQ0Uvwi5sKQ6CikG7e+12qqZRrwywWdFKKopFQMQtGe1Ub8fs8ykaFeUDQn8ic3fQ==", "dev": true, - "license": "CC0-1.0", "engines": { "node": "^12.20.0 || ^14.13.1 || >=16.0.0" } @@ -1668,7 +1683,6 @@ "resolved": "https://registry.npmjs.org/@transifex/api/-/api-7.1.2.tgz", "integrity": "sha512-OJc2jn/mb5qoSBiMyaPHiUZhIdqeMAW5tFNER+EBK7P0oRvM3twT+C0foMLrEQLKe4mKdvKDAJ0p3PiQgNFqTg==", "dev": true, - "license": "Apache-2.0", "dependencies": { "core-js": "^3.35.0" }, @@ -1685,49 +1699,61 @@ } }, "node_modules/@turf/bbox": { - "version": "6.5.0", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.0.0.tgz", + "integrity": "sha512-IyXG5HAsn6IZLdAtQo7aWYccjU5WsV+uzIzhGaXrh/qTVylSYmRiWgLdiekHZVED9nv9r7D/EJUMOT4zyA6POA==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/bbox-clip": { - "version": "6.5.0", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.0.0.tgz", + "integrity": "sha512-ZSReB14sSQpP5TE6g5SijVFijxMp8pyrM0PgEN1LR9Bm+nj7BmmGzHafV3lyteml2bmlFdQxkbTqcbvlVXS98g==", "dependencies": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/helpers": { - "version": "6.5.0", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", + "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", + "dependencies": { + "deep-equal": "^2.2.3", + "tslib": "^2.6.2" + }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/invariant": { - "version": "6.5.0", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", + "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" }, "funding": { "url": "https://opencollective.com/turf" } }, "node_modules/@turf/meta": { - "version": "6.5.0", - "license": "MIT", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.0.0.tgz", + "integrity": "sha512-cEXr13uFwhXq5mFBy0IK1U/QepE5qgk3zXpBYsla3lYV7cB83Vh+NNUR+r0/w/QoJqest1TG4H20F9tGYWPi/g==", "dependencies": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^7.0.0" }, "funding": { "url": "https://opencollective.com/turf" @@ -1952,6 +1978,21 @@ "dev": true, "license": "Python-2.0" }, + "node_modules/array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "dependencies": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array-differ": { "version": "1.0.0", "dev": true, @@ -2025,6 +2066,20 @@ "postcss": "^8.1.0" } }, + "node_modules/available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "dependencies": { + "possible-typed-array-names": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "dev": true, @@ -2125,11 +2180,12 @@ } }, "node_modules/braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, - "license": "MIT", "dependencies": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" }, "engines": { "node": ">=8" @@ -2216,12 +2272,18 @@ } }, "node_modules/call-bind": { - "version": "1.0.2", - "dev": true, - "license": "MIT", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3141,11 +3203,63 @@ "node": ">=6" } }, + "node_modules/deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/deep-equal/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/deep-is": { "version": "0.1.4", "dev": true, "license": "MIT" }, + "node_modules/define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/define-lazy-prop": { "version": "2.0.0", "dev": true, @@ -3155,10 +3269,11 @@ } }, "node_modules/define-properties": { - "version": "1.1.4", - "dev": true, - "license": "MIT", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -3338,9 +3453,9 @@ } }, "node_modules/engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "dependencies": { "@types/cookie": "^0.4.1", @@ -3352,7 +3467,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "engines": { "node": ">=10.2.0" @@ -3434,6 +3549,49 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-get-iterator/node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + }, "node_modules/es-to-primitive": { "version": "1.2.1", "dev": true, @@ -3451,41 +3609,42 @@ } }, "node_modules/esbuild": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.4.tgz", - "integrity": "sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", "dev": true, "hasInstallScript": true, "bin": { "esbuild": "bin/esbuild" }, "engines": { - "node": ">=12" + "node": ">=18" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.21.4", - "@esbuild/android-arm": "0.21.4", - "@esbuild/android-arm64": "0.21.4", - "@esbuild/android-x64": "0.21.4", - "@esbuild/darwin-arm64": "0.21.4", - "@esbuild/darwin-x64": "0.21.4", - "@esbuild/freebsd-arm64": "0.21.4", - "@esbuild/freebsd-x64": "0.21.4", - "@esbuild/linux-arm": "0.21.4", - "@esbuild/linux-arm64": "0.21.4", - "@esbuild/linux-ia32": "0.21.4", - "@esbuild/linux-loong64": "0.21.4", - "@esbuild/linux-mips64el": "0.21.4", - "@esbuild/linux-ppc64": "0.21.4", - "@esbuild/linux-riscv64": "0.21.4", - "@esbuild/linux-s390x": "0.21.4", - "@esbuild/linux-x64": "0.21.4", - "@esbuild/netbsd-x64": "0.21.4", - "@esbuild/openbsd-x64": "0.21.4", - "@esbuild/sunos-x64": "0.21.4", - "@esbuild/win32-arm64": "0.21.4", - "@esbuild/win32-ia32": "0.21.4", - "@esbuild/win32-x64": "0.21.4" + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" } }, "node_modules/esbuild-visualizer": { @@ -3548,7 +3707,6 @@ "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", "dev": true, - "license": "MIT", "engines": { "node": ">=6" } @@ -3941,9 +4099,10 @@ "license": "MIT" }, "node_modules/fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, - "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" }, @@ -4060,6 +4219,14 @@ } } }, + "node_modules/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dependencies": { + "is-callable": "^1.1.3" + } + }, "node_modules/foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -4119,10 +4286,27 @@ "dev": true, "license": "ISC" }, - "node_modules/function-bind": { - "version": "1.1.1", + "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, - "license": "MIT" + "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", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -4143,7 +4327,6 @@ }, "node_modules/functions-have-names": { "version": "1.2.3", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4203,13 +4386,18 @@ } }, "node_modules/get-intrinsic": { - "version": "1.1.3", - "dev": true, - "license": "MIT", + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4373,6 +4561,17 @@ "node": ">= 0.10" } }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "dev": true, @@ -4532,7 +4731,6 @@ }, "node_modules/has-bigints": { "version": "1.0.2", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4558,11 +4756,22 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "dependencies": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4570,7 +4779,6 @@ }, "node_modules/has-symbols": { "version": "1.0.3", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4580,11 +4788,11 @@ } }, "node_modules/has-tostringtag": { - "version": "1.0.0", - "dev": true, - "license": "MIT", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "dependencies": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" }, "engines": { "node": ">= 0.4" @@ -4593,6 +4801,17 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/he": { "version": "1.2.0", "dev": true, @@ -4741,12 +4960,12 @@ "license": "ISC" }, "node_modules/internal-slot": { - "version": "1.0.3", - "dev": true, - "license": "MIT", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "dependencies": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -4769,6 +4988,36 @@ "node": ">= 0.10" } }, + "node_modules/is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-arrayish": { "version": "0.2.1", "dev": true, @@ -4776,7 +5025,6 @@ }, "node_modules/is-bigint": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "has-bigints": "^1.0.1" @@ -4798,7 +5046,6 @@ }, "node_modules/is-boolean-object": { "version": "1.1.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -4813,7 +5060,6 @@ }, "node_modules/is-callable": { "version": "1.2.7", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4835,7 +5081,6 @@ }, "node_modules/is-date-object": { "version": "1.0.5", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -4899,6 +5144,17 @@ "node": ">=0.10.0" } }, + "node_modules/is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-negative-zero": { "version": "2.0.2", "dev": true, @@ -4912,15 +5168,15 @@ }, "node_modules/is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true, - "license": "MIT", "engines": { "node": ">=0.12.0" } }, "node_modules/is-number-object": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -4959,7 +5215,6 @@ }, "node_modules/is-regex": { "version": "1.1.4", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -4972,9 +5227,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-shared-array-buffer": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2" @@ -4997,7 +5262,6 @@ }, "node_modules/is-string": { "version": "1.0.7", - "dev": true, "license": "MIT", "dependencies": { "has-tostringtag": "^1.0.0" @@ -5016,7 +5280,6 @@ }, "node_modules/is-symbol": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.2" @@ -5044,12 +5307,38 @@ "dev": true, "license": "MIT" }, + "node_modules/is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "dev": true, "license": "MIT", "dependencies": { - "call-bind": "^1.0.2" + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dependencies": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6495,15 +6784,28 @@ }, "node_modules/object-inspect": { "version": "1.12.2", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "dependencies": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/object-keys": { "version": "1.1.1", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6511,7 +6813,6 @@ }, "node_modules/object.assign": { "version": "4.1.4", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.2", @@ -6793,8 +7094,7 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", - "dev": true, - "license": "ISC" + "dev": true }, "node_modules/picomatch": { "version": "2.3.1", @@ -6880,6 +7180,14 @@ "dev": true, "license": "ISC" }, + "node_modules/possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/postcss": { "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", @@ -7358,13 +7666,14 @@ "license": "MIT" }, "node_modules/regexp.prototype.flags": { - "version": "1.4.3", - "dev": true, - "license": "MIT", + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" }, "engines": { "node": ">= 0.4" @@ -7619,6 +7928,36 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "dependencies": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/setprototypeof": { "version": "1.2.0", "dev": true, @@ -7700,7 +8039,6 @@ }, "node_modules/side-channel": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.0", @@ -7790,13 +8128,13 @@ } }, "node_modules/socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "dependencies": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "node_modules/socket.io-parser": { @@ -8014,6 +8352,17 @@ "node": ">= 0.6" } }, + "node_modules/stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "dependencies": { + "internal-slot": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/streamroller": { "version": "3.1.2", "dev": true, @@ -8403,8 +8752,9 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, - "license": "MIT", "dependencies": { "is-number": "^7.0.0" }, @@ -8446,9 +8796,9 @@ } }, "node_modules/tslib": { - "version": "2.4.0", - "dev": true, - "license": "0BSD" + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "node_modules/type-check": { "version": "0.4.0", @@ -8562,7 +8912,6 @@ "url": "https://github.com/sponsors/ai" } ], - "license": "MIT", "dependencies": { "escalade": "^3.1.2", "picocolors": "^1.0.1" @@ -8699,7 +9048,6 @@ }, "node_modules/which-boxed-primitive": { "version": "1.0.2", - "dev": true, "license": "MIT", "dependencies": { "is-bigint": "^1.0.1", @@ -8712,6 +9060,23 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "dependencies": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/which-polygon": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/which-polygon/-/which-polygon-2.2.1.tgz", @@ -8732,6 +9097,24 @@ "quickselect": "^1.0.1" } }, + "node_modules/which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "dependencies": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/winston": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", @@ -8929,16 +9312,16 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" }, "peerDependencies": { "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { "bufferutil": { @@ -9431,163 +9814,170 @@ } }, "@esbuild/aix-ppc64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.4.tgz", - "integrity": "sha512-Zrm+B33R4LWPLjDEVnEqt2+SLTATlru1q/xYKVn8oVTbiRBGmK2VIMoIYGJDGyftnGaC788IuzGFAlb7IQ0Y8A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.23.0.tgz", + "integrity": "sha512-3sG8Zwa5fMcA9bgqB8AfWPQ+HFke6uD3h1s3RIwUNK8EG7a4buxvuFTs3j1IMs2NXAk9F30C/FF4vxRgQCcmoQ==", "dev": true, "optional": true }, "@esbuild/android-arm": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.4.tgz", - "integrity": "sha512-E7H/yTd8kGQfY4z9t3nRPk/hrhaCajfA3YSQSBrst8B+3uTcgsi8N+ZWYCaeIDsiVs6m65JPCaQN/DxBRclF3A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.23.0.tgz", + "integrity": "sha512-+KuOHTKKyIKgEEqKbGTK8W7mPp+hKinbMBeEnNzjJGyFcWsfrXjSTNluJHCY1RqhxFurdD8uNXQDei7qDlR6+g==", "dev": true, "optional": true }, "@esbuild/android-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.4.tgz", - "integrity": "sha512-fYFnz+ObClJ3dNiITySBUx+oNalYUT18/AryMxfovLkYWbutXsct3Wz2ZWAcGGppp+RVVX5FiXeLYGi97umisA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.23.0.tgz", + "integrity": "sha512-EuHFUYkAVfU4qBdyivULuu03FhJO4IJN9PGuABGrFy4vUuzk91P2d+npxHcFdpUnfYKy0PuV+n6bKIpHOB3prQ==", "dev": true, "optional": true }, "@esbuild/android-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.4.tgz", - "integrity": "sha512-mDqmlge3hFbEPbCWxp4fM6hqq7aZfLEHZAKGP9viq9wMUBVQx202aDIfc3l+d2cKhUJM741VrCXEzRFhPDKH3Q==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.23.0.tgz", + "integrity": "sha512-WRrmKidLoKDl56LsbBMhzTTBxrsVwTKdNbKDalbEZr0tcsBgCLbEtoNthOW6PX942YiYq8HzEnb4yWQMLQuipQ==", "dev": true, "optional": true }, "@esbuild/darwin-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.4.tgz", - "integrity": "sha512-72eaIrDZDSiWqpmCzVaBD58c8ea8cw/U0fq/PPOTqE3c53D0xVMRt2ooIABZ6/wj99Y+h4ksT/+I+srCDLU9TA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.23.0.tgz", + "integrity": "sha512-YLntie/IdS31H54Ogdn+v50NuoWF5BDkEUFpiOChVa9UnKpftgwzZRrI4J132ETIi+D8n6xh9IviFV3eXdxfow==", "dev": true, "optional": true }, "@esbuild/darwin-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.4.tgz", - "integrity": "sha512-uBsuwRMehGmw1JC7Vecu/upOjTsMhgahmDkWhGLWxIgUn2x/Y4tIwUZngsmVb6XyPSTXJYS4YiASKPcm9Zitag==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.23.0.tgz", + "integrity": "sha512-IMQ6eme4AfznElesHUPDZ+teuGwoRmVuuixu7sv92ZkdQcPbsNHzutd+rAfaBKo8YK3IrBEi9SLLKWJdEvJniQ==", "dev": true, "optional": true }, "@esbuild/freebsd-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.4.tgz", - "integrity": "sha512-8JfuSC6YMSAEIZIWNL3GtdUT5NhUA/CMUCpZdDRolUXNAXEE/Vbpe6qlGLpfThtY5NwXq8Hi4nJy4YfPh+TwAg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.23.0.tgz", + "integrity": "sha512-0muYWCng5vqaxobq6LB3YNtevDFSAZGlgtLoAc81PjUfiFz36n4KMpwhtAd4he8ToSI3TGyuhyx5xmiWNYZFyw==", "dev": true, "optional": true }, "@esbuild/freebsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.4.tgz", - "integrity": "sha512-8d9y9eQhxv4ef7JmXny7591P/PYsDFc4+STaxC1GBv0tMyCdyWfXu2jBuqRsyhY8uL2HU8uPyscgE2KxCY9imQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.23.0.tgz", + "integrity": "sha512-XKDVu8IsD0/q3foBzsXGt/KjD/yTKBCIwOHE1XwiXmrRwrX6Hbnd5Eqn/WvDekddK21tfszBSrE/WMaZh+1buQ==", "dev": true, "optional": true }, "@esbuild/linux-arm": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.4.tgz", - "integrity": "sha512-2rqFFefpYmpMs+FWjkzSgXg5vViocqpq5a1PSRgT0AvSgxoXmGF17qfGAzKedg6wAwyM7UltrKVo9kxaJLMF/g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.23.0.tgz", + "integrity": "sha512-SEELSTEtOFu5LPykzA395Mc+54RMg1EUgXP+iw2SJ72+ooMwVsgfuwXo5Fn0wXNgWZsTVHwY2cg4Vi/bOD88qw==", "dev": true, "optional": true }, "@esbuild/linux-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.4.tgz", - "integrity": "sha512-/GLD2orjNU50v9PcxNpYZi+y8dJ7e7/LhQukN3S4jNDXCKkyyiyAz9zDw3siZ7Eh1tRcnCHAo/WcqKMzmi4eMQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.23.0.tgz", + "integrity": "sha512-j1t5iG8jE7BhonbsEg5d9qOYcVZv/Rv6tghaXM/Ug9xahM0nX/H2gfu6X6z11QRTMT6+aywOMA8TDkhPo8aCGw==", "dev": true, "optional": true }, "@esbuild/linux-ia32": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.4.tgz", - "integrity": "sha512-pNftBl7m/tFG3t2m/tSjuYeWIffzwAZT9m08+9DPLizxVOsUl8DdFzn9HvJrTQwe3wvJnwTdl92AonY36w/25g==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.23.0.tgz", + "integrity": "sha512-P7O5Tkh2NbgIm2R6x1zGJJsnacDzTFcRWZyTTMgFdVit6E98LTxO+v8LCCLWRvPrjdzXHx9FEOA8oAZPyApWUA==", "dev": true, "optional": true }, "@esbuild/linux-loong64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.4.tgz", - "integrity": "sha512-cSD2gzCK5LuVX+hszzXQzlWya6c7hilO71L9h4KHwqI4qeqZ57bAtkgcC2YioXjsbfAv4lPn3qe3b00Zt+jIfQ==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.23.0.tgz", + "integrity": "sha512-InQwepswq6urikQiIC/kkx412fqUZudBO4SYKu0N+tGhXRWUqAx+Q+341tFV6QdBifpjYgUndV1hhMq3WeJi7A==", "dev": true, "optional": true }, "@esbuild/linux-mips64el": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.4.tgz", - "integrity": "sha512-qtzAd3BJh7UdbiXCrg6npWLYU0YpufsV9XlufKhMhYMJGJCdfX/G6+PNd0+v877X1JG5VmjBLUiFB0o8EUSicA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.23.0.tgz", + "integrity": "sha512-J9rflLtqdYrxHv2FqXE2i1ELgNjT+JFURt/uDMoPQLcjWQA5wDKgQA4t/dTqGa88ZVECKaD0TctwsUfHbVoi4w==", "dev": true, "optional": true }, "@esbuild/linux-ppc64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.4.tgz", - "integrity": "sha512-yB8AYzOTaL0D5+2a4xEy7OVvbcypvDR05MsB/VVPVA7nL4hc5w5Dyd/ddnayStDgJE59fAgNEOdLhBxjfx5+dg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.23.0.tgz", + "integrity": "sha512-cShCXtEOVc5GxU0fM+dsFD10qZ5UpcQ8AM22bYj0u/yaAykWnqXJDpd77ublcX6vdDsWLuweeuSNZk4yUxZwtw==", "dev": true, "optional": true }, "@esbuild/linux-riscv64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.4.tgz", - "integrity": "sha512-Y5AgOuVzPjQdgU59ramLoqSSiXddu7F3F+LI5hYy/d1UHN7K5oLzYBDZe23QmQJ9PIVUXwOdKJ/jZahPdxzm9w==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.23.0.tgz", + "integrity": "sha512-HEtaN7Y5UB4tZPeQmgz/UhzoEyYftbMXrBCUjINGjh3uil+rB/QzzpMshz3cNUxqXN7Vr93zzVtpIDL99t9aRw==", "dev": true, "optional": true }, "@esbuild/linux-s390x": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.4.tgz", - "integrity": "sha512-Iqc/l/FFwtt8FoTK9riYv9zQNms7B8u+vAI/rxKuN10HgQIXaPzKZc479lZ0x6+vKVQbu55GdpYpeNWzjOhgbA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.23.0.tgz", + "integrity": "sha512-WDi3+NVAuyjg/Wxi+o5KPqRbZY0QhI9TjrEEm+8dmpY9Xir8+HE/HNx2JoLckhKbFopW0RdO2D72w8trZOV+Wg==", "dev": true, "optional": true }, "@esbuild/linux-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.4.tgz", - "integrity": "sha512-Td9jv782UMAFsuLZINfUpoF5mZIbAj+jv1YVtE58rFtfvoKRiKSkRGQfHTgKamLVT/fO7203bHa3wU122V/Bdg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.23.0.tgz", + "integrity": "sha512-a3pMQhUEJkITgAw6e0bWA+F+vFtCciMjW/LPtoj99MhVt+Mfb6bbL9hu2wmTZgNd994qTAEw+U/r6k3qHWWaOQ==", "dev": true, "optional": true }, "@esbuild/netbsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.4.tgz", - "integrity": "sha512-Awn38oSXxsPMQxaV0Ipb7W/gxZtk5Tx3+W+rAPdZkyEhQ6968r9NvtkjhnhbEgWXYbgV+JEONJ6PcdBS+nlcpA==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.23.0.tgz", + "integrity": "sha512-cRK+YDem7lFTs2Q5nEv/HHc4LnrfBCbH5+JHu6wm2eP+d8OZNoSMYgPZJq78vqQ9g+9+nMuIsAO7skzphRXHyw==", + "dev": true, + "optional": true + }, + "@esbuild/openbsd-arm64": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.23.0.tgz", + "integrity": "sha512-suXjq53gERueVWu0OKxzWqk7NxiUWSUlrxoZK7usiF50C6ipColGR5qie2496iKGYNLhDZkPxBI3erbnYkU0rQ==", "dev": true, "optional": true }, "@esbuild/openbsd-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.4.tgz", - "integrity": "sha512-IsUmQeCY0aU374R82fxIPu6vkOybWIMc3hVGZ3ChRwL9hA1TwY+tS0lgFWV5+F1+1ssuvvXt3HFqe8roCip8Hg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.23.0.tgz", + "integrity": "sha512-6p3nHpby0DM/v15IFKMjAaayFhqnXV52aEmv1whZHX56pdkK+MEaLoQWj+H42ssFarP1PcomVhbsR4pkz09qBg==", "dev": true, "optional": true }, "@esbuild/sunos-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.4.tgz", - "integrity": "sha512-hsKhgZ4teLUaDA6FG/QIu2q0rI6I36tZVfM4DBZv3BG0mkMIdEnMbhc4xwLvLJSS22uWmaVkFkqWgIS0gPIm+A==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.23.0.tgz", + "integrity": "sha512-BFelBGfrBwk6LVrmFzCq1u1dZbG4zy/Kp93w2+y83Q5UGYF1d8sCzeLI9NXjKyujjBBniQa8R8PzLFAUrSM9OA==", "dev": true, "optional": true }, "@esbuild/win32-arm64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.4.tgz", - "integrity": "sha512-UUfMgMoXPoA/bvGUNfUBFLCh0gt9dxZYIx9W4rfJr7+hKe5jxxHmfOK8YSH4qsHLLN4Ck8JZ+v7Q5fIm1huErg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.23.0.tgz", + "integrity": "sha512-lY6AC8p4Cnb7xYHuIxQ6iYPe6MfO2CC43XXKo9nBXDb35krYt7KGhQnOkRGar5psxYkircpCqfbNDB4uJbS2jQ==", "dev": true, "optional": true }, "@esbuild/win32-ia32": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.4.tgz", - "integrity": "sha512-yIxbspZb5kGCAHWm8dexALQ9en1IYDfErzjSEq1KzXFniHv019VT3mNtTK7t8qdy4TwT6QYHI9sEZabONHg+aw==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.23.0.tgz", + "integrity": "sha512-7L1bHlOTcO4ByvI7OXVI5pNN6HSu6pUQq9yodga8izeuB1KcT2UkHaH6118QJwopExPn0rMHIseCTx1CRo/uNA==", "dev": true, "optional": true }, "@esbuild/win32-x64": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.4.tgz", - "integrity": "sha512-sywLRD3UK/qRJt0oBwdpYLBibk7KiRfbswmWRDabuncQYSlf8aLEEUor/oP6KRz8KEG+HoiVLBhPRD5JWjS8Sg==", + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.23.0.tgz", + "integrity": "sha512-Arm+WgUFLUATuoxCJcahGuk6Yj9Pzxd6l11Zb/2aAuv5kWWvvfhLFo2fni4uSK5vzlUdCGZ/BdV5tH8klj8p8g==", "dev": true, "optional": true }, @@ -10056,32 +10446,49 @@ "dev": true }, "@turf/bbox": { - "version": "6.5.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-7.0.0.tgz", + "integrity": "sha512-IyXG5HAsn6IZLdAtQo7aWYccjU5WsV+uzIzhGaXrh/qTVylSYmRiWgLdiekHZVED9nv9r7D/EJUMOT4zyA6POA==", "requires": { - "@turf/helpers": "^6.5.0", - "@turf/meta": "^6.5.0" + "@turf/helpers": "^7.0.0", + "@turf/meta": "^7.0.0", + "tslib": "^2.6.2" } }, "@turf/bbox-clip": { - "version": "6.5.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/bbox-clip/-/bbox-clip-7.0.0.tgz", + "integrity": "sha512-ZSReB14sSQpP5TE6g5SijVFijxMp8pyrM0PgEN1LR9Bm+nj7BmmGzHafV3lyteml2bmlFdQxkbTqcbvlVXS98g==", "requires": { - "@turf/helpers": "^6.5.0", - "@turf/invariant": "^6.5.0" + "@turf/helpers": "^7.0.0", + "@turf/invariant": "^7.0.0", + "tslib": "^2.6.2" } }, "@turf/helpers": { - "version": "6.5.0" + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-7.0.0.tgz", + "integrity": "sha512-vwZvxRuyjGpGXvhXSbT9mX6FK92dBMLWbMbDJ/MXQUPx17ReVPFc+6N6IcxAzZfkiCnqy7vpuq0c+/TTrQxIiA==", + "requires": { + "deep-equal": "^2.2.3", + "tslib": "^2.6.2" + } }, "@turf/invariant": { - "version": "6.5.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-7.0.0.tgz", + "integrity": "sha512-Kayszfz3W8yJ1/cIA3/aNSzAuw7QgSp+IwsSmhLAfp4DbjV0o6sjxRZXRY2gRstZHqkNHSSEeir8V/icdO8sjA==", "requires": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^7.0.0", + "tslib": "^2.6.2" } }, "@turf/meta": { - "version": "6.5.0", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/@turf/meta/-/meta-7.0.0.tgz", + "integrity": "sha512-cEXr13uFwhXq5mFBy0IK1U/QepE5qgk3zXpBYsla3lYV7cB83Vh+NNUR+r0/w/QoJqest1TG4H20F9tGYWPi/g==", "requires": { - "@turf/helpers": "^6.5.0" + "@turf/helpers": "^7.0.0" } }, "@types/cookie": { @@ -10244,6 +10651,15 @@ "version": "2.0.1", "dev": true }, + "array-buffer-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.1.tgz", + "integrity": "sha512-ahC5W1xgou+KTXix4sAO8Ki12Q+jf4i0+tmk3sC+zgcynshkHxzpXdImBehiUYKKKDwvfFiJl1tZt6ewscS1Mg==", + "requires": { + "call-bind": "^1.0.5", + "is-array-buffer": "^3.0.4" + } + }, "array-differ": { "version": "1.0.0", "dev": true @@ -10278,6 +10694,14 @@ "postcss-value-parser": "^4.2.0" } }, + "available-typed-arrays": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", + "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", + "requires": { + "possible-typed-array-names": "^1.0.0" + } + }, "balanced-match": { "version": "1.0.2", "dev": true @@ -10352,10 +10776,12 @@ } }, "braces": { - "version": "3.0.2", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "browser-split": { @@ -10400,11 +10826,15 @@ "dev": true }, "call-bind": { - "version": "1.0.2", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.7.tgz", + "integrity": "sha512-GHTSNSYICQ7scH7sZ+M2rFopRoLh8t2bLSW6BbgrtLsahOIB5iyAVJf9GjWK3cYTDaMj4XdBpM1cA6pIS0Kv2w==", "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "set-function-length": "^1.2.1" } }, "callsites": { @@ -11020,18 +11450,62 @@ "type-detect": "^4.0.0" } }, + "deep-equal": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.3.tgz", + "integrity": "sha512-ZIwpnevOurS8bpT4192sqAowWM76JDKSHYzMLty3BZGSswgq6pBaH3DhCSW5xVAZICZyKdOBPjwww5wfgT/6PA==", + "requires": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.5", + "es-get-iterator": "^1.1.3", + "get-intrinsic": "^1.2.2", + "is-arguments": "^1.1.1", + "is-array-buffer": "^3.0.2", + "is-date-object": "^1.0.5", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "isarray": "^2.0.5", + "object-is": "^1.1.5", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.5.1", + "side-channel": "^1.0.4", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.1", + "which-typed-array": "^1.1.13" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "deep-is": { "version": "0.1.4", "dev": true }, + "define-data-property": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", + "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", + "requires": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + } + }, "define-lazy-prop": { "version": "2.0.0", "dev": true }, "define-properties": { - "version": "1.1.4", - "dev": true, + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "requires": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" } @@ -11153,9 +11627,9 @@ "dev": true }, "engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.5.5", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.5.tgz", + "integrity": "sha512-C5Pn8Wk+1vKBoHghJODM63yk8MvrO9EWZUfkAt5HAqIgPE4/8FF0PEGHXtEd40l223+cE5ABWuPzm38PHFXfMA==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -11167,7 +11641,7 @@ "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "engine.io-parser": { @@ -11230,6 +11704,42 @@ "unbox-primitive": "^1.0.2" } }, + "es-define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", + "integrity": "sha512-jxayLKShrEqqzJ0eumQbVhTYQM27CfT1T35+gCgDFoL82JLsXqTJ76zv6A0YLOgEnLUMvLzsDsGIrl8NFpT2gQ==", + "requires": { + "get-intrinsic": "^1.2.4" + } + }, + "es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==" + }, + "es-get-iterator": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", + "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "is-arguments": "^1.1.1", + "is-map": "^2.0.2", + "is-set": "^2.0.2", + "is-string": "^1.0.7", + "isarray": "^2.0.5", + "stop-iteration-iterator": "^1.0.0" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==" + } + } + }, "es-to-primitive": { "version": "1.2.1", "dev": true, @@ -11240,34 +11750,35 @@ } }, "esbuild": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.4.tgz", - "integrity": "sha512-sFMcNNrj+Q0ZDolrp5pDhH0nRPN9hLIM3fRPwgbLYJeSHHgnXSnbV3xYgSVuOeLWH9c73VwmEverVzupIv5xuA==", - "dev": true, - "requires": { - "@esbuild/aix-ppc64": "0.21.4", - "@esbuild/android-arm": "0.21.4", - "@esbuild/android-arm64": "0.21.4", - "@esbuild/android-x64": "0.21.4", - "@esbuild/darwin-arm64": "0.21.4", - "@esbuild/darwin-x64": "0.21.4", - "@esbuild/freebsd-arm64": "0.21.4", - "@esbuild/freebsd-x64": "0.21.4", - "@esbuild/linux-arm": "0.21.4", - "@esbuild/linux-arm64": "0.21.4", - "@esbuild/linux-ia32": "0.21.4", - "@esbuild/linux-loong64": "0.21.4", - "@esbuild/linux-mips64el": "0.21.4", - "@esbuild/linux-ppc64": "0.21.4", - "@esbuild/linux-riscv64": "0.21.4", - "@esbuild/linux-s390x": "0.21.4", - "@esbuild/linux-x64": "0.21.4", - "@esbuild/netbsd-x64": "0.21.4", - "@esbuild/openbsd-x64": "0.21.4", - "@esbuild/sunos-x64": "0.21.4", - "@esbuild/win32-arm64": "0.21.4", - "@esbuild/win32-ia32": "0.21.4", - "@esbuild/win32-x64": "0.21.4" + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.23.0.tgz", + "integrity": "sha512-1lvV17H2bMYda/WaFb2jLPeHU3zml2k4/yagNMG8Q/YtfMjCwEUZa2eXXMgZTVSL5q1n4H7sQ0X6CdJDqqeCFA==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.23.0", + "@esbuild/android-arm": "0.23.0", + "@esbuild/android-arm64": "0.23.0", + "@esbuild/android-x64": "0.23.0", + "@esbuild/darwin-arm64": "0.23.0", + "@esbuild/darwin-x64": "0.23.0", + "@esbuild/freebsd-arm64": "0.23.0", + "@esbuild/freebsd-x64": "0.23.0", + "@esbuild/linux-arm": "0.23.0", + "@esbuild/linux-arm64": "0.23.0", + "@esbuild/linux-ia32": "0.23.0", + "@esbuild/linux-loong64": "0.23.0", + "@esbuild/linux-mips64el": "0.23.0", + "@esbuild/linux-ppc64": "0.23.0", + "@esbuild/linux-riscv64": "0.23.0", + "@esbuild/linux-s390x": "0.23.0", + "@esbuild/linux-x64": "0.23.0", + "@esbuild/netbsd-x64": "0.23.0", + "@esbuild/openbsd-arm64": "0.23.0", + "@esbuild/openbsd-x64": "0.23.0", + "@esbuild/sunos-x64": "0.23.0", + "@esbuild/win32-arm64": "0.23.0", + "@esbuild/win32-ia32": "0.23.0", + "@esbuild/win32-x64": "0.23.0" } }, "esbuild-visualizer": { @@ -11581,7 +12092,9 @@ "dev": true }, "fill-range": { - "version": "7.0.1", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -11660,6 +12173,14 @@ "integrity": "sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==", "dev": true }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "requires": { + "is-callable": "^1.1.3" + } + }, "foreground-child": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", @@ -11697,9 +12218,17 @@ "version": "1.0.0", "dev": true }, + "fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "optional": true + }, "function-bind": { - "version": "1.1.1", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" }, "function.prototype.name": { "version": "1.1.5", @@ -11712,8 +12241,7 @@ } }, "functions-have-names": { - "version": "1.2.3", - "dev": true + "version": "1.2.3" }, "gaze": { "version": "1.1.3", @@ -11748,12 +12276,15 @@ "dev": true }, "get-intrinsic": { - "version": "1.1.3", - "dev": true, + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.4.tgz", + "integrity": "sha512-5uYhsJH8VJBTv7oslg4BznJYhDoRI6waYCxMmCdnTrcCrHA/fCFKoTFz2JKKE0HdDFUF7/oQuhzumXJK7paBRQ==", "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" } }, "get-stdin": { @@ -11864,6 +12395,14 @@ "sparkles": "^1.0.0" } }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "requires": { + "get-intrinsic": "^1.1.3" + } + }, "graceful-fs": { "version": "4.2.10", "dev": true @@ -11971,8 +12510,7 @@ } }, "has-bigints": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "has-flag": { "version": "4.0.0", @@ -11986,21 +12524,35 @@ } }, "has-property-descriptors": { - "version": "1.0.0", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", + "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", "requires": { - "get-intrinsic": "^1.1.1" + "es-define-property": "^1.0.0" } }, - "has-symbols": { + "has-proto": { "version": "1.0.3", - "dev": true + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", + "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==" + }, + "has-symbols": { + "version": "1.0.3" }, "has-tostringtag": { - "version": "1.0.0", - "dev": true, + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", "requires": { - "has-symbols": "^1.0.2" + "has-symbols": "^1.0.3" + } + }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" } }, "he": { @@ -12098,11 +12650,12 @@ "dev": true }, "internal-slot": { - "version": "1.0.3", - "dev": true, + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", + "integrity": "sha512-NGnrKwXzSms2qUUih/ILZ5JBqNTSa1+ZmP6flaIp6KmSElgE9qdndzS3cqjrDovwFdmwsGsLdeFgB6suw+1e9g==", "requires": { - "get-intrinsic": "^1.1.0", - "has": "^1.0.3", + "es-errors": "^1.3.0", + "hasown": "^2.0.0", "side-channel": "^1.0.4" } }, @@ -12114,13 +12667,30 @@ "version": "1.4.0", "dev": true }, + "is-arguments": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.1.1.tgz", + "integrity": "sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==", + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-array-buffer": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.4.tgz", + "integrity": "sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==", + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1" + } + }, "is-arrayish": { "version": "0.2.1", "dev": true }, "is-bigint": { "version": "1.0.4", - "dev": true, "requires": { "has-bigints": "^1.0.1" } @@ -12134,15 +12704,13 @@ }, "is-boolean-object": { "version": "1.1.2", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, "is-callable": { - "version": "1.2.7", - "dev": true + "version": "1.2.7" }, "is-core-module": { "version": "2.10.0", @@ -12153,7 +12721,6 @@ }, "is-date-object": { "version": "1.0.5", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12181,17 +12748,23 @@ "is-extglob": "^2.1.1" } }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==" + }, "is-negative-zero": { "version": "2.0.2", "dev": true }, "is-number": { "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, "is-number-object": { "version": "1.0.7", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12212,15 +12785,18 @@ }, "is-regex": { "version": "1.1.4", - "dev": true, "requires": { "call-bind": "^1.0.2", "has-tostringtag": "^1.0.0" } }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==" + }, "is-shared-array-buffer": { "version": "1.0.2", - "dev": true, "requires": { "call-bind": "^1.0.2" } @@ -12233,7 +12809,6 @@ }, "is-string": { "version": "1.0.7", - "dev": true, "requires": { "has-tostringtag": "^1.0.0" } @@ -12244,7 +12819,6 @@ }, "is-symbol": { "version": "1.0.4", - "dev": true, "requires": { "has-symbols": "^1.0.2" } @@ -12257,6 +12831,11 @@ "version": "0.2.1", "dev": true }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==" + }, "is-weakref": { "version": "1.0.2", "dev": true, @@ -12264,6 +12843,15 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, "is-wsl": { "version": "2.2.0", "dev": true, @@ -13311,16 +13899,22 @@ "dev": true }, "object-inspect": { - "version": "1.12.2", - "dev": true + "version": "1.12.2" + }, + "object-is": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.6.tgz", + "integrity": "sha512-F8cZ+KfGlSGi09lJT7/Nd6KJZ9ygtvYC0/UYYLI9nmQKLMnydpB9yvbv9K1uSkEu7FU9vYPmVwLg328tX+ot3Q==", + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1" + } }, "object-keys": { - "version": "1.1.1", - "dev": true + "version": "1.1.1" }, "object.assign": { "version": "4.1.4", - "dev": true, "requires": { "call-bind": "^1.0.2", "define-properties": "^1.1.4", @@ -13569,6 +14163,11 @@ } } }, + "possible-typed-array-names": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.0.0.tgz", + "integrity": "sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==" + }, "postcss": { "version": "8.4.41", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.41.tgz", @@ -13888,12 +14487,14 @@ "dev": true }, "regexp.prototype.flags": { - "version": "1.4.3", - "dev": true, + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", + "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" + "call-bind": "^1.0.6", + "define-properties": "^1.2.1", + "es-errors": "^1.3.0", + "set-function-name": "^2.0.1" } }, "remap-istanbul": { @@ -14072,6 +14673,30 @@ "randombytes": "^2.1.0" } }, + "set-function-length": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", + "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.2" + } + }, + "set-function-name": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.2.tgz", + "integrity": "sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==", + "requires": { + "define-data-property": "^1.1.4", + "es-errors": "^1.3.0", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.2" + } + }, "setprototypeof": { "version": "1.2.0", "dev": true @@ -14124,7 +14749,6 @@ }, "side-channel": { "version": "1.0.4", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -14193,13 +14817,13 @@ } }, "socket.io-adapter": { - "version": "2.5.4", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", - "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", "dev": true, "requires": { "debug": "~4.3.4", - "ws": "~8.11.0" + "ws": "~8.17.1" } }, "socket.io-parser": { @@ -14339,6 +14963,14 @@ "version": "1.5.0", "dev": true }, + "stop-iteration-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", + "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", + "requires": { + "internal-slot": "^1.0.4" + } + }, "streamroller": { "version": "3.1.2", "dev": true, @@ -14606,6 +15238,8 @@ }, "to-regex-range": { "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", "dev": true, "requires": { "is-number": "^7.0.0" @@ -14633,8 +15267,9 @@ "dev": true }, "tslib": { - "version": "2.4.0", - "dev": true + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==" }, "type-check": { "version": "0.4.0", @@ -14788,7 +15423,6 @@ }, "which-boxed-primitive": { "version": "1.0.2", - "dev": true, "requires": { "is-bigint": "^1.0.1", "is-boolean-object": "^1.1.0", @@ -14797,6 +15431,17 @@ "is-symbol": "^1.0.3" } }, + "which-collection": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", + "requires": { + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" + } + }, "which-polygon": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/which-polygon/-/which-polygon-2.2.1.tgz", @@ -14817,6 +15462,18 @@ } } }, + "which-typed-array": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", + "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "requires": { + "available-typed-arrays": "^1.0.7", + "call-bind": "^1.0.7", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.2" + } + }, "winston": { "version": "3.12.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.12.0.tgz", @@ -14956,9 +15613,9 @@ "dev": true }, "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "requires": {} }, diff --git a/package.json b/package.json index 08609fcbbb..df6a33c4bd 100644 --- a/package.json +++ b/package.json @@ -50,8 +50,8 @@ "@rapideditor/country-coder": "~5.3.0", "@rapideditor/location-conflation": "~1.4.0", "@tmcw/togeojson": "^5.8.1", - "@turf/bbox": "^6.0.0", - "@turf/bbox-clip": "^6.0.0", + "@turf/bbox": "^7.0.0", + "@turf/bbox-clip": "^7.0.0", "abortcontroller-polyfill": "^1.7.5", "aes-js": "^3.1.2", "alif-toolkit": "^1.3.0", @@ -92,7 +92,7 @@ "d3": "~7.9.0", "dotenv": "^16.4.5", "editor-layer-index": "github:osmlab/editor-layer-index#gh-pages", - "esbuild": "^0.21.4", + "esbuild": "^0.23.0", "esbuild-visualizer": "^0.6.0", "eslint": "^9.8.0", "fetch-mock": "^9.11.0", diff --git a/test/spec/svg/layers.js b/test/spec/svg/layers.js index 96da0606d3..390b59099f 100644 --- a/test/spec/svg/layers.js +++ b/test/spec/svg/layers.js @@ -26,26 +26,25 @@ describe('iD.svgLayers', function () { it('creates default data layers', function () { container.call(iD.svgLayers(projection, context)); var nodes = container.selectAll('svg .data-layer').nodes(); - expect(nodes.length).to.eql(19); + expect(nodes.length).to.eql(18); expect(d3.select(nodes[0]).classed('osm')).to.be.true; expect(d3.select(nodes[1]).classed('notes')).to.be.true; expect(d3.select(nodes[2]).classed('data')).to.be.true; expect(d3.select(nodes[3]).classed('keepRight')).to.be.true; - expect(d3.select(nodes[4]).classed('improveOSM')).to.be.true; - expect(d3.select(nodes[5]).classed('osmose')).to.be.true; - expect(d3.select(nodes[6]).classed('streetside')).to.be.true; - expect(d3.select(nodes[7]).classed('mapillary')).to.be.true; - expect(d3.select(nodes[8]).classed('mapillary-position')).to.be.true; - expect(d3.select(nodes[9]).classed('mapillary-map-features')).to.be.true; - expect(d3.select(nodes[10]).classed('mapillary-signs')).to.be.true; - expect(d3.select(nodes[11]).classed('kartaview')).to.be.true; - expect(d3.select(nodes[12]).classed('mapilio')).to.be.true; + expect(d3.select(nodes[4]).classed('osmose')).to.be.true; + expect(d3.select(nodes[5]).classed('streetside')).to.be.true; + expect(d3.select(nodes[6]).classed('mapillary')).to.be.true; + expect(d3.select(nodes[7]).classed('mapillary-position')).to.be.true; + expect(d3.select(nodes[8]).classed('mapillary-map-features')).to.be.true; + expect(d3.select(nodes[9]).classed('mapillary-signs')).to.be.true; + expect(d3.select(nodes[10]).classed('kartaview')).to.be.true; + expect(d3.select(nodes[11]).classed('mapilio')).to.be.true; + expect(d3.select(nodes[12]).classed('vegbilder')).to.be.true; expect(d3.select(nodes[13]).classed('panoramax')).to.be.true; - expect(d3.select(nodes[14]).classed('vegbilder')).to.be.true; - expect(d3.select(nodes[15]).classed('local-photos')).to.be.true; - expect(d3.select(nodes[16]).classed('debug')).to.be.true; - expect(d3.select(nodes[17]).classed('geolocate')).to.be.true; - expect(d3.select(nodes[18]).classed('touch')).to.be.true; + expect(d3.select(nodes[14]).classed('local-photos')).to.be.true; + expect(d3.select(nodes[15]).classed('debug')).to.be.true; + expect(d3.select(nodes[16]).classed('geolocate')).to.be.true; + expect(d3.select(nodes[17]).classed('touch')).to.be.true; }); }); From 6447a654b60575a5024b94154026ffabca1ade84 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Mon, 12 Aug 2024 15:44:24 +0200 Subject: [PATCH 15/21] reverted changes to touch.js --- modules/svg/touch.js | 5 ----- svg/fontawesome/fas-long-arrow-alt-right.svg | 1 - 2 files changed, 6 deletions(-) delete mode 100644 svg/fontawesome/fas-long-arrow-alt-right.svg diff --git a/modules/svg/touch.js b/modules/svg/touch.js index f7345d7e64..860f95bd1b 100644 --- a/modules/svg/touch.js +++ b/modules/svg/touch.js @@ -6,11 +6,6 @@ export function svgTouch() { .enter() .append('g') .attr('class', function(d) { return 'layer-touch ' + d; }); - - drawTouch.enabled = function(_) { - svgTouch.enabled = _; - return this; - }; } return drawTouch; diff --git a/svg/fontawesome/fas-long-arrow-alt-right.svg b/svg/fontawesome/fas-long-arrow-alt-right.svg deleted file mode 100644 index c0a9f9b09b..0000000000 --- a/svg/fontawesome/fas-long-arrow-alt-right.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file From 55c254bc7c8356b1e2979fac31bd6473fcaad4ec Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Wed, 14 Aug 2024 12:03:47 +0200 Subject: [PATCH 16/21] now hiding layers show what was enabled --- modules/ui/sections/photo_overlays.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index c469cddd97..233b7c8202 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -56,7 +56,7 @@ export function uiSectionPhotoOverlays(context) { return d.layer && d.layer.supported(); } function layerEnabled(d) { - return layerSupported(d) && d.layer.enabled(); + return layerSupported(d) && (d.layer.enabled() || _savedLayers.includes(d.id)); } function layerRendered(d) { return d.layer.rendered?.(context.map().zoom()) ?? true; From f277ee50d49a3dc2d9268aad0aad1e1573f634a9 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Fri, 16 Aug 2024 11:50:24 +0200 Subject: [PATCH 17/21] added export function to match others --- modules/services/pannellum_photo.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/modules/services/pannellum_photo.js b/modules/services/pannellum_photo.js index 42fd6d91fa..c77b698120 100644 --- a/modules/services/pannellum_photo.js +++ b/modules/services/pannellum_photo.js @@ -139,8 +139,8 @@ export default { if (keepOrientation) { yaw = this.getYaw(); - pitch = _pannellumViewer.getPitch(); - hfov = _pannellumViewer.getHfov(); + pitch = this.getPitch(); + hfov = this.getHfov(); } _pannellumViewer.loadScene(key, pitch, yaw, hfov); dispatch.call('viewerChanged'); @@ -157,6 +157,14 @@ export default { getYaw: function() { return _pannellumViewer.getYaw(); + }, + + getPitch: function() { + return _pannellumViewer.getPitch(); + }, + + getHfov: function() { + return _pannellumViewer.getHfov(); } }; From 397ac828b6d6c11691133b650c30de72fbb3ab15 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Fri, 16 Aug 2024 15:54:45 +0200 Subject: [PATCH 18/21] fixed a bug which caused the year slider to not function when selection all images, implemented a way to keep track of photo types after refresh and updated the plane_photo.js class to simplify the zoom events and fixed a bug where zooming could bring you out of bounds --- css/60_photos.css | 10 ++++++ modules/renderer/photos.js | 42 +++++++++++++++++-------- modules/services/plane_photo.js | 45 +++++++++++---------------- modules/ui/sections/photo_overlays.js | 2 +- 4 files changed, 58 insertions(+), 41 deletions(-) diff --git a/css/60_photos.css b/css/60_photos.css index 38e3e6cb18..7549072a08 100644 --- a/css/60_photos.css +++ b/css/60_photos.css @@ -536,6 +536,16 @@ label.streetside-hires { transform-origin: 0 0; } +.panoramax-wrapper .photo-attribution a:active { + color: #ff6f00; +} + +@media (hover: hover) { + .panoramax-wrapper .photo-attribution a:hover { + color: #ff6f00; + } +} + .photo-wrapper { position: relative; background-color: #000; diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 6ac74454ac..1a924b8487 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -108,7 +108,7 @@ export function rendererPhotos(context) { _yearSliderValue = year; - if (year !== 5) { + if (year !== '5') { let days = 365 * year; var fromDate = new Date(); fromDate.setDate(fromDate.getDate() - days); @@ -127,6 +127,26 @@ export function rendererPhotos(context) { } }; + photos.togglePhotoType = function(val, updateUrl) { + var index = _shownPhotoTypes.indexOf(val); + if (index !== -1) { + _shownPhotoTypes.splice(index, 1); + } else { + _shownPhotoTypes.push(val); + } + + if (updateUrl) { + var hashString; + if (_shownPhotoTypes) { + hashString = _shownPhotoTypes.join(','); + } + setUrlFilterValue('photo_type', hashString); + } + + dispatch.call('change', this); + return photos; + }; + function setUrlFilterValue(property, val) { if (!window.mocha) { var hash = utilStringQs(window.location.hash); @@ -186,26 +206,16 @@ export function rendererPhotos(context) { return _toDate; }; - photos.togglePhotoType = function(val) { - var index = _shownPhotoTypes.indexOf(val); - if (index !== -1) { - _shownPhotoTypes.splice(index, 1); - } else { - _shownPhotoTypes.push(val); - } - dispatch.call('change', this); - return photos; - }; - photos.usernames = function() { return _usernames; }; photos.init = function() { var hash = utilStringQs(window.location.hash); + var parts; if (hash.photo_dates) { // expect format like `photo_dates=2019-01-01_2020-12-31`, but allow a couple different separators - var parts = /^(.*)[–_](.*)$/g.exec(hash.photo_dates.trim()); + parts = /^(.*)[–_](.*)$/g.exec(hash.photo_dates.trim()); this.setDateFilter('fromDate', parts && parts.length >= 2 && parts[1], false); this.setDateFilter('toDate', parts && parts.length >= 3 && parts[2], false); } @@ -215,6 +225,12 @@ export function rendererPhotos(context) { if (hash.photo_username) { this.setUsernameFilter(hash.photo_username, false); } + if (hash.photo_type) { + parts = hash.photo_type.replace(/;/g, ',').split(','); + _allPhotoTypes.forEach(d => { + if (!parts.includes(d)) this.togglePhotoType(d, false); + }); + } if (hash.photo_overlay) { // support enabling photo layers by default via a URL parameter, e.g. `photo_overlay=kartaview;mapillary;streetside` var hashOverlayIDs = hash.photo_overlay.replace(/;/g, ',').split(','); diff --git a/modules/services/plane_photo.js b/modules/services/plane_photo.js index 4261ed085a..abc041d63b 100644 --- a/modules/services/plane_photo.js +++ b/modules/services/plane_photo.js @@ -5,25 +5,16 @@ import { utilSetTransform, utilRebind } from '../util'; const dispatch = d3_dispatch('viewerChanged'); let _photo; -let _wrapper; -let imgZoom; -let _widthOverflow; +let _imageWrapper; +let _planeWrapper; +let _imgZoom = d3_zoom() + .extent([[0, 0], [320, 240]]) + .translateExtent([[0, 0], [320, 240]]) + .scaleExtent([1, 15]); function zoomPan (d3_event) { let t = d3_event.transform; - _photo.call(utilSetTransform, t.x, t.y, t.k); -} - -function zoomBeahvior () { - const {width: wrapperWidth, height: wrapperHeight} = _wrapper.node().getBoundingClientRect(); - const {naturalHeight, naturalWidth} = _photo.node(); - const intrinsicRatio = naturalWidth / naturalHeight; - _widthOverflow = wrapperHeight * intrinsicRatio - wrapperWidth; - return d3_zoom() - .extent([[0, 0], [wrapperWidth, wrapperHeight]]) - .translateExtent([[0, 0], [wrapperWidth + _widthOverflow, wrapperHeight]]) - .scaleExtent([1, 15]) - .on('zoom', zoomPan); + _imageWrapper.call(utilSetTransform, t.x, t.y, t.k); } function loadImage (selection, path) { @@ -35,25 +26,28 @@ function loadImage (selection, path) { }); } - export default { init: async function(context, selection) { this.event = utilRebind(this, dispatch, 'on'); - _wrapper = selection + _planeWrapper = selection; + _planeWrapper.call(_imgZoom.on('zoom', zoomPan)); + + _imageWrapper = _planeWrapper .append('div') .attr('class', 'photo-frame plane-frame') .classed('hide', true); - _photo = _wrapper + _photo = _imageWrapper .append('img') .attr('class', 'plane-photo'); - context.ui().photoviewer.on('resize.plane', () => { - imgZoom = zoomBeahvior(); - _wrapper.call(imgZoom); - }); + context.ui().photoviewer.on('resize.plane', function(dimensions) { + _imgZoom + .extent([[0, 0], dimensions]) + .translateExtent([[0, 0], dimensions]); + }); await Promise.resolve(); @@ -76,7 +70,6 @@ export default { return this; }, - hidePhotoFrame: function (context) { context .select('photo-frame.plane-frame') @@ -91,9 +84,7 @@ export default { loadImage(_photo, ''); loadImage(_photo, data.image_path) .then(() => { - imgZoom = zoomBeahvior(); - _wrapper.call(imgZoom); - _wrapper.call(imgZoom.transform, d3_zoomIdentity.translate(-_widthOverflow / 2, 0)); + _planeWrapper.call(_imgZoom.transform, d3_zoomIdentity); }); return this; }, diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index 233b7c8202..c3b82442ed 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -175,7 +175,7 @@ export function uiSectionPhotoOverlays(context) { .append('input') .attr('type', 'checkbox') .on('change', function(d3_event, d) { - context.photos().togglePhotoType(d); + context.photos().togglePhotoType(d, true); }); labelEnter From a773d0a23243ccdbcbc5e71b4802fccf012cb8b7 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Mon, 19 Aug 2024 12:03:59 +0200 Subject: [PATCH 19/21] added tests --- modules/services/panoramax.js | 30 +++---- test/spec/services/panoramax.js | 147 +++++++++++++------------------- 2 files changed, 75 insertions(+), 102 deletions(-) diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index 807566da09..84a9e467f9 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -194,18 +194,6 @@ function loadTileDataToCache(data, tile, zoom) { } } -async function getImageData(collection_id, image_id){ - const requestUrl = imageDataUrl.replace('{collectionId}', collection_id) - .replace('{itemId}', image_id); - - const response = await fetch(requestUrl, { method: 'GET' }); - if (!response.ok) { - throw new Error(response.status + ' ' + response.statusText); - } - const data = await response.json(); - return data; -} - async function getUsername(user_id){ const requestUrl = usernameURL.replace('{userId}', user_id); @@ -310,7 +298,7 @@ export default { // Set the currently visible image setActiveImage: function(image) { - if (image) { + if (image && image.id && image.sequence_id) { _activeImage = { id: image.id, sequence_id: image.sequence_id @@ -449,7 +437,7 @@ export default { .attr('href', viewerLink) .text('panoramax.xyz'); - getImageData(d.sequence_id, d.id).then(function(data){ + this.getImageData(d.sequence_id, d.id).then(function(data){ _currentScene = { currentImage: null, nextImage: null, @@ -514,6 +502,18 @@ export default { return _currentFrame; }, + getImageData: async function(collection_id, image_id){ + const requestUrl = imageDataUrl.replace('{collectionId}', collection_id) + .replace('{itemId}', image_id); + + const response = await fetch(requestUrl, { method: 'GET' }); + if (!response.ok) { + throw new Error(response.status + ' ' + response.statusText); + } + const data = await response.json(); + return data; + }, + ensureViewerLoaded: function(context) { let that = this; @@ -618,7 +618,7 @@ export default { .classed('hide', true); context.container().selectAll('.viewfield-group, .sequence, .icon-sign') .classed('currentView', false); - this.setActiveImage(); + this.setActiveImage(null); return this.setStyles(context, null); }, diff --git a/test/spec/services/panoramax.js b/test/spec/services/panoramax.js index f396b2d0e9..5cdabb7172 100644 --- a/test/spec/services/panoramax.js +++ b/test/spec/services/panoramax.js @@ -1,6 +1,39 @@ describe('iD.servicePanoramax', function() { - var dimensions = [64, 64]; + const dimensions = [64, 64]; var context, panoramax; + const data = { + images:[{ + loc: [10,0], + capture_time: '2020-01-01', + id: 'abc', + account_id: '123', + sequence_id: 'a1b2', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }, { + loc: [10,1], + capture_time: '2020-02-01', + id: 'def', + account_id: 'c3d4', + sequence_id: '', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }, { + loc: [10,2], + capture_time: '2020-02-01', + id: 'ghi', + account_id: '789', + sequence_id: 'e5f6', + heading: 0, + image_path: '', + isPano: true, + model: 'camera', + }], + }; before(function() { iD.services.panoramax = iD.servicePanoramax; @@ -52,92 +85,7 @@ describe('iD.servicePanoramax', function() { }); describe('#loadImages', function() { - it('fires loadedImages when images are loaded', function(done) { - var data = { - images:[{ - loc: [10,0], - capture_time: '2020-01-01', - id: 'abc', - account_id: '123', - sequence_id: 'a1b2', - heading: 0, - image_path: '', - isPano: true, - model: 'camera', - }, { - loc: [10,1], - capture_time: '2020-02-01', - id: 'def', - account_id: 'c3d4', - sequence_id: '', - heading: 0, - image_path: '', - isPano: true, - model: 'camera', - }, { - loc: [10,2], - capture_time: '2020-02-01', - id: 'ghi', - account_id: '789', - sequence_id: 'e5f6', - heading: 0, - image_path: '', - isPano: true, - model: 'camera', - }], - }; - - fetchMock.mock(new RegExp('/panoramax-test/'), { - body: JSON.stringify(data), - status: 200, - headers: { 'Content-Type': 'application/json' } - }); - - context.projection.scale(iD.geoZoomToScale(15)); - - panoramax.on('loadedImages', function() { - expect(fetchMock.calls().length).to.eql(1); // 1 nearby-photos - done(); - }).catch(done()); - - panoramax.loadImages(context.projection); - }); - it('does not load images around null island', function (done) { - var data = { - images:[{ - loc: [10,0], - capture_time: '2020-01-01', - id: 'abc', - account_id: '123', - sequence_id: 'a1b2', - heading: 0, - image_path: '', - isPano: true, - model: 'camera', - }, { - loc: [10,1], - capture_time: '2020-02-01', - id: 'def', - account_id: 'c3d4', - sequence_id: '', - heading: 0, - image_path: '', - isPano: true, - model: 'camera', - }, { - loc: [10,2], - capture_time: '2020-02-01', - id: 'ghi', - account_id: '789', - sequence_id: 'e5f6', - heading: 0, - image_path: '', - isPano: true, - model: 'camera', - }], - }; - var spy = sinon.spy(); fetchMock.mock(new RegExp('/panoramax-test/'), { body: JSON.stringify(data), @@ -158,6 +106,14 @@ describe('iD.servicePanoramax', function() { done(); }, 200); }); + + it('handle API error response', function(done) { + fetchMock.mock('/panoramax-test/', 500); + + panoramax.getImageData('collection1', 'image1') + .then(() => done(new Error('Expected method to reject.'))) + .catch(() => done()); + }); }); describe('#images', function() { @@ -191,6 +147,24 @@ describe('iD.servicePanoramax', function() { var res = panoramax.images(context.projection); expect(res).to.have.length.of.at.most(5); }); + + it('handle invalid image data', function() { + const invalidImage = { id: null, sequence_id: null }; + panoramax.setActiveImage(invalidImage); + expect(panoramax.getActiveImage()).to.be.null; + }); + + it('return empty array when no images are available', function() { + const result = panoramax.images(context.projection); + expect(result).to.deep.equal([]); + }); + + it('load images quickly under normal conditions', function() { + const start = performance.now(); + panoramax.loadImages(context.projection); + const duration = performance.now() - start; + expect(duration).to.be.lessThan(1000); + }); }); @@ -220,5 +194,4 @@ describe('iD.servicePanoramax', function() { expect(panoramax.getActiveImage()).to.eql(d); }); }); - }); From 2bd38e0472e3eab2d6ec5e937b107f216526b3b6 Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Thu, 22 Aug 2024 12:18:45 +0200 Subject: [PATCH 20/21] added jsdoc --- modules/renderer/photos.js | 53 ++++++++++++ modules/services/pannellum_photo.js | 15 +++- modules/services/panoramax.js | 111 +++++++++++++++++++++++--- modules/services/plane_photo.js | 12 +++ modules/svg/panoramax_images.js | 40 +++++++++- modules/ui/sections/photo_overlays.js | 37 ++++++++- svg/fontawesome/fas-language.svg | 1 + 7 files changed, 254 insertions(+), 15 deletions(-) create mode 100644 svg/fontawesome/fas-language.svg diff --git a/modules/renderer/photos.js b/modules/renderer/photos.js index 1a924b8487..f7b1ede7ab 100644 --- a/modules/renderer/photos.js +++ b/modules/renderer/photos.js @@ -35,18 +35,30 @@ export function rendererPhotos(context) { window.location.replace('#' + utilQsString(hash, true)); } + /** + * @returns The layer ID + */ photos.overlayLayerIDs = function() { return _layerIDs; }; + /** + * @returns All the photo types + */ photos.allPhotoTypes = function() { return _allPhotoTypes; }; + /** + * @returns The date filters value + */ photos.dateFilters = function() { return _dateFilters; }; + /** + * @returns The year date filter value + */ photos.yearSliderValue = function() { return _yearSliderValue; }; @@ -55,6 +67,12 @@ export function rendererPhotos(context) { return val === _dateFilters[0] ? _fromDate : _toDate; }; + /** + * Sets the date filter (min/max date) + * @param {*} type Either 'fromDate' or 'toDate' + * @param {*} val The actual Date + * @param {boolean} updateUrl Whether the URL should update or not + */ photos.setDateFilter = function(type, val, updateUrl) { // validate the date var date = val && new Date(val); @@ -85,6 +103,11 @@ export function rendererPhotos(context) { } }; + /** + * Sets the username filter + * @param {string} val The username + * @param {boolean} updateUrl Whether the URL should update or not + */ photos.setUsernameFilter = function(val, updateUrl) { if (val && typeof val === 'string') val = val.replace(/;/g, ',').split(','); if (val) { @@ -104,6 +127,11 @@ export function rendererPhotos(context) { } }; + /** + * Util function to set the slider date filter + * @param {*} year The slider value + * @param {boolean} updateUrl whether the URL should update or not + */ photos.setFromYearFilter = function(year, updateUrl){ _yearSliderValue = year; @@ -127,6 +155,11 @@ export function rendererPhotos(context) { } }; + /** + * Util function to set the slider date filter + * @param {*} val Either 'panoramic' or 'flat' + * @param {boolean} updateUrl Whether the URL should update or not + */ photos.togglePhotoType = function(val, updateUrl) { var index = _shownPhotoTypes.indexOf(val); if (index !== -1) { @@ -147,6 +180,11 @@ export function rendererPhotos(context) { return photos; }; + /** + * Updates the URL with new values + * @param {*} val value to save + * @param {string} property Name of the value + */ function setUrlFilterValue(property, val) { if (!window.mocha) { var hash = utilStringQs(window.location.hash); @@ -166,20 +204,32 @@ export function rendererPhotos(context) { return layer && layer.supported() && layer.enabled(); } + /** + * @returns If the Date filter should be drawn + */ photos.shouldFilterByDate = function() { return false; }; + /** + * @returns If the Date Slider filter should be drawn + */ photos.shouldFilterDateBySlider = function(){ return showsLayer('mapillary') || showsLayer('kartaview') || showsLayer('mapilio') || showsLayer('streetside') || showsLayer('vegbilder') || showsLayer('panoramax'); }; + /** + * @returns If the Photo Type filter should be drawn + */ photos.shouldFilterByPhotoType = function() { return showsLayer('mapillary') || (showsLayer('streetside') && showsLayer('kartaview')) || showsLayer('vegbilder') || showsLayer('panoramax'); }; + /** + * @returns If the Username filter should be drawn + */ photos.shouldFilterByUsername = function() { return !showsLayer('mapillary') && showsLayer('kartaview') && !showsLayer('streetside') || showsLayer('panoramax'); }; @@ -210,6 +260,9 @@ export function rendererPhotos(context) { return _usernames; }; + /** + * Inits the streetlevel layer given the saved values in the URL + */ photos.init = function() { var hash = utilStringQs(window.location.hash); var parts; diff --git a/modules/services/pannellum_photo.js b/modules/services/pannellum_photo.js index c77b698120..1c44ad3294 100644 --- a/modules/services/pannellum_photo.js +++ b/modules/services/pannellum_photo.js @@ -91,6 +91,10 @@ export default { ]); }, + /** + * Shows the photo frame if hidden + * @param {*} context the HTML wrap of the frame + */ showPhotoFrame: function (context) { const isHidden = context.selectAll('.photo-frame.pannellum-frame.hide').size(); @@ -105,8 +109,12 @@ export default { } return this; - }, + }, + /** + * Hides the photo frame if shown + * @param {*} context the HTML wrap of the frame + */ hidePhotoFrame: function (viewerContext) { viewerContext .select('photo-frame.pannellum-frame') @@ -115,6 +123,11 @@ export default { return this; }, + /** + * Renders an image inside the frame + * @param {*} data the image data, it should contain an image_path attribute, a link to the actual image. + * @param {boolean} keepOrientation if true, HFOV, pitch and yaw will be kept between images + */ selectPhoto: function (data, keepOrientation) { const {key} = data; if ( !(key in _currScenes) ) { diff --git a/modules/services/panoramax.js b/modules/services/panoramax.js index 84a9e467f9..6d7d399fda 100644 --- a/modules/services/panoramax.js +++ b/modules/services/panoramax.js @@ -56,8 +56,13 @@ function partitionViewport(projection) { .map(function(tile) { return tile.extent; }); } - -// Return no more than `limit` results per partition. +/** + * Return no more than `limit` results per partition. + * @param {number} limit Number of maximum objects to return + * @param {*} projection Current projection + * @param {*} rtree The cache + * @returns Data found + */ function searchLimited(limit, projection, rtree) { limit = limit || 5; @@ -80,7 +85,14 @@ function searchLimited(limit, projection, rtree) { }, []); } -// Load all data for the specified type from Panoramax vector tiles +/** + * Load all data for the specified type from Panoramax vector tiles + * @param {string} which Either 'images' or 'lines' + * @param {string} url Tile endpoint + * @param {number} maxZoom Maximum zoom out + * @param {*} projection Current projection + * @param {number} zoom current zoom + */ function loadTiles(which, url, maxZoom, projection, zoom) { const tiler = utilTiler().zoomExtent([minZoom, maxZoom]).skipNullIsland(true); const tiles = tiler.getTiles(projection); @@ -90,8 +102,13 @@ function loadTiles(which, url, maxZoom, projection, zoom) { }); } - -// Load all data for the specified type from one vector tile +/** + * Load all data for the specified type from one vector tile + * @param {*} which Either 'images' or 'lines' + * @param {*} url Tile endpoint + * @param {*} tile Current tile + * @param {*} zoom Current zoom + */ function loadTile(which, url, tile, zoom) { const cache = _cache.requests; const tileId = `${tile.id}-${which}`; @@ -133,6 +150,12 @@ function loadTile(which, url, tile, zoom) { }); } +/** + * Fetches all data for the specified tile and adds them to cache + * @param {*} data Tile data + * @param {*} tile Current tile + * @param {*} zoom Current zoom + */ function loadTileDataToCache(data, tile, zoom) { const vectorTile = new VectorTile(new Protobuf(data)); @@ -194,6 +217,11 @@ function loadTileDataToCache(data, tile, zoom) { } } +/** + * Fetches the username from Panoramax + * @param {string} user_id + * @returns the username + */ async function getUsername(user_id){ const requestUrl = usernameURL.replace('{userId}', user_id); @@ -230,26 +258,46 @@ export default { _activeImage = null; }, - // Get visible images + /** + * Get visible images from cache + * @param {*} projection Current Projection + * @returns images data for the current projection + */ images: function(projection) { const limit = 5; return searchLimited(limit, projection, _cache.images.rtree); }, + /** + * Get a specific image from cache + * @param {*} imageKey the image id + * @returns + */ cachedImage: function(imageKey) { return _cache.images.forImageId[imageKey]; }, - // Load images in the visible area + /** + * Fetches images data for the visible area + * @param {*} projection Current Projection + */ loadImages: function(projection) { loadTiles('images', tileUrl, imageMinZoom, projection); }, - // Load line in the visible area + /** + * Fetches sequences data for the visible area + * @param {*} projection Current Projection + */ loadLines: function(projection, zoom) { loadTiles('line', tileUrl, lineMinZoom, projection, zoom); }, + /** + * Fetches all possible userIDs from Panoramax + * @param {string} usernames one or multiple usernames + * @returns userIDs + */ getUserIds: async function(usernames) { const requestUrls = usernames.map(username => userIdUrl.replace('{username}', username)); @@ -266,7 +314,12 @@ export default { return data.flatMap((d, i) => d.features.filter(f => f.name === usernames[i]).map(f => f.id)); }, - // Get visible sequences + /** + * Get visible sequences from cache + * @param {*} projection Current Projection + * @param {number} zoom Current zoom (if zoom < `lineMinZoom` less accurate lines will be drawn) + * @returns sequences data for the current projection + */ sequences: function(projection, zoom) { const viewport = projection.clipExtent(); const min = [viewport[0][0], viewport[1][1]]; @@ -296,7 +349,10 @@ export default { return lineStrings; }, - // Set the currently visible image + /** + * Updates the data for the currently visible image + * @param {*} image Image data + */ setActiveImage: function(image) { if (image && image.id && image.sequence_id) { _activeImage = { @@ -312,7 +368,11 @@ export default { return _activeImage; }, - // Update the currently highlighted sequence and selected bubble. + /** + * Update the currently highlighted sequence and selected bubble + * @param {*} context Current HTML context + * @param {*} [hovered] The hovered bubble image + */ setStyles: function(context, hovered) { const hoveredImageId = hovered && hovered.id; const hoveredSequenceId = hovered && hovered.sequence_id; @@ -346,6 +406,10 @@ export default { return this; }, + /** + * Updates the URL to save the current shown image + * @param {*} imageKey + */ updateUrlImage: function(imageKey) { if (!window.mocha) { var hash = utilStringQs(window.location.hash); @@ -358,6 +422,12 @@ export default { } }, + /** + * Loads the selected image in the frame + * @param {*} context Current HTML context + * @param {*} id of the selected image + * @returns + */ selectImage: function (context, id) { let that = this; @@ -502,6 +572,12 @@ export default { return _currentFrame; }, + /** + * Fetches the data for a specific image + * @param {*} collection_id + * @param {*} image_id + * @returns The fetched image data + */ getImageData: async function(collection_id, image_id){ const requestUrl = imageDataUrl.replace('{collectionId}', collection_id) .replace('{itemId}', image_id); @@ -571,6 +647,11 @@ export default { _planeFrame.event.on('viewerChanged', () => dispatch.call('viewerChanged')); }); + /** + * Loads the next image in the sequence + * @param {number} stepBy '-1' if backwards or '1' if foward + * @returns + */ function step(stepBy) { return function () { if (!_currentScene.currentImage) return; @@ -593,6 +674,10 @@ export default { return _loadViewerPromise; }, + /** + * Shows the current viewer if hidden + * @param {*} context + */ showViewer: function (context) { let wrap = context.container().select('.photoviewer') .classed('hide', false); @@ -608,6 +693,10 @@ export default { return this; }, + /** + * Hides the current viewer if shown, resets the active image and sequence + * @param {*} context + */ hideViewer: function (context) { let viewer = context.container().select('.photoviewer'); if (!viewer.empty()) viewer.datum(null); diff --git a/modules/services/plane_photo.js b/modules/services/plane_photo.js index abc041d63b..70baffa624 100644 --- a/modules/services/plane_photo.js +++ b/modules/services/plane_photo.js @@ -54,6 +54,10 @@ export default { return this; }, + /** + * Shows the photo frame if hidden + * @param {*} context the HTML wrap of the frame + */ showPhotoFrame: function (context) { const isHidden = context.selectAll('.photo-frame.plane-frame.hide').size(); @@ -70,6 +74,10 @@ export default { return this; }, + /** + * Hides the photo frame if shown + * @param {*} context the HTML wrap of the frame + */ hidePhotoFrame: function (context) { context .select('photo-frame.plane-frame') @@ -78,6 +86,10 @@ export default { return this; }, + /** + * Renders an image inside the frame + * @param {*} data the image data, it should contain an image_path attribute, a link to the actual image. + */ selectPhoto: function (data) { dispatch.call('viewerChanged'); diff --git a/modules/svg/panoramax_images.js b/modules/svg/panoramax_images.js index 9b82f2f17f..710d62ae24 100644 --- a/modules/svg/panoramax_images.js +++ b/modules/svg/panoramax_images.js @@ -36,6 +36,11 @@ export function svgPanoramaxImages(projection, context, dispatch) { return _panoramax; } + /** + * Filters the images given the filters on the right panel + * @param {*} images + * @returns array of filtered images + */ async function filterImages(images) { const showsPano = context.photos().showsPanoramic(); const showsFlat = context.photos().showsFlat(); @@ -81,6 +86,11 @@ export function svgPanoramaxImages(projection, context, dispatch) { return images; } + /** + * Filters the sequences given the filters on the right panel + * @param {*} sequences + * @returns array of filtered sequences + */ async function filterSequences(sequences) { const showsPano = context.photos().showsPanoramic(); const showsFlat = context.photos().showsFlat(); @@ -126,6 +136,9 @@ export function svgPanoramaxImages(projection, context, dispatch) { return sequences; } + /** + * Shows the selected layer + */ function showLayer() { const service = getService(); if (!service) return; @@ -140,7 +153,9 @@ export function svgPanoramaxImages(projection, context, dispatch) { .on('end', function () { dispatch.call('change'); }); } - + /** + * Hides the selected layer + */ function hideLayer() { throttledRedraw.cancel(); @@ -151,6 +166,11 @@ export function svgPanoramaxImages(projection, context, dispatch) { .on('end', editOff); } + /** + * Updates the viewfinder for the selected image bubble based on the frame's yaw + * @param {*} d Current Active image Data + * @param {*} selectedImageId The selected bubble image ID + */ function transform(d, selectedImageId) { let t = svgPointTransform(projection)(d); let rot = d.heading; @@ -174,6 +194,10 @@ export function svgPanoramaxImages(projection, context, dispatch) { layer.style('display', 'none'); } + /** + * Updates the current selected image + * @param {*} image The selected image bubble data + */ function click(d3_event, image) { const service = getService(); if (!service) return; @@ -194,12 +218,14 @@ export function svgPanoramaxImages(projection, context, dispatch) { if (service) service.setStyles(context, image); } - function mouseout() { const service = getService(); if (service) service.setStyles(context, null); } + /** + * Updates the current view, rearranging lines and bubbles. + */ async function update() { const zoom = ~~context.map().zoom(); const showViewfields = (zoom >= viewFieldZoomLevel); @@ -313,6 +339,10 @@ export function svgPanoramaxImages(projection, context, dispatch) { } + /** + * Draws bubbles and lines on the current view + * @param {*} selection Current HTML Selection + */ function drawImages(selection) { const enabled = svgPanoramaxImages.enabled; @@ -360,6 +390,9 @@ export function svgPanoramaxImages(projection, context, dispatch) { } } + /** + * @returns if layer is active + */ drawImages.enabled = function(_) { if (!arguments.length) return svgPanoramaxImages.enabled; svgPanoramaxImages.enabled = _; @@ -379,6 +412,9 @@ export function svgPanoramaxImages(projection, context, dispatch) { return !!getService(); }; + /** + * @returns if layer is drawn + */ drawImages.rendered = function(zoom) { return zoom >= lineMinZoom; }; diff --git a/modules/ui/sections/photo_overlays.js b/modules/ui/sections/photo_overlays.js index c3b82442ed..bccccc1595 100644 --- a/modules/ui/sections/photo_overlays.js +++ b/modules/ui/sections/photo_overlays.js @@ -24,6 +24,10 @@ export function uiSectionPhotoOverlays(context) { .disclosureContent(renderDisclosureContent) .expandedByDefault(false); + /** + * Calls all draw function + * @param {*} selection Current HTML selection + */ function renderDisclosureContent(selection) { var container = selection.selectAll('.photo-overlay-container') .data([0]); @@ -39,7 +43,10 @@ export function uiSectionPhotoOverlays(context) { .call(drawUsernameFilter) .call(drawLocalPhotos); } - + + /** + * Draws the streetlevels in the right panel + */ function drawPhotoItems(selection) { var photoKeys = context.photos().overlayLayerIDs(); var photoLayers = layers.all().filter(function(obj) { return photoKeys.indexOf(obj.id) !== -1; }); @@ -130,6 +137,9 @@ export function uiSectionPhotoOverlays(context) { .property('checked', layerEnabled); } + /** + * Draws the photo type filter in the right panel + */ function drawPhotoTypeItems(selection) { var data = context.photos().allPhotoTypes(); @@ -193,6 +203,9 @@ export function uiSectionPhotoOverlays(context) { .property('checked', typeEnabled); } + /** + * Draws the date filter in the right panel + */ function drawDateFilter(selection) { var data = context.photos().dateFilters(); @@ -262,6 +275,9 @@ export function uiSectionPhotoOverlays(context) { .classed('active', filterEnabled); } + /** + * Draws the date sliderbar filter in the right panel + */ function drawDateSlider(selection){ function filterEnabled() { @@ -361,6 +377,9 @@ export function uiSectionPhotoOverlays(context) { } } + /** + * Draws the username filter in the right panel + */ function drawUsernameFilter(selection) { function filterEnabled() { return context.photos().usernames(); @@ -424,10 +443,18 @@ export function uiSectionPhotoOverlays(context) { } } + /** + * Toggle on/off the selected layer + * @param {*} which Id of the selected layer + */ function toggleLayer(which) { setLayer(which, !showsLayer(which)); } + /** + * @param {*} which Id of the selected layer + * @returns whether the layer is enabled + */ function showsLayer(which) { var layer = layers.layer(which); if (layer) { @@ -436,6 +463,11 @@ export function uiSectionPhotoOverlays(context) { return false; } + /** + * Set the selected layer + * @param {string} which Id of the selected layer + * @param {boolean} enabled + */ function setLayer(which, enabled) { var layer = layers.layer(which); if (layer) { @@ -533,6 +565,9 @@ export function uiSectionPhotoOverlays(context) { localPhotosLayer.fileList(d); } + /** + * Toggles StreetView on/off + */ function toggleStreetSide(){ let layerContainer = d3_select('.photo-overlay-container'); if (!_layersHidden){ diff --git a/svg/fontawesome/fas-language.svg b/svg/fontawesome/fas-language.svg new file mode 100644 index 0000000000..a04db11300 --- /dev/null +++ b/svg/fontawesome/fas-language.svg @@ -0,0 +1 @@ + \ No newline at end of file From ef853484517119d74b2f9f5fa50a362a1ef8858a Mon Sep 17 00:00:00 2001 From: mattiapezzotti Date: Sat, 24 Aug 2024 02:08:09 +0200 Subject: [PATCH 21/21] fixed a bug that prevented mouseup event from firing when using the pannellum frame --- modules/services/pannellum_photo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/services/pannellum_photo.js b/modules/services/pannellum_photo.js index 1c44ad3294..914773ce82 100644 --- a/modules/services/pannellum_photo.js +++ b/modules/services/pannellum_photo.js @@ -19,6 +19,7 @@ export default { .attr('class', 'photo-frame pannellum-frame') .attr('id', 'ideditor-pannellum-viewer') .classed('hide', true) + .on('mousedown', function(e) { e.stopPropagation(); }) .on('keydown', function(e) { e.stopPropagation(); }); if (!window.pannellum) {