diff --git a/.gitattributes b/.gitattributes index 06b83b3816..32880b1e0b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,15 +1,7 @@ -# Cross-platform line endings configuration -# Set the default behavior, in case people don't have core.autocrlf set. -* text=auto +# all text files follow Unix end-of-line convention +* text eol=lf -# Explicitly declare text files you want to always be normalized and converted -# to native line endings on checkout. -*.sh text - -# Declare files that will always have CRLF line endings on checkout. -# *.sln text eol=crlf - -# Denote all files that are truly binary and should not be modified. +# avoid modifying binary files *.png binary *.jpg binary *.svg binary diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md index a5c17e7f8f..72baaee581 100644 --- a/.github/PULL_REQUEST_TEMPLATE.md +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -1,12 +1,13 @@ ### Problem - + ### Solution diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 79b2c922ae..df94098d2e 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -60,6 +60,7 @@ jobs: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: bookbrainz_test + POSTGRES_HOST: localhost - name: Set up node uses: actions/setup-node@v1 diff --git a/.gitignore b/.gitignore index 26fc4052d5..9226617888 100644 --- a/.gitignore +++ b/.gitignore @@ -9,6 +9,9 @@ /config/config.json /config/config.local.json +# Directory designated to store local compose overrides and related files +/local/ + # react-hot-loader files /static/hot *.hot-update.js diff --git a/.vscode/launch.json b/.vscode/launch.json index 6fceb9ff3d..16e33cc190 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -4,6 +4,25 @@ // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 "version": "0.2.0", "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Docker: Attach to Node", + "port": 9229, + "localRoot": "${workspaceFolder}/src/server/", + "remoteRoot": "/home/bookbrainz/bookbrainz-site/src/server/", + "restart": true, + "sourceMaps": true, + "smartStep": true, + "outFiles": [ + "${workspaceFolder}/**/*.js", + "!**/node_modules/**" + ], + "skipFiles": [ + "/home/bookbrainz/bookbrainz-site/node_modules/**/*.js", + "/**" + ] + }, { "type": "node", "request": "launch", diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index a858aa772e..537866fb0c 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -25,6 +25,10 @@ to BookBrainz: * Use [JSDoc](http://usejsdoc.org/) for commenting code * Use [TypeScript](https://www.typescriptlang.org/) everywhere - static type checking is useful +## Pull requests + +Please read carefully the [MetaBrainz Github guidelines](https://github.com/metabrainz/guidelines/blob/master/GitHub.md) + ## Commits We try to keep our commit messages readable and concise, this is especially important as they can't be rewritten—unlike diff --git a/DEPENDENCIES_MANUAL_INSTALL.md b/DEPENDENCIES_MANUAL_INSTALL.md deleted file mode 100644 index 3acec7c554..0000000000 --- a/DEPENDENCIES_MANUAL_INSTALL.md +++ /dev/null @@ -1,78 +0,0 @@ -# Installing dependencies manually - -If you don't want to use Docker for the dependencies, here are the steps you will need to take to get your local environment up and running. - -For setting up and running the NodeJS server outside of Docker, read the instructions [here](./NODEJS_SETUP.md) - - - -## PostgreSQL -BookBrainz uses version 12.3. - -To get PostgreSQL, use one of the following commands: - -**Debian-based OS** - - sudo apt-get install postgresql - -**Red Hat-based OS** - - sudo yum install postgresql-server - -To install Redis, run similar commands to get the dependency from your package -manager: - -**Debian-based OS** - - sudo apt-get install redis-server - -**Red Hat-based OS** - - sudo yum install redis - - -## Elasticsearch - -To install Elasticsearch, follow [this helpful guide](https://www.digitalocean.com/community/tutorials/how-to-install-and-configure-elasticsearch-on-ubuntu-16-04) for Linux-based systems or the [official instructions]( -https://www.elastic.co/guide/en/elasticsearch/reference/6.3/install-elasticsearch.html). - -The BookBrainz server has been tested with ElasticSearch version 6.3.2. - -## Setting up Dependencies - -No setup is required for Redis or Elasticsearch. However, it is necessary to -perform some initialization for PostgreSQL and import the latest BookBrainz -database dump. - -Firstly, begin downloading the [latest BookBrainz dump](http://ftp.musicbrainz.org/pub/musicbrainz/bookbrainz/latest.sql.bz2). - -Then, uncompress the `latest.sql.bz2` file, using the bzip2 command: - - bzip2 -d latest.sql.bz2 - -This will give you a file that you can restore into PostgreSQL, which will -set up data identical to the data we have on the bookbrainz.org website. First, you must create the necessary role and database with these two commands: - - psql -h localhost -U postgres --command="CREATE ROLE bookbrainz" - psql -h localhost -U postgres --command="CREATE DATABASE bookbrainz" - -Then you can restore the database from the lates dump you dowloaded. To do -this, run: - - psql -h localhost -U postgres -d bookbrainz -f latest.sql - -At this point, the database is set up, and the following command should give -you a list of usernames of BookBrainz editors (after entering the password from -earlier): - - psql -h localhost -U postgres bookbrainz --command="SELECT name FROM bookbrainz.editor" - -You are also required to set the password of your local PostgreSQL instance. -You can do this by - - - psql -h localhost -U postgres - - postgres=# \password - -This will set the password to your PostgreSQL, which you will need to set in the `config/config.json` database section. diff --git a/Dockerfile b/Dockerfile index 024998c64f..9b6d410ea8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -42,7 +42,7 @@ ARG BB_ROOT=/home/bookbrainz/bookbrainz-site WORKDIR $BB_ROOT RUN chown bookbrainz:bookbrainz $BB_ROOT -RUN echo $GIT_COMMIT_SHA > .git-version +ENV GIT_COMMIT_SHA=$GIT_COMMIT_SHA # Files necessary to complete the JavaScript build COPY --chown=bookbrainz scripts/ scripts/ diff --git a/INSTALLATION_TROUBLESHOOTING.md b/INSTALLATION_TROUBLESHOOTING.md deleted file mode 100644 index 0d5a074b62..0000000000 --- a/INSTALLATION_TROUBLESHOOTING.md +++ /dev/null @@ -1,139 +0,0 @@ -# Installation Troubleshooting (along with some tips and tricks) - -* General - - 1. [Error: EACCES: permission denied, scandir ‘/root/.npm/_logs’] - - There is some incompatibility with Docker for Windows - The solution is to **enable WSL2** (Windows Subsystem for Linux v2) and the problem goes away - - 1. It's better for you if you do some package catalog update by - - `sudo apt update` - - 2. Error: `Can't open input file latest.sql.bz2: No such file or directory` - After downloading the data dumps, you may realize that an attempt to uncompress it using the command `bzip2 -d latest.sql.bz2` doesn’t work and gives the above error. - - It can be solved by giving the actual path of the latest.sql.bz2 file in place of the file name such as: - - `/ home/user/Desktop/latest.sql.bz2` - - 3. Error: `fatal: unable to access 'https://github.com/path/to/repo.git/': gnutls_handshake() failed: Error in the pull function` after entering the `git clone --recursive https://github.com/metabrainz/bookbrainz-site.git` command. -At this point, you should check your internet connection. If it persists, make sure you are not working behind a proxy. - - 4. There are no css styles! My local page does not look like bookbrainz.org at all ! - Try running the command `yarn run build-less` or `npm run build-less` from the project directory. - -* ElasticSearch - - 1. ElasticSearch requires runtime Java installed on your local machine, - so you have to install it by - - For ubuntu users - - `sudo apt install default-jre` - - And then check it if it have installed already - - `java -version` - - 2. When you run ElasticSearch, it seems that the process takes a very long time. - To proceed the process, just let ElasticSearch to run - on its own terminal, and proceed the building process by making another window of terminal - - 3. If you run into an error on Docker Toolbox with Elastic Search stating an error message along the lines of: - - `Waiting for elasticsearch:9200 .elasticsearch: forward host lookup failed: Unknown host` - - The cause could be the docker-machine's memory limits. you can inspect this with the command: - - `docker-machine inspect machine-name` - - To diagnose this problem, try taking a look at the logs with the command: - - `docker-compose logs elasticsearch` - - And if you see an error within the logs along the lines of: - - ``` - # There is insufficient memory for the Java Runtime Environment to continue. - # Native memory allocation (mmap) failed to map 2060255232 bytes for committing reserved memory. - ``` - - Please try recreating the default docker machine by: - - i. Remove default docker-machine with the command: - - `docker-machine rm default` - - ii. Create a new default machine with the command: - - ``` - docker-machine create -d virtualbox --virtualbox-cpu-count=2 --virtualbox-memory=4096 --virtualbox-disk-size=50000 default - ``` - iii. Restart your docker environment with the commands: - - ``` - docker-machine stop - exit - ``` - - 4. To check if port is already is in use or not run - `netstat -anp tcp | grep ` - - 5. If you get error messages from ElasticSearch queries timing out, you can adjust the `requestTimeout` option in your config/config.json file under "elasticsearch" - -* Redis - - 1. You may get an error of port 6379 being used when you run ./develop.sh. This is because redis server is already on and you need to stop it first so that it can restart. So to get rid of this issue simply run the below command - - `/etc/init.d/redis-server stop` - - 2. Sometimes the port 6379 on which redis server runs is used by TCP. So to terminate this process run - `sudo kill sudo 'lsof -t -i:5432'` - -* PostgreSQL - - 1. After instaling, the username will be made by the machine. - - To set the password of SQL (You'll need this later), run - - `sudo -u postgres psql` - - then - ``` - psql (12.3) - Type "help" for help. - - postgres=# \password - Enter new password: - ``` - - - To figure out the username, do - - `sudo psql -U postgres -W -h localhost` - - then - - `Password for user : ` - - will appear. - Use the username for the config later on config.json. - - 2. Sometimes you may get an error of port 5432 being used when you run ./develop.sh. This is because postgres is already on and you need to stop it first so that it can restart. So to get rid of this issue simply run the below command - - `sudo service postgresql stop` - -* NodeJS/NPM/Yarn - - 1. If you got no idea about installing NodeJS, install them by: - Ubuntu - - `curl -sL https://deb.nodesource.com/setup_10.x | sudo bash - - sudo apt install nodejs` - - 2. When filling out the requirements of BookBrainz, you'll encounter an error that says you'll need to install postgresql-server-dev-X.Y for building a server-side extension or libpq-dev for building a client-side application - To solve this problem, please install libpq-dev and node-gyp - - For ubuntu users - - `sudo apt install -y node-gyp libpq-dev` diff --git a/NODEJS_SETUP.md b/NODEJS_SETUP.md deleted file mode 100644 index 9f81053edd..0000000000 --- a/NODEJS_SETUP.md +++ /dev/null @@ -1,78 +0,0 @@ -# Running the NodeJS server outside of Docker - -### These instruction are only valid for specific cases when you do not want to use Docker (`./develop.sh`) to run the server on your machine. - -If for some reason you do not want to use our standard development environment (Docker), you can run the server code manually ( -regardless of whether you are running dependencies (database, search,…) with Docker or you [are running them manually](./DEPENDENCIES_MANUAL_INSTALL.md)) - -## Installing NodeJS - -To install NodeJS, follow the instruction for your operating system on the [official website](https://nodejs.org/en/download/) - - -## Installing Packages -The site depends on a number of node packages which can be installed using yarn (or npm): - - cd bookbrainz-site/ - yarn install - -This command will also compile the site LESS and JavaScript source files. - -## Configuration - -Our `config.example.json` is set up to work out of the box running everything in Docker. Addresses for the dependencies refer to docker container names, so that containers can communicate with each other. - -For local development (run outside of Docker), make a copy of `config/config.local.json.example` and [fill up the musicbrainz tokens](README.md#configuration). You can then pass this configuration file when running the server locally using `--config` flag. -For example, `yarn start -- --config ./config/config.local.json` will use `./config/config.local.json` config instead of the Default config (`config.json` for Docker). - - -## Building and running -A number of subcommands exist to manage the installation and run the server. -These are described here; any commands not listed should not be called directly: - -* start - start the server in production mode, with code built once -* [debug - start the server in debug mode, with code watched for changes](#watch-files-and-live-reload-with-webpack) -* lint - check the code for syntax and style issues -* test - perform linting and attempt to compile the code -* jsdoc - build the documentation for JSDoc annotated functions within the - code - -
- -# Debugging with VSCode -You can use VSCode to run the server or API and take advantage of its debugger, an invaluable tool I highly recommend you learn to use. - -This will allow you to put breakpoints to stop and inspect the code and variables during its execution, advance code execution line by line and step into function calls, instead of putting `console.log` calls everywhere. - -Here is [a good introduction](https://www.youtube.com/watch?v=yFtU6_UaOtA) to debugging javascript in VSCode. - -There are VSCode configuration files (in the `.vscode` folder) for running both the server and the tests, useful in both cases to debug into the code and see what is happening as the code executes. -Make sure the dependencies (postgres, redis, elasticsearch) are running, and you can just open the debugger tray in VSCode, select 'Launch Program' and click the button! - -
- -# Watch files and live reload with Webpack - -Advanced users may want to use Webpack to build, watch files and inject rebuilt pages without having to refresh the page, -keeping the application state intact, for the price of increased compilation time and resource usage (see note below). - -If you are running the server manually, you can simply run `yarn run debug` in the command line. - -If you're using Docker and our `./develop.sh` script, you will need to modify the `docker-compose.yml` file and change a few things on the `bookbrainz-site` service defined there: -1. change the bookbrainz-site `command` to: - - `yarn run debug` if you only want to change client files (in `src/client`) - - `yarn run debug-watch-server` if you *also* want to modify server files (in `src/server`) -2. mount the `src` folder to the bookbrainz-site service - -For example: -``` -services: - bookbrainz-site: - # 1. Change the command to run - command: yarn run debug - volumes: - - "./config/config.json:/home/bookbrainz/bookbrainz-site/config/config.json:ro" - # 2. Mount the src directory - - "./src:/home/bookbrainz/bookbrainz-site/src" -``` -**Note**: Using Webpack watch mode (`yarn run debug`) results in more resource consumption (about ~1GB increased RAM usage) compared to running the [standard web server](/README.md#running-the-web-server). diff --git a/config/config.json.example b/config/config.json.example index 5029865171..d467dd7b26 100644 --- a/config/config.json.example +++ b/config/config.json.example @@ -28,7 +28,7 @@ "connection": { "host": "postgres", "database": "bookbrainz", - "user": "postgres", + "user": "bookbrainz", "password": "" } }, diff --git a/config/config.local.json.example b/config/config.local.json.example index 86779446b9..4af1228803 100644 --- a/config/config.local.json.example +++ b/config/config.local.json.example @@ -28,7 +28,7 @@ "connection": { "host": "localhost", "database": "bookbrainz", - "user": "postgres", + "user": "bookbrainz", "password": "" } }, diff --git a/data/test-data.js b/data/test-data.js index 6529b4a215..8cda8e4660 100644 --- a/data/test-data.js +++ b/data/test-data.js @@ -475,7 +475,7 @@ export function createSprinter() { ); } -export function sprinterHelper(numRevisions) { +export async function sprinterHelper(numRevisions) { const promiseList = []; for (let i = 0; i < numRevisions; i++) { promiseList.push( @@ -483,7 +483,8 @@ export function sprinterHelper(numRevisions) { .save(null, {method: 'insert'}) ); } - return Promise.all(promiseList); + const result = await Promise.all(promiseList); + return result; } export function createFunRunner() { diff --git a/package.json b/package.json index 4883c8fce4..008fe8bd52 100644 --- a/package.json +++ b/package.json @@ -33,23 +33,23 @@ "@elastic/elasticsearch": "^5.6.22", "@fortawesome/fontawesome-svg-core": "^1.2.30", "@fortawesome/free-brands-svg-icons": "^6.1.1", - "@fortawesome/free-solid-svg-icons": "^6.1.1", + "@fortawesome/free-solid-svg-icons": "^6.4.2", "@fortawesome/react-fontawesome": "^0.1.11", "array-move": "^3.0.1", - "bookbrainz-data": "3.0.0", + "bookbrainz-data": "4.0.0", "chart.js": "^2.9.4", "chartjs-adapter-date-fns": "^1.0.0", - "classnames": "^2.3.1", + "classnames": "^2.3.2", "compression": "^1.7.4", - "connect-redis": "^6.0.0", + "connect-redis": "^7.0.0", "core-js": "^3.20.3", "cross-env": "^7.0.3", "date-fns": "^2.15.0", "debug": "^4.3.2", - "express": "^4.17.2", + "express": "^4.18.2", "express-session": "^1.17.1", "express-slow-down": "^1.3.1", - "http-status": "^1.5.0", + "http-status": "^1.6.2", "immutable": "^3.8.2", "influx": "^5.9.3", "isomorphic-dompurify": "^0.13.0", @@ -77,33 +77,33 @@ "react-sortable-hoc": "^2.0.0", "react-sticky": "^6.0.1", "react-tooltip": "^4.2.21", - "redis": "^3.1.2", + "redis": "^4.6.5", "redux": "^4.2.0", "redux-debounce": "^1.0.1", "redux-immutable": "^4.0.0", "redux-thunk": "^2.2.0", "serve-favicon": "^2.4.3", "serve-static": "^1.14.1", - "superagent": "^7.1.1", - "swagger-jsdoc": "^6.2.5", - "swagger-ui-express": "^4.3.0", + "superagent": "^8.0.8", + "swagger-jsdoc": "^6.2.8", + "swagger-ui-express": "^4.6.0", "validator": "^13.7.0" }, "devDependencies": { "@babel/cli": "^7.17.6", - "@babel/core": "^7.10.1", + "@babel/core": "^7.20.12", "@babel/node": "^7.14.2", "@babel/plugin-proposal-class-properties": "^7.10.1", "@babel/plugin-proposal-object-rest-spread": "^7.17.3", "@babel/plugin-transform-classes": "^7.16.7", "@babel/plugin-transform-runtime": "^7.17.0", "@babel/preset-env": "^7.10.1", - "@babel/preset-react": "^7.16.7", + "@babel/preset-react": "^7.18.6", "@babel/preset-typescript": "^7.12.1", "@babel/register": "^7.17.0", "@faker-js/faker": "^7.2.0", - "@types/express": "^4.17.13", - "@types/lodash": "^4.14.164", + "@types/express": "^4.17.15", + "@types/lodash": "^4.14.191", "@types/react-select": "^4.0.18", "@typescript-eslint/eslint-plugin": "^4.28.3", "@typescript-eslint/parser": "^4.6.1", @@ -131,18 +131,18 @@ "file-loader": "^6.2.0", "jsdom": "20.0.0", "jsdom-global": "3.0.2", - "mini-css-extract-plugin": "^2.5.3", + "mini-css-extract-plugin": "^2.7.4", "mocha": "^9.1.3", "nodemon": "^2.0.2", "redux-mock-store": "^1.5.4", "resolve-url-loader": "^5.0.0", - "rewire": "^5.0.0", - "sass": "^1.49.0", - "sass-loader": "^12.4.0", + "rewire": "^7.0.0", + "sass": "^1.59.2", + "sass-loader": "^13.2.0", "sinon": "^14.0.0", "typescript": "^4.0.5", "uuid": "^8.3.2", - "webpack": "^5.69.1", + "webpack": "^5.76.0", "webpack-bundle-analyzer": "^4.3.0", "webpack-cli": "^4.10.0", "webpack-dev-middleware": "^5.3.1", diff --git a/scripts/create-test-db.sh b/scripts/create-test-db.sh index 67a93f29f5..f6b98a0be4 100755 --- a/scripts/create-test-db.sh +++ b/scripts/create-test-db.sh @@ -1,10 +1,10 @@ #!/bin/bash # set up variables with defaults -: "${POSTGRES_USER:=postgres}" +: "${POSTGRES_USER:=bookbrainz}" : "${POSTGRES_PASSWORD:=}" : "${POSTGRES_DB:=bookbrainz_test}" -: "${POSTGRES_HOST:=localhost}" +: "${POSTGRES_HOST:=postgres}" export PGPASSWORD=$POSTGRES_PASSWORD diff --git a/sql/migrations/2019-01-27/down.sql b/sql/migrations/2019-01-27/down.sql index 4cc3259bcd..c6b5f2d2fe 100644 --- a/sql/migrations/2019-01-27/down.sql +++ b/sql/migrations/2019-01-27/down.sql @@ -1,3 +1,3 @@ -BEGIN; - ALTER TABLE bookbrainz.editor ADD COLUMN birth_date DATE; -COMMIT; +BEGIN; + ALTER TABLE bookbrainz.editor ADD COLUMN birth_date DATE; +COMMIT; diff --git a/sql/migrations/2019-01-27/up.sql b/sql/migrations/2019-01-27/up.sql index b645eda825..888292fbf1 100644 --- a/sql/migrations/2019-01-27/up.sql +++ b/sql/migrations/2019-01-27/up.sql @@ -1,5 +1,5 @@ -BEGIN; - -- DROP COLUMN BIRTH DATE FROM EDITOR SCHEMA - ALTER TABLE bookbrainz.editor - DROP COLUMN birth_date; - COMMIT; +BEGIN; + -- DROP COLUMN BIRTH DATE FROM EDITOR SCHEMA + ALTER TABLE bookbrainz.editor + DROP COLUMN birth_date; + COMMIT; diff --git a/sql/migrations/2023-05-15-work-types/up.sql b/sql/migrations/2023-05-15-work-types/up.sql new file mode 100644 index 0000000000..65e8cbc63a --- /dev/null +++ b/sql/migrations/2023-05-15-work-types/up.sql @@ -0,0 +1,180 @@ +-- Add new columns for hierarchy, description and deprecation + +BEGIN TRANSACTION; + +ALTER TABLE bookbrainz.work_type ADD COLUMN description TEXT; +ALTER TABLE bookbrainz.work_type ADD COLUMN parent_id INT; +ALTER TABLE bookbrainz.work_type ADD COLUMN child_order INT NOT NULL DEFAULT 0; +ALTER TABLE bookbrainz.work_type ADD COLUMN deprecated BOOLEAN NOT NULL DEFAULT FALSE; + +ALTER TABLE bookbrainz.work_type ADD FOREIGN KEY (parent_id) REFERENCES bookbrainz.work_type (id); + +COMMIT; + + +-- Add new types and modify existing ones — see https://tickets.metabrainz.org/browse/BB-740 + +-- Top-level types first +BEGIN TRANSACTION; + + -- Non-fiction, id 8 + UPDATE bookbrainz.work_type + SET description='Prose work that is not fiction.', + parent_id=NULL, + child_order=1 + WHERE id=8; + + -- Poem, id 4 + UPDATE bookbrainz.work_type + SET description='A work of poetry; a non-prosaic composition that uses stylistic and rhythmic qualities of language to evoke meanings in addition to, or in place of, ostensible meaning. Poetry is very variable and particularly difficult to define; generally any work described as poetry should be considered of the poem work type.', + parent_id=NULL, + child_order=2 + WHERE id=4; + + INSERT INTO bookbrainz.work_type ("id","label","description","parent_id","child_order") + VALUES + (13,'Fiction','Literary work portraying individuals or events that are imaginary, though it may be based on a true story or situation.',NULL,0); + +COMMIT; + +-- Then second level types +BEGIN TRANSACTION; + + -- Play, id 5 + UPDATE bookbrainz.work_type + SET description='Work consisting mostly of dialogue and intended to be performed by actors.', + parent_id=13, + child_order=2 + WHERE id=5; + + -- Novel, id 1 + UPDATE bookbrainz.work_type + SET description='Prose narrative of considerable length and a certain complexity.', + parent_id=13, + child_order=1 + WHERE id=1; + + -- Epic, id 3 + UPDATE bookbrainz.work_type + SET description='Long narrative poem in which a heroic protagonist engages in an action of great mythic or historical significance.', + parent_id=4, + child_order=0 + WHERE id=3; + + -- Article, id 6 + UPDATE bookbrainz.work_type + SET label='Periodical article', + description='Article typically published in periodical publications, such as newspapers and magazines.', + parent_id=8, + child_order=6 + WHERE id=6; + + INSERT INTO bookbrainz.work_type ("id","label","description","parent_id","child_order") + VALUES + (14,'Short-form fiction','Prose narrative of limited complexity and length, too short to be considered a novel.',13,0), + (15,'Comics/manga/sequential art','Sequence of panels of images, usually including textual devices such as speech balloons, captions, and onomatopoeia to indicate dialogue, narration, and sound effects.',13,2), + (16,'Picture book story','A story, generally for young children, with many pictures and a simple narrative. Books consisting of such stories are called picture books.',13,3), + + (17,'Introductory text','Text that precedes the main work and offers some sort of introduction to it.',8,0), + (18,'Conclusion','Text placed after the main work and offering a conclusion to the book.',8,1), + (19,'Letter','Written message addressed to a person or organization. This work type should be used for real (not fictional) letters only. (Epistolary novels are novels and should not be split into individual letters.)',8,2), + (20,'Essay','Piece of writing in which the author develops their own argument on some subject.',8,3), + (21,'Speech','Address delivered to an audience (the written work being the text meant to read or the transcript of such as address).',8,4), + (22,'Scientific literature','Scholarly work containing firsthand reports of research, often reviewed by experts (primary literature), or synthesizing and condensing what is known on specific topics (secondary literature).',8,5), + (23,'Biographical literature','Work describing a real person’s life.',8,7), + (24,'Reference work','Informative work intended for consultation rather than consecutive reading.',8,8), + (25,'Legal instrument','A formal written legal document.',8,9), + (26,'Recipe','A set of instructions for making a dish of prepared food. Recipes are generally preceded by the list of necessary ingredients.',8,10), + + (27,'Sonnet','A 14-line poem with a variable rhyme scheme originating in Italy, and originally consisting of two quatrains and two tercets. Traditionally, a volta occurs between the eighth and ninth lines (or before the final couplet in the Shakespearean sonnet).',4,1), + (28,'Ballad','Short narrative poem in rhythmic verse suitable for singing, often in quatrains and rhyming the second and fourth lines.',4,2), + (29,'Haiku','Originally, a traditional short Japanese poetic form with a 5-7-5 phonetic units pattern, now adapted in different ways in other languages.',4,3), + (30,'Villanelle','Poetic composition consisting of nineteen lines: five tercets followed by a quatrain, with the first and third lines of the first stanza repeating alternately in the following stanzas, forming refrains, and as the final two lines of the final quatrain.',4,4); + +COMMIT; + + + +-- Finally, third level types +BEGIN TRANSACTION; + + -- Short Story + UPDATE bookbrainz.work_type + SET description='Prose narrative that is shorter than a novel or novella and that usually deals with only a few characters.', + parent_id=14, + child_order=0 + WHERE id=2; + -- Novella + UPDATE bookbrainz.work_type + SET description='Prose narrative whose length is shorter and less complex than most novels, but longer and more complex than most short stories.', + parent_id=14, + child_order=1 + WHERE id=12; + + -- Scientific Paper + UPDATE bookbrainz.work_type + SET description='Aliases: research paper, research article. Original full-length manuscript the results of scholarly research in a scientific discipline.', + parent_id=22, + child_order=0 + WHERE id=7; + + -- Introduction + UPDATE bookbrainz.work_type + SET description='Preliminary explanation preceding the main work.', + parent_id=17, + child_order=0 + WHERE id=11; + + INSERT INTO bookbrainz.work_type ("id","label","description","parent_id","child_order") + VALUES + (31,'Stage play','Work in prose or verse consisting mostly of dialogue and intended to be performed by actors on a stage.',5,0), + (32,'Screenplay','Text that provides the basis for a film production. Besides the dialogue spoken by the characters, screenplays usually also include a shot-by-shot outline of the film’s action.',5,1), + (33,'Comic strip','A series of comics panels designed in a narrative or chronological order.',15,0), + (34,'Yonkoma','Alias: 4-koma. Comic strip consisting of four panels of the same size arranged vertically.',15,1), + (35,'Comics story','Multiple-page work consisting of comics panels, usually in chronological order, that tells a story. Comics stories are typically published in comic books, which can contain multiple stories.',15,2), + (36,'Graphic novel','Long-form, generally book-length, comics story.',15,3), + (37,'Foreword','Preliminary text, generally written someone other than the author, introducing the work or the author.',17,0), + (38,'Preface','Introductory text, generally written by the author of the main work.',17,1), + (39,'Afterword','Text placed after the main work providing enriching comment, such as how the book came into being or the work’s historical or cultural context.',18,0), + (40,'Postface','Brief article or explanatory information placed at the end of a book.',18,1), + (41,'Epistle','Letter, generally didactic and elegant in style, often addressed to a group of people.',19,0), + (42,'Sermon','A religious discourse delivered by a preacher, generally based on a text of scripture and as part of a worship service.',21,0), + (43,'Opinion piece','Alias: op-ed. Article expressing the author’s opinion about a subject.',6,0), + (44,'Editorial','Article, often unsigned, expressing the opinion of the editors or publishers.',6,1), + (45,'News article','Article relating current or recent news.',6,2), + (46,'Review','Critical evaluation of an artistic work, performance, or product.',6,3), + (47,'Interview','The reproduction of a series of questions posed by a member of the press and the answers given by the person being interviewed.',6,4), + (48,'Biography','Work describing a real person’s life in detail.',23,0), + (49,'Autobiography','Biography written by the subject themselves.',23,1), + (50,'Memoir','Autobiographical work distinguished from autobiography by its narrow focus, generally retelling only a specific part of a person’s life.',23,2), + (51,'Diary','A record of events in one’s life, consisting of daily autobiographical entries. Although there are exceptions, diaries are generally written as personal records with no intention of publication, but notable diaries are sometimes published.',23,3), + (52,'Dictionary','Lists lexemes and their meanings in the same or in a different language. A dictionary may also provide additional information about the lexemes, such as their pronunciation, grammatical forms and functions, etymologies, and variant spellings.',24,0), + (53,'Encyclopedia','Aliases: encyclopædia, encyclopaedia. Work providing extensive information on all branches of knowledge arranged into articles or entries.',24,1), + (54,'Thesaurus','Work that arranges works according to their meaning, or simply lists their synonyms.',24,2), + (55,'Petrarchan sonnet','Alias: Italian sonnet. Original form of the sonnet with two quatrains and two tercets, which can be joined in an octave and a sextet.',27,0), + (56,'Shakespearean sonnet','Alias: English sonnet. English variant, with three quatrains followed by a final couplet. The three quatrains can be joined into a stanza.',27,1), + (57,'Blank verse','Poetic composition that does not rhyme but follows a regular meter. In English, this is almost always iambic pentameter.',28,0), + (58,'Limerick','Poetic composition consisting of five lines of chiefly anapestic verse, the third and fourth lines of two metrical feet and in the others of three feet, rhyming aabba. Limericks are often humorous, nonsensical, and sometimes lewd.',28,1), + (59,'Japanese haiku','Traditional Japanese poetic form consisting of three phrases composed of seventeen on (phonetic units) in a 5-7-5 pattern which include a kireji (“cutting word”), and a kigo (seasonal reference).',29,0), + (60,'Non-Japanese haiku','Adaptation of the haiku form into other languages, sometimes the 5-7-5 on pattern is interpreted as three lines of five, seven and five syllables, although this is not required. Short, concise and impressionistic wording is generally seen as an essential feature, and other haiku characteristics may be ignored or adapted in different ways.',29,1); + +COMMIT; + + +-- Deprecate existing types (Anthology and Serial) +BEGIN TRANSACTION; + + UPDATE bookbrainz.work_type + SET deprecated=true, description = 'deprecated' + WHERE id IN (9,10); + +COMMIT; + +-- finally, set not null constraint and check in the description column like we do for other text columns +-- We do not do this at the beginning because 'description' is a new column and all values will be NULL until we set them +BEGIN TRANSACTION; + ALTER TABLE bookbrainz.work_type + ALTER COLUMN description SET NOT NULL; + ALTER TABLE bookbrainz.work_type + ADD CONSTRAINT work_type_description_check CHECK (((description <> ''::text))); +COMMIT; \ No newline at end of file diff --git a/sql/schemas/bookbrainz.sql b/sql/schemas/bookbrainz.sql index e0fdbe4755..8eb9c2802f 100644 --- a/sql/schemas/bookbrainz.sql +++ b/sql/schemas/bookbrainz.sql @@ -407,8 +407,13 @@ ALTER TABLE bookbrainz.publisher_revision ADD FOREIGN KEY (data_id) REFERENCES b CREATE TABLE bookbrainz.work_type ( id SERIAL PRIMARY KEY, - label TEXT NOT NULL UNIQUE CHECK (label <> '') + label TEXT NOT NULL UNIQUE CHECK (label <> ''), + description TEXT NOT NULL CHECK (description <> ''), + parent_id INT, + child_order INT NOT NULL DEFAULT 0, + deprecated BOOLEAN NOT NULL DEFAULT FALSE ); +ALTER TABLE bookbrainz.work_type ADD FOREIGN KEY (parent_id) REFERENCES bookbrainz.work_type (id); CREATE TABLE bookbrainz.work_data ( id SERIAL PRIMARY KEY, diff --git a/src/api/app.js b/src/api/app.js index bc71f8739d..c1407a7714 100644 --- a/src/api/app.js +++ b/src/api/app.js @@ -22,22 +22,20 @@ import * as search from '../common/helpers/search'; import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; -import {get as _get} from 'lodash'; import appCleanup from '../common/helpers/appCleanup'; import compression from 'compression'; import config from '../common/helpers/config'; -import {createClient} from 'redis'; import express from 'express'; import initRoutes from './routes'; import logger from 'morgan'; -import redis from 'connect-redis'; -import session from 'express-session'; +import session from '../common/helpers/session'; // Initialize application const app = express(); app.locals.orm = BookBrainzData(config.database); +const debug = Debug('bbapi'); app.set('trust proxy', config.site.proxyTrust); @@ -49,28 +47,7 @@ app.use(express.json()); app.use(express.urlencoded({extended: false})); app.use(compression()); -/* Set up sessions, using Redis in production and default in-memory for testing environment*/ -const sessionOptions = { - cookie: { - maxAge: _get(config, 'session.maxAge', 2592000000), - secure: _get(config, 'session.secure', false) - }, - resave: false, - saveUninitialized: false, - secret: config.session.secret -}; -if (process.env.NODE_ENV !== 'test') { - const redisClient = createClient({ - host: _get(config, 'session.redis.host', 'localhost'), - port: _get(config, 'session.redis.port', 6379) - }); - - const RedisStore = redis(session); - sessionOptions.store = new RedisStore({ - client: redisClient - }); -} -app.use(session(sessionOptions)); +app.use(session(process.env.NODE_ENV)); // Set up routes const mainRouter = initRoutes(); @@ -93,8 +70,6 @@ mainRouter.use((req, res) => { search.init(app.locals.orm, Object.assign({}, config.search)); -const debug = Debug('bbapi'); - const DEFAULT_API_PORT = 9098; app.set('port', process.env.PORT || DEFAULT_API_PORT); diff --git a/src/client/components/footer.js b/src/client/components/footer.js index a2894cab8b..b7369da614 100644 --- a/src/client/components/footer.js +++ b/src/client/components/footer.js @@ -69,8 +69,8 @@ function Footer(props) {
Alpha Software —{' '} - - {siteRevision} + + {siteRevision || 'unknown revision'} —  Report a Bug diff --git a/src/client/components/forms/parts/achievement.js b/src/client/components/forms/parts/achievement.js index 9773d2e020..472f74eca5 100644 --- a/src/client/components/forms/parts/achievement.js +++ b/src/client/components/forms/parts/achievement.js @@ -56,64 +56,55 @@ const maxAchievementProgress = { 29: 10, 30: 100 }; -class Achievement extends React.Component { - constructor(props) { - super(props); - this.state = { - achievement: props.achievement, - counter: props.counter, - unlocked: props.unlocked - }; - } - render() { - let imgElement; - if (this.state.unlocked) { - imgElement = ( - - ); - } - else { - imgElement = ( - {this.state.achievement.name} - ); - } - return ( - - - - - {imgElement} - - -
- {this.state.achievement.name} -
-

{this.state.achievement.description}

- - {!this.state.unlocked && - -
- {this.state.counter}/{maxAchievementProgress[this.state.achievement.id] ?? 0} -
- - } -
-
-
- ); - } +function Achievement(props) { + const {achievement, counter, unlocked} = props; + const {id, name, description, badgeUrl} = achievement; + const imgElement = unlocked ? ( + + ) : ( + {name} + ); + + return ( + + + + + {imgElement} + + +
+ {name} +
+

{description}

+ + {!unlocked && + +
+ {counter}/{maxAchievementProgress[achievement.id] ?? 0} +
+ + } +
+
+
+ ); } Achievement.displayName = 'achievement'; @@ -122,6 +113,7 @@ Achievement.propTypes = { achievement: PropTypes.shape({ badgeUrl: PropTypes.string, description: PropTypes.string, + id: PropTypes.number, name: PropTypes.string }).isRequired, counter: PropTypes.number, diff --git a/src/client/components/forms/registration-details.js b/src/client/components/forms/registration-details.js index 3de2e0b984..43b34da18e 100644 --- a/src/client/components/forms/registration-details.js +++ b/src/client/components/forms/registration-details.js @@ -46,10 +46,10 @@ class RegistrationForm extends React.Component { handleSubmit(event) { event.preventDefault(); - const gender = this.gender.select.getValue()[0].id; + const genderId = this.gender?.select?.getValue()?.[0]?.id; const data = { displayName: this.displayName.value, - gender: gender ? parseInt(gender, 10) : null + gender: genderId ? parseInt(genderId, 10) : null }; this.setState({ @@ -91,11 +91,8 @@ class RegistrationForm extends React.Component { errorComponent = {this.state.error}; } - const loadingComponent = this.state.waiting ? : null; - const initialGender = this.props.gender && this.props.gender.id; - return (

Register

@@ -143,6 +140,7 @@ class RegistrationForm extends React.Component { Gender
option.id === initialGender)} getOptionLabel={this.getOptionLabel} instanceId="gender" @@ -152,7 +150,6 @@ class RegistrationForm extends React.Component { />
-
{errorComponent}
diff --git a/src/client/components/input/drag-and-drop-image.js b/src/client/components/input/drag-and-drop-image.js deleted file mode 100644 index 9cac1b6bdb..0000000000 --- a/src/client/components/input/drag-and-drop-image.js +++ /dev/null @@ -1,79 +0,0 @@ -/* - * Copyright (C) 2016 Max Prettyjohns - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License along - * with this program; if not, write to the Free Software Foundation, Inc., - * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - */ - -import PropTypes from 'prop-types'; -import React from 'react'; - - -/** - * This class is derived from the React Component base class and renders - * an image which supports drag and drop functionality. - */ -class DragAndDropImage extends React.Component { - /** - * Binds the class methods to their respective data. - * @constructor - */ - constructor() { - super(); - this.handleDragStart = this.handleDragStart.bind(this); - } - - /** - * Transfers the data of the achievement badge component properties to the - * DragAndDrop event, which in turn transfers the data on handleDrop to that - * of the achievement badge which will be showcased on editor's - * public profile. - * @param {object} ev - Passed in the function to be initialized with data - * onDragStart. - */ - handleDragStart(ev) { - const data = { - id: this.props.achievementId, - name: this.props.achievementName, - src: this.props.src - }; - ev.dataTransfer.setData('text', JSON.stringify(data)); - } - - /** - * Renders an image of a particular achievement badge, which can be dragged - * to set the user's publicly showcased achievements - * @returns {ReactElement} - The rendered image element. - */ - render() { - return ( - - ); - } -} - -DragAndDropImage.displayName = 'DragAndDropImage'; -DragAndDropImage.propTypes = { - achievementId: PropTypes.number.isRequired, - achievementName: PropTypes.string.isRequired, - height: PropTypes.string.isRequired, - src: PropTypes.string.isRequired -}; - -export default DragAndDropImage; diff --git a/src/client/components/input/drag-and-drop-image.tsx b/src/client/components/input/drag-and-drop-image.tsx new file mode 100644 index 0000000000..d4a4a57fe4 --- /dev/null +++ b/src/client/components/input/drag-and-drop-image.tsx @@ -0,0 +1,80 @@ +/* + * Copyright (C) 2016 Max Prettyjohns + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import PropTypes from 'prop-types'; +import React from 'react'; + +const {useCallback} = React; + +/** + * Props for DragAndDropImage component + * @typedef {Object} Props + * @property {number} achievementId - ID of the achievement + * @property {string} achievementName - Name of the achievement + * @property {string} height - Height of the image + * @property {string} src - Image source URL + */ + +type Props = { + achievementId: number; + achievementName: string; + height: string; + src: string; +}; + +/** + * The `DragAndDropImage` component renders an image of a particular achievement badge, which can be dragged to set the user's publicly showcased achievements. + * + * @param {Props} props - Props for the component + * + * @returns {JSX.Element} - The rendered image element. + */ + +function DragAndDropImage({achievementId, achievementName, height, src}: Props): JSX.Element { + /** + * Transfers the data of the achievement badge component properties to the DragEvent, which in turn transfers the data on handleDrop to that of the achievement badge which will be showcased on editor's public profile. + * @param {React.DragEvent} ev - The drag event object. + */ + const handleDragStart = useCallback((ev: React.DragEvent) => { + const data = { + id: achievementId, + name: achievementName, + src + }; + ev.dataTransfer.setData('text', JSON.stringify(data)); + }, [achievementId, achievementName, src]); + + return ( + + ); +} + +DragAndDropImage.displayName = 'DragAndDropImage'; +DragAndDropImage.propTypes = { + achievementId: PropTypes.number.isRequired, + achievementName: PropTypes.string.isRequired, + height: PropTypes.string.isRequired, + src: PropTypes.string.isRequired +}; + +export default DragAndDropImage; diff --git a/src/client/components/pages/contribute.js b/src/client/components/pages/contribute.js index fd254453ec..a1b56952e6 100644 --- a/src/client/components/pages/contribute.js +++ b/src/client/components/pages/contribute.js @@ -26,9 +26,7 @@ import React from 'react'; */ function ContributePage() { const IRCLink = 'https://kiwiirc.com/nextclient/irc.libera.chat/?#bookbrainz'; - const styleLink = - 'https://bookbrainz-user-guide.readthedocs.io/' + - 'en/latest/style/introduction/'; + const styleLink = 'https://bookbrainz-user-guide.readthedocs.io/'; return (
diff --git a/src/client/components/pages/entities/author-table.js b/src/client/components/pages/entities/author-table.js index e584ab13f1..f2dfdf460f 100644 --- a/src/client/components/pages/entities/author-table.js +++ b/src/client/components/pages/entities/author-table.js @@ -26,12 +26,12 @@ import React from 'react'; const {Table} = bootstrap; const {transformISODateForDisplay, extractAttribute, getEntityDisambiguation, getEntityLabel} = entityHelper; -function AuthorTableRow({author, showAddedAtColumn, showCheckboxes, selectedEntities, onToggleRow}) { +function AuthorTableRow({author, showAddedAtColumn, showCheckboxes, selectedEntities, onToggleRow, genderOptions}) { const name = getEntityLabel(author); const disambiguation = getEntityDisambiguation(author); const number = author.number || '?'; - const authorType = author.authorType ? author.authorType.label : '?'; - const gender = author.gender ? author.gender.name : '?'; + const authorType = author.authorType?.label || author.authorType || '?'; + const gender = author.gender?.name ?? genderOptions.find((option) => option.id === author.genderId)?.name ?? '?'; const beginDate = transformISODateForDisplay(extractAttribute(author.beginDate)); const endDate = transformISODateForDisplay(extractAttribute(author.endDate)); const addedAt = showAddedAtColumn ? utilHelper.formatDate(new Date(author.addedAt), true) : null; @@ -66,18 +66,20 @@ function AuthorTableRow({author, showAddedAtColumn, showCheckboxes, selectedEnti AuthorTableRow.displayName = 'AuthorTableRow'; AuthorTableRow.propTypes = { author: PropTypes.object.isRequired, + genderOptions: PropTypes.array, onToggleRow: PropTypes.func, selectedEntities: PropTypes.array, showAddedAtColumn: PropTypes.bool.isRequired, showCheckboxes: PropTypes.bool }; AuthorTableRow.defaultProps = { + genderOptions: [], onToggleRow: null, selectedEntities: [], showCheckboxes: false }; -function AuthorTable({authors, showAddedAtColumn, showCheckboxes, selectedEntities, onToggleRow}) { +function AuthorTable({authors, showAddedAtColumn, showCheckboxes, selectedEntities, onToggleRow, genderOptions}) { let tableContent; if (authors.length) { tableContent = ( @@ -101,6 +103,7 @@ function AuthorTable({authors, showAddedAtColumn, showCheckboxes, selectedEntiti authors.map((author) => ( { setShowCBReviewModal(!showCBReviewModal); @@ -129,17 +131,14 @@ function AuthorDisplayPage({entity, identifierTypes, user}) { }, [reviewsRef]); const urlPrefix = getEntityUrl(entity); + const editions = []; + if (entity?.authorCredits) { + entity.authorCredits.forEach((authorCredit) => { + editions.push(...authorCredit.editions); + }); + } return (
- + {!entity.deleted && + + {!entity.deleted && }
); } @@ -204,11 +214,12 @@ AuthorDisplayPage.displayName = 'AuthorDisplayPage'; AuthorDisplayPage.propTypes = { entity: PropTypes.object.isRequired, identifierTypes: PropTypes.array, - user: PropTypes.object.isRequired - + user: PropTypes.object.isRequired, + wikipediaExtract: PropTypes.object }; AuthorDisplayPage.defaultProps = { - identifierTypes: [] + identifierTypes: [], + wikipediaExtract: {} }; export default AuthorDisplayPage; diff --git a/src/client/components/pages/entities/edition-group.js b/src/client/components/pages/entities/edition-group.js index 97f8b3c128..a8be344c1e 100644 --- a/src/client/components/pages/entities/edition-group.js +++ b/src/client/components/pages/entities/edition-group.js @@ -32,6 +32,7 @@ import EntityRelatedCollections from './related-collections'; import EntityReviews from './cb-review'; import EntityTitle from './title'; import PropTypes from 'prop-types'; +import WikipediaExtract from './wikipedia-extract'; const {deletedEntityMessage, getTypeAttribute, getEntityUrl, ENTITY_TYPE_ICONS, getSortNameOfDefaultAlias} = entityHelper; @@ -78,7 +79,7 @@ EditionGroupAttributes.propTypes = { }; -function EditionGroupDisplayPage({entity, identifierTypes, user}) { +function EditionGroupDisplayPage({entity, identifierTypes, user, wikipediaExtract}) { const [showCBReviewModal, setShowCBReviewModal] = React.useState(false); const handleModalToggle = useCallback(() => { setShowCBReviewModal(!showCBReviewModal); @@ -112,15 +113,6 @@ function EditionGroupDisplayPage({entity, identifierTypes, user}) { return (
- + {!entity.deleted && @@ -174,6 +167,15 @@ function EditionGroupDisplayPage({entity, identifierTypes, user}) { lastModified={entity.revision.revision.createdAt} user={user} /> + {!entity.deleted && }
); } @@ -181,10 +183,12 @@ EditionGroupDisplayPage.displayName = 'EditionGroupDisplayPage'; EditionGroupDisplayPage.propTypes = { entity: PropTypes.object.isRequired, identifierTypes: PropTypes.array, - user: PropTypes.object.isRequired + user: PropTypes.object.isRequired, + wikipediaExtract: PropTypes.object }; EditionGroupDisplayPage.defaultProps = { - identifierTypes: [] + identifierTypes: [], + wikipediaExtract: {} }; export default EditionGroupDisplayPage; diff --git a/src/client/components/pages/entities/edition-table.js b/src/client/components/pages/entities/edition-table.js index 59d6227d36..5504b6d8ac 100644 --- a/src/client/components/pages/entities/edition-table.js +++ b/src/client/components/pages/entities/edition-table.js @@ -22,6 +22,7 @@ import * as utilHelper from '../../../helpers/utils'; import {faBook, faPlus} from '@fortawesome/free-solid-svg-icons'; +import AuthorCreditDisplay from '../../author-credit-display'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import PropTypes from 'prop-types'; import React from 'react'; @@ -30,17 +31,18 @@ import {kebabCase as _kebabCase} from 'lodash'; const { getEditionReleaseDate, getEntityLabel, getEntityDisambiguation, - getISBNOfEdition, getEditionFormat + getISBNOfEdition, getEditionFormat, getAuthorCreditNames } = entityHelper; const {Button, Table} = bootstrap; -function EditionTableRow({edition, showAddedAtColumn, showCheckboxes, selectedEntities, onToggleRow}) { +function EditionTableRow({edition, showAddedAtColumn, showAuthorCreditsColumn, showCheckboxes, selectedEntities, onToggleRow}) { const name = getEntityLabel(edition); const disambiguation = getEntityDisambiguation(edition); const number = edition.number || '?'; const releaseDate = getEditionReleaseDate(edition); const isbn = getISBNOfEdition(edition); const editionFormat = getEditionFormat(edition); + const authorCreditNames = showAuthorCreditsColumn ? getAuthorCreditNames(edition) : []; const addedAt = showAddedAtColumn ? utilHelper.formatDate(new Date(edition.addedAt), true) : null; /* eslint-disable react/jsx-no-bind */ @@ -61,6 +63,7 @@ function EditionTableRow({edition, showAddedAtColumn, showCheckboxes, selectedEn
{name} {disambiguation} + {showAuthorCreditsColumn && {authorCreditNames.length ? : '?'}} {editionFormat} { @@ -87,15 +90,17 @@ EditionTableRow.propTypes = { onToggleRow: PropTypes.func, selectedEntities: PropTypes.array, showAddedAtColumn: PropTypes.bool.isRequired, + showAuthorCreditsColumn: PropTypes.bool, showCheckboxes: PropTypes.bool }; EditionTableRow.defaultProps = { onToggleRow: null, selectedEntities: [], + showAuthorCreditsColumn: false, showCheckboxes: false }; -function EditionTable({editions, entity, showAddedAtColumn, showAdd, showCheckboxes, selectedEntities, onToggleRow}) { +function EditionTable({editions, entity, showAddedAtColumn, showAdd, showAuthorCreditsColumn, showCheckboxes, selectedEntities, onToggleRow}) { let tableContent; if (editions.length) { tableContent = ( @@ -105,6 +110,7 @@ function EditionTable({editions, entity, showAddedAtColumn, showAdd, showCheckbo {editions[0].displayNumber && #} Name + {showAuthorCreditsColumn && Author Credits} Format ISBN Release Date @@ -121,6 +127,7 @@ function EditionTable({editions, entity, showAddedAtColumn, showAdd, showCheckbo key={edition.bbid} selectedEntities={selectedEntities} showAddedAtColumn={showAddedAtColumn} + showAuthorCreditsColumn={showAuthorCreditsColumn} showCheckboxes={showCheckboxes} onToggleRow={onToggleRow} /> @@ -184,6 +191,7 @@ EditionTable.propTypes = { selectedEntities: PropTypes.array, showAdd: PropTypes.bool, showAddedAtColumn: PropTypes.bool, + showAuthorCreditsColumn: PropTypes.bool, showCheckboxes: PropTypes.bool }; EditionTable.defaultProps = { @@ -192,6 +200,7 @@ EditionTable.defaultProps = { selectedEntities: [], showAdd: true, showAddedAtColumn: false, + showAuthorCreditsColumn: false, showCheckboxes: false }; diff --git a/src/client/components/pages/entities/edition.js b/src/client/components/pages/entities/edition.js index a7bdf72e2a..afbd5fe354 100644 --- a/src/client/components/pages/entities/edition.js +++ b/src/client/components/pages/entities/edition.js @@ -28,6 +28,7 @@ import EntityTitle from './title'; import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import PropTypes from 'prop-types'; import React from 'react'; +import WikipediaExtract from './wikipedia-extract'; import WorksTable from './work-table'; import {faExternalLinkAlt} from '@fortawesome/free-solid-svg-icons'; @@ -106,7 +107,7 @@ EditionAttributes.propTypes = { }; -function EditionDisplayPage({entity, identifierTypes, user}) { +function EditionDisplayPage({entity, identifierTypes, user, wikipediaExtract}) { // relationshipTypeId = 10 refers the relation ( is contained by ) const relationshipTypeId = 10; const worksContainedByEdition = getRelationshipTargetByTypeId(entity, relationshipTypeId); @@ -168,6 +169,7 @@ function EditionDisplayPage({entity, identifierTypes, user}) { {editionGroupSection} + {!entity.deleted && @@ -198,10 +200,12 @@ EditionDisplayPage.displayName = 'EditionDisplayPage'; EditionDisplayPage.propTypes = { entity: PropTypes.object.isRequired, identifierTypes: PropTypes.array, - user: PropTypes.object.isRequired + user: PropTypes.object.isRequired, + wikipediaExtract: PropTypes.object }; EditionDisplayPage.defaultProps = { - identifierTypes: [] + identifierTypes: [], + wikipediaExtract: {} }; export default EditionDisplayPage; diff --git a/src/client/components/pages/entities/identifiers.js b/src/client/components/pages/entities/identifiers.js index 782df8baa5..6659c6d749 100644 --- a/src/client/components/pages/entities/identifiers.js +++ b/src/client/components/pages/entities/identifiers.js @@ -21,14 +21,15 @@ import PropTypes from 'prop-types'; import React from 'react'; -function EntityIdentifiers({identifiers, identifierTypes}) { +function EntityIdentifiers({entityUrl, identifiers, identifierTypes}) { return (

Identifiers

{ - identifiers && - identifierTypes.sort((a, b) => a.label.localeCompare(b.label)).map((type) => { - const identifierValues = + + identifiers?.length > 0 ? + identifierTypes.sort((a, b) => a.label.localeCompare(b.label)).map((type) => { + const identifierValues = identifiers .filter( (identifier) => identifier.type.id === type.id || identifier.typeId === type.id @@ -43,14 +44,21 @@ function EntityIdentifiers({identifiers, identifierTypes}) { ) ); - if (!identifierValues.length) { - return null; - } - return [ -
{type.label}
, - identifierValues - ]; - }) + if (!identifierValues.length) { + return null; + } + return [ +
{type.label}
, + identifierValues + ]; + }) : +

+ No identifiers. +   + + Click here to edit + and add new identifiers (e.g. ISBN, Wikidata ID, etc.). +

}
); @@ -58,6 +66,7 @@ function EntityIdentifiers({identifiers, identifierTypes}) { EntityIdentifiers.displayName = 'EntityIdentifiers'; EntityIdentifiers.propTypes = { + entityUrl: PropTypes.string.isRequired, identifierTypes: PropTypes.array.isRequired, identifiers: PropTypes.array }; diff --git a/src/client/components/pages/entities/links.js b/src/client/components/pages/entities/links.js index 8e3d8c299c..b54d02435e 100644 --- a/src/client/components/pages/entities/links.js +++ b/src/client/components/pages/entities/links.js @@ -27,7 +27,7 @@ import React from 'react'; const {filterOutRelationshipTypeById} = entityHelper; -const {Row} = bootstrap; +const {Row, Col} = bootstrap; function EntityLinks({entity, identifierTypes, urlPrefix}) { // relationshipTypeId = 10 refers the relation ( is contained by ) @@ -36,17 +36,22 @@ function EntityLinks({entity, identifierTypes, urlPrefix}) { return ( - + + + - + + + ); diff --git a/src/client/components/pages/entities/publisher.js b/src/client/components/pages/entities/publisher.js index d3ee18fdbd..a86114fc89 100644 --- a/src/client/components/pages/entities/publisher.js +++ b/src/client/components/pages/entities/publisher.js @@ -27,6 +27,7 @@ import EntityRelatedCollections from './related-collections'; import EntityTitle from './title'; import PropTypes from 'prop-types'; import React from 'react'; +import WikipediaExtract from './wikipedia-extract'; const {deletedEntityMessage, extractAttribute, getTypeAttribute, getEntityUrl, @@ -81,7 +82,7 @@ PublisherAttributes.propTypes = { }; -function PublisherDisplayPage({entity, identifierTypes, user}) { +function PublisherDisplayPage({entity, identifierTypes, user, wikipediaExtract}) { const urlPrefix = getEntityUrl(entity); return (
@@ -98,10 +99,11 @@ function PublisherDisplayPage({entity, identifierTypes, user}) { + {!entity.deleted && - + -

Related Collections

- {collections && - - } + +

Related Collections

+ {collections?.length > 0 ? ( + + ) : +

+ This entity does not appear in any public collection. +
+ Click the "Add to collection" button below to add it to an existing collection or create a new one. +

+ } + ); } diff --git a/src/client/components/pages/entities/relationships.js b/src/client/components/pages/entities/relationships.js index b4e4c923c6..7db1d22133 100644 --- a/src/client/components/pages/entities/relationships.js +++ b/src/client/components/pages/entities/relationships.js @@ -21,35 +21,39 @@ import React from 'react'; import Relationship from '../../../entity-editor/relationship-editor/relationship'; -function EntityRelationships({contextEntity, relationships}) { +function EntityRelationships({contextEntity, relationships, entityUrl}) { return (

Relationships

- {relationships && -
    - {relationships.map((relationship) => ( -
  • - -
  • - ))} -
- } + {relationships?.length > 0 ? ( +
    + {relationships.map((relationship) => ( +
  • + +
  • + ))} +
+ ) : ( +

+ No relationships. Click here to edit and create new relationships. +

+ )}
); } + EntityRelationships.displayName = 'EntityRelationships'; EntityRelationships.propTypes = { contextEntity: PropTypes.object.isRequired, + entityUrl: PropTypes.string.isRequired, relationships: PropTypes.array.isRequired }; diff --git a/src/client/components/pages/entities/series-table.js b/src/client/components/pages/entities/series-table.js index b55bbe32c6..16245222c7 100644 --- a/src/client/components/pages/entities/series-table.js +++ b/src/client/components/pages/entities/series-table.js @@ -79,7 +79,7 @@ function SeriesTable({series, showAddedAtColumn, showCheckboxes, selectedEntitie - + { diff --git a/src/client/components/pages/entities/series.js b/src/client/components/pages/entities/series.js index 4cbbfe7e38..94f04ec7d0 100644 --- a/src/client/components/pages/entities/series.js +++ b/src/client/components/pages/entities/series.js @@ -30,6 +30,7 @@ import EntityRelatedCollections from './related-collections'; import EntityReviews from './cb-review'; import EntityTitle from './title'; import PropTypes from 'prop-types'; +import WikipediaExtract from './wikipedia-extract'; const {deletedEntityMessage, getEntityUrl, ENTITY_TYPE_ICONS, getSortNameOfDefaultAlias} = entityHelper; @@ -87,7 +88,7 @@ SeriesAttributes.propTypes = { }; -function SeriesDisplayPage({entity, identifierTypes, user}) { +function SeriesDisplayPage({entity, identifierTypes, user, genderOptions, wikipediaExtract}) { const [showCBReviewModal, setShowCBReviewModal] = React.useState(false); const handleModalToggle = useCallback(() => { setShowCBReviewModal(!showCBReviewModal); @@ -105,21 +106,13 @@ function SeriesDisplayPage({entity, identifierTypes, user}) { const entityKey = getEntityKey(entity.entityType); const propsForTable = { [entityKey]: entity.seriesItems, + genderOptions, showAdd: false, showAddedAtColumn: false, showCheckboxes: false }; return (
-
+ {!entity.deleted && @@ -172,17 +166,30 @@ function SeriesDisplayPage({entity, identifierTypes, user}) { lastModified={entity.revision.revision.createdAt} user={user} /> + {!entity.deleted && } ); } SeriesDisplayPage.displayName = 'SeriesDisplayPage'; SeriesDisplayPage.propTypes = { entity: PropTypes.object.isRequired, + genderOptions: PropTypes.array, identifierTypes: PropTypes.array, - user: PropTypes.object.isRequired + user: PropTypes.object.isRequired, + wikipediaExtract: PropTypes.object }; SeriesDisplayPage.defaultProps = { - identifierTypes: [] + genderOptions: [], + identifierTypes: [], + wikipediaExtract: {} }; export default SeriesDisplayPage; diff --git a/src/client/components/pages/entities/wikipedia-extract.tsx b/src/client/components/pages/entities/wikipedia-extract.tsx new file mode 100644 index 0000000000..e8433e425a --- /dev/null +++ b/src/client/components/pages/entities/wikipedia-extract.tsx @@ -0,0 +1,95 @@ +/* + * Copyright (C) 2023 David Kellner + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {Col, Row} from 'react-bootstrap'; +import React, {useEffect, useState} from 'react'; +import {WikipediaArticleExtract, buildWikipediaUrl, getWikidataId} from '../../../../common/helpers/wikimedia'; +import DOMPurify from 'isomorphic-dompurify'; +import type {EntityT} from 'bookbrainz-data/lib/types/entity'; +import {getAliasLanguageCodes} from '../../../../common/helpers/utils'; +import {uniq} from 'lodash'; + + +type Props = { + entity: EntityT, + articleExtract?: WikipediaArticleExtract, +}; + + +/** + * Fetches a Wikipedia extract for the given Wikidata item. + * @param {string} wikidataId - Wikidata item ID. + * @param {string[]} preferredLanguages - List of language codes, preference in descending order. + */ +async function getWikipediaExtractForWikidata(wikidataId: string, preferredLanguages: string[] = ['en']) { + const apiUrl = new URL(`/wikidata/${wikidataId}/wikipedia-extract`, document.location.href); + apiUrl.search = new URLSearchParams(preferredLanguages.map((lang) => ['language', lang])).toString(); + const response = await fetch(apiUrl); + return response.json() as Promise; +} + + +function WikipediaExtract({entity, articleExtract}: Props) { + const [state, setState] = useState(articleExtract); + + useEffect(() => { + if (!state.extract) { + const wikidataId = getWikidataId(entity); + if (!wikidataId) { + return; + } + + const aliasLanguages = getAliasLanguageCodes(entity); + const preferredLanguages = uniq(['en', ...aliasLanguages]); + + getWikipediaExtractForWikidata(wikidataId, preferredLanguages).then((result) => { + if (result.extract) { + setState(result); + } + }).catch((error) => { + // eslint-disable-next-line no-console -- no other logger available for browser + console.warn('Failed to load Wikipedia extract:', error); + }); + } + }, [entity]); + + const {extract, article} = state; + const licenseUrl = 'https://creativecommons.org/licenses/by-sa/3.0/'; + + return extract ? ( + + +

Wikipedia

+ {/* eslint-disable-next-line react/no-danger */} +
+ Continue reading at Wikipedia... + {' '} + + Wikipedia content provided under the terms of the Creative Commons BY-SA license + + + + ) : null; +} + +WikipediaExtract.defaultProps = { + articleExtract: {} +}; + + +export default WikipediaExtract; diff --git a/src/client/components/pages/entities/work.js b/src/client/components/pages/entities/work.js index 2c907d4457..76d5afd562 100644 --- a/src/client/components/pages/entities/work.js +++ b/src/client/components/pages/entities/work.js @@ -31,6 +31,7 @@ import EntityRelatedCollections from './related-collections'; import EntityReviews from './cb-review'; import EntityTitle from './title'; import PropTypes from 'prop-types'; +import WikipediaExtract from './wikipedia-extract'; const {deletedEntityMessage, getRelationshipSourceByTypeId, getLanguageAttribute, getTypeAttribute, getEntityUrl, @@ -86,7 +87,7 @@ WorkAttributes.propTypes = { }; -function WorkDisplayPage({entity, identifierTypes, user}) { +function WorkDisplayPage({entity, identifierTypes, user, wikipediaExtract}) { const [showCBReviewModal, setShowCBReviewModal] = React.useState(false); const handleModalToggle = useCallback(() => { setShowCBReviewModal(!showCBReviewModal); @@ -105,15 +106,6 @@ function WorkDisplayPage({entity, identifierTypes, user}) { const urlPrefix = getEntityUrl(entity); return (
-
+ {!entity.deleted && @@ -168,6 +161,15 @@ function WorkDisplayPage({entity, identifierTypes, user}) { lastModified={entity.revision.revision.createdAt} user={user} /> + {!entity.deleted && } ); } @@ -175,10 +177,12 @@ WorkDisplayPage.displayName = 'WorkDisplayPage'; WorkDisplayPage.propTypes = { entity: PropTypes.object.isRequired, identifierTypes: PropTypes.array, - user: PropTypes.object.isRequired + user: PropTypes.object.isRequired, + wikipediaExtract: PropTypes.object }; WorkDisplayPage.defaultProps = { - identifierTypes: [] + identifierTypes: [], + wikipediaExtract: {} }; export default WorkDisplayPage; diff --git a/src/client/components/pages/help.js b/src/client/components/pages/help.js index 168e6727d1..435a036858 100644 --- a/src/client/components/pages/help.js +++ b/src/client/components/pages/help.js @@ -31,9 +31,8 @@ const {ListGroup, Col, Row} = bootstrap; */ function HelpPage() { const IRCLink = 'https://kiwiirc.com/nextclient/irc.libera.chat/?#bookbrainz'; - const styleLink = - 'https://bookbrainz-user-guide.readthedocs.io/' + - 'en/latest/style/introduction/'; + const userGuideLink = + 'https://bookbrainz-user-guide.readthedocs.io/'; return (
@@ -46,7 +45,7 @@ function HelpPage() { used across BookBrainz, as well as an F.A.Q and a glossary.
Still having some trouble with something? - You can refer to the style documentation, + You can refer to the user guide and documentation, or come ask us directly on our IRC channel.


diff --git a/src/client/components/pages/parts/call-to-action.js b/src/client/components/pages/parts/call-to-action.js index 7b75f4ac71..521864b357 100644 --- a/src/client/components/pages/parts/call-to-action.js +++ b/src/client/components/pages/parts/call-to-action.js @@ -34,11 +34,10 @@ const {Button, ButtonGroup} = bootstrap; * the 'CallToAction' component. */ function CallToAction(props) { - // double encoding to prevent browser from automatically decoding it - const nameQueryParameter = props.query ? `?name=${encodeURIComponent(encodeURIComponent(props.query))}` : ''; + const seedingParameters = new URLSearchParams({name: props.query}); function renderEntityLink(type) { return ( - +
- - - - + + + + { showPrivacy ? - : null + : null } { showIfOwnerOrCollaborator ? - : null + : null } { showOwner ? - : null + : null } { showLastModified ? - : null + : null } diff --git a/src/client/components/pages/parts/revisions-table.js b/src/client/components/pages/parts/revisions-table.js index 7557046430..1b13f90a5d 100644 --- a/src/client/components/pages/parts/revisions-table.js +++ b/src/client/components/pages/parts/revisions-table.js @@ -45,20 +45,20 @@ function RevisionsTable(props) { > - + { showEntities ? - : null + : null } { showRevisionEditor ? - : null + : null } { showRevisionNote ? - : null + : null } - + diff --git a/src/client/components/pages/parts/search-results.js b/src/client/components/pages/parts/search-results.js index e4a37a157b..a35a12ee0c 100644 --- a/src/client/components/pages/parts/search-results.js +++ b/src/client/components/pages/parts/search-results.js @@ -232,9 +232,9 @@ class SearchResults extends React.Component { !this.props.condensed && - - - + + + } diff --git a/src/client/components/pages/search.tsx b/src/client/components/pages/search.tsx index 36dcc6148e..ca3a5eddd0 100644 --- a/src/client/components/pages/search.tsx +++ b/src/client/components/pages/search.tsx @@ -82,10 +82,13 @@ class SearchPage extends React.Component { }; this.paginationUrl = './search/search'; + this.pagerElementRef = React.createRef(); } paginationUrl: string; + pagerElementRef: React.RefObject; + /** * Gets user text query from the browser's URL search parameters and * sets it in the state to be passed down to SearchField and Pager components @@ -94,7 +97,13 @@ class SearchPage extends React.Component { * @param {string} type - Entity type selected from dropdown */ handleSearch = (query: string, type: string) => { - this.setState({query, type}); + if (query === this.state.query && type === this.state.type && this.pagerElementRef.current) { + // if no change in query or type, re-run the search + this.pagerElementRef.current.triggerSearch(); + } + else { + this.setState({query, type}); + } }; /** @@ -154,6 +163,7 @@ class SearchPage extends React.Component { nextEnabled={this.props.nextEnabled} paginationUrl={this.paginationUrl} querySearchParams={querySearchParams} + ref={this.pagerElementRef} results={results} searchParamsChangeCallback={this.searchParamsChangeCallback} searchResultsCallback={this.searchResultsCallback} diff --git a/src/client/components/pages/statistics.js b/src/client/components/pages/statistics.js index ed2dad85be..6e2857d43b 100644 --- a/src/client/components/pages/statistics.js +++ b/src/client/components/pages/statistics.js @@ -48,10 +48,10 @@ function TopEditorsTable(props) { > - - - - + + + + @@ -101,10 +101,10 @@ function EntityCountTable(props) { > - - - - + + + + diff --git a/src/client/entity-editor/author-credit-editor/actions.ts b/src/client/entity-editor/author-credit-editor/actions.ts index d4b86f8974..52e5eabf30 100644 --- a/src/client/entity-editor/author-credit-editor/actions.ts +++ b/src/client/entity-editor/author-credit-editor/actions.ts @@ -27,7 +27,9 @@ export const SHOW_AUTHOR_CREDIT_EDITOR = 'SHOW_AUTHOR_CREDIT_EDITOR'; export const HIDE_AUTHOR_CREDIT_EDITOR = 'HIDE_AUTHOR_CREDIT_EDITOR'; export const REMOVE_EMPTY_CREDIT_ROWS = 'REMOVE_EMPTY_CREDIT_ROWS'; export const UPDATE_AUTHOR_CREDIT = 'UPDATE_AUTHOR_CREDIT'; - +export const CLEAR_AUTHOR_CREDIT = 'CLEAR_AUTHOR_CREDIT'; +export const RESET_AUTHOR_CREDIT = 'RESET_AUTHOR_CREDIT'; +export const TOGGLE_AUTHOR_CREDIT = 'TOGGLE_AUTHOR_CREDIT'; export type Action = { type: string, @@ -193,3 +195,32 @@ export function updateAuthorCredit(authorCredit: AuthorCredit): Action { type: UPDATE_AUTHOR_CREDIT }; } + +/** + * @returns {Action} The resulting CLEAR_AUTHOR_CREDIT action. + */ +export function clearAuthorCredit(): Action { + return { + type: CLEAR_AUTHOR_CREDIT + }; +} + +/** + * @returns {Action} The resulting RESET_AUTHOR_CREDIT action. + */ +export function resetAuthorCredit(): Action { + return { + type: RESET_AUTHOR_CREDIT + }; +} + +/** + * Produces an action indicating that the AC checkbox should be toggled. + * + * @returns {Action} The resulting TOGGLE_AUTHOR_CREDIT action. + */ +export function toggleAuthorCredit(): Action { + return { + type: TOGGLE_AUTHOR_CREDIT + }; +} diff --git a/src/client/entity-editor/author-credit-editor/author-credit-section.tsx b/src/client/entity-editor/author-credit-editor/author-credit-section.tsx index 0743063e69..b1a6fcca73 100644 --- a/src/client/entity-editor/author-credit-editor/author-credit-section.tsx +++ b/src/client/entity-editor/author-credit-editor/author-credit-section.tsx @@ -16,21 +16,22 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -import { - Action, +import {Action, AuthorCreditRow, addAuthorCreditRow, + clearAuthorCredit, hideAuthorCreditEditor, removeEmptyCreditRows, + resetAuthorCredit, showAuthorCreditEditor, - updateCreditAuthorValue -} from './actions'; -import {Button, Col, Form, InputGroup, OverlayTrigger, Row, Tooltip} from 'react-bootstrap'; + toggleAuthorCredit + , updateCreditAuthorValue} from './actions'; +import {Button, Col, Form, FormLabel, InputGroup, OverlayTrigger, Row, Tooltip} from 'react-bootstrap'; -import {SingleValueProps, components} from 'react-select'; import {get as _get, map as _map, values as _values, camelCase} from 'lodash'; -import {faPencilAlt, faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; +import {faInfoCircle, faPencilAlt, faQuestionCircle} from '@fortawesome/free-solid-svg-icons'; + import AuthorCreditEditor from './author-credit-editor'; import type {Dispatch} from 'redux'; // eslint-disable-line import/named import EntitySearchFieldOption from '../common/entity-search-field-option'; @@ -38,8 +39,10 @@ import {FontAwesomeIcon} from '@fortawesome/react-fontawesome'; import PropTypes from 'prop-types'; import React from 'react'; import SearchEntityCreate from '../../unified-form/common/search-entity-create-select'; +import {SingleValueProps} from 'react-select/src/components/SingleValue'; import ValidationLabel from '../common/validation-label'; import {clearAuthor} from '../../unified-form/cover-tab/action'; +import {components} from 'react-select'; import {connect} from 'react-redux'; import {convertMapToObject} from '../../helpers/utils'; import {validateAuthorCreditSection} from '../validators/common'; @@ -53,12 +56,14 @@ type OwnProps = { type StateProps = { authorCreditEditor: Record, + authorCreditEnable: boolean, showEditor: boolean, isEditable:boolean, }; type DispatchProps = { onAuthorChange: (Author) => unknown, + toggleAuthorCreditEnable: (newValue:boolean) => unknown, onClearHandler:(arg) => unknown, onEditAuthorCredit: (rowCount: number) => unknown, onEditorClose: () => unknown, @@ -68,7 +73,8 @@ type Props = OwnProps & StateProps & DispatchProps; function AuthorCreditSection({ authorCreditEditor: immutableAuthorCreditEditor, onEditAuthorCredit, onEditorClose, - showEditor, onAuthorChange, isEditable, onClearHandler, isUnifiedForm, isLeftAlign, ...rest + showEditor, onAuthorChange, isEditable, authorCreditEnable, toggleAuthorCreditEnable, + onClearHandler, isUnifiedForm, isLeftAlign, ...rest }: Props) { const authorCreditEditor = convertMapToObject(immutableAuthorCreditEditor); let editor; @@ -85,17 +91,17 @@ function AuthorCreditSection({ const authorCreditPreview = _map(authorCreditEditor, (credit) => `${credit.name}${credit.joinPhrase}`).join(''); const authorCreditRows = _values(authorCreditEditor); - const isValid = validateAuthorCreditSection(authorCreditRows); + const isValid = validateAuthorCreditSection(authorCreditRows, authorCreditEnable); const editButton = ( // eslint-disable-next-line react/jsx-no-bind - ); const label = ( - + Author Credit ); @@ -108,10 +114,33 @@ function AuthorCreditSection({ ); const optionValue = authorCreditPreview.length && {label: authorCreditPreview, value: authorCreditPreview}; const tooltip = ( - + Name(s) of the Author(s) as they appear on the book cover ); + const checkboxLabel = ( + <> + + This Edition doesn't have an Author + Select this checkbox if this Edition doesn't have an Author or + if you don't know the Author(s) + } + > + + + + + + ); + const onCheckChangeHandler = React.useCallback(() => { + toggleAuthorCreditEnable(!authorCreditEnable); + }, [authorCreditEnable]); let resCol:any = {md: {offset: 3, span: 6}}; if (isUnifiedForm || isLeftAlign) { resCol = {lg: {offset: 0, span: 6}}; @@ -155,8 +184,16 @@ function AuthorCreditSection({ /> {editButton} - + @@ -174,15 +211,22 @@ AuthorCreditSection.defaultProps = { isUnifiedForm: false }; function mapStateToProps(rootState, {type}): StateProps { - const firstRowKey = rootState.get('authorCreditEditor').keySeq().first(); - const authorCreditRow = rootState.getIn(['authorCreditEditor', firstRowKey]); - const isEditable = !(rootState.get('authorCreditEditor').size > 1) && - authorCreditRow.get('name') === authorCreditRow.getIn(['author', 'text'], ''); const entitySection = `${camelCase(type)}Section`; + const authorCreditEnable = rootState.getIn([entitySection, 'authorCreditEnable']) ?? true; + const authorCreditState = rootState.get('authorCreditEditor'); + const showEditor = rootState.getIn([entitySection, 'authorCreditEditorVisible']); + + const authorCreditRow = authorCreditState.first(); + const isEditable = Boolean(authorCreditEnable) && + authorCreditState.size <= 1 && + Boolean(authorCreditRow) && + authorCreditRow.get('name') === authorCreditRow.getIn(['author', 'text'], ''); + return { authorCreditEditor: rootState.get('authorCreditEditor'), + authorCreditEnable, isEditable, - showEditor: rootState.getIn([entitySection, 'authorCreditEditorVisible']) + showEditor }; } @@ -202,6 +246,15 @@ function mapDispatchToProps(dispatch: Dispatch): DispatchProps { onEditorClose: () => { dispatch(removeEmptyCreditRows()); dispatch(hideAuthorCreditEditor()); + }, + toggleAuthorCreditEnable: (newValue) => { + if (newValue) { + dispatch(resetAuthorCredit()); + } + else { + dispatch(clearAuthorCredit()); + } + dispatch(toggleAuthorCredit()); } }; } diff --git a/src/client/entity-editor/author-credit-editor/reducer.ts b/src/client/entity-editor/author-credit-editor/reducer.ts index 0e0b200c55..16785758c2 100644 --- a/src/client/entity-editor/author-credit-editor/reducer.ts +++ b/src/client/entity-editor/author-credit-editor/reducer.ts @@ -18,8 +18,10 @@ import { ADD_AUTHOR_CREDIT_ROW, + CLEAR_AUTHOR_CREDIT, REMOVE_AUTHOR_CREDIT_ROW, REMOVE_EMPTY_CREDIT_ROWS, + RESET_AUTHOR_CREDIT, UPDATE_CREDIT_AUTHOR_VALUE, UPDATE_CREDIT_DISPLAY_VALUE, UPDATE_CREDIT_JOIN_PHRASE_VALUE @@ -148,6 +150,10 @@ function reducer( return deleteAuthorCreditRow(state, payload); case REMOVE_EMPTY_CREDIT_ROWS: return deleteEmptyRows(state); + case CLEAR_AUTHOR_CREDIT: + return Immutable.OrderedMap({}); + case RESET_AUTHOR_CREDIT: + return Immutable.OrderedMap(initialState); // no default } return state; diff --git a/src/client/entity-editor/author-section/author-section.tsx b/src/client/entity-editor/author-section/author-section.tsx index 2b2c606dd0..957f68e3d8 100644 --- a/src/client/entity-editor/author-section/author-section.tsx +++ b/src/client/entity-editor/author-section/author-section.tsx @@ -190,6 +190,7 @@ function AuthorSection({ Type ; function reducer( state: State = Immutable.Map({ + authorCreditEnable: true, type: null }), action: Action @@ -40,7 +41,8 @@ function reducer( return state.set('authorCreditEditorVisible', true); case HIDE_AUTHOR_CREDIT_EDITOR: return state.set('authorCreditEditorVisible', false); - + case TOGGLE_AUTHOR_CREDIT: + return state.set('authorCreditEnable', !state.get('authorCreditEnable')); // no default } return state; diff --git a/src/client/entity-editor/edition-section/actions.ts b/src/client/entity-editor/edition-section/actions.ts index d330eb5373..4705a08093 100644 --- a/src/client/entity-editor/edition-section/actions.ts +++ b/src/client/entity-editor/edition-section/actions.ts @@ -54,6 +54,7 @@ export const UPDATE_DEPTH = 'UPDATE_DEPTH'; export const TOGGLE_SHOW_EDITION_GROUP = 'TOGGLE_SHOW_EDITION_GROUP'; export const UPDATE_WARN_IF_EDITION_GROUP_EXISTS = 'UPDATE_WARN_IF_EDITION_GROUP_EXISTS'; + /** * Produces an action indicating that the edition status for the edition being * edited should be updated with the provided value. diff --git a/src/client/entity-editor/edition-section/edition-section.tsx b/src/client/entity-editor/edition-section/edition-section.tsx index a19dc7bc0b..6a70bf1153 100644 --- a/src/client/entity-editor/edition-section/edition-section.tsx +++ b/src/client/entity-editor/edition-section/edition-section.tsx @@ -398,6 +398,7 @@ function EditionSection({ ; @@ -47,6 +47,7 @@ type State = Immutable.Map; function reducer( state: State = Immutable.Map({ authorCreditEditorVisible: false, + authorCreditEnable: true, format: null, languages: Immutable.List([]), matchingNameEditionGroups: [], @@ -98,6 +99,8 @@ function reducer( return state.set('matchingNameEditionGroups', []); } return state.set('matchingNameEditionGroups', payload); + case TOGGLE_AUTHOR_CREDIT: + return state.set('authorCreditEnable', !state.get('authorCreditEnable')); // no default } return state; diff --git a/src/client/entity-editor/name-section/name-section.js b/src/client/entity-editor/name-section/name-section.js index 748a4ff2ad..14506c58e7 100644 --- a/src/client/entity-editor/name-section/name-section.js +++ b/src/client/entity-editor/name-section/name-section.js @@ -84,7 +84,7 @@ class NameSection extends React.Component { super(props); this.updateNameFieldInputRef = this.updateNameFieldInputRef.bind(this); this.handleNameChange = this.handleNameChange.bind(this); - this.searchForMatchindEditionGroups = this.searchForMatchindEditionGroups.bind(this); + this.searchForMatchingEditionGroups = this.searchForMatchingEditionGroups.bind(this); } /* @@ -106,17 +106,17 @@ class NameSection extends React.Component { searchForExistingEditionGroup === false) { return; } - this.searchForMatchindEditionGroups(nameValue); + this.searchForMatchingEditionGroups(nameValue); } handleNameChange(event) { this.props.onNameChange(event.target.value); this.props.onNameChangeCheckIfExists(event.target.value); this.props.onNameChangeSearchName(event.target.value); - this.searchForMatchindEditionGroups(event.target.value); + this.searchForMatchingEditionGroups(event.target.value); } - searchForMatchindEditionGroups(nameValue) { + searchForMatchingEditionGroups(nameValue) { const { entityType, onNameChangeCheckIfEditionGroupExists, diff --git a/src/client/entity-editor/publisher-section/publisher-section.tsx b/src/client/entity-editor/publisher-section/publisher-section.tsx index 8338b4aef9..75ad66432f 100644 --- a/src/client/entity-editor/publisher-section/publisher-section.tsx +++ b/src/client/entity-editor/publisher-section/publisher-section.tsx @@ -146,6 +146,7 @@ function PublisherSection({ Type type.id.toString()} instanceId="workType" options={workTypesForDisplay} - value={typeOption} + value={selectedTypeOption} onChange={onTypeChange} /> + {selectedTypeOption && + + + {selectedTypeOption.description} + + } @@ -178,8 +238,8 @@ function mapDispatchToProps(dispatch: Dispatch): DispatchProps { return { onLanguagesChange: (values: Array) => dispatch(updateLanguages(values)), - onTypeChange: (value: {value: number} | null) => - dispatch(updateType(value && value.value)) + onTypeChange: (value: WorkType | null) => + dispatch(updateType(value && value.id)) }; } diff --git a/src/client/helpers/entity.tsx b/src/client/helpers/entity.tsx index 62de5deb6d..f855b626fd 100644 --- a/src/client/helpers/entity.tsx +++ b/src/client/helpers/entity.tsx @@ -197,6 +197,13 @@ export function getEditionReleaseDate(edition) { return '?'; } +export function getAuthorCreditNames(edition) { + if (edition.authorCreditId === null) { + return []; + } + return edition.authorCredit.names; +} + export function getEditionPublishers(edition) { const hasPublishers = edition.publisherSet && edition.publisherSet.publishers.length > 0; @@ -227,10 +234,12 @@ export function authorCreditToString(authorCredit) { } export function getEntityDisambiguation(entity) { - if (entity.disambiguation) { + if (entity.disambiguation?.comment) { return {` (${entity.disambiguation.comment})`}; } - + else if (entity.disambiguation) { + return {` (${entity.disambiguation})`} ; + } return null; } @@ -238,9 +247,8 @@ export function getEntitySecondaryAliases(entity) { if (entity.aliasSet && Array.isArray(entity.aliasSet.aliases) && entity.aliasSet.aliases.length > 1) { const aliases = entity.aliasSet.aliases .filter(item => item.id !== entity.defaultAlias.id) - .map(item => item.name) - .join(', '); - return

{aliases}

; + .map((item) =>
  • {item.name}
  • ); + return
      {aliases}
    ; } return null; diff --git a/src/client/helpers/props.js b/src/client/helpers/props.js index 55ffec4f9b..5e2cfe55dd 100644 --- a/src/client/helpers/props.js +++ b/src/client/helpers/props.js @@ -53,8 +53,10 @@ export function extractEntityProps(props) { return { alert: props.alert, entity: props.entity, + genderOptions: props.genderOptions, identifierTypes: props.identifierTypes, - user: props.user + user: props.user, + wikipediaExtract: props.wikipediaExtract }; } diff --git a/src/client/helpers/utils.tsx b/src/client/helpers/utils.tsx index 28f3f2ef08..3fdde34028 100644 --- a/src/client/helpers/utils.tsx +++ b/src/client/helpers/utils.tsx @@ -173,19 +173,17 @@ export function dateObjectToISOString(value: DateObject) { * Convert any string url that has a prefix http|https|ftp|ftps to a clickable link * and then rendered the HTML string as real HTML. * @function stringToHTMLWithLinks - * @param {string} string - Can be either revision notes or annotation content etc... + * @param {string} content - Can be either revision notes or annotation content etc... * @returns {JSX} returns a JSX Element */ -export function stringToHTMLWithLinks(string: string) { - const addHttpRegex = /(^|\b)www\./ig; +export function stringToHTMLWithLinks(content: string) { // eslint-disable-next-line max-len, no-useless-escape const urlRegex = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[\-;:&=\+\$,\w]+@)?[A-Za-z0-9\.\-]+|(?:www\.|[\-;:&=\+\$,\w]+@)[A-Za-z0-9\.\-]+)((?:\/[\+~%\/\.\w\-_]*)?\??(?:[\-\+=&;%~*@\.\w_]*)#?(?:[\.\!\/\\\w]*))?)/g; - let content = string.replace(addHttpRegex, '$1https://www.'); content = content.replace( urlRegex, - '
    $1' + (url) => `${url}` ); - const sanitizedHtml = DOMPurify.sanitize(content); + const sanitizedHtml = DOMPurify.sanitize(content, {ADD_ATTR: ['target']}); // eslint-disable-next-line react/no-danger return ; } diff --git a/src/client/stylesheets/style.scss b/src/client/stylesheets/style.scss index 20313bfc91..3fc0198f83 100644 --- a/src/client/stylesheets/style.scss +++ b/src/client/stylesheets/style.scss @@ -383,6 +383,18 @@ a.contact-text:visited { height: 10px; } +/* Style inline alias lists the same way as the previously used h4 elements */ +ul.inline-aliases { + @extend h4; + padding: 0; + li { + display: inline; + } + li:not(:last-child)::after { + content: " · "; + font-weight: bolder; + } +} /* Text wrapping in list-group-items (for long revision notes, for example) */ /* ============= */ @@ -453,6 +465,7 @@ hr.wide { .annotation-content { white-space: pre-wrap; + word-break: break-word; position: relative; font-family: inherit; font-size: inherit; @@ -851,4 +864,16 @@ div[class~=collapsing]+div[class=card-header] .accordion-arrow { .review-card{ margin: 10px; max-width: 200px; +} + +.hierarchy-arrow { + border-left: 1px solid $gray-400; + width: 1em; + height: 1em; + content: ""; + display: inline-block; + border-bottom: 1px solid $gray-400; + position: relative; + bottom: 0.3em; + left: -0.5em; } \ No newline at end of file diff --git a/src/client/unified-form/helpers.ts b/src/client/unified-form/helpers.ts index fc38fee763..053564a0e3 100644 --- a/src/client/unified-form/helpers.ts +++ b/src/client/unified-form/helpers.ts @@ -75,6 +75,7 @@ const initialState = Immutable.Map({ }), editionSection: Immutable.Map({ authorCreditEditorVisible: false, + authorCreditEnable: true, editionGroupVisible: true, format: null, languages: Immutable.List([]), diff --git a/src/common/helpers/cache.ts b/src/common/helpers/cache.ts new file mode 100644 index 0000000000..ce2f3f5ee4 --- /dev/null +++ b/src/common/helpers/cache.ts @@ -0,0 +1,44 @@ +import {get as _get} from 'lodash'; +import config from './config'; +import {createClient} from 'redis'; +import log from 'log'; + + +// Set up Redis, which is used for sessions and to cache requests to external APIs +const redisHost = _get(config, 'session.redis.host', 'localhost'); +const redisPort = _get(config, 'session.redis.port', 6379); +const redisClient = createClient({ + url: `redis://${redisHost}:${redisPort}` +}); + +export async function getCachedJSON(cacheKey: string) { + if (redisClient.isReady) { + const cachedValue = await redisClient.get(cacheKey); + if (cachedValue) { + try { + return JSON.parse(cachedValue) as T; + } + catch (error) { + // Should not happen, but in this case we deliberately fail to return a cached value. + // This way we give the caller a chance to overwrite the broken entry with a recomputed value. + log.error(`Cache contains invalid JSON for the key "${cacheKey}": ${error.message}`); + } + } + } + return null; +} + +export function cacheJSON(cacheKey: string, value: any, options: {expireTime: number}) { + if (redisClient.isReady) { + try { + return redisClient.set(cacheKey, JSON.stringify(value), {EX: options.expireTime}); + } + catch (error) { + // Should not happen, but in this case we deliberately fail to cache the value. + log.error(`Failed to cache invalid JSON for the key "${cacheKey}": ${error.message}`); + } + } + return null; +} + +export default redisClient; diff --git a/src/common/helpers/search.js b/src/common/helpers/search.js index 58fc0847a8..785ac8700f 100644 --- a/src/common/helpers/search.js +++ b/src/common/helpers/search.js @@ -486,11 +486,13 @@ export async function checkIfExists(orm, name, type) { 'relationshipSet.relationships.type', 'revision.revision' ]; - return Promise.all( + const processedResults = await Promise.all( bbids.map( bbid => orm.func.entity.getEntity(orm, upperFirst(camelCase(type)), bbid, baseRelations) ) ); + + return processedResults; } export function searchByName(orm, name, type, size, from) { diff --git a/src/common/helpers/session.js b/src/common/helpers/session.js new file mode 100644 index 0000000000..96353c3173 --- /dev/null +++ b/src/common/helpers/session.js @@ -0,0 +1,41 @@ +import Debug from 'debug'; +import RedisStore from 'connect-redis'; +import {get as _get} from 'lodash'; +import config from './config'; +import redisClient from './cache'; +import session from 'express-session'; + + +const debug = Debug('bbsite'); + +/** + * Set up sessions, using Redis in production and default to in-memory for testing environment. + * @param {string} [environment] - Node.js environment. + * @returns {function} Express session request handler. + */ +function setupSessions(environment) { + const sessionOptions = { + cookie: { + maxAge: _get(config, 'session.maxAge', 2592000000), + secure: _get(config, 'session.secure', false) + }, + resave: false, + saveUninitialized: false, + secret: config.session.secret + }; + + if (environment !== 'test') { + redisClient.connect().catch((redisError) => debug('Redis error:', redisError)); + + redisClient.on('error', (redisError) => debug('Redis error:', redisError)); + + const redisStore = new RedisStore({ + client: redisClient + }); + sessionOptions.store = redisStore; + } + + return session(sessionOptions); +} + +export default setupSessions; diff --git a/src/common/helpers/utils.ts b/src/common/helpers/utils.ts index c5299d8fda..dcfaa51e5b 100644 --- a/src/common/helpers/utils.ts +++ b/src/common/helpers/utils.ts @@ -1,6 +1,7 @@ import {EntityType, Relationship, RelationshipForDisplay} from '../../client/entity-editor/relationship-editor/types'; import {isString, kebabCase, toString, upperFirst} from 'lodash'; +import type {EntityT} from 'bookbrainz-data/lib/types/entity'; import {IdentifierType} from '../../client/unified-form/interface/type'; /** @@ -318,6 +319,15 @@ export async function getEntityAlias(orm, bbid:string, type:EntityType):Promise< return entityData; } +export function getAliasLanguageCodes(entity: EntityT) { + return entity.aliasSet?.aliases + .map((alias) => alias.language?.isoCode1) + // less common languages (and [Multiple languages]) do not have a two-letter ISO code, ignore them for now + .filter((language) => language !== null) + // eslint-disable-next-line operator-linebreak -- fallback refers to the whole optional chain + ?? []; +} + export function filterObject(obj, filter) { return Object.keys(obj) .filter((key) => filter(obj[key])) diff --git a/src/common/helpers/wikimedia.ts b/src/common/helpers/wikimedia.ts new file mode 100644 index 0000000000..fef10fe264 --- /dev/null +++ b/src/common/helpers/wikimedia.ts @@ -0,0 +1,67 @@ +/* + * Copyright (C) 2023 David Kellner + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import type {EntityT, EntityTypeString} from 'bookbrainz-data/lib/types/entity'; + + +export type WikipediaArticle = { + + /** Language code of the Wikipedia project. */ + language: string, + + /** Title of the Wikipedia article. */ + title: string, +}; + +/** Page object with the extract property from the Wikipedia API. */ +export type WikipediaPageExtract = { + + /** Title of the Wikipedia article. */ + title: string, + + /** First paragraph of the page as HTML (without hyperlinks). */ + extract: string, + + pageid: number, + ns: number, +}; + +/** Wikipedia extract which includes information about the Wikipedia project where it comes from. */ +export type WikipediaArticleExtract = WikipediaPageExtract & { + article: WikipediaArticle, +}; + + +const wikidataIdentifierTypeIds: Record = { + Author: 18, + Edition: 4, + EditionGroup: 19, + Publisher: 20, + Series: 30, + Work: 21 +}; + +export function getWikidataId(entity: EntityT) { + const identifiers = entity.identifierSet?.identifiers; + const wikidataTypeId = wikidataIdentifierTypeIds[entity.type]; + return identifiers?.find((identifier) => identifier.typeId === wikidataTypeId)?.value; +} + +export function buildWikipediaUrl(article: WikipediaArticle) { + return new URL(article.title.replaceAll(' ', '_'), `https://${article.language}.wikipedia.org/wiki/`); +} diff --git a/src/server/app.js b/src/server/app.js index 789a6bcdc1..52a957f6a8 100644 --- a/src/server/app.js +++ b/src/server/app.js @@ -23,24 +23,23 @@ import * as auth from './helpers/auth'; import * as error from '../common/helpers/error'; import * as search from '../common/helpers/search'; import * as serverErrorHelper from './helpers/error'; -import {existsSync, readFileSync} from 'fs'; + +import {repositoryUrl, siteRevision, userAgent} from './info'; + import BookBrainzData from 'bookbrainz-data'; import Debug from 'debug'; -import {get as _get} from 'lodash'; import appCleanup from '../common/helpers/appCleanup'; import compression from 'compression'; import config from '../common/helpers/config'; -import {createClient} from 'redis'; import express from 'express'; import favicon from 'serve-favicon'; import initInflux from './influx'; import logNode from 'log-node'; import logger from 'morgan'; import path from 'path'; -import redis from 'connect-redis'; import routes from './routes'; import serveStatic from 'serve-static'; -import session from 'express-session'; +import session from '../common/helpers/session'; // Initialize log-to-stdout writer @@ -87,28 +86,7 @@ else { } app.use(express.static(path.join(rootDir, 'static'))); -/* Set up sessions, using Redis in production and default in-memory for testing environment*/ -const sessionOptions = { - cookie: { - maxAge: _get(config, 'session.maxAge', 2592000000), - secure: _get(config, 'session.secure', false) - }, - resave: false, - saveUninitialized: false, - secret: config.session.secret -}; -if (process.env.NODE_ENV !== 'test') { - const redisClient = createClient({ - host: _get(config, 'session.redis.host', 'localhost'), - port: _get(config, 'session.redis.port', 6379) - }); - - const RedisStore = redis(session); - sessionOptions.store = new RedisStore({ - client: redisClient - }); -} -app.use(session(sessionOptions)); +app.use(session(process.env.NODE_ENV)); if (config.influx) { @@ -123,19 +101,8 @@ const authInitiated = auth.init(app); search.init(app.locals.orm, Object.assign({}, config.search)); // Set up constants that will remain valid for the life of the app -let siteRevision = 'unknown'; -const gitRevisionFilePath = '.git-version'; -if (existsSync(gitRevisionFilePath)) { - try { - siteRevision = readFileSync(gitRevisionFilePath).toString(); - } - catch (err) { - debug(err); - } -} debug(`Git revision: ${siteRevision}`); - -const repositoryUrl = 'https://github.com/metabrainz/bookbrainz-site/'; +debug('User-Agent:', userAgent); app.use((req, res, next) => { // Set up globally-used properties @@ -143,6 +110,19 @@ app.use((req, res, next) => { res.locals.repositoryUrl = repositoryUrl; res.locals.alerts = []; req.signUpDisabled = false; + if (process.env.DEPLOY_ENV === 'test' || process.env.DEPLOY_ENV === 'beta') { + let msg; + if (process.env.DEPLOY_ENV === 'beta') { + msg = 'You are on the beta website, which uses the main database but with a newer version of the code to test new features.'; + } + else { + msg = 'You are on the test website; all changes made here are not synced with the main database and will be overwritten periodically.'; + } + res.locals.alerts.push({ + level: 'info', + message: `${msg}` + }); + } if (!req.session || !authInitiated) { res.locals.alerts.push({ diff --git a/src/server/helpers/i18n.ts b/src/server/helpers/i18n.ts new file mode 100644 index 0000000000..526915ca39 --- /dev/null +++ b/src/server/helpers/i18n.ts @@ -0,0 +1,56 @@ +/* + * Copyright (C) 2023 David Kellner + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import type {Request} from 'express'; + + +type AcceptedLanguage = { + code: string, + subtags: string[], + weight: number, +}; + +/** + * Parses an Accept-Language header to obtain the language codes, optional subtags and weights. + * @param {string} acceptLanguage - Accept-Language header value. + * @returns {Array} Parsed languages, sorted by weight in descending order. + */ +export function parseAcceptLanguage(acceptLanguage: string): AcceptedLanguage[] { + return acceptLanguage + .split(',') + .map((value) => { + const match = value.match(/(?[a-zA-Z]{2,3})(?:-(?[\w-]+))?(?:;q=(?[01](?:\.[0-9]+)?))?/); + return match ? { + code: match.groups.tag, + subtags: match.groups.subtag?.split('-') ?? [], + weight: parseFloat(match.groups.weight ?? '1') + } : null; + }) + .filter((value) => value !== null) + .sort((a, b) => b.weight - a.weight); +} + +/** + * Extracts language codes from the Accept-Language header, ordered by weight/preference. + * @param {Request} request - Request object which includes HTTP headers. + * @returns {string[]} Parsed language codes, sorted by weight in descending order. + */ +export function getAcceptedLanguageCodes(request: Request): string[] { + return parseAcceptLanguage(request.headers['accept-language'] ?? '') + .map((language) => language.code); +} diff --git a/src/server/helpers/middleware.ts b/src/server/helpers/middleware.ts index 688439caf3..0349ec2bfe 100644 --- a/src/server/helpers/middleware.ts +++ b/src/server/helpers/middleware.ts @@ -1,8 +1,10 @@ /* * Copyright (C) 2015 Ben Ockmore * 2015-2016 Sean Burke - * 2021 Akash Gupta - * 2022 Ansh Goyal + * 2021 Akash Gupta + * 2022 Ansh Goyal + * 2023 David Kellner + * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or @@ -22,10 +24,14 @@ import * as commonUtils from '../../common/helpers/utils'; import * as error from '../../common/helpers/error'; import * as utils from '../helpers/utils'; import type {Response as $Response, NextFunction, Request} from 'express'; +import {getWikipediaExtract, selectWikipediaPage} from './wikimedia'; import _ from 'lodash'; +import {getAcceptedLanguageCodes} from './i18n'; import {getRelationshipTargetBBIDByTypeId} from '../../client/helpers/entity'; import {getReviewsFromCB} from './critiquebrainz'; +import {getWikidataId} from '../../common/helpers/wikimedia'; +import log from 'log'; interface $Request extends Request { @@ -33,24 +39,24 @@ interface $Request extends Request { } function makeLoader(modelName, propName, sortFunc?, relations = []) { - return function loaderFunc(req: $Request, res: $Response, next: NextFunction) { - const {orm}: any = req.app.locals; - const model = orm[modelName]; - return model.fetchAll({withRelated: [...relations]}) - .then((results) => { - const resultsSerial = results.toJSON(); - - res.locals[propName] = - sortFunc ? resultsSerial.sort(sortFunc) : resultsSerial; - - next(); - - return null; - }) - .catch(next); + return async function loaderFunc(req: $Request, res: $Response, next: NextFunction) { + try { + const {orm}: any = req.app.locals; + const model = orm[modelName]; + const results = await model.fetchAll({withRelated: [...relations]}); + const resultsSerial = results.toJSON(); + res.locals[propName] = + sortFunc ? resultsSerial.sort(sortFunc) : resultsSerial; + } + catch (err) { + return next(err); + } + next(); + return null; }; } + export const loadAuthorTypes = makeLoader('AuthorType', 'authorTypes'); export const loadEditionFormats = makeLoader('EditionFormat', 'editionFormats'); export const loadEditionStatuses = @@ -131,7 +137,7 @@ export async function loadWorkTableAuthors(req: $Request, res: $Response, next: * @returns */ -export function addRelationships(entity, relationshipSet, orm) { +export async function addRelationships(entity, relationshipSet, orm) { async function getEntityWithAlias(relEntity) { const redirectBbid = await orm.func.entity.recursivelyGetRedirectBBID(orm, relEntity.bbid, null); const model = commonUtils.getEntityModelByType(orm, relEntity.type); @@ -139,59 +145,101 @@ export function addRelationships(entity, relationshipSet, orm) { return model.forge({bbid: redirectBbid}) .fetch({require: false, withRelated: ['defaultAlias'].concat(utils.getAdditionalRelations(relEntity.type))}); } + entity.relationships = relationshipSet ? relationshipSet.related('relationships').toJSON() : []; utils.attachAttributes(entity.relationships); - /** * Source and target are generic Entity objects, so until we have * a good way of polymorphically fetching the right specific entity, * we need to fetch default alias in a somewhat sketchier way. */ - return Promise.all(entity.relationships.map((relationship) => - Promise.all([getEntityWithAlias(relationship.source), getEntityWithAlias(relationship.target)]) - .then(([source, target]) => { - relationship.source = source.toJSON(); - relationship.target = target.toJSON(); - - return relationship; - }))); + const relationshipPromises = entity.relationships.map(async (relationship) => { + const [source, target] = await Promise.all([getEntityWithAlias(relationship.source), getEntityWithAlias(relationship.target)]); + relationship.source = source.toJSON(); + relationship.target = target.toJSON(); + + return relationship; + }); + + const relationships = await Promise.all(relationshipPromises); + return relationships; } -export function loadEntityRelationships(req: $Request, res: $Response, next: NextFunction) { + +export async function loadEntityRelationships(req: $Request, res: $Response, next: NextFunction) { const {orm}: any = req.app.locals; const {RelationshipSet} = orm; const {entity} = res.locals; - new Promise((resolve) => { + try { if (!entity) { throw new error.SiteError('Failed to load entity'); } - resolve(); - }) - .then( - () => RelationshipSet.forge({id: entity.relationshipSetId}) - .fetch({ - require: false, - withRelated: [ - 'relationships.source', - 'relationships.target', - 'relationships.type.attributeTypes', - 'relationships.attributeSet.relationshipAttributes.value', - 'relationships.attributeSet.relationshipAttributes.type' - ] - }) - ) - .then((relationshipSet) => addRelationships(entity, relationshipSet, orm)) - .then(() => { - next(); - return null; - }) - .catch(next); + const relationshipSet = await RelationshipSet.forge({id: entity.relationshipSetId}) + .fetch({ + require: false, + withRelated: [ + 'relationships.source', + 'relationships.target', + 'relationships.type.attributeTypes', + 'relationships.attributeSet.relationshipAttributes.value', + 'relationships.attributeSet.relationshipAttributes.type' + ] + }); + + await addRelationships(entity, relationshipSet, orm); + } + catch (err) { + return next(err); + } + return next(); +} + +export async function loadWikipediaExtract(req: $Request, res: $Response, next: NextFunction) { + const {entity} = res.locals; + if (!entity) { + return next(new error.SiteError('Failed to load entity')); + } + + const wikidataId = getWikidataId(entity); + if (!wikidataId) { + return next(); + } + + // try to use the user's browser languages, fallback to English and alias languages + const browserLanguages = getAcceptedLanguageCodes(req); + const aliasLanguages = commonUtils.getAliasLanguageCodes(entity); + const preferredLanguages = browserLanguages.concat('en', aliasLanguages); + + try { + // only pre-load Wikipedia extracts which are already cached + const article = await selectWikipediaPage(wikidataId, {forceCache: true, preferredLanguages}); + if (article) { + const extract = await getWikipediaExtract(article, {forceCache: true}); + if (extract) { + res.locals.wikipediaExtract = {article, ...extract}; + } + } + } + catch (err) { + log.warning(`Failed to pre-load Wikipedia extract for ${wikidataId}: ${err.message}`); + } + + return next(); } + +export function checkValidRevisionId(req: $Request, res: $Response, next: NextFunction, id: string) { + const idToNumber = _.toNumber(id); + if (!_.isInteger(idToNumber) || (_.isInteger(idToNumber) && idToNumber <= 0)) { + return next(new error.BadRequestError(`Invalid revision id: ${req.params.id}`, req)); + } + return next(); +} + export async function redirectedBbid(req: $Request, res: $Response, next: NextFunction, bbid: string) { if (!commonUtils.isValidBBID(bbid)) { return next(new error.BadRequestError(`Invalid bbid: ${req.params.bbid}`, req)); @@ -382,8 +430,3 @@ export function validateCollaboratorIdsForCollectionRemove(req, res, next) { return next(); } - -export function decodeUrlQueryParams(req:$Request, res:$Response, next:NextFunction) { - req.query = _.mapValues(req.query, decodeURIComponent); - return next(); -} diff --git a/src/server/helpers/wikimedia.ts b/src/server/helpers/wikimedia.ts new file mode 100644 index 0000000000..63b759a710 --- /dev/null +++ b/src/server/helpers/wikimedia.ts @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2023 David Kellner + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import type {WikipediaArticle, WikipediaPageExtract} from '../../common/helpers/wikimedia'; +import {cacheJSON, getCachedJSON} from '../../common/helpers/cache'; +import {toLower, uniq} from 'lodash'; +import {hoursToSeconds} from 'date-fns'; +import request from 'superagent'; +import {userAgent} from '../info'; + + +type WikidataSiteLink = { + + /** + * Abbreviation for the Wikimedia project/site/domain. + * Format: language code + project suffix (e.g. `enwiki` for the English Wikipedia) + */ + site: string, + + /** Title of the specific page. */ + title: string, + + /** Wikidata IDs of badges which the page has (e.g. `Q17437798` for good articles). */ + badges: string[], +}; + +type WikidataSiteLinksResult = { + entities: Record, + type: 'item', + }>, + success: boolean, +}; + +// incomplete, only the parts we need +type WikipediaExtractResult = { + query: { + pages: WikipediaPageExtract[], + }, +}; + + +/** Maximum age of cached results in seconds. */ +const cacheMaxAge = { + articles: hoursToSeconds(24 * 7), + extract: hoursToSeconds(24 * 3) +}; + +/** + * Fetches a list of Wikipedia articles in all available languages for the given Wikidata item. + * @param {string} wikidataId - Wikidata item ID. + */ +export async function getAvailableWikipediaArticles(wikidataId: string, { + forceCache = false +} = {}): Promise { + const cacheKey = `wiki:articles:${wikidataId}`; + const cachedArticles = await getCachedJSON(cacheKey); + + if (cachedArticles || forceCache) { + return cachedArticles || []; + } + + const apiUrl = new URL('https://www.wikidata.org/w/api.php'); + apiUrl.search = new URLSearchParams({ + action: 'wbgetentities', + format: 'json', + ids: wikidataId, + props: 'sitelinks' + }).toString(); + + const response = await request.get(apiUrl.href) + .set('User-Agent', userAgent); + const result = response.body as WikidataSiteLinksResult; + const item = result.entities?.[wikidataId]; + + if (!item) { + throw new Error(`Failed to fetch Wikidata item ${wikidataId}`); + } + + const articles = Object.values(item.sitelinks) + // only keep Wikipedia pages + .filter((link) => link.site.endsWith('wiki')) + .map((page) => ({ + // drop project suffix + language: page.site.replace(/wiki$/, ''), + title: page.title + })); + + cacheJSON(cacheKey, articles, {expireTime: cacheMaxAge.articles}); + + return articles; +} + +/** + * Tries to find a Wikipedia article for the given Wikidata item in the first preferred language which is available. + * @param {string} wikidataId - Wikidata item ID. + * @param {string[]} preferredLanguages - List of language codes, preference in descending order. + */ +export async function selectWikipediaPage(wikidataId: string, { + forceCache = false, + preferredLanguages = ['en'] +} = {}) { + const articles = await getAvailableWikipediaArticles(wikidataId, {forceCache}); + + let result: WikipediaArticle; + for (const language of uniq(preferredLanguages)) { + result = articles.find((page) => page.language === toLower(language)); + if (result) { + break; + } + } + + return result; +} + +/** + * Fetches the page extract of the given Wikipedia article. + * @param {object} article - Title and language of the article. + */ +export async function getWikipediaExtract(article: WikipediaArticle, { + forceCache = false +} = {}): Promise { + const cacheKey = `wiki:extract:${article.language}:${article.title}`; + const cachedExtract = await getCachedJSON(cacheKey); + + if (cachedExtract || forceCache) { + return cachedExtract; + } + + const apiUrl = new URL(`https://${article.language}.wikipedia.org/w/api.php`); + apiUrl.search = new URLSearchParams({ + action: 'query', + format: 'json', + formatversion: '2', + prop: 'extracts', + // eslint-disable-next-line sort-keys -- `exintro` only allowed with `prop: 'extracts'` + exintro: '1', + redirects: '1', + titles: article.title + }).toString(); + + const response = await request.get(apiUrl.href) + .set('User-Agent', userAgent); + const result = response.body as WikipediaExtractResult; + const pageExtract = result.query?.pages?.[0]; + + cacheJSON(cacheKey, pageExtract, {expireTime: cacheMaxAge.extract}); + + return pageExtract; +} diff --git a/src/server/info.ts b/src/server/info.ts new file mode 100644 index 0000000000..ccfdeef61a --- /dev/null +++ b/src/server/info.ts @@ -0,0 +1,16 @@ + +export const repositoryName = 'bookbrainz-site'; + +export const repositoryUrl = 'https://github.com/metabrainz/bookbrainz-site/'; + +// eslint-disable-next-line node/no-process-env +export const siteRevision = process.env.GIT_COMMIT_SHA; + +// In production, a git tag (e.g. `v0.15.2` or `v-2023-02-20.0`) might be passed instead of a commit SHA. +// Try to extract the plain version number (e.g. `0.15.2` or `2023-02-20.0`) from the git specifier. +// Otherwise we assume that a development server is running and use `dev` as the version. +export const version = siteRevision?.match(/^v-?([\d.-]+)$/)?.[1] ?? 'dev'; + +export const domain = 'bookbrainz.org'; + +export const userAgent = `${repositoryName}/${version} (${domain})`; diff --git a/src/server/routes.js b/src/server/routes.js index 2a9a015808..1ad8e00bac 100644 --- a/src/server/routes.js +++ b/src/server/routes.js @@ -36,6 +36,7 @@ import searchRouter from './routes/search'; import seriesRouter from './routes/entity/series'; import statisticsRouter from './routes/statistics'; import unifiedFormRouter from './routes/unifiedform'; +import wikimediaRouter from './routes/wikimedia'; import workRouter from './routes/entity/work'; @@ -44,6 +45,7 @@ function initRootRoutes(app) { app.use('/', authRouter); app.use('/', unifiedFormRouter); app.use('/', reviewsRouter); + app.use('/', wikimediaRouter); app.use('/search', searchRouter); app.use('/register', registerRouter); app.use('/revisions', revisionsRouter); diff --git a/src/server/routes/auth.js b/src/server/routes/auth.js index d70203825d..32ce4d598b 100644 --- a/src/server/routes/auth.js +++ b/src/server/routes/auth.js @@ -44,6 +44,10 @@ router.get('/cb', (req, res, next) => { return res.redirect('/register/details'); } + const redirectTo = + req.session.redirectTo ? req.session.redirectTo : '/'; + req.session.redirectTo = null; + return req.logIn(user, async (loginErr) => { if (loginErr) { return next(loginErr); @@ -60,17 +64,15 @@ router.get('/cb', (req, res, next) => { return next(error); } - const redirectTo = - req.session.redirectTo ? req.session.redirectTo : '/'; - req.session.redirectTo = null; return res.redirect(redirectTo); }); })(req, res, next); }); router.get('/logout', (req, res) => { - req.logOut(); - res.redirect(status.SEE_OTHER, '/'); + req.logOut(() => { + res.redirect(status.SEE_OTHER, '/'); + }); }); export default router; diff --git a/src/server/routes/entity/author.js b/src/server/routes/entity/author.js index 6cd1bd9258..6644728c43 100644 --- a/src/server/routes/entity/author.js +++ b/src/server/routes/entity/author.js @@ -97,7 +97,6 @@ router.get( '/create', auth.isAuthenticated, middleware.loadIdentifierTypes, middleware.loadGenders, middleware.loadLanguages, middleware.loadAuthorTypes, middleware.loadRelationshipTypes, - middleware.decodeUrlQueryParams, async (req, res) => { const markupProps = generateEntityProps( 'author', req, res, { @@ -186,7 +185,12 @@ router.param( 'bbid', middleware.makeEntityLoader( 'Author', - ['authorType', 'gender', 'beginArea', 'endArea'], + ['authorType', 'gender', 'beginArea', 'endArea', + 'authorCredits.editions.defaultAlias', + 'authorCredits.editions.disambiguation', + 'authorCredits.editions.releaseEventSet.releaseEvents', + 'authorCredits.editions.identifierSet.identifiers.type', + 'authorCredits.editions.editionFormat'], 'Author not found' ) ); @@ -199,7 +203,7 @@ function _setAuthorTitle(res) { ); } -router.get('/:bbid', middleware.loadEntityRelationships, (req, res) => { +router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadWikipediaExtract, (req, res) => { _setAuthorTitle(res); entityRoutes.displayEntity(req, res); }); diff --git a/src/server/routes/entity/edition-group.js b/src/server/routes/entity/edition-group.js index 6d6d2aa183..4cfe0459b8 100644 --- a/src/server/routes/entity/edition-group.js +++ b/src/server/routes/entity/edition-group.js @@ -54,7 +54,10 @@ export function transformNewForm(data) { ); let authorCredit = {}; - if (!_.isNil(data.authorCredit)) { + if (!_.get(data, ['editionGroupSection', 'authorCreditEnable'], true)) { + authorCredit = null; + } + else if (!_.isNil(data.authorCredit)) { // When merging entities, we use a separate reducer "authorCredit" authorCredit = data.authorCredit.names; } @@ -93,7 +96,7 @@ const router = express.Router(); router.get( '/create', auth.isAuthenticated, middleware.loadIdentifierTypes, middleware.loadLanguages, middleware.loadEditionGroupTypes, - middleware.loadRelationshipTypes, middleware.decodeUrlQueryParams, + middleware.loadRelationshipTypes, async (req, res) => { const markupProps = generateEntityProps( 'editionGroup', req, res, {} @@ -188,7 +191,7 @@ function _setEditionGroupTitle(res) { ); } -router.get('/:bbid', middleware.loadEntityRelationships, (req, res) => { +router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadWikipediaExtract, (req, res) => { _setEditionGroupTitle(res); res.locals.entity.editions.sort(entityRoutes.compareEntitiesByDate); entityRoutes.displayEntity(req, res); diff --git a/src/server/routes/entity/edition.ts b/src/server/routes/entity/edition.ts index abcbd28d32..59f185ebe6 100644 --- a/src/server/routes/entity/edition.ts +++ b/src/server/routes/entity/edition.ts @@ -74,7 +74,10 @@ export function transformNewForm(data) { data.editionSection.languages, (language) => language.value ); let authorCredit = {}; - if (!_.isNil(data.authorCredit)) { + if (!_.get(data, ['editionSection', 'authorCreditEnable'], true)) { + authorCredit = null; + } + else if (!_.isNil(data.authorCredit)) { // When merging entities, we use a separate reducer "authorCredit" authorCredit = data.authorCredit.names; } @@ -143,12 +146,16 @@ router.get( '/create', auth.isAuthenticated, middleware.loadIdentifierTypes, middleware.loadEditionStatuses, middleware.loadEditionFormats, middleware.loadLanguages, middleware.loadRelationshipTypes, - middleware.decodeUrlQueryParams, (req:PassportRequest, res, next) => { - const {EditionGroup, Publisher, Work} = req.app.locals.orm; + const {EditionGroup, Publisher, Work, Author} = req.app.locals.orm; const propsPromise = generateEntityProps( 'edition', req, res, {} ); + if (req.query.author) { + propsPromise.author = Author.forge({bbid: req.query.author}) + .fetch({require: false, withRelated: 'defaultAlias'}) + .then((data) => data && utils.entityToOption(data.toJSON())); + } // Access edition-group property: can't write req.query.edition-group as the dash makes it invalid Javascript if (req.query['edition-group']) { @@ -186,6 +193,21 @@ router.get( let initialRelationshipIndex = 0; initialState.editionSection = initialState.editionSection ?? {}; + if (props.author) { + initialState.authorCreditEditor = { + a0: { + author: { + id: props.author.id, + rowId: 'a0', + text: props.author.text, + type: 'Author' + }, + automaticJoinPhrase: true, + joinPhrase: '', + name: props.author.text + } + }; + } if (props.publisher) { initialState.editionSection.publisher = props.publisher; @@ -330,10 +352,11 @@ function _setEditionTitle(res) { ); } -router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadWorkTableAuthors, (req:PassportRequest, res) => { - _setEditionTitle(res); - entityRoutes.displayEntity(req, res); -}); +router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadWorkTableAuthors, + middleware.loadWikipediaExtract, (req:PassportRequest, res) => { + _setEditionTitle(res); + entityRoutes.displayEntity(req, res); + }); router.get('/:bbid/revisions', (req:PassportRequest, res, next) => { const {EditionRevision} = req.app.locals.orm; @@ -441,6 +464,7 @@ export function editionToFormState(edition) { const editionGroup = utils.entityToOption(edition.editionGroup); const editionSection = { + authorCreditEnable: true, depth: edition.depth, editionGroup, // Determines whether the EG can be left blank (an EG will be auto-created) for existing Editions diff --git a/src/server/routes/entity/entity.tsx b/src/server/routes/entity/entity.tsx index 31ee3d31c3..db6865bc85 100644 --- a/src/server/routes/entity/entity.tsx +++ b/src/server/routes/entity/entity.tsx @@ -28,7 +28,6 @@ import * as utils from '../../helpers/utils'; import type {Request as $Request, Response as $Response, NextFunction} from 'express'; import type { - EntityTypeString, FormLanguageT as Language, FormPublisherT as Publisher, FormReleaseEventT as ReleaseEvent, @@ -42,6 +41,7 @@ import DeletionForm from '../../../client/components/forms/deletion'; import EditionGroupPage from '../../../client/components/pages/entities/edition-group'; import EditionPage from '../../../client/components/pages/entities/edition'; import EntityRevisions from '../../../client/components/pages/entity-revisions'; +import type {EntityTypeString} from 'bookbrainz-data/lib/types/entity'; import Layout from '../../../client/containers/layout'; import PreviewPage from '../../../client/components/forms/preview'; import PublisherPage from '../../../client/components/pages/entities/publisher'; @@ -150,9 +150,9 @@ export function displayEntity(req: PassportRequest, res: $Response) { if (EntityComponent) { const props = generateProps(req, res, { alert, + genderOptions: res.locals.genders, identifierTypes }); - const markup = ReactDOMServer.renderToString( { const markupProps = generateEntityProps( 'publisher', req, res, {} @@ -190,7 +190,7 @@ function _setPublisherTitle(res) { } -router.get('/:bbid', middleware.loadEntityRelationships, (req, res, next) => { +router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadWikipediaExtract, (req, res, next) => { // Fetch editions const {Publisher} = req.app.locals.orm; const editionRelationsToFetch = [ @@ -198,7 +198,8 @@ router.get('/:bbid', middleware.loadEntityRelationships, (req, res, next) => { 'disambiguation', 'releaseEventSet.releaseEvents', 'identifierSet.identifiers.type', - 'editionFormat' + 'editionFormat', + 'authorCredit.names' ]; const editionsPromise = Publisher.forge({bbid: res.locals.entity.bbid}) diff --git a/src/server/routes/entity/series.js b/src/server/routes/entity/series.js index 7d53bfb484..4c167fd3d7 100644 --- a/src/server/routes/entity/series.js +++ b/src/server/routes/entity/series.js @@ -90,7 +90,6 @@ router.get( '/create', auth.isAuthenticated, middleware.loadIdentifierTypes, middleware.loadLanguages, middleware.loadRelationshipTypes, middleware.loadSeriesOrderingTypes, - middleware.decodeUrlQueryParams, async (req, res) => { const {markup, props} = entityEditorMarkup(generateEntityProps( 'series', req, res, {} @@ -197,10 +196,11 @@ function _setSeriesTitle(res) { ); } -router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadSeriesItems, (req, res) => { - _setSeriesTitle(res); - entityRoutes.displayEntity(req, res); -}); +router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadSeriesItems, middleware.loadGenders, + middleware.loadWikipediaExtract, (req, res) => { + _setSeriesTitle(res); + entityRoutes.displayEntity(req, res); + }); router.get('/:bbid/delete', auth.isAuthenticated, (req, res, next) => { if (!res.locals.entity.dataId) { diff --git a/src/server/routes/entity/work.js b/src/server/routes/entity/work.js index 076cbc1a07..c2dbcd0e92 100644 --- a/src/server/routes/entity/work.js +++ b/src/server/routes/entity/work.js @@ -91,7 +91,7 @@ const router = express.Router(); router.get( '/create', auth.isAuthenticated, middleware.loadIdentifierTypes, middleware.loadLanguages, middleware.loadWorkTypes, - middleware.loadRelationshipTypes, middleware.decodeUrlQueryParams, + middleware.loadRelationshipTypes, (req, res, next) => { const {Author, Edition} = req.app.locals.orm; let relationshipTypeId; @@ -222,7 +222,7 @@ function _setWorkTitle(res) { ); } -router.get('/:bbid', middleware.loadEntityRelationships, (req, res) => { +router.get('/:bbid', middleware.loadEntityRelationships, middleware.loadWikipediaExtract, (req, res) => { _setWorkTitle(res); entityRoutes.displayEntity(req, res); }); diff --git a/src/server/routes/merge.ts b/src/server/routes/merge.ts index aa894b8c87..f362ece797 100644 --- a/src/server/routes/merge.ts +++ b/src/server/routes/merge.ts @@ -173,7 +173,13 @@ function entitiesToFormState(entities: any[]) { return props; } -function loadEntityRelationships(entity, orm, transacting): Promise { +async function loadEntityRelationships(entity, orm, transacting): Promise { + async function getEntityWithAlias(relEntity) { + const redirectBbid = await orm.func.entity.recursivelyGetRedirectBBID(orm, relEntity.bbid, null); + const model = commonUtils.getEntityModelByType(orm, relEntity.type); + return model.forge({bbid: redirectBbid}) + .fetch({require: true, withRelated: ['defaultAlias'].concat(getAdditionalRelations(relEntity.type))}); + } const {RelationshipSet} = orm; // Default to empty array, its presence is expected down the line @@ -182,87 +188,71 @@ function loadEntityRelationships(entity, orm, transacting): Promise { if (!entity.relationshipSetId) { return null; } - - return RelationshipSet.forge({id: entity.relationshipSetId}) - .fetch({ - transacting, - withRelated: [ - 'relationships.source', - 'relationships.target', - 'relationships.type.attributeTypes', - 'relationships.attributeSet.relationshipAttributes.value', - 'relationships.attributeSet.relationshipAttributes.type' - ] - }) - .then((relationshipSet) => { - if (relationshipSet) { - entity.relationships = relationshipSet.related('relationships').toJSON(); - } - - attachAttributes(entity.relationships); - - async function getEntityWithAlias(relEntity) { - const redirectBbid = await orm.func.entity.recursivelyGetRedirectBBID(orm, relEntity.bbid, null); - const model = commonUtils.getEntityModelByType(orm, relEntity.type); - - return model.forge({bbid: redirectBbid}) - .fetch({require: true, withRelated: ['defaultAlias'].concat(getAdditionalRelations(relEntity.type))}); - } - - /** - * Source and target are generic Entity objects, so until we have - * a good way of polymorphically fetching the right specific entity, - * we need to fetch default alias in a somewhat sketchier way. - */ - return Promise.all(entity.relationships.map( - (relationship) => Promise.all( - [getEntityWithAlias(relationship.source), - getEntityWithAlias(relationship.target)] - ) - .then(([relationshipSource, relationshipTarget]) => { - relationship.source = relationshipSource.toJSON(); - relationship.target = relationshipTarget.toJSON(); - - return relationship; - }) - )); - }) - .then((relationships) => { - // Set rendered relationships on relationship objects - relationships.forEach((relationship) => { - relationship.rendered = renderRelationship(relationship); + try { + const relationshipSet = await RelationshipSet.forge({id: entity.relationshipSetId}) + .fetch({ + transacting, + withRelated: [ + 'relationships.source', + 'relationships.target', + 'relationships.type.attributeTypes', + 'relationships.attributeSet.relationshipAttributes.value', + 'relationships.attributeSet.relationshipAttributes.type' + ] }); + if (relationshipSet) { + entity.relationships = relationshipSet.related('relationships').toJSON(); + } - return entity; + attachAttributes(entity.relationships); + + /** + * Source and target are generic Entity objects, so until we have + * a good way of polymorphically fetching the right specific entity, + * we need to fetch default alias in a somewhat sketchier way. + */ + const relationships = await Promise.all(entity.relationships.map(async (relationship) => { + const [relationshipSource, relationshipTarget] = await Promise.all([ + getEntityWithAlias(relationship.source), + getEntityWithAlias(relationship.target) + ]); + + relationship.source = relationshipSource.toJSON(); + relationship.target = relationshipTarget.toJSON(); + return relationship; + })); + + // Set rendered relationships on relationship objects + relationships.forEach((relationship) => { + relationship.rendered = renderRelationship(relationship); }); + return entity; + } + catch (error) { + /* eslint-disable no-console */ + console.error(error); + /* eslint-enable no-console */ + } + return null; } - async function getEntityByBBID(orm, transacting, bbid) { const redirectBbid = await orm.func.entity.recursivelyGetRedirectBBID(orm, bbid, transacting); const entityHeader = await orm.Entity.forge({bbid: redirectBbid}).fetch({transacting}); const entityType = entityHeader.get('type'); const model = commonUtils.getEntityModelByType(orm, entityType); - return model.forge({bbid: redirectBbid}) + const entity = await model.forge({bbid: redirectBbid}) .fetch({ require: true, transacting, withRelated: basicRelations.concat(getEntityFetchPropertiesByType(entityType)) - }) - .then(async (entity) => { - const entityJSON = entity.toJSON(); - try { - await loadEntityRelationships(entityJSON, orm, transacting); - } - catch (error) { - // eslint-disable-next-line no-console - console.error(error); - } - return entityJSON; - }) - .catch(error => { - throw error; }); + + const entityJSON = entity.toJSON(); + await loadEntityRelationships(entityJSON, orm, transacting); + + // Return the loaded entity as JSON + return entityJSON; } diff --git a/src/server/routes/revision.js b/src/server/routes/revision.js index 60ad8431b3..0dbfdd6b72 100644 --- a/src/server/routes/revision.js +++ b/src/server/routes/revision.js @@ -22,6 +22,7 @@ import * as entityFormatter from '../helpers/diffFormatters/entity'; import * as entityRoutes from './entity/entity'; import * as error from '../../common/helpers/error'; import * as languageSetFormatter from '../helpers/diffFormatters/languageSet'; +import * as middleware from '../helpers/middleware'; import * as propHelpers from '../../client/helpers/props'; import * as publisherSetFormatter from '../helpers/diffFormatters/publisherSet'; import * as releaseEventSetFormatter from @@ -178,54 +179,60 @@ function formatEditionGroupChange(change) { function diffRevisionsWithParents(orm, entityRevisions, entityType) { // entityRevisions - collection of *entityType*_revisions matching id - return Promise.all(entityRevisions.map( + const promises = entityRevisions.map( async (revision) => { const dataId = revision.get('dataId'); const revisionEntity = revision.related('entity'); const entityBBID = revisionEntity.get('bbid'); const entity = await orm.func.entity.getEntity(orm, entityType, entityBBID); const isEntityDeleted = !entity.dataId; - return revision.parent() - .then( - (parent) => { - let isNew = false; - const isDeletion = !dataId; - if (!parent) { - isNew = Boolean(dataId); - } - return makePromiseFromObject({ - changes: revision.diff(parent), - entity: revisionEntity, - entityAlias: dataId ? - revision.related('data').fetch({require: false, withRelated: ['aliasSet.defaultAlias', 'aliasSet.aliases']}) : - orm.func.entity.getEntityParentAlias( - orm, entityType, revision.get('bbid') - ), - isDeletion, - isEntityDeleted, - isNew, - revision - }); - }, - // If calling .parent() is rejected (no parent rev), we still want to go ahead without the parent - () => makePromiseFromObject({ - changes: revision.diff(null), - entity: revisionEntity, - entityAlias: revision.get('dataId') ? - revision.related('data').fetch({require: false, withRelated: ['aliasSet.defaultAlias', 'aliasSet.aliases']}) : - orm.func.entity.getEntityParentAlias( - orm, entityType, revision.get('bbid') - ), - isDeletion: !dataId, - isEntityDeleted, - isNew: Boolean(dataId), - revision - }) - ); + try { + const parent = await revision.parent(); + let isNew = false; + const isDeletion = !dataId; + if (!parent) { + isNew = Boolean(dataId); + } + return makePromiseFromObject({ + changes: revision.diff(parent), + entity: revisionEntity, + entityAlias: dataId ? + revision.related('data').fetch({require: false, withRelated: ['aliasSet.defaultAlias', 'aliasSet.aliases']}) : + orm.func.entity.getEntityParentAlias( + orm, entityType, revision.get('bbid') + ), + isDeletion, + isEntityDeleted, + isNew, + revision + }); + } + // If calling .parent() is rejected (no parent rev), we still want to go ahead without the parent + catch { + return makePromiseFromObject({ + changes: revision.diff(null), + entity: revisionEntity, + entityAlias: dataId ? + revision.related('data').fetch({require: false, withRelated: ['aliasSet.defaultAlias', 'aliasSet.aliases']}) : + orm.func.entity.getEntityParentAlias( + orm, entityType, revision.get('bbid') + ), + isDeletion: !dataId, + isEntityDeleted, + isNew: Boolean(dataId), + revision + }); + } } - )); + ); + return Promise.all(promises); } +router.param( + 'id', + middleware.checkValidRevisionId +); + router.get('/:id', async (req, res, next) => { const { AuthorRevision, EditionRevision, EditionGroupRevision, @@ -233,17 +240,22 @@ router.get('/:id', async (req, res, next) => { } = req.app.locals.orm; let revision; - function _createRevision(EntityRevisionModel, entityType) { + async function _createRevision(EntityRevisionModel, entityType) { /** * EntityRevisions can have duplicate ids * the 'merge' and 'remove' options instructs the ORM to consider that normal instead of merging * see https://github.com/bookshelf/bookshelf/pull/1846 */ - return EntityRevisionModel.forge() - .where('id', req.params.id) - .fetchAll({merge: false, remove: false, require: false, withRelated: 'entity'}) - .then((entityRevisions) => diffRevisionsWithParents(req.app.locals.orm, entityRevisions, entityType)) - .catch(err => { log.error(err); throw err; }); + try { + const entityRevisions = await EntityRevisionModel.forge() + .where('id', req.params.id) + .fetchAll({merge: false, remove: false, require: false, withRelated: 'entity'}); + return await diffRevisionsWithParents(req.app.locals.orm, entityRevisions, entityType); + } + catch (err) { + log.error(err); + throw err; + } } try { /* diff --git a/src/server/routes/statistics.js b/src/server/routes/statistics.js index 5a4218624d..c3610b8d43 100644 --- a/src/server/routes/statistics.js +++ b/src/server/routes/statistics.js @@ -31,110 +31,142 @@ import target from '../templates/target'; const router = express.Router(); -/* Get Statistics Page */ -router.get('/', async (req, res) => { - const {orm} = req.app.locals; - const {Editor} = orm; - - const entityModels = commonUtils.getEntityModels(orm); - - // queryPromises1 is used to extract total count of all entities - const queryPromises1 = []; - - // queryPromises2 is used for total count of entities added in 30 days - const queryPromises2 = []; - - /* - * Here We are fetching count of master revisions - * for every type of entities added from beginning - */ - - // eslint-disable-next-line guard-for-in - for (const modelName in entityModels) { - const model = entityModels[modelName]; - queryPromises1.push( - model.query((qb) => { - qb - .leftJoin( - 'bookbrainz.revision', - `bookbrainz.${_.snakeCase(modelName)}.revision_id`, - 'bookbrainz.revision.id' - ) - .where('master', true); - }) - .count().then((Count) => - ({Count, modelName})) - ); +/** + * Retrieves the total count of all entities in the database and returns it as an array of objects, + * where each object contains the entity name and its count. The results are sorted by count in + * descending order. + * + * @param {Object} orm - An object representing the ORM. + * @returns {Array} An array of objects, where each object contains the entity name and its count + * @throws {Error} If there is an error fetching entities lifetime total + */ +async function getAllEntities(orm) { + try { + const entityModels = commonUtils.getEntityModels(orm); + const countPromises = Object.entries(entityModels).map(async ([modelName, model]) => { + const Count = await model + .query((qb) => { + qb + .leftJoin( + 'bookbrainz.revision', + `bookbrainz.${_.snakeCase(modelName)}.revision_id`, + 'bookbrainz.revision.id' + ) + .where('master', true); + }) + .count(); + return {Count, modelName}; + }); + const allEntities = await Promise.all(countPromises); + allEntities.sort((a, b) => b.Count - a.Count); + return allEntities; + } + catch (error) { + throw new Error('Error fetching all entities total'); } - const allEntities = await Promise.all(queryPromises1); - allEntities.sort((a, b) => - b.Count - a.Count); +} - /* - * Here We are fetching count of master revision - * for every type of entities added in last 30 days - */ +/** + * Retrieves the count of entities created in the last 30 days and returns it as an object, where + * each key is the entity name and its value is the count. + * + * @param {Object} orm - An object representing the ORM. + * @returns {Object} An object where each key is the entity name and its value is the count + * @throws {Error} If there is an error fetching entities total cound from last 30 days + */ +async function getLast30DaysEntities(orm) { + try { + const entityModels = commonUtils.getEntityModels(orm); + const countPromises = Object.keys(entityModels).map(async (modelName) => { + const model = entityModels[modelName]; + const Count = await model + .query((qb) => { + qb + .leftJoin( + 'bookbrainz.revision', + `bookbrainz.${_.snakeCase(modelName)}.revision_id`, + 'bookbrainz.revision.id' + ) + .where('master', true) + .where( + 'bookbrainz.revision.created_at', + '>=', + utils.getDateBeforeDays(30) + ); + }) + .count(); + return {Count, modelName}; + }); + const last30DaysEntitiesHelper = await Promise.all(countPromises); + const last30DaysEntities = {}; + last30DaysEntitiesHelper.forEach((model) => { + last30DaysEntities[model.modelName] = model.Count; + }); + return last30DaysEntities; + } + catch (error) { + throw new Error('Error fetching entities from last 30 days'); + } +} - // eslint-disable-next-line guard-for-in - for (const modelName in entityModels) { - const model = entityModels[modelName]; +/** + * Retrieves the top 10 editors with the most revisions and returns them as an array of objects, + * where each object contains the editor's information. + * + * @param {Object} orm - An object representing the ORM. + * @returns {Array} An array of objects, where each object contains the editor's information. + * @throws {Error} If there is an error fetching the top 10 editors. + */ +async function getTop10Editors(orm) { + try { + const {Editor} = orm; + const topEditorsQuery = await new Editor() + .query((q) => + q.orderBy('total_revisions', 'desc') + .limit(10)) + .fetchAll(); + + const topEditors = topEditorsQuery.models.map((model) => model.attributes); + return topEditors; + } + catch (error) { + throw new Error('Error fetching top 10 editors'); + } +} - queryPromises2.push( - model.query((qb) => { - qb - .leftJoin( - 'bookbrainz.revision', - `bookbrainz.${_.snakeCase(modelName)}.revision_id`, - 'bookbrainz.revision.id' - ) - .where('master', true) - .where('bookbrainz.revision.created_at', '>=', - utils.getDateBeforeDays(30)); - }) - .count().then((Count) => - ({Count, modelName})) +/* Get Statistics Page */ +router.get('/', async (req, res, next) => { + const {orm} = req.app.locals; + try { + const [allEntities, last30DaysEntities, topEditors] = await Promise.all([ + getAllEntities(orm), + getLast30DaysEntities(orm), + getTop10Editors(orm) + ]); + const props = generateProps(req, res, { + allEntities, + last30DaysEntities, + topEditors + }); + const markup = ReactDOMServer.renderToString( + + + ); + return res.send(target({ + markup, + props: escapeProps(props), + script: '/js/statistics.js', + title: 'Statistics' + })); } - const last30DaysEntitiesHelper = await Promise.all(queryPromises2); - const last30DaysEntities = {}; - for (const model of last30DaysEntitiesHelper) { - last30DaysEntities[model.modelName] = model.Count; + catch (err) { + return next(err); } - - /* - * Fetch the top 10 Editors on the basis of total revisions - */ - const getTopEditors = new Editor() - .query((q) => - q.orderBy('total_revisions', 'desc') - .limit(10)) - .fetchAll() - .then((collection) => - collection.models.map((model) => - model.attributes)); - - const topEditors = await getTopEditors; - - const props = generateProps(req, res, { - allEntities, - last30DaysEntities, - topEditors - }); - const markup = ReactDOMServer.renderToString( - - - - ); - res.send(target({ - markup, - props: escapeProps(props), - script: '/js/statistics.js', - title: 'Statistics' - })); }); export default router; diff --git a/src/server/routes/wikimedia.ts b/src/server/routes/wikimedia.ts new file mode 100644 index 0000000000..00af5c8341 --- /dev/null +++ b/src/server/routes/wikimedia.ts @@ -0,0 +1,58 @@ +/* + * Copyright (C) 2023 David Kellner + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +import {getWikipediaExtract, selectWikipediaPage} from '../helpers/wikimedia'; +import express from 'express'; +import {getAcceptedLanguageCodes} from '../helpers/i18n'; +import log from 'log'; + + +function parseQuery(url: string) { + return new URLSearchParams(url.replace(/^.+?\?/, '')); +} + + +const router = express.Router(); + + +router.get('/wikidata/:id/wikipedia-extract', async (req, res) => { + const browserLanguages = getAcceptedLanguageCodes(req); + // using `req.query.language` for a parameter that might be `string`, `string[]` (or something else) is a pain + const queryLanguages = parseQuery(req.url).getAll('language'); + // try to use the user's browser languages, fallback to queried languages and English + const preferredLanguages = browserLanguages.concat(queryLanguages, 'en'); + + const wikidataId = req.params.id; + try { + const article = await selectWikipediaPage(wikidataId, {preferredLanguages}); + if (article) { + const extract = await getWikipediaExtract(article); + res.json({article, ...extract}); + } + else { + res.json({}); + } + } + catch (err) { + log.warning(`Failed to load Wikipedia extract for ${wikidataId}: ${err.message}`); + res.json({}); + } +}); + + +export default router; diff --git a/static/browserconfig.xml b/static/browserconfig.xml index 074b7af93e..1356b9227e 100644 --- a/static/browserconfig.xml +++ b/static/browserconfig.xml @@ -1,12 +1,12 @@ - - - - - - - - - #da532c - - - + + + + + + + + + #da532c + + + diff --git a/test/common.js b/test/common.js index 2904ea33a8..8e356747c5 100644 --- a/test/common.js +++ b/test/common.js @@ -29,41 +29,52 @@ export function expectFalse() { return (promise) => expect(promise).to.eventually.equal(false); } + export function expectIds(prop, rev) { - return (promise) => Promise.all([ - expect(promise).to.eventually.have - .property('editorId', testData.editorAttribs.id), - expect(promise).to.eventually.have - .property('achievementId', testData[`${prop}${rev}Attribs`].id) - ]); + return async (promise) => { + const results = await Promise.all([ + expect(promise).to.eventually.have + .property('editorId', testData.editorAttribs.id), + expect(promise).to.eventually.have + .property('achievementId', testData[`${prop}${rev}Attribs`].id) + ]); + return results; + }; } + export function expectRevNamedIds(name, prop, rev) { - return (promise) => Promise.all([ - expect(promise).to.eventually.have.nested - .property(`${name} ${rev}.editorId`, - testData.editorAttribs.id), - expect(promise).to.eventually.have.nested - .property(`${name} ${rev}.achievementId`, - testData[`${prop}${rev}Attribs`].id) - ]); + return async (promise) => { + const results = await Promise.all([ + expect(promise).to.eventually.have.nested + .property(`${name} ${rev}.editorId`, + testData.editorAttribs.id), + expect(promise).to.eventually.have.nested + .property(`${name} ${rev}.achievementId`, + testData[`${prop}${rev}Attribs`].id) + ]); + return results; + }; } export function expectAllNamedIds(name, prop, rev) { - return (promise) => Promise.all([ - expect(promise).to.eventually.have.nested - .property(`${name} ${rev}.editorId`, - testData.editorAttribs.id), - expect(promise).to.eventually.have.nested - .property(`${name} ${rev}.achievementId`, - testData[`${prop}${rev}Attribs`].id), - expect(promise).to.eventually.have.nested - .property(`${name}.editorId`, - testData.editorAttribs.id), - expect(promise).to.eventually.have.nested - .property(`${name}.titleId`, - testData[`${prop}Attribs`].id) - ]); + return async (promise) => { + const results = await Promise.all([ + expect(promise).to.eventually.have.nested + .property(`${name} ${rev}.editorId`, + testData.editorAttribs.id), + expect(promise).to.eventually.have.nested + .property(`${name} ${rev}.achievementId`, + testData[`${prop}${rev}Attribs`].id), + expect(promise).to.eventually.have.nested + .property(`${name}.editorId`, + testData.editorAttribs.id), + expect(promise).to.eventually.have.nested + .property(`${name}.titleId`, + testData[`${prop}Attribs`].id) + ]); + return results; + }; } export function getAttrPromise(Achievement, orm, full) { diff --git a/test/src/client/entity-editor/validators/test-edition.js b/test/src/client/entity-editor/validators/test-edition.js index 39880d66d5..f3d0102dc5 100644 --- a/test/src/client/entity-editor/validators/test-edition.js +++ b/test/src/client/entity-editor/validators/test-edition.js @@ -441,6 +441,21 @@ function describeValidateForm() { expect(result).to.be.true; }); + it('should pass an Object with an empty author credit editor and AC disabled', () => { + const result = validateForm( + { + ...validForm, + authorCreditEditor: {}, + editionSection: { + ...validForm.editionSection, + authorCreditEnable: false + } + }, + IDENTIFIER_TYPES + ); + expect(result).to.be.true; + }); + it('should reject an Object with an invalid alias editor', () => { const result = validateForm( { @@ -471,7 +486,22 @@ function describeValidateForm() { }, IDENTIFIER_TYPES ); - expect(result).to.be.true; + expect(result).to.be.false; + }); + + it('should reject an Object with a non empty author credit editor and AC disabled', () => { + const result = validateForm( + { + ...validForm, + authorCreditEditor: VALID_AUTHOR_CREDIT_EDITOR, + editionSection: { + ...validForm.editionSection, + authorCreditEnable: false + } + }, + IDENTIFIER_TYPES + ); + expect(result).to.be.false; }); it('should reject an Object with an invalid identifier editor', () => { diff --git a/test/src/client/entity-editor/validators/test-publication.js b/test/src/client/entity-editor/validators/test-publication.js index d0fbb38b39..f0060c81ed 100644 --- a/test/src/client/entity-editor/validators/test-publication.js +++ b/test/src/client/entity-editor/validators/test-publication.js @@ -48,6 +48,18 @@ function describeValidateEditionGroupSectionType() { testValidatePositiveIntegerFunc(validateEditionGroupSectionType, false); } +const VALID_AUTHOR_CREDIT_EDITOR = { + n0: { + author: { + id: '204f580d-7763-4660-9668-9a21736b5f6c', + rowId: 'n0', + text: '', + type: 'Author' + }, + name: 'author' + } +}; + const VALID_EDITION_GROUP_SECTION = { type: 1 }; @@ -96,6 +108,7 @@ function describeValidateEditionGroupSection() { function describeValidateForm() { const validForm = { aliasEditor: VALID_ALIASES, + authorCreditEditor: VALID_AUTHOR_CREDIT_EDITOR, editionGroupSection: VALID_EDITION_GROUP_SECTION, identifierEditor: VALID_IDENTIFIERS, nameSection: VALID_NAME_SECTION, diff --git a/test/src/server/routes/revision.js b/test/src/server/routes/revision.js new file mode 100644 index 0000000000..4569712b72 --- /dev/null +++ b/test/src/server/routes/revision.js @@ -0,0 +1,51 @@ +/* eslint-disable sort-keys */ +import {createEditor, truncateEntities} from '../../../test-helpers/create-entities'; +import app from '../../../../src/server/app'; +import chai from 'chai'; +import chaiHttp from 'chai-http'; +import orm from '../../../bookbrainz-data'; + + +chai.use(chaiHttp); +const {expect} = chai; +const {Revision} = orm; +const revisionAttribs = { + authorId: 1, + id: 1 +}; + +describe('checkValidRevisionId', () => { + before(async () => { + await createEditor(1); + await new Revision(revisionAttribs).save(null, {method: 'insert'}); + }); + after(truncateEntities); + + it('should not throw an error when revision id is valid and found', async () => { + const revisionId = 1; + const res = await chai.request(app).get(`/revision/${revisionId}`); + expect(res.ok).to.be.true; + expect(res).to.have.status(200); + }); + it('should throw an error if requested id is invalid', async () => { + const revisionId = 'hello'; + const res = await chai.request(app).get(`/revision/${revisionId}`); + expect(res.ok).to.be.false; + expect(res).to.have.status(400); + expect(res.res.statusMessage).to.equal(`Invalid revision id: ${revisionId}`); + }); + it('should throw an error when revision id is a decimal', async () => { + const revisionId = 1.367; + const res = await chai.request(app).get(`/revision/${revisionId}`); + expect(res.ok).to.be.false; + expect(res).to.have.status(400); + expect(res.res.statusMessage).to.equal(`Invalid revision id: ${revisionId}`); + }); + it('should throw an error when revision id is unavailable', async () => { + const revisionId = 1367; + const res = await chai.request(app).get(`/revision/${revisionId}`); + expect(res.ok).to.be.false; + expect(res).to.have.status(404); + expect(res.res.statusMessage).to.equal(`Revision #${revisionId} not found`); + }); +}); diff --git a/test/src/server/routes/unifiedform.js b/test/src/server/routes/unifiedform.js index 48fdf5f442..1a7a9edca0 100644 --- a/test/src/server/routes/unifiedform.js +++ b/test/src/server/routes/unifiedform.js @@ -69,19 +69,19 @@ describe('Unified form routes', () => { it('should not throw error while creating single entity', async () => { const postData = {b0: { ...baseState, - editionSection: {}, + editionSection: {authorCreditEnable: false}, type: 'Edition' }}; postData.b0.nameSection.language = newLanguage.id; const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const createdEntities = res.body; expect(createdEntities.length).equal(1); const editionEntity = createdEntities[0]; const fetchedEditionEntity = await getEntityByBBID(orm, editionEntity.bbid); expect(Boolean(fetchedEditionEntity)).to.be.true; expect(testDefaultAlias(fetchedEditionEntity, newLanguage.id)).to.be.true; - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should not throw error while editing single entity', async () => { @@ -99,14 +99,14 @@ describe('Unified form routes', () => { const newName = 'changedName'; postData.b0.nameSection.name = newName; const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const editEntities = res.body; expect(editEntities.length).equal(1); const workEntity = editEntities[0]; const fetchedworkEntity = await getEntityByBBID(orm, workEntity.bbid); expect(Boolean(fetchedworkEntity)).to.be.true; expect(fetchedworkEntity.defaultAlias.name).to.be.equal(newName); - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should not throw error while adding relationship to single entity', async () => { @@ -141,6 +141,8 @@ describe('Unified form routes', () => { type: 'Work' }}; const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const editEntities = res.body; expect(editEntities.length).equal(1); const workEntity = editEntities[0]; @@ -151,14 +153,12 @@ describe('Unified form routes', () => { expect(relationships.length).to.be.equal(2); expect(get(relationships[1], 'targetBbid')).to.be.equal(wBBID); expect(get(relationships[1], 'sourceBbid')).to.be.equal(aBBID); - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should not throw error while creating multiple entities', async () => { const postData = {b0: { ...baseState, - editionSection: {}, + editionSection: {authorCreditEnable: false}, type: 'Edition' }, b1: { @@ -173,6 +173,8 @@ describe('Unified form routes', () => { value.nameSection.language = newLanguage.id; }); const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const createdEntities = res.body; expect(createdEntities.length).equal(2); const conditions = await map(createdEntities, async (entity) => { @@ -180,14 +182,12 @@ describe('Unified form routes', () => { return !fetchedEntity ? false : testDefaultAlias(fetchedEntity, newLanguage.id); }); expect(every(conditions)).to.be.true; - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should not throw error when linking existing works to edition', async () => { const postData = {b0: { ...baseState, - editionSection: {}, + editionSection: {authorCreditEnable: false}, relationshipSection: { relationships: { n0: { @@ -212,6 +212,8 @@ describe('Unified form routes', () => { value.nameSection.language = newLanguage.id; }); const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const createdEntities = res.body; expect(createdEntities.length).equal(1); const editionEntity = createdEntities.find((entity) => entity.type === 'Edition'); @@ -220,14 +222,13 @@ describe('Unified form routes', () => { const relationship = fetchedEditionEntity.relationshipSet.relationships[0]; expect(relationship.sourceBbid).equal(fetchedEditionEntity.bbid); expect(relationship.targetBbid).equal(wBBID); - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should not throw error while linking existing publisher to edition', async () => { const postData = {b0: { ...baseState, editionSection: { + authorCreditEnable: false, publisher: { 0: { id: pBBID @@ -238,6 +239,8 @@ describe('Unified form routes', () => { }}; postData.b0.nameSection.language = newLanguage.id; const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const createdEntities = res.body; expect(createdEntities.length).equal(1); const editionEntity = createdEntities.find((entity) => entity.type === 'Edition'); @@ -245,8 +248,6 @@ describe('Unified form routes', () => { expect(Boolean(fetchedEditionEntity)).to.be.true; const publisherId = fetchedEditionEntity.publisherSet.publishers[0].bbid; expect(publisherId).equal(pBBID); - expect(res).to.be.ok; - expect(res).to.have.status(200); }); @@ -254,6 +255,7 @@ describe('Unified form routes', () => { const postData = {b0: { ...baseState, editionSection: { + authorCreditEnable: false, editionGroup: { id: egBBID } @@ -262,6 +264,8 @@ describe('Unified form routes', () => { }}; postData.b0.nameSection.language = newLanguage.id; const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const createdEntities = res.body; expect(createdEntities.length).equal(1); const editionEntity = createdEntities.find((entity) => entity.type === 'Edition'); @@ -269,8 +273,6 @@ describe('Unified form routes', () => { expect(Boolean(fetchedEditionEntity)).to.be.true; const editionGroupBbid = fetchedEditionEntity.editionGroup.bbid; expect(editionGroupBbid).equal(egBBID); - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should not throw error while linking existing author to edition using AC', async () => { @@ -290,14 +292,14 @@ describe('Unified form routes', () => { }}; postData.b0.nameSection.language = newLanguage.id; const res = await agent.post('/create/handler').send(postData); + expect(res).to.be.ok; + expect(res).to.have.status(200); const createdEntities = res.body; expect(createdEntities.length).equal(1); const editionEntity = createdEntities.find((entity) => entity.type === 'Edition'); const fetchedEditionEntity = await getEntityByBBID(orm, editionEntity.bbid, ['authorCredit']); expect(Boolean(fetchedEditionEntity)).to.be.true; expect(fetchedEditionEntity.authorCredit.authorCount).equal(1); - expect(res).to.be.ok; - expect(res).to.have.status(200); }); it('should throw bad request error while posting invalid form', async () => { diff --git a/test/test-achievement.js b/test/test-achievement.js index 1a951973bb..4e09edbfa1 100644 --- a/test/test-achievement.js +++ b/test/test-achievement.js @@ -48,7 +48,7 @@ function tests() { describe('awardAchievement', () => { afterEach(testData.truncate); - it('should award achievements', () => { + it('should award achievements', async () => { const unlockPromise = testData.createEditor() .then(() => testData.createRevisionist()) .then( @@ -59,7 +59,7 @@ function tests() { ) ); - return Promise.all([ + const result = await Promise.all([ expect(unlockPromise).to.eventually.have.nested.property( 'Revisionist I.editorId', testData.editorAttribs.id @@ -69,6 +69,7 @@ function tests() { testData.revisionistIAttribs.id ) ]); + return result; }); // suppress warnings from rejections @@ -112,7 +113,7 @@ function tests() { describe('awardTitle', () => { afterEach(testData.truncate); - it('should award titles', () => { + it('should award titles', async () => { const unlockPromise = testData.createEditor() .then(() => testData.createRevisionist()) .then( @@ -123,7 +124,7 @@ function tests() { ) ); - return Promise.all([ + const result = await Promise.all([ expect(unlockPromise).to.eventually.have.nested.property( 'Revisionist.editorId', testData.editorAttribs.id @@ -133,6 +134,7 @@ function tests() { testData.revisionistAttribs.id ) ]); + return result; }); it('should reject invalid editors', () => { diff --git a/test/test-helpers/create-entities.js b/test/test-helpers/create-entities.js index a62e1881aa..72cc77ffdc 100644 --- a/test/test-helpers/create-entities.js +++ b/test/test-helpers/create-entities.js @@ -320,7 +320,9 @@ export async function createWork(optionalBBID, optionalWorkAttribs = {}) { } if (!workType) { - workType = await new WorkType({label: `Work Type ${optionalWorkAttribs.typeId || random.number()}`, ...optionalWorkTypeAttribs}) + workType = await new WorkType({description: 'A work type', + label: `Work Type ${optionalWorkAttribs.typeId || random.number()}`, + ...optionalWorkTypeAttribs}) .save(null, {method: 'insert'}); } diff --git a/yarn.lock b/yarn.lock index eaf4a6fa0a..e233db7d51 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,6 +2,11 @@ # yarn lockfile v1 +"@aashutoshrathi/word-wrap@^1.2.3": + version "1.2.6" + resolved "https://registry.yarnpkg.com/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz#bd9154aec9983f77b3a034ecaa015c2e4201f6cf" + integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== + "@ampproject/remapping@^2.1.0": version "2.2.0" resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.2.0.tgz#56c133824780de3174aed5ab6834f3026790154d" @@ -30,17 +35,17 @@ resolved "https://registry.yarnpkg.com/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz#b789a362e055b0340d04712eafe7027ddc1ac267" integrity sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg== -"@apidevtools/swagger-parser@10.0.2": - version "10.0.2" - resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.0.2.tgz#f4145afb7c3a3bafe0376f003b5c3bdeae17a952" - integrity sha512-JFxcEyp8RlNHgBCE98nwuTkZT6eNFPc1aosWV6wPcQph72TSEEu1k3baJD4/x1qznU+JiDdz8F5pTwabZh+Dhg== +"@apidevtools/swagger-parser@10.0.3": + version "10.0.3" + resolved "https://registry.yarnpkg.com/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz#32057ae99487872c4dd96b314a1ab4b95d89eaf5" + integrity sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g== dependencies: "@apidevtools/json-schema-ref-parser" "^9.0.6" "@apidevtools/openapi-schemas" "^2.0.4" "@apidevtools/swagger-methods" "^3.0.2" "@jsdevtools/ono" "^7.1.3" call-me-maybe "^1.0.1" - z-schema "^4.2.3" + z-schema "^5.0.1" "@babel/cli@^7.17.6": version "7.17.6" @@ -66,103 +71,50 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.0.tgz#0dfc80309beec8411e65e706461c408b0bb9b431" - integrity sha512-IF4EOMEV+bfYwOmNxGzSnjR2EmQod7f1UXOpZM3l4i4o4QNwzjtJAu/HxdjHq0aYBvdqMuQEY1eg0nqW9ZPORA== - dependencies: - "@babel/highlight" "^7.16.0" - -"@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.18.6.tgz#3b25d38c89600baa2dcc219edfa88a74eb2c427a" integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q== dependencies: "@babel/highlight" "^7.18.6" -"@babel/code-frame@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.16.7.tgz#44416b6bd7624b998f5b1af5d470856c40138789" - integrity sha512-iAXqUn8IIeBTNd72xsFlgaXHkMBMt6y4HJp1tIaK465CWLT/fG1aqB7ykr95gHHmlBdGbFeWWfyB4NJJ0nmeIg== - dependencies: - "@babel/highlight" "^7.16.7" - -"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.17.0", "@babel/compat-data@^7.17.7": +"@babel/compat-data@^7.13.11", "@babel/compat-data@^7.16.4", "@babel/compat-data@^7.17.0": version "7.17.7" resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.17.7.tgz#078d8b833fbbcc95286613be8c716cef2b519fa2" integrity sha512-p8pdE6j0a29TNGebNm7NzYZWB3xVZJBZ7XGs42uAKzQo8VQ3F0By/cQCtUEABwIqw5zo6WA4NbmxsfzADzMKnQ== -"@babel/compat-data@^7.18.8": - version "7.18.8" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.18.8.tgz#2483f565faca607b8535590e84e7de323f27764d" - integrity sha512-HSmX4WZPPK3FUxYp7g2T6EyO8j96HlZJlxmKPSh6KAcqwyDrfx7hKjXpAW/0FhFfTJsR0Yt4lAjLI2coMptIHQ== +"@babel/compat-data@^7.20.5": + version "7.20.10" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.20.10.tgz#9d92fa81b87542fff50e848ed585b4212c1d34ec" + integrity sha512-sEnuDPpOJR/fcafHMjpcpGN5M2jbUGUHwmuWKM/YdPzeEDJg8bgmbcWQFUfE32MQjti1koACvoPVsDe8Uq+idg== -"@babel/core@^7.10.1": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.16.0.tgz#c4ff44046f5fe310525cc9eb4ef5147f0c5374d4" - integrity sha512-mYZEvshBRHGsIAiyH5PzCFTCfbWfoYbO/jcSdXQSUQu1/pW0xDZAUP7KEc32heqWTAfAHhV9j1vH8Sav7l+JNQ== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-compilation-targets" "^7.16.0" - "@babel/helper-module-transforms" "^7.16.0" - "@babel/helpers" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - convert-source-map "^1.7.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.1.2" - semver "^6.3.0" - source-map "^0.5.0" - -"@babel/core@^7.11.6", "@babel/core@^7.12.3": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.18.9.tgz#805461f967c77ff46c74ca0460ccf4fe933ddd59" - integrity sha512-1LIb1eL8APMy91/IMW+31ckrfBM4yCoLaVzoDhZUKSM4cu1L1nIidyxkCgzPAgrC5WEz36IPEr/eSeSF9pIn+g== +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.20.12": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.20.12.tgz#7930db57443c6714ad216953d1356dac0eb8496d" + integrity sha512-XsMfHovsUYHFMdrIHkZphTN/2Hzzi78R08NuHfDBehym2VsPDL6Zn/JAD/JQdnRvbSsbQc4mVaU1m6JgtTEElg== dependencies: "@ampproject/remapping" "^2.1.0" "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" - "@babel/helper-compilation-targets" "^7.18.9" - "@babel/helper-module-transforms" "^7.18.9" - "@babel/helpers" "^7.18.9" - "@babel/parser" "^7.18.9" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/generator" "^7.20.7" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-module-transforms" "^7.20.11" + "@babel/helpers" "^7.20.7" + "@babel/parser" "^7.20.7" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.12" + "@babel/types" "^7.20.7" convert-source-map "^1.7.0" debug "^4.1.0" gensync "^1.0.0-beta.2" - json5 "^2.2.1" + json5 "^2.2.2" semver "^6.3.0" -"@babel/generator@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.0.tgz#d40f3d1d5075e62d3500bccb67f3daa8a95265b2" - integrity sha512-RR8hUCfRQn9j9RPKEVXo9LiwoxLPYn6hNZlvUOR8tSnaxlD0p0+la00ZP9/SnRt6HchKr+X0fO2r8vrETiJGew== - dependencies: - "@babel/types" "^7.16.0" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.8.tgz#359d44d966b8cd059d543250ce79596f792f2ebe" - integrity sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw== - dependencies: - "@babel/types" "^7.16.8" - jsesc "^2.5.1" - source-map "^0.5.0" - -"@babel/generator@^7.18.9", "@babel/generator@^7.7.2": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.18.9.tgz#68337e9ea8044d6ddc690fb29acae39359cca0a5" - integrity sha512-wt5Naw6lJrL1/SGkipMiFxJjtyczUWTP38deiP1PO60HsBjDeKk08CGC3S8iVuvf0FmTdgKwU1KIXzSKL1G0Ug== +"@babel/generator@^7.20.7", "@babel/generator@^7.7.2": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.20.7.tgz#f8ef57c8242665c5929fe2e8d82ba75460187b4a" + integrity sha512-7wqMOJq8doJMZmP4ApXTzLxSr7+oO2jroJURrVEp6XShrQUObV8Tq/D0NCcoYg2uHqUrjzO0zwBjoYzelxK+sw== dependencies: - "@babel/types" "^7.18.9" + "@babel/types" "^7.20.7" "@jridgewell/gen-mapping" "^0.3.2" jsesc "^2.5.1" @@ -173,6 +125,13 @@ dependencies: "@babel/types" "^7.16.7" +"@babel/helper-annotate-as-pure@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz#eaa49f6f80d5a33f9a5dd2276e6d6e451be0a6bb" + integrity sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA== + dependencies: + "@babel/types" "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.16.0": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.16.0.tgz#f1a686b92da794020c26582eb852e9accd0d7882" @@ -181,24 +140,15 @@ "@babel/helper-explode-assignable-expression" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.0", "@babel/helper-compilation-targets@^7.16.3", "@babel/helper-compilation-targets@^7.16.7": - version "7.17.7" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.17.7.tgz#a3c2924f5e5f0379b356d4cfb313d1414dc30e46" - integrity sha512-UFzlz2jjd8kroj0hmCFV5zr+tQPi1dpC2cRsDV/3IEW8bJfCPrPpmcSN6ZS8RqIq4LXcmpipCQFPddyFA5Yc7w== - dependencies: - "@babel/compat-data" "^7.17.7" - "@babel/helper-validator-option" "^7.16.7" - browserslist "^4.17.5" - semver "^6.3.0" - -"@babel/helper-compilation-targets@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.9.tgz#69e64f57b524cde3e5ff6cc5a9f4a387ee5563bf" - integrity sha512-tzLCyVmqUiFlcFoAPLA/gL9TeYrF61VLNtb+hvkuVaB5SUjW7jcfrglBIX1vUIoT7CLP3bBlIMeyEsIl2eFQNg== +"@babel/helper-compilation-targets@^7.13.0", "@babel/helper-compilation-targets@^7.16.3", "@babel/helper-compilation-targets@^7.16.7", "@babel/helper-compilation-targets@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.20.7.tgz#a6cd33e93629f5eb473b021aac05df62c4cd09bb" + integrity sha512-4tGORmfQcrc+bvrjb5y3dG9Mx1IOZjsHqQVUz7XCNHO+iTmqxWnVg3KRygjGmpRLJGdQSKuvFinbIb0CnZwHAQ== dependencies: - "@babel/compat-data" "^7.18.8" + "@babel/compat-data" "^7.20.5" "@babel/helper-validator-option" "^7.18.6" - browserslist "^4.20.2" + browserslist "^4.21.3" + lru-cache "^5.1.1" semver "^6.3.0" "@babel/helper-create-class-features-plugin@^7.16.0": @@ -277,13 +227,13 @@ "@babel/template" "^7.16.7" "@babel/types" "^7.16.7" -"@babel/helper-function-name@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.18.9.tgz#940e6084a55dee867d33b4e487da2676365e86b0" - integrity sha512-fJgWlZt7nxGksJS9a0XdSaI4XvpExnNIgRP+rVefWh5U7BL8pPuir6SJUmFKRfjWQ51OtWSzwOxhaH/EBWWc0A== +"@babel/helper-function-name@^7.19.0": + version "7.19.0" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz#941574ed5390682e872e52d3f38ce9d1bef4648c" + integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w== dependencies: - "@babel/template" "^7.18.6" - "@babel/types" "^7.18.9" + "@babel/template" "^7.18.10" + "@babel/types" "^7.19.0" "@babel/helper-get-function-arity@^7.16.7": version "7.16.7" @@ -299,13 +249,6 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-hoist-variables@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.16.7.tgz#86bcb19a77a509c7b77d0e22323ef588fa58c246" - integrity sha512-m04d/0Op34H5v7pbZw6pSKP7weA6lsMvfiIAMeIvkY/R4xQtBSMFEigu9QTZ2qB/9l22vsxtM8a+Q8CzD255fg== - dependencies: - "@babel/types" "^7.16.7" - "@babel/helper-hoist-variables@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz#d4d2c8fb4baeaa5c68b99cc8245c56554f926678" @@ -341,33 +284,19 @@ dependencies: "@babel/types" "^7.18.6" -"@babel/helper-module-transforms@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.16.0.tgz#1c82a8dd4cb34577502ebd2909699b194c3e9bb5" - integrity sha512-My4cr9ATcaBbmaEa8M0dZNA74cfI6gitvUAskgDtAFmAqyFKDSHQo5YstxPbN+lzHl2D9l/YOEFqb2mtUh4gfA== - dependencies: - "@babel/helper-module-imports" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" - "@babel/helper-simple-access" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/helper-validator-identifier" "^7.15.7" - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/helper-module-transforms@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.18.9.tgz#5a1079c005135ed627442df31a42887e80fcb712" - integrity sha512-KYNqY0ICwfv19b31XzvmI/mfcylOzbLtowkw+mfvGPAQ3kfCnMLYbED3YecL5tPd8nAYFQFAd6JHp2LxZk/J1g== +"@babel/helper-module-transforms@^7.16.0", "@babel/helper-module-transforms@^7.20.11": + version "7.20.11" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.20.11.tgz#df4c7af713c557938c50ea3ad0117a7944b2f1b0" + integrity sha512-uRy78kN4psmji1s2QtbtcCSaj/LILFDp0f/ymhpQH5QY3nljUZCaNWz9X1dEj/8MBdBEFECs7yRhKn8i7NjZgg== dependencies: "@babel/helper-environment-visitor" "^7.18.9" "@babel/helper-module-imports" "^7.18.6" - "@babel/helper-simple-access" "^7.18.6" + "@babel/helper-simple-access" "^7.20.2" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/helper-validator-identifier" "^7.18.6" - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/helper-validator-identifier" "^7.19.1" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.10" + "@babel/types" "^7.20.7" "@babel/helper-optimise-call-expression@^7.16.0", "@babel/helper-optimise-call-expression@^7.16.7": version "7.16.7" @@ -376,15 +305,10 @@ dependencies: "@babel/types" "^7.16.7" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.7.tgz#aa3a8ab4c3cceff8e65eb9e73d87dc4ff320b2f5" - integrity sha512-Qg3Nk7ZxpgMrsox6HreY1ZNKdBq7K72tDSliA6dCl5f007jR4ne8iD5UzuNnCJH2xBf2BEEVGr+/OL6Gdp7RxA== - -"@babel/helper-plugin-utils@^7.18.6": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.9.tgz#4b8aea3b069d8cb8a72cdfe28ddf5ceca695ef2f" - integrity sha512-aBXPT3bmtLryXaoJLyYPXPlSD4p1ld9aYeR+sJNOZjJJGiOpb+fKfh3NkcCu7J54nUJwCERPBExCCpyCOHnu/w== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.20.2.tgz#d1b9000752b18d0877cff85a5c376ce5c3121629" + integrity sha512-8RvlJG2mj4huQ4pZ+rU9lqKi9ZKiRmuvGuM2HlWmkmgOhbs6zEAw6IEiJ5cQqGbDzGZOhwuOQNtZMi/ENLjZoQ== "@babel/helper-remap-async-to-generator@^7.16.0", "@babel/helper-remap-async-to-generator@^7.16.4": version "7.16.4" @@ -413,12 +337,12 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-simple-access@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz#d6d8f51f4ac2978068df934b569f08f29788c7ea" - integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g== +"@babel/helper-simple-access@^7.20.2": + version "7.20.2" + resolved "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.20.2.tgz#0ab452687fe0c2cfb1e2b9e0015de07fc2d62dd9" + integrity sha512-+0woI/WPq59IrqDYbVGfshjT5Dmk/nnbdpcF8SnMhhXObpTq2KNBdLFRFrkVdbDOyUmHBCxzm5FHV1rACIkIbA== dependencies: - "@babel/types" "^7.18.6" + "@babel/types" "^7.20.2" "@babel/helper-skip-transparent-expression-wrappers@^7.16.0": version "7.16.0" @@ -441,27 +365,27 @@ dependencies: "@babel/types" "^7.18.6" +"@babel/helper-string-parser@^7.19.4": + version "7.19.4" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz#38d3acb654b4701a9b77fb0615a96f775c3a9e63" + integrity sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw== + "@babel/helper-validator-identifier@^7.15.7": version "7.15.7" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz#220df993bfe904a4a6b02ab4f3385a5ebf6e2389" integrity sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w== -"@babel/helper-validator-identifier@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.16.7.tgz#e8c602438c4a8195751243da9031d1607d247cad" - integrity sha512-hsEnFemeiW4D08A5gUAZxLBTXpZ39P+a+DGDsHw1yxqyQ/jzFEnxf5uTEGp+3bzAbNOxU1paTgYS4ECU/IgfDw== - "@babel/helper-validator-identifier@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.18.6.tgz#9c97e30d31b2b8c72a1d08984f2ca9b574d7a076" integrity sha512-MmetCkz9ej86nJQV+sFCxoGGrUbU3q02kgLciwkrt9QqEB7cP39oKEY0PakknEO0Gu20SskMRi+AYZ3b1TpN9g== -"@babel/helper-validator-option@^7.14.5", "@babel/helper-validator-option@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.16.7.tgz#b203ce62ce5fe153899b617c08957de860de4d23" - integrity sha512-TRtenOuRUVo9oIQGPC5G9DgK4743cdxvtOw0weQNpZXaS16SCBi5MNjZF8vba3ETURjZpTbVn7Vvcf2eAwFozQ== +"@babel/helper-validator-identifier@^7.19.1": + version "7.19.1" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2" + integrity sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w== -"@babel/helper-validator-option@^7.18.6": +"@babel/helper-validator-option@^7.14.5", "@babel/helper-validator-option@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz#bf0d2b5a509b1f336099e4ff36e1a63aa5db4db8" integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw== @@ -476,25 +400,16 @@ "@babel/traverse" "^7.16.0" "@babel/types" "^7.16.0" -"@babel/helpers@^7.16.0": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.16.3.tgz#27fc64f40b996e7074dc73128c3e5c3e7f55c43c" - integrity sha512-Xn8IhDlBPhvYTvgewPKawhADichOsbkZuzN7qz2BusOM0brChsyXMDJvldWaYMMUNiCQdQzNEioXTp3sC8Nt8w== - dependencies: - "@babel/template" "^7.16.0" - "@babel/traverse" "^7.16.3" - "@babel/types" "^7.16.0" - -"@babel/helpers@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.18.9.tgz#4bef3b893f253a1eced04516824ede94dcfe7ff9" - integrity sha512-Jf5a+rbrLoR4eNdUmnFu8cN5eNJT6qdTdOg5IHIzq87WwyRw9PwguLFOWYgktN/60IP4fgDUawJvs7PjQIzELQ== +"@babel/helpers@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.20.7.tgz#04502ff0feecc9f20ecfaad120a18f011a8e6dce" + integrity sha512-PBPjs5BppzsGaxHQCDKnZ6Gd9s6xl8bBCluz3vEInLGRJmnZan4F6BYCeqtyXqkk4W5IlPmjK4JlOuZkpJ3xZA== dependencies: - "@babel/template" "^7.18.6" - "@babel/traverse" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/template" "^7.20.7" + "@babel/traverse" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/highlight@^7.10.4", "@babel/highlight@^7.16.0": +"@babel/highlight@^7.10.4": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.0.tgz#6ceb32b2ca4b8f5f361fb7fd821e3fddf4a1725a" integrity sha512-t8MH41kUQylBtu2+4IQA3atqevA2lRgqA2wyVB/YiWmsDSuylZZuXOUy9ric30hfzauEFfdsuk/eXTRrGrfd0g== @@ -503,15 +418,6 @@ chalk "^2.0.0" js-tokens "^4.0.0" -"@babel/highlight@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.16.10.tgz#744f2eb81579d6eea753c227b0f570ad785aba88" - integrity sha512-5FnTQLSLswEj6IkgVw5KusNUUFY9ZGqe/TRFnP/BKYHYgfh7tc+C7mwiy95/yNP7Dh9x580Vv8r7u7ZfTBFxdw== - dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - chalk "^2.0.0" - js-tokens "^4.0.0" - "@babel/highlight@^7.18.6": version "7.18.6" resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.18.6.tgz#81158601e93e2563795adcbfbdf5d64be3f2ecdf" @@ -533,20 +439,10 @@ regenerator-runtime "^0.13.4" v8flags "^3.1.1" -"@babel/parser@^7.14.7", "@babel/parser@^7.18.6", "@babel/parser@^7.18.9": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.18.9.tgz#f2dde0c682ccc264a9a8595efd030a5cc8fd2539" - integrity sha512-9uJveS9eY9DJ0t64YbIBZICtJy8a5QrDEVdiLCG97fVLpDTpGX7t8mMSb6OWw6Lrnjqj4O8zwjELX3dhoMgiBg== - -"@babel/parser@^7.16.0", "@babel/parser@^7.16.3": - version "7.16.4" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" - integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== - -"@babel/parser@^7.16.10", "@babel/parser@^7.16.7": - version "7.16.12" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.12.tgz#9474794f9a650cf5e2f892444227f98e28cdf8b6" - integrity sha512-VfaV15po8RiZssrkPweyvbGVSe4x2y+aciFCgn0n0/SJMR22cwofRV1mtnJQYcSB1wUTaA/X1LnA3es66MCO5A== +"@babel/parser@^7.14.7", "@babel/parser@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.20.7.tgz#66fe23b3c8569220817d5feb8b9dcdc95bb4f71b" + integrity sha512-T3Z9oHybU+0vZlY9CiDSJQTD5ZapcW18ZctFMi0MOAl/4BjFF4ul7NVSARLdbGO5vDqy9eQiGTV0LtKfvCYvcg== "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.16.2": version "7.16.2" @@ -748,13 +644,20 @@ dependencies: "@babel/helper-plugin-utils" "^7.8.0" -"@babel/plugin-syntax-jsx@^7.12.13", "@babel/plugin-syntax-jsx@^7.16.7": +"@babel/plugin-syntax-jsx@^7.12.13": version "7.16.7" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.16.7.tgz#50b6571d13f764266a113d77c82b4a6508bbe665" integrity sha512-Esxmk7YjA8QysKeT3VhTXvF6y77f/a91SIs4pWb4H2eWGQkCKFgQaG6hdoEVZtGsrAcb2K5BW66XsOErD4WU3Q== dependencies: "@babel/helper-plugin-utils" "^7.16.7" +"@babel/plugin-syntax-jsx@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz#a8feef63b010150abd97f1649ec296e849943ca0" + integrity sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/plugin-syntax-logical-assignment-operators@^7.10.4", "@babel/plugin-syntax-logical-assignment-operators@^7.8.3": version "7.10.4" resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz#ca91ef46303530448b906652bac2e9fe9941f699" @@ -1009,38 +912,38 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-react-display-name@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.16.7.tgz#7b6d40d232f4c0f550ea348593db3b21e2404340" - integrity sha512-qgIg8BcZgd0G/Cz916D5+9kqX0c7nPZyXaP8R2tLNN5tkyIZdG5fEwBrxwplzSnjC1jvQmyMNVwUCZPcbGY7Pg== +"@babel/plugin-transform-react-display-name@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz#8b1125f919ef36ebdfff061d664e266c666b9415" + integrity sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" -"@babel/plugin-transform-react-jsx-development@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.16.7.tgz#43a00724a3ed2557ed3f276a01a929e6686ac7b8" - integrity sha512-RMvQWvpla+xy6MlBpPlrKZCMRs2AGiHOGHY3xRwl0pEeim348dDyxeH4xBsMPbIMhujeq7ihE702eM2Ew0Wo+A== +"@babel/plugin-transform-react-jsx-development@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz#dbe5c972811e49c7405b630e4d0d2e1380c0ddc5" + integrity sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA== dependencies: - "@babel/plugin-transform-react-jsx" "^7.16.7" + "@babel/plugin-transform-react-jsx" "^7.18.6" -"@babel/plugin-transform-react-jsx@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.16.7.tgz#86a6a220552afd0e4e1f0388a68a372be7add0d4" - integrity sha512-8D16ye66fxiE8m890w0BpPpngG9o9OVBBy0gH2E+2AR7qMR2ZpTYJEqLxAsoroenMId0p/wMW+Blc0meDgu0Ag== +"@babel/plugin-transform-react-jsx@^7.18.6": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.20.7.tgz#025d85a1935fd7e19dfdcb1b1d4df34d4da484f7" + integrity sha512-Tfq7qqD+tRj3EoDhY00nn2uP2hsRxgYGi5mLQ5TimKav0a9Lrpd4deE+fcLXU8zFYRjlKPHZhpCvfEA6qnBxqQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-module-imports" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/plugin-syntax-jsx" "^7.16.7" - "@babel/types" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-module-imports" "^7.18.6" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-jsx" "^7.18.6" + "@babel/types" "^7.20.7" -"@babel/plugin-transform-react-pure-annotations@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.16.7.tgz#232bfd2f12eb551d6d7d01d13fe3f86b45eb9c67" - integrity sha512-hs71ToC97k3QWxswh2ElzMFABXHvGiJ01IB1TbYQDGeWRKWz/MPUTh5jGExdHvosYKpnJW5Pm3S4+TA3FyX+GA== +"@babel/plugin-transform-react-pure-annotations@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz#561af267f19f3e5d59291f9950fd7b9663d0d844" + integrity sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ== dependencies: - "@babel/helper-annotate-as-pure" "^7.16.7" - "@babel/helper-plugin-utils" "^7.16.7" + "@babel/helper-annotate-as-pure" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" "@babel/plugin-transform-regenerator@^7.16.0": version "7.16.0" @@ -1219,17 +1122,17 @@ "@babel/types" "^7.4.4" esutils "^2.0.2" -"@babel/preset-react@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.16.7.tgz#4c18150491edc69c183ff818f9f2aecbe5d93852" - integrity sha512-fWpyI8UM/HE6DfPBzD8LnhQ/OcH8AgTaqcqP2nGOXEUV+VKBR5JRN9hCk9ai+zQQ57vtm9oWeXguBCPNUjytgA== +"@babel/preset-react@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.18.6.tgz#979f76d6277048dc19094c217b507f3ad517dd2d" + integrity sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg== dependencies: - "@babel/helper-plugin-utils" "^7.16.7" - "@babel/helper-validator-option" "^7.16.7" - "@babel/plugin-transform-react-display-name" "^7.16.7" - "@babel/plugin-transform-react-jsx" "^7.16.7" - "@babel/plugin-transform-react-jsx-development" "^7.16.7" - "@babel/plugin-transform-react-pure-annotations" "^7.16.7" + "@babel/helper-plugin-utils" "^7.18.6" + "@babel/helper-validator-option" "^7.18.6" + "@babel/plugin-transform-react-display-name" "^7.18.6" + "@babel/plugin-transform-react-jsx" "^7.18.6" + "@babel/plugin-transform-react-jsx-development" "^7.18.6" + "@babel/plugin-transform-react-pure-annotations" "^7.18.6" "@babel/preset-typescript@^7.12.1": version "7.16.0" @@ -1258,102 +1161,38 @@ dependencies: regenerator-runtime "^0.13.4" -"@babel/template@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.0.tgz#d16a35ebf4cd74e202083356fab21dd89363ddd6" - integrity sha512-MnZdpFD/ZdYhXwiunMqqgyZyucaYsbL0IrjoGjaVhGilz+x8YB++kRfygSOIj1yOtWKPlx7NBp+9I1RQSgsd5A== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/parser" "^7.16.0" - "@babel/types" "^7.16.0" - -"@babel/template@^7.16.7": - version "7.16.7" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.16.7.tgz#8d126c8701fde4d66b264b3eba3d96f07666d155" - integrity sha512-I8j/x8kHUrbYRTUxXrrMbfCa7jxkE7tZre39x3kjr9hvI82cK1FfqLygotcWN5kdPGWcLdWMHpSBavse5tWw3w== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/parser" "^7.16.7" - "@babel/types" "^7.16.7" - -"@babel/template@^7.18.6": - version "7.18.6" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.18.6.tgz#1283f4993e00b929d6e2d3c72fdc9168a2977a31" - integrity sha512-JoDWzPe+wgBsTTgdnIma3iHNFC7YVJoPssVBDjiHfNlyt4YcunDtcDOUmfVDfCK5MfdsaIoX9PkijPhjH3nYUw== +"@babel/template@^7.16.0", "@babel/template@^7.16.7", "@babel/template@^7.18.10", "@babel/template@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.20.7.tgz#a15090c2839a83b02aa996c0b4994005841fd5a8" + integrity sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/parser" "^7.18.6" - "@babel/types" "^7.18.6" - -"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.3": - version "7.16.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.3.tgz#f63e8a938cc1b780f66d9ed3c54f532ca2d14787" - integrity sha512-eolumr1vVMjqevCpwVO99yN/LoGL0EyHiLO5I043aYQvwOJ9eR5UsZSClHVCzfhBduMAsSzgA/6AyqPjNayJag== - dependencies: - "@babel/code-frame" "^7.16.0" - "@babel/generator" "^7.16.0" - "@babel/helper-function-name" "^7.16.0" - "@babel/helper-hoist-variables" "^7.16.0" - "@babel/helper-split-export-declaration" "^7.16.0" - "@babel/parser" "^7.16.3" - "@babel/types" "^7.16.0" - debug "^4.1.0" - globals "^11.1.0" - -"@babel/traverse@^7.16.7": - version "7.16.10" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.10.tgz#448f940defbe95b5a8029975b051f75993e8239f" - integrity sha512-yzuaYXoRJBGMlBhsMJoUW7G1UmSb/eXr/JHYM/MsOJgavJibLwASijW7oXBdw3NQ6T0bW7Ty5P/VarOs9cHmqw== - dependencies: - "@babel/code-frame" "^7.16.7" - "@babel/generator" "^7.16.8" - "@babel/helper-environment-visitor" "^7.16.7" - "@babel/helper-function-name" "^7.16.7" - "@babel/helper-hoist-variables" "^7.16.7" - "@babel/helper-split-export-declaration" "^7.16.7" - "@babel/parser" "^7.16.10" - "@babel/types" "^7.16.8" - debug "^4.1.0" - globals "^11.1.0" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.7.2": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.18.9.tgz#deeff3e8f1bad9786874cb2feda7a2d77a904f98" - integrity sha512-LcPAnujXGwBgv3/WHv01pHtb2tihcyW1XuL9wd7jqh1Z8AQkTd+QVjMrMijrln0T7ED3UXLIy36P9Ao7W75rYg== +"@babel/traverse@^7.13.0", "@babel/traverse@^7.16.0", "@babel/traverse@^7.16.7", "@babel/traverse@^7.20.10", "@babel/traverse@^7.20.12", "@babel/traverse@^7.20.7", "@babel/traverse@^7.7.2": + version "7.20.12" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.20.12.tgz#7f0f787b3a67ca4475adef1f56cb94f6abd4a4b5" + integrity sha512-MsIbFN0u+raeja38qboyF8TIT7K0BFzz/Yd/77ta4MsUsmP2RAnidIlwq7d5HFQrH/OZJecGV6B71C4zAgpoSQ== dependencies: "@babel/code-frame" "^7.18.6" - "@babel/generator" "^7.18.9" + "@babel/generator" "^7.20.7" "@babel/helper-environment-visitor" "^7.18.9" - "@babel/helper-function-name" "^7.18.9" + "@babel/helper-function-name" "^7.19.0" "@babel/helper-hoist-variables" "^7.18.6" "@babel/helper-split-export-declaration" "^7.18.6" - "@babel/parser" "^7.18.9" - "@babel/types" "^7.18.9" + "@babel/parser" "^7.20.7" + "@babel/types" "^7.20.7" debug "^4.1.0" globals "^11.1.0" -"@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.4.4": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" - integrity sha512-PJgg/k3SdLsGb3hhisFvtLOw5ts113klrpLuIPtCJIU+BB24fqq6lf8RWqKJEjzqXR9AEH1rIb5XTqwBHB+kQg== - dependencies: - "@babel/helper-validator-identifier" "^7.15.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.16.7", "@babel/types@^7.16.8": - version "7.16.8" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.8.tgz#0ba5da91dd71e0a4e7781a30f22770831062e3c1" - integrity sha512-smN2DQc5s4M7fntyjGtyIPbRJv6wW4rU/94fmYJ7PKQuZkC0qGMHXJbg6sNGt12JmVr4k5YaptI/XtiLJBnmIg== +"@babel/types@^7.0.0-beta.49", "@babel/types@^7.16.0", "@babel/types@^7.16.7", "@babel/types@^7.18.6", "@babel/types@^7.19.0", "@babel/types@^7.20.2", "@babel/types@^7.20.7", "@babel/types@^7.3.0", "@babel/types@^7.3.3", "@babel/types@^7.4.4": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.20.7.tgz#54ec75e252318423fc07fb644dc6a58a64c09b7f" + integrity sha512-69OnhBxSSgK0OzTJai4kyPDiKTIe3j+ctaHdIGVbRahTLAT7L3R9oeXHC2aVSuGYt3cVnoAMDmOCgJ2yaiLMvg== dependencies: - "@babel/helper-validator-identifier" "^7.16.7" - to-fast-properties "^2.0.0" - -"@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.3.0", "@babel/types@^7.3.3": - version "7.18.9" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.18.9.tgz#7148d64ba133d8d73a41b3172ac4b83a1452205f" - integrity sha512-WwMLAg2MvJmt/rKEVQBBhIVffMmnilX4oe0sRe7iPOHIGsqpruFHHdrfj4O1CMMtgMtCU4oPafZjDPCRgO57Wg== - dependencies: - "@babel/helper-validator-identifier" "^7.18.6" + "@babel/helper-string-parser" "^7.19.4" + "@babel/helper-validator-identifier" "^7.19.1" to-fast-properties "^2.0.0" "@cospired/i18n-iso-languages@^4.0.0": @@ -1462,6 +1301,18 @@ resolved "https://registry.yarnpkg.com/@emotion/weak-memoize/-/weak-memoize-0.2.5.tgz#8eed982e2ee6f7f4e44c253e12962980791efd46" integrity sha512-6U71C2Wp7r5XtFtQzYrW5iKFT67OixrSxjI4MptCHzdSVlgabczzqLe0ZSgnub/5Kp4hSbpDB1tMytZY9pwxxA== +"@eslint-community/eslint-utils@^4.2.0": + version "4.4.0" + resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59" + integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA== + dependencies: + eslint-visitor-keys "^3.3.0" + +"@eslint-community/regexpp@^4.6.1": + version "4.6.2" + resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.6.2.tgz#1816b5f6948029c5eaacb0703b850ee0cb37d8f8" + integrity sha512-pPTNuaAG3QMH+buKyBIGJs3g/S5y0caxw0ygM3YyE6yJFySwiGGSzA+mM3KJ8QQvzeLh3blwgSonkFjgQdxzMw== + "@eslint/eslintrc@^0.4.3": version "0.4.3" resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c" @@ -1477,6 +1328,26 @@ minimatch "^3.0.4" strip-json-comments "^3.1.1" +"@eslint/eslintrc@^2.1.2": + version "2.1.2" + resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-2.1.2.tgz#c6936b4b328c64496692f76944e755738be62396" + integrity sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g== + 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" + +"@eslint/js@^8.47.0": + version "8.47.0" + resolved "https://registry.yarnpkg.com/@eslint/js/-/js-8.47.0.tgz#5478fdf443ff8158f9de171c704ae45308696c7d" + integrity sha512-P6omY1zv5MItm93kLM8s2vr1HICJH8v0dvddDhysbIuZ+vcjOHg5Zbkf1mTkcmi2JA9oBG2anOkRnW8WJTS8Og== + "@faker-js/faker@^7.2.0": version "7.2.0" resolved "https://registry.yarnpkg.com/@faker-js/faker/-/faker-7.2.0.tgz#c5fe4c34f3a3664ac64fe1a21bac2004ea5faa22" @@ -1487,6 +1358,11 @@ resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.1.1.tgz#7dc996042d21fc1ae850e3173b5c67b0549f9105" integrity sha512-wVn5WJPirFTnzN6tR95abCx+ocH+3IFLXAgyavnf9hUmN0CfWoDjPT/BAWsUVwSlYYVBeCLJxaqi7ZGe4uSjBA== +"@fortawesome/fontawesome-common-types@6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-6.4.2.tgz#1766039cad33f8ad87f9467b98e0d18fbc8f01c5" + integrity sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA== + "@fortawesome/fontawesome-common-types@^0.2.36": version "0.2.36" resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-common-types/-/fontawesome-common-types-0.2.36.tgz#b44e52db3b6b20523e0c57ef8c42d315532cb903" @@ -1506,12 +1382,12 @@ dependencies: "@fortawesome/fontawesome-common-types" "6.1.1" -"@fortawesome/free-solid-svg-icons@^6.1.1": - version "6.1.1" - resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.1.1.tgz#3369e673f8fe8be2fba30b1ec274d47490a830a6" - integrity sha512-0/5exxavOhI/D4Ovm2r3vxNojGZioPwmFrKg0ZUH69Q68uFhFPs6+dhAToh6VEQBntxPRYPuT5Cg1tpNa9JUPg== +"@fortawesome/free-solid-svg-icons@^6.4.2": + version "6.4.2" + resolved "https://registry.yarnpkg.com/@fortawesome/free-solid-svg-icons/-/free-solid-svg-icons-6.4.2.tgz#33a02c4cb6aa28abea7bc082a9626b7922099df4" + integrity sha512-sYwXurXUEQS32fZz9hVCUUv/xu49PEJEyUOsA51l6PU/qVgfbTb2glsTEaJngVVT8VqBATRIdh7XVgV1JF1LkA== dependencies: - "@fortawesome/fontawesome-common-types" "6.1.1" + "@fortawesome/fontawesome-common-types" "6.4.2" "@fortawesome/react-fontawesome@^0.1.11": version "0.1.16" @@ -1520,6 +1396,15 @@ dependencies: prop-types "^15.7.2" +"@humanwhocodes/config-array@^0.11.10": + version "0.11.10" + resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.11.10.tgz#5a3ffe32cc9306365fb3fd572596cd602d5e12d2" + integrity sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ== + dependencies: + "@humanwhocodes/object-schema" "^1.2.1" + debug "^4.1.1" + minimatch "^3.0.5" + "@humanwhocodes/config-array@^0.5.0": version "0.5.0" resolved "https://registry.yarnpkg.com/@humanwhocodes/config-array/-/config-array-0.5.0.tgz#1407967d4c6eecd7388f83acf1eaf4d0c6e58ef9" @@ -1529,7 +1414,12 @@ debug "^4.1.1" minimatch "^3.0.4" -"@humanwhocodes/object-schema@^1.2.0": +"@humanwhocodes/module-importer@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz#af5b2691a22b44be847b0ca81641c5fb6ad0172c" + integrity sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA== + +"@humanwhocodes/object-schema@^1.2.0", "@humanwhocodes/object-schema@^1.2.1": version "1.2.1" resolved "https://registry.yarnpkg.com/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz#b520529ec21d8e5945a1851dfd1c32e94e39ff45" integrity sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA== @@ -1698,7 +1588,7 @@ resolved "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz#5bd262af94e9d25bd1e71b05deed44876a222e8b" integrity sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A== -"@nodelib/fs.walk@^1.2.3": +"@nodelib/fs.walk@^1.2.3", "@nodelib/fs.walk@^1.2.8": version "1.2.8" resolved "https://registry.yarnpkg.com/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz#e95737e8bb6746ddedf69c556953494f196fe69a" integrity sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg== @@ -1716,6 +1606,40 @@ resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.2.tgz#830beaec4b4091a9e9398ac50f865ddea52186b9" integrity sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA== +"@redis/bloom@1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@redis/bloom/-/bloom-1.2.0.tgz#d3fd6d3c0af3ef92f26767b56414a370c7b63b71" + integrity sha512-HG2DFjYKbpNmVXsa0keLHp/3leGJz1mjh09f2RLGGLQZzSHpkmZWuwJbAvo3QcRY8p80m5+ZdXZdYOSBLlp7Cg== + +"@redis/client@1.5.6": + version "1.5.6" + resolved "https://registry.yarnpkg.com/@redis/client/-/client-1.5.6.tgz#869cc65718d7d5493ef655a71dc40f3bc64a1b28" + integrity sha512-dFD1S6je+A47Lj22jN/upVU2fj4huR7S9APd7/ziUXsIXDL+11GPYti4Suv5y8FuXaN+0ZG4JF+y1houEJ7ToA== + dependencies: + cluster-key-slot "1.1.2" + generic-pool "3.9.0" + yallist "4.0.0" + +"@redis/graph@1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@redis/graph/-/graph-1.1.0.tgz#cc2b82e5141a29ada2cce7d267a6b74baa6dd519" + integrity sha512-16yZWngxyXPd+MJxeSr0dqh2AIOi8j9yXKcKCwVaKDbH3HTuETpDVPcLujhFYVPtYrngSco31BUcSa9TH31Gqg== + +"@redis/json@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@redis/json/-/json-1.0.4.tgz#f372b5f93324e6ffb7f16aadcbcb4e5c3d39bda1" + integrity sha512-LUZE2Gdrhg0Rx7AN+cZkb1e6HjoSKaeeW8rYnt89Tly13GBI5eP4CwDVr+MY8BAYfCg4/N15OUrtLoona9uSgw== + +"@redis/search@1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@redis/search/-/search-1.1.2.tgz#6a8f66ba90812d39c2457420f859ce8fbd8f3838" + integrity sha512-/cMfstG/fOh/SsE+4/BQGeuH/JJloeWuH+qJzM8dbxuWvdWibWAOAHHCZTMPhV3xIlH4/cUEIA8OV5QnYpaVoA== + +"@redis/time-series@1.0.4": + version "1.0.4" + resolved "https://registry.yarnpkg.com/@redis/time-series/-/time-series-1.0.4.tgz#af85eb080f6934580e4d3b58046026b6c2b18717" + integrity sha512-ThUIgo2U/g7cCuZavucQTQzA9g9JbDDY2f64u3AbAoz/8vE2lt2U37LamDUVChhaDA3IRT9R6VvJwqnUfTJzng== + "@restart/context@^2.1.4": version "2.1.4" resolved "https://registry.yarnpkg.com/@restart/context/-/context-2.1.4.tgz#a99d87c299a34c28bd85bb489cb07bfd23149c02" @@ -1851,22 +1775,22 @@ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40" integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== -"@types/express-serve-static-core@^4.17.18": - version "4.17.26" - resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.26.tgz#5d9a8eeecb9d5f9d7fc1d85f541512a84638ae88" - integrity sha512-zeu3tpouA043RHxW0gzRxwCHchMgftE8GArRsvYT0ByDMbn19olQHx5jLue0LxWY6iYtXb7rXmuVtSkhy9YZvQ== +"@types/express-serve-static-core@^4.17.31": + version "4.17.32" + resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.32.tgz#93dda387f5516af616d8d3f05f2c4c79d81e1b82" + integrity sha512-aI5h/VOkxOF2Z1saPy0Zsxs5avets/iaiAJYznQFm5By/pamU31xWKL//epiF4OfUA2qTOc9PV6tCUjhO8wlZA== dependencies: "@types/node" "*" "@types/qs" "*" "@types/range-parser" "*" -"@types/express@^4.17.13": - version "4.17.13" - resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.13.tgz#a76e2995728999bab51a33fabce1d705a3709034" - integrity sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA== +"@types/express@^4.17.15": + version "4.17.15" + resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.15.tgz#9290e983ec8b054b65a5abccb610411953d417ff" + integrity sha512-Yv0k4bXGOH+8a+7bELd2PqHQsuiANB+A8a4gnQrkRWzrkKlb6KHaVvyXhqs04sVW/OWlbPyYxRgYlIXLfrufMQ== dependencies: "@types/body-parser" "*" - "@types/express-serve-static-core" "^4.17.18" + "@types/express-serve-static-core" "^4.17.31" "@types/qs" "*" "@types/serve-static" "*" @@ -1927,10 +1851,10 @@ resolved "https://registry.yarnpkg.com/@types/json5/-/json5-0.0.29.tgz#ee28707ae94e11d2b827bcbe5270bcea7f3e71ee" integrity sha1-7ihweulOEdK4J7y+UnC86n8+ce4= -"@types/lodash@^4.14.164": - version "4.14.177" - resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.177.tgz#f70c0d19c30fab101cad46b52be60363c43c4578" - integrity sha512-0fDwydE2clKe9MNfvXHBHF9WEahRuj+msTuQqOmAApNORFvhMYZKNGGJdCzuhheVjMps/ti0Ak/iJPACMaevvw== +"@types/lodash@^4.14.191": + version "4.14.191" + resolved "https://registry.yarnpkg.com/@types/lodash/-/lodash-4.14.191.tgz#09511e7f7cba275acd8b419ddac8da9a6a79e2fa" + integrity sha512-BdZ5BCCvho3EIXw6wUCXHe7rS53AIDPLE+JzwgT+OsJk53oBfbSmZZ7CX4VaRoN78N+TJpFi9QPlfIVNmJYWxQ== "@types/mime@^1": version "1.3.2" @@ -2310,13 +2234,13 @@ abbrev@1: resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== -accepts@~1.3.5, accepts@~1.3.7: - version "1.3.7" - resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz#531bc726517a3b2b41f850021c6cc15eaab507cd" - integrity sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA== +accepts@~1.3.5, accepts@~1.3.8: + version "1.3.8" + resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.8.tgz#0bf0be125b67014adcb0b0921e62db7bffe16b2e" + integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw== dependencies: - mime-types "~2.1.24" - negotiator "0.6.2" + mime-types "~2.1.34" + negotiator "0.6.3" acorn-globals@^6.0.0: version "6.0.0" @@ -2331,7 +2255,7 @@ acorn-import-assertions@^1.7.6: resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9" integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw== -acorn-jsx@^5.2.0, acorn-jsx@^5.3.1: +acorn-jsx@^5.3.1, acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz#7ed5bb55908b3b2f1bc55c6af1653bada7f07937" integrity sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ== @@ -2351,11 +2275,16 @@ acorn@^7.1.1, acorn@^7.4.0: resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa" integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== -acorn@^8.0.4, acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1: +acorn@^8.0.4, acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1: version "8.7.1" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.7.1.tgz#0197122c843d1bf6d0a5e83220a788f278f63c30" integrity sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A== +acorn@^8.9.0: + version "8.10.0" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.10.0.tgz#8be5b3907a67221a81ab23c7889c4c5526b62ec5" + integrity sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw== + adjust-sourcemap-loader@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" @@ -2405,7 +2334,7 @@ ajv-keywords@^5.0.0: dependencies: fast-deep-equal "^3.1.3" -ajv@^6.10.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: +ajv@^6.10.0, ajv@^6.12.4, ajv@^6.12.5: version "6.12.6" resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== @@ -2437,29 +2366,17 @@ ansi-colors@4.1.1, ansi-colors@^4.1.1: resolved "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-4.1.1.tgz#cbb9ae256bf750af1eab344f229aa27fe94ba348" integrity sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA== -ansi-escapes@^4.2.1: - version "4.3.2" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.2.tgz#6b2291d1db7d98b6521d5f1efa42d0f3a9feb65e" - integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== - dependencies: - type-fest "^0.21.3" - ansi-html-community@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41" integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw== -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.1.tgz#164daac87ab2d6f6db3a29875e2d1766582dabed" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-styles@^3.2.0, ansi-styles@^3.2.1: +ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== @@ -2498,26 +2415,6 @@ argparse@^2.0.1: resolved "https://registry.yarnpkg.com/argparse/-/argparse-2.0.1.tgz#246f50f3ca78a3240f6c997e8a9bd1eac49e4b38" integrity sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q== -arr-diff@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz#d6461074febfec71e7e15235761a329a5dc7c520" - integrity sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA= - -arr-flatten@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz#36048bbff4e7b47e136644316c99669ea5ae91f1" - integrity sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg== - -arr-union@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz#e39b09aea9def866a8f206e288af63919bae39c4" - integrity sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ= - -array-each@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/array-each/-/array-each-1.0.1.tgz#a794af0c05ab1752846ee753a1f211a05ba0c44f" - integrity sha1-p5SvDAWrF1KEbudTofIRoFugxE8= - array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" @@ -2539,11 +2436,6 @@ array-move@^3.0.1: resolved "https://registry.yarnpkg.com/array-move/-/array-move-3.0.1.tgz#179645cc0987b65953a4fc06b6df9045e4ba9618" integrity sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg== -array-slice@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/array-slice/-/array-slice-1.1.0.tgz#e368ea15f89bc7069f7ffb89aec3a6c7d4ac22d4" - integrity sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w== - array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -2561,11 +2453,6 @@ array-uniq@^1.0.1: resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= -array-unique@^0.3.2: - version "0.3.2" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz#a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428" - integrity sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg= - array.prototype.filter@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/array.prototype.filter/-/array.prototype.filter-1.0.1.tgz#20688792acdb97a09488eaaee9eebbf3966aae21" @@ -2621,16 +2508,6 @@ assertion-error@^1.1.0: resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.1.0.tgz#e60b6b0e8f301bd97e5375215bda406c85118c0b" integrity sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw== -assign-symbols@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz#59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367" - integrity sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c= - -astral-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz#6c8c3fb827dd43ee3918f27b82782ab7658a6fd9" - integrity sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg== - astral-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/astral-regex/-/astral-regex-2.0.0.tgz#483143c567aeed4785759c0865786dc77d7d2e31" @@ -2641,11 +2518,6 @@ asynckit@^0.4.0: resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" integrity sha1-x57Zf380y48robyXkLzDZkdLS3k= -atob@^2.1.2: - version "2.1.2" - resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz#6d9517eb9e030d2436666651e86bd9f6f13533c9" - integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg== - babel-loader@^8.2.2: version "8.2.3" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.3.tgz#8986b40f1a64cacfcb4b8429320085ef68b1342d" @@ -2759,19 +2631,6 @@ base64url@3.x.x: resolved "https://registry.yarnpkg.com/base64url/-/base64url-3.0.1.tgz#6399d572e2bc3f90a9a8b22d5dbb0a32d33f788d" integrity sha512-ir1UPr3dkwexU7FdV8qBBbNDRUhMmIekYMFZfi+C/sLNnRESKPl23nB9b2pltqfOQNnGzsDdId90AEtG5tCx4A== -base@^0.11.1: - version "0.11.2" - resolved "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz#7bde5ced145b6d551a90db87f83c558b4eb48a8f" - integrity sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg== - dependencies: - cache-base "^1.0.1" - class-utils "^0.3.5" - component-emitter "^1.2.1" - define-property "^1.0.0" - isobject "^3.0.1" - mixin-deep "^1.2.0" - pascalcase "^0.1.1" - basic-auth@~2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/basic-auth/-/basic-auth-2.0.1.tgz#b998279bf47ce38344b4f3cf916d4679bbf51e3a" @@ -2794,47 +2653,48 @@ bluebird@^3.7.2: resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg== -body-parser@1.19.1: - version "1.19.1" - resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.1.tgz#1499abbaa9274af3ecc9f6f10396c995943e31d4" - integrity sha512-8ljfQi5eBk8EJfECMrgqNGWPEY5jWP+1IzkzkGdFFEwFQZZyaZ21UqdaHktgiMlH0xLHqIFtE/u2OYE5dOtViA== +body-parser@1.20.1: + version "1.20.1" + resolved "https://registry.yarnpkg.com/body-parser/-/body-parser-1.20.1.tgz#b1812a8912c195cd371a3ee5e66faa2338a5c668" + integrity sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw== dependencies: - bytes "3.1.1" + bytes "3.1.2" content-type "~1.0.4" debug "2.6.9" - depd "~1.1.2" - http-errors "1.8.1" + depd "2.0.0" + destroy "1.2.0" + http-errors "2.0.0" iconv-lite "0.4.24" - on-finished "~2.3.0" - qs "6.9.6" - raw-body "2.4.2" + on-finished "2.4.1" + qs "6.11.0" + raw-body "2.5.1" type-is "~1.6.18" + unpipe "1.0.0" -bookbrainz-data@3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/bookbrainz-data/-/bookbrainz-data-3.0.0.tgz#87e345243132daed3d0d1bc68b376fe3fa9f6d29" - integrity sha512-L5jijPCmAZBmXVaCDIEin2oM8q2BfdP7L7UzJxlpcgPh2oT0Fq9OWgXwqDCiD5OZ1Fxq9k8bDuvCmz/VZ1hRWg== +bookbrainz-data@4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/bookbrainz-data/-/bookbrainz-data-4.0.0.tgz#7451db52ea16d54d4cf297fec5b90c0c35a207d0" + integrity sha512-Uh8YLasXWGxqOtBuM0UWxQ1oAEe8jaV0LEASuouYL3dO+Gelm4UrvSmdofK4JbVoyjZta9h4aD7R1rf+CBYYhQ== dependencies: - bookshelf "^1.2.0" - bookshelf-virtuals-plugin "^0.1.1" + bookshelf bookbrainz/bookshelf#1.3.0 + bookshelf-virtuals-plugin "^1.0.0" deep-diff "^1.0.2" immutable "^3.8.2" - knex "^0.21.12" + knex "^2.4.2" lodash "^4.17.21" moment "^2.29.1" pg "^8.6.0" -bookshelf-virtuals-plugin@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/bookshelf-virtuals-plugin/-/bookshelf-virtuals-plugin-0.1.1.tgz#cdd8c1609a4558a581ee684b5eadcf295afcf8ac" - integrity sha512-MFFjtzLoyWaGD7eMT2UZ8H00CHNk7M5WuSTxi+82gLJqbq0TyQdSQsKS5/NHfQjqd3wZKEV+yEbzpck2oBGe2A== +bookshelf-virtuals-plugin@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/bookshelf-virtuals-plugin/-/bookshelf-virtuals-plugin-1.0.0.tgz#4a6bea9936b5615558c4ef3281f668738a90d207" + integrity sha512-6W7H6YiOKEf93fevX/hW7Cs8sX6c7/XzZyQBHo/yGQTb2LPAt40Xehz5ZCj4om/n4N84fzcztTP3PzEuT/ItaA== dependencies: lodash "^4.17.15" -bookshelf@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/bookshelf/-/bookshelf-1.2.0.tgz#cb972aa2316405d3a4af9cb1e2814895ab23283e" - integrity sha512-rm04YpHkLej6bkNezKUQjzuXV30rbyEHQoaKvfQ3fOyLYxPeB18uBL+h2t6SmeXjfsB+aReMmbhkMF/lUTbtMA== +bookshelf@bookbrainz/bookshelf#1.3.0: + version "1.3.0" + resolved "https://codeload.github.com/bookbrainz/bookshelf/tar.gz/d4bf2ae1e8891d5fa6777b7814a3eaba86d71f34" dependencies: bluebird "^3.7.2" create-error "~0.3.1" @@ -2873,22 +2733,6 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" -braces@^2.3.1: - version "2.3.2" - resolved "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz#5979fd3f14cd531565e5fa2df1abfff1dfaee729" - integrity sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w== - dependencies: - arr-flatten "^1.1.0" - array-unique "^0.3.2" - extend-shallow "^2.0.1" - fill-range "^4.0.0" - isobject "^3.0.1" - repeat-element "^1.1.2" - snapdragon "^0.8.1" - snapdragon-node "^2.0.1" - split-string "^3.0.2" - to-regex "^3.0.1" - braces@^3.0.1, braces@~3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -2906,37 +2750,15 @@ browser-stdout@1.3.1: resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.1.tgz#baa559ee14ced73452229bad7326467c61fabd60" integrity sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw== -browserslist@^4.14.5, browserslist@^4.17.5, browserslist@^4.18.1: - version "4.18.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" - integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== - dependencies: - caniuse-lite "^1.0.30001280" - electron-to-chromium "^1.3.896" - escalade "^3.1.1" - node-releases "^2.0.1" - picocolors "^1.0.0" - -browserslist@^4.19.1: - version "4.20.0" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.20.0.tgz#35951e3541078c125d36df76056e94738a52ebe9" - integrity sha512-bnpOoa+DownbciXj0jVGENf8VYQnE2LNWomhYuCsMmmx9Jd9lwq0WXODuwpSsp8AVdKM2/HorrzxAfbKvWTByQ== - dependencies: - caniuse-lite "^1.0.30001313" - electron-to-chromium "^1.4.76" - escalade "^3.1.1" - node-releases "^2.0.2" - picocolors "^1.0.0" - -browserslist@^4.20.2: - version "4.21.2" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.2.tgz#59a400757465535954946a400b841ed37e2b4ecf" - integrity sha512-MonuOgAtUB46uP5CezYbRaYKBNt2LxP0yX+Pmj4LkcDFGkn9Cbpi83d9sCjwQDErXsIJSzY5oKGDbgOlF/LPAA== +browserslist@^4.14.5, browserslist@^4.18.1, browserslist@^4.19.1, browserslist@^4.21.3: + version "4.21.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.21.4.tgz#e7496bbc67b9e39dd0f98565feccdcb0d4ff6987" + integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw== dependencies: - caniuse-lite "^1.0.30001366" - electron-to-chromium "^1.4.188" + caniuse-lite "^1.0.30001400" + electron-to-chromium "^1.4.251" node-releases "^2.0.6" - update-browserslist-db "^1.0.4" + update-browserslist-db "^1.0.9" bser@2.1.1: version "2.1.1" @@ -2960,25 +2782,10 @@ bytes@3.0.0: resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz#d32815404d689699f85a4ea4fa8755dd13a96048" integrity sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg= -bytes@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.1.tgz#3f018291cb4cbad9accb6e6970bca9c8889e879a" - integrity sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg== - -cache-base@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz#0a7f46416831c8b662ee36fe4e7c59d76f666ab2" - integrity sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ== - dependencies: - collection-visit "^1.0.0" - component-emitter "^1.2.1" - get-value "^2.0.6" - has-value "^1.0.0" - isobject "^3.0.1" - set-value "^2.0.0" - to-object-path "^0.3.0" - union-value "^1.0.0" - unset-value "^1.0.0" +bytes@3.1.2: + version "3.1.2" + resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.2.tgz#8b0beeb98605adf1b128fa4386403c009e0221a5" + integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg== cacheable-request@^6.0.0: version "6.1.0" @@ -3021,20 +2828,10 @@ camelcase@^6.0.0, camelcase@^6.2.0: resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.2.1.tgz#250fd350cfd555d0d2160b1d51510eaf8326e86e" integrity sha512-tVI4q5jjFV5CavAU8DXfza/TJcZutVKo/5Foskmsqcm0MsL91moHvwiGNnqaa2o6PF/7yT5ikDRcVcl8Rj6LCA== -caniuse-lite@^1.0.30001280: - version "1.0.30001283" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001283.tgz#8573685bdae4d733ef18f78d44ba0ca5fe9e896b" - integrity sha512-9RoKo841j1GQFSJz/nCXOj0sD7tHBtlowjYlrqIUS812x9/emfBLBt6IyMz1zIaYc/eRL8Cs6HPUVi2Hzq4sIg== - -caniuse-lite@^1.0.30001313: - version "1.0.30001313" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001313.tgz#a380b079db91621e1b7120895874e2fd62ed2e2f" - integrity sha512-rI1UN0koZUiKINjysQDuRi2VeSCce3bYJNmDcj3PIKREiAmjakugBul1QSkg/fPrlULYl6oWfGg3PbgOSY9X4Q== - -caniuse-lite@^1.0.30001366: - version "1.0.30001367" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001367.tgz#2b97fe472e8fa29c78c5970615d7cd2ee414108a" - integrity sha512-XDgbeOHfifWV3GEES2B8rtsrADx4Jf+juKX2SICJcaUhjYBO3bR96kvEIHa15VU6ohtOhBZuPGGYGbXMRn0NCw== +caniuse-lite@^1.0.30001400: + version "1.0.30001442" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001442.tgz#40337f1cf3be7c637b061e2f78582dc1daec0614" + integrity sha512-239m03Pqy0hwxYPYR5JwOIxRJfLTWtle9FV8zosfV5pHg+/51uD4nxcUlM8+mWWGfwKtt8lJNHnD3cWw9VZ6ow== chai-arrays@^2.2.0: version "2.2.0" @@ -3079,7 +2876,7 @@ chai@^4.3.6: pathval "^1.1.1" type-detect "^4.0.5" -chalk@^2.0.0, chalk@^2.1.0: +chalk@^2.0.0: version "2.4.2" resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== @@ -3096,11 +2893,6 @@ chalk@^4.0.0, chalk@^4.1.0, chalk@^4.1.2: ansi-styles "^4.1.0" supports-color "^7.1.0" -chardet@^0.7.0: - version "0.7.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" - integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== - chart.js@^2.9.4: version "2.9.4" resolved "https://registry.yarnpkg.com/chart.js/-/chart.js-2.9.4.tgz#0827f9563faffb2dc5c06562f8eb10337d5b9684" @@ -3159,7 +2951,7 @@ cheerio@^1.0.0-rc.3: parse5 "^7.0.0" parse5-htmlparser2-tree-adapter "^7.0.0" -chokidar@3.5.2, chokidar@^3.4.0, chokidar@^3.5.2: +chokidar@3.5.2: version "3.5.2" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.2.tgz#dba3976fcadb016f66fd365021d91600d01c1e75" integrity sha512-ekGhOnNVPgT77r4K/U3GDhu+FQ2S8TnK/s2KbIGXi0SZWuwkZ2QNyfWdZW+TVfn84DpEP7rLeCt2UI6bJ8GwbQ== @@ -3174,7 +2966,7 @@ chokidar@3.5.2, chokidar@^3.4.0, chokidar@^3.5.2: optionalDependencies: fsevents "~2.3.2" -"chokidar@>=3.0.0 <4.0.0": +"chokidar@>=3.0.0 <4.0.0", chokidar@^3.4.0, chokidar@^3.5.2: version "3.5.3" resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd" integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw== @@ -3204,20 +2996,10 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.3.2.tgz#6d2967ffa407466481c6c90b6e16b3098f080128" integrity sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg== -class-utils@^0.3.5: - version "0.3.6" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" - integrity sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg== - dependencies: - arr-union "^3.1.0" - define-property "^0.2.5" - isobject "^3.0.0" - static-extend "^0.1.1" - -classnames@^2.2.6, classnames@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.1.tgz#dfcfa3891e306ec1dad105d0e88f4417b8535e8e" - integrity sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA== +classnames@^2.2.6, classnames@^2.3.1, classnames@^2.3.2: + version "2.3.2" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.3.2.tgz#351d813bf0137fcc6a76a16b88208d2560a0d924" + integrity sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw== clean-webpack-plugin@^4.0.0: version "4.0.0" @@ -3242,13 +3024,6 @@ cli-color@^2.0.1: memoizee "^0.4.15" timers-ext "^0.1.7" -cli-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz#264305a7ae490d1d03bf0c9ba7c925d1753af307" - integrity sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw== - dependencies: - restore-cursor "^3.1.0" - cli-sprintf-format@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/cli-sprintf-format/-/cli-sprintf-format-1.1.1.tgz#ec69955c89ef1c61243b52e68015b75c08fb9188" @@ -3259,11 +3034,6 @@ cli-sprintf-format@^1.1.1: sprintf-kit "^2.0.1" supports-color "^6.1.0" -cli-width@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-3.0.0.tgz#a2f48437a2caa9a22436e794bf071ec9e61cedf6" - integrity sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw== - cliui@^7.0.2: version "7.0.4" resolved "https://registry.yarnpkg.com/cliui/-/cliui-7.0.4.tgz#a0265ee655476fc807aea9df3df8df7783808b4f" @@ -3294,19 +3064,16 @@ clone@^1.0.2: resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= +cluster-key-slot@1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz#88ddaa46906e303b5de30d3153b7d9fe0a0c19ac" + integrity sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA== + collect-v8-coverage@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz#cc2c8e94fc18bbdffe64d6534570c8a673b27f59" integrity sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg== -collection-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz#4bc0373c164bc3291b4d368c829cf1a80a59dca0" - integrity sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA= - dependencies: - map-visit "^1.0.0" - object-visit "^1.0.0" - color-convert@^1.9.0, color-convert@^1.9.3: version "1.9.3" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" @@ -3331,10 +3098,10 @@ color-name@^1.0.0, color-name@~1.1.4: resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== -colorette@1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/colorette/-/colorette-1.2.1.tgz#4d0b921325c14faf92633086a536db6e89564b1b" - integrity sha512-puCDz0CzydiSYOrnXpz/PKd69zRrribezjtE9yd4zvytoRc8+RY/KJPvtPFKZS3E3wP6neGyMe0vOTlHO5L3Pw== +colorette@2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798" + integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ== colorette@^2.0.10, colorette@^2.0.14: version "2.0.16" @@ -3353,7 +3120,12 @@ commander@6.2.0: resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.0.tgz#b990bfb8ac030aedc6d11bc04d1488ffef56db75" integrity sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q== -commander@^2.19.0, commander@^2.20.0, commander@^2.7.1: +commander@^10.0.0: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.19.0, commander@^2.20.0: version "2.20.3" resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== @@ -3363,22 +3135,22 @@ commander@^4.0.1: resolved "https://registry.yarnpkg.com/commander/-/commander-4.1.1.tgz#9fd602bd936294e9e9ef46a3f4d6964044b18068" integrity sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA== -commander@^6.2.0: - version "6.2.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-6.2.1.tgz#0792eb682dfbc325999bb2b84fddddba110ac73c" - integrity sha512-U7VdrJFnJgo4xjrHpTzu0yrHPGImdsmD95ZlgYSEajAn2JKzDhDTPG9kBTefmObL2w/ngeZnilk+OV9CG3d7UA== - commander@^7.0.0, commander@^7.2.0: version "7.2.0" resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== +commander@^9.1.0: + version "9.5.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-9.5.0.tgz#bc08d1eb5cedf7ccb797a96199d41c7bc3e60d30" + integrity sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ== + commondir@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz#ddd800da0c66127393cca5950ea968a3aaf1253b" integrity sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs= -component-emitter@^1.2.0, component-emitter@^1.2.1, component-emitter@^1.3.0: +component-emitter@^1.2.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== @@ -3428,10 +3200,10 @@ configstore@^5.0.1: write-file-atomic "^3.0.0" xdg-basedir "^4.0.0" -connect-redis@^6.0.0: - version "6.0.0" - resolved "https://registry.yarnpkg.com/connect-redis/-/connect-redis-6.0.0.tgz#7e443fc7028eca43302bee59f51a315f65cd56b5" - integrity sha512-6eGEAAPHYvcfbRNCMmPzBIjrqRWLw7at9lCUH4G6NQ8gwWDJelaUmFNOqPIhehbw941euVmIuqWsaWiKXfb+5g== +connect-redis@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/connect-redis/-/connect-redis-7.0.0.tgz#8a322a5f43146aaff1644aa6355a6527007dd23b" + integrity sha512-f7TlBs7J0Zz6y3mSKArBEN6qQ3T8BzsD1+tFSnnbvvCG1PjHllsQU/L7dTEaJsuZgzl/XU9hz+DMiPq1UJQMAQ== content-disposition@0.5.4: version "0.5.4" @@ -3462,15 +3234,15 @@ cookie@0.4.1: resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.4.1.tgz#afd713fe26ebd21ba95ceb61f9a8116e50a537d1" integrity sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA== -cookiejar@^2.1.0, cookiejar@^2.1.1, cookiejar@^2.1.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.3.tgz#fc7a6216e408e74414b90230050842dacda75acc" - integrity sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ== +cookie@0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" + integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -copy-descriptor@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz#676f6eb3c39997c2ee1ac3a924fd6124748f578d" - integrity sha1-Z29us8OZl8LuGsOpJP1hJHSPV40= +cookiejar@^2.1.0, cookiejar@^2.1.1, cookiejar@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/cookiejar/-/cookiejar-2.1.4.tgz#ee669c1fea2cf42dc31585469d193fef0d65771b" + integrity sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw== core-js-compat@^3.18.0, core-js-compat@^3.19.1: version "3.19.2" @@ -3521,17 +3293,6 @@ cross-env@^7.0.3: dependencies: cross-spawn "^7.0.1" -cross-spawn@^6.0.5: - version "6.0.5" - resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" - integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== - dependencies: - nice-try "^1.0.4" - path-key "^2.0.1" - semver "^5.5.0" - shebang-command "^1.2.0" - which "^1.2.9" - cross-spawn@^7.0.1, cross-spawn@^7.0.2, cross-spawn@^7.0.3: version "7.0.3" resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6" @@ -3639,24 +3400,17 @@ date-fns@^2.15.0, date-fns@^2.24.0: resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-2.28.0.tgz#9570d656f5fc13143e50c975a3b6bbeb46cd08b2" integrity sha512-8d35hViGYx/QH0icHYCeLmsLmMUheMmTyV9Fcm6gvNwdw31yXXH+O85sOBJ+OLnLQMKZowvpKb6FgMIQjcpvQw== -debug@2.6.9, debug@^2.2.0, debug@^2.3.3, debug@^2.6.9: +debug@2.6.9, debug@^2.6.9: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA== dependencies: ms "2.0.0" -debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.3: - version "4.3.3" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.3.tgz#04266e0b70a98d4462e6e288e38259213332b664" - integrity sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q== - dependencies: - ms "2.1.2" - -debug@4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee" - integrity sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ== +debug@4, debug@4.3.4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4: + version "4.3.4" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865" + integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ== dependencies: ms "2.1.2" @@ -3684,11 +3438,6 @@ decimal.js@^10.2.1, decimal.js@^10.3.1: resolved "https://registry.yarnpkg.com/decimal.js/-/decimal.js-10.3.1.tgz#d8c3a444a9c6774ba60ca6ad7261c3a94fd5e783" integrity sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ== -decode-uri-component@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.2.tgz#e69dbe25d37941171dd540e024c444cd5188e1e9" - integrity sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ== - decompress-response@^3.3.0: version "3.3.0" resolved "https://registry.yarnpkg.com/decompress-response/-/decompress-response-3.3.0.tgz#80a4dd323748384bfa248083622aedec982adff3" @@ -3752,28 +3501,6 @@ define-properties@^1.1.4: has-property-descriptors "^1.0.0" object-keys "^1.1.1" -define-property@^0.2.5: - version "0.2.5" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz#c35b1ef918ec3c990f9a5bc57be04aacec5c8116" - integrity sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY= - dependencies: - is-descriptor "^0.1.0" - -define-property@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz#769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6" - integrity sha1-dp66rz9KY6rTr56NMEybvnm/sOY= - dependencies: - is-descriptor "^1.0.0" - -define-property@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz#d459689e8d654ba77e02a817f8710d702cb16e9d" - integrity sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ== - dependencies: - is-descriptor "^1.0.2" - isobject "^3.0.1" - del@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz#9e8f117222ea44a31ff3a156c049b99052a9f0b4" @@ -3792,17 +3519,7 @@ delayed-stream@~1.0.0: resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" integrity sha1-3zrhmayt+31ECqrgsp4icrJOxhk= -denque@^1.5.0: - version "1.5.1" - resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" - integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== - -depd@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" - integrity sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak= - -depd@~2.0.0: +depd@2.0.0, depd@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw== @@ -3812,20 +3529,15 @@ dequal@^2.0.2: resolved "https://registry.yarnpkg.com/dequal/-/dequal-2.0.2.tgz#85ca22025e3a87e65ef75a7a437b35284a7e319d" integrity sha512-q9K8BlJVxK7hQYqa6XISGmBZbtQQWVXSrRrWreHC94rMt1QL/Impruc+7p2CYSYuVIUr+YCt6hjrs1kkdJRTug== -destroy@~1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz#978857442c44749e4206613e37946205826abd80" - integrity sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA= - -detect-file@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/detect-file/-/detect-file-1.0.0.tgz#f0d66d03672a825cb1b73bdb3fe62310c8e552b7" - integrity sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc= +destroy@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/destroy/-/destroy-1.2.0.tgz#4803735509ad8be552934c67df614f94e66fa015" + integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg== -dezalgo@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.3.tgz#7f742de066fc748bc8db820569dddce49bf0d456" - integrity sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY= +dezalgo@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/dezalgo/-/dezalgo-1.0.4.tgz#751235260469084c132157dfa857f386d4c33d81" + integrity sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig== dependencies: asap "^2.0.0" wrappy "1" @@ -3963,25 +3675,10 @@ ee-first@1.1.1: resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.896: - version "1.4.7" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.7.tgz#58e0b4ec9096ee1422e4d9e83ceeb05b0cf076eb" - integrity sha512-UPy2MsQw1OdcbxR7fvwWZH/rXcv+V26+uvQVHx0fGa1kqRfydtfOw+NMGAvZJ63hyaH4aEBxbhSEtqbpliSNWA== - -electron-to-chromium@^1.4.188: - version "1.4.195" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.195.tgz#139b2d95a42a3f17df217589723a1deac71d1473" - integrity sha512-vefjEh0sk871xNmR5whJf9TEngX+KTKS3hOHpjoMpauKkwlGwtMz1H8IaIjAT/GNnX0TbGwAdmVoXCAzXf+PPg== - -electron-to-chromium@^1.4.76: - version "1.4.76" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.76.tgz#a0494baedaf51094b1c172999919becd9975a934" - integrity sha512-3Vftv7cenJtQb+k00McEBZ2vVmZ/x+HEF7pcZONZIkOsESqAqVuACmBxMv0JhzX7u0YltU0vSqRqgBSTAhFUjA== - -emoji-regex@^7.0.1: - version "7.0.3" - resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz#933a04052860c85e83c122479c4748a8e4c72156" - integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA== +electron-to-chromium@^1.4.251: + version "1.4.284" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz#61046d1e4cab3a25238f6bf7413795270f125592" + integrity sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA== emoji-regex@^8.0.0: version "8.0.0" @@ -4005,10 +3702,10 @@ end-of-stream@^1.1.0: dependencies: once "^1.4.0" -enhanced-resolve@^5.8.3: - version "5.8.3" - resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.8.3.tgz#6d552d465cce0423f5b3d718511ea53826a7b2f0" - integrity sha512-EGAbGvH7j7Xt2nc0E7D99La1OiEs8LnyimkRgwExpUMScN6O+3x9tIWs7PLQZVNx4YD+00skHXPXi1yQHpAmZA== +enhanced-resolve@^5.10.0: + version "5.12.0" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634" + integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ== dependencies: graceful-fs "^4.2.4" tapable "^2.2.0" @@ -4346,7 +4043,7 @@ eslint-rule-composer@^0.3.0: resolved "https://registry.yarnpkg.com/eslint-rule-composer/-/eslint-rule-composer-0.3.0.tgz#79320c927b0c5c0d3d3d2b76c8b4a488f25bbaf9" integrity sha512-bt+Sh8CtDmn2OajxvNO+BX7Wn4CIWMpTRm3MaiKPCQcnnlm0CS2mhui6QaoeQugs+3Kj2ESKEEGJUdVafwhiCg== -eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: +eslint-scope@5.1.1, eslint-scope@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== @@ -4354,12 +4051,13 @@ eslint-scope@5.1.1, eslint-scope@^5.0.0, eslint-scope@^5.1.1: esrecurse "^4.3.0" estraverse "^4.1.1" -eslint-utils@^1.4.3: - version "1.4.3" - resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.4.3.tgz#74fec7c54d0776b6f67e0251040b5806564e981f" - integrity sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q== +eslint-scope@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-7.2.2.tgz#deb4f92563390f32006894af62a22dba1c46423f" + integrity sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg== dependencies: - eslint-visitor-keys "^1.1.0" + esrecurse "^4.3.0" + estraverse "^5.2.0" eslint-utils@^2.0.0, eslint-utils@^2.1.0: version "2.1.0" @@ -4385,6 +4083,11 @@ eslint-visitor-keys@^2.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz#f65328259305927392c938ed44eb0a5c9b2bd303" integrity sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw== +eslint-visitor-keys@^3.3.0, eslint-visitor-keys@^3.4.1, eslint-visitor-keys@^3.4.3: + version "3.4.3" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz#0cd72fe8550e3c2eae156a96a4dddcd1c8ac5800" + integrity sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag== + eslint-webpack-plugin@^2.4.1: version "2.6.0" resolved "https://registry.yarnpkg.com/eslint-webpack-plugin/-/eslint-webpack-plugin-2.6.0.tgz#3bd4ada4e539cb1f6687d2f619073dbb509361cd" @@ -4397,49 +4100,6 @@ eslint-webpack-plugin@^2.4.1: normalize-path "^3.0.0" schema-utils "^3.1.1" -eslint@^6.8.0: - version "6.8.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-6.8.0.tgz#62262d6729739f9275723824302fb227c8c93ffb" - integrity sha512-K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig== - dependencies: - "@babel/code-frame" "^7.0.0" - ajv "^6.10.0" - chalk "^2.1.0" - cross-spawn "^6.0.5" - debug "^4.0.1" - doctrine "^3.0.0" - eslint-scope "^5.0.0" - eslint-utils "^1.4.3" - eslint-visitor-keys "^1.1.0" - espree "^6.1.2" - esquery "^1.0.1" - esutils "^2.0.2" - file-entry-cache "^5.0.1" - functional-red-black-tree "^1.0.1" - glob-parent "^5.0.0" - globals "^12.1.0" - ignore "^4.0.6" - import-fresh "^3.0.0" - imurmurhash "^0.1.4" - inquirer "^7.0.0" - is-glob "^4.0.0" - js-yaml "^3.13.1" - json-stable-stringify-without-jsonify "^1.0.1" - levn "^0.3.0" - lodash "^4.17.14" - minimatch "^3.0.4" - mkdirp "^0.5.1" - natural-compare "^1.4.0" - optionator "^0.8.3" - progress "^2.0.0" - regexpp "^2.0.1" - semver "^6.1.2" - strip-ansi "^5.2.0" - strip-json-comments "^3.0.1" - table "^5.2.3" - text-table "^0.2.0" - v8-compile-cache "^2.0.3" - eslint@^7.30.0: version "7.32.0" resolved "https://registry.yarnpkg.com/eslint/-/eslint-7.32.0.tgz#c6d328a14be3fb08c8d1d21e12c02fdb7a2a812d" @@ -4486,20 +4146,54 @@ eslint@^7.30.0: text-table "^0.2.0" v8-compile-cache "^2.0.3" +eslint@^8.47.0: + version "8.47.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-8.47.0.tgz#c95f9b935463fb4fad7005e626c7621052e90806" + integrity sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q== + dependencies: + "@eslint-community/eslint-utils" "^4.2.0" + "@eslint-community/regexpp" "^4.6.1" + "@eslint/eslintrc" "^2.1.2" + "@eslint/js" "^8.47.0" + "@humanwhocodes/config-array" "^0.11.10" + "@humanwhocodes/module-importer" "^1.0.1" + "@nodelib/fs.walk" "^1.2.8" + ajv "^6.12.4" + 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.2" + eslint-visitor-keys "^3.4.3" + espree "^9.6.1" + 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" + 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" + text-table "^0.2.0" + esm@^3.2.25: version "3.2.25" resolved "https://registry.yarnpkg.com/esm/-/esm-3.2.25.tgz#342c18c29d56157688ba5ce31f8431fbb795cc10" integrity sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA== -espree@^6.1.2: - version "6.2.1" - resolved "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz#77fc72e1fd744a2052c20f38a5b575832e82734a" - integrity sha512-ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw== - dependencies: - acorn "^7.1.1" - acorn-jsx "^5.2.0" - eslint-visitor-keys "^1.1.0" - espree@^7.3.0, espree@^7.3.1: version "7.3.1" resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6" @@ -4509,18 +4203,34 @@ espree@^7.3.0, espree@^7.3.1: acorn-jsx "^5.3.1" eslint-visitor-keys "^1.3.0" +espree@^9.6.0, espree@^9.6.1: + version "9.6.1" + resolved "https://registry.yarnpkg.com/espree/-/espree-9.6.1.tgz#a2a17b8e434690a5432f2f8018ce71d331a48c6f" + integrity sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ== + dependencies: + acorn "^8.9.0" + acorn-jsx "^5.3.2" + eslint-visitor-keys "^3.4.1" + esprima@^4.0.0, esprima@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== -esquery@^1.0.1, esquery@^1.4.0: +esquery@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.4.0.tgz#2148ffc38b82e8c7057dfed48425b3e61f0f24a5" integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w== dependencies: estraverse "^5.1.0" +esquery@^1.4.2: + version "1.5.0" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.5.0.tgz#6ce17738de8577694edd7361c57182ac8cb0db0b" + integrity sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg== + dependencies: + estraverse "^5.1.0" + esrecurse@^4.3.0: version "4.3.0" resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" @@ -4561,26 +4271,6 @@ events@^3.2.0: resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== -expand-brackets@^2.1.4: - version "2.1.4" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz#b77735e315ce30f6b6eff0f83b04151a22449622" - integrity sha1-t3c14xXOMPa27/D4OwQVGiJEliI= - dependencies: - debug "^2.3.3" - define-property "^0.2.5" - extend-shallow "^2.0.1" - posix-character-classes "^0.1.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - -expand-tilde@^2.0.0, expand-tilde@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/expand-tilde/-/expand-tilde-2.0.2.tgz#97e801aa052df02454de46b02bf621642cdc8502" - integrity sha1-l+gBqgUt8CRU3kawK/YhZCzchQI= - dependencies: - homedir-polyfill "^1.0.1" - expect@^28.1.3: version "28.1.3" resolved "https://registry.yarnpkg.com/expect/-/expect-28.1.3.tgz#90a7c1a124f1824133dd4533cce2d2bdcb6603ec" @@ -4613,38 +4303,39 @@ express-slow-down@^1.3.1: dependencies: defaults "^1.0.3" -express@^4.17.2: - version "4.17.2" - resolved "https://registry.yarnpkg.com/express/-/express-4.17.2.tgz#c18369f265297319beed4e5558753cc8c1364cb3" - integrity sha512-oxlxJxcQlYwqPWKVJJtvQiwHgosH/LrLSPA+H4UxpyvSS6jC5aH+5MoHFM+KABgTOt0APue4w66Ha8jCUo9QGg== +express@^4.18.2: + version "4.18.2" + resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59" + integrity sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ== dependencies: - accepts "~1.3.7" + accepts "~1.3.8" array-flatten "1.1.1" - body-parser "1.19.1" + body-parser "1.20.1" content-disposition "0.5.4" content-type "~1.0.4" - cookie "0.4.1" + cookie "0.5.0" cookie-signature "1.0.6" debug "2.6.9" - depd "~1.1.2" + depd "2.0.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" - finalhandler "~1.1.2" + finalhandler "1.2.0" fresh "0.5.2" + http-errors "2.0.0" merge-descriptors "1.0.1" methods "~1.1.2" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" path-to-regexp "0.1.7" proxy-addr "~2.0.7" - qs "6.9.6" + qs "6.11.0" range-parser "~1.2.1" safe-buffer "5.2.1" - send "0.17.2" - serve-static "1.14.2" + send "0.18.0" + serve-static "1.15.0" setprototypeof "1.2.0" - statuses "~1.5.0" + statuses "2.0.1" type-is "~1.6.18" utils-merge "1.0.1" vary "~1.1.2" @@ -4656,49 +4347,11 @@ ext@^1.1.2: dependencies: type "^2.5.0" -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - integrity sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8= - dependencies: - is-extendable "^0.1.0" - -extend-shallow@^3.0.0, extend-shallow@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz#26a71aaf073b39fb2127172746131c2704028db8" - integrity sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg= - dependencies: - assign-symbols "^1.0.0" - is-extendable "^1.0.1" - extend@^3.0.0: version "3.0.2" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz#f8b1136b4071fbd8eb140aff858b1019ec2915fa" integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g== -external-editor@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz#cb03f740befae03ea4d283caed2741a83f335495" - integrity sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew== - dependencies: - chardet "^0.7.0" - iconv-lite "^0.4.24" - tmp "^0.0.33" - -extglob@^2.0.4: - version "2.0.4" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" - integrity sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw== - dependencies: - array-unique "^0.3.2" - define-property "^1.0.0" - expand-brackets "^2.1.4" - extend-shallow "^2.0.1" - fragment-cache "^0.2.1" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - faker@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/faker/-/faker-4.1.0.tgz#1e45bbbecc6774b3c195fad2835109c6d748cc3f" @@ -4754,20 +4407,6 @@ fb-watchman@^2.0.0: dependencies: bser "2.1.1" -figures@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af" - integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== - dependencies: - escape-string-regexp "^1.0.5" - -file-entry-cache@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz#ca0f6efa6dd3d561333fb14515065c2fafdf439c" - integrity sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g== - dependencies: - flat-cache "^2.0.1" - file-entry-cache@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-6.0.1.tgz#211b2dd9659cb0394b073e7323ac3c933d522027" @@ -4783,16 +4422,6 @@ file-loader@^6.2.0: loader-utils "^2.0.0" schema-utils "^3.0.0" -fill-range@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" - integrity sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc= - dependencies: - extend-shallow "^2.0.1" - is-number "^3.0.0" - repeat-string "^1.6.1" - to-regex-range "^2.1.0" - fill-range@^7.0.1: version "7.0.1" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -4800,17 +4429,17 @@ fill-range@^7.0.1: dependencies: to-regex-range "^5.0.1" -finalhandler@~1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz#b7e7d000ffd11938d0fdb053506f6ebabe9f587d" - integrity sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA== +finalhandler@1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.2.0.tgz#7d23fe5731b207b4640e4fcd00aec1f9207a7b32" + integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg== dependencies: debug "2.6.9" encodeurl "~1.0.2" escape-html "~1.0.3" - on-finished "~2.3.0" + on-finished "2.4.1" parseurl "~1.3.3" - statuses "~1.5.0" + statuses "2.0.1" unpipe "~1.0.0" find-cache-dir@^2.0.0: @@ -4841,7 +4470,7 @@ find-root@^1.1.0: resolved "https://registry.yarnpkg.com/find-root/-/find-root-1.1.0.tgz#abcfc8ba76f708c42a97b3d685b7e9450bfb9ce4" integrity sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng== -find-up@5.0.0: +find-up@5.0.0, find-up@^5.0.0: version "5.0.0" resolved "https://registry.yarnpkg.com/find-up/-/find-up-5.0.0.tgz#4c92819ecb7083561e4f4a240a86be5198f536fc" integrity sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng== @@ -4864,41 +4493,6 @@ find-up@^4.0.0, find-up@^4.1.0: locate-path "^5.0.0" path-exists "^4.0.0" -findup-sync@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-3.0.0.tgz#17b108f9ee512dfb7a5c7f3c8b27ea9e1a9c08d1" - integrity sha512-YbffarhcicEhOrm4CtrwdKBdCuz576RLdhJDsIfvNtxUuhdRet1qZcsMjqbePtAseKdAnDyM/IyXbu7PRPRLYg== - dependencies: - detect-file "^1.0.0" - is-glob "^4.0.0" - micromatch "^3.0.4" - resolve-dir "^1.0.1" - -fined@^1.0.1: - version "1.2.0" - resolved "https://registry.yarnpkg.com/fined/-/fined-1.2.0.tgz#d00beccf1aa2b475d16d423b0238b713a2c4a37b" - integrity sha512-ZYDqPLGxDkDhDZBjZBb+oD1+j0rA4E0pXY50eplAAOPg2N/gUBSSk5IM1/QhPfyVo19lJ+CvXpqfvk+b2p/8Ng== - dependencies: - expand-tilde "^2.0.2" - is-plain-object "^2.0.3" - object.defaults "^1.1.0" - object.pick "^1.2.0" - parse-filepath "^1.0.1" - -flagged-respawn@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/flagged-respawn/-/flagged-respawn-1.0.1.tgz#e7de6f1279ddd9ca9aac8a5971d618606b3aab41" - integrity sha512-lNaHNVymajmk0OJMBn8fVUAU1BtDeKIqKoVhk4xAALB57aALg6b4W0MfJ/cUE0g9YBXy5XhSlPIpYIJ7HaY/3Q== - -flat-cache@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz#5d296d6f04bda44a4630a301413bdbc2ec085ec0" - integrity sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA== - dependencies: - flatted "^2.0.0" - rimraf "2.6.3" - write "1.0.3" - flat-cache@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-3.0.4.tgz#61b0338302b2fe9f957dcc32fc2a87f1c3048b11" @@ -4912,11 +4506,6 @@ flat@^5.0.2: resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== -flatted@^2.0.0: - version "2.0.2" - resolved "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz#4575b21e2bcee7434aa9be662f4b7b5f9c2b5138" - integrity sha512-r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA== - flatted@^3.1.0: version "3.2.4" resolved "https://registry.yarnpkg.com/flatted/-/flatted-3.2.4.tgz#28d9969ea90661b5134259f312ab6aa7929ac5e2" @@ -4929,18 +4518,6 @@ flux-standard-action@^0.6.1: dependencies: lodash.isplainobject "^3.2.0" -for-in@^1.0.1, for-in@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - integrity sha1-gQaNKVqBQuwKxybG4iAMMPttXoA= - -for-own@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-1.0.0.tgz#c63332f415cedc4b04dbfe70cf836494c53cb44b" - integrity sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs= - dependencies: - for-in "^1.0.1" - form-data@^2.3.1: version "2.5.1" resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.5.1.tgz#f2cbec57b5e59e23716e128fe44d4e5dd23895f4" @@ -4973,28 +4550,21 @@ formidable@^1.2.0: resolved "https://registry.yarnpkg.com/formidable/-/formidable-1.2.6.tgz#d2a51d60162bbc9b4a055d8457a7c75315d1a168" integrity sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ== -formidable@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.0.1.tgz#4310bc7965d185536f9565184dee74fbb75557ff" - integrity sha512-rjTMNbp2BpfQShhFbR3Ruk3qk2y9jKpvMW78nJgx8QKtxjDVrwbZG+wvDOmVbifHyOUOQJXxqEy6r0faRrPzTQ== +formidable@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/formidable/-/formidable-2.1.2.tgz#fa973a2bec150e4ce7cac15589d7a25fc30ebd89" + integrity sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g== dependencies: - dezalgo "1.0.3" - hexoid "1.0.0" - once "1.4.0" - qs "6.9.3" + dezalgo "^1.0.4" + hexoid "^1.0.0" + once "^1.4.0" + qs "^6.11.0" forwarded@0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/forwarded/-/forwarded-0.2.0.tgz#2269936428aad4c15c7ebe9779a84bf0b2a81811" integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow== -fragment-cache@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" - integrity sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk= - dependencies: - map-cache "^0.2.2" - fresh@0.5.2: version "0.5.2" resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz#3d8cadd90d976569fa835ab1f8e4b23a105605a7" @@ -5053,6 +4623,11 @@ functions-have-names@^1.2.2: resolved "https://registry.yarnpkg.com/functions-have-names/-/functions-have-names-1.2.3.tgz#0404fe4ee2ba2f607f0e0ec3c80bae994133b834" integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ== +generic-pool@3.9.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/generic-pool/-/generic-pool-3.9.0.tgz#36f4a678e963f4fdb8707eab050823abc4e8f5e4" + integrity sha512-hymDOu5B53XvN4QT9dBmZxPX4CWhBPPLguTZ9MMFeFa/Kg0xWVfylOVNlJji/E7yTZWFd/q9GO5TxDLq156D7g== + gensync@^1.0.0-beta.2: version "1.0.0-beta.2" resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" @@ -5104,23 +4679,25 @@ get-symbol-description@^1.0.0: call-bind "^1.0.2" get-intrinsic "^1.1.1" -get-value@^2.0.3, get-value@^2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz#dc15ca1c672387ca76bd37ac0a395ba2042a2c28" - integrity sha1-3BXKHGcjh8p2vTesCjlbogQqLCg= - -getopts@2.2.5: - version "2.2.5" - resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.2.5.tgz#67a0fe471cacb9c687d817cab6450b96dde8313b" - integrity sha512-9jb7AW5p3in+IiJWhQiZmmwkpLaR/ccTWdWQCtZM66HJcHHLegowh4q4tSD7gouUyeNvFWRavfK9GXosQHDpFA== +getopts@2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/getopts/-/getopts-2.3.0.tgz#71e5593284807e03e2427449d4f6712a268666f4" + integrity sha512-5eDf9fuSXwxBL6q5HX+dhDj+dslFGWzU5thZ9kNKUkcPtaPdatmUFKwHFrLb/uf/WpA4BHET+AX3Scl56cAjpA== -glob-parent@^5.0.0, glob-parent@^5.1.2, glob-parent@~5.1.2: +glob-parent@^5.1.2, glob-parent@~5.1.2: version "5.1.2" resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== dependencies: is-glob "^4.0.1" +glob-parent@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-6.0.2.tgz#6d237d99083950c79290f24c7642a3de9a28f9e3" + integrity sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A== + dependencies: + is-glob "^4.0.3" + glob-to-regexp@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" @@ -5150,19 +4727,7 @@ glob@7.1.7: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3: - version "7.2.0" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.0.tgz#d15535af7732e02e948f4c41628bd910293f6023" - integrity sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q== - 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" - -glob@^7.1.4: +glob@^7.0.0, glob@^7.0.3, glob@^7.1.1, glob@^7.1.3, glob@^7.1.4: version "7.2.3" resolved "https://registry.yarnpkg.com/glob/-/glob-7.2.3.tgz#b8df0fb802bbfa8e89bd1d938b4e16578ed44f2b" integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q== @@ -5181,26 +4746,6 @@ global-dirs@^3.0.0: dependencies: ini "2.0.0" -global-modules@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" - integrity sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg== - dependencies: - global-prefix "^1.0.1" - is-windows "^1.0.1" - resolve-dir "^1.0.0" - -global-prefix@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/global-prefix/-/global-prefix-1.0.2.tgz#dbf743c6c14992593c655568cb66ed32c0122ebe" - integrity sha1-2/dDxsFJklk8ZVVoy2btMsASLr4= - dependencies: - expand-tilde "^2.0.2" - homedir-polyfill "^1.0.1" - ini "^1.3.4" - is-windows "^1.0.1" - which "^1.2.14" - global@^4.3.0: version "4.4.0" resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406" @@ -5214,12 +4759,12 @@ globals@^11.1.0: resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== -globals@^12.1.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz#a18813576a41b00a24a97e7f815918c2e19925f8" - integrity sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg== +globals@^13.19.0: + version "13.21.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-13.21.0.tgz#163aae12f34ef502f5153cfbdd3600f36c63c571" + integrity sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg== dependencies: - type-fest "^0.8.1" + type-fest "^0.20.2" globals@^13.6.0, globals@^13.9.0: version "13.12.0" @@ -5273,6 +4818,11 @@ graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.9.tgz#041b05df45755e587a24942279b9d113146e1c96" integrity sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ== +graphemer@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/graphemer/-/graphemer-1.4.0.tgz#fb2f1d55e0e3a1849aeffc90c4fa0dd53a0e66c6" + integrity sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag== + growl@1.10.5: version "1.10.5" resolved "https://registry.yarnpkg.com/growl/-/growl-1.10.5.tgz#f2735dc2283674fa67478b10181059355c369e5e" @@ -5329,37 +4879,6 @@ has-tostringtag@^1.0.0: dependencies: has-symbols "^1.0.2" -has-value@^0.3.1: - version "0.3.1" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz#7b1f58bada62ca827ec0a2078025654845995e1f" - integrity sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8= - dependencies: - get-value "^2.0.3" - has-values "^0.1.4" - isobject "^2.0.0" - -has-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz#18b281da585b1c5c51def24c930ed29a0be6b177" - integrity sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc= - dependencies: - get-value "^2.0.6" - has-values "^1.0.0" - isobject "^3.0.0" - -has-values@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz#6d61de95d91dfca9b9a02089ad384bff8f62b771" - integrity sha1-bWHeldkd/Km5oCCJrThL/49it3E= - -has-values@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz#95b0b63fec2146619a6fe57fe75628d5a39efe4f" - integrity sha1-lbC2P+whRmGab+V/51Yo1aOe/k8= - dependencies: - is-number "^3.0.0" - kind-of "^4.0.0" - has-yarn@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/has-yarn/-/has-yarn-2.1.0.tgz#137e11354a7b5bf11aa5cb649cf0c6f3ff2b2e77" @@ -5377,7 +4896,7 @@ he@1.2.0: resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -hexoid@1.0.0: +hexoid@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/hexoid/-/hexoid-1.0.0.tgz#ad10c6573fb907de23d9ec63a711267d9dc9bc18" integrity sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g== @@ -5434,19 +4953,19 @@ htmlparser2@^8.0.1: entities "^4.3.0" http-cache-semantics@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.0.tgz#49e91c5cbf36c9b94bcfcd71c23d5249ec74e390" - integrity sha512-carPklcUh7ROWRK7Cv27RPtdhYhUsela/ue5/jKzjegVvXDqM2ILE9Q2BGn9JZJh1g87cp56su/FgQSzcWS8cQ== + version "4.1.1" + resolved "https://registry.yarnpkg.com/http-cache-semantics/-/http-cache-semantics-4.1.1.tgz#abe02fcb2985460bf0323be664436ec3476a6d5a" + integrity sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ== -http-errors@1.8.1: - version "1.8.1" - resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-1.8.1.tgz#7c3f28577cbc8a207388455dbd62295ed07bd68c" - integrity sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g== +http-errors@2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/http-errors/-/http-errors-2.0.0.tgz#b7774a1486ef73cf7667ac9ae0858c012c57b9d3" + integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ== dependencies: - depd "~1.1.2" + depd "2.0.0" inherits "2.0.4" setprototypeof "1.2.0" - statuses ">= 1.5.0 < 2" + statuses "2.0.1" toidentifier "1.0.1" http-proxy-agent@^4.0.1: @@ -5467,10 +4986,10 @@ http-proxy-agent@^5.0.0: agent-base "6" debug "4" -http-status@^1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/http-status/-/http-status-1.5.0.tgz#2edfb02068d236ba60fd1481ad89219aa96e1677" - integrity sha512-wcGvY31MpFNHIkUcXHHnvrE4IKYlpvitJw5P/1u892gMBAM46muQ+RH7UN1d+Ntnfx5apnOnVY6vcLmrWHOLwg== +http-status@^1.6.2: + version "1.6.2" + resolved "https://registry.yarnpkg.com/http-status/-/http-status-1.6.2.tgz#6dc05188a9856d67d96e48e8b4fd645c719ce82a" + integrity sha512-oUExvfNckrpTpDazph7kNG8sQi5au3BeTo0idaZFXEhTaJKu7GNJCLHI0rYY2wljm548MSTM+Ljj/c6anqu2zQ== https-proxy-agent@^5.0.0: version "5.0.0" @@ -5488,7 +5007,7 @@ https-proxy-agent@^5.0.1: agent-base "6" debug "4" -iconv-lite@0.4.24, iconv-lite@^0.4.24: +iconv-lite@0.4.24: version "0.4.24" resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== @@ -5522,6 +5041,11 @@ ignore@^5.1.1, ignore@^5.1.4, ignore@^5.1.8: resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.1.9.tgz#9ec1a5cbe8e1446ec60d4420060d43aa6e7382fb" integrity sha512-2zeMQpbKz5dhZ9IwL0gbxSW5w0NK/MSAMtNuhgIHEPmaU3vPdKPL0UdvUCXs5SS4JAwsBxysK5sFMW8ocFiVjQ== +ignore@^5.2.0: + version "5.2.4" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324" + integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ== + immutable@^3.8.2: version "3.8.2" resolved "https://registry.yarnpkg.com/immutable/-/immutable-3.8.2.tgz#c2439951455bb39913daf281376f1530e104adf3" @@ -5586,30 +5110,11 @@ ini@2.0.0: resolved "https://registry.yarnpkg.com/ini/-/ini-2.0.0.tgz#e5fd556ecdd5726be978fa1001862eacb0a94bc5" integrity sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA== -ini@^1.3.4, ini@~1.3.0: +ini@~1.3.0: version "1.3.8" resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer@^7.0.0: - version "7.3.3" - resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-7.3.3.tgz#04d176b2af04afc157a83fd7c100e98ee0aad003" - integrity sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA== - dependencies: - ansi-escapes "^4.2.1" - chalk "^4.1.0" - cli-cursor "^3.1.0" - cli-width "^3.0.0" - external-editor "^3.0.3" - figures "^3.0.0" - lodash "^4.17.19" - mute-stream "0.0.8" - run-async "^2.4.0" - rxjs "^6.6.0" - string-width "^4.1.0" - strip-ansi "^6.0.0" - through "^2.3.6" - internal-slot@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/internal-slot/-/internal-slot-1.0.3.tgz#7347e307deeea2faac2ac6205d4bc7d34967f59c" @@ -5649,28 +5154,6 @@ ipaddr.js@1.9.1: resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz#bff38543eeb8984825079ff3a2a8e6cbd46781b3" integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g== -is-absolute@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-absolute/-/is-absolute-1.0.0.tgz#395e1ae84b11f26ad1795e73c17378e48a301576" - integrity sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA== - dependencies: - is-relative "^1.0.0" - is-windows "^1.0.1" - -is-accessor-descriptor@^0.1.6: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz#a9e12cb3ae8d876727eeef3843f8a0897b5c98d6" - integrity sha1-qeEss66Nh2cn7u84Q/igiXtcmNY= - dependencies: - kind-of "^3.0.2" - -is-accessor-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz#169c2f6d3df1f992618072365c9b0ea1f6878656" - integrity sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ== - dependencies: - kind-of "^6.0.0" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" @@ -5698,11 +5181,6 @@ is-boolean-object@^1.0.1, is-boolean-object@^1.1.0: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-buffer@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" - integrity sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w== - is-callable@^1.1.4, is-callable@^1.1.5, is-callable@^1.2.4: version "1.2.4" resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.4.tgz#47301d58dd0259407865547853df6d61fe471945" @@ -5722,20 +5200,6 @@ is-core-module@^2.2.0, is-core-module@^2.8.1, is-core-module@^2.9.0: dependencies: has "^1.0.3" -is-data-descriptor@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz#0b5ee648388e2c860282e793f1856fec3f301b56" - integrity sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y= - dependencies: - kind-of "^3.0.2" - -is-data-descriptor@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz#d84876321d0e7add03990406abbbbd36ba9268c7" - integrity sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ== - dependencies: - kind-of "^6.0.0" - is-date-object@^1.0.1: version "1.0.5" resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.5.tgz#0841d5536e724c25597bf6ea62e1bd38298df31f" @@ -5743,46 +5207,11 @@ is-date-object@^1.0.1: dependencies: has-tostringtag "^1.0.0" -is-descriptor@^0.1.0: - version "0.1.6" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz#366d8240dde487ca51823b1ab9f07a10a78251ca" - integrity sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg== - dependencies: - is-accessor-descriptor "^0.1.6" - is-data-descriptor "^0.1.4" - kind-of "^5.0.0" - -is-descriptor@^1.0.0, is-descriptor@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz#3b159746a66604b04f8c81524ba365c5f14d86ec" - integrity sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg== - dependencies: - is-accessor-descriptor "^1.0.0" - is-data-descriptor "^1.0.0" - kind-of "^6.0.2" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - integrity sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik= - -is-extendable@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz#a7470f9e426733d81bd81e1155264e3a3507cab4" - integrity sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA== - dependencies: - is-plain-object "^2.0.4" - 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@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= - 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" @@ -5832,13 +5261,6 @@ is-number-object@^1.0.4: dependencies: has-tostringtag "^1.0.0" -is-number@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz#24fd6201a4782cf50561c810276afc7d12d71195" - integrity sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU= - dependencies: - kind-of "^3.0.2" - is-number@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" @@ -5868,7 +5290,7 @@ is-path-inside@^2.1.0: dependencies: path-is-inside "^1.0.2" -is-path-inside@^3.0.2: +is-path-inside@^3.0.2, is-path-inside@^3.0.3: version "3.0.3" resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.3.tgz#d231362e53a07ff2b0e0ea7fed049161ffd16283" integrity sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ== @@ -5878,7 +5300,7 @@ is-plain-obj@^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-plain-object@^2.0.3, is-plain-object@^2.0.4: +is-plain-object@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== @@ -5903,13 +5325,6 @@ is-regex@^1.0.5, is-regex@^1.1.0, is-regex@^1.1.4: call-bind "^1.0.2" has-tostringtag "^1.0.0" -is-relative@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-relative/-/is-relative-1.0.0.tgz#a1bb6935ce8c5dba1e8b9754b9b2dcc020e2260d" - integrity sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA== - dependencies: - is-unc-path "^1.0.0" - is-shared-array-buffer@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-shared-array-buffer/-/is-shared-array-buffer-1.0.1.tgz#97b0c85fbdacb59c9c446fe653b82cf2b5b7cfe6" @@ -5946,13 +5361,6 @@ is-typedarray@^1.0.0: resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" integrity sha1-5HnICFjfDBsR3dppQPlgEfzaSpo= -is-unc-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-unc-path/-/is-unc-path-1.0.0.tgz#d731e8898ed090a12c352ad2eaed5095ad322c9d" - integrity sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ== - dependencies: - unc-path-regex "^0.1.2" - is-unicode-supported@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz#3f26c76a809593b52bfa2ecb5710ed2779b522a7" @@ -5972,11 +5380,6 @@ is-weakref@^1.0.2: dependencies: call-bind "^1.0.2" -is-windows@^1.0.1, is-windows@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz#d1850eb9791ecd18e6182ce12a30f396634bb19d" - integrity sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA== - is-yarn-global@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/is-yarn-global/-/is-yarn-global-0.3.0.tgz#d502d3382590ea3004893746754c89139973e232" @@ -5987,7 +5390,7 @@ isarray@0.0.1: resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== -isarray@1.0.0, isarray@~1.0.0: +isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" integrity sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE= @@ -5997,14 +5400,7 @@ isexe@^2.0.0: resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - integrity sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk= - dependencies: - isarray "1.0.0" - -isobject@^3.0.0, isobject@^3.0.1: +isobject@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" integrity sha1-TkMekrEalzFjaqH5yNHMvP2reN8= @@ -6273,12 +5669,7 @@ json-buffer@3.0.0: resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898" integrity sha1-Wx85evx11ne96Lz8Dkfh+aPZqJg= -json-parse-better-errors@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9" - integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw== - -json-parse-even-better-errors@^2.3.0: +json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1: version "2.3.1" resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== @@ -6299,16 +5690,16 @@ json-stable-stringify-without-jsonify@^1.0.1: integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= json5@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz#779fb0018604fa854eacbf6252180d83543e3dbe" - integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow== + version "1.0.2" + resolved "https://registry.yarnpkg.com/json5/-/json5-1.0.2.tgz#63d98d60f21b313b77c4d6da18bfa69d80e1d593" + integrity sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA== dependencies: minimist "^1.2.0" -json5@^2.1.2, json5@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.1.tgz#655d50ed1e6f95ad1a3caababd2b0efda10b395c" - integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA== +json5@^2.1.2, json5@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== "jsx-ast-utils@^2.4.1 || ^3.0.0": version "3.2.1" @@ -6330,26 +5721,7 @@ keyv@^3.0.0: dependencies: json-buffer "3.0.0" -kind-of@^3.0.2, kind-of@^3.0.3, kind-of@^3.2.0: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - integrity sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ= - dependencies: - is-buffer "^1.1.5" - -kind-of@^4.0.0: - version "4.0.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz#20813df3d712928b207378691a45066fae72dd57" - integrity sha1-IIE989cSkosgc3hpGkUGb65y3Vc= - dependencies: - is-buffer "^1.1.5" - -kind-of@^5.0.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" - integrity sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw== - -kind-of@^6.0.0, kind-of@^6.0.2: +kind-of@^6.0.2: version "6.0.3" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== @@ -6359,23 +5731,25 @@ klona@^2.0.4: resolved "https://registry.yarnpkg.com/klona/-/klona-2.0.5.tgz#d166574d90076395d9963aa7a928fabb8d76afbc" integrity sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ== -knex@^0.21.12: - version "0.21.21" - resolved "https://registry.yarnpkg.com/knex/-/knex-0.21.21.tgz#b1335c75afd15ff83371b096e9cc4c4eafab8c05" - integrity sha512-cjw5qO1EzVKjbywcVa61IQJMLt7PfYBRI/2NwCA/B9beXgbw652wDNLz+JM+UKKNsfwprq0ugYqBYc9q4JN36A== +knex@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/knex/-/knex-2.4.2.tgz#a34a289d38406dc19a0447a78eeaf2d16ebedd61" + integrity sha512-tMI1M7a+xwHhPxjbl/H9K1kHX+VncEYcvCx5K00M16bWvpYPKAZd6QrCu68PtHAdIZNQPWZn0GVhqVBEthGWCg== dependencies: - colorette "1.2.1" - commander "^6.2.0" - debug "4.3.1" + colorette "2.0.19" + commander "^9.1.0" + debug "4.3.4" + escalade "^3.1.1" esm "^3.2.25" - getopts "2.2.5" + get-package-type "^0.1.0" + getopts "2.3.0" interpret "^2.2.0" - liftoff "3.1.0" - lodash "^4.17.20" - pg-connection-string "2.4.0" - tarn "^3.0.1" + lodash "^4.17.21" + pg-connection-string "2.5.0" + rechoir "^0.8.0" + resolve-from "^5.0.0" + tarn "^3.0.2" tildify "2.0.0" - v8flags "^3.2.0" latest-version@^5.1.0: version "5.1.0" @@ -6384,14 +5758,6 @@ latest-version@^5.1.0: dependencies: package-json "^6.3.0" -levn@^0.3.0, levn@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" - integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= - dependencies: - prelude-ls "~1.1.2" - type-check "~0.3.2" - levn@^0.4.1: version "0.4.1" resolved "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz#ae4562c007473b932a6200d403268dd2fffc6ade" @@ -6400,19 +5766,13 @@ levn@^0.4.1: prelude-ls "^1.2.1" type-check "~0.4.0" -liftoff@3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/liftoff/-/liftoff-3.1.0.tgz#c9ba6081f908670607ee79062d700df062c52ed3" - integrity sha512-DlIPlJUkCV0Ips2zf2pJP0unEoT1kwYhiiPUGF3s/jtxTCjziNLoiVVh+jqWOWeFi6mmwQ5fNxvAUyPad4Dfog== +levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= dependencies: - extend "^3.0.0" - findup-sync "^3.0.0" - fined "^1.0.1" - flagged-respawn "^1.0.0" - is-plain-object "^2.0.4" - object.map "^1.0.0" - rechoir "^0.6.2" - resolve "^1.1.7" + prelude-ls "~1.1.2" + type-check "~0.3.2" lines-and-columns@^1.1.6: version "1.2.4" @@ -6556,7 +5916,7 @@ lodash.truncate@^4.4.2: resolved "https://registry.yarnpkg.com/lodash.truncate/-/lodash.truncate-4.4.2.tgz#5a350da0b1113b837ecfffd5812cbe58d6eae193" integrity sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM= -lodash@^4.17.10, lodash@^4.17.14, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: +lodash@^4.17.10, lodash@^4.17.15, lodash@^4.17.19, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.7.0: version "4.17.21" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -6620,6 +5980,13 @@ lowercase-keys@^2.0.0: resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-2.0.0.tgz#2603e78b7b4b0006cbca2fbcc8a3202558ac9479" integrity sha512-tqNXrS78oMOE73NMxK4EMLQsQowWf8jKooH9g7xPavRT706R6bkQJ6DY2Te7QukaZsulxa30wQ7bk0pm4XiHmA== +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + lru-cache@^6.0.0: version "6.0.0" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94" @@ -6649,13 +6016,6 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-iterator@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/make-iterator/-/make-iterator-1.0.1.tgz#29b33f312aa8f547c4a5e490f56afcec99133ad6" - integrity sha512-pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw== - dependencies: - kind-of "^6.0.2" - makeerror@1.0.12: version "1.0.12" resolved "https://registry.yarnpkg.com/makeerror/-/makeerror-1.0.12.tgz#3e5dd2079a82e812e983cc6610c4a2cb0eaa801a" @@ -6663,18 +6023,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-cache@^0.2.0, map-cache@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz#c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf" - integrity sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8= - -map-visit@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz#ecdca8f13144e660f1b5bd41f12f3479d98dfb8f" - integrity sha1-7Nyo8TFE5mDxtb1B8S80edmN+48= - dependencies: - object-visit "^1.0.0" - media-typer@0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz#8710d7af0aa626f8fffa1ce00168545263255748" @@ -6726,25 +6074,6 @@ methods@^1.1.1, methods@^1.1.2, methods@~1.1.2: resolved "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz#5529a4d67654134edcc5266656835b0f851afcee" integrity sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4= -micromatch@^3.0.4: - version "3.1.10" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz#70859bc95c9840952f359a068a3fc49f9ecfac23" - integrity sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - braces "^2.3.1" - define-property "^2.0.2" - extend-shallow "^3.0.2" - extglob "^2.0.4" - fragment-cache "^0.2.1" - kind-of "^6.0.2" - nanomatch "^1.2.9" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.2" - micromatch@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.4.tgz#896d519dfe9db25fce94ceb7a500919bf881ebf9" @@ -6753,33 +6082,33 @@ micromatch@^4.0.4: braces "^3.0.1" picomatch "^2.2.3" -mime-db@1.51.0, "mime-db@>= 1.43.0 < 2": +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +"mime-db@>= 1.43.0 < 2": version "1.51.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.51.0.tgz#d9ff62451859b18342d960850dc3cfb77e63fb0c" integrity sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g== -mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24: - version "2.1.34" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.34.tgz#5a712f9ec1503511a945803640fafe09d3793c24" - integrity sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A== +mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.24, mime-types@~2.1.34: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== dependencies: - mime-db "1.51.0" + mime-db "1.52.0" mime@1.6.0, mime@^1.4.1: version "1.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg== -mime@^2.5.0: +mime@2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/mime/-/mime-2.6.0.tgz#a2a682a95cd4d0cb1d6257e28f83da7e35800367" integrity sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg== -mimic-fn@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b" - integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg== - mimic-response@^1.0.0, mimic-response@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/mimic-response/-/mimic-response-1.0.1.tgz#4923538878eef42063cb8a3e3b0798781487ab1b" @@ -6797,10 +6126,10 @@ min-document@^2.19.0: dependencies: dom-walk "^0.1.0" -mini-css-extract-plugin@^2.5.3: - version "2.5.3" - resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.5.3.tgz#c5c79f9b22ce9b4f164e9492267358dbe35376d9" - integrity sha512-YseMB8cs8U/KCaAGQoqYmfUuhhGW0a9p9XvWXrxVOkE3/IiISTLw4ALNt7JR5B2eYauFM+PQGSbXMDmVbR7Tfw== +mini-css-extract-plugin@^2.7.4: + version "2.7.4" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.7.4.tgz#1e92eaafb0dd598d36b68b699ac553ae4d52ae60" + integrity sha512-V5zkjajQx9gnedglDap7ZjD1mNFNISzyllzrc+9+R4iwPRUAR0St20ADflQbWkVUQ2u/QU55t8mKaxUek8Cciw== dependencies: schema-utils "^4.0.0" @@ -6811,7 +6140,7 @@ minimatch@3.0.4: dependencies: brace-expansion "^1.1.7" -minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: +minimatch@^3.0.4, minimatch@^3.0.5, minimatch@^3.1.1, minimatch@^3.1.2: version "3.1.2" resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.1.2.tgz#19cd194bfd3e428f049a70817c038d89ab4be35b" integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw== @@ -6823,26 +6152,6 @@ minimist@^1.2.0, minimist@^1.2.6: resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18" integrity sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g== -minimist@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.6.tgz#8637a5b759ea0d6e98702cfb3a9283323c93af44" - integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q== - -mixin-deep@^1.2.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz#1120b43dc359a785dce65b55b82e257ccf479566" - integrity sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA== - dependencies: - for-in "^1.0.2" - is-extendable "^1.0.1" - -mkdirp@^0.5.1: - version "0.5.5" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz#d91cefd62d1436ca0f41620e251288d420099def" - integrity sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ== - dependencies: - minimist "^1.2.5" - mocha-chai-jest-snapshot@^1.1.4: version "1.1.4" resolved "https://registry.yarnpkg.com/mocha-chai-jest-snapshot/-/mocha-chai-jest-snapshot-1.1.4.tgz#0c8e15530968074b08d1b7fbf28c2ed8b92f4380" @@ -6932,11 +6241,6 @@ ms@2.1.3, ms@^2.1.1: resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== -mute-stream@0.0.8: - version "0.0.8" - resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz#1630c42b2251ff81e2a283de96a5497ea92e5e0d" - integrity sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA== - nanoid@3.1.25: version "3.1.25" resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.1.25.tgz#09ca32747c0e543f0e1814b7d3793477f9c8e152" @@ -6947,23 +6251,6 @@ nanoid@^3.3.1: resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.1.tgz#6347a18cac88af88f58af0b3594b723d5e99bb35" integrity sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw== -nanomatch@^1.2.9: - version "1.2.13" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz#b87a8aa4fc0de8fe6be88895b38983ff265bd119" - integrity sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA== - dependencies: - arr-diff "^4.0.0" - array-unique "^0.3.2" - define-property "^2.0.2" - extend-shallow "^3.0.2" - fragment-cache "^0.2.1" - is-windows "^1.0.2" - kind-of "^6.0.2" - object.pick "^1.3.0" - regex-not "^1.0.0" - snapdragon "^0.8.1" - to-regex "^3.0.1" - natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" @@ -6979,10 +6266,10 @@ nearley@^2.7.10: railroad-diagrams "^1.0.0" randexp "0.4.6" -negotiator@0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz#feacf7ccf525a77ae9634436a64883ffeca346fb" - integrity sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw== +negotiator@0.6.3: + version "0.6.3" + resolved "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.3.tgz#58e323a72fedc0d6f9cd4d31fe49f51479590ccd" + integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg== neo-async@^2.6.2: version "2.6.2" @@ -6999,11 +6286,6 @@ next-tick@~1.0.0: resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" integrity sha1-yobR/ogoFpsBICCOPchCS524NCw= -nice-try@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" - integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== - nise@^5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/nise/-/nise-5.1.1.tgz#ac4237e0d785ecfcb83e20f389185975da5c31f3" @@ -7028,16 +6310,6 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== -node-releases@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" - integrity sha512-CqyzN6z7Q6aMeF/ktcMVTzhAHCEpf8SOarwpzpf8pNBY2k5/oM34UHldUwp8VKI7uxct2HxSRdJjBaZeESzcxA== - -node-releases@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.2.tgz#7139fe71e2f4f11b47d4d2986aaf8c48699e0c01" - integrity sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg== - node-releases@^2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.6.tgz#8a7088c63a55e493845683ebf3c828d8c51c5503" @@ -7103,15 +6375,6 @@ object-assign@^4.0.1, object-assign@^4.1.1: resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= -object-copy@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz#7e7d858b781bd7c991a41ba975ed3812754e998c" - integrity sha1-fn2Fi3gb18mRpBupde04EnVOmYw= - dependencies: - copy-descriptor "^0.1.0" - define-property "^0.2.5" - kind-of "^3.0.3" - object-inspect@^1.11.0, object-inspect@^1.9.0: version "1.11.0" resolved "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.11.0.tgz#9dceb146cedd4148a0d9e51ab88d34cf509922b1" @@ -7135,13 +6398,6 @@ object-keys@^1.0.12, object-keys@^1.1.1: resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz#1c47f272df277f3b1daf061677d9c82e2322c60e" integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA== -object-visit@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz#f79c4493af0c5377b59fe39d395e41042dd045bb" - integrity sha1-95xEk68MU3e1n+OdOV5BBC3QRbs= - dependencies: - isobject "^3.0.0" - object.assign@^4.1.0, object.assign@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.2.tgz#0ed54a342eceb37b38ff76eb831a0e788cb63940" @@ -7152,16 +6408,6 @@ object.assign@^4.1.0, object.assign@^4.1.2: has-symbols "^1.0.1" object-keys "^1.1.1" -object.defaults@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/object.defaults/-/object.defaults-1.1.0.tgz#3a7f868334b407dea06da16d88d5cd29e435fecf" - integrity sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8= - dependencies: - array-each "^1.0.1" - array-slice "^1.0.0" - for-own "^1.0.0" - isobject "^3.0.0" - object.entries@^1.1.1, object.entries@^1.1.2, object.entries@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.1.5.tgz#e1acdd17c4de2cd96d5a08487cfb9db84d881861" @@ -7197,21 +6443,6 @@ object.hasown@^1.1.0: define-properties "^1.1.3" es-abstract "^1.19.1" -object.map@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/object.map/-/object.map-1.0.1.tgz#cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37" - integrity sha1-z4Plncj8wK1fQlDh94s7gb2AHTc= - dependencies: - for-own "^1.0.0" - make-iterator "^1.0.0" - -object.pick@^1.2.0, object.pick@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz#87a10ac4c1694bd2e1cbf53591a66141fb5dd747" - integrity sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c= - dependencies: - isobject "^3.0.1" - object.values@^1.1.1, object.values@^1.1.2, object.values@^1.1.5: version "1.1.5" resolved "https://registry.yarnpkg.com/object.values/-/object.values-1.1.5.tgz#959f63e3ce9ef108720333082131e4a459b716ac" @@ -7221,6 +6452,13 @@ object.values@^1.1.1, object.values@^1.1.2, object.values@^1.1.5: define-properties "^1.1.3" es-abstract "^1.19.1" +on-finished@2.4.1: + version "2.4.1" + resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.4.1.tgz#58c8c44116e54845ad57f14ab10b03533184ac3f" + integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg== + dependencies: + ee-first "1.1.1" + on-finished@~2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz#20f1336481b083cd75337992a16971aa2d906947" @@ -7233,26 +6471,19 @@ on-headers@~1.0.2: resolved "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz#772b0ae6aaa525c399e489adfad90c403eb3c28f" integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA== -once@1.4.0, once@^1.3.0, once@^1.3.1, once@^1.4.0: +once@^1.3.0, once@^1.3.1, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= dependencies: wrappy "1" -onetime@^5.1.0: - version "5.1.2" - resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e" - integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg== - dependencies: - mimic-fn "^2.1.0" - opener@^1.5.2: version "1.5.2" resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.2.tgz#5d37e1f35077b9dcac4301372271afdeb2a13598" integrity sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A== -optionator@^0.8.1, optionator@^0.8.3: +optionator@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.3.tgz#84fa1d036fe9d3c7e21d99884b601167ec8fb495" integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA== @@ -7276,10 +6507,17 @@ optionator@^0.9.1: type-check "^0.4.0" word-wrap "^1.2.3" -os-tmpdir@~1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= +optionator@^0.9.3: + version "0.9.3" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.9.3.tgz#007397d44ed1872fdc6ed31360190f81814e2c64" + integrity sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg== + 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" p-cancelable@^1.0.0: version "1.1.0" @@ -7358,15 +6596,6 @@ parent-module@^1.0.0: dependencies: callsites "^3.0.0" -parse-filepath@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/parse-filepath/-/parse-filepath-1.0.2.tgz#a632127f53aaf3d15876f5872f3ffac763d6c891" - integrity sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE= - dependencies: - is-absolute "^1.0.0" - map-cache "^0.2.0" - path-root "^0.1.1" - parse-json@^5.0.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -7407,11 +6636,6 @@ parseurl@~1.3.2, parseurl@~1.3.3: resolved "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz#9da19e7bee8d12dff0513ed5b76957793bc2e8d4" integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ== -pascalcase@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz#b363e55e8006ca6fe21784d2db22bd15d7917f14" - integrity sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ= - "passport-musicbrainz-oauth2@git+https://git@github.com/LordSputnik/passport-musicbrainz-oauth2.git": version "1.0.0" resolved "git+https://git@github.com/LordSputnik/passport-musicbrainz-oauth2.git#695f1cd35b0e4ae63472cc3ad4af50cf7bdecd26" @@ -7465,11 +6689,6 @@ path-is-inside@^1.0.2: resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= -path-key@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" - integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= - path-key@^3.1.0: version "3.1.1" resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" @@ -7480,18 +6699,6 @@ path-parse@^1.0.6, path-parse@^1.0.7: resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== -path-root-regex@^0.1.0: - version "0.1.2" - resolved "https://registry.yarnpkg.com/path-root-regex/-/path-root-regex-0.1.2.tgz#bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d" - integrity sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0= - -path-root@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/path-root/-/path-root-0.1.1.tgz#9a4a6814cac1c0cd73360a95f32083c8ea4745b7" - integrity sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc= - dependencies: - path-root-regex "^0.1.0" - path-to-regexp@0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz#df604178005f522f15eb4490e7247a1bfaa67f8c" @@ -7524,12 +6731,7 @@ performance-now@^2.1.0: resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" integrity sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns= -pg-connection-string@2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.4.0.tgz#c979922eb47832999a204da5dbe1ebf2341b6a10" - integrity sha512-3iBXuv7XKvxeMrIgym7njT+HlZkwZqqGX4Bu9cci8xHZNT+Um1gWKqCsAzcC0d95rcKMU5WBg6YRUcHyV0HZKQ== - -pg-connection-string@^2.5.0: +pg-connection-string@2.5.0, pg-connection-string@^2.5.0: version "2.5.0" resolved "https://registry.yarnpkg.com/pg-connection-string/-/pg-connection-string-2.5.0.tgz#538cadd0f7e603fc09a12590f3b8a452c2c0cf34" integrity sha512-r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ== @@ -7636,11 +6838,6 @@ pkginfo@^0.4.0: resolved "https://registry.yarnpkg.com/pkginfo/-/pkginfo-0.4.1.tgz#b5418ef0439de5425fc4995042dced14fb2a84ff" integrity sha1-tUGO8EOd5UJfxJlQQtztFPsqhP8= -posix-character-classes@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz#01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab" - integrity sha1-AerA/jta9xoqbAL+q7jB/vfgDqs= - postcss-modules-extract-imports@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" @@ -7817,20 +7014,10 @@ pupa@^2.1.1: dependencies: escape-goat "^2.0.0" -qs@6.9.3: - version "6.9.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.3.tgz#bfadcd296c2d549f1dffa560619132c977f5008e" - integrity sha512-EbZYNarm6138UKKq46tdx08Yo/q9ZhFoAXAI1meAFd2GtbRDhbZY2WQSICskT0c5q99aFzLG1D4nvTk9tqfXIw== - -qs@6.9.6: - version "6.9.6" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.9.6.tgz#26ed3c8243a431b2924aca84cc90471f35d5a0ee" - integrity sha512-TIRk4aqYLNoJUbd+g2lEdz5kLWIuTMRagAXxl78Q0RiVjAOugHmeKNGdd3cwo/ktpf9aL9epCfFqWDEKysUlLQ== - -qs@^6.10.1, qs@^6.5.1: - version "6.10.3" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.10.3.tgz#d6cde1b2ffca87b5aa57889816c5f81535e22e8e" - integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ== +qs@6.11.0, qs@^6.11.0, qs@^6.5.1: + version "6.11.0" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.11.0.tgz#fd0d963446f7a65e1367e01abd85429453f0c37a" + integrity sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q== dependencies: side-channel "^1.0.4" @@ -7881,13 +7068,13 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz#3cf37023d199e1c24d1a55b84800c2f3e6468031" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== -raw-body@2.4.2: - version "2.4.2" - resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.2.tgz#baf3e9c21eebced59dd6533ac872b71f7b61cb32" - integrity sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ== +raw-body@2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/raw-body/-/raw-body-2.5.1.tgz#fe1b1628b181b700215e5fd42389f98b71392857" + integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig== dependencies: - bytes "3.1.1" - http-errors "1.8.1" + bytes "3.1.2" + http-errors "2.0.0" iconv-lite "0.4.24" unpipe "1.0.0" @@ -8131,7 +7318,7 @@ readable-stream@^2.0.0, readable-stream@^2.3.5: string_decoder "~1.1.1" util-deprecate "~1.0.1" -readable-stream@^3.0.0, readable-stream@^3.6.0: +readable-stream@^3.0.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== @@ -8147,13 +7334,6 @@ readdirp@~3.6.0: dependencies: picomatch "^2.2.1" -rechoir@^0.6.2: - version "0.6.2" - resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" - integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= - dependencies: - resolve "^1.1.6" - rechoir@^0.7.0: version "0.7.1" resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686" @@ -8161,32 +7341,24 @@ rechoir@^0.7.0: dependencies: resolve "^1.9.0" -redis-commands@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" - integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== - -redis-errors@^1.0.0, redis-errors@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" - integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= - -redis-parser@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" - integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== dependencies: - redis-errors "^1.0.0" + resolve "^1.20.0" -redis@^3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.2.tgz#766851117e80653d23e0ed536254677ab647638c" - integrity sha512-grn5KoZLr/qrRQVwoSkmzdbw6pwF+/rwODtrOr6vuBRiR/f3rjSTGupbF90Zpqm2oenix8Do6RV7pYEkGwlKkw== +redis@^4.6.5: + version "4.6.5" + resolved "https://registry.yarnpkg.com/redis/-/redis-4.6.5.tgz#f32fbde44429e96f562bb0c9b1db0143ab8cfa4f" + integrity sha512-O0OWA36gDQbswOdUuAhRL6mTZpHFN525HlgZgDaVNgCJIAZR3ya06NTESb0R+TUZ+BFaDpz6NnnVvoMx9meUFg== dependencies: - denque "^1.5.0" - redis-commands "^1.7.0" - redis-errors "^1.2.0" - redis-parser "^3.0.0" + "@redis/bloom" "1.2.0" + "@redis/client" "1.5.6" + "@redis/graph" "1.1.0" + "@redis/json" "1.0.4" + "@redis/search" "1.1.2" + "@redis/time-series" "1.0.4" redux-debounce@^1.0.1: version "1.0.1" @@ -8250,14 +7422,6 @@ regenerator-transform@^0.14.2: dependencies: "@babel/runtime" "^7.8.4" -regex-not@^1.0.0, regex-not@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz#1f4ece27e00b0b65e0247a6810e6a85d83a5752c" - integrity sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A== - dependencies: - extend-shallow "^3.0.2" - safe-regex "^1.1.0" - regex-parser@^2.2.11: version "2.2.11" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.11.tgz#3b37ec9049e19479806e878cabe7c1ca83ccfe58" @@ -8280,11 +7444,6 @@ regexp.prototype.flags@^1.4.3: define-properties "^1.1.3" functions-have-names "^1.2.2" -regexpp@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" - integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== - regexpp@^3.0.0, regexpp@^3.1.0: version "3.2.0" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2" @@ -8328,16 +7487,6 @@ regjsparser@^0.7.0: dependencies: jsesc "~0.5.0" -repeat-element@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.4.tgz#be681520847ab58c7568ac75fbfad28ed42d39e9" - integrity sha512-LFiNfRcSu7KK3evMyYOuCzv3L10TW7yC1G2/+StMjK8Y6Vqd2MG7r/Qjw4ghtuCOjFvlnms/iMmLqpvW/ES/WQ== - -repeat-string@^1.6.1: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - integrity sha1-jcrkcOHIirwtYA//Sndihtp15jc= - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz#8c64ad5fd30dab1c976e2344ffe7f792a6a6df42" @@ -8360,14 +7509,6 @@ resolve-cwd@^3.0.0: dependencies: resolve-from "^5.0.0" -resolve-dir@^1.0.0, resolve-dir@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/resolve-dir/-/resolve-dir-1.0.1.tgz#79a40644c362be82f26effe739c9bb5382046f43" - integrity sha1-eaQGRMNivoLybv/nOcm7U4IEb0M= - dependencies: - expand-tilde "^2.0.0" - global-modules "^1.0.0" - resolve-from@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" @@ -8389,12 +7530,7 @@ resolve-url-loader@^5.0.0: postcss "^8.2.14" source-map "0.6.1" -resolve-url@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz#2c637fe77c893afd2a663fe21aa9080068e2052a" - integrity sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo= - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: +resolve@^1.10.1, resolve@^1.12.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.9.0: version "1.22.1" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.1.tgz#27cb2ebb53f91abb49470a928bba7558066ac177" integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw== @@ -8418,14 +7554,6 @@ responselike@^1.0.2: dependencies: lowercase-keys "^1.0.0" -restore-cursor@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz#39f67c54b3a7a58cea5236d95cf0034239631f7e" - integrity sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - ret@~0.1.10: version "0.1.15" resolved "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz#b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc" @@ -8436,19 +7564,12 @@ reusify@^1.0.4: resolved "https://registry.yarnpkg.com/reusify/-/reusify-1.0.4.tgz#90da382b1e126efc02146e90845a88db12925d76" integrity sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw== -rewire@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/rewire/-/rewire-5.0.0.tgz#c4e6558206863758f6234d8f11321793ada2dbff" - integrity sha512-1zfitNyp9RH5UDyGGLe9/1N0bMlPQ0WrX0Tmg11kMHBpqwPJI4gfPpP7YngFyLbFmhXh19SToAG0sKKEFcOIJA== - dependencies: - eslint "^6.8.0" - -rimraf@2.6.3: - version "2.6.3" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz#b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab" - integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA== +rewire@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-7.0.0.tgz#41db5482370c88758ffc9a719f7c92a761fa8fbf" + integrity sha512-DyyNyzwMtGYgu0Zl/ya0PR/oaunM+VuCuBxCuhYJHHaV0V+YvYa3bBGxb5OZ71vndgmp1pYY8F4YOwQo1siRGw== dependencies: - glob "^7.1.3" + eslint "^8.47.0" rimraf@^2.6.3: version "2.7.1" @@ -8472,11 +7593,6 @@ rst-selector-parser@^2.2.3: lodash.flattendeep "^4.4.0" nearley "^2.7.10" -run-async@^2.4.0: - version "2.4.1" - resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz#8440eccf99ea3e70bd409d49aab88e10c189a455" - integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ== - run-parallel@^1.1.9: version "1.2.0" resolved "https://registry.yarnpkg.com/run-parallel/-/run-parallel-1.2.0.tgz#66d1368da7bdf921eb9d95bd1a9229e7f21a43ee" @@ -8484,13 +7600,6 @@ run-parallel@^1.1.9: dependencies: queue-microtask "^1.2.2" -rxjs@^6.6.0: - version "6.6.7" - resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.6.7.tgz#90ac018acabf491bf65044235d5863c4dab804c9" - integrity sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ== - dependencies: - tslib "^1.9.0" - safe-buffer@5.1.1: version "5.1.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.1.tgz#893312af69b2123def71f57889001671eeb2c853" @@ -8506,30 +7615,23 @@ safe-buffer@5.2.1, safe-buffer@^5.1.0, safe-buffer@~5.2.0: resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== -safe-regex@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e" - integrity sha1-QKNmnzsHfR6UPURinhV91IAjvy4= - dependencies: - ret "~0.1.10" - "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": version "2.1.2" resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sass-loader@^12.4.0: - version "12.4.0" - resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-12.4.0.tgz#260b0d51a8a373bb8e88efc11f6ba5583fea0bcf" - integrity sha512-7xN+8khDIzym1oL9XyS6zP6Ges+Bo2B2xbPrjdMHEYyV3AQYhd/wXeru++3ODHF0zMjYmVadblSKrPrjEkL8mg== +sass-loader@^13.2.0: + version "13.2.0" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-13.2.0.tgz#80195050f58c9aac63b792fa52acb6f5e0f6bdc3" + integrity sha512-JWEp48djQA4nbZxmgC02/Wh0eroSUutulROUusYJO9P9zltRbNN80JCBHqRGzjd4cmZCa/r88xgfkjGD0TXsHg== dependencies: klona "^2.0.4" neo-async "^2.6.2" -sass@^1.49.0: - version "1.49.0" - resolved "https://registry.yarnpkg.com/sass/-/sass-1.49.0.tgz#65ec1b1d9a6bc1bae8d2c9d4b392c13f5d32c078" - integrity sha512-TVwVdNDj6p6b4QymJtNtRS2YtLJ/CqZriGg0eIAbAKMlN8Xy6kbv33FsEZSF7FufFFM705SQviHjjThfaQ4VNw== +sass@^1.59.2: + version "1.59.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.59.2.tgz#537f6d11614d4f20f97696f23ad358ee398b1937" + integrity sha512-jJyO6SmbzkJexF8MUorHx5tAilcgabioYxT/BHbY4+OvoqmbHxsYlrjZ8Adhqcgl6Zqwie0TgMXLCAmPFxXOuw== dependencies: chokidar ">=3.0.0 <4.0.0" immutable "^4.0.0" @@ -8602,7 +7704,7 @@ semver@7.0.0: resolved "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz#5f3ca35761e47e05b206c6daff2cf814f0316b8e" integrity sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A== -semver@^5.5.0, semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: +semver@^5.6.0, semver@^5.7.0, semver@^5.7.1: version "5.7.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz#a954f931aeba508d307bbf069eff0c01c96116f7" integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ== @@ -8612,31 +7714,31 @@ semver@^6.0.0, semver@^6.1.0, semver@^6.1.1, semver@^6.1.2, semver@^6.2.0, semve resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz#ee0a64c8af5e8ceea67687b133761e1becbd1d3d" integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw== -semver@^7.2.1, semver@^7.3.4, semver@^7.3.5: - version "7.3.5" - resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.5.tgz#0b621c879348d8998e4b0e4be94b3f12e6018ef7" - integrity sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ== +semver@^7.2.1, semver@^7.3.4, semver@^7.3.5, semver@^7.3.8: + version "7.3.8" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798" + integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A== dependencies: lru-cache "^6.0.0" -send@0.17.2: - version "0.17.2" - resolved "https://registry.yarnpkg.com/send/-/send-0.17.2.tgz#926622f76601c41808012c8bf1688fe3906f7820" - integrity sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww== +send@0.18.0: + version "0.18.0" + resolved "https://registry.yarnpkg.com/send/-/send-0.18.0.tgz#670167cc654b05f5aa4a767f9113bb371bc706be" + integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg== dependencies: debug "2.6.9" - depd "~1.1.2" - destroy "~1.0.4" + depd "2.0.0" + destroy "1.2.0" encodeurl "~1.0.2" escape-html "~1.0.3" etag "~1.8.1" fresh "0.5.2" - http-errors "1.8.1" + http-errors "2.0.0" mime "1.6.0" ms "2.1.3" - on-finished "~2.3.0" + on-finished "2.4.1" range-parser "~1.2.1" - statuses "~1.5.0" + statuses "2.0.1" serialize-javascript@6.0.0, serialize-javascript@^6.0.0: version "6.0.0" @@ -8656,25 +7758,15 @@ serve-favicon@^2.4.3: parseurl "~1.3.2" safe-buffer "5.1.1" -serve-static@1.14.2, serve-static@^1.14.1: - version "1.14.2" - resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.2.tgz#722d6294b1d62626d41b43a013ece4598d292bfa" - integrity sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ== +serve-static@1.15.0, serve-static@^1.14.1: + version "1.15.0" + resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.15.0.tgz#faaef08cffe0a1a62f60cad0c4e513cff0ac9540" + integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g== dependencies: encodeurl "~1.0.2" escape-html "~1.0.3" parseurl "~1.3.3" - send "0.17.2" - -set-value@^2.0.0, set-value@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz#a18d40530e6f07de4228c7defe4227af8cad005b" - integrity sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw== - dependencies: - extend-shallow "^2.0.1" - is-extendable "^0.1.1" - is-plain-object "^2.0.3" - split-string "^3.0.1" + send "0.18.0" setprototypeof@1.2.0: version "1.2.0" @@ -8693,13 +7785,6 @@ shallowequal@^1.1.0: resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== -shebang-command@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" - integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= - dependencies: - shebang-regex "^1.0.0" - shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" @@ -8707,11 +7792,6 @@ shebang-command@^2.0.0: dependencies: shebang-regex "^3.0.0" -shebang-regex@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" - integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= - shebang-regex@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" @@ -8767,15 +7847,6 @@ slash@^3.0.0: resolved "https://registry.yarnpkg.com/slash/-/slash-3.0.0.tgz#6539be870c165adbd5240220dbe361f1bc4d4634" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz#cacd7693461a637a5788d92a7dd4fba068e81636" - integrity sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ== - dependencies: - ansi-styles "^3.2.0" - astral-regex "^1.0.0" - is-fullwidth-code-point "^2.0.0" - slice-ansi@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-4.0.0.tgz#500e8dd0fd55b05815086255b3195adf2a45fe6b" @@ -8785,52 +7856,11 @@ slice-ansi@^4.0.0: astral-regex "^2.0.0" is-fullwidth-code-point "^3.0.0" -snapdragon-node@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" - integrity sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw== - dependencies: - define-property "^1.0.0" - isobject "^3.0.0" - snapdragon-util "^3.0.1" - -snapdragon-util@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz#f956479486f2acd79700693f6f7b805e45ab56e2" - integrity sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ== - dependencies: - kind-of "^3.2.0" - -snapdragon@^0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz#64922e7c565b0e14204ba1aa7d6964278d25182d" - integrity sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg== - dependencies: - base "^0.11.1" - debug "^2.2.0" - define-property "^0.2.5" - extend-shallow "^2.0.1" - map-cache "^0.2.2" - source-map "^0.5.6" - source-map-resolve "^0.5.0" - use "^3.1.0" - "source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c" integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw== -source-map-resolve@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz#190866bece7553e1f8f267a2ee82c606b5509a1a" - integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw== - dependencies: - atob "^2.1.2" - decode-uri-component "^0.2.0" - resolve-url "^0.2.1" - source-map-url "^0.4.0" - urix "^0.1.0" - source-map-support@^0.5.16, source-map-support@~0.5.20: version "0.5.21" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" @@ -8839,17 +7869,12 @@ source-map-support@^0.5.16, source-map-support@~0.5.20: buffer-from "^1.0.0" source-map "^0.6.0" -source-map-url@^0.4.0: - version "0.4.1" - resolved "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.1.tgz#0af66605a745a5a2f91cf1bbf8a7afbc283dec56" - integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw== - source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1: version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -source-map@^0.5.0, source-map@^0.5.6, source-map@^0.5.7: +source-map@^0.5.0, source-map@^0.5.7: version "0.5.7" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz#8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc" integrity sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w= @@ -8859,13 +7884,6 @@ source-map@^0.7.3: resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" integrity sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ== -split-string@^3.0.1, split-string@^3.0.2: - version "3.1.0" - resolved "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz#7cb09dda3a86585705c64b39a6466038682e8fe2" - integrity sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw== - dependencies: - extend-shallow "^3.0.0" - split2@^3.1.1: version "3.2.2" resolved "https://registry.yarnpkg.com/split2/-/split2-3.2.2.tgz#bf2cf2a37d838312c249c89206fd7a17dd12365f" @@ -8892,27 +7910,10 @@ stack-utils@^2.0.3: dependencies: escape-string-regexp "^2.0.0" -static-extend@^0.1.1: - version "0.1.2" - resolved "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz#60809c39cbff55337226fd5e0b520f341f1fb5c6" - integrity sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY= - dependencies: - define-property "^0.2.5" - object-copy "^0.1.0" - -"statuses@>= 1.5.0 < 2", statuses@~1.5.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz#161c7dac177659fd9811f43771fa99381478628c" - integrity sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow= - -string-width@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz#22767be21b62af1081574306f69ac51b62203961" - integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w== - dependencies: - emoji-regex "^7.0.1" - is-fullwidth-code-point "^2.0.0" - strip-ansi "^5.1.0" +statuses@2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-2.0.1.tgz#55cb000ccf1d48728bd23c685a063998cf1a1b63" + integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ== string-width@^4.0.0, string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.2, string-width@^4.2.3: version "4.2.3" @@ -8994,13 +7995,6 @@ string_decoder@~1.1.1: dependencies: safe-buffer "~5.1.0" -strip-ansi@^5.1.0, strip-ansi@^5.2.0: - version "5.2.0" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz#8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" @@ -9013,7 +8007,7 @@ strip-bom@^3.0.0: resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" integrity sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM= -strip-json-comments@3.1.1, strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: +strip-json-comments@3.1.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1.1: version "3.1.1" resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== @@ -9044,22 +8038,21 @@ superagent@^3.7.0: qs "^6.5.1" readable-stream "^2.3.5" -superagent@^7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/superagent/-/superagent-7.1.1.tgz#2ab187d38c3078c31c3771c0b751f10163a27136" - integrity sha512-CQ2weSS6M+doIwwYFoMatklhRbx6sVNdB99OEJ5czcP3cng76Ljqus694knFWgOj3RkrtxZqIgpe6vhe0J7QWQ== +superagent@^8.0.8: + version "8.0.8" + resolved "https://registry.yarnpkg.com/superagent/-/superagent-8.0.8.tgz#345f06f552dc23f3581f2c30fda7d6ad247f146d" + integrity sha512-OpxPrqqWKOjmuomLq5pCm4LWCSFdgAQ11XVkMl7t4ie13WxWuLkdJ83ZgG2jOQeLXKwMR2p9k30hLrKGAzkPaA== dependencies: component-emitter "^1.3.0" - cookiejar "^2.1.3" - debug "^4.3.3" + cookiejar "^2.1.4" + debug "^4.3.4" fast-safe-stringify "^2.1.1" form-data "^4.0.0" - formidable "^2.0.1" + formidable "^2.1.2" methods "^1.1.2" - mime "^2.5.0" - qs "^6.10.1" - readable-stream "^3.6.0" - semver "^7.3.5" + mime "2.6.0" + qs "^6.11.0" + semver "^7.3.8" supports-color@8.1.1, supports-color@^8.0.0, supports-color@^8.1.1: version "8.1.1" @@ -9094,52 +8087,42 @@ supports-preserve-symlinks-flag@^1.0.0: resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== -swagger-jsdoc@^6.2.5: - version "6.2.5" - resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-6.2.5.tgz#65bffa142276436b2b131255f59a6b55384a0e8e" - integrity sha512-l+cdsKS2y+QDhrH1TJSUiE0y9XKuf5xaGSatjf0hR/wjTlMpO8WfubBK9d/nASdbHPMtj9iJZLBH2ogBEhL7Sw== +swagger-jsdoc@^6.2.8: + version "6.2.8" + resolved "https://registry.yarnpkg.com/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz#6d33d9fb07ff4a7c1564379c52c08989ec7d0256" + integrity sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ== dependencies: commander "6.2.0" doctrine "3.0.0" glob "7.1.6" lodash.mergewith "^4.6.2" - swagger-parser "10.0.2" + swagger-parser "^10.0.3" yaml "2.0.0-1" -swagger-parser@10.0.2: - version "10.0.2" - resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-10.0.2.tgz#d7f18faa09c9c145e938977c9bd6c3435998b667" - integrity sha512-9jHkHM+QXyLGFLk1DkXBwV+4HyNm0Za3b8/zk/+mjr8jgOSiqm3FOTHBSDsBjtn9scdL+8eWcHdupp2NLM8tDw== +swagger-parser@^10.0.3: + version "10.0.3" + resolved "https://registry.yarnpkg.com/swagger-parser/-/swagger-parser-10.0.3.tgz#04cb01c18c3ac192b41161c77f81e79309135d03" + integrity sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg== dependencies: - "@apidevtools/swagger-parser" "10.0.2" + "@apidevtools/swagger-parser" "10.0.3" -swagger-ui-dist@>=4.1.3: - version "4.1.3" - resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.1.3.tgz#2be9f9de9b5c19132fa4a5e40933058c151563dc" - integrity sha512-WvfPSfAAMlE/sKS6YkW47nX/hA7StmhYnAHc6wWCXNL0oclwLj6UXv0hQCkLnDgvebi0MEV40SJJpVjKUgH1IQ== +swagger-ui-dist@>=4.11.0: + version "4.15.5" + resolved "https://registry.yarnpkg.com/swagger-ui-dist/-/swagger-ui-dist-4.15.5.tgz#cda226a79db2a9192579cc1f37ec839398a62638" + integrity sha512-V3eIa28lwB6gg7/wfNvAbjwJYmDXy1Jo1POjyTzlB6wPcHiGlRxq39TSjYGVjQrUSAzpv+a7nzp7mDxgNy57xA== -swagger-ui-express@^4.3.0: - version "4.3.0" - resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.3.0.tgz#226238ab231f7718f9109d63a66efc3a795618dd" - integrity sha512-jN46SEEe9EoXa3ZgZoKgnSF6z0w3tnM1yqhO4Y+Q4iZVc8JOQB960EZpIAz6rNROrDApVDwcMHR0mhlnc/5Omw== +swagger-ui-express@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/swagger-ui-express/-/swagger-ui-express-4.6.0.tgz#fc297d80c614c80f5d7def3dab50b56428cfe1c9" + integrity sha512-ZxpQFp1JR2RF8Ar++CyJzEDdvufa08ujNUJgMVTMWPi86CuQeVdBtvaeO/ysrz6dJAYXf9kbVNhWD7JWocwqsA== dependencies: - swagger-ui-dist ">=4.1.3" + swagger-ui-dist ">=4.11.0" symbol-tree@^3.2.4: version "3.2.4" resolved "https://registry.yarnpkg.com/symbol-tree/-/symbol-tree-3.2.4.tgz#430637d248ba77e078883951fb9aa0eed7c63fa2" integrity sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw== -table@^5.2.3: - version "5.4.6" - resolved "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz#1292d19500ce3f86053b05f0e8e7e4a3bb21079e" - integrity sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug== - dependencies: - ajv "^6.10.2" - lodash "^4.17.14" - slice-ansi "^2.1.0" - string-width "^3.0.0" - table@^6.0.9: version "6.7.5" resolved "https://registry.yarnpkg.com/table/-/table-6.7.5.tgz#f04478c351ef3d8c7904f0e8be90a1b62417d238" @@ -9156,7 +8139,7 @@ tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== -tarn@^3.0.1: +tarn@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/tarn/-/tarn-3.0.2.tgz#73b6140fbb881b71559c4f8bfde3d9a4b3d27693" integrity sha512-51LAVKUSZSVfI05vjPESNc5vwqqZpbXCsU+/+wxlOrUjk2SnFTt97v9ZgQrD4YmxYW1Px6w2KjaDitCfkvgxMQ== @@ -9196,11 +8179,6 @@ text-table@^0.2.0: resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= -through@^2.3.6: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= - tildify@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/tildify/-/tildify-2.0.0.tgz#f205f3674d677ce698b7067a99e949ce03b4754a" @@ -9214,13 +8192,6 @@ timers-ext@^0.1.7: es5-ext "~0.10.46" next-tick "1" -tmp@^0.0.33: - version "0.0.33" - resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" - integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== - dependencies: - os-tmpdir "~1.0.2" - tmpl@1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.5.tgz#8683e0b902bb9c20c4f726e3c0b69f36518c07cc" @@ -9231,26 +8202,11 @@ to-fast-properties@^2.0.0: resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" integrity sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4= -to-object-path@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" - integrity sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68= - dependencies: - kind-of "^3.0.2" - to-readable-stream@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/to-readable-stream/-/to-readable-stream-1.0.0.tgz#ce0aa0c2f3df6adf852efb404a783e77c0475771" integrity sha512-Iq25XBt6zD5npPhlLVXGFN3/gyR2/qODcKNNyTMd4vbm39HUaOiAM4PMq0eMVC/Tkxz+Zjdsc55g9yyz+Yq00Q== -to-regex-range@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz#7c80c17b9dfebe599e27367e0d4dd5590141db38" - integrity sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg= - dependencies: - is-number "^3.0.0" - repeat-string "^1.6.1" - 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" @@ -9258,16 +8214,6 @@ to-regex-range@^5.0.1: dependencies: is-number "^7.0.0" -to-regex@^3.0.1, to-regex@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz#13cfdd9b336552f30b51f33a8ae1b42a7a7599ce" - integrity sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw== - dependencies: - define-property "^2.0.2" - extend-shallow "^3.0.2" - regex-not "^1.0.2" - safe-regex "^1.1.0" - toidentifier@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.1.tgz#3be34321a88a820ed1bd80dfaa33e479fbb8dd35" @@ -9318,7 +8264,7 @@ tsconfig-paths@^3.14.1: minimist "^1.2.6" strip-bom "^3.0.0" -tslib@^1.8.1, tslib@^1.9.0: +tslib@^1.8.1: version "1.14.1" resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00" integrity sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg== @@ -9354,16 +8300,6 @@ type-fest@^0.20.2: resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.20.2.tgz#1bf207f4b28f91583666cb5fbd327887301cd5f4" integrity sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ== -type-fest@^0.21.3: - version "0.21.3" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.21.3.tgz#d260a24b0198436e133fa26a524a6d65fa3b2e37" - integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== - -type-fest@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz#09e249ebde851d3b1e48d27c105444667f17b83d" - integrity sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA== - type-is@~1.6.18: version "1.6.18" resolved "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -9426,11 +8362,6 @@ unbox-primitive@^1.0.2: has-symbols "^1.0.3" which-boxed-primitive "^1.0.2" -unc-path-regex@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/unc-path-regex/-/unc-path-regex-0.1.2.tgz#e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa" - integrity sha1-5z3T17DXxe2G+6xrCufYxqadUPo= - uncontrollable@^7.2.1: version "7.2.1" resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-7.2.1.tgz#1fa70ba0c57a14d5f78905d533cf63916dc75738" @@ -9476,16 +8407,6 @@ unicode-property-aliases-ecmascript@^2.0.0: resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz#0a36cb9a585c4f6abd51ad1deddb285c165297c8" integrity sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ== -union-value@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz#0b6fe7b835aecda61c6ea4d4f02c14221e109847" - integrity sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg== - dependencies: - arr-union "^3.1.0" - get-value "^2.0.6" - is-extendable "^0.1.1" - set-value "^2.0.1" - unique-string@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-2.0.0.tgz#39c6451f81afb2749de2b233e3f7c5e8843bd89d" @@ -9503,18 +8424,10 @@ unpipe@1.0.0, unpipe@~1.0.0: resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" integrity sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw= -unset-value@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" - integrity sha1-g3aHP30jNRef+x5vw6jtDfyKtVk= - dependencies: - has-value "^0.3.1" - isobject "^3.0.0" - -update-browserslist-db@^1.0.4: - version "1.0.5" - resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.5.tgz#be06a5eedd62f107b7c19eb5bcefb194411abf38" - integrity sha512-dteFFpCyvuDdr9S/ff1ISkKt/9YZxKjI9WlRR99c180GaztJtRa/fn18FdxGVKVsnPY7/a/FDN68mcvUmP4U7Q== +update-browserslist-db@^1.0.9: + version "1.0.10" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz#0f54b876545726f17d00cd9a2561e6dade943ff3" + integrity sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ== dependencies: escalade "^3.1.1" picocolors "^1.0.0" @@ -9546,11 +8459,6 @@ uri-js@^4.2.2: dependencies: punycode "^2.1.0" -urix@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz#da937f7a62e21fec1fd18d49b35c2935067a6c72" - integrity sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI= - url-parse-lax@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-3.0.0.tgz#16b5cafc07dbe3676c1b1999177823d6503acb0c" @@ -9558,11 +8466,6 @@ url-parse-lax@^3.0.0: dependencies: prepend-http "^2.0.0" -use@^3.1.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz#d50c8cac79a19fbc20f2911f56eb973f4e10070f" - integrity sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ== - util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" @@ -9588,14 +8491,14 @@ v8-compile-cache@^2.0.3: resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz#2de19618c66dc247dcfb6f99338035d8245a2cee" integrity sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA== -v8flags@^3.1.1, v8flags@^3.2.0: +v8flags@^3.1.1: version "3.2.0" resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-3.2.0.tgz#b243e3b4dfd731fa774e7492128109a0fe66d656" integrity sha512-mH8etigqMfiGWdeXpaaqGfs6BndypxusHHcv2qSHyZkGEznCd/qAXCWWRzeowtL54147cktFOC4P5y+kl8d8Jg== dependencies: homedir-polyfill "^1.0.1" -validator@^13.6.0, validator@^13.7.0: +validator@^13.7.0: version "13.7.0" resolved "https://registry.yarnpkg.com/validator/-/validator-13.7.0.tgz#4f9658ba13ba8f3d82ee881d3516489ea85c0857" integrity sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw== @@ -9640,10 +8543,10 @@ warning@^4.0.0, warning@^4.0.2, warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^2.3.1: - version "2.3.1" - resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25" - integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA== +watchpack@^2.4.0: + version "2.4.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d" + integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -9730,34 +8633,34 @@ webpack-sources@^3.2.3: resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== -webpack@^5.69.1: - version "5.69.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.69.1.tgz#8cfd92c192c6a52c99ab00529b5a0d33aa848dc5" - integrity sha512-+VyvOSJXZMT2V5vLzOnDuMz5GxEqLk7hKWQ56YxPW/PQRUuKimPqmEIJOx8jHYeyo65pKbapbW464mvsKbaj4A== +webpack@^5.76.0: + version "5.76.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.0.tgz#f9fb9fb8c4a7dbdcd0d56a98e56b8a942ee2692c" + integrity sha512-l5sOdYBDunyf72HW8dF23rFtWq/7Zgvt/9ftMof71E/yUb1YLOBmTgA2K4vQthB3kotMrSj609txVE0dnr2fjA== dependencies: "@types/eslint-scope" "^3.7.3" "@types/estree" "^0.0.51" "@webassemblyjs/ast" "1.11.1" "@webassemblyjs/wasm-edit" "1.11.1" "@webassemblyjs/wasm-parser" "1.11.1" - acorn "^8.4.1" + acorn "^8.7.1" acorn-import-assertions "^1.7.6" browserslist "^4.14.5" chrome-trace-event "^1.0.2" - enhanced-resolve "^5.8.3" + enhanced-resolve "^5.10.0" es-module-lexer "^0.9.0" eslint-scope "5.1.1" events "^3.2.0" glob-to-regexp "^0.4.1" graceful-fs "^4.2.9" - json-parse-better-errors "^1.0.2" + json-parse-even-better-errors "^2.3.1" loader-runner "^4.2.0" mime-types "^2.1.27" neo-async "^2.6.2" schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.3.1" + watchpack "^2.4.0" webpack-sources "^3.2.3" whatwg-encoding@^1.0.5: @@ -9819,13 +8722,6 @@ which@2.0.2, which@^2.0.1: dependencies: isexe "^2.0.0" -which@^1.2.14, which@^1.2.9: - version "1.3.1" - resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" - integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== - dependencies: - isexe "^2.0.0" - widest-line@^3.1.0: version "3.1.0" resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-3.1.0.tgz#8292333bbf66cb45ff0de1603b136b7ae1496eca" @@ -9880,13 +8776,6 @@ write-file-atomic@^4.0.1: imurmurhash "^0.1.4" signal-exit "^3.0.7" -write@1.0.3: - version "1.0.3" - resolved "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz#0800e14523b923a387e415123c865616aae0f5c3" - integrity sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig== - dependencies: - mkdirp "^0.5.1" - ws@^7.3.1, ws@^7.4.6: version "7.5.6" resolved "https://registry.yarnpkg.com/ws/-/ws-7.5.6.tgz#e59fc509fb15ddfb65487ee9765c5a51dec5fe7b" @@ -9927,11 +8816,16 @@ y18n@^5.0.5: resolved "https://registry.yarnpkg.com/y18n/-/y18n-5.0.8.tgz#7f4934d0f7ca8c56f95314939ddcd2dd91ce1d55" integrity sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA== -yallist@^4.0.0: +yallist@4.0.0, 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== +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + yaml@2.0.0-1: version "2.0.0-1" resolved "https://registry.yarnpkg.com/yaml/-/yaml-2.0.0-1.tgz#8c3029b3ee2028306d5bcf396980623115ff8d18" @@ -9998,13 +8892,13 @@ yocto-queue@^0.1.0: resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b" integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q== -z-schema@^4.2.3: - version "4.2.4" - resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-4.2.4.tgz#73102a49512179b12a8ec50b1daa676b984da6e4" - integrity sha512-YvBeW5RGNeNzKOUJs3rTL4+9rpcvHXt5I051FJbOcitV8bl40pEfcG0Q+dWSwS0/BIYrMZ/9HHoqLllMkFhD0w== +z-schema@^5.0.1: + version "5.0.6" + resolved "https://registry.yarnpkg.com/z-schema/-/z-schema-5.0.6.tgz#46d6a687b15e4a4369e18d6cb1c7b8618fc256c5" + integrity sha512-+XR1GhnWklYdfr8YaZv/iu+vY+ux7V5DS5zH1DQf6bO5ufrt/5cgNhVO5qyhsjFXvsqQb/f08DWE9b6uPscyAg== dependencies: lodash.get "^4.4.2" lodash.isequal "^4.5.0" - validator "^13.6.0" + validator "^13.7.0" optionalDependencies: - commander "^2.7.1" + commander "^10.0.0"
    NameName Series Type Ordering Type
    NameDescriptionEntity TypeEntitiesNameDescriptionEntity TypeEntitiesPrivacyPrivacyCollaborator/OwnerCollaborator/OwnerOwnerOwnerLast ModifiedLast Modified
    Revision IDRevision IDModified entitiesModified entitiesUserUserNoteNoteDateDate
    TypeNameAliasesTypeNameAliases
    #Editor's NameTotal RevisionsRegistration Date#Editor's NameTotal RevisionsRegistration Date
    #Entity TypeTotalAdded in Last 30 days#Entity TypeTotalAdded in Last 30 days