From 631720d77a0e2acd0b58ac81da2d063d8620a917 Mon Sep 17 00:00:00 2001 From: Anibal Date: Tue, 11 Oct 2022 19:20:44 -0500 Subject: [PATCH 01/56] enh: properly showing All Projects option on Resource edit, given user permissions --- ui/src/resourceedit.vue | 77 ++++++++++++++++++++++++++++++++++------- 1 file changed, 64 insertions(+), 13 deletions(-) diff --git a/ui/src/resourceedit.vue b/ui/src/resourceedit.vue index 4c11aba8..098f7a99 100644 --- a/ui/src/resourceedit.vue +++ b/ui/src/resourceedit.vue @@ -67,7 +67,27 @@ + :reduce="r=>r.group_id" label="name" multiple> + + +

Please select projects that you'd like enable this resource. Any jobs submitted by any member of specified project will be executed on this resource. You have to be listed as administrator of the project to be able to select it.

@@ -314,23 +334,37 @@ export default { }}).then(res=>{ this.projects = res.data.projects; - //brainlife admin can add global user (but only site admin can *add* it) - //if(this.config.hasRole('admin')) { - this.projects.push({ - group_id: 1, - name: "(Public Resource)", - desc: "Share this resource with all brainlife users - only brainlife administrator can add this" + this.projects.forEach(p => { + p.private = false; }); + if ( + // brainlife admin can add global user (but only site admin can *add* it) + this.config.hasRole('admin') || + + // if you are editing a resource and it has already public permission + (this.resource._id && this.resource.gids.includes(1)) + ) { + this.projects.push({ + group_id: 1, + name: "All Projects", + desc: "Share this resource with all Brainlife users - only Brainlife administrators can add this", + private: false, + }); + } + //add private groups that user doesn't have access to.. so the value won't disappear - this.resource.gids.forEach(gid=>{ - const project = this.projects.find(p=>p.group_id == gid); - if(!project) this.projects.push({ + this.resource.gids.forEach(gid => { + const project = this.projects.find(p => p.group_id == gid); + if (!project) { + this.projects.push({ group_id: gid, - name: "(Private Project "+gid+")", + name: "Private Project", desc: "You don't have access to this project by it was added by other administrator", - }); - }); + private: true, + }); + } + }); }); }, @@ -443,5 +477,22 @@ export default { small { opacity: 0.5; } +.resource-projects-all_admin-message { + color: #C00; +} +.resource-projects-all__vs__selected { + color: #393; + font-weight: bold; +} +.resource-projects-private__vs__selected { + color: #999; +} +.resource-projects-all__vs__dropdown-option { + color: #393; + font-weight: bold; +} +.resource-projects-private__vs__dropdown-option { + color: #999; +} From 3a21bb971814ecd603a6e9f0734b1e0a9b47c767 Mon Sep 17 00:00:00 2001 From: Anibal Date: Tue, 11 Oct 2022 19:49:29 -0500 Subject: [PATCH 02/56] enh: adjust layout --- ui/src/resourceedit.vue | 197 +++++++++++++++++++++------------------- 1 file changed, 103 insertions(+), 94 deletions(-) diff --git a/ui/src/resourceedit.vue b/ui/src/resourceedit.vue index 098f7a99..0b77708f 100644 --- a/ui/src/resourceedit.vue +++ b/ui/src/resourceedit.vue @@ -8,23 +8,23 @@ - - -
- -
-
- Active -

- Uncheck this to temporarily disable this resource. -

-
+ +
+ + + + Active +

+ Uncheck this to temporarily disable this resource. +

+
+
@@ -32,7 +32,6 @@ -
@@ -43,7 +42,6 @@

-
Users who registered this resource and administer this resource.

@@ -92,8 +90,6 @@ Please select projects that you'd like enable this resource. Any jobs submitted by any member of specified project will be executed on this resource. You have to be listed as administrator of the project to be able to select it.

-
-
@@ -102,7 +98,6 @@ -
@@ -169,28 +164,27 @@

- Public Key -
+ Public Key
The following ssh public key should be stored in ~/.ssh/authorized_keys on this resource.

- Private Key -
+ Private Key
Brainlife will use the following private key to access this resource (You should not have to copy/paste this out of here). Use the current private key

- Issue New Keypair + Issue New Keypair

+
+
-
- -
+
+

@@ -201,37 +195,42 @@

The following Apps are allowed to run on this resource.

-
- -
- - - - - - Score - - -
+
+ + + + Name + + + + + Score + + + + + + +

Add App

-
- - -
-
-
-
-
-
+ +
+ @@ -196,6 +200,12 @@ export default { document.location = Vue.config.auth_signout; }, + suExit() { + localStorage.setItem('jwt', localStorage.getItem('su-jwt')); + localStorage.removeItem('su-jwt'); + window.location.reload(); + }, + reportbug() { window.open("https://github.com/brainlife/brainlife/issues", "github"); }, @@ -399,5 +409,3 @@ box-shadow: inset 0px 2px 2px rgba(0,0,0,0.05); display: inherit; } - - diff --git a/ui/src/main.js b/ui/src/main.js index 1279dcd9..82d5cecc 100644 --- a/ui/src/main.js +++ b/ui/src/main.js @@ -24,7 +24,6 @@ import Notifications from 'vue-notification' //override element-ui ugly $notify. //TODO really~!? import 'vue-awesome/icons/robot.js' -import 'vue-awesome/icons/book.js' import 'vue-awesome/icons/paper-plane.js' import 'vue-awesome/icons/vial.js' import 'vue-awesome/icons/search.js' @@ -33,7 +32,6 @@ import 'vue-awesome/icons/list.js' import 'vue-awesome/icons/list-alt.js' import 'vue-awesome/icons/lock.js' import 'vue-awesome/icons/ban.js' -import 'vue-awesome/icons/plus.js' import 'vue-awesome/icons/home.js' import 'vue-awesome/icons/th-large.js' import 'vue-awesome/icons/code-branch.js' @@ -47,6 +45,7 @@ import 'vue-awesome/icons/cog.js' import 'vue-awesome/icons/archive.js' import 'vue-awesome/icons/bars.js' import 'vue-awesome/icons/wrench.js' +import 'vue-awesome/icons/biohazard.js' import 'vue-awesome/icons/sign-in-alt.js' import 'vue-awesome/icons/sign-out-alt.js' import 'vue-awesome/icons/sticky-note.js' @@ -90,7 +89,6 @@ import 'vue-awesome/icons/check-circle.js' import 'vue-awesome/icons/star.js' import 'vue-awesome/icons/flask.js' import 'vue-awesome/icons/envelope.js' -import 'vue-awesome/icons/user-friends.js' import 'vue-awesome/icons/user.js' import 'vue-awesome/icons/user-cog.js' import 'vue-awesome/icons/university.js' @@ -267,11 +265,16 @@ Vue.config.plotly = { }, }; -Vue.config.hasRole = function(role, service = "warehouse") { - if( Vue.config.user && +Vue.config.hasRole = function (role, service = 'warehouse') { + return ( + Vue.config.user && Vue.config.user.scopes[service] && - ~Vue.config.user.scopes[service].indexOf(role)) return true; - return false; + ~Vue.config.user.scopes[service].indexOf(role) + ) +} + +Vue.config.isSu = function () { + return !!localStorage.getItem('su-jwt'); } axios.defaults.baseURL = Vue.config.api; //default root for $http @@ -295,28 +298,17 @@ if (process.env.NODE_ENV == "development") { } */ -console.log("warehouse..........."); -console.dir(Vue.config); - -// warning - jwt_decode just decode any jwt token. it doesn't validate it -// so we can't really trust that user is who they say they are on the client side. -// we just assume that user is trustworthy on the client side and pass jwt to -// server so that we can do a real jwt validation there function jwt_decode_brainlife(jwt) { - Vue.config.user = jwt_decode(jwt); - Vue.config.jwt = jwt; + Vue.config.user = jwt_decode(jwt) + Vue.config.jwt = jwt - //auth service should return sub in string format, but currently it doesn't.. - //let's just covert it to string - Vue.config.user.sub = Vue.config.user.sub.toString(); - axios.defaults.headers.common['Authorization'] = 'Bearer '+Vue.config.jwt; + Vue.config.user.sub = `${Vue.config.user.sub}` + axios.defaults.headers.common['Authorization'] = `Bearer ${Vue.config.jwt}` } -Vue.config.jwt = localStorage.getItem("jwt");//jwt token for user +Vue.config.jwt = localStorage.getItem('jwt') if (Vue.config.jwt) { - jwt_decode_brainlife(Vue.config.jwt); -} else { - console.log("jwt not set"); + jwt_decode_brainlife(Vue.config.jwt) } router.beforeEach(function (to, from, next) { @@ -352,13 +344,10 @@ Vue.use(VueGtag, { const soundHost = "https://raw.githubusercontent.com/brainlife/warehouse/master/ui/sounds/"; -//create main component new Vue({ el: '#app', router, - template: ` - - `, + template: ``, data() { return { ready: false, @@ -376,7 +365,7 @@ new Vue({ mounted() { let wide = localStorage.getItem("sidemenuWide"); - if(wide) this.sidemenuWide = (wide=="1"?true:false); + if(wide) this.sidemenuWide = (wide === "1"); let ro = localStorage.getItem("rightviewOpen"); if(ro) { @@ -448,22 +437,33 @@ new Vue({ location.reload(); }, - refresh_jwt(cb) { + async refresh_jwt(cb) { if(!Vue.config.jwt) return; - console.log("refreshing token"); - this.$http.post(Vue.config.auth_api+"/refresh").then(res=>{ - if(!res.data.jwt) console.log("token refresh didn't work.. resetting jwt"); + + if (Vue.config.isSu()) { + const jwt = localStorage.getItem('su-jwt'); + try { + const res = await this.$http.post( + `${Vue.config.auth_api}/refresh`, + {}, + { headers: { Authorization: `Bearer ${jwt}` } } + ); + localStorage.setItem('su-jwt', res.data.jwt); + } catch (error) { + localStorage.removeItem('su-jwt'); + } + } + + try { + const res = await this.$http.post(`${Vue.config.auth_api}/refresh`) jwt_decode_brainlife(res.data.jwt); - localStorage.setItem("jwt", res.data.jwt); + localStorage.setItem('jwt', res.data.jwt); if(cb) cb(); - }).catch(err=>{ - console.error("failed to referesh token"); - console.error("redirecting to auth service"); - console.error(err); + } catch (error) { sessionStorage.setItem('auth_redirect', document.location.href); document.location = Vue.config.auth_signin; - if(cb) cb(err); - }); + if(cb) cb(error); + } }, load_profile() { @@ -483,5 +483,3 @@ new Vue({ }, }, }) - - From 6bad5c19a10a005f0a36bc4142834c17be7498eb Mon Sep 17 00:00:00 2001 From: Anibal Date: Sun, 18 Dec 2022 16:48:26 -0600 Subject: [PATCH 05/56] fix: indents --- ui/src/main.js | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/ui/src/main.js b/ui/src/main.js index 82d5cecc..a3336c00 100644 --- a/ui/src/main.js +++ b/ui/src/main.js @@ -441,18 +441,18 @@ new Vue({ if(!Vue.config.jwt) return; if (Vue.config.isSu()) { - const jwt = localStorage.getItem('su-jwt'); - try { - const res = await this.$http.post( - `${Vue.config.auth_api}/refresh`, - {}, - { headers: { Authorization: `Bearer ${jwt}` } } - ); - localStorage.setItem('su-jwt', res.data.jwt); - } catch (error) { - localStorage.removeItem('su-jwt'); - } - } + const jwt = localStorage.getItem('su-jwt'); + try { + const res = await this.$http.post( + `${Vue.config.auth_api}/refresh`, + {}, + { headers: { Authorization: `Bearer ${jwt}` } } + ); + localStorage.setItem('su-jwt', res.data.jwt); + } catch (error) { + localStorage.removeItem('su-jwt'); + } + } try { const res = await this.$http.post(`${Vue.config.auth_api}/refresh`) From 66644ad2ec9fc4eda6b70f7f400653bfa150da8e Mon Sep 17 00:00:00 2001 From: Anibal Date: Tue, 20 Dec 2022 02:42:29 -0600 Subject: [PATCH 06/56] fix: handling heredoc injection --- api/controllers/dataset.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/api/controllers/dataset.js b/api/controllers/dataset.js index 3f3cdf60..f31918ad 100644 --- a/api/controllers/dataset.js +++ b/api/controllers/dataset.js @@ -1520,16 +1520,17 @@ set -e authors = authors.map(id=>common.deref_contact(id)).filter(a=>!!a).map(a=>a.fullname||a.email); //write README and bids/dataset_description.json - let root = "./proj-"+project_id; - script += "mkdir -p "+root+"/bids\n"; - script += "cat << '__ENDREADME__' > "+root+"/README\n"; + const uniqueHeredoc = Math.random().toString(36).substring(2); + let root = `./proj-${project_id}`; + script += `mkdir -p ${root}/bids\n`; + script += `cat << '__${uniqueHeredoc}__' > ${root}/README\n`; script += `${p.name} ${config.warehouse.url}/project/${project_id} ${p.desc}`; - script += "\n__ENDREADME__\n"; + script += `\n__${uniqueHeredoc}__\n`; let dataset_description = { BIDSVersion: "1.0.1", From f226ec881b6d750d97753bfc7053cdb4060372f1 Mon Sep 17 00:00:00 2001 From: Anibal Date: Tue, 20 Dec 2022 05:10:52 -0600 Subject: [PATCH 07/56] fix: starting retrofit --- api/common.js | 4 - api/config/index.js.dev | 2 - api/lib/provenance.js | 2 - package-lock.json | 2264 +++++++++++++++++++++++++-- package.json | 26 +- ui/config/dev.env | 8 - ui/config/index.js | 16 +- ui/config/prod.env.js | 8 +- ui/run.sh | 7 - ui/src/apps.vue | 10 - ui/src/appsgraph.vue | 154 -- ui/src/apptest.vue | 108 -- ui/src/components/datasets.vue | 4 +- ui/src/components/dtv.vue | 2 +- ui/src/components/filebrowser.vue | 4 +- ui/src/components/groupanalysis.vue | 2 +- ui/src/components/processes.vue | 6 +- ui/src/components/task.vue | 8 +- ui/src/components/taskconfig.vue | 2 +- ui/src/dashboard.vue | 107 +- ui/src/datauis/dtiinit.vue | 2 +- ui/src/datauis/images.vue | 4 +- ui/src/datauis/surfaces.vue | 8 +- ui/src/icons.js | 109 ++ ui/src/main.js | 473 ++---- ui/src/mixins/wait.js | 4 +- ui/src/modals/appsubmit.vue | 2 +- ui/src/modals/copytarget.vue | 2 +- ui/src/modals/ezbidsimporter.vue | 2 +- ui/src/modals/instanceselecter.vue | 2 +- ui/src/modals/viewselecter.vue | 64 +- ui/src/router.js | 233 +-- 32 files changed, 2496 insertions(+), 1153 deletions(-) delete mode 100644 ui/config/dev.env delete mode 100755 ui/run.sh delete mode 100644 ui/src/appsgraph.vue delete mode 100644 ui/src/apptest.vue create mode 100644 ui/src/icons.js diff --git a/api/common.js b/api/common.js index bed25d7c..8dc7b208 100644 --- a/api/common.js +++ b/api/common.js @@ -2,17 +2,13 @@ const request = require('request'); //TODO switch to axios! const rp = require('request-promise-native'); const keywordEx = require("keyword-extractor"); -const tmp = require('tmp'); -const path = require('path'); const child_process = require('child_process'); -const fs = require('fs'); const async = require('async'); const redis = require('redis'); const xmlescape = require('xml-escape'); const amqp = require("amqp"); //switch to amqplib? const axios = require('axios'); const jwt = require('express-jwt'); -const crypto = require('crypto'); const config = require('./config'); const db = require('./models'); diff --git a/api/config/index.js.dev b/api/config/index.js.dev index 2f20b63e..3e326957 100644 --- a/api/config/index.js.dev +++ b/api/config/index.js.dev @@ -13,8 +13,6 @@ const request = require('request'); //deprecate! const zlib = require('zlib'); const async = require('async'); -const atob = require('atob'); - exports.mongodb = "mongodb://brainlife_mongodb/warehouse"; exports.debug = true; diff --git a/api/lib/provenance.js b/api/lib/provenance.js index a4456ce4..f1d3e999 100644 --- a/api/lib/provenance.js +++ b/api/lib/provenance.js @@ -7,8 +7,6 @@ const mongoose = require('mongoose'); const common = require('../common'); const dbscan = require('@cdxoo/dbscan'); -const math = require('mathjs'); - exports.traverseProvenance = async (startTaskId) => { console.debug("traversing from task:", startTaskId); diff --git a/package-lock.json b/package-lock.json index 60b0cebc..aecf7b6e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -50,6 +50,8 @@ }, "devDependencies": { "chai": "^4.3.6", + "eslint": "^8.30.0", + "eslint-plugin-vue": "^9.8.0", "mocha": "^5.2.0", "node-geocoder": "^3.29.0", "supertest": "^3.3.0" @@ -1299,6 +1301,103 @@ "kuler": "^2.0.0" } }, + "node_modules/@eslint/eslintrc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@eslint/eslintrc/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/@eslint/eslintrc/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/eslintrc/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@eslint/eslintrc/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@google-cloud/common": { "version": "0.32.1", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.32.1.tgz", @@ -1393,11 +1492,114 @@ "resolved": "https://registry.npmjs.org/date-and-time/-/date-and-time-0.6.3.tgz", "integrity": "sha512-lcWy3AXDRJOD7MplwZMmNSRM//kZtJaLz4n6D1P5z9wEmZGBKhJRBIr1Xs9KNQJmdXPblvgffynYji4iylUTcA==" }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "node_modules/@influxdata/influxdb-client": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/@influxdata/influxdb-client/-/influxdb-client-1.29.0.tgz", "integrity": "sha512-9cup31a0S5Px1q5Bj9oyI8d84IWfv6nhldNuL8UNsiFPDD5SPw1QesPL4Oo+rR3Lbzbilt269NJOK5JOkmPyYA==" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@redis/bloom": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz", @@ -1554,6 +1756,27 @@ "node": ">= 0.6" } }, + "node_modules/acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true, + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, "node_modules/agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -2008,6 +2231,12 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "node_modules/bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -2230,6 +2459,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -2734,6 +2972,18 @@ "node": ">=4" } }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true, + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -2877,6 +3127,18 @@ "node": ">=0.3.1" } }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -3150,85 +3412,636 @@ "source-map": "~0.2.0" } }, - "node_modules/esprima": { - "version": "2.7.3", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", - "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "node_modules/eslint": { + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "dev": true, + "dependencies": { + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" + "eslint": "bin/eslint.js" }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" } }, - "node_modules/estraverse": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", - "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "node_modules/eslint-plugin-vue": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.8.0.tgz", + "integrity": "sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==", + "dev": true, + "dependencies": { + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "node_modules/eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { - "node": ">=0.10.0" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "node_modules/eslint-scope/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, "engines": { - "node": ">= 0.6" + "node": ">=4.0" } }, - "node_modules/event-target-shim": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", - "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "node_modules/eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^2.0.0" + }, "engines": { - "node": ">=6" + "node": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" } }, - "node_modules/eventemitter2": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", - "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" - }, - "node_modules/events": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", - "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true, "engines": { - "node": ">=0.4.x" + "node": ">=10" } }, - "node_modules/execa": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", - "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", - "dependencies": { - "cross-spawn": "^6.0.0", - "get-stream": "^4.0.0", - "is-stream": "^1.1.0", - "npm-run-path": "^2.0.0", - "p-finally": "^1.0.0", - "signal-exit": "^3.0.0", - "strip-eof": "^1.0.0" - }, + "node_modules/eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true, "engines": { - "node": ">=6" + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/execa/node_modules/is-stream": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", - "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", - "engines": { + "node_modules/eslint/node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/eslint/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/eslint/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/eslint/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/eslint/node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/eslint/node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/eslint/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/eslint/node_modules/optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/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, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/eslint/node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/eslint/node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, + "dependencies": { + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", + "integrity": "sha512-25w1fMXQrGdoquWnScXZGckOv+Wes+JDnuN/+7ex3SauFRS72r2lFDec0EKPt2YD1wUJ/IrfEex+9yp4hfSOJA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/event-target-shim": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz", + "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/eventemitter2": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-5.0.1.tgz", + "integrity": "sha512-5EM1GHXycJBS6mauYAbVKT1cVs7POKWb2NXD4Vyt8dDqeZa7LaDK1/sjtL+Zb0lzTpSNil4596Dyu97hz37QLg==" + }, + "node_modules/events": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/events/-/events-1.1.1.tgz", + "integrity": "sha512-kEcvvCBByWXGnZy6JUlgAp2gBIUjfCAV6P6TgT1/aaQKcmuAEC4OZTV1I4EWQLz2gxZw76atuVyvHhTxvi0Flw==", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "dependencies": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/execa/node_modules/is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha512-uQPm8kcs47jx38atAcWTVxyltQYoPT68y9aWYdV6yWXSyW8mzSat0TL6CiWdZeCdF3KrAvpVtnHbTv4RN+rqdQ==", + "engines": { "node": ">=0.10.0" } }, @@ -3404,11 +4217,32 @@ "url": "https://paypal.me/naturalintelligence" } }, + "node_modules/fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/filed-mimefix": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/filed-mimefix/-/filed-mimefix-0.1.3.tgz", @@ -3470,6 +4304,19 @@ "flat": "cli.js" } }, + "node_modules/flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "dependencies": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, "node_modules/flat/node_modules/is-buffer": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", @@ -3492,6 +4339,12 @@ "node": ">=4" } }, + "node_modules/flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "node_modules/fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -3789,6 +4642,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, "node_modules/glob/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -3800,6 +4665,21 @@ "node": "*" } }, + "node_modules/globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/google-auth-library": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", @@ -3844,6 +4724,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "node_modules/grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "node_modules/growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -4253,6 +5139,22 @@ "node": ">= 4" } }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -4420,6 +5322,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -4442,6 +5353,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/is-gzip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-2.0.0.tgz", @@ -4505,6 +5428,15 @@ "node": ">=0.10.0" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -4747,6 +5679,16 @@ "node": ">= 0.6.0" } }, + "node_modules/js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/js-sdsl" + } + }, "node_modules/js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -4811,6 +5753,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "node_modules/json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -5168,6 +6116,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "node_modules/lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -5909,6 +6863,12 @@ "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "optional": true }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "node_modules/negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -6202,6 +7162,18 @@ "node": ">=4" } }, + "node_modules/nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, "node_modules/number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -6416,6 +7388,18 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", @@ -6544,6 +7528,19 @@ "node": ">=4" } }, + "node_modules/postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, "node_modules/prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -6640,6 +7637,26 @@ "node": ">=0.4.x" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -6744,6 +7761,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, "node_modules/request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -6872,6 +7901,15 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, "node_modules/restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -6936,6 +7974,16 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -6950,6 +7998,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -7688,6 +8759,12 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "node_modules/then-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", @@ -7863,6 +8940,18 @@ "node": ">=4" } }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -8015,6 +9104,53 @@ "extsprintf": "^1.2.0" } }, + "node_modules/vue-eslint-parser": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", + "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "dev": true, + "dependencies": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/vue-eslint-parser/node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/vue-eslint-parser/node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, "node_modules/webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -8305,6 +9441,15 @@ "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", "integrity": "sha512-B/T4sDK8Z6aUh/qNr7mjKAwwncIljFuUP+DO/D5hloYFj+90O88z8Wf7oSucZTHxBAsC1/CTP4rtx/x1Uf72Mg==" }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, "node_modules/xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -8568,6 +9713,18 @@ "node": ">=8" } }, + "node_modules/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==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", @@ -9631,6 +10788,76 @@ "kuler": "^2.0.0" } }, + "@eslint/eslintrc": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-1.4.0.tgz", + "integrity": "sha512-7yfvXy6MWLgWSFsLhz5yH3iQ52St8cdUY6FoGieKkRDVxuxmrNuUetIuu6cmjNWwniUHiWXjxCr5tTXDrbYS5A==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.4.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "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==", + "dev": true + }, + "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" + } + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true + } + } + }, "@google-cloud/common": { "version": "0.32.1", "resolved": "https://registry.npmjs.org/@google-cloud/common/-/common-0.32.1.tgz", @@ -9720,11 +10947,86 @@ } } }, + "@humanwhocodes/config-array": { + "version": "0.11.8", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.8.tgz", + "integrity": "sha512-UybHIJzJnR5Qc/MsD9Kr+RpO2h+/P1GhOwdiLPXK5TWk5sgTdu88bTD9UP+CKbPPh5Rni1u0GjAdYQLemG8g+g==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + }, + "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" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, + "@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true + }, + "@humanwhocodes/object-schema": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", + "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", + "dev": true + }, "@influxdata/influxdb-client": { "version": "1.29.0", "resolved": "https://registry.npmjs.org/@influxdata/influxdb-client/-/influxdb-client-1.29.0.tgz", "integrity": "sha512-9cup31a0S5Px1q5Bj9oyI8d84IWfv6nhldNuL8UNsiFPDD5SPw1QesPL4Oo+rR3Lbzbilt269NJOK5JOkmPyYA==" }, + "@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + } + }, + "@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true + }, + "@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "requires": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + } + }, "@redis/bloom": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-1.0.2.tgz", @@ -9861,6 +11163,19 @@ "negotiator": "0.6.3" } }, + "acorn": { + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", + "dev": true + }, + "acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "requires": {} + }, "agent-base": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", @@ -10212,6 +11527,12 @@ "unpipe": "1.0.0" } }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", + "dev": true + }, "bowser": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.11.0.tgz", @@ -10388,6 +11709,12 @@ "get-intrinsic": "^1.0.2" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true + }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", @@ -10775,6 +12102,12 @@ "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", "integrity": "sha512-GsVpkFPlycH7/fRR7Dhcmnoii54gV1nz7y4CWyeFS14N+JVBBhY+r8amRHE4BwSYal7BPTDp8isvAlCxyFt3Hg==" }, + "cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "dev": true + }, "dashdash": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", @@ -10877,6 +12210,15 @@ "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==" }, + "doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, "dom-serializer": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz", @@ -11003,110 +12345,470 @@ "once": "^1.4.0" } }, - "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==" - }, - "entities": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" - }, - "errs": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", - "integrity": "sha512-r+/tydov04FSwTi+PrGd0IdY195Y1jZW2g27TJ+cErU8vvr9V4hHYxtRF8bMjv4zYEhap7wK7zBQ2i99LRo6kA==" - }, - "es-abstract": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", - "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", + "ent": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", + "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==" + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "errs": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/errs/-/errs-0.3.2.tgz", + "integrity": "sha512-r+/tydov04FSwTi+PrGd0IdY195Y1jZW2g27TJ+cErU8vvr9V4hHYxtRF8bMjv4zYEhap7wK7zBQ2i99LRo6kA==" + }, + "es-abstract": { + "version": "1.20.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz", + "integrity": "sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==", + "requires": { + "call-bind": "^1.0.2", + "es-to-primitive": "^1.2.1", + "function-bind": "^1.1.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.1.3", + "get-symbol-description": "^1.0.0", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "is-callable": "^1.2.6", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.2", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trimend": "^1.0.5", + "string.prototype.trimstart": "^1.0.5", + "unbox-primitive": "^1.0.2" + } + }, + "es-array-method-boxes-properly": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", + "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" + }, + "es-to-primitive": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", + "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "es6-promise": { + "version": "4.2.8", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", + "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" + }, + "es6-promisify": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", + "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "requires": { + "es6-promise": "^4.0.3" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-latex": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", + "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", + "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "requires": { + "esprima": "^2.7.1", + "estraverse": "^1.9.1", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.2.0" + } + }, + "eslint": { + "version": "8.30.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.30.0.tgz", + "integrity": "sha512-MGADB39QqYuzEGov+F/qb18r4i7DohCDOfatHaxI2iGlPuC65bwG2gxgO+7DkyL38dRFaRH7RaRAgU6JKL9rMQ==", + "dev": true, + "requires": { + "@eslint/eslintrc": "^1.4.0", + "@humanwhocodes/config-array": "^0.11.8", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "ajv": "^6.10.0", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.1.1", + "eslint-utils": "^3.0.0", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.4.0", + "esquery": "^1.4.0", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "grapheme-splitter": "^1.0.4", + "ignore": "^5.2.0", + "import-fresh": "^3.0.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-sdsl": "^4.1.4", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.1", + "regexpp": "^3.2.0", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "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" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "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" + } + }, + "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" + } + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true + }, + "find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "requires": { + "locate-path": "^6.0.0", + "path-exists": "^4.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 + }, + "ignore": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", + "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "dev": true + }, + "js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "requires": { + "argparse": "^2.0.1" + } + }, + "levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + } + }, + "locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "requires": { + "p-locate": "^5.0.0" + } + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "optionator": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", + "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "dev": true, + "requires": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.3" + } + }, + "p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "requires": { + "yocto-queue": "^0.1.0" + } + }, + "p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "requires": { + "p-limit": "^3.0.2" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "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 + }, + "prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true + }, + "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 + }, + "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" + } + }, + "strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "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" + } + }, + "type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "requires": { + "prelude-ls": "^1.2.1" + } + }, + "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" + } + } + } + }, + "eslint-plugin-vue": { + "version": "9.8.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.8.0.tgz", + "integrity": "sha512-E/AXwcTzunyzM83C2QqDHxepMzvI2y6x+mmeYHbVDQlKFqmKYvRrhaVixEeeG27uI44p9oKDFiyCRw4XxgtfHA==", + "dev": true, "requires": { - "call-bind": "^1.0.2", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "is-callable": "^1.2.6", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.5", - "string.prototype.trimstart": "^1.0.5", - "unbox-primitive": "^1.0.2" + "eslint-utils": "^3.0.0", + "natural-compare": "^1.4.0", + "nth-check": "^2.0.1", + "postcss-selector-parser": "^6.0.9", + "semver": "^7.3.5", + "vue-eslint-parser": "^9.0.1", + "xml-name-validator": "^4.0.0" } }, - "es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==" - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "eslint-scope": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", + "integrity": "sha512-QKQM/UXpIiHcLqJ5AOyIW7XZmzjkzQXYE54n1++wb0u9V/abW3l9uQnxX8Z5Xd18xyKIMTUAyQ0k1e8pz6LUrw==", + "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } } }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha512-C+d6UdsYDk0lMebHNR4S2NybQMMngAOnOwYBQjTOiv0MkoJMP0Myw2mgpDLBcpfCmRLxyFqYhS/CfOENq4SJhQ==", + "eslint-utils": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-3.0.0.tgz", + "integrity": "sha512-uuQC43IGctw68pJA1RgbQS8/NP7rch6Cwd4j3ZBtgo4/8Flj4eGE7ZYSZRN3iq5pVUv6GPdW5Z1RFleo84uLDA==", + "dev": true, "requires": { - "es6-promise": "^4.0.3" + "eslint-visitor-keys": "^2.0.0" + }, + "dependencies": { + "eslint-visitor-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", + "dev": true + } } }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" - }, - "escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" - }, - "escape-latex": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/escape-latex/-/escape-latex-1.2.0.tgz", - "integrity": "sha512-nV5aVWW1K0wEiUIEdZ4erkGGH8mDxGyxSeqPzRNtWP7ataw+/olFObw7hujFWlVjNsaDFw5VZ5NzVSIqRgfTiw==" - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + "eslint-visitor-keys": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", + "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", + "dev": true }, - "escodegen": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.8.1.tgz", - "integrity": "sha512-yhi5S+mNTOuRvyW4gWlg5W1byMaQGWWSYHXsuFZ7GBo7tpyOwi2EdzMP/QWxh9hwkD2m+wDVHJsxhRIj+v/b/A==", + "espree": { + "version": "9.4.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.4.1.tgz", + "integrity": "sha512-XwctdmTO6SIvCzd9810yyNzIrOrqNYV9Koizx4C/mRhf9uq0o4yHoCEU/670pOxOL/MSraektvSAji79kX90Vg==", + "dev": true, "requires": { - "esprima": "^2.7.1", - "estraverse": "^1.9.1", - "esutils": "^2.0.2", - "optionator": "^0.8.1", - "source-map": "~0.2.0" + "acorn": "^8.8.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.3.0" } }, "esprima": { @@ -11114,6 +12816,40 @@ "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", "integrity": "sha512-OarPfz0lFCiW4/AV2Oy1Rp9qu0iusTKqykwTspGCZtPxmF81JR4MmIebvF1F9+UOKth2ZubLQ4XGGaU+hSn99A==" }, + "esquery": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz", + "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, + "esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "requires": { + "estraverse": "^5.2.0" + }, + "dependencies": { + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + } + } + }, "estraverse": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-1.9.3.tgz", @@ -11298,11 +13034,29 @@ "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-3.19.0.tgz", "integrity": "sha512-4pXwmBplsCPv8FOY1WRakF970TjNGnGnfbOnLqjlYvMiF1SR3yOHyxMR/YCXpPTOspNF5gwudqktIP4VsWkvBg==" }, + "fastq": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.14.0.tgz", + "integrity": "sha512-eR2D+V9/ExcbF9ls441yIuN6TI2ED1Y2ZcA5BmMtJsOkWOFRJQ0Jt0g1UwqXJJVAb+V+umH5Dfr8oh4EVP7VVg==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, "fecha": { "version": "4.2.3", "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==" }, + "file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "requires": { + "flat-cache": "^3.0.4" + } + }, "filed-mimefix": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/filed-mimefix/-/filed-mimefix-0.1.3.tgz", @@ -11355,6 +13109,22 @@ } } }, + "flat-cache": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", + "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "dev": true, + "requires": { + "flatted": "^3.1.0", + "rimraf": "^3.0.2" + } + }, + "flatted": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", + "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "dev": true + }, "fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -11581,6 +13351,24 @@ } } }, + "glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dev": true, + "requires": { + "is-glob": "^4.0.3" + } + }, + "globals": { + "version": "13.19.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.19.0.tgz", + "integrity": "sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, "google-auth-library": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-3.1.2.tgz", @@ -11618,6 +13406,12 @@ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, + "grapheme-splitter": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", + "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", + "dev": true + }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", @@ -11929,6 +13723,16 @@ "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==" }, + "import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", @@ -12048,6 +13852,12 @@ "kind-of": "^6.0.2" } }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true + }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", @@ -12061,6 +13871,15 @@ "has-tostringtag": "^1.0.0" } }, + "is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } + }, "is-gzip": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-gzip/-/is-gzip-2.0.0.tgz", @@ -12102,6 +13921,12 @@ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", "integrity": "sha512-l4RyHgRqGN4Y3+9JHVrNqO+tN0rV5My76uW5/nuO4K1b6vw5G8d/cmFjP9tRfEsdhZNt0IFdZuK/c2Vr4Nb+Qg==" }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -12282,6 +14107,12 @@ "resolved": "https://registry.npmjs.org/jmespath/-/jmespath-0.16.0.tgz", "integrity": "sha512-9FzQjJ7MATs1tSpnco1K6ayiYE3figslrXA72G2HQ/n76RzvYlofyi5QM+iX4YRs/pu3yzxlVQSST23+dMDknw==" }, + "js-sdsl": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-sdsl/-/js-sdsl-4.2.0.tgz", + "integrity": "sha512-dyBIzQBDkCqCu+0upx25Y2jGdbTGxE9fshMsCdK0ViOongpV+n5tXRcZY9v7CaVQ79AGS9KA1KHtojxiM7aXSQ==", + "dev": true + }, "js-yaml": { "version": "3.14.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", @@ -12335,6 +14166,12 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, "json-stringify-safe": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", @@ -12634,6 +14471,12 @@ "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==" }, + "lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, "lodash.once": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", @@ -13229,6 +15072,12 @@ "integrity": "sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==", "optional": true }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", @@ -13460,6 +15309,15 @@ "path-key": "^2.0.0" } }, + "nth-check": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", + "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", + "dev": true, + "requires": { + "boolbase": "^1.0.0" + } + }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", @@ -13608,6 +15466,15 @@ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz", "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==" }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "requires": { + "callsites": "^3.0.0" + } + }, "parse-cache-control": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parse-cache-control/-/parse-cache-control-1.0.1.tgz", @@ -13716,6 +15583,16 @@ "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-8.0.0.tgz", "integrity": "sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==" }, + "postcss-selector-parser": { + "version": "6.0.11", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.11.tgz", + "integrity": "sha512-zbARubNdogI9j7WY4nQJBiNqQf3sLS3wCP4WfOidu+p28LofJqDH1tcXypGrcmMHhDk2t9wGhCsYe/+szLTy1g==", + "dev": true, + "requires": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + } + }, "prelude-ls": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", @@ -13790,6 +15667,12 @@ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", "integrity": "sha512-X/xY82scca2tau62i9mDyU9K+I+djTMUsvwf7xnUX5GLvVzgJybOJf4Y6o9Zx3oJK/LSXg5tTZBjwzqVPaPO2g==" }, + "queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true + }, "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", @@ -13875,6 +15758,12 @@ "functions-have-names": "^1.2.2" } }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, "request": { "version": "2.88.2", "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", @@ -13968,6 +15857,12 @@ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.1.7.tgz", "integrity": "sha512-9znBF0vBcaSN3W2j7wKvdERPwqTxSpCq+if5C0WoTCyV9n24rua28jeuQ2pL/HOf+yUe/Mef+H/5p60K0Id3bg==" }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true + }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", @@ -14016,6 +15911,12 @@ } } }, + "reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -14024,6 +15925,15 @@ "glob": "^7.1.3" } }, + "run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "requires": { + "queue-microtask": "^1.2.2" + } + }, "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", @@ -14611,6 +16521,12 @@ "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==" }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, "then-request": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/then-request/-/then-request-6.0.2.tgz", @@ -14760,6 +16676,12 @@ "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, + "type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -14881,6 +16803,38 @@ "extsprintf": "^1.2.0" } }, + "vue-eslint-parser": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-9.1.0.tgz", + "integrity": "sha512-NGn/iQy8/Wb7RrRa4aRkokyCZfOUWk19OP5HP6JEozQFX5AoS/t+Z0ZN7FY4LlmWc4FNI922V7cvX28zctN8dQ==", + "dev": true, + "requires": { + "debug": "^4.3.4", + "eslint-scope": "^7.1.1", + "eslint-visitor-keys": "^3.3.0", + "espree": "^9.3.1", + "esquery": "^1.4.0", + "lodash": "^4.17.21", + "semver": "^7.3.6" + }, + "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" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + } + } + }, "webidl-conversions": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-7.0.0.tgz", @@ -15103,6 +17057,12 @@ "resolved": "https://registry.npmjs.org/xml-escape/-/xml-escape-1.1.0.tgz", "integrity": "sha512-B/T4sDK8Z6aUh/qNr7mjKAwwncIljFuUP+DO/D5hloYFj+90O88z8Wf7oSucZTHxBAsC1/CTP4rtx/x1Uf72Mg==" }, + "xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "dev": true + }, "xml2js": { "version": "0.4.23", "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", @@ -15315,6 +17275,12 @@ } } }, + "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==", + "dev": true + }, "zip-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/zip-stream/-/zip-stream-4.1.0.tgz", diff --git a/package.json b/package.json index cc85d44b..960bdb40 100644 --- a/package.json +++ b/package.json @@ -1,49 +1,41 @@ { "name": "warehouse", "version": "1.0.0", - "description": "Service that allows data warehousing and workfow orchestration", + "description": "Central data repository service", "main": "index.js", "scripts": { - "apidoc": " apidoc -i ./ -o ../docs/apidoc/", - "cover": "node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha -- -R spec test/*.js", - "deploy": "ssh -t test.brainlife.io sudo \"sudo /root/docker/warehouse/update.sh\"", - "deploy-prod": "ssh -t brainlife.io sudo \"sudo /root/docker/warehouse/update.sh\"" + "apidoc": "apidoc -i ./ -o ../docs/apidoc/", + "cover": "node_modules/istanbul/lib/cli.js cover node_modules/mocha/bin/_mocha -- -R spec test/*.js" }, "repository": { "type": "git", - "url": "git+https://github.com/brain-life/warehouse.git" + "url": "git+https://github.com/brainlife/warehouse.git" }, "author": "Soichi Hayashi (http://soichi.us)", "license": "ISC", "bugs": { - "url": "https://github.com/brain-life/warehouse/issues" + "url": "https://github.com/brainlife/warehouse/issues" }, - "homepage": "https://github.com/brain-life/warehouse#readme", + "homepage": "https://github.com/brainlife/warehouse#readme", "dependencies": { "@cdxoo/dbscan": "^1.0.2", "@influxdata/influxdb-client": "^1.29.0", "amqp": "^0.2.7", "archiver": "^5.3.1", "async": "^3.2.3", - "atob": "^2.1.2", "aws-sdk": "^2.1128.0", "axios": "^0.21.4", "body-parser": "^1.20.0", - "brainlife": "^1.5.43", "compression": "^1.7.3", "cors": "^2.8.5", - "coveralls": "^3.1.1", "crypto": "^1.0.1", "express": "^4.18.1", "express-jwt": "^6.1.2", "express-winston": "^3.0.1", "gunzip-stream": "^1.0.1", - "istanbul": "^0.4.5", "keyword-extractor": "0.0.20", - "mathjs": "^10.5.1", "mongoose": "^6.3.2", "morgan": "^1.10.0", - "n-stopwords": "^1.1.2", "nocache": "^2.0.0", "nodemailer": "^6.7.5", "pkgcloud": "^2.2.0", @@ -54,13 +46,17 @@ "ssh2": "^1.10.0", "stream-meter": "^1.0.4", "tar": "^4.4.19", - "tmp": "^0.2.1", "winston": "^3.7.2", "xml-escape": "^1.1.0", "xml2js": "^0.4.23" }, "devDependencies": { + "brainlife": "^1.5.43", + "istanbul": "^0.4.5", + "coveralls": "^3.1.1", "chai": "^4.3.6", + "eslint": "^8.30.0", + "eslint-plugin-vue": "^9.8.0", "mocha": "^5.2.0", "node-geocoder": "^3.29.0", "supertest": "^3.3.0" diff --git a/ui/config/dev.env b/ui/config/dev.env deleted file mode 100644 index c6464ea7..00000000 --- a/ui/config/dev.env +++ /dev/null @@ -1,8 +0,0 @@ -const merge = require('webpack-merge') -const prodEnv = require('./prod.env') - -module.exports = merge(prodEnv, { - NODE_ENV: '"development"', - HOSTNAME: '"localhost:8080"' -}) - diff --git a/ui/config/index.js b/ui/config/index.js index 926af854..d31576ad 100644 --- a/ui/config/index.js +++ b/ui/config/index.js @@ -6,19 +6,10 @@ module.exports = { index: path.resolve(__dirname, '../dist/index.html'), assetsRoot: path.resolve(__dirname, '../dist'), assetsSubDirectory: 'static', - //assetsPublicPath: '/warehouse/', assetsPublicPath: '/', productionSourceMap: true, - // Gzip off by default as many popular static hosts such as - // Surge or Netlify already gzip all static assets for you. - // Before setting to `true`, make sure to: - // npm install --save-dev compression-webpack-plugin productionGzip: true, productionGzipExtensions: ['js', 'css'], - // Run the build command with an extra argument to - // View the bundle analyzer report after build finishes: - // `npm run build --report` - // Set to `true` or `false` to always turn it on or off bundleAnalyzerReport: process.env.npm_config_report }, dev: { @@ -28,11 +19,6 @@ module.exports = { assetsSubDirectory: 'static', assetsPublicPath: '/', proxyTable: {}, - // CSS Sourcemaps off by default because relative paths are "buggy" - // with this option, according to the CSS-Loader README - // (https://github.com/webpack/css-loader#sourcemaps) - // In our experience, they generally work as expected, - // just be aware of this issue when enabling this option. - cssSourceMap: false + cssSourceMap: true, }, } diff --git a/ui/config/prod.env.js b/ui/config/prod.env.js index 175e2c7c..01757312 100644 --- a/ui/config/prod.env.js +++ b/ui/config/prod.env.js @@ -1,10 +1,4 @@ - -//if you update this, you will need to restart your dev server module.exports = { NODE_ENV: '"production"', - - //from https://analytics.google.com/analytics/web/#/a118407195p290529241/admin/streams/table/3007805011 - //GTAG: '"G-J5H19RMNCT"', //measurement ID - GTAG: '"UA-118407195-1"', //tracking ID (dheeraj says we need to use this instead) + GTAG: '"UA-118407195-1"', } - diff --git a/ui/run.sh b/ui/run.sh deleted file mode 100755 index b6974b6a..00000000 --- a/ui/run.sh +++ /dev/null @@ -1,7 +0,0 @@ -docker rm -f warehouse-dev -docker run --restart unless-stopped \ - --name warehouse-dev \ - --net host \ - -v `pwd`:/app \ - -w /app \ - -d node:10 npm run dev diff --git a/ui/src/apps.vue b/ui/src/apps.vue index 8003c402..8b82da9b 100644 --- a/ui/src/apps.vue +++ b/ui/src/apps.vue @@ -29,16 +29,6 @@ My Apps

-
- -
-
- -
-
- -
-
diff --git a/ui/src/appsgraph.vue b/ui/src/appsgraph.vue deleted file mode 100644 index 7dc158de..00000000 --- a/ui/src/appsgraph.vue +++ /dev/null @@ -1,154 +0,0 @@ - - - - - - diff --git a/ui/src/apptest.vue b/ui/src/apptest.vue deleted file mode 100644 index ba188dba..00000000 --- a/ui/src/apptest.vue +++ /dev/null @@ -1,108 +0,0 @@ - - - - - diff --git a/ui/src/components/datasets.vue b/ui/src/components/datasets.vue index c59fd11f..2f27f33f 100644 --- a/ui/src/components/datasets.vue +++ b/ui/src/components/datasets.vue @@ -747,7 +747,7 @@ export default { get_instance() { //first create an instance to download things to - return this.$http.post(Vue.config.wf_api+'/instance', { + return this.$http.post(Vue.config.amaretti_api+'/instance', { name: "brainlife.download", config: { selected: this.selected, @@ -771,7 +771,7 @@ export default { this.submit_process(opt.project_id, opt.instance); } else { //need to create a new instance - this.$http.post(Vue.config.wf_api+'/instance', { + this.$http.post(Vue.config.amaretti_api+'/instance', { desc: opt.desc, config: { brainlife: true, diff --git a/ui/src/components/dtv.vue b/ui/src/components/dtv.vue index 5088cf14..dc1b5142 100644 --- a/ui/src/components/dtv.vue +++ b/ui/src/components/dtv.vue @@ -94,7 +94,7 @@ export default { methods: { /* loadProduct() { - this.$http.get(Vue.config.wf_api+'/task/product/', {params: {ids: [this.task._id]}}).then(res=>{ + this.$http.get(Vue.config.amaretti_api+'/task/product/', {params: {ids: [this.task._id]}}).then(res=>{ if(res.data.length == 1) { this.product = res.data[0].product; } else { diff --git a/ui/src/components/filebrowser.vue b/ui/src/components/filebrowser.vue index 2888934d..866a4805 100644 --- a/ui/src/components/filebrowser.vue +++ b/ui/src/components/filebrowser.vue @@ -126,7 +126,7 @@ export default { return subpath; }, get_download_url(file) { - var url = Vue.config.wf_api+'/task/download/'+this.task._id+'/'; + var url = Vue.config.amaretti_api+'/task/download/'+this.task._id+'/'; var p = this.subpath(file); if(p) url += p; url += '?at='+Vue.config.jwt; @@ -138,7 +138,7 @@ export default { document.location = url; }, load() { - var url = Vue.config.wf_api+'/task/ls/'+this.task._id; + var url = Vue.config.amaretti_api+'/task/ls/'+this.task._id; if(this.path) url += '?p='+encodeURIComponent(this.path); this.$http.get(url).then(res=>{ this.files = res.data.files.sort((a, b)=>{ diff --git a/ui/src/components/groupanalysis.vue b/ui/src/components/groupanalysis.vue index 06c8e4fb..98b89165 100644 --- a/ui/src/components/groupanalysis.vue +++ b/ui/src/components/groupanalysis.vue @@ -317,7 +317,7 @@ export default { }, stop(task) { - this.$http.put(Vue.config.wf_api+'/task/stop/'+task._id) + this.$http.put(Vue.config.amaretti_api+'/task/stop/'+task._id) .then(res=>{ this.$notify({ text: res.data.message, type: 'success'}); }) diff --git a/ui/src/components/processes.vue b/ui/src/components/processes.vue index eb33645a..cd9ff258 100644 --- a/ui/src/components/processes.vue +++ b/ui/src/components/processes.vue @@ -288,7 +288,7 @@ export default { this.selected.desc = desc; clearTimeout(debounce); debounce = setTimeout(()=>{ - this.$http.put(Vue.config.wf_api+'/instance/'+this.selected._id, this.selected).then(res=>{ + this.$http.put(Vue.config.amaretti_api+'/instance/'+this.selected._id, this.selected).then(res=>{ this.$notify({ text: 'Updated description', type: 'success' }); }); }, 1000); @@ -350,7 +350,7 @@ export default { newinstance() { let desc = prompt("Please enter process description"); if(!desc) return; - this.$http.post(Vue.config.wf_api+'/instance', { + this.$http.post(Vue.config.amaretti_api+'/instance', { desc, config: { brainlife: true, @@ -386,7 +386,7 @@ export default { } //console.log("loading instances for group", this.project.group_id); - this.$http.get(Vue.config.wf_api+'/instance', {params: { + this.$http.get(Vue.config.amaretti_api+'/instance', {params: { find: JSON.stringify({ "config.brainlife": true, status: {$ne: "removed"}, diff --git a/ui/src/components/task.vue b/ui/src/components/task.vue index 23b0aedb..88d9ff05 100644 --- a/ui/src/components/task.vue +++ b/ui/src/components/task.vue @@ -249,7 +249,7 @@ export default { }, rerun() { - this.$http.put(Vue.config.wf_api+'/task/rerun/'+this.task._id) + this.$http.put(Vue.config.amaretti_api+'/task/rerun/'+this.task._id) .then(res=>{ this.$notify({ text: res.data.message, type: 'success'}); }) @@ -259,7 +259,7 @@ export default { }, stop() { - this.$http.put(Vue.config.wf_api+'/task/stop/'+this.task._id) + this.$http.put(Vue.config.amaretti_api+'/task/stop/'+this.task._id) .then(res=>{ this.$notify({ text: res.data.message, type: 'success'}); }) @@ -269,7 +269,7 @@ export default { }, remove() { - this.$http.delete(Vue.config.wf_api+'/task/'+this.task._id) + this.$http.delete(Vue.config.amaretti_api+'/task/'+this.task._id) .then(res=>{ this.$notify({ title: 'Removing Task', text: 'Task removal requested', type: 'success', }); this.$emit("remove", this.task._id); @@ -280,7 +280,7 @@ export default { }, poke() { - this.$http.put(Vue.config.wf_api+'/task/poke/'+this.task._id) + this.$http.put(Vue.config.amaretti_api+'/task/poke/'+this.task._id) .then(res=>{ this.$notify({text: res.data.message, type: 'success'}); }) diff --git a/ui/src/components/taskconfig.vue b/ui/src/components/taskconfig.vue index 5cb5b08f..1bd6871c 100644 --- a/ui/src/components/taskconfig.vue +++ b/ui/src/components/taskconfig.vue @@ -61,7 +61,7 @@ export default { this.load_config(this.task.config); } else { if(!this.taskid) return; - this.$http.get(Vue.config.wf_api+'/task/'+this.taskid).then(res=>{ + this.$http.get(Vue.config.amaretti_api+'/task/'+this.taskid).then(res=>{ this.load_config(res.data.config); }); } diff --git a/ui/src/dashboard.vue b/ui/src/dashboard.vue index a58c9ca5..a12b0722 100644 --- a/ui/src/dashboard.vue +++ b/ui/src/dashboard.vue @@ -1,8 +1,5 @@ @@ -99,12 +69,7 @@ import contact from '@/components/contact' import authprofilecache from '@/mixins/authprofilecache' import resource_cache from '@/mixins/resource_cache' -/* -import vis from 'vis/dist/vis.min.js' -import 'vis/dist/vis.min.css' -*/ - -const lib = require('@/lib'); //for avatar_url +const lib = require('@/lib') export default { mixins: [authprofilecache, resource_cache], @@ -112,7 +77,6 @@ export default { pageheader, statusicon, contact, - //vis, }, data () { @@ -120,7 +84,7 @@ export default { recent_users: null, recent_tasks: null, - projects: {}, //group_id to project lookup + projects: {}, reloader: null, config: Vue.config, @@ -131,83 +95,20 @@ export default { clearInterval(this.reloader); }, - mounted() { - - setInterval(this.reload, 1000*30); + setInterval(this.reload, 1000 * 30); this.reload(); - - //load other minor things.. - let days = 30; - if(Vue.config.debug) days = 360; - this.$http.get(Vue.config.auth_api+"/profile/recreg/"+days).then(res=>{ - this.recent_users = res.data.users; - - //load public profiles for each users - this.recent_users.forEach(u=>{ - this.authprofilecache(u.sub, (err, user)=>{ - Vue.set(u, '_profile', user.profile.public); - }); - }); - }).catch(console.error); - - }, methods: { avatar_url: lib.avatar_url, - /* - async update_resource_vis() { - var groups = new vis.DataSet(); - let gid = 0; - let items = []; - //let min_time = null; - //let max_time = null; - for(let gid = 0; gid < this.resources.length;++gid) { - let resource = this.resources[gid]; - groups.add({ - id: gid, - content: resource.name, - options: { - shaded: { - orientation: 'bottom' - } - } - }); - let res = await this.$http.get(Vue.config.amaretti_api+'/resource/'+resource._id+'/metrics'); - res.data.forEach(d=>{ - let count = d[0]; - let time = d[1]*1000; - //if(min_time === null || min_time > time) min_time = time; - //if(max_time === null || max_time < time) max_time = time; - items.push({ - y: count, - x: time, - group: gid, - }); - }); - } - let dataset = new vis.DataSet(items); - let graph2d = new vis.Graph2d(this.$refs.resource_vis, dataset, groups, { - drawPoints: false, - legend: true, - //start: min_time, - //end: max_time, - }); - }, - */ - opentask(task) { let project = this.projects[task._group_id]; this.$router.push("/project/"+project._id+"/process/"+task.instance_id+"#"+task._id) }, reload() { - console.log("reloading data"); - - //let recent_date = new Date(); - //recent_date.setDate(recent_date.getDate()-30); let find = JSON.stringify({ status: {$nin: ["removed", "stopped"]}, service: {$nin: ["brainlife/app-stage"]}, diff --git a/ui/src/datauis/dtiinit.vue b/ui/src/datauis/dtiinit.vue index 84194d84..493cbb51 100644 --- a/ui/src/datauis/dtiinit.vue +++ b/ui/src/datauis/dtiinit.vue @@ -20,7 +20,7 @@ export default { mounted() { var basepath = ""; if(this.subdir) basepath+=this.subdir+"/"; - this.url = Vue.config.wf_api+'/task/download/'+this.task._id+'/'+basepath+'dti/t1pdd.png'+'?at='+Vue.config.jwt; + this.url = Vue.config.amaretti_api+'/task/download/'+this.task._id+'/'+basepath+'dti/t1pdd.png'+'?at='+Vue.config.jwt; } } diff --git a/ui/src/datauis/images.vue b/ui/src/datauis/images.vue index 312086b2..0882c5ee 100644 --- a/ui/src/datauis/images.vue +++ b/ui/src/datauis/images.vue @@ -37,11 +37,11 @@ export default { // Load image.json var basepath = ""; if(this.subdir) basepath+=this.subdir+"/"; - var url = Vue.config.wf_api+'/task/download/'+this.task._id+'/'+basepath+'images.json'+'?at='+Vue.config.jwt; + var url = Vue.config.amaretti_api+'/task/download/'+this.task._id+'/'+basepath+'images.json'+'?at='+Vue.config.jwt; this.$http.get(url).then(res=>{ //console.dir(res.data); res.data.images.forEach(image=>{ - var src = Vue.config.wf_api+'/task/download/'+this.task._id+'/'+basepath+image.filename+'?at='+Vue.config.jwt; + var src = Vue.config.amaretti_api+'/task/download/'+this.task._id+'/'+basepath+image.filename+'?at='+Vue.config.jwt; this.images.push({ name: image.name, desc: image.desc, diff --git a/ui/src/datauis/surfaces.vue b/ui/src/datauis/surfaces.vue index 3b7a32cb..6eb9cea8 100644 --- a/ui/src/datauis/surfaces.vue +++ b/ui/src/datauis/surfaces.vue @@ -26,7 +26,7 @@ export default { var basepath = ""; if(subdir) basepath += subdir+"/"; - let url_surfaces_json = Vue.config.wf_api+"/task/download/"+this.task._id+"/"+basepath+"surfaces/surfaces.json"+"?at="+Vue.config.jwt; + let url_surfaces_json = Vue.config.amaretti_api+"/task/download/"+this.task._id+"/"+basepath+"surfaces/surfaces.json"+"?at="+Vue.config.jwt; this.$http.get(url_surfaces_json) .then(res => { @@ -34,16 +34,16 @@ export default { surfaces.forEach(surface => { surface.basename = surface.name||surface.filename; //surface.filename is deprecated? let filepath = surface.path||surface.filename; //surface.filename is deprecated? - surface.filename = Vue.config.wf_api+"/task/download/"+this.task._id+"/"+basepath+"surfaces/"+filepath+"?at="+Vue.config.jwt; + surface.filename = Vue.config.amaretti_api+"/task/download/"+this.task._id+"/"+basepath+"surfaces/"+filepath+"?at="+Vue.config.jwt; }); cb(surfaces); }).catch(err => { // old code to use in case surfaces.json doesn't exist - this.$http.get(Vue.config.wf_api+"/task/ls/"+this.task._id+"?p="+encodeURIComponent(basepath+"surfaces")) + this.$http.get(Vue.config.amaretti_api+"/task/ls/"+this.task._id+"?p="+encodeURIComponent(basepath+"surfaces")) .then(res=>{ var surfaces = []; res.data.files.forEach(file=>{ - var url = Vue.config.wf_api+"/task/download/"+this.task._id+"/"+basepath+"surfaces/"+file.filename+"?at="+Vue.config.jwt; + var url = Vue.config.amaretti_api+"/task/download/"+this.task._id+"/"+basepath+"surfaces/"+file.filename+"?at="+Vue.config.jwt; surfaces.push({ name: file.filename.substring(0, file.filename.length-4), path: url }); }); cb(surfaces); diff --git a/ui/src/icons.js b/ui/src/icons.js new file mode 100644 index 00000000..1b1d4613 --- /dev/null +++ b/ui/src/icons.js @@ -0,0 +1,109 @@ +import 'vue-awesome/icons/robot.js' +import 'vue-awesome/icons/paper-plane.js' +import 'vue-awesome/icons/vial.js' +import 'vue-awesome/icons/search.js' +import 'vue-awesome/icons/th.js' +import 'vue-awesome/icons/list.js' +import 'vue-awesome/icons/list-alt.js' +import 'vue-awesome/icons/lock.js' +import 'vue-awesome/icons/ban.js' +import 'vue-awesome/icons/home.js' +import 'vue-awesome/icons/th-large.js' +import 'vue-awesome/icons/code-branch.js' +import 'vue-awesome/icons/caret-right.js' +import 'vue-awesome/icons/caret-up.js' +import 'vue-awesome/icons/caret-down.js' +import 'vue-awesome/icons/chart-area.js' +import 'vue-awesome/icons/code.js' +import 'vue-awesome/icons/newspaper.js' +import 'vue-awesome/icons/cog.js' +import 'vue-awesome/icons/archive.js' +import 'vue-awesome/icons/bars.js' +import 'vue-awesome/icons/wrench.js' +import 'vue-awesome/icons/biohazard.js' +import 'vue-awesome/icons/sign-in-alt.js' +import 'vue-awesome/icons/sign-out-alt.js' +import 'vue-awesome/icons/sticky-note.js' +import 'vue-awesome/icons/external-link-alt.js' +import 'vue-awesome/icons/exclamation.js' +import 'vue-awesome/icons/exclamation-triangle.js' +import 'vue-awesome/icons/exclamation-circle.js' +import 'vue-awesome/icons/question-circle.js' +import 'vue-awesome/icons/question.js' +import 'vue-awesome/icons/copy.js' +import 'vue-awesome/icons/cubes.js' +import 'vue-awesome/icons/cube.js' +import 'vue-awesome/icons/server.js' +import 'vue-awesome/icons/id-badge.js' +import 'vue-awesome/icons/eye.js' +import 'vue-awesome/icons/play.js' +import 'vue-awesome/icons/calendar.js' +import 'vue-awesome/icons/download.js' +import 'vue-awesome/icons/certificate.js' +import 'vue-awesome/icons/cloud.js' +import 'vue-awesome/icons/cloud-download-alt.js' +import 'vue-awesome/icons/edit.js' +import 'vue-awesome/icons/indent.js' +import 'vue-awesome/icons/sort.js' +import 'vue-awesome/icons/stop.js' +import 'vue-awesome/icons/stop-circle.js' +import 'vue-awesome/icons/info.js' +import 'vue-awesome/icons/hand-paper.js' +import 'vue-awesome/icons/handshake.js' +import 'vue-awesome/icons/redo.js' +import 'vue-awesome/icons/trash.js' +import 'vue-awesome/icons/ellipsis-v.js' +import 'vue-awesome/icons/angle-left.js' +import 'vue-awesome/icons/shield-alt.js' +import 'vue-awesome/icons/times.js' +import 'vue-awesome/icons/check.js' +import 'vue-awesome/icons/check-square.js' +import 'vue-awesome/icons/chevron-left.js' +import 'vue-awesome/icons/chevron-right.js' +import 'vue-awesome/icons/check-circle.js' +import 'vue-awesome/icons/star.js' +import 'vue-awesome/icons/flask.js' +import 'vue-awesome/icons/envelope.js' +import 'vue-awesome/icons/user.js' +import 'vue-awesome/icons/user-cog.js' +import 'vue-awesome/icons/university.js' +import 'vue-awesome/icons/users.js' +import 'vue-awesome/icons/user-friends.js' +import 'vue-awesome/icons/fire-alt.js' +import 'vue-awesome/icons/arrow-up.js' +import 'vue-awesome/icons/arrow-down.js' +import 'vue-awesome/icons/arrow-right.js' +import 'vue-awesome/icons/arrow-left.js' +import 'vue-awesome/icons/arrows-alt-v.js' +import 'vue-awesome/icons/info-circle.js' +import 'vue-awesome/icons/circle.js' +import 'vue-awesome/icons/dot-circle.js' +import 'vue-awesome/icons/sync-alt.js' +import 'vue-awesome/icons/book.js' +import 'vue-awesome/icons/file-signature.js' +import 'vue-awesome/icons/file.js' +import 'vue-awesome/icons/hourglass.js' +import 'vue-awesome/icons/hourglass-half.js' +import 'vue-awesome/icons/thumbs-up.js' +import 'vue-awesome/icons/folder.js' +import 'vue-awesome/icons/clock.js' +import 'vue-awesome/icons/folder-open.js' +import 'vue-awesome/icons/minus.js' +import 'vue-awesome/icons/plus.js' +import 'vue-awesome/icons/link.js' +import 'vue-awesome/icons/brands/slack.js' +import 'vue-awesome/icons/brands/github.js' +import 'vue-awesome/icons/brands/orcid.js' +import 'vue-awesome/icons/brands/docker.js' +import 'vue-awesome/icons/brands/twitter.js' +import 'vue-awesome/icons/brands/facebook.js' +import 'vue-awesome/icons/brands/google-plus.js' +import 'vue-awesome/icons/brands/google.js' +import 'vue-awesome/icons/brands/linkedin.js' +import 'vue-awesome/icons/brands/pinterest.js' +import 'vue-awesome/icons/brands/reddit.js' +import 'vue-awesome/icons/brands/skype.js' +import 'vue-awesome/icons/brands/weibo.js' +import 'vue-awesome/icons/regular/file.js' +import 'vue-awesome/icons/regular/calendar-times.js' +import 'vue-awesome/icons/skull-crossbones.js' diff --git a/ui/src/main.js b/ui/src/main.js index a3336c00..c5db146f 100644 --- a/ui/src/main.js +++ b/ui/src/main.js @@ -3,176 +3,55 @@ import 'bootstrap/dist/css/bootstrap.min.css' import 'bootstrap-vue/dist/bootstrap-vue.min.css' import 'select2/dist/css/select2.css' -//import 'highlight.js/styles/default.css' +// import 'highlight.js/styles/default.css' import 'katex/dist/katex.min.css' import 'vue2-animate/dist/vue2-animate.min.css' -//3rd parties import 'jquery/dist/jquery.js' import 'select2/dist/js/select2.js' import Vue from 'vue' -import 'vue-select/dist/vue-select.css'; -import vSelect from 'vue-select' +import 'vue-select/dist/vue-select.css' +import vSelect from 'vue-select' import 'perfect-scrollbar/css/perfect-scrollbar.css' -//import VueHighlightJS from 'vue-highlightjs' - -//https://www.npmjs.com/package/vue-notification -import Notifications from 'vue-notification' //override element-ui ugly $notify.. - -//TODO really~!? -import 'vue-awesome/icons/robot.js' -import 'vue-awesome/icons/paper-plane.js' -import 'vue-awesome/icons/vial.js' -import 'vue-awesome/icons/search.js' -import 'vue-awesome/icons/th.js' -import 'vue-awesome/icons/list.js' -import 'vue-awesome/icons/list-alt.js' -import 'vue-awesome/icons/lock.js' -import 'vue-awesome/icons/ban.js' -import 'vue-awesome/icons/home.js' -import 'vue-awesome/icons/th-large.js' -import 'vue-awesome/icons/code-branch.js' -import 'vue-awesome/icons/caret-right.js' -import 'vue-awesome/icons/caret-up.js' -import 'vue-awesome/icons/caret-down.js' -import 'vue-awesome/icons/chart-area.js' -import 'vue-awesome/icons/code.js' -import 'vue-awesome/icons/newspaper.js' -import 'vue-awesome/icons/cog.js' -import 'vue-awesome/icons/archive.js' -import 'vue-awesome/icons/bars.js' -import 'vue-awesome/icons/wrench.js' -import 'vue-awesome/icons/biohazard.js' -import 'vue-awesome/icons/sign-in-alt.js' -import 'vue-awesome/icons/sign-out-alt.js' -import 'vue-awesome/icons/sticky-note.js' -import 'vue-awesome/icons/external-link-alt.js' -import 'vue-awesome/icons/exclamation.js' -import 'vue-awesome/icons/exclamation-triangle.js' -import 'vue-awesome/icons/exclamation-circle.js' -import 'vue-awesome/icons/question-circle.js' -import 'vue-awesome/icons/question.js' -import 'vue-awesome/icons/copy.js' -import 'vue-awesome/icons/cubes.js' -import 'vue-awesome/icons/cube.js' -import 'vue-awesome/icons/server.js' -import 'vue-awesome/icons/id-badge.js' -import 'vue-awesome/icons/eye.js' -import 'vue-awesome/icons/play.js' -import 'vue-awesome/icons/calendar.js' -import 'vue-awesome/icons/download.js' -import 'vue-awesome/icons/certificate.js' -import 'vue-awesome/icons/cloud.js' -import 'vue-awesome/icons/cloud-download-alt.js' -import 'vue-awesome/icons/edit.js' -import 'vue-awesome/icons/indent.js' -import 'vue-awesome/icons/sort.js' -import 'vue-awesome/icons/stop.js' -import 'vue-awesome/icons/stop-circle.js' -import 'vue-awesome/icons/info.js' -import 'vue-awesome/icons/hand-paper.js' -import 'vue-awesome/icons/handshake.js' -import 'vue-awesome/icons/redo.js' -import 'vue-awesome/icons/trash.js' -import 'vue-awesome/icons/ellipsis-v.js' -import 'vue-awesome/icons/angle-left.js' -import 'vue-awesome/icons/shield-alt.js' -import 'vue-awesome/icons/times.js' -import 'vue-awesome/icons/check.js' -import 'vue-awesome/icons/check-square.js' -import 'vue-awesome/icons/chevron-left.js' -import 'vue-awesome/icons/chevron-right.js' -import 'vue-awesome/icons/check-circle.js' -import 'vue-awesome/icons/star.js' -import 'vue-awesome/icons/flask.js' -import 'vue-awesome/icons/envelope.js' -import 'vue-awesome/icons/user.js' -import 'vue-awesome/icons/user-cog.js' -import 'vue-awesome/icons/university.js' -import 'vue-awesome/icons/users.js' -import 'vue-awesome/icons/user-friends.js' -import 'vue-awesome/icons/fire-alt.js' -import 'vue-awesome/icons/arrow-up.js' -import 'vue-awesome/icons/arrow-down.js' -import 'vue-awesome/icons/arrow-right.js' -import 'vue-awesome/icons/arrow-left.js' -import 'vue-awesome/icons/arrows-alt-v.js' -import 'vue-awesome/icons/info-circle.js' -import 'vue-awesome/icons/circle.js' -import 'vue-awesome/icons/dot-circle.js' -import 'vue-awesome/icons/sync-alt.js' -import 'vue-awesome/icons/book.js' -import 'vue-awesome/icons/file-signature.js' -import 'vue-awesome/icons/file.js' -import 'vue-awesome/icons/hourglass.js' -import 'vue-awesome/icons/hourglass-half.js' -import 'vue-awesome/icons/thumbs-up.js' -import 'vue-awesome/icons/folder.js' -import 'vue-awesome/icons/clock.js' -import 'vue-awesome/icons/folder-open.js' -import 'vue-awesome/icons/minus.js' -import 'vue-awesome/icons/plus.js' -import 'vue-awesome/icons/link.js' -import 'vue-awesome/icons/brands/slack.js' -import 'vue-awesome/icons/brands/github.js' -import 'vue-awesome/icons/brands/orcid.js' -import 'vue-awesome/icons/brands/docker.js' -import 'vue-awesome/icons/brands/twitter.js' -import 'vue-awesome/icons/brands/facebook.js' -import 'vue-awesome/icons/brands/google-plus.js' -import 'vue-awesome/icons/brands/google.js' -import 'vue-awesome/icons/brands/linkedin.js' -import 'vue-awesome/icons/brands/pinterest.js' -import 'vue-awesome/icons/brands/reddit.js' -import 'vue-awesome/icons/brands/skype.js' -import 'vue-awesome/icons/brands/weibo.js' -import 'vue-awesome/icons/regular/file.js' -import 'vue-awesome/icons/regular/calendar-times.js' -import 'vue-awesome/icons/skull-crossbones.js' +import Notifications from 'vue-notification' + +import './icons' import Icon from 'vue-awesome/components/Icon' import VueLazyload from 'vue-lazyload' -import BootstrapVue from 'bootstrap-vue' //bootstrap will eventually replace ElementUI / locale +import BootstrapVue from 'bootstrap-vue' import router from './router.js' import warehouse from './warehouse' import VueTimeago from 'vue-timeago' -//import SocialSharing from 'vue-social-sharing'; +import VueDisqus from 'vue-disqus' + +import toNow from 'date-fns/distance_in_words_to_now' -import VueGtag from 'vue-gtag' +// import SocialSharing from 'vue-social-sharing' +// import VueGtag from 'vue-gtag' import axios from 'axios' import VueAxios from 'vue-axios' -import {parseBibFile} from "bibtex"; +import numeral from 'numeral' +import JWTDecode from 'jwt-decode' Vue.component('v-select', vSelect) Vue.component('icon', Icon) -import VueDisqus from 'vue-disqus'; - -import toNow from 'date-fns/distance_in_words_to_now' - Vue.use(VueDisqus) Vue.use(VueAxios, axios) -Vue.use(Notifications); +Vue.use(Notifications) Vue.use(VueLazyload) -Vue.use(BootstrapVue, { - /*doesn't seem to work - //https://github.com/bootstrap-vue/bootstrap-vue/issues/3169#issuecomment-758212291 - bvToast: { - title: "Alert", - autoHideDelay: 1000, - } - */ -}); +Vue.use(BootstrapVue) -//Vue.use(SocialSharing); +// Vue.use(SocialSharing) Vue.use(VueTimeago, { name: 'timeago', @@ -180,90 +59,70 @@ Vue.use(VueTimeago, { converter: (date, locale, converterOptions) => { const { includeSeconds, addSuffix = true } = converterOptions return toNow(date, { - locale, - includeSeconds, - addSuffix - }).replace("less than a minute ago", "just now") - .replace("in less than a minute", "just now") - .replace("about ", "~"); + locale, + includeSeconds, + addSuffix + }) + .replace('less than a minute ago', 'just now') + .replace('in less than a minute', 'just now') + .replace('about ', '~') } -}); - -/////////////////////////////////////// main ///////////////////////////////////// - -var jwt_decode = require('jwt-decode'); +}) Vue.filter('filesize', function (num) { - // jacked from: https://github.com/sindresorhus/pretty-bytes + // https://github.com/sindresorhus/pretty-bytes if (typeof num !== 'number' || isNaN(num)) { - throw new TypeError('Expected a number'); + throw new TypeError('Expected a number') } - var exponent; - var unit; - var neg = num < 0; - var units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; + const neg = num < 0 + const units = ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'] if (neg) { - num = -num; + num = -num } if (num < 1) { - return (neg ? '-' : '') + num + ' B'; + return (neg ? '-' : '') + num + ' B' } - exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), units.length - 1); - num = (num / Math.pow(1000, exponent)).toFixed(2) * 1; - unit = units[exponent]; + const exponent = Math.min(Math.floor(Math.log(num) / Math.log(1000)), units.length - 1) + const unit = units[exponent] + num = (num / Math.pow(1000, exponent)).toFixed(2) * 1 - return (neg ? '-' : '') + num + ' ' + unit; -}); - -Vue.filter('capitalize', v=>{ - return v.toUpperCase(); -}); + return (neg ? '-' : '') + num + ' ' + unit +}) -const numeral = require('numeral'); -Vue.filter('formatNumber', v=>{ - return numeral(v).format("0,0"); -}); +Vue.filter('capitalize', v => v.toUpperCase()) +Vue.filter('formatNumber', v => numeral(v).format('0,0')) -/////////////////////////////////////////////////////////////////////////////////////////////////// -// -// config -// TODO - find a way to put these somewhere under /config -// +const host = process.env.HOSTNAME || window.location.hostname +const httpProtocol = location.protocol +const wsProtocol = httpProtocol === 'https:' ? 'wss:' : 'ws:' +const apiHost = `${httpProtocol}//${host}` +const wsHost = `${wsProtocol}//${host}` +const soundUri = 'https://raw.githubusercontent.com/brainlife/warehouse/master/ui/sounds/' -let wsproto = (location.protocol == "https:") ? "wss:" : "ws:"; +Vue.config.debug = false -let apihost = location.protocol+"//"+window.location.hostname; -let apihost_ws = wsproto+"//"+window.location.hostname; +Vue.config.api = `${apiHost}/api/warehouse` +Vue.config.amaretti_api = `${apiHost}/api/amaretti` +Vue.config.auth_api = `${apiHost}/api/auth` +Vue.config.event_api = `${apiHost}/api/event` +Vue.config.event_ws = `${wsHost}/api/event` -//override api hostname (from config/*.env.js) -if (process.env.HOSTNAME) { - apihost = location.protocol+"//"+process.env.HOSTNAME; - apihost_ws = wsproto+"//"+process.env.HOSTNAME; -} +Vue.config.auth_signin = '/auth/#!/signin' +Vue.config.auth_signout = '/auth/#!/signout' +Vue.config.auth_signup = '/auth/#!/signup' +Vue.config.ezbids_api = `${apiHost}/api/ezbids` +Vue.config.debug_doi = '10.25663/bl.p.3' // o3d publication -Vue.config.debug = false; -Vue.config.api = apihost+"/api/warehouse"; -Vue.config.wf_api = apihost+"/api/amaretti"; //deprecated by amaretti_api -Vue.config.amaretti_api = apihost+"/api/amaretti"; -Vue.config.auth_api = apihost+"/api/auth"; -Vue.config.event_api = apihost+"/api/event"; -Vue.config.event_ws = apihost_ws+"/api/event"; -Vue.config.auth_signin = "/auth/#!/signin"; -Vue.config.auth_signout = "/auth/#!/signout"; -Vue.config.auth_signup = "/auth/#!/signup"; -Vue.config.ezbids_api = apihost+"/api/ezbids"; -Vue.config.productionTip = false; -Vue.config.debug_doi = "10.25663/bl.p.3"; //o3d publication Vue.config.plotly = { font: { font: 'Arial,sans-serif,Apple Color Emoji,Segoe UI Emoji', size: 11, }, -}; +} Vue.config.hasRole = function (role, service = 'warehouse') { return ( @@ -274,32 +133,13 @@ Vue.config.hasRole = function (role, service = 'warehouse') { } Vue.config.isSu = function () { - return !!localStorage.getItem('su-jwt'); + return !!localStorage.getItem('su-jwt') } -axios.defaults.baseURL = Vue.config.api; //default root for $http - -/* -console.log("ENV", process.env.NODE_ENV); -if (process.env.NODE_ENV == "development") { - Vue.config.debug = true; - - //do crosssite auth between localhost and dev1 auth - Vue.config.auth_signin = "//"+process.env.HOSTNAME+"/auth#!/signin?app=dev"; - Vue.config.auth_signout = "//"+process.env.HOSTNAME+"/auth#!/signout?app=dev"; - Vue.config.ezbids_api = "//"+process.env.HOSTNAME+"/api/ezbids"; - - //intercept jwt sent via url parameter - var urlParams = new URLSearchParams(window.location.search); - if(urlParams.has('jwt')) { - localStorage.setItem("jwt", urlParams.get('jwt')); - window.location.search = ""; - } -} -*/ +axios.defaults.baseURL = Vue.config.api -function jwt_decode_brainlife(jwt) { - Vue.config.user = jwt_decode(jwt) +function setUpJWT (jwt) { + Vue.config.user = JWTDecode(jwt) Vue.config.jwt = jwt Vue.config.user.sub = `${Vue.config.user.sub}` @@ -308,178 +148,179 @@ function jwt_decode_brainlife(jwt) { Vue.config.jwt = localStorage.getItem('jwt') if (Vue.config.jwt) { - jwt_decode_brainlife(Vue.config.jwt) + setUpJWT(Vue.config.jwt) } router.beforeEach(function (to, from, next) { - if (to.matched.length == 0) { - console.log("no match for router"); - document.location = "/404"; - return; + if (to.matched.length === 0) { + document.location = '/404' + return } + if (!to.meta) to.meta = {} + // redirect to auth unless route is public - if (!to.meta) to.meta = {}; if (!to.meta.public && !Vue.config.jwt) { - console.log("authentication required", document.location.href); - if(!Vue.config.debug) { - sessionStorage.setItem('auth_redirect', document.location.href); - document.location = Vue.config.auth_signin; + if (!Vue.config.debug) { + sessionStorage.setItem('auth_redirect', document.location.href) + document.location = Vue.config.auth_signin } - return; + return } - window.scrollTo(0, 0); //scroll to top on route update (sensible default.. or bad practice?) - next(); -}); + // scroll to the top of the page + window.scrollTo(0, 0) + next() +}) -/* //disabled due to GDRP -Vue.use(VueGtag, { +// disabled due to GDRP +/* +Vue.use(VueGtag, { appName: "brainlife.io", - config: { + config: { id: process.env.GTAG, - } + } }, router) */ -const soundHost = "https://raw.githubusercontent.com/brainlife/warehouse/master/ui/sounds/"; - -new Vue({ +export const app = new Vue({ el: '#app', router, template: ``, - data() { + data () { return { ready: false, - //things we can access via $root + // things we can access via $root sidemenuWide: true, rightviewOpen: null, - ezbidsSession: null, //set this to ezbids {sessionId} to open ezbidssession dialog on modal load + // ezbids sessionId, to open ezbidssession dialog on modal load + ezbidsSession: null, notificationSounds: {}, } }, components: { warehouse }, - mounted() { - let wide = localStorage.getItem("sidemenuWide"); - if(wide) this.sidemenuWide = (wide === "1"); + async mounted () { + let wide = localStorage.getItem('sidemenuWide') + if (wide) this.sidemenuWide = (wide === '1') - let ro = localStorage.getItem("rightviewOpen"); - if(ro) { - this.rightviewOpen = JSON.parse(ro); + let ro = localStorage.getItem('rightviewOpen') + if (ro) { + this.rightviewOpen = JSON.parse(ro) } else { - //open doc for new users - if(Vue.config.jwt) this.rightviewOpen = "doc"; + // open doc for new users + if (Vue.config.jwt) this.rightviewOpen = 'doc' } - //allow child component to refresh jwt - //project/submit (adding project requires jwt scope change for ac) - this.$on("refresh_jwt", this.refresh_jwt); + // allow child component to refresh jwt + // project/submit (adding project requires jwt scope change for ac) + this.$on('refresh_jwt', this.refresh_jwt) - if(!Vue.config.jwt) { - //for guest - this.ready = true; + if (!Vue.config.jwt) { + this.ready = true } else { - //for authenticated user - this.ensure_myproject(); - this.load_profile(); - - //refresh jwt on page refresh (and to get new jwt after creating new project) - this.refresh_jwt(err=>{ - this.$root.$emit("jwt_refreshed"); - this.ready = true; - }); - - //refresh in half an hour - setInterval(()=>{ - this.$root.$emit("refresh_jwt"); - }, 1000*1800); + // for authenticated user + this.ensure_myproject() + this.load_profile() + + // refresh jwt on page refresh + await this.refresh_jwt() + + this.$root.$emit('jwt_refreshed') + this.ready = true + + // refresh in 30 minutes + setInterval(() => { + this.$root.$emit('refresh_jwt') + }, 1000 * 60 * 30) } }, methods: { - toggleSideMenu() { - this.sidemenuWide = !this.sidemenuWide; - localStorage.setItem("sidemenuWide", this.sidemenuWide?"1":"0"); + toggleSideMenu () { + this.sidemenuWide = !this.sidemenuWide + localStorage.setItem('sidemenuWide', this.sidemenuWide ? '1' : '0') }, - toggleRightView(page) { - this.rightviewOpen = page; - localStorage.setItem("rightviewOpen", JSON.stringify(page)); + toggleRightView (page) { + this.rightviewOpen = page + localStorage.setItem('rightviewOpen', JSON.stringify(page)) }, - async ensure_myproject() { - if(!Vue.config.jwt) return; + async ensure_myproject () { + if (!Vue.config.jwt) return + + // TODO create project in API - //make sure user has create at least 1 project + // make sure user has create at least 1 project const res = await this.$http.get('project', {params: { find: { user_id: Vue.config.user.sub }, - limit: 1, //I just need count (0 means all) - }}); - if(res.data.projects.length) return; + limit: 1, // I just need count (0 means all) + }}) + if (res.data.projects.length) return - console.debug("let's create a default project"); await this.$http.post('project', { - name: "My Default Project", - desc: "Please use this project for testing purpose. You can update this project, or create new projects", - access: "private", + name: 'My Default Project', + desc: 'Please use this project for testing purpose. You can update this project, or create new projects', + access: 'private', admins: [Vue.config.user.sub], members: [], agreements: [], - }); - console.log("done creating default project") + }) - //we don't have good way of invalidating all projects loaded by the time we finish creating project. - //we need to reload page.. - location.reload(); + // we don't have good way of invalidating all projects loaded by the time we finish creating project. + // we need to reload page.. + location.reload() }, - async refresh_jwt(cb) { - if(!Vue.config.jwt) return; + async refresh_jwt (cb) { + if (!Vue.config.jwt) return if (Vue.config.isSu()) { - const jwt = localStorage.getItem('su-jwt'); + const jwt = localStorage.getItem('su-jwt') try { const res = await this.$http.post( `${Vue.config.auth_api}/refresh`, {}, { headers: { Authorization: `Bearer ${jwt}` } } - ); - localStorage.setItem('su-jwt', res.data.jwt); + ) + localStorage.setItem('su-jwt', res.data.jwt) } catch (error) { - localStorage.removeItem('su-jwt'); + localStorage.removeItem('su-jwt') } } try { const res = await this.$http.post(`${Vue.config.auth_api}/refresh`) - jwt_decode_brainlife(res.data.jwt); - localStorage.setItem('jwt', res.data.jwt); - if(cb) cb(); + setUpJWT(res.data.jwt) + localStorage.setItem('jwt', res.data.jwt) + if (cb) cb() } catch (error) { - sessionStorage.setItem('auth_redirect', document.location.href); - document.location = Vue.config.auth_signin; - if(cb) cb(error); + sessionStorage.setItem('auth_redirect', document.location.href) + document.location = Vue.config.auth_signin + if (cb) cb(error) } }, - load_profile() { - if(!Vue.config.jwt) return; - this.$http.get(Vue.config.auth_api+"/profile").then(res=>{ - Vue.config.profile = res.data.profile; - //this.load_notification_sounds(Vue.config.profile.private.notification.process_sound); - }).catch(console.error); + async load_profile () { + if (!Vue.config.jwt) return + try { + const res = await this.$http.get(`${Vue.config.auth_api}/profile`) + Vue.config.profile = res.data.profile + } catch (error) { + } }, - playNotification(name, theme) { - if(!theme && Vue.config.profile.private.notification) { - theme = Vue.config.profile.private.notification.process_sound; + playNotification (name, theme) { + if (!theme && Vue.config.profile.private.notification) { + theme = Vue.config.profile.private.notification.process_sound } - if(!theme) return; - new Audio(soundHost+theme+"/"+name+".mp3").play(); + if (!theme) return + + new Audio(soundUri + theme + '/' + name + '.mp3').play() }, }, }) diff --git a/ui/src/mixins/wait.js b/ui/src/mixins/wait.js index 5e083a2b..f6500c07 100644 --- a/ui/src/mixins/wait.js +++ b/ui/src/mixins/wait.js @@ -26,7 +26,7 @@ export default { this.ws = new ReconnectingWebSocket(url, null, {/*debug: Vue.config.debug,*/ reconnectInterval: 3000}); this.ws.onopen = (e)=>{ //loading the task for the first time - this.$http.get(Vue.config.wf_api+'/task', {params: { + this.$http.get(Vue.config.amaretti_api+'/task', {params: { find: JSON.stringify({ _id: taskid, }) }}).then(res=>{ this.task = res.data.tasks[0]; @@ -79,7 +79,7 @@ export default { break; case 'removed': console.debug("rerunning"); - this.$http.put(Vue.config.wf_api+'/task/rerun/'+this.taskid).then(res => { + this.$http.put(Vue.config.amaretti_api+'/task/rerun/'+this.taskid).then(res => { console.log("rerunning task"); //setTimeout(()=>{this.wait(taskid, cb)}, 1000); }); diff --git a/ui/src/modals/appsubmit.vue b/ui/src/modals/appsubmit.vue index 5a82a7c5..972b4a56 100644 --- a/ui/src/modals/appsubmit.vue +++ b/ui/src/modals/appsubmit.vue @@ -436,7 +436,7 @@ export default { if(err) return reject(err); //create an instance to run everything - this.$http.post(Vue.config.wf_api+'/instance', { + this.$http.post(Vue.config.amaretti_api+'/instance', { group_id: this.project.group_id, desc: this.form.desc||this.app.name, config: { diff --git a/ui/src/modals/copytarget.vue b/ui/src/modals/copytarget.vue index c482e826..0ad457ed 100644 --- a/ui/src/modals/copytarget.vue +++ b/ui/src/modals/copytarget.vue @@ -56,7 +56,7 @@ export default { console.error("can't find", this.project, "in project list", this.projects); return; } - this.$http.get(Vue.config.wf_api+'/instance', {params: { + this.$http.get(Vue.config.amaretti_api+'/instance', {params: { find: JSON.stringify({ "config.brainlife": true, status: {$ne: "removed"}, diff --git a/ui/src/modals/ezbidsimporter.vue b/ui/src/modals/ezbidsimporter.vue index d29b6954..ccc245f9 100644 --- a/ui/src/modals/ezbidsimporter.vue +++ b/ui/src/modals/ezbidsimporter.vue @@ -238,7 +238,7 @@ export default { }, cancelImport() { - this.$http.put(Vue.config.wf_api+'/task/stop/'+this.task._id) + this.$http.put(Vue.config.amaretti_api+'/task/stop/'+this.task._id) .then(res=>{ this.$notify({ text: res.data.message, type: 'success'}); this.close(); diff --git a/ui/src/modals/instanceselecter.vue b/ui/src/modals/instanceselecter.vue index 4b754d0d..5ab9b8ee 100644 --- a/ui/src/modals/instanceselecter.vue +++ b/ui/src/modals/instanceselecter.vue @@ -128,7 +128,7 @@ export default { console.error("can't find", this.project, "in project list", this.projects); return reject(); } - this.$http.get(Vue.config.wf_api+'/instance', {params: { + this.$http.get(Vue.config.amaretti_api+'/instance', {params: { find: JSON.stringify({ "config.brainlife": true, status: {$ne: "removed"}, diff --git a/ui/src/modals/viewselecter.vue b/ui/src/modals/viewselecter.vue index 03d0140d..854024d5 100644 --- a/ui/src/modals/viewselecter.vue +++ b/ui/src/modals/viewselecter.vue @@ -1,29 +1,25 @@ - diff --git a/ui/src/router.js b/ui/src/router.js index ebe793f0..35444ceb 100644 --- a/ui/src/router.js +++ b/ui/src/router.js @@ -82,5 +82,7 @@ export default new Router({ { path: '/pubs', component: pubs, meta: { public: true, sidemenu: 'pub' } }, { path: '/pub/:id', component: pub, meta: { public: true, sidemenu: 'pub' } }, + + { path: '/slack', redirect: 'https://join.slack.com/t/brainlife/shared_invite/zt-1now1p07p-rf6vvvcp6Aiu8XhO1om8aA' } ] }) From ad4ca2fbb73e2644b3b894936f17400286e56100 Mon Sep 17 00:00:00 2001 From: Anibal Date: Tue, 24 Jan 2023 16:29:51 -0600 Subject: [PATCH 09/56] fix: set the correct limit for the api call --- ui/src/modals/downscript.vue | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/ui/src/modals/downscript.vue b/ui/src/modals/downscript.vue index b0e2a81c..afca552b 100644 --- a/ui/src/modals/downscript.vue +++ b/ui/src/modals/downscript.vue @@ -128,8 +128,10 @@ export default { }, downscript() { - let headers = "-H 'Content-Type: application/json' -H 'Authorization: Bearer "+this.jwt+"'"; - return `curl ${headers} -d '${JSON.stringify({find: this.query})}' -X POST "${Vue.config.api}/dataset/downscript?limit=0" | bash` + const headers = "-H 'Content-Type: application/json' -H 'Authorization: Bearer " + this.jwt + "'"; + const query = JSON.stringify({limit: this.query._id.length, find: this.query}); + + return `curl ${headers} -d '${query}' -X POST "${Vue.config.api}/dataset/downscript" | bash`; }, }, From 0b0c56ff83cc85ac20126c7bee2aa10821cf809a Mon Sep 17 00:00:00 2001 From: Anibal Date: Tue, 24 Jan 2023 17:22:36 -0600 Subject: [PATCH 10/56] enh: slack redirection --- ui/src/router.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/router.js b/ui/src/router.js index 35444ceb..8c66664d 100644 --- a/ui/src/router.js +++ b/ui/src/router.js @@ -83,6 +83,6 @@ export default new Router({ { path: '/pubs', component: pubs, meta: { public: true, sidemenu: 'pub' } }, { path: '/pub/:id', component: pub, meta: { public: true, sidemenu: 'pub' } }, - { path: '/slack', redirect: 'https://join.slack.com/t/brainlife/shared_invite/zt-1now1p07p-rf6vvvcp6Aiu8XhO1om8aA' } + { path: '/slack', beforeEnter: () => { window.location.href = 'https://join.slack.com/t/brainlife/shared_invite/zt-1now1p07p-rf6vvvcp6Aiu8XhO1om8aA' }}, ] }) From 2e528a71786b594aae00c4822c52990f5f640ba7 Mon Sep 17 00:00:00 2001 From: Anibal Date: Thu, 16 Feb 2023 12:13:15 -0600 Subject: [PATCH 11/56] fix: dont execute when query is set --- ui/src/modals/downscript.vue | 3 +++ 1 file changed, 3 insertions(+) diff --git a/ui/src/modals/downscript.vue b/ui/src/modals/downscript.vue index afca552b..9fc62630 100644 --- a/ui/src/modals/downscript.vue +++ b/ui/src/modals/downscript.vue @@ -128,6 +128,9 @@ export default { }, downscript() { + if (!this.query._id) { + return; + } const headers = "-H 'Content-Type: application/json' -H 'Authorization: Bearer " + this.jwt + "'"; const query = JSON.stringify({limit: this.query._id.length, find: this.query}); From 5cb07edede66dd36b4b4062b101c3723b24d2438 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:37:45 -0500 Subject: [PATCH 12/56] Add github action to codespell master on push and PRs --- .github/workflows/codespell.yml | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 .github/workflows/codespell.yml diff --git a/.github/workflows/codespell.yml b/.github/workflows/codespell.yml new file mode 100644 index 00000000..5768d7c6 --- /dev/null +++ b/.github/workflows/codespell.yml @@ -0,0 +1,19 @@ +--- +name: Codespell + +on: + push: + branches: [master] + pull_request: + branches: [master] + +jobs: + codespell: + name: Check for spelling errors + runs-on: ubuntu-latest + + steps: + - name: Checkout + uses: actions/checkout@v3 + - name: Codespell + uses: codespell-project/actions-codespell@v1 From ae3d62b5dba29d5b18ca61d3565577f5420e22dd Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:37:45 -0500 Subject: [PATCH 13/56] Add rudimentary .codespellrc --- .codespellrc | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .codespellrc diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 00000000..7b266b10 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,3 @@ +[codespell] +skip = .git,*.pdf,*.svg,package-lock.json +# ignore-words-list = From 9e145a2eeab7664fa9e507f0af0dcc240de6a426 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:38:20 -0500 Subject: [PATCH 14/56] copied codespellrc from amareti --- .codespellrc | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.codespellrc b/.codespellrc index 7b266b10..b2144722 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,3 +1,4 @@ [codespell] -skip = .git,*.pdf,*.svg,package-lock.json -# ignore-words-list = +skip = .git,*.pdf,*.svg,package-lock.json,*.min.js,vendor,.sass-cache,locales,ui-text.yml +# hsi - server name +ignore-words-list = keypair,nd,nin,hsi From cca469f6d88432771e8516f3028e66b9dc69f51a Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:42:04 -0500 Subject: [PATCH 15/56] some more ignores etc --- .codespellrc | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.codespellrc b/.codespellrc index b2144722..cd8faf79 100644 --- a/.codespellrc +++ b/.codespellrc @@ -1,4 +1,8 @@ [codespell] skip = .git,*.pdf,*.svg,package-lock.json,*.min.js,vendor,.sass-cache,locales,ui-text.yml # hsi - server name -ignore-words-list = keypair,nd,nin,hsi +# crate - seems some real thing in the API +# deactive - someone could later change to deactivated or inactive +# onTop - variable name used, not picked up by codespell to be ignored +# pres - variable name used +ignore-words-list = keypair,nd,nin,hsi,crate,deactive,ontop,pres,doubleclick From f15ef9c84944f3463f58252dc2e1acb7ba809820 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:52:25 -0500 Subject: [PATCH 16/56] resolved ambigous typos using codespell -i 3 --- api/controllers/secondary.js | 2 +- api/models.js | 2 +- bin/appinfo.js | 2 +- bin/migrations/abide2.js | 2 +- bin/migrations/js2wrangler.js | 2 +- bin/rule_handler.js | 2 +- ui/semantic/tasks/admin/components/init.js | 4 ++-- ui/semantic/tasks/admin/distributions/init.js | 4 ++-- ui/src/dataset.vue | 2 +- ui/src/modals/downscript.vue | 2 +- ui/src/modals/rule.vue | 2 +- 11 files changed, 13 insertions(+), 13 deletions(-) diff --git a/api/controllers/secondary.js b/api/controllers/secondary.js index 662fa459..b587aad1 100644 --- a/api/controllers/secondary.js +++ b/api/controllers/secondary.js @@ -231,7 +231,7 @@ router.post('/launchga', common.jwt(), (req, res, next)=>{ let _config = Object.assign({}, req.body.config); _config.project = { _id: project._id, - name: project.name, //galauncher juse need _id, but just in case it might become handy.. + name: project.name, //galauncher just need _id, but just in case it might become handy.. } _config.group = instance.group_id; diff --git a/api/models.js b/api/models.js index d51370ed..cd7662e2 100644 --- a/api/models.js +++ b/api/models.js @@ -555,7 +555,7 @@ datasetSchema.pre('save', function(next) { datasetSchema.index({project: 1, 'prov.task.instance_id': 1, removed: 1, 'meta.subject': 1, 'meta.session': 1, create_date: -1}); //is this deprecated by project/remove/subject/session/-create_ate? //datasetSchema.index({project: 1, removed: 1, "meta.subject": 1, "meta.session": 1, "create_date": -1}); //for dataset search by the archive view datasetSchema.index({project: 1, datatype: 1, removed: 1, status: 1, "meta.subject": 1, "meta.session": 1, create_date: -1}); -datasetSchema.index({project: 1, update_date: 1, removed: 1}); //rule to query the lastest dataset touched +datasetSchema.index({project: 1, update_date: 1, removed: 1}); //rule to query the latest dataset touched datasetSchema.index({project: 1, update_date: -1, removed: 1}); //rule handler to find the last dataset update date for each project datasetSchema.index({'prov.task_id': 1, 'prov.output_id': 1, removed: 1, status: 1}); //for event_handler datasetSchema.index({datatype: 1, removed: 1}); //for searching projects that provides distinct datatypes diff --git a/bin/appinfo.js b/bin/appinfo.js index 46a922e8..3d567d86 100755 --- a/bin/appinfo.js +++ b/bin/appinfo.js @@ -182,7 +182,7 @@ function handle_app(app, cb) { }).catch(err=>{ console.error(err.message); console.error(err.status); - //what if we have temporarly glitch on doi.org? this is too dangerous + //what if we have temporary glitch on doi.org? this is too dangerous //TODO - I should set the *last* date that doi worked, and if it's been too long, then we should reset it (or notify us to manually reset it) //app.doi = undefined next(); diff --git a/bin/migrations/abide2.js b/bin/migrations/abide2.js index 46db40d2..b1f70f47 100755 --- a/bin/migrations/abide2.js +++ b/bin/migrations/abide2.js @@ -90,7 +90,7 @@ function run(cb) { if(err) throw err; if(~filename.indexOf(".tar.gz")) { - //console.log(".tar.gz (old) dataset shouldbe un-zipped.. skipping"); + //console.log(".tar.gz (old) dataset should be un-zipped.. skipping"); //return next_dataset(); console.log("piping through gunzip"); read.pipe(gunzip.createGunzip()).pipe(write); diff --git a/bin/migrations/js2wrangler.js b/bin/migrations/js2wrangler.js index 717d7dd3..64abe0f2 100755 --- a/bin/migrations/js2wrangler.js +++ b/bin/migrations/js2wrangler.js @@ -54,7 +54,7 @@ function run(cb) { if(err) throw err; if(~filename.indexOf(".tar.gz")) { - //console.log(".tar.gz (old) dataset shouldbe un-zipped.. skipping"); + //console.log(".tar.gz (old) dataset should be un-zipped.. skipping"); //return next_dataset(); console.log("piping through gunzip"); read.pipe(gunzip.createGunzip()).pipe(write); diff --git a/bin/rule_handler.js b/bin/rule_handler.js index 0728a1ff..17ed0f09 100755 --- a/bin/rule_handler.js +++ b/bin/rule_handler.js @@ -164,7 +164,7 @@ function handle_rule(rule, cb) { const counts = { waiting: 0, //waiting for inputs running: 0, //running jobs to produce the output ("submitted" is a better name?) - archived: 0, //outpus already archived + archived: 0, //output already archived }; //prepare for stage / app / archive diff --git a/ui/semantic/tasks/admin/components/init.js b/ui/semantic/tasks/admin/components/init.js index 7f836d37..6927d7f6 100644 --- a/ui/semantic/tasks/admin/components/init.js +++ b/ui/semantic/tasks/admin/components/init.js @@ -6,8 +6,8 @@ This task pulls the latest version of each component from GitHub - * Creates new repo if doesnt exist (locally & GitHub) - * Adds remote it doesnt exists + * Creates new repo if does not exist (locally & GitHub) + * Adds remote it does not exists * Pulls latest changes from repo */ diff --git a/ui/semantic/tasks/admin/distributions/init.js b/ui/semantic/tasks/admin/distributions/init.js index 8ed75a0c..93810ed9 100644 --- a/ui/semantic/tasks/admin/distributions/init.js +++ b/ui/semantic/tasks/admin/distributions/init.js @@ -6,8 +6,8 @@ This task pulls the latest version of distribution from GitHub - * Creates new repo if doesnt exist (locally & GitHub) - * Adds remote it doesnt exists + * Creates new repo if does not exist (locally & GitHub) + * Adds remote it does not exists * Pulls latest changes from repo */ diff --git a/ui/src/dataset.vue b/ui/src/dataset.vue index 20ede413..5a24063d 100644 --- a/ui/src/dataset.vue +++ b/ui/src/dataset.vue @@ -140,7 +140,7 @@ export default { } } - //load te dataset detail + //load the dataset detail this.$http('datalad/datasets', {params: { find: JSON.stringify({ removed: false, diff --git a/ui/src/modals/downscript.vue b/ui/src/modals/downscript.vue index 9fc62630..6543e3c5 100644 --- a/ui/src/modals/downscript.vue +++ b/ui/src/modals/downscript.vue @@ -72,7 +72,7 @@
- This command includes your temporarly JWT token. Please do not share. + This command includes your temporary JWT token. Please do not share.
diff --git a/ui/src/modals/rule.vue b/ui/src/modals/rule.vue index 21b6f6c3..91ed4c5d 100644 --- a/ui/src/modals/rule.vue +++ b/ui/src/modals/rule.vue @@ -268,7 +268,7 @@ export default { this.tab = 0; this.resetIOConfig(); - //overwrite with user provied default + //overwrite with user provided default Object.assign(this.rule, { name: "", app: null, From d94f4c37f6a43e6f2f98bed9d895e2e6ec0b3c16 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:54:19 -0500 Subject: [PATCH 17/56] Fix throughout using codespell -w --- api/common.js | 8 +++---- api/controllers/app.js | 4 ++-- api/controllers/dataset.js | 6 ++--- api/controllers/secondary.js | 2 +- api/lib/provenance.js | 4 ++-- api/models.js | 4 ++-- bin/event_handler.js | 6 ++--- bin/rule_handler.js | 2 +- docs/apidoc/api_project.js | 2 +- docs/apidoc/api_project.json | 2 +- docs/apidoc/main.js | 4 ++-- ui/build/webpack.prod.conf.js | 2 +- ui/semantic/src/definitions/behaviors/api.js | 6 ++--- ui/semantic/src/definitions/modules/dimmer.js | 2 +- ui/semantic/src/definitions/modules/sticky.js | 2 +- ui/semantic/tasks/docs/serve.js | 2 +- ui/semantic/tasks/rtl/watch.js | 2 +- ui/src/admin.vue | 2 +- ui/src/app.vue | 2 +- ui/src/appedit.vue | 2 +- ui/src/assets/noprocess.vue | 2 +- ui/src/components/admin/groups.vue | 2 +- ui/src/components/agreements.vue | 2 +- ui/src/components/app.vue | 2 +- ui/src/components/datasets.vue | 4 ++-- ui/src/components/projectselecter.vue | 2 +- ui/src/components/release.vue | 2 +- ui/src/components/select2.vue | 2 +- ui/src/components/settings/profile.vue | 2 +- ui/src/components/task.vue | 2 +- ui/src/components/trueorfalse.vue | 2 +- ui/src/dataset.vue | 2 +- ui/src/datasets.vue | 2 +- ui/src/datauis/nifti.vue | 2 +- ui/src/lib.js | 2 +- ui/src/mixins/datatypecache.js | 2 +- ui/src/mixins/wait.js | 2 +- ui/src/modals/appsubmit.vue | 6 ++--- ui/src/modals/archiver.vue | 2 +- ui/src/modals/dataladimporter.vue | 2 +- ui/src/modals/dataset.vue | 4 ++-- ui/src/modals/newtask.vue | 2 +- ui/src/modals/rule.vue | 2 +- ui/src/modals/taskinfo.vue | 4 ++-- ui/src/project.vue | 2 +- ui/src/projectedit.vue | 6 ++--- ui/src/resource.vue | 2 +- ui/src/secondary/parcstats.vue | 4 ++-- ui/src/secondary/tractmeasures.vue | 2 +- ui/theme/autocomplete.css | 2 +- ui/theme/cascader.css | 2 +- ui/theme/date-picker.css | 2 +- ui/theme/index.css | 22 +++++++++---------- ui/theme/input-number.css | 2 +- ui/theme/input.css | 2 +- ui/theme/message-box.css | 2 +- ui/theme/pagination.css | 2 +- ui/theme/select.css | 2 +- ui/theme/slider.css | 2 +- ui/theme/time-picker.css | 2 +- ui/theme/transfer.css | 2 +- 61 files changed, 92 insertions(+), 92 deletions(-) diff --git a/api/common.js b/api/common.js index 4f7a0a93..00a3affd 100644 --- a/api/common.js +++ b/api/common.js @@ -29,7 +29,7 @@ exports.getprojects = function(user, cb) { //everyone has read access to public project let project_query = {access: "public"}; - //logged in user may have acess to more projects + //logged in user may have access to more projects project_query = { $or: [ project_query, @@ -204,7 +204,7 @@ exports.issue_archiver_jwt = async function(user_id) { ///add warehouse group that allows user to submit gids = gids.concat(config.archive.gid); - //issue user token with added gids priviledge + //issue user token with added gids privilege let {jwt: user_jwt} = await rp.get({ url: config.auth.api+"/jwt/"+user_id, json: true, @@ -858,7 +858,7 @@ exports.split_product = function(task_product, outputs) { return products; } -//TODO - this has to match up between amaretti/bin/metrics and warehouse/api/controller querying for graphite daa +//TODO - this has to match up between amaretti/bin/metrics and warehouse/api/controller querying for graphite data exports.sensu_name = function(name) { name = name.toLowerCase(); name = name.replace(/[_.@$#\/]/g, "-"); @@ -1476,7 +1476,7 @@ exports.enumXnatObjects = async (project)=>{ "/subjects/"+oSubject.ID+ "/experiments", {auth}); for(const oExperiment of exres.data.ResultSet.Result) { - console.log(" experiement", oExperiment.ID); + console.log(" experiment", oExperiment.ID); //console.log(" "); /* oExperiment { diff --git a/api/controllers/app.js b/api/controllers/app.js index a2796d18..22f43735 100644 --- a/api/controllers/app.js +++ b/api/controllers/app.js @@ -51,7 +51,7 @@ router.get('/', common.jwt({credentialsRequired: false}), (req, res, next)=>{ {projects: []}, //if projects is empty array, it's available to everyone //for backward compatibility - {projects: null}, //if projects is set to null, it's avalable to everyoone + {projects: null}, //if projects is set to null, it's available to everyoone {projects: {$exists: false}}, //if projects not set, it's availableo to everyone ]}); @@ -102,7 +102,7 @@ router.get('/query', common.jwt({credentialsRequired: false}), (req, res, next)= {projects: []}, //if projects is empty array, it's available to everyone //for backward compatibility - {projects: null}, //if projects is set to null, it's avalable to everyoone + {projects: null}, //if projects is set to null, it's available to everyoone {projects: {$exists: false}}, //if projects not set, it's availableo to everyone ] }) diff --git a/api/controllers/dataset.js b/api/controllers/dataset.js index f31918ad..5abd4d8a 100644 --- a/api/controllers/dataset.js +++ b/api/controllers/dataset.js @@ -353,7 +353,7 @@ router.get('/provscript/:id', async (req, res, next)=>{ replace_path(node._config); }); - //output scrips + //output scripts while(nodes.length) { let node = nodes.pop(); if(!node.label) continue; //"This Dataset" doesn't have label, and we don't need it (TODO make output link?) @@ -533,7 +533,7 @@ This boutique descriptor that can be used to run the workflow used to generate t app_config[k] = vkey; if(unwrap) app_config[k] = "__unwrap__"+vkey; - //convert default value to string - boutique invocation value needs to be string accordint to tristan + //convert default value to string - boutique invocation value needs to be string according to tristan let def = app.config[k].default; if(def === null) def = "null"; if(def.toString) def = def.toString(); @@ -1638,7 +1638,7 @@ ${p.desc}`; script+=` echo -echo "All requested objects succesfully downloaded!!" +echo "All requested objects successfully downloaded!!" echo echo "---------------------------------------------------------------------------------" echo "---------------------------------------------------------------------------------" diff --git a/api/controllers/secondary.js b/api/controllers/secondary.js index b587aad1..02dc7d69 100644 --- a/api/controllers/secondary.js +++ b/api/controllers/secondary.js @@ -222,7 +222,7 @@ async function issueGAJwt(instance_id, user, authorization, cb) { router.post('/launchga', common.jwt(), (req, res, next)=>{ if(!req.body.instance_id) return next("instance_id is not set"); if(!req.body.config) return next("please set config"); - if(!req.body.config.container) return next("please set contianer (with tag)"); + if(!req.body.config.container) return next("please set container (with tag)"); issueGAJwt(req.body.instance_id, req.user, req.headers.authorization, async (err, jwt, instance, project)=>{ diff --git a/api/lib/provenance.js b/api/lib/provenance.js index f1d3e999..0956277a 100644 --- a/api/lib/provenance.js +++ b/api/lib/provenance.js @@ -200,7 +200,7 @@ exports.traverseProvenance = async (startTaskId) => { const dirTokens = datasetConfig.dir.split("/"); const sourceTask = dirTokens[1]; //original task that produed the output - const subdir = dirTokens[2]; //original task's subdir that contains this ouput + const subdir = dirTokens[2]; //original task's subdir that contains this output //figure out input task/subdir (../60874c557f09362173e40866/bold_mask) let id = datasetConfig.dataset_id; @@ -256,7 +256,7 @@ exports.traverseProvenance = async (startTaskId) => { //outdir will be set to indicate the copy dataset id which we want datasetId = datasetConfig.outdir; - //let's go ahead and register source dataset now in case datset.prov might be missing + //let's go ahead and register source dataset now in case dataset.prov might be missing //and we can't setup app-stage node for it const source = await db.Datasets.findById(datasetConfig.id).lean(); registerDataset(source); diff --git a/api/models.js b/api/models.js index cd7662e2..72afa308 100644 --- a/api/models.js +++ b/api/models.js @@ -94,7 +94,7 @@ var projectSchema = mongoose.Schema({ resources: [{ resource_id: String, //amaretti resource_id - //for quick referncing the resource detail + //for quick referencing the resource detail name: String, //becomes too big @@ -737,7 +737,7 @@ var ruleSchema = mongoose.Schema({ //any tags to look for each input id (object with key(output id)=>array(tags)) input_tags: mongoose.Schema.Types.Mixed, - //count of object that should match for each intput id for the rule to be submitted + //count of object that should match for each input id for the rule to be submitted input_multicount: mongoose.Schema.Types.Mixed, //if user wants to override where the input data comes from, specify projects IDs keyed by input id diff --git a/bin/event_handler.js b/bin/event_handler.js index b314a73c..0b7f6d27 100755 --- a/bin/event_handler.js +++ b/bin/event_handler.js @@ -246,7 +246,7 @@ function handle_task(task, cb) { //handle event async.series([ //load task product for finished task - //TODO - can we gurantee that the amaretti/task/product is loaded by the time we received this event? + //TODO - can we guarantee that the amaretti/task/product is loaded by the time we received this event? next=>{ if(task.status != "finished") return next(); //console.log("loading product for ", task._id, task.name); @@ -273,7 +273,7 @@ function handle_task(task, cb) { //because UI needs the validator already submitted before next job can be submitted //to create pipe between App1 > validator > App2. //let's do this for UI tasks only (task.nice is set) otherwise task queue will pile up - //with events for requrested tasks + //with events for requested tasks if(!task.nice && task.status != "finished") return next(); @@ -513,7 +513,7 @@ function handle_task(task, cb) { request.validator = true; //used to let UI know that this was output from validator } else { - //group analysys output is more straightfoward + //group analysys output is more straightforward //TODO - for legacy root-output apps, we shouldn't set subdir (and need to apply override?) //or.. do I say secondary output won't work with legacy app anymore? subdirs.push(output.id); diff --git a/bin/rule_handler.js b/bin/rule_handler.js index 17ed0f09..48b1bf44 100755 --- a/bin/rule_handler.js +++ b/bin/rule_handler.js @@ -548,7 +548,7 @@ function handle_rule(rule, cb) { //check count if(input.multi && rule.input_multicount) { - //make sure we have exactly the expected number of candiates + //make sure we have exactly the expected number of candidates if(candidates.length != rule.input_multicount[input.id]) { log.info("We found "+candidates.length +" candidates objects for input:"+input.id+", but the rule is expecting "+rule.input_multicount[input.id]+" objects", group_id); ambiguous = true; diff --git a/docs/apidoc/api_project.js b/docs/apidoc/api_project.js index 74363c48..4f766cd5 100644 --- a/docs/apidoc/api_project.js +++ b/docs/apidoc/api_project.js @@ -1,7 +1,7 @@ define({ "name": "warehouse", "version": "1.0.0", - "description": "Service that allows data warehousing and workfow orchestration", + "description": "Service that allows data warehousing and workflow orchestration", "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", diff --git a/docs/apidoc/api_project.json b/docs/apidoc/api_project.json index 00af88f7..1eceb8a3 100644 --- a/docs/apidoc/api_project.json +++ b/docs/apidoc/api_project.json @@ -1,7 +1,7 @@ { "name": "warehouse", "version": "1.0.0", - "description": "Service that allows data warehousing and workfow orchestration", + "description": "Service that allows data warehousing and workflow orchestration", "sampleUrl": false, "defaultVersion": "0.0.0", "apidoc": "0.3.0", diff --git a/docs/apidoc/main.js b/docs/apidoc/main.js index 9d31fa5f..00c80879 100644 --- a/docs/apidoc/main.js +++ b/docs/apidoc/main.js @@ -350,7 +350,7 @@ require([ if (entry.groupTitle) title = entry.groupTitle; - // TODO: make groupDescription compareable with older versions (not important for the moment) + // TODO: make groupDescription comparable with older versions (not important for the moment) if (entry.groupDescription) description = entry.groupDescription; @@ -514,7 +514,7 @@ require([ }; if ($.urlParam('compare')) { - // URL Paramter ?compare=1 is set + // URL Parameter ?compare=1 is set $('#compareAllWithPredecessor').trigger('click'); if (window.location.hash) { diff --git a/ui/build/webpack.prod.conf.js b/ui/build/webpack.prod.conf.js index e390a2a0..900f6905 100644 --- a/ui/build/webpack.prod.conf.js +++ b/ui/build/webpack.prod.conf.js @@ -99,7 +99,7 @@ const plugins = [ minChunks: Infinity }), - // This instance extracts shared chunks from code splitted chunks and bundles them + // This instance extracts shared chunks from code split chunks and bundles them // in a separate chunk, similar to the vendor chunk // see: https://webpack.js.org/plugins/commons-chunk-plugin/#extra-async-commons-chunk new webpack.optimize.CommonsChunkPlugin({ diff --git a/ui/semantic/src/definitions/behaviors/api.js b/ui/semantic/src/definitions/behaviors/api.js index 578e2016..351d6b3e 100644 --- a/ui/semantic/src/definitions/behaviors/api.js +++ b/ui/semantic/src/definitions/behaviors/api.js @@ -129,7 +129,7 @@ $.api = $.fn.api = function(parameters) { response = JSON.parse(response); } catch(e) { - // isnt json string + // isn't json string } } return response; @@ -331,7 +331,7 @@ $.api = $.fn.api = function(parameters) { cancelled: function() { return (module.cancelled || false); }, - succesful: function() { + successful: function() { return (module.request && module.request.state() == 'resolved'); }, failure: function() { @@ -544,7 +544,7 @@ $.api = $.fn.api = function(parameters) { response ; // have to guess callback parameters based on request success - if( module.was.succesful() ) { + if( module.was.successful() ) { response = firstParameter; xhr = secondParameter; } diff --git a/ui/semantic/src/definitions/modules/dimmer.js b/ui/semantic/src/definitions/modules/dimmer.js index 2feb915e..e8a2eb13 100644 --- a/ui/semantic/src/definitions/modules/dimmer.js +++ b/ui/semantic/src/definitions/modules/dimmer.js @@ -152,7 +152,7 @@ $.fn.dimmer = function(parameters) { event: { click: function(event) { - module.verbose('Determining if event occured on dimmer', event); + module.verbose('Determining if event occurred on dimmer', event); if( $dimmer.find(event.target).length === 0 || $(event.target).is(selector.content) ) { module.hide(); event.stopImmediatePropagation(); diff --git a/ui/semantic/src/definitions/modules/sticky.js b/ui/semantic/src/definitions/modules/sticky.js index 4413e793..c214b5ea 100644 --- a/ui/semantic/src/definitions/modules/sticky.js +++ b/ui/semantic/src/definitions/modules/sticky.js @@ -923,7 +923,7 @@ $.fn.sticky.settings = { error : { container : 'Sticky element must be inside a relative container', - visible : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to surpress this warning in production.', + visible : 'Element is hidden, you must call refresh after element becomes visible. Use silent setting to suppress this warning in production.', method : 'The method you called is not defined.', invalidContext : 'Context specified does not exist', elementSize : 'Sticky element is larger than its container, cannot create sticky.' diff --git a/ui/semantic/tasks/docs/serve.js b/ui/semantic/tasks/docs/serve.js index 66673130..d564f9af 100644 --- a/ui/semantic/tasks/docs/serve.js +++ b/ui/semantic/tasks/docs/serve.js @@ -136,7 +136,7 @@ module.exports = function () { if(isConfig) { // console.info('Rebuilding all files'); - // cant rebuild paths are wrong + // can't rebuild paths are wrong // gulp.start('build-docs'); return; } diff --git a/ui/semantic/tasks/rtl/watch.js b/ui/semantic/tasks/rtl/watch.js index af89922d..0ae0daeb 100644 --- a/ui/semantic/tasks/rtl/watch.js +++ b/ui/semantic/tasks/rtl/watch.js @@ -101,7 +101,7 @@ module.exports = function(callback) { if(isConfig) { console.log('Change detected in theme config'); - // cant tell which theme was changed in theme.config, rebuild all + // can't tell which theme was changed in theme.config, rebuild all gulp.start('build'); } else if(isPackagedTheme) { diff --git a/ui/src/admin.vue b/ui/src/admin.vue index 87180c60..74b19c6f 100644 --- a/ui/src/admin.vue +++ b/ui/src/admin.vue @@ -209,7 +209,7 @@ export default { minProjectSize: 500, prov: null, - /*add new tab swithching code*/ + /*add new tab switching code*/ // tabIndices : ["Task", "Switch User", "Analytics", "Projects", "Users", "Groups"], } }, diff --git a/ui/src/app.vue b/ui/src/app.vue index 3c77b607..da922df3 100644 --- a/ui/src/app.vue +++ b/ui/src/app.vue @@ -286,7 +286,7 @@
- Maintaners + Maintainers

List of users who currently maintains this App.

diff --git a/ui/src/appedit.vue b/ui/src/appedit.vue index 68e93003..1b5d4b76 100644 --- a/ui/src/appedit.vue +++ b/ui/src/appedit.vue @@ -503,7 +503,7 @@ output/mri/aparc* Archive this output by default. Uncheck this if this output is rarely used / archived to reduce the size of archive. (DEPRECATED) ignore output directory. Output files will be stored on the root of workdir.

-
Datatype File Mapping Optional override of file/direcory name to avoid more than 1 output to collide.
+
Datatype File Mapping Optional override of file/directory name to avoid more than 1 output to collide.
diff --git a/ui/src/assets/noprocess.vue b/ui/src/assets/noprocess.vue index 623e9af3..70f17864 100644 --- a/ui/src/assets/noprocess.vue +++ b/ui/src/assets/noprocess.vue @@ -37,7 +37,7 @@ src="https://www.youtube.com/embed/Ewy3ahCVUzw" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen>
3. Analyze Multiple Subjects (Bulk Process)
-

If you know the Apps you would like to run and their paramters set, you can analyze multiple (all) subjects in a Project using the Pipeline tab.

+

If you know the Apps you would like to run and their parameters set, you can analyze multiple (all) subjects in a Project using the Pipeline tab.

In your private project, go to the Pipelines tab, click the button to create a new pipelie rule. Enter any App name, select the App and run it. Under the Inputs section, update the Project field to the project that contains the datasets that you would like to use as input. Click Submit.

diff --git a/ui/src/components/admin/groups.vue b/ui/src/components/admin/groups.vue index 70ced6d1..07c35e4a 100644 --- a/ui/src/components/admin/groups.vue +++ b/ui/src/components/admin/groups.vue @@ -152,7 +152,7 @@ export default { return; } if(!this.form._admins) { - this.$notify({type: "error", text: 'Group is required to have atleast one admin'}); + this.$notify({type: "error", text: 'Group is required to have at least one admin'}); return; } //convert back to numbers diff --git a/ui/src/components/agreements.vue b/ui/src/components/agreements.vue index f6dcf47c..a7a0994e 100644 --- a/ui/src/components/agreements.vue +++ b/ui/src/components/agreements.vue @@ -45,7 +45,7 @@ export default { } }}); } else { - console.log("user doesn't have profile object.. maybe not logged in? storing agreements on local stoage"); + console.log("user doesn't have profile object.. maybe not logged in? storing agreements on local storage"); localStorage.setItem("agreements", JSON.stringify(this.user_agreements)); } diff --git a/ui/src/components/app.vue b/ui/src/components/app.vue index 326fccc2..33d1ae71 100644 --- a/ui/src/components/app.vue +++ b/ui/src/components/app.vue @@ -71,7 +71,7 @@   --> - + {{avgRuntime(app_.stats.runtime_mean, app_.stats.runtime_std)}}     diff --git a/ui/src/components/datasets.vue b/ui/src/components/datasets.vue index 2f27f33f..acc622aa 100644 --- a/ui/src/components/datasets.vue +++ b/ui/src/components/datasets.vue @@ -503,7 +503,7 @@ export default { let ands = []; //split query into each token and allow for regex search on each token - //so that we can query against multiple fields simultanously + //so that we can query against multiple fields simultaneously this.query.split(" ").forEach(q=>{ if(q === "") return; @@ -1005,7 +1005,7 @@ h4 { opacity: inherit; } -/*why don't I just *hide* removed objects? because remove() doesn't recalculate page height to preseve the current scroll position*/ +/*why don't I just *hide* removed objects? because remove() doesn't recalculate page height to preserve the current scroll position*/ .removed { background-color: #ccc; color: white; diff --git a/ui/src/components/projectselecter.vue b/ui/src/components/projectselecter.vue index 2cdba9a6..023f9ca3 100644 --- a/ui/src/components/projectselecter.vue +++ b/ui/src/components/projectselecter.vue @@ -55,7 +55,7 @@ export default { load_projects() { var find = { removed: false, - //openneuro: {$exists: false}, //don't show openneuro psudo projects anymore + //openneuro: {$exists: false}, //don't show openneuro pseudo projects anymore }; if(this.canwrite) { diff --git a/ui/src/components/release.vue b/ui/src/components/release.vue index 9f1d70eb..5344a113 100644 --- a/ui/src/components/release.vue +++ b/ui/src/components/release.vue @@ -61,7 +61,7 @@

-    Dowload this notebook +    Download this notebook   diff --git a/ui/src/components/select2.vue b/ui/src/components/select2.vue index 1b23b196..e4206406 100644 --- a/ui/src/components/select2.vue +++ b/ui/src/components/select2.vue @@ -72,7 +72,7 @@ export default { value: function(value) { //console.log("select2: parent value changed to", value); - //check to make sure we aren't updateing controller with the same value + //check to make sure we aren't updating controller with the same value //this happens if user change value on UI, which triggers change, and parent //send change event back. if(JSON.stringify(value) != JSON.stringify($(this.$el).val())) { diff --git a/ui/src/components/settings/profile.vue b/ui/src/components/settings/profile.vue index a879c910..d3667053 100644 --- a/ui/src/components/settings/profile.vue +++ b/ui/src/components/settings/profile.vue @@ -36,7 +36,7 @@

Public Profile
-

The following information will be shared publically among all brainlife users.

+

The following information will be shared publicly among all brainlife users.

diff --git a/ui/src/components/task.vue b/ui/src/components/task.vue index 88d9ff05..57463f50 100644 --- a/ui/src/components/task.vue +++ b/ui/src/components/task.vue @@ -52,7 +52,7 @@ Nice - {{task.nice}} yeilds to less nice tasks + {{task.nice}} yields to less nice tasks Rule diff --git a/ui/src/components/trueorfalse.vue b/ui/src/components/trueorfalse.vue index cd33ce59..129a0c15 100644 --- a/ui/src/components/trueorfalse.vue +++ b/ui/src/components/trueorfalse.vue @@ -20,7 +20,7 @@ export default { value: function(v) { if(v) this.myvalue = "true"; else this.myvalue = "false"; - console.log("updateing _value", this.myvalue); + console.log("updating _value", this.myvalue); }, myvalue: function(v) { this.$emit('input', v == "true"); diff --git a/ui/src/dataset.vue b/ui/src/dataset.vue index 5a24063d..480bd234 100644 --- a/ui/src/dataset.vue +++ b/ui/src/dataset.vue @@ -184,7 +184,7 @@ export default { known_license(license) { license = license.toLowerCase().trim(); - //corrrect some common mistakes.. (should I do this?) + //correct some common mistakes.. (should I do this?) if(license == "cco" || license == "cc") license = "cc0"; if(license == "ppdl") license = "pddl"; if(license == "ccby") license = "ccby.40"; diff --git a/ui/src/datasets.vue b/ui/src/datasets.vue index 64aafadf..4c19e84d 100644 --- a/ui/src/datasets.vue +++ b/ui/src/datasets.vue @@ -95,7 +95,7 @@ export default { filteredGroups: [], datatypes: [], //datatypes info - //datatype_options: null, //{label: .. datatype: } opbjects + //datatype_options: null, //{label: .. datatype: } objects //datatype ids to use in filter /* diff --git a/ui/src/datauis/nifti.vue b/ui/src/datauis/nifti.vue index eb33bbf5..fb670ec4 100644 --- a/ui/src/datauis/nifti.vue +++ b/ui/src/datauis/nifti.vue @@ -38,7 +38,7 @@ export default { path += "peaks.nii.gz"; break; default: - alert('unknown datatye:'+this.uiconfig.datatype); + alert('unknown datatype:'+this.uiconfig.datatype); } path += "?at="+Vue.config.jwt; window.config = { datatype: this.uiconfig.datatype, path }; diff --git a/ui/src/lib.js b/ui/src/lib.js index 2db5124e..fe5adc24 100644 --- a/ui/src/lib.js +++ b/ui/src/lib.js @@ -17,7 +17,7 @@ export function filter_apps(dataset, apps) { var reject = false; if(dataset.datatype_tags) input.datatype_tags.forEach((tag)=> { if(tag[0] == '!') { - //negative tag (dataset must't have) + //negative tag (dataset mustn't have) if(~dataset.datatype_tags.indexOf(tag.substring(1))) { reject = true; } diff --git a/ui/src/mixins/datatypecache.js b/ui/src/mixins/datatypecache.js index 4c521098..6dd601eb 100644 --- a/ui/src/mixins/datatypecache.js +++ b/ui/src/mixins/datatypecache.js @@ -9,7 +9,7 @@ export default { datatypecache(id, cb) { this._cache("datatype."+id, ()=>{ return this.$http.get('datatype', {params: { - find: JSON.stringify({_id: id}), //TODO - maybe seach by name also? + find: JSON.stringify({_id: id}), //TODO - maybe search by name also? }}); }, (err, res)=>{ if(err) return cb(err); diff --git a/ui/src/mixins/wait.js b/ui/src/mixins/wait.js index f6500c07..59897300 100644 --- a/ui/src/mixins/wait.js +++ b/ui/src/mixins/wait.js @@ -18,7 +18,7 @@ export default { methods: { wait(taskid, cb) { //waiting for taskid and call cb when finishes - //TODO it also restart the job if it's removed (should it be this mixin's reponsibility?) + //TODO it also restart the job if it's removed (should it be this mixin's responsibility?) this.cb = cb; var url = Vue.config.event_ws+"/subscribe?jwt="+Vue.config.jwt; diff --git a/ui/src/modals/appsubmit.vue b/ui/src/modals/appsubmit.vue index 972b4a56..8b199ba3 100644 --- a/ui/src/modals/appsubmit.vue +++ b/ui/src/modals/appsubmit.vue @@ -214,7 +214,7 @@ export default { }); }); - //TODO - call removeEventListener in destroy()? Or I should do this everytime modal is shown/hidden? + //TODO - call removeEventListener in destroy()? Or I should do this every time modal is shown/hidden? document.addEventListener("keydown", e => { if (e.keyCode == 27) { this.open = false; @@ -415,8 +415,8 @@ export default { var instance = null; var download = []; - //load project detail for project selected and desintation project - let project_ids = [ this.projectId ]; //desintation + //load project detail for project selected and destination project + let project_ids = [ this.projectId ]; //destination //for project selected for input for(let input_id in this.form.inputs) { this.form.inputs[input_id].forEach(ps=>{ diff --git a/ui/src/modals/archiver.vue b/ui/src/modals/archiver.vue index 9dc79365..7d62ffe4 100644 --- a/ui/src/modals/archiver.vue +++ b/ui/src/modals/archiver.vue @@ -70,7 +70,7 @@ export default { }, destroyed() { - //to prevent wierd things from happening during debugging? + //to prevent weird things from happening during debugging? this.$root.$off("archiver.show"); }, diff --git a/ui/src/modals/dataladimporter.vue b/ui/src/modals/dataladimporter.vue index ba8c34e9..7a9dc8f0 100644 --- a/ui/src/modals/dataladimporter.vue +++ b/ui/src/modals/dataladimporter.vue @@ -76,7 +76,7 @@ export default { }, destroyed() { - //to prevent wierd things from happening during debugging? + //to prevent weird things from happening during debugging? this.$root.$off("importer.open"); }, diff --git a/ui/src/modals/dataset.vue b/ui/src/modals/dataset.vue index 43c8309a..fd1bff86 100644 --- a/ui/src/modals/dataset.vue +++ b/ui/src/modals/dataset.vue @@ -397,7 +397,7 @@ export default { this.$root.openDataObject = null; } - //TODO - call removeEventListener in destroy()? Or I should do this everytime modal is shown/hidden? + //TODO - call removeEventListener in destroy()? Or I should do this every time modal is shown/hidden? document.addEventListener("keydown", e => { if (e.keyCode == 27) { this.close(); @@ -406,7 +406,7 @@ export default { }, destroyed() { - //to prevent wierd things from happening during debugging? + //to prevent weird things from happening during debugging? this.$root.$off("dataset.view"); }, diff --git a/ui/src/modals/newtask.vue b/ui/src/modals/newtask.vue index 61214194..f9ccca29 100644 --- a/ui/src/modals/newtask.vue +++ b/ui/src/modals/newtask.vue @@ -299,7 +299,7 @@ export default { }).catch(console.error); }); - //TODO - call removeEventListener in destroy()? Or I should do this everytime modal is shown/hidden? + //TODO - call removeEventListener in destroy()? Or I should do this every time modal is shown/hidden? document.addEventListener("keydown", e => { if (e.keyCode == 27) { this.open = false; diff --git a/ui/src/modals/rule.vue b/ui/src/modals/rule.vue index 91ed4c5d..6a24c486 100644 --- a/ui/src/modals/rule.vue +++ b/ui/src/modals/rule.vue @@ -100,7 +100,7 @@

- Mutiple Input Object Count * + Multiple Input Object Count * diff --git a/ui/src/modals/taskinfo.vue b/ui/src/modals/taskinfo.vue index 99914170..444bf0d9 100644 --- a/ui/src/modals/taskinfo.vue +++ b/ui/src/modals/taskinfo.vue @@ -61,7 +61,7 @@ Nice - {{task.nice}} yeilds to less nice tasks + {{task.nice}} yields to less nice tasks Rule @@ -256,7 +256,7 @@ export default { this.taskConfigJson = JSON.stringify(this.task.config, null, 4); }); - //TODO - call removeEventListener in destroy()? Or I should do this everytime modal is shown/hidden? + //TODO - call removeEventListener in destroy()? Or I should do this every time modal is shown/hidden? document.addEventListener("keydown", e => { if (e.keyCode == 27) { this.open = false; diff --git a/ui/src/project.vue b/ui/src/project.vue index c37df5fb..52eca641 100644 --- a/ui/src/project.vue +++ b/ui/src/project.vue @@ -568,7 +568,7 @@ export default { '$route': function() { var project_id = this.$route.params.id; if(project_id && this.project && this.project._id != project_id) { - console.log("project chagned from", this.project._id, "to", project_id) + console.log("project changed from", this.project._id, "to", project_id) this.openProject(project_id); } else { this.handleRouteParams(); diff --git a/ui/src/projectedit.vue b/ui/src/projectedit.vue index 12dfaf5c..9e8c9aeb 100644 --- a/ui/src/projectedit.vue +++ b/ui/src/projectedit.vue @@ -160,14 +160,14 @@

Participants Info
-

Key/value dictionary for each subject (participants.tsv). You can use this information in analysis tab. It should be array of objects containig at least 'subject' key and other fields

+

Key/value dictionary for each subject (participants.tsv). You can use this information in analysis tab. It should be array of objects containing at least 'subject' key and other fields


Column Definitions
-

Participants Info column Definitions (participants.json). Please read the BIDS speficication

+

Participants Info column Definitions (participants.json). Please read the BIDS specification


@@ -190,7 +190,7 @@

- Please issue access token/secret on your XNAT project to allow accesss from brianlife. Brainlife will automatically refresh your token periodically. + Please issue access token/secret on your XNAT project to allow access from brianlife. Brainlife will automatically refresh your token periodically. diff --git a/ui/src/resource.vue b/ui/src/resource.vue index fb7aa940..10cf0ebd 100644 --- a/ui/src/resource.vue +++ b/ui/src/resource.vue @@ -426,7 +426,7 @@ export default { this.gidsProjects = res.data.projects; //for projects that user doesn't have access (other admins of the resource can set it) - //let's create a skelton project to display + //let's create a skeleton project to display this.privateGids = []; this.resource.gids.forEach(gid=>{ if(gid == 1) return; //public id is handled elsewhere diff --git a/ui/src/secondary/parcstats.vue b/ui/src/secondary/parcstats.vue index 3126a329..f50e8733 100644 --- a/ui/src/secondary/parcstats.vue +++ b/ui/src/secondary/parcstats.vue @@ -123,7 +123,7 @@ export default { for(let i = 0;i < this.structures.length; ++i) { const structure = this.structures[i]; try { - //come up with refrence json url + //come up with reference json url let url = "https://raw.githubusercontent.com/brainlife/reference/master/neuro/parc-stats/"; switch(this.source) { case "cortex": @@ -133,7 +133,7 @@ export default { url += "subcortical"; break; default: - throw "unknow source:"+this.source; + throw "unknown source:"+this.source; } url +='/'+structure+'.json'; diff --git a/ui/src/secondary/tractmeasures.vue b/ui/src/secondary/tractmeasures.vue index c5ad2f66..5ddc9516 100644 --- a/ui/src/secondary/tractmeasures.vue +++ b/ui/src/secondary/tractmeasures.vue @@ -342,7 +342,7 @@ export default { //if(key.includes("_mean")) key = key.split("_")[0]; if(!this.labels[key]) { - console.log("don't have label infor for", key); + console.log("don't have label info for", key); continue; } const label = this.labels[key]; diff --git a/ui/theme/autocomplete.css b/ui/theme/autocomplete.css index f47ed955..2312c810 100644 --- a/ui/theme/autocomplete.css +++ b/ui/theme/autocomplete.css @@ -695,7 +695,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/cascader.css b/ui/theme/cascader.css index 6e0d6c09..4270d248 100644 --- a/ui/theme/cascader.css +++ b/ui/theme/cascader.css @@ -695,7 +695,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/date-picker.css b/ui/theme/date-picker.css index e0e36c42..2134ae34 100644 --- a/ui/theme/date-picker.css +++ b/ui/theme/date-picker.css @@ -2804,7 +2804,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/index.css b/ui/theme/index.css index 57ae23d8..58ca3761 100644 --- a/ui/theme/index.css +++ b/ui/theme/index.css @@ -2104,7 +2104,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -4580,7 +4580,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -7506,7 +7506,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -8209,7 +8209,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -11661,7 +11661,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -19449,7 +19449,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -23244,7 +23244,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -26156,7 +26156,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -29750,7 +29750,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -37873,7 +37873,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; @@ -39501,7 +39501,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/input-number.css b/ui/theme/input-number.css index 6ce48fbb..7e112359 100644 --- a/ui/theme/input-number.css +++ b/ui/theme/input-number.css @@ -695,7 +695,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/input.css b/ui/theme/input.css index 93d7565a..26daab4f 100644 --- a/ui/theme/input.css +++ b/ui/theme/input.css @@ -465,7 +465,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/message-box.css b/ui/theme/message-box.css index 163a0384..964429c1 100644 --- a/ui/theme/message-box.css +++ b/ui/theme/message-box.css @@ -1445,7 +1445,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/pagination.css b/ui/theme/pagination.css index 8dce220a..7fa5c9d5 100644 --- a/ui/theme/pagination.css +++ b/ui/theme/pagination.css @@ -1509,7 +1509,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/select.css b/ui/theme/select.css index ba6b3486..4796d1cd 100644 --- a/ui/theme/select.css +++ b/ui/theme/select.css @@ -1279,7 +1279,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/slider.css b/ui/theme/slider.css index a1b0d4c8..eea591d6 100644 --- a/ui/theme/slider.css +++ b/ui/theme/slider.css @@ -815,7 +815,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/time-picker.css b/ui/theme/time-picker.css index f25f529f..6b14d3d7 100644 --- a/ui/theme/time-picker.css +++ b/ui/theme/time-picker.css @@ -1413,7 +1413,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; diff --git a/ui/theme/transfer.css b/ui/theme/transfer.css index f5d4148b..216efa51 100644 --- a/ui/theme/transfer.css +++ b/ui/theme/transfer.css @@ -696,7 +696,7 @@ .el-input-group--append .el-select .el-input.is-focus .el-input__inner { border-color: transparent; } -/** disalbe default clear on IE */ +/** disable default clear on IE */ .el-input__inner::-ms-clear { display: none; width: 0; From 92729c39f8808d6c29e546090b7317eec5417e61 Mon Sep 17 00:00:00 2001 From: Yaroslav Halchenko Date: Wed, 1 Mar 2023 21:56:18 -0500 Subject: [PATCH 18/56] committing typo fix in git ignored file --- ui/src/components/pipelines.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/src/components/pipelines.vue b/ui/src/components/pipelines.vue index 3bb38eb5..d6d9065a 100644 --- a/ui/src/components/pipelines.vue +++ b/ui/src/components/pipelines.vue @@ -104,7 +104,7 @@ export default { this.handleRoute(); this.subscribe(); - //initialize if pipeline hierarchy doesn' exist yet + //initialize if pipeline hierarchy doesn't exist yet if(!this.project.pipelines) { const pipelines = { type: "group", From 6b20d9fcdc44ca423a2d961ee409998567f92a95 Mon Sep 17 00:00:00 2001 From: Anibal Solon Date: Thu, 2 Mar 2023 04:33:27 +0000 Subject: [PATCH 19/56] fix: defaults to higher number, api has a default too low --- ui/src/modals/downscript.vue | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/ui/src/modals/downscript.vue b/ui/src/modals/downscript.vue index 9fc62630..8dc87276 100644 --- a/ui/src/modals/downscript.vue +++ b/ui/src/modals/downscript.vue @@ -128,11 +128,8 @@ export default { }, downscript() { - if (!this.query._id) { - return; - } const headers = "-H 'Content-Type: application/json' -H 'Authorization: Bearer " + this.jwt + "'"; - const query = JSON.stringify({limit: this.query._id.length, find: this.query}); + const query = JSON.stringify({limit: (this.query && this.query._id && this.query._id.length) || 10000, find: this.query}); return `curl ${headers} -d '${query}' -X POST "${Vue.config.api}/dataset/downscript" | bash`; }, From 08f4561d440fa93e00d63414df8e185a699928a8 Mon Sep 17 00:00:00 2001 From: Anibal Solon Date: Thu, 2 Mar 2023 04:33:35 +0000 Subject: [PATCH 20/56] enh: cleanup --- ui/src/components/groupanalysis.vue | 32 ----------------------------- 1 file changed, 32 deletions(-) diff --git a/ui/src/components/groupanalysis.vue b/ui/src/components/groupanalysis.vue index 98b89165..9738791f 100644 --- a/ui/src/components/groupanalysis.vue +++ b/ui/src/components/groupanalysis.vue @@ -122,34 +122,6 @@ export default { sessions: [], - //TODO should come from db someday - /* - apps: [ - { - text: "Please select a class to start", - value: null, - }, - { - text: "python/dipy", - //img: "https://kanoki.org/wp-content/uploads/2017/07/Screen-Shot-2017-07-15-at-04.59.36.png", - value: { - desc: "Jupyter Datascience Notebook (lab-2.1.1) with Dipy(1.3.0) and Fury", - container: "brainlife/ga-python", - tag: "lab211-dipy130", - }, - }, - { - text: "Octave(matlab)", - //img: "https://kanoki.org/wp-content/uploads/2017/07/Screen-Shot-2017-07-15-at-04.59.36.png", - value: { - desc: "Jupyter Datascience Notebook (lab-2.1.1) with Octave", - container: "brainlife/ga-octave", - tag: "1.0", - } - }, - ], - */ - editingTask: null, editingName: "", editingDesc: "", @@ -175,10 +147,6 @@ export default { }, mounted() { - if(Vue.config.debug) { - this.host = "https://dev1.soichi.us"; - } - this.createOrFindGAInstance(this.project.group_id, (err, instance)=>{ if(err) return console.error(err); //TODO notify? this.instance = instance; From cbe778f853e6f09a844d26c03f077736e9c75917 Mon Sep 17 00:00:00 2001 From: Anibal Solon Date: Thu, 2 Mar 2023 04:34:24 +0000 Subject: [PATCH 21/56] enh: update group analysis templates --- ui/src/modals/galauncher.vue | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/ui/src/modals/galauncher.vue b/ui/src/modals/galauncher.vue index 6e1edb74..4ea25656 100644 --- a/ui/src/modals/galauncher.vue +++ b/ui/src/modals/galauncher.vue @@ -142,27 +142,27 @@ export default { templates: [ { name: "Python3", - desc: "Python Notebook (lab-2.1.1) with Dipy(1.3.0) and Fury", - container: "brainlife/ga-dipy:lab211-dipy130", - app: "soichih/ga-test", + desc: "Python Notebook (lab-3.2.8) with Dipy(1.4.1) and Fury", + container: "brainlife/ga-python:lab328-dipy141", + app: "brainlife/ga-python", }, { name: "Python3", - desc: "Python Notebook (lab-3.0.16) with Dipy(1.3.0) and Fury", - container: "brainlife/ga-python:lab3016-dipy130", - app: "soichih/ga-test", + desc: "Python Notebook", + container: "brainlife/ga-python:lab328-dipy141", + app: "brainlife/ga-python", }, { name: "Python3", - desc: "Python Notebook (lab-3.2.8) with Dipy(1.4.1) and Fury", - container: "brainlife/ga-python:lab328-dipy141", - app: "soichih/ga-test", + desc: "Python Notebook", + container: "brainlife/ga-python:lab328-dipy141-pybrainlife-1.0", + app: "brainlife/ga-python", }, { name: "Octave(matlab)", desc: "Octave Notebook (lab-2.1.1)", container: "brainlife/ga-octave:1.0", - app: "soichih/ga-test", + app: "brainlife/ga-octave", }, ], preSelectedGAID: null, From f06f1e5b263f4b326f264bb1fb94f37164dff7fa Mon Sep 17 00:00:00 2001 From: Anibal Date: Mon, 5 Jun 2023 17:35:54 -0500 Subject: [PATCH 22/56] enh: multi select and delete processes --- ui/src/components/processes.vue | 93 ++++++++++++++++++++++++++------- 1 file changed, 75 insertions(+), 18 deletions(-) diff --git a/ui/src/components/processes.vue b/ui/src/components/processes.vue index cd9ff258..46f7cc99 100644 --- a/ui/src/components/processes.vue +++ b/ui/src/components/processes.vue @@ -55,8 +55,7 @@

-
- +
@@ -67,7 +66,7 @@
+ @click.stop="select_instance($event, instance, summary)" :key="summary.task_id"> {{summary.name.substring(0,4).trim()}}
@@ -83,18 +82,22 @@
+
+ +
+ New Process - +
-
+
@@ -129,6 +132,7 @@ export default { show: null, //null == all selected: null, + multiSelected: [], query: "", apps: null, //keyed by _id @@ -264,9 +268,9 @@ export default { var selected = this.instances.find(it=>it._id == subid); if(this.selected && this.selected._id != subid) { //update - this.toggle_instance(selected); + this.toggle_instance(null, selected); } else { - if(!this.selected) this.toggle_instance(selected); + if(!this.selected) this.toggle_instance(null, selected); //newly opened via router.. scroll to it //TODO - I want to scroll to the instance that user open via router change, but since @@ -277,7 +281,7 @@ export default { if(this.selected) { //close console.log("need to close opened instance"); - this.toggle_instance(this.selected); //close it + this.toggle_instance(null, this.selected); //close it } } }, @@ -315,18 +319,38 @@ export default { if (this.$refs["instances-list"]) this.$refs["instances-list"].scrollTop = top; }, - toggle_instance(instance, task) { - let url = "/project/"+this.project._id+"/process"; + toggle_instance(event, instance, task) { + let url = "/project/" + this.project._id + "/process"; + + if (!instance) { + this.$router.replace(url); + this.selected = null; + return; + } + + if (event.shiftKey && this.selected && this.selected != instance) { + const instances = this.sorted_and_filtered_instances; + let from = instances.indexOf(this.selected); + let to = instances.indexOf(instance); + + if (from > to) { + [from, to] = [to, from]; + } + + this.multiSelected = instances.slice(from, to + 1); + return; + } else { + this.multiSelected = []; + } + if(this.selected != instance) { this.selected = instance; - //if jumping to instance below currently selected, I should adjust current scroll position - url += "/"+instance._id; - if(task) url += "#"+task; + url += "/" + instance._id; + if(task) url += "#" + task; } else { - //close! - this.$router.replace(url); this.selected = null; } + this.$router.replace(url); //reset previous_instance id if(this.selected) { @@ -373,8 +397,9 @@ export default { instance_class(instance) { let a = ["instance-header"]; - a.push("instance-"+instance.status); - if(instance == this.selected) a.push("instance-active"); + a.push("instance-" + instance.status); + if (instance == this.selected) a.push("instance-active"); + if (this.multiSelected.includes(instance)) a.push("instance-multiselect"); return a; }, @@ -477,6 +502,25 @@ export default { return cs; }, + removeMulti() { + if (confirm("Do you really want to remove these processes and all tasks?")) { + Promise.all(this.multiSelected.map(instance => + this.$http.delete(Vue.config.amaretti_api + '/instance/' + instance._id) + )).then(() => { + this.$notify({type: "success", text: "Processes removed"}); + this.toggle_instance(null, null); + }).catch(err => { + console.error(err); + this.notify_error(err); + }).finally(() => { + const url = "/project/"+this.project._id+"/process"; + this.$router.replace(url); + this.selected = null; + this.multiSelected = []; + }); + } + }, + }, //methods } @@ -508,6 +552,7 @@ padding: .15rem .3rem; top: 175px; width: 400px; background-color: #eee5; +user-select: none; } .instance-header { @@ -532,6 +577,11 @@ color: white; background-color: #2693ff; } +.instance-header.instance-multiselect { +color: black; +background-color: #2692ff84; +} + .instance-desc { font-size: 90%; padding-left: 3px; @@ -542,6 +592,13 @@ margin-left: 0px; transition: background-color 0.3s, transform 0.5s, box-shadow 0.5s, opacity 0.5s; } +.button-multi-delete { +bottom: 20px; +margin-left: 20px; +padding: 8px; +position: fixed; +} + .table-header th { padding: 8px 0px; } From eabc516ccbf45117e61ed5310353be36d3b27d3f Mon Sep 17 00:00:00 2001 From: bhatiadheeraj Date: Fri, 11 Aug 2023 16:01:09 +0000 Subject: [PATCH 23/56] setup the dropdown split button to add template based agreements --- ui/src/projectedit.vue | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/ui/src/projectedit.vue b/ui/src/projectedit.vue index 12dfaf5c..ac2f6c5f 100644 --- a/ui/src/projectedit.vue +++ b/ui/src/projectedit.vue @@ -97,20 +97,28 @@ - Agreements + DATA USE AGREEMENT

List of agreements that user must agree before accessing datasets stored on this project

- +
-

Add Agreement

+ + + + template 1 + template 2 + template 3 +
@@ -559,7 +567,14 @@ export default { this.submitting = false; }); } - } + }, + + addAgreement(type) { + if(type == 'empty') this.project.agreements.push({agreement: ''}); + if(type == 'template1') this.project.agreements.push({ + agreement: "I agree to participate in this study - template 1", + }) + }, }, } From 9fe8cf2508bfbe8ea00c80f620a4051201486ef4 Mon Sep 17 00:00:00 2001 From: bhatiadheeraj Date: Tue, 15 Aug 2023 16:15:46 +0000 Subject: [PATCH 24/56] added dataset agreement --- ui/src/assets/consents.js | 26 ++++++++++++++++++++++++++ ui/src/projectedit.vue | 9 ++++----- 2 files changed, 30 insertions(+), 5 deletions(-) diff --git a/ui/src/assets/consents.js b/ui/src/assets/consents.js index 4b2c93a5..1ac15f71 100644 --- a/ui/src/assets/consents.js +++ b/ui/src/assets/consents.js @@ -29,3 +29,29 @@ Accounts which only serve for advertising will be deleted. Accounts which are up brainlife.io is a publicly funded, community-driven project that is run by individuals at multiple institutions with the goal of advancing research and understanding. Learn more about this at brainlife.io. `; + +exports.brainlife_dua = ` +Data Use Agreement for [Dataset Name] + + +Due to the sensitive nature of the dataset and to protect the confidentiality and privacy of data subjects, data protection pseudonymization (defacing) has been applied. This agreement governs the use of this pseudonymized dataset. A user who accesses this data agrees to be bound by its terms. + +Users agree to the following conditions of use: + +As a user of the dataset, you are the data controller of this dataset at the point of download. This means that you control the purposes and means of processing this specific dataset and therefore you have the responsibility to: + • Protect the privacy and confidentiality of the data subjects at all times + • Never to attempt to re-identify the data subjects by any means or technology + • Never to transfer this data to another user + • Report cases of data breach and incidental findings to the data provider + +Furthermore, by downloading the dataset the controller agrees that the following statement will always accompany any public use of the data (for an analysis, publication, blog, slides presentation or similar): + +Data provided in part by This publication benefitted at least in part from the use of data or technology provided by brainlife.io (NSF BCS 1734853 to Franco Pestilli). These data were managed and processed using brainlife.io (Hayashi, Caron Heinsfeld et al., in review, DOI:10.48550/arXiv.2306.02183) + +Relevant Definitions +Data Controller: A natural or legal person, public authority, agency or other body which, alone or jointly with others, determines the purposes and means of the processing of personal data. +Data Providers: +Data Processing: Any operation or set of operations performed on personal data including data download, storage, analysis, pseudonymization, anonymization, data transfer, etc. +Pseudonymization: The processing of personal data in such a manner that the personal data can no longer be attributed to a specific data subject without the use of additional information, provided that such additional information is kept separately and is subject to technical and organizational measures to ensure that the personal data are not attributed to an identified or identifiable natural person. + +`; \ No newline at end of file diff --git a/ui/src/projectedit.vue b/ui/src/projectedit.vue index ac2f6c5f..18e91a2b 100644 --- a/ui/src/projectedit.vue +++ b/ui/src/projectedit.vue @@ -115,9 +115,7 @@ - template 1 - template 2 - template 3 + Brainlife Data Use Agreement - Dataset
@@ -312,6 +310,7 @@ import tageditor from '@/components/tageditor' import datatypes from '@/mixins/datatypes' import { Picker } from 'emoji-mart-vue' +import { brainlife_dua } from "@/assets/consents.js"; const lib = require('@/lib'); @@ -571,8 +570,8 @@ export default { addAgreement(type) { if(type == 'empty') this.project.agreements.push({agreement: ''}); - if(type == 'template1') this.project.agreements.push({ - agreement: "I agree to participate in this study - template 1", + if(type == 'brainlife_dua') this.project.agreements.push({ + agreement: brainlife_dua, }) }, }, From f32fd8ab4e1e91121eb7fc5523f43c2673ec1201 Mon Sep 17 00:00:00 2001 From: bhatiadheeraj Date: Tue, 15 Aug 2023 16:25:52 +0000 Subject: [PATCH 25/56] fixed typo in config --- api/config/index.js.dev | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/config/index.js.dev b/api/config/index.js.dev index 2f20b63e..8e92b8fb 100644 --- a/api/config/index.js.dev +++ b/api/config/index.js.dev @@ -81,7 +81,7 @@ exports.mail = { //node mailer config mailer: { - host: 'mail-relay.iu.edu', //max recipents per email: 30 + host: 'mail-relay.iu.edu', //max recipients per email: 30 secure: true, //port 465 auth: { user: 'mememe', From 8aa91fd57445e886eca39c7251691e66feb7df02 Mon Sep 17 00:00:00 2001 From: bhatiadheeraj Date: Tue, 15 Aug 2023 20:48:23 +0000 Subject: [PATCH 26/56] created modal, updated profile settings to use aup new date --- ui/src/components/settings/profile.vue | 2 + ui/src/modals/aup_agreement.vue | 81 ++++++++++++++++++++++++++ ui/src/projects.vue | 26 ++++++++- 3 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 ui/src/modals/aup_agreement.vue diff --git a/ui/src/components/settings/profile.vue b/ui/src/components/settings/profile.vue index a879c910..2ff73cce 100644 --- a/ui/src/components/settings/profile.vue +++ b/ui/src/components/settings/profile.vue @@ -260,6 +260,7 @@ export default { this.email = res.data.email; this.fullname = res.data.fullname; if(res.data.profile) lib.mergeDeep(this.profile, res.data.profile); + if(this.profile.private.aup) this.profile.private.aup = true; const jwt = Vue.config.jwt; if(jwt) { this.debug = {jwt : this.user}; @@ -273,6 +274,7 @@ export default { submit_profile(e) { e.preventDefault() + if(this.profile.private.aup) this.profile.private.aup = new Date(); this.$http.patch(Vue.config.auth_api+"/profile", { fullname: this.fullname, profile: this.profile, diff --git a/ui/src/modals/aup_agreement.vue b/ui/src/modals/aup_agreement.vue new file mode 100644 index 00000000..4e7cdf27 --- /dev/null +++ b/ui/src/modals/aup_agreement.vue @@ -0,0 +1,81 @@ + + + + \ No newline at end of file diff --git a/ui/src/projects.vue b/ui/src/projects.vue index 41236deb..da7deecc 100644 --- a/ui/src/projects.vue +++ b/ui/src/projects.vue @@ -44,7 +44,10 @@
-

My Projects

+
+ +
+

My Projects

Please create your project by clicking the New Project button below.

@@ -91,6 +94,7 @@ From 0465b9949a89d760dd143f398f7b7c1f729d8d0d Mon Sep 17 00:00:00 2001 From: bhatiadheeraj Date: Tue, 15 Aug 2023 21:13:21 +0000 Subject: [PATCH 27/56] removed redundant api calls --- ui/src/modals/aup_agreement.vue | 49 +++++---------------------------- 1 file changed, 7 insertions(+), 42 deletions(-) diff --git a/ui/src/modals/aup_agreement.vue b/ui/src/modals/aup_agreement.vue index 4e7cdf27..caf6652f 100644 --- a/ui/src/modals/aup_agreement.vue +++ b/ui/src/modals/aup_agreement.vue @@ -1,7 +1,7 @@