From 45fe467a21a23a2b2b4649e0d6ff37be53995f67 Mon Sep 17 00:00:00 2001 From: "D. Berge" Date: Sat, 4 Sep 2021 18:04:52 +0200 Subject: [PATCH] Implement sequence/get API endpoint. It returns data for all individual points in a sequence. --- lib/www/server/api/index.js | 2 +- lib/www/server/api/middleware/sequence/get.js | 0 .../api/middleware/sequence/get/geojson.js | 28 +++ .../api/middleware/sequence/get/index.js | 23 +++ .../api/middleware/sequence/get/json.js | 14 ++ lib/www/server/lib/db/sequence/get.js | 92 ++++++++++ lib/www/server/package-lock.json | 162 ++++-------------- 7 files changed, 194 insertions(+), 127 deletions(-) delete mode 100644 lib/www/server/api/middleware/sequence/get.js create mode 100644 lib/www/server/api/middleware/sequence/get/geojson.js create mode 100644 lib/www/server/api/middleware/sequence/get/index.js create mode 100644 lib/www/server/api/middleware/sequence/get/json.js diff --git a/lib/www/server/api/index.js b/lib/www/server/api/index.js index 5b6be6f..c4e9348 100644 --- a/lib/www/server/api/index.js +++ b/lib/www/server/api/index.js @@ -117,7 +117,7 @@ app.map({ get: [ mw.sequence.list ], }, '/project/:project/sequence/:sequence': { -// get: [ mw.sequence.get ], + get: [ mw.sequence.get ], patch: [ mw.auth.access.write, mw.sequence.patch ], }, diff --git a/lib/www/server/api/middleware/sequence/get.js b/lib/www/server/api/middleware/sequence/get.js deleted file mode 100644 index e69de29..0000000 diff --git a/lib/www/server/api/middleware/sequence/get/geojson.js b/lib/www/server/api/middleware/sequence/get/geojson.js new file mode 100644 index 0000000..602fba6 --- /dev/null +++ b/lib/www/server/api/middleware/sequence/get/geojson.js @@ -0,0 +1,28 @@ + +const { sequence } = require('../../../../lib/db'); + +module.exports = async function (req, res, next) { + + try { + const json = await sequence.get(req.params.project, req.params.sequence, req.query); + const geometry = req.query.geometry || "geometrypreplot"; + + const geojson = { + type: "FeatureCollection", + features: json.map(feature => { + return { + type: "Feature", + geometry: feature[geometry], + properties: {...feature} + } + }) + }; + + res.status(200).send(geojson); + next(); + } catch (err) { + next(err); + } + + +}; diff --git a/lib/www/server/api/middleware/sequence/get/index.js b/lib/www/server/api/middleware/sequence/get/index.js new file mode 100644 index 0000000..bdf0bbc --- /dev/null +++ b/lib/www/server/api/middleware/sequence/get/index.js @@ -0,0 +1,23 @@ +const json = require('./json'); +const geojson = require('./geojson'); + +module.exports = async function (req, res, next) { + try { + const handlers = { + "application/json": json, + "application/geo+json": geojson, + }; + + const mimetype = (handlers[req.query.mime] && req.query.mime) || req.accepts(Object.keys(handlers)); + + if (mimetype) { + res.set("Content-Type", mimetype); + await handlers[mimetype](req, res, next); + } else { + res.status(406).send(); + next(); + } + } catch (err) { + next(err); + } +} diff --git a/lib/www/server/api/middleware/sequence/get/json.js b/lib/www/server/api/middleware/sequence/get/json.js new file mode 100644 index 0000000..409af9f --- /dev/null +++ b/lib/www/server/api/middleware/sequence/get/json.js @@ -0,0 +1,14 @@ + +const { sequence } = require('../../../../lib/db'); + +module.exports = async function (req, res, next) { + + try { + res.status(200).send(await sequence.get(req.params.project, req.params.sequence, req.query)); + next(); + } catch (err) { + next(err); + } + + +}; diff --git a/lib/www/server/lib/db/sequence/get.js b/lib/www/server/lib/db/sequence/get.js index e69de29..eb18965 100644 --- a/lib/www/server/lib/db/sequence/get.js +++ b/lib/www/server/lib/db/sequence/get.js @@ -0,0 +1,92 @@ +const { setSurvey } = require('../connection'); + +function thinout (key, obj) { + const path = key.split("."); +// console.log("path", path); + const value = path.reduce( (a, b, i) => { +// console.log("index", i); + if (a !== null && typeof a != "undefined") { + if (b == "*" && Array.isArray(a)) { + const subkey = path.splice(i+1).join("."); + console.log("subkey", subkey); + return a.map(e => thinout(subkey, e)); + } else { +// console.log("key", b, "value", a); + return a[b]; + } + } else { +// console.log("null or undef"); + return a; + } + }, obj); + return value; +} + + +async function get (projectId, sequence, opts = {}) { + const client = await setSurvey(projectId); + + const sortFields = [ + "sequence", "sailline", "line", "point", "tstamp" + ]; + const sortKey = opts.sortBy && sortFields.includes(opts.sortBy) && opts.sortBy || "tstamp"; + const sortDir = opts.sortDesc == "false" ? "ASC" : "DESC"; + const offset = Math.abs((opts.page-1)*opts.itemsPerPage) || 0; + const limit = Math.abs(Number(opts.itemsPerPage)) || null; + + const restriction = sequence != 0 + ? "sequence = $3" + : "TRUE OR $3"; + + const text = ` + SELECT + sequence, sailline, line, point, tstamp, + objRefRaw, objRefFinal, + geometryPreplot::json, + geometryRaw::json, + geometryFinal::json, + errorRaw::json, + errorFinal::json, + jsonb_path_query(meta::jsonb, $4) as meta + FROM sequences_detail + WHERE ${restriction} + ORDER BY ${sortKey} ${sortDir} + OFFSET $1 + LIMIT $2; + `; + + const values = [offset, limit, sequence, opts.path || "$"]; + const res = await client.query(text, values); + client.release(); + + if (opts.project) { + const tokens = opts.project.split(/\s*[,;:\s]\s*/).filter(e => e.length); + const project = tokens.map(i => i.replace(/^([^.]+)\..*$/, "$1")); + return res.rows.map( r => + Object.fromEntries(Object.entries(r).filter(entry => project.includes(entry[0]))) + ); +// const deep = tokens.filter(i => i.includes(".")); +// console.log("tokens", tokens, "project", project, "deep", deep); +// if (deep.length) { +// return res.rows.map( r => { +// const o = Object.fromEntries(Object.entries(r).filter(entry => project.includes(entry[0]))) +// deep.forEach(path => { +// console.log("path", path, path.split(".")[0]); +// console.log("object", o); +// console.log("result", thinout(path, o)); +// return o[path.split(".")[0]] = thinout(path, o) +// }) +// console.log("Object", o); +// return o; +// }); +// } else { +// return res.rows.map( r => +// Object.fromEntries(Object.entries(r).filter(entry => project.includes(entry[0]))) +// ); +// } + } else { + return res.rows; + } +} + +module.exports = get; diff --git a/lib/www/server/package-lock.json b/lib/www/server/package-lock.json index 1e681a2..3efb1db 100644 --- a/lib/www/server/package-lock.json +++ b/lib/www/server/package-lock.json @@ -261,9 +261,6 @@ }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/@mapbox/node-pre-gyp/node_modules/semver": { @@ -386,11 +383,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/agent-base/node_modules/ms": { @@ -435,7 +427,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "devOptional": true, + "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -615,7 +607,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8" } @@ -659,7 +651,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, + "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -891,7 +883,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "devOptional": true, + "dev": true, "dependencies": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -1095,8 +1087,7 @@ "version": "3.6.5", "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz", "integrity": "sha512-vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==", - "dev": true, - "hasInstallScript": true + "dev": true }, "node_modules/core-util-is": { "version": "1.0.2", @@ -1473,7 +1464,8 @@ "esprima": "^4.0.1", "estraverse": "^5.2.0", "esutils": "^2.0.2", - "optionator": "^0.8.1" + "optionator": "^0.8.1", + "source-map": "~0.6.1" }, "bin": { "escodegen": "bin/escodegen.js", @@ -1481,9 +1473,6 @@ }, "engines": { "node": ">=6.0" - }, - "optionalDependencies": { - "source-map": "~0.6.1" } }, "node_modules/esprima": { @@ -1645,7 +1634,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, + "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -1752,6 +1741,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, "optional": true, "os": [ "darwin" @@ -1849,16 +1839,13 @@ }, "engines": { "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/glob-parent": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "devOptional": true, + "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -1924,7 +1911,6 @@ "version": "5.1.5", "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "deprecated": "this library is no longer supported", "dependencies": { "ajv": "^6.12.3", "har-schema": "^2.0.0" @@ -1942,10 +1928,6 @@ "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" } }, "node_modules/har-validator/node_modules/fast-deep-equal": { @@ -2090,11 +2072,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/http-proxy-agent/node_modules/ms": { @@ -2149,11 +2126,6 @@ }, "engines": { "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } } }, "node_modules/https-proxy-agent/node_modules/ms": { @@ -2209,7 +2181,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, + "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -2221,7 +2193,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -2239,7 +2211,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "devOptional": true, + "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -2251,7 +2223,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.12.0" } @@ -2336,14 +2308,6 @@ }, "engines": { "node": ">=10" - }, - "peerDependencies": { - "canvas": "^2.5.0" - }, - "peerDependenciesMeta": { - "canvas": { - "optional": true - } } }, "node_modules/jsesc": { @@ -2525,9 +2489,7 @@ "integrity": "sha512-/xwPEBidtg69Q3HlqPdU3DnrXQOvQU/CCHA1tcDQVzOwm91YMYaILjNp7L4Eaw5Z4sOYdbBz6koWyibppd8Zqw==" }, "node_modules/leaflet-headless": { - "version": "0.2.6", "resolved": "git+ssh://git@gitlab.com/aaltronav/contrib/leaflet-headless.git#97eaa645f078eb6f17b9a996740e3b8d61df26ed", - "license": "MIT", "dependencies": { "canvas": "^2.8.0", "jsdom": "^16.6.0", @@ -2673,9 +2635,6 @@ }, "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/make-dir/node_modules/semver": { @@ -2796,9 +2755,6 @@ "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", "engines": { "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/minimalistic-assert": { @@ -2995,7 +2951,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true, + "dev": true, "engines": { "node": ">=0.10.0" } @@ -3033,14 +2989,6 @@ }, "engines": { "node": ">= 6.9.0" - }, - "peerDependencies": { - "chokidar": "^3.3.0" - }, - "peerDependenciesMeta": { - "chokidar": { - "optional": true - } } }, "node_modules/nwsapi": { @@ -3410,7 +3358,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "devOptional": true, + "dev": true, "engines": { "node": ">=8.6" } @@ -3693,7 +3641,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "devOptional": true, + "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -3791,7 +3739,6 @@ "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "deprecated": "request has been deprecated, see https://github.com/request/request/issues/3142", "dependencies": { "aws-sign2": "~0.7.0", "aws4": "^1.8.0", @@ -4102,21 +4049,7 @@ "node_modules/simple-concat": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/simple-concat/-/simple-concat-1.0.1.tgz", - "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] + "integrity": "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==" }, "node_modules/simple-get": { "version": "3.1.0", @@ -4141,7 +4074,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true, "engines": { "node": ">=0.10.0" } @@ -4178,11 +4110,6 @@ "safer-buffer": "^2.0.2", "tweetnacl": "~0.14.0" }, - "bin": { - "sshpk-conv": "bin/sshpk-conv", - "sshpk-sign": "bin/sshpk-sign", - "sshpk-verify": "bin/sshpk-verify" - }, "engines": { "node": ">=0.10.0" } @@ -4396,9 +4323,6 @@ }, "bin": { "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" } }, "node_modules/to-arraybuffer": { @@ -4420,7 +4344,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, + "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -4620,7 +4544,6 @@ "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", - "deprecated": "Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details.", "bin": { "uuid": "bin/uuid" } @@ -4827,18 +4750,6 @@ "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", "engines": { "node": ">=8.3.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": "^5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } } }, "node_modules/xml-name-validator": { @@ -5266,7 +5177,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", - "devOptional": true, + "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -5441,7 +5352,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", - "devOptional": true + "dev": true }, "bn.js": { "version": "5.1.3", @@ -5479,7 +5390,7 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "devOptional": true, + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -5695,7 +5606,7 @@ "version": "3.4.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.3.tgz", "integrity": "sha512-DtM3g7juCXQxFVSNPNByEC2+NImtBuxQQvWlHunpJIS5Ocr0lG306cC7FCi7cEA0fzmybPUIl4txBIobk1gGOQ==", - "devOptional": true, + "dev": true, "requires": { "anymatch": "~3.1.1", "braces": "~3.0.2", @@ -6333,7 +6244,7 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "devOptional": true, + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -6416,6 +6327,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, "optional": true }, "gauge": { @@ -6497,7 +6409,7 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", - "devOptional": true, + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -6784,7 +6696,7 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "devOptional": true, + "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -6793,7 +6705,7 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "devOptional": true + "dev": true }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -6805,7 +6717,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", - "devOptional": true, + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -6814,7 +6726,7 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "devOptional": true + "dev": true }, "is-potential-custom-element-name": { "version": "1.0.1", @@ -7426,7 +7338,7 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "devOptional": true + "dev": true }, "npmlog": { "version": "4.1.2", @@ -7772,7 +7684,7 @@ "version": "2.2.2", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", - "devOptional": true + "dev": true }, "polished": { "version": "3.6.7", @@ -8014,7 +7926,7 @@ "version": "3.5.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz", "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==", - "devOptional": true, + "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -8388,8 +8300,7 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "devOptional": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "split": { "version": "1.0.1", @@ -8619,7 +8530,7 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "devOptional": true, + "dev": true, "requires": { "is-number": "^7.0.0" } @@ -8947,8 +8858,7 @@ "ws": { "version": "7.4.6", "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.6.tgz", - "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", - "requires": {} + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==" }, "xml-name-validator": { "version": "3.0.0",