diff --git a/.github/workflows/test.yml b/.github/workflows/ci.yml similarity index 51% rename from .github/workflows/test.yml rename to .github/workflows/ci.yml index 3fbb604..c33d2eb 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/ci.yml @@ -1,23 +1,25 @@ -name: Open Pryv.io tests +name: Open Pryv.io CI -on: +on: pull_request: branches: - - master + - '*' push: branches: - master jobs: build: - - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 strategy: matrix: - node-version: [16.4.1] + node-version: [18.16.0] steps: + - name: Install `just` + uses: extractions/setup-just@v1 + - name: Checkout repository with submodules uses: actions/checkout@v2 with: @@ -31,15 +33,7 @@ jobs: with: node-version: ${{ matrix.node-version }} - # mainly used so that next step does not fail on "git clone git@github.com:pryv/open-pryv.io.git dest" - - name: Download Open Pryv.io repository in dest/ - uses: actions/checkout@v2 - with: - repository: pryv/open-pryv.io - path: dest - clean: false - - # there is one private package (lib-reporting) used as npm package, so we need + # there is one private package (lib-reporting) used as npm package, so we need # to authenticate - name: Login to github uses: webfactory/ssh-agent@v0.4.1 @@ -47,29 +41,20 @@ jobs: ssh-private-key: ${{ secrets.TECH_PRYV_SSH_KEY }} - name: Setup opener - run: | - yarn setup - yarn install + run: just setup - - name: Generate Open Pryv.io - run: yarn build + - name: Build + run: just build - name: Setup Open Pryv.io working-directory: dest run: | - yarn setup - yarn release - - # to remove when we remove components/previews-server - - name: Setup package for previews - working-directory: dest - run: sudo apt-get install graphicsmagick - - - name: start MongoDB - working-directory: dest - run: yarn database + ./scripts/setup-dev-env + sudo apt-get install graphicsmagick + just install-stable + IS_CI=true ./scripts/start-mongo - name: Run tests on Open Pryv.io working-directory: dest run: | - IS_CI=true yarn test + IS_CI=true just test all diff --git a/.gitignore b/.gitignore index 459bcb2..d9d1a2e 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ nbproject/ *.log # Pycharm IDE .idea/ +.DS_Store diff --git a/.licenser.yml b/.licenser.yml new file mode 100644 index 0000000..f2f638a --- /dev/null +++ b/.licenser.yml @@ -0,0 +1,86 @@ +files: + "**/*.js": + header: + startBlock: | + /** + * @license + linePrefix: " * " + endBlock: " */" + + "**/package.json": + json: + force: + author: "{AUTHOR_NAME} <{AUTHOR_EMAIL}> ({AUTHOR_WEB})" + license: "{SPDX}" + private: true + defaults: + homepage: "{HOMEPAGE}" + description: "{DESCRIPTION}" + sortPackage: true + + siblingLicenseFile: + name: "LICENSE" + license: | + Copyright (C) {YEARS} {AUTHOR_NAME} {AUTHOR_WEB} + + This file is part of Open-Pryv.io and released under BSD-Clause-3 License + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + SPDX-License-Identifier: BSD-3-Clause + + "**/README.md": + footer: + startBlock: "\n\n## License\n\n" + linePrefix: "" + endBlock: "" + license: "[{SPDX}](LICENSE)" + +ignore: +- .git +- .vscode +- coverage +- node_modules +- dest +- service-core +- service-mail +- service-register + +license: | + Copyright (C) {AUTHOR_NAME} {AUTHOR_WEB} + This file is part of Pryv.io and released under BSD-Clause-3 License + Refer to LICENSE file + +substitutions: + YEARS: + start: 2019 + end: CURRENT_YEAR + AUTHOR_NAME: "Pryv" + AUTHOR_EMAIL: info@pryv.com + AUTHOR_WEB: https://pryv.com + DESCRIPTION: "This package is part of Pryv.io, a Pryv software" + HOMEPAGE: https://pryv.com + SPDX: BSD-3-Clause diff --git a/src/licensing/LICENSE b/LICENSE similarity index 77% rename from src/licensing/LICENSE rename to LICENSE index 7d5b7bd..64cfc44 100644 --- a/src/licensing/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -Copyright (c) 2020 Pryv S.A. https://pryv.com +Copyright (C) 2019–2025 Pryv https://pryv.com This file is part of Open-Pryv.io and released under BSD-Clause-3 License @@ -6,15 +6,15 @@ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + may be used to endorse or promote products derived from this software + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE diff --git a/README.md b/README.md index bea1b54..d6f8138 100644 --- a/README.md +++ b/README.md @@ -1,13 +1,13 @@ # Pryv.io Opener -Script that releases the open source version of Pryv.io. - +Script that releases the open-pryv.io a strip down version of service-core, service-mail and service-register. +As of february 2025 All Pryv.io software has been open-sourced. ## Usage -1. Fetch git dependencies: `yarn setup` -2. Fetch node dependencies: `yarn` -3. Generate open-source release: `yarn build` this step also licenses code with: `yarn license` +1. Fetch git dependencies: `just setup` +2. Fetch node dependencies: `just install` +3. Generate open-source release: `just build` 4. Verify the release in `./dest` ### Update git dependencies @@ -20,46 +20,19 @@ For one or more of `service-core`, `service-register`, `service-mail`: 4. `cd ..` 5. git add, commit and push +## Publishing -## License - -License settings and script are located in [`licenser/`](licenser/). - - -## Helpers for developpment - -1. In `dest/` run `yarn setup`, `yarn release`, `yarn watch` -2. `dest/dist/components/register` or other component you need to test - - `pushd {your path}/dev-pryv.io-opener/ ; yarn build ; popd ; ../../node_modules/.bin/mocha 'test/**/*.test.js'` -3. to start api-server cd to `dest` and use `cd ../ ; yarn build; cd dest; sleep 2 ; yarn api` - or: `cd ../ ; yarn build; cd dest; sleep 2 ; dist/components/api-server/bin/server --config ./config.yml` - - -## Design +As per 1.9.0 integrated release has been removed. Github script `release-orig.yml` has been kept for reference. -### service-core +Publish docker containers: +- build the containers from `dest/docker` +- build the tarball with the confing with `build_tarball.sh` +- publish the containers `docker push "pryvio/open-pryv.io-api:{TAG}` & `docker push "pryvio/open-pryv.io-mail:{TAG}` +- Commit the content of `dest` +- Publish on github: push `dest` content -Changes made on **service-core** legacy code base to make it openable -#### Integration of register as a component (used if DNSLESS = true) -- Added `/reg` route in `routes/Path.js` -- Module is loaded directly from `server.js` with `expressApp` and `applications` parameters - -### service-regiser - -Changes made on **service-core** legacy code base to make it openable - -This task had a very small impact on the code of register as the **node-app-opener** was able to strip out the necessary code. - -Note the **striping comments** in `routes/admin.js` and `routes/user.js` that are used to remove parts of the code during build process of the open version. - -Example: - -The code between `// START - CLEAN ...` and `// END - CLEAN ...` will be removed +## License -```javascript -// START - CLEAN FOR OPENSOURCE -const invitationToken = require('../storage/invitations'); -// END - CLEAN FOR OPENSOURCE -``` +[BSD-3-Clause](LICENSE) diff --git a/src/index.js b/build/index.js similarity index 61% rename from src/index.js rename to build/index.js index c3e312b..37e8b18 100644 --- a/src/index.js +++ b/build/index.js @@ -1,8 +1,14 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ const serviceCore = require('./service-core'); const serviceMail = require('./service-mail'); const serviceRegister = require('./service-register'); const root = require('./root'); -(async () => {  +(async () => { await serviceCore(); await serviceRegister(); await serviceMail(); diff --git a/build/lib/json.js b/build/lib/json.js new file mode 100644 index 0000000..2b10780 --- /dev/null +++ b/build/lib/json.js @@ -0,0 +1,52 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const path = require('path'); +const fs = require('fs'); + +module.exports = function (destDir) { + return function (task) { + const fileDest = path.resolve(destDir, task.target); + const jsonStringContent = fs.readFileSync(fileDest, { encoding: 'utf8' }); + let dest = JSON.parse(jsonStringContent); + if (task.json.merge) { + mergeDeep(dest, task.json.merge); + } + fs.writeFileSync(fileDest, JSON.stringify(dest, null, 2)); + }; +}; + +/** + * Simple object check. + * @param item + * @returns {boolean} + */ +function isObject(item) { + return (item && typeof item === 'object' && !Array.isArray(item)); +} + +/** + * Deep merge two objects. + * @param target + * @param ...sources + */ +function mergeDeep(target, ...sources) { + if (!sources.length) return target; + const source = sources.shift(); + + if (isObject(target) && isObject(source)) { + for (const key in source) { + if (isObject(source[key])) { + if (!target[key]) Object.assign(target, { [key]: {} }); + mergeDeep(target[key], source[key]); + } else { + Object.assign(target, { [key]: source[key] }); + } + } + } + + return mergeDeep(target, ...sources); +} \ No newline at end of file diff --git a/src/lib/rsync.js b/build/lib/rsync.js similarity index 74% rename from src/lib/rsync.js rename to build/lib/rsync.js index 017a8a7..dc6a12a 100644 --- a/src/lib/rsync.js +++ b/build/lib/rsync.js @@ -1,25 +1,31 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ const Rsync = require('rsync'); const path = require('path'); const mkdirp = require('mkdirp'); -module.exports = async function rsync(task, srcDir, destDir) { +module.exports = async function rsync (task, srcDir, destDir) { const src = path.resolve(srcDir, task.target); let dest = path.resolve(destDir); - if (! task.rsyncUseDestDir) { + if (!task.rsyncUseDestDir) { dest = path.dirname(path.resolve(destDir, task.target)); } console.log(src + ' >>>> ' + dest); mkdirp(dest); const r = new Rsync() .set('a') - //.progress() + // .progress() .source(src) .destination(dest); if (!task.noDelete) r.delete(); if (task.excludes) r.exclude(task.excludes); if (task.patterns) r.patterns(task.patterns); - + await new Promise((resolve, reject) => { r.execute(function (error, code, cmd) { if (error) return reject(error); @@ -30,4 +36,4 @@ module.exports = async function rsync(task, srcDir, destDir) { process.stderr.write(data); }); }); -} +}; diff --git a/src/lib/sed.js b/build/lib/sed.js similarity index 71% rename from src/lib/sed.js rename to build/lib/sed.js index a4ad440..6fda302 100644 --- a/src/lib/sed.js +++ b/build/lib/sed.js @@ -1,3 +1,9 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ const { execSync } = require('child_process'); const path = require('path'); @@ -6,15 +12,16 @@ module.exports = function (destDir) { const dest = path.resolve(destDir, task.target); for (let i = 0; i < task.sed.length; i++) { const command = "sed -i.bak '/" + task.sed[i] + "/d' " + dest; - execSync(command); + execSync(command); } - if (task.sedReplace) + if (task.sedReplace) { for (let i = 0; i < task.sedReplace.length; i++) { const replaceBy = task.sedReplace[i][1].split('/').join('\\/'); // to escape / slashes - const command = "sed -i.bak 's/.*" + task.sedReplace[i][0] + ".*/" + replaceBy + "'/ " + dest; + const command = "sed -i.bak 's/.*" + task.sedReplace[i][0] + '.*/' + replaceBy + "'/ " + dest; execSync(command); } + } console.log('sed: ' + dest); execSync('rm -f ' + dest + '.bak'); - } -} \ No newline at end of file + }; +}; diff --git a/build/root.js b/build/root.js new file mode 100644 index 0000000..7b27568 --- /dev/null +++ b/build/root.js @@ -0,0 +1,28 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const fs = require('fs'); +const path = require('path'); +const rsync = require('./lib/rsync'); +const destDir = path.resolve(__dirname, '../dest/'); + +module.exports = async () => { + // root files + await rsync( + { target: './overrides/*', noDelete: true, rsyncUseDestDir: true }, + path.resolve(__dirname, '..'), + destDir); + await rsync( + { target: './overrides/.??*', noDelete: true, rsyncUseDestDir: true }, + path.resolve(__dirname, '..'), + destDir); + + // rename .gitignore + const gitignorePath = path.resolve(destDir, '.gitignore'); + fs.renameSync(gitignorePath + '.REMOVE_THIS_EXTENSION', gitignorePath); + + console.log('done'); +}; diff --git a/src/service-core.js b/build/service-core.js similarity index 56% rename from src/service-core.js rename to build/service-core.js index 9592986..ad44141 100644 --- a/src/service-core.js +++ b/build/service-core.js @@ -1,6 +1,11 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ const path = require('path'); const fs = require('fs'); -const mkdirp = require('mkdirp'); const srcDir = path.resolve(__dirname, '../service-core/'); const destDir = path.resolve(__dirname, '../dest/'); @@ -11,35 +16,34 @@ const json = require('./lib/json')(destDir); const OPEN_TAG = '-open'; -function execShellCommand(cmd) { +function execShellCommand (cmd) { const exec = require('child_process').exec; return new Promise((resolve, reject) => { exec(cmd, (error, stdout, stderr) => { if (error) { console.warn(error); } - resolve(stdout ? stdout : stderr); + resolve(stdout || stderr); }); }); } let version = null; - -function loadTasks() { +function loadTasks () { return [{ target: './components', excludes: [ 'hfs-server', 'pryvuser-cli', 'tprpc', 'webhooks', 'metadata', 'audit', // components 'business/src/series', 'business/src/series.js', 'series/repository.test.js', // series - 'api-server/config/test.json', // replaced by src-dest 'register' // protects components/register from being deleted because we rsync --delete ], patterns: ['-node_modules/', '-*influx*', '-*series*', '-webhook*', '-*nats*'] }, { target: './scripts', - excludes: ['compile-proxy-config.js', 'components-checkdeps.js', 'components-version.js'], + excludes: ['compile-proxy-config.js', 'components-checkdeps.js', 'components-version.js', + 'setup-ci', 'setup-infux', 'setup-nats-server', 'setup-private-libs', 'tag-tests'], patterns: ['-test*'] }, { @@ -47,64 +51,67 @@ function loadTasks() { excludes: ['acceptance/high-frequency.test.js'] }, { - target: './babel.config.json' + target: './justfile' + }, + { + target: './ferretDB' + }, + { + target: './README-DBs.md' + }, + { + target: './.mocharc.js' + }, + { + target: './package-lock.json' }, { target: './package.json', json: { merge: { - "name": "open-pryv.io", - "version": version, - "private": true, - "license": "BSD-3-clause", - "repository": { - "url": "git://github.com/pryv/service-open-pryv.git" + name: 'open-pryv.io', + version, + private: true, + license: 'BSD-3-clause', + repository: { + url: 'git://github.com/pryv/service-open-pryv.git' }, - "scripts": { - "api": "NODE_ENV=production ./dist/components/api-server/bin/server --config ./config.yml", - "mail": "yarn --cwd ./service-mail start", - "setup": "yarn install --ignore-optionals ; bash ./scripts/setup-dev-env.bash", - "proxy": "./node_modules/rec-la/bin/proxy.js localhost:3000", - "pryv": "yarn database >> ./var-pryv/logs/mongodb.log & yarn mail >> ./var-pryv/logs/mail.log & yarn api", - "local": "yarn database >> ./var-pryv/logs/mongodb.log & yarn mail >> ./var-pryv/logs/mail.log & yarn proxy & NODE_ENV=production ./dist/components/api-server/bin/server --config ./configs/rec-la.yml", + scripts: { + 'setup-dev-env': 'scripts/setup-dev-env', + api: 'LOGS=info NODE_ENV=production ./components/api-server/bin/server --config ./configs/api.yml', + mail: 'cd service-mail ; ./bin/server', + database: 'DEVELOPMENT=true scripts/start-mongo', + pryv: 'npm run database >> ./var-pryv/logs/mongodb.log & npm run mail >> ./var-pryv/logs/mail.log & npm run api', + apibackloop: 'LOGS=info NODE_ENV=production ./components/api-server/bin/server --config ./configs/api-backloop.yml', + }, + dependencies: { + pryv: '^2.0.2', + 'backloop.dev': 'latest' }, - "dependencies": { - "pryv": "^2.0.2", - "rec-la": "latest" - }, - "pre-commit": "" + 'pre-commit': '' } }, sed: ['hfs', 'metadata', 'webhooks', 'gnat', 'influx', 'jsdoc', 'test-root', 'cover', 'flow-coverage', 'tag-tests', 'test-results', 'tprpc', 'pryvuser-cli', 'metadata', 'nats', 'reporting'] }, - { - target: './.flowconfig', - sed: ['jaeger', 'tprpc', 'metadata', 'hfs-server', 'flow-coverage'] - }, { target: './components/api-server/package.json', sed: ['reporting'] - }, + } ]; -}; - - - +} module.exports = async () => { - version = await execShellCommand('git --git-dir=' + srcDir + '/.git describe'); // remove the intermediate commit index if (version.indexOf('-') >= 0) { version = version.substr(0, version.lastIndexOf('-')); } - version = version.split("\n")[0]; + version = version.split('\n')[0]; version = version + OPEN_TAG; - console.log('VERSION ', version) - fs.writeFileSync(path.resolve(__dirname, '../src-dest/.api-version'), version); + console.log('VERSION ', version); + fs.writeFileSync(path.resolve(__dirname, '../overrides/.api-version'), version); - - tasks = loadTasks(); + const tasks = loadTasks(); // --- initial copy for (let i = 0; i < tasks.length; i++) { @@ -113,8 +120,7 @@ module.exports = async () => { json(tasks[i]); } if (tasks[i].sed) { - sed(tasks[i]) + sed(tasks[i]); } } - }; diff --git a/build/service-mail.js b/build/service-mail.js new file mode 100644 index 0000000..eb73973 --- /dev/null +++ b/build/service-mail.js @@ -0,0 +1,47 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const path = require('path'); + +const mkdirp = require('mkdirp'); + +const srcDir = path.resolve(__dirname, '../service-mail/'); +const destDir = path.resolve(__dirname, '../dest/service-mail'); + +mkdirp.sync(destDir); + +const rsync = require('./lib/rsync'); +const sed = require('./lib/sed')(destDir); + +const tasks = [{ + target: './', + excludes: [ + 'app.js', 'build', 'config/development-config.yml', 'test', '.gitignore', 'Jenkinsfile', 'CHANGELOG.md', // root + 'templates/welcome-email', // set by overrides + 'package.json', './README.md' // sed will manage them + ], + patterns: ['-node_modules/'] +}, +{ + target: './package.json', + sed: ['chai', 'mocha', 'node-foreman', 'eslint'] +}, +{ + target: './README.md', + sed: ['Run the tests '] +}]; + +module.exports = async () => { + // --- initial copy + for (let i = 0; i < tasks.length; i++) { + await rsync(tasks[i], srcDir, destDir); + if (tasks[i].sed) { + sed(tasks[i]); + } + } + + console.log('done'); +}; diff --git a/build/service-register.js b/build/service-register.js new file mode 100644 index 0000000..fe910a0 --- /dev/null +++ b/build/service-register.js @@ -0,0 +1,55 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const path = require('path'); + +const mkdirp = require('mkdirp'); + +const srcDir = path.resolve(__dirname, '../service-register/'); +const destDir = path.resolve(__dirname, '../dest/components/register'); + +mkdirp.sync(destDir); + +const rsync = require('./lib/rsync'); +const sed = require('./lib/sed')(destDir); + +const tasks = [{ + target: './src', + excludes: [ + 'app.js', 'config.js', 'dns', '.gitignore', '.npmignore', 'package.json', // root + 'dataservers.js', // business + 'cross-domain.js', // middelware + 'source/server.js', // server + 'public/reserved-words.json', // public + 'routes/index.js', 'routes/records.js', 'routes/users.js', 'routes/admin.js', // routes (users.js & admin.js will be added after) + 'database.js', 'storage/invitations.js', 'storage/reserved-userid.js', 'storage/users.js' // storage + ], + patterns: ['-*dns*', '-node_modules/'] +}, +{ + target: './src/routes/users.js', + sed: [' START - CLEAN FOR OPENSOURCE/,/ END - CLEAN FOR OPENSOURCE'] +}, +{ + target: './src/routes/admin.js', + sed: [' START - CLEAN FOR OPENSOURCE/,/ END - CLEAN FOR OPENSOURCE'] +}, +{ + target: './package.json', + sed: ['reporting'] +}]; + +module.exports = async () => { + // --- initial copy + for (let i = 0; i < tasks.length; i++) { + await rsync(tasks[i], srcDir, destDir); + if (tasks[i].sed) { + sed(tasks[i]); + } + } + + console.log('done'); +}; diff --git a/justfile b/justfile new file mode 100644 index 0000000..2178914 --- /dev/null +++ b/justfile @@ -0,0 +1,81 @@ +# add node bin script path for recipes +export PATH := "./node_modules/.bin:" + env_var('PATH') + +# Default: display available recipes +_help: + @just --list --unsorted + +# –––––––––––––---------------------------------------------------------------- +# Setup +# –––––––––––––---------------------------------------------------------------- + +# Set up or update the dev environment for building +setup: update-repos install prepare-dest + +# Update source git repos (submodules) +update-repos: + git submodule update --init --recursive + git submodule foreach git pull origin master + +# Install node modules +install *params: + npm install {{params}} + +# Prepare `dest/` folder for building +prepare-dest: + #!/bin/sh + set -e + if [ -d dest ] && [ ! -d dest/.git ] + then + echo "" + echo "· 'dest/' folder corrupted (not a git repo), deleting..." + echo "" + rm -rf dest/ + fi + if [ ! -d dest ] + then + TARGET_REPO=pryv/open-pryv.io + echo "" + echo "· Setting up 'dest/' as clone of target repository (${TARGET_REPO})..." + echo "" + git clone git@github.com:${TARGET_REPO}.git dest + fi + echo "" + echo "· Cleaning 'dest/' folder contents..." + echo "" + rm -rf dest/* + echo "" + echo "✓ 'dest/' folder is ready for building." + echo "" + +# –––––––––––––---------------------------------------------------------------- +# Build +# –––––––––––––---------------------------------------------------------------- + +# Build to `dest/`, apply licensing info and rebuild package-lock +build *params: + node build/index.js + rm dest/package-lock.json + just license-build + cd dest/; npm install --package-lock-only + +# Build to `dest/`, without removing package-lock (use with care) +build-dirty *params: + node build/index.js + just license-build + +# –––––––––––––---------------------------------------------------------------- +# Misc. utils +# –––––––––––––---------------------------------------------------------------- + +# Run code linting +lint *params: + semistandard {{params}} + +# Apply licensing info to `build/` +license-build: + source-licenser --config-file dest/.licenser.yml ./dest + +# Apply licensing to repo +license: + source-licenser --config-file .licenser.yml ./ \ No newline at end of file diff --git a/licensing/README.md b/licensing/README.md deleted file mode 100644 index 9a4523a..0000000 --- a/licensing/README.md +++ /dev/null @@ -1,7 +0,0 @@ -- Licensing via https://github.com/pryv/source-licenser - - -# License -Copyright (C) 2012-2021 Pryv S.A. https://pryv.com - All Rights Reserved -Unauthorized copying of this file, via any medium is strictly prohibited -Proprietary and confidential diff --git a/licensing/config.yml b/licensing/config.yml deleted file mode 100644 index 96281f0..0000000 --- a/licensing/config.yml +++ /dev/null @@ -1,19 +0,0 @@ ---- -ignores: # If found in path contained elements will be ignored -- node_modules -- ".git" -- dist/ - -templating: ## Add your own values they will be replaced in fileSpecs and source licenseFile - AUTHOR_NAME: "Pryv S.A." - AUTHOR_EMAIL: info@pryv.com - AUTHOR_WEB: https://pryv.com - DESCRIPTION: "This package is part of Open Pryv.io" - HOMEPAGE: https://pryv.com - SPDX: BSD-3-Clause - -license: - year: ## Year value will be computed in the template as "YEARS" if start == end it will be just start otherwise START - END - start: 2020 - end: CURRENT_YEAR - diff --git a/overrides/.api-version b/overrides/.api-version new file mode 100644 index 0000000..8641eab --- /dev/null +++ b/overrides/.api-version @@ -0,0 +1 @@ +1.9.2-open \ No newline at end of file diff --git a/overrides/.eslintrc.yml b/overrides/.eslintrc.yml new file mode 100644 index 0000000..f90276d --- /dev/null +++ b/overrides/.eslintrc.yml @@ -0,0 +1,3 @@ +root: true +extends: 'semistandard' +ignorePatterns: ['build/test/pryv/*'] \ No newline at end of file diff --git a/overrides/.github/workflows/ci.yml b/overrides/.github/workflows/ci.yml new file mode 100644 index 0000000..f495a39 --- /dev/null +++ b/overrides/.github/workflows/ci.yml @@ -0,0 +1,46 @@ +name: Open Pryv.io CI + +on: + pull_request: + branches: + - '*' + push: + branches: + - '*' + +jobs: + build: + runs-on: ubuntu-22.04 + + strategy: + matrix: + node-version: [18.16.0] + + steps: + - name: Install `just` + uses: extractions/setup-just@v2 + + - name: Checkout repository with submodules + uses: actions/checkout@v4 + + - name: Install Node.js with version ${{ matrix.node-version }} + uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + + - name: Setup Open Pryv.io + run: | + npm run setup-dev-env + npm install + sudo apt-get install graphicsmagick + + - name: Run tests on Open Pryv.io with coverage + run: | + IS_CI=true just test-cover-lcov + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + slug: pryv/open-pryv.io \ No newline at end of file diff --git a/src-dest/.gitignore b/overrides/.gitignore.REMOVE_THIS_EXTENSION similarity index 73% rename from src-dest/.gitignore rename to overrides/.gitignore.REMOVE_THIS_EXTENSION index cfbbf70..d1a3b3b 100644 --- a/src-dest/.gitignore +++ b/overrides/.gitignore.REMOVE_THIS_EXTENSION @@ -1,13 +1,12 @@ var-pryv/ public_html/ app-web-auth3/ -dist/ node_modules/ -rec.la-certificates/ - +docker/dockerized-open-pryv +.nyc_output/ +coverage/ # not commiting this into OS version -test/ -test-helpers/ + service-mail/.github diff --git a/overrides/.licenser.yml b/overrides/.licenser.yml new file mode 100644 index 0000000..7699ded --- /dev/null +++ b/overrides/.licenser.yml @@ -0,0 +1,82 @@ +files: + "**/*.js": + header: + startBlock: | + /** + * @license + linePrefix: " * " + endBlock: " */" + + "**/package.json": + json: + force: + author: "{AUTHOR_NAME} <{AUTHOR_EMAIL}> ({AUTHOR_WEB})" + license: "{SPDX}" + private: true + defaults: + homepage: "{HOMEPAGE}" + description: "{DESCRIPTION}" + sortPackage: true + + siblingLicenseFile: + name: "LICENSE" + + "**/README.md": + footer: + startBlock: "\n\n# License\n\n" + linePrefix: "" + endBlock: "" + license: "[{SPDX}](LICENSE)" + +ignore: +- .git +- .vscode +- coverage +- node_modules +- test-results +- var-pryv +- service-mail/node_modules +- app-web-auth3 + +substitutions: + YEARS: + start: 2020 + end: CURRENT_YEAR + AUTHOR_NAME: "Pryv S.A." + AUTHOR_EMAIL: info@pryv.com + AUTHOR_WEB: https://pryv.com + DESCRIPTION: "This package is part of Open Pryv.io, a Pryv S.A. software" + HOMEPAGE: https://pryv.com + SPDX: BSD-3-Clause + +license: | + Copyright (C) {YEARS} {AUTHOR_NAME} {AUTHOR_WEB} + + This file is part of Open-Pryv.io and released under BSD-Clause-3 License + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + SPDX-License-Identifier: BSD-3-Clause diff --git a/overrides/CHANGELOG.md b/overrides/CHANGELOG.md new file mode 100644 index 0000000..a444ec2 --- /dev/null +++ b/overrides/CHANGELOG.md @@ -0,0 +1,182 @@ + +## 1.9 + +### 1.9.2 +- Refactored Attachments (Event Files) Logic to be modular for future cloud storage of files such as S3. + +### 1.9.1 +- Implemented ferretDB compatibility allowing full-open source modules +- Replaced rec.la by backloop.dev + +### 1.9.0 + +- Remove FlowType and convert (best-effort) typing information into JSDoc comments +- Update to MongoDB v6 +- Update to node v18 +- Stream deletion eventIds when deleting streams to avoid timeout +- Introduce platform DB for future cross-cores usage +- Unify SQLite usage across audit and storage +- Move attachments to per-user directories +- Finalize data-store API for first public release +- Many linting fixes +- Support for multiple CAA (certificate autorities issuer) +- Bug fixes: + - Non-reusable deleted streamIds when following auth process #484 + - SQLITE_BUSY error thrown in multi-core #487 + +## 1.8 + +### 1.8.1 + +- Fix migration 1.6.x to 1.8.0 bug + +### 1.8.0 + +- Add support for password rules: complexity, age, reuse; see API server's `auth.password*` settings + - Affected methods are: create user (`POST /users`), change password (`{user endpoint}/account/change-password`), reset password (`{user endpoint}/account/reset-password`) and login (`{user endpoint}/auth/login`) +- Add undocumented support for external stores (a.k.a. "data mapping" feature); see component `pryv-datastore` (will be published separately when appropriate) + +## 1.7 + +### 1.7.14 +- Fix crash caused by permissions selfRevoke used in combinaison with BACKWARD_COMPATIBILITY_SYSTEM_STREAMS_PREFIX set to true. +- Fix issue with `accesses.create` theand selfRevoke permissions that was only possible with a personalToken. + +### 1.7.13 + +- Fix another issue when BACKWARD_COMPATIBILITY_SYSTEM_STREAMS_PREFIX is set to "true" - children streams' ids were not following the correct format +- Fix a performance issue when querying events by type +- Fix an issue which caused the service not to restart properly in some situations + +### 1.7.12 + +- Fix issue when BACKWARD_COMPATIBILITY_SYSTEM_STREAMS_PREFIX is set to "true" - "account" streamId was handled as ".account" + +### 1.7.10 + +- API change: Don't coerce event content and simplify known type validation process in api-server +- serviceInfo:eventTypes URL now supports `file://` protocol allowing it to load definition from file system + +### 1.7.9 + +- Fix issue with events.getAttachment making core crash if filename contained fancy characters by putting it in the 'Content-disposition' header +- Security fix: make password reset token single-use +- Security fix: hide "newPassword" in logs when an error occurs in account.resetPassword + +### 1.7.7 + +- Fix issue where a deleted user was kept in the cache, thus rendering the reuse of username possible, but failing all subsequent calls as the password and tokens were not returned (since the wrong userId was returned by the cache) +- Fix issue where attempting to create streams with id 'size' would return an error +- Fix socket.io CORS issue + +### 1.7.6 + +- Fix access-info permissions + +### 1.7.5 + +- add missing system stream permissions accesses +- change __unique properties cleanup, just match them by key suffix, not from current serializer unique props. Avoids migration error if uniqueness has been modified. + + +### 1.7.1 + +- migrate tags into streams + +### 1.7.0 + +- introduce mall abstraction +- add integrity +- refactor access permissions logic + +## 1.6 + +### 1.6.21 + +Fixes: + +- fix boolean/bool event type that was not allowed +- fix HF null values for optional values that was not fully working + +Changes: + +- increase username characters limit to 60 + +### 1.6.20 + +- Implement system route to deactivate MFA + +### 1.6.18 + +- Fix welcome email: don't wait for welcome email sending before replying to client. + +### 1.6.16 + +- Fix versioning: update unique system events bug + +### 1.6.15 + +- Fix user deletion + +### 1.6.14 + +- personal token can delete an account +- add external licenser: pryv/app-node-licenser +- fix security issue with users registration conflicts leaking random email addresses + +### 1.6.13 + +- Unify configuration into boiler +- Fixes for Open Pryv.io + +### 1.6.12 + +Fixes: + +- versioning now works when trashing event + +### 1.6.7 + +New Features: + +- Stream queries for events.get + +Fixes: + +- usernames starting with "system" are available +- personal token expiration now fixed +- Users create call on core username error message now specifies that letters must be lowercase + +Changes: + +- In configuration, rename "singleNode" to "dnsLess", keeping retro-compatibility for "singleNode" with warning message + +Removals: + +- Deprecated "GET /who-am-i" API method removed +- Remove pryvuser-cli code (the image was not built since July) + +### 1.6.3 + +Custom Auth function now has access to all headers. + +### 1.6.2 + +- Fix migration that was skipping passwordHash leading to users not being able to login +- add errors if this cases arises + +### 1.6.1 + +Fixes for dnsLess/openSource: + +- /reg/service/info +- dependencies +- boost POST payload to 10MB for HF server + +### 1.6.0 + +system streams: + +- customizable (& extendable) unique and indexed account properties +- access to account properties through the events API with its access management +- user account deletion through administration API \ No newline at end of file diff --git a/src-dest/README.md b/overrides/README.md similarity index 52% rename from src-dest/README.md rename to overrides/README.md index d76090d..cde1f67 100644 --- a/src-dest/README.md +++ b/overrides/README.md @@ -1,3 +1,5 @@ +[![codecov](https://codecov.io/gh/pryv/open-pryv.io/graph/badge.svg?token=9HBYZUZT7U)](https://codecov.io/gh/pryv/open-pryv.io) + # Open Pryv.io ![Pryv-Logo](readme/logo-data-privacy-management-pryv.png) @@ -12,6 +14,11 @@ Maintained and developed by Pryv. ![Solution](readme/pryv.io-ecosystem.jpg) +## Digital Public Good + +![BPG BADGE](readme/dpg-badge.png) +Open-Pryv.io is recognized as a digital public good by [DPGAlliance](https://digitalpublicgoods.net/registry/) a UN-endorsed initiative that facilitates the discovery and deployment of open-source technologies. + ## Features - Provides latest Pryv.io core system ready for production @@ -25,8 +32,8 @@ Maintained and developed by Pryv. ## Documentation -- API Documentation & Guides: [api.pryv.com](https://api.pryv.com) -- Support: [support.pryv.com](https://support.pryv.com) +- API Documentation & Guides: [pryv.github.io](https://pryv.github.io) +- Support: [https://github.com/orgs/pryv/discussions](https://github.com/orgs/pryv/discussions) - More information about Pryv : [Pryv Home](https://pryv.com) ## Summary @@ -50,7 +57,6 @@ Choose your Set-up - Native installation - Launch Pryv.io on a server exposed to the Internet with built-in SSL, this requires to have a hostname pointing to the public IP of your server. - Download docker images (quick start) - - Launch image with Open Pryv.io installed on Exoscale hosting provider: [link to guide](https://api.pryv.com/image-exoscale-open-pryv.io/) (quick start including hosting) - Native installation - Launch Pryv.io on a server with an external SSL termination. You know what you are doing. - Download docker images @@ -58,7 +64,7 @@ Choose your Set-up ### Docker -The dockerized versions and their instructions are available at this link: [Download link](https://api.pryv.com/open-pryv.io/docker/dockerized-open-pryv.io.tgz). +The dockerized versions and their instructions are available at this link: [Download link](https://pryv.github.io/open-pryv.io/docker/dockerized-open-pryv-1.9.2.tgz). If you wish to build the images yourself, refer to the following README: [docker/README-build.md](docker/README-build.md). @@ -68,63 +74,51 @@ Once it is running, you can continue with the [tutorials](#start). *Prerequisites*: -- Node v12.13.1 [Node.js home page](https://nodejs.org/) -- Yarn v1 `npm install -g yarn` +- Node v18.14.2 [Node.js home page](https://nodejs.org/) The installation script has been tested on Linux Ubuntu 18.04 LTS and MacOSX. -- `yarn setup`: (see `scripts/` for details) - - Fetch dependencies - - Install mongodb - - Install service mail - - Install assets & app-web-auth3 - - Generate random alpha-numeric adminKey -- `yarn release` create distribution for release +1. `npm run setup-dev-env` to setup local file structure +2. `npm install` to install node modules -#### Native setup with external SSL +#### Native setup with no SSL [setup the environment](#native) -- `yarn pryv` - mail and database logs will be kept in `var-pryv/logs/local-*.log` - Each service independently - logs will be displayed on the console -- `yarn database` start mongodb -- `yarn api` start the API server on port 3000 (default) -- `yarn mail` start the mail service - -#### Local native setup +- `npm run database` start mongodb **or** start [ferretDB](./ferretDB/README.md) +- `npm run api` start the API server on port 3000 (default) +- `npm run mail` start the mail service -[setup the environment](#native) +#### Local native setup with backloop.dev loopback SSL -- `yarn local` is the equivalent of running `yarn pryv` + `yarn proxy` using `configs/rec-la.yml`. This setup is useful to test Open Pryv.io locally. - -- `yarn proxy` based on [rec-la](https://github.com/pryv/rec-la), it will expose the server running on http://localhost:3000 with an SSL certificate on https://my-computer.rec.la:4443 in this case you need to edit `configs/rec-la.yml`. - -#### Native Server setup with built-in SSL +[backloop.dev](https://backloop.dev) certificates facilitate local developpment by enabling https on localhost. [setup the environment](#native) +- `npm run database` to start mongodb **or** start [ferretDB](./ferretDB/README.md) +- (optional) `npm run mail` start the mail service +- `npm run apibackloop` to start api server using `configs/api-backloop.yml` -1. Run `yarn pryv` to start the API -2. Configure NGINX and certificate +You can now access you API from you own computer with SSL on +- `https://my-computer.backloop.dev:4443` -You can find a NGINX configuration that you can include in your `sites-enabled/` in [configs/site.conf](configs/site.conf). +You can check by opening [https://my-computer.backloop.dev:4443/reg/service/info](https://my-computer.backloop.dev:4443/reg/service/info) -You must change `${HOSTNAME}` to match the hostname of the public URL. +And create new users or access token from the [Pryv Access Token Generation Page](https://pryv.github.io/app-web-access/?pryvServiceInfoUrl=https://l.backloop.dev:4443/reg/service/info) -##### SSL certificate -Using [certbot](https://certbot.eff.org/), you can generate a SSL certificate for your platform using `sudo certbot --nginx -d ${HOSTNAME}`. +#### Native setup with custom SSL -To set an automatic renewal, run `crontab -e` and append the following line: +[setup the environment](#native) -```cron -0 12 * * * /usr/bin/certbot renew --quiet -``` +1. Edit `http:ssl` part in `./configs/api.yml` file to point to your certificates an key files. +2. Update `dnsLess:publicUrl` in `./configs/api.yml` to match +3. Run `npm run pryv` to start the API ### Config -For the native installation, edit `config.yml`, otherwise `docker/local/dockerized-config.yml`: +For the native installation, edit `./configs/api.yml` ```yaml dnsLess: @@ -133,8 +127,8 @@ http: port: 3000 ip: 127.0.0.1 auth: - adminAccessKey: iuahwd0ba87hw0bd7a8hwd - trustedApps: "*@https://pryv.github.io*, *@https://*.rec.la*" + adminAccessKey: REPLACE_ME + trustedApps: "*@https://pryv.github.io*, *@https://*.rec.la*, *@https://*.backloop.dev*" eventFiles: attachmentsDirPath: var-pryv/attachment-files service: @@ -142,7 +136,7 @@ service: support: https://pryv.com/open-pryv-non-configured-page/ terms: https://pryv.com/open-pryv-non-configured-page/ home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json + eventTypes: https://pryv.github.io/event-types/flat.json services: email: enabled: @@ -158,34 +152,36 @@ services: - **auth** - **adminAccesskey** key to use for system calls such as `/reg/admin/users`. A random key should be generated on setup. - **trustedApps** list of web apps that can be trusted-app functionalities - API for trusted apps: [API reference](https://api.pryv.com/reference/) - see: [SETUP Guide - customize authentication](https://api.pryv.com/customer-resources/pryv.io-setup/#customize-authentication-registration-and-reset-password-apps) -- **eventFiles** - - **attachmentsDirPath** Directory where event attachment files will be stored on the file system. -- **service** [API documentation on Service Information](https://api.pryv.com/reference/#service-info) + API for trusted apps: [API reference](https://pryv.github.io/reference/) + see: [SETUP Guide - customize authentication](https://pryv.github.io/customer-resources/pryv.io-setup/#customize-authentication-registration-and-reset-password-apps) +- **service** [API documentation on Service Information](https://pryv.github.io/reference/#service-info) - **services:email** see [Options & Customization](#custom-email) below ## Start At this moment you should have your application running on the public URL you defined. -- Create an account and launch the [authentication process](https://api.pryv.com/reference/#authenticate-your-app) on **App-Web-Access**: [https://api.pryv.com/app-web-access/?pryvServiceInfoUrl=https://my-computer.rec.la:4443/reg/service/info](https://api.pryv.com/app-web-access/?pryvServiceInfoUrl=https://my-computer.rec.la:4443/reg/service/info). -- The service info URL to your platform is: [https://my-computer.rec.la:4443/reg/service/info](https://my-computer.rec.la:4443/reg/service/info) +- Create an account and launch the [authentication process](https://pryv.github.io/reference/#authenticate-your-app) on **App-Web-Access**: [https://pryv.github.io/app-web-access/?pryvServiceInfoUrl=https://my-computer.backloop.dev:4443/reg/service/info](https://pryv.github.io/app-web-access/?pryvServiceInfoUrl=https://my-computer.backloop.dev:4443/reg/service/info). +- The service info URL to your platform is: [https://my-computer.backloop.dev:4443/reg/service/info](https://my-computer.backloop.dev:4443/reg/service/info) -If you are using another public URL, replace `https://my-computer.rec.la:4443` by it in the link above. +If you are using another public URL, replace `https://my-computer.backloop.dev:4443` by it in the link above. ### Design your Data Model -Data in Pryv is stored in streams and events. We provide you with all necessary information to design your own data model in our [Data Modelling Guide](https://api.pryv.com/guides/data-modelling/) through a broad range of use cases and scenarios you might encounter. +Data in Pryv is stored in streams and events. We provide you with all necessary information to design your own data model in our [Data Modelling Guide](https://pryv.github.io/guides/data-modelling/) through a broad range of use cases and scenarios you might encounter. ### Try the API -After this process, you should have an account on your Open Pryv.io platform with a valid authorization token in the form of an API endpoint, you can try various **API requests** using **Postman** following this guide [https://api.pryv.com/open-api/](https://api.pryv.com/open-api/). +After this process, you should have an account on your Open Pryv.io platform with a valid authorization token in the form of an API endpoint, you can try various **API requests** using **Postman** following this guide [https://pryv.github.io/open-api/](https://pryv.github.io/open-api/). You can also try our [example apps with guides and tutorials](https://github.com/pryv/example-apps-web/). ## Options & Customization +### From version 1.9.2 OpenPryv.io supports Full MongoDB/FerretDB + +Read [README-DBs](README-DBs.md) for more information. + ### Authentication & Registration web app. Open Pryv.io comes packaged with [app-web-auth3](https://github.com/pryv/app-web-auth3), the default web pages for app authentication, user registration and password reset. @@ -197,13 +193,17 @@ To use a new build, simply copy the contents of the generated files from `app-we ### Event types Open Pryv.io comes with default **event types**. -The default ones are fetched at boot from the URL defined in service:eventTypes in the `.yml` config file, set to https://api.pryv.com/event-types/flat.json. +The default ones are fetched at boot from the URL defined in service:eventTypes in the `.yml` config file, set to https://pryv.github.io/event-types/flat.json. To customize your own, clone the [Data Types repository](https://github.com/pryv/data-types) and follow the guide there. ### MongoDB data folder -By default the MongoDB data are stored in `var-pryv/mongodb-data`. If you want to modify the folder where the MongoDB data files are stored, you can modify in `scripts/setup-mongodb.bash` the variable `MONGO_DATA_FOLDER`. +By default the MongoDB data are stored in `var-pryv/mongodb-data`. If you want to modify the folder where the MongoDB data files are stored, read [ferretDB README](./ferretDB/README.md). + +### FerretDB data folder + +By default the FerretDB data are stored in `var-pryv/ferretdb-data`. If you want to modify the folder where the FerretDB data files are stored, you can modify in `scripts/setup-mongodb` the variable `MONGO_DATA_FOLDER`. ### Visual assets and icons @@ -214,7 +214,7 @@ Your platforms visuals can be customized in `public_html/assets/`, please refer Pryv.io can send e-mails at registration and password reset request. -The emails can be sent either by local sendmail (default) or SMTP. +The emails can be sent either by local sendmail (default) or SMTP. This service, its documentation and mail templates can be found in [`service-mail/`](service-mail/). @@ -228,11 +228,11 @@ To make a backup of your data: ### Backup: native -Run `./scripts/backup-database-native.sh ${BACKUP_FOLDER}` to generate a dump of the current database contents -Run `./scripts/backup-attachments-native.sh ${BACKUP_FOLDER}` to copy the current attachment files. +Run `./scripts/backup-database-native ${BACKUP_FOLDER}` to generate a dump of the current database contents +Run `./scripts/backup-usersfiles-native ${BACKUP_FOLDER}` to copy the current usersfiles files. -To restore the database, run `./scripts/restore-database-native.sh ${BACKUP_FOLDER}` to restore data from the provided backup folder. -To restore attachments, run `./scripts/restore-attachments-native.sh ${BACKUP_FOLDER}` to restore data from the provided backup folder. +To restore the database, run `./scripts/restore-database-native ${BACKUP_FOLDER}` to restore data from the provided backup folder. +To restore attachments, run `./scripts/restore-usersfiles-native ${BACKUP_FOLDER}` to restore data from the provided backup folder. Depending on your setup, you may need additional access rights. ### Backup: dockerized @@ -245,33 +245,4 @@ Contributions are welcome. Get in touch with the Pryv team or submit a PR with y ## License -Copyright (c) 2020 Pryv S.A. https://pryv.com - -This file is part of Open-Pryv.io and released under BSD-Clause-3 License - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -SPDX-License-Identifier: BSD-3-Clause +[BSD-3-Clause](LICENSE) diff --git a/src-dest/SECURITY.md b/overrides/SECURITY.md similarity index 73% rename from src-dest/SECURITY.md rename to overrides/SECURITY.md index a409041..0b8589e 100644 --- a/src-dest/SECURITY.md +++ b/overrides/SECURITY.md @@ -6,4 +6,4 @@ If you think you have discovered a security issue in open-pryv.io, we'd love to We will take all security bugs seriously and if confirmed upon investigation we will patch it within a reasonable amount of time. -You can email the security bug to our [support team](mailto:support@pryv.com). +You can report the security bug to our [support team](https://github.com/pryv/open-pryv.io/issues). diff --git a/overrides/components/api-server/README.md b/overrides/components/api-server/README.md new file mode 100644 index 0000000..810a787 --- /dev/null +++ b/overrides/components/api-server/README.md @@ -0,0 +1,5 @@ +#### Please refer to the root README.md + +## License + +[BSD-3-Clause](LICENSE) diff --git a/src-dest/components/api-server/config/components/systemStreams/additionalDefaultAccountStreams.json b/overrides/components/api-server/config/components/systemStreams/additionalDefaultAccountStreams.json similarity index 100% rename from src-dest/components/api-server/config/components/systemStreams/additionalDefaultAccountStreams.json rename to overrides/components/api-server/config/components/systemStreams/additionalDefaultAccountStreams.json diff --git a/overrides/components/api-server/config/override-config.yml b/overrides/components/api-server/config/override-config.yml new file mode 100644 index 0000000..057f824 --- /dev/null +++ b/overrides/components/api-server/config/override-config.yml @@ -0,0 +1,7 @@ +openSource: + isActive: true +dnsLess: + isActive: true +service: + features: + noHF: true \ No newline at end of file diff --git a/overrides/components/api-server/src/methods/webhooks.js b/overrides/components/api-server/src/methods/webhooks.js new file mode 100644 index 0000000..a2472b3 --- /dev/null +++ b/overrides/components/api-server/src/methods/webhooks.js @@ -0,0 +1,9 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +module.exports = function () {}; + +/** @typedef {object} WebhooksSettingsHolder */ diff --git a/licensing/LICENSE.src b/overrides/components/audit/LICENSE similarity index 75% rename from licensing/LICENSE.src rename to overrides/components/audit/LICENSE index dfb0f83..64cfc44 100644 --- a/licensing/LICENSE.src +++ b/overrides/components/audit/LICENSE @@ -1,4 +1,4 @@ -Copyright (C) {YEARS} {AUTHOR_NAME} {AUTHOR_WEB} +Copyright (C) 2019–2025 Pryv https://pryv.com This file is part of Open-Pryv.io and released under BSD-Clause-3 License @@ -6,15 +6,15 @@ Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. 3. Neither the name of the copyright holder nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. + may be used to endorse or promote products derived from this software + without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE @@ -27,4 +27,4 @@ CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -SPDX-License-Identifier: BSD-3-Clause \ No newline at end of file +SPDX-License-Identifier: BSD-3-Clause diff --git a/src-dest/components/audit/package.json b/overrides/components/audit/package.json similarity index 74% rename from src-dest/components/audit/package.json rename to overrides/components/audit/package.json index 57a5439..8788c78 100644 --- a/src-dest/components/audit/package.json +++ b/overrides/components/audit/package.json @@ -4,8 +4,8 @@ "private": true, "description": "Dummy Audit Logic", "homepage": "http://pryv.com", - "license": "UNLICENSED", - "author": "Pryv S.A. (https://pryv.com)", + "license": "BSD-3-Clause", + "author": "Pryv (https://pryv.com)", "main": "src/index.js", "scripts": { "test": "echo 'hi, I have no tests, but the component needs to exist'" diff --git a/overrides/components/audit/src/MethodContextUtils.js b/overrides/components/audit/src/MethodContextUtils.js new file mode 100644 index 0000000..b62acee --- /dev/null +++ b/overrides/components/audit/src/MethodContextUtils.js @@ -0,0 +1,27 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +function setAuditAccessId (accessId) { + return function (context, params, result, next) { + next(); + }; +} + +const AuditAccessIds = { + VALID_PASSWORD: 'valid-password', + PASSWORD_RESET_REQUEST: 'password-reset-request', + PASSWORD_RESET_TOKEN: 'password-reset-token', + ADMIN_TOKEN: 'admin', + PUBLIC: 'public', + INVALID: 'invalid' +}; + +Object.freeze(AuditAccessIds); + +module.exports = { + setAuditAccessId, + AuditAccessIds +}; diff --git a/overrides/components/business/src/index.js b/overrides/components/business/src/index.js new file mode 100644 index 0000000..f3e139d --- /dev/null +++ b/overrides/components/business/src/index.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +module.exports = { + accesses: require('./accesses'), + types: require('./types'), + integrity: require('./integrity'), + webhooks: { Webhook: {} }, + users: require('./users'), + MethodContext: require('./MethodContext') +}; diff --git a/overrides/components/business/src/series/data_matrix.js b/overrides/components/business/src/series/data_matrix.js new file mode 100644 index 0000000..c284c72 --- /dev/null +++ b/overrides/components/business/src/series/data_matrix.js @@ -0,0 +1,9 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +module.exports = { + DataMatrix: null +}; diff --git a/overrides/components/business/src/series/influx_connection.js b/overrides/components/business/src/series/influx_connection.js new file mode 100644 index 0000000..e67574d --- /dev/null +++ b/overrides/components/business/src/series/influx_connection.js @@ -0,0 +1,9 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +class InfluxConnection {} + +module.exports = InfluxConnection; diff --git a/overrides/components/business/src/series/repository.js b/overrides/components/business/src/series/repository.js new file mode 100644 index 0000000..b3930e7 --- /dev/null +++ b/overrides/components/business/src/series/repository.js @@ -0,0 +1,9 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +class InfluxRepository {} + +module.exports = InfluxRepository; diff --git a/overrides/components/business/src/types/influx_row_type.js b/overrides/components/business/src/types/influx_row_type.js new file mode 100644 index 0000000..4f8471e --- /dev/null +++ b/overrides/components/business/src/types/influx_row_type.js @@ -0,0 +1,6 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ diff --git a/overrides/components/nats/LICENSE b/overrides/components/nats/LICENSE new file mode 100644 index 0000000..64cfc44 --- /dev/null +++ b/overrides/components/nats/LICENSE @@ -0,0 +1,30 @@ +Copyright (C) 2019–2025 Pryv https://pryv.com + +This file is part of Open-Pryv.io and released under BSD-Clause-3 License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +SPDX-License-Identifier: BSD-3-Clause diff --git a/overrides/components/nats/index.js b/overrides/components/nats/index.js new file mode 100644 index 0000000..f483e6b --- /dev/null +++ b/overrides/components/nats/index.js @@ -0,0 +1,12 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +module.exports = { + connect: null, + JSONCodec: function () { + return { encode: null, decode: null }; + } +}; diff --git a/overrides/components/nats/package.json b/overrides/components/nats/package.json new file mode 100644 index 0000000..16727f9 --- /dev/null +++ b/overrides/components/nats/package.json @@ -0,0 +1,13 @@ +{ + "name": "nats", + "version": "0.0.0", + "private": true, + "description": "Fake Nats", + "homepage": "https://pryv.com", + "license": "BSD-3-Clause", + "author": "Pryv (https://pryv.com)", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + } +} \ No newline at end of file diff --git a/overrides/components/previews-server/README.md b/overrides/components/previews-server/README.md new file mode 100644 index 0000000..810a787 --- /dev/null +++ b/overrides/components/previews-server/README.md @@ -0,0 +1,5 @@ +#### Please refer to the root README.md + +## License + +[BSD-3-Clause](LICENSE) diff --git a/overrides/components/register/LICENSE b/overrides/components/register/LICENSE new file mode 100644 index 0000000..64cfc44 --- /dev/null +++ b/overrides/components/register/LICENSE @@ -0,0 +1,30 @@ +Copyright (C) 2019–2025 Pryv https://pryv.com + +This file is part of Open-Pryv.io and released under BSD-Clause-3 License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +SPDX-License-Identifier: BSD-3-Clause diff --git a/overrides/components/register/package.json b/overrides/components/register/package.json new file mode 100644 index 0000000..39c34c2 --- /dev/null +++ b/overrides/components/register/package.json @@ -0,0 +1,18 @@ +{ + "name": "register", + "version": "0.1.9", + "private": true, + "description": "Pryv Register component", + "homepage": "https://pryv.com", + "license": "BSD-3-Clause", + "author": "Pryv (https://pryv.com)", + "main": "src/index.js", + "scripts": { + "_test": "NODE_ENV=test ../../node_modules/.bin/mocha --reporter=dot 'test/**/*.test.js' --exit", + "test": "npm run _test --logs:console:active=false" + }, + "dependencies": { + "winston": "^2.3.0" + }, + "devDependencies": {} +} \ No newline at end of file diff --git a/src-dest/components/register/source/business/dataservers.js b/overrides/components/register/src/business/dataservers.js similarity index 50% rename from src-dest/components/register/source/business/dataservers.js rename to overrides/components/register/src/business/dataservers.js index b9e8b7a..e7c30cf 100644 --- a/src-dest/components/register/source/business/dataservers.js +++ b/overrides/components/register/src/business/dataservers.js @@ -1,7 +1,12 @@ - +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ const home = require('../config').get('service').home; const publicUrl = require('../config').get('publicUrl'); - +/** @returns {{ regions: { region1: { name: string; zones: { zone1: { name: string; hostings: { hosting1: { url: any; name: string; description: string; available: boolean; availableCore: any; }; }; }; }; }; }; }} */ function getHostings() { return { regions: { @@ -12,7 +17,7 @@ function getHostings() { name: 'zone1', hostings: { hosting1: { - url: home, // here we set the sole dynamic var + url: home, name: 'Pryv.io', description: 'Self hosted', available: true, @@ -23,14 +28,14 @@ function getHostings() { } } } - } + }; } - -function getCoreForHosting( - hosting: string, callback: HostForHostingCallback -) { +/** @param {string} hosting + * @param {HostForHostingCallback} callback + * @returns {void} + */ +function getCoreForHosting(hosting, callback) { callback(null, 'http://localhost:3000'); } - exports.getHostings = getHostings; -exports.getCoreForHosting = getCoreForHosting; \ No newline at end of file +exports.getCoreForHosting = getCoreForHosting; diff --git a/overrides/components/register/src/config.js b/overrides/components/register/src/config.js new file mode 100644 index 0000000..6eccc14 --- /dev/null +++ b/overrides/components/register/src/config.js @@ -0,0 +1,41 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const wwwPath = require('../../api-server/src/routes/Paths').WWW; +const { getConfig } = require('@pryv/boiler'); + +const config = { + 'auth:authorizedKeys': {}, + 'dns:domain': 'open-pryv.io', + appList: [], + 'dnsLess:isActive': true +}; + +module.exports = { + get: function (key) { + return config[key]; + }, + loadSettings: async function () { + const settings = await getConfig(); + config.service = settings.get('service'); + let settingPublicUrl = settings.get('dnsLess:publicUrl'); + if (settingPublicUrl.slice(-1) !== '/') { + settingPublicUrl += '/'; + } + const pathPublicUrl = settingPublicUrl.slice(0, -1); + config.publicUrl = settingPublicUrl; + config['access:trustedAuthUrls'] = [settingPublicUrl]; + config['access:defaultAuthUrl'] = [ + pathPublicUrl + wwwPath + '/access/access.html' + ]; + + // load admin keys + config.adminKey = settings.get('auth:adminAccessKey'); + if (config.adminKey) { + config['auth:authorizedKeys'][config.adminKey] = { roles: ['admin'] }; + } + } +}; diff --git a/overrides/components/register/src/index.js b/overrides/components/register/src/index.js new file mode 100644 index 0000000..55d4be2 --- /dev/null +++ b/overrides/components/register/src/index.js @@ -0,0 +1,56 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const database = require('./storage/database'); +const config = require('./config'); + +const headPath = require('api-server/src/routes/Paths').Register; + +class ExpressMock { + constructor (expressApp) { + this.app = expressApp; + } + + use (fn) { + this.app.use(headPath, fn); + } + + get (path, cb1, cb2) { + if (cb2) { + return this.app.get(headPath + path, cb1, cb2); + } + this.app.get(headPath + path, cb1); + } + + post (path, cb1, cb2) { + if (cb2) { + return this.app.post(headPath + path, cb1, cb2); + } + this.app.post(headPath + path, cb1); + } +} + +module.exports = async (expressApp) => { + await config.loadSettings(); + await database.init(); + + const app = new ExpressMock(expressApp); + // public API routes + require('./routes/email')(app); + require('./routes/service')(app); + require('./routes/access')(app); + require('./routes/admin')(app); + require('./routes/server')(app); + require('./routes/users')(app); + require('./middleware/app-errors')(app); + + // register all reg routes + expressApp.all(headPath + '/*', function (req, res, next) { + res + .status(404) + .send({ id: 'unkown-route', message: 'Unknown route: ' + req.path }); + }); +}; diff --git a/overrides/components/register/src/storage/database.js b/overrides/components/register/src/storage/database.js new file mode 100644 index 0000000..9699471 --- /dev/null +++ b/overrides/components/register/src/storage/database.js @@ -0,0 +1,154 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const { getUsersRepository } = require('business/src/users/repository'); +const { getPlatform } = require('platform'); +let platform = null; +let usersRepository = null; + +exports.init = async function init() { + platform = await getPlatform(); + usersRepository = await getUsersRepository(); +} + +/** + * Check if an email address exists in the database + * @param {string} email : the email address to verify + * @param {GenericCallback} callback : function(error,result), result being 'true' if it exists, 'false' otherwise + * @returns {void} + */ +function emailExists(email, callback) { + email = email.toLowerCase(); + getUIDFromMail(email, function (error, username) { + callback(error, username !== null); + }); +} +exports.emailExists = emailExists; +/** + * Check if an user id exists in the database + * @param uid: the user id to verify + * @param callback: function(error,result), result being 'true' if it exists, 'false' otherwise + */ +exports.uidExists = async function (uid, callback) { + try { + const username = uid.toLowerCase(); + const exists = await usersRepository.usernameExists(username); + return callback(null, exists); + } catch (err) { + return callback(err); + } +}; +/** + * Get the server linked with provided user id + * @param uid: the user id + * @param callback: function(error,result), result being the server name + */ +exports.getServer = function (uid, callback) { + return callback(null, 'SERVER_NAME'); +}; +/** + * Get user id linked with provided email address + * @param {string} mail : the email address + * @param {GenericCallback} callback : function(error,result), result being the requested user id + * @returns {void} + */ +async function getUIDFromMail(mail, callback) { + try { + const cleanmail = mail.toLowerCase(); + platform.getLocalUsersUniqueField('email', cleanmail).then( + (result) => { callback(null, result); }, + (error) => { callback(error, null); } + ); + } catch (err) { + return callback(err, null); + } +} +exports.getUIDFromMail = getUIDFromMail; +/** + * Get all users + * @returns {Users[]} + */ +async function getAllUsers() { + // we are missing here 'server' and 'referer' + const usersNamesAndIds = await usersRepository.getAllUsersIdAndName(); + const result = []; + for(const userNameAndId of usersNamesAndIds) { + const user = await usersRepository.getUserById(userNameAndId.id); + if (user == null) { + console.log('XXXXX Null user', userNameAndId); + } else { + const userAccountInfos = user.getFullAccount(); + let registeredTimestamp = Number.MAX_SAFE_INTEGER; + // deduct creation data from smallest ceatedAt date in event + for (const event of user.events) { + if (event.created < registeredTimestamp) registeredTimestamp = event.created; + } + const userInfos = Object.assign({ id: userNameAndId.id, username: userNameAndId.username , registeredTimestamp }, userAccountInfos); + result.push(userInfos); + } + } + return result; +} +exports.getAllUsers = getAllUsers; +const dbAccessState = {}; +/** + * Update the state of an access in the database + * @param key: the database key for this access + * @param value: the new state of this access + * @param callback: function(error,result), result being the result of the database transaction + */ +exports.setAccessState = function (key, value, callback) { + dbAccessState[key] = { value: value, time: Date.now() }; + callback(null, value); // callback anyway +}; +/** Get the current state of an access in the database. + * + * @param key {string} - the database key for this access + * @param callback {nodejsCallback} - result being the corresponding JSON + * database entry + */ +exports.getAccessState = function (key, callback) { + const res = dbAccessState[key]; + callback(null, res ? res.value : null); +}; +/** + * Timer to autoclean dbAccessState + * @returns {void} + */ +function cleanAccessState() { + const expired = Date.now() - 60 * 10 * 1000; // 10 minutes + try { + Object.keys(dbAccessState).forEach((key) => { + if (dbAccessState[key].time < expired) delete dbAccessState[key]; + }); + } catch (e) { + console.log(e); + } + setTimeout(cleanAccessState, 60 * 1000); // check every minutes +} +cleanAccessState(); // launch cleaner +let QUERY_GET_ALL = null; +/** @returns {any} */ + +/** @typedef {(err?: Error | null, res?: T | null) => unknown} GenericCallback */ +/** @typedef {GenericCallback} Callback */ +/** + * @typedef {{ + * status: "NEED_SIGNIN" | "REFUSED" | "ERROR" | "ACCEPTED" + * // HTTP Status Code to send when polling. + * code: number + * // Poll Key + * key?: string + * requestingAppId?: string + * requestedPermissions?: PermissionSet + * url?: string + * poll?: string + * returnURL?: string | null + * oauthState?: OAuthState + * poll_rate_ms?: number + * }} AccessState + */ +/** @typedef {string | null} OAuthState */ diff --git a/overrides/components/register/src/storage/invitations.js b/overrides/components/register/src/storage/invitations.js new file mode 100644 index 0000000..301c520 --- /dev/null +++ b/overrides/components/register/src/storage/invitations.js @@ -0,0 +1,14 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/** + * Check the validity of the invitation token + * @param token: the token to be validated + * @param callback: function(result), result being 'true' if the token is valid, false otherwise + */ +exports.checkIfValid = function checkIfValid (token, callback) { + return callback(true); // eslint-disable-line n/no-callback-literal +}; diff --git a/overrides/components/register/src/storage/reserved-userid.js b/overrides/components/register/src/storage/reserved-userid.js new file mode 100644 index 0000000..6060730 --- /dev/null +++ b/overrides/components/register/src/storage/reserved-userid.js @@ -0,0 +1,18 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +const reservedWords = ['access', 'reg', 'register', 'service', 'system']; + +exports.useridIsReserved = function (userid, callback) { + if (!userid) { + return null; + } + userid = userid.toLowerCase(); + if (/^(pryv)+(.*)$/.test(userid)) { + return callback(null, true); + } + callback(null, reservedWords.includes(userid)); +}; diff --git a/overrides/components/register/src/storage/users.js b/overrides/components/register/src/storage/users.js new file mode 100644 index 0000000..efded54 --- /dev/null +++ b/overrides/components/register/src/storage/users.js @@ -0,0 +1,97 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/** + * Extension of database.js dedicated to user management + */ +const db = require('./database'); +const domain = '.' + require('../config').get('dns:domain'); +const info = require('../business/service-info'); +const Pryv = require('pryv'); +/** + * Create (register) a new user + * + * @param host the hosting for this user + * @param user the user data, a json object containing: username, password hash, language and email + * @param callback function(error,result), result being a json object containing new user data + */ +exports.create = function create(host, inUser, callback) { + const user = structuredClone(inUser); + // We store usernames and emails as lower case, allowing comparison with any + // other lowercase string. + user.username = user.username.toLowerCase(); + user.email = user.email.toLowerCase(); + // Construct the request for core, including the password. + const request = { + username: user.username, + passwordHash: user.passwordHash, + language: user.language, + email: user.email + }; + // Remove to forget the password + delete user.passwordHash; + delete user.password; + db.createUser(request, function (error, result) { + if (error) return callback(error, null); + if (!result || !result.id) + return callback(new Error('Invalid answer from core'), null); + callback(error, { + username: user.username, + server: user.username + domain, + apiEndpoint: Pryv.Service.buildAPIEndpoint(info, user.username, null) + }); + }); +}; +/** + * Get a list of users on a specific server + * @param serverName: the name of the server + * @param callback: function(error, result), result being an array of users + */ +exports.getUsersOnServer = function (serverName, callback) { + getAllUsersInfos(callback); +}; +/** + * Get a list of all user's information (see getUserInfos) + * @param {GenericCallback>} callback : function(error, result), result being a list of information for all users + * @returns {void} + */ +async function getAllUsersInfos(callback) { + try { + const allUsers = await db.getAllUsers(); + return callback(null, allUsers); + } catch (err) { + return callback(err, null); + } +} +exports.getAllUsersInfos = getAllUsersInfos; + +/** @typedef {(err?: Error | null, res?: T | null) => unknown} GenericCallback */ +/** @typedef {GenericCallback} Callback */ +/** + * @typedef {{ + * id?: string + * username: string + * email: string + * language: string + * password: string + * passwordHash: string + * invitationToken: string + * registeredTimestamp?: number + * server?: string + * }} UserInformation + */ +/** + * @typedef {{ + * username: string + * server: string + * apiEndpoint: string + * }} CreateResult + */ +/** + * @typedef {{ + * [name: string]: number + * }} ServerUsageStats + */ diff --git a/src-dest/components/register/test/acceptance/access.test.js b/overrides/components/register/test/acceptance/access.test.js similarity index 65% rename from src-dest/components/register/test/acceptance/access.test.js rename to overrides/components/register/test/acceptance/access.test.js index f343f6e..67021de 100644 --- a/src-dest/components/register/test/acceptance/access.test.js +++ b/overrides/components/register/test/acceptance/access.test.js @@ -1,3 +1,11 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/* global describe, it, before, after */ + require('test-helpers/src/api-server-tests-config'); const { context } = require('api-server/test/test-helpers'); const regPath = require('api-server/src/routes/Paths').Register; @@ -6,10 +14,11 @@ const cuid = require('cuid'); const chai = require('chai'); const assert = chai.assert; -const expect = chai.expect; + +let server; describe('access', function () { - this.timeout(1000000); + this.timeout(10000); before(async () => { server = await context.spawn(); }); @@ -20,11 +29,12 @@ describe('access', function () { it('[RE5T] POST /access', async () => { const res = await requestAccess(); assert.equal(res.status, 'NEED_SIGNIN'); - await new Promise(r => setTimeout(r, 10000)); + await new Promise((resolve) => setTimeout(resolve, 1000)); }); - it('[RE6T] POST /access/invitationtoken/check', async () => { - const res = await server.request() + it('[RE6T] POST /access/invitationtoken/check', async () => { + const res = await server + .request() .post(regPath + '/access/invitationtoken/check') .send({ invitationToken: cuid() }); assert.equal(res.status, 200); @@ -38,9 +48,10 @@ describe('access', function () { }); it('[RE8T] GET /access/:key', async () => { - const res = await server.request() + const res = await server + .request() .get(regPath + '/access/' + key) - .set('Accept', 'application/json');; + .set('Accept', 'application/json'); assert.equal(res.status, 201); assert.equal(res.body.status, 'NEED_SIGNIN'); @@ -52,33 +63,35 @@ describe('access', function () { apiEndPoint: 'http://dummy/dummy', username: 'dummy', token: cuid() - } - const res = await server.request() + }; + const res = await server + .request() .post(regPath + '/access/' + key) .send(accessACCEPTED) - .set('Accept', 'application/json');; + .set('Accept', 'application/json'); assert.equal(res.status, 200); assert.equal(res.body.status, 'ACCEPTED'); }); }); }); -async function requestAccess() { +async function requestAccess () { const accessRequestData = { - "requestingAppId": "test-app-id", - "requestedPermissions": [ + requestingAppId: 'test-app-id', + requestedPermissions: [ { - "streamId": "diary", - "level": "read", - "defaultName": "Journal" + streamId: 'diary', + level: 'read', + defaultName: 'Journal' } ], - "languageCode": "fr" + languageCode: 'fr' }; - const res = await server.request() + const res = await server + .request() .post(regPath + '/access/') .send(accessRequestData) .set('Accept', 'application/json'); assert.equal(res.status, 201); return res.body; -} \ No newline at end of file +} diff --git a/src-dest/components/register/test/acceptance/admin.test.js b/overrides/components/register/test/acceptance/admin.test.js similarity index 65% rename from src-dest/components/register/test/acceptance/admin.test.js rename to overrides/components/register/test/acceptance/admin.test.js index a4e5661..8dbf395 100644 --- a/src-dest/components/register/test/acceptance/admin.test.js +++ b/overrides/components/register/test/acceptance/admin.test.js @@ -1,30 +1,40 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/* global describe, it, before, after */ + require('test-helpers/src/api-server-tests-config'); const { databaseFixture } = require('test-helpers'); -const { produceMongoConnection, context } = require('api-server/test/test-helpers'); +const { + produceMongoConnection, + context +} = require('api-server/test/test-helpers'); const regPath = require('api-server/src/routes/Paths').Register; -const config = require('api-server/config/test.json'); -const adminKey = config.auth.adminAccessKey; +const { getConfig } = require('@pryv/boiler'); const cuid = require('cuid'); const chai = require('chai'); const assert = chai.assert; - describe('register /admin', function () { - let user; + let server, email, adminKey; this.timeout(10000); let mongoFixtures; before(async function () { + const config = await getConfig(); + adminKey = config.get('auth:adminAccessKey'); mongoFixtures = databaseFixture(await produceMongoConnection()); }); after(() => { mongoFixtures.clean(); }); - let username; before(() => { username = cuid().substr(5); @@ -39,14 +49,15 @@ describe('register /admin', function () { }); before(async function () { - user = await mongoFixtures.user(username, { - email: email, + await mongoFixtures.user(username, { + email, created: Date.now() / 1000 }); }); - it('[6TZE] /admin/users ', async function () { - const res = await server.request() + it('[6TZE] /admin/users ', async function () { + const res = await server + .request() .get(regPath + '/admin/users') .set('Authorization', adminKey) .set('Accept', 'application/json'); @@ -58,6 +69,4 @@ describe('register /admin', function () { assert.exists(user.email); } }); - - -}); \ No newline at end of file +}); diff --git a/overrides/components/register/test/acceptance/email.test.js b/overrides/components/register/test/acceptance/email.test.js new file mode 100644 index 0000000..4a38033 --- /dev/null +++ b/overrides/components/register/test/acceptance/email.test.js @@ -0,0 +1,116 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/* global describe, it, before, after */ + +const { databaseFixture } = require('test-helpers'); +const { + produceMongoConnection, + context +} = require('api-server/test/test-helpers'); +const regPath = require('api-server/src/routes/Paths').Register; + +const cuid = require('cuid'); + +const chai = require('chai'); +const assert = chai.assert; + +describe('register /email', function () { + let server, email; + + let mongoFixtures; + before(async function () { + mongoFixtures = databaseFixture(await produceMongoConnection()); + }); + after(() => { + mongoFixtures.clean(); + }); + + let username; + before(() => { + username = cuid().substr(5); + email = username + '@pryv.io'; + }); + + before(async () => { + server = await context.spawn(); + }); + after(() => { + server.stop(); + }); + + before(async function () { + await mongoFixtures.user(username, { + email + }); + }); + + describe('GET /:email/check_email', function () { + it('[RET1] should return item-already-exists if email exists ', async function () { + + const res = await server + .request() + .get(regPath + '/' + email + '/check_email') + .set('Accept', 'application/json'); + assert.equal(res.status, 200); + const body = res.body; + assert.exists(res.body.exists); + assert.equal(res.body.exists, true); + }); + + it('[RER1] should return false if email does not exists ', async function () { + const wrongEmail = cuid().substr(5) + '@toto.com'; + const res = await server + .request() + .get(regPath + '/' + wrongEmail + '/check_email') + .set('Accept', 'application/json'); + assert.equal(res.status, 200); + assert.equal(res.body.exists, false); + }); + }); + + describe('POST /email/check', function () { + const callPath = regPath + '/email/check'; + it('[REZ7] should return 410 gone resource', async function () { + const res = await server.request().post(callPath).send({ email }); + assert.equal(res.status, 410); + }); + }); + + const calls = ['uid', 'username']; + for (let i = 0; i < calls.length; i++) { + const call = calls[i]; + describe('GET /:email/' + call, function () { + it( + '[RET' + (i + 1) * 2 + '] should return uid from email if it exists', + async function () { + const res = await server + .request() + .get(regPath + '/' + email + '/' + call) + .set('Accept', 'application/json'); + assert.equal(res.status, 200); + assert.equal(res.body[call], username); + } + ); + + it( + '[RET' + + (i + 1) * 2 + + 1 + + '] should not return uid from email if it exists', + async function () { + const wrongEmail = cuid() + '@toto.com'; + const res = await server + .request() + .get(regPath + '/' + wrongEmail + '/' + call) + .set('Accept', 'application/json'); + assert.equal(res.status, 404); + assert.equal(res.body.id, 'UNKNOWN_EMAIL'); + } + ); + }); + } +}); diff --git a/src-dest/components/register/test/acceptance/hostings.test.js b/overrides/components/register/test/acceptance/hostings.test.js similarity index 58% rename from src-dest/components/register/test/acceptance/hostings.test.js rename to overrides/components/register/test/acceptance/hostings.test.js index 00bf252..9803eab 100644 --- a/src-dest/components/register/test/acceptance/hostings.test.js +++ b/overrides/components/register/test/acceptance/hostings.test.js @@ -1,14 +1,21 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/* global describe, it, before, after */ + require('test-helpers/src/api-server-tests-config'); const { context } = require('api-server/test/test-helpers'); const regPath = require('api-server/src/routes/Paths').Register; -const cuid = require('cuid'); - const chai = require('chai'); const assert = chai.assert; const expect = chai.expect; describe('service', function () { + let server; before(async () => { server = await context.spawn(); @@ -18,16 +25,18 @@ describe('service', function () { }); it('[REA1] GET /service/info should receive service info data ', async function () { - const res = await server.request() + const res = await server + .request() .get(regPath + '/service/info') .set('Accept', 'application/json'); assert.equal(res.status, 200); assert.equal(res.body.name, 'Pryv Lab'); - assert.equal(res.body.api, 'http://localhost:3000/{username}/'); + assert.equal(res.body.api, 'http://127.0.0.1:3000/{username}/'); }); it('[REA2] GET /apps should receive empty array ', async function () { - const res = await server.request() + const res = await server + .request() .get(regPath + '/apps') .set('Accept', 'application/json'); assert.equal(res.status, 200); @@ -35,7 +44,8 @@ describe('service', function () { }); it('[REA3] GET /apps/:appid should receive an dummy message ', async function () { - const res = await server.request() + const res = await server + .request() .get(regPath + '/apps/toto') .set('Accept', 'application/json'); assert.equal(res.status, 200); @@ -43,31 +53,31 @@ describe('service', function () { }); it('[REA4] GET /hostings should receive an hosting compatible message ', async function () { - const res = await server.request() + const res = await server + .request() .get(regPath + '/hostings') .set('Accept', 'application/json'); assert.equal(res.status, 200); - expect(res.body).to.eql({ - "regions": { - "region1": { - "name": "region1", - "zones": { - "zone1": { - "name": "zone1", - "hostings": { - "hosting1": { - "url": "https://sw.pryv.me", - "name": "Pryv.io", - "description": "Self hosted", - "available": true, - "availableCore": "http://localhost:3000" - } - } - } - } - } - } - }); + expect(res.body).to.eql({ + regions: { + region1: { + name: 'region1', + zones: { + zone1: { + name: 'zone1', + hostings: { + hosting1: { + url: 'https://sw.pryv.me', + name: 'Pryv.io', + description: 'Self hosted', + available: true, + availableCore: 'http://127.0.0.1:3000/' + } + } + } + } + } + } + }); }); - -}); \ No newline at end of file +}); diff --git a/src-dest/components/register/test/acceptance/users.test.js b/overrides/components/register/test/acceptance/users.test.js similarity index 65% rename from src-dest/components/register/test/acceptance/users.test.js rename to overrides/components/register/test/acceptance/users.test.js index 249839d..41ee211 100644 --- a/src-dest/components/register/test/acceptance/users.test.js +++ b/overrides/components/register/test/acceptance/users.test.js @@ -1,16 +1,26 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/* global describe, it, before, after */ + require('test-helpers/src/api-server-tests-config'); const { databaseFixture } = require('test-helpers'); -const { produceMongoConnection, context } = require('api-server/test/test-helpers'); +const { + produceMongoConnection, + context +} = require('api-server/test/test-helpers'); const regPath = require('api-server/src/routes/Paths').Register; const cuid = require('cuid'); const chai = require('chai'); const assert = chai.assert; -const expect = chai.expect; describe('register /users', function () { - let user; + let server, email; let mongoFixtures; before(async function () { @@ -20,7 +30,6 @@ describe('register /users', function () { mongoFixtures.clean(); }); - let username; before(() => { username = cuid().substr(5); @@ -35,8 +44,8 @@ describe('register /users', function () { }); before(async function () { - user = await mongoFixtures.user(username, { - email: email + await mongoFixtures.user(username, { + email }); }); @@ -50,42 +59,50 @@ describe('register /users', function () { email: cuid().substr(5) + '@pryv.io', referer: 'tests', language: 'fr', - insurancenumber: '198263986123', - } - const res = await server.request() + insurancenumber: '198263986123' + }; + const res = await server + .request() .post(regPath + '/user') .send(userData); assert.equal(res.status, 201); assert.equal(res.body.username, userData.username); - const apiEndpoint = res.body.apiEndpoint + const apiEndpoint = res.body.apiEndpoint; const url = new URL(apiEndpoint); - let apiEndpointNoToken = apiEndpoint.replace(url.username, '').replace('@',''); - assert.equal(apiEndpointNoToken, 'http://localhost:3000/' + res.body.username + '/'); + const apiEndpointNoToken = apiEndpoint + .replace(url.username, '') + .replace('@', ''); + assert.equal( + apiEndpointNoToken, + 'http://127.0.0.1:3000/' + res.body.username + '/' + ); }); }); describe('username', function () { it('[REU7] POST /username/check', async function () { - const res = await server.request() + const res = await server + .request() .post(regPath + '/username/check') - .send({ username: username }) - .set('Accept', 'application/json');; + .send({ username }) + .set('Accept', 'application/json'); assert.equal(res.status, 410); }); it('[REU9] GET/:username/check_username ', async function () { - const res = await server.request() + const res = await server + .request() .get(regPath + '/' + username + '/check_username') .set('Accept', 'application/json'); - assert.equal(res.status, 409); + assert.equal(res.status, 200); const body = res.body; - assert.exists(body.error); - assert.equal(body.error.id, 'item-already-exists'); - assert.isTrue(body.error.message.includes(username)); + assert.exists(body); + assert.isTrue(body.reserved); }); it('[REU6] GET/:username/check_username', async function () { - const res = await server.request() + const res = await server + .request() .get(regPath + '/' + cuid().substr(5) + '/check_username') .set('Accept', 'application/json'); assert.equal(res.status, 200); @@ -94,5 +111,4 @@ describe('register /users', function () { assert.isFalse(body.reserved); }); }); - -}); \ No newline at end of file +}); diff --git a/overrides/components/storage/README.md b/overrides/components/storage/README.md new file mode 100644 index 0000000..810a787 --- /dev/null +++ b/overrides/components/storage/README.md @@ -0,0 +1,5 @@ +#### Please refer to the root README.md + +## License + +[BSD-3-Clause](LICENSE) diff --git a/overrides/components/www/LICENSE b/overrides/components/www/LICENSE new file mode 100644 index 0000000..64cfc44 --- /dev/null +++ b/overrides/components/www/LICENSE @@ -0,0 +1,30 @@ +Copyright (C) 2019–2025 Pryv https://pryv.com + +This file is part of Open-Pryv.io and released under BSD-Clause-3 License + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + +2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software + without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +SPDX-License-Identifier: BSD-3-Clause diff --git a/overrides/components/www/package.json b/overrides/components/www/package.json new file mode 100644 index 0000000..a23c7c1 --- /dev/null +++ b/overrides/components/www/package.json @@ -0,0 +1,15 @@ +{ + "name": "www", + "version": "0.0.1", + "private": true, + "description": "Pryv WWW component", + "homepage": "https://pryv.com", + "license": "BSD-3-Clause", + "author": "Pryv (https://pryv.com)", + "main": "src/index.js", + "scripts": { + "test": "NODE_ENV=test ../../node_modules/.bin/mocha --timeout 10000 --reporter=dot 'test/**/*.test.js' --exit" + }, + "dependencies": {}, + "devDependencies": {} +} \ No newline at end of file diff --git a/src-dest/components/www/source/index.js b/overrides/components/www/src/index.js similarity index 50% rename from src-dest/components/www/source/index.js rename to overrides/components/www/src/index.js index 1f9fb7d..4260b6c 100644 --- a/src-dest/components/www/source/index.js +++ b/overrides/components/www/src/index.js @@ -1,14 +1,21 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ const path = require('path'); const express = require('express'); const headPath = require('api-server/src/routes/Paths').WWW; -const publicHtml = path.resolve(__dirname, '../../../../public_html'); - +const publicHtml = path.resolve(__dirname, '../../../public_html'); module.exports = async (expressApp, application) => { expressApp.use(headPath, express.static(publicHtml)); // register all www routes expressApp.all(headPath + '/*', function (req, res, next) { - res.status(404).send({ id: 'unkown-route', message: 'Unknown route: ' + req.path }); + res + .status(404) + .send({ id: 'unkown-route', message: 'Unknown route: ' + req.path }); }); -} \ No newline at end of file +}; diff --git a/src-dest/components/www/test/acceptance/www.test.js b/overrides/components/www/test/acceptance/www.test.js similarity index 58% rename from src-dest/components/www/test/acceptance/www.test.js rename to overrides/components/www/test/acceptance/www.test.js index f6fb1c8..541e533 100644 --- a/src-dest/components/www/test/acceptance/www.test.js +++ b/overrides/components/www/test/acceptance/www.test.js @@ -1,3 +1,10 @@ +/** + * @license + * Copyright (C) Pryv https://pryv.com + * This file is part of Pryv.io and released under BSD-Clause-3 License + * Refer to LICENSE file + */ +/* global describe, it, before, after */ require('test-helpers/src/api-server-tests-config'); const { context } = require('api-server/test/test-helpers'); @@ -5,9 +12,9 @@ const wwwPath = require('api-server/src/routes/Paths').WWW; const chai = require('chai'); const assert = chai.assert; -const expect = chai.expect; describe('www', function () { + let server; before(async () => { server = await context.spawn(); @@ -17,10 +24,12 @@ describe('www', function () { }); it('[WWA1] GET / should receive an html page ', async function () { - const res = await server.request() - .get(wwwPath + '/'); + const res = await server.request().get(wwwPath + '/'); assert.equal(res.status, 200); const firstLine = res.text.split('\n')[0]; - assert(firstLine.startsWith(''), 'Should start with '); + assert( + firstLine.startsWith(''), + 'Should start with ' + ); }); -}); \ No newline at end of file +}); diff --git a/overrides/configs/api-backloop.yml b/overrides/configs/api-backloop.yml new file mode 100644 index 0000000..7718b5a --- /dev/null +++ b/overrides/configs/api-backloop.yml @@ -0,0 +1,34 @@ +dnsLess: + publicUrl: "https://my-computer.backloop.dev:3000/" +http: + port: 3000 # (ignored with docker) + ip: 127.0.0.1 # (ignored with docker) + ssl: + backloop.dev: true +auth: + adminAccessKey: BACKLOOP-ADMIN-KEY-UNSECURE + trustedApps: "*@https://pryv.github.io, *@https://*.rec.la*, *@https://*.backloop.dev*" +service: + serial: 1000001 # change serial number each time assets content needs to be reloaded by clients + name: Open-Pryv.io + support: https://pryv.com/open-pryv-non-configured-page/ + terms: https://pryv.com/open-pryv-non-configured-page/ + home: https://pryv.com/open-pryv-non-configured-page/ + eventTypes: https://pryv.github.io/event-types/flat.json +services: + email: + enabled: + welcome: true + resetPassword: true +custom: + systemStreams: + account: + - + isIndexed: true + isUnique: true + isShown: true + isEditable: true + type: email/string + name: Email + id: email + isRequiredInValidation: true \ No newline at end of file diff --git a/overrides/configs/api.yml b/overrides/configs/api.yml new file mode 100644 index 0000000..14be9d1 --- /dev/null +++ b/overrides/configs/api.yml @@ -0,0 +1,36 @@ +dnsLess: + publicUrl: http://localhost:3000/ # the "Public" URL to reach the service, you need to change this if you use a third party SSL service such as NGNIX. +http: + port: 3000 # (ignored with docker) The local port to listen + ip: 127.0.0.1 # (ignored with docker) The IP adress to use. Keep it 127.0.0.1 unless you explicitely want to expose the service in `http` to another network. + ssl: + keyFile: false # to enable HTTPS give the full path to your SSL key file in pem format + certFile: false # to enable HTTPS give the full path to your SSL certificate file in pem format + caFile: false # (optional) full path to your SSL certificate-authority file in pem format +auth: + adminAccessKey: REPLACE_ME # key to use for system calls such as `/reg/admin/users`. A random key should be generated on setup. + trustedApps: "*@https://pryv.github.io*, *@https://*.rec.la*, *@https://*.backloop.dev*" # list of web apps that can be trusted-app functionalities +service: + serial: 1000001 # change serial number each time assets content needs to be reloaded by clients + name: Open-Pryv.io + support: https://pryv.com/open-pryv-non-configured-page/ + terms: https://pryv.com/open-pryv-non-configured-page/ + home: https://pryv.com/open-pryv-non-configured-page/ + eventTypes: https://pryv.github.io/event-types/flat.json +services: + email: + enabled: + welcome: true + resetPassword: true +custom: + systemStreams: + account: + - + isIndexed: true + isUnique: true + isShown: true + isEditable: true + type: email/string + name: Email + id: email + isRequiredInValidation: true \ No newline at end of file diff --git a/overrides/configs/mail-config.yml b/overrides/configs/mail-config.yml new file mode 100644 index 0000000..f079acf --- /dev/null +++ b/overrides/configs/mail-config.yml @@ -0,0 +1,48 @@ +# Logging settings +logs: + prefix: '' + console: + active: true, + level: 'info' + colorize: true + file: + active: false +email: + message: + # Sender name and email address + from: + name: "Your Email address" + address: "changeme@pryv.com" + preview: false, # If true, it will open a webpage with a preview + send: true # Activate/deactivate the actual sending (prod/test env) +# Alternative transport, using the sendmail command of the machine +sendmail: + # Set to false to use SMTP transport + active: true + # Path of the sendmail command on the machine + path: '/usr/sbin/sendmail' +# SMTP will be used if sendmail:active is false, +smtp: + # SMTP host of the external email delivery service + host: "smtp.email.service" + # SMTP port + port: 587 + # Credentials to authenticate against SMTP server + auth: + user: "change@my.email" + pass: "YourPassword" +http: + # IP address on which the mailing server is listening + ip: "0.0.0.0" + # Port on which the mailing server is listening + port: 9000 + # Each sendmail request should contain authorization header that + # matches this key, used to prevent abuse. + # No need to change if ip adress is not facing the internet. + auth: "SHOULD_MATCH_SERVICE_MAIL" +templates: + # Root folder where the templates are stored + root: './templates/' + # Default language for templates + defaultLang: 'en' + diff --git a/src-dest/custom-extensions/.gitkeep b/overrides/custom-extensions/.gitkeep similarity index 100% rename from src-dest/custom-extensions/.gitkeep rename to overrides/custom-extensions/.gitkeep diff --git a/overrides/docker/Dockerfile.api b/overrides/docker/Dockerfile.api new file mode 100644 index 0000000..e6474d2 --- /dev/null +++ b/overrides/docker/Dockerfile.api @@ -0,0 +1,20 @@ +FROM node:18 + +WORKDIR /app + +# Copy necessary files +COPY ./components/ /app/components +COPY ./docker/override-config.yml /app/components/api-server/config/override-config.yml +COPY ./scripts/ /app/scripts +COPY ./.api-version/ /app/.api-version +COPY ./package-lock.json/ /app/package-lock.json +COPY ./package.json/ /app/package.json + +RUN apt-get update -y + +RUN npm install + +CMD ["npm", "run", "api"] + +EXPOSE 3000 + diff --git a/overrides/docker/Dockerfile.mail b/overrides/docker/Dockerfile.mail new file mode 100644 index 0000000..50e6d2f --- /dev/null +++ b/overrides/docker/Dockerfile.mail @@ -0,0 +1,23 @@ +FROM node:18 + +WORKDIR /app + +# Copy necessary files +COPY ./service-mail /app + +RUN apt-get update -y + +# install service-mail + +# install rsync needed for copying files to dist folder +RUN apt-get -y install rsync sendmail && yes "Y" | /usr/sbin/sendmailconfig + +RUN echo 'echo "$(tail -n 1 /etc/hosts) localhost localhost.localdomain $HOSTNAME" >> /etc/hosts' > /app/mail.sh +RUN echo 'yes "Y" | /usr/sbin/sendmailconfig' >> /app/mail.sh + +RUN npm install +CMD ["/app/bin/server", "--config", "api", "/app/configs/mail-config.yml"] + + +EXPOSE 9000 + diff --git a/overrides/docker/README-build.md b/overrides/docker/README-build.md new file mode 100644 index 0000000..2dbfa9e --- /dev/null +++ b/overrides/docker/README-build.md @@ -0,0 +1,28 @@ +# Build your own docker images + +This guide explains how to build your own docker Open Pryv.io docker images. + +*Prerequisites*: + +- [Docker v19.03](https://docs.docker.com/engine/install/) +- [Docker-compose v1.26](https://docs.docker.com/compose/install/) + + +From `./docker/` folder + +1. Make the images + + Run `docker compose --env-file src/env_config -f docker-compose-build.yml build` + +2. Prepare the various assets + + - `bash ../scripts/setup-app-web-auth3` + - `bash ../scripts/setup-assets` + +3. Pack the base directory + + This will pack in `dockerized-open-pryv-1.9.2` the content of `./src` , the config files in `../configs/` an `../public.html` in `dockerized-open-pryv-${PRYV_TAG}.tgz` + + **Warning** the configuration files will be packaged make sure that adminKeys are not set if your intent is to publish it. + + run `./build-tarball.sh` \ No newline at end of file diff --git a/overrides/docker/build-tarball.sh b/overrides/docker/build-tarball.sh new file mode 100755 index 0000000..202d772 --- /dev/null +++ b/overrides/docker/build-tarball.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) +cd $SCRIPT_FOLDER + +. ./src/env_config + +TEMPDEST=./dockerized-open-pryv +rm -rf $TEMPDEST +mkdir -p $TEMPDEST +cp -r ./src/* $TEMPDEST/ + +cp -r ../configs $TEMPDEST +cp -r ../public_html $TEMPDEST +mkdir -p $TEMPDEST/var-pryv +mkdir -p $TEMPDEST/mail-logs +mkdir -p $TEMPDEST/var-pryv/mongo/backup +mkdir -p $TEMPDEST/var-pryv/mongo/db + +DEST=dockerized-open-pryv-${PRYV_TAG}.tgz + +tar -cvzf $DEST $TEMPDEST +rm -rf $TEMPDEST +echo "Docker base packed in ${DEST}" \ No newline at end of file diff --git a/overrides/docker/docker-compose-build.yml b/overrides/docker/docker-compose-build.yml new file mode 100644 index 0000000..a59dd93 --- /dev/null +++ b/overrides/docker/docker-compose-build.yml @@ -0,0 +1,13 @@ +version: "3.8" +services: + open-pryv-api: + build: + context: ../ + dockerfile: ./docker/Dockerfile.api + image: pryvio/open-pryv.io-api:${PRYV_TAG} + + open-pryv-mail: + build: + context: ../ + dockerfile: ./docker/Dockerfile.mail + image: pryvio/open-pryv.io-mail:${PRYV_TAG} \ No newline at end of file diff --git a/overrides/docker/override-config.yml b/overrides/docker/override-config.yml new file mode 100644 index 0000000..48480fc --- /dev/null +++ b/overrides/docker/override-config.yml @@ -0,0 +1,20 @@ +# This is a specifc config for docker packaging +# All seeting here will override settings for api +openSource: + isActive: true +dnsLess: + isActive: true +service: + features: + noHF: true +http: + ip: "0.0.0.0" + port: "3000" +database: + host: "open-pryv-mongo" # Map hostname to mongo container + port: 27017 + name: "pryv-node" +email: + method: "microservice" + url: "http://open-pryv-mail:9000/sendmail" # Map to mail container + key: "SHOULD_MATCH_SERVICE_MAIL" \ No newline at end of file diff --git a/overrides/docker/src/README.md b/overrides/docker/src/README.md new file mode 100644 index 0000000..3cb98a9 --- /dev/null +++ b/overrides/docker/src/README.md @@ -0,0 +1,56 @@ +# Dockerized Open Pryv.io + +This archive contains the necessary files to serve as base directory and run Open-Pryv.io from Docker + +*Prerequisites*: + +- [Docker v19.03](https://docs.docker.com/engine/install/) +- [Docker-compose v1.26](https://docs.docker.com/compose/install/) + +## Configuration + +Docker containerized version of Open-Pryv.io uses only `./config/api.yml` keep a backup of it! + +You must change the `auth:adminAccessKey` to a strong random key. + +For other settings refer to [Config info on main Open-Pryv.io README](https://github.com/pryv/open-pryv.io#config) + +### Port + +Note that `http:port` and `http:settings` of `./config/api.yml` are ignored and overriden by docker package. +You may change the port exposed by Docker from the file `./env_config` + +### SSL + +**backloop.dev** Loop back +You can run dockerized version in local by replacing `./config/api.yml` with `./config/api-backloop.yml`. +Then the api will be accessible **From the local machine only** on `https://my-computer.backloop.dev:3000` + +**Own certificate** +Create a `secrets` folder in `./configs/` with your `key.pem`, `cert.pem` and optional `ca.pem` files. +The `http:ssl:xFile` settings should point to `/app/configs/secrets/xxx.pem` files. + +Make sure to adapt the `dnsLess:publicUrl` with `https://` an the correct hostname. + +## Backup + +1. First stop **open-pryv-api** only with `docker stop open-pryv-api` +2. The following command will backup the database in `${PRYV_BASE}/var-pryv/mongo/backup` => `docker exec -t open-pryv-mongo mongodump -d pryv-node -o /data/backup/` +3. Then you can stop other containers with `./stop.sh` + +You can backup all `${PRYV_BASE}/var-pryv` as it will contains the operation data. Make sure you can preserve permissons. +Eventually delete the content of `${PRYV_BASE}/var-pryv/mongo/db/` in case you plan a mongodb migration + +## Restore + +On a fresh install (never started) + +1. Copy the content of backup to `${PRYV_BASE}/var-pryv` +2. Start the service with `./start.sh` +3. Restore mongodb data with `docker exec -t open-pryv-mongo mongorestore /data/backup/` + + + +## License + +[BSD-3-Clause](LICENSE) diff --git a/overrides/docker/src/docker-compose.yml b/overrides/docker/src/docker-compose.yml new file mode 100644 index 0000000..dfbe8d3 --- /dev/null +++ b/overrides/docker/src/docker-compose.yml @@ -0,0 +1,42 @@ +version: "3.8" +services: + open-pryv-api: + image: pryvio/open-pryv.io-api:${PRYV_TAG} + container_name: "open-pryv-api" + restart: "always" + ports: + - ${PRYV_PORT}:3000 + volumes: + - ${PRYV_BASE}/configs:/app/configs + - ${PRYV_BASE}/public_html:/app/public_html + - ${PRYV_BASE}/var-pryv/api:/app/var-pryv + depends_on: + - open-pryv-mongo + networks: + - app-network + + open-pryv-mail: + image: pryvio/open-pryv.io-mail:${PRYV_TAG} + container_name: "open-pryv-mail" + restart: "always" + depends_on: + - open-pryv-api + volumes: + - ${PRYV_BASE}/configs:/app/configs + - ${PRYV_BASE}/mail-logs/:/app/var-pryv/mail-logs + networks: + - app-network + + open-pryv-mongo: + image: mongo:6.0.5 + container_name: "open-pryv-mongo" + restart: "always" + volumes: + - ${PRYV_BASE}/var-pryv/mongo/backup/:/data/backup/ + - ${PRYV_BASE}/var-pryv/mongo/db/:/data/db/ + networks: + - app-network + +networks: + app-network: + driver: bridge diff --git a/overrides/docker/src/env_config b/overrides/docker/src/env_config new file mode 100644 index 0000000..51f0da7 --- /dev/null +++ b/overrides/docker/src/env_config @@ -0,0 +1,3 @@ +PRYV_TAG=1.9.2 +PRYV_PORT=3000 +PRYV_BASE=./ \ No newline at end of file diff --git a/overrides/docker/src/start.sh b/overrides/docker/src/start.sh new file mode 100755 index 0000000..76f2fb0 --- /dev/null +++ b/overrides/docker/src/start.sh @@ -0,0 +1,4 @@ +#!/bin/sh +SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) +cd $SCRIPT_FOLDER +docker compose --env-file env_config -f docker-compose.yml up --detach \ No newline at end of file diff --git a/overrides/docker/src/stop.sh b/overrides/docker/src/stop.sh new file mode 100755 index 0000000..1ecc9f1 --- /dev/null +++ b/overrides/docker/src/stop.sh @@ -0,0 +1,4 @@ +#!/bin/sh +SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) +cd $SCRIPT_FOLDER +docker compose --env-file env_config -f docker-compose.yml down \ No newline at end of file diff --git a/src-dest/public_html/.git_keep b/overrides/public_html/.git_keep similarity index 100% rename from src-dest/public_html/.git_keep rename to overrides/public_html/.git_keep diff --git a/overrides/readme/dpg-badge.png b/overrides/readme/dpg-badge.png new file mode 100644 index 0000000..b38caf5 Binary files /dev/null and b/overrides/readme/dpg-badge.png differ diff --git a/src-dest/readme/logo-data-privacy-management-pryv.png b/overrides/readme/logo-data-privacy-management-pryv.png similarity index 100% rename from src-dest/readme/logo-data-privacy-management-pryv.png rename to overrides/readme/logo-data-privacy-management-pryv.png diff --git a/src-dest/readme/pryv.io-ecosystem.jpg b/overrides/readme/pryv.io-ecosystem.jpg similarity index 100% rename from src-dest/readme/pryv.io-ecosystem.jpg rename to overrides/readme/pryv.io-ecosystem.jpg diff --git a/src-dest/scripts/backup-database-native.sh b/overrides/scripts/backup-database-native similarity index 100% rename from src-dest/scripts/backup-database-native.sh rename to overrides/scripts/backup-database-native diff --git a/src-dest/scripts/backup-attachments-native.sh b/overrides/scripts/backup-usersfiles-native old mode 100644 new mode 100755 similarity index 86% rename from src-dest/scripts/backup-attachments-native.sh rename to overrides/scripts/backup-usersfiles-native index 492da92..b69a62f --- a/src-dest/scripts/backup-attachments-native.sh +++ b/overrides/scripts/backup-usersfiles-native @@ -11,4 +11,4 @@ echo "Backup dir: ${BACKUP_DIR}" export VAR_PRYV_FOLDER="${PARENT_DIR}/var-pryv" -rsync --recursive --times --human-readable --verbose --perms "${VAR_PRYV_FOLDER}/attachment-files/" $BACKUP_DIR \ No newline at end of file +rsync --recursive --times --human-readable --verbose --perms "${VAR_PRYV_FOLDER}/users/" $BACKUP_DIR \ No newline at end of file diff --git a/src-dest/scripts/restore-database-native.sh b/overrides/scripts/restore-database-native similarity index 100% rename from src-dest/scripts/restore-database-native.sh rename to overrides/scripts/restore-database-native diff --git a/src-dest/scripts/restore-attachments-native.sh b/overrides/scripts/restore-usersfiles-native old mode 100644 new mode 100755 similarity index 85% rename from src-dest/scripts/restore-attachments-native.sh rename to overrides/scripts/restore-usersfiles-native index 1f4fcff..303c404 --- a/src-dest/scripts/restore-attachments-native.sh +++ b/overrides/scripts/restore-usersfiles-native @@ -8,4 +8,4 @@ BACKUP_DIR=$(echo $1 | sed 's:/*$::') BACKUP_DIR="${BACKUP_DIR}/" export VAR_PRYV_FOLDER=$SCRIPT_FOLDER/../var-pryv -rsync --recursive --times --human-readable --verbose --perms $BACKUP_DIR ${VAR_PRYV_FOLDER}/attachment-files/ \ No newline at end of file +rsync --recursive --times --human-readable --verbose --perms $BACKUP_DIR ${VAR_PRYV_FOLDER}/users \ No newline at end of file diff --git a/overrides/scripts/setup-admin-key b/overrides/scripts/setup-admin-key new file mode 100755 index 0000000..bbbc462 --- /dev/null +++ b/overrides/scripts/setup-admin-key @@ -0,0 +1,21 @@ +#!/bin/bash + +SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) +cd $SCRIPT_FOLDER/.. # root + +set="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" +n=20 +rand="AUTO_GEN_" +DEFAULT_VALUE="REPLACE_ME" +for i in `seq 1 $n`; do + char=${set:$RANDOM % ${#set}:1} + rand+=$char +done +sed -i ".bak" "s/${DEFAULT_VALUE}/${rand}/g" "./configs/api.yml" +sed -i ".bak" "s/${DEFAULT_VALUE}/${rand}/g" "./configs/api-backloop.yml" + +rm "./config.yml.bak" +rm "./configs/api-backloop.yml.bak" + +echo "Set new random key for admin" + diff --git a/src-dest/scripts/setup-app-web-auth3.bash b/overrides/scripts/setup-app-web-auth3 similarity index 96% rename from src-dest/scripts/setup-app-web-auth3.bash rename to overrides/scripts/setup-app-web-auth3 index 15f9c0d..e220309 100755 --- a/src-dest/scripts/setup-app-web-auth3.bash +++ b/overrides/scripts/setup-app-web-auth3 @@ -11,6 +11,7 @@ if [[ ! -d $APP_WEB_AUTH_FOLDER ]]; then cd $APP_WEB_AUTH_FOLDER rm -rf .git echo "module.exports = {DNSLess: true};" > "./src/defaults.js" + npm install -g yarn yarn setup yarn build cp -R ./dist/* ../public_html/ diff --git a/src-dest/scripts/setup-assets.bash b/overrides/scripts/setup-assets similarity index 100% rename from src-dest/scripts/setup-assets.bash rename to overrides/scripts/setup-assets diff --git a/overrides/scripts/setup-open b/overrides/scripts/setup-open new file mode 100755 index 0000000..9487d53 --- /dev/null +++ b/overrides/scripts/setup-open @@ -0,0 +1,9 @@ +#!/bin/bash + +SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) +cd $SCRIPT_FOLDER + +bash ./setup-assets +bash ./setup-service-mail +bash ./setup-app-web-auth3 +bash ./setup-admin-key diff --git a/src-dest/scripts/setup-service-mail.bash b/overrides/scripts/setup-service-mail similarity index 93% rename from src-dest/scripts/setup-service-mail.bash rename to overrides/scripts/setup-service-mail index 44a0e58..d988817 100755 --- a/src-dest/scripts/setup-service-mail.bash +++ b/overrides/scripts/setup-service-mail @@ -8,6 +8,7 @@ cd $SCRIPT_FOLDER/.. # root SERVICE_MAIL_FOLDER="service-mail" if [[ ! -d "${SERVICE_MAIL_FOLDER}/node_modules" ]]; then + npm install -g yarn yarn --cwd $SERVICE_MAIL_FOLDER install echo "Service-Mail Installed!" else diff --git a/src-dest/service-mail/templates/welcome-email/en/html.pug b/overrides/service-mail/templates/welcome-email/en/html.pug similarity index 100% rename from src-dest/service-mail/templates/welcome-email/en/html.pug rename to overrides/service-mail/templates/welcome-email/en/html.pug diff --git a/src-dest/service-mail/templates/welcome-email/en/subject.pug b/overrides/service-mail/templates/welcome-email/en/subject.pug similarity index 100% rename from src-dest/service-mail/templates/welcome-email/en/subject.pug rename to overrides/service-mail/templates/welcome-email/en/subject.pug diff --git a/src-dest/service-mail/templates/welcome-email/fr/html.pug b/overrides/service-mail/templates/welcome-email/fr/html.pug similarity index 100% rename from src-dest/service-mail/templates/welcome-email/fr/html.pug rename to overrides/service-mail/templates/welcome-email/fr/html.pug diff --git a/src-dest/service-mail/templates/welcome-email/fr/subject.pug b/overrides/service-mail/templates/welcome-email/fr/subject.pug similarity index 100% rename from src-dest/service-mail/templates/welcome-email/fr/subject.pug rename to overrides/service-mail/templates/welcome-email/fr/subject.pug diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..cf0afc1 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,5599 @@ +{ + "name": "dev-pryv.io-opener", + "version": "0.1.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "dev-pryv.io-opener", + "version": "0.1.0", + "license": "UNLICENSED", + "dependencies": { + "mkdirp": "^1.0.4", + "ncp": "^2.0.0", + "rsync": "^0.6.1" + }, + "devDependencies": { + "semistandard": "^17.0.0", + "source-licenser": "^2.0.5" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.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/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "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/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/@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/@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "dependencies": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "node_modules/@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "node_modules/@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "node_modules/@types/node": { + "version": "18.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz", + "integrity": "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "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/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/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/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/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/array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "node_modules/available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "dependencies": { + "semver": "^7.0.0" + } + }, + "node_modules/builtins/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + }, + "funding": { + "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/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/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "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/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/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "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/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/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "dependencies": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "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/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/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==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@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.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "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", + "graphemer": "^1.4.0", + "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-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.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-config-semistandard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-17.0.0.tgz", + "integrity": "sha512-tLi0JYmfiiJgtmRhoES55tENatR7y/5aXOh6cBeW+qjzl1+WwyV0arDqR65XN3/xrPZt+/1EG+xNLknV/0jWsQ==", + "dev": true, + "peerDependencies": { + "eslint": "^8.13.0", + "eslint-config-standard": "^17.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "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" + } + ], + "peerDependencies": { + "eslint": "^8.0.1", + "eslint-plugin-import": "^2.25.2", + "eslint-plugin-n": "^15.0.0", + "eslint-plugin-promise": "^6.0.0" + } + }, + "node_modules/eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "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" + } + ], + "peerDependencies": { + "eslint": "^8.8.0", + "eslint-plugin-react": "^7.28.0" + } + }, + "node_modules/eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "dependencies": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + } + }, + "node_modules/eslint-import-resolver-node/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "dependencies": { + "debug": "^3.2.7" + }, + "engines": { + "node": ">=4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + } + } + }, + "node_modules/eslint-module-utils/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "dependencies": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "engines": { + "node": ">=8.10.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=4.19.1" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^1.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + } + }, + "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8" + } + }, + "node_modules/eslint-plugin-import/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/eslint-plugin-import/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "dependencies": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-n/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0" + } + }, + "node_modules/eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "engines": { + "node": ">=4" + }, + "peerDependencies": { + "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8" + } + }, + "node_modules/eslint-plugin-react/node_modules/doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eslint-plugin-react/node_modules/resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "dependencies": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "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": "^10.0.0 || ^12.0.0 || >= 14.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/mysticatea" + }, + "peerDependencies": { + "eslint": ">=5" + } + }, + "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": ">=10" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/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/espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "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/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/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, + "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/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "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/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/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/for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "dependencies": { + "is-callable": "^1.1.3" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "node_modules/function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true, + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/git-hooks-list": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz", + "integrity": "sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==", + "dev": true, + "funding": { + "url": "https://github.com/fisker/git-hooks-list?sponsor=1" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/globby": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz", + "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", + "dev": true, + "dependencies": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.1.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true, + "engines": { + "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", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "node_modules/is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "dependencies": { + "has-bigints": "^1.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "dependencies": { + "has": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "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-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "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", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "dependencies": { + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "dev": true + }, + "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/json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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/json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "json5": "lib/cli.js" + } + }, + "node_modules/jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dev": true, + "dependencies": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + }, + "engines": { + "node": ">=4.0" + } + }, + "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/load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/load-json-file/node_modules/type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "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/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "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/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/nconf": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", + "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "dev": true, + "dependencies": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/nconf/node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/nconf/node_modules/yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/nconf/node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==", + "bin": { + "ncp": "bin/ncp" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "dependencies": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "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/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/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "dependencies": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "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/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "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/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true, + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "dependencies": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-conf/node_modules/p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-conf/node_modules/path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "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/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "node_modules/regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "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/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "dependencies": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/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", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rsync": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/rsync/-/rsync-0.6.1.tgz", + "integrity": "sha512-39HcwWuM67CQ9tHloazShXWUOWa2m3SGqX6XQhQMSj0VCQMkSI9PodoxM7/+hKf2p4v2umbhfoarYqd1gwII/w==" + }, + "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-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==", + "dev": true + }, + "node_modules/semistandard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-17.0.0.tgz", + "integrity": "sha512-FnZ77h6LpCjIl0S2kf8utBjBxuFfiV+6DbnFDEJuxWP91el+Syp6P/T54KCJbczmQx9vIy/cXpSOuPzofnrUKA==", + "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": { + "eslint": "^8.20.0", + "eslint-config-semistandard": "^17.0.0", + "eslint-config-standard": "17.0.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.2.4", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.30.1", + "standard-engine": "^15.0.0" + }, + "bin": { + "semistandard": "bin/cmd.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "dev": true, + "bin": { + "semver": "bin/semver.js" + } + }, + "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/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/side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true + }, + "node_modules/sort-package-json": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.57.0.tgz", + "integrity": "sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==", + "dev": true, + "dependencies": { + "detect-indent": "^6.0.0", + "detect-newline": "3.1.0", + "git-hooks-list": "1.0.3", + "globby": "10.0.0", + "is-plain-obj": "2.1.0", + "sort-object-keys": "^1.1.3" + }, + "bin": { + "sort-package-json": "cli.js" + } + }, + "node_modules/source-licenser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/source-licenser/-/source-licenser-2.0.5.tgz", + "integrity": "sha512-83/6HiK0ma42UpbtLjP7s3J4eg8X4DrdPY90/aoHRC3CAxY16jJSLx/xViQBI2YxwUjouzW/kur4kfqCaMMM8w==", + "dev": true, + "dependencies": { + "chalk": "^4.1.2", + "fast-glob": "^3.2.11", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "nconf": "^0.12.0", + "sort-package-json": "^1.57.0", + "yargs": "^17.4.1" + }, + "bin": { + "source-licenser": "bin/source-licenser" + } + }, + "node_modules/standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", + "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": { + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "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/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/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "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/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "dependencies": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.0.0" + } + }, + "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/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/typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "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/which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "dependencies": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "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" + } + } + }, + "dependencies": { + "@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true + }, + "@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^3.3.0" + } + }, + "@eslint-community/regexpp": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", + "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", + "dev": true + }, + "@eslint/eslintrc": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.0.tgz", + "integrity": "sha512-Lj7DECXqIVCqnqjjHMPna4vn6GJcMgul/wuS0je9OZ9gsL0zzDpKPVtcG1HaDVc+9y+qgXneTeUMbCqXJNpH1A==", + "dev": true, + "requires": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.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" + } + }, + "@eslint/js": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz", + "integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==", + "dev": true + }, + "@humanwhocodes/config-array": { + "version": "0.11.10", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", + "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", + "dev": true, + "requires": { + "@humanwhocodes/object-schema": "^1.2.1", + "debug": "^4.1.1", + "minimatch": "^3.0.5" + } + }, + "@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 + }, + "@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" + } + }, + "@types/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", + "dev": true, + "requires": { + "@types/minimatch": "*", + "@types/node": "*" + } + }, + "@types/json5": { + "version": "0.0.29", + "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", + "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", + "dev": true + }, + "@types/minimatch": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.5.tgz", + "integrity": "sha512-Klz949h02Gz2uZCMGwDUSDS1YBlTdDDgbWHi+81l29tQALUtvz4rAYi5uoVhE5Lagoq6DeqAUlbrHvW/mXDgdQ==", + "dev": true + }, + "@types/node": { + "version": "18.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.1.tgz", + "integrity": "sha512-GKX1Qnqxo4S+Z/+Z8KKPLpH282LD7jLHWJcVryOflnsnH+BtSDfieR6ObwBMwpnNws0bUK8GI7z0unQf9bARNQ==", + "dev": true + }, + "acorn": { + "version": "8.10.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.10.0.tgz", + "integrity": "sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==", + "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": {} + }, + "ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + } + }, + "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 + }, + "array-buffer-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-buffer-byte-length/-/array-buffer-byte-length-1.0.0.tgz", + "integrity": "sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "is-array-buffer": "^3.0.1" + } + }, + "array-includes": { + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", + "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "is-string": "^1.0.7" + } + }, + "array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true + }, + "array.prototype.flat": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", + "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.flatmap": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", + "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0" + } + }, + "array.prototype.tosorted": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", + "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.1.3" + } + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, + "available-typed-arrays": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", + "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", + "dev": true + }, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "builtins": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/builtins/-/builtins-5.0.1.tgz", + "integrity": "sha512-qwVpFEHNfhYJIzNRBvd2C1kyo6jz3ZSMPyyuR47OPdiKWlbYnZNyDWuyR175qDnAJLiCo5fBBqPb3RiXgWlkOQ==", + "dev": true, + "requires": { + "semver": "^7.0.0" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "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 + }, + "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" + } + }, + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "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 + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "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" + } + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "define-properties": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", + "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "dev": true, + "requires": { + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + } + }, + "detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true + }, + "detect-newline": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", + "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", + "dev": true + }, + "dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "requires": { + "path-type": "^4.0.0" + } + }, + "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" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", + "dev": true + }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "dev": true, + "requires": { + "is-arrayish": "^0.2.1" + } + }, + "es-abstract": { + "version": "1.21.2", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", + "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "dev": true, + "requires": { + "array-buffer-byte-length": "^1.0.0", + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "es-set-tostringtag": "^2.0.1", + "es-to-primitive": "^1.2.1", + "function.prototype.name": "^1.1.5", + "get-intrinsic": "^1.2.0", + "get-symbol-description": "^1.0.0", + "globalthis": "^1.0.3", + "gopd": "^1.0.1", + "has": "^1.0.3", + "has-property-descriptors": "^1.0.0", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.5", + "is-array-buffer": "^3.0.2", + "is-callable": "^1.2.7", + "is-negative-zero": "^2.0.2", + "is-regex": "^1.1.4", + "is-shared-array-buffer": "^1.0.2", + "is-string": "^1.0.7", + "is-typed-array": "^1.1.10", + "is-weakref": "^1.0.2", + "object-inspect": "^1.12.3", + "object-keys": "^1.1.1", + "object.assign": "^4.1.4", + "regexp.prototype.flags": "^1.4.3", + "safe-regex-test": "^1.0.0", + "string.prototype.trim": "^1.2.7", + "string.prototype.trimend": "^1.0.6", + "string.prototype.trimstart": "^1.0.6", + "typed-array-length": "^1.0.4", + "unbox-primitive": "^1.0.2", + "which-typed-array": "^1.1.9" + } + }, + "es-set-tostringtag": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", + "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3", + "has": "^1.0.3", + "has-tostringtag": "^1.0.0" + } + }, + "es-shim-unscopables": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", + "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "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==", + "dev": true, + "requires": { + "is-callable": "^1.1.4", + "is-date-object": "^1.0.1", + "is-symbol": "^1.0.2" + } + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "dev": true + }, + "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 + }, + "eslint": { + "version": "8.44.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.44.0.tgz", + "integrity": "sha512-0wpHoUbDUHgNCyvFB5aXLiQVfK9B0at6gUvzy83k4kAsQ/u769TQDX6iKC+aO4upIHO9WSaA3QoXYQDHbNwf1A==", + "dev": true, + "requires": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.4.0", + "@eslint/eslintrc": "^2.1.0", + "@eslint/js": "8.44.0", + "@humanwhocodes/config-array": "^0.11.10", + "@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.2.0", + "eslint-visitor-keys": "^3.4.1", + "espree": "^9.6.0", + "esquery": "^1.4.2", + "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", + "graphemer": "^1.4.0", + "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-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.3", + "strip-ansi": "^6.0.1", + "strip-json-comments": "^3.1.0", + "text-table": "^0.2.0" + }, + "dependencies": { + "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" + } + } + } + }, + "eslint-config-semistandard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-semistandard/-/eslint-config-semistandard-17.0.0.tgz", + "integrity": "sha512-tLi0JYmfiiJgtmRhoES55tENatR7y/5aXOh6cBeW+qjzl1+WwyV0arDqR65XN3/xrPZt+/1EG+xNLknV/0jWsQ==", + "dev": true, + "requires": {} + }, + "eslint-config-standard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-17.0.0.tgz", + "integrity": "sha512-/2ks1GKyqSOkH7JFvXJicu0iMpoojkwB+f5Du/1SC0PtBL+s8v30k9njRZ21pm2drKYm2342jFnGWzttxPmZVg==", + "dev": true, + "requires": {} + }, + "eslint-config-standard-jsx": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/eslint-config-standard-jsx/-/eslint-config-standard-jsx-11.0.0.tgz", + "integrity": "sha512-+1EV/R0JxEK1L0NGolAr8Iktm3Rgotx3BKwgaX+eAuSX8D952LULKtjgZD3F+e6SvibONnhLwoTi9DPxN5LvvQ==", + "dev": true, + "requires": {} + }, + "eslint-import-resolver-node": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", + "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "dev": true, + "requires": { + "debug": "^3.2.7", + "is-core-module": "^2.11.0", + "resolve": "^1.22.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-module-utils": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.8.0.tgz", + "integrity": "sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==", + "dev": true, + "requires": { + "debug": "^3.2.7" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, + "eslint-plugin-es": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-4.1.0.tgz", + "integrity": "sha512-GILhQTnjYE2WorX5Jyi5i4dz5ALWxBIdQECVQavL6s7cI76IZTDWleTHkxz/QT3kvcs2QlGHvKLYsSlPOlPXnQ==", + "dev": true, + "requires": { + "eslint-utils": "^2.0.0", + "regexpp": "^3.0.0" + }, + "dependencies": { + "eslint-utils": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", + "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", + "dev": true, + "requires": { + "eslint-visitor-keys": "^1.1.0" + } + }, + "eslint-visitor-keys": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", + "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", + "dev": true + } + } + }, + "eslint-plugin-import": { + "version": "2.27.5", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", + "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "array.prototype.flatmap": "^1.3.1", + "debug": "^3.2.7", + "doctrine": "^2.1.0", + "eslint-import-resolver-node": "^0.3.7", + "eslint-module-utils": "^2.7.4", + "has": "^1.0.3", + "is-core-module": "^2.11.0", + "is-glob": "^4.0.3", + "minimatch": "^3.1.2", + "object.values": "^1.1.6", + "resolve": "^1.22.1", + "semver": "^6.3.0", + "tsconfig-paths": "^3.14.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + } + } + }, + "eslint-plugin-n": { + "version": "15.7.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-n/-/eslint-plugin-n-15.7.0.tgz", + "integrity": "sha512-jDex9s7D/Qial8AGVIHq4W7NswpUD5DPDL2RH8Lzd9EloWUuvUkHfv4FRLMipH5q2UtyurorBkPeNi1wVWNh3Q==", + "dev": true, + "requires": { + "builtins": "^5.0.1", + "eslint-plugin-es": "^4.1.0", + "eslint-utils": "^3.0.0", + "ignore": "^5.1.1", + "is-core-module": "^2.11.0", + "minimatch": "^3.1.2", + "resolve": "^1.22.1", + "semver": "^7.3.8" + }, + "dependencies": { + "semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "eslint-plugin-promise": { + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-6.1.1.tgz", + "integrity": "sha512-tjqWDwVZQo7UIPMeDReOpUgHCmCiH+ePnVT+5zVapL0uuHnegBUs2smM13CzOs2Xb5+MHMRFTs9v24yjba4Oig==", + "dev": true, + "requires": {} + }, + "eslint-plugin-react": { + "version": "7.32.2", + "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", + "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flatmap": "^1.3.1", + "array.prototype.tosorted": "^1.1.1", + "doctrine": "^2.1.0", + "estraverse": "^5.3.0", + "jsx-ast-utils": "^2.4.1 || ^3.0.0", + "minimatch": "^3.1.2", + "object.entries": "^1.1.6", + "object.fromentries": "^2.0.6", + "object.hasown": "^1.1.2", + "object.values": "^1.1.6", + "prop-types": "^15.8.1", + "resolve": "^2.0.0-next.4", + "semver": "^6.3.0", + "string.prototype.matchall": "^4.0.8" + }, + "dependencies": { + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "^2.0.2" + } + }, + "resolve": { + "version": "2.0.0-next.4", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", + "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", + "dev": true, + "requires": { + "is-core-module": "^2.9.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + } + } + }, + "eslint-scope": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", + "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", + "dev": true, + "requires": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + } + }, + "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": { + "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 + } + } + }, + "eslint-visitor-keys": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", + "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", + "dev": true + }, + "espree": { + "version": "9.6.0", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.0.tgz", + "integrity": "sha512-1FH/IiruXZ84tpUlm0aCUEwMl2Ho5ilqVh0VvQXw+byAz/4SAciyHLlfmL5WYqsvD38oymdUwBss0LtK8m4s/A==", + "dev": true, + "requires": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + } + }, + "esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "requires": { + "estraverse": "^5.1.0" + } + }, + "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" + } + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true + }, + "fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "fast-glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.11.tgz", + "integrity": "sha512-xrO3+1bxSo3ZVHAnqzyuewYT6aMFHRAd4Kcs92MAonjwQZLsK9d0SF1IyQ3k5PoirxTW0Oe/RqFgMQ6TcNE5Ew==", + "dev": true, + "requires": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + } + }, + "fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "fastq": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz", + "integrity": "sha512-YpkpUnK8od0o1hmeSc7UUs/eB/vIPWJYjKck2QKIzAf71Vm1AAQ3EbuZB3g2JIy+pg+ERD0vqI79KyZiB2e2Nw==", + "dev": true, + "requires": { + "reusify": "^1.0.4" + } + }, + "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" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "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" + } + }, + "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 + }, + "for-each": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", + "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", + "dev": true, + "requires": { + "is-callable": "^1.1.3" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "function.prototype.name": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", + "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.3", + "es-abstract": "^1.19.0", + "functions-have-names": "^1.2.2" + } + }, + "functions-have-names": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", + "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", + "dev": true + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "dev": true + }, + "get-intrinsic": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", + "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-proto": "^1.0.1", + "has-symbols": "^1.0.3" + } + }, + "get-stdin": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-8.0.0.tgz", + "integrity": "sha512-sY22aA6xchAzprjyqmSEQv4UbAAzRN0L2dQB0NlN5acTTK9Don6nhoc3eAbUnpZiCANAMfd/+40kVdKfFygohg==", + "dev": true + }, + "get-symbol-description": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", + "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.1" + } + }, + "git-hooks-list": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/git-hooks-list/-/git-hooks-list-1.0.3.tgz", + "integrity": "sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ==", + "dev": true + }, + "glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "globals": { + "version": "13.20.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", + "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "dev": true, + "requires": { + "type-fest": "^0.20.2" + } + }, + "globalthis": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", + "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", + "dev": true, + "requires": { + "define-properties": "^1.1.3" + } + }, + "globby": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-10.0.0.tgz", + "integrity": "sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw==", + "dev": true, + "requires": { + "@types/glob": "^7.1.1", + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.0.3", + "glob": "^7.1.3", + "ignore": "^5.1.1", + "merge2": "^1.2.3", + "slash": "^3.0.0" + } + }, + "gopd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", + "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.3" + } + }, + "graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dev": true, + "requires": { + "function-bind": "^1.1.1" + } + }, + "has-bigints": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", + "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", + "dev": true + }, + "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 + }, + "has-property-descriptors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", + "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.1.1" + } + }, + "has-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", + "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", + "dev": true + }, + "has-symbols": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "dev": true + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "ignore": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.0.tgz", + "integrity": "sha512-CmxgYGiEPCLhfLnpPp1MoRmifwEIOgjcHXxOBjv7mY96c+eWScsOP9c112ZyLdWHi0FxHjI+4uVhKYp/gcdRmQ==", + "dev": true + }, + "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", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true + }, + "internal-slot": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", + "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "dev": true, + "requires": { + "get-intrinsic": "^1.2.0", + "has": "^1.0.3", + "side-channel": "^1.0.4" + } + }, + "is-array-buffer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.2.tgz", + "integrity": "sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.0", + "is-typed-array": "^1.1.10" + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "dev": true + }, + "is-bigint": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", + "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "dev": true, + "requires": { + "has-bigints": "^1.0.1" + } + }, + "is-boolean-object": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", + "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-callable": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", + "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", + "dev": true + }, + "is-core-module": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.1.tgz", + "integrity": "sha512-Q4ZuBAe2FUsKtyQJoQHlvP8OvBERxO3jEmy1I7hcRXcJBGGHFh/aJBswbXuS9sgrDH2QUO8ilkwNPHvHMd8clg==", + "dev": true, + "requires": { + "has": "^1.0.3" + } + }, + "is-date-object": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", + "integrity": "sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "dev": true + }, + "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-negative-zero": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", + "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", + "dev": true + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-number-object": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", + "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "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-plain-obj": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", + "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", + "dev": true + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + } + }, + "is-shared-array-buffer": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", + "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "is-string": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", + "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, + "is-symbol": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", + "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "dev": true, + "requires": { + "has-symbols": "^1.0.2" + } + }, + "is-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", + "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0" + } + }, + "is-weakref": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", + "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2" + } + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "dev": true + }, + "js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "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" + } + }, + "json-parse-better-errors": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", + "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==", + "dev": true + }, + "json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "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 + }, + "json5": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", + "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", + "dev": true, + "requires": { + "minimist": "^1.2.0" + } + }, + "jsx-ast-utils": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.4.tgz", + "integrity": "sha512-fX2TVdCViod6HwKEtSWGHs57oFhVfCMwieb9PuRDgjDPh5XeqJiHFFFJCHxU5cnTc3Bu/GRL+kPiFmw8XWOfKw==", + "dev": true, + "requires": { + "array-includes": "^3.1.6", + "array.prototype.flat": "^1.3.1", + "object.assign": "^4.1.4", + "object.values": "^1.1.6" + } + }, + "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" + } + }, + "load-json-file": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-5.3.0.tgz", + "integrity": "sha512-cJGP40Jc/VXUsp8/OrnyKyTZ1y6v/dphm3bioS+RrKXjK2BB6wHUd6JptZEFDGgGahMT+InnZO5i1Ei9mpC8Bw==", + "dev": true, + "requires": { + "graceful-fs": "^4.1.15", + "parse-json": "^4.0.0", + "pify": "^4.0.1", + "strip-bom": "^3.0.0", + "type-fest": "^0.3.0" + }, + "dependencies": { + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==", + "dev": true + } + } + }, + "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" + } + }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, + "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 + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "dev": true, + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "requires": { + "yallist": "^4.0.0" + } + }, + "merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true + }, + "micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "requires": { + "braces": "^3.0.2", + "picomatch": "^2.3.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" + } + }, + "minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true + }, + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" + }, + "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 + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "nconf": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/nconf/-/nconf-0.12.0.tgz", + "integrity": "sha512-T3fZPw3c7Dfrz8JBQEbEcZJ2s8f7cUMpKuyBtsGQe0b71pcXx6gNh4oti2xh5dxB+gO9ufNfISBlGvvWtfyMcA==", + "dev": true, + "requires": { + "async": "^3.0.0", + "ini": "^2.0.0", + "secure-keys": "^1.0.0", + "yargs": "^16.1.1" + }, + "dependencies": { + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "yargs": { + "version": "16.2.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", + "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", + "dev": true, + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true + } + } + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-2.0.0.tgz", + "integrity": "sha512-zIdGUrPRFTUELUvr3Gmc7KZ2Sw/h1PiVM0Af/oHB6zgnV1ikqSfRk+TOufi79aHYCW3NiOXmr1BP5nWbzojLaA==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "dev": true + }, + "object-inspect": { + "version": "1.12.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", + "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "dev": true + }, + "object-keys": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", + "dev": true + }, + "object.assign": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", + "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + } + }, + "object.entries": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", + "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.fromentries": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", + "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.hasown": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", + "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", + "dev": true, + "requires": { + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "object.values": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", + "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "optionator": { + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", + "dev": true, + "requires": { + "@aashutoshrathi/word-wrap": "^1.2.3", + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0" + } + }, + "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" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "dev": true + }, + "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-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha512-aOIos8bujGN93/8Ox/jPLh7RwVnPEysynVFE+fQZyg6jKELEHwzgKdLRFHUgXJL6kylijVSBC4BvN9OmsB48Rw==", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "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-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "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 + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "dev": true + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "dev": true + }, + "pify": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", + "dev": true + }, + "pkg-conf": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/pkg-conf/-/pkg-conf-3.1.0.tgz", + "integrity": "sha512-m0OTbR/5VPNPqO1ph6Fqbj7Hv6QU7gR/tQW40ZqrL1rjgCU85W6C1bJn0BItuJqnR98PWzw7Z8hHeChD1WrgdQ==", + "dev": true, + "requires": { + "find-up": "^3.0.0", + "load-json-file": "^5.2.0" + }, + "dependencies": { + "find-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", + "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", + "dev": true, + "requires": { + "locate-path": "^3.0.0" + } + }, + "locate-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", + "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", + "dev": true, + "requires": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dev": true, + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", + "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", + "dev": true, + "requires": { + "p-limit": "^2.0.0" + } + }, + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==", + "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 + }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "dev": true, + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "punycode": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", + "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "dev": true + }, + "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 + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "dev": true + }, + "regexp.prototype.flags": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", + "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "functions-have-names": "^1.2.3" + } + }, + "regexpp": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", + "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", + "dev": true + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "dev": true + }, + "resolve": { + "version": "1.22.2", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", + "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "dev": true, + "requires": { + "is-core-module": "^2.11.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "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 + }, + "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", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "requires": { + "glob": "^7.1.3" + } + }, + "rsync": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/rsync/-/rsync-0.6.1.tgz", + "integrity": "sha512-39HcwWuM67CQ9tHloazShXWUOWa2m3SGqX6XQhQMSj0VCQMkSI9PodoxM7/+hKf2p4v2umbhfoarYqd1gwII/w==" + }, + "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-regex-test": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", + "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.1.3", + "is-regex": "^1.1.4" + } + }, + "secure-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/secure-keys/-/secure-keys-1.0.0.tgz", + "integrity": "sha512-nZi59hW3Sl5P3+wOO89eHBAAGwmCPd2aE1+dLZV5MO+ItQctIvAqihzaAXIQhvtH4KJPxM080HsnqltR2y8cWg==", + "dev": true + }, + "semistandard": { + "version": "17.0.0", + "resolved": "https://registry.npmjs.org/semistandard/-/semistandard-17.0.0.tgz", + "integrity": "sha512-FnZ77h6LpCjIl0S2kf8utBjBxuFfiV+6DbnFDEJuxWP91el+Syp6P/T54KCJbczmQx9vIy/cXpSOuPzofnrUKA==", + "dev": true, + "requires": { + "eslint": "^8.20.0", + "eslint-config-semistandard": "^17.0.0", + "eslint-config-standard": "17.0.0", + "eslint-config-standard-jsx": "^11.0.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-n": "^15.2.4", + "eslint-plugin-promise": "^6.0.0", + "eslint-plugin-react": "^7.30.1", + "standard-engine": "^15.0.0" + } + }, + "semver": { + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", + "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 + }, + "side-channel": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", + "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", + "dev": true, + "requires": { + "call-bind": "^1.0.0", + "get-intrinsic": "^1.0.2", + "object-inspect": "^1.9.0" + } + }, + "slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true + }, + "sort-object-keys": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sort-object-keys/-/sort-object-keys-1.1.3.tgz", + "integrity": "sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg==", + "dev": true + }, + "sort-package-json": { + "version": "1.57.0", + "resolved": "https://registry.npmjs.org/sort-package-json/-/sort-package-json-1.57.0.tgz", + "integrity": "sha512-FYsjYn2dHTRb41wqnv+uEqCUvBpK3jZcTp9rbz2qDTmel7Pmdtf+i2rLaaPMRZeSVM60V3Se31GyWFpmKs4Q5Q==", + "dev": true, + "requires": { + "detect-indent": "^6.0.0", + "detect-newline": "3.1.0", + "git-hooks-list": "1.0.3", + "globby": "10.0.0", + "is-plain-obj": "2.1.0", + "sort-object-keys": "^1.1.3" + } + }, + "source-licenser": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/source-licenser/-/source-licenser-2.0.5.tgz", + "integrity": "sha512-83/6HiK0ma42UpbtLjP7s3J4eg8X4DrdPY90/aoHRC3CAxY16jJSLx/xViQBI2YxwUjouzW/kur4kfqCaMMM8w==", + "dev": true, + "requires": { + "chalk": "^4.1.2", + "fast-glob": "^3.2.11", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "nconf": "^0.12.0", + "sort-package-json": "^1.57.0", + "yargs": "^17.4.1" + } + }, + "standard-engine": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/standard-engine/-/standard-engine-15.1.0.tgz", + "integrity": "sha512-VHysfoyxFu/ukT+9v49d4BRXIokFRZuH3z1VRxzFArZdjSCFpro6rEIU3ji7e4AoAtuSfKBkiOmsrDqKW5ZSRw==", + "dev": true, + "requires": { + "get-stdin": "^8.0.0", + "minimist": "^1.2.6", + "pkg-conf": "^3.1.0", + "xdg-basedir": "^4.0.0" + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dev": true, + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "string.prototype.matchall": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", + "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4", + "get-intrinsic": "^1.1.3", + "has-symbols": "^1.0.3", + "internal-slot": "^1.0.3", + "regexp.prototype.flags": "^1.4.3", + "side-channel": "^1.0.4" + } + }, + "string.prototype.trim": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", + "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimend": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", + "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "string.prototype.trimstart": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", + "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.1.4", + "es-abstract": "^1.20.4" + } + }, + "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-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", + "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 + }, + "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" + } + }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "dev": true + }, + "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 + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "tsconfig-paths": { + "version": "3.14.2", + "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.2.tgz", + "integrity": "sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==", + "dev": true, + "requires": { + "@types/json5": "^0.0.29", + "json5": "^1.0.2", + "minimist": "^1.2.6", + "strip-bom": "^3.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" + } + }, + "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 + }, + "typed-array-length": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", + "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "is-typed-array": "^1.1.9" + } + }, + "unbox-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", + "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "has-bigints": "^1.0.2", + "has-symbols": "^1.0.3", + "which-boxed-primitive": "^1.0.2" + } + }, + "uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "requires": { + "punycode": "^2.1.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + }, + "which-boxed-primitive": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", + "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "dev": true, + "requires": { + "is-bigint": "^1.0.1", + "is-boolean-object": "^1.1.0", + "is-number-object": "^1.0.4", + "is-string": "^1.0.5", + "is-symbol": "^1.0.3" + } + }, + "which-typed-array": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.10.tgz", + "integrity": "sha512-uxoA5vLUfRPdjCuJ1h5LlYdmTLbYfums398v3WLkM+i/Wltl2/XyZpQWKbN++ck5L64SR/grOHqtXCUKmlZPNA==", + "dev": true, + "requires": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "gopd": "^1.0.1", + "has-tostringtag": "^1.0.0", + "is-typed-array": "^1.1.10" + } + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "xdg-basedir": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-4.0.0.tgz", + "integrity": "sha512-PSNhEJDejZYV7h50BohL09Er9VaIefr2LMAf3OEmpCkjOi34eYyQYAXUTjEQtZJTKcF0E2UKTh+osDLsgNim9Q==", + "dev": true + }, + "y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "dev": true + }, + "yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + }, + "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 + } + } +} diff --git a/package.json b/package.json index 24120b4..3867408 100644 --- a/package.json +++ b/package.json @@ -1,21 +1,29 @@ { "name": "dev-pryv.io-opener", "version": "0.1.0", - "description": "Opener", - "main": "index.js", - "scripts": { - "build": "node src/index.js && yarn license", - "setup": "./scripts/setup.sh", - "license": "node_modules/.bin/source-licenser licensing/config.yml licensing/LICENSE.src ./dest", - "licensesrc": "node_modules/.bin/source-licenser licensing/config.yml licensing/LICENSE.src ./src-dest" - }, - "author": "Pryv S.A.", - "license": "UNLICENSED", + "private": true, + "description": "Builds Open-Pryv.io, extracting code from Pryv.io base services", + "homepage": "https://pryv.com", + "license": "BSD-3-Clause", + "author": "Pryv (https://pryv.com)", "dependencies": { - "lodash": "^4.17.15", "mkdirp": "^1.0.4", "ncp": "^2.0.0", - "rsync": "^0.6.1", - "source-licenser": "^1.0.2" + "rsync": "^0.6.1" + }, + "devDependencies": { + "semistandard": "^17.0.0", + "source-licenser": "^2.0.5" + }, + "semistandard": { + "ignore": [ + "/dest", + "/service-*", + "overrides/components/api-server/src/methods/webhooks.js", + "overrides/components/business/src/index.js", + "overrides/components/register/src/business/dataservers.js", + "overrides/components/register/src/storage/database.js", + "overrides/components/register/src/storage/users.js" + ] } -} +} \ No newline at end of file diff --git a/.github/workflows/publish.yml b/release-orig.yml similarity index 79% rename from .github/workflows/publish.yml rename to release-orig.yml index 34f0aae..d23f040 100644 --- a/.github/workflows/publish.yml +++ b/release-orig.yml @@ -1,6 +1,8 @@ -name: Publish Open Pryv.io +## Kept for reference if we want to put back auto-release -on: +name: Open Pryv.io publish release + +on: push: tags: - '*' @@ -8,12 +10,16 @@ on: jobs: build: - runs-on: ubuntu-latest + runs-on: ubuntu-22.04 + strategy: matrix: - node-version: [16.4.1] + node-version: [18.16.0] steps: + - name: Install `just` + uses: extractions/setup-just@v1 + - name: Checkout repository with submodules uses: actions/checkout@v2 with: @@ -35,7 +41,7 @@ jobs: path: dest clean: false - # there is one private package (lib-reporting) used as npm package, so we need + # there is one private package (lib-reporting) used as npm package, so we need # to authenticate - name: Login to github uses: webfactory/ssh-agent@v0.4.1 @@ -43,43 +49,40 @@ jobs: ssh-private-key: ${{ secrets.TECH_PRYV_SSH_KEY }} - name: Setup opener - run: | - yarn setup - yarn install + run: just setup - - name: Generate Open Pryv.io - run: yarn build + - name: Build + run: just build - - name: Fetch dependencies + - name: Fetch Open Pryv.io dependencies working-directory: dest - run: yarn install --ignore-optionals + run: just install-stable - - name: Download public_html assets and rec.la certificates + - name: Download public_html assets working-directory: dest run: | - bash ./scripts/download-recla-certificates.sh - bash ./scripts/setup-assets.bash - bash ./scripts/setup-app-web-auth3.bash + bash ./scripts/setup-assets + bash ./scripts/setup-app-web-auth3 - - name: Create docker tarball without ssl + - name: Create docker tarball without SSL working-directory: dest/docker run: bash build-tarball.sh - - name: Upgrade rec-la + - name: Upgrade backloop.dev working-directory: dest - run: yarn upgrade rec-la + run: npm install backloop.dev@latest - - name: Set tag + - name: Set git tag id: set_tag run: | SOURCE_TAG=$(cat dest/.api-version) echo $SOURCE_TAG echo ::set-output name=SOURCE_TAG::$SOURCE_TAG - + - name: Check the prepared commit to Open Pryv - run: cd dest && yarn remove pre-commit -W && git status && git diff && echo '${{ steps.set_tag.outputs.SOURCE_TAG }} version' + run: cd dest && git status && git diff && echo '${{ steps.set_tag.outputs.SOURCE_TAG }} version' - - name: Commit and push to open Pryv and release docker tarball + - name: Commit and push to Open Pryv.io repo and release docker tarball uses: EndBug/add-and-commit@v4 with: # The name of the user that will be displayed as the author of the commit @@ -87,7 +90,7 @@ jobs: author_name: Pryvio # The email of the user that will be displayed as the author of the commit # Default: author of the commit that triggered the run - author_email: ilia@pryv.com + author_email: tech@pryv.com # The local path to the directory where your repository is located. You should use actions/checkout first to set it up # Default: '.' cwd: './dest' @@ -111,7 +114,7 @@ jobs: username: ${{ secrets.REGISTRY_PRYV_USERNAME_DOCKERHUB }} password: ${{ secrets.REGISTRY_PRYV_PASSWORD_DOCKERHUB }} - - name: Build open pryv.io image + - name: Build Open Pryv.io image working-directory: dest run: TAG=latest docker-compose -f docker/local/docker-compose.no-ssl-build.yml build open-pryv.io diff --git a/scripts/setup.sh b/scripts/setup.sh deleted file mode 100755 index 8dae04b..0000000 --- a/scripts/setup.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/sh - -set -e - -# working dir fix -scriptsFolder=$(cd $(dirname "$0"); pwd) -rootFolder=$scriptsFolder/.. -cd $rootFolder - -# Fetch git dependencies -git submodule update --init --recursive && git submodule foreach git pull origin master - -# Install node dependencies -yarn - -cd $rootFolder - -if [ -d dest ] && [ ! -d dest/.git ] -then - echo " - Conflict with previous unpublished build, cleaning 'dest' folder." - rm -rf dest/ -fi - -if [ ! -d dest ] -then - echo " -Setting up 'dest' folder for publishing to release repository -" - git clone git@github.com:pryv/open-pryv.io.git dest -fi - -echo "Cleaning inside of 'dest' folder, populate it using 'yarn build'" -rm -rf dest/* - -echo " -Setup is complete, you can proceed with building and publishing. -" \ No newline at end of file diff --git a/service-core b/service-core index bb53ad9..381d6f2 160000 --- a/service-core +++ b/service-core @@ -1 +1 @@ -Subproject commit bb53ad92becf72fd2b593ae46dc263f6a501eb1c +Subproject commit 381d6f2eb9f3a00b57a56b5420340613600b07f9 diff --git a/service-mail b/service-mail index 87bcd01..6102920 160000 --- a/service-mail +++ b/service-mail @@ -1 +1 @@ -Subproject commit 87bcd01c9fb3ac685adfea2fbbf898322cebb4a0 +Subproject commit 610292005e5c26dd467aabca2148dee2570d98a1 diff --git a/service-register b/service-register index 1adcb5c..2d6153f 160000 --- a/service-register +++ b/service-register @@ -1 +1 @@ -Subproject commit 1adcb5c835e53169e7dd0f59aefed0ca551354d4 +Subproject commit 2d6153f7abe076727e8a18ebd5f97af4a6ee6dd4 diff --git a/src-dest/.api-version b/src-dest/.api-version deleted file mode 100644 index d047b07..0000000 --- a/src-dest/.api-version +++ /dev/null @@ -1 +0,0 @@ -1.7.1-6-open \ No newline at end of file diff --git a/src-dest/.dockerignore b/src-dest/.dockerignore deleted file mode 100644 index 6c09de8..0000000 --- a/src-dest/.dockerignore +++ /dev/null @@ -1,24 +0,0 @@ -node_modules -# netbeans IDE -nbproject -app-web-auth3/node_modules -configs -.git -dump.rdb -dist - -# skip build related files except for dockerized-config -docker/production-with-ssl -docker/production-no-ssl -rec.la-certificates -docker/local/dhparam.pem -docker/local/docker-compose.no-ssl.yml -docker/local/docker-compose.with-ssl.yml -docker/local/Dockerfile -docker/build-local.sh - -# volume data -var-pryv/ - -# non functional files -README.md \ No newline at end of file diff --git a/src-dest/components/api-server/README.md b/src-dest/components/api-server/README.md deleted file mode 100644 index bf87e7f..0000000 --- a/src-dest/components/api-server/README.md +++ /dev/null @@ -1 +0,0 @@ -#### Please refer to the root README.md \ No newline at end of file diff --git a/src-dest/components/api-server/config/override-config.yml b/src-dest/components/api-server/config/override-config.yml deleted file mode 100644 index 00621d9..0000000 --- a/src-dest/components/api-server/config/override-config.yml +++ /dev/null @@ -1,26 +0,0 @@ -openSource: - isActive: true -dnsLess: - isActive: true -logs: - console: - active: true - level: info - file: - active: false - path: "var-pryv/logs/core.log" - level: info - rotation: - isActive: true - days: 14 -custom: - systemStreams: - account: - - id: email - isIndexed: true - isUnique: true - isShown: true - isEditable: true - type: email/string - name: Email - isRequiredInValidation: false \ No newline at end of file diff --git a/src-dest/components/api-server/config/test.json b/src-dest/components/api-server/config/test.json deleted file mode 100644 index 82860be..0000000 --- a/src-dest/components/api-server/config/test.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "openSource": { - "isActive": true - }, - "dnsLess": { - "isActive": true, - "publicUrl": "http://localhost:3000" - }, - "auth": { - "adminAccessKey": "some_key_yo", - "trustedApps": "pryv-test@http://test.pryv.local, pryv-test-no-cors@*, *@https://*.rec.la*" - }, - "logs": { - "console": { - "active": false, - "level": "info", - "timestamp": false - } - }, - "services": { - "email": { - "enabled": false - }, - "register": { - "url": "http://localhost:5123" - } - }, - "tcpMessaging": { - "enabled": true - }, - "service": { - "name": "Test", - "support": "https://pryv.com/openpryv/unconfigured.html", - "terms": "https://pryv.com/openpryv/unconfigured.html", - "home": "https://pryv.com/openpryv/unconfigured.html", - "eventTypes": "https://api.pryv.com/event-types/flat.json", - "assets": { - "definitions": "https://http://localhost:3000/www/assets/index.json" - } - } -} \ No newline at end of file diff --git a/src-dest/components/api-server/src/methods/webhooks.js b/src-dest/components/api-server/src/methods/webhooks.js deleted file mode 100644 index e5cef24..0000000 --- a/src-dest/components/api-server/src/methods/webhooks.js +++ /dev/null @@ -1,5 +0,0 @@ -// @flow - -export type WebhooksSettingsHolder = object; - -module.exports = function () {} \ No newline at end of file diff --git a/src-dest/components/audit/src/MethodContextUtils.js b/src-dest/components/audit/src/MethodContextUtils.js deleted file mode 100644 index f78239b..0000000 --- a/src-dest/components/audit/src/MethodContextUtils.js +++ /dev/null @@ -1,28 +0,0 @@ -/** - * @license - * Copyright (C) 2012-2021 Pryv S.A. https://pryv.com - All Rights Reserved - * Unauthorized copying of this file, via any medium is strictly prohibited - * Proprietary and confidential - */ -function setAuditAccessId(accessId) { - return function(context, params, result, next) { - next(); - } -} - -const AuditAccessIds = { - VALID_PASSWORD: 'valid-password', - PASSWORD_RESET_REQUEST: 'password-reset-request', - PASSWORD_RESET_TOKEN: 'password-reset-token', - ADMIN_TOKEN: 'admin', - PUBLIC: 'public', - INVALID: 'invalid', -} - -Object.freeze(AuditAccessIds); - - -module.exports = { - setAuditAccessId: setAuditAccessId, - AuditAccessIds: AuditAccessIds, -} \ No newline at end of file diff --git a/src-dest/components/business/src/index.js b/src-dest/components/business/src/index.js deleted file mode 100644 index ef3a1d2..0000000 --- a/src-dest/components/business/src/index.js +++ /dev/null @@ -1,18 +0,0 @@ -// @flow - -module.exports = { - accesses: require('./accesses'), - types: require('./types'), - integrity: require('./integrity'), - webhooks: {Webhook: {}}, - users: require('./users'), - MethodContext: require('./MethodContext'), -}; - - -import type { CustomAuthFunction, ContextSource, ContextSourceName } from './MethodContext'; -export type { CustomAuthFunction, ContextSource, ContextSourceName }; - - -import type { TypeRepository, InfluxRowType } from './types'; -export type { TypeRepository, InfluxRowType }; \ No newline at end of file diff --git a/src-dest/components/business/src/series/data_matrix.js b/src-dest/components/business/src/series/data_matrix.js deleted file mode 100644 index 9cfd0a7..0000000 --- a/src-dest/components/business/src/series/data_matrix.js +++ /dev/null @@ -1,3 +0,0 @@ -module.exports = { - DataMatrix: null -} \ No newline at end of file diff --git a/src-dest/components/business/src/series/influx_connection.js b/src-dest/components/business/src/series/influx_connection.js deleted file mode 100644 index c5a22a1..0000000 --- a/src-dest/components/business/src/series/influx_connection.js +++ /dev/null @@ -1,6 +0,0 @@ - - -class InfluxConnection { -} - -module.exports = InfluxConnection; \ No newline at end of file diff --git a/src-dest/components/business/src/series/repository.js b/src-dest/components/business/src/series/repository.js deleted file mode 100644 index b380ce8..0000000 --- a/src-dest/components/business/src/series/repository.js +++ /dev/null @@ -1,4 +0,0 @@ -class InfluxRepository { } - - -module.exports = InfluxRepository; \ No newline at end of file diff --git a/src-dest/components/business/src/types/influx_row_type.js b/src-dest/components/business/src/types/influx_row_type.js deleted file mode 100644 index e69de29..0000000 diff --git a/src-dest/components/previews-server/README.md b/src-dest/components/previews-server/README.md deleted file mode 100644 index bf87e7f..0000000 --- a/src-dest/components/previews-server/README.md +++ /dev/null @@ -1 +0,0 @@ -#### Please refer to the root README.md \ No newline at end of file diff --git a/src-dest/components/register/package.json b/src-dest/components/register/package.json deleted file mode 100644 index 3fc56c3..0000000 --- a/src-dest/components/register/package.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "name": "register", - "description": "Pryv Register component", - "version": "0.1.9", - "private": true, - "author": "Pryv SA", - "main": "source/index.js", - "scripts": { - "test": "yarn run _test --logs:console:active=false", - "_test": "NODE_ENV=test PRYV_CONFIG=../api-server/config/test.json ../../node_modules/.bin/mocha --reporter=dot 'test/**/*.test.js' --exit" - }, - "dependencies": { - "winston": "^2.3.0" - }, - "devDependencies": { - } -} \ No newline at end of file diff --git a/src-dest/components/register/source/config.js b/src-dest/components/register/source/config.js deleted file mode 100644 index 5b7b388..0000000 --- a/src-dest/components/register/source/config.js +++ /dev/null @@ -1,30 +0,0 @@ - -const headPath = require('../../api-server/src/routes/Paths').Register; -const wwwPath = require('../../api-server/src/routes/Paths').WWW; - -const config = { - 'auth:authorizedKeys': {}, - 'dns:domain': 'open-pryv.io', - 'appList': [], - 'dnsLess:isActive': true -} - -module.exports = { - get: function(key) { - return config[key]; - }, - loadSettings: function(settings) { - config.service = settings.get('service'); - let publicUrl = settings.get('dnsLess:publicUrl'); - if (publicUrl.slice(-1) === '/') publicUrl = publicUrl.slice(0, -1); - config.publicUrl = publicUrl; - config['access:trustedAuthUrls'] = [publicUrl]; - config['access:defaultAuthUrl'] = [publicUrl + wwwPath +'/access/access.html']; - - // load admin keys - config.adminKey = settings.get('auth:adminAccessKey'); - if (config.adminKey) { - config['auth:authorizedKeys'][config.adminKey] = { roles: ['admin'] } - } - } -} \ No newline at end of file diff --git a/src-dest/components/register/source/index.js b/src-dest/components/register/source/index.js deleted file mode 100644 index e7d18ae..0000000 --- a/src-dest/components/register/source/index.js +++ /dev/null @@ -1,53 +0,0 @@ -var logger = require('winston'); -var database = require('./storage/database'); -var config = require('./config'); -var messages = require('./utils/messages'); - - -logger['default'].transports.console.level = 'info'; - -const headPath = require('api-server/src/routes/Paths').Register; - -class mockExpress { - constructor(expressApp) { - this.app = expressApp; - } - - use(fn) { - this.app.use(headPath, fn); - } - - get(path, cb1, cb2) { - if (cb2) { - return this.app.get(headPath + path, cb1, cb2); - } - this.app.get(headPath + path, cb1); - } - - post(path, cb1, cb2) { - if (cb2) { - return this.app.post(headPath + path, cb1, cb2); - } - this.app.post(headPath + path, cb1); - } -} - -module.exports = async (expressApp, application) => { - config.loadSettings(application.config); - database.setReference('storage', application.storageLayer); - database.setReference('systemAPI', application.systemAPI); - - const app = new mockExpress(expressApp); - // public API routes - require('./routes/email')(app); - require('./routes/service')(app); - require('./routes/access')(app); - require('./routes/admin')(app); - require('./routes/server')(app); - require('./middleware/app-errors')(app); - - // register all reg routes - expressApp.all(headPath + '/*', function (req, res, next) { - res.status(404).send({ id: 'unkown-route', message: 'Unknown route: ' + req.path }); - }); -} \ No newline at end of file diff --git a/src-dest/components/register/source/storage/database.js b/src-dest/components/register/source/storage/database.js deleted file mode 100644 index 49046ee..0000000 --- a/src-dest/components/register/source/storage/database.js +++ /dev/null @@ -1,255 +0,0 @@ -// @flow - -const async = require('async'); -const semver = require('semver'); -const logger = require('winston'); -const lodash = require('lodash'); - -const messages = require('../utils/messages'); - -type GenericCallback = (err?: ?Error, res: ?T) => mixed; -type Callback = GenericCallback; - -const SystemStreamsSerializer = require('business/src/system-streams/serializer'); - -import type { UserInformation } from './users'; - -export type AccessState = { - status: 'NEED_SIGNIN' | 'REFUSED' | 'ERROR' | 'ACCEPTED', - // HTTP Status Code to send when polling. - code: number, - // Poll Key - key?: string, - requestingAppId?: string, - requestedPermissions?: PermissionSet, - url?: string, - poll?: string, - returnURL?: ?string, - oauthState?: OAuthState, - poll_rate_ms?: number, -} -type OAuthState = string | null; -import type { PermissionSet } from '../utils/check-and-constraints'; - -const fakeRedis = {}; - -const references = {}; - -/** - * Load external references - */ -function setReference(key, value) { - references[key] = value; -} -exports.setReference = setReference; - -function getRawEventCollection(callback) { - references.storage.connection.getCollectionSafe({name: 'events'}, - function errorCallback(err) { callback(err, null); }, - function sucessCallback(col) { callback(null, col); }) -} - -function systemCall(...args) { - return references.systemAPI.call(...args); -} - - -function createUser(request, callback) { - systemCall('system.createUser', {}, request, callback); -} -exports.createUser = createUser; - -/** - * Check if an email address exists in the database - * @param email: the email address to verify - * @param callback: function(error,result), result being 'true' if it exists, 'false' otherwise - */ -function emailExists(email: string, callback: GenericCallback) { - email = email.toLowerCase(); - getUIDFromMail(email, function (error, username) { - callback(error, username !== null); - }); -} -exports.emailExists = emailExists; - -/** - * Check if an user id exists in the database - * @param uid: the user id to verify - * @param callback: function(error,result), result being 'true' if it exists, 'false' otherwise - */ -exports.uidExists = function (uid: string, callback: Callback) { - uid = uid.toLowerCase(); - const context = {}; - async.series([ - function (done) {  - getRawEventCollection(function(err, eventCollection) {  - context.eventCollection = eventCollection; - done(err); - }); - }, - function (done) {  - if (! context.userId) return done(); - context.eventCollection.findOne({content: uid, streamIds: {$in : [SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('username')]}, type: 'identifier/string'}, function(err, res) { - context.username = res?.content; - done(err); - }); - } - ], function(err) { - callback(err, context.username !== null); - }) - -}; - -/** - * Get the server linked with provided user id - * @param uid: the user id - * @param callback: function(error,result), result being the server name - */ -exports.getServer = function (uid: string, callback: GenericCallback) { - return callback(null, 'SERVER_NAME'); -}; - -/** - * Get user id linked with provided email address - * @param mail: the email address - * @param callback: function(error,result), result being the requested user id - */ -function getUIDFromMail(mail: string, callback: GenericCallback) { - mail = mail.toLowerCase(); - const context = {}; - async.series([ - function (done) {  - getRawEventCollection(function(err, eventCollection) {  - context.eventCollection = eventCollection; - done(err); - }); - }, - function (done) {  - context.eventCollection.findOne({content: mail, streamIds: {$in : [SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('email')]}, type: 'email/string'}, function(err, res) { - context.userId = res?.userId; - done(err); - }); - }, - function (done) {  - if (! context.userId) return done(); - context.eventCollection.findOne({userId: context.userId, streamIds: {$in : [SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('username')]}, type: 'identifier/string'}, function(err, res) { - context.username = res?.content; - done(err); - }); - } - ], function(err) { - callback(err, context.username); - }) - -}; -exports.getUIDFromMail = getUIDFromMail; - -/** - * Get all users - */ -function getAllUsers(callback: GenericCallback) { - const context = {}; - async.series([ - function (done) {  - getRawEventCollection(function(err, eventCollection) {  - context.eventCollection = eventCollection; - done(err); - }); - }, - function (done) {  - const cursor = context.eventCollection.aggregate(QUERY_GET_ALL, { cursor: { batchSize: 1 }}); - - context.users = []; - cursor.each(function(err, item) { - if (err) return done(err); - if (item === null) return done(); - const user = { - id: item._id?.userId, - registeredTimestamp: item.smallestCreatedAt * 1000 - } - if (item.events) { - for (let event of item.events) { - if (event.type === 'email/string' && event.streamIds.includes(SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('email'))) { - user.email = event.content; - } else if (event.type === 'language/iso-639-1' && event.streamIds.includes(SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('language'))) { - user.language = event.content; - } else if (event.type === 'identifier/string' && event.streamIds.includes(SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('username'))) { - user.username = event.content; - } else if (event.type === 'identifier/string' && event.streamIds.includes(SystemStreamsSerializer.addCorrectPrefixToAccountStreamId('referer'))) { - user.referer = event.content; - } else { - console.log('Unkown field... ', event); - } - } - } - context.users.push(user); - }); - } - ], function(err) { - callback(err, context.users); - }); - -}; -exports.getAllUsers = getAllUsers; - -const dbAccessState = {}; -/** - * Update the state of an access in the database - * @param key: the database key for this access - * @param value: the new state of this access - * @param callback: function(error,result), result being the result of the database transaction - */ -exports.setAccessState = function ( - key: string, value: AccessState, - callback: Callback, -) { - dbAccessState[key] = { value: value, time: Date.now() }; - callback(null, value); // callback anyway -}; - -/** Get the current state of an access in the database. - * - * @param key {string} - the database key for this access - * @param callback {nodejsCallback} - result being the corresponding JSON - * database entry - */ -exports.getAccessState = function (key: string, callback: GenericCallback) { - const res = dbAccessState[key]; - callback(null, res ? res.value : null); -}; - -/** - * Timer to autoclean dbAccessState - */ -function cleanAccessState() { - const expired = Date.now() - (60 * 10 * 1000); // 10 minutes - try { - Object.keys(dbAccessState).forEach((key) => { - if (dbAccessState[key].time < expired) delete dbAccessState[key]; - }); - } catch (e) { - console.log(e); - } - setTimeout(cleanAccessState, 60 * 1000); // check every minutes -} - -cleanAccessState(); // launch cleaner - - -const QUERY_GET_ALL = [ - { - '$match': { - streamIds: { '$in': [ 'email', 'username', 'language', 'referer' ].map(SystemStreamsSerializer.addCorrectPrefixToAccountStreamId) } - } - }, - { - '$group': { - _id: { userId: '$userId' }, - smallestCreatedAt: { '$min': '$created' }, - events: { - '$push': { content: '$content', streamIds: '$streamIds', type: '$type' } - } - } - }, - {'$sort': { smallestCreatedAt: 1 }} -]; \ No newline at end of file diff --git a/src-dest/components/register/source/storage/invitations.js b/src-dest/components/register/source/storage/invitations.js deleted file mode 100644 index 9b1d37b..0000000 --- a/src-dest/components/register/source/storage/invitations.js +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Check the validity of the invitation token - * @param token: the token to be validated - * @param callback: function(result), result being 'true' if the token is valid, false otherwise - */ -exports.checkIfValid = function checkIfValid(token, callback) { - return callback(true); -}; \ No newline at end of file diff --git a/src-dest/components/register/source/storage/reserved-userid.js b/src-dest/components/register/source/storage/reserved-userid.js deleted file mode 100644 index 72750c9..0000000 --- a/src-dest/components/register/source/storage/reserved-userid.js +++ /dev/null @@ -1,19 +0,0 @@ - -const reservedWords = [ - 'access', - 'reg', - 'register', - 'service', - 'system' -] - -exports.useridIsReserved = function (userid, callback) { - if (! userid) { - return null; - } - userid = userid.toLowerCase(); - if (/^(pryv)+(.*)$/.test(userid)) { - return callback(null, true); - } - callback(null, reservedWords.includes(userid)); -}; diff --git a/src-dest/components/register/source/storage/users.js b/src-dest/components/register/source/storage/users.js deleted file mode 100644 index 65c9f84..0000000 --- a/src-dest/components/register/source/storage/users.js +++ /dev/null @@ -1,100 +0,0 @@ -// @flow - -/** - * Extension of database.js dedicated to user management - */ - -const db = require('../storage/database'); -const async = require('async'); -const lodash = require('lodash'); -const logger = require('winston'); -const messages = require('../utils/messages'); -const domain = '.' + require('../config').get('dns:domain'); - -const info = require('../business/service-info'); -const Pryv = require('pryv'); - -type GenericCallback = (err?: ?Error, res: ?T) => mixed; -type Callback = GenericCallback; - -export type UserInformation = { - id?: string, - - username: string, - email: string, - language: string, - - password: string, - passwordHash: string, - - invitationToken: string, - registeredTimestamp?: number, - - server?: string, -} - -type CreateResult = { - username: string, - server: string, - apiEndpoint: string -}; - -/** - * Create (register) a new user - * - * @param host the hosting for this user - * @param user the user data, a json object containing: username, password hash, language and email - * @param callback function(error,result), result being a json object containing new user data - */ -exports.create = function create(host, inUser: UserInformation, callback: GenericCallback) { - const user = lodash.clone(inUser); - - // We store usernames and emails as lower case, allowing comparison with any - // other lowercase string. - user.username = user.username.toLowerCase(); - user.email = user.email.toLowerCase(); - - // Construct the request for core, including the password. - const request = { - username: user.username, - passwordHash: user.passwordHash, - language: user.language, - email: user.email - }; - - // Remove to forget the password - delete user.passwordHash; - delete user.password; - - db.createUser(request, function (error, result) { - if (error) return callback(error, null); - if (! result || !result.id) return callback(new Error('Invalid answer from core'), null); - callback(error, { - username: user.username, - server: user.username + domain, - apiEndpoint: Pryv.Service.buildAPIEndpoint(info, user.username, null), - }); - }); -}; - -type ServerUsageStats = { - [name: string]: number -}; - -/** - * Get a list of users on a specific server - * @param serverName: the name of the server - * @param callback: function(error, result), result being an array of users - */ -exports.getUsersOnServer = function (serverName: string, callback: Callback) { - getAllUsersInfos(callback); -}; - -/** - * Get a list of all user's information (see getUserInfos) - * @param callback: function(error, result), result being a list of information for all users - */ -function getAllUsersInfos (callback: GenericCallback>) { - db.getAllUsers(callback); -}; -exports.getAllUsersInfos = getAllUsersInfos; \ No newline at end of file diff --git a/src-dest/components/register/test/acceptance/email.test.js b/src-dest/components/register/test/acceptance/email.test.js deleted file mode 100644 index f4823aa..0000000 --- a/src-dest/components/register/test/acceptance/email.test.js +++ /dev/null @@ -1,97 +0,0 @@ - -const { databaseFixture } = require('test-helpers'); -const { produceMongoConnection, context } = require('api-server/test/test-helpers'); -const regPath = require('api-server/src/routes/Paths').Register; - -const cuid = require('cuid'); - -const chai = require('chai'); -const assert = chai.assert; - -describe('register /email', function () { - let user; - - let mongoFixtures; - before(async function () { - mongoFixtures = databaseFixture(await produceMongoConnection()); - }); - after(() => { - mongoFixtures.clean(); - }); - - - let username; - before(() => { - username = cuid().substr(5); - email = username + '@pryv.io'; - }); - - before(async () => { - server = await context.spawn(); - }); - after(() => { - server.stop(); - }); - - before(async function () { - user = await mongoFixtures.user(username, { - email: email - }); - }); - - describe('GET /:email/check_email', function () { - it('[RET1] should return item-already-exists if email exists ', async function () { - const res = await server.request() - .get(regPath + '/' + email + '/check_email') - .set('Accept', 'application/json'); - assert.equal(res.status, 409); - const body = res.body; - assert.exists(body.error); - assert.equal(body.error.id, 'item-already-exists'); - assert.isTrue(body.error.message.includes(username)); - }); - - it('[RER1] should return false if email does not exists ', async function () { - const wrongEmail = cuid().substr(5) + '@toto.com'; - const res = await server.request() - .get(regPath + '/' + wrongEmail + '/check_email') - .set('Accept', 'application/json'); - assert.equal(res.status, 200); - assert.equal(res.body.reserved, false); - }); - }); - - describe('POST /email/check', function () { - const callPath = regPath + '/email/check' - it('[REZ7] should return 410 gone resource', async function () { - const res = await server.request() - .post(callPath) - .send({ email: email }); - assert.equal(res.status, 410); - }); - }); - - const calls = ['uid', 'username']; - for (let i = 0; i < calls.length; i++) { - const call = calls[i]; - describe('GET /:email/' + call, function () { - - it('[RET' + (i + 1) * 2 + '] should return uid from email if it exists', async function () { - const res = await server.request() - .get(regPath + '/' + email + '/' + call) - .set('Accept', 'application/json'); - assert.equal(res.status, 200); - assert.equal(res.body[call], username); - }); - - it('[RET' + (i + 1) * 2 + 1 + '] should not return uid from email if it exists', async function () { - const wrongEmail = cuid() + '@toto.com'; - const res = await server.request() - .get(regPath + '/' + wrongEmail + '/' + call) - .set('Accept', 'application/json'); - assert.equal(res.status, 404); - assert.equal(res.body.id, 'UNKNOWN_EMAIL'); - }); - }); - } -}); \ No newline at end of file diff --git a/src-dest/components/storage/README.md b/src-dest/components/storage/README.md deleted file mode 100644 index bf87e7f..0000000 --- a/src-dest/components/storage/README.md +++ /dev/null @@ -1 +0,0 @@ -#### Please refer to the root README.md \ No newline at end of file diff --git a/src-dest/components/www/package.json b/src-dest/components/www/package.json deleted file mode 100644 index c44958c..0000000 --- a/src-dest/components/www/package.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "name": "www", - "description": "Pryv WWW component", - "version": "0.0.1", - "private": true, - "author": "Pryv SA", - "main": "source/index.js", - "scripts": { - "test": "NODE_ENV=test PRYV_CONFIG=../api-server/config/test.json ../../node_modules/.bin/mocha --timeout 10000 --reporter=dot 'test/**/*.test.js' --exit" - }, - "dependencies": { - }, - "devDependencies": { - } -} \ No newline at end of file diff --git a/src-dest/config.yml b/src-dest/config.yml deleted file mode 100644 index adcc179..0000000 --- a/src-dest/config.yml +++ /dev/null @@ -1,21 +0,0 @@ -dnsLess: - publicUrl: http://localhost:3000 -http: - port: 3000 - ip: 127.0.0.1 -auth: - adminAccessKey: iuahwd0ba87hw0bd7a8hwd - trustedApps: "*@https://pryv.github.io*, *@https://*.rec.la*" -eventFiles: - attachmentsDirPath: var-pryv/attachment-files -service: - name: Open-Pryv.io - support: https://pryv.com/open-pryv-non-configured-page/ - terms: https://pryv.com/open-pryv-non-configured-page/ - home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json -services: - email: - enabled: - welcome: true - resetPassword: true diff --git a/src-dest/configs/nginx.conf b/src-dest/configs/nginx.conf deleted file mode 100644 index 77a129a..0000000 --- a/src-dest/configs/nginx.conf +++ /dev/null @@ -1,61 +0,0 @@ -user nginx; -worker_processes 2; - -error_log /etc/nginx/error_log.log; - -events { - worker_connections 1024; -} - -http { - access_log /var/log/nginx/access.log; - - types_hash_max_size 2048; - - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 10m; - - # HSTS - add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - - # Forward secrecy settings - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_prefer_server_ciphers off; - - # HSTS (ngx_http_headers_module is required) (63072000 seconds) - add_header Strict-Transport-Security "max-age=63072000" always; - - ssl_certificate /etc/letsencrypt/live/${HOSTNAME}/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/${HOSTNAME}/privkey.pem; - - #include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - include /etc/nginx/mime.types; - - sendfile on; - - keepalive_timeout 65; - tcp_nodelay on; - - # increased waiting times for email - proxy_connect_timeout 600; - proxy_send_timeout 600; - proxy_read_timeout 600; - send_timeout 600; - - # Gzip - gzip on; - gzip_http_version 1.1; - gzip_vary on; - gzip_comp_level 6; - gzip_proxied any; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js; - gzip_buffers 16 8k; - gzip_disable "MSIE [1-6]\.(?!.*SV1)"; - - include /etc/nginx/site*.conf; - - server_tokens off; -} diff --git a/src-dest/configs/rec-la.yml b/src-dest/configs/rec-la.yml deleted file mode 100644 index 0da6ecd..0000000 --- a/src-dest/configs/rec-la.yml +++ /dev/null @@ -1,23 +0,0 @@ -dnsLess: - publicUrl: https://my-computer.rec.la:4443 -http: - port: 3000 - ip: 127.0.0.1 -auth: - adminAccessKey: REPLACE_ME - trustedApps: "*@https://pryv.github.io, *@https://*.rec.la*" -eventFiles: - attachmentsDirPath: var-pryv/attachment-files -service: - name: Open-Pryv.io - support: https://pryv.com/open-pryv-non-configured-page/ - terms: https://pryv.com/open-pryv-non-configured-page/ - home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json - assets: - definitions: https://my-computer.rec.la:4443/www/assets/index.json -services: - email: - enabled: - welcome: true - resetPassword: true diff --git a/src-dest/configs/site.conf b/src-dest/configs/site.conf deleted file mode 100644 index a890ee4..0000000 --- a/src-dest/configs/site.conf +++ /dev/null @@ -1,65 +0,0 @@ - -upstream core_server { - # api hostfrom docker compose and max_fails , should be changed for production OVERRIDE ME - server open-pryv.io:3000 max_fails=10 fail_timeout=30s; -} - -upstream websocket_server { - # api hostfrom docker compose and max_fails , should be changed for production OVERRIDE ME - server open-pryv.io:3000 max_fails=10 fail_timeout=30s; -} - -# API (Core) -server { - # redirect from http to https - listen 80 default_server; - server_name ${HOSTNAME}; - - location /.well-known/acme-challenge/ { - root /var/www/certbot; - } - location / { - return 301 https://$host$request_uri; - } -} - -server { - # redirect from www to without www - server_name www.${HOSTNAME}; - return 301 $scheme://${HOSTNAME}$request_uri; -} - -server { - listen 443 ssl; - - # set server name from env variables (set in docker compose) - server_name ${HOSTNAME}; - - client_max_body_size 20M; - - ### Proxy options (has to be within server definition to be effective) - # This enables websocket support - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto https; - proxy_redirect off; - proxy_buffering off; - proxy_buffers 16 8k; - # User information will be in the host, so proxy that as well. - set $my_host $http_host; - proxy_set_header Host $my_host; - - location / { - proxy_pass http://core_server; - } - - # Socket.IO: Handshakes will be done against a specific backend - # process and will not be valid on other backend processes. We cannot load - # balance this the same way as other calls. - location /socket.io/ { - proxy_pass http://websocket_server; - } -} \ No newline at end of file diff --git a/src-dest/docker/README-build.md b/src-dest/docker/README-build.md deleted file mode 100644 index 7ded953..0000000 --- a/src-dest/docker/README-build.md +++ /dev/null @@ -1,37 +0,0 @@ -# Build your own docker images - -This guide explains how to build your own docker Open Pryv.io docker images. - -*Prerequisites*: - -- [Docker v19.03](https://docs.docker.com/engine/install/) -- [Docker-compose v1.26](https://docs.docker.com/compose/install/) -- [Yarn v1.22.4](https://classic.yarnpkg.com/en/docs/install/) - -Prepare the various assets, run the following commands from the `docker/` directory: - -- `bash ../scripts/setup-app-web-auth3.bash` -- `bash ../scripts/setup-assets.bash` -- `bash ../scripts/setup-admin-key.bash` - -## with external SSL - -Run `TAG=latest docker-compose -f local/docker-compose.no-ssl-build.yml up --build` - -- [Config](https://github.com/pryv/open-pryv.io#config) file `local/dockerized-config-no-ssl.yml` -- launch API on `http://localhost:3000` - -After images are built, you can run the command above just without "--build" part. - -## with built-in SSL - -Fetch the [rec-la](https://github.com/pryv/rec-la) SSL certificates: - -- Run `bash ../scripts/download-recla-certificates.sh` - -Run `TAG=latest docker-compose -f local/docker-compose.with-ssl-build.yml up --build` - -- [Config](https://github.com/pryv/open-pryv.io#config) file `local/dockerized-config.yml` -- Launch API on `https://my-computer.rec.la:4443` - -After images are built, you can run the command above just without "--build" part. diff --git a/src-dest/docker/README.md b/src-dest/docker/README.md deleted file mode 100644 index 34249cf..0000000 --- a/src-dest/docker/README.md +++ /dev/null @@ -1,66 +0,0 @@ -# Dockerized Open Pryv.io - -This archive contains the necessary files to download and run Open Pryv.io. - -*Prerequisites*: - -- [Docker v19.03](https://docs.docker.com/engine/install/) -- [Docker-compose v1.26](https://docs.docker.com/compose/install/) -- [Yarn v1.22.4](https://classic.yarnpkg.com/en/docs/install/) -- Rsync (for Backup and restore only) - -## Local dev with SSL - -1. Edit the following value in the [Config](https://github.com/pryv/open-pryv.io#config) file `local/dockerized-config.yml`: - - auth:adminAccessKey: secret for admin functions, change it from its default value otherwise Open Pryv.io will crash on boot. - -2. Run: - -```bash -docker-compose -f local/docker-compose.with-ssl.yml up -``` - -It will run Open Pryv.io on https://my-computer.rec.la:4443, using [rec-la](https://github.com/pryv/rec-la). - -If the rec-la certificates have expired, you can download valid ones at [www.rec.la](https://www.rec.la/) and place them in `rec.la-certificates/` - -## Server with built-in SSL - -1. Edit the following values in the [Config](https://github.com/pryv/open-pryv.io#config) file `production-with-ssl/dockerized-config.yml` and docker-compose file: `production-with-ssl/docker-compose.yml`: - - - ${HOSTNAME}: the hostname part of the public URL - - auth:adminAccessKey: secret for admin functions, change it from its default value otherwise Open Pryv.io will crash on boot. - -2. Run: - -```bash -docker-compose -f production-with-ssl/docker-compose.yml up -``` - -It will run Open Pryv.io on https://${HOSTNAME}. - -## Server with external SSL - -1. Edit the following value in the [Config](https://github.com/pryv/open-pryv.io#config) file `production-no-ssl/dockerized-config.yml`: - - ${HOSTNAME}: the hostname part of the public URL - - auth:adminAccessKey: secret for admin functions, change it from its default value otherwise Open Pryv.io will crash on boot. - -2. Run: - -```bash -docker-compose -f production-no-ssl/docker-compose.yml up -``` - -It will run Open Pryv.io on http://0.0.0.0:3000. However, all [service information](https://api.pryv.com/reference/#service-info) resources will be advertised on https://${HOSTNAME}. - -## Backup - -Run `./scripts/backup-database-docker.sh` to generate a dump of the current database contents in `var-pryv/backup/`. -Run `./scripts/backup-attachments-docker.sh ${BACKUP_FOLDER}` to copy the current attachment files. -Depending on your setup, you may need additional access rights. - -## Restore - -Run `./scripts/restore-database-docker.sh` to restore data from `var-pryv/backup/`. -Run `./scripts/restore-attachments-docker.sh ${BACKUP_FOLDER}` to restore attachments data from the provided backup folder. -Depending on your setup, you may need additional access rights. \ No newline at end of file diff --git a/src-dest/docker/build-local.sh b/src-dest/docker/build-local.sh deleted file mode 100755 index 51c30c9..0000000 --- a/src-dest/docker/build-local.sh +++ /dev/null @@ -1,78 +0,0 @@ -#!/bin/bash - -# quit if fail -set -e - -if ! [ -x "$(command -v docker-compose)" ]; then - echo 'Error: docker-compose is not installed.' >&2 - exit 1 -fi - -# ===================================================================== -# ================= Create folders with not root rights================ -# ===================================================================== -if [ ! -d "var-pryv/mongodb" ]; then `mkdir -p var-pryv/mongodb`; fi -if [ ! -d "var-pryv/logs" ]; then `mkdir -p var-pryv/logs`; fi - -# ===================================================================== -# ================= Download authentication frontend ================== -# ===================================================================== -# download git dependencies (so there would be no need to github authentication inside docker container) - -APP_WEB_AUTH_FOLDER="app-web-auth3" -if [ ! -d $APP_WEB_AUTH_FOLDER ]; then - git clone --depth=1 --branch=master https://github.com/pryv/app-web-auth3.git $APP_WEB_AUTH_FOLDER -fi - -# ===================================================================== -# ================= Setup assets to public_html/assets/================ -# ================= like registration button style and etc============= -# ===================================================================== - -bash ../scripts/setup-assets.bash - -# ===================================================================== -# ================= Config parsing starts ===================== -# ===================================================================== -jsonval () { - temp=`echo $1 | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $2` - # | sed -e 's/^ *//g' -e 's/ *$//g - temp=${temp##*|} - echo "$temp" -} -CONFIGS_FILE="local/dockerized-config.yml" -JSON_CONF=$(cat $CONFIGS_FILE) -PUBLIC_URL_ROW=$(jsonval "$JSON_CONF" "publicUrl") -HOSTNAME=$(echo $PUBLIC_URL_ROW | cut -d"/" -f3) -echo "Public URL is $PUBLIC_URL_ROW" -echo "Hostname is $HOSTNAME" - -# ===================================================================== -# ================= Config parsing ends ===================== -# ===================================================================== - -# download or update rec.la domain certificates -bash ../scripts/download-recla-certificates.sh - -# ===================================================================== -# ================= Start docker compose ===================== -# ===================================================================== - -DOCKER_COMPOSE_FILE=$1 -DOCKER_COMMAND=$2 -PORT=80 -PORT_SSL=4443 -if [ -z "$DOCKER_COMPOSE_FILE" ] -then - echo "No docker compose file was given so starting default with ./local/docker-compose.no-ssl.yml" - HOSTNAME=$HOSTNAME TAG=latest docker-compose -f local/docker-compose.no-ssl.yml up --build -else - if [ -z "$DOCKER_COMMAND" ] - then - echo "Running: HOSTNAME=$HOSTNAME TAG=latest docker-compose -f $DOCKER_COMPOSE_FILE up --build" - HOSTNAME=$HOSTNAME TAG=latest docker-compose -f $DOCKER_COMPOSE_FILE up --build - else - echo "Running: HOSTNAME=$HOSTNAME TAG=latest docker-compose -f $DOCKER_COMPOSE_FILE $DOCKER_COMMAND" - HOSTNAME=$HOSTNAME TAG=latest docker-compose -f $DOCKER_COMPOSE_FILE $DOCKER_COMMAND - fi -fi diff --git a/src-dest/docker/build-tarball.sh b/src-dest/docker/build-tarball.sh deleted file mode 100755 index 61e48d2..0000000 --- a/src-dest/docker/build-tarball.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/bin/bash - -SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) -cd $SCRIPT_FOLDER - -mkdir -p ./rec.la-certificates -mkdir -p ./public_html -curl -o ./rec.la-certificates/rec.la-key.pem https://www.rec.la/rec.la-key.pem -curl -o ./rec.la-certificates/rec.la-bundle.crt https://www.rec.la/rec.la-bundle.crt -cp -af ../public_html/* ./public_html - -tar czfv dockerized-open-pryv.io.tgz \ - ./local/dockerized-config.yml \ - ./local/dockerized-service-mail-config.hjson \ - ./local/nginx-templates/ \ - ./local/dhparam.pem \ - ./local/docker-compose.with-ssl.yml \ - ./production-no-ssl \ - ./production-with-ssl \ - ./README.md \ - ./rec.la-certificates \ - ./public_html \ - ./scripts/backup-database-docker.sh \ - ./scripts/restore-database-docker.sh \ - ./scripts/backup-attachments-docker.sh \ - ./scripts/restore-attachments-docker.sh \ - -rm -r ./rec.la-certificates -rm -r ./public_html \ No newline at end of file diff --git a/src-dest/docker/local/Dockerfile b/src-dest/docker/local/Dockerfile deleted file mode 100644 index 5ad5605..0000000 --- a/src-dest/docker/local/Dockerfile +++ /dev/null @@ -1,26 +0,0 @@ -FROM node:16 - -WORKDIR /app - -# Copy all files -COPY . /app/ - -# Choose dockerized config instead of default local env -COPY ./docker/local/dockerized-config.yml /app/config.yml -# the same for mail service -COPY ./docker/local/dockerized-service-mail-config.hjson /app/service-mail/config.json - -RUN apt-get update -y -# install rsync needed for copying files to dist folder -RUN apt-get -y install rsync sendmail && yes "Y" | /usr/sbin/sendmailconfig - -RUN echo 'echo "$(tail -n 1 /etc/hosts) localhost localhost.localdomain $HOSTNAME" >> /etc/hosts' > /app/mail.sh -RUN echo 'yes "Y" | /usr/sbin/sendmailconfig' >> /app/mail.sh -RUN echo 'yarn mail' >> /app/mail.sh -RUN yarn setup && yarn release - -RUN apt-get install nano - -EXPOSE 3000 -EXPOSE 9000 - diff --git a/src-dest/docker/local/dhparam.pem b/src-dest/docker/local/dhparam.pem deleted file mode 100644 index 6966a02..0000000 --- a/src-dest/docker/local/dhparam.pem +++ /dev/null @@ -1,8 +0,0 @@ ------BEGIN DH PARAMETERS----- -MIIBCAKCAQEA/cH79d4RVNNgwJlSFJRc1lxnWXaX/neKzAsWn/VVzIfBgySa/1Px -9a10NZFS6w+96kW6EzFs01x3aPgyUBI+PqWWIo+UhRODAtvgfQQdefn6YMO2scdL -M3OMq+9ZDkSg9sSPpz4scJlf+geGEN4BDEMe0Lp+LBtfdugOBLUa3QhZzoRra9By -zxDMaU6wCZG1pOUPm6fg7kkUXMQ85Mkqhng+NEy+duDzEwchnr2ArBTpCn7EDoi8 -QdorXpzGivY2gypnlsFvatG9RZADuCwdoV+kMTeuX1exNmua0qoQuNsX6GP9BYbP -vuU8SjwMRD/Ksful0lcI9sksWzYcsTuYAwIBAg== ------END DH PARAMETERS----- diff --git a/src-dest/docker/local/docker-compose.no-ssl-build.yml b/src-dest/docker/local/docker-compose.no-ssl-build.yml deleted file mode 100644 index 90b1142..0000000 --- a/src-dest/docker/local/docker-compose.no-ssl-build.yml +++ /dev/null @@ -1,47 +0,0 @@ -version: "3.8" -services: - open-pryv.io: - build: - context: ../.. - dockerfile: ./docker/local/Dockerfile - image: pryvio/open-pryv.io:${TAG} - command: "yarn api" - container_name: "open-pryv.io" - restart: "always" - ports: - - 3000:3000 - volumes: - - ./dockerized-config-no-ssl.yml:/app/config.yml - - ../../public_html/:/app/public_html/ - - ../../var-pryv/core/data/:/app/data/ - depends_on: - - open-pryv-mongo - networks: - - app-network - - open-pryv-mail: - image: pryvio/open-pryv.io:${TAG} - command: "/bin/sh /app/mail.sh" - container_name: "open-pryv-mail" - restart: "always" - depends_on: - - open-pryv.io - volumes: - - ../../var-pryv/logs/:/app/var-pryv/logs/ - - ./dockerized-service-mail-config.hjson:/app/service-mail/config.hjson - networks: - - app-network - - open-pryv-mongo: - image: mongo:4.2.9 - container_name: "open-pryv-mongo" - restart: "always" - volumes: - - ../../var-pryv/mongodb/data/:/data/db/ - - ../../var-pryv/mongodb/backup/:/data/backup/ - networks: - - app-network - -networks: - app-network: - driver: bridge diff --git a/src-dest/docker/local/docker-compose.with-ssl-build.yml b/src-dest/docker/local/docker-compose.with-ssl-build.yml deleted file mode 100644 index 7f0aa5e..0000000 --- a/src-dest/docker/local/docker-compose.with-ssl-build.yml +++ /dev/null @@ -1,69 +0,0 @@ -version: "3.8" -services: - open-pryv.io: - build: - context: ../.. - dockerfile: ./docker/local/Dockerfile - image: pryvio/open-pryv.io:${TAG} - command: "yarn api" - container_name: "open-pryv.io" - restart: "always" - volumes: - - ./dockerized-config.yml:/app/config.yml - - ../../public_html/:/app/public_html/ - - ../../var-pryv/core/data/:/app/data/ - depends_on: - - open-pryv-mongo - networks: - - app-network - - open-pryv-mail: - image: pryvio/open-pryv.io:${TAG} - command: "/bin/sh /app/mail.sh" - container_name: "open-pryv-mail" - restart: "always" - depends_on: - - open-pryv.io - volumes: - - ../../var-pryv/logs/:/app/var-pryv/logs/ - - ./dockerized-service-mail-config.hjson:/app/service-mail/config.hjson - networks: - - app-network - - open-pryv-mongo: - image: mongo:4.2.9 - container_name: "open-pryv-mongo" - restart: "always" - volumes: - - ../../var-pryv/mongodb/data/:/data/db/ - - ../../var-pryv/mongodb/backup/:/data/backup/ - networks: - - app-network - - open-pryv-nginx: - container_name: "open-pryv-nginx" - image: nginx:latest - volumes: - # You can load custom nginx config and use env variables in it - - ./nginx-templates:/etc/nginx/templates - # Load default *.rec.la (or your) certificates - - ../../rec.la-certificates/src/rec.la-bundle.crt:/etc/letsencrypt/live/my-computer.rec.la/fullchain.pem - - ../../rec.la-certificates/src/rec.la-key.pem:/etc/letsencrypt/live/my-computer.rec.la/privkey.pem - - ./dhparam.pem:/etc/letsencrypt/ssl-dhparams.pem - ports: - - 80:80 - - 4443:4443 - depends_on: - - open-pryv.io - - open-pryv-mail - networks: - - app-network - environment: - - PORT=80 - - PORT_SSL=4443 - - HOSTNAME=my-computer.rec.la - - NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx - -networks: - app-network: - driver: bridge diff --git a/src-dest/docker/local/docker-compose.with-ssl.yml b/src-dest/docker/local/docker-compose.with-ssl.yml deleted file mode 100644 index 83b6505..0000000 --- a/src-dest/docker/local/docker-compose.with-ssl.yml +++ /dev/null @@ -1,66 +0,0 @@ -version: "3.8" -services: - open-pryv.io: - image: pryvio/open-pryv.io:latest - command: "yarn api" - container_name: "open-pryv.io" - restart: "always" - volumes: - - ./dockerized-config.yml:/app/config.yml - - ../public_html/:/app/public_html/ - - ../var-pryv/core/data/:/app/data/ - depends_on: - - open-pryv-mongo - networks: - - app-network - - open-pryv-mail: - image: pryvio/open-pryv.io:latest - command: "/bin/sh /app/mail.sh" - container_name: "open-pryv-mail" - restart: "always" - depends_on: - - open-pryv.io - volumes: - - ../var-pryv/logs/:/app/var-pryv/logs/ - - ./dockerized-service-mail-config.hjson:/app/service-mail/config.hjson - networks: - - app-network - - open-pryv-mongo: - image: mongo:4.2.9 - container_name: "open-pryv-mongo" - restart: "always" - volumes: - - ../var-pryv/mongodb/data/:/data/db/ - - ../var-pryv/mongodb/backup/:/data/backup/ - networks: - - app-network - - open-pryv-nginx: - container_name: "open-pryv-nginx" - image: nginx:latest - volumes: - # You can load custom nginx config and use env variables in it - - ./nginx-templates:/etc/nginx/templates - # Load default *.rec.la (or your) certificates - - ../rec.la-certificates/rec.la-bundle.crt:/etc/letsencrypt/live/my-computer.rec.la/fullchain.pem - - ../rec.la-certificates/rec.la-key.pem:/etc/letsencrypt/live/my-computer.rec.la/privkey.pem - - ./dhparam.pem:/etc/letsencrypt/ssl-dhparams.pem - ports: - - 80:80 - - 4443:4443 - depends_on: - - open-pryv.io - - open-pryv-mail - networks: - - app-network - environment: - - PORT=80 - - PORT_SSL=4443 - - HOSTNAME=my-computer.rec.la - - NGINX_ENVSUBST_OUTPUT_DIR=/etc/nginx - -networks: - app-network: - driver: bridge diff --git a/src-dest/docker/local/dockerized-config-no-ssl.yml b/src-dest/docker/local/dockerized-config-no-ssl.yml deleted file mode 100644 index d81fa03..0000000 --- a/src-dest/docker/local/dockerized-config-no-ssl.yml +++ /dev/null @@ -1,27 +0,0 @@ -openSource: - isActive: true -dnsLess: - isActive: true - publicUrl: http://localhost:3000 -http: - port: 3000 - ip: 0.0.0.0 -auth: - adminAccessKey: REPLACE_ME - trustedApps: "*@https://pryv.github.io, *@http://*localhost*" -eventFiles: - attachmentsDirPath: "/app/data/attachments" -service: - name: Open-Pryv.io - support: https://pryv.com/open-pryv-non-configured-page/ - terms: https://pryv.com/open-pryv-non-configured-page/ - home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json -services: - email: - enabled: - welcome: true - resetPassword: true - url: http://open-pryv-mail:9000/sendmail/ -database: - host: open-pryv-mongo diff --git a/src-dest/docker/local/dockerized-config.yml b/src-dest/docker/local/dockerized-config.yml deleted file mode 100644 index 704cc97..0000000 --- a/src-dest/docker/local/dockerized-config.yml +++ /dev/null @@ -1,27 +0,0 @@ -openSource: - isActive: true -dnsLess: - isActive: true - publicUrl: https://my-computer.rec.la:4443 -http: - port: 3000 - ip: 0.0.0.0 -auth: - adminAccessKey: REPLACE_ME - trustedApps: "*@https://pryv.github.io, *@https://*.rec.la*" -eventFiles: - attachmentsDirPath: "/app/data/attachments" -service: - name: Open-Pryv.io - support: https://pryv.com/open-pryv-non-configured-page/ - terms: https://pryv.com/open-pryv-non-configured-page/ - home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json -services: - email: - enabled: - welcome: true - resetPassword: true - url: http://open-pryv-mail:9000/sendmail/ -database: - host: open-pryv-mongo diff --git a/src-dest/docker/local/dockerized-service-mail-config.hjson b/src-dest/docker/local/dockerized-service-mail-config.hjson deleted file mode 100644 index 40d7285..0000000 --- a/src-dest/docker/local/dockerized-service-mail-config.hjson +++ /dev/null @@ -1,54 +0,0 @@ -{ - // Logging settings - logs: { - prefix: '', - console: { active: true, level: 'info', colorize: true }, - file: { active: false }, - }, - email: { - message: { - // Sender name and email address - from: { - name: "Your Email address", - address: "changeme@pryv.com" - } - }, - preview: false, // If true, it will open a webpage with a preview - send: true // Activate/deactivate the actual sending (prod/test env) - }, - // Alternative transport, using the sendmail command of the machine - sendmail: { - // Set to false to use SMTP transport - active: true, - // Path of the sendmail command on the machine - path: '/usr/sbin/sendmail' - }, - // SMTP will be used if sendmail:active is false, - smtp: { - // SMTP host of the external email delivery service - host: "smtp.email.service", - // SMTP port - port: 587, - // Credentials to authenticate against SMTP server - auth: { - user: "change@my.email", - pass: "YourPassword" - } - }, - http: { - // IP address on which the mailing server is listening - ip: "0.0.0.0", - // Port on which the mailing server is listening - port: 9000, - // Each sendmail request should contain authorization header that - // matches this key, used to prevent abuse. - // No need to change if ip adress is not facing the internet. - auth: "SHOULD_MATCH_SERVICE_MAIL", - }, - templates: { - // Root folder where the templates are stored - root: './templates/', - // Default language for templates - defaultLang: 'en' - } -} diff --git a/src-dest/docker/local/nginx-templates/nginx.conf.template b/src-dest/docker/local/nginx-templates/nginx.conf.template deleted file mode 100644 index dc2aadb..0000000 --- a/src-dest/docker/local/nginx-templates/nginx.conf.template +++ /dev/null @@ -1,55 +0,0 @@ -user nginx; -worker_processes 2; - -error_log /etc/nginx/error_log.log; - -events { - worker_connections 1024; -} - -http { - access_log /var/log/nginx/access.log; - - types_hash_max_size 2048; - - ssl_session_cache shared:SSL:10m; - ssl_session_timeout 10m; - - # HSTS - add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always; - - # Forward secrecy settings - ssl_protocols TLSv1.2 TLSv1.3; - ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; - ssl_prefer_server_ciphers off; - - # HSTS (ngx_http_headers_module is required) (63072000 seconds) - add_header Strict-Transport-Security "max-age=63072000" always; - - ssl_certificate /etc/letsencrypt/live/${HOSTNAME}/fullchain.pem; - ssl_certificate_key /etc/letsencrypt/live/${HOSTNAME}/privkey.pem; - - #include /etc/letsencrypt/options-ssl-nginx.conf; - ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; - - include /etc/nginx/mime.types; - - sendfile on; - - keepalive_timeout 65; - tcp_nodelay on; - - # Gzip - gzip on; - gzip_http_version 1.1; - gzip_vary on; - gzip_comp_level 6; - gzip_proxied any; - gzip_types text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript application/javascript text/x-js; - gzip_buffers 16 8k; - gzip_disable "MSIE [1-6]\.(?!.*SV1)"; - - include /etc/nginx/site*.conf; - - server_tokens off; -} diff --git a/src-dest/docker/local/nginx-templates/site.conf.template b/src-dest/docker/local/nginx-templates/site.conf.template deleted file mode 100644 index 431f15c..0000000 --- a/src-dest/docker/local/nginx-templates/site.conf.template +++ /dev/null @@ -1,65 +0,0 @@ - -upstream core_server { - # api hostfrom docker compose and max_fails , should be changed for production OVERRIDE ME - server open-pryv.io:3000 max_fails=10 fail_timeout=30s; -} - -upstream websocket_server { - # api hostfrom docker compose and max_fails , should be changed for production OVERRIDE ME - server open-pryv.io:3000 max_fails=10 fail_timeout=30s; -} - -# API (Core) -server { - # redirect from http to https - listen ${PORT} default_server; - server_name ${HOSTNAME}; - - location /.well-known/acme-challenge/ { - root /var/www/certbot; - } - location / { - return 301 https://$host$request_uri; - } -} - -server { - # redirect from www to without www - server_name www.${HOSTNAME}; - return 301 $scheme://${HOSTNAME}$request_uri; -} - -server { - listen ${PORT_SSL} ssl; - - # set server name from env variables (set in docker compose) - server_name ${HOSTNAME}; - - client_max_body_size 20M; - - ### Proxy options (has to be within server definition to be effective) - # This enables websocket support - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto https; - proxy_redirect off; - proxy_buffering off; - proxy_buffers 16 8k; - # User information will be in the host, so proxy that as well. - set $my_host $http_host; - proxy_set_header Host $my_host; - - location / { - proxy_pass http://core_server; - } - - # Socket.IO: Handshakes will be done against a specific backend - # process and will not be valid on other backend processes. We cannot load - # balance this the same way as other calls. - location /socket.io/ { - proxy_pass http://websocket_server; - } -} \ No newline at end of file diff --git a/src-dest/docker/production-no-ssl/docker-compose.yml b/src-dest/docker/production-no-ssl/docker-compose.yml deleted file mode 100644 index 6edb109..0000000 --- a/src-dest/docker/production-no-ssl/docker-compose.yml +++ /dev/null @@ -1,44 +0,0 @@ -version: "3" -services: - open-pryv.io: - image: pryvio/open-pryv.io:latest - command: "yarn api" - container_name: "open-pryv.io" - restart: "always" - ports: - - 3000:3000 - volumes: - - ./dockerized-config.yml:/app/config.yml - - ../public_html/:/app/public_html/ - - ../var-pryv/core/data/:/app/data/ - depends_on: - - open-pryv-mongo - networks: - - app-network - - open-pryv-mail: - image: pryvio/open-pryv.io:latest - command: "/bin/sh /app/mail.sh" - container_name: "open-pryv-mail" - restart: "always" - volumes: - - ../var-pryv/logs/:/app/var-pryv/logs/ - - ./dockerized-service-mail-config.hjson:/app/service-mail/config.hjson - depends_on: - - open-pryv.io - networks: - - app-network - - open-pryv-mongo: - image: mongo:4.2.9 - container_name: "open-pryv-mongo" - restart: "always" - volumes: - - ../var-pryv/mongodb/data/:/data/db/ - - ../var-pryv/mongodb/backup/:/data/backup/ - networks: - - app-network - -networks: - app-network: - driver: bridge diff --git a/src-dest/docker/production-no-ssl/dockerized-config.yml b/src-dest/docker/production-no-ssl/dockerized-config.yml deleted file mode 100644 index a0364da..0000000 --- a/src-dest/docker/production-no-ssl/dockerized-config.yml +++ /dev/null @@ -1,28 +0,0 @@ ---- -openSource: - isActive: true -dnsLess: - isActive: true - publicUrl: https://${HOSTNAME} -http: - port: 3000 - ip: 0.0.0.0 -auth: - adminAccessKey: REPLACE_ME - trustedApps: "*@https://pryv.github.io, *@https://${HOSTNAME}*" -eventFiles: - attachmentsDirPath: "/app/data/attachments" -service: - name: Open-Pryv.io - support: https://pryv.com/open-pryv-non-configured-page/ - terms: https://pryv.com/open-pryv-non-configured-page/ - home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json -services: - email: - enabled: - welcome: true - resetPassword: true - url: http://open-pryv-mail:9000/sendmail/ -database: - host: open-pryv-mongo diff --git a/src-dest/docker/production-no-ssl/dockerized-service-mail-config.hjson b/src-dest/docker/production-no-ssl/dockerized-service-mail-config.hjson deleted file mode 100644 index 40d7285..0000000 --- a/src-dest/docker/production-no-ssl/dockerized-service-mail-config.hjson +++ /dev/null @@ -1,54 +0,0 @@ -{ - // Logging settings - logs: { - prefix: '', - console: { active: true, level: 'info', colorize: true }, - file: { active: false }, - }, - email: { - message: { - // Sender name and email address - from: { - name: "Your Email address", - address: "changeme@pryv.com" - } - }, - preview: false, // If true, it will open a webpage with a preview - send: true // Activate/deactivate the actual sending (prod/test env) - }, - // Alternative transport, using the sendmail command of the machine - sendmail: { - // Set to false to use SMTP transport - active: true, - // Path of the sendmail command on the machine - path: '/usr/sbin/sendmail' - }, - // SMTP will be used if sendmail:active is false, - smtp: { - // SMTP host of the external email delivery service - host: "smtp.email.service", - // SMTP port - port: 587, - // Credentials to authenticate against SMTP server - auth: { - user: "change@my.email", - pass: "YourPassword" - } - }, - http: { - // IP address on which the mailing server is listening - ip: "0.0.0.0", - // Port on which the mailing server is listening - port: 9000, - // Each sendmail request should contain authorization header that - // matches this key, used to prevent abuse. - // No need to change if ip adress is not facing the internet. - auth: "SHOULD_MATCH_SERVICE_MAIL", - }, - templates: { - // Root folder where the templates are stored - root: './templates/', - // Default language for templates - defaultLang: 'en' - } -} diff --git a/src-dest/docker/production-with-ssl/build_production.sh b/src-dest/docker/production-with-ssl/build_production.sh deleted file mode 100755 index cae0ed9..0000000 --- a/src-dest/docker/production-with-ssl/build_production.sh +++ /dev/null @@ -1,38 +0,0 @@ -#!/bin/bash - -# quit if fail -set -e - -if ! [ -x "$(command -v docker-compose)" ]; then - echo 'Error: docker-compose is not installed.' >&2 - exit 1 -fi - -# ===================================================================== -# ================= Config parsing starts ===================== -# ===================================================================== -function jsonval { - temp=`echo $1 | sed 's/\\\\\//\//g' | sed 's/[{}]//g' | awk -v k="text" '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/\"\:\"/\|/g' | sed 's/[\,]/ /g' | sed 's/\"//g' | grep -w $2` - # | sed -e 's/^ *//g' -e 's/ *$//g - temp=${temp##*|} - # remove double quotes - temp="${temp//\"}" - # remove single quotes - temp="${temp//\'}" - echo "$temp" -} -#dockerized-config.yml | getJsonVal "['text']" -JSON_CONF=$(cat "dockerized-config.yml") -PUBLIC_URL_ROW=$(jsonval "$JSON_CONF" "publicUrl") -HOSTNAME=$(echo $PUBLIC_URL_ROW | cut -d"/" -f3) -EMAIL=$(echo $(jsonval "$JSON_CONF" "ssl_email") | cut -d":" -f2) - -echo "PUBLIC_URL: $PUBLIC_URL_ROW (expecting format https://example.com)" -echo "HOSTNAME: $HOSTNAME (expecting format example.com)" -echo "EMAIL: $EMAIL (expecting valid email with the same domain)" - -# ===================================================================== -# ================= Config parsing ends ===================== -# ===================================================================== - -HOSTNAME=$HOSTNAME EMAIL=$EMAIL docker-compose -f docker-compose.yml up diff --git a/src-dest/docker/production-with-ssl/docker-compose.yml b/src-dest/docker/production-with-ssl/docker-compose.yml deleted file mode 100644 index 4817bd7..0000000 --- a/src-dest/docker/production-with-ssl/docker-compose.yml +++ /dev/null @@ -1,66 +0,0 @@ -version: "3" -services: - open-pryv.io: - image: pryvio/open-pryv.io:latest - command: "yarn api" - container_name: "open-pryv.io" - restart: "always" - volumes: - - ./dockerized-config.yml:/app/config.yml - - ../public_html/:/app/public_html/ - - ../var-pryv/core/data/:/app/data/ - depends_on: - - open-pryv-mongo - networks: - - app-network - - open-pryv-mail: - image: pryvio/open-pryv.io:latest - command: "/bin/sh /app/mail.sh" - container_name: "open-pryv-mail" - restart: "always" - volumes: - - ../var-pryv/logs/:/app/var-pryv/logs/ - - ./dockerized-service-mail-config.hjson:/app/service-mail/config.hjson - depends_on: - - open-pryv.io - networks: - - app-network - - open-pryv-mongo: - image: mongo:4.2.9 - container_name: "open-pryv-mongo" - restart: "always" - volumes: - - ../var-pryv/mongodb/data/:/data/db/ - - ../var-pryv/mongodb/backup/:/data/backup/ - networks: - - app-network - - letsencrypt: - # nginx + ssl certificate by https://github.com/linuxserver/docker-letsencrypt - image: linuxserver/letsencrypt - container_name: "open-pryv-nginx" - cap_add: - - NET_ADMIN - networks: - - app-network - environment: - - PUID=1000 - - PGID=1000 - - TZ=Europe/London - - URL=${HOSTNAME} - - VALIDATION=http - - ONLY_SUBDOMAINS=false #optional - - STAGING=false #optional - change this to not be banned - volumes: - - ./config:/config - - ./nginx.conf:/config/nginx/site-confs/default - ports: - - 443:443 - - 80:80 #optional - restart: unless-stopped - -networks: - app-network: - driver: bridge diff --git a/src-dest/docker/production-with-ssl/dockerized-config.yml b/src-dest/docker/production-with-ssl/dockerized-config.yml deleted file mode 100644 index f62d61a..0000000 --- a/src-dest/docker/production-with-ssl/dockerized-config.yml +++ /dev/null @@ -1,28 +0,0 @@ -ssl_email: '' -openSource: - isActive: true -dnsLess: - isActive: true - publicUrl: https://${HOSTNAME} -http: - port: 3000 - ip: 0.0.0.0 -auth: - adminAccessKey: REPLACE_ME - trustedApps: "*@https://pryv.github.io, *@https://${HOSTNAME}*" -eventFiles: - attachmentsDirPath: "/app/data/attachments" -service: - name: Open-Pryv.io - support: https://pryv.com/open-pryv-non-configured-page/ - terms: https://pryv.com/open-pryv-non-configured-page/ - home: https://pryv.com/open-pryv-non-configured-page/ - eventTypes: https://api.pryv.com/event-types/flat.json -services: - email: - enabled: - welcome: true - resetPassword: true - url: http://open-pryv-mail:9000/sendmail/ -database: - host: open-pryv-mongo diff --git a/src-dest/docker/production-with-ssl/dockerized-service-mail-config.hjson b/src-dest/docker/production-with-ssl/dockerized-service-mail-config.hjson deleted file mode 100644 index 40d7285..0000000 --- a/src-dest/docker/production-with-ssl/dockerized-service-mail-config.hjson +++ /dev/null @@ -1,54 +0,0 @@ -{ - // Logging settings - logs: { - prefix: '', - console: { active: true, level: 'info', colorize: true }, - file: { active: false }, - }, - email: { - message: { - // Sender name and email address - from: { - name: "Your Email address", - address: "changeme@pryv.com" - } - }, - preview: false, // If true, it will open a webpage with a preview - send: true // Activate/deactivate the actual sending (prod/test env) - }, - // Alternative transport, using the sendmail command of the machine - sendmail: { - // Set to false to use SMTP transport - active: true, - // Path of the sendmail command on the machine - path: '/usr/sbin/sendmail' - }, - // SMTP will be used if sendmail:active is false, - smtp: { - // SMTP host of the external email delivery service - host: "smtp.email.service", - // SMTP port - port: 587, - // Credentials to authenticate against SMTP server - auth: { - user: "change@my.email", - pass: "YourPassword" - } - }, - http: { - // IP address on which the mailing server is listening - ip: "0.0.0.0", - // Port on which the mailing server is listening - port: 9000, - // Each sendmail request should contain authorization header that - // matches this key, used to prevent abuse. - // No need to change if ip adress is not facing the internet. - auth: "SHOULD_MATCH_SERVICE_MAIL", - }, - templates: { - // Root folder where the templates are stored - root: './templates/', - // Default language for templates - defaultLang: 'en' - } -} diff --git a/src-dest/docker/production-with-ssl/nginx.conf b/src-dest/docker/production-with-ssl/nginx.conf deleted file mode 100644 index eb74bf0..0000000 --- a/src-dest/docker/production-with-ssl/nginx.conf +++ /dev/null @@ -1,69 +0,0 @@ -## Version 2020/05/23 - Changelog: https://github.com/linuxserver/docker-letsencrypt/commits/master/root/defaults/default - -upstream core_server { - # api hostfrom docker compose and max_fails , should be changed for production OVERRIDE ME - server open-pryv.io:3000 max_fails=10 fail_timeout=30s; -} - -upstream websocket_server { - # api hostfrom docker compose and max_fails , should be changed for production OVERRIDE ME - server open-pryv.io:3000 max_fails=10 fail_timeout=30s; -} - -# redirect all traffic to https -server { - listen 80 default_server; - listen [::]:80 default_server; - server_name _; - return 301 https://$host$request_uri; -} - -# main server block -server { - listen 443 ssl http2 default_server; - listen [::]:443 ssl http2 default_server; - - root /config/www; - index index.html index.htm index.php; - - server_name _; - - # enable subfolder method reverse proxy confs - include /config/nginx/proxy-confs/*.subfolder.conf; - - # all ssl related config moved to ssl.conf - include /config/nginx/ssl.conf; - - client_max_body_size 20M; - - ### Proxy options (has to be within server definition to be effective) - # This enables websocket support - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto https; - proxy_redirect off; - proxy_buffering off; - proxy_buffers 16 8k; - # User information will be in the host, so proxy that as well. - set $my_host $http_host; - proxy_set_header Host $my_host; - - location / { - proxy_pass http://core_server; - } - - # Socket.IO: Handshakes will be done against a specific backend - # process and will not be valid on other backend processes. We cannot load - # balance this the same way as other calls. - location /socket.io/ { - proxy_pass http://websocket_server; - } -} - -# enable subdomain method reverse proxy confs -include /config/nginx/proxy-confs/*.subdomain.conf; -# enable proxy cache for auth -proxy_cache_path cache/ keys_zone=auth_cache:10m; diff --git a/src-dest/docker/scripts/backup-attachments-docker.sh b/src-dest/docker/scripts/backup-attachments-docker.sh deleted file mode 100644 index 25186d8..0000000 --- a/src-dest/docker/scripts/backup-attachments-docker.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# working dir fix -PARENT_DIR="$(pwd)" -cd "${PARENT_DIR}" - -BACKUP_DIR=$(echo $1 | sed 's:/*$::') -BACKUP_DIR="${BACKUP_DIR}/" - -export VAR_PRYV_FOLDER="${PARENT_DIR}/var-pryv" -rsync --recursive --times --human-readable --verbose --perms "${VAR_PRYV_FOLDER}/core/" $BACKUP_DIR \ No newline at end of file diff --git a/src-dest/docker/scripts/backup-database-docker.sh b/src-dest/docker/scripts/backup-database-docker.sh deleted file mode 100755 index b57f42f..0000000 --- a/src-dest/docker/scripts/backup-database-docker.sh +++ /dev/null @@ -1,3 +0,0 @@ -#! /bin/sh - -docker exec -t open-pryv-mongo mongodump -d pryv-node -o /data/backup/ diff --git a/src-dest/docker/scripts/restore-attachments-docker.sh b/src-dest/docker/scripts/restore-attachments-docker.sh deleted file mode 100644 index dfd5489..0000000 --- a/src-dest/docker/scripts/restore-attachments-docker.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/bin/sh - -# working dir fix -PARENT_DIR="$(pwd)" -cd "${PARENT_DIR}" - -BACKUP_DIR=$(echo $1 | sed 's:/*$::') -BACKUP_DIR="${BACKUP_DIR}/" - -export VAR_PRYV_FOLDER="${PARENT_DIR}/var-pryv" -rsync --recursive --times --human-readable --verbose --perms $BACKUP_DIR "${VAR_PRYV_FOLDER}/core/" \ No newline at end of file diff --git a/src-dest/docker/scripts/restore-database-docker.sh b/src-dest/docker/scripts/restore-database-docker.sh deleted file mode 100755 index 0e5f16e..0000000 --- a/src-dest/docker/scripts/restore-database-docker.sh +++ /dev/null @@ -1,3 +0,0 @@ -#! /bin/sh - -docker exec -t open-pryv-mongo mongorestore /data/backup/ diff --git a/src-dest/scripts/download-recla-certificates.sh b/src-dest/scripts/download-recla-certificates.sh deleted file mode 100755 index e32c12e..0000000 --- a/src-dest/scripts/download-recla-certificates.sh +++ /dev/null @@ -1,21 +0,0 @@ -#!/bin/bash - -SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) -cd $SCRIPT_FOLDER/.. # root - -# download rec.la certificates -CERTIFICATED_FOLDER="./rec.la-certificates" -if [ ! -d $CERTIFICATED_FOLDER ]; then - echo "Downloading default certificates to $CERTIFICATED_FOLDER" - mkdir $CERTIFICATED_FOLDER - git clone --branch=master https://github.com/pryv/rec-la.git $CERTIFICATED_FOLDER -else - echo "Refreshing default certificates in $CERTIFICATED_FOLDER" - CURRENT_DIR=$(pwd) - cd $CERTIFICATED_FOLDER # go to the certificates folder - echo $(pwd) - # download the newest version - git pull - # come back to the main dir - cd $CURRENT_DIR -fi \ No newline at end of file diff --git a/src-dest/scripts/setup-admin-key.bash b/src-dest/scripts/setup-admin-key.bash deleted file mode 100755 index 8af6769..0000000 --- a/src-dest/scripts/setup-admin-key.bash +++ /dev/null @@ -1,25 +0,0 @@ -#!/bin/bash - -SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) -cd $SCRIPT_FOLDER/.. # root - -set="abcdefghijklmonpqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789" -n=20 -rand="REPLACE_ME_" -DEFAULT_VALUE="REPLACE_ME" -for i in `seq 1 $n`; do - char=${set:$RANDOM % ${#set}:1} - rand+=$char -done -sed -i ".bak" "s/${DEFAULT_VALUE}/${rand}/g" "./config.yml" -sed -i ".bak" "s/${DEFAULT_VALUE}/${rand}/g" "./configs/rec-la.yml" -sed -i ".bak" "s/${DEFAULT_VALUE}/${rand}/g" "./docker/local/dockerized-config.yml" -sed -i ".bak" "s/${DEFAULT_VALUE}/${rand}/g" "./docker/local/dockerized-config-no-ssl.yml" - -rm "./config.yml.bak" -rm "./configs/rec-la.yml.bak" -rm "./docker/local/dockerized-config.yml.bak" -rm "./docker/local/dockerized-config-no-ssl.yml.bak" - -echo "Set new random key for admin" - diff --git a/src-dest/scripts/setup-open.bash b/src-dest/scripts/setup-open.bash deleted file mode 100755 index 83a2c2d..0000000 --- a/src-dest/scripts/setup-open.bash +++ /dev/null @@ -1,10 +0,0 @@ -#!/bin/bash - -SCRIPT_FOLDER=$(cd $(dirname "$0"); pwd) -cd $SCRIPT_FOLDER - -bash ./setup-assets.bash -bash ./setup-service-mail.bash -bash ./setup-app-web-auth3.bash -bash ./setup-admin-key.bash -bash ./download-recla-certificates.sh \ No newline at end of file diff --git a/src/lib/json.js b/src/lib/json.js deleted file mode 100644 index c7de6be..0000000 --- a/src/lib/json.js +++ /dev/null @@ -1,15 +0,0 @@ -const path = require('path'); -const fs = require('fs') -const _ = require('lodash'); - -module.exports = function (destDir) { - return function (task) { - const fileDest = path.resolve(destDir, task.target); - const jsonStringContent = fs.readFileSync(fileDest, {encoding: 'utf8'} ); - let dest = JSON.parse(jsonStringContent); - if (task.json.merge) { - dest = _.merge(dest, task.json.merge); - } - fs.writeFileSync(fileDest, JSON.stringify(dest, null, 2)); - } -} \ No newline at end of file diff --git a/src/licensing/config.yml b/src/licensing/config.yml deleted file mode 100644 index e69de29..0000000 diff --git a/src/root.js b/src/root.js deleted file mode 100644 index 46c85cd..0000000 --- a/src/root.js +++ /dev/null @@ -1,18 +0,0 @@ -const path = require('path'); -const rsync = require('./lib/rsync') -const destDir = path.resolve(__dirname, '../dest/'); - - -module.exports = async () => { - // root files - await rsync( - { target: './src-dest/*', noDelete: true , rsyncUseDestDir: true}, - path.resolve(__dirname, '..'), - destDir); - await rsync( - { target: './src-dest/.??*', noDelete: true , rsyncUseDestDir: true}, - path.resolve(__dirname, '..'), - destDir); - - console.log('done'); -} \ No newline at end of file diff --git a/src/service-mail.js b/src/service-mail.js deleted file mode 100644 index 7685217..0000000 --- a/src/service-mail.js +++ /dev/null @@ -1,47 +0,0 @@ -const path = require('path'); - -const mkdirp = require('mkdirp'); - -const srcDir = path.resolve(__dirname, '../service-mail/'); -const destDir = path.resolve(__dirname, '../dest/service-mail'); - -mkdirp.sync(destDir); - -const rsync = require('./lib/rsync'); -const sed = require('./lib/sed')(destDir); - -const tasks = [{ - target: './', - excludes: [ - 'app.js', 'build', 'config', 'test', '.gitignore', 'Jenkinsfile', 'CHANGELOG.md', // root - 'templates/welcome-email', // set by src-dest - 'package.json', './README.md' // sed will manage them - ], - patterns: ['-node_modules/'] - }, - { - target: './package.json', - sed: ['test', 'chai', 'mocha', 'supertest', 'node-foreman', 'eslint'] - }, - { - target: './README.md', - sed: ['Run the tests '] - }, -]; - - - - -module.exports = async () => { - - - // --- initial copy - for (let i = 0; i < tasks.length; i++) { - await rsync(tasks[i], srcDir, destDir); - if (tasks[i].sed) { - sed(tasks[i]) - } - } - - console.log('done'); -}; diff --git a/src/service-register.js b/src/service-register.js deleted file mode 100644 index d2235e9..0000000 --- a/src/service-register.js +++ /dev/null @@ -1,55 +0,0 @@ -const path = require('path'); - -const mkdirp = require('mkdirp'); - -const srcDir = path.resolve(__dirname, '../service-register/'); -const destDir = path.resolve(__dirname, '../dest/components/register'); - -mkdirp.sync(destDir); - -const rsync = require('./lib/rsync'); -const sed = require('./lib/sed')(destDir); - -const tasks = [{ - target: './source', - excludes: [ - 'app.js', 'config.js', 'dns', '.gitignore', '.npmignore', 'package.json', // root - 'dataservers.js', // business - 'cross-domain.js', // middelware - 'source/server.js', // server - 'public/reserved-words.json', // public - 'routes/index.js', 'routes/records.js', 'routes/users.js', 'routes/admin.js', // routes (users.js & admin.js will be added after) - 'database.js', 'storage/invitations.js', 'storage/reserved-userid.js', 'storage/users.js', // storage - ], - patterns: ['-*dns*','-node_modules/'] - }, - { - target: './source/routes/users.js', - sed: [' START - CLEAN FOR OPENSOURCE/,/ END - CLEAN FOR OPENSOURCE'] - }, - { - target: './source/routes/admin.js', - sed: [' START - CLEAN FOR OPENSOURCE/,/ END - CLEAN FOR OPENSOURCE'] - }, - { - target: './package.json', - sed: ['reporting'] - } -]; - - - - -module.exports = async () => { - - - // --- initial copy - for (let i = 0; i < tasks.length; i++) { - await rsync(tasks[i], srcDir, destDir); - if (tasks[i].sed) { - sed(tasks[i]) - } - } - - console.log('done'); -}; \ No newline at end of file diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index 055b22e..0000000 --- a/yarn.lock +++ /dev/null @@ -1,989 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@airbrake/browser@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@airbrake/browser/-/browser-1.4.2.tgz#c7aa1b6b0db664011c71e733d364d03b393e9774" - integrity sha512-hlP+IMDcJXpoIaXTeKl8W+p18hKRJ9SKgLQTVh45GA9/qFXsLgu0V4tn0jDT5NQQXJG1+IKBv/RLRVgyswJy+w== - dependencies: - "@types/promise-polyfill" "^6.0.3" - "@types/request" "2.48.5" - cross-fetch "^3.0.4" - error-stack-parser "^2.0.4" - promise-polyfill "^8.1.3" - tdigest "^0.1.1" - -"@airbrake/node@^1.4.2": - version "1.4.2" - resolved "https://registry.yarnpkg.com/@airbrake/node/-/node-1.4.2.tgz#8ae6d69e093852920e091ec016e6a4d53a91b4b9" - integrity sha512-aDnwWtT/K+E1hb8aPBoZawrft3p/Nb0ShvunOoRzRbCdtoVcuGjpNz1XuZzzh8wj3o8eiXouEID2fv1D0JvFyg== - dependencies: - "@airbrake/browser" "^1.4.2" - cross-fetch "^3.0.4" - error-stack-parser "^2.0.4" - tdigest "^0.1.1" - -"@dabh/diagnostics@^2.0.2": - version "2.0.2" - resolved "https://registry.yarnpkg.com/@dabh/diagnostics/-/diagnostics-2.0.2.tgz#290d08f7b381b8f94607dc8f471a12c675f9db31" - integrity sha512-+A1YivoVDNNVCdfozHSR8v/jyuuLTMXwjWuxPFlFlUapXoGc+Gj9mDlTDDfrwl7rXCl2tNZ0kE8sIBO6YOn96Q== - dependencies: - colorspace "1.1.x" - enabled "2.0.x" - kuler "^2.0.0" - -"@nodelib/fs.scandir@2.1.4": - version "2.1.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz#d4b3549a5db5de2683e0c1071ab4f140904bbf69" - integrity sha512-33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA== - dependencies: - "@nodelib/fs.stat" "2.0.4" - run-parallel "^1.1.9" - -"@nodelib/fs.stat@2.0.4", "@nodelib/fs.stat@^2.0.2": - version "2.0.4" - resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz#a3f2dd61bab43b8db8fa108a121cfffe4c676655" - integrity sha512-IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q== - -"@nodelib/fs.walk@^1.2.3": - version "1.2.6" - resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz#cce9396b30aa5afe9e3756608f5831adcb53d063" - integrity sha512-8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow== - dependencies: - "@nodelib/fs.scandir" "2.1.4" - fastq "^1.6.0" - -"@pryv/boiler@git+https://github.com/pryv/lib-node-boiler.git": - version "1.0.1" - resolved "git+https://github.com/pryv/lib-node-boiler.git#eefd8f95e883b0d98a6624f209fdb8137325de6d" - dependencies: - "@airbrake/node" "^1.4.2" - debug "^4.3.1" - js-yaml "^4.0.0" - nconf "^0.11.2" - superagent "^6.1.0" - winston "^3.3.3" - -"@types/caseless@*": - version "0.12.2" - resolved "https://registry.yarnpkg.com/@types/caseless/-/caseless-0.12.2.tgz#f65d3d6389e01eeb458bd54dc8f52b95a9463bc8" - integrity sha512-6ckxMjBBD8URvjB6J3NcnuAn5Pkl7t3TizAg+xdlzzQGSPSmBcXf8KoIH0ua/i+tio+ZRUHEXp0HEmvaR4kt0w== - -"@types/glob@^7.1.1": - version "7.1.3" - resolved "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.3.tgz#e6ba80f36b7daad2c685acd9266382e68985c183" - integrity sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w== - dependencies: - "@types/minimatch" "*" - "@types/node" "*" - -"@types/minimatch@*": - version "3.0.3" - resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d" - integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA== - -"@types/node@*": - version "14.14.28" - resolved "https://registry.yarnpkg.com/@types/node/-/node-14.14.28.tgz#cade4b64f8438f588951a6b35843ce536853f25b" - integrity sha512-lg55ArB+ZiHHbBBttLpzD07akz0QPrZgUODNakeC09i62dnrywr9mFErHuaPlB6I7z+sEbK+IYmplahvplCj2g== - -"@types/promise-polyfill@^6.0.3": - version "6.0.3" - resolved "https://registry.yarnpkg.com/@types/promise-polyfill/-/promise-polyfill-6.0.3.tgz#e2f38fcd244a9e0df2cc7528e0711abcbc707b5e" - integrity sha512-f/BFgF9a+cgsMseC7rpv9+9TAE3YNjhfYrtwCo/pIeCDDfQtE6PY0b5bao2eIIEpZCBUy8Y5ToXd4ObjPSJuFw== - -"@types/request@2.48.5": - version "2.48.5" - resolved "https://registry.yarnpkg.com/@types/request/-/request-2.48.5.tgz#019b8536b402069f6d11bee1b2c03e7f232937a0" - integrity sha512-/LO7xRVnL3DxJ1WkPGDQrp4VTV1reX9RkC85mJ+Qzykj2Bdw+mG15aAfDahc76HtknjzE16SX/Yddn6MxVbmGQ== - dependencies: - "@types/caseless" "*" - "@types/node" "*" - "@types/tough-cookie" "*" - form-data "^2.5.0" - -"@types/tough-cookie@*": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/tough-cookie/-/tough-cookie-4.0.0.tgz#fef1904e4668b6e5ecee60c52cc6a078ffa6697d" - integrity sha512-I99sngh224D0M7XgW1s120zxCt3VYQ3IQsuw3P3jbq5GG4yc79+ZjyKznyOGIQrflfylLgcfekeZW/vk0yng6A== - -ansi-regex@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz#388539f55179bf39339c81af30a654d69f87cb75" - integrity sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg== - -ansi-styles@^4.0.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" - integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== - dependencies: - color-convert "^2.0.1" - -argparse@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" - integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== - -array-union@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-2.1.0.tgz#b798420adbeb1de828d84acd8a2e23d3efe85e8d" - integrity sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw== - -async@^1.4.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" - integrity sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo= - -async@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/async/-/async-3.2.0.tgz#b3a2685c5ebb641d3de02d161002c60fc9f85720" - integrity sha512-TR2mEZFVOj2pLStYxLht7TyfuRzaydfpxr3k9RpHIzMgw7A64dzsdqCxH1WJyQdoe8T10nDXd9wnEigmiuHIZw== - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= - -balanced-match@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" - integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= - -bintrees@1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bintrees/-/bintrees-1.0.1.tgz#0e655c9b9c2435eaab68bf4027226d2b55a34524" - integrity sha1-DmVcm5wkNeqraL9AJyJtK1WjRSQ= - -brace-expansion@^1.1.7: - version "1.1.11" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" - integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== - dependencies: - balanced-match "^1.0.0" - concat-map "0.0.1" - -braces@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" - integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A== - dependencies: - fill-range "^7.0.1" - -cliui@^7.0.2: - version "7.0.4" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" - integrity sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ== - dependencies: - string-width "^4.2.0" - strip-ansi "^6.0.0" - wrap-ansi "^7.0.0" - -color-convert@^1.9.1: - version "1.9.3" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" - integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== - dependencies: - color-name "1.1.3" - -color-convert@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" - integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== - dependencies: - color-name "~1.1.4" - -color-name@1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" - integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= - -color-name@^1.0.0, color-name@~1.1.4: - version "1.1.4" - resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" - integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== - -color-string@^1.5.2: - version "1.5.4" - resolved "https://registry.yarnpkg.com/color-string/-/color-string-1.5.4.tgz#dd51cd25cfee953d138fe4002372cc3d0e504cb6" - integrity sha512-57yF5yt8Xa3czSEW1jfQDE79Idk0+AkN/4KWad6tbdxUmAs3MvjxlWSWD4deYytcRfoZ9nhKyFl1kj5tBvidbw== - dependencies: - color-name "^1.0.0" - simple-swizzle "^0.2.2" - -color@3.0.x: - version "3.0.0" - resolved "https://registry.yarnpkg.com/color/-/color-3.0.0.tgz#d920b4328d534a3ac8295d68f7bd4ba6c427be9a" - integrity sha512-jCpd5+s0s0t7p3pHQKpnJ0TpQKKdleP71LWcA0aqiljpiuAkOSUFN/dyH8ZwF0hRmFlrIuRhufds1QyEP9EB+w== - dependencies: - color-convert "^1.9.1" - color-string "^1.5.2" - -colors@^1.2.1: - version "1.4.0" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.4.0.tgz#c50491479d4c1bdaed2c9ced32cf7c7dc2360f78" - integrity sha512-a+UqTh4kgZg/SlGvfbzDHpgRu7AAQOmmqRHJnxhRZICKFUT91brVhNNt58CMWU9PsBbv3PDCZUHbVxuDiH2mtA== - -colorspace@1.1.x: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colorspace/-/colorspace-1.1.2.tgz#e0128950d082b86a2168580796a0aa5d6c68d8c5" - integrity sha512-vt+OoIP2d76xLhjwbBaucYlNSpPsrJWPlBTtwCpQKIu6/CSMutyzX93O/Do0qzpH3YoHEes8YEFXyZ797rEhzQ== - dependencies: - color "3.0.x" - text-hex "1.0.x" - -combined-stream@^1.0.6, combined-stream@^1.0.8: - version "1.0.8" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" - integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== - dependencies: - delayed-stream "~1.0.0" - -component-emitter@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz#16e4070fba8ae29b679f2215853ee181ab2eabc0" - integrity sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg== - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= - -cookiejar@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.2.tgz#dd8a235530752f988f9a0844f3fc589e3111125c" - integrity sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA== - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac= - -cross-fetch@^3.0.4: - version "3.0.6" - resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.6.tgz#3a4040bc8941e653e0e9cf17f29ebcd177d3365c" - integrity sha512-KBPUbqgFjzWlVcURG+Svp9TlhA5uliYtiNx/0r8nv0pdypeQCRJ9IaSIc3q/x3q8t3F75cHuwxVql1HFGHCNJQ== - dependencies: - node-fetch "2.6.1" - -debug@^4.1.1, debug@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== - dependencies: - ms "2.1.2" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= - -detect-indent@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/detect-indent/-/detect-indent-6.0.0.tgz#0abd0f549f69fc6659a254fe96786186b6f528fd" - integrity sha512-oSyFlqaTHCItVRGK5RmrmjB+CmaMOW7IaNA/kdxqhoa6d17j/5ce9O9eWXmV/KEdRwqpQA+Vqe8a8Bsybu4YnA== - -detect-newline@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/detect-newline/-/detect-newline-3.1.0.tgz#576f5dfc63ae1a192ff192d8ad3af6308991b651" - integrity sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA== - -dir-glob@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f" - integrity sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA== - dependencies: - path-type "^4.0.0" - -emoji-regex@^8.0.0: - version "8.0.0" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" - integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== - -enabled@2.0.x: - version "2.0.0" - resolved "https://registry.yarnpkg.com/enabled/-/enabled-2.0.0.tgz#f9dd92ec2d6f4bbc0d5d1e64e21d61cd4665e7c2" - integrity sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ== - -error-stack-parser@^2.0.4: - version "2.0.6" - resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz#5a99a707bd7a4c58a797902d48d82803ede6aad8" - integrity sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ== - dependencies: - stackframe "^1.1.1" - -escalade@^3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.1.1.tgz#d8cfdc7000965c5a0174b4a82eaa5c0552742e40" - integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw== - -fast-glob@^3.0.3: - version "3.2.5" - resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" - integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== - dependencies: - "@nodelib/fs.stat" "^2.0.2" - "@nodelib/fs.walk" "^1.2.3" - glob-parent "^5.1.0" - merge2 "^1.3.0" - micromatch "^4.0.2" - picomatch "^2.2.1" - -fast-safe-stringify@^2.0.4, fast-safe-stringify@^2.0.7: - version "2.0.7" - resolved "https://registry.yarnpkg.com/fast-safe-stringify/-/fast-safe-stringify-2.0.7.tgz#124aa885899261f68aedb42a7c080de9da608743" - integrity sha512-Utm6CdzT+6xsDk2m8S6uL8VHxNwI6Jub+e9NYTcAms28T84pTa25GJQV9j0CY0N1rM8hK4x6grpF2BQf+2qwVA== - -fastq@^1.6.0: - version "1.10.1" - resolved "https://registry.yarnpkg.com/fastq/-/fastq-1.10.1.tgz#8b8f2ac8bf3632d67afcd65dac248d5fdc45385e" - integrity sha512-AWuv6Ery3pM+dY7LYS8YIaCiQvUaos9OB1RyNgaOWnaX+Tik7Onvcsf8x8c+YtDeT0maYLniBip2hox5KtEXXA== - dependencies: - reusify "^1.0.4" - -fecha@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/fecha/-/fecha-4.2.0.tgz#3ffb6395453e3f3efff850404f0a59b6747f5f41" - integrity sha512-aN3pcx/DSmtyoovUudctc8+6Hl4T+hI9GBBHLjA76jdZl7+b1sgh5g4k+u/GL3dTy1/pnYzKp69FpJ0OicE3Wg== - -fill-range@^7.0.1: - version "7.0.1" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" - integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ== - dependencies: - to-regex-range "^5.0.1" - -fn.name@1.x.x: - version "1.1.0" - resolved "https://registry.yarnpkg.com/fn.name/-/fn.name-1.1.0.tgz#26cad8017967aea8731bc42961d04a3d5988accc" - integrity sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw== - -form-data@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" - integrity sha512-m21N3WOmEEURgk6B9GLOE4RuWOFf28Lhh9qGYeNlGq4VDXUlJy2th2slBNU8Gp8EzloYZOibZJ7t5ecIrFSjVA== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.6" - mime-types "^2.1.12" - -form-data@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-3.0.1.tgz#ebd53791b78356a99af9a300d4282c4d5eb9755f" - integrity sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg== - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.8" - mime-types "^2.1.12" - -formidable@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.2.tgz#bf69aea2972982675f00865342b982986f6b8dd9" - integrity sha512-V8gLm+41I/8kguQ4/o1D3RIHRmhYFG4pnNyonvua+40rqcEmT4+V71yaZ3B457xbbgCsCfjSPi65u/W6vK1U5Q== - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= - -get-caller-file@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz#4f94412a82db32f36e3b0b9741f8a97feb031f7e" - integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== - -git-hooks-list@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/git-hooks-list/-/git-hooks-list-1.0.3.tgz#be5baaf78203ce342f2f844a9d2b03dba1b45156" - integrity sha512-Y7wLWcrLUXwk2noSka166byGCvhMtDRpgHdzCno1UQv/n/Hegp++a2xBWJL1lJarnKD3SWaljD+0z1ztqxuKyQ== - -glob-parent@^5.1.0: - version "5.1.1" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz#b6c1ef417c4e5663ea498f1c45afac6916bbc229" - integrity sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ== - dependencies: - is-glob "^4.0.1" - -glob@^7.1.3: - version "7.1.6" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz#141f33b81a7c2492e125594307480c46679278a6" - integrity sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA== - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@10.0.0: - version "10.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-10.0.0.tgz#abfcd0630037ae174a88590132c2f6804e291072" - integrity sha512-3LifW9M4joGZasyYPz2A1U74zbC/45fvpXUvO/9KbSa+VV0aGZarWkfdgKyR9sExNP0t0x0ss/UMJpNpcaTspw== - dependencies: - "@types/glob" "^7.1.1" - array-union "^2.1.0" - dir-glob "^3.0.1" - fast-glob "^3.0.3" - glob "^7.1.3" - ignore "^5.1.1" - merge2 "^1.2.3" - slash "^3.0.0" - -graceful-fs@^4.1.15: - version "4.2.6" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.6.tgz#ff040b2b0853b23c3d31027523706f1885d76bee" - integrity sha512-nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ== - -ignore@^5.1.1: - version "5.1.8" - resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.8.tgz#f150a8b50a34289b33e22f5889abd4d8016f0e57" - integrity sha512-BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw== - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.3, inherits@~2.0.3: - version "2.0.4" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c" - integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== - -ini@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" - integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== - -is-arrayish@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz#4574a2ae56f7ab206896fb431eaeed066fdf8f03" - integrity sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ== - -is-extglob@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - integrity sha1-qIwCU1eR8C7TfHahueqXc8gz+MI= - -is-fullwidth-code-point@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" - integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== - -is-glob@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz#7567dbe9f2f5e2467bc77ab83c4a29482407a5dc" - integrity sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg== - dependencies: - is-extglob "^2.1.1" - -is-number@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" - integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== - -is-plain-obj@2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-2.1.0.tgz#45e42e37fccf1f40da8e5f76ee21515840c09287" - integrity sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA== - -is-stream@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz#bde9c32680d6fae04129d6ac9d921ce7815f78e3" - integrity sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw== - -isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= - -js-yaml@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-4.0.0.tgz#f426bc0ff4b4051926cd588c71113183409a121f" - integrity sha512-pqon0s+4ScYUvX30wxQi3PogGFAlUyH0awepWvwkj4jD4v+ova3RiYw8bmA6x2rDrEaj8i/oWKoRxpVNW+Re8Q== - dependencies: - argparse "^2.0.1" - -kuler@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/kuler/-/kuler-2.0.0.tgz#e2c570a3800388fb44407e851531c1d670b061b3" - integrity sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A== - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - integrity sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0= - -lodash.template@^4.5.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz#f976195cf3f347d0d5f52483569fe8031ccce8ab" - integrity sha512-84vYFxIkmidUiFxidA/KjjH9pAycqW+h980j7Fuz5qxRtO9pgB7MDFTdys1N7A5mcucRiDyEq4fusljItR1T/A== - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.templatesettings "^4.0.0" - -lodash.templatesettings@^4.0.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz#e481310f049d3cf6d47e912ad09313b154f0fb33" - integrity sha512-stgLz+i3Aa9mZgnjr/O+v9ruKZsPsndy7qPZOchbqk2cnTU1ZaldKK+v7m54WoKIyxiuMZTKT2H81F8BeAc3ZQ== - dependencies: - lodash._reinterpolate "^3.0.0" - -lodash@^4.17.15: - version "4.17.15" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz#b447f6670a0455bbfeedd11392eff330ea097548" - integrity sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A== - -lodash@^4.17.20: - version "4.17.20" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.20.tgz#b44a9b6297bcb698f1c51a3545a2b3b368d59c52" - integrity sha512-PlhdFcillOINfeV7Ni6oF1TAEayyZBoZ8bcshTHqOYJYlrqzRK5hagpagky5o4HfCzzd1TRkXPMFq6cKk9rGmA== - -logform@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/logform/-/logform-2.2.0.tgz#40f036d19161fc76b68ab50fdc7fe495544492f2" - integrity sha512-N0qPlqfypFx7UHNn4B3lzS/b0uLqt2hmuoa+PpuXNYgozdJYAyauF5Ky0BWVjrxDlMWiT3qN4zPq3vVAfZy7Yg== - dependencies: - colors "^1.2.1" - fast-safe-stringify "^2.0.4" - fecha "^4.2.0" - ms "^2.1.1" - triple-beam "^1.3.0" - -lru-cache@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" - integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA== - dependencies: - yallist "^4.0.0" - -make-dir@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz#415e967046b3a7f1d185277d84aa58203726a13f" - integrity sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw== - dependencies: - semver "^6.0.0" - -merge2@^1.2.3, merge2@^1.3.0: - version "1.4.1" - resolved "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz#4368892f885e907455a6fd7dc55c0c9d404990ae" - integrity sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg== - -methods@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" - integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= - -micromatch@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.2.tgz#4fcb0999bf9fbc2fcbdd212f6d629b9a56c39259" - integrity sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q== - dependencies: - braces "^3.0.1" - picomatch "^2.0.5" - -mime-db@1.46.0: - version "1.46.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.46.0.tgz#6267748a7f799594de3cbc8cde91def349661cee" - integrity sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ== - -mime-types@^2.1.12: - version "2.1.29" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.29.tgz#1d4ab77da64b91f5f72489df29236563754bb1b2" - integrity sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ== - dependencies: - mime-db "1.46.0" - -mime@^2.4.6: - version "2.5.2" - resolved "https://registry.yarnpkg.com/mime/-/mime-2.5.2.tgz#6e3dc6cc2b9510643830e5f19d5cb753da5eeabe" - integrity sha512-tqkh47FzKeCPD2PUiPB6pkbMzsCasjxAfC62/Wap5qrUWcb+sFasXUC5I3gYM5iBM8v/Qpn4UK0x+j0iHyFPDg== - -minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== - dependencies: - brace-expansion "^1.1.7" - -mkdirp@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-1.0.4.tgz#3eb5ed62622756d79a5f0e2a221dfebad75c2f7e" - integrity sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw== - -ms@2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz#d09d1f357b443f493382a8eb3ccd183872ae6009" - integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w== - -ms@^2.1.1: - version "2.1.3" - resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" - integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== - -nconf@^0.11.2: - version "0.11.2" - resolved "https://registry.yarnpkg.com/nconf/-/nconf-0.11.2.tgz#707fa9db383e85ad7e8f1a17be1b053d1bd751c4" - integrity sha512-gDmn0Fgt0U0esRE8OCF72tO8AA9dtlG9eZhW4/Ex5hozNC2/LgdhWO4vKLGHNfTxcvsv6Aoxk/ROVYJD2SAdyg== - dependencies: - async "^1.4.0" - ini "^2.0.0" - secure-keys "^1.0.0" - yargs "^16.1.1" - -ncp@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ncp/-/ncp-2.0.0.tgz#195a21d6c46e361d2fb1281ba38b91e9df7bdbb3" - integrity sha1-GVoh1sRuNh0vsSgbo4uR6d9727M= - -node-fetch@2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" - integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== - -once@^1.3.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= - dependencies: - wrappy "1" - -one-time@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/one-time/-/one-time-1.0.0.tgz#e06bc174aed214ed58edede573b433bbf827cb45" - integrity sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g== - dependencies: - fn.name "1.x.x" - -path-exists@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" - integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= - -path-type@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" - integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== - -picomatch@^2.0.5, picomatch@^2.2.1: - version "2.2.2" - resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz#21f333e9b6b8eaff02468f5146ea406d345f4dad" - integrity sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg== - -prepend-file@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/prepend-file/-/prepend-file-2.0.0.tgz#2d3256376a64ca3b5640153890a89cadbebaf1a9" - integrity sha512-U6on3jv5hQ+CNEO7gFn00PUlm3F/oXIQTMg6jpeQTQHLYSZl/Cxb4NpH44FA0By+maPXpfUaqmCoPUTu/Z3/8g== - dependencies: - path-exists "^4.0.0" - temp-write "^4.0.0" - -process-nextick-args@~2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz#7820d9b16120cc55ca9ae7792680ae7dba6d7fe2" - integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag== - -promise-polyfill@^8.1.3: - version "8.2.0" - resolved "https://registry.yarnpkg.com/promise-polyfill/-/promise-polyfill-8.2.0.tgz#367394726da7561457aba2133c9ceefbd6267da0" - integrity sha512-k/TC0mIcPVF6yHhUvwAp7cvL6I2fFV7TzF1DuGPI8mBh4QQazf36xCKEHKTZKRysEoTQoQdKyP25J8MPJp7j5g== - -qs@^6.9.4: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== - -queue-microtask@^1.2.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/queue-microtask/-/queue-microtask-1.2.2.tgz#abf64491e6ecf0f38a6502403d4cda04f372dfd3" - integrity sha512-dB15eXv3p2jDlbOiNLyMabYg1/sXvppd8DP2J3EOCQ0AkuSXCW2tP7mnVouVLJKgUMY6yP0kcQDVpLCN13h4Xg== - -readable-stream@^2.3.7: - version "2.3.7" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz#1eca1cf711aef814c04f62252a36a62f6cb23b57" - integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.3" - isarray "~1.0.0" - process-nextick-args "~2.0.0" - safe-buffer "~5.1.1" - string_decoder "~1.1.1" - util-deprecate "~1.0.1" - -readable-stream@^3.4.0, readable-stream@^3.6.0: - version "3.6.0" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz#337bbda3adc0706bd3e024426a286d4b4b2c9198" - integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA== - dependencies: - inherits "^2.0.3" - string_decoder "^1.1.1" - util-deprecate "^1.0.1" - -require-directory@^2.1.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" - integrity sha1-jGStX9MNqxyXbiNE/+f3kqam30I= - -reusify@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" - integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== - -rsync@^0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/rsync/-/rsync-0.6.1.tgz#3681a0098bd8750448f8bf9da1fee09f7763742b" - integrity sha1-NoGgCYvYdQRI+L+dof7gn3djdCs= - -run-parallel@^1.1.9: - version "1.2.0" - resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" - integrity sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA== - dependencies: - queue-microtask "^1.2.2" - -safe-buffer@~5.1.0, safe-buffer@~5.1.1: - version "5.1.2" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" - integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g== - -safe-buffer@~5.2.0: - version "5.2.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" - integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== - -secure-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/secure-keys/-/secure-keys-1.0.0.tgz#f0c82d98a3b139a8776a8808050b824431087fca" - integrity sha1-8MgtmKOxOah3aogIBQuCRDEIf8o= - -semver@^6.0.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" - integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== - -semver@^7.3.2: - version "7.3.4" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.4.tgz#27aaa7d2e4ca76452f98d3add093a72c943edc97" - integrity sha512-tCfb2WLjqFAtXn4KEdxIhalnRtoKFN7nAwj0B3ZXCbQloV2tq5eDbcTmT68JJD3nRJq24/XgxtQKFIpQdtvmVw== - dependencies: - lru-cache "^6.0.0" - -simple-swizzle@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz#a4da6b635ffcccca33f70d17cb92592de95e557a" - integrity sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo= - dependencies: - is-arrayish "^0.3.1" - -slash@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" - integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== - -sort-object-keys@^1.1.3: - version "1.1.3" - resolved "https://registry.yarnpkg.com/sort-object-keys/-/sort-object-keys-1.1.3.tgz#bff833fe85cab147b34742e45863453c1e190b45" - integrity sha512-855pvK+VkU7PaKYPc+Jjnmt4EzejQHyhhF33q31qG8x7maDzkeFhAAThdCYay11CISO+qAMwjOBP+fPZe0IPyg== - -sort-package-json@^1.48.1: - version "1.49.0" - resolved "https://registry.yarnpkg.com/sort-package-json/-/sort-package-json-1.49.0.tgz#82845ab598501bb35875f326e4768a5ab5f15335" - integrity sha512-3YuqFGThwc9X0TZLYohOUJJ/P6uJIVcTeuJOc6ZWw4f1fHpTHIfVysKer4qXtrZ2zvwwU2aEcb555Bo+2fwIgQ== - dependencies: - detect-indent "^6.0.0" - detect-newline "3.1.0" - git-hooks-list "1.0.3" - globby "10.0.0" - is-plain-obj "2.1.0" - sort-object-keys "^1.1.3" - -source-licenser@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/source-licenser/-/source-licenser-1.0.3.tgz#5c43c0d0f4fc353dc4e56f91bc0f5045b28c3628" - integrity sha512-AcFkv7KAKZxDpcr+CE/CoSleFhXo1rt4OowZeg6WxHgTuhzEZVAVEAqR9cZ6mARyX8hRmLW+9+u3ZrK1IIk4XQ== - dependencies: - "@pryv/boiler" "git+https://github.com/pryv/lib-node-boiler.git" - lodash "^4.17.20" - lodash.template "^4.5.0" - prepend-file "^2.0.0" - sort-package-json "^1.48.1" - -stack-trace@0.0.x: - version "0.0.10" - resolved "https://registry.yarnpkg.com/stack-trace/-/stack-trace-0.0.10.tgz#547c70b347e8d32b4e108ea1a2a159e5fdde19c0" - integrity sha1-VHxws0fo0ytOEI6hoqFZ5f3eGcA= - -stackframe@^1.1.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz#52429492d63c62eb989804c11552e3d22e779303" - integrity sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA== - -string-width@^4.1.0, string-width@^4.2.0: - version "4.2.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz#952182c46cc7b2c313d1596e623992bd163b72b5" - integrity sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg== - dependencies: - emoji-regex "^8.0.0" - is-fullwidth-code-point "^3.0.0" - strip-ansi "^6.0.0" - -string_decoder@^1.1.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e" - integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA== - dependencies: - safe-buffer "~5.2.0" - -string_decoder@~1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" - integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg== - dependencies: - safe-buffer "~5.1.0" - -strip-ansi@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz#0b1571dd7669ccd4f3e06e14ef1eed26225ae532" - integrity sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w== - dependencies: - ansi-regex "^5.0.0" - -superagent@^6.1.0: - version "6.1.0" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-6.1.0.tgz#09f08807bc41108ef164cfb4be293cebd480f4a6" - integrity sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg== - dependencies: - component-emitter "^1.3.0" - cookiejar "^2.1.2" - debug "^4.1.1" - fast-safe-stringify "^2.0.7" - form-data "^3.0.0" - formidable "^1.2.2" - methods "^1.1.2" - mime "^2.4.6" - qs "^6.9.4" - readable-stream "^3.6.0" - semver "^7.3.2" - -tdigest@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/tdigest/-/tdigest-0.1.1.tgz#2e3cb2c39ea449e55d1e6cd91117accca4588021" - integrity sha1-Ljyyw56kSeVdHmzZEReszKRYgCE= - dependencies: - bintrees "1.0.1" - -temp-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/temp-dir/-/temp-dir-1.0.0.tgz#0a7c0ea26d3a39afa7e0ebea9c1fc0bc4daa011d" - integrity sha1-CnwOom06Oa+n4OvqnB/AvE2qAR0= - -temp-write@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/temp-write/-/temp-write-4.0.0.tgz#cd2e0825fc826ae72d201dc26eef3bf7e6fc9320" - integrity sha512-HIeWmj77uOOHb0QX7siN3OtwV3CTntquin6TNVg6SHOqCP3hYKmox90eeFOGaY1MqJ9WYDDjkyZrW6qS5AWpbw== - dependencies: - graceful-fs "^4.1.15" - is-stream "^2.0.0" - make-dir "^3.0.0" - temp-dir "^1.0.0" - uuid "^3.3.2" - -text-hex@1.0.x: - version "1.0.0" - resolved "https://registry.yarnpkg.com/text-hex/-/text-hex-1.0.0.tgz#69dc9c1b17446ee79a92bf5b884bb4b9127506f5" - integrity sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg== - -to-regex-range@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" - integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== - dependencies: - is-number "^7.0.0" - -triple-beam@^1.2.0, triple-beam@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/triple-beam/-/triple-beam-1.3.0.tgz#a595214c7298db8339eeeee083e4d10bd8cb8dd9" - integrity sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw== - -util-deprecate@^1.0.1, util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8= - -uuid@^3.3.2: - version "3.4.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee" - integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A== - -winston-transport@^4.4.0: - version "4.4.0" - resolved "https://registry.yarnpkg.com/winston-transport/-/winston-transport-4.4.0.tgz#17af518daa690d5b2ecccaa7acf7b20ca7925e59" - integrity sha512-Lc7/p3GtqtqPBYYtS6KCN3c77/2QCev51DvcJKbkFPQNoj1sinkGwLGFDxkXY9J6p9+EPnYs+D90uwbnaiURTw== - dependencies: - readable-stream "^2.3.7" - triple-beam "^1.2.0" - -winston@^3.3.3: - version "3.3.3" - resolved "https://registry.yarnpkg.com/winston/-/winston-3.3.3.tgz#ae6172042cafb29786afa3d09c8ff833ab7c9170" - integrity sha512-oEXTISQnC8VlSAKf1KYSSd7J6IWuRPQqDdo8eoRNaYKLvwSb5+79Z3Yi1lrl6KDpU6/VWaxpakDAtb1oQ4n9aw== - dependencies: - "@dabh/diagnostics" "^2.0.2" - async "^3.1.0" - is-stream "^2.0.0" - logform "^2.2.0" - one-time "^1.0.0" - readable-stream "^3.4.0" - stack-trace "0.0.x" - triple-beam "^1.3.0" - winston-transport "^4.4.0" - -wrap-ansi@^7.0.0: - version "7.0.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" - integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== - dependencies: - ansi-styles "^4.0.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= - -y18n@^5.0.5: - version "5.0.5" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.5.tgz#8769ec08d03b1ea2df2500acef561743bbb9ab18" - integrity sha512-hsRUr4FFrvhhRH12wOdfs38Gy7k2FFzB9qgN9v3aLykRq0dRcdcpz5C9FxdS2NuhOrI/628b/KSTJ3rwHysYSg== - -yallist@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72" - integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A== - -yargs-parser@^20.2.2: - version "20.2.5" - resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.5.tgz#5d37729146d3f894f39fc94b6796f5b239513186" - integrity sha512-jYRGS3zWy20NtDtK2kBgo/TlAoy5YUuhD9/LZ7z7W4j1Fdw2cqD0xEEclf8fxc8xjD6X5Qr+qQQwCEsP8iRiYg== - -yargs@^16.1.1: - version "16.2.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-16.2.0.tgz#1c82bf0f6b6a66eafce7ef30e376f49a12477f66" - integrity sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw== - dependencies: - cliui "^7.0.2" - escalade "^3.1.1" - get-caller-file "^2.0.5" - require-directory "^2.1.1" - string-width "^4.2.0" - y18n "^5.0.5" - yargs-parser "^20.2.2"