From e7bb0fad91cd856ced02a3ac260520a0f77912ae Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:45:41 -0800 Subject: [PATCH 01/46] chore: added map-server to main thread --- index.js | 20 +- package-lock.json | 2151 ++++++++++++++++++++++++++++++++- package.json | 6 +- src/main/index.js | 32 +- src/main/windows.js | 1 + src/renderer/index-preload.js | 10 +- src/utils/types.d.ts | 5 + 7 files changed, 2161 insertions(+), 64 deletions(-) diff --git a/index.js b/index.js index 08e94565..ff49010f 100755 --- a/index.js +++ b/index.js @@ -24,8 +24,10 @@ var argv = minimist(process.argv.slice(2), { default: { port: 5000, datadir: path.join(userDataPath, 'kappa.db'), + mapsdir: path.join(userDataPath, 'background-maps'), tileport: 5005, - mapPrinterPort: 5200 + mapPrinterPort: 5200, + mapServerPort: 5300 }, boolean: ['headless', 'debug'], alias: { @@ -88,20 +90,28 @@ if (!gotTheLock) { try { // Ensure we have open ports. Small chance the ports could get taken by // another app before we finish loading, but hopefully unlikely! - const [mapeoServerPort, tileServerPort, mapPrinterPort] = await getPorts([ + const [ + mapeoServerPort, + tileServerPort, + mapPrinterPort, + mapServerPort + ] = await getPorts([ argv.port, argv.tileport, - argv.mapPrinterPort + argv.mapPrinterPort, + argv.mapServerPort ]) - const { headless, debug, datadir } = argv + const { headless, debug, datadir, mapsdir } = argv logger.timedPromise( startApp({ mapeoServerPort, tileServerPort, mapPrinterPort, + mapServerPort, headless, debug, - datadir + datadir, + mapsdir }), 'Started Mapeo' ) diff --git a/package-lock.json b/package-lock.json index b3f8d251..68ebabe1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,6 +19,11 @@ "tslib": "^1.9.0" } }, + "@assemblyscript/loader": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/@assemblyscript/loader/-/loader-0.10.1.tgz", + "integrity": "sha512-H71nDOOL8Y7kWRLqf6Sums+01Q5msqBW2KhDUTemh1tvY04eSkSXrK0uj/4mmY0Xr16/3zyZmsrxN7CKuRbNRg==" + }, "@babel/cli": { "version": "7.17.10", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.17.10.tgz", @@ -1821,6 +1826,81 @@ "integrity": "sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA==", "dev": true }, + "@fastify/ajv-compiler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@fastify/ajv-compiler/-/ajv-compiler-1.1.0.tgz", + "integrity": "sha512-gvCOUNpXsWrIQ3A4aXCLIdblL0tDq42BG/2Xw7oxbil9h11uow10ztS2GuFazNBfjbrsZ5nl+nPl5jDSjj5TSg==", + "requires": { + "ajv": "^6.12.6" + } + }, + "@fastify/error": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@fastify/error/-/error-2.0.0.tgz", + "integrity": "sha512-wI3fpfDT0t7p8E6dA2eTECzzOd+bZsZCJ2Hcv+Onn2b7ZwK3RwD27uW2QDaMtQhAfWQQP+WNK7nKf0twLsBf9w==" + }, + "@fastify/static": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/@fastify/static/-/static-5.0.2.tgz", + "integrity": "sha512-HvyXZ5a7hUHoSBRq9jKUuKIUCkHMkCDcmiAeEmixXlGOx8pEWx3NYOIaiivcjWa6/NLvfdUT+t/jzfVQ2PA7Gw==", + "requires": { + "content-disposition": "^0.5.3", + "encoding-negotiator": "^2.0.1", + "fastify-plugin": "^3.0.0", + "glob": "^7.1.4", + "p-limit": "^3.1.0", + "readable-stream": "^3.4.0", + "send": "^0.17.1" + }, + "dependencies": { + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, + "@fastify/swagger": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@fastify/swagger/-/swagger-6.1.1.tgz", + "integrity": "sha512-i+6UzvJf9tWT9+Cg+Tb/sM/+LMGpc2yGh+dvZYM2jT5p71PVK7YiEac93mJpLW9CH3RDOXV70PFey5pWpL6SJA==", + "requires": { + "@fastify/static": "^5.0.0", + "fastify-plugin": "^3.0.0", + "js-yaml": "^4.0.0", + "json-schema-resolver": "^1.3.0", + "openapi-types": "^10.0.0", + "rfdc": "^1.3.0" + }, + "dependencies": { + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "requires": { + "argparse": "^2.0.1" + } + } + } + }, "@formatjs/intl-displaynames": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@formatjs/intl-displaynames/-/intl-displaynames-1.2.0.tgz", @@ -1892,6 +1972,12 @@ "prop-types": "^15.5.10" } }, + "@gar/promisify": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/@gar/promisify/-/promisify-1.1.3.tgz", + "integrity": "sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==", + "dev": true + }, "@glimmer/interfaces": { "version": "0.41.4", "resolved": "https://registry.npmjs.org/@glimmer/interfaces/-/interfaces-0.41.4.tgz", @@ -2338,6 +2424,11 @@ "resolved": "https://registry.npmjs.org/@mapbox/sexagesimal/-/sexagesimal-1.2.0.tgz", "integrity": "sha512-+C3+Azc4ObH2qmDYvg9MC+vvlGVfwB1BZNX8jt4XehJjfDGXwlElqJ6PS9BtgLHSjdinEoZTNanTG/WTc+dpRA==" }, + "@mapbox/sphericalmercator": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@mapbox/sphericalmercator/-/sphericalmercator-1.2.0.tgz", + "integrity": "sha512-ZTOuuwGuMOJN+HEmG/68bSEw15HHaMWmQ5gdTsWdWsjDe56K1kGvLOK6bOSC8gWgIvEO0w6un/2Gvv1q5hJSkQ==" + }, "@mapbox/tiny-sdf": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.1.1.tgz", @@ -2533,6 +2624,203 @@ } } }, + "@mapeo/map-server": { + "version": "1.0.0-alpha.11", + "resolved": "https://registry.npmjs.org/@mapeo/map-server/-/map-server-1.0.0-alpha.11.tgz", + "integrity": "sha512-TvsdSjiR9CmyLwNvbmHwlACjXER5zeDmINNMkpGhJHX/5BxQ9siBwd7DnJtRGYNQ9/JKZk4ZPh6CqTg55+XIdw==", + "requires": { + "@fastify/error": "^2.0.0", + "@fastify/static": "^5.0.2", + "@fastify/swagger": "^6.1.1", + "@mapbox/sphericalmercator": "^1.2.0", + "@mapbox/whoots-js": "^3.1.0", + "@maplibre/maplibre-gl-style-spec": "^16.0.0", + "@sinclair/typebox": "^0.24.51", + "@types/readable-stream": "^2.3.15", + "ajv": "^8.11.0", + "base32.js": "^0.1.0", + "better-sqlite3": "^7.6.2", + "fastify": "^3.29.0", + "fastify-oas": "^3.0.8", + "fastify-plugin": "^3.0.1", + "got": "^11.8.5", + "is-url": "^1.2.4", + "make-promises-safe": "^5.1.0", + "mem": "^8.1.1", + "piscina": "^3.2.0", + "quick-lru": "^5.1.1", + "readable-stream": "^3.6.0", + "uuid": "^8.3.2" + }, + "dependencies": { + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==" + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==" + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==" + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==" + }, + "mem": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/mem/-/mem-8.1.1.tgz", + "integrity": "sha512-qFCFUDs7U3b8mBDPyz5EToEKoAkgCzqquIgi9nkkR9bixxOVOre+09lbuH7+9Kn2NFpm56M3GUWVbU2hQgdACA==", + "requires": { + "map-age-cleaner": "^0.1.3", + "mimic-fn": "^3.1.0" + } + }, + "mimic-fn": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-3.1.0.tgz", + "integrity": "sha512-Ysbi9uYW9hFyfrThdDEQuykN4Ey6BuwPD2kpI5ES/nFTDn/98yxYNLZJcgUAKPT/mcrLLKaGzJR9YVxJrIdASQ==" + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==" + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" + } + } + }, "@mapeo/settings": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/@mapeo/settings/-/settings-2.1.3.tgz", @@ -2543,6 +2831,20 @@ "tar-fs": "^1.16.3" } }, + "@maplibre/maplibre-gl-style-spec": { + "version": "16.0.0", + "resolved": "https://registry.npmjs.org/@maplibre/maplibre-gl-style-spec/-/maplibre-gl-style-spec-16.0.0.tgz", + "integrity": "sha512-dmQpNTNCIk+gak64KbugZ3wvInYk6fS+PW6em2LIgYY/kTbraLYMt/McqDM/AKgpGpJTQuMHAKksO4/d+EUwOw==", + "requires": { + "@mapbox/jsonlint-lines-primitives": "~2.0.2", + "@mapbox/unitbezier": "^0.0.0", + "csscolorparser": "~1.0.2", + "json-stringify-pretty-compact": "^2.0.0", + "minimist": "^1.2.5", + "rw": "^1.3.3", + "sort-object": "^0.3.2" + } + }, "@material-ui/core": { "version": "4.11.0", "resolved": "https://registry.npmjs.org/@material-ui/core/-/core-4.11.0.tgz", @@ -2787,6 +3089,42 @@ "fastq": "^1.6.0" } }, + "@npmcli/fs": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/@npmcli/fs/-/fs-2.1.2.tgz", + "integrity": "sha512-yOJKRvohFOaLqipNtwYB9WugyZKhC/DZC4VYPmpaCzDBrA8YpK3qHZ8/HGscMnE4GqbkLNuVcCnxkeQEdGt6LQ==", + "dev": true, + "requires": { + "@gar/promisify": "^1.1.3", + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "@npmcli/move-file": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.0.1.tgz", @@ -3497,6 +3835,11 @@ "integrity": "sha512-hBzjQYMaSd/IFiFW3XEs4V+Cjklv65XSvtS1nCCsX07J5PjQWXR52AL+fZfJgw52RvgyrVFVRcT611/UffBmhg==", "dev": true }, + "@sinclair/typebox": { + "version": "0.24.51", + "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.24.51.tgz", + "integrity": "sha512-1P1OROm/rdubP5aFDSZQILU0vrLCJ4fvHt6EoqHEM+2D/G5MK3bIaymUKLit8Js9gbns5UyJnkP/TZROLw4tUA==" + }, "@sindresorhus/fnv1a": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@sindresorhus/fnv1a/-/fnv1a-1.2.0.tgz", @@ -5213,6 +5556,20 @@ "defer-to-connect": "^1.0.1" } }, + "@tanstack/query-core": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@tanstack/query-core/-/query-core-4.18.0.tgz", + "integrity": "sha512-PP4mG8MD08sq64RZCqMfXMYfaj7+Oulwg7xZ/fJoEOdTZNcPIgaOkHajZvUBsNLbi/0ViMvJB4cFkL2Jg2WPbw==" + }, + "@tanstack/react-query": { + "version": "4.18.0", + "resolved": "https://registry.npmjs.org/@tanstack/react-query/-/react-query-4.18.0.tgz", + "integrity": "sha512-s1kdbGMdVcfUIllzsHUqVUdktBT5uuIRgnvrqFNLjl9TSOXEoBSDrhjsGjao0INQZv8cMpQlgOh3YH9YtN6cKw==", + "requires": { + "@tanstack/query-core": "4.18.0", + "use-sync-external-store": "^1.2.0" + } + }, "@tootallnate/once": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/@tootallnate/once/-/once-2.0.0.tgz", @@ -5331,7 +5688,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/@types/cacheable-request/-/cacheable-request-6.0.1.tgz", "integrity": "sha512-ykFq2zmBGOCbpIXtoVbz4SKY5QriWPh3AjyU4G74RYbtt5yOc5OfaY75ftjg7mikMOla1CTGpX3lLbuJh8DTrQ==", - "dev": true, "requires": { "@types/http-cache-semantics": "*", "@types/keyv": "*", @@ -5445,8 +5801,7 @@ "@types/http-cache-semantics": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/http-cache-semantics/-/http-cache-semantics-4.0.0.tgz", - "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==", - "dev": true + "integrity": "sha512-c3Xy026kOF7QOTn00hbIllV1dLR9hG9NkSrLQgCVs8NF6sBU+VGWjD3wLPhmh1TYAc7ugCFsvHYMN4VcBN1U1A==" }, "@types/invariant": { "version": "2.2.31", @@ -5503,7 +5858,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/@types/keyv/-/keyv-3.1.1.tgz", "integrity": "sha512-MPtoySlAZQ37VoLaPcTHCu1RWJ4llDkULYZIzOYxlhxBqYPB0RsRlmMU0R6tahtFe27mIdkHV+551ZWV4PLmVw==", - "dev": true, "requires": { "@types/node": "*" } @@ -5664,6 +6018,15 @@ "@types/react": "*" } }, + "@types/readable-stream": { + "version": "2.3.15", + "resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-2.3.15.tgz", + "integrity": "sha512-oM5JSKQCcICF1wvGgmecmHldZ48OZamtMxcGGVICOJA8o8cahXC1zEVAif8iwoc5j8etxFaRFnf095+CDsuoFQ==", + "requires": { + "@types/node": "*", + "safe-buffer": "~5.1.1" + } + }, "@types/resolve": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-0.0.8.tgz", @@ -5677,7 +6040,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/@types/responselike/-/responselike-1.0.0.tgz", "integrity": "sha512-85Y2BjiufFzaMIlvJDvTTB8Fxl2xfLo4HgmHzVBz08w4wDePCTjYw66PdrolO0kzli3yam/YCgRufyo1DdQVTA==", - "dev": true, "requires": { "@types/node": "*" } @@ -5715,6 +6077,11 @@ "@types/geojson": "*" } }, + "@types/swagger-schema-official": { + "version": "2.0.22", + "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.22.tgz", + "integrity": "sha512-7yQiX6MWSFSvc/1wW5smJMZTZ4fHOd+hqLr3qr/HONDxHEa2bnYAsOcGBOEqFIjd4yetwMOdEDdeW+udRAQnHA==" + }, "@types/tapable": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.8.tgz", @@ -6125,6 +6492,11 @@ "xtend": "~4.0.0" } }, + "abstract-logging": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/abstract-logging/-/abstract-logging-2.0.1.tgz", + "integrity": "sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==" + }, "accepts": { "version": "1.3.7", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", @@ -6252,6 +6624,17 @@ "debug": "4" } }, + "agentkeepalive": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-4.2.1.tgz", + "integrity": "sha512-Zn4cw2NEqd+9fiSVWMscnjyQ1a8Yfoc5oBajLeo5w+YBHgDUcEBY2hS4YpTz6iN5f/2zQiktcuM6tS8x1p9dpA==", + "dev": true, + "requires": { + "debug": "^4.1.0", + "depd": "^1.1.2", + "humanize-ms": "^1.2.1" + } + }, "aggregate-error": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.0.1.tgz", @@ -6797,6 +7180,11 @@ "integrity": "sha1-OBh+wt6nV3//Az/8sSFyaS/24Rg=", "dev": true }, + "app-root-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", + "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==" + }, "aproba": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", @@ -6855,6 +7243,11 @@ } } }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, "are-we-there-yet": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", @@ -6869,7 +7262,6 @@ "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, "requires": { "sprintf-js": "~1.0.2" }, @@ -6877,8 +7269,7 @@ "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", - "dev": true + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" } } }, @@ -7283,6 +7674,11 @@ "resolved": "https://registry.npmjs.org/atomic-batcher/-/atomic-batcher-1.0.2.tgz", "integrity": "sha1-0WkB0QzOxZUWwZe5zNiTBom4E7Q=" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, "auto-bind": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-1.2.1.tgz", @@ -7311,6 +7707,17 @@ } } }, + "avvio": { + "version": "7.2.5", + "resolved": "https://registry.npmjs.org/avvio/-/avvio-7.2.5.tgz", + "integrity": "sha512-AOhBxyLVdpOad3TujtC9kL/9r3HnTkxwQ5ggOsYrvvZP1cCFvzHWJd5XxZDFuTn+IN8vkKSG5SEJrd27vCSbeA==", + "requires": { + "archy": "^1.0.0", + "debug": "^4.0.0", + "fastq": "^1.6.1", + "queue-microtask": "^1.1.2" + } + }, "aws-sign2": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", @@ -8073,6 +8480,15 @@ "safe-buffer": "^5.1.1" } }, + "better-sqlite3": { + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-7.6.2.tgz", + "integrity": "sha512-S5zIU1Hink2AH4xPsN0W43T1/AJ5jrPh7Oy07ocuW/AKYYY02GWzz9NH0nbSMn/gw6fDZ5jZ1QsHt1BXAwJ6Lg==", + "requires": { + "bindings": "^1.5.0", + "prebuild-install": "^7.1.0" + } + }, "bfj": { "version": "6.1.2", "resolved": "https://registry.npmjs.org/bfj/-/bfj-6.1.2.tgz", @@ -8116,7 +8532,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, "requires": { "file-uri-to-path": "1.0.0" } @@ -9839,6 +10254,39 @@ "tiny-emitter": "^2.0.0" } }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "clone": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", @@ -9858,7 +10306,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/clone-response/-/clone-response-1.0.2.tgz", "integrity": "sha1-0dyXOSAxTfZ/vrlCI7TuNQI56Ws=", - "dev": true, "requires": { "mimic-response": "^1.0.0" } @@ -10412,7 +10859,6 @@ "version": "0.5.3", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", - "dev": true, "requires": { "safe-buffer": "5.1.2" } @@ -12314,8 +12760,7 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=", - "dev": true + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, "dependency-check": { "version": "3.4.1", @@ -12386,8 +12831,7 @@ "destroy": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", - "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", - "dev": true + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" }, "detect-file": { "version": "1.0.0", @@ -14166,6 +14610,384 @@ } } }, + "electron-rebuild": { + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/electron-rebuild/-/electron-rebuild-3.2.9.tgz", + "integrity": "sha512-FkEZNFViUem3P0RLYbZkUjC8LUFIK+wKq09GHoOITSJjfDAVQv964hwaNseTTWt58sITQX3/5fHNYcTefqaCWw==", + "dev": true, + "requires": { + "@malept/cross-spawn-promise": "^2.0.0", + "chalk": "^4.0.0", + "debug": "^4.1.1", + "detect-libc": "^2.0.1", + "fs-extra": "^10.0.0", + "got": "^11.7.0", + "lzma-native": "^8.0.5", + "node-abi": "^3.0.0", + "node-api-version": "^0.1.4", + "node-gyp": "^9.0.0", + "ora": "^5.1.0", + "semver": "^7.3.5", + "tar": "^6.0.5", + "yargs": "^17.0.1" + }, + "dependencies": { + "@malept/cross-spawn-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@malept/cross-spawn-promise/-/cross-spawn-promise-2.0.0.tgz", + "integrity": "sha512-1DpKU0Z5ThltBwjNySMC14g0CkbyhCaz9FkhxqNsZI6uAPJXFS8cMXlBKo26FJ8ZuW6S9GCMcR9IO5k2X5/9Fg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.1" + } + }, + "@sindresorhus/is": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-4.6.0.tgz", + "integrity": "sha512-t09vSN3MdfsyCHoFcTRCH/iUtG7OJ0CsjzB8cjAmKc/va/kIgeDI/TxsigdncE/4be734m0cvIYwNaV4i2XqAw==", + "dev": true + }, + "@szmarczak/http-timer": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/@szmarczak/http-timer/-/http-timer-4.0.6.tgz", + "integrity": "sha512-4BAffykYOgO+5nzBWYwE3W90sBgLJoUPRWWcL8wlyiM8IB8ipJz3UMJ9KXQd1RKQXpKp8Tutn80HZtWsu2u76w==", + "dev": true, + "requires": { + "defer-to-connect": "^2.0.0" + } + }, + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "dev": true + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "dev": true, + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "cacheable-lookup": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/cacheable-lookup/-/cacheable-lookup-5.0.4.tgz", + "integrity": "sha512-2/kNscPhpcxrOigMZzbiWF7dz8ilhb/nIHU3EyZiXWXpeq/au8qJ8VhdftMkty3n7Gj6HIGalQG8oiBNB3AJgA==", + "dev": true + }, + "cacheable-request": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/cacheable-request/-/cacheable-request-7.0.2.tgz", + "integrity": "sha512-pouW8/FmiPQbuGpkXQ9BAPv/Mo5xDGANgSNXzTzJ8DrKGuXOssM4wIQRjfanNRh3Yu5cfYPvcorqbhg2KIJtew==", + "dev": true, + "requires": { + "clone-response": "^1.0.2", + "get-stream": "^5.1.0", + "http-cache-semantics": "^4.0.0", + "keyv": "^4.0.0", + "lowercase-keys": "^2.0.0", + "normalize-url": "^6.0.1", + "responselike": "^2.0.0" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "dev": true, + "requires": { + "mimic-response": "^3.1.0" + } + }, + "defer-to-connect": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/defer-to-connect/-/defer-to-connect-2.0.1.tgz", + "integrity": "sha512-4tvttepXG1VaYGrRibk5EwJd1t4udunSOVMdLSAL6mId1ix438oPwPZMALY41FCijukO1L0twNcGsdzS7dHgDg==", + "dev": true + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==", + "dev": true + }, + "fs-extra": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-10.1.0.tgz", + "integrity": "sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "got": { + "version": "11.8.5", + "resolved": "https://registry.npmjs.org/got/-/got-11.8.5.tgz", + "integrity": "sha512-o0Je4NvQObAuZPHLFoRSkdG2lTgtcynqymzg2Vupdx6PorhaT5MCbIyXG6d4D94kk8ZG57QeosgdiqfJWhEhlQ==", + "dev": true, + "requires": { + "@sindresorhus/is": "^4.0.0", + "@szmarczak/http-timer": "^4.0.5", + "@types/cacheable-request": "^6.0.1", + "@types/responselike": "^1.0.0", + "cacheable-lookup": "^5.0.3", + "cacheable-request": "^7.0.2", + "decompress-response": "^6.0.0", + "http2-wrapper": "^1.0.0-beta.5.2", + "lowercase-keys": "^2.0.0", + "p-cancelable": "^2.0.0", + "responselike": "^2.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.6", + "universalify": "^2.0.0" + } + }, + "keyv": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.2.tgz", + "integrity": "sha512-5MHbFaKn8cNSmVW7BYnijeAVlE4cYA/SVkifVgrh7yotnfhKmjuXpDKjrABLnT0SfHWV21P8ow07OGfRrNDg8g==", + "dev": true, + "requires": { + "json-buffer": "3.0.1" + } + }, + "lowercase-keys": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-2.0.0.tgz", + "integrity": "sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", + "dev": true + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "normalize-url": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", + "integrity": "sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==", + "dev": true + }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "dev": true, + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, + "p-cancelable": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/p-cancelable/-/p-cancelable-2.1.1.tgz", + "integrity": "sha512-BZOr3nRQHOntUjTrH8+Lh54smKHoHyur8We1V8DSMVrl5A2malOOwuJRnKRDjSnkoeBh4at6BwEnb5I7Jl31wg==", + "dev": true + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "dev": true, + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "responselike": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/responselike/-/responselike-2.0.1.tgz", + "integrity": "sha512-4gl03wn3hj1HP3yzgdI7d3lCkF95F21Pz4BPGvKHinyQzALR5CapwC8yIi0Rh58DEMQ/SguC03wFj2k0M/mHhw==", + "dev": true, + "requires": { + "lowercase-keys": "^2.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tar": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "universalify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.0.tgz", + "integrity": "sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==", + "dev": true + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "electron-timber": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/electron-timber/-/electron-timber-0.5.1.tgz", @@ -14370,8 +15192,7 @@ "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=", - "dev": true + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" }, "encoding": { "version": "0.1.13", @@ -14402,6 +15223,11 @@ "level-errors": "^2.0.0" } }, + "encoding-negotiator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/encoding-negotiator/-/encoding-negotiator-2.0.1.tgz", + "integrity": "sha512-GSK7qphNR4iPcejfAlZxKDoz3xMhnspwImK+Af5WhePS9jUpK/Oh7rUdyENWu+9rgDflOCTmAojBsgsvM8neAQ==" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -14452,6 +15278,12 @@ "through": "~2.3.4" } }, + "err-code": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/err-code/-/err-code-2.0.3.tgz", + "integrity": "sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==", + "dev": true + }, "errno": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", @@ -14650,8 +15482,7 @@ "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", - "dev": true + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" }, "escape-string-regexp": { "version": "1.0.5", @@ -15404,8 +16235,7 @@ "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", - "dev": true + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" }, "event-emitter": { "version": "0.3.5", @@ -15447,6 +16277,11 @@ } } }, + "eventemitter-asyncresource": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eventemitter-asyncresource/-/eventemitter-asyncresource-1.0.0.tgz", + "integrity": "sha512-39F7TBIV0G7gTelxwbEqnwhp90eqCPON1k0NwNfwhgKn4Co4ybUbj2pECcXT0B3ztRKZ7Pw1JujUUgmQJHcVAQ==" + }, "eventemitter3": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.0.tgz", @@ -15628,6 +16463,11 @@ } } }, + "expand-template": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", + "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==" + }, "expand-tilde": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", @@ -15969,6 +16809,11 @@ "count-trailing-zeros": "^1.0.1" } }, + "fast-decode-uri-component": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fast-decode-uri-component/-/fast-decode-uri-component-1.0.1.tgz", + "integrity": "sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==" + }, "fast-deep-equal": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz", @@ -16004,22 +16849,138 @@ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, + "fast-json-stringify": { + "version": "2.7.13", + "resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-2.7.13.tgz", + "integrity": "sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==", + "requires": { + "ajv": "^6.11.0", + "deepmerge": "^4.2.2", + "rfdc": "^1.2.0", + "string-similarity": "^4.0.1" + } + }, "fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", "dev": true }, + "fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + }, "fast-safe-stringify": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-1.2.3.tgz", "integrity": "sha512-QJYT/i0QYoiZBQ71ivxdyTqkwKkQ0oxACXHYxH2zYHJEgzi2LsbjgvtzTbLi1SZcF190Db2YP7I7eTsU2egOlw==" }, + "fastify": { + "version": "3.29.4", + "resolved": "https://registry.npmjs.org/fastify/-/fastify-3.29.4.tgz", + "integrity": "sha512-BEyKidZQvscNaiF1BLh+YLE7AzHH03NexhPzrwZP6KBQ+jG2czdgq72X+RFB5rK9hbqdaafVb5yiWN+hCvHfYg==", + "requires": { + "@fastify/ajv-compiler": "^1.0.0", + "@fastify/error": "^2.0.0", + "abstract-logging": "^2.0.0", + "avvio": "^7.1.2", + "content-type": "^1.0.4", + "fast-json-stringify": "^2.5.2", + "find-my-way": "^4.5.0", + "flatstr": "^1.0.12", + "light-my-request": "^4.2.0", + "pino": "^6.13.0", + "process-warning": "^1.0.0", + "proxy-addr": "^2.0.7", + "rfdc": "^1.1.4", + "secure-json-parse": "^2.0.0", + "semver": "^7.3.2", + "tiny-lru": "^8.0.1" + }, + "dependencies": { + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + } + } + }, + "fastify-oas": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/fastify-oas/-/fastify-oas-3.0.8.tgz", + "integrity": "sha512-pI8tp64/3iGE7E1WIF55GzntvO/esoRcwRelVNFTodcM9F6yfY5e/TWNmN4kLQQO/Ki4/3hAtaPvyr25nToXeg==", + "requires": { + "@types/swagger-schema-official": "^2.0.21", + "app-root-path": "^3.0.0", + "fastify-plugin": "^3.0.0", + "fastify-static": "^3.3.0", + "js-yaml": "^3.14.0", + "openapi3-ts": "^1.4.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } + } + }, + "fastify-plugin": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/fastify-plugin/-/fastify-plugin-3.0.1.tgz", + "integrity": "sha512-qKcDXmuZadJqdTm6vlCqioEbyewF60b/0LOFCcYN1B6BIZGlYJumWWOYs70SFYLDAH4YqdE1cxH/RKMG7rFxgA==" + }, + "fastify-static": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/fastify-static/-/fastify-static-3.4.0.tgz", + "integrity": "sha512-5y9xTNiPTj6/jDwzH6CqBIcI3/yZtocUiHoLud2NYPfHSOLlS6eW6DTheiU8b9WWlfmHfqOjwFFBdhiH1+nBhg==", + "requires": { + "fastify-plugin": "^3.0.0", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "send": "^0.17.1" + }, + "dependencies": { + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "fastq": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", - "dev": true, "requires": { "reusify": "^1.0.4" } @@ -16224,8 +17185,7 @@ "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true + "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==" }, "filelist": { "version": "1.0.2", @@ -16330,6 +17290,24 @@ } } }, + "find-my-way": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/find-my-way/-/find-my-way-4.5.1.tgz", + "integrity": "sha512-kE0u7sGoUFbMXcOG/xpkmz4sRLCklERnBcg7Ftuu1iAxsfEt2S46RLJ3Sq7vshsEy2wJT2hZxE58XZK27qa8kg==", + "requires": { + "fast-decode-uri-component": "^1.0.1", + "fast-deep-equal": "^3.1.3", + "safe-regex2": "^2.0.0", + "semver-store": "^0.3.0" + }, + "dependencies": { + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" + } + } + }, "find-nearest-file": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/find-nearest-file/-/find-nearest-file-1.1.0.tgz", @@ -17016,8 +17994,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", - "dev": true + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" }, "from": { "version": "0.1.7", @@ -17859,6 +18836,12 @@ "node-source-walk": "^4.0.0" } }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, "get-folder-size": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/get-folder-size/-/get-folder-size-2.0.1.tgz", @@ -18214,6 +19197,11 @@ "ini": "^1.3.2" } }, + "github-from-package": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" + }, "gl-fbo": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/gl-fbo/-/gl-fbo-2.0.5.tgz", @@ -19099,6 +20087,28 @@ "space-separated-tokens": "^1.0.0" } }, + "hdr-histogram-js": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hdr-histogram-js/-/hdr-histogram-js-2.0.3.tgz", + "integrity": "sha512-Hkn78wwzWHNCp2uarhzQ2SGFLU3JY8SBDDd3TAABK4fc30wm+MuPOrg5QVFVfkKOQd6Bfz3ukJEI+q9sXEkK1g==", + "requires": { + "@assemblyscript/loader": "^0.10.1", + "base64-js": "^1.2.0", + "pako": "^1.0.3" + }, + "dependencies": { + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + } + } + }, + "hdr-histogram-percentiles-obj": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/hdr-histogram-percentiles-obj/-/hdr-histogram-percentiles-obj-3.0.0.tgz", + "integrity": "sha512-7kIufnBqdsBGcSZLPJwqHT3yhk1QTsSlFsVD3kx5ixH/AlgBs9yM1q6DPhXZ8f8gtdqgh7N7/5btRLpQsS2gHw==" + }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", @@ -19366,14 +20376,12 @@ "http-cache-semantics": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz", - "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==", - "dev": true + "integrity": "sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ==" }, "http-errors": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -19385,8 +20393,7 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", - "dev": true + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" } } }, @@ -19417,6 +20424,15 @@ "sshpk": "^1.7.0" } }, + "http2-wrapper": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/http2-wrapper/-/http2-wrapper-1.0.3.tgz", + "integrity": "sha512-V+23sDMr12Wnz7iTcDeJr3O6AIxlnvT/bmaAAAP/Xda35C90p9599p0F1eHR/N1KILWSoWVAiOMFjBBXaXSMxg==", + "requires": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.0.0" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -19445,6 +20461,15 @@ "integrity": "sha512-B3udnqisaDeRsvUSb+5n2hjxhABI9jotB+i1IEhgHhguTeM5LxIUKoVIu7UpeyaPOygr/Fnv7UhOi45kYYG+tg==", "dev": true }, + "humanize-ms": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", + "integrity": "sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==", + "dev": true, + "requires": { + "ms": "^2.0.0" + } + }, "husky": { "version": "7.0.2", "resolved": "https://registry.npmjs.org/husky/-/husky-7.0.2.tgz", @@ -20270,6 +21295,18 @@ "resolved": "https://registry.npmjs.org/is-in-browser/-/is-in-browser-1.1.3.tgz", "integrity": "sha1-Vv9NtoOgeMYILrldrX3GLh0E+DU=" }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "dev": true + }, + "is-lambda": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", + "integrity": "sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==", + "dev": true + }, "is-map": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.1.tgz", @@ -22214,6 +23251,16 @@ "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", "dev": true }, + "json-schema-resolver": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/json-schema-resolver/-/json-schema-resolver-1.3.0.tgz", + "integrity": "sha512-EX7W1r8aZ/T3j8GbbBxPXi60bnsELfT90OiA1QrbGMvwzVSbyMNOAzvMFcFb8m7gKCXZLJpGe+cJOvWgoFl29A==", + "requires": { + "debug": "^4.1.1", + "rfdc": "^1.1.4", + "uri-js": "^4.2.2" + } + }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -22239,6 +23286,11 @@ "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, + "json-stringify-pretty-compact": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-2.0.0.tgz", + "integrity": "sha512-WRitRfs6BGq4q8gTgOy4ek7iPFXjbra0H3PmDLKm2xnZ+Gh1HUhiKGgCZkSPNULlP7mvfu6FV/mOLhCarspADQ==" + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -23028,6 +24080,40 @@ "immediate": "~3.0.5" } }, + "light-my-request": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/light-my-request/-/light-my-request-4.12.0.tgz", + "integrity": "sha512-0y+9VIfJEsPVzK5ArSIJ8Dkxp8QMP7/aCuxCUtG/tr9a2NoOf/snATE/OUc05XUplJCEnRh6gTkH7xh9POt1DQ==", + "requires": { + "ajv": "^8.1.0", + "cookie": "^0.5.0", + "process-warning": "^1.0.0", + "set-cookie-parser": "^2.4.1" + }, + "dependencies": { + "ajv": { + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.2.tgz", + "integrity": "sha512-E4bfmKAhGiSTvMfL1Myyycaub+cUEU2/IvpylXkUu7CHBkBj1f/ikdzbD7YQ6FKUbixDxeYvB/xY4fvyroDlQg==", + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "cookie": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" + } + } + }, "lineclip": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/lineclip/-/lineclip-1.1.5.tgz", @@ -24059,6 +25145,42 @@ "resolved": "https://registry.npmjs.org/lz-string/-/lz-string-1.4.4.tgz", "integrity": "sha1-wNjq82BZ9wV5bh40SBHPTEmNOiY=" }, + "lzma-native": { + "version": "8.0.6", + "resolved": "https://registry.npmjs.org/lzma-native/-/lzma-native-8.0.6.tgz", + "integrity": "sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==", + "dev": true, + "requires": { + "node-addon-api": "^3.1.0", + "node-gyp-build": "^4.2.1", + "readable-stream": "^3.6.0" + }, + "dependencies": { + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "dev": true + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "dev": true + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + } + } + }, "macos-release": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.4.1.tgz", @@ -24096,6 +25218,233 @@ "resolved": "https://registry.npmjs.org/make-event-props/-/make-event-props-1.2.0.tgz", "integrity": "sha512-BmWFkm/jZzVH9A0tEBdkjAARUz/eha+5IRyfOndeSMKRadkgR5DawoBHoRwLxkYmjJOI5bHkXKpaZocxj+dKgg==" }, + "make-fetch-happen": { + "version": "10.2.1", + "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-10.2.1.tgz", + "integrity": "sha512-NgOPbRiaQM10DYXvN3/hhGVI2M5MtITFryzBGxHM5p4wnFxsVCbxkrBrDsk+EZ5OB4jEOT7AjDxtdF+KVEFT7w==", + "dev": true, + "requires": { + "agentkeepalive": "^4.2.1", + "cacache": "^16.1.0", + "http-cache-semantics": "^4.1.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-lambda": "^1.0.1", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-fetch": "^2.0.3", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "negotiator": "^0.6.3", + "promise-retry": "^2.0.1", + "socks-proxy-agent": "^7.0.0", + "ssri": "^9.0.0" + }, + "dependencies": { + "@npmcli/move-file": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-2.0.1.tgz", + "integrity": "sha512-mJd2Z5TjYWq/ttPLLGqArdtnC74J6bOzg4rMDnN+p1xTacZ2yPRCk2y0oSWQtygLR9YVQXgOcONrwtnk3JupxQ==", + "dev": true, + "requires": { + "mkdirp": "^1.0.4", + "rimraf": "^3.0.2" + } + }, + "cacache": { + "version": "16.1.3", + "resolved": "https://registry.npmjs.org/cacache/-/cacache-16.1.3.tgz", + "integrity": "sha512-/+Emcj9DAXxX4cwlLmRI9c166RuL3w30zp4R7Joiv2cQTtTtA+jeuCAjH3ZlGnYS3tKENSrKhAzVVP9GVyzeYQ==", + "dev": true, + "requires": { + "@npmcli/fs": "^2.1.0", + "@npmcli/move-file": "^2.0.0", + "chownr": "^2.0.0", + "fs-minipass": "^2.1.0", + "glob": "^8.0.1", + "infer-owner": "^1.0.4", + "lru-cache": "^7.7.1", + "minipass": "^3.1.6", + "minipass-collect": "^1.0.2", + "minipass-flush": "^1.0.5", + "minipass-pipeline": "^1.2.4", + "mkdirp": "^1.0.4", + "p-map": "^4.0.0", + "promise-inflight": "^1.0.1", + "rimraf": "^3.0.2", + "ssri": "^9.0.0", + "tar": "^6.1.11", + "unique-filename": "^2.0.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "glob": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.0.3.tgz", + "integrity": "sha512-ull455NHSHI/Y1FqGaaYFaLGkNMMJbavMrEGFXG/PGrg6y7sutWHUHrz6gy6WEBH6akM1M414dWKCNs+IhKdiQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^5.0.1", + "once": "^1.3.0" + }, + "dependencies": { + "brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0" + } + }, + "minimatch": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", + "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "dev": true, + "requires": { + "brace-expansion": "^2.0.1" + } + } + } + }, + "lru-cache": { + "version": "7.14.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.14.1.tgz", + "integrity": "sha512-ysxwsnTKdAx96aTRdhDOCQfDgbHnt8SK0KY8SEjO0wHinhWOFTESbjVCMPbU1uGXg/ch4lifqx0wfjOawU2+WA==", + "dev": true + }, + "minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "negotiator": { + "version": "0.6.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", + "dev": true + }, + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + }, + "dependencies": { + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + } + } + }, + "ssri": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/ssri/-/ssri-9.0.1.tgz", + "integrity": "sha512-o57Wcn66jMQvfHG1FlYbWeZWW/dHZhJXjpIcTfXldXEk5nz5lStPo3mK0OJQfGR3RbZUlbISexbljkJzuEj/8Q==", + "dev": true, + "requires": { + "minipass": "^3.1.1" + } + }, + "tar": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "unique-filename": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-2.0.1.tgz", + "integrity": "sha512-ODWHtkkdx3IAR+veKxFV+VBkUMcN+FaqzUUd7IZzt+0zhDZFPFxhlqwPF3YQvMHx1TD0tdgYl+kuPnJ8E6ql7A==", + "dev": true, + "requires": { + "unique-slug": "^3.0.0" + } + }, + "unique-slug": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-3.0.0.tgz", + "integrity": "sha512-8EyMynh679x/0gqE9fT9oilG+qEt+ibFyqjuVTsZn1+CMxH+XLlpvr2UZx4nVcCwTpx81nICr2JQFkM+HPLq4w==", + "dev": true, + "requires": { + "imurmurhash": "^0.1.4" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, + "make-promises-safe": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/make-promises-safe/-/make-promises-safe-5.1.0.tgz", + "integrity": "sha512-AfdZ49rtyhQR/6cqVKGoH7y4ql7XkS5HJI1lZm0/5N6CQosy1eYbBJ/qbhkKHzo17UH7M918Bysf6XB9f3kS1g==" + }, "makeerror": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.11.tgz", @@ -24109,7 +25458,6 @@ "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", - "dev": true, "requires": { "p-defer": "^1.0.0" }, @@ -24117,8 +25465,7 @@ "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", - "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", - "dev": true + "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=" } } }, @@ -24692,8 +26039,7 @@ "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", - "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==", - "dev": true + "integrity": "sha512-j5EctnkH7amfV/q5Hgmoal1g2QHFJRraOtmx0JpIqkxhBhI/lJSl1nMpQ45hVarwNETOoWEimndZ4QK0RHxuxQ==" }, "min-document": { "version": "2.19.0", @@ -24782,6 +26128,45 @@ "minipass": "^3.0.0" } }, + "minipass-fetch": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minipass-fetch/-/minipass-fetch-2.1.2.tgz", + "integrity": "sha512-LT49Zi2/WMROHYoqGgdlQIZh8mLPZmOrN2NdJjMXxYe4nkN6FUyuPuOAOedNJDrx0IRGg9+4guZewtp8hE6TxA==", + "dev": true, + "requires": { + "encoding": "^0.1.13", + "minipass": "^3.1.6", + "minipass-sized": "^1.0.3", + "minizlib": "^2.1.2" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "minipass-flush": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz", @@ -24800,6 +26185,15 @@ "minipass": "^3.0.0" } }, + "minipass-sized": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/minipass-sized/-/minipass-sized-1.0.3.tgz", + "integrity": "sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==", + "dev": true, + "requires": { + "minipass": "^3.0.0" + } + }, "minizlib": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz", @@ -24928,6 +26322,11 @@ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, + "mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" + }, "mock-data": { "version": "1.5.5", "resolved": "https://registry.npmjs.org/mock-data/-/mock-data-1.5.5.tgz", @@ -25250,6 +26649,11 @@ "to-regex": "^3.0.1" } }, + "napi-build-utils": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" + }, "napi-macros": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/napi-macros/-/napi-macros-2.0.0.tgz", @@ -25345,6 +26749,30 @@ "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" }, + "nice-napi": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/nice-napi/-/nice-napi-1.0.2.tgz", + "integrity": "sha512-px/KnJAJZf5RuBGcfD+Sp2pAKq0ytz8j+1NehvgIGFkvtvFrDM3T8E4x/JJODXK9WZow8RRGrbA9QQ3hs+pDhA==", + "optional": true, + "requires": { + "node-addon-api": "^3.0.0", + "node-gyp-build": "^4.2.2" + }, + "dependencies": { + "node-addon-api": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.2.1.tgz", + "integrity": "sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==", + "optional": true + }, + "node-gyp-build": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.5.0.tgz", + "integrity": "sha512-2iGbaQBV+ITgCz76ZEjmhUKAKVf7xfY1sRl4UiKQspfZMH2h06SyhNsnSVy50cwkFQDGLyif6m/6uFXHkOZ6rg==", + "optional": true + } + } + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -25360,6 +26788,37 @@ "lower-case": "^1.1.1" } }, + "node-abi": { + "version": "3.28.0", + "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.28.0.tgz", + "integrity": "sha512-fRlDb4I0eLcQeUvGq7IY3xHrSb0c9ummdvDSYWfT9+LKP+3jCKw/tKoqaM7r1BAoiAC6GtwyjaGnOz6B3OtF+A==", + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + } + } + }, "node-addon-api": { "version": "1.7.2", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.2.tgz", @@ -25367,6 +26826,41 @@ "dev": true, "optional": true }, + "node-api-version": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/node-api-version/-/node-api-version-0.1.4.tgz", + "integrity": "sha512-KGXihXdUChwJAOHO53bv9/vXcLmdUsZ6jIptbvYvkpKfth+r7jw44JkVxQFA3kX5nQjzjmGu1uAu/xNNLNlI5g==", + "dev": true, + "requires": { + "semver": "^7.3.5" + }, + "dependencies": { + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "node-diff3": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/node-diff3/-/node-diff3-1.0.0.tgz", @@ -25410,6 +26904,188 @@ } } }, + "node-gyp": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-9.3.0.tgz", + "integrity": "sha512-A6rJWfXFz7TQNjpldJ915WFb1LnhO4lIve3ANPbWreuEoLoKlFT3sxIepPBkLhM27crW8YmN+pjlgbasH6cH/Q==", + "dev": true, + "requires": { + "env-paths": "^2.2.0", + "glob": "^7.1.4", + "graceful-fs": "^4.2.6", + "make-fetch-happen": "^10.0.3", + "nopt": "^6.0.0", + "npmlog": "^6.0.0", + "rimraf": "^3.0.2", + "semver": "^7.3.5", + "tar": "^6.1.2", + "which": "^2.0.2" + }, + "dependencies": { + "are-we-there-yet": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-3.0.1.tgz", + "integrity": "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==", + "dev": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^3.6.0" + } + }, + "chownr": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz", + "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", + "dev": true + }, + "gauge": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz", + "integrity": "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==", + "dev": true, + "requires": { + "aproba": "^1.0.3 || ^2.0.0", + "color-support": "^1.1.3", + "console-control-strings": "^1.1.0", + "has-unicode": "^2.0.1", + "signal-exit": "^3.0.7", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wide-align": "^1.1.5" + } + }, + "graceful-fs": { + "version": "4.2.10", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", + "dev": true + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "minizlib": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", + "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==", + "dev": true, + "requires": { + "minipass": "^3.0.0", + "yallist": "^4.0.0" + } + }, + "nopt": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-6.0.0.tgz", + "integrity": "sha512-ZwLpbTgdhuZUnZzjd7nb1ZV+4DoiC6/sfiVKok72ym/4Tlf+DFdlHYmT2JPmcNNWV6Pi3SDf1kT+A4r9RTuT9g==", + "dev": true, + "requires": { + "abbrev": "^1.0.0" + } + }, + "npmlog": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-6.0.2.tgz", + "integrity": "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==", + "dev": true, + "requires": { + "are-we-there-yet": "^3.0.0", + "console-control-strings": "^1.1.0", + "gauge": "^4.0.3", + "set-blocking": "^2.0.0" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "dev": true, + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "semver": { + "version": "7.3.8", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", + "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "tar": { + "version": "6.1.12", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", + "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "dev": true, + "requires": { + "chownr": "^2.0.0", + "fs-minipass": "^2.0.0", + "minipass": "^3.0.0", + "minizlib": "^2.1.1", + "mkdirp": "^1.0.3", + "yallist": "^4.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + } + } + }, "node-gyp-build": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.0.tgz", @@ -29686,6 +31362,16 @@ } } }, + "openapi-types": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-10.0.0.tgz", + "integrity": "sha512-Y8xOCT2eiKGYDzMW9R4x5cmfc3vGaaI4EL2pwhDmodWw1HlK18YcZ4uJxc7Rdp7/gGzAygzH9SXr6GKYIXbRcQ==" + }, + "openapi3-ts": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/openapi3-ts/-/openapi3-ts-1.4.0.tgz", + "integrity": "sha512-8DmE2oKayvSkIR3XSZ4+pRliBsx19bSNeIzkTPswY8r4wvjX86bMxsORdqwAwMxE8PefOcSAT2auvi/0TZe9yA==" + }, "opencollective-postinstall": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", @@ -30679,6 +32365,37 @@ "pinkie": "^2.0.0" } }, + "pino": { + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-6.14.0.tgz", + "integrity": "sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==", + "requires": { + "fast-redact": "^3.0.0", + "fast-safe-stringify": "^2.0.8", + "flatstr": "^1.0.12", + "pino-std-serializers": "^3.1.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "sonic-boom": "^1.0.2" + }, + "dependencies": { + "fast-safe-stringify": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", + "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" + }, + "pino-std-serializers": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-3.2.0.tgz", + "integrity": "sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==" + }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + } + } + }, "pino-std-serializers": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.2.tgz", @@ -30693,6 +32410,17 @@ "node-modules-regexp": "^1.0.0" } }, + "piscina": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/piscina/-/piscina-3.2.0.tgz", + "integrity": "sha512-yn/jMdHRw+q2ZJhFhyqsmANcbF6V2QwmD84c6xRau+QpQOmtrBCoRGdvTfeuFDYXB5W2m6MfLkjkvQa9lUSmIA==", + "requires": { + "eventemitter-asyncresource": "^1.0.0", + "hdr-histogram-js": "^2.0.1", + "hdr-histogram-percentiles-obj": "^3.0.0", + "nice-napi": "^1.0.2" + } + }, "pixel-stream": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/pixel-stream/-/pixel-stream-1.0.3.tgz", @@ -31153,6 +32881,98 @@ "resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.1.tgz", "integrity": "sha512-15vItUAbViaYrmaB/Pbw7z6qX2xENbFSTA7Ii4tgbPtasxm5v6ryKhKtL91tpWovDJzTiZqdwzhcFBCwiMVdVw==" }, + "prebuild-install": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", + "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", + "requires": { + "detect-libc": "^2.0.0", + "expand-template": "^2.0.3", + "github-from-package": "0.0.0", + "minimist": "^1.2.3", + "mkdirp-classic": "^0.5.3", + "napi-build-utils": "^1.0.1", + "node-abi": "^3.3.0", + "pump": "^3.0.0", + "rc": "^1.2.7", + "simple-get": "^4.0.0", + "tar-fs": "^2.0.0", + "tunnel-agent": "^0.6.0" + }, + "dependencies": { + "base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" + }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "detect-libc": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.1.tgz", + "integrity": "sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==" + }, + "pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "requires": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "readable-stream": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", + "requires": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + } + }, + "tar-fs": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", + "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", + "requires": { + "chownr": "^1.1.1", + "mkdirp-classic": "^0.5.2", + "pump": "^3.0.0", + "tar-stream": "^2.1.4" + } + }, + "tar-stream": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", + "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", + "requires": { + "bl": "^4.0.3", + "end-of-stream": "^1.4.1", + "fs-constants": "^1.0.0", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1" + } + } + } + }, "precinct": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/precinct/-/precinct-6.2.0.tgz", @@ -31844,6 +33664,11 @@ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, + "process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -31889,6 +33714,16 @@ "resolved": "https://registry.npmjs.org/promise-polyfill/-/promise-polyfill-8.2.0.tgz", "integrity": "sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g==" }, + "promise-retry": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-2.0.1.tgz", + "integrity": "sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==", + "dev": true, + "requires": { + "err-code": "^2.0.2", + "retry": "^0.12.0" + } + }, "promise.allsettled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/promise.allsettled/-/promise.allsettled-1.0.2.tgz", @@ -32164,6 +33999,11 @@ "inherits": "~2.0.3" } }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==" + }, "quick-format-unescaped": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-1.1.2.tgz", @@ -32289,8 +34129,7 @@ "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { "version": "1.1.7", @@ -33736,6 +35575,11 @@ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, + "require-from-string": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" + }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", @@ -33756,6 +35600,11 @@ "path-parse": "^1.0.6" } }, + "resolve-alpn": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/resolve-alpn/-/resolve-alpn-1.2.1.tgz", + "integrity": "sha512-0a1F4l73/ZFZOakJnQ3FvkJ2+gSTQWz/r2KE5OdDY0TxPm5h4GkqkWWfM47T7HsbnOtcJVEF4epCVy6u7Q3K+g==" + }, "resolve-cwd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz", @@ -33869,11 +35718,21 @@ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz", "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==" }, + "retry": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", + "integrity": "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==", + "dev": true + }, "reusify": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==" + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" }, "rgb2hex": { "version": "0.1.10", @@ -34228,6 +36087,21 @@ "ret": "~0.1.10" } }, + "safe-regex2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/safe-regex2/-/safe-regex2-2.0.0.tgz", + "integrity": "sha512-PaUSFsUaNNuKwkBijoAPHAK6/eM6VirvyPWlZ7BAQy4D+hCvh4B6lIG+nPdhbFfIbP+gTGBcrdsOaUs0F+ZBOQ==", + "requires": { + "ret": "~0.2.0" + }, + "dependencies": { + "ret": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/ret/-/ret-0.2.2.tgz", + "integrity": "sha512-M0b3YWQs7R3Z917WRQy1HHA7Ba7D8hvZg6UE5mLykJxQVE2ju0IXbGlaHPPlkY+WN7wFP+wUMXmBFA0aV6vYGQ==" + } + } + }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -34283,6 +36157,11 @@ "ajv-keywords": "^3.1.0" } }, + "secure-json-parse": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-2.5.0.tgz", + "integrity": "sha512-ZQruFgZnIWH+WyO9t5rWt4ZEGqCKPwhiw+YbzTwpmT9elgLrLcfuyUiSnwwjUiVy9r4VM3urtbNF1xmEh9IL2w==" + }, "select": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/select/-/select-1.1.2.tgz", @@ -34301,11 +36180,15 @@ "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", "dev": true }, + "semver-store": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", + "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" + }, "send": { "version": "0.17.1", "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "~1.1.2", @@ -34326,7 +36209,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" }, @@ -34334,22 +36216,19 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", - "dev": true + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" } } }, "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", - "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", - "dev": true + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" } } }, @@ -34408,6 +36287,11 @@ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, + "set-cookie-parser": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.5.1.tgz", + "integrity": "sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==" + }, "set-immediate-shim": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", @@ -34448,8 +36332,7 @@ "setprototypeof": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", - "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==", - "dev": true + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" }, "sha.js": { "version": "2.4.11", @@ -34634,6 +36517,31 @@ "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, + "simple-get": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/simple-get/-/simple-get-4.0.1.tgz", + "integrity": "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==", + "requires": { + "decompress-response": "^6.0.0", + "once": "^1.3.1", + "simple-concat": "^1.0.0" + }, + "dependencies": { + "decompress-response": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", + "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", + "requires": { + "mimic-response": "^3.1.0" + } + }, + "mimic-response": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", + "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==" + } + } + }, "simple-html-tokenizer": { "version": "0.5.9", "resolved": "https://registry.npmjs.org/simple-html-tokenizer/-/simple-html-tokenizer-0.5.9.tgz", @@ -34765,8 +36673,7 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", - "dev": true, - "optional": true + "dev": true }, "snapdragon": { "version": "0.8.2", @@ -34908,6 +36815,46 @@ } } }, + "socks": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.7.1.tgz", + "integrity": "sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==", + "dev": true, + "requires": { + "ip": "^2.0.0", + "smart-buffer": "^4.2.0" + }, + "dependencies": { + "ip": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ip/-/ip-2.0.0.tgz", + "integrity": "sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==", + "dev": true + } + } + }, + "socks-proxy-agent": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-7.0.0.tgz", + "integrity": "sha512-Fgl0YPZ902wEsAyiQ+idGd1A7rSFx/ayC1CQVMw5P+EQx2V0SgpGtf6OKFhVjPflPUl9YMmEOnmfjCdMUsygww==", + "dev": true, + "requires": { + "agent-base": "^6.0.2", + "debug": "^4.3.3", + "socks": "^2.6.2" + }, + "dependencies": { + "debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "requires": { + "ms": "2.1.2" + } + } + } + }, "sodium-javascript": { "version": "0.5.5", "resolved": "https://registry.npmjs.org/sodium-javascript/-/sodium-javascript-0.5.5.tgz", @@ -34939,6 +36886,25 @@ "sodium-native": "^2.0.0" } }, + "sonic-boom": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-1.4.1.tgz", + "integrity": "sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==", + "requires": { + "atomic-sleep": "^1.0.0", + "flatstr": "^1.0.12" + } + }, + "sort-asc": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/sort-asc/-/sort-asc-0.1.0.tgz", + "integrity": "sha512-jBgdDd+rQ+HkZF2/OHCmace5dvpos/aWQpcxuyRs9QUbPRnkEJmYVo81PIGpjIdpOcsnJ4rGjStfDHsbn+UVyw==" + }, + "sort-desc": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/sort-desc/-/sort-desc-0.1.1.tgz", + "integrity": "sha512-jfZacW5SKOP97BF5rX5kQfJmRVZP5/adDUTY8fCSPvNcXDVpUEe2pr/iKGlcyZzchRJZrswnp68fgk3qBXgkJw==" + }, "sort-keys": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz", @@ -34955,6 +36921,15 @@ "sort-keys": "^1.0.0" } }, + "sort-object": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/sort-object/-/sort-object-0.3.2.tgz", + "integrity": "sha512-aAQiEdqFTTdsvUFxXm3umdo04J7MRljoVGbBlkH7BgNsMvVNAJyGj7C/wV1A8wHWAJj/YikeZbfuCKqhggNWGA==", + "requires": { + "sort-asc": "^0.1.0", + "sort-desc": "^0.1.1" + } + }, "sorted-indexof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/sorted-indexof/-/sorted-indexof-1.0.0.tgz", @@ -35802,6 +37777,11 @@ "integrity": "sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==", "dev": true }, + "string-similarity": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/string-similarity/-/string-similarity-4.0.4.tgz", + "integrity": "sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==" + }, "string-template": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/string-template/-/string-template-0.2.1.tgz", @@ -37052,6 +39032,11 @@ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz", "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==" }, + "tiny-lru": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/tiny-lru/-/tiny-lru-8.0.2.tgz", + "integrity": "sha512-ApGvZ6vVvTNdsmt676grvCkUCGwzG9IqXma5Z07xJgiC5L7akUMof5U8G2JTI9Rz/ovtVhJBlY6mNhEvtjzOIg==" + }, "tiny-typed-emitter": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/tiny-typed-emitter/-/tiny-typed-emitter-2.0.3.tgz", @@ -37206,8 +39191,7 @@ "toidentifier": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", - "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==", - "dev": true + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" }, "topojson-client": { "version": "3.1.0", @@ -38516,6 +40500,11 @@ "tslib": "^1.9.3" } }, + "use-sync-external-store": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/use-sync-external-store/-/use-sync-external-store-1.2.0.tgz", + "integrity": "sha512-eEgnFxGQ1Ife9bzYs6VLi8/4X6CObHMw9Qr9tPY43iKwsPw8xE8+EFsf/2cFZ5S3esXgpWgtSCtLNS41F+sKPA==" + }, "utf8-byte-length": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/utf8-byte-length/-/utf8-byte-length-1.0.4.tgz", @@ -40411,6 +42400,12 @@ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, "yaku": { "version": "0.16.7", "resolved": "https://registry.npmjs.org/yaku/-/yaku-0.16.7.tgz", @@ -40443,6 +42438,49 @@ "yaml": "^1.7.1" } }, + "yargs": { + "version": "17.6.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.6.2.tgz", + "integrity": "sha512-1/9UrdHjDZc0eOU0HxOHoS78C69UD3JRMvzlJ7S79S2nTaWRA/whGCTV8o9e/N/1Va9YIV7Q4sOxD8VV4pCWOw==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "dependencies": { + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dev": true, + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, "yargs-parser": { "version": "10.1.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", @@ -40460,6 +42498,11 @@ "buffer-crc32": "~0.2.3" } }, + "yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==" + }, "zip-stream": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-1.2.0.tgz", diff --git a/package.json b/package.json index f17a63a8..fa0b15e2 100644 --- a/package.json +++ b/package.json @@ -34,10 +34,11 @@ "start": "electron . --disable-http-cache", "server": "node index.js --headless", "dev": "electron . --debug --disable-http-cache", - "postinstall": "npm-run-all -p patch-package extract-presets", + "postinstall": "npm-run-all -p patch-package extract-presets electron-rebuild", "patch-package": "patch-package", "extract-presets": "node bin/extract-presets.js", "license-check": "license-check", + "rebuild": "electron-rebuild", "release": "standard-version", "release:report": "node bin/report-bugsnag-build.js", "release:beta": "standard-version --prerelease beta", @@ -85,6 +86,7 @@ "@fortawesome/free-solid-svg-icons": "^5.11.1", "@fortawesome/react-fontawesome": "^0.1.4", "@mapbox/sexagesimal": "^1.2.0", + "@mapeo/map-server": "^1.0.0-alpha.11", "@mapeo/settings": "^2.1.3", "@material-ui/core": "^4.11.0", "@material-ui/icons": "^4.5.1", @@ -93,6 +95,7 @@ "@material-ui/styles": "^4.5.2", "@react-pdf/renderer": "^2.0.15", "@segment/isodate": "^1.0.3", + "@tanstack/react-query": "^4.18.0", "asar": "^1.0.0", "base32.js": "^0.1.0", "bugsnag-build-reporter": "^1.0.3", @@ -224,6 +227,7 @@ "electron-builder": "^22.14.10", "electron-devtools-installer": "^3.1.1", "electron-notarize": "^1.0.0", + "electron-rebuild": "^3.2.9", "empty": "^0.10.1", "eslint": "^6.8.0", "eslint-config-prettier": "^6.11.0", diff --git a/src/main/index.js b/src/main/index.js index d430bbd1..c426d710 100644 --- a/src/main/index.js +++ b/src/main/index.js @@ -5,6 +5,7 @@ const { app, dialog, MessageChannelMain, ipcMain } = require('electron') const isDev = require('electron-is-dev') const contextMenu = require('electron-context-menu') const mkdirp = require('mkdirp') +const createMapServer = require('@mapeo/map-server') const onExit = require('./exit-hook') const BackgroundProcessManager = require('./background-process') @@ -33,7 +34,9 @@ module.exports = startup * @param {number} options.mapeoServerPort * @param {number} options.tileServerPort * @param {number} options.mapPrinterPort + * @param {number} options.mapServerPort * @param {string} options.datadir Path to dir for all Mapeo data + * @param {string} options.mapsdir Path to dir for storing background maps database * @param {boolean} [options.debug] * @param {boolean} [options.headless] */ @@ -41,6 +44,8 @@ async function startup ({ mapeoServerPort, tileServerPort, mapPrinterPort, + mapServerPort, + mapsdir, debug = false, headless = false, datadir @@ -64,7 +69,12 @@ async function startup ({ // Window Management /** @type {BrowserWindow | null} */ - let winMain = MainWindow({ mapeoServerPort, tileServerPort, mapPrinterPort }) + let winMain = MainWindow({ + mapeoServerPort, + tileServerPort, + mapPrinterPort, + mapServerPort + }) if (debug) winMain.webContents.openDevTools() /** @type {BrowserWindow | null} */ let winLoading = LoadingWindow() @@ -96,6 +106,20 @@ async function startup ({ { id: 'mapPrinter', args: mapPrinterArgs, devTools: debug } ) + // Running this in the main thread rather than in a background process because + // map-server uses Node Worker Threads, and the background processes actually + // run in a browser window (with Node integration turned on) but they do not + // support Node workers (only Web Workers). The reason for running the other + // processes (map printer and mapeo core) in a background process was because + // processes in the main thread are blocking for the render thread. + // Fortunately map server does not have any expensive functions so it should + // not slow down the main process nor block the render thread if we run it + // here from the main process... + // @ts-ignore + const mapServer = createMapServer(undefined, { + dbPath: path.join(mapsdir, 'maps.db') + }) + // Subscribe the main window to background process state changes const unsubscribeMainWindow = backgroundProcesses.subscribeWindow(winMain) @@ -145,6 +169,7 @@ async function startup ({ Promise.all([ // Create folders for data, custom presets, and custom styles mkdirp(datadir), + mkdirp(mapsdir), mkdirp(path.join(userDataPath, 'presets')), mkdirp(path.join(userDataPath, 'styles')), // Startup background processes and servers @@ -152,6 +177,10 @@ async function startup ({ backgroundProcesses.startAll(), 'Started background processes' ), + logger.timedPromise( + mapServer.listen(mapServerPort, '127.0.0.1'), + 'Started Mapeo Map Server' + ), // Load main window and show it when it has loaded logger.timedPromise(loadMainWindow(), 'First render in main window') ]), @@ -250,6 +279,7 @@ async function startup ({ backgroundProcesses.stopAll(), 'Stopped background processes' ) + await logger.timedPromise(mapServer.close(), 'Stopped Mapeo Map Server') clearTimeout(timeoutId) winClosing && winClosing.close() diff --git a/src/main/windows.js b/src/main/windows.js index e98233df..09918f1a 100644 --- a/src/main/windows.js +++ b/src/main/windows.js @@ -18,6 +18,7 @@ MainWindow.filePath = path.join(__dirname, '../../static/main.html') * @param {number} options.mapeoServerPort * @param {number} options.tileServerPort * @param {number} options.mapPrinterPort + * @param {number} options.mapServerPort * @returns {BrowserWindow} */ function MainWindow (options) { diff --git a/src/renderer/index-preload.js b/src/renderer/index-preload.js index 9baba47a..4275a700 100644 --- a/src/renderer/index-preload.js +++ b/src/renderer/index-preload.js @@ -16,10 +16,14 @@ ipcRenderer.postMessage('mapeo-client', null, [port1]) window.middlewareClient = new IPC({ port: port2 }) -const { mapeoServerPort, tileServerPort, mapPrinterPort } = JSON.parse( - process.argv[process.argv.length - 1] -) +const { + mapeoServerPort, + tileServerPort, + mapPrinterPort, + mapServerPort +} = JSON.parse(process.argv[process.argv.length - 1]) window.mapeoServerPort = mapeoServerPort window.tileServerPort = tileServerPort window.mapPrinterPort = mapPrinterPort +window.mapServerPort = mapServerPort diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts index 72bf02be..001bc95c 100644 --- a/src/utils/types.d.ts +++ b/src/utils/types.d.ts @@ -20,3 +20,8 @@ export type MapeoCoreOptions = { export type MapPrinterOptions = { mapPrinterPort: number } + +export type MapServerOptions = { + mapServerPort: number + mapsdir: string +} From eba9734f006c3dedcdc2d2dfdfb360a13cb95dea Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 28 Nov 2022 10:46:11 -0800 Subject: [PATCH 02/46] chore: scaffolded useMapServerQuery --- src/renderer/hooks/useMapServerQuery.js | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 src/renderer/hooks/useMapServerQuery.js diff --git a/src/renderer/hooks/useMapServerQuery.js b/src/renderer/hooks/useMapServerQuery.js new file mode 100644 index 00000000..3da249b0 --- /dev/null +++ b/src/renderer/hooks/useMapServerQuery.js @@ -0,0 +1,17 @@ +import ky from 'ky/umd' +import { useQuery } from '@tanstack/react-query' + +// local host +// global port number + +const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort + +/** + * @param {'/styles' | `/styles/${string}` | '/tiles' | `/tiles/${string}`} resourcePath URL path to resource on Map Server (needs to start with `/`) + */ +export default function useMapServerQuery (resourcePath) { + return useQuery({ + queryKey: [resourcePath], + queryFn: () => ky.get(MAP_SERVER_URL + resourcePath) + }) +} From f5493be111afc7399dce78fff1b9dd91a75a3b44 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 28 Nov 2022 15:29:08 -0800 Subject: [PATCH 03/46] chore: sampled typings --- src/renderer/app.js | 8 ++++-- src/renderer/hooks/useMapServerMutation.js | 23 ++++++++++++++++ src/renderer/hooks/useMapServerQuery.js | 13 +++++++--- .../useMapServerQueryWithImplicitTypings.js | 26 +++++++++++++++++++ src/utils/types.d.ts | 5 ---- 5 files changed, 64 insertions(+), 11 deletions(-) create mode 100644 src/renderer/hooks/useMapServerMutation.js create mode 100644 src/renderer/hooks/useMapServerQueryWithImplicitTypings.js diff --git a/src/renderer/app.js b/src/renderer/app.js index 4bb6b3fb..04b64fa5 100644 --- a/src/renderer/app.js +++ b/src/renderer/app.js @@ -5,7 +5,7 @@ import { StylesProvider, ThemeProvider } from '@material-ui/styles' import { IntlProvider } from 'react-intl' import isDev from 'electron-is-dev' import CssBaseline from '@material-ui/core/CssBaseline' - +import { QueryClient, QueryClientProvider } from '@tanstack/react-query' import logger from '../logger' import theme from './theme' import Home from './components/Home' @@ -48,6 +48,8 @@ const App = () => { const [locale, setLocale] = React.useState(initialLocale) const [backendState, setBackendState] = React.useState('loading') + const queryClient = new QueryClient() + React.useEffect(() => { ipcRenderer .invoke('get-backend-state') @@ -87,7 +89,9 @@ const App = () => { - + + + diff --git a/src/renderer/hooks/useMapServerMutation.js b/src/renderer/hooks/useMapServerMutation.js new file mode 100644 index 00000000..804c9cc0 --- /dev/null +++ b/src/renderer/hooks/useMapServerMutation.js @@ -0,0 +1,23 @@ +import ky from 'ky/umd' +import { useMutation, useQueryClient } from '@tanstack/react-query' + +const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort + +/** + * @param {string} resourcePath + * @param {'post' | 'put' | 'delete'} + */ +export function useMapServerMutation (resourcePath, mutationType) { + const queryClient = useQueryClient() + const kyFunction = path => + mutationType === 'post' + ? ky.post(path) + : mutationType === 'put' + ? ky.put(path) + : ky.delete(path) + + return useMutation({ + mutationFn: () => kyFunction(MAP_SERVER_URL + resourcePath), + onSuccess: queryClient.invalidateQueries({ queryKey: resourcePath }) + }) +} diff --git a/src/renderer/hooks/useMapServerQuery.js b/src/renderer/hooks/useMapServerQuery.js index 3da249b0..fd60f05a 100644 --- a/src/renderer/hooks/useMapServerQuery.js +++ b/src/renderer/hooks/useMapServerQuery.js @@ -1,17 +1,22 @@ +// @ts-check import ky from 'ky/umd' import { useQuery } from '@tanstack/react-query' // local host // global port number - const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort /** - * @param {'/styles' | `/styles/${string}` | '/tiles' | `/tiles/${string}`} resourcePath URL path to resource on Map Server (needs to start with `/`) + * @param {'/styles' | `/styles/${string}` | '/tilesets' | `/tilesets/${string}`} resourcePath URL path to resource on Map Server (needs to start with `/`) */ -export default function useMapServerQuery (resourcePath) { +export function useMapServerQuery (resourcePath) { return useQuery({ queryKey: [resourcePath], - queryFn: () => ky.get(MAP_SERVER_URL + resourcePath) + queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json() }) } + +/** + * @type {import('@tanstack/react-query').UseQueryResult>} + */ +const { data } = useMapServerQuery('/styles') diff --git a/src/renderer/hooks/useMapServerQueryWithImplicitTypings.js b/src/renderer/hooks/useMapServerQueryWithImplicitTypings.js new file mode 100644 index 00000000..5adf8394 --- /dev/null +++ b/src/renderer/hooks/useMapServerQueryWithImplicitTypings.js @@ -0,0 +1,26 @@ +// @ts-check +import ky from 'ky/umd' +import { useQuery } from '@tanstack/react-query' + +// local host +// global port number +const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort + +const apiLayer = () => { + function getStylesFn () { + /** + * @type {Promise>} + */ + const listSyles = ky.get(MAP_SERVER_URL + '/styles').json() + return listSyles + } + + return { + getStyle: getStylesFn + } +} + +const { data } = useQuery({ + queryKey: ['listStyle'], + queryFn: apiLayer().getStyle +}) diff --git a/src/utils/types.d.ts b/src/utils/types.d.ts index 001bc95c..72bf02be 100644 --- a/src/utils/types.d.ts +++ b/src/utils/types.d.ts @@ -20,8 +20,3 @@ export type MapeoCoreOptions = { export type MapPrinterOptions = { mapPrinterPort: number } - -export type MapServerOptions = { - mapServerPort: number - mapsdir: string -} From bfbeb15528dad888ee882859bce936b4412aed3d Mon Sep 17 00:00:00 2001 From: Gregor MacLennan Date: Tue, 29 Nov 2022 16:16:28 +0000 Subject: [PATCH 04/46] chore: JSDoc overload example --- src/renderer/hooks/useMapServerQuery.js | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/renderer/hooks/useMapServerQuery.js b/src/renderer/hooks/useMapServerQuery.js index fd60f05a..04b03c9b 100644 --- a/src/renderer/hooks/useMapServerQuery.js +++ b/src/renderer/hooks/useMapServerQuery.js @@ -6,8 +6,19 @@ import { useQuery } from '@tanstack/react-query' // global port number const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort +/** @typedef {import('@mapeo/map-server/dist/lib/stylejson').StyleJSON } StyleJSON */ +/** @typedef {import('@mapeo/map-server/dist/lib/tilejson').TileJSON } TileJSON */ +/** @typedef {ReturnType} MapServerStyleInfo */ /** - * @param {'/styles' | `/styles/${string}` | '/tilesets' | `/tilesets/${string}`} resourcePath URL path to resource on Map Server (needs to start with `/`) + * @template TData + * @typedef {import('@tanstack/react-query').UseQueryResult} UseQueryResult + */ + +/** + * @type {{ + * (resourcePath: '/styles') => UseQueryResult + * (resourcePath: `/styles/${string}`) => UseQueryResult + * }} */ export function useMapServerQuery (resourcePath) { return useQuery({ @@ -15,8 +26,6 @@ export function useMapServerQuery (resourcePath) { queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json() }) } - -/** - * @type {import('@tanstack/react-query').UseQueryResult>} - */ -const { data } = useMapServerQuery('/styles') +;(async () => { + const { data } = await useMapServerQuery('/styles') +})() From c9098f197b62ecfdb66c3ca26e1ca7c949927000 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 6 Dec 2022 18:42:27 -0800 Subject: [PATCH 05/46] chore: Added custom hooks --- package.json | 2 +- src/renderer/hooks/useMapServerMutation.d.ts | 21 +++++++++++++++ src/renderer/hooks/useMapServerMutation.js | 21 +++++++-------- src/renderer/hooks/useMapServerQuery.d.ts | 23 ++++++++++++++++ src/renderer/hooks/useMapServerQuery.js | 21 ++------------- .../useMapServerQueryWithImplicitTypings.js | 26 ------------------- 6 files changed, 57 insertions(+), 57 deletions(-) create mode 100644 src/renderer/hooks/useMapServerMutation.d.ts create mode 100644 src/renderer/hooks/useMapServerQuery.d.ts delete mode 100644 src/renderer/hooks/useMapServerQueryWithImplicitTypings.js diff --git a/package.json b/package.json index fa0b15e2..7f80a55f 100644 --- a/package.json +++ b/package.json @@ -288,7 +288,7 @@ "logError": true }, "lint-staged": { - "*.{js,ts,tsx}": [ + "*.{js,tsx}": [ "prettier-standard" ] } diff --git a/src/renderer/hooks/useMapServerMutation.d.ts b/src/renderer/hooks/useMapServerMutation.d.ts new file mode 100644 index 00000000..7b873945 --- /dev/null +++ b/src/renderer/hooks/useMapServerMutation.d.ts @@ -0,0 +1,21 @@ +import { StyleJSON } from '@mapeo/map-server/dist/lib/stylejson' +import { TileJSON } from '@mapeo/map-server/dist/lib/tilejson'; +import { UseMutationResult} from '@tanstack/react-query' + +// This is the body of the styles `Post` Request: +// https://github.com/digidem/mapeo-map-server/blob/master/API.md#post-styles +type StyleBody = { + url:string, + style:StyleJSON, + id?:string, + accessToken:string +} + +export declare function useMapServerMutation(mutationType:'post', resourcePath:`/tilesets`, body:TileJSON):UseMutationResult + +export declare function useMapServerMutation(mutationType:'put', resourcePath:`/tilesets/${string}`,body:TileJSON):UseMutationResult + +export declare function useMapServerMutation(mutationType:'post', resourcePath:`/styles`, body:StyleBody):UseMutationResult + +export declare function useMapServerMutation(mutationType:'delete', resourcePath:`/styles/${string}`,):UseMutationResult<204> + diff --git a/src/renderer/hooks/useMapServerMutation.js b/src/renderer/hooks/useMapServerMutation.js index 804c9cc0..3d86b543 100644 --- a/src/renderer/hooks/useMapServerMutation.js +++ b/src/renderer/hooks/useMapServerMutation.js @@ -1,23 +1,22 @@ +// @ts-check import ky from 'ky/umd' import { useMutation, useQueryClient } from '@tanstack/react-query' +const queryClient = useQueryClient() + +// @ts-ignore const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort -/** - * @param {string} resourcePath - * @param {'post' | 'put' | 'delete'} - */ -export function useMapServerMutation (resourcePath, mutationType) { - const queryClient = useQueryClient() - const kyFunction = path => +export function useMapServerMutation (mutationType, resourcePath, body) { + const kyFunction = (path, body) => mutationType === 'post' - ? ky.post(path) + ? ky.post(path, { json: body }) : mutationType === 'put' - ? ky.put(path) + ? ky.put(path, { json: body }) : ky.delete(path) return useMutation({ - mutationFn: () => kyFunction(MAP_SERVER_URL + resourcePath), - onSuccess: queryClient.invalidateQueries({ queryKey: resourcePath }) + mutationFn: () => kyFunction(MAP_SERVER_URL + resourcePath, body), + onSuccess: () => queryClient.invalidateQueries({ queryKey: [resourcePath] }) }) } diff --git a/src/renderer/hooks/useMapServerQuery.d.ts b/src/renderer/hooks/useMapServerQuery.d.ts new file mode 100644 index 00000000..40e2e2a5 --- /dev/null +++ b/src/renderer/hooks/useMapServerQuery.d.ts @@ -0,0 +1,23 @@ +import { StyleJSON } from '@mapeo/map-server/dist/lib/stylejson' +import { StylesApi, } from '@mapeo/map-server/dist/api/styles' +import { UseQueryResult } from '@tanstack/react-query' +import { TilesetsApi } from "@mapeo/map-server/dist/api/tilesets"; +import { ImportsApi } from "@mapeo/map-server/dist/api/imports"; + +type Unpacked = T extends (infer U)[] + ? U + : T extends (...args: any[]) => infer U + ? U + : T extends Promise + ? U + : T; + +type MapServerStyleInfo = Unpacked> +type Tileset = Unpacked>; +type MapServerImport = Unpacked>; + + +export declare function useMapServerQuery(resourcePath: '/styles'): UseQueryResult +export declare function useMapServerQuery(resourcePath: `/styles/${string}`): UseQueryResult +export declare function useMapServerQuery(resourcePath: `/tilesets`): UseQueryResult +export declare function useMapServerQuery(resourcePath: `/imports/${string}`): UseQueryResult \ No newline at end of file diff --git a/src/renderer/hooks/useMapServerQuery.js b/src/renderer/hooks/useMapServerQuery.js index 04b03c9b..2da04630 100644 --- a/src/renderer/hooks/useMapServerQuery.js +++ b/src/renderer/hooks/useMapServerQuery.js @@ -2,30 +2,13 @@ import ky from 'ky/umd' import { useQuery } from '@tanstack/react-query' -// local host -// global port number +// local host and global port number +// @ts-ignore const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort -/** @typedef {import('@mapeo/map-server/dist/lib/stylejson').StyleJSON } StyleJSON */ -/** @typedef {import('@mapeo/map-server/dist/lib/tilejson').TileJSON } TileJSON */ -/** @typedef {ReturnType} MapServerStyleInfo */ -/** - * @template TData - * @typedef {import('@tanstack/react-query').UseQueryResult} UseQueryResult - */ - -/** - * @type {{ - * (resourcePath: '/styles') => UseQueryResult - * (resourcePath: `/styles/${string}`) => UseQueryResult - * }} - */ export function useMapServerQuery (resourcePath) { return useQuery({ queryKey: [resourcePath], queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json() }) } -;(async () => { - const { data } = await useMapServerQuery('/styles') -})() diff --git a/src/renderer/hooks/useMapServerQueryWithImplicitTypings.js b/src/renderer/hooks/useMapServerQueryWithImplicitTypings.js deleted file mode 100644 index 5adf8394..00000000 --- a/src/renderer/hooks/useMapServerQueryWithImplicitTypings.js +++ /dev/null @@ -1,26 +0,0 @@ -// @ts-check -import ky from 'ky/umd' -import { useQuery } from '@tanstack/react-query' - -// local host -// global port number -const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort - -const apiLayer = () => { - function getStylesFn () { - /** - * @type {Promise>} - */ - const listSyles = ky.get(MAP_SERVER_URL + '/styles').json() - return listSyles - } - - return { - getStyle: getStylesFn - } -} - -const { data } = useQuery({ - queryKey: ['listStyle'], - queryFn: apiLayer().getStyle -}) From 69dbd0162b926086c452ebd6ef1a9c245dfc5361 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 6 Dec 2022 19:02:29 -0800 Subject: [PATCH 06/46] chore: update query invalidation --- src/renderer/hooks/useMapServerMutation.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/hooks/useMapServerMutation.js b/src/renderer/hooks/useMapServerMutation.js index 3d86b543..91799b70 100644 --- a/src/renderer/hooks/useMapServerMutation.js +++ b/src/renderer/hooks/useMapServerMutation.js @@ -17,6 +17,9 @@ export function useMapServerMutation (mutationType, resourcePath, body) { return useMutation({ mutationFn: () => kyFunction(MAP_SERVER_URL + resourcePath, body), - onSuccess: () => queryClient.invalidateQueries({ queryKey: [resourcePath] }) + onSuccess: () => + queryClient.invalidateQueries({ + queryKey: [resourcePath, `/${resourcePath.split('/')[1]}`] + }) }) } From fdeab8babf69c16b5f2011d0f84f712c06df4d44 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 6 Dec 2022 19:23:59 -0800 Subject: [PATCH 07/46] chore: update styles endpoint typing to return array --- src/renderer/hooks/useMapServerQuery.d.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/hooks/useMapServerQuery.d.ts b/src/renderer/hooks/useMapServerQuery.d.ts index 40e2e2a5..2da7f0d9 100644 --- a/src/renderer/hooks/useMapServerQuery.d.ts +++ b/src/renderer/hooks/useMapServerQuery.d.ts @@ -17,7 +17,7 @@ type Tileset = Unpacked>; type MapServerImport = Unpacked>; -export declare function useMapServerQuery(resourcePath: '/styles'): UseQueryResult +export declare function useMapServerQuery(resourcePath: '/styles'): UseQueryResult export declare function useMapServerQuery(resourcePath: `/styles/${string}`): UseQueryResult export declare function useMapServerQuery(resourcePath: `/tilesets`): UseQueryResult -export declare function useMapServerQuery(resourcePath: `/imports/${string}`): UseQueryResult \ No newline at end of file +export declare function useMapServerQuery(resourcePath: `/imports/${string}`): UseQueryResult From 2eec2d2f2dab6234168f941984a0b58acc40f669 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:57:45 -0800 Subject: [PATCH 08/46] chore: ran electron-rebuild --- package-lock.json | 81 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 66 insertions(+), 15 deletions(-) diff --git a/package-lock.json b/package-lock.json index 68ebabe1..e8cd838c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14843,6 +14843,15 @@ "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", "dev": true }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -14851,6 +14860,17 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "normalize-url": { @@ -14952,14 +14972,14 @@ } }, "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^4.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" @@ -25307,9 +25327,9 @@ } }, "minimatch": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.0.tgz", - "integrity": "sha512-9TPBGGak4nHfGZsPBohm9AWg6NoT7QTCehS3BIJABslyZbzxfV78QM2Y6+i741OPZIafFAaiiEMh5OyIrJPgtg==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.1.tgz", + "integrity": "sha512-362NP+zlprccbEt/SkxKfRMHnNY85V74mVnpUpNyr3F35covl09Kec7/sEFLt3RA4oXmewtoaanoIf67SE5Y5g==", "dev": true, "requires": { "brace-expansion": "^2.0.1" @@ -25401,17 +25421,28 @@ } }, "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^4.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "unique-filename": { @@ -26969,6 +27000,15 @@ "yallist": "^4.0.0" } }, + "minipass": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-4.0.0.tgz", + "integrity": "sha512-g2Uuh2jEKoht+zvO6vJqXmYpflPqzRBT+Th2h01DKh5z7wbY/AZ2gCQ78cP70YoHPyFdY30YBV5WxgLOEwOykw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, "minizlib": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz", @@ -26977,6 +27017,17 @@ "requires": { "minipass": "^3.0.0", "yallist": "^4.0.0" + }, + "dependencies": { + "minipass": { + "version": "3.3.6", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.3.6.tgz", + "integrity": "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + } } }, "nopt": { @@ -27056,14 +27107,14 @@ } }, "tar": { - "version": "6.1.12", - "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.12.tgz", - "integrity": "sha512-jU4TdemS31uABHd+Lt5WEYJuzn+TJTCBLljvIAHZOz6M9Os5pJ4dD+vRFLxPa/n3T0iEFzpi+0x1UfuDZYbRMw==", + "version": "6.1.13", + "resolved": "https://registry.npmjs.org/tar/-/tar-6.1.13.tgz", + "integrity": "sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==", "dev": true, "requires": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", - "minipass": "^3.0.0", + "minipass": "^4.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" From 0574610b1120a555d229483e0ebb050d754b4029 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 7 Dec 2022 19:04:58 -0800 Subject: [PATCH 09/46] chore: update hooks --- src/renderer/hooks/useMapServerMutation.d.ts | 9 +++++---- src/renderer/hooks/useMapServerMutation.js | 9 +++++---- src/renderer/hooks/useMapServerQuery.d.ts | 9 ++++----- src/renderer/hooks/useMapServerQuery.js | 5 +++-- 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/src/renderer/hooks/useMapServerMutation.d.ts b/src/renderer/hooks/useMapServerMutation.d.ts index 7b873945..b768d427 100644 --- a/src/renderer/hooks/useMapServerMutation.d.ts +++ b/src/renderer/hooks/useMapServerMutation.d.ts @@ -11,11 +11,12 @@ type StyleBody = { accessToken:string } -export declare function useMapServerMutation(mutationType:'post', resourcePath:`/tilesets`, body:TileJSON):UseMutationResult +export declare function useMapServerMutation(mutationType:'post', resourcePath:`/tilesets`):UseMutationResult -export declare function useMapServerMutation(mutationType:'put', resourcePath:`/tilesets/${string}`,body:TileJSON):UseMutationResult +export declare function useMapServerMutation(mutationType:'post', resourcePath:`/tilesets/import`):UseMutationResult -export declare function useMapServerMutation(mutationType:'post', resourcePath:`/styles`, body:StyleBody):UseMutationResult +export declare function useMapServerMutation(mutationType:'put', resourcePath:`/tilesets/${string}`):UseMutationResult -export declare function useMapServerMutation(mutationType:'delete', resourcePath:`/styles/${string}`,):UseMutationResult<204> +export declare function useMapServerMutation(mutationType:'post', resourcePath:`/styles`):UseMutationResult +export declare function useMapServerMutation(mutationType:'delete', resourcePath:`/styles/${string}`):UseMutationResult<204> \ No newline at end of file diff --git a/src/renderer/hooks/useMapServerMutation.js b/src/renderer/hooks/useMapServerMutation.js index 91799b70..cb952f5c 100644 --- a/src/renderer/hooks/useMapServerMutation.js +++ b/src/renderer/hooks/useMapServerMutation.js @@ -2,12 +2,12 @@ import ky from 'ky/umd' import { useMutation, useQueryClient } from '@tanstack/react-query' -const queryClient = useQueryClient() - // @ts-ignore const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort -export function useMapServerMutation (mutationType, resourcePath, body) { +export function useMapServerMutation (mutationType, resourcePath) { + const queryClient = useQueryClient() + const kyFunction = (path, body) => mutationType === 'post' ? ky.post(path, { json: body }) @@ -16,7 +16,8 @@ export function useMapServerMutation (mutationType, resourcePath, body) { : ky.delete(path) return useMutation({ - mutationFn: () => kyFunction(MAP_SERVER_URL + resourcePath, body), + mutationFn: bodyFromMutation => + kyFunction(MAP_SERVER_URL + resourcePath, bodyFromMutation), onSuccess: () => queryClient.invalidateQueries({ queryKey: [resourcePath, `/${resourcePath.split('/')[1]}`] diff --git a/src/renderer/hooks/useMapServerQuery.d.ts b/src/renderer/hooks/useMapServerQuery.d.ts index 2da7f0d9..16b57b39 100644 --- a/src/renderer/hooks/useMapServerQuery.d.ts +++ b/src/renderer/hooks/useMapServerQuery.d.ts @@ -16,8 +16,7 @@ type MapServerStyleInfo = Unpacked> type Tileset = Unpacked>; type MapServerImport = Unpacked>; - -export declare function useMapServerQuery(resourcePath: '/styles'): UseQueryResult -export declare function useMapServerQuery(resourcePath: `/styles/${string}`): UseQueryResult -export declare function useMapServerQuery(resourcePath: `/tilesets`): UseQueryResult -export declare function useMapServerQuery(resourcePath: `/imports/${string}`): UseQueryResult +export declare function useMapServerQuery(resourcePath: '/styles', enabled?:boolean): UseQueryResult +export declare function useMapServerQuery(resourcePath: `/styles/${string}`,enabled?:boolean): UseQueryResult +export declare function useMapServerQuery(resourcePath: `/tilesets`, enabled?:boolean): UseQueryResult +export declare function useMapServerQuery(resourcePath: `/imports/${string}`, enabled?:boolean): UseQueryResult \ No newline at end of file diff --git a/src/renderer/hooks/useMapServerQuery.js b/src/renderer/hooks/useMapServerQuery.js index 2da04630..8a4066bd 100644 --- a/src/renderer/hooks/useMapServerQuery.js +++ b/src/renderer/hooks/useMapServerQuery.js @@ -6,9 +6,10 @@ import { useQuery } from '@tanstack/react-query' // @ts-ignore const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort -export function useMapServerQuery (resourcePath) { +export function useMapServerQuery (resourcePath, enabled) { return useQuery({ queryKey: [resourcePath], - queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json() + queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json(), + enabled }) } From 68b61559ed43c42254ac4e7ac346ca7e46f93819 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:12:59 -0800 Subject: [PATCH 10/46] chore: update query invalidation to be more general --- src/renderer/hooks/useMapServerMutation.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/renderer/hooks/useMapServerMutation.js b/src/renderer/hooks/useMapServerMutation.js index cb952f5c..6098fc3b 100644 --- a/src/renderer/hooks/useMapServerMutation.js +++ b/src/renderer/hooks/useMapServerMutation.js @@ -20,7 +20,7 @@ export function useMapServerMutation (mutationType, resourcePath) { kyFunction(MAP_SERVER_URL + resourcePath, bodyFromMutation), onSuccess: () => queryClient.invalidateQueries({ - queryKey: [resourcePath, `/${resourcePath.split('/')[1]}`] + queryKey: [`/${resourcePath.split('/')[1]}`] }) }) } From e5f43f0831cd7cdfffcde378d524c183db23a615 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Sun, 17 Apr 2022 16:10:17 -0300 Subject: [PATCH 11/46] feat: Added settings tab --- src/renderer/components/Home.js | 49 ++++- src/renderer/components/MapCard.js | 22 +++ src/renderer/components/Settings/BGMaps.js | 172 ++++++++++++++++++ .../components/Settings/SettingsMenu.js | 43 +++++ src/renderer/components/Settings/index.js | 141 ++++++++++++++ 5 files changed, 417 insertions(+), 10 deletions(-) create mode 100644 src/renderer/components/MapCard.js create mode 100644 src/renderer/components/Settings/BGMaps.js create mode 100644 src/renderer/components/Settings/SettingsMenu.js create mode 100644 src/renderer/components/Settings/index.js diff --git a/src/renderer/components/Home.js b/src/renderer/components/Home.js index 27395e92..83347886 100644 --- a/src/renderer/components/Home.js +++ b/src/renderer/components/Home.js @@ -9,6 +9,7 @@ import MapIcon from '@material-ui/icons/Map' import ObservationIcon from '@material-ui/icons/PhotoLibrary' import SyncIcon from '@material-ui/icons/OfflineBolt' import WarningIcon from '@material-ui/icons/Warning' +import SettingsIcon from '@material-ui/icons/Settings' import LatLonDialog from './dialogs/LatLon' import ErrorDialog from './dialogs/Error' @@ -21,6 +22,8 @@ import { STATES as updateStates, UpdaterView, UpdateTab } from './UpdaterView' import useUpdater from './UpdaterView/useUpdater' import Loading from './Loading' import buildConfig from '../../build-config' +import { Settings } from './Settings' +import { makeStyles } from '@material-ui/core' const MapFilter = React.lazy(() => import( @@ -48,8 +51,6 @@ const m = defineMessages({ update: 'Update Mapeo' }) -// const MapEditor = () =>
MAPEDITOR
- const transitionDuration = 100 const Root = styled.div` @@ -135,6 +136,9 @@ const StyledTab = styled(Tab)` margin-bottom: 4px; margin-right: 11px; } + & .MuiTab-root > *:last-child { + align-self: flex-end; + } ` const TabContent = styled.div` @@ -154,12 +158,7 @@ const StyledPanel = styled.div` } ` -const Version = styled.div` - align-self: flex-start; - margin: auto 10px 10px 10px; - font-size: 0.8rem; - color: ${buildConfig.variant === 'icca' ? '#eeeeee' : '#aaaaaa'}; -` +// {buildConfig.variant === 'icca' ? '#eeeeee' : '#aaaaaa'}; const LoadingContainer = styled.div` display: flex; @@ -227,6 +226,10 @@ export default function Home ({ onSelectLanguage }) { const [update, setUpdate] = useUpdater() const { formatMessage: t } = useIntl() + const [settingsReset, setSettingsReset] = React.useState(false) + + const classes = useStyle() + React.useEffect(() => { const openLatLonDialog = () => setDialog('LatLon') const openErrorDialog = (ev, error) => { @@ -266,10 +269,15 @@ export default function Home ({ onSelectLanguage }) { setTabIndex(value)} + onChange={(e, value) => { + if (value === 4) setSettingsReset(true) + setTabIndex(value) + }} > } label={t(m.mapeditor)} /> } label={t(m.mapfilter)} /> @@ -280,8 +288,14 @@ export default function Home ({ onSelectLanguage }) { label={} /> )} + + } + label={'Settings'} + /> - Mapeo v{buildConfig.version} @@ -299,6 +313,13 @@ export default function Home ({ onSelectLanguage }) { update={update} setUpdate={setUpdate} /> + {tabIndex === 4 && ( + + )} ) } + +const useStyle = makeStyles({ + root: { + '& .MuiTabs-flexContainerVertical': { + height: '100%' + } + } +}) diff --git a/src/renderer/components/MapCard.js b/src/renderer/components/MapCard.js new file mode 100644 index 00000000..2093a804 --- /dev/null +++ b/src/renderer/components/MapCard.js @@ -0,0 +1,22 @@ +import * as React from 'react' +import Button from '@material-ui/core/Button' + +import { makeStyles } from '@material-ui/core' + +export const MapCard = ({ setMap }) => { + const classes = useStyles() + return ( + + ) +} + +const useStyles = makeStyles({ + container: { + height: 90, + width: '90%', + marginBottom: 20, + textTransform: 'none' + } +}) diff --git a/src/renderer/components/Settings/BGMaps.js b/src/renderer/components/Settings/BGMaps.js new file mode 100644 index 00000000..7e52fd07 --- /dev/null +++ b/src/renderer/components/Settings/BGMaps.js @@ -0,0 +1,172 @@ +import * as React from 'react' +import Button from '@material-ui/core/Button' +import ChevronLeft from '@material-ui/icons/ChevronLeft' +import { makeStyles } from '@material-ui/core' +import { defineMessages, useIntl } from 'react-intl' +import Typography from '@material-ui/core/Typography' +import Loader from '../../components/Loader' + +import { MapCard } from '../MapCard' + +const m = defineMessages({ + // Button to add map background + addMap: 'Add Map Background', + // Button to create an offline area for a map backgroun + createOfflineMap: 'Create Offline Map', + // Title for description of offline maps + mapBackgroundTitle: 'Managing Map Backgrounds and Offline Areas', + // button to go back to settings + backToSettings: 'Back to Settings' +}) + +const useStyles = makeStyles({ + sidePanel: { + width: 'auto', + borderRight: '1px solid #E0E0E0', + height: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + minWidth: '35%' + }, + buttonContainer: { + display: 'flex', + justifyContent: 'space-between', + padding: 20 + }, + button: { + textTransform: 'none' + }, + firstButton: { + marginRight: 10 + }, + noMapContainer: { + padding: 40 + }, + backHeader: { + justifyContent: 'flex-start', + alignSelf: 'flex-start', + paddingLeft: 20, + paddingTop: 20, + paddingBottom: 20, + width: '100%', + display: 'flex', + textTransform: 'none', + '& :first-child': { + marginRight: 20 + } + } +}) + +/** @typedef {{mapId:string, mapTitle:string, size:number, offlineAreaCount:number}} OfflineMap */ + +/** + * + * @typedef BGMapsProps + * @prop {function(string|false):void} setCurrentTab + * + */ + +/** + * + * @param {BGMapsProps} param + * + */ +export const BGMaps = ({ setCurrentTab }) => { + const classes = useStyles() + const { formatMessage: t } = useIntl() + + /** @type [OfflineMap[]|undefined, function(OfflineMap[]):void] */ + const [offlineMaps, setOfflineMaps] = React.useState(undefined) + + /** @type [(OfflineMap | false), function(OfflineMap | false):void] */ + const [mapValue, setMapValue] = React.useState(false) + + React.useEffect(() => { + // To Do: API call to get map value + /** + * @returns {OfflineMap[]} + */ + function getListOfOfflineMaps () { + return [ + { + mapId: '1', + mapTitle: 'Map 1', + size: 100, + offlineAreaCount: 10 + }, + { + mapId: '2', + mapTitle: 'Map 2', + size: 200, + offlineAreaCount: 20 + } + ] + } + + setOfflineMaps(getListOfOfflineMaps()) + }, []) + + return ( + +
+ +
+ + +
+ + + + {offlineMaps === undefined && } +
+ + {!mapValue ? ( +
+ {t(m.mapBackgroundTitle)} + + + Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim + ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim + ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. +
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do + eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim + ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut + aliquip ex ea commodo consequat. Duis aute irure dolor in + reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla + pariatur. Excepteur sint occaecat cupidatat non proident, sunt in + culpa qui officia deserunt mollit anim id est laborum. +
+
+ ) : ( + <>Offline Maps Here + )} +
+ ) +} diff --git a/src/renderer/components/Settings/SettingsMenu.js b/src/renderer/components/Settings/SettingsMenu.js new file mode 100644 index 00000000..d3c41f55 --- /dev/null +++ b/src/renderer/components/Settings/SettingsMenu.js @@ -0,0 +1,43 @@ +import * as React from 'react' +import Tabs from '@material-ui/core/Tabs' +import Tab from '@material-ui/core/Tab' +import { useIntl } from 'react-intl' + +/** @typedef {{tabId:string, icon:React.ReactNode, label:MessageDescriptor}} SettingsTabs */ + +/** + * + * @typedef SettingMenuProp + * @prop {SettingsTabs} tabs + * @prop {string | false} currentTab + * @prop {function(string|false):void} setCurrentTab + * + * + */ + +/** + * + * @param {SettingMenuProp} props + * + */ +export const SettingsMenu = ({ tabs, currentTab, setCurrentTab }) => { + const { formatMessage: t } = useIntl() + + return ( + setCurrentTab(newValue)} + > + {tabs.map(tab => ( + + ))} + + ) +} diff --git a/src/renderer/components/Settings/index.js b/src/renderer/components/Settings/index.js new file mode 100644 index 00000000..af030db5 --- /dev/null +++ b/src/renderer/components/Settings/index.js @@ -0,0 +1,141 @@ +import * as React from 'react' +import { SettingsMenu } from './SettingsMenu' +import { defineMessages } from 'react-intl' +import MapIcon from '@material-ui/icons/MapOutlined' +import InfoIcon from '@material-ui/icons/InfoOutlined' +import { BGMaps } from './BGMaps' +import { makeStyles } from '@material-ui/core' +import Fade from '@material-ui/core/Fade' +import Paper from '@material-ui/core/Paper' + +const m = defineMessages({ + backgroundMap: 'Background Map', + aboutMapeo: 'About Mapeo' +}) + +const useStyles = makeStyles({ + container: { + display: 'flex', + textAlign: 'start', + height: '100%' + }, + tabs: { + padding: '6px 24px 6px 40', + textTransform: 'none', + textAlign: 'left', + display: 'flex', + width: 'auto', + minWidth: '30%', + fontSize: 16, + lineHeight: '30px', + height: '100%', + '& .MuiTab-wrapper': { + justifyContent: 'flex-start', + flexDirection: 'row', + alignItems: 'center' + }, + '& .MuiSvgIcon-root': { + marginRight: 20, + marginLeft: 20 + }, + '& .MuiTabs-root': { + flex: 1 + } + } +}) + +const FADE_DURATION = 700 + +/** @typedef {{tabId:string, icon:React.ReactNode, label:MessageDescriptor}} SettingsTabs */ + +/** @type {SettingsTabs[]} */ +const tabs = /** @typedef {const} */ [ + { + tabId: 'BackgroundMap', + icon: , + label: m.backgroundMap + }, + { + tabId: 'AboutMapeo', + icon: , + label: m.aboutMapeo + } +] + +/** + * + * @typedef SettingsProp + * @prop {boolean} reset + * @prop {function(boolean):void} setReset + * @prop {boolean} fadeIn + */ + +/** + * + * @param {SettingsProp} props + * + */ + +export const Settings = ({ reset, setReset, fadeIn }) => { + /** + * @type {[boolean, (boolean)=>void]} menu + */ + const [menuVisible, setMenuVisibility] = React.useState(true) + + /** + * @type {[SettingsTabs["tabId"] |false, function(SettingsTabs["tabId"] | false):void]} tab + */ + const [tabValue, setTabValue] = React.useState(false) + + const classes = useStyles() + + const showBGMap = tabValue === 'BackgroundMap' + + // bit hacky: when user presses settingsTab, we DO NOT WANT background map to be selected + // because when background map is selected, the entire settings menu is hidden + if (reset) { + setReset(false) + if (tabValue === 'BackgroundMap') setTabValue(false) + } + + React.useEffect(() => { + if (tabValue === 'BackgroundMap') { + setMenuVisibility(false) + return + } + + if (!menuVisible) setMenuVisibility(true) + }, [tabValue, menuVisible]) + + return ( + + + {menuVisible && ( + + + + + + )} + + {showBGMap && ( + + + + + + )} + + {tabValue === 'AboutMapeo' && ( +
+

Build About Mapeo Here

+
+ )} +
+
+ ) +} From 36a98e948281d9af19deea1d91707fa84a4f52ef Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Sun, 17 Apr 2022 16:10:35 -0300 Subject: [PATCH 12/46] chore: Added Translations --- messages/renderer/en.json | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index cd5e1513..4a0cfe68 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -464,6 +464,28 @@ "description": "Name to show for an observation when it does not match any preset", "message": "Observation" }, + "renderer.components.Settings.BGMaps.addMap": { + "description": "Button to add map background", + "message": "Add Map Background" + }, + "renderer.components.Settings.BGMaps.backToSettings": { + "description": "button to go back to settings", + "message": "Back to Settings" + }, + "renderer.components.Settings.BGMaps.createOfflineMap": { + "description": "Button to create an offline area for a map backgroun", + "message": "Create Offline Map" + }, + "renderer.components.Settings.BGMaps.mapBackgroundTitle": { + "description": "Title for description of offline maps", + "message": "Managing Map Backgrounds and Offline Areas" + }, + "renderer.components.Settings.index.aboutMapeo": { + "message": "About Mapeo" + }, + "renderer.components.Settings.index.backgroundMap": { + "message": "Background Map" + }, "renderer.components.SyncView.Searching.searchingHint": { "description": "Hint on sync screen when searching on wifi for devices", "message": "Make sure devices are turned on and connected to the same wifi network" From 0b15b12378ae4f7b5d1751613a990707264ae7b2 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Sun, 17 Apr 2022 17:14:54 -0300 Subject: [PATCH 13/46] chore: updated jsdoc types --- src/renderer/components/Settings/BGMaps.js | 17 +++++------ .../components/Settings/SettingsMenu.js | 16 ++++------- src/renderer/components/Settings/index.js | 28 +++++++++---------- 3 files changed, 25 insertions(+), 36 deletions(-) diff --git a/src/renderer/components/Settings/BGMaps.js b/src/renderer/components/Settings/BGMaps.js index 7e52fd07..1198f942 100644 --- a/src/renderer/components/Settings/BGMaps.js +++ b/src/renderer/components/Settings/BGMaps.js @@ -1,3 +1,4 @@ +// @ts-check import * as React from 'react' import Button from '@material-ui/core/Button' import ChevronLeft from '@material-ui/icons/ChevronLeft' @@ -60,18 +61,14 @@ const useStyles = makeStyles({ /** @typedef {{mapId:string, mapTitle:string, size:number, offlineAreaCount:number}} OfflineMap */ +/** @typedef {OfflineMap['mapId']|false} mapType */ + /** - * * @typedef BGMapsProps - * @prop {function(string|false):void} setCurrentTab - * + * @prop {React.Dispatch>} setCurrentTab */ -/** - * - * @param {BGMapsProps} param - * - */ +/** @param {BGMapsProps} param */ export const BGMaps = ({ setCurrentTab }) => { const classes = useStyles() const { formatMessage: t } = useIntl() @@ -79,7 +76,7 @@ export const BGMaps = ({ setCurrentTab }) => { /** @type [OfflineMap[]|undefined, function(OfflineMap[]):void] */ const [offlineMaps, setOfflineMaps] = React.useState(undefined) - /** @type [(OfflineMap | false), function(OfflineMap | false):void] */ + /** @type {[mapType, Function]} */ const [mapValue, setMapValue] = React.useState(false) React.useEffect(() => { @@ -119,7 +116,7 @@ export const BGMaps = ({ setCurrentTab }) => {
) } const useStyles = makeStyles({ - container: { + root: { height: 90, width: '90%', marginBottom: 20, - textTransform: 'none' + textTransform: 'none', + padding: 0, + '& .MuiButton-root': { + padding: 0 + }, + '& .MuiButton-outlined': { + padding: 0 + }, + '& .MuiButton-label': { + height: '100%' + } + }, + inner: { + display: 'flex', + flex: 1, + height: '100%' + }, + text: { + alignItems: 'flex-start', + display: 'flex', + flexDirection: 'column', + justifyContent: 'center', + flex: 1, + height: '100%', + marginLeft: 10 } }) diff --git a/src/renderer/components/OfflineMapInfo.js b/src/renderer/components/OfflineMapInfo.js new file mode 100644 index 00000000..bb6ab8ee --- /dev/null +++ b/src/renderer/components/OfflineMapInfo.js @@ -0,0 +1,41 @@ +// @ts-check +import { Fade, Paper } from '@material-ui/core' +import * as React from 'react' +import Loading from './Loading' + +/** + * @typedef OfflineMapInfoProps + * @prop {string} mapId + * @prop {string} currentMapId + */ + +/** @param {OfflineMapInfoProps} props */ +export const OfflineMapInfo = ({ mapId, currentMapId }) => { + const shouldLoad = React.useMemo(() => mapId === currentMapId, [ + mapId, + currentMapId + ]) + + const [info, setInfo] = React.useState(null) + + React.useEffect(() => { + /** + * @param {string} mapId + */ + async function getMapInfo (mapId) { + setTimeout(() => setInfo('Map Title: ' + mapId), 2000) + } + + if (shouldLoad) { + getMapInfo(mapId) + } + }, [shouldLoad, mapId]) + + return shouldLoad ? ( + + + {!info ? :
{info}
} +
+
+ ) : null +} diff --git a/src/renderer/components/Settings/BGMaps.js b/src/renderer/components/Settings/BGMaps.js index e96d8e81..7776d448 100644 --- a/src/renderer/components/Settings/BGMaps.js +++ b/src/renderer/components/Settings/BGMaps.js @@ -8,6 +8,7 @@ import Typography from '@material-ui/core/Typography' import Loader from '../../components/Loader' import { MapCard } from '../MapCard' +import { OfflineMapInfo } from '../OfflineMapInfo' const m = defineMessages({ // Button to add map background @@ -128,9 +129,19 @@ export const BGMaps = ({ setCurrentTab }) => {
- - - {offlineMaps === undefined && } + {offlineMaps === undefined ? ( + + ) : ( + offlineMaps.map(offlineMap => ( + + )) + )} {!mapValue ? ( @@ -164,7 +175,16 @@ export const BGMaps = ({ setCurrentTab }) => { ) : ( - <>Offline Maps Here + // Lazy loading each one here: aka will only load when clicked + + {offlineMaps.map(offlineMap => ( + + ))} + )} ) From 80e3223629af7b0ee4b4234b72c26c8f2bee119f Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 18 Apr 2022 00:52:49 -0300 Subject: [PATCH 18/46] chore: translations --- messages/renderer/en.json | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index 33751e23..edbee5ca 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -18,6 +18,14 @@ "description": "Displayed whilst observations and presets load", "message": "Loading…" }, + "renderer.components.MapCard.areas": { + "description": "indicates how many offline areas", + "message": "offline areas" + }, + "renderer.components.MapCard.mb": { + "description": "Abbreviation for megabytes", + "message": "MB" + }, "renderer.components.MapEditor.ExportButton.closeButton": { "description": "Close button after export error", "message": "Close" From 4b4da91443c26583bb894ac3d6f4c3315bbdf25c Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 19 Apr 2022 16:12:55 -0300 Subject: [PATCH 19/46] chore: Added zoom level definitions --- src/renderer/components/OfflineMapInfo.js | 155 +++++++++++++++++++++- 1 file changed, 151 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/OfflineMapInfo.js b/src/renderer/components/OfflineMapInfo.js index bb6ab8ee..70ed47e7 100644 --- a/src/renderer/components/OfflineMapInfo.js +++ b/src/renderer/components/OfflineMapInfo.js @@ -1,8 +1,50 @@ // @ts-check -import { Fade, Paper } from '@material-ui/core' +import { + Button, + Card, + Fade, + IconButton, + makeStyles, + Paper, + Typography +} from '@material-ui/core' import * as React from 'react' +import { defineMessages, useIntl } from 'react-intl' import Loading from './Loading' +const m = defineMessages({ + // Title for Offline Areas + offlineAreas: 'Offline Areas', + // Button to create an offline area + createOfflineArea: 'Create Offline Area', + // Level of detail seen on map - farthest zoom level + lvlDetailGlobal: 'Global', + // Level of detail seen on map - second farthest zoom level + lvlDetailSubcontinent: 'Subcontinent', + // Level of detail seen on map - can see large countries + lvlDetailLargeCountry: 'Large Country', + // Level of detail seen on map - can see smaller countries + lvlDetailSmallCountry: 'Small Country', + // Level of detail seen on map - can see details of large metropolitan areas + lvlDetailLargeMetro: 'Large Metropolitan Area', + // Level of detail seen on map - can see most Cities on Map + lvlDetailCity: 'City', + // Level of detail seen on map - can see most towns on map + lvlDetailTown: 'Town', + // Level of detail seen on map - can see villages on map + lvlDetailVillage: 'Village', + // Level of detail seen on map - can see small roads on map + lvlDetailSmallRoad: 'Small Road', + // Level of detail seen on map - can see most streets on map + lvlDetailStreet: 'Street', + // Level of detail seen on map - can see details of street blocks on map + lvlDetailStreetBlock: 'Street Block', + // Level of detail seen on map - can see addresses on map + lvlDetailAddress: 'Address', + // Level of detail seen on map - can see street intersections on map + lvlDetailStreetIntersection: 'Street Intersection' +}) + /** * @typedef OfflineMapInfoProps * @prop {string} mapId @@ -17,13 +59,16 @@ export const OfflineMapInfo = ({ mapId, currentMapId }) => { ]) const [info, setInfo] = React.useState(null) + const { formatMessage: t } = useIntl() + + const classes = useStyles() React.useEffect(() => { /** * @param {string} mapId */ async function getMapInfo (mapId) { - setTimeout(() => setInfo('Map Title: ' + mapId), 2000) + setTimeout(() => setInfo('Map Title: ' + mapId), 1000) } if (shouldLoad) { @@ -33,9 +78,111 @@ export const OfflineMapInfo = ({ mapId, currentMapId }) => { return shouldLoad ? ( - - {!info ? :
{info}
} + + {!info ? ( +
+ +
+ ) : ( +
+
+ Map +
+
+
+ {t(m.offlineAreas)} + +
+
+
+
+ )}
) : null } + +/** + * @typedef OfflineAreaCardProps + * @prop {number} zoomLevel + * @prop {string} title + * @prop {number} size + */ + +/** @param {OfflineAreaCardProps} props */ +const OfflineAreaCard = ({ zoomLevel, title, size }) => { + const classes = useStyles() + + const lvlOfDetail = React.useMemo(() => { + switch (true) { + case zoomLevel <= 2: + return m.lvlDetailGlobal + case zoomLevel <= 4: + return m.lvlDetailSubcontinent + case zoomLevel <= 6: + return m.lvlDetailLargeCountry + case zoomLevel <= 8: + return m.lvlDetailSmallCountry + case zoomLevel <= 10: + return m.lvlDetailLargeMetro + case zoomLevel === 11: + return m.lvlDetailCity + case zoomLevel === 12: + return m.lvlDetailTown + case zoomLevel <= 14: + return m.lvlDetailVillage + case zoomLevel === 15: + return m.lvlDetailSmallRoad + case zoomLevel === 16: + return m.lvlDetailStreet + case zoomLevel === 17: + return m.lvlDetailStreetBlock + case zoomLevel === 18: + return m.lvlDetailAddress + case zoomLevel < 23: + return m.lvlDetailStreetIntersection + default: + return m.lvlDetailGlobal + } + }, [zoomLevel]) + + return ( + +
+
+ +
+ {lvlOfDetail} +
+ ) +} + +const useStyles = makeStyles({ + img: { + width: '100%', + objectFit: 'cover', + height: '100%' + }, + imgContainer: { + width: '100%', + height: '45%' + }, + card: { + display: 'flex' + }, + cardOptions: { + flexBasis: '20%' + } +}) From 967e67389d0a712ede76fe99d344e46720f23d4c Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 19 Apr 2022 16:13:14 -0300 Subject: [PATCH 20/46] chore: translations --- messages/renderer/en.json | 60 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 60 insertions(+) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index edbee5ca..df814f68 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -472,6 +472,66 @@ "description": "Name to show for an observation when it does not match any preset", "message": "Observation" }, + "renderer.components.OfflineMapInfo.createOfflineArea": { + "description": "Button to create an offline area", + "message": "Create Offline Area" + }, + "renderer.components.OfflineMapInfo.lvlDetailAddress": { + "description": "Level of detail seen on map - can see addresses on map", + "message": "Address" + }, + "renderer.components.OfflineMapInfo.lvlDetailCity": { + "description": "Level of detail seen on map - can see most Cities on Map", + "message": "City" + }, + "renderer.components.OfflineMapInfo.lvlDetailGlobal": { + "description": "Level of detail seen on map - farthest zoom level", + "message": "Global" + }, + "renderer.components.OfflineMapInfo.lvlDetailLargeCountry": { + "description": "Level of detail seen on map - can see large countries", + "message": "Large Country" + }, + "renderer.components.OfflineMapInfo.lvlDetailLargeMetro": { + "description": "Level of detail seen on map - can see details of large metropolitan areas", + "message": "Large Metropolitan Area" + }, + "renderer.components.OfflineMapInfo.lvlDetailSmallCountry": { + "description": "Level of detail seen on map - can see smaller countries", + "message": "Small Country" + }, + "renderer.components.OfflineMapInfo.lvlDetailSmallRoad": { + "description": "Level of detail seen on map - can see small roads on map", + "message": "Small Road" + }, + "renderer.components.OfflineMapInfo.lvlDetailStreet": { + "description": "Level of detail seen on map - can see most streets on map", + "message": "Street" + }, + "renderer.components.OfflineMapInfo.lvlDetailStreetBlock": { + "description": "Level of detail seen on map - can see details of street blocks on map", + "message": "Street Block" + }, + "renderer.components.OfflineMapInfo.lvlDetailStreetIntersection": { + "description": "Level of detail seen on map - can see street intersections on map", + "message": "Street Intersection" + }, + "renderer.components.OfflineMapInfo.lvlDetailSubcontinent": { + "description": "Level of detail seen on map - second farthest zoom level", + "message": "Subcontinent" + }, + "renderer.components.OfflineMapInfo.lvlDetailTown": { + "description": "Level of detail seen on map - can see most towns on map", + "message": "Town" + }, + "renderer.components.OfflineMapInfo.lvlDetailVillage": { + "description": "Level of detail seen on map - can see villages on map", + "message": "Village" + }, + "renderer.components.OfflineMapInfo.offlineAreas": { + "description": "Title for Offline Areas", + "message": "Offline Areas" + }, "renderer.components.Settings.BGMaps.addMap": { "description": "Button to add map background", "message": "Add Map Background" From 546c209a569f95371d9aef646eee2bd91e5084fb Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 19 Apr 2022 17:19:41 -0300 Subject: [PATCH 21/46] chore: clean up --- .../{ => BackgroundMaps}/MapCard.js | 6 +- .../OfflineAreaCard.js} | 86 +---------------- .../BackgroundMaps/OfflineMapInfo.js | 94 +++++++++++++++++++ src/renderer/components/Settings/BGMaps.js | 83 ++++++++-------- 4 files changed, 141 insertions(+), 128 deletions(-) rename src/renderer/components/{ => BackgroundMaps}/MapCard.js (88%) rename src/renderer/components/{OfflineMapInfo.js => BackgroundMaps/OfflineAreaCard.js} (59%) create mode 100644 src/renderer/components/BackgroundMaps/OfflineMapInfo.js diff --git a/src/renderer/components/MapCard.js b/src/renderer/components/BackgroundMaps/MapCard.js similarity index 88% rename from src/renderer/components/MapCard.js rename to src/renderer/components/BackgroundMaps/MapCard.js index e2ffc598..6194dd7b 100644 --- a/src/renderer/components/MapCard.js +++ b/src/renderer/components/BackgroundMaps/MapCard.js @@ -13,9 +13,9 @@ const m = defineMessages({ /** * @typedef MapCardProps - * @prop {import('./Settings/BGMaps').OfflineMap} offlineMap - * @prop {React.Dispatch>} setMap - * @prop {import('./Settings/BGMaps').mapType} mapBeingViewed + * @prop {import('../Settings/BGMaps').OfflineMap} offlineMap + * @prop {React.Dispatch>} setMap + * @prop {import('../Settings/BGMaps').OfflineMap['mapId'] |false } mapBeingViewed */ /** @param {MapCardProps} param */ diff --git a/src/renderer/components/OfflineMapInfo.js b/src/renderer/components/BackgroundMaps/OfflineAreaCard.js similarity index 59% rename from src/renderer/components/OfflineMapInfo.js rename to src/renderer/components/BackgroundMaps/OfflineAreaCard.js index 70ed47e7..8ac08060 100644 --- a/src/renderer/components/OfflineMapInfo.js +++ b/src/renderer/components/BackgroundMaps/OfflineAreaCard.js @@ -1,20 +1,9 @@ // @ts-check -import { - Button, - Card, - Fade, - IconButton, - makeStyles, - Paper, - Typography -} from '@material-ui/core' import * as React from 'react' -import { defineMessages, useIntl } from 'react-intl' -import Loading from './Loading' +import { Card, IconButton, makeStyles } from '@material-ui/core' +import { defineMessages } from 'react-intl' const m = defineMessages({ - // Title for Offline Areas - offlineAreas: 'Offline Areas', // Button to create an offline area createOfflineArea: 'Create Offline Area', // Level of detail seen on map - farthest zoom level @@ -45,75 +34,6 @@ const m = defineMessages({ lvlDetailStreetIntersection: 'Street Intersection' }) -/** - * @typedef OfflineMapInfoProps - * @prop {string} mapId - * @prop {string} currentMapId - */ - -/** @param {OfflineMapInfoProps} props */ -export const OfflineMapInfo = ({ mapId, currentMapId }) => { - const shouldLoad = React.useMemo(() => mapId === currentMapId, [ - mapId, - currentMapId - ]) - - const [info, setInfo] = React.useState(null) - const { formatMessage: t } = useIntl() - - const classes = useStyles() - - React.useEffect(() => { - /** - * @param {string} mapId - */ - async function getMapInfo (mapId) { - setTimeout(() => setInfo('Map Title: ' + mapId), 1000) - } - - if (shouldLoad) { - getMapInfo(mapId) - } - }, [shouldLoad, mapId]) - - return shouldLoad ? ( - - - {!info ? ( -
- -
- ) : ( -
-
- Map -
-
-
- {t(m.offlineAreas)} - -
-
-
-
- )} -
-
- ) : null -} - /** * @typedef OfflineAreaCardProps * @prop {number} zoomLevel @@ -122,7 +42,7 @@ export const OfflineMapInfo = ({ mapId, currentMapId }) => { */ /** @param {OfflineAreaCardProps} props */ -const OfflineAreaCard = ({ zoomLevel, title, size }) => { +export const OfflineAreaCard = ({ zoomLevel, title, size }) => { const classes = useStyles() const lvlOfDetail = React.useMemo(() => { diff --git a/src/renderer/components/BackgroundMaps/OfflineMapInfo.js b/src/renderer/components/BackgroundMaps/OfflineMapInfo.js new file mode 100644 index 00000000..4b3ff598 --- /dev/null +++ b/src/renderer/components/BackgroundMaps/OfflineMapInfo.js @@ -0,0 +1,94 @@ +// @ts-check +import { Button, Fade, makeStyles, Paper, Typography } from '@material-ui/core' +import * as React from 'react' +import { defineMessages, useIntl } from 'react-intl' +import Loading from '../Loading' + +const m = defineMessages({ + // Title for Offline Areas + offlineAreas: 'Offline Areas', + // Button to create an offline area + createOfflineArea: 'Create Offline Area' +}) + +/** + * @typedef OfflineMapInfoProps + * @prop {string} mapId + * @prop {string} currentMapId + */ + +/** @param {OfflineMapInfoProps} props */ +export const OfflineMapInfo = ({ mapId, currentMapId }) => { + const shouldLoad = React.useMemo(() => mapId === currentMapId, [ + mapId, + currentMapId + ]) + + const [info, setInfo] = React.useState(null) + + React.useEffect(() => { + /** + * @param {string} mapId + */ + async function getMapInfo (mapId) { + setTimeout(() => setInfo('Map Title: ' + mapId), 1000) + } + + if (shouldLoad) { + getMapInfo(mapId) + } + }, [shouldLoad, mapId]) + + return shouldLoad ? ( + + + {!info ? : } + + + ) : null +} + +const MapInfo = () => { + const classes = useStyles() + + const { formatMessage: t } = useIntl() + + return ( +
+
+ Map +
+
+
+ {t(m.offlineAreas)} + +
+
+
+
+ ) +} + +const useStyles = makeStyles({ + img: { + width: '100%', + objectFit: 'cover', + height: '100%' + }, + imgContainer: { + width: '100%', + height: '45%' + } +}) diff --git a/src/renderer/components/Settings/BGMaps.js b/src/renderer/components/Settings/BGMaps.js index 7776d448..ea9889ff 100644 --- a/src/renderer/components/Settings/BGMaps.js +++ b/src/renderer/components/Settings/BGMaps.js @@ -7,8 +7,8 @@ import { defineMessages, useIntl } from 'react-intl' import Typography from '@material-ui/core/Typography' import Loader from '../../components/Loader' -import { MapCard } from '../MapCard' -import { OfflineMapInfo } from '../OfflineMapInfo' +import { MapCard } from '../BackgroundMaps/MapCard' +import { OfflineMapInfo } from '../BackgroundMaps/OfflineMapInfo' const m = defineMessages({ // Button to add map background @@ -21,45 +21,6 @@ const m = defineMessages({ backToSettings: 'Back to Settings' }) -const useStyles = makeStyles({ - sidePanel: { - width: 'auto', - borderRight: '1px solid #E0E0E0', - height: '100%', - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - minWidth: '35%' - }, - buttonContainer: { - display: 'flex', - justifyContent: 'space-between', - padding: 20 - }, - button: { - textTransform: 'none' - }, - firstButton: { - marginRight: 10 - }, - noMapContainer: { - padding: 40 - }, - backHeader: { - justifyContent: 'flex-start', - alignSelf: 'flex-start', - paddingLeft: 20, - paddingTop: 20, - paddingBottom: 20, - width: '100%', - display: 'flex', - textTransform: 'none', - '& :first-child': { - marginRight: 20 - } - } -}) - /** @typedef {{mapId:string, mapTitle:string, size:number, offlineAreaCount:number}} OfflineMap */ /** @@ -134,7 +95,6 @@ export const BGMaps = ({ setCurrentTab }) => { ) : ( offlineMaps.map(offlineMap => ( { ) } + +const useStyles = makeStyles({ + sidePanel: { + width: 'auto', + borderRight: '1px solid #E0E0E0', + height: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + minWidth: '35%' + }, + buttonContainer: { + display: 'flex', + justifyContent: 'space-between', + padding: 20 + }, + button: { + textTransform: 'none' + }, + firstButton: { + marginRight: 10 + }, + noMapContainer: { + padding: 40 + }, + backHeader: { + justifyContent: 'flex-start', + alignSelf: 'flex-start', + paddingLeft: 20, + paddingTop: 20, + paddingBottom: 20, + width: '100%', + display: 'flex', + textTransform: 'none', + '& :first-child': { + marginRight: 20 + } + } +}) From 3a4600761267ebff55857ff227bf20dae3c5825f Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 19 Apr 2022 17:19:57 -0300 Subject: [PATCH 22/46] chore: translations --- messages/renderer/en.json | 140 ++++++++++++++++++++------------------ 1 file changed, 72 insertions(+), 68 deletions(-) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index df814f68..f860287d 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -1,4 +1,76 @@ { + "renderer.components.BackgroundMaps.MapCard.areas": { + "description": "indicates how many offline areas", + "message": "offline areas" + }, + "renderer.components.BackgroundMaps.MapCard.mb": { + "description": "Abbreviation for megabytes", + "message": "MB" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.createOfflineArea": { + "description": "Button to create an offline area", + "message": "Create Offline Area" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailAddress": { + "description": "Level of detail seen on map - can see addresses on map", + "message": "Address" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailCity": { + "description": "Level of detail seen on map - can see most Cities on Map", + "message": "City" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailGlobal": { + "description": "Level of detail seen on map - farthest zoom level", + "message": "Global" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailLargeCountry": { + "description": "Level of detail seen on map - can see large countries", + "message": "Large Country" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailLargeMetro": { + "description": "Level of detail seen on map - can see details of large metropolitan areas", + "message": "Large Metropolitan Area" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailSmallCountry": { + "description": "Level of detail seen on map - can see smaller countries", + "message": "Small Country" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailSmallRoad": { + "description": "Level of detail seen on map - can see small roads on map", + "message": "Small Road" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailStreet": { + "description": "Level of detail seen on map - can see most streets on map", + "message": "Street" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailStreetBlock": { + "description": "Level of detail seen on map - can see details of street blocks on map", + "message": "Street Block" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailStreetIntersection": { + "description": "Level of detail seen on map - can see street intersections on map", + "message": "Street Intersection" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailSubcontinent": { + "description": "Level of detail seen on map - second farthest zoom level", + "message": "Subcontinent" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailTown": { + "description": "Level of detail seen on map - can see most towns on map", + "message": "Town" + }, + "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailVillage": { + "description": "Level of detail seen on map - can see villages on map", + "message": "Village" + }, + "renderer.components.BackgroundMaps.OfflineMapInfo.createOfflineArea": { + "description": "Button to create an offline area", + "message": "Create Offline Area" + }, + "renderer.components.BackgroundMaps.OfflineMapInfo.offlineAreas": { + "description": "Title for Offline Areas", + "message": "Offline Areas" + }, "renderer.components.Home.mapeditor": { "description": "MapEditor tab label", "message": "Territory" @@ -18,14 +90,6 @@ "description": "Displayed whilst observations and presets load", "message": "Loading…" }, - "renderer.components.MapCard.areas": { - "description": "indicates how many offline areas", - "message": "offline areas" - }, - "renderer.components.MapCard.mb": { - "description": "Abbreviation for megabytes", - "message": "MB" - }, "renderer.components.MapEditor.ExportButton.closeButton": { "description": "Close button after export error", "message": "Close" @@ -472,66 +536,6 @@ "description": "Name to show for an observation when it does not match any preset", "message": "Observation" }, - "renderer.components.OfflineMapInfo.createOfflineArea": { - "description": "Button to create an offline area", - "message": "Create Offline Area" - }, - "renderer.components.OfflineMapInfo.lvlDetailAddress": { - "description": "Level of detail seen on map - can see addresses on map", - "message": "Address" - }, - "renderer.components.OfflineMapInfo.lvlDetailCity": { - "description": "Level of detail seen on map - can see most Cities on Map", - "message": "City" - }, - "renderer.components.OfflineMapInfo.lvlDetailGlobal": { - "description": "Level of detail seen on map - farthest zoom level", - "message": "Global" - }, - "renderer.components.OfflineMapInfo.lvlDetailLargeCountry": { - "description": "Level of detail seen on map - can see large countries", - "message": "Large Country" - }, - "renderer.components.OfflineMapInfo.lvlDetailLargeMetro": { - "description": "Level of detail seen on map - can see details of large metropolitan areas", - "message": "Large Metropolitan Area" - }, - "renderer.components.OfflineMapInfo.lvlDetailSmallCountry": { - "description": "Level of detail seen on map - can see smaller countries", - "message": "Small Country" - }, - "renderer.components.OfflineMapInfo.lvlDetailSmallRoad": { - "description": "Level of detail seen on map - can see small roads on map", - "message": "Small Road" - }, - "renderer.components.OfflineMapInfo.lvlDetailStreet": { - "description": "Level of detail seen on map - can see most streets on map", - "message": "Street" - }, - "renderer.components.OfflineMapInfo.lvlDetailStreetBlock": { - "description": "Level of detail seen on map - can see details of street blocks on map", - "message": "Street Block" - }, - "renderer.components.OfflineMapInfo.lvlDetailStreetIntersection": { - "description": "Level of detail seen on map - can see street intersections on map", - "message": "Street Intersection" - }, - "renderer.components.OfflineMapInfo.lvlDetailSubcontinent": { - "description": "Level of detail seen on map - second farthest zoom level", - "message": "Subcontinent" - }, - "renderer.components.OfflineMapInfo.lvlDetailTown": { - "description": "Level of detail seen on map - can see most towns on map", - "message": "Town" - }, - "renderer.components.OfflineMapInfo.lvlDetailVillage": { - "description": "Level of detail seen on map - can see villages on map", - "message": "Village" - }, - "renderer.components.OfflineMapInfo.offlineAreas": { - "description": "Title for Offline Areas", - "message": "Offline Areas" - }, "renderer.components.Settings.BGMaps.addMap": { "description": "Button to add map background", "message": "Add Map Background" From 11860e617564c471ce4541e90fe5798665b77633 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 20 Apr 2022 20:57:38 -0300 Subject: [PATCH 23/46] chore: Added offline area cards --- .../components/BackgroundMaps/BGMapInfo.js | 184 ++++++++++++++++++ .../components/BackgroundMaps/MapCard.js | 28 ++- .../BackgroundMaps/OfflineAreaCard.js | 40 +++- .../BackgroundMaps/OfflineMapInfo.js | 94 --------- .../components/BackgroundMaps/SidePanel.js | 105 ++++++++++ src/renderer/components/Settings/BGMaps.js | 140 +++---------- src/renderer/components/Settings/index.js | 79 ++++---- tsconfig.json | 2 + 8 files changed, 413 insertions(+), 259 deletions(-) create mode 100644 src/renderer/components/BackgroundMaps/BGMapInfo.js delete mode 100644 src/renderer/components/BackgroundMaps/OfflineMapInfo.js create mode 100644 src/renderer/components/BackgroundMaps/SidePanel.js diff --git a/src/renderer/components/BackgroundMaps/BGMapInfo.js b/src/renderer/components/BackgroundMaps/BGMapInfo.js new file mode 100644 index 00000000..a7f03222 --- /dev/null +++ b/src/renderer/components/BackgroundMaps/BGMapInfo.js @@ -0,0 +1,184 @@ +import { Button, Fade, makeStyles, Paper, Typography } from '@material-ui/core' +import * as React from 'react' +import { defineMessages, useIntl } from 'react-intl' +import ReactMapboxGl from 'react-mapbox-gl' +import DeleteIcon from '@material-ui/icons/DeleteForeverOutlined' + +import { MAPBOX_ACCESS_TOKEN } from '../../../../config' +import Loading from '../Loading' +import { OfflineAreaCard } from './OfflineAreaCard' + +const m = defineMessages({ + // Title for Offline Areas + offlineAreas: 'Offline Areas', + // Button to create an offline area + createOfflineArea: 'Create Offline Area', + // Button to delete style + deleteStyle: 'Delete Style' +}) + +/** @typedef {{id:string, size:number, zoomLevel:number, title:string}} OfflineArea */ + +/** @typedef {{styleId:string, styleJson:import('mapbox-gl').Style, styleTitle:string, offlineAreas:OfflineArea[]}} BGMap */ + +/** + * @typedef BGMapInfoProps + * @prop {string} bgMapId + * @prop {string} mapIDBeingViewed + */ + +/** @param {BGMapInfoProps} props */ +export const BGMapInfo = ({ bgMapId, mapIDBeingViewed }) => { + const shouldLoad = React.useMemo(() => bgMapId === mapIDBeingViewed, [ + bgMapId, + mapIDBeingViewed + ]) + + /** @type {BGMap | null} */ + const initialBgMap = /** {const} */ (null) + + const [bgMap, setbgMap] = React.useState(initialBgMap) + + React.useEffect(() => { + /** + * @param {string} stylesId + * @returns {Promise} + */ + async function getMapInfo (stylesId) { + // To do: Api Call to get map info + return { + styleId: bgMapId, + styleJson: { layers: [], sources: {}, version: 1 }, + styleTitle: `Map ${bgMapId}`, + offlineAreas: [ + { + title: 'offline-area-1', + size: 100, + zoomLevel: 10, + id: 'idMap1' + }, + { + title: 'offline-area-2', + size: 200, + zoomLevel: 20, + id: 'idMap2' + }, + { + title: 'offline-area-3', + size: 300, + zoomLevel: 30, + id: 'idMap3' + } + ] + } + } + + if (shouldLoad) { + getMapInfo(bgMapId).then(styles => setbgMap(styles)) + } + }, [shouldLoad, bgMapId]) + + return shouldLoad ? ( + + + {!bgMap ? : } + + + ) : null +} + +/** + * @typedef MapInfoProps + * @prop {BGMap} bgMap + * + */ + +/** @param {MapInfoProps} props */ +const MapInfo = ({ bgMap }) => { + const { offlineAreas, styleTitle } = bgMap + + const classes = useStyles() + + const { formatMessage: t } = useIntl() + + const MapBox = ReactMapboxGl({ + accessToken: MAPBOX_ACCESS_TOKEN + }) + + return ( + + {/* Banner */} + + {styleTitle} + +
+ +
+
+ + {/* Map */} + + + {/* Text under map: */} +
+ {/* Title and 'Create Offline Area' button: */} +
+ {t(m.offlineAreas)} + +
+ + {/* List of offline areas Card */} +
+ {offlineAreas.map(offlineArea => ( + + ))} +
+
+
+ ) +} + +const useStyles = makeStyles({ + buttonContainer: { + display: 'flex', + justifyContent: 'space-between', + alignItems: 'center' + }, + banner: { + width: '100%', + display: 'flex', + justifyContent: 'space-between', + padding: '10px 20px' + }, + textBanner: { + display: 'flex', + justifyContent: 'space-evenly' + }, + offlineCardContainer: { + display: 'flex', + flexWrap: 'wrap', + justifyContent: 'space-evenly' + } +}) diff --git a/src/renderer/components/BackgroundMaps/MapCard.js b/src/renderer/components/BackgroundMaps/MapCard.js index 6194dd7b..170e9b09 100644 --- a/src/renderer/components/BackgroundMaps/MapCard.js +++ b/src/renderer/components/BackgroundMaps/MapCard.js @@ -3,6 +3,9 @@ import * as React from 'react' import Button from '@material-ui/core/Button' import { makeStyles, Typography } from '@material-ui/core' import { useIntl, defineMessages } from 'react-intl' +import ReactMapboxGl from 'react-mapbox-gl' + +import { MAPBOX_ACCESS_TOKEN } from '../../../../config' const m = defineMessages({ // Abbreviation for megabytes @@ -28,6 +31,19 @@ export const MapCard = ({ offlineMap, setMap, mapBeingViewed }) => { [offlineMap, mapBeingViewed] ) + const Mapbox = React.useMemo( + () => + ReactMapboxGl({ + accessToken: MAPBOX_ACCESS_TOKEN, + dragRotate: false, + pitchWithRotate: false, + attributionControl: false, + injectCSS: false, + interactive: false + }), + [] + ) + return ( - -
- - - ) -} - -const useStyles = makeStyles({ - img: { - width: '100%', - objectFit: 'cover', - height: '100%' - }, - imgContainer: { - width: '100%', - height: '45%' - } -}) diff --git a/src/renderer/components/BackgroundMaps/SidePanel.js b/src/renderer/components/BackgroundMaps/SidePanel.js new file mode 100644 index 00000000..62e02cac --- /dev/null +++ b/src/renderer/components/BackgroundMaps/SidePanel.js @@ -0,0 +1,105 @@ +// @ts-check +import { Button, makeStyles } from '@material-ui/core' +import ChevronLeft from '@material-ui/icons/ChevronLeft' +import * as React from 'react' +import { defineMessages, useIntl } from 'react-intl' +import Loader from '../Loader' +import { MapCard } from './MapCard' + +const m = defineMessages({ + // Button to add map background + addMap: 'Add Map Background', + // Button to create an offline area for a map backgroun + createOfflineMap: 'Create Offline Map', + // button to go back to settings + backToSettings: 'Back to Settings' +}) +/** + * @typedef SidePanelProps + * @prop {()=>void} openSettings + * @prop {import('../Settings/BGMaps').OfflineMap[]|false} offlineMaps + * @prop {string|false} mapValue + * @prop {React.Dispatch>} setMapValue + */ + +/** @param {SidePanelProps} param */ +export const SidePanel = ({ + openSettings, + offlineMaps, + mapValue, + setMapValue +}) => { + const { formatMessage: t } = useIntl() + + const classes = useStyles() + + return ( +
+ +
+ + {/* */} +
+ + {!offlineMaps ? ( + + ) : ( + offlineMaps.map(offlineMap => ( + + )) + )} +
+ ) +} + +const useStyles = makeStyles({ + sidePanel: { + width: 'auto', + borderRight: '1px solid #E0E0E0', + height: '100%', + display: 'flex', + flexDirection: 'column', + alignItems: 'center', + minWidth: '35%' + }, + buttonContainer: { + display: 'flex', + justifyContent: 'space-between', + padding: 20 + }, + button: { + textTransform: 'none', + fontSize: 12 + }, + firstButton: { + marginRight: 10 + }, + backHeader: { + justifyContent: 'flex-start', + alignSelf: 'flex-start', + paddingLeft: 20, + paddingTop: 20, + paddingBottom: 20, + width: '100%', + display: 'flex', + textTransform: 'none', + '& :first-child': { + marginRight: 20 + } + } +}) diff --git a/src/renderer/components/Settings/BGMaps.js b/src/renderer/components/Settings/BGMaps.js index ea9889ff..051a60ab 100644 --- a/src/renderer/components/Settings/BGMaps.js +++ b/src/renderer/components/Settings/BGMaps.js @@ -1,40 +1,29 @@ // @ts-check import * as React from 'react' -import Button from '@material-ui/core/Button' -import ChevronLeft from '@material-ui/icons/ChevronLeft' -import { makeStyles } from '@material-ui/core' import { defineMessages, useIntl } from 'react-intl' import Typography from '@material-ui/core/Typography' -import Loader from '../../components/Loader' -import { MapCard } from '../BackgroundMaps/MapCard' -import { OfflineMapInfo } from '../BackgroundMaps/OfflineMapInfo' +import { BGMapInfo } from '../BackgroundMaps/BGMapInfo' +import { SidePanel } from '../BackgroundMaps/SidePanel' const m = defineMessages({ - // Button to add map background - addMap: 'Add Map Background', - // Button to create an offline area for a map backgroun - createOfflineMap: 'Create Offline Map', // Title for description of offline maps - mapBackgroundTitle: 'Managing Map Backgrounds and Offline Areas', - // button to go back to settings - backToSettings: 'Back to Settings' + mapBackgroundTitle: 'Managing Map Backgrounds and Offline Areas' }) -/** @typedef {{mapId:string, mapTitle:string, size:number, offlineAreaCount:number}} OfflineMap */ +/** @typedef {{mapId:string, mapTitle:string, size:number, offlineAreaCount:number, styleJson:import('mapbox-gl').Style}} OfflineMap */ /** * @typedef BGMapsProps - * @prop {React.Dispatch>} setCurrentTab + * @prop {()=>void} openSettings */ /** @param {BGMapsProps} param */ -export const BGMaps = ({ setCurrentTab }) => { - const classes = useStyles() +export const BGMaps = ({ openSettings }) => { const { formatMessage: t } = useIntl() - /** @type {OfflineMap[]} */ - const initialMapState = /** {const} */ undefined + /** @type {OfflineMap[]|false} */ + const initialMapState = /** {const} */ (false) const [offlineMaps, setOfflineMaps] = React.useState(initialMapState) @@ -54,13 +43,15 @@ export const BGMaps = ({ setCurrentTab }) => { mapId: '1', mapTitle: 'Map 1', size: 100, - offlineAreaCount: 10 + offlineAreaCount: 10, + styleJson: { layers: [], sources: {}, version: 1 } }, { mapId: '2', mapTitle: 'Map 2', size: 200, - offlineAreaCount: 20 + offlineAreaCount: 20, + styleJson: { layers: [], sources: {}, version: 1 } } ] } @@ -70,42 +61,15 @@ export const BGMaps = ({ setCurrentTab }) => { return ( -
- -
- - -
- - {offlineMaps === undefined ? ( - - ) : ( - offlineMaps.map(offlineMap => ( - - )) - )} -
- - {!mapValue ? ( -
+ + + {!mapValue || !offlineMaps ? ( +
{t(m.mapBackgroundTitle)} @@ -117,31 +81,16 @@ export const BGMaps = ({ setCurrentTab }) => { pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim - ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut - aliquip ex ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum. -
- Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do - eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim - ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut - aliquip ex ea commodo consequat. Duis aute irure dolor in - reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla - pariatur. Excepteur sint occaecat cupidatat non proident, sunt in - culpa qui officia deserunt mollit anim id est laborum.
) : ( - // Lazy loading each one here: aka will only load when clicked + // Lazy loading each one here: aka will only load when clicked {offlineMaps.map(offlineMap => ( - ))} @@ -149,42 +98,3 @@ export const BGMaps = ({ setCurrentTab }) => { ) } - -const useStyles = makeStyles({ - sidePanel: { - width: 'auto', - borderRight: '1px solid #E0E0E0', - height: '100%', - display: 'flex', - flexDirection: 'column', - alignItems: 'center', - minWidth: '35%' - }, - buttonContainer: { - display: 'flex', - justifyContent: 'space-between', - padding: 20 - }, - button: { - textTransform: 'none' - }, - firstButton: { - marginRight: 10 - }, - noMapContainer: { - padding: 40 - }, - backHeader: { - justifyContent: 'flex-start', - alignSelf: 'flex-start', - paddingLeft: 20, - paddingTop: 20, - paddingBottom: 20, - width: '100%', - display: 'flex', - textTransform: 'none', - '& :first-child': { - marginRight: 20 - } - } -}) diff --git a/src/renderer/components/Settings/index.js b/src/renderer/components/Settings/index.js index 3d6f5ef5..39bb5d09 100644 --- a/src/renderer/components/Settings/index.js +++ b/src/renderer/components/Settings/index.js @@ -14,45 +14,11 @@ const m = defineMessages({ aboutMapeo: 'About Mapeo' }) -const useStyles = makeStyles({ - container: { - display: 'flex', - textAlign: 'start', - height: '100%', - flex: 1 - }, - tabs: { - padding: '6px 24px 6px 40', - textTransform: 'none', - textAlign: 'left', - display: 'flex', - width: 'auto', - minWidth: '30%', - fontSize: 16, - lineHeight: '30px', - height: '100%', - '& .MuiTab-wrapper': { - justifyContent: 'flex-start', - flexDirection: 'row', - alignItems: 'center' - }, - '& .MuiSvgIcon-root': { - marginRight: 20, - marginLeft: 20 - }, - '& .MuiTabs-root': { - flex: 1 - } - } -}) - const FADE_DURATION = 700 -/** @typedef {import('./SettingsMenu').SettingsTabs} SettingsTabs */ - /** @typedef {'BackgroundMap' | 'AboutMapeo'} SettingTabId */ -/** @type {SettingsTabs[]} */ +/** @type {import('./SettingsMenu').SettingsTabs[]} */ const tabs = /** @typedef {const} */ [ { tabId: 'BackgroundMap', @@ -78,15 +44,13 @@ const tabs = /** @typedef {const} */ [ export const Settings = ({ reset, setReset, fadeIn }) => { const [menuVisible, setMenuVisibility] = React.useState(true) - /** @type {SettingsTabs['tabId'] | false} */ + /** @type {import('./SettingsMenu').SettingsTabs['tabId'] | false} */ const initialState = /** {const} */ (false) const [tabValue, setTabValue] = React.useState(initialState) const classes = useStyles() - // bit hacky: when user presses settingsTab, we DO NOT WANT background map to be selected - // because when background map is selected, the entire settings menu is hidden if (reset) { setReset(false) if (tabValue === 'BackgroundMap') setTabValue(false) @@ -101,6 +65,7 @@ export const Settings = ({ reset, setReset, fadeIn }) => { if (!menuVisible) setMenuVisibility(true) }, [tabValue, menuVisible]) + // Controlling most of the fade in animations here return ( @@ -119,7 +84,11 @@ export const Settings = ({ reset, setReset, fadeIn }) => { {tabValue === 'BackgroundMap' && ( - + { + setTabValue(false) + }} + /> )} @@ -133,3 +102,35 @@ export const Settings = ({ reset, setReset, fadeIn }) => { ) } + +const useStyles = makeStyles({ + container: { + display: 'flex', + textAlign: 'start', + height: '100%', + flex: 1 + }, + tabs: { + padding: '6px 24px 6px 40', + textTransform: 'none', + textAlign: 'left', + display: 'flex', + width: 'auto', + minWidth: '30%', + fontSize: 16, + lineHeight: '30px', + height: '100%', + '& .MuiTab-wrapper': { + justifyContent: 'flex-start', + flexDirection: 'row', + alignItems: 'center' + }, + '& .MuiSvgIcon-root': { + marginRight: 20, + marginLeft: 20 + }, + '& .MuiTabs-root': { + flex: 1 + } + } +}) diff --git a/tsconfig.json b/tsconfig.json index 1f74d142..3e1a1baf 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -10,6 +10,8 @@ "allowJs": true, "checkJs": false, "noEmit": true, + "strict": true, + "alwaysStrict": true, "typeRoots": ["types", "node_modules/@types"] }, "include": ["src/main/**/*", "src/workers/**/*", "index.js", "types/**/*"], From 9f3a03542e43b143f4ec457ffa42982f74aad71a Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 20 Apr 2022 20:59:18 -0300 Subject: [PATCH 24/46] chore: translations --- messages/renderer/en.json | 48 ++++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 18 deletions(-) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index f860287d..60b562d7 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -1,4 +1,16 @@ { + "renderer.components.BackgroundMaps.BGMapInfo.createOfflineArea": { + "description": "Button to create an offline area", + "message": "Create Offline Area" + }, + "renderer.components.BackgroundMaps.BGMapInfo.deleteStyle": { + "description": "Button to delete style", + "message": "Delete Style" + }, + "renderer.components.BackgroundMaps.BGMapInfo.offlineAreas": { + "description": "Title for Offline Areas", + "message": "Offline Areas" + }, "renderer.components.BackgroundMaps.MapCard.areas": { "description": "indicates how many offline areas", "message": "offline areas" @@ -63,13 +75,25 @@ "description": "Level of detail seen on map - can see villages on map", "message": "Village" }, - "renderer.components.BackgroundMaps.OfflineMapInfo.createOfflineArea": { - "description": "Button to create an offline area", - "message": "Create Offline Area" + "renderer.components.BackgroundMaps.OfflineAreaCard.mb": { + "description": "Abbreviation for megabytes", + "message": "MB" }, - "renderer.components.BackgroundMaps.OfflineMapInfo.offlineAreas": { - "description": "Title for Offline Areas", - "message": "Offline Areas" + "renderer.components.BackgroundMaps.OfflineAreaCard.zoomLevel": { + "description": "indicated zoom level", + "message": "Zoom Level" + }, + "renderer.components.BackgroundMaps.SidePanel.addMap": { + "description": "Button to add map background", + "message": "Add Map Background" + }, + "renderer.components.BackgroundMaps.SidePanel.backToSettings": { + "description": "button to go back to settings", + "message": "Back to Settings" + }, + "renderer.components.BackgroundMaps.SidePanel.createOfflineMap": { + "description": "Button to create an offline area for a map backgroun", + "message": "Create Offline Map" }, "renderer.components.Home.mapeditor": { "description": "MapEditor tab label", @@ -536,18 +560,6 @@ "description": "Name to show for an observation when it does not match any preset", "message": "Observation" }, - "renderer.components.Settings.BGMaps.addMap": { - "description": "Button to add map background", - "message": "Add Map Background" - }, - "renderer.components.Settings.BGMaps.backToSettings": { - "description": "button to go back to settings", - "message": "Back to Settings" - }, - "renderer.components.Settings.BGMaps.createOfflineMap": { - "description": "Button to create an offline area for a map backgroun", - "message": "Create Offline Map" - }, "renderer.components.Settings.BGMaps.mapBackgroundTitle": { "description": "Title for description of offline maps", "message": "Managing Map Backgrounds and Offline Areas" From 9e4edb46a638518e8e49a2d7d120f6d5af77b164 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 20 Apr 2022 21:05:07 -0300 Subject: [PATCH 25/46] chore: Added type checking --- src/renderer/components/BackgroundMaps/BGMapInfo.js | 1 + 1 file changed, 1 insertion(+) diff --git a/src/renderer/components/BackgroundMaps/BGMapInfo.js b/src/renderer/components/BackgroundMaps/BGMapInfo.js index a7f03222..94c0721a 100644 --- a/src/renderer/components/BackgroundMaps/BGMapInfo.js +++ b/src/renderer/components/BackgroundMaps/BGMapInfo.js @@ -1,3 +1,4 @@ +// @ts-check import { Button, Fade, makeStyles, Paper, Typography } from '@material-ui/core' import * as React from 'react' import { defineMessages, useIntl } from 'react-intl' From c36ab9e35ae35e131a869f31f47895fad13785a9 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 25 Apr 2022 19:59:22 -0300 Subject: [PATCH 26/46] chore: Cleaned up buttons --- .../components/BackgroundMaps/BGMapInfo.js | 25 +++++++++++- .../components/BackgroundMaps/MapCard.js | 4 +- .../components/BackgroundMaps/SidePanel.js | 38 ++++++++++++++++++- .../components/Settings/AboutMapeo.js | 27 +++++++++++++ src/renderer/components/Settings/index.js | 9 +++-- 5 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 src/renderer/components/Settings/AboutMapeo.js diff --git a/src/renderer/components/BackgroundMaps/BGMapInfo.js b/src/renderer/components/BackgroundMaps/BGMapInfo.js index 94c0721a..caf8cba4 100644 --- a/src/renderer/components/BackgroundMaps/BGMapInfo.js +++ b/src/renderer/components/BackgroundMaps/BGMapInfo.js @@ -8,6 +8,7 @@ import DeleteIcon from '@material-ui/icons/DeleteForeverOutlined' import { MAPBOX_ACCESS_TOKEN } from '../../../../config' import Loading from '../Loading' import { OfflineAreaCard } from './OfflineAreaCard' +import { remote } from 'electron' const m = defineMessages({ // Title for Offline Areas @@ -15,7 +16,11 @@ const m = defineMessages({ // Button to create an offline area createOfflineArea: 'Create Offline Area', // Button to delete style - deleteStyle: 'Delete Style' + deleteStyle: 'Delete Style', + // Title for error message when deleting style + deleteErrorTitle: 'Error Deleting Style', + // Description for error message when deleting style, + deleteErrorDescription: 'There was an error deleting the style' }) /** @typedef {{id:string, size:number, zoomLevel:number, title:string}} OfflineArea */ @@ -113,6 +118,22 @@ const MapInfo = ({ bgMap }) => { accessToken: MAPBOX_ACCESS_TOKEN }) + /** + * + * @param {string} mapId + */ + function deleteMap (mapId) { + // To do: Api Call to delete map + try { + return + } catch (err) { + remote.dialog.showErrorBox( + t(m.deleteErrorTitle), + t(m.deleteErrorDescription) + ': ' + err + ) + } + } + return ( {/* Banner */} @@ -120,7 +141,7 @@ const MapInfo = ({ bgMap }) => { {styleTitle}
-
- {offlineMap.mapTitle} - + {offlineMap.mapTitle} + {offlineMap.size} {t(m.mb)} diff --git a/src/renderer/components/BackgroundMaps/SidePanel.js b/src/renderer/components/BackgroundMaps/SidePanel.js index 62e02cac..5b5d84b4 100644 --- a/src/renderer/components/BackgroundMaps/SidePanel.js +++ b/src/renderer/components/BackgroundMaps/SidePanel.js @@ -1,6 +1,7 @@ // @ts-check import { Button, makeStyles } from '@material-ui/core' import ChevronLeft from '@material-ui/icons/ChevronLeft' +import { remote } from 'electron' import * as React from 'react' import { defineMessages, useIntl } from 'react-intl' import Loader from '../Loader' @@ -12,7 +13,12 @@ const m = defineMessages({ // Button to create an offline area for a map backgroun createOfflineMap: 'Create Offline Map', // button to go back to settings - backToSettings: 'Back to Settings' + backToSettings: 'Back to Settings', + // Title for import errot pop up dialog, + importErrorTitle: 'Background Maps Import Error', + // Description of map import error + importErrorDescription: + 'There was an error importing the background maps. Please try again.' }) /** * @typedef SidePanelProps @@ -33,6 +39,35 @@ export const SidePanel = ({ const classes = useStyles() + async function selectMbTileFile () { + const result = await remote.dialog.showOpenDialog({ + filters: [{ name: 'MbTiles', extensions: ['mbtiles'] }], + properties: ['openFile'] + }) + + if (result.canceled) return + + if (!result.filePaths || !result.filePaths.length) return + + try { + const filePath = result.filePaths[0] + // to do: Api call to import map + } catch (err) { + onError(err) + } + + /** + * + * @param {string} err + */ + function onError (err) { + remote.dialog.showErrorBox( + t(m.importErrorTitle), + t(m.importErrorDescription) + ': ' + err + ) + } + } + return (
- - {/* List of offline areas Card */} -
- {offlineAreas.map(offlineArea => ( - - ))} -
) diff --git a/src/renderer/components/BackgroundMaps/MapCard.js b/src/renderer/components/BackgroundMaps/MapCard.js index 1815e497..acd42dcb 100644 --- a/src/renderer/components/BackgroundMaps/MapCard.js +++ b/src/renderer/components/BackgroundMaps/MapCard.js @@ -16,9 +16,9 @@ const m = defineMessages({ /** * @typedef MapCardProps - * @prop {import('../Settings/BGMaps').OfflineMap} offlineMap - * @prop {React.Dispatch>} setMap - * @prop {import('../Settings/BGMaps').OfflineMap['mapId'] |false } mapBeingViewed + * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo} offlineMap + * @prop {React.Dispatch>} setMap + * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo['id'] |false } mapBeingViewed */ /** @param {MapCardProps} param */ @@ -26,10 +26,10 @@ export const MapCard = ({ offlineMap, setMap, mapBeingViewed }) => { const classes = useStyles() const { formatMessage: t } = useIntl() - const isBeingViewed = React.useMemo( - () => offlineMap.mapId === mapBeingViewed, - [offlineMap, mapBeingViewed] - ) + const isBeingViewed = React.useMemo(() => offlineMap.id === mapBeingViewed, [ + offlineMap, + mapBeingViewed + ]) const Mapbox = React.useMemo( () => @@ -48,7 +48,7 @@ export const MapCard = ({ offlineMap, setMap, mapBeingViewed }) => {
diff --git a/src/renderer/components/BackgroundMaps/SidePanel.js b/src/renderer/components/BackgroundMaps/SidePanel.js index 4b7c2d97..cbb04517 100644 --- a/src/renderer/components/BackgroundMaps/SidePanel.js +++ b/src/renderer/components/BackgroundMaps/SidePanel.js @@ -4,6 +4,7 @@ import ChevronLeft from '@material-ui/icons/ChevronLeft' import { remote } from 'electron' import * as React from 'react' import { defineMessages, useIntl } from 'react-intl' +import { useMapServerMutation } from '../../hooks/useMapServerMutation' import Loader from '../Loader' import { MapCard } from './MapCard' @@ -23,8 +24,9 @@ const m = defineMessages({ /** * @typedef SidePanelProps * @prop {()=>void} openSettings - * @prop {import('../Settings/BGMaps').OfflineMap[]|false} offlineMaps + * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo[]|false} offlineMaps * @prop {string|false} mapValue + * @prop {boolean} isFetching * @prop {React.Dispatch>} setMapValue */ @@ -33,12 +35,15 @@ export const SidePanel = ({ openSettings, offlineMaps, mapValue, - setMapValue + setMapValue, + isFetching }) => { const { formatMessage: t } = useIntl() const classes = useStyles() + const mutation = useMapServerMutation('post', `/tilesets/import`) + async function selectMbTileFile () { const result = await remote.dialog.showOpenDialog({ filters: [{ name: 'MbTiles', extensions: ['mbtiles'] }], @@ -50,8 +55,8 @@ export const SidePanel = ({ if (!result.filePaths || !result.filePaths.length) return try { - // const filePath = result.filePaths[0] - // to do: Api call to import map + const filePath = result.filePaths[0] + mutation.mutate({ filePath }) } catch (err) { onError(err) } @@ -82,23 +87,20 @@ export const SidePanel = ({ > {t(m.addMap)} - {/* */}
- {!offlineMaps ? ( + {isFetching ? ( - ) : ( + ) : offlineMaps ? ( offlineMaps.map(offlineMap => ( )) - )} + ) : null} ) } diff --git a/src/renderer/components/Settings/BGMaps.js b/src/renderer/components/Settings/BackgroundMaps.js similarity index 54% rename from src/renderer/components/Settings/BGMaps.js rename to src/renderer/components/Settings/BackgroundMaps.js index 051a60ab..55ceb292 100644 --- a/src/renderer/components/Settings/BGMaps.js +++ b/src/renderer/components/Settings/BackgroundMaps.js @@ -3,72 +3,47 @@ import * as React from 'react' import { defineMessages, useIntl } from 'react-intl' import Typography from '@material-ui/core/Typography' -import { BGMapInfo } from '../BackgroundMaps/BGMapInfo' +import { BackgroundMapInfo } from '../BackgroundMaps/BackgroundMapInfo' import { SidePanel } from '../BackgroundMaps/SidePanel' +import { useMapServerQuery } from '../../hooks/useMapServerQuery' const m = defineMessages({ // Title for description of offline maps mapBackgroundTitle: 'Managing Map Backgrounds and Offline Areas' }) -/** @typedef {{mapId:string, mapTitle:string, size:number, offlineAreaCount:number, styleJson:import('mapbox-gl').Style}} OfflineMap */ +/** @typedef {import('../../hooks/useMapServerQuery').MapServerStyleInfo} MapServerStyleInfo */ /** - * @typedef BGMapsProps + * @typedef BackgroundMapsProps * @prop {()=>void} openSettings */ -/** @param {BGMapsProps} param */ -export const BGMaps = ({ openSettings }) => { +/** @param {BackgroundMapsProps} param */ +export const BackgroundMaps = ({ openSettings }) => { const { formatMessage: t } = useIntl() - /** @type {OfflineMap[]|false} */ + /** @type {MapServerStyleInfo[]|false} */ const initialMapState = /** {const} */ (false) - const [offlineMaps, setOfflineMaps] = React.useState(initialMapState) - - /** @type {OfflineMap['mapId']|false} */ + /** @type {MapServerStyleInfo['id']|false} */ const initialMapId = /** {const} */ (false) const [mapValue, setMapValue] = React.useState(initialMapId) - React.useEffect(() => { - // To Do: API call to get map value - /** - * @returns {OfflineMap[]} - */ - function getListOfOfflineMaps () { - return [ - { - mapId: '1', - mapTitle: 'Map 1', - size: 100, - offlineAreaCount: 10, - styleJson: { layers: [], sources: {}, version: 1 } - }, - { - mapId: '2', - mapTitle: 'Map 2', - size: 200, - offlineAreaCount: 20, - styleJson: { layers: [], sources: {}, version: 1 } - } - ] - } - - setOfflineMaps(getListOfOfflineMaps()) - }, []) + const { data, isFetching } = useMapServerQuery('/styles') return ( - {!mapValue || !offlineMaps ? ( + {!mapValue || !data ? (
{t(m.mapBackgroundTitle)} @@ -84,13 +59,13 @@ export const BGMaps = ({ openSettings }) => {
) : ( - // Lazy loading each one here: aka will only load when clicked - {offlineMaps.map(offlineMap => ( - ( + ))} diff --git a/src/renderer/components/Settings/index.js b/src/renderer/components/Settings/index.js index eb6b76fe..b0774fdd 100644 --- a/src/renderer/components/Settings/index.js +++ b/src/renderer/components/Settings/index.js @@ -4,7 +4,7 @@ import { SettingsMenu } from './SettingsMenu' import { defineMessages } from 'react-intl' import MapIcon from '@material-ui/icons/MapOutlined' import InfoIcon from '@material-ui/icons/InfoOutlined' -import { BGMaps } from './BGMaps' +import { BackgroundMaps } from './BackgroundMaps' import { makeStyles } from '@material-ui/core' import Fade from '@material-ui/core/Fade' import Paper from '@material-ui/core/Paper' @@ -85,7 +85,7 @@ export const Settings = ({ reset, setReset, fadeIn }) => { {tabValue === 'BackgroundMap' && ( - { setTabValue(false) }} diff --git a/src/renderer/hooks/useMapServerQuery.d.ts b/src/renderer/hooks/useMapServerQuery.d.ts index 16b57b39..7e4a311c 100644 --- a/src/renderer/hooks/useMapServerQuery.d.ts +++ b/src/renderer/hooks/useMapServerQuery.d.ts @@ -14,7 +14,7 @@ type Unpacked = T extends (infer U)[] type MapServerStyleInfo = Unpacked> type Tileset = Unpacked>; -type MapServerImport = Unpacked>; +export type MapServerImport = Unpacked>; export declare function useMapServerQuery(resourcePath: '/styles', enabled?:boolean): UseQueryResult export declare function useMapServerQuery(resourcePath: `/styles/${string}`,enabled?:boolean): UseQueryResult From 80371093db96aefe93d52ccd7f800c1def50132b Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 6 Dec 2022 20:51:03 -0800 Subject: [PATCH 30/46] chore: translations --- messages/renderer/en.json | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index 182c5fbd..f649711f 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -1,21 +1,21 @@ { - "renderer.components.BackgroundMaps.BGMapInfo.createOfflineArea": { + "renderer.components.BackgroundMaps.BackgroundMapInfo.createOfflineArea": { "description": "Button to create an offline area", "message": "Create Offline Area" }, - "renderer.components.BackgroundMaps.BGMapInfo.deleteErrorDescription": { + "renderer.components.BackgroundMaps.BackgroundMapInfo.deleteErrorDescription": { "description": "Description for error message when deleting style,", "message": "There was an error deleting the style" }, - "renderer.components.BackgroundMaps.BGMapInfo.deleteErrorTitle": { + "renderer.components.BackgroundMaps.BackgroundMapInfo.deleteErrorTitle": { "description": "Title for error message when deleting style", "message": "Error Deleting Style" }, - "renderer.components.BackgroundMaps.BGMapInfo.deleteStyle": { + "renderer.components.BackgroundMaps.BackgroundMapInfo.deleteStyle": { "description": "Button to delete style", "message": "Delete Style" }, - "renderer.components.BackgroundMaps.BGMapInfo.offlineAreas": { + "renderer.components.BackgroundMaps.BackgroundMapInfo.offlineAreas": { "description": "Title for Offline Areas", "message": "Offline Areas" }, @@ -580,7 +580,7 @@ "description": "Used to indicate the version of mapeo the user is using", "message": "Version" }, - "renderer.components.Settings.BGMaps.mapBackgroundTitle": { + "renderer.components.Settings.BackgroundMaps.mapBackgroundTitle": { "description": "Title for description of offline maps", "message": "Managing Map Backgrounds and Offline Areas" }, From 755b8d4121e2ee6739b4f21f18ac4d4ad7e808c9 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 7 Dec 2022 18:58:38 -0800 Subject: [PATCH 31/46] chore: added api logic to ui --- src/renderer/components/BackgroundMaps/BackgroundMapInfo.js | 4 ++-- src/renderer/components/BackgroundMaps/SidePanel.js | 6 +++++- src/renderer/components/Settings/BackgroundMaps.js | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js index f03c0a61..1ccc3ff0 100644 --- a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js +++ b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js @@ -9,7 +9,7 @@ import { MAPBOX_ACCESS_TOKEN } from '../../../../config' import Loading from '../Loading' import { remote } from 'electron' import { useMapServerQuery } from '../../hooks/useMapServerQuery' -// import { useMapServerMutation } from '../../hooks/useMapServerMutation' +import { useMapServerMutation } from '../../hooks/useMapServerMutation' const m = defineMessages({ // Title for Offline Areas @@ -71,7 +71,7 @@ export const BackgroundMapInfo = ({ id, idBeingViewed, setMapValue }) => { /** @param {MapInfoProps} props */ const MapInfo = ({ backgroundMap, id, setMapValue }) => { const { name } = backgroundMap - // const mutation = useMapServerMutation('delete', `/styles/${id}`) + const mutation = useMapServerMutation('delete', `/styles/${id}`) const classes = useStyles() diff --git a/src/renderer/components/BackgroundMaps/SidePanel.js b/src/renderer/components/BackgroundMaps/SidePanel.js index cbb04517..02febb73 100644 --- a/src/renderer/components/BackgroundMaps/SidePanel.js +++ b/src/renderer/components/BackgroundMaps/SidePanel.js @@ -28,6 +28,7 @@ const m = defineMessages({ * @prop {string|false} mapValue * @prop {boolean} isFetching * @prop {React.Dispatch>} setMapValue + * @prop {unknown} error */ /** @param {SidePanelProps} param */ @@ -36,10 +37,13 @@ export const SidePanel = ({ offlineMaps, mapValue, setMapValue, - isFetching + isFetching, + error }) => { const { formatMessage: t } = useIntl() + if (error) console.log(error) + const classes = useStyles() const mutation = useMapServerMutation('post', `/tilesets/import`) diff --git a/src/renderer/components/Settings/BackgroundMaps.js b/src/renderer/components/Settings/BackgroundMaps.js index 55ceb292..cf329aaf 100644 --- a/src/renderer/components/Settings/BackgroundMaps.js +++ b/src/renderer/components/Settings/BackgroundMaps.js @@ -31,7 +31,7 @@ export const BackgroundMaps = ({ openSettings }) => { const [mapValue, setMapValue] = React.useState(initialMapId) - const { data, isFetching } = useMapServerQuery('/styles') + const { data, isFetching, error } = useMapServerQuery('/styles') return ( @@ -41,6 +41,7 @@ export const BackgroundMaps = ({ openSettings }) => { openSettings={openSettings} setMapValue={setMapValue} isFetching={isFetching} + error={error} /> {!mapValue || !data ? ( From fd653ef2083f907aec9456471fc27127747a91ee Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:09:30 -0800 Subject: [PATCH 32/46] chore: add map and list styles --- .../BackgroundMaps/BackgroundMapInfo.js | 40 +++--- .../components/BackgroundMaps/MapCard.js | 2 +- .../BackgroundMaps/OfflineAreaCard.js | 128 ------------------ .../components/BackgroundMaps/SidePanel.js | 23 +--- .../components/Settings/BackgroundMaps.js | 15 +- src/renderer/hooks/useMapServerMutation.js | 3 +- src/renderer/hooks/useMapServerQuery.js | 3 +- 7 files changed, 39 insertions(+), 175 deletions(-) delete mode 100644 src/renderer/components/BackgroundMaps/OfflineAreaCard.js diff --git a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js index 1ccc3ff0..08da7df4 100644 --- a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js +++ b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js @@ -28,11 +28,17 @@ const m = defineMessages({ * @typedef BackgroundMapInfoProps * @prop {string} id * @prop {string} idBeingViewed - * @prop {React.Dispatch>} setMapValue + * @prop {string} url + * @prop {()=>void} unsetMapValue */ /** @param {BackgroundMapInfoProps} props */ -export const BackgroundMapInfo = ({ id, idBeingViewed, setMapValue }) => { +export const BackgroundMapInfo = ({ + id, + idBeingViewed, + unsetMapValue, + url +}) => { const shouldLoad = React.useMemo(() => id === idBeingViewed, [ id, idBeingViewed @@ -54,7 +60,12 @@ export const BackgroundMapInfo = ({ id, idBeingViewed, setMapValue }) => { {!data ? ( ) : ( - + )} @@ -65,13 +76,13 @@ export const BackgroundMapInfo = ({ id, idBeingViewed, setMapValue }) => { * @typedef MapInfoProps * @prop {import('@mapeo/map-server/dist/lib/stylejson').StyleJSON} backgroundMap * @prop {string} id - * @prop {React.Dispatch>} setMapValue + * @prop {()=>void} unsetMapValue + * @prop {string} url */ /** @param {MapInfoProps} props */ -const MapInfo = ({ backgroundMap, id, setMapValue }) => { +const MapInfo = ({ backgroundMap, id, unsetMapValue, url }) => { const { name } = backgroundMap - const mutation = useMapServerMutation('delete', `/styles/${id}`) const classes = useStyles() @@ -85,16 +96,10 @@ const MapInfo = ({ backgroundMap, id, setMapValue }) => { * * @param {string} mapId */ + + // To Do, useMapServerMutation.mutate() function deleteMap (mapId) { - try { - // mutation.mutate(mapId) - // setMapValue(false) - } catch (err) { - remote.dialog.showErrorBox( - t(m.deleteErrorTitle), - t(m.deleteErrorDescription) + ': ' + err - ) - } + return } return ( @@ -114,10 +119,7 @@ const MapInfo = ({ backgroundMap, id, setMapValue }) => { {/* Map */} - + {/* Text under map: */}
diff --git a/src/renderer/components/BackgroundMaps/MapCard.js b/src/renderer/components/BackgroundMaps/MapCard.js index acd42dcb..d4dedc03 100644 --- a/src/renderer/components/BackgroundMaps/MapCard.js +++ b/src/renderer/components/BackgroundMaps/MapCard.js @@ -60,7 +60,7 @@ export const MapCard = ({ offlineMap, setMap, mapBeingViewed }) => { height: '100%', width: '100%' }} - style='mapbox://styles/mapbox/streets-v11' + style={offlineMap.url} />
diff --git a/src/renderer/components/BackgroundMaps/OfflineAreaCard.js b/src/renderer/components/BackgroundMaps/OfflineAreaCard.js deleted file mode 100644 index 11ffaeb6..00000000 --- a/src/renderer/components/BackgroundMaps/OfflineAreaCard.js +++ /dev/null @@ -1,128 +0,0 @@ -// @ts-check -import * as React from 'react' -import { Card, makeStyles, Typography } from '@material-ui/core' -import { defineMessages, useIntl } from 'react-intl' - -const m = defineMessages({ - // Button to create an offline area - createOfflineArea: 'Create Offline Area', - // Level of detail seen on map - farthest zoom level - lvlDetailGlobal: 'Global', - // Level of detail seen on map - second farthest zoom level - lvlDetailSubcontinent: 'Subcontinent', - // Level of detail seen on map - can see large countries - lvlDetailLargeCountry: 'Large Country', - // Level of detail seen on map - can see smaller countries - lvlDetailSmallCountry: 'Small Country', - // Level of detail seen on map - can see details of large metropolitan areas - lvlDetailLargeMetro: 'Large Metropolitan Area', - // Level of detail seen on map - can see most Cities on Map - lvlDetailCity: 'City', - // Level of detail seen on map - can see most towns on map - lvlDetailTown: 'Town', - // Level of detail seen on map - can see villages on map - lvlDetailVillage: 'Village', - // Level of detail seen on map - can see small roads on map - lvlDetailSmallRoad: 'Small Road', - // Level of detail seen on map - can see most streets on map - lvlDetailStreet: 'Street', - // Level of detail seen on map - can see details of street blocks on map - lvlDetailStreetBlock: 'Street Block', - // Level of detail seen on map - can see addresses on map - lvlDetailAddress: 'Address', - // Level of detail seen on map - can see street intersections on map - lvlDetailStreetIntersection: 'Street Intersection', - // Abbreviation for megabytes - mb: 'MB', - // indicated zoom level - zoomLevel: 'Zoom Level' -}) - -/** - * @typedef OfflineAreaCardProps - * @prop {number} zoomLevel - * @prop {string} title - * @prop {number} size - */ - -/** @param {OfflineAreaCardProps} props */ -export const OfflineAreaCard = ({ zoomLevel, title, size }) => { - const classes = useStyles() - const { formatMessage: t } = useIntl() - - const lvlOfDetail = React.useMemo(() => { - switch (true) { - case zoomLevel <= 2: - return m.lvlDetailGlobal - case zoomLevel <= 4: - return m.lvlDetailSubcontinent - case zoomLevel <= 6: - return m.lvlDetailLargeCountry - case zoomLevel <= 8: - return m.lvlDetailSmallCountry - case zoomLevel <= 10: - return m.lvlDetailLargeMetro - case zoomLevel === 11: - return m.lvlDetailCity - case zoomLevel === 12: - return m.lvlDetailTown - case zoomLevel <= 14: - return m.lvlDetailVillage - case zoomLevel === 15: - return m.lvlDetailSmallRoad - case zoomLevel === 16: - return m.lvlDetailStreet - case zoomLevel === 17: - return m.lvlDetailStreetBlock - case zoomLevel === 18: - return m.lvlDetailAddress - case zoomLevel < 23: - return m.lvlDetailStreetIntersection - default: - return m.lvlDetailGlobal - } - }, [zoomLevel]) - - return ( - -
- {title} - {`${size.toString()} ${t( - m.mb - )}`} -
- {`${t( - m.zoomLevel - )}: ${zoomLevel.toString()}`} - - {t(lvlOfDetail)} - -
- ) -} - -const useStyles = makeStyles({ - img: { - width: '100%', - objectFit: 'cover', - height: '100%' - }, - imgContainer: { - width: '100%', - height: '45%' - }, - card: { - display: 'flex', - flexWrap: 'wrap', - flexBasis: '45%', - minWidth: 225, - height: 100, - marginTop: 20, - padding: '10px 5px' - }, - topContainer: { - flexBasis: '100%', - display: 'flex', - justifyContent: 'space-between' - } -}) diff --git a/src/renderer/components/BackgroundMaps/SidePanel.js b/src/renderer/components/BackgroundMaps/SidePanel.js index 02febb73..213f79de 100644 --- a/src/renderer/components/BackgroundMaps/SidePanel.js +++ b/src/renderer/components/BackgroundMaps/SidePanel.js @@ -5,6 +5,7 @@ import { remote } from 'electron' import * as React from 'react' import { defineMessages, useIntl } from 'react-intl' import { useMapServerMutation } from '../../hooks/useMapServerMutation' +import { useMapServerQuery } from '../../hooks/useMapServerQuery' import Loader from '../Loader' import { MapCard } from './MapCard' @@ -24,28 +25,18 @@ const m = defineMessages({ /** * @typedef SidePanelProps * @prop {()=>void} openSettings - * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo[]|false} offlineMaps * @prop {string|false} mapValue - * @prop {boolean} isFetching * @prop {React.Dispatch>} setMapValue - * @prop {unknown} error */ /** @param {SidePanelProps} param */ -export const SidePanel = ({ - openSettings, - offlineMaps, - mapValue, - setMapValue, - isFetching, - error -}) => { +export const SidePanel = ({ openSettings, mapValue, setMapValue }) => { const { formatMessage: t } = useIntl() - if (error) console.log(error) - const classes = useStyles() + const { data, isLoading } = useMapServerQuery('/styles', true) + const mutation = useMapServerMutation('post', `/tilesets/import`) async function selectMbTileFile () { @@ -93,10 +84,10 @@ export const SidePanel = ({
- {isFetching ? ( + {isLoading ? ( - ) : offlineMaps ? ( - offlineMaps.map(offlineMap => ( + ) : data ? ( + data.map(offlineMap => ( { const { formatMessage: t } = useIntl() - /** @type {MapServerStyleInfo[]|false} */ - const initialMapState = /** {const} */ (false) - /** @type {MapServerStyleInfo['id']|false} */ const initialMapId = /** {const} */ (false) const [mapValue, setMapValue] = React.useState(initialMapId) - const { data, isFetching, error } = useMapServerQuery('/styles') + const { data } = useMapServerQuery('/styles') + + function unsetMapValue () { + setMapValue(false) + } return ( {!mapValue || !data ? ( @@ -66,7 +64,8 @@ export const BackgroundMaps = ({ openSettings }) => { key={offlineMap.id} idBeingViewed={mapValue} id={offlineMap.id} - setMapValue={setMapValue} + unsetMapValue={unsetMapValue} + url={offlineMap.url} /> ))} diff --git a/src/renderer/hooks/useMapServerMutation.js b/src/renderer/hooks/useMapServerMutation.js index 6098fc3b..8e4b337d 100644 --- a/src/renderer/hooks/useMapServerMutation.js +++ b/src/renderer/hooks/useMapServerMutation.js @@ -18,9 +18,10 @@ export function useMapServerMutation (mutationType, resourcePath) { return useMutation({ mutationFn: bodyFromMutation => kyFunction(MAP_SERVER_URL + resourcePath, bodyFromMutation), - onSuccess: () => + onSuccess: () => { queryClient.invalidateQueries({ queryKey: [`/${resourcePath.split('/')[1]}`] }) + } }) } diff --git a/src/renderer/hooks/useMapServerQuery.js b/src/renderer/hooks/useMapServerQuery.js index 8a4066bd..543f50d0 100644 --- a/src/renderer/hooks/useMapServerQuery.js +++ b/src/renderer/hooks/useMapServerQuery.js @@ -9,7 +9,6 @@ const MAP_SERVER_URL = 'http://127.0.0.1:' + window.mapServerPort export function useMapServerQuery (resourcePath, enabled) { return useQuery({ queryKey: [resourcePath], - queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json(), - enabled + queryFn: () => ky.get(MAP_SERVER_URL + resourcePath).json() }) } From 968d9eedfb35f24e81c7a57d1e64360d1f14fd74 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Fri, 9 Dec 2022 16:09:48 -0800 Subject: [PATCH 33/46] chore: translations --- messages/renderer/en.json | 64 --------------------------------------- 1 file changed, 64 deletions(-) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index f649711f..f3176c8b 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -27,70 +27,6 @@ "description": "Abbreviation for megabytes", "message": "MB" }, - "renderer.components.BackgroundMaps.OfflineAreaCard.createOfflineArea": { - "description": "Button to create an offline area", - "message": "Create Offline Area" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailAddress": { - "description": "Level of detail seen on map - can see addresses on map", - "message": "Address" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailCity": { - "description": "Level of detail seen on map - can see most Cities on Map", - "message": "City" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailGlobal": { - "description": "Level of detail seen on map - farthest zoom level", - "message": "Global" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailLargeCountry": { - "description": "Level of detail seen on map - can see large countries", - "message": "Large Country" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailLargeMetro": { - "description": "Level of detail seen on map - can see details of large metropolitan areas", - "message": "Large Metropolitan Area" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailSmallCountry": { - "description": "Level of detail seen on map - can see smaller countries", - "message": "Small Country" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailSmallRoad": { - "description": "Level of detail seen on map - can see small roads on map", - "message": "Small Road" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailStreet": { - "description": "Level of detail seen on map - can see most streets on map", - "message": "Street" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailStreetBlock": { - "description": "Level of detail seen on map - can see details of street blocks on map", - "message": "Street Block" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailStreetIntersection": { - "description": "Level of detail seen on map - can see street intersections on map", - "message": "Street Intersection" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailSubcontinent": { - "description": "Level of detail seen on map - second farthest zoom level", - "message": "Subcontinent" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailTown": { - "description": "Level of detail seen on map - can see most towns on map", - "message": "Town" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.lvlDetailVillage": { - "description": "Level of detail seen on map - can see villages on map", - "message": "Village" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.mb": { - "description": "Abbreviation for megabytes", - "message": "MB" - }, - "renderer.components.BackgroundMaps.OfflineAreaCard.zoomLevel": { - "description": "indicated zoom level", - "message": "Zoom Level" - }, "renderer.components.BackgroundMaps.SidePanel.addMap": { "description": "Button to add map background", "message": "Add Map Background" From 49ac1416d2c0b5cc5897e548be4ad4aaea72a8ac Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 14 Dec 2022 18:34:57 -0800 Subject: [PATCH 34/46] chore: update dialog UI for import maps --- .../BackgroundMaps/BackgroundMapInfo.js | 23 +--- .../components/BackgroundMaps/MapCard.js | 12 +- .../components/BackgroundMaps/SidePanel.js | 97 +++++-------- .../components/Settings/BackgroundMaps.js | 9 ++ .../components/dialogs/ImportMapStyle.js | 130 ++++++++++++++++++ 5 files changed, 179 insertions(+), 92 deletions(-) create mode 100644 src/renderer/components/dialogs/ImportMapStyle.js diff --git a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js index 08da7df4..fa0ce6ae 100644 --- a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js +++ b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js @@ -7,9 +7,7 @@ import DeleteIcon from '@material-ui/icons/DeleteForeverOutlined' import { MAPBOX_ACCESS_TOKEN } from '../../../../config' import Loading from '../Loading' -import { remote } from 'electron' import { useMapServerQuery } from '../../hooks/useMapServerQuery' -import { useMapServerMutation } from '../../hooks/useMapServerMutation' const m = defineMessages({ // Title for Offline Areas @@ -61,7 +59,7 @@ export const BackgroundMapInfo = ({ ) : ( void} unsetMapValue * @prop {string} url */ /** @param {MapInfoProps} props */ -const MapInfo = ({ backgroundMap, id, unsetMapValue, url }) => { - const { name } = backgroundMap - +const MapInfo = ({ name, id, unsetMapValue, url }) => { const classes = useStyles() const { formatMessage: t } = useIntl() @@ -119,18 +115,7 @@ const MapInfo = ({ backgroundMap, id, unsetMapValue, url }) => { {/* Map */} - - - {/* Text under map: */} -
- {/* Title and 'Create Offline Area' button: */} -
- {t(m.offlineAreas)} - -
-
+
) } diff --git a/src/renderer/components/BackgroundMaps/MapCard.js b/src/renderer/components/BackgroundMaps/MapCard.js index d4dedc03..d1a3e402 100644 --- a/src/renderer/components/BackgroundMaps/MapCard.js +++ b/src/renderer/components/BackgroundMaps/MapCard.js @@ -6,6 +6,7 @@ import { useIntl, defineMessages } from 'react-intl' import ReactMapboxGl from 'react-mapbox-gl' import { MAPBOX_ACCESS_TOKEN } from '../../../../config' +import { convertKbToMb } from '../Settings/BackgroundMaps' const m = defineMessages({ // Abbreviation for megabytes @@ -18,19 +19,14 @@ const m = defineMessages({ * @typedef MapCardProps * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo} offlineMap * @prop {React.Dispatch>} setMap - * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo['id'] |false } mapBeingViewed + * @prop {boolean } isBeingViewed */ /** @param {MapCardProps} param */ -export const MapCard = ({ offlineMap, setMap, mapBeingViewed }) => { +export const MapCard = ({ offlineMap, setMap, isBeingViewed }) => { const classes = useStyles() const { formatMessage: t } = useIntl() - const isBeingViewed = React.useMemo(() => offlineMap.id === mapBeingViewed, [ - offlineMap, - mapBeingViewed - ]) - const Mapbox = React.useMemo( () => ReactMapboxGl({ @@ -66,7 +62,7 @@ export const MapCard = ({ offlineMap, setMap, mapBeingViewed }) => {
{offlineMap.name} - {offlineMap.bytesStored} {t(m.mb)} + {`${convertKbToMb(offlineMap.bytesStored)} ${t(m.mb)}`}
diff --git a/src/renderer/components/BackgroundMaps/SidePanel.js b/src/renderer/components/BackgroundMaps/SidePanel.js index 213f79de..76226b18 100644 --- a/src/renderer/components/BackgroundMaps/SidePanel.js +++ b/src/renderer/components/BackgroundMaps/SidePanel.js @@ -1,11 +1,10 @@ // @ts-check import { Button, makeStyles } from '@material-ui/core' import ChevronLeft from '@material-ui/icons/ChevronLeft' -import { remote } from 'electron' import * as React from 'react' import { defineMessages, useIntl } from 'react-intl' -import { useMapServerMutation } from '../../hooks/useMapServerMutation' import { useMapServerQuery } from '../../hooks/useMapServerQuery' +import { ImportMapStyleDialog } from '../dialogs/ImportMapStyle' import Loader from '../Loader' import { MapCard } from './MapCard' @@ -15,12 +14,7 @@ const m = defineMessages({ // Button to create an offline area for a map backgroun createOfflineMap: 'Create Offline Map', // button to go back to settings - backToSettings: 'Back to Settings', - // Title for import errot pop up dialog, - importErrorTitle: 'Background Maps Import Error', - // Description of map import error - importErrorDescription: - 'There was an error importing the background maps. Please try again.' + backToSettings: 'Back to Settings' }) /** * @typedef SidePanelProps @@ -34,69 +28,42 @@ export const SidePanel = ({ openSettings, mapValue, setMapValue }) => { const { formatMessage: t } = useIntl() const classes = useStyles() + const [open, setOpen] = React.useState(false) const { data, isLoading } = useMapServerQuery('/styles', true) - const mutation = useMapServerMutation('post', `/tilesets/import`) - - async function selectMbTileFile () { - const result = await remote.dialog.showOpenDialog({ - filters: [{ name: 'MbTiles', extensions: ['mbtiles'] }], - properties: ['openFile'] - }) - - if (result.canceled) return - - if (!result.filePaths || !result.filePaths.length) return - - try { - const filePath = result.filePaths[0] - mutation.mutate({ filePath }) - } catch (err) { - onError(err) - } - - /** - * - * @param {string} err - */ - function onError (err) { - remote.dialog.showErrorBox( - t(m.importErrorTitle), - t(m.importErrorDescription) + ': ' + err - ) - } - } - return ( -
- -
- -
+
+ +
- {isLoading ? ( - - ) : data ? ( - data.map(offlineMap => ( - - )) - ) : null} -
+ {isLoading ? ( + + ) : data ? ( + data.map(offlineMap => ( + + )) + ) : null} + + setOpen(false)} /> +
) } diff --git a/src/renderer/components/Settings/BackgroundMaps.js b/src/renderer/components/Settings/BackgroundMaps.js index 01a6eb6b..69a8ffbd 100644 --- a/src/renderer/components/Settings/BackgroundMaps.js +++ b/src/renderer/components/Settings/BackgroundMaps.js @@ -73,3 +73,12 @@ export const BackgroundMaps = ({ openSettings }) => { ) } + +/** + * + * @param {number} kilobyte + * @returns {number} + */ +export const convertKbToMb = kilobyte => { + return Math.round(kilobyte / 1000) +} diff --git a/src/renderer/components/dialogs/ImportMapStyle.js b/src/renderer/components/dialogs/ImportMapStyle.js new file mode 100644 index 00000000..2597464d --- /dev/null +++ b/src/renderer/components/dialogs/ImportMapStyle.js @@ -0,0 +1,130 @@ +// @ts-check +import * as React from 'react' +import { + Button, + CardActionArea, + Icon, + makeStyles, + Typography +} from '@material-ui/core' +import Dialog from '@material-ui/core/Dialog' +import DialogTitle from '@material-ui/core/DialogTitle' +import DialogActions from '@material-ui/core/DialogActions' +import DialogContent from '@material-ui/core/DialogContent' +import { defineMessages, useIntl } from 'react-intl' +import { useMapServerMutation } from '../../hooks/useMapServerMutation' +import Card from '@material-ui/core/Card' +import CardContent from '@material-ui/core/CardContent' +import { remote } from 'electron' +import SystemUpdateAltIcon from '@material-ui/icons/SystemUpdateAlt' +import CloseIcon from '@material-ui/icons/Close' +import IconButton from '@material-ui/core/IconButton' + +const m = defineMessages({ + // Title of screen used to add a new background map + addMap: 'Add Map Background', + //button to cancel the import of a background map + cancel: 'Cancel', + // Title for import errot pop up dialog, + importErrorTitle: 'Background Maps Import Error', + // Description of map import error + importErrorDescription: + 'There was an error importing the background maps. Please try again.' +}) + +/** + * @typedef ImportMapStyleDialogProps + * @prop {boolean} open + * @prop {()=>void} close + */ + +/** @param {ImportMapStyleDialogProps} importMapStyleDialogProps */ +export const ImportMapStyleDialog = ({ open, close }) => { + const { formatMessage: t } = useIntl() + const mutation = useMapServerMutation('post', '/tilesets/import') + + const classes = useStyles() + + async function selectMbTileFile () { + const result = await remote.dialog.showOpenDialog({ + filters: [{ name: 'MbTiles', extensions: ['mbtiles'] }], + properties: ['openFile'] + }) + + if (result.canceled) return + + if (!result.filePaths || !result.filePaths.length) return + + try { + const filePath = result.filePaths[0] + await mutation.mutateAsync({ filePath }) + close() + } catch (err) { + close() + onError(err) + } + + function onError (err) { + remote.dialog.showErrorBox( + t(m.importErrorTitle), + t(m.importErrorDescription) + ': ' + err + ) + } + } + + return ( + + + + {t(m.addMap)} + + + + + + + + + + + + Import File + + + {'(.mbtiles)'} + + + + + + + + + + ) +} + +const useStyles = makeStyles({ + titleContainer: { + display: 'flex', + alignItems: 'center', + justifyContent: 'space-between' + }, + title: { + fontSize: 24, + fontWeight: 500 + } +}) From c66092ae0c339570cbebb75a17cc8c26eb26febd Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 14 Dec 2022 18:35:18 -0800 Subject: [PATCH 35/46] chore: translations --- messages/renderer/en.json | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index f3176c8b..309b118b 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -39,14 +39,6 @@ "description": "Button to create an offline area for a map backgroun", "message": "Create Offline Map" }, - "renderer.components.BackgroundMaps.SidePanel.importErrorDescription": { - "description": "Description of map import error", - "message": "There was an error importing the background maps. Please try again." - }, - "renderer.components.BackgroundMaps.SidePanel.importErrorTitle": { - "description": "Title for import errot pop up dialog,", - "message": "Background Maps Import Error" - }, "renderer.components.Home.mapeditor": { "description": "MapEditor tab label", "message": "Territory" @@ -684,6 +676,22 @@ "renderer.components.dialogs.Error.openLog": { "message": "Open log..." }, + "renderer.components.dialogs.ImportMapStyle.addMap": { + "description": "Title of screen used to add a new background map", + "message": "Add Map Background" + }, + "renderer.components.dialogs.ImportMapStyle.cancel": { + "description": "button to cancel the import of a background map", + "message": "Cancel" + }, + "renderer.components.dialogs.ImportMapStyle.importErrorDescription": { + "description": "Description of map import error", + "message": "There was an error importing the background maps. Please try again." + }, + "renderer.components.dialogs.ImportMapStyle.importErrorTitle": { + "description": "Title for import errot pop up dialog,", + "message": "Background Maps Import Error" + }, "renderer.components.dialogs.LatLon.button-submit": { "message": "Submit" }, From b9623128433155c6dcb90d5f78548a7f711b0a24 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Thu, 15 Dec 2022 13:13:18 -0800 Subject: [PATCH 36/46] chore: create one instance of mapbox for prev --- .../BackgroundMaps/BackgroundMapInfo.js | 10 ++++---- .../components/BackgroundMaps/MapCard.js | 24 ++++++++----------- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js index fa0ce6ae..765e4867 100644 --- a/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js +++ b/src/renderer/components/BackgroundMaps/BackgroundMapInfo.js @@ -8,6 +8,7 @@ import DeleteIcon from '@material-ui/icons/DeleteForeverOutlined' import { MAPBOX_ACCESS_TOKEN } from '../../../../config' import Loading from '../Loading' import { useMapServerQuery } from '../../hooks/useMapServerQuery' +import { MapboxPrevOnly } from './MapCard' const m = defineMessages({ // Title for Offline Areas @@ -84,10 +85,6 @@ const MapInfo = ({ name, id, unsetMapValue, url }) => { const { formatMessage: t } = useIntl() - const MapBox = ReactMapboxGl({ - accessToken: MAPBOX_ACCESS_TOKEN - }) - /** * * @param {string} mapId @@ -115,7 +112,10 @@ const MapInfo = ({ name, id, unsetMapValue, url }) => { {/* Map */} - + ) } diff --git a/src/renderer/components/BackgroundMaps/MapCard.js b/src/renderer/components/BackgroundMaps/MapCard.js index d1a3e402..8677e2de 100644 --- a/src/renderer/components/BackgroundMaps/MapCard.js +++ b/src/renderer/components/BackgroundMaps/MapCard.js @@ -15,6 +15,15 @@ const m = defineMessages({ areas: 'offline areas' }) +export const MapboxPrevOnly = ReactMapboxGl({ + accessToken: MAPBOX_ACCESS_TOKEN, + dragRotate: false, + pitchWithRotate: false, + attributionControl: false, + injectCSS: false, + interactive: false +}) + /** * @typedef MapCardProps * @prop {import('../Settings/BackgroundMaps').MapServerStyleInfo} offlineMap @@ -27,19 +36,6 @@ export const MapCard = ({ offlineMap, setMap, isBeingViewed }) => { const classes = useStyles() const { formatMessage: t } = useIntl() - const Mapbox = React.useMemo( - () => - ReactMapboxGl({ - accessToken: MAPBOX_ACCESS_TOKEN, - dragRotate: false, - pitchWithRotate: false, - attributionControl: false, - injectCSS: false, - interactive: false - }), - [] - ) - return ( + + + ) +} + +const useStyles = makeStyles({ + container: { + display: 'flex', + flexWrap: 'wrap', + width: '100%', + height: '100' + }, + banner: { + width: '100%', + display: 'flex', + justifyContent: 'space-between', + padding: '10px 20px' + }, + listItem: { + display: 'flex', + justifyContent: 'flex-start', + marginTop: 20 + } +}) diff --git a/src/renderer/components/Settings/index.js b/src/renderer/components/Settings/index.js index b0774fdd..4be08d2a 100644 --- a/src/renderer/components/Settings/index.js +++ b/src/renderer/components/Settings/index.js @@ -9,15 +9,19 @@ import { makeStyles } from '@material-ui/core' import Fade from '@material-ui/core/Fade' import Paper from '@material-ui/core/Paper' import { AboutMapeo } from './AboutMapeo' +import buildConfig from '../../../build-config' +import AssignmentIcon from '@material-ui/icons/Assignment' +import { ProjectConfig } from './ProjectConfig' const m = defineMessages({ backgroundMap: 'Background Map', - aboutMapeo: 'About Mapeo' + aboutMapeo: 'About Mapeo', + projConfig: 'Project Configuration' }) const FADE_DURATION = 700 -/** @typedef {'BackgroundMap' | 'AboutMapeo'} SettingTabId */ +/** @typedef {'BackgroundMap' | 'AboutMapeo' | 'ProjConfig'} SettingTabId */ /** @type {import('./SettingsMenu').SettingsTabs[]} */ const tabs = /** @typedef {const} */ [ @@ -30,6 +34,11 @@ const tabs = /** @typedef {const} */ [ tabId: 'AboutMapeo', icon: , label: m.aboutMapeo + }, + { + tabId: 'ProjConfig', + icon: , + label: m.projConfig } ] @@ -101,6 +110,14 @@ export const Settings = ({ reset, setReset, fadeIn }) => { )} + + {tabValue === 'ProjConfig' && ( + + + + + + )} ) @@ -134,6 +151,12 @@ const useStyles = makeStyles({ }, '& .MuiTabs-root': { flex: 1 + }, + '& .PrivateTabIndicator-colorSecondary-4': { + backgroundColor: buildConfig.variant === 'icca' ? '#63A25C' : '#000033' + }, + '& .Mui-selected': { + backgroundColor: '#f6f6f6' } } }) From a9568c0bf4c701719c5eb08bcf9084ec0253442e Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 19 Dec 2022 15:46:27 -0800 Subject: [PATCH 43/46] chore: translations --- messages/renderer/en.json | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/messages/renderer/en.json b/messages/renderer/en.json index 8c502a2c..8d61d25d 100644 --- a/messages/renderer/en.json +++ b/messages/renderer/en.json @@ -512,6 +512,14 @@ "description": "Name to show for an observation when it does not match any preset", "message": "Observation" }, + "renderer.components.Settings.AboutMapeo.aboutMapeo": { + "description": "Title for the About Mapeo Page", + "message": "About Mapeo" + }, + "renderer.components.Settings.AboutMapeo.variant": { + "description": "Used to indicate the variant of mapeo the user is using", + "message": "Variant" + }, "renderer.components.Settings.AboutMapeo.version": { "description": "Used to indicate the version of mapeo the user is using", "message": "Version" @@ -520,6 +528,19 @@ "description": "Title for description of offline maps", "message": "Managing Map Backgrounds and Offline Areas" }, + "renderer.components.Settings.ProjectConfig.config": { + "message": "Config" + }, + "renderer.components.Settings.ProjectConfig.importConfig": { + "message": "Import Config" + }, + "renderer.components.Settings.ProjectConfig.projectName": { + "message": "Project Name" + }, + "renderer.components.Settings.ProjectConfig.title": { + "description": "title of project setting page", + "message": "Project Settings" + }, "renderer.components.Settings.index.aboutMapeo": { "description": "Setting Tab title to open information about mapeo", "message": "About Mapeo" @@ -528,6 +549,9 @@ "description": "Setting Tab title to open background maps", "message": "Background Map" }, + "renderer.components.Settings.index.projConfig": { + "message": "Project Configuration" + }, "renderer.components.SyncView.Searching.searchingHint": { "description": "Hint on sync screen when searching on wifi for devices", "message": "Make sure devices are turned on and connected to the same wifi network" From 92a3039adec9dce41f750b8dc85a41b1736b53bb Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Tue, 3 Jan 2023 14:16:40 -0800 Subject: [PATCH 44/46] chore: added IPC call for config --- src/main/ipc.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/main/ipc.js b/src/main/ipc.js index ec2d97fa..11ad1ad2 100644 --- a/src/main/ipc.js +++ b/src/main/ipc.js @@ -155,4 +155,8 @@ module.exports = function (ipcSend) { ipcMain.on('refresh-window', function () { ipcSend('refresh-window') }) + + ipcMain.on('update-config', (_, filepath) => { + userConfig.importSettings(filepath, () => {}) + }) } From 0a049a3021ecb5b645c9fe71121aceb88ca25dbe Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Wed, 4 Jan 2023 08:37:27 -0800 Subject: [PATCH 45/46] chore: called ipc for config in render thread --- src/renderer/components/Settings/ProjectConfig.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/renderer/components/Settings/ProjectConfig.js b/src/renderer/components/Settings/ProjectConfig.js index 16e75daf..ae71714e 100644 --- a/src/renderer/components/Settings/ProjectConfig.js +++ b/src/renderer/components/Settings/ProjectConfig.js @@ -4,7 +4,7 @@ import { Button, makeStyles, Paper, Typography } from '@material-ui/core' import { defineMessages, useIntl } from 'react-intl' import { useQuery } from '@tanstack/react-query' import api from '../../new-api' -import { remote } from 'electron' +import { ipcRenderer, remote } from 'electron' const m = defineMessages({ // title of project setting page @@ -34,6 +34,9 @@ export const ProjectConfig = () => { }) if (result.canceled) return if (!result.filePaths || !result.filePaths.length) return + + ipcRenderer.send('update-config', result.filePaths[0]) + window.location.reload() // userConfig.importSettings(result.filePaths[0], err => { // if (err) return onerror(err) // ipc.send('reload-config', async err => { From 71276630bf09497529fb1fa1139261cf6beedba8 Mon Sep 17 00:00:00 2001 From: ErikSin <67773827+ErikSin@users.noreply.github.com> Date: Mon, 23 Jan 2023 17:06:51 -0800 Subject: [PATCH 46/46] chore: linting and styling --- src/renderer/components/Settings/AboutMapeo.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/renderer/components/Settings/AboutMapeo.js b/src/renderer/components/Settings/AboutMapeo.js index 25a8ee96..dade1f53 100644 --- a/src/renderer/components/Settings/AboutMapeo.js +++ b/src/renderer/components/Settings/AboutMapeo.js @@ -7,7 +7,7 @@ import buildConfig from '../../../build-config' const m = defineMessages({ // Used to indicate the version of mapeo the user is using version: 'Version', - //Title for the About Mapeo Page + // Title for the About Mapeo Page aboutMapeo: 'About Mapeo', // Used to indicate the variant of mapeo the user is using variant: 'Variant' @@ -28,7 +28,7 @@ export const AboutMapeo = () => { {t(m.aboutMapeo)} -
+
{t(m.version) + ':'}