diff --git a/.circleci/config.yml b/.circleci/config.yml
index e273b4300f..951a2075ad 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -462,6 +462,8 @@ jobs:
command: |
cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/web/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../..
TEST_BIG_DB_DUMP=$TEST_BIG_DB_DUMP \
+ RI_SERVER_TLS_CERT="$RI_SERVER_TLS_CERT" \
+ RI_SERVER_TLS_KEY="$RI_SERVER_TLS_KEY" \
docker-compose \
-f tests/e2e/rte.docker-compose.yml \
-f tests/e2e/docker.web.docker-compose.yml \
@@ -476,6 +478,8 @@ jobs:
command: |
cd tests/e2e && export TEST_FILES=$(circleci tests glob "tests/web/**/*.e2e.ts" | circleci tests split --split-by=timings) && cd ../..
TEST_BIG_DB_DUMP=$TEST_BIG_DB_DUMP \
+ RI_SERVER_TLS_CERT="$RI_SERVER_TLS_CERT" \
+ RI_SERVER_TLS_KEY="$RI_SERVER_TLS_KEY" \
docker-compose \
-f tests/e2e/rte.docker-compose.yml \
-f tests/e2e/local.web.docker-compose.yml \
@@ -618,11 +622,11 @@ jobs:
export RI_CLOUD_CAPI_URL=$RI_CLOUD_CAPI_URL_STAGE
if [ << parameters.env >> == 'stage' ]; then
- UPGRADES_LINK=$UPGRADES_LINK_STAGE SEGMENT_WRITE_KEY=$SEGMENT_WRITE_KEY_STAGE yarn package:stage --linux << parameters.target >>
+ RI_UPGRADES_LINK=$RI_UPGRADES_LINK_STAGE RI_SEGMENT_WRITE_KEY=$RI_SEGMENT_WRITE_KEY_STAGE yarn package:stage --linux << parameters.target >>
exit 0;
fi
- UPGRADES_LINK='' SEGMENT_WRITE_KEY='' yarn package:stage --linux << parameters.target >>
+ RI_UPGRADES_LINK='' RI_SEGMENT_WRITE_KEY='' yarn package:stage --linux << parameters.target >>
- when:
condition:
equal: [ true, << parameters.redisstack >> ]
@@ -710,12 +714,12 @@ jobs:
export RI_CLOUD_IDP_GH_ID=$RI_CLOUD_IDP_GH_ID_STAGE
export RI_CLOUD_API_URL=$RI_CLOUD_API_URL_STAGE
export RI_CLOUD_CAPI_URL=$RI_CLOUD_CAPI_URL_STAGE
- export UPGRADES_LINK=''
- export SEGMENT_WRITE_KEY=''
+ export RI_UPGRADES_LINK=''
+ export RI_SEGMENT_WRITE_KEY=''
if [ << parameters.env >> == 'stage' ]; then
- export UPGRADES_LINK=$UPGRADES_LINK_STAGE
- export SEGMENT_WRITE_KEY=$SEGMENT_WRITE_KEY_STAGE
+ export RI_UPGRADES_LINK=$RI_UPGRADES_LINK_STAGE
+ export RI_SEGMENT_WRITE_KEY=$RI_SEGMENT_WRITE_KEY_STAGE
fi
# handle manual builds
@@ -792,9 +796,9 @@ jobs:
export RI_CLOUD_CAPI_URL=$RI_CLOUD_CAPI_URL_STAGE
if [ << parameters.env >> == 'stage' ]; then
- UPGRADES_LINK=$UPGRADES_LINK_STAGE SEGMENT_WRITE_KEY=$SEGMENT_WRITE_KEY_STAGE yarn package:stage --win << parameters.target >>
+ RI_UPGRADES_LINK=$RI_UPGRADES_LINK_STAGE RI_SEGMENT_WRITE_KEY=$RI_SEGMENT_WRITE_KEY_STAGE yarn package:stage --win << parameters.target >>
else
- UPGRADES_LINK='' SEGMENT_WRITE_KEY='' yarn package:stage --win << parameters.target >>
+ RI_UPGRADES_LINK='' RI_SEGMENT_WRITE_KEY='' yarn package:stage --win << parameters.target >>
fi
rm -rf release/win-unpacked
@@ -860,20 +864,18 @@ jobs:
- run:
name: Build Docker image (API + UI)
command: |
- TELEMETRY=$SEGMENT_WRITE_KEY_DEV
+ TELEMETRY=$RI_SEGMENT_WRITE_KEY_DEV
if [ << parameters.env >> == 'production' ]; then
- TELEMETRY=$SEGMENT_WRITE_KEY
+ TELEMETRY=$RI_SEGMENT_WRITE_KEY
fi
if [ << parameters.env >> == 'staging' ]; then
- TELEMETRY=$SEGMENT_WRITE_KEY_STAGE
+ TELEMETRY=$RI_SEGMENT_WRITE_KEY_STAGE
fi
docker build --build-arg NODE_ENV=<< parameters.env >> \
- --build-arg SERVER_TLS_CERT="$SERVER_TLS_CERT" \
- --build-arg SERVER_TLS_KEY="$SERVER_TLS_KEY" \
- --build-arg SEGMENT_WRITE_KEY="$TELEMETRY" \
+ --build-arg RI_SEGMENT_WRITE_KEY="$TELEMETRY" \
-t riv2:latest .
mkdir -p docker-release
@@ -1154,6 +1156,9 @@ workflows:
- Setup sign certificates (stage)
- linux:
name: Build app - Linux (stage)
+ env: stage
+ redisstack: false
+ target: AppImage
requires:
- Setup build (stage)
- docker:
diff --git a/.circleci/e2e/test.app-image.sh b/.circleci/e2e/test.app-image.sh
index 66c7b75c3e..766399009a 100755
--- a/.circleci/e2e/test.app-image.sh
+++ b/.circleci/e2e/test.app-image.sh
@@ -17,5 +17,5 @@ docker-compose -f tests/e2e/rte.docker-compose.yml up --force-recreate -d -V
# run tests
COMMON_URL=$(tail -n 1 apppath)/resources/app.asar/dist/renderer/index.html \
ELECTRON_PATH=$(tail -n 1 apppath)/redisinsight \
-SOCKETS_CORS=true \
+RI_SOCKETS_CORS=true \
yarn --cwd tests/e2e dotenv -e .desktop.env yarn --cwd tests/e2e test:desktop:ci
diff --git a/.circleci/e2e/test.exe.cmd b/.circleci/e2e/test.exe.cmd
index 052eeeccd7..93eb0739fd 100755
--- a/.circleci/e2e/test.exe.cmd
+++ b/.circleci/e2e/test.exe.cmd
@@ -6,7 +6,7 @@ set OSS_STANDALONE_HOST=%E2E_CLOUD_DATABASE_HOST%
set OSS_STANDALONE_PORT=%E2E_CLOUD_DATABASE_PORT%
set OSS_STANDALONE_USERNAME=%E2E_CLOUD_DATABASE_USERNAME%
set OSS_STANDALONE_PASSWORD=%E2E_CLOUD_DATABASE_PASSWORD%
-set SOCKETS_CORS=true
+set RI_SOCKETS_CORS=true
call yarn --cwd tests/e2e install
diff --git a/.circleci/redisstack/app-image.repack.sh b/.circleci/redisstack/app-image.repack.sh
index 438c68c546..50dba88d64 100755
--- a/.circleci/redisstack/app-image.repack.sh
+++ b/.circleci/redisstack/app-image.repack.sh
@@ -4,7 +4,7 @@ set -e
ARCH=${ARCH:-x86_64}
WORKING_DIRECTORY=$(pwd)
SOURCE_APP=${SOURCE_APP:-"RedisInsight-linux-$ARCH.AppImage"}
-APP_FOLDER_NAME="RedisInsight-linux"
+RI_APP_FOLDER_NAME="RedisInsight-linux"
TAR_NAME="RedisInsight-app-linux.$ARCH.tar.gz"
TMP_FOLDER="/tmp/RedisInsight-app-$ARCH"
@@ -17,9 +17,9 @@ cp "./release/$SOURCE_APP" "$TMP_FOLDER"
cd "$TMP_FOLDER" || exit 1
./"$SOURCE_APP" --appimage-extract
-mv squashfs-root "$APP_FOLDER_NAME"
+mv squashfs-root "$RI_APP_FOLDER_NAME"
-tar -czvf "$TAR_NAME" "$APP_FOLDER_NAME"
+tar -czvf "$TAR_NAME" "$RI_APP_FOLDER_NAME"
cp "$TAR_NAME" "$WORKING_DIRECTORY/release/redisstack/"
cd "$WORKING_DIRECTORY" || exit 1
diff --git a/.circleci/redisstack/dmg.repack.sh b/.circleci/redisstack/dmg.repack.sh
index 6b5f855876..a16ff955e3 100755
--- a/.circleci/redisstack/dmg.repack.sh
+++ b/.circleci/redisstack/dmg.repack.sh
@@ -4,8 +4,8 @@ set -e
ARCH=${ARCH:-x64}
WORKING_DIRECTORY=$(pwd)
TAR_NAME="RedisInsight-app-darwin.$ARCH.tar.gz"
-APP_FOLDER_NAME="RedisInsight.app"
-TMP_FOLDER="/tmp/$APP_FOLDER_NAME"
+RI_APP_FOLDER_NAME="RedisInsight.app"
+TMP_FOLDER="/tmp/$RI_APP_FOLDER_NAME"
rm -rf "$TMP_FOLDER"
@@ -15,7 +15,7 @@ mkdir -p "$TMP_FOLDER"
hdiutil attach "./release/RedisInsight-mac-$ARCH.dmg"
cp -a /Volumes/RedisInsight*/RedisInsight.app "/tmp"
cd "/tmp" || exit 1
-tar -czvf "$TAR_NAME" "$APP_FOLDER_NAME"
+tar -czvf "$TAR_NAME" "$RI_APP_FOLDER_NAME"
cp "$TAR_NAME" "$WORKING_DIRECTORY/release/redisstack/"
cd "$WORKING_DIRECTORY" || exit 1
hdiutil unmount /Volumes/RedisInsight*/
diff --git a/DOCKER_README.md b/DOCKER_README.md
new file mode 100644
index 0000000000..ea2e3a61d5
--- /dev/null
+++ b/DOCKER_README.md
@@ -0,0 +1,26 @@
+# Docker
+
+Included in this repository is a Dockerfile that can be used to deploy a hosted instance of Redis Insight.
+
+# Usage
+
+To build and run the image locally with Docker buildx, simply
+
+```
+$ docker buildx build -t redis-insight:latest
+$ docker run -d -p5000:5000 redis-insight:latest
+```
+
+These commands will build the image and then start the container. Redis Insight can then be accessed on localhost port 5000, `http://localhost:5000`.
+
+# Configuration
+
+Redis Insight supports several configuration values that can be supplied via container environment variables. The following may be provided:
+
+| Variable | Purpose | Default | Additional Info |
+| ---------|---------|-----------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
+| RI_APP_PORT | The port the app listens on | 5000 | See [Express Documentation](https://expressjs.com/en/api.html#app.listen) |
+| RI_APP_HOST | The host the app listens on | 0.0.0.0 | See [Express Documentation](https://expressjs.com/en/api.html#app.listen) |
+| RI_SERVER_TLS_KEY | Private key for HTTPS | | Private key in [PEM format](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/#ftoc-heading-3). May be a path to a file or a string in PEM format. |
+| RI_SERVER_TLS_CERT | Certificate for supplied private key | | Public certificate in [PEM format](https://www.ssl.com/guide/pem-der-crt-and-cer-x-509-encodings-and-conversions/#ftoc-heading-3) |
+| RI_ENCRYPTION_KEY | Key to encrypt data with | | Redisinsight stores some data such as connection details locally (using [sqlite3](https://github.com/TryGhost/node-sqlite3)). It might be usefull to store sensitive data such as passwords, or private keys encrypted. For this case RedisInsight supports encryption with provided key.
Note: The Key must be the same for the same RedisInsight instance to be able to decrypt exising data. If for some reason the key was changed, you will have to enter the credentials again to connect to the Redis database. |
diff --git a/Dockerfile b/Dockerfile
index 0fdf31d2ff..751c85bf0b 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,88 +1,79 @@
-FROM node:18.15.0-alpine as front
-RUN apk update
-RUN apk add --no-cache --virtual .gyp \
+# this dockerfile has two stages, a build stage and the executable stage.
+# the build stage is responsible for building the frontend, the backend,
+# and the frontend's static assets. ideally, we could build the frontend and backend
+# independently and in parallel in different stages, but there is a dependency
+# on the backend to build those assets. until we fix that, this approach is
+# the best way to minimize the number of node_module restores and build steps
+# while still keeping the final image small.
+
+FROM node:18.18-alpine as build
+
+# update apk repository and install build dependencies
+RUN apk update && apk add --no-cache --virtual .gyp \
python3 \
make \
g++
+
+# set workdir
WORKDIR /usr/src/app
+
+# restore node_modules for front-end
COPY package.json yarn.lock babel.config.cjs tsconfig.json ./
RUN SKIP_POSTINSTALL=1 yarn install
+
+# prepare backend by copying scripts/configs and installing node modules
+# this is required to build the static assets
COPY configs ./configs
COPY scripts ./scripts
COPY redisinsight ./redisinsight
-RUN yarn --cwd redisinsight/api
-ARG SERVER_TLS_CERT
-ARG SERVER_TLS_KEY
-ARG SEGMENT_WRITE_KEY
-ENV SERVER_TLS_CERT=${SERVER_TLS_CERT}
-ENV SERVER_TLS_KEY=${SERVER_TLS_KEY}
-ENV SEGMENT_WRITE_KEY=${SEGMENT_WRITE_KEY}
+RUN yarn --cwd redisinsight/api install
+
+# build the frontend, static assets, and backend api
RUN yarn build:web
RUN yarn build:statics
+RUN yarn build:api
-FROM node:18.15.0-alpine as back
-WORKDIR /usr/src/app
-COPY redisinsight/api/package.json redisinsight/api/yarn.lock ./
-RUN yarn install
-COPY redisinsight/api ./
-COPY --from=front /usr/src/app/redisinsight/api/static ./static
-COPY --from=front /usr/src/app/redisinsight/api/defaults ./defaults
-RUN yarn run build:prod
-
-FROM node:18.15.0-slim
-# Set up mDNS functionality, to play well with Redis Enterprise
-# clusters on the network.
-RUN set -ex \
- && DEPS="avahi-daemon libnss-mdns" \
- && apt-get update && apt-get install -y --no-install-recommends $DEPS \
- # Disable nss-mdns's two-label limit heuristic so that host names
- # with multiple labels can be resolved.
- # E.g. redis-12000.rediscluster.local, which has 3 labels.
- # (https://github.com/lathiat/nss-mdns#etcmdnsallow)
- && echo '*' > /etc/mdns.allow \
- # Configure NSSwitch to use the mdns4 plugin so mdns.allow is respected
- && sed -i "s/hosts:.*/hosts: files mdns4 dns/g" /etc/nsswitch.conf \
- # We run a `avahi-daemon` without `dbus` so that we can start it as a
- # non-root user. `dbus` requires root permissions to start. And
- # anyway, there's a way to run `avahi-daemon` without `dbus` so why
- # shouldn't we use it. https://linux.die.net/man/5/avahi-daemon.conf
- && printf "[server]\nenable-dbus=no\n" >> /etc/avahi/avahi-daemon.conf \
- && chmod 777 /etc/avahi/avahi-daemon.conf \
- # We create the directory because when the first time `avahi-daemon`
- # is run, the directory doesn't exist and the `avahi-daemon` must have
- # permissions to create the directory under `/var`.
- && mkdir -p /var/run/avahi-daemon \
- # Change the permissions of the directories avahi will use.
- && chown avahi:avahi /var/run/avahi-daemon \
- && chmod 777 /var/run/avahi-daemon
-
-RUN apt-get install net-tools
-RUN apt-get install -y dbus-x11 gnome-keyring libsecret-1-0
-RUN dbus-uuidgen > /var/lib/dbus/machine-id
+# install backend _again_ to build native modules and remove dev dependencies,
+# then run autoclean to remove additional unnecessary files
+RUN yarn --cwd ./redisinsight/api install --production
+COPY ./redisinsight/api/.yarnclean.prod ./redisinsight/api/.yarnclean
+RUN yarn --cwd ./redisinsight/api autoclean --force
+
+FROM node:18.18-alpine
+# runtime args and environment variables
ARG NODE_ENV=production
-ARG SERVER_TLS_CERT
-ARG SERVER_TLS_KEY
-ARG SEGMENT_WRITE_KEY
-ENV SERVER_TLS_CERT=${SERVER_TLS_CERT}
-ENV SERVER_TLS_KEY=${SERVER_TLS_KEY}
-ENV SEGMENT_WRITE_KEY=${SEGMENT_WRITE_KEY}
+ARG RI_SEGMENT_WRITE_KEY
+ENV RI_SEGMENT_WRITE_KEY=${RI_SEGMENT_WRITE_KEY}
ENV NODE_ENV=${NODE_ENV}
-ENV SERVER_STATIC_CONTENT=true
-ENV BUILD_TYPE='DOCKER_ON_PREMISE'
+ENV RI_SERVE_STATICS=true
+ENV RI_BUILD_TYPE='DOCKER_ON_PREMISE'
+ENV RI_APP_FOLDER_ABSOLUTE_PATH='/data'
+
+# this resolves CVE-2023-5363
+# TODO: remove this line once we update to base image that doesn't have this vulnerability
+RUN apk update && apk upgrade --no-cache libcrypto3 libssl3
+
+# set workdir
WORKDIR /usr/src/app
-COPY --from=back /usr/src/app/dist ./redisinsight/api/dist
-COPY --from=front /usr/src/app/redisinsight/ui/dist ./redisinsight/ui/dist
-# Build BE prod dependencies here to build native modules
-COPY redisinsight/api/package.json redisinsight/api/yarn.lock ./redisinsight/api/
-RUN yarn --cwd ./redisinsight/api install --production
-COPY redisinsight/api/.yarnclean.prod ./redisinsight/api/.yarnclean
-RUN yarn --cwd ./redisinsight/api autoclean --force
+# copy artifacts built in previous stage to this one
+COPY --from=build --chown=node:node /usr/src/app/redisinsight/api/dist ./redisinsight/api/dist
+COPY --from=build --chown=node:node /usr/src/app/redisinsight/api/node_modules ./redisinsight/api/node_modules
+COPY --from=build --chown=node:node /usr/src/app/redisinsight/ui/dist ./redisinsight/ui/dist
-COPY ./docker-entry.sh ./
+# folder to store local database, plugins, logs and all other files
+RUN mkdir -p /data && chown -R node:node /data
+
+# copy the docker entry point script and make it executable
+COPY --chown=node:node ./docker-entry.sh ./
RUN chmod +x docker-entry.sh
+# since RI is hard-code to port 5000, expose it from the container
EXPOSE 5000
+# don't run the node process as root
+USER node
+
+# serve the application 🚀
ENTRYPOINT ["./docker-entry.sh", "node", "redisinsight/api/dist/src/main"]
diff --git a/api.Dockerfile b/api.Dockerfile
index 2b06187b04..41032de2df 100644
--- a/api.Dockerfile
+++ b/api.Dockerfile
@@ -26,7 +26,7 @@ RUN dbus-uuidgen > /var/lib/dbus/machine-id
ARG NODE_ENV=production
ENV NODE_ENV=${NODE_ENV}
-ENV BUILD_TYPE='DOCKER_ON_PREMISE'
+ENV RI_BUILD_TYPE='DOCKER_ON_PREMISE'
WORKDIR /usr/src/app
diff --git a/configs/webpack.config.main.prod.ts b/configs/webpack.config.main.prod.ts
index 26e592f3b8..553b5502fc 100644
--- a/configs/webpack.config.main.prod.ts
+++ b/configs/webpack.config.main.prod.ts
@@ -55,19 +55,18 @@ export default merge(baseConfig, {
NODE_ENV: 'production',
DEBUG_PROD: false,
START_MINIMIZED: false,
- APP_ENV: 'electron',
- SERVER_TLS: true,
- SERVER_TLS_CERT: process.env.SERVER_TLS_CERT || '',
- SERVER_TLS_KEY: process.env.SERVER_TLS_KEY || '',
- APP_FOLDER_NAME: process.env.APP_FOLDER_NAME || '',
- UPGRADES_LINK: process.env.UPGRADES_LINK || '',
- RI_HOSTNAME: '127.0.0.1',
- BUILD_TYPE: 'ELECTRON',
- APP_VERSION: version,
- AWS_BUCKET_NAME: 'AWS_BUCKET_NAME' in process.env ? process.env.AWS_BUCKET_NAME : '',
- SEGMENT_WRITE_KEY: 'SEGMENT_WRITE_KEY' in process.env ? process.env.SEGMENT_WRITE_KEY : 'SOURCE_WRITE_KEY',
- CONNECTIONS_TIMEOUT_DEFAULT: 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? process.env.CONNECTIONS_TIMEOUT_DEFAULT
+ RI_APP_TYPE: 'electron',
+ RI_SERVER_TLS_CERT: process.env.RI_SERVER_TLS_CERT || '',
+ RI_SERVER_TLS_KEY: process.env.RI_SERVER_TLS_KEY || '',
+ RI_SERVE_STATICS: false,
+ RI_APP_FOLDER_NAME: process.env.RI_APP_FOLDER_NAME || '',
+ RI_UPGRADES_LINK: process.env.RI_UPGRADES_LINK || '',
+ RI_APP_HOST: '127.0.0.1',
+ RI_BUILD_TYPE: 'ELECTRON',
+ RI_APP_VERSION: version,
+ RI_SEGMENT_WRITE_KEY: 'RI_SEGMENT_WRITE_KEY' in process.env ? process.env.RI_SEGMENT_WRITE_KEY : 'SOURCE_WRITE_KEY',
+ RI_CONNECTIONS_TIMEOUT_DEFAULT: 'RI_CONNECTIONS_TIMEOUT_DEFAULT' in process.env
+ ? process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT
: toString(30 * 1000), // 30 sec
// cloud auth
RI_CLOUD_IDP_AUTHORIZE_URL: 'RI_CLOUD_IDP_AUTHORIZE_URL' in process.env ? process.env.RI_CLOUD_IDP_AUTHORIZE_URL: '',
diff --git a/configs/webpack.config.main.stage.ts b/configs/webpack.config.main.stage.ts
index ce04fc8c7d..b264c3f37d 100644
--- a/configs/webpack.config.main.stage.ts
+++ b/configs/webpack.config.main.stage.ts
@@ -1,10 +1,8 @@
import webpack from 'webpack';
import { merge } from 'webpack-merge';
-import { toString } from 'lodash';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import mainProdConfig from './webpack.config.main.prod';
import DeleteSourceMaps from '../scripts/DeleteSourceMaps';
-import { version } from '../redisinsight/package.json';
DeleteSourceMaps();
@@ -18,22 +16,6 @@ export default merge(mainProdConfig, {
new webpack.EnvironmentPlugin({
NODE_ENV: 'staging',
- DEBUG_PROD: false,
- START_MINIMIZED: false,
- APP_ENV: 'electron',
- SERVER_TLS: true,
- SERVER_TLS_CERT: process.env.SERVER_TLS_CERT || '',
- SERVER_TLS_KEY: process.env.SERVER_TLS_KEY || '',
- APP_FOLDER_NAME: process.env.APP_FOLDER_NAME || '',
- UPGRADES_LINK: process.env.UPGRADES_LINK || '',
- RI_HOSTNAME: '127.0.0.1',
- BUILD_TYPE: 'ELECTRON',
- APP_VERSION: version,
- AWS_BUCKET_NAME: 'AWS_BUCKET_NAME' in process.env ? process.env.AWS_BUCKET_NAME : '',
- SEGMENT_WRITE_KEY: 'SEGMENT_WRITE_KEY' in process.env ? process.env.SEGMENT_WRITE_KEY : 'SOURCE_WRITE_KEY',
- CONNECTIONS_TIMEOUT_DEFAULT: 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? process.env.CONNECTIONS_TIMEOUT_DEFAULT
- : toString(30 * 1000), // 30 sec
}),
],
});
diff --git a/configs/webpack.config.renderer.dev.ts b/configs/webpack.config.renderer.dev.ts
index 85a5631685..e7de3ea5ba 100644
--- a/configs/webpack.config.renderer.dev.ts
+++ b/configs/webpack.config.renderer.dev.ts
@@ -252,20 +252,20 @@ const configuration: webpack.Configuration = {
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('development'),
- 'process.env.APP_ENV': JSON.stringify('web'),
- 'process.env.API_PREFIX': JSON.stringify('api'),
- 'process.env.BASE_API_URL': JSON.stringify('http://localhost'),
- 'process.env.RESOURCES_BASE_URL': JSON.stringify('http://localhost'),
- 'process.env.SCAN_COUNT_DEFAULT': JSON.stringify('500'),
- 'process.env.SCAN_TREE_COUNT_DEFAULT': JSON.stringify('10000'),
- 'process.env.PIPELINE_COUNT_DEFAULT': JSON.stringify('5'),
- 'process.env.BUILD_TYPE': JSON.stringify('ELECTRON'),
- 'process.env.APP_VERSION': JSON.stringify(version),
- 'process.env.CONNECTIONS_TIMEOUT_DEFAULT': 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? JSON.stringify(process.env.CONNECTIONS_TIMEOUT_DEFAULT)
+ 'process.env.RI_APP_TYPE': JSON.stringify('web'),
+ 'process.env.RI_API_PREFIX': JSON.stringify('api'),
+ 'process.env.RI_BASE_API_URL': JSON.stringify('http://localhost'),
+ 'process.env.RI_RESOURCES_BASE_URL': JSON.stringify('http://localhost'),
+ 'process.env.RI_SCAN_COUNT_DEFAULT': JSON.stringify('500'),
+ 'process.env.RI_SCAN_TREE_COUNT_DEFAULT': JSON.stringify('10000'),
+ 'process.env.RI_PIPELINE_COUNT_DEFAULT': JSON.stringify('5'),
+ 'process.env.RI_BUILD_TYPE': JSON.stringify('ELECTRON'),
+ 'process.env.RI_APP_VERSION': JSON.stringify(version),
+ 'process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT': 'RI_CONNECTIONS_TIMEOUT_DEFAULT' in process.env
+ ? JSON.stringify(process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT)
: JSON.stringify(30 * 1000),
- 'process.env.SEGMENT_WRITE_KEY': 'SEGMENT_WRITE_KEY' in process.env
- ? JSON.stringify(process.env.SEGMENT_WRITE_KEY)
+ 'process.env.RI_SEGMENT_WRITE_KEY': 'RI_SEGMENT_WRITE_KEY' in process.env
+ ? JSON.stringify(process.env.RI_SEGMENT_WRITE_KEY)
: JSON.stringify('SOURCE_WRITE_KEY'),
}),
],
diff --git a/configs/webpack.config.renderer.prod.ts b/configs/webpack.config.renderer.prod.ts
index cfe710961b..cb48ea2604 100644
--- a/configs/webpack.config.renderer.prod.ts
+++ b/configs/webpack.config.renderer.prod.ts
@@ -12,7 +12,7 @@ import { version } from '../redisinsight/package.json';
DeleteSourceMaps();
const htmlPagesNames = ['splash.ejs', 'index.ejs']
-const apiUrl = process.env.SERVER_TLS_CERT && process.env.SERVER_TLS_KEY
+const apiUrl = process.env.RI_SERVER_TLS_CERT && process.env.RI_SERVER_TLS_KEY
? 'https://localhost'
: 'http://localhost'
@@ -202,20 +202,20 @@ const configuration: webpack.Configuration = {
new webpack.DefinePlugin({
'process.type': '"renderer"',
'process.env.NODE_ENV': JSON.stringify('development'),
- 'process.env.APP_ENV': JSON.stringify('electron'),
- 'process.env.API_PREFIX': JSON.stringify('api'),
- 'process.env.BASE_API_URL': JSON.stringify(apiUrl),
- 'process.env.RESOURCES_BASE_URL': JSON.stringify(apiUrl),
- 'process.env.SCAN_COUNT_DEFAULT': JSON.stringify('500'),
- 'process.env.SCAN_TREE_COUNT_DEFAULT': JSON.stringify('10000'),
- 'process.env.PIPELINE_COUNT_DEFAULT': JSON.stringify('5'),
- 'process.env.BUILD_TYPE': JSON.stringify('ELECTRON'),
- 'process.env.APP_VERSION': JSON.stringify(version),
- 'process.env.CONNECTIONS_TIMEOUT_DEFAULT': 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? JSON.stringify(process.env.CONNECTIONS_TIMEOUT_DEFAULT)
+ 'process.env.RI_APP_TYPE': JSON.stringify('electron'),
+ 'process.env.RI_API_PREFIX': JSON.stringify('api'),
+ 'process.env.RI_BASE_API_URL': JSON.stringify(apiUrl),
+ 'process.env.RI_RESOURCES_BASE_URL': JSON.stringify(apiUrl),
+ 'process.env.RI_SCAN_COUNT_DEFAULT': JSON.stringify('500'),
+ 'process.env.RI_SCAN_TREE_COUNT_DEFAULT': JSON.stringify('10000'),
+ 'process.env.RI_PIPELINE_COUNT_DEFAULT': JSON.stringify('5'),
+ 'process.env.RI_BUILD_TYPE': JSON.stringify('ELECTRON'),
+ 'process.env.RI_APP_VERSION': JSON.stringify(version),
+ 'process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT': 'RI_CONNECTIONS_TIMEOUT_DEFAULT' in process.env
+ ? JSON.stringify(process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT)
: JSON.stringify(30 * 1000),
- 'process.env.SEGMENT_WRITE_KEY': 'SEGMENT_WRITE_KEY' in process.env
- ? JSON.stringify(process.env.SEGMENT_WRITE_KEY)
+ 'process.env.RI_SEGMENT_WRITE_KEY': 'RI_SEGMENT_WRITE_KEY' in process.env
+ ? JSON.stringify(process.env.RI_SEGMENT_WRITE_KEY)
: JSON.stringify('SOURCE_WRITE_KEY'),
}),
],
diff --git a/configs/webpack.config.renderer.stage.ts b/configs/webpack.config.renderer.stage.ts
index d6e5af3eb6..85a9ae754d 100644
--- a/configs/webpack.config.renderer.stage.ts
+++ b/configs/webpack.config.renderer.stage.ts
@@ -3,14 +3,9 @@ import { merge } from 'webpack-merge';
import baseConfig from './webpack.config.base';
import rendererProdConfig from './webpack.config.renderer.prod';
import DeleteSourceMaps from '../scripts/DeleteSourceMaps';
-import { version } from '../redisinsight/package.json';
DeleteSourceMaps();
-const apiUrl = process.env.SERVER_TLS_CERT && process.env.SERVER_TLS_KEY
- ? 'https://localhost'
- : 'http://localhost'
-
export default merge(baseConfig, {
...rendererProdConfig,
@@ -22,21 +17,6 @@ export default merge(baseConfig, {
new webpack.DefinePlugin({
'process.type': '"renderer"',
'process.env.NODE_ENV': JSON.stringify('staging'),
- 'process.env.APP_ENV': JSON.stringify('electron'),
- 'process.env.API_PREFIX': JSON.stringify('api'),
- 'process.env.BASE_API_URL': JSON.stringify(apiUrl),
- 'process.env.RESOURCES_BASE_URL': JSON.stringify(apiUrl),
- 'process.env.SCAN_COUNT_DEFAULT': JSON.stringify('500'),
- 'process.env.SCAN_TREE_COUNT_DEFAULT': JSON.stringify('10000'),
- 'process.env.PIPELINE_COUNT_DEFAULT': JSON.stringify('5'),
- 'process.env.BUILD_TYPE': JSON.stringify('ELECTRON'),
- 'process.env.APP_VERSION': JSON.stringify(version),
- 'process.env.CONNECTIONS_TIMEOUT_DEFAULT': 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? JSON.stringify(process.env.CONNECTIONS_TIMEOUT_DEFAULT)
- : JSON.stringify(30 * 1000),
- 'process.env.SEGMENT_WRITE_KEY': 'SEGMENT_WRITE_KEY' in process.env
- ? JSON.stringify(process.env.SEGMENT_WRITE_KEY)
- : JSON.stringify('SOURCE_WRITE_KEY'),
}),
],
});
diff --git a/configs/webpack.config.web.dev.ts b/configs/webpack.config.web.dev.ts
index 952a08321b..b2bda470cb 100644
--- a/configs/webpack.config.web.dev.ts
+++ b/configs/webpack.config.web.dev.ts
@@ -200,17 +200,17 @@ const configuration: webpack.Configuration = {
*/
new webpack.EnvironmentPlugin({
NODE_ENV: 'development',
- APP_ENV: 'web',
- API_PREFIX: 'api',
- BASE_API_URL: `http://${HOST}`,
- RESOURCES_BASE_URL: `http://${HOST}`,
- PIPELINE_COUNT_DEFAULT: '5',
- SCAN_COUNT_DEFAULT: '500',
- SCAN_TREE_COUNT_DEFAULT: '10000',
- SEGMENT_WRITE_KEY:
- 'SEGMENT_WRITE_KEY' in process.env ? process.env.SEGMENT_WRITE_KEY : 'SOURCE_WRITE_KEY',
- CONNECTIONS_TIMEOUT_DEFAULT: 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? process.env.CONNECTIONS_TIMEOUT_DEFAULT
+ RI_APP_TYPE: 'web',
+ RI_API_PREFIX: 'api',
+ RI_BASE_API_URL: `http://${HOST}`,
+ RI_RESOURCES_BASE_URL: `http://${HOST}`,
+ RI_PIPELINE_COUNT_DEFAULT: '5',
+ RI_SCAN_COUNT_DEFAULT: '500',
+ RI_SCAN_TREE_COUNT_DEFAULT: '10000',
+ RI_SEGMENT_WRITE_KEY:
+ 'RI_SEGMENT_WRITE_KEY' in process.env ? process.env.RI_SEGMENT_WRITE_KEY : 'RI_SEGMENT_WRITE_KEY',
+ RI_CONNECTIONS_TIMEOUT_DEFAULT: 'RI_CONNECTIONS_TIMEOUT_DEFAULT' in process.env
+ ? process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT
: toString(30 * 1000),
}),
diff --git a/configs/webpack.config.web.prod.ts b/configs/webpack.config.web.prod.ts
index 517e0518bb..0b3ed5d4aa 100644
--- a/configs/webpack.config.web.prod.ts
+++ b/configs/webpack.config.web.prod.ts
@@ -1,7 +1,7 @@
import { merge } from 'webpack-merge';
import { resolve } from 'path';
import webpack from 'webpack';
-import { toString } from 'lodash'
+import { toString } from 'lodash';
import TerserPlugin from 'terser-webpack-plugin';
import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
import CssMinimizerPlugin from 'css-minimizer-webpack-plugin';
@@ -75,19 +75,17 @@ const configuration: webpack.Configuration = {
new webpack.EnvironmentPlugin({
NODE_ENV: 'production',
- APP_ENV: 'web',
- API_PORT: '5000',
- API_PREFIX: '',
- BASE_API_URL: 'api/',
- RESOURCES_BASE_URL:
- process.env.SERVER_TLS_CERT && process.env.SERVER_TLS_KEY ? 'https://localhost' : 'http://localhost',
- SCAN_COUNT_DEFAULT: '500',
- SCAN_TREE_COUNT_DEFAULT: '10000',
- PIPELINE_COUNT_DEFAULT: '5',
- SEGMENT_WRITE_KEY:
- 'SEGMENT_WRITE_KEY' in process.env ? process.env.SEGMENT_WRITE_KEY : 'SOURCE_WRITE_KEY',
- CONNECTIONS_TIMEOUT_DEFAULT: 'CONNECTIONS_TIMEOUT_DEFAULT' in process.env
- ? process.env.CONNECTIONS_TIMEOUT_DEFAULT
+ RI_APP_TYPE: 'web',
+ RI_APP_PORT: '5000',
+ RI_BASE_API_URL: '',
+ RI_API_PREFIX: 'api',
+ RI_SCAN_COUNT_DEFAULT: '500',
+ RI_SCAN_TREE_COUNT_DEFAULT: '10000',
+ RI_PIPELINE_COUNT_DEFAULT: '5',
+ RI_SEGMENT_WRITE_KEY:
+ 'RI_SEGMENT_WRITE_KEY' in process.env ? process.env.RI_SEGMENT_WRITE_KEY : 'SOURCE_WRITE_KEY',
+ RI_CONNECTIONS_TIMEOUT_DEFAULT: 'RI_CONNECTIONS_TIMEOUT_DEFAULT' in process.env
+ ? process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT
: toString(30 * 1000), // 30 sec
}),
diff --git a/docker-entry.sh b/docker-entry.sh
index 39eafe34ba..fb42b96c42 100644
--- a/docker-entry.sh
+++ b/docker-entry.sh
@@ -7,18 +7,7 @@
# `docker run`
set -e
-# Set up mDNS functionality, to play well with Redis Enterprise
-# clusters on the network. Also, run it as a non-root user.
-# https://linux.die.net/man/8/avahi-daemon
-avahi-daemon --daemonize --no-drop-root
-
-# Launching system's secret storage
-eval "$(dbus-launch --sh-syntax)"
-mkdir -p ~/.cache
-mkdir -p ~/.local/share/keyrings # where the automatic keyring is created
-eval "$(echo "$GNOME_KEYRING_PASS" | gnome-keyring-daemon --unlock)"
-sleep 1
-eval "$(echo "$GNOME_KEYRING_PASS" | gnome-keyring-daemon --start)"
+echo "Running docker-entry.sh"
# Run the application's entry script with the exec command so it catches SIGTERM properly
exec "$@"
diff --git a/package.json b/package.json
index 39e2e5bb9f..08d6985f36 100644
--- a/package.json
+++ b/package.json
@@ -113,6 +113,7 @@
"@babel/preset-react": "^7.22.15",
"@babel/preset-typescript": "^7.23.2",
"@babel/register": "^7.12.1",
+ "@electron/rebuild": "^3.3.0",
"@pmmmwh/react-refresh-webpack-plugin": "^0.5.10",
"@svgr/webpack": "^8.1.0",
"@teamsupercell/typings-for-css-modules-loader": "^2.4.0",
@@ -171,7 +172,6 @@
"electron-builder-notarize": "^1.5.1",
"electron-debug": "^3.2.0",
"electron-devtools-installer": "^3.2.0",
- "electron-rebuild": "^3.2.9",
"eslint": "^7.5.0",
"eslint-config-airbnb": "^18.2.1",
"eslint-config-airbnb-typescript": "^12.0.0",
diff --git a/redisinsight/api/config/default.ts b/redisinsight/api/config/default.ts
index b365708900..2d6d57a886 100644
--- a/redisinsight/api/config/default.ts
+++ b/redisinsight/api/config/default.ts
@@ -7,11 +7,11 @@ const homedir = join(__dirname, '..');
const buildInfoFileName = 'build.json';
const dataZipFileName = 'data.zip';
-const staticDir = process.env.BUILD_TYPE === 'ELECTRON' && process['resourcesPath']
+const staticDir = process.env.RI_BUILD_TYPE === 'ELECTRON' && process['resourcesPath']
? join(process['resourcesPath'], 'static')
: join(__dirname, '..', 'static');
-const defaultsDir = process.env.BUILD_TYPE === 'ELECTRON' && process['resourcesPath']
+const defaultsDir = process.env.RI_BUILD_TYPE === 'ELECTRON' && process['resourcesPath']
? join(process['resourcesPath'], 'defaults')
: join(__dirname, '..', 'defaults');
@@ -29,20 +29,20 @@ export default {
pluginsAssets: join(staticDir, 'resources', 'plugins'),
commands: join(homedir, 'commands'),
defaultCommandsDir: join(defaultsDir, 'commands'),
- guides: process.env.GUIDES_DEV_PATH || join(homedir, 'guides'),
+ guides: process.env.RI_GUIDES_PATH || join(homedir, 'guides'),
defaultGuides: join(defaultsDir, 'guides'),
- tutorials: process.env.TUTORIALS_DEV_PATH || join(homedir, 'tutorials'),
+ tutorials: process.env.RI_TUTORIALS_PATH || join(homedir, 'tutorials'),
defaultTutorials: join(defaultsDir, 'tutorials'),
- content: process.env.CONTENT_DEV_PATH || join(homedir, 'content'),
+ content: process.env.RI_CONTENT_PATH || join(homedir, 'content'),
defaultContent: join(defaultsDir, 'content'),
caCertificates: join(homedir, 'ca_certificates'),
clientCertificates: join(homedir, 'client_certificates'),
},
server: {
version,
- env: 'development',
- listenInterface: process.env.RI_HOSTNAME ?? '0.0.0.0',
- port: 5000,
+ env: process.env.NODE_ENV || 'development',
+ host: process.env.RI_APP_HOST ?? '0.0.0.0',
+ port: parseInt(process.env.RI_APP_PORT, 10) || 5000,
docPrefix: 'api/docs',
globalPrefix: 'api',
customPluginsUri: '/plugins',
@@ -54,158 +54,158 @@ export default {
defaultPluginsUri: '/static/plugins',
pluginsAssetsUri: '/static/resources/plugins',
base: process.env.RI_BASE || '/',
- secretStoragePassword: process.env.SECRET_STORAGE_PASSWORD,
- tls: process.env.SERVER_TLS ? process.env.SERVER_TLS === 'true' : true,
- tlsCert: process.env.SERVER_TLS_CERT,
- tlsKey: process.env.SERVER_TLS_KEY,
- staticContent: !!process.env.SERVER_STATIC_CONTENT || false,
- buildType: process.env.BUILD_TYPE || 'ELECTRON',
- appVersion: process.env.APP_VERSION || '2.40.0',
- requestTimeout: parseInt(process.env.REQUEST_TIMEOUT, 10) || 25000,
+ secretStoragePassword: process.env.RI_SECRET_STORAGE_PASSWORD,
+ encryptionKey: process.env.RI_ENCRYPTION_KEY,
+ tlsCert: process.env.RI_SERVER_TLS_CERT,
+ tlsKey: process.env.RI_SERVER_TLS_KEY,
+ staticContent: !!process.env.RI_SERVE_STATICS || true,
+ buildType: process.env.RI_BUILD_TYPE || 'DOCKER_ON_PREMISE',
+ appVersion: process.env.RI_APP_VERSION || '2.40.0',
+ requestTimeout: parseInt(process.env.RI_REQUEST_TIMEOUT, 10) || 25000,
excludeRoutes: [],
excludeAuthRoutes: [],
},
sockets: {
- cors: process.env.SOCKETS_CORS ? process.env.SOCKETS_CORS === 'true' : false,
- serveClient: process.env.SOCKETS_SERVE_CLIENT ? process.env.SOCKETS_SERVE_CLIENT === 'true' : false,
+ cors: process.env.RI_SOCKETS_CORS ? process.env.RI_SOCKETS_CORS === 'true' : false,
+ serveClient: process.env.RI_SOCKETS_SERVE_CLIENT ? process.env.RI_SOCKETS_SERVE_CLIENT === 'true' : false,
},
db: {
database: join(homedir, 'redisinsight.db'),
- synchronize: process.env.DB_SYNC ? process.env.DB_SYNC === 'true' : false,
- migrationsRun: process.env.DB_MIGRATIONS ? process.env.DB_MIGRATIONS === 'true' : true,
+ synchronize: process.env.RI_DB_SYNC ? process.env.RI_DB_SYNC === 'true' : false,
+ migrationsRun: process.env.RI_DB_MIGRATIONS ? process.env.RI_DB_MIGRATIONS === 'true' : true,
},
redis_clients: {
- idleSyncInterval: parseInt(process.env.CLIENTS_IDLE_SYNC_INTERVAL, 10) || 1000 * 60 * 60, // 1hr
- maxIdleThreshold: parseInt(process.env.CLIENTS_MAX_IDLE_THRESHOLD, 10) || 1000 * 60 * 60, // 1hr
- retryTimes: parseInt(process.env.CLIENTS_RETRY_TIMES, 10) || 3,
- retryDelay: parseInt(process.env.CLIENTS_RETRY_DELAY, 10) || 500,
- maxRetriesPerRequest: parseInt(process.env.CLIENTS_MAX_RETRIES_PER_REQUEST, 10) || 1,
+ idleSyncInterval: parseInt(process.env.RI_CLIENTS_IDLE_SYNC_INTERVAL, 10) || 1000 * 60 * 60, // 1hr
+ maxIdleThreshold: parseInt(process.env.RI_CLIENTS_MAX_IDLE_THRESHOLD, 10) || 1000 * 60 * 60, // 1hr
+ retryTimes: parseInt(process.env.RI_CLIENTS_RETRY_TIMES, 10) || 3,
+ retryDelay: parseInt(process.env.RI_CLIENTS_RETRY_DELAY, 10) || 500,
+ maxRetriesPerRequest: parseInt(process.env.RI_CLIENTS_MAX_RETRIES_PER_REQUEST, 10) || 1,
},
redis_scan: {
- countDefault: parseInt(process.env.SCAN_COUNT_DEFAULT, 10) || 200,
- countThreshold: parseInt(process.env.SCAN_COUNT_THRESHOLD, 10) || 10000,
+ countDefault: parseInt(process.env.RI_SCAN_COUNT_DEFAULT, 10) || 200,
+ countThreshold: parseInt(process.env.RI_SCAN_COUNT_THRESHOLD, 10) || 10000,
},
modules: {
json: {
- sizeThreshold: parseInt(process.env.JSON_SIZE_THRESHOLD, 10) || 1024,
+ sizeThreshold: parseInt(process.env.RI_JSON_SIZE_THRESHOLD, 10) || 1024,
},
},
redis_cli: {
- unsupportedCommands: JSON.parse(process.env.CLI_UNSUPPORTED_COMMANDS || '[]'),
+ unsupportedCommands: JSON.parse(process.env.RI_CLI_UNSUPPORTED_COMMANDS || '[]'),
},
profiler: {
- logFileIdleThreshold: parseInt(process.env.PROFILER_LOG_FILE_IDLE_THRESHOLD, 10) || 1000 * 60, // 1min
+ logFileIdleThreshold: parseInt(process.env.RI_PROFILER_LOG_FILE_IDLE_THRESHOLD, 10) || 1000 * 60, // 1min
},
analytics: {
- writeKey: process.env.SEGMENT_WRITE_KEY || 'SOURCE_WRITE_KEY',
- flushInterval: parseInt(process.env.ANALYTICS_FLUSH_INTERVAL, 10) || 3000,
+ writeKey: process.env.RI_SEGMENT_WRITE_KEY || 'SOURCE_WRITE_KEY',
+ flushInterval: parseInt(process.env.RI_ANALYTICS_FLUSH_INTERVAL, 10) || 3000,
},
logger: {
- logLevel: process.env.LOG_LEVEL || 'info', // log level
- stdout: process.env.STDOUT_LOGGER ? process.env.STDOUT_LOGGER === 'true' : false, // disabled by default
- files: process.env.FILES_LOGGER ? process.env.FILES_LOGGER === 'true' : true, // enabled by default
- omitSensitiveData: process.env.LOGGER_OMIT_DATA ? process.env.LOGGER_OMIT_DATA === 'true' : true,
- pipelineSummaryLimit: parseInt(process.env.LOGGER_PIPELINE_SUMMARY_LIMIT, 10) || 5,
+ logLevel: process.env.RI_LOG_LEVEL || 'info', // log level
+ stdout: process.env.RI_STDOUT_LOGGER ? process.env.RI_STDOUT_LOGGER === 'true' : false, // disabled by default
+ files: process.env.RI_FILES_LOGGER ? process.env.RI_FILES_LOGGER === 'true' : true, // enabled by default
+ omitSensitiveData: process.env.RI_LOGGER_OMIT_DATA ? process.env.RI_LOGGER_OMIT_DATA === 'true' : true,
+ pipelineSummaryLimit: parseInt(process.env.RI_LOGGER_PIPELINE_SUMMARY_LIMIT, 10) || 5,
},
plugins: {
- stateMaxSize: parseInt(process.env.PLUGIN_STATE_MAX_SIZE, 10) || 1024 * 1024,
+ stateMaxSize: parseInt(process.env.RI_PLUGIN_STATE_MAX_SIZE, 10) || 1024 * 1024,
},
guides: {
- updateUrl: process.env.GUIDES_UPDATE_URL
+ updateUrl: process.env.RI_GUIDES_UPDATE_URL
|| 'https://github.com/RedisInsight/Guides/releases/download/2.x.x',
- zip: process.env.GUIDES_ZIP || dataZipFileName,
- buildInfo: process.env.GUIDES_CHECKSUM || buildInfoFileName,
- devMode: !!process.env.GUIDES_DEV_PATH,
+ zip: process.env.RI_GUIDES_ZIP || dataZipFileName,
+ buildInfo: process.env.RI_GUIDES_INFO || buildInfoFileName,
+ devMode: !!process.env.RI_GUIDES_PATH,
},
tutorials: {
- updateUrl: process.env.TUTORIALS_UPDATE_URL
+ updateUrl: process.env.RI_TUTORIALS_UPDATE_URL
|| 'https://github.com/RedisInsight/Tutorials/releases/download/2.x.x',
- zip: process.env.TUTORIALS_ZIP || dataZipFileName,
- buildInfo: process.env.TUTORIALS_CHECKSUM || buildInfoFileName,
- devMode: !!process.env.TUTORIALS_DEV_PATH,
+ zip: process.env.RI_TUTORIALS_ZIP || dataZipFileName,
+ buildInfo: process.env.RI_TUTORIALS_INFO || buildInfoFileName,
+ devMode: !!process.env.RI_TUTORIALS_PATH,
},
content: {
- updateUrl: process.env.CONTENT_UPDATE_URL
+ updateUrl: process.env.RI_CONTENT_UPDATE_URL
|| 'https://github.com/RedisInsight/Statics/releases/download/latest',
- zip: process.env.CONTENT_ZIP || dataZipFileName,
- buildInfo: process.env.CONTENT_CHECKSUM || buildInfoFileName,
- devMode: !!process.env.CONTENT_DEV_PATH,
+ zip: process.env.RI_CONTENT_ZIP || dataZipFileName,
+ buildInfo: process.env.RI_CONTENT_INFO || buildInfoFileName,
+ devMode: !!process.env.RI_CONTENT_PATH,
},
notifications: {
- updateUrl: process.env.NOTIFICATION_DEV_PATH
- || process.env.NOTIFICATION_UPDATE_URL
+ updateUrl: process.env.RI_NOTIFICATION_DEV_PATH
+ || process.env.RI_NOTIFICATION_UPDATE_URL
|| 'https://github.com/RedisInsight/Notifications/releases/download/latest/notifications.json',
- syncInterval: parseInt(process.env.NOTIFICATION_SYNC_INTERVAL, 10) || 60 * 60 * 1000,
- queryLimit: parseInt(process.env.NOTIFICATION_QUERY_LIMIT, 10) || 20,
- devMode: !!process.env.NOTIFICATION_DEV_PATH,
+ syncInterval: parseInt(process.env.RI_NOTIFICATION_SYNC_INTERVAL, 10) || 60 * 60 * 1000,
+ queryLimit: parseInt(process.env.RI_NOTIFICATION_QUERY_LIMIT, 10) || 20,
+ devMode: !!process.env.RI_NOTIFICATION_DEV_PATH,
},
workbench: {
- maxResultSize: parseInt(process.env.COMMAND_EXECUTION_MAX_RESULT_SIZE, 10) || 1024 * 1024,
- maxItemsPerDb: parseInt(process.env.COMMAND_EXECUTION_MAX_ITEMS_PER_DB, 10) || 30,
- unsupportedCommands: JSON.parse(process.env.WORKBENCH_UNSUPPORTED_COMMANDS || '[]'),
- countBatch: parseInt(process.env.WORKBENCH_BATCH_SIZE, 10) || 5,
+ maxResultSize: parseInt(process.env.RI_COMMAND_EXECUTION_MAX_RESULT_SIZE, 10) || 1024 * 1024,
+ maxItemsPerDb: parseInt(process.env.RI_COMMAND_EXECUTION_MAX_ITEMS_PER_DB, 10) || 30,
+ unsupportedCommands: JSON.parse(process.env.RI_WORKBENCH_UNSUPPORTED_COMMANDS || '[]'),
+ countBatch: parseInt(process.env.RI_WORKBENCH_BATCH_SIZE, 10) || 5,
},
database_analysis: {
- maxItemsPerDb: parseInt(process.env.DATABASE_ANALYSIS_MAX_ITEMS_PER_DB, 10) || 5,
+ maxItemsPerDb: parseInt(process.env.RI_DATABASE_ANALYSIS_MAX_ITEMS_PER_DB, 10) || 5,
},
browser_history: {
- maxItemsPerModeInDb: parseInt(process.env.BROWSER_HISTORY_MAX_ITEMS_PER_MODE_IN_DB, 10) || 10,
+ maxItemsPerModeInDb: parseInt(process.env.RI_BROWSER_HISTORY_MAX_ITEMS_PER_MODE_IN_DB, 10) || 10,
},
commands: [
{
name: 'main',
- url: process.env.COMMANDS_MAIN_URL
+ url: process.env.RI_COMMANDS_MAIN_URL
|| 'https://raw.githubusercontent.com/redis/redis-doc/master/commands.json',
},
{
name: 'redisearch',
- url: process.env.COMMANDS_REDISEARCH_URL
+ url: process.env.RI_COMMANDS_REDISEARCH_URL
|| 'https://raw.githubusercontent.com/RediSearch/RediSearch/master/commands.json',
},
{
name: 'redisjson',
- url: process.env.COMMANDS_REDIJSON_URL
+ url: process.env.RI_COMMANDS_REDIJSON_URL
|| 'https://raw.githubusercontent.com/RedisJSON/RedisJSON/master/commands.json',
},
{
name: 'redistimeseries',
- url: process.env.COMMANDS_REDISTIMESERIES_URL
+ url: process.env.RI_COMMANDS_REDISTIMESERIES_URL
|| 'https://raw.githubusercontent.com/RedisTimeSeries/RedisTimeSeries/master/commands.json',
},
{
name: 'redisai',
- url: process.env.COMMANDS_REDISAI_URL
+ url: process.env.RI_COMMANDS_REDISAI_URL
|| 'https://raw.githubusercontent.com/RedisAI/RedisAI/master/commands.json',
},
{
name: 'redisgraph',
- url: process.env.COMMANDS_REDISGRAPH_URL
+ url: process.env.RI_COMMANDS_REDISGRAPH_URL
|| 'https://raw.githubusercontent.com/RedisGraph/RedisGraph/master/commands.json',
},
{
name: 'redisgears',
- url: process.env.COMMANDS_REDISGEARS_URL
+ url: process.env.RI_COMMANDS_REDISGEARS_URL
|| 'https://raw.githubusercontent.com/RedisGears/RedisGears/v1.2.5/commands.json',
},
{
name: 'redisbloom',
- url: process.env.COMMANDS_REDISBLOOM_URL
+ url: process.env.RI_COMMANDS_REDISBLOOM_URL
|| 'https://raw.githubusercontent.com/RedisBloom/RedisBloom/master/commands.json',
},
{
name: 'triggers_and_functions',
- url: process.env.COMMANDS_TRIGGERS_AND_FUNCTIONS_URL
+ url: process.env.RI_COMMANDS_TRIGGERS_AND_FUNCTIONS_URL
|| 'https://raw.githubusercontent.com/RedisGears/RedisGears/master/commands.json',
},
],
connections: {
- timeout: parseInt(process.env.CONNECTIONS_TIMEOUT_DEFAULT, 10) || 30 * 1_000, // 30 sec
+ timeout: parseInt(process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT, 10) || 30 * 1_000, // 30 sec
},
redisStack: {
- id: process.env.BUILD_TYPE === 'REDIS_STACK' ? process.env.REDIS_STACK_DATABASE_ID || 'redis-stack' : undefined,
- name: process.env.REDIS_STACK_DATABASE_NAME,
- host: process.env.REDIS_STACK_DATABASE_HOST,
- port: process.env.REDIS_STACK_DATABASE_PORT,
+ id: process.env.RI_BUILD_TYPE === 'REDIS_STACK' ? process.env.RI_REDIS_STACK_DATABASE_ID || 'redis-stack' : undefined,
+ name: process.env.RI_REDIS_STACK_DATABASE_NAME,
+ host: process.env.RI_REDIS_STACK_DATABASE_HOST,
+ port: process.env.RI_REDIS_STACK_DATABASE_PORT,
},
features_config: {
url: process.env.RI_FEATURES_CONFIG_URL
diff --git a/redisinsight/api/config/development.ts b/redisinsight/api/config/development.ts
index 57b6feb085..58cb33e131 100644
--- a/redisinsight/api/config/development.ts
+++ b/redisinsight/api/config/development.ts
@@ -1,17 +1,17 @@
export default {
server: {
- tls: process.env.SERVER_TLS ? process.env.SERVER_TLS === 'true' : false,
+ env: 'development',
},
sockets: {
cors: true,
},
db: {
- synchronize: process.env.DB_SYNC ? process.env.DB_SYNC === 'true' : true,
- migrationsRun: process.env.DB_MIGRATIONS ? process.env.DB_MIGRATIONS === 'true' : false,
+ synchronize: process.env.RI_DB_SYNC ? process.env.RI_DB_SYNC === 'true' : true,
+ migrationsRun: process.env.RI_DB_MIGRATIONS ? process.env.RI_DB_MIGRATIONS === 'true' : false,
},
logger: {
- logLevel: process.env.LOG_LEVEL || 'debug',
- stdout: process.env.STDOUT_LOGGER ? process.env.STDOUT_LOGGER === 'true' : true, // enabled by default
- omitSensitiveData: process.env.LOGGER_OMIT_DATA ? process.env.LOGGER_OMIT_DATA === 'true' : false,
+ logLevel: process.env.RI_LOG_LEVEL || 'debug',
+ stdout: process.env.RI_STDOUT_LOGGER ? process.env.RI_STDOUT_LOGGER === 'true' : true, // enabled by default
+ omitSensitiveData: process.env.RI_LOGGER_OMIT_DATA ? process.env.RI_LOGGER_OMIT_DATA === 'true' : false,
},
};
diff --git a/redisinsight/api/config/production.ts b/redisinsight/api/config/production.ts
index 5eee260a68..b79847ea02 100644
--- a/redisinsight/api/config/production.ts
+++ b/redisinsight/api/config/production.ts
@@ -1,8 +1,8 @@
import { join } from 'path';
import * as os from 'os';
-const homedir = process.env.APP_FOLDER_ABSOLUTE_PATH
- || (join(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-app'));
+const homedir = process.env.RI_APP_FOLDER_ABSOLUTE_PATH
+ || (join(os.homedir(), process.env.RI_APP_FOLDER_NAME || '.redisinsight-app'));
const prevHomedir = join(os.homedir(), '.redisinsight-v2');
@@ -14,9 +14,9 @@ export default {
customPlugins: join(homedir, 'plugins'),
customTutorials: join(homedir, 'custom-tutorials'),
commands: join(homedir, 'commands'),
- guides: process.env.GUIDES_DEV_PATH || join(homedir, 'guides'),
- tutorials: process.env.TUTORIALS_DEV_PATH || join(homedir, 'tutorials'),
- content: process.env.CONTENT_DEV_PATH || join(homedir, 'content'),
+ guides: process.env.RI_GUIDES_PATH || join(homedir, 'guides'),
+ tutorials: process.env.RI_TUTORIALS_PATH || join(homedir, 'tutorials'),
+ content: process.env.RI_CONTENT_PATH || join(homedir, 'content'),
caCertificates: join(homedir, 'ca_certificates'),
clientCertificates: join(homedir, 'client_certificates'),
},
@@ -24,8 +24,8 @@ export default {
env: 'production',
},
analytics: {
- writeKey: process.env.SEGMENT_WRITE_KEY || 'lK5MNZgHbxj6vQwFgqZxygA0BiDQb32n',
- flushInterval: parseInt(process.env.ANALYTICS_FLUSH_INTERVAL, 10) || 10000,
+ writeKey: process.env.RI_SEGMENT_WRITE_KEY || 'lK5MNZgHbxj6vQwFgqZxygA0BiDQb32n',
+ flushInterval: parseInt(process.env.RI_ANALYTICS_FLUSH_INTERVAL, 10) || 10000,
},
db: {
database: join(homedir, 'redisinsight.db'),
diff --git a/redisinsight/api/config/staging.ts b/redisinsight/api/config/staging.ts
index 350ac23cab..36ad6eb350 100644
--- a/redisinsight/api/config/staging.ts
+++ b/redisinsight/api/config/staging.ts
@@ -1,8 +1,8 @@
import { join } from 'path';
import * as os from 'os';
-const homedir = process.env.APP_FOLDER_ABSOLUTE_PATH
- || (join(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-app-stage'));
+const homedir = process.env.RI_APP_FOLDER_ABSOLUTE_PATH
+ || (join(os.homedir(), process.env.RI_APP_FOLDER_NAME || '.redisinsight-app-stage'));
const prevHomedir = join(os.homedir(), '.redisinsight-v2-stage');
@@ -14,9 +14,9 @@ export default {
customPlugins: join(homedir, 'plugins'),
customTutorials: join(homedir, 'custom-tutorials'),
commands: join(homedir, 'commands'),
- guides: process.env.GUIDES_DEV_PATH || join(homedir, 'guides'),
- tutorials: process.env.TUTORIALS_DEV_PATH || join(homedir, 'tutorials'),
- content: process.env.CONTENT_DEV_PATH || join(homedir, 'content'),
+ guides: process.env.RI_GUIDES_PATH || join(homedir, 'guides'),
+ tutorials: process.env.RI_TUTORIALS_PATH || join(homedir, 'tutorials'),
+ content: process.env.RI_CONTENT_PATH || join(homedir, 'content'),
caCertificates: join(homedir, 'ca_certificates'),
clientCertificates: join(homedir, 'client_certificates'),
},
@@ -24,13 +24,13 @@ export default {
env: 'staging',
},
analytics: {
- writeKey: process.env.SEGMENT_WRITE_KEY || 'Ba1YuGnxzsQN9zjqTSvzPc6f3AvmH1mj',
+ writeKey: process.env.RI_SEGMENT_WRITE_KEY || 'Ba1YuGnxzsQN9zjqTSvzPc6f3AvmH1mj',
},
db: {
database: join(homedir, 'redisinsight.db'),
},
logger: {
- stdout: process.env.STDOUT_LOGGER ? process.env.STDOUT_LOGGER === 'true' : true, // enabled by default
- omitSensitiveData: process.env.LOGGER_OMIT_DATA ? process.env.LOGGER_OMIT_DATA === 'true' : false,
+ stdout: process.env.RI_STDOUT_LOGGER ? process.env.RI_STDOUT_LOGGER === 'true' : true, // enabled by default
+ omitSensitiveData: process.env.RI_LOGGER_OMIT_DATA ? process.env.RI_LOGGER_OMIT_DATA === 'true' : false,
},
};
diff --git a/redisinsight/api/config/test.ts b/redisinsight/api/config/test.ts
index f5214e8086..e425571e56 100644
--- a/redisinsight/api/config/test.ts
+++ b/redisinsight/api/config/test.ts
@@ -1,17 +1,17 @@
export default {
server: {
env: 'test',
- requestTimeout: parseInt(process.env.REQUEST_TIMEOUT, 10) || 1000,
+ requestTimeout: parseInt(process.env.RI_REQUEST_TIMEOUT, 10) || 1000,
},
db: {
- synchronize: process.env.DB_SYNC ? process.env.DB_SYNC === 'true' : true,
- migrationsRun: process.env.DB_MIGRATIONS ? process.env.DB_MIGRATIONS === 'true' : false,
+ synchronize: process.env.RI_DB_SYNC ? process.env.RI_DB_SYNC === 'true' : true,
+ migrationsRun: process.env.RI_DB_MIGRATIONS ? process.env.RI_DB_MIGRATIONS === 'true' : false,
},
profiler: {
- logFileIdleThreshold: parseInt(process.env.PROFILER_LOG_FILE_IDLE_THRESHOLD, 10) || 1000 * 2, // 3sec
+ logFileIdleThreshold: parseInt(process.env.RI_PROFILER_LOG_FILE_IDLE_THRESHOLD, 10) || 1000 * 2, // 3sec
},
notifications: {
- updateUrl: process.env.NOTIFICATION_UPDATE_URL
+ updateUrl: process.env.RI_NOTIFICATION_UPDATE_URL
|| 'https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json',
},
features_config: {
diff --git a/redisinsight/api/package.json b/redisinsight/api/package.json
index 294e5f8b2a..d0b160fa67 100644
--- a/redisinsight/api/package.json
+++ b/redisinsight/api/package.json
@@ -21,10 +21,10 @@
"format": "prettier --write \"src/**/*.ts\"",
"lint": "eslint --ext .ts .",
"start": "nest start",
- "start:dev": "cross-env NODE_ENV=development BUILD_TYPE=DOCKER_ON_PREMISE SERVER_STATIC_CONTENT=1 nest start --watch",
+ "start:dev": "cross-env NODE_ENV=development nest start --watch",
"start:debug": "nest start --debug --watch",
- "start:stage": "cross-env NODE_ENV=staging BUILD_TYPE=DOCKER_ON_PREMISE SERVER_STATIC_CONTENT=true node dist/src/main",
- "start:prod": "cross-env NODE_ENV=production BUILD_TYPE=DOCKER_ON_PREMISE node dist/src/main",
+ "start:stage": "cross-env NODE_ENV=staging node dist/src/main",
+ "start:prod": "cross-env NODE_ENV=production node dist/src/main",
"test": "cross-env NODE_ENV=test ./node_modules/.bin/jest -w 1",
"test:watch": "cross-env NODE_ENV=test jest --watch -w 1",
"test:cov": "cross-env NODE_ENV=test ./node_modules/.bin/jest --forceExit --coverage -w 4",
@@ -32,8 +32,8 @@
"test:e2e": "jest --config ./test/jest-e2e.json -w 1",
"typeorm": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli.js -d ./config/ormconfig.ts",
"test:api": "cross-env NODE_ENV=test ts-mocha --paths -p test/api/api.tsconfig.json --config ./test/api/.mocharc.yml",
- "test:api:cov": "cross-env BUILD_TYPE=DOCKER_ON_PREMISE nyc --reporter=html --reporter=text --reporter=text-summary yarn run test:api",
- "test:api:ci:cov": "cross-env BUILD_TYPE=DOCKER_ON_PREMISE nyc -r text -r text-summary -r html yarn run test:api --reporter mocha-multi-reporters --reporter-options configFile=test/api/reporters.json && nyc merge .nyc_output ./coverage/test-run-coverage.json",
+ "test:api:cov": "nyc --reporter=html --reporter=text --reporter=text-summary yarn run test:api",
+ "test:api:ci:cov": "cross-env nyc -r text -r text-summary -r html yarn run test:api --reporter mocha-multi-reporters --reporter-options configFile=test/api/reporters.json && nyc merge .nyc_output ./coverage/test-run-coverage.json",
"typeorm:migrate": "cross-env NODE_ENV=staging yarn typeorm migration:generate ./migration/migration",
"typeorm:run": "yarn typeorm migration:run"
},
diff --git a/redisinsight/api/src/__mocks__/cloud-user.ts b/redisinsight/api/src/__mocks__/cloud-user.ts
index 52c12a69fb..84652b705e 100644
--- a/redisinsight/api/src/__mocks__/cloud-user.ts
+++ b/redisinsight/api/src/__mocks__/cloud-user.ts
@@ -8,11 +8,11 @@ import {
ICloudCapiAccount,
} from 'src/modules/cloud/user/models';
import { ICloudApiCredentials } from 'src/modules/cloud/common/models';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { classToPlain } from 'class-transformer';
import { mockCloudApiCapiAccessKey, mockCloudCapiAuthDto, mockCloudCapiKey } from 'src/__mocks__/cloud-capi-key';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
const cloudConfig = config.get('cloud');
// ======================================= CAPI =======================================
diff --git a/redisinsight/api/src/__mocks__/encryption.ts b/redisinsight/api/src/__mocks__/encryption.ts
index 33d6d4666c..27dbed3e72 100644
--- a/redisinsight/api/src/__mocks__/encryption.ts
+++ b/redisinsight/api/src/__mocks__/encryption.ts
@@ -2,6 +2,7 @@ import { EncryptionStrategy } from 'src/modules/encryption/models';
export const mockDataToEncrypt = 'stringtoencrypt';
export const mockKeytarPassword = 'somepassword';
+export const mockEncryptionKey = 'somepassword';
export const mockEncryptionStrategy = EncryptionStrategy.KEYTAR;
@@ -10,6 +11,13 @@ export const mockEncryptResult = {
encryption: mockEncryptionStrategy,
};
+export const mockKeyEncryptionStrategy = EncryptionStrategy.KEY;
+
+export const mockKeyEncryptResult = {
+ data: '4a558dfef5c1abbdf745232614194ee9',
+ encryption: mockKeyEncryptionStrategy,
+};
+
export const mockEncryptionService = jest.fn(() => ({
getAvailableEncryptionStrategies: jest.fn(),
encrypt: jest.fn(),
@@ -22,6 +30,12 @@ export const mockEncryptionStrategyInstance = jest.fn(() => ({
decrypt: jest.fn(),
}));
+export const mockKeyEncryptionStrategyInstance = jest.fn(() => ({
+ isAvailable: jest.fn(),
+ encrypt: jest.fn(),
+ decrypt: jest.fn(),
+}));
+
export const mockKeytarModule = {
getPassword: jest.fn(),
setPassword: jest.fn(),
diff --git a/redisinsight/api/src/__mocks__/server.ts b/redisinsight/api/src/__mocks__/server.ts
index 087fd3c941..0c0358d37d 100644
--- a/redisinsight/api/src/__mocks__/server.ts
+++ b/redisinsight/api/src/__mocks__/server.ts
@@ -1,11 +1,11 @@
-import { Server } from 'src/modules/server/models/server';
+import { AppType, Server } from 'src/modules/server/models/server';
import { ServerEntity } from 'src/modules/server/entities/server.entity';
import { mockControlGroup, mockControlNumber } from 'src/__mocks__/feature';
import { EncryptionStrategy } from 'src/modules/encryption/models';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { GetServerInfoResponse } from 'src/modules/server/dto/server.dto';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
export const mockServerId = 'a77b23c1-7816-4ea4-b61f-d37a0f805ser';
@@ -24,7 +24,7 @@ export const mockGetServerInfoResponse = Object.assign(new GetServerInfoResponse
appVersion: SERVER_CONFIG.appVersion,
osPlatform: process.platform,
buildType: SERVER_CONFIG.buildType,
- appType: SERVER_CONFIG.buildType,
+ appType: AppType.Docker,
controlGroup: mockControlGroup,
controlNumber: mockControlNumber,
encryptionStrategies: [
diff --git a/redisinsight/api/src/app.module.ts b/redisinsight/api/src/app.module.ts
index 275e84d954..534252c4c5 100644
--- a/redisinsight/api/src/app.module.ts
+++ b/redisinsight/api/src/app.module.ts
@@ -5,7 +5,7 @@ import {
import { ServeStaticModule } from '@nestjs/serve-static';
import { RouterModule } from 'nest-router';
import { join } from 'path';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { PluginModule } from 'src/modules/plugin/plugin.module';
import { CommandsModule } from 'src/modules/commands/commands.module';
import { WorkbenchModule } from 'src/modules/workbench/workbench.module';
@@ -32,8 +32,8 @@ import { StaticsManagementModule } from './modules/statics-management/statics-ma
import { ExcludeRouteMiddleware } from './middleware/exclude-route.middleware';
import { routes } from './app.routes';
-const SERVER_CONFIG = config.get('server');
-const PATH_CONFIG = config.get('dir_path');
+const SERVER_CONFIG = config.get('server') as Config['server'];
+const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
@Module({
imports: [
diff --git a/redisinsight/api/src/common/interceptors/timeout.interceptor.ts b/redisinsight/api/src/common/interceptors/timeout.interceptor.ts
index e7b1e13988..06d6c7e224 100644
--- a/redisinsight/api/src/common/interceptors/timeout.interceptor.ts
+++ b/redisinsight/api/src/common/interceptors/timeout.interceptor.ts
@@ -8,9 +8,9 @@ import {
} from '@nestjs/common';
import { Observable, throwError, TimeoutError } from 'rxjs';
import { catchError, timeout } from 'rxjs/operators';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
@Injectable()
export class TimeoutInterceptor implements NestInterceptor {
diff --git a/redisinsight/api/src/decorators/api-endpoint.decorator.ts b/redisinsight/api/src/decorators/api-endpoint.decorator.ts
index a169ad184d..044cd74dbd 100644
--- a/redisinsight/api/src/decorators/api-endpoint.decorator.ts
+++ b/redisinsight/api/src/decorators/api-endpoint.decorator.ts
@@ -1,16 +1,16 @@
import { applyDecorators, HttpCode } from '@nestjs/common';
import { ApiExcludeEndpoint, ApiOperation, ApiResponse } from '@nestjs/swagger';
import { ApiResponseOptions } from '@nestjs/swagger/dist/decorators/api-response.decorator';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { BuildType } from 'src/modules/server/models/server';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
export interface IApiEndpointOptions {
description: string;
statusCode?: number;
responses?: ApiResponseOptions[];
- excludeFor?: BuildType[]
+ excludeFor?: BuildType[];
}
export function ApiEndpoint(
@@ -21,7 +21,7 @@ export function ApiEndpoint(
} = options;
return applyDecorators(
ApiOperation({ description }),
- ApiExcludeEndpoint(excludeFor.includes(SERVER_CONFIG.buildType)),
+ ApiExcludeEndpoint(excludeFor.includes(SERVER_CONFIG.buildType as BuildType)),
HttpCode(statusCode),
...responses?.map((response) => ApiResponse(response)),
);
diff --git a/redisinsight/api/src/main.ts b/redisinsight/api/src/main.ts
index ff24ee167c..0e30698c26 100644
--- a/redisinsight/api/src/main.ts
+++ b/redisinsight/api/src/main.ts
@@ -1,5 +1,4 @@
import 'dotenv/config';
-import { join } from 'path';
import { NestFactory } from '@nestjs/core';
import { SwaggerModule } from '@nestjs/swagger';
import { NestExpressApplication } from '@nestjs/platform-express';
@@ -7,36 +6,34 @@ import { INestApplication, NestApplicationOptions } from '@nestjs/common';
import * as bodyParser from 'body-parser';
import { WinstonModule } from 'nest-winston';
import { GlobalExceptionFilter } from 'src/exceptions/global-exception.filter';
-import { get } from 'src/utils';
+import { get, Config } from 'src/utils';
import { migrateHomeFolder } from 'src/init-helper';
import { LogFileProvider } from 'src/modules/profiler/providers/log-file.provider';
import { WindowsAuthAdapter } from 'src/modules/auth/window-auth/adapters/window-auth.adapter';
import { AppModule } from './app.module';
import SWAGGER_CONFIG from '../config/swagger';
import LOGGER_CONFIG from '../config/logger';
+import { createHttpOptions } from './utils/createHttpOptions';
-const serverConfig = get('server');
+const serverConfig = get('server') as Config['server'];
interface IApp {
- app: INestApplication
- gracefulShutdown: Function
+ app: INestApplication;
+ gracefulShutdown: Function;
}
-export default async function bootstrap(): Promise {
+export default async function bootstrap(apiPort?: number): Promise {
await migrateHomeFolder();
- const port = process.env.API_PORT || serverConfig.port;
+ const { port, host } = serverConfig;
const logger = WinstonModule.createLogger(LOGGER_CONFIG);
const options: NestApplicationOptions = {
logger,
};
- if (serverConfig.tls && serverConfig.tlsCert && serverConfig.tlsKey) {
- options.httpsOptions = {
- key: JSON.parse(`"${serverConfig.tlsKey}"`),
- cert: JSON.parse(`"${serverConfig.tlsCert}"`),
- };
+ if (serverConfig.tlsCert && serverConfig.tlsKey) {
+ options.httpsOptions = await createHttpOptions(serverConfig);
}
const app = await NestFactory.create(AppModule, options);
@@ -46,7 +43,7 @@ export default async function bootstrap(): Promise {
app.enableCors();
app.setGlobalPrefix(serverConfig.globalPrefix);
- if (process.env.APP_ENV !== 'electron') {
+ if (process.env.RI_APP_TYPE !== 'electron') {
SwaggerModule.setup(
serverConfig.docPrefix,
app,
@@ -65,9 +62,9 @@ export default async function bootstrap(): Promise {
const logFileProvider = app.get(LogFileProvider);
- await app.listen(port, serverConfig.listenInterface);
+ await app.listen(apiPort || port, host);
logger.log({
- message: `Server is running on http(s)://localhost:${port}`,
+ message: `Server is running on http(s)://${host}:${port}`,
context: 'bootstrap',
});
@@ -87,6 +84,6 @@ export default async function bootstrap(): Promise {
return { app, gracefulShutdown };
}
-if (process.env.APP_ENV !== 'electron') {
+if (process.env.RI_APP_TYPE !== 'electron') {
bootstrap();
}
diff --git a/redisinsight/api/src/modules/auth/auth.module.ts b/redisinsight/api/src/modules/auth/auth.module.ts
index 5f40176d8f..a95fda1b30 100644
--- a/redisinsight/api/src/modules/auth/auth.module.ts
+++ b/redisinsight/api/src/modules/auth/auth.module.ts
@@ -1,9 +1,9 @@
import { Module } from '@nestjs/common';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { WindowAuthModule } from './window-auth/window-auth.module';
import { BuildType } from '../server/models/server';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Module({})
export class AuthModule {
diff --git a/redisinsight/api/src/modules/auth/window-auth/window-auth.module.ts b/redisinsight/api/src/modules/auth/window-auth/window-auth.module.ts
index e85468bdee..063890d35a 100644
--- a/redisinsight/api/src/modules/auth/window-auth/window-auth.module.ts
+++ b/redisinsight/api/src/modules/auth/window-auth/window-auth.module.ts
@@ -1,9 +1,9 @@
import { MiddlewareConsumer, Module, NestModule } from '@nestjs/common';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { WindowAuthService } from './window-auth.service';
import { WindowAuthMiddleware } from './middleware/window.auth.middleware';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Module({
providers: [WindowAuthService],
diff --git a/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.spec.ts b/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.spec.ts
index 816f16175c..3186793d12 100644
--- a/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.spec.ts
+++ b/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.spec.ts
@@ -15,7 +15,7 @@ import { AutodiscoveryService } from 'src/modules/autodiscovery/autodiscovery.se
import { DatabaseService } from 'src/modules/database/database.service';
import { mocked } from 'ts-jest/utils';
import { RedisConnectionFactory } from 'src/modules/redis/redis-connection.factory';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
jest.mock(
'src/modules/autodiscovery/utils/autodiscovery.util',
@@ -39,7 +39,7 @@ jest.mock('src/utils/config', jest.fn(
() => jest.requireActual('src/utils/config') as object,
));
-const mockServerConfig = config.get('server');
+const mockServerConfig = config.get('server') as Config['server'];
describe('AutodiscoveryService', () => {
let service: AutodiscoveryService;
diff --git a/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.ts b/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.ts
index fb34f552dd..e83b274c82 100644
--- a/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.ts
+++ b/redisinsight/api/src/modules/autodiscovery/autodiscovery.service.ts
@@ -1,14 +1,14 @@
import { Injectable, Logger, OnModuleInit } from '@nestjs/common';
import { getAvailableEndpoints } from 'src/modules/autodiscovery/utils/autodiscovery.util';
import { convertRedisInfoReplyToObject } from 'src/utils';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { SettingsService } from 'src/modules/settings/settings.service';
import { Database } from 'src/modules/database/models/database';
import { DatabaseService } from 'src/modules/database/database.service';
import { ClientContext, ClientMetadata } from 'src/common/models';
import { RedisConnectionFactory } from 'src/modules/redis/redis-connection.factory';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Injectable()
export class AutodiscoveryService implements OnModuleInit {
diff --git a/redisinsight/api/src/modules/bulk-actions/bulk-import.service.ts b/redisinsight/api/src/modules/bulk-actions/bulk-import.service.ts
index 4083192dae..0982b530d6 100644
--- a/redisinsight/api/src/modules/bulk-actions/bulk-import.service.ts
+++ b/redisinsight/api/src/modules/bulk-actions/bulk-import.service.ts
@@ -12,11 +12,11 @@ import { IBulkActionOverview } from 'src/modules/bulk-actions/interfaces/bulk-ac
import { BulkActionStatus, BulkActionType } from 'src/modules/bulk-actions/constants';
import { BulkActionsAnalyticsService } from 'src/modules/bulk-actions/bulk-actions-analytics.service';
import { UploadImportFileByPathDto } from 'src/modules/bulk-actions/dto/upload-import-file-by-path.dto';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
const BATCH_LIMIT = 10_000;
-const PATH_CONFIG = config.get('dir_path');
-const SERVER_CONFIG = config.get('server');
+const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Injectable()
export class BulkImportService {
diff --git a/redisinsight/api/src/modules/cloud/cloud-sso.feature.flag.ts b/redisinsight/api/src/modules/cloud/cloud-sso.feature.flag.ts
index 2cc05072b5..cfa137e4d4 100644
--- a/redisinsight/api/src/modules/cloud/cloud-sso.feature.flag.ts
+++ b/redisinsight/api/src/modules/cloud/cloud-sso.feature.flag.ts
@@ -1,9 +1,9 @@
import { BuildType } from 'src/modules/server/models/server';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { Feature } from 'src/modules/feature/model/feature';
import { KnownFeatures } from 'src/modules/feature/constants';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
export enum CloudSsoFeatureStrategy {
DeepLink = 'deepLink',
diff --git a/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.ts b/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.ts
index eb23392307..b9fc022e40 100644
--- a/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.ts
+++ b/redisinsight/api/src/modules/cloud/common/providers/cloud.api.provider.ts
@@ -1,8 +1,8 @@
import axios from 'axios';
import { CloudRequestUtm, ICloudApiCredentials } from 'src/modules/cloud/common/models';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
const cloudConfig = config.get('cloud');
export class CloudApiProvider {
diff --git a/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.spec.ts b/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.spec.ts
index 3f1572d8a3..68855f749d 100644
--- a/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.spec.ts
+++ b/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.spec.ts
@@ -1,9 +1,9 @@
import { ICloudCapiCredentials } from 'src/modules/cloud/common/models';
import { CloudSubscriptionType } from 'src/modules/cloud/subscription/models';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { CloudCapiProvider } from './cloud.capi.provider';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
const getPrefixTests = [
{
diff --git a/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.ts b/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.ts
index a283efa9fe..57710ef593 100644
--- a/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.ts
+++ b/redisinsight/api/src/modules/cloud/common/providers/cloud.capi.provider.ts
@@ -1,10 +1,10 @@
import axios from 'axios';
import { ICloudCapiCredentials } from 'src/modules/cloud/common/models';
import { CloudSubscriptionType } from 'src/modules/cloud/subscription/models';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
const cloudConfig = config.get('cloud');
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
export class CloudCapiProvider {
protected api = axios.create({
diff --git a/redisinsight/api/src/modules/database/database.module.ts b/redisinsight/api/src/modules/database/database.module.ts
index 5c14b7ea2f..a8afeeebeb 100644
--- a/redisinsight/api/src/modules/database/database.module.ts
+++ b/redisinsight/api/src/modules/database/database.module.ts
@@ -1,4 +1,4 @@
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { MiddlewareConsumer, Module, RequestMethod, Type } from '@nestjs/common';
import { DatabaseService } from 'src/modules/database/database.service';
import { DatabaseController } from 'src/modules/database/database.controller';
@@ -14,7 +14,7 @@ import { DatabaseOverviewProvider } from 'src/modules/database/providers/databas
import { StackDatabasesRepository } from 'src/modules/database/repositories/stack.databases.repository';
import { ConnectionMiddleware } from './middleware/connection.middleware';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Module({})
export class DatabaseModule {
diff --git a/redisinsight/api/src/modules/encryption/encryption.module.ts b/redisinsight/api/src/modules/encryption/encryption.module.ts
index 97467e9ebd..3bcb8aa27d 100644
--- a/redisinsight/api/src/modules/encryption/encryption.module.ts
+++ b/redisinsight/api/src/modules/encryption/encryption.module.ts
@@ -2,6 +2,7 @@ import { Module } from '@nestjs/common';
import { PlainEncryptionStrategy } from 'src/modules/encryption/strategies/plain-encryption.strategy';
import { KeytarEncryptionStrategy } from 'src/modules/encryption/strategies/keytar-encryption.strategy';
import { EncryptionService } from 'src/modules/encryption/encryption.service';
+import { KeyEncryptionStrategy } from 'src/modules/encryption/strategies/key-encryption.strategy';
@Module({})
export class EncryptionModule {
@@ -11,6 +12,7 @@ export class EncryptionModule {
providers: [
PlainEncryptionStrategy,
KeytarEncryptionStrategy,
+ KeyEncryptionStrategy,
EncryptionService,
],
exports: [
@@ -18,6 +20,7 @@ export class EncryptionModule {
// todo: rework to not export strategies
PlainEncryptionStrategy,
KeytarEncryptionStrategy,
+ KeyEncryptionStrategy,
],
};
}
diff --git a/redisinsight/api/src/modules/encryption/encryption.service.spec.ts b/redisinsight/api/src/modules/encryption/encryption.service.spec.ts
index 53d4763635..ee3c26ae1b 100644
--- a/redisinsight/api/src/modules/encryption/encryption.service.spec.ts
+++ b/redisinsight/api/src/modules/encryption/encryption.service.spec.ts
@@ -1,8 +1,12 @@
import { Test, TestingModule } from '@nestjs/testing';
import {
- mockAppSettings, mockAppSettingsInitial, mockAppSettingsWithoutPermissions,
+ mockAppSettings,
+ mockAppSettingsInitial,
+ mockAppSettingsWithoutPermissions,
mockEncryptionStrategyInstance,
mockEncryptResult,
+ mockKeyEncryptionStrategyInstance,
+ mockKeyEncryptResult,
mockSettingsService,
MockType,
} from 'src/__mocks__';
@@ -12,11 +16,13 @@ import { KeytarEncryptionStrategy } from 'src/modules/encryption/strategies/keyt
import { EncryptionStrategy } from 'src/modules/encryption/models';
import { UnsupportedEncryptionStrategyException } from 'src/modules/encryption/exceptions';
import { SettingsService } from 'src/modules/settings/settings.service';
+import { KeyEncryptionStrategy } from 'src/modules/encryption/strategies/key-encryption.strategy';
describe('EncryptionService', () => {
let service: EncryptionService;
let plainEncryptionStrategy: MockType;
let keytarEncryptionStrategy: MockType;
+ let keyEncryptionStrategy: MockType;
let settingsService: MockType;
beforeEach(async () => {
@@ -33,6 +39,10 @@ describe('EncryptionService', () => {
provide: KeytarEncryptionStrategy,
useFactory: mockEncryptionStrategyInstance,
},
+ {
+ provide: KeyEncryptionStrategy,
+ useFactory: mockKeyEncryptionStrategyInstance,
+ },
{
provide: SettingsService,
useFactory: mockSettingsService,
@@ -43,22 +53,43 @@ describe('EncryptionService', () => {
service = module.get(EncryptionService);
plainEncryptionStrategy = module.get(PlainEncryptionStrategy);
keytarEncryptionStrategy = module.get(KeytarEncryptionStrategy);
+ keyEncryptionStrategy = module.get(KeyEncryptionStrategy);
settingsService = module.get(SettingsService);
settingsService.getAppSettings.mockResolvedValue(mockAppSettings);
});
describe('getAvailableEncryptionStrategies', () => {
- it('Should return list 2 strategies available', async () => {
+ it('Should return list 2 strategies available (KEYTAR and PLAIN)', async () => {
keytarEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(false);
expect(await service.getAvailableEncryptionStrategies()).toEqual([
EncryptionStrategy.PLAIN,
EncryptionStrategy.KEYTAR,
]);
});
+ it('Should return list 2 strategies available (KEY and PLAIN)', async () => {
+ keytarEncryptionStrategy.isAvailable.mockResolvedValueOnce(false);
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+
+ expect(await service.getAvailableEncryptionStrategies()).toEqual([
+ EncryptionStrategy.PLAIN,
+ EncryptionStrategy.KEY,
+ ]);
+ });
+ it('Should return list 2 strategies available (KEY and PLAIN) even when KEYTAR available', async () => {
+ keytarEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+
+ expect(await service.getAvailableEncryptionStrategies()).toEqual([
+ EncryptionStrategy.PLAIN,
+ EncryptionStrategy.KEY,
+ ]);
+ });
it('Should return list with one strategy available', async () => {
keytarEncryptionStrategy.isAvailable.mockResolvedValueOnce(false);
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(false);
expect(await service.getAvailableEncryptionStrategies()).toEqual([
EncryptionStrategy.PLAIN,
@@ -70,7 +101,15 @@ describe('EncryptionService', () => {
it('Should return KEYTAR strategy based on app agreements', async () => {
expect(await service.getEncryptionStrategy()).toEqual(keytarEncryptionStrategy);
});
- it('Should return PLAIN strategy based on app agreements', async () => {
+ it('Should return KEY strategy based on app agreements even when KEYTAR available', async () => {
+ keytarEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+
+ expect(await service.getEncryptionStrategy()).toEqual(keyEncryptionStrategy);
+ });
+ it('Should return PLAIN strategy based on app agreements even when KEY available', async () => {
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+
settingsService.getAppSettings.mockResolvedValueOnce(mockAppSettingsWithoutPermissions);
expect(await service.getEncryptionStrategy()).toEqual(plainEncryptionStrategy);
@@ -83,19 +122,37 @@ describe('EncryptionService', () => {
});
describe('encrypt', () => {
- it('Should encrypt data and return proper response', async () => {
+ it('Should encrypt data and return proper response (KEYTAR)', async () => {
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(false);
+
keytarEncryptionStrategy.encrypt.mockResolvedValueOnce(mockEncryptResult);
expect(await service.encrypt('string')).toEqual(mockEncryptResult);
});
+ it('Should encrypt data and return proper response (KEY)', async () => {
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+
+ keyEncryptionStrategy.encrypt.mockResolvedValueOnce(mockKeyEncryptResult);
+
+ expect(await service.encrypt('string')).toEqual(mockKeyEncryptResult);
+ });
});
describe('decrypt', () => {
- it('Should return decrypted string', async () => {
+ it('Should return decrypted string (KEYTAR)', async () => {
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(false);
+
keytarEncryptionStrategy.decrypt.mockResolvedValueOnce(mockEncryptResult.data);
expect(await service.decrypt('string', EncryptionStrategy.KEYTAR)).toEqual(mockEncryptResult.data);
});
+ it('Should return decrypted string (KEY)', async () => {
+ keyEncryptionStrategy.isAvailable.mockResolvedValueOnce(true);
+
+ keyEncryptionStrategy.decrypt.mockResolvedValueOnce(mockKeyEncryptResult.data);
+
+ expect(await service.decrypt('string', EncryptionStrategy.KEY)).toEqual(mockKeyEncryptResult.data);
+ });
it('Should return null when no data passed', async () => {
expect(await service.decrypt(null, EncryptionStrategy.KEYTAR)).toEqual(null);
});
diff --git a/redisinsight/api/src/modules/encryption/encryption.service.ts b/redisinsight/api/src/modules/encryption/encryption.service.ts
index 17ff519acc..7a49b64f6a 100644
--- a/redisinsight/api/src/modules/encryption/encryption.service.ts
+++ b/redisinsight/api/src/modules/encryption/encryption.service.ts
@@ -7,6 +7,7 @@ import {
UnsupportedEncryptionStrategyException,
} from 'src/modules/encryption/exceptions';
import { SettingsService } from 'src/modules/settings/settings.service';
+import { KeyEncryptionStrategy } from 'src/modules/encryption/strategies/key-encryption.strategy';
@Injectable()
export class EncryptionService {
@@ -14,6 +15,7 @@ export class EncryptionService {
private readonly settingsService: SettingsService,
private readonly keytarEncryptionStrategy: KeytarEncryptionStrategy,
private readonly plainEncryptionStrategy: PlainEncryptionStrategy,
+ private readonly keyEncryptionStrategy: KeyEncryptionStrategy,
) {}
/**
@@ -25,7 +27,9 @@ export class EncryptionService {
EncryptionStrategy.PLAIN,
];
- if (await this.keytarEncryptionStrategy.isAvailable()) {
+ if (await this.keyEncryptionStrategy.isAvailable()) {
+ strategies.push(EncryptionStrategy.KEY);
+ } else if (await this.keytarEncryptionStrategy.isAvailable()) {
strategies.push(EncryptionStrategy.KEYTAR);
}
@@ -43,6 +47,9 @@ export class EncryptionService {
const settings = await this.settingsService.getAppSettings('1');
switch (settings.agreements?.encryption) {
case true:
+ if (await this.keyEncryptionStrategy.isAvailable()) {
+ return this.keyEncryptionStrategy;
+ }
return this.keytarEncryptionStrategy;
case false:
return this.plainEncryptionStrategy;
diff --git a/redisinsight/api/src/modules/encryption/exceptions/index.ts b/redisinsight/api/src/modules/encryption/exceptions/index.ts
index 15fa259cda..ac5e07eb85 100644
--- a/redisinsight/api/src/modules/encryption/exceptions/index.ts
+++ b/redisinsight/api/src/modules/encryption/exceptions/index.ts
@@ -1,4 +1,7 @@
export * from './encryption-service-error.exception';
+export * from './key-decryption-error.exception';
+export * from './key-encryption-error.exception';
+export * from './key-unavailable.exception';
export * from './keytar-decryption-error.exception';
export * from './keytar-encryption-error.exception';
export * from './keytar-unavailable.exception';
diff --git a/redisinsight/api/src/modules/encryption/exceptions/key-decryption-error.exception.ts b/redisinsight/api/src/modules/encryption/exceptions/key-decryption-error.exception.ts
new file mode 100644
index 0000000000..0fada85c64
--- /dev/null
+++ b/redisinsight/api/src/modules/encryption/exceptions/key-decryption-error.exception.ts
@@ -0,0 +1,13 @@
+import {
+ EncryptionServiceErrorException,
+} from 'src/modules/encryption/exceptions/encryption-service-error.exception';
+
+export class KeyDecryptionErrorException extends EncryptionServiceErrorException {
+ constructor(message = 'Unable to decrypt data') {
+ super({
+ message,
+ name: 'KeyDecryptionError',
+ statusCode: 500,
+ }, 500);
+ }
+}
diff --git a/redisinsight/api/src/modules/encryption/exceptions/key-encryption-error.exception.ts b/redisinsight/api/src/modules/encryption/exceptions/key-encryption-error.exception.ts
new file mode 100644
index 0000000000..0d1cb70ae9
--- /dev/null
+++ b/redisinsight/api/src/modules/encryption/exceptions/key-encryption-error.exception.ts
@@ -0,0 +1,13 @@
+import {
+ EncryptionServiceErrorException,
+} from 'src/modules/encryption/exceptions/encryption-service-error.exception';
+
+export class KeyEncryptionErrorException extends EncryptionServiceErrorException {
+ constructor(message = 'Unable to encrypt data') {
+ super({
+ message,
+ name: 'KeyEncryptionError',
+ statusCode: 500,
+ }, 500);
+ }
+}
diff --git a/redisinsight/api/src/modules/encryption/exceptions/key-unavailable.exception.ts b/redisinsight/api/src/modules/encryption/exceptions/key-unavailable.exception.ts
new file mode 100644
index 0000000000..b97d5dd879
--- /dev/null
+++ b/redisinsight/api/src/modules/encryption/exceptions/key-unavailable.exception.ts
@@ -0,0 +1,13 @@
+import {
+ EncryptionServiceErrorException,
+} from 'src/modules/encryption/exceptions/encryption-service-error.exception';
+
+export class KeyUnavailableException extends EncryptionServiceErrorException {
+ constructor(message = 'Encryption key unavailable') {
+ super({
+ message,
+ name: 'KeyUnavailable',
+ statusCode: 503,
+ }, 503);
+ }
+}
diff --git a/redisinsight/api/src/modules/encryption/models/encryption-result.ts b/redisinsight/api/src/modules/encryption/models/encryption-result.ts
index 1645037f9a..7436ca78e4 100644
--- a/redisinsight/api/src/modules/encryption/models/encryption-result.ts
+++ b/redisinsight/api/src/modules/encryption/models/encryption-result.ts
@@ -1,6 +1,7 @@
export enum EncryptionStrategy {
PLAIN = 'PLAIN',
KEYTAR = 'KEYTAR',
+ KEY = 'KEY',
}
export class EncryptionResult {
diff --git a/redisinsight/api/src/modules/encryption/strategies/key-encryption.strategy.spec.ts b/redisinsight/api/src/modules/encryption/strategies/key-encryption.strategy.spec.ts
new file mode 100644
index 0000000000..2f5aea48ea
--- /dev/null
+++ b/redisinsight/api/src/modules/encryption/strategies/key-encryption.strategy.spec.ts
@@ -0,0 +1,91 @@
+import { Test, TestingModule } from '@nestjs/testing';
+import {
+ mockDataToEncrypt,
+ mockEncryptionKey,
+ mockEncryptResult,
+ mockKeyEncryptResult,
+} from 'src/__mocks__';
+import {
+ KeyDecryptionErrorException,
+ KeyEncryptionErrorException,
+ KeyUnavailableException,
+} from 'src/modules/encryption/exceptions';
+import { KeyEncryptionStrategy } from 'src/modules/encryption/strategies/key-encryption.strategy';
+
+describe('KeyEncryptionStrategy', () => {
+ let service: KeyEncryptionStrategy;
+
+ beforeEach(async () => {
+ jest.clearAllMocks();
+
+ const module: TestingModule = await Test.createTestingModule({
+ providers: [KeyEncryptionStrategy],
+ }).compile();
+
+ service = module.get(KeyEncryptionStrategy);
+ // @ts-ignore
+ service['key'] = mockEncryptionKey;
+ });
+
+ describe('isAvailable', () => {
+ it('Should return true when env specified', async () => {
+ expect(await service.isAvailable()).toEqual(true);
+ });
+
+ it('Should return false when env is not specified', async () => {
+ // @ts-ignore
+ service['key'] = undefined;
+
+ expect(await service.isAvailable()).toEqual(false);
+ });
+ });
+
+ describe('encrypt', () => {
+ it('Should encrypt data', async () => {
+ expect(service['cipherKey']).toEqual(undefined);
+ expect(await service.encrypt(mockDataToEncrypt)).toEqual(mockKeyEncryptResult);
+ expect(service['cipherKey']).not.toEqual(undefined);
+ });
+ it('Should throw KeyEncryptionError when unable to encrypt', async () => {
+ await expect(service.encrypt(null)).rejects.toThrowError(KeyEncryptionErrorException);
+ });
+ it('Should throw KeyUnavailable when there is no key but we are trying to encrypt', async () => {
+ // @ts-ignore
+ service['key'] = undefined;
+
+ await expect(service.encrypt(mockDataToEncrypt)).rejects.toThrowError(KeyUnavailableException);
+ });
+ });
+
+ describe('decrypt', () => {
+ it('Should decrypt data', async () => {
+ expect(service['cipherKey']).toEqual(undefined);
+ expect(await service.decrypt(
+ mockKeyEncryptResult.data,
+ mockKeyEncryptResult.encryption,
+ )).toEqual(mockDataToEncrypt);
+ expect(service['cipherKey']).not.toEqual(undefined);
+ });
+ it('Should return null when encryption doesn\'t match KEY', async () => {
+ expect(await service.decrypt(
+ mockEncryptResult.data,
+ 'PLAIN',
+ )).toEqual(null);
+ });
+ it('Should throw KeyDecryptionError when unable to decrypt', async () => {
+ await expect(service.decrypt(
+ null,
+ mockKeyEncryptResult.encryption,
+ )).rejects.toThrowError(KeyDecryptionErrorException);
+ });
+ it('Should throw KeyUnavailable when there is no key but we are trying to decrypt', async () => {
+ // @ts-ignore
+ service['key'] = undefined;
+
+ await expect(service.decrypt(
+ mockKeyEncryptResult.data,
+ mockKeyEncryptResult.encryption,
+ )).rejects.toThrowError(KeyUnavailableException);
+ });
+ });
+});
diff --git a/redisinsight/api/src/modules/encryption/strategies/key-encryption.strategy.ts b/redisinsight/api/src/modules/encryption/strategies/key-encryption.strategy.ts
new file mode 100644
index 0000000000..364a8f2c71
--- /dev/null
+++ b/redisinsight/api/src/modules/encryption/strategies/key-encryption.strategy.ts
@@ -0,0 +1,89 @@
+import { Injectable, Logger } from '@nestjs/common';
+import {
+ createDecipheriv, createCipheriv, createHash,
+} from 'crypto';
+import { EncryptionResult, EncryptionStrategy } from 'src/modules/encryption/models';
+import { IEncryptionStrategy } from 'src/modules/encryption/strategies/encryption-strategy.interface';
+import {
+ KeyDecryptionErrorException,
+ KeyEncryptionErrorException,
+ KeyUnavailableException,
+} from 'src/modules/encryption/exceptions';
+import config, { Config } from 'src/utils/config';
+
+const ALGORITHM = 'aes-256-cbc';
+const HASH_ALGORITHM = 'sha256';
+const SERVER_CONFIG = config.get('server') as Config['server'];
+
+@Injectable()
+export class KeyEncryptionStrategy implements IEncryptionStrategy {
+ private logger = new Logger('KeyEncryptionStrategy');
+
+ private cipherKey: Buffer;
+
+ private readonly key: string;
+
+ constructor() {
+ this.key = SERVER_CONFIG.encryptionKey;
+ }
+
+ /**
+ * Will return existing cipher stored in-memory or
+ * create new one using specified key and store it in-memory
+ */
+ private async getCipherKey(): Promise {
+ if (!this.cipherKey) {
+ if (!this.key) {
+ throw new KeyUnavailableException();
+ }
+
+ this.cipherKey = createHash(HASH_ALGORITHM)
+ .update(this.key, 'utf8')
+ .digest();
+ }
+
+ return this.cipherKey;
+ }
+
+ /**
+ * Checks if secret key was specified
+ */
+ async isAvailable(): Promise {
+ return !!this.key;
+ }
+
+ async encrypt(data: string): Promise {
+ const cipherKey = await this.getCipherKey();
+ try {
+ const cipher = createCipheriv(ALGORITHM, cipherKey, Buffer.alloc(16, 0));
+ let encrypted = cipher.update(data, 'utf8', 'hex');
+ encrypted += cipher.final('hex');
+
+ return {
+ encryption: EncryptionStrategy.KEY,
+ data: encrypted,
+ };
+ } catch (error) {
+ this.logger.error('Unable to encrypt data', error);
+ throw new KeyEncryptionErrorException();
+ }
+ }
+
+ async decrypt(data: string, encryptedWith: string): Promise {
+ if (encryptedWith !== EncryptionStrategy.KEY) {
+ return null;
+ }
+
+ const cipherKey = await this.getCipherKey();
+
+ try {
+ const decipher = createDecipheriv(ALGORITHM, cipherKey, Buffer.alloc(16, 0));
+ let decrypted = decipher.update(data, 'hex', 'utf8');
+ decrypted += decipher.final('utf8');
+ return decrypted;
+ } catch (error) {
+ this.logger.error('Unable to decrypt data', error);
+ throw new KeyDecryptionErrorException();
+ }
+ }
+}
diff --git a/redisinsight/api/src/modules/encryption/strategies/keytar-encryption.strategy.ts b/redisinsight/api/src/modules/encryption/strategies/keytar-encryption.strategy.ts
index 7622d7d0cc..1db9cbd273 100644
--- a/redisinsight/api/src/modules/encryption/strategies/keytar-encryption.strategy.ts
+++ b/redisinsight/api/src/modules/encryption/strategies/keytar-encryption.strategy.ts
@@ -9,12 +9,12 @@ import {
KeytarEncryptionErrorException,
KeytarUnavailableException,
} from 'src/modules/encryption/exceptions';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
const SERVICE = 'redisinsight';
const ACCOUNT = 'app';
const ALGORITHM = 'aes-256-cbc';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Injectable()
export class KeytarEncryptionStrategy implements IEncryptionStrategy {
diff --git a/redisinsight/api/src/modules/plugin/plugin.service.ts b/redisinsight/api/src/modules/plugin/plugin.service.ts
index 3dda4acfe1..cca1353cd8 100644
--- a/redisinsight/api/src/modules/plugin/plugin.service.ts
+++ b/redisinsight/api/src/modules/plugin/plugin.service.ts
@@ -2,13 +2,13 @@ import { Injectable, Logger } from '@nestjs/common';
import { plainToClass } from 'class-transformer';
import { Validator } from 'class-validator';
import { readdirSync, existsSync, readFileSync } from 'fs';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import * as path from 'path';
import { filter } from 'lodash';
import { PluginsResponse, Plugin } from 'src/modules/plugin/plugin.response';
-const PATH_CONFIG = config.get('dir_path');
-const SERVER_CONFIG = config.get('server');
+const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Injectable()
export class PluginService {
diff --git a/redisinsight/api/src/modules/profiler/providers/redis-observer.provider.ts b/redisinsight/api/src/modules/profiler/providers/redis-observer.provider.ts
index 5300bc07ee..bebf06c05b 100644
--- a/redisinsight/api/src/modules/profiler/providers/redis-observer.provider.ts
+++ b/redisinsight/api/src/modules/profiler/providers/redis-observer.provider.ts
@@ -5,10 +5,10 @@ import { RedisObserverStatus } from 'src/modules/profiler/constants';
import { withTimeout } from 'src/utils/promise-with-timeout';
import { DatabaseConnectionService } from 'src/modules/database/database-connection.service';
import ERROR_MESSAGES from 'src/constants/error-messages';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { ClientContext, ClientMetadata } from 'src/common/models';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
@Injectable()
export class RedisObserverProvider {
diff --git a/redisinsight/api/src/modules/pub-sub/providers/redis-client.provider.ts b/redisinsight/api/src/modules/pub-sub/providers/redis-client.provider.ts
index 838b55066e..852d9b6ce1 100644
--- a/redisinsight/api/src/modules/pub-sub/providers/redis-client.provider.ts
+++ b/redisinsight/api/src/modules/pub-sub/providers/redis-client.provider.ts
@@ -1,12 +1,12 @@
import { Injectable, ServiceUnavailableException } from '@nestjs/common';
import { withTimeout } from 'src/utils/promise-with-timeout';
import ERROR_MESSAGES from 'src/constants/error-messages';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { RedisClient } from 'src/modules/pub-sub/model/redis-client';
import { DatabaseConnectionService } from 'src/modules/database/database-connection.service';
import { ClientMetadata } from 'src/common/models';
-const serverConfig = config.get('server');
+const serverConfig = config.get('server') as Config['server'];
@Injectable()
export class RedisClientProvider {
diff --git a/redisinsight/api/src/modules/server/server.service.spec.ts b/redisinsight/api/src/modules/server/server.service.spec.ts
index 51cc182edb..2d49a58427 100644
--- a/redisinsight/api/src/modules/server/server.service.spec.ts
+++ b/redisinsight/api/src/modules/server/server.service.spec.ts
@@ -5,12 +5,13 @@ import {
mockControlGroup,
mockControlNumber,
mockEncryptionService,
- mockFeaturesConfigService, mockGetServerInfoResponse,
+ mockFeaturesConfigService,
+ mockGetServerInfoResponse,
mockServer,
mockServerRepository,
MockType,
} from 'src/__mocks__';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import {
ServerInfoNotFoundException,
AppAnalyticsEvents,
@@ -23,8 +24,9 @@ import { EncryptionStrategy } from 'src/modules/encryption/models';
import { ServerService } from 'src/modules/server/server.service';
import { ServerRepository } from 'src/modules/server/repositories/server.repository';
import { FeaturesConfigService } from 'src/modules/feature/features-config.service';
+import { AppType } from 'src/modules/server/models/server';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
const mockEventPayload: ITelemetryEvent = {
event: TelemetryEvents.ApplicationStarted,
@@ -85,20 +87,21 @@ describe('ServerService', () => {
{
anonymousId: mockServer.id,
sessionId,
- appType: SERVER_CONFIG.buildType,
+ appType: AppType.Docker,
appVersion: SERVER_CONFIG.appVersion,
controlNumber: mockControlNumber,
controlGroup: mockControlGroup,
},
);
- expect(eventEmitter.emit).toHaveBeenNthCalledWith(
- 2,
- AppAnalyticsEvents.Track,
- {
- ...mockEventPayload,
- event: TelemetryEvents.ApplicationFirstStart,
- },
- );
+ // Ignore: Valid for electron builds only
+ // expect(eventEmitter.emit).toHaveBeenNthCalledWith(
+ // 2,
+ // AppAnalyticsEvents.Track,
+ // {
+ // ...mockEventPayload,
+ // event: TelemetryEvents.ApplicationFirstStart,
+ // },
+ // );
});
it('should not create server instance on the second application launch', async () => {
serverRepository.exists.mockResolvedValueOnce(true);
@@ -114,20 +117,21 @@ describe('ServerService', () => {
{
anonymousId: mockServer.id,
sessionId,
- appType: SERVER_CONFIG.buildType,
+ appType: AppType.Docker,
appVersion: SERVER_CONFIG.appVersion,
controlNumber: mockControlNumber,
controlGroup: mockControlGroup,
},
);
- expect(eventEmitter.emit).toHaveBeenNthCalledWith(
- 2,
- AppAnalyticsEvents.Track,
- {
- ...mockEventPayload,
- event: TelemetryEvents.ApplicationStarted,
- },
- );
+ // Ignore: Valid for electron builds only
+ // expect(eventEmitter.emit).toHaveBeenNthCalledWith(
+ // 2,
+ // AppAnalyticsEvents.Track,
+ // {
+ // ...mockEventPayload,
+ // event: TelemetryEvents.ApplicationStarted,
+ // },
+ // );
});
});
diff --git a/redisinsight/api/src/modules/server/server.service.ts b/redisinsight/api/src/modules/server/server.service.ts
index 389bd27f7d..377c872fd0 100644
--- a/redisinsight/api/src/modules/server/server.service.ts
+++ b/redisinsight/api/src/modules/server/server.service.ts
@@ -1,8 +1,6 @@
-import {
- Injectable, InternalServerErrorException, Logger, OnApplicationBootstrap,
-} from '@nestjs/common';
+import { Injectable, InternalServerErrorException, Logger, OnApplicationBootstrap } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { AppAnalyticsEvents } from 'src/constants/app-events';
import { TelemetryEvents } from 'src/constants/telemetry-events';
import { ServerInfoNotFoundException } from 'src/constants/exceptions';
@@ -12,8 +10,8 @@ import { AppType, BuildType } from 'src/modules/server/models/server';
import { GetServerInfoResponse } from 'src/modules/server/dto/server.dto';
import { FeaturesConfigService } from 'src/modules/feature/features-config.service';
-const SERVER_CONFIG = config.get('server');
-const REDIS_STACK_CONFIG = config.get('redisStack');
+const SERVER_CONFIG = config.get('server') as Config['server'];
+const REDIS_STACK_CONFIG = config.get('redisStack') as Config['redisStack'];
@Injectable()
export class ServerService implements OnApplicationBootstrap {
@@ -64,7 +62,7 @@ export class ServerService implements OnApplicationBootstrap {
appVersion: SERVER_CONFIG.appVersion,
osPlatform: process.platform,
buildType: SERVER_CONFIG.buildType,
- port: process.env.API_PORT || SERVER_CONFIG.port,
+ port: SERVER_CONFIG.port,
},
nonTracking: true,
});
diff --git a/redisinsight/api/src/modules/settings/settings.service.spec.ts b/redisinsight/api/src/modules/settings/settings.service.spec.ts
index 0de8a7c5ea..5ee473f181 100644
--- a/redisinsight/api/src/modules/settings/settings.service.spec.ts
+++ b/redisinsight/api/src/modules/settings/settings.service.spec.ts
@@ -3,7 +3,7 @@ import { InternalServerErrorException } from '@nestjs/common';
import {
mockAgreements,
mockAgreementsRepository, mockAppSettings,
- mockEncryptionStrategyInstance, mockSettings,
+ mockEncryptionStrategyInstance, mockKeyEncryptionStrategyInstance, mockSettings,
mockSettingsAnalyticsService, mockSettingsRepository,
MockType, mockUserId,
} from 'src/__mocks__';
@@ -20,6 +20,7 @@ import { Agreements } from 'src/modules/settings/models/agreements';
import { Settings } from 'src/modules/settings/models/settings';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { FeatureServerEvents } from 'src/modules/feature/constants';
+import { KeyEncryptionStrategy } from 'src/modules/encryption/strategies/key-encryption.strategy';
const REDIS_SCAN_CONFIG = config.get('redis_scan');
const WORKBENCH_CONFIG = config.get('workbench');
@@ -37,6 +38,7 @@ describe('SettingsService', () => {
let settingsRepository: MockType;
let analyticsService: SettingsAnalytics;
let keytarStrategy: MockType;
+ let keyStrategy: MockType;
let eventEmitter: EventEmitter2;
beforeEach(async () => {
@@ -60,6 +62,10 @@ describe('SettingsService', () => {
provide: KeytarEncryptionStrategy,
useFactory: mockEncryptionStrategyInstance,
},
+ {
+ provide: KeyEncryptionStrategy,
+ useFactory: mockKeyEncryptionStrategyInstance,
+ },
{
provide: EventEmitter2,
useFactory: () => ({
@@ -72,6 +78,7 @@ describe('SettingsService', () => {
agreementsRepository = await module.get(AgreementsRepository);
settingsRepository = await module.get(SettingsRepository);
keytarStrategy = await module.get(KeytarEncryptionStrategy);
+ keyStrategy = await module.get(KeyEncryptionStrategy);
analyticsService = await module.get(SettingsAnalytics);
service = await module.get(SettingsService);
eventEmitter = await module.get(EventEmitter2);
diff --git a/redisinsight/api/src/modules/settings/settings.service.ts b/redisinsight/api/src/modules/settings/settings.service.ts
index 3fead32ff5..49314b04f5 100644
--- a/redisinsight/api/src/modules/settings/settings.service.ts
+++ b/redisinsight/api/src/modules/settings/settings.service.ts
@@ -11,9 +11,10 @@ import {
cloneDeep,
} from 'lodash';
import * as AGREEMENTS_SPEC from 'src/constants/agreements-spec.json';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { AgreementIsNotDefinedException } from 'src/constants';
import { KeytarEncryptionStrategy } from 'src/modules/encryption/strategies/keytar-encryption.strategy';
+import { KeyEncryptionStrategy } from 'src/modules/encryption/strategies/key-encryption.strategy';
import { SettingsAnalytics } from 'src/modules/settings/settings.analytics';
import { SettingsRepository } from 'src/modules/settings/repositories/settings.repository';
import { classToClass } from 'src/utils';
@@ -22,7 +23,7 @@ import { FeatureServerEvents } from 'src/modules/feature/constants';
import { EventEmitter2 } from '@nestjs/event-emitter';
import { GetAgreementsSpecResponse, GetAppSettingsResponse, UpdateSettingsDto } from './dto/settings.dto';
-const SERVER_CONFIG = config.get('server');
+const SERVER_CONFIG = config.get('server') as Config['server'];
@Injectable()
export class SettingsService {
@@ -33,6 +34,7 @@ export class SettingsService {
private readonly agreementRepository: AgreementsRepository,
private readonly analytics: SettingsAnalytics,
private readonly keytarEncryptionStrategy: KeytarEncryptionStrategy,
+ private readonly keyEncryptionStrategy: KeyEncryptionStrategy,
private eventEmitter: EventEmitter2,
) {}
@@ -113,8 +115,11 @@ export class SettingsService {
*/
private async getAgreementsOption(checker: string, defaultOption: string): Promise {
try {
+ // Check if any encryption strategy is available (not KEYTAR only)
+ // KEY has a precedence on KEYTAR strategy
if (checker === 'KEYTAR') {
- const isEncryptionAvailable = await this.keytarEncryptionStrategy.isAvailable();
+ const isEncryptionAvailable = await this.keyEncryptionStrategy.isAvailable()
+ || await this.keytarEncryptionStrategy.isAvailable();
if (!isEncryptionAvailable && SERVER_CONFIG.buildType === 'REDIS_STACK') {
return 'stack_false';
diff --git a/redisinsight/api/src/modules/statics-management/statics-management.module.ts b/redisinsight/api/src/modules/statics-management/statics-management.module.ts
index 97bc86d076..55a72eb963 100644
--- a/redisinsight/api/src/modules/statics-management/statics-management.module.ts
+++ b/redisinsight/api/src/modules/statics-management/statics-management.module.ts
@@ -1,13 +1,13 @@
import { Module } from '@nestjs/common';
import { ServeStaticModule } from '@nestjs/serve-static';
import { join } from 'path';
-import config from 'src/utils/config';
+import config, { Config } from 'src/utils/config';
import { AutoUpdatedStaticsProvider } from './providers/auto-updated-statics.provider';
-const SERVER_CONFIG = config.get('server');
-const PATH_CONFIG = config.get('dir_path');
-const GUIDES_CONFIG = config.get('guides');
-const TUTORIALS_CONFIG = config.get('tutorials');
+const SERVER_CONFIG = config.get('server') as Config['server'];
+const PATH_CONFIG = config.get('dir_path') as Config['dir_path'];
+const GUIDES_CONFIG = config.get('guides') as Config['guides'];
+const TUTORIALS_CONFIG = config.get('tutorials') as Config['tutorials'];
const CONTENT_CONFIG = config.get('content');
diff --git a/redisinsight/api/src/utils/config.spec.ts b/redisinsight/api/src/utils/config.spec.ts
index 1fa51f1e98..ae9ddf82f0 100644
--- a/redisinsight/api/src/utils/config.spec.ts
+++ b/redisinsight/api/src/utils/config.spec.ts
@@ -1,7 +1,11 @@
+import { Config } from 'src/utils/config';
+import { merge } from 'lodash';
import defaultConfig from '../../config/default';
import devConfig from '../../config/development';
+import testConfig from '../../config/test';
import stageConfig from '../../config/staging';
import prodConfig from '../../config/production';
+import stackConfig from '../../config/stack';
describe('Config util', () => {
const OLD_ENV = process.env;
@@ -24,7 +28,7 @@ describe('Config util', () => {
// eslint-disable-next-line global-require
const { get } = require('./config');
- const result = get('server');
+ const result = get('server') as Config['server'];
expect(result).toEqual({
...defaultConfig.server,
@@ -32,12 +36,41 @@ describe('Config util', () => {
});
});
+ it('should return test server config', () => {
+ process.env.NODE_ENV = 'test';
+ // eslint-disable-next-line global-require
+ const { get } = require('./config');
+
+ const result = get('server') as Config['server'];
+
+ expect(result).toEqual({
+ ...defaultConfig.server,
+ ...testConfig.server,
+ });
+ });
+
+ it('should return stack server config', () => {
+ process.env.RI_BUILD_TYPE = 'REDIS_STACK';
+ process.env.NODE_ENV = 'staging';
+ // eslint-disable-next-line global-require
+ const { get } = require('./config');
+
+ const result = get('server') as Config['server'];
+
+ expect(result).toEqual({
+ ...defaultConfig.server,
+ ...stageConfig.server,
+ ...stackConfig.server,
+ buildType: 'REDIS_STACK',
+ });
+ });
+
it('should return stage server config', () => {
process.env.NODE_ENV = 'staging';
// eslint-disable-next-line global-require
const { get } = require('./config');
- const result = get('server');
+ const result = get('server') as Config['server'];
expect(result).toEqual({
...defaultConfig.server,
@@ -50,12 +83,22 @@ describe('Config util', () => {
// eslint-disable-next-line global-require
const { get } = require('./config');
- const result = get('server');
+ const result = get('server') as Config['server'];
expect(result).toEqual({
...defaultConfig.server,
...prodConfig.server,
});
});
+
+ it('should return entire prod server config', () => {
+ process.env.NODE_ENV = 'production';
+ // eslint-disable-next-line global-require
+ const { get } = require('./config');
+
+ const result = get() as Config['server'];
+
+ expect(result).toEqual(merge({ ...defaultConfig }, { ...prodConfig }));
+ });
});
});
diff --git a/redisinsight/api/src/utils/config.ts b/redisinsight/api/src/utils/config.ts
index 9733f0d9ca..366046b271 100644
--- a/redisinsight/api/src/utils/config.ts
+++ b/redisinsight/api/src/utils/config.ts
@@ -26,7 +26,7 @@ switch (process.env.NODE_ENV) {
let buildTypeConfig;
// eslint-disable-next-line sonarjs/no-small-switch
-switch (process.env.BUILD_TYPE) {
+switch (process.env.RI_BUILD_TYPE) {
case 'REDIS_STACK':
buildTypeConfig = stack;
break;
@@ -37,7 +37,10 @@ switch (process.env.BUILD_TYPE) {
merge(config, envConfig, buildTypeConfig);
-export const get = (key?: string) => (key ? config[key] : config);
+export type Config = typeof config;
+export type KeyOfConfig = keyof typeof config;
+export const get: (key?: KeyOfConfig) => Config | any = (key?: KeyOfConfig) =>
+ key ? config[key] : config;
export default {
get,
diff --git a/redisinsight/api/src/utils/createHttpOptions.ts b/redisinsight/api/src/utils/createHttpOptions.ts
new file mode 100644
index 0000000000..611aa0d2d3
--- /dev/null
+++ b/redisinsight/api/src/utils/createHttpOptions.ts
@@ -0,0 +1,33 @@
+import { readFile } from 'fs/promises';
+import { Config } from '.';
+
+export const createHttpOptions = async (serverConfig: Config['server']) => {
+ const { tlsKey, tlsCert } = serverConfig;
+
+ try {
+ const [key, cert] = await Promise.all([
+ readFile(tlsKey, { encoding: 'utf-8' }),
+ readFile(tlsCert, { encoding: 'utf-8' }),
+ ]);
+ return {
+ key,
+ cert,
+ };
+ } catch (e) {
+ /* if this throws, it could mean
+ 1. the tlsKey and tlsCert provided by the config were actually certificates in PEM format, not file paths or
+ 2. there were issues reading the files (wrong path, permissions, etc.)
+
+ nothing to do in this case except assume PEM format and let the calling code throw if that doesn't work either */
+ }
+
+ // for docker and perhaps other environments, multi-line env vars are problematic, so if there are escaped new-lines
+ // in the key or cert, replace them with proper newlines
+ const key = tlsKey.replace(/\\n/g, '\n');
+ const cert = tlsCert.replace(/\\n/g, '\n');
+
+ return {
+ key,
+ cert,
+ };
+};
diff --git a/redisinsight/api/test/helpers/constants.ts b/redisinsight/api/test/helpers/constants.ts
index b902bfa10c..b5552050ee 100644
--- a/redisinsight/api/test/helpers/constants.ts
+++ b/redisinsight/api/test/helpers/constants.ts
@@ -41,7 +41,7 @@ export const constants = {
getRandomString: () => `${TEST_RUN_ID}_${uuidv4()}_${CLUSTER_HASH_SLOT}`,
generateRandomKey: () => `${TEST_RUN_ID}_${uuidv4()}_${CLUSTER_HASH_SLOT}`,
APP_DEFAULT_SETTINGS,
- TEST_KEYTAR_PASSWORD: process.env.SECRET_STORAGE_PASSWORD || 'somepassword',
+ TEST_KEYTAR_PASSWORD: process.env.RI_SECRET_STORAGE_PASSWORD || 'somepassword',
TEST_INCORRECT_PASSWORD: 'incorrect',
TEST_ENCRYPTION_STRATEGY: 'KEYTAR',
TEST_AGREEMENTS_VERSION: '1.0.3',
diff --git a/redisinsight/api/test/helpers/remote-server.ts b/redisinsight/api/test/helpers/remote-server.ts
index 05e87945ce..5164cfb47a 100644
--- a/redisinsight/api/test/helpers/remote-server.ts
+++ b/redisinsight/api/test/helpers/remote-server.ts
@@ -9,5 +9,5 @@ export const initRemoteServer = async () => {
const app = express();
app.use(constants.TEST_REMOTE_STATIC_URI, express.static(constants.TEST_REMOTE_STATIC_PATH, { etag: false }))
- await app.listen(5551, '0.0.0.0');
+ await app.listen(5551);
}
diff --git a/redisinsight/api/test/test-runs/docker.build.env b/redisinsight/api/test/test-runs/docker.build.env
index 806b310d67..a9236d07d5 100644
--- a/redisinsight/api/test/test-runs/docker.build.env
+++ b/redisinsight/api/test/test-runs/docker.build.env
@@ -3,5 +3,5 @@ ID=defaultid
RTE=defaultrte
APP_IMAGE=riv2:latest
TEST_BE_SERVER=https://app:5000/api
-NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json
+RI_NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json
CERTS_FOLDER=/root/.redisinsight-v2.0
diff --git a/redisinsight/api/test/test-runs/docker.build.yml b/redisinsight/api/test/test-runs/docker.build.yml
index ccc5481646..1d6856d5d5 100644
--- a/redisinsight/api/test/test-runs/docker.build.yml
+++ b/redisinsight/api/test/test-runs/docker.build.yml
@@ -22,10 +22,10 @@ services:
environment:
CERTS_FOLDER: "/root/.redisinsight-v2.0"
TEST_REDIS_HOST: "redis"
- DB_SYNC: "true"
+ RI_DB_SYNC: "true"
TEST_BE_SERVER: ${TEST_BE_SERVER}
TEST_LOCAL_DB_FILE_PATH: "/root/.redisinsight-v2.0/redisinsight.db"
- SECRET_STORAGE_PASSWORD: "somepassword"
+ RI_SECRET_STORAGE_PASSWORD: "somepassword"
app:
cap_add:
- ipc_lock
@@ -36,11 +36,11 @@ services:
- ${COV_FOLDER}:/root/.redisinsight-v2.0
environment:
CERTS_FOLDER: "/root/.redisinsight-v2.0"
- DB_SYNC: "true"
- DB_MIGRATIONS: "false"
- APP_FOLDER_NAME: ".redisinsight-v2.0"
- SECRET_STORAGE_PASSWORD: "somepassword"
- NOTIFICATION_UPDATE_URL: "https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json"
+ RI_DB_SYNC: "true"
+ RI_DB_MIGRATIONS: "false"
+ RI_APP_FOLDER_NAME: ".redisinsight-v2.0"
+ RI_SECRET_STORAGE_PASSWORD: "somepassword"
+ RI_NOTIFICATION_UPDATE_URL: "https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json"
RI_FEATURES_CONFIG_URL: "http://test:5551/remote/features-config.json"
networks:
diff --git a/redisinsight/api/test/test-runs/local.build.env b/redisinsight/api/test/test-runs/local.build.env
index 7b32446487..d0fd5b848e 100644
--- a/redisinsight/api/test/test-runs/local.build.env
+++ b/redisinsight/api/test/test-runs/local.build.env
@@ -1,5 +1,5 @@
COV_FOLDER=./coverage
ID=defaultid
RTE=defaultrte
-NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json
+RI_NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/notifications.json
CERTS_FOLDER=/root/.redisinsight-v2.0
diff --git a/redisinsight/api/test/test-runs/local.build.yml b/redisinsight/api/test/test-runs/local.build.yml
index 93a5370668..ad46673c78 100644
--- a/redisinsight/api/test/test-runs/local.build.yml
+++ b/redisinsight/api/test/test-runs/local.build.yml
@@ -21,7 +21,7 @@ services:
CERTS_FOLDER: "/root/.redisinsight-v2.0"
TEST_REDIS_HOST: "redis"
NODE_ENV: "test"
- REQUEST_TIMEOUT: "25000"
+ RI_REQUEST_TIMEOUT: "25000"
# dummy service to prevent docker validation errors
app:
diff --git a/redisinsight/api/test/test-runs/oss-st-6/docker-compose.yml b/redisinsight/api/test/test-runs/oss-st-6/docker-compose.yml
index 5fae58d2a9..26f6601ae1 100644
--- a/redisinsight/api/test/test-runs/oss-st-6/docker-compose.yml
+++ b/redisinsight/api/test/test-runs/oss-st-6/docker-compose.yml
@@ -2,4 +2,4 @@ version: "3.4"
services:
redis:
- image: redislabs/redismod
+ image: redis:6.2.14-alpine
diff --git a/redisinsight/desktop/app.ts b/redisinsight/desktop/app.ts
index 73721edf37..2a12fb4d4a 100644
--- a/redisinsight/desktop/app.ts
+++ b/redisinsight/desktop/app.ts
@@ -72,8 +72,8 @@ const init = async () => {
await windowFactory(WindowType.Main, splashWindow, { parsedDeepLink })
initAutoUpdateChecks(
- process.env.MANUAL_UPGRADES_LINK || process.env.UPGRADES_LINK,
- parseInt(process.env.RIAUTOUPDATEINTERVAL, 10) || 84 * 3600 * 1000,
+ process.env.RI_MANUAL_UPGRADES_LINK || process.env.RI_UPGRADES_LINK,
+ parseInt(process.env.RI_AUTO_UPDATE_INTERVAL, 10) || 84 * 3600 * 1000,
)
} catch (err) {
log.error(wrapErrorMessageSensitiveData(err as Error))
diff --git a/redisinsight/desktop/src/config/configMain.ts b/redisinsight/desktop/src/config/configMain.ts
index dcb54de702..e3b1bba149 100644
--- a/redisinsight/desktop/src/config/configMain.ts
+++ b/redisinsight/desktop/src/config/configMain.ts
@@ -13,8 +13,8 @@ config.version = pkg.version
config.author = pkg.author
config.isDevelopment = process.env.NODE_ENV === 'development'
config.isProduction = process.env.NODE_ENV === 'production'
-config.apiPort = process.env.API_PORT || configInit.defaultPort
-config.getApiPort = () => process.env.API_PORT || configInit.defaultPort
+config.appPort = process.env.RI_APP_PORT || configInit.defaultPort
+config.getApiPort = () => process.env.RI_APP_PORT || configInit.defaultPort
config.icon = getAssetPath('icon.png')
diff --git a/redisinsight/desktop/src/config/configRenderer.ts b/redisinsight/desktop/src/config/configRenderer.ts
index 6b5ee7bef6..66c290b28e 100644
--- a/redisinsight/desktop/src/config/configRenderer.ts
+++ b/redisinsight/desktop/src/config/configRenderer.ts
@@ -10,6 +10,6 @@ config.version = pkg.version
config.author = pkg.author
config.isDevelopment = process.env.NODE_ENV === 'development'
config.isProduction = process.env.NODE_ENV === 'production'
-config.apiPort = process.env.API_PORT || configInit.defaultPort
+config.apiPort = process.env.RI_APP_PORT || configInit.defaultPort
export const configRenderer = config
diff --git a/redisinsight/desktop/src/lib/server/server.ts b/redisinsight/desktop/src/lib/server/server.ts
index 0950715695..438f99ea22 100644
--- a/redisinsight/desktop/src/lib/server/server.ts
+++ b/redisinsight/desktop/src/lib/server/server.ts
@@ -32,7 +32,7 @@ export const launchApiServer = async () => {
log.info('Available port:', detectPortConst)
- const { gracefulShutdown: gracefulShutdownFn, app: apiApp } = await server()
+ const { gracefulShutdown: gracefulShutdownFn, app: apiApp } = await server(detectPortConst)
gracefulShutdown = gracefulShutdownFn
beApp = apiApp
diff --git a/redisinsight/ui/src/Router.tsx b/redisinsight/ui/src/Router.tsx
index 18c9099490..c9765cfc67 100644
--- a/redisinsight/ui/src/Router.tsx
+++ b/redisinsight/ui/src/Router.tsx
@@ -7,7 +7,7 @@ interface Props {
}
const Router = ({ children }: Props) =>
- (process.env.APP_ENV !== AppEnv.ELECTRON ? (
+ (process.env.RI_APP_TYPE !== AppEnv.ELECTRON ? (
{children}
) : (
{children}
diff --git a/redisinsight/ui/src/constants/api.ts b/redisinsight/ui/src/constants/api.ts
index 6351c824b2..f3cf446204 100644
--- a/redisinsight/ui/src/constants/api.ts
+++ b/redisinsight/ui/src/constants/api.ts
@@ -145,9 +145,9 @@ export enum CustomHeaders {
export const DEFAULT_SEARCH_MATCH = '*'
-const SCAN_COUNT_DEFAULT_ENV = process.env.SCAN_COUNT_DEFAULT || '500'
-const PIPELINE_COUNT_DEFAULT_ENV = process.env.PIPELINE_COUNT_DEFAULT || '5'
-const SCAN_TREE_COUNT_DEFAULT_ENV = process.env.SCAN_TREE_COUNT_DEFAULT || '10000'
+const SCAN_COUNT_DEFAULT_ENV = process.env.RI_SCAN_COUNT_DEFAULT || '500'
+const PIPELINE_COUNT_DEFAULT_ENV = process.env.RI_PIPELINE_COUNT_DEFAULT || '5'
+const SCAN_TREE_COUNT_DEFAULT_ENV = process.env.RI_SCAN_TREE_COUNT_DEFAULT || '10000'
export const SCAN_COUNT_DEFAULT = parseInt(SCAN_COUNT_DEFAULT_ENV, 10)
export const PIPELINE_COUNT_DEFAULT = parseInt(PIPELINE_COUNT_DEFAULT_ENV, 10)
diff --git a/redisinsight/ui/src/pages/home/constants/form.ts b/redisinsight/ui/src/pages/home/constants/form.ts
index 5229a0a649..d54ad1029c 100644
--- a/redisinsight/ui/src/pages/home/constants/form.ts
+++ b/redisinsight/ui/src/pages/home/constants/form.ts
@@ -29,7 +29,7 @@ export const fieldDisplayNames = {
sshUsername: 'SSH Username',
}
-const DEFAULT_TIMEOUT_ENV = process.env.CONNECTIONS_TIMEOUT_DEFAULT || '30000' // 30 sec
+const DEFAULT_TIMEOUT_ENV = process.env.RI_CONNECTIONS_TIMEOUT_DEFAULT || '30000' // 30 sec
export const DEFAULT_TIMEOUT = parseInt(DEFAULT_TIMEOUT_ENV, 10)
diff --git a/redisinsight/ui/src/services/apiService.ts b/redisinsight/ui/src/services/apiService.ts
index 6339ed21d5..5bcd944ec8 100644
--- a/redisinsight/ui/src/services/apiService.ts
+++ b/redisinsight/ui/src/services/apiService.ts
@@ -5,17 +5,17 @@ import { BrowserStorageItem } from 'uiSrc/constants'
import { CustomHeaders } from 'uiSrc/constants/api'
const { apiPort } = window.app.config
-const baseApiUrl = process.env.BASE_API_URL
-const apiPrefix = process.env.API_PREFIX
+const baseApiUrl = process.env.RI_BASE_API_URL
+const apiPrefix = process.env.RI_API_PREFIX
const isDevelopment = process.env.NODE_ENV === 'development'
-const isWebApp = process.env.APP_ENV === 'web'
+const isWebApp = process.env.RI_APP_TYPE === 'web'
axios.defaults.adapter = require('axios/lib/adapters/http')
const axiosInstance = axios.create({
baseURL:
!isDevelopment && isWebApp
- ? `${window.location.origin}/api/`
+ ? `${window.location.origin}/${apiPrefix}/`
: `${baseApiUrl}:${apiPort}/${apiPrefix}/`,
})
diff --git a/redisinsight/ui/src/services/resourcesService.ts b/redisinsight/ui/src/services/resourcesService.ts
index 72db71927d..551c9760a5 100644
--- a/redisinsight/ui/src/services/resourcesService.ts
+++ b/redisinsight/ui/src/services/resourcesService.ts
@@ -2,9 +2,9 @@ import axios from 'axios'
import { IS_ABSOLUTE_PATH } from 'uiSrc/constants/regex'
const { apiPort } = window.app.config
-const baseApiUrl = process.env.BASE_API_URL
+const baseApiUrl = process.env.RI_BASE_API_URL
const isDevelopment = process.env.NODE_ENV === 'development'
-const isWebApp = process.env.APP_ENV === 'web'
+const isWebApp = process.env.RI_APP_TYPE === 'web'
export const RESOURCES_BASE_URL = !isDevelopment && isWebApp ? '/' : `${baseApiUrl}:${apiPort}/`
axios.defaults.adapter = require('axios/lib/adapters/http')
diff --git a/redisinsight/ui/src/setup-env.ts b/redisinsight/ui/src/setup-env.ts
index 0547fbcc99..e1fbd779fd 100644
--- a/redisinsight/ui/src/setup-env.ts
+++ b/redisinsight/ui/src/setup-env.ts
@@ -1,7 +1,7 @@
-process.env.BASE_API_URL = 'http://localhost'
-process.env.RESOURCES_BASE_URL = 'http://localhost'
-process.env.API_PORT = '5001'
-process.env.API_PREFIX = 'api'
+process.env.RI_BASE_API_URL = 'http://localhost'
+process.env.RI_RESOURCES_BASE_URL = 'http://localhost'
+process.env.RI_APP_PORT = '5001'
+process.env.RI_API_PREFIX = 'api'
window.app = {
...window.app,
diff --git a/redisinsight/ui/src/utils/common.ts b/redisinsight/ui/src/utils/common.ts
index f66786c589..f324cd62e4 100644
--- a/redisinsight/ui/src/utils/common.ts
+++ b/redisinsight/ui/src/utils/common.ts
@@ -1,8 +1,8 @@
import { IpcInvokeEvent } from 'uiSrc/electron/constants'
-const baseApiUrl = process.env.BASE_API_URL
+const baseApiUrl = process.env.RI_BASE_API_URL
const isDevelopment = process.env.NODE_ENV === 'development'
-const isWebApp = process.env.APP_ENV === 'web'
+const isWebApp = process.env.RI_APP_TYPE === 'web'
const { apiPort } = window.app.config
export const getBaseApiUrl = () => (!isDevelopment && isWebApp
diff --git a/tests/e2e/.desktop.env b/tests/e2e/.desktop.env
index c9c1d6451c..de92ce5085 100644
--- a/tests/e2e/.desktop.env
+++ b/tests/e2e/.desktop.env
@@ -1,7 +1,7 @@
COMMON_URL=https://localhost:5530
API_URL=https://localhost:5530/api
OSS_SENTINEL_PASSWORD=password
-APP_FOLDER_NAME=.redisinsight-app-stage
+RI_APP_FOLDER_NAME=.redisinsight-app-stage
OSS_STANDALONE_HOST=localhost
OSS_STANDALONE_PORT=8100
@@ -36,8 +36,8 @@ OSS_SENTINEL_PORT=28100
RE_CLUSTER_HOST=localhost
RE_CLUSTER_PORT=19443
-NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/e2e/notifications.json
-NOTIFICATION_SYNC_INTERVAL=30000
+RI_NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/e2e/notifications.json
+RI_NOTIFICATION_SYNC_INTERVAL=30000
RI_FEATURES_CONFIG_URL=http://localhost:5551/remote/features-config.json
RI_FEATURES_CONFIG_SYNC_INTERVAL=50000
diff --git a/tests/e2e/.env b/tests/e2e/.env
index 9774b872a8..c447d06c8c 100644
--- a/tests/e2e/.env
+++ b/tests/e2e/.env
@@ -1,8 +1,7 @@
COMMON_URL=https://app:5000
API_URL=https://app:5000/api
OSS_SENTINEL_PASSWORD=password
-APP_FOLDER_NAME=.redisinsight-app
-NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/e2e/notifications.json
-NOTIFICATION_SYNC_INTERVAL=30000
+RI_NOTIFICATION_UPDATE_URL=https://s3.amazonaws.com/redisinsight.test/public/tests/e2e/notifications.json
+RI_NOTIFICATION_SYNC_INTERVAL=30000
RI_FEATURES_CONFIG_URL=http://static-server:5551/remote/features-config.json
RI_FEATURES_CONFIG_SYNC_INTERVAL=50000
diff --git a/tests/e2e/docker.web.docker-compose.yml b/tests/e2e/docker.web.docker-compose.yml
index 9cd09a2e2f..92424063f7 100644
--- a/tests/e2e/docker.web.docker-compose.yml
+++ b/tests/e2e/docker.web.docker-compose.yml
@@ -10,10 +10,8 @@ services:
- ./results:/usr/src/app/results
- ./report:/usr/src/app/report
- ./plugins:/usr/src/app/plugins
- - .redisinsight-app:/root/.redisinsight-app
- - .ritmp:/tmp
- - ./test-data/certs:/root/certs
- - ./test-data/ssh:/root/ssh
+ - rihomedir:/root/.redisinsight-app
+ - tmp:/tmp
- ./remote:/root/remote
env_file:
- ./.env
@@ -38,13 +36,19 @@ services:
# Built image
app:
- cap_add:
- - ipc_lock
+ logging:
+ driver: none
image: riv2:latest
env_file:
- ./.env
+ environment:
+ RI_SERVER_TLS_CERT: $RI_SERVER_TLS_CERT
+ RI_SERVER_TLS_KEY: $RI_SERVER_TLS_KEY
volumes:
- - .redisinsight-app:/root/.redisinsight-app
- - .ritmp:/tmp
- - ./test-data/certs:/root/certs
- - ./test-data/ssh:/root/ssh
+ - rihomedir:/data
+ - tmp:/tmp
+ - ./test-data:/test-data
+
+volumes:
+ tmp:
+ rihomedir:
diff --git a/tests/e2e/helpers/conf.ts b/tests/e2e/helpers/conf.ts
index fd3a73ae19..4059b4c4e5 100644
--- a/tests/e2e/helpers/conf.ts
+++ b/tests/e2e/helpers/conf.ts
@@ -8,8 +8,8 @@ const chance = new Chance();
export const commonUrl = process.env.COMMON_URL || 'https://localhost:5000';
export const apiUrl = process.env.API_URL || 'https://localhost:5000/api';
-export const workingDirectory = process.env.APP_FOLDER_ABSOLUTE_PATH
- || (joinPath(os.homedir(), process.env.APP_FOLDER_NAME || '.redisinsight-app'));
+export const workingDirectory = process.env.RI_APP_FOLDER_ABSOLUTE_PATH
+ || (joinPath(os.homedir(), process.env.RI_APP_FOLDER_NAME || '.redisinsight-app'));
export const fileDownloadPath = joinPath(os.homedir(), 'Downloads');
const uniqueId = chance.string({ length: 10 });
diff --git a/tests/e2e/local.web.docker-compose.yml b/tests/e2e/local.web.docker-compose.yml
index 361f8a0acd..d8670f02bd 100644
--- a/tests/e2e/local.web.docker-compose.yml
+++ b/tests/e2e/local.web.docker-compose.yml
@@ -45,6 +45,9 @@ services:
build:
context: ./../../
dockerfile: Dockerfile
+ environment:
+ RI_SERVER_TLS_CERT: $RI_SERVER_TLS_CERT
+ RI_SERVER_TLS_KEY: $RI_SERVER_TLS_KEY
volumes:
- .redisinsight-app:/root/.redisinsight-app
- ./test-data/certs:/root/certs
diff --git a/tests/e2e/package.json b/tests/e2e/package.json
index d2ac12d0f5..7dddab6e5c 100644
--- a/tests/e2e/package.json
+++ b/tests/e2e/package.json
@@ -6,13 +6,13 @@
"main": "index.js",
"scripts": {
"test:live": "testcafe --live chrome ",
- "start:api": "cross-env SERVER_STATIC_CONTENT=true yarn --cwd ../../redisinsight/api start:prod",
+ "start:api": "cross-env yarn --cwd ../../redisinsight/api start:prod",
"build:api": "yarn --cwd ../../redisinsight/api build:prod",
"build:statics": "cross-env E2E=true yarn --cwd ../../ build:statics",
"build:statics:win": "cross-env E2E=true yarn --cwd ../../ build:statics:win",
"build:web": "yarn --cwd ../../ build:web",
"redis:last": "docker run --name redis-last-version -p 7777:6379 -d redislabs/redismod",
- "start:app": "cross-env SERVER_STATIC_CONTENT=true yarn start:api",
+ "start:app": "cross-env yarn start:api",
"test:chrome": "testcafe --compiler-options typescript.configPath=tsconfig.testcafe.json --cache --disable-multiple-windows --concurrency 1 chrome tests/ -r html:./report/report.html,spec -e -s takeOnFails=true,path=report/screenshots/,pathPattern=${OS}_${BROWSER}/${DATE}_${TIME}/${FIXTURE}_${TEST}_${FILE_INDEX}.png",
"test:chrome:ci": "ts-node ./web.runner.ts",
"test": "yarn test:chrome",
@@ -54,8 +54,8 @@
"redis": "3.1.1",
"sqlite3": "^5.1.6",
"supertest": "^4.0.2",
- "testcafe": "3.3.0",
- "testcafe-browser-provider-electron": "0.0.19",
+ "testcafe": "3.5.0",
+ "testcafe-browser-provider-electron": "0.0.20",
"testcafe-reporter-html": "1.4.6",
"testcafe-reporter-json": "2.2.0",
"testcafe-reporter-spec": "2.2.0",
diff --git a/tests/e2e/pageObjects/components/toast.ts b/tests/e2e/pageObjects/components/toast.ts
index a3afa68aa7..e880f39a5a 100644
--- a/tests/e2e/pageObjects/components/toast.ts
+++ b/tests/e2e/pageObjects/components/toast.ts
@@ -1,10 +1,10 @@
import { Selector } from 'testcafe';
export class Toast {
- toastHeader = Selector('[data-test-subj=euiToastHeader]');
+ toastHeader = Selector('[data-test-subj=euiToastHeader]', { timeout: 30000 });
toastBody = Selector('[class*=euiToastBody]');
toastSuccess = Selector('[class*=euiToast--success]');
- toastError = Selector('[class*=euiToast--danger]');
+ toastError = Selector('[class*=euiToast--danger]', { timeout: 30000 });
toastCloseButton = Selector('[data-test-subj=toastCloseButton]');
toastSubmitBtn = Selector('[data-testid=submit-tooltip-btn]');
toastCancelBtn = Selector('[data-testid=toast-cancel-btn]');
diff --git a/tests/e2e/rte.docker-compose.yml b/tests/e2e/rte.docker-compose.yml
index 0f3dde512d..46248a80fe 100644
--- a/tests/e2e/rte.docker-compose.yml
+++ b/tests/e2e/rte.docker-compose.yml
@@ -2,6 +2,8 @@ version: "3.4"
services:
static-server:
+ logging: &logging
+ driver: none
build:
context: .
dockerfile: static-server.Dockerfile
@@ -11,6 +13,7 @@ services:
- 5551:5551
# ssh
ssh:
+ logging: *logging
image: lscr.io/linuxserver/openssh-server:latest
environment:
- PASSWORD_ACCESS=true
@@ -30,6 +33,7 @@ services:
# oss standalone
oss-standalone:
+ logging: *logging
image: redislabs/redismod
command: [
"--loadmodule", "/usr/lib/redis/modules/redisearch.so",
@@ -42,6 +46,7 @@ services:
- 8100:6379
oss-standalone-empty:
+ logging: *logging
image: redislabs/redismod
command: [
"--loadmodule", "/usr/lib/redis/modules/redisearch.so",
@@ -55,6 +60,7 @@ services:
# oss standalone v5
oss-standalone-v5:
+ logging: *logging
image: redis:5
ports:
- 8101:6379
@@ -65,16 +71,19 @@ services:
ipv4_address: 172.33.100.111
# oss standalone redisearch
oss-standalone-redisearch:
+ logging: *logging
image: redislabs/redismod
ports:
- 8102:6379
oss-standalone-redisgears-2-0:
+ logging: *logging
image: redislabs/redisgears:edge
ports:
- 8106:6379
oss-standalone-big:
+ logging: *logging
build:
context: ./rte/oss-standalone-big
dockerfile: Dockerfile
@@ -85,6 +94,7 @@ services:
# oss standalone tls
oss-standalone-tls:
+ logging: *logging
build:
context: ./rte/oss-standalone-tls
dockerfile: Dockerfile
@@ -93,6 +103,7 @@ services:
# oss sentinel
oss-sentinel:
+ logging: *logging
build: ./rte/oss-sentinel
depends_on:
- oss-sentinel-primary-1
@@ -101,13 +112,16 @@ services:
- 28100:26379
oss-sentinel-primary-1:
+ logging: *logging
image: redis:5
oss-sentinel-primary-2:
+ logging: *logging
image: redis:5
# oss cluster (v7)
cluster-plain-creator-7:
+ logging: *logging
build:
context: ./rte/oss-cluster-7
dockerfile: creator.Dockerfile
@@ -116,6 +130,7 @@ services:
- master-plain-7-2
- master-plain-7-3
master-plain-7-1:
+ logging: *logging
build: &cluster-plain-7-build ./rte/oss-cluster-7
ports:
- 8200:6379
@@ -123,11 +138,13 @@ services:
default:
ipv4_address: 172.31.100.211
master-plain-7-2:
+ logging: *logging
build: *cluster-plain-7-build
networks:
default:
ipv4_address: 172.31.100.212
master-plain-7-3:
+ logging: *logging
build: *cluster-plain-7-build
networks:
default:
@@ -135,6 +152,7 @@ services:
# oss cluster (v7) with rediserch > 2.2
cluster-rs-creator-7:
+ logging: *logging
build:
context: &cluster-rs-7-build ./rte/oss-cluster-7-rs
dockerfile: creator.Dockerfile
@@ -143,6 +161,7 @@ services:
- master-rs-7-2
- master-rs-7-3
master-rs-7-1:
+ logging: *logging
build: *cluster-rs-7-build
ports:
- 8221:6379
@@ -150,11 +169,13 @@ services:
default:
ipv4_address: 172.31.100.221
master-rs-7-2:
+ logging: *logging
build: *cluster-rs-7-build
networks:
default:
ipv4_address: 172.31.100.222
master-rs-7-3:
+ logging: *logging
build: *cluster-rs-7-build
networks:
default:
@@ -162,6 +183,7 @@ services:
# oss cluster with redisgears 2
gears-cluster-2-0-creator:
+ logging: *logging
image: redis:latest
entrypoint: ['/bin/sh', '-c', 'redis-cli --cluster create 172.31.100.191:6379 172.31.100.192:6379 172.31.100.193:6379 172.31.100.194:6379 172.31.100.195:6379 172.31.100.196:6379 --cluster-replicas 1 --cluster-yes && tail -f /dev/null']
depends_on:
@@ -172,36 +194,42 @@ services:
- gears-cluster-2-0-node-5
- gears-cluster-2-0-node-6
gears-cluster-2-0-node-1:
+ logging: *logging
image: &gears-cluster-img redislabs/redisgears:edge
command: &gears-cluster-cmd redis-server --protected-mode no --loadmodule /build/target/release/libredisgears.so v8-plugin-path /build/target/release/libredisgears_v8_plugin.so --cluster-enabled yes
networks:
default:
ipv4_address: 172.31.100.191
gears-cluster-2-0-node-2:
+ logging: *logging
image: *gears-cluster-img
command: *gears-cluster-cmd
networks:
default:
ipv4_address: 172.31.100.192
gears-cluster-2-0-node-3:
+ logging: *logging
image: *gears-cluster-img
command: *gears-cluster-cmd
networks:
default:
ipv4_address: 172.31.100.193
gears-cluster-2-0-node-4:
+ logging: *logging
image: *gears-cluster-img
command: *gears-cluster-cmd
networks:
default:
ipv4_address: 172.31.100.194
gears-cluster-2-0-node-5:
+ logging: *logging
image: *gears-cluster-img
command: *gears-cluster-cmd
networks:
default:
ipv4_address: 172.31.100.195
gears-cluster-2-0-node-6:
+ logging: *logging
image: *gears-cluster-img
command: *gears-cluster-cmd
networks:
@@ -210,6 +238,7 @@ services:
# redis enterprise
redis-enterprise:
+ logging: *logging
build: ./rte/redis-enterprise
cap_add:
- sys_resource
diff --git a/tests/e2e/test-data/import-databases/racompFullSSH.json b/tests/e2e/test-data/import-databases/racompFullSSH.json
index 9344e9d79c..6e4e08f92a 100644
--- a/tests/e2e/test-data/import-databases/racompFullSSH.json
+++ b/tests/e2e/test-data/import-databases/racompFullSSH.json
@@ -90,7 +90,7 @@
"enablePreferredSlaves": false,
"sshKeyPassphrase": "test",
"sshKeyFileBookmark": "Ym9vaywDAAAAAAQQMAAAAIBWP/gr7z3b88NnoG4DgHrVdcb9xooy0jrMPBXgQNZ5KAIAAAQAAAADAwAAAAgAKAUAAAABAQAAVXNlcnMAAAAPAAAAAQEAAHZsYWRpc2xhdmRhcmdlbAAIAAAAAQEAAFByb2plY3RzCAAAAAEBAABzc2gtZW52cwMAAAABAQAAc3NoAAQAAAABAQAAa2V5cwUAAAABAQAAdGVzdHAAAAAcAAAAAQYAABAAAAAgAAAAOAAAAEgAAABYAAAAZAAAAHAAAAAIAAAABAMAAAFdAAAAAAAACAAAAAQDAAB2gQAAAAAAAAgAAAAEAwAAQpMRAAAAAAAIAAAABAMAAC783QAAAAAACAAAAAQDAAAz/N0AAAAAAAgAAAAEAwAANPzdAAAAAAAIAAAABAMAADn83QAAAAAAHAAAAAEGAACkAAAAtAAAAMQAAADUAAAA5AAAAPQAAAAEAQAACAAAAAAEAABBxLVvdQAAABgAAAABAgAAAQAAAAAAAAAPAAAAAAAAAAAAAAAAAAAACAAAAAQDAAAFAAAAAAAAAAQAAAADAwAA9QEAAAgAAAABCQAAZmlsZTovLy8MAAAAAQEAAE1hY2ludG9zaCBIRAgAAAAEAwAAAACHETkAAAAIAAAAAAQAAEHEUm5rAAAAJAAAAAEBAABDMjExQUM1Qy00MTlGLTQ0NTQtOEZEOS0xNDEwMDFBMDhFOTQYAAAAAQIAAIEAAAABAAAA7xMAAAEAAAAAAAAAAAAAAAEAAAABAQAALwAAAAAAAAABBQAAzAAAAP7///8BAAAAAAAAABAAAAAEEAAAgAAAAAAAAAAFEAAAFAEAAAAAAAAQEAAASAEAAAAAAABAEAAAOAEAAAAAAAACIAAAFAIAAAAAAAAFIAAAhAEAAAAAAAAQIAAAlAEAAAAAAAARIAAAyAEAAAAAAAASIAAAqAEAAAAAAAATIAAAuAEAAAAAAAAgIAAA9AEAAAAAAAAwIAAAIAIAAAAAAAABwAAAaAEAAAAAAAARwAAAIAAAAAAAAAASwAAAeAEAAAAAAAAQ0AAABAAAAAAAAAA=",
- "sshKeyFile": "/root/ssh/sshPrivateKeyPasscode",
+ "sshKeyFile": "/test-data/ssh/sshPrivateKeyPasscode",
"sshPassword": null,
"sshUser": "u",
"sshPort": 2222,
@@ -121,7 +121,7 @@
"enablePreferredSlaves": false,
"sshKeyPassphrase": null,
"sshKeyFileBookmark": "Ym9vaygDAAAAAAQQMAAAAFCmPsFThwh4jmVDMVb0pSIjuOx1dHbxRiMdvR0o1X/gJAIAAAQAAAADAwAAAAgAKAUAAAABAQAAVXNlcnMAAAAPAAAAAQEAAHZsYWRpc2xhdmRhcmdlbAAIAAAAAQEAAFByb2plY3RzCAAAAAEBAABzc2gtZW52cwMAAAABAQAAc3NoAAQAAAABAQAAa2V5cwQAAAABAQAAdGVzdBwAAAABBgAAEAAAACAAAAA4AAAASAAAAFgAAABkAAAAcAAAAAgAAAAEAwAAAV0AAAAAAAAIAAAABAMAAHaBAAAAAAAACAAAAAQDAABCkxEAAAAAAAgAAAAEAwAALvzdAAAAAAAIAAAABAMAADP83QAAAAAACAAAAAQDAAA0/N0AAAAAAAgAAAAEAwAANfzdAAAAAAAcAAAAAQYAAKAAAACwAAAAwAAAANAAAADgAAAA8AAAAAABAAAIAAAAAAQAAEHEtW9qAAAAGAAAAAECAAABAAAAAAAAAA8AAAAAAAAAAAAAAAAAAAAIAAAABAMAAAUAAAAAAAAABAAAAAMDAAD1AQAACAAAAAEJAABmaWxlOi8vLwwAAAABAQAATWFjaW50b3NoIEhECAAAAAQDAAAAAIcROQAAAAgAAAAABAAAQcRSbmsAAAAkAAAAAQEAAEMyMTFBQzVDLTQxOUYtNDQ1NC04RkQ5LTE0MTAwMUEwOEU5NBgAAAABAgAAgQAAAAEAAADvEwAAAQAAAAAAAAAAAAAAAQAAAAEBAAAvAAAAAAAAAAEFAADMAAAA/v///wEAAAAAAAAAEAAAAAQQAAB8AAAAAAAAAAUQAAAQAQAAAAAAABAQAABEAQAAAAAAAEAQAAA0AQAAAAAAAAIgAAAQAgAAAAAAAAUgAACAAQAAAAAAABAgAACQAQAAAAAAABEgAADEAQAAAAAAABIgAACkAQAAAAAAABMgAAC0AQAAAAAAACAgAADwAQAAAAAAADAgAAAcAgAAAAAAAAHAAABkAQAAAAAAABHAAAAgAAAAAAAAABLAAAB0AQAAAAAAABDQAAAEAAAAAAAAAA==",
- "sshKeyFile": "/root/ssh/sshPrivateKey",
+ "sshKeyFile": "/test-data/ssh/sshPrivateKey",
"sshPassword": null,
"sshUser": "u",
"sshPort": 2222,
@@ -187,7 +187,7 @@
"ssh_host": "172.31.100.245",
"ssh_password": "",
"ssh_port": 2222,
- "ssh_private_key_path": "/root/ssh/sshPrivateKeyPasscode",
+ "ssh_private_key_path": "/test-data/ssh/sshPrivateKeyPasscode",
"ssh_user": "u",
"timeout_connect": 60000,
"timeout_execute": 60000,
@@ -202,7 +202,7 @@
"ssh_password": "test",
"ssh_port": 2222,
"ssh_private_key_path": "",
- "ssh_agent_path": "/root/ssh/sshPrivateKeyPasscode",
+ "ssh_agent_path": "/test-data/ssh/sshPrivateKeyPasscode",
"ssh_user": "u",
"timeout_connect": 60000,
"timeout_execute": 60000,
@@ -266,4 +266,4 @@
"id": "1cafc9cc-bfe3-4b60-9a29-adf033cbd909",
"result": "partial"
}
-]
\ No newline at end of file
+]
diff --git a/tests/e2e/test-data/import-databases/rdm-certificates.json b/tests/e2e/test-data/import-databases/rdm-certificates.json
index bd6f2daac9..93bb69de79 100644
--- a/tests/e2e/test-data/import-databases/rdm-certificates.json
+++ b/tests/e2e/test-data/import-databases/rdm-certificates.json
@@ -48,27 +48,27 @@
"host": "localhost",
"port": 8102,
"name": "theSameBody1Path",
- "ssl_ca_cert_path": "/root/certs/certsByPath/caPath.crt",
- "ssl_local_cert_path": "/root/certs/certsByPath/clientPath.crt",
- "ssl_private_key_path": "/root/certs/certsByPath/clientPath.key",
+ "ssl_ca_cert_path": "/test-data/certs/certsByPath/caPath.crt",
+ "ssl_local_cert_path": "/test-data/certs/certsByPath/clientPath.crt",
+ "ssl_private_key_path": "/test-data/certs/certsByPath/clientPath.key",
"result": "success"
},
{
"host": "localhost",
"port": 8101,
"name": "theSameBody2Path",
- "ssl_ca_cert_path": "/root/certs/certsByPath/caSameBody.crt",
- "ssl_local_cert_path": "/root/certs/certsByPath/clientSameBody.crt",
- "ssl_private_key_path": "/root/certs/certsByPath/clientSameBody.key",
+ "ssl_ca_cert_path": "/test-data/certs/certsByPath/caSameBody.crt",
+ "ssl_local_cert_path": "/test-data/certs/certsByPath/clientSameBody.crt",
+ "ssl_private_key_path": "/test-data/certs/certsByPath/clientSameBody.key",
"result": "success"
},
{
"host": "localhost",
"port": 8103,
"name": "theSameNamePath",
- "ssl_ca_cert_path": "/root/certs/sameNameCerts/caPath.crt",
- "ssl_local_cert_path": "/root/certs/sameNameCerts/clientPath.crt",
- "ssl_private_key_path": "/root/certs/sameNameCerts/clientPath.key",
+ "ssl_ca_cert_path": "/test-data/certs/sameNameCerts/caPath.crt",
+ "ssl_local_cert_path": "/test-data/certs/sameNameCerts/clientPath.crt",
+ "ssl_private_key_path": "/test-data/certs/sameNameCerts/clientPath.key",
"result": "success"
}
-]
\ No newline at end of file
+]
diff --git a/tests/e2e/test-data/import-databases/rdm-full.json b/tests/e2e/test-data/import-databases/rdm-full.json
index ad10b949f8..c300d7cfba 100644
--- a/tests/e2e/test-data/import-databases/rdm-full.json
+++ b/tests/e2e/test-data/import-databases/rdm-full.json
@@ -49,7 +49,7 @@
"host": "localhost",
"port": 8102,
"name": "rdmHost+Port+Name+CaCert",
- "ssl_ca_cert_path": "/root/certs/ca.crt",
+ "ssl_ca_cert_path": "/test-data/certs/ca.crt",
"result": "success"
},
{
@@ -57,26 +57,26 @@
"port": 8102,
"name": "rdmHost+Port+Name+clientCert+privateKey",
"ssl": true,
- "ssl_local_cert_path": "/root/certs/client.crt",
- "ssl_private_key_path": "/root/certs/client.key",
+ "ssl_local_cert_path": "/test-data/certs/client.crt",
+ "ssl_private_key_path": "/test-data/certs/client.key",
"result": "success"
},
{
"host": "localhost",
"port": 8102,
"name": "rdmHost+Port+Name+CaCert+clientCert+privateKey",
- "ssl_ca_cert_path": "/root/certs/ca.crt",
- "ssl_local_cert_path": "/root/certs/client.crt",
- "ssl_private_key_path": "/root/certs/client.key",
+ "ssl_ca_cert_path": "/test-data/certs/ca.crt",
+ "ssl_local_cert_path": "/test-data/certs/client.crt",
+ "ssl_private_key_path": "/test-data/certs/client.key",
"result": "success"
},
{
"host": "localhost",
"port": 8102,
"name": "rdmHost+Port+Name+CaCert+clientCert+privateKey(notbypath)",
- "ssl_ca_cert_path": "/root/certs/ca.crt",
- "ssl_local_cert_path": "/root/certs/client.crt",
- "ssl_private_key_path": "/root/certs/client.key",
+ "ssl_ca_cert_path": "/test-data/certs/ca.crt",
+ "ssl_local_cert_path": "/test-data/certs/client.crt",
+ "ssl_private_key_path": "/test-data/certs/client.key",
"result": "success"
},
{
@@ -84,9 +84,9 @@
"port": 6379,
"name": "rdmHost+Port+Name+username+pass+CaCert+clientCert+privateKey",
"ssl": true,
- "ssl_ca_cert_path": "/root/certs/ca.crt",
- "ssl_local_cert_path": "/root/certs/client.crt",
- "ssl_private_key_path": "/root/certs/client.key",
+ "ssl_ca_cert_path": "/test-data/certs/ca.crt",
+ "ssl_local_cert_path": "/test-data/certs/client.crt",
+ "ssl_private_key_path": "/test-data/certs/client.key",
"username": "admin",
"auth": "pass",
"result": "success"
@@ -207,14 +207,14 @@
"host": "localhost",
"port": 8103,
"name": "rdmOnlyClientCert",
- "ssl_local_cert_path": "/root/certs/client.crt",
+ "ssl_local_cert_path": "/test-data/certs/client.crt",
"result": "partial"
},
{
"host": "localhost",
"port": 8103,
"name": "rdmOnlyPrivateKey",
- "ssl_private_key_path": "/root/certs/client.key",
+ "ssl_private_key_path": "/test-data/certs/client.key",
"result": "partial"
},
{
@@ -222,14 +222,14 @@
"port": 8103,
"name": "rdmInvalidClientCert",
"ssl_local_cert_path": "invalid client cert",
- "ssl_private_key_path": "/root/certs/client.key",
+ "ssl_private_key_path": "/test-data/certs/client.key",
"result": "partial"
},
{
"host": "localhost",
"port": 8103,
"name": "rdmInvalidPrivateKey",
- "ssl_local_cert_path": "/root/certs/client.crt",
+ "ssl_local_cert_path": "/test-data/certs/client.crt",
"ssl_private_key_path": "invalid private key",
"result": "partial"
},
@@ -255,15 +255,15 @@
"host": "localhost",
"port": 8103,
"name": "rdmCaCertInvalidPath",
- "ssl_ca_cert_path": "/root/certs/caInvalid.crt",
+ "ssl_ca_cert_path": "/test-data/certs/caInvalid.crt",
"result": "partial"
},
{
"host": "localhost",
"port": 8103,
"name": "rdmClientCert+PrivateKeyInvalidPathes",
- "ssl_local_cert_path": "/root/certs/clientInvalid.crt",
- "ssl_private_key_path": "/root/certs/clientInvalid.key",
+ "ssl_local_cert_path": "/test-data/certs/clientInvalid.crt",
+ "ssl_private_key_path": "/test-data/certs/clientInvalid.key",
"result": "partial"
}
]
diff --git a/tests/e2e/tests/electron/critical-path/a-first-start-form/user-agreements-form.e2e.ts b/tests/e2e/tests/electron/critical-path/a-first-start-form/user-agreements-form.e2e.ts
new file mode 100644
index 0000000000..d7c1f1ef90
--- /dev/null
+++ b/tests/e2e/tests/electron/critical-path/a-first-start-form/user-agreements-form.e2e.ts
@@ -0,0 +1,30 @@
+import { commonUrl } from '../../../../helpers/conf';
+import { MyRedisDatabasePage } from '../../../../pageObjects';
+import { Common } from '../../../../helpers/common';
+import { rte } from '../../../../helpers/constants';
+import { UserAgreementDialog } from '../../../../pageObjects/dialogs';
+
+const userAgreementDialog = new UserAgreementDialog();
+const myRedisDatabasePage = new MyRedisDatabasePage();
+
+fixture `Agreements Verification`
+ .meta({ type: 'critical_path', rte: rte.none })
+ .page(commonUrl)
+ .requestHooks(Common.mockSettingsResponse())
+test('Verify that user should accept User Agreements to continue working with the application', async t => {
+ await t.expect(userAgreementDialog.userAgreementsPopup.exists).ok('User Agreements Popup is shown');
+ // Verify that I still has agreements popup & cannot add a database
+ await t.expect(userAgreementDialog.submitButton.hasAttribute('disabled')).ok('Submit button not disabled by default');
+ await t.expect(myRedisDatabasePage.AddRedisDatabase.addDatabaseManually.exists).notOk('User can\'t add a database');
+});
+// Skipped due to docker currently doesn't support encryption https://redislabs.atlassian.net/browse/RI-5036
+test.skip('Verify that the encryption enabled by default and specific message', async t => {
+ const expectedPluginText = 'To avoid automatic execution of malicious code, when adding new Workbench plugins, use files from trusted authors only.';
+ // Verify that section with plugin warning is displayed
+ await t.expect(userAgreementDialog.pluginSectionWithText.exists).ok('Plugin text is not displayed');
+ // Verify that text that is displayed in window is 'While adding new visualization plugins, use files only from trusted authors to avoid automatic execution of malicious code.'
+ const pluginText = userAgreementDialog.pluginSectionWithText.innerText;
+ await t.expect(pluginText).eql(expectedPluginText, 'Plugin text is incorrect');
+ // Verify that encryption enabled by default
+ await t.expect(userAgreementDialog.switchOptionEncryption.withAttribute('aria-checked', 'true').exists).ok('Encryption enabled by default');
+});
diff --git a/tests/e2e/tests/electron/regression/browser/keys-all-databases.e2e.ts b/tests/e2e/tests/electron/regression/browser/keys-all-databases.e2e.ts
new file mode 100644
index 0000000000..f2842d91da
--- /dev/null
+++ b/tests/e2e/tests/electron/regression/browser/keys-all-databases.e2e.ts
@@ -0,0 +1,45 @@
+import { Selector, t } from 'testcafe';
+import { rte } from '../../../../helpers/constants';
+import { DatabaseHelper } from '../../../../helpers/database';
+import { BrowserPage } from '../../../../pageObjects';
+import {
+ commonUrl,
+ redisEnterpriseClusterConfig
+} from '../../../../helpers/conf';
+import { Common } from '../../../../helpers/common';
+import { APIKeyRequests } from '../../../../helpers/api/api-keys';
+
+const browserPage = new BrowserPage();
+const databaseHelper = new DatabaseHelper();
+const apiKeyRequests = new APIKeyRequests();
+
+let keyName = Common.generateWord(10);
+const verifyKeysAdded = async(): Promise => {
+ keyName = Common.generateWord(10);
+ // Add Hash key
+ await browserPage.addHashKey(keyName);
+ // Check the notification message
+ const notification = browserPage.Toast.toastHeader.textContent;
+ await t.expect(notification).contains('Key has been added', 'The notification not correct');
+ // Check that new key is displayed in the list
+ await browserPage.searchByKeyName(keyName);
+ const keyNameInTheList = Selector(`[data-testid="key-${keyName}"]`);
+ await Common.waitForElementNotVisible(browserPage.loader);
+ await t.expect(keyNameInTheList.exists).ok(`${keyName} key is not added`);
+};
+
+fixture `Work with keys in all types of databases`
+ .meta({ type: 'regression' })
+ .page(commonUrl);
+test
+ .meta({ rte: rte.reCluster })
+ .before(async() => {
+ await databaseHelper.acceptLicenseTermsAndAddREClusterDatabase(redisEnterpriseClusterConfig);
+ })
+ .after(async() => {
+ // Clear and delete database
+ await apiKeyRequests.deleteKeyByNameApi(keyName, redisEnterpriseClusterConfig.databaseName);
+ await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
+ })('Verify that user can add Key in RE Cluster DB', async() => {
+ await verifyKeysAdded();
+ });
diff --git a/tests/e2e/tests/electron/regression/cli/cli-re-cluster.e2e.ts b/tests/e2e/tests/electron/regression/cli/cli-re-cluster.e2e.ts
new file mode 100644
index 0000000000..0542619dc7
--- /dev/null
+++ b/tests/e2e/tests/electron/regression/cli/cli-re-cluster.e2e.ts
@@ -0,0 +1,48 @@
+import { Selector, t } from 'testcafe';
+import { rte } from '../../../../helpers/constants';
+import { DatabaseHelper } from '../../../../helpers/database';
+import { BrowserPage } from '../../../../pageObjects';
+import {
+ commonUrl,
+ redisEnterpriseClusterConfig
+} from '../../../../helpers/conf';
+import { Common } from '../../../../helpers/common';
+import { APIKeyRequests } from '../../../../helpers/api/api-keys';
+
+const browserPage = new BrowserPage();
+const databaseHelper = new DatabaseHelper();
+const apiKeyRequests = new APIKeyRequests();
+
+let keyName = Common.generateWord(10);
+const verifyCommandsInCli = async(): Promise => {
+ keyName = Common.generateWord(10);
+ // Open CLI
+ await t.click(browserPage.Cli.cliExpandButton);
+ // Add key from CLI
+ await t.typeText(browserPage.Cli.cliCommandInput, `SADD ${keyName} "chinese" "japanese" "german"`, { replace: true, paste: true });
+ await t.pressKey('enter');
+ // Check that the key is added
+ await browserPage.searchByKeyName(keyName);
+ const keyNameInTheList = Selector(`[data-testid="key-${keyName}"]`);
+ await Common.waitForElementNotVisible(browserPage.loader);
+ await t.expect(keyNameInTheList.exists).ok(`${keyName} key is not added`);
+};
+
+fixture `Work with CLI in RE Cluster`
+ .meta({ type: 'regression' })
+ .page(commonUrl);
+test
+ .meta({ rte: rte.reCluster })
+ .before(async() => {
+ await databaseHelper.acceptLicenseTermsAndAddREClusterDatabase(redisEnterpriseClusterConfig);
+ })
+ .after(async() => {
+ // Clear and delete database
+ await apiKeyRequests.deleteKeyByNameApi(keyName, redisEnterpriseClusterConfig.databaseName);
+ await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
+ })('Verify that user can add data via CLI in RE Cluster DB', async() => {
+ // Verify that database index switcher not displayed for RE Cluster
+ await t.expect(browserPage.OverviewPanel.changeIndexBtn.exists).notOk('Change Db index control displayed for RE Cluster DB');
+
+ await verifyCommandsInCli();
+ });
diff --git a/tests/e2e/tests/electron/regression/workbench/workbench-re-cluster.e2e.ts b/tests/e2e/tests/electron/regression/workbench/workbench-re-cluster.e2e.ts
new file mode 100644
index 0000000000..afb39c0ce2
--- /dev/null
+++ b/tests/e2e/tests/electron/regression/workbench/workbench-re-cluster.e2e.ts
@@ -0,0 +1,49 @@
+import { t } from 'testcafe';
+import { rte } from '../../../../helpers/constants';
+import { DatabaseHelper } from '../../../../helpers/database';
+import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects';
+import { commonUrl, redisEnterpriseClusterConfig } from '../../../../helpers/conf';
+
+const myRedisDatabasePage = new MyRedisDatabasePage();
+const workbenchPage = new WorkbenchPage();
+const databaseHelper = new DatabaseHelper();
+
+const commandForSend1 = 'info';
+const commandForSend2 = 'FT._LIST';
+const verifyCommandsInWorkbench = async(): Promise => {
+ const multipleCommands = [
+ 'info',
+ 'command',
+ 'FT.SEARCH idx *'
+ ];
+
+ await t.click(myRedisDatabasePage.NavigationPanel.workbenchButton);
+ // Send commands
+ await workbenchPage.sendCommandInWorkbench(commandForSend1);
+ await workbenchPage.sendCommandInWorkbench(commandForSend2);
+ // Check that all the previous run commands are saved and displayed
+ await workbenchPage.reloadPage();
+ await t.expect(workbenchPage.queryCardCommand.withExactText(commandForSend1).exists).ok('The previous run commands are saved');
+ await t.expect(workbenchPage.queryCardCommand.withExactText(commandForSend2).exists).ok('The previous run commands are saved');
+ // Send multiple commands in one query
+ await workbenchPage.sendCommandInWorkbench(multipleCommands.join('\n'), 0.75);
+ // Check that the results for all commands are displayed
+ for (const command of multipleCommands) {
+ await t.expect(workbenchPage.queryCardCommand.withExactText(command).exists).ok(`The command ${command} from multiple query is displayed`);
+ }
+};
+
+fixture `Work with Workbench in RE Cluster`
+ .meta({ type: 'regression' })
+ .page(commonUrl);
+test
+ .meta({ rte: rte.reCluster })
+ .before(async() => {
+ await databaseHelper.acceptLicenseTermsAndAddREClusterDatabase(redisEnterpriseClusterConfig);
+ })
+ .after(async() => {
+ // Delete database
+ await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
+ })('Verify that user can run commands in Workbench in RE Cluster DB', async() => {
+ await verifyCommandsInWorkbench();
+ });
diff --git a/tests/e2e/tests/electron/smoke/database/autodiscover-db.e2e.ts b/tests/e2e/tests/electron/smoke/database/autodiscover-db.e2e.ts
new file mode 100644
index 0000000000..810692a04e
--- /dev/null
+++ b/tests/e2e/tests/electron/smoke/database/autodiscover-db.e2e.ts
@@ -0,0 +1,27 @@
+import { DatabaseHelper } from '../../../../helpers/database';
+import {
+ commonUrl,
+ redisEnterpriseClusterConfig
+} from '../../../../helpers/conf';
+import { rte } from '../../../../helpers/constants';
+import { MyRedisDatabasePage } from '../../../../pageObjects';
+
+const myRedisDatabasePage = new MyRedisDatabasePage();
+const databaseHelper = new DatabaseHelper();
+
+fixture `Add database`
+ .meta({ type: 'smoke' })
+ .page(commonUrl)
+ .beforeEach(async() => {
+ await databaseHelper.acceptLicenseTerms();
+ });
+test
+ .meta({ rte: rte.reCluster })
+ .after(async() => {
+ await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
+ })('Verify that user can add database from RE Cluster via auto-discover flow', async() => {
+ await databaseHelper.addNewREClusterDatabase(redisEnterpriseClusterConfig);
+ // Verify that user can see an indicator of databases that are added using autodiscovery and not opened yet
+ // Verify new connection badge for RE cluster
+ await myRedisDatabasePage.verifyDatabaseStatusIsVisible(redisEnterpriseClusterConfig.databaseName);
+ });
diff --git a/tests/e2e/tests/electron/smoke/database/edit-db.e2e.ts b/tests/e2e/tests/electron/smoke/database/edit-db.e2e.ts
new file mode 100644
index 0000000000..b3585727e1
--- /dev/null
+++ b/tests/e2e/tests/electron/smoke/database/edit-db.e2e.ts
@@ -0,0 +1,30 @@
+import { ClientFunction } from 'testcafe';
+import { DatabaseHelper } from '../../../../helpers/database';
+import { MyRedisDatabasePage } from '../../../../pageObjects';
+import {
+ commonUrl,
+ redisEnterpriseClusterConfig
+} from '../../../../helpers/conf';
+import { rte } from '../../../../helpers/constants';
+
+const myRedisDatabasePage = new MyRedisDatabasePage();
+const databaseHelper = new DatabaseHelper();
+
+fixture `Edit Databases`
+ .meta({ type: 'smoke' })
+ .page(commonUrl)
+ .beforeEach(async() => {
+ await databaseHelper.acceptLicenseTerms();
+ });
+// Returns the URL of the current web page
+const getPageUrl = ClientFunction(() => window.location.href);
+test
+ .meta({ rte: rte.reCluster })
+ .after(async() => {
+ // Delete database
+ await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
+ })('Verify that user can connect to the RE cluster database', async t => {
+ await databaseHelper.addNewREClusterDatabase(redisEnterpriseClusterConfig);
+ await myRedisDatabasePage.clickOnDBByName(redisEnterpriseClusterConfig.databaseName);
+ await t.expect(getPageUrl()).contains('browser', 'The edit view is not opened');
+ });
diff --git a/tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts b/tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts
index 809f9b5e38..d2c43db1ce 100644
--- a/tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts
+++ b/tests/e2e/tests/web/critical-path/a-first-start-form/user-agreements-form.e2e.ts
@@ -22,7 +22,8 @@ test('Verify that user should accept User Agreements to continue working with th
await t.expect(userAgreementDialog.submitButton.hasAttribute('disabled')).ok('Submit button not disabled by default');
await t.expect(myRedisDatabasePage.AddRedisDatabase.addDatabaseManually.exists).notOk('User can\'t add a database');
});
-test('Verify that the encryption enabled by default and specific message', async t => {
+// Skipped due to docker currently doesn't support encryption https://redislabs.atlassian.net/browse/RI-5036
+test.skip('Verify that the encryption enabled by default and specific message', async t => {
const expectedPluginText = 'To avoid automatic execution of malicious code, when adding new Workbench plugins, use files from trusted authors only.';
// Verify that section with plugin warning is displayed
await t.expect(userAgreementDialog.pluginSectionWithText.exists).ok('Plugin text is not displayed');
diff --git a/tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts b/tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts
index 1418413284..4d4761135e 100644
--- a/tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts
+++ b/tests/e2e/tests/web/critical-path/database/connecting-to-the-db.e2e.ts
@@ -110,9 +110,15 @@ test
sshPassphrase: 'test'
};
// Verify that if user have not entered any required value he can see that this field should be specified when hover over the button to add a database
+ if (await welcomePage.addDbManuallyBtn.exists) {
+ await t.click(welcomePage.addDbManuallyBtn);
+ }
+ else {
+ await t
+ .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseButton)
+ .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseManually);
+ }
await t
- .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseButton)
- .click(myRedisDatabasePage.AddRedisDatabase.addDatabaseManually)
.click(myRedisDatabasePage.AddRedisDatabase.useSSHCheckbox)
.click(myRedisDatabasePage.AddRedisDatabase.sshPrivateKeyRadioBtn)
.hover(myRedisDatabasePage.AddRedisDatabase.addRedisDatabaseButton);
diff --git a/tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts b/tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts
index da80a78075..a9b292375e 100644
--- a/tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts
+++ b/tests/e2e/tests/web/regression/browser/keys-all-databases.e2e.ts
@@ -7,8 +7,7 @@ import {
commonUrl,
ossClusterConfig,
ossSentinelConfig,
- ossStandaloneBigConfig,
- redisEnterpriseClusterConfig
+ ossStandaloneBigConfig
} from '../../../../helpers/conf';
import { Common } from '../../../../helpers/common';
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
@@ -40,18 +39,6 @@ const verifyKeysAdded = async(): Promise => {
fixture `Work with keys in all types of databases`
.meta({ type: 'regression' })
.page(commonUrl);
-test
- .meta({ rte: rte.reCluster })
- .before(async() => {
- await databaseHelper.acceptLicenseTermsAndAddREClusterDatabase(redisEnterpriseClusterConfig);
- })
- .after(async() => {
- // Clear and delete database
- await apiKeyRequests.deleteKeyByNameApi(keyName, redisEnterpriseClusterConfig.databaseName);
- await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
- })('Verify that user can add Key in RE Cluster DB', async() => {
- await verifyKeysAdded();
- });
test
.meta({ rte: rte.reCloud })
.before(async() => {
diff --git a/tests/e2e/tests/web/regression/cli/cli-re-cluster.e2e.ts b/tests/e2e/tests/web/regression/cli/cli-all-db-types.e2e.ts
similarity index 81%
rename from tests/e2e/tests/web/regression/cli/cli-re-cluster.e2e.ts
rename to tests/e2e/tests/web/regression/cli/cli-all-db-types.e2e.ts
index 6a1ee92fc8..8aa48d6905 100644
--- a/tests/e2e/tests/web/regression/cli/cli-re-cluster.e2e.ts
+++ b/tests/e2e/tests/web/regression/cli/cli-all-db-types.e2e.ts
@@ -5,8 +5,7 @@ import { BrowserPage } from '../../../../pageObjects';
import {
cloudDatabaseConfig,
commonUrl, ossClusterConfig,
- ossSentinelConfig,
- redisEnterpriseClusterConfig
+ ossSentinelConfig
} from '../../../../helpers/conf';
import { Common } from '../../../../helpers/common';
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
@@ -35,21 +34,6 @@ const verifyCommandsInCli = async(): Promise => {
fixture `Work with CLI in all types of databases`
.meta({ type: 'regression' })
.page(commonUrl);
-test
- .meta({ rte: rte.reCluster })
- .before(async() => {
- await databaseHelper.acceptLicenseTermsAndAddREClusterDatabase(redisEnterpriseClusterConfig);
- })
- .after(async() => {
- // Clear and delete database
- await apiKeyRequests.deleteKeyByNameApi(keyName, redisEnterpriseClusterConfig.databaseName);
- await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
- })('Verify that user can add data via CLI in RE Cluster DB', async() => {
- // Verify that database index switcher not displayed for RE Cluster
- await t.expect(browserPage.OverviewPanel.changeIndexBtn.exists).notOk('Change Db index control displayed for RE Cluster DB');
-
- await verifyCommandsInCli();
- });
test
.meta({ rte: rte.reCloud })
.before(async() => {
diff --git a/tests/e2e/tests/web/regression/workbench/workbench-re-cluster.e2e.ts b/tests/e2e/tests/web/regression/workbench/workbench-all-db-types.e2e.ts
similarity index 85%
rename from tests/e2e/tests/web/regression/workbench/workbench-re-cluster.e2e.ts
rename to tests/e2e/tests/web/regression/workbench/workbench-all-db-types.e2e.ts
index aebe550dbd..633deadb0d 100644
--- a/tests/e2e/tests/web/regression/workbench/workbench-re-cluster.e2e.ts
+++ b/tests/e2e/tests/web/regression/workbench/workbench-all-db-types.e2e.ts
@@ -2,7 +2,7 @@ import { t } from 'testcafe';
import { rte } from '../../../../helpers/constants';
import { DatabaseHelper } from '../../../../helpers/database';
import { MyRedisDatabasePage, WorkbenchPage } from '../../../../pageObjects';
-import { cloudDatabaseConfig, commonUrl, ossClusterConfig, ossSentinelConfig, redisEnterpriseClusterConfig } from '../../../../helpers/conf';
+import { cloudDatabaseConfig, commonUrl, ossClusterConfig, ossSentinelConfig } from '../../../../helpers/conf';
import { DatabaseAPIRequests } from '../../../../helpers/api/api-database';
const myRedisDatabasePage = new MyRedisDatabasePage();
@@ -38,17 +38,6 @@ const verifyCommandsInWorkbench = async(): Promise => {
fixture `Work with Workbench in all types of databases`
.meta({ type: 'regression' })
.page(commonUrl);
-test
- .meta({ rte: rte.reCluster })
- .before(async() => {
- await databaseHelper.acceptLicenseTermsAndAddREClusterDatabase(redisEnterpriseClusterConfig);
- })
- .after(async() => {
- // Delete database
- await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
- })('Verify that user can run commands in Workbench in RE Cluster DB', async() => {
- await verifyCommandsInWorkbench();
- });
test
.meta({ rte: rte.reCloud })
.before(async() => {
diff --git a/tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts b/tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts
index 8b814104a6..1261c81277 100644
--- a/tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts
+++ b/tests/e2e/tests/web/smoke/database/autodiscover-db.e2e.ts
@@ -2,7 +2,6 @@ import { t } from 'testcafe';
import { DatabaseHelper } from '../../../../helpers/database';
import {
commonUrl,
- redisEnterpriseClusterConfig,
cloudDatabaseConfig
} from '../../../../helpers/conf';
import { rte } from '../../../../helpers/constants';
@@ -18,16 +17,6 @@ fixture `Add database`
.beforeEach(async() => {
await databaseHelper.acceptLicenseTerms();
});
-test
- .meta({ rte: rte.reCluster })
- .after(async() => {
- await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
- })('Verify that user can add database from RE Cluster via auto-discover flow', async() => {
- await databaseHelper.addNewREClusterDatabase(redisEnterpriseClusterConfig);
- // Verify that user can see an indicator of databases that are added using autodiscovery and not opened yet
- // Verify new connection badge for RE cluster
- await myRedisDatabasePage.verifyDatabaseStatusIsVisible(redisEnterpriseClusterConfig.databaseName);
- });
test
.meta({ rte: rte.reCloud })
.after(async() => {
diff --git a/tests/e2e/tests/web/smoke/database/edit-db.e2e.ts b/tests/e2e/tests/web/smoke/database/edit-db.e2e.ts
index ac37c19698..8014159832 100644
--- a/tests/e2e/tests/web/smoke/database/edit-db.e2e.ts
+++ b/tests/e2e/tests/web/smoke/database/edit-db.e2e.ts
@@ -3,8 +3,7 @@ import { DatabaseHelper } from '../../../../helpers/database';
import { MyRedisDatabasePage } from '../../../../pageObjects';
import {
commonUrl,
- ossStandaloneConfig,
- redisEnterpriseClusterConfig
+ ossStandaloneConfig
} from '../../../../helpers/conf';
import { rte } from '../../../../helpers/constants';
import { UserAgreementDialog } from '../../../../pageObjects/dialogs';
@@ -21,16 +20,6 @@ fixture `Edit Databases`
});
// Returns the URL of the current web page
const getPageUrl = ClientFunction(() => window.location.href);
-test
- .meta({ rte: rte.reCluster })
- .after(async() => {
- // Delete database
- await databaseHelper.deleteDatabase(redisEnterpriseClusterConfig.databaseName);
- })('Verify that user can connect to the RE cluster database', async t => {
- await databaseHelper.addNewREClusterDatabase(redisEnterpriseClusterConfig);
- await myRedisDatabasePage.clickOnDBByName(redisEnterpriseClusterConfig.databaseName);
- await t.expect(getPageUrl()).contains('browser', 'The edit view is not opened');
- });
test
.meta({ rte: rte.standalone })
.after(async() => {
diff --git a/tests/e2e/yarn.lock b/tests/e2e/yarn.lock
index fd6df09eb4..4a43791082 100644
--- a/tests/e2e/yarn.lock
+++ b/tests/e2e/yarn.lock
@@ -30,38 +30,51 @@
"@babel/highlight" "^7.22.13"
chalk "^2.4.2"
-"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9", "@babel/compat-data@^7.23.2":
+"@babel/code-frame@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244"
+ integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==
+ dependencies:
+ "@babel/highlight" "^7.23.4"
+ chalk "^2.4.2"
+
+"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.22.9":
version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.2.tgz#6a12ced93455827037bfb5ed8492820d60fc32cc"
integrity sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==
-"@babel/core@^7.12.1":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.2.tgz#ed10df0d580fff67c5f3ee70fd22e2e4c90a9f94"
- integrity sha512-n7s51eWdaWZ3vGT2tD4T7J6eJs3QoBXydv7vkUM06Bf1cbVD2Kc2UrkzhiQwobfV7NwOnQXYL7UBJ5VPU+RGoQ==
+"@babel/compat-data@^7.23.3", "@babel/compat-data@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98"
+ integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==
+
+"@babel/core@^7.23.2":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f"
+ integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw==
dependencies:
"@ampproject/remapping" "^2.2.0"
- "@babel/code-frame" "^7.22.13"
- "@babel/generator" "^7.23.0"
- "@babel/helper-compilation-targets" "^7.22.15"
- "@babel/helper-module-transforms" "^7.23.0"
- "@babel/helpers" "^7.23.2"
- "@babel/parser" "^7.23.0"
+ "@babel/code-frame" "^7.23.5"
+ "@babel/generator" "^7.23.6"
+ "@babel/helper-compilation-targets" "^7.23.6"
+ "@babel/helper-module-transforms" "^7.23.3"
+ "@babel/helpers" "^7.23.7"
+ "@babel/parser" "^7.23.6"
"@babel/template" "^7.22.15"
- "@babel/traverse" "^7.23.2"
- "@babel/types" "^7.23.0"
+ "@babel/traverse" "^7.23.7"
+ "@babel/types" "^7.23.6"
convert-source-map "^2.0.0"
debug "^4.1.0"
gensync "^1.0.0-beta.2"
json5 "^2.2.3"
semver "^6.3.1"
-"@babel/generator@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.0.tgz#df5c386e2218be505b34837acbcb874d7a983420"
- integrity sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==
+"@babel/generator@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.23.6.tgz#9e1fca4811c77a10580d17d26b57b036133f3c2e"
+ integrity sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==
dependencies:
- "@babel/types" "^7.23.0"
+ "@babel/types" "^7.23.6"
"@jridgewell/gen-mapping" "^0.3.2"
"@jridgewell/trace-mapping" "^0.3.17"
jsesc "^2.5.1"
@@ -73,14 +86,14 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5":
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.22.15", "@babel/helper-builder-binary-assignment-operator-visitor@^7.22.5":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz#5426b109cf3ad47b91120f8328d8ab1be8b0b956"
integrity sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==
dependencies:
"@babel/types" "^7.22.15"
-"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.5", "@babel/helper-compilation-targets@^7.22.6":
+"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.15", "@babel/helper-compilation-targets@^7.22.6":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.22.15.tgz#0698fc44551a26cf29f18d4662d5bf545a6cfc52"
integrity sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==
@@ -91,7 +104,18 @@
lru-cache "^5.1.1"
semver "^6.3.1"
-"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.11", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.22.5":
+"@babel/helper-compilation-targets@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz#4d79069b16cbcf1461289eccfbbd81501ae39991"
+ integrity sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==
+ dependencies:
+ "@babel/compat-data" "^7.23.5"
+ "@babel/helper-validator-option" "^7.23.5"
+ browserslist "^4.22.2"
+ lru-cache "^5.1.1"
+ semver "^6.3.1"
+
+"@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.22.15.tgz#97a61b385e57fe458496fad19f8e63b63c867de4"
integrity sha512-jKkwA59IXcvSaiK2UN45kKwSC9o+KuoXsBDvHvU/7BecYIp8GQ2UwrVvFgJASUT+hBnwJx6MhvMCuMzwZZ7jlg==
@@ -106,7 +130,22 @@
"@babel/helper-split-export-declaration" "^7.22.6"
semver "^6.3.1"
-"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.5":
+"@babel/helper-create-class-features-plugin@^7.23.7":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.7.tgz#b2e6826e0e20d337143655198b79d58fdc9bd43d"
+ integrity sha512-xCoqR/8+BoNnXOY7RVSgv6X+o7pmT5q1d+gGcRlXYkI+9B31glE4jeejhKVpA04O1AtzOt7OSQ6VYKP5FcRl9g==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.22.5"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-member-expression-to-functions" "^7.23.0"
+ "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.20"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
+ "@babel/helper-split-export-declaration" "^7.22.6"
+ semver "^6.3.1"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.22.15", "@babel/helper-create-regexp-features-plugin@^7.22.5":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz#5ee90093914ea09639b01c711db0d6775e558be1"
integrity sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==
@@ -126,6 +165,17 @@
lodash.debounce "^4.0.8"
resolve "^1.14.2"
+"@babel/helper-define-polyfill-provider@^0.4.4":
+ version "0.4.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088"
+ integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.6"
+ "@babel/helper-plugin-utils" "^7.22.5"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+
"@babel/helper-environment-visitor@^7.18.9", "@babel/helper-environment-visitor@^7.22.20", "@babel/helper-environment-visitor@^7.22.5":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167"
@@ -146,7 +196,7 @@
dependencies:
"@babel/types" "^7.22.5"
-"@babel/helper-member-expression-to-functions@^7.22.15":
+"@babel/helper-member-expression-to-functions@^7.22.15", "@babel/helper-member-expression-to-functions@^7.23.0":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz#9263e88cc5e41d39ec18c9a3e0eced59a3e7d366"
integrity sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==
@@ -160,10 +210,10 @@
dependencies:
"@babel/types" "^7.22.15"
-"@babel/helper-module-transforms@^7.22.5", "@babel/helper-module-transforms@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.0.tgz#3ec246457f6c842c0aee62a01f60739906f7047e"
- integrity sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==
+"@babel/helper-module-transforms@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz#d7d12c3c5d30af5b3c0fcab2a6d5217773e2d0f1"
+ integrity sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==
dependencies:
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-module-imports" "^7.22.15"
@@ -192,7 +242,7 @@
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-wrap-function" "^7.22.20"
-"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.5", "@babel/helper-replace-supers@^7.22.9":
+"@babel/helper-replace-supers@^7.22.20", "@babel/helper-replace-supers@^7.22.9":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz#e37d367123ca98fe455a9887734ed2e16eb7a793"
integrity sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==
@@ -227,6 +277,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz#533f36457a25814cf1df6488523ad547d784a99f"
integrity sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==
+"@babel/helper-string-parser@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz#9478c707febcbbe1ddb38a3d91a2e054ae622d83"
+ integrity sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==
+
"@babel/helper-validator-identifier@^7.18.6":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz#7eea834cf32901ffdc1a7ee555e2f9c27e249ca2"
@@ -242,6 +297,11 @@
resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.22.15.tgz#694c30dfa1d09a6534cdfcafbe56789d36aba040"
integrity sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==
+"@babel/helper-validator-option@^7.23.5":
+ version "7.23.5"
+ resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz#907a3fbd4523426285365d1206c423c4c5520307"
+ integrity sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==
+
"@babel/helper-wrap-function@^7.22.20":
version "7.22.20"
resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz#15352b0b9bfb10fc9c76f79f6342c00e3411a569"
@@ -251,14 +311,14 @@
"@babel/template" "^7.22.15"
"@babel/types" "^7.22.19"
-"@babel/helpers@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.2.tgz#2832549a6e37d484286e15ba36a5330483cac767"
- integrity sha512-lzchcp8SjTSVe/fPmLwtWVBFC7+Tbn8LGHDVfDp9JGxpAY5opSaEFgt8UQvrnECWOTdji2mOWMz1rOhkHscmGQ==
+"@babel/helpers@^7.23.7":
+ version "7.23.8"
+ resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.23.8.tgz#fc6b2d65b16847fd50adddbd4232c76378959e34"
+ integrity sha512-KDqYz4PiOWvDFrdHLPhKtCThtIcKVy6avWD2oG4GEvyQ+XDZwHD4YQd+H2vNMnq2rkdxsDkU82T+Vk8U/WXHRQ==
dependencies:
"@babel/template" "^7.22.15"
- "@babel/traverse" "^7.23.2"
- "@babel/types" "^7.23.0"
+ "@babel/traverse" "^7.23.7"
+ "@babel/types" "^7.23.6"
"@babel/highlight@^7.10.4":
version "7.18.6"
@@ -278,28 +338,50 @@
chalk "^2.4.2"
js-tokens "^4.0.0"
-"@babel/parser@^7.22.15", "@babel/parser@^7.23.0":
+"@babel/highlight@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.23.4.tgz#edaadf4d8232e1a961432db785091207ead0621b"
+ integrity sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.22.20"
+ chalk "^2.4.2"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.22.15":
version "7.23.0"
resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.0.tgz#da950e622420bf96ca0d0f2909cdddac3acd8719"
integrity sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==
-"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.22.15.tgz#02dc8a03f613ed5fdc29fb2f728397c78146c962"
- integrity sha512-FB9iYlz7rURmRJyXRKEnalYPPdn87H5no108cyuQQyMwlpJ2SJtpIUBI27kdTin956pz+LPypkPVPUTlxOmrsg==
+"@babel/parser@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b"
+ integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a"
+ integrity sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.22.15.tgz#2aeb91d337d4e1a1e7ce85b76a37f5301781200f"
- integrity sha512-Hyph9LseGvAeeXzikV88bczhsrLrIZqDPxO+sSmAunMPaGrBGhfMWzCPYTtiW9t+HzSE2wtV8e5cc5P6r1xMDQ==
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz#f6652bb16b94f8f9c20c50941e16e9756898dc5d"
+ integrity sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
- "@babel/plugin-transform-optional-chaining" "^7.22.15"
+ "@babel/plugin-transform-optional-chaining" "^7.23.3"
-"@babel/plugin-proposal-async-generator-functions@^7.12.1":
+"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b"
+ integrity sha512-LlRT7HgaifEpQA1ZgLVOIJZZFVPWN5iReq/7/JixwBtwcoeVGDBD53ZV28rrsLYOZs1Y/EHhA8N/Z6aazHR8cw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-proposal-async-generator-functions@^7.20.7":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz#bfb7276d2d573cb67ba379984a2334e262ba5326"
integrity sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==
@@ -309,7 +391,7 @@
"@babel/helper-remap-async-to-generator" "^7.18.9"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-proposal-class-properties@^7.12.1":
+"@babel/plugin-proposal-class-properties@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz#b110f59741895f7ec21a6fff696ec46265c446a3"
integrity sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==
@@ -317,18 +399,16 @@
"@babel/helper-create-class-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-proposal-decorators@^7.12.1":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.2.tgz#0b345a5754f48309fa50b7cd99075ef0295b12c8"
- integrity sha512-eR0gJQc830fJVGz37oKLvt9W9uUIQSAovUl0e9sJ3YeO09dlcoBVYD3CLrjCj4qHdXmfiyTyFt8yeQYSN5fxLg==
+"@babel/plugin-proposal-decorators@^7.23.2":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.23.7.tgz#1d827902cbd3d9054e54fb2f2056cdd1eaa0e368"
+ integrity sha512-b1s5JyeMvqj7d9m9KhJNHKc18gEJiSyVzVX3bwbiPalQBQpuvfPh6lA9F7Kk/dWH0TIiXRpB9yicwijY6buPng==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.15"
+ "@babel/helper-create-class-features-plugin" "^7.23.7"
"@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.20"
- "@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/plugin-syntax-decorators" "^7.22.10"
+ "@babel/plugin-syntax-decorators" "^7.23.3"
-"@babel/plugin-proposal-object-rest-spread@^7.12.1":
+"@babel/plugin-proposal-object-rest-spread@^7.20.7":
version "7.20.7"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a"
integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==
@@ -339,7 +419,7 @@
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
"@babel/plugin-transform-parameters" "^7.20.7"
-"@babel/plugin-proposal-private-methods@^7.14.5":
+"@babel/plugin-proposal-private-methods@^7.18.6":
version "7.18.6"
resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz#5209de7d213457548a98436fa2882f52f4be6bea"
integrity sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==
@@ -373,10 +453,10 @@
dependencies:
"@babel/helper-plugin-utils" "^7.14.5"
-"@babel/plugin-syntax-decorators@^7.22.10":
- version "7.22.10"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.22.10.tgz#7d83ea04d893c442b78ebf4c3cbac59a7211deff"
- integrity sha512-z1KTVemBjnz+kSEilAsI4lbkPOl5TvJH7YDSY1CTIzvLWJ+KHXp+mRe8VPmfnyvqOPqar1V2gid2PleKzRUstQ==
+"@babel/plugin-syntax-decorators@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz#a1d351d6c25bfdcf2e16f99b039101bc0ffcb0ca"
+ integrity sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
@@ -394,24 +474,24 @@
dependencies:
"@babel/helper-plugin-utils" "^7.8.3"
-"@babel/plugin-syntax-flow@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.22.5.tgz#163b820b9e7696ce134df3ee716d9c0c98035859"
- integrity sha512-9RdCl0i+q0QExayk2nOS7853w08yLucnnPML6EN9S8fgMPVtdLDCdx/cOQ/i44Lb9UeQX9A35yaqBBOMMZxPxQ==
+"@babel/plugin-syntax-flow@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz#084564e0f3cc21ea6c70c44cff984a1c0509729a"
+ integrity sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-syntax-import-assertions@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.22.5.tgz#07d252e2aa0bc6125567f742cd58619cb14dce98"
- integrity sha512-rdV97N7KqsRzeNGoWUOK6yUsWarLjE5Su/Snk9IYPU9CwkWHs4t+rTGOvffTR8XGkJMTAdLfO0xVnXm8wugIJg==
+"@babel/plugin-syntax-import-assertions@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz#9c05a7f592982aff1a2768260ad84bcd3f0c77fc"
+ integrity sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-syntax-import-attributes@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.22.5.tgz#ab840248d834410b829f569f5262b9e517555ecb"
- integrity sha512-KwvoWDeNKPETmozyFE0P2rOLqh39EoQHNjqizrI5B8Vt0ZNS7M56s7dAiAqbYfiAYOuIzIh96z3iR2ktgu3tEg==
+"@babel/plugin-syntax-import-attributes@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz#992aee922cf04512461d7dae3ff6951b90a2dc06"
+ integrity sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
@@ -500,24 +580,24 @@
"@babel/helper-create-regexp-features-plugin" "^7.18.6"
"@babel/helper-plugin-utils" "^7.18.6"
-"@babel/plugin-transform-arrow-functions@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.22.5.tgz#e5ba566d0c58a5b2ba2a8b795450641950b71958"
- integrity sha512-26lTNXoVRdAnsaDXPpvCNUq+OVWEVC6bx7Vvz9rC53F2bagUWW4u4ii2+h8Fejfh7RYqPxn+libeFBBck9muEw==
+"@babel/plugin-transform-arrow-functions@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz#94c6dcfd731af90f27a79509f9ab7fb2120fc38b"
+ integrity sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-async-generator-functions@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.2.tgz#054afe290d64c6f576f371ccc321772c8ea87ebb"
- integrity sha512-BBYVGxbDVHfoeXbOwcagAkOQAm9NxoTdMGfTqghu1GrvadSaw6iW3Je6IcL5PNOw8VwjxqBECXy50/iCQSY/lQ==
+"@babel/plugin-transform-async-generator-functions@^7.23.7":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd"
+ integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA==
dependencies:
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-remap-async-to-generator" "^7.22.20"
"@babel/plugin-syntax-async-generators" "^7.8.4"
-"@babel/plugin-transform-async-to-generator@^7.12.1", "@babel/plugin-transform-async-to-generator@^7.22.5":
+"@babel/plugin-transform-async-to-generator@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.22.5.tgz#c7a85f44e46f8952f6d27fe57c2ed3cc084c3775"
integrity sha512-b1A8D8ZzE/VhNDoV1MSJTnpKkCG5bJo+19R4o4oy03zM7ws8yEMK755j61Dc3EyvdysbqH5BOOTquJ7ZX9C6vQ==
@@ -526,91 +606,99 @@
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-remap-async-to-generator" "^7.22.5"
-"@babel/plugin-transform-block-scoped-functions@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.22.5.tgz#27978075bfaeb9fa586d3cb63a3d30c1de580024"
- integrity sha512-tdXZ2UdknEKQWKJP1KMNmuF5Lx3MymtMN/pvA+p/VEkhK8jVcQ1fzSy8KM9qRYhAf2/lV33hoMPKI/xaI9sADA==
+"@babel/plugin-transform-async-to-generator@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz#d1f513c7a8a506d43f47df2bf25f9254b0b051fa"
+ integrity sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==
dependencies:
+ "@babel/helper-module-imports" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-remap-async-to-generator" "^7.22.20"
-"@babel/plugin-transform-block-scoping@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.0.tgz#8744d02c6c264d82e1a4bc5d2d501fd8aff6f022"
- integrity sha512-cOsrbmIOXmf+5YbL99/S49Y3j46k/T16b9ml8bm9lP6N9US5iQ2yBK7gpui1pg0V/WMcXdkfKbTb7HXq9u+v4g==
+"@babel/plugin-transform-block-scoped-functions@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz#fe1177d715fb569663095e04f3598525d98e8c77"
+ integrity sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-class-properties@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.22.5.tgz#97a56e31ad8c9dc06a0b3710ce7803d5a48cca77"
- integrity sha512-nDkQ0NfkOhPTq8YCLiWNxp1+f9fCobEjCb0n8WdbNUBc4IB5V7P1QnX9IjpSoquKrXF5SKojHleVNs2vGeHCHQ==
+"@babel/plugin-transform-block-scoping@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz#b2d38589531c6c80fbe25e6b58e763622d2d3cf5"
+ integrity sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-class-static-block@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.22.11.tgz#dc8cc6e498f55692ac6b4b89e56d87cec766c974"
- integrity sha512-GMM8gGmqI7guS/llMFk1bJDkKfn3v3C4KHK9Yg1ey5qcHcOlKb0QvcMrgzvxo+T03/4szNh5lghY+fEC98Kq9g==
+"@babel/plugin-transform-class-properties@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz#35c377db11ca92a785a718b6aa4e3ed1eb65dc48"
+ integrity sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-create-class-features-plugin" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-class-static-block@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz#2a202c8787a8964dd11dfcedf994d36bfc844ab5"
+ integrity sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
-"@babel/plugin-transform-classes@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.22.15.tgz#aaf4753aee262a232bbc95451b4bdf9599c65a0b"
- integrity sha512-VbbC3PGjBdE0wAWDdHM9G8Gm977pnYI0XpqMd6LrKISj8/DJXEsWqgRuTYaNE9Bv0JGhTZUzHDlMk18IpOuoqw==
+"@babel/plugin-transform-classes@^7.23.8":
+ version "7.23.8"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92"
+ integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-compilation-targets" "^7.22.15"
- "@babel/helper-environment-visitor" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
- "@babel/helper-optimise-call-expression" "^7.22.5"
+ "@babel/helper-compilation-targets" "^7.23.6"
+ "@babel/helper-environment-visitor" "^7.22.20"
+ "@babel/helper-function-name" "^7.23.0"
"@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.9"
+ "@babel/helper-replace-supers" "^7.22.20"
"@babel/helper-split-export-declaration" "^7.22.6"
globals "^11.1.0"
-"@babel/plugin-transform-computed-properties@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.22.5.tgz#cd1e994bf9f316bd1c2dafcd02063ec261bb3869"
- integrity sha512-4GHWBgRf0krxPX+AaPtgBAlTgTeZmqDynokHOX7aqqAB4tHs3U2Y02zH6ETFdLZGcg9UQSD1WCmkVrE9ErHeOg==
+"@babel/plugin-transform-computed-properties@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474"
+ integrity sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
- "@babel/template" "^7.22.5"
+ "@babel/template" "^7.22.15"
-"@babel/plugin-transform-destructuring@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.0.tgz#6447aa686be48b32eaf65a73e0e2c0bd010a266c"
- integrity sha512-vaMdgNXFkYrB+8lbgniSYWHsgqK5gjaMNcc84bMIOMRLH0L9AqYq3hwMdvnyqj1OPqea8UtjPEuS/DCenah1wg==
+"@babel/plugin-transform-destructuring@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz#8c9ee68228b12ae3dff986e56ed1ba4f3c446311"
+ integrity sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-dotall-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.22.5.tgz#dbb4f0e45766eb544e193fb00e65a1dd3b2a4165"
- integrity sha512-5/Yk9QxCQCl+sOIB1WelKnVRxTJDSAIxtJLL2/pqL14ZVlbH0fUQUZa/T5/UnQtBNgghR7mfB8ERBKyKPCi7Vw==
+"@babel/plugin-transform-dotall-regex@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz#3f7af6054882ede89c378d0cf889b854a993da50"
+ integrity sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-duplicate-keys@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.22.5.tgz#b6e6428d9416f5f0bba19c70d1e6e7e0b88ab285"
- integrity sha512-dEnYD+9BBgld5VBXHnF/DbYGp3fqGMsyxKbtD1mDyIA7AkTSpKXFhCVuj/oQVOoALfBs77DudA0BE4d5mcpmqw==
+"@babel/plugin-transform-duplicate-keys@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz#664706ca0a5dfe8d066537f99032fc1dc8b720ce"
+ integrity sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-dynamic-import@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.22.11.tgz#2c7722d2a5c01839eaf31518c6ff96d408e447aa"
- integrity sha512-g/21plo58sfteWjaO0ZNVb+uEOkJNjAaHhbejrnBmu011l/eNDScmkbjCC3l4FKb10ViaGU4aOkFznSu2zRHgA==
+"@babel/plugin-transform-dynamic-import@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz#c7629e7254011ac3630d47d7f34ddd40ca535143"
+ integrity sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
-"@babel/plugin-transform-exponentiation-operator@^7.12.1", "@babel/plugin-transform-exponentiation-operator@^7.22.5":
+"@babel/plugin-transform-exponentiation-operator@^7.22.5":
version "7.22.5"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.22.5.tgz#402432ad544a1f9a480da865fda26be653e48f6a"
integrity sha512-vIpJFNM/FjZ4rh1myqIya9jXwrwwgFRHPjT3DkUA9ZLHuzox8jiXkOLvwm1H+PQIP3CqfC++WPKeuDi0Sjdj1g==
@@ -618,101 +706,117 @@
"@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-export-namespace-from@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.22.11.tgz#b3c84c8f19880b6c7440108f8929caf6056db26c"
- integrity sha512-xa7aad7q7OiT8oNZ1mU7NrISjlSkVdMbNxn9IuLZyL9AJEhs1Apba3I+u5riX1dIkdptP5EKDG5XDPByWxtehw==
+"@babel/plugin-transform-exponentiation-operator@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz#ea0d978f6b9232ba4722f3dbecdd18f450babd18"
+ integrity sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-export-namespace-from@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz#084c7b25e9a5c8271e987a08cf85807b80283191"
+ integrity sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
-"@babel/plugin-transform-flow-strip-types@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.22.5.tgz#0bb17110c7bf5b35a60754b2f00c58302381dee2"
- integrity sha512-tujNbZdxdG0/54g/oua8ISToaXTFBf8EnSb5PgQSciIXWOWKX3S4+JR7ZE9ol8FZwf9kxitzkGQ+QWeov/mCiA==
+"@babel/plugin-transform-flow-strip-types@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz#cfa7ca159cc3306fab526fc67091556b51af26ff"
+ integrity sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
- "@babel/plugin-syntax-flow" "^7.22.5"
+ "@babel/plugin-syntax-flow" "^7.23.3"
-"@babel/plugin-transform-for-of@^7.12.1", "@babel/plugin-transform-for-of@^7.22.15":
+"@babel/plugin-transform-for-of@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.22.15.tgz#f64b4ccc3a4f131a996388fae7680b472b306b29"
integrity sha512-me6VGeHsx30+xh9fbDLLPi0J1HzmeIIyenoOQHuw2D4m2SAU3NrspX5XxJLBpqn5yrLzrlw2Iy3RA//Bx27iOA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-function-name@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.22.5.tgz#935189af68b01898e0d6d99658db6b164205c143"
- integrity sha512-UIzQNMS0p0HHiQm3oelztj+ECwFnj+ZRV4KnguvlsD2of1whUeM6o7wGNj6oLwcDoAXQ8gEqfgC24D+VdIcevg==
+"@babel/plugin-transform-for-of@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz#81c37e24171b37b370ba6aaffa7ac86bcb46f94e"
+ integrity sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==
dependencies:
- "@babel/helper-compilation-targets" "^7.22.5"
- "@babel/helper-function-name" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-json-strings@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.22.11.tgz#689a34e1eed1928a40954e37f74509f48af67835"
- integrity sha512-CxT5tCqpA9/jXFlme9xIBCc5RPtdDq3JpkkhgHQqtDdiTnTI0jtZ0QzXhr5DILeYifDPp2wvY2ad+7+hLMW5Pw==
+"@babel/plugin-transform-function-name@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz#8f424fcd862bf84cb9a1a6b42bc2f47ed630f8dc"
+ integrity sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/helper-function-name" "^7.23.0"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-json-strings@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz#a871d9b6bd171976efad2e43e694c961ffa3714d"
+ integrity sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-json-strings" "^7.8.3"
-"@babel/plugin-transform-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.22.5.tgz#e9341f4b5a167952576e23db8d435849b1dd7920"
- integrity sha512-fTLj4D79M+mepcw3dgFBTIDYpbcB9Sm0bpm4ppXPaO+U+PKFFyV9MGRvS0gvGw62sd10kT5lRMKXAADb9pWy8g==
+"@babel/plugin-transform-literals@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz#8214665f00506ead73de157eba233e7381f3beb4"
+ integrity sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-logical-assignment-operators@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.22.11.tgz#24c522a61688bde045b7d9bc3c2597a4d948fc9c"
- integrity sha512-qQwRTP4+6xFCDV5k7gZBF3C31K34ut0tbEcTKxlX/0KXxm9GLcO14p570aWxFvVzx6QAfPgq7gaeIHXJC8LswQ==
+"@babel/plugin-transform-logical-assignment-operators@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz#e599f82c51d55fac725f62ce55d3a0886279ecb5"
+ integrity sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
-"@babel/plugin-transform-member-expression-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.22.5.tgz#4fcc9050eded981a468347dd374539ed3e058def"
- integrity sha512-RZEdkNtzzYCFl9SE9ATaUMTj2hqMb4StarOJLrZRbqqU4HSBE7UlBw9WBWQiDzrJZJdUWiMTVDI6Gv/8DPvfew==
+"@babel/plugin-transform-member-expression-literals@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz#e37b3f0502289f477ac0e776b05a833d853cabcc"
+ integrity sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-modules-amd@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.0.tgz#05b2bc43373faa6d30ca89214731f76f966f3b88"
- integrity sha512-xWT5gefv2HGSm4QHtgc1sYPbseOyf+FFDo2JbpE25GWl5BqTGO9IMwTYJRoIdjsF85GE+VegHxSCUt5EvoYTAw==
+"@babel/plugin-transform-modules-amd@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz#e19b55436a1416829df0a1afc495deedfae17f7d"
+ integrity sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==
dependencies:
- "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-modules-commonjs@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.0.tgz#b3dba4757133b2762c00f4f94590cf6d52602481"
- integrity sha512-32Xzss14/UVc7k9g775yMIvkVK8xwKE0DPdP5JTapr3+Z9w4tzeOuLNY6BXDQR6BdnzIlXnCGAzsk/ICHBLVWQ==
+"@babel/plugin-transform-modules-commonjs@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz#661ae831b9577e52be57dd8356b734f9700b53b4"
+ integrity sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==
dependencies:
- "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-simple-access" "^7.22.5"
-"@babel/plugin-transform-modules-systemjs@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.0.tgz#77591e126f3ff4132a40595a6cccd00a6b60d160"
- integrity sha512-qBej6ctXZD2f+DhlOC9yO47yEYgUh5CZNz/aBoH4j/3NOlRfJXJbY7xDQCqQVf9KbrqGzIWER1f23doHGrIHFg==
+"@babel/plugin-transform-modules-systemjs@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81"
+ integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==
dependencies:
"@babel/helper-hoist-variables" "^7.22.5"
- "@babel/helper-module-transforms" "^7.23.0"
+ "@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-validator-identifier" "^7.22.20"
-"@babel/plugin-transform-modules-umd@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.22.5.tgz#4694ae40a87b1745e3775b6a7fe96400315d4f98"
- integrity sha512-+S6kzefN/E1vkSsKx8kmQuqeQsvCKCd1fraCM7zXm4SFoggI099Tr4G8U81+5gtMdUeMQ4ipdQffbKLX0/7dBQ==
+"@babel/plugin-transform-modules-umd@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9"
+ integrity sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==
dependencies:
- "@babel/helper-module-transforms" "^7.22.5"
+ "@babel/helper-module-transforms" "^7.23.3"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-transform-named-capturing-groups-regex@^7.22.5":
@@ -723,101 +827,108 @@
"@babel/helper-create-regexp-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-new-target@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.22.5.tgz#1b248acea54ce44ea06dfd37247ba089fcf9758d"
- integrity sha512-AsF7K0Fx/cNKVyk3a+DW0JLo+Ua598/NxMRvxDnkpCIGFh43+h/v2xyhRUYf6oD8gE4QtL83C7zZVghMjHd+iw==
+"@babel/plugin-transform-new-target@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz#5491bb78ed6ac87e990957cea367eab781c4d980"
+ integrity sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-nullish-coalescing-operator@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.22.11.tgz#debef6c8ba795f5ac67cd861a81b744c5d38d9fc"
- integrity sha512-YZWOw4HxXrotb5xsjMJUDlLgcDXSfO9eCmdl1bgW4+/lAGdkjaEvOnQ4p5WKKdUgSzO39dgPl0pTnfxm0OAXcg==
+"@babel/plugin-transform-nullish-coalescing-operator@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz#45556aad123fc6e52189ea749e33ce090637346e"
+ integrity sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
-"@babel/plugin-transform-numeric-separator@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.22.11.tgz#498d77dc45a6c6db74bb829c02a01c1d719cbfbd"
- integrity sha512-3dzU4QGPsILdJbASKhF/V2TVP+gJya1PsueQCxIPCEcerqF21oEcrob4mzjsp2Py/1nLfF5m+xYNMDpmA8vffg==
+"@babel/plugin-transform-numeric-separator@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz#03d08e3691e405804ecdd19dd278a40cca531f29"
+ integrity sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-numeric-separator" "^7.10.4"
-"@babel/plugin-transform-object-rest-spread@^7.22.15":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.22.15.tgz#21a95db166be59b91cde48775310c0df6e1da56f"
- integrity sha512-fEB+I1+gAmfAyxZcX1+ZUwLeAuuf8VIg67CTznZE0MqVFumWkh8xWtn58I4dxdVf080wn7gzWoF8vndOViJe9Q==
+"@babel/plugin-transform-object-rest-spread@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz#2b9c2d26bf62710460bdc0d1730d4f1048361b83"
+ integrity sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==
dependencies:
- "@babel/compat-data" "^7.22.9"
+ "@babel/compat-data" "^7.23.3"
"@babel/helper-compilation-targets" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-object-rest-spread" "^7.8.3"
- "@babel/plugin-transform-parameters" "^7.22.15"
+ "@babel/plugin-transform-parameters" "^7.23.3"
-"@babel/plugin-transform-object-super@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.22.5.tgz#794a8d2fcb5d0835af722173c1a9d704f44e218c"
- integrity sha512-klXqyaT9trSjIUrcsYIfETAzmOEZL3cBYqOYLJxBHfMFFggmXOv+NYSX/Jbs9mzMVESw/WycLFPRx8ba/b2Ipw==
+"@babel/plugin-transform-object-super@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz#81fdb636dcb306dd2e4e8fd80db5b2362ed2ebcd"
+ integrity sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-replace-supers" "^7.22.5"
+ "@babel/helper-replace-supers" "^7.22.20"
-"@babel/plugin-transform-optional-catch-binding@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.22.11.tgz#461cc4f578a127bb055527b3e77404cad38c08e0"
- integrity sha512-rli0WxesXUeCJnMYhzAglEjLWVDF6ahb45HuprcmQuLidBJFWjNnOzssk2kuc6e33FlLaiZhG/kUIzUMWdBKaQ==
+"@babel/plugin-transform-optional-catch-binding@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz#318066de6dacce7d92fa244ae475aa8d91778017"
+ integrity sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
-"@babel/plugin-transform-optional-chaining@^7.22.15", "@babel/plugin-transform-optional-chaining@^7.23.0":
- version "7.23.0"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.0.tgz#73ff5fc1cf98f542f09f29c0631647d8ad0be158"
- integrity sha512-sBBGXbLJjxTzLBF5rFWaikMnOGOk/BmK6vVByIdEggZ7Vn6CvWXZyRkkLFK6WE0IF8jSliyOkUN6SScFgzCM0g==
+"@babel/plugin-transform-optional-chaining@^7.23.3", "@babel/plugin-transform-optional-chaining@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz#6acf61203bdfc4de9d4e52e64490aeb3e52bd017"
+ integrity sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
"@babel/plugin-syntax-optional-chaining" "^7.8.3"
-"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.22.15":
+"@babel/plugin-transform-parameters@^7.20.7":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.22.15.tgz#719ca82a01d177af358df64a514d64c2e3edb114"
integrity sha512-hjk7qKIqhyzhhUvRT683TYQOFa/4cQKwQy7ALvTpODswN40MljzNDa0YldevS6tGbxwaEKVn502JmY0dP7qEtQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-private-methods@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.22.5.tgz#21c8af791f76674420a147ae62e9935d790f8722"
- integrity sha512-PPjh4gyrQnGe97JTalgRGMuU4icsZFnWkzicB/fUtzlKUqvsWBKEpPPfr5a2JiyirZkHxnAqkQMO5Z5B2kK3fA==
+"@babel/plugin-transform-parameters@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz#83ef5d1baf4b1072fa6e54b2b0999a7b2527e2af"
+ integrity sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==
dependencies:
- "@babel/helper-create-class-features-plugin" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-private-property-in-object@^7.22.11":
- version "7.22.11"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.22.11.tgz#ad45c4fc440e9cb84c718ed0906d96cf40f9a4e1"
- integrity sha512-sSCbqZDBKHetvjSwpyWzhuHkmW5RummxJBVbYLkGkaiTOWGxml7SXt0iWa03bzxFIx7wOj3g/ILRd0RcJKBeSQ==
+"@babel/plugin-transform-private-methods@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz#b2d7a3c97e278bfe59137a978d53b2c2e038c0e4"
+ integrity sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.22.15"
+ "@babel/helper-plugin-utils" "^7.22.5"
+
+"@babel/plugin-transform-private-property-in-object@^7.23.4":
+ version "7.23.4"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz#3ec711d05d6608fd173d9b8de39872d8dbf68bf5"
+ integrity sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
- "@babel/helper-create-class-features-plugin" "^7.22.11"
+ "@babel/helper-create-class-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
-"@babel/plugin-transform-property-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.22.5.tgz#b5ddabd73a4f7f26cd0e20f5db48290b88732766"
- integrity sha512-TiOArgddK3mK/x1Qwf5hay2pxI6wCZnvQqrFSqbtg1GLl2JcNMitVH/YnqjP+M31pLUeTfzY1HAXFDnUBV30rQ==
+"@babel/plugin-transform-property-literals@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz#54518f14ac4755d22b92162e4a852d308a560875"
+ integrity sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-react-display-name@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.22.5.tgz#3c4326f9fce31c7968d6cb9debcaf32d9e279a2b"
- integrity sha512-PVk3WPYudRF5z4GKMEYUrLjPl38fJSKNaEOkFuoprioowGuWN6w2RKznuFNSlJx7pzzXXStPUnNSOEO0jL5EVw==
+"@babel/plugin-transform-react-display-name@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.23.3.tgz#70529f034dd1e561045ad3c8152a267f0d7b6200"
+ integrity sha512-GnvhtVfA2OAtzdX58FJxU19rhoGeQzyVndw3GgtdECQvQFXPEZIOVULHVZGAYmOgmqjXpVpfocAbSjh99V/Fqw==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
@@ -839,33 +950,33 @@
"@babel/plugin-syntax-jsx" "^7.22.5"
"@babel/types" "^7.22.15"
-"@babel/plugin-transform-react-pure-annotations@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.22.5.tgz#1f58363eef6626d6fa517b95ac66fe94685e32c0"
- integrity sha512-gP4k85wx09q+brArVinTXhWiyzLl9UpmGva0+mWyKxk6JZequ05x3eUcIUE+FyttPKJFRRVtAvQaJ6YF9h1ZpA==
+"@babel/plugin-transform-react-pure-annotations@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.23.3.tgz#fabedbdb8ee40edf5da96f3ecfc6958e3783b93c"
+ integrity sha512-qMFdSS+TUhB7Q/3HVPnEdYJDQIk57jkntAwSuz9xfSE4n+3I+vHYCli3HoHawN1Z3RfCz/y1zXA/JXjG6cVImQ==
dependencies:
"@babel/helper-annotate-as-pure" "^7.22.5"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-regenerator@^7.22.10":
- version "7.22.10"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.22.10.tgz#8ceef3bd7375c4db7652878b0241b2be5d0c3cca"
- integrity sha512-F28b1mDt8KcT5bUyJc/U9nwzw6cV+UmTeRlXYIl2TNqMMJif0Jeey9/RQ3C4NOd2zp0/TRsDns9ttj2L523rsw==
+"@babel/plugin-transform-regenerator@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz#141afd4a2057298602069fce7f2dc5173e6c561c"
+ integrity sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
regenerator-transform "^0.15.2"
-"@babel/plugin-transform-reserved-words@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.22.5.tgz#832cd35b81c287c4bcd09ce03e22199641f964fb"
- integrity sha512-DTtGKFRQUDm8svigJzZHzb/2xatPc6TzNvAIJ5GqOKDsGFYgAskjRulbR/vGsPKq3OPqtexnz327qYpP57RFyA==
+"@babel/plugin-transform-reserved-words@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz#4130dcee12bd3dd5705c587947eb715da12efac8"
+ integrity sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-runtime@^7.12.1":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.2.tgz#c956a3f8d1aa50816ff6c30c6288d66635c12990"
- integrity sha512-XOntj6icgzMS58jPVtQpiuF6ZFWxQiJavISGx5KGjRj+3gqZr8+N6Kx+N9BApWzgS+DOjIZfXXj0ZesenOWDyA==
+"@babel/plugin-transform-runtime@7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.3.tgz#0aa7485862b0b5cb0559c1a5ec08b4923743ee3b"
+ integrity sha512-XcQ3X58CKBdBnnZpPaQjgVMePsXtSZzHoku70q9tUAQp02ggPQNM04BF3RvlW1GSM/McbSOQAzEK4MXbS7/JFg==
dependencies:
"@babel/helper-module-imports" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
@@ -874,92 +985,93 @@
babel-plugin-polyfill-regenerator "^0.5.3"
semver "^6.3.1"
-"@babel/plugin-transform-shorthand-properties@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.22.5.tgz#6e277654be82b5559fc4b9f58088507c24f0c624"
- integrity sha512-vM4fq9IXHscXVKzDv5itkO1X52SmdFBFcMIBZ2FRn2nqVYqw6dBexUgMvAjHW+KXpPPViD/Yo3GrDEBaRC0QYA==
+"@babel/plugin-transform-shorthand-properties@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz#97d82a39b0e0c24f8a981568a8ed851745f59210"
+ integrity sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-spread@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.22.5.tgz#6487fd29f229c95e284ba6c98d65eafb893fea6b"
- integrity sha512-5ZzDQIGyvN4w8+dMmpohL6MBo+l2G7tfC/O2Dg7/hjpgeWvUx8FzfeOKxGog9IimPa4YekaQ9PlDqTLOljkcxg==
+"@babel/plugin-transform-spread@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz#41d17aacb12bde55168403c6f2d6bdca563d362c"
+ integrity sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-skip-transparent-expression-wrappers" "^7.22.5"
-"@babel/plugin-transform-sticky-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.22.5.tgz#295aba1595bfc8197abd02eae5fc288c0deb26aa"
- integrity sha512-zf7LuNpHG0iEeiyCNwX4j3gDg1jgt1k3ZdXBKbZSoA3BbGQGvMiSvfbZRR3Dr3aeJe3ooWFZxOOG3IRStYp2Bw==
+"@babel/plugin-transform-sticky-regex@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz#dec45588ab4a723cb579c609b294a3d1bd22ff04"
+ integrity sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-template-literals@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.22.5.tgz#8f38cf291e5f7a8e60e9f733193f0bcc10909bff"
- integrity sha512-5ciOehRNf+EyUeewo8NkbQiUs4d6ZxiHo6BcBcnFlgiJfu16q0bQUw9Jvo0b0gBKFG1SMhDSjeKXSYuJLeFSMA==
+"@babel/plugin-transform-template-literals@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz#5f0f028eb14e50b5d0f76be57f90045757539d07"
+ integrity sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-typeof-symbol@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.22.5.tgz#5e2ba478da4b603af8673ff7c54f75a97b716b34"
- integrity sha512-bYkI5lMzL4kPii4HHEEChkD0rkc+nvnlR6+o/qdqR6zrm0Sv/nodmyLhlq2DO0YKLUNd2VePmPRjJXSBh9OIdA==
+"@babel/plugin-transform-typeof-symbol@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz#9dfab97acc87495c0c449014eb9c547d8966bca4"
+ integrity sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-unicode-escapes@^7.22.10":
- version "7.22.10"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.22.10.tgz#c723f380f40a2b2f57a62df24c9005834c8616d9"
- integrity sha512-lRfaRKGZCBqDlRU3UIFovdp9c9mEvlylmpod0/OatICsSfuQ9YFthRo1tpTkGsklEefZdqlEFdY4A2dwTb6ohg==
+"@babel/plugin-transform-unicode-escapes@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz#1f66d16cab01fab98d784867d24f70c1ca65b925"
+ integrity sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-unicode-property-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.22.5.tgz#098898f74d5c1e86660dc112057b2d11227f1c81"
- integrity sha512-HCCIb+CbJIAE6sXn5CjFQXMwkCClcOfPCzTlilJ8cUatfzwHlWQkbtV0zD338u9dZskwvuOYTuuaMaA8J5EI5A==
+"@babel/plugin-transform-unicode-property-regex@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz#19e234129e5ffa7205010feec0d94c251083d7ad"
+ integrity sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-unicode-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.22.5.tgz#ce7e7bb3ef208c4ff67e02a22816656256d7a183"
- integrity sha512-028laaOKptN5vHJf9/Arr/HiJekMd41hOEZYvNsrsXqJ7YPYuX2bQxh31fkZzGmq3YqHRJzYFFAVYvKfMPKqyg==
+"@babel/plugin-transform-unicode-regex@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz#26897708d8f42654ca4ce1b73e96140fbad879dc"
+ integrity sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/plugin-transform-unicode-sets-regex@^7.22.5":
- version "7.22.5"
- resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.22.5.tgz#77788060e511b708ffc7d42fdfbc5b37c3004e91"
- integrity sha512-lhMfi4FC15j13eKrh3DnYHjpGj6UKQHtNKTbtc1igvAhRy4+kLhV07OpLcsN0VgDEw/MjAvJO4BdMJsHwMhzCg==
+"@babel/plugin-transform-unicode-sets-regex@^7.23.3":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz#4fb6f0a719c2c5859d11f6b55a050cc987f3799e"
+ integrity sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==
dependencies:
- "@babel/helper-create-regexp-features-plugin" "^7.22.5"
+ "@babel/helper-create-regexp-features-plugin" "^7.22.15"
"@babel/helper-plugin-utils" "^7.22.5"
-"@babel/preset-env@^7.12.1":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.2.tgz#1f22be0ff0e121113260337dbc3e58fafce8d059"
- integrity sha512-BW3gsuDD+rvHL2VO2SjAUNTBe5YrjsTiDyqamPDWY723na3/yPQ65X5oQkFVJZ0o50/2d+svm1rkPoJeR1KxVQ==
+"@babel/preset-env@^7.23.2":
+ version "7.23.8"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.23.8.tgz#7d6f8171ea7c221ecd28059e65ad37c20e441e3e"
+ integrity sha512-lFlpmkApLkEP6woIKprO6DO60RImpatTQKtz4sUcDjVcK8M8mQ4sZsuxaTMNOZf0sqAq/ReYW1ZBHnOQwKpLWA==
dependencies:
- "@babel/compat-data" "^7.23.2"
- "@babel/helper-compilation-targets" "^7.22.15"
+ "@babel/compat-data" "^7.23.5"
+ "@babel/helper-compilation-targets" "^7.23.6"
"@babel/helper-plugin-utils" "^7.22.5"
- "@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.22.15"
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.22.15"
+ "@babel/helper-validator-option" "^7.23.5"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3"
+ "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.7"
"@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2"
"@babel/plugin-syntax-async-generators" "^7.8.4"
"@babel/plugin-syntax-class-properties" "^7.12.13"
"@babel/plugin-syntax-class-static-block" "^7.14.5"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-export-namespace-from" "^7.8.3"
- "@babel/plugin-syntax-import-assertions" "^7.22.5"
- "@babel/plugin-syntax-import-attributes" "^7.22.5"
+ "@babel/plugin-syntax-import-assertions" "^7.23.3"
+ "@babel/plugin-syntax-import-attributes" "^7.23.3"
"@babel/plugin-syntax-import-meta" "^7.10.4"
"@babel/plugin-syntax-json-strings" "^7.8.3"
"@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
@@ -971,70 +1083,69 @@
"@babel/plugin-syntax-private-property-in-object" "^7.14.5"
"@babel/plugin-syntax-top-level-await" "^7.14.5"
"@babel/plugin-syntax-unicode-sets-regex" "^7.18.6"
- "@babel/plugin-transform-arrow-functions" "^7.22.5"
- "@babel/plugin-transform-async-generator-functions" "^7.23.2"
- "@babel/plugin-transform-async-to-generator" "^7.22.5"
- "@babel/plugin-transform-block-scoped-functions" "^7.22.5"
- "@babel/plugin-transform-block-scoping" "^7.23.0"
- "@babel/plugin-transform-class-properties" "^7.22.5"
- "@babel/plugin-transform-class-static-block" "^7.22.11"
- "@babel/plugin-transform-classes" "^7.22.15"
- "@babel/plugin-transform-computed-properties" "^7.22.5"
- "@babel/plugin-transform-destructuring" "^7.23.0"
- "@babel/plugin-transform-dotall-regex" "^7.22.5"
- "@babel/plugin-transform-duplicate-keys" "^7.22.5"
- "@babel/plugin-transform-dynamic-import" "^7.22.11"
- "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
- "@babel/plugin-transform-export-namespace-from" "^7.22.11"
- "@babel/plugin-transform-for-of" "^7.22.15"
- "@babel/plugin-transform-function-name" "^7.22.5"
- "@babel/plugin-transform-json-strings" "^7.22.11"
- "@babel/plugin-transform-literals" "^7.22.5"
- "@babel/plugin-transform-logical-assignment-operators" "^7.22.11"
- "@babel/plugin-transform-member-expression-literals" "^7.22.5"
- "@babel/plugin-transform-modules-amd" "^7.23.0"
- "@babel/plugin-transform-modules-commonjs" "^7.23.0"
- "@babel/plugin-transform-modules-systemjs" "^7.23.0"
- "@babel/plugin-transform-modules-umd" "^7.22.5"
+ "@babel/plugin-transform-arrow-functions" "^7.23.3"
+ "@babel/plugin-transform-async-generator-functions" "^7.23.7"
+ "@babel/plugin-transform-async-to-generator" "^7.23.3"
+ "@babel/plugin-transform-block-scoped-functions" "^7.23.3"
+ "@babel/plugin-transform-block-scoping" "^7.23.4"
+ "@babel/plugin-transform-class-properties" "^7.23.3"
+ "@babel/plugin-transform-class-static-block" "^7.23.4"
+ "@babel/plugin-transform-classes" "^7.23.8"
+ "@babel/plugin-transform-computed-properties" "^7.23.3"
+ "@babel/plugin-transform-destructuring" "^7.23.3"
+ "@babel/plugin-transform-dotall-regex" "^7.23.3"
+ "@babel/plugin-transform-duplicate-keys" "^7.23.3"
+ "@babel/plugin-transform-dynamic-import" "^7.23.4"
+ "@babel/plugin-transform-exponentiation-operator" "^7.23.3"
+ "@babel/plugin-transform-export-namespace-from" "^7.23.4"
+ "@babel/plugin-transform-for-of" "^7.23.6"
+ "@babel/plugin-transform-function-name" "^7.23.3"
+ "@babel/plugin-transform-json-strings" "^7.23.4"
+ "@babel/plugin-transform-literals" "^7.23.3"
+ "@babel/plugin-transform-logical-assignment-operators" "^7.23.4"
+ "@babel/plugin-transform-member-expression-literals" "^7.23.3"
+ "@babel/plugin-transform-modules-amd" "^7.23.3"
+ "@babel/plugin-transform-modules-commonjs" "^7.23.3"
+ "@babel/plugin-transform-modules-systemjs" "^7.23.3"
+ "@babel/plugin-transform-modules-umd" "^7.23.3"
"@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5"
- "@babel/plugin-transform-new-target" "^7.22.5"
- "@babel/plugin-transform-nullish-coalescing-operator" "^7.22.11"
- "@babel/plugin-transform-numeric-separator" "^7.22.11"
- "@babel/plugin-transform-object-rest-spread" "^7.22.15"
- "@babel/plugin-transform-object-super" "^7.22.5"
- "@babel/plugin-transform-optional-catch-binding" "^7.22.11"
- "@babel/plugin-transform-optional-chaining" "^7.23.0"
- "@babel/plugin-transform-parameters" "^7.22.15"
- "@babel/plugin-transform-private-methods" "^7.22.5"
- "@babel/plugin-transform-private-property-in-object" "^7.22.11"
- "@babel/plugin-transform-property-literals" "^7.22.5"
- "@babel/plugin-transform-regenerator" "^7.22.10"
- "@babel/plugin-transform-reserved-words" "^7.22.5"
- "@babel/plugin-transform-shorthand-properties" "^7.22.5"
- "@babel/plugin-transform-spread" "^7.22.5"
- "@babel/plugin-transform-sticky-regex" "^7.22.5"
- "@babel/plugin-transform-template-literals" "^7.22.5"
- "@babel/plugin-transform-typeof-symbol" "^7.22.5"
- "@babel/plugin-transform-unicode-escapes" "^7.22.10"
- "@babel/plugin-transform-unicode-property-regex" "^7.22.5"
- "@babel/plugin-transform-unicode-regex" "^7.22.5"
- "@babel/plugin-transform-unicode-sets-regex" "^7.22.5"
+ "@babel/plugin-transform-new-target" "^7.23.3"
+ "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4"
+ "@babel/plugin-transform-numeric-separator" "^7.23.4"
+ "@babel/plugin-transform-object-rest-spread" "^7.23.4"
+ "@babel/plugin-transform-object-super" "^7.23.3"
+ "@babel/plugin-transform-optional-catch-binding" "^7.23.4"
+ "@babel/plugin-transform-optional-chaining" "^7.23.4"
+ "@babel/plugin-transform-parameters" "^7.23.3"
+ "@babel/plugin-transform-private-methods" "^7.23.3"
+ "@babel/plugin-transform-private-property-in-object" "^7.23.4"
+ "@babel/plugin-transform-property-literals" "^7.23.3"
+ "@babel/plugin-transform-regenerator" "^7.23.3"
+ "@babel/plugin-transform-reserved-words" "^7.23.3"
+ "@babel/plugin-transform-shorthand-properties" "^7.23.3"
+ "@babel/plugin-transform-spread" "^7.23.3"
+ "@babel/plugin-transform-sticky-regex" "^7.23.3"
+ "@babel/plugin-transform-template-literals" "^7.23.3"
+ "@babel/plugin-transform-typeof-symbol" "^7.23.3"
+ "@babel/plugin-transform-unicode-escapes" "^7.23.3"
+ "@babel/plugin-transform-unicode-property-regex" "^7.23.3"
+ "@babel/plugin-transform-unicode-regex" "^7.23.3"
+ "@babel/plugin-transform-unicode-sets-regex" "^7.23.3"
"@babel/preset-modules" "0.1.6-no-external-plugins"
- "@babel/types" "^7.23.0"
- babel-plugin-polyfill-corejs2 "^0.4.6"
- babel-plugin-polyfill-corejs3 "^0.8.5"
- babel-plugin-polyfill-regenerator "^0.5.3"
+ babel-plugin-polyfill-corejs2 "^0.4.7"
+ babel-plugin-polyfill-corejs3 "^0.8.7"
+ babel-plugin-polyfill-regenerator "^0.5.4"
core-js-compat "^3.31.0"
semver "^6.3.1"
-"@babel/preset-flow@^7.12.1":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.22.15.tgz#30318deb9b3ebd9f5738e96da03a531e0cd3165d"
- integrity sha512-dB5aIMqpkgbTfN5vDdTRPzjqtWiZcRESNR88QYnoPR+bmdYoluOzMX9tQerTv0XzSgZYctPfO1oc0N5zdog1ew==
+"@babel/preset-flow@^7.22.15":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-flow/-/preset-flow-7.23.3.tgz#8084e08b9ccec287bd077ab288b286fab96ffab1"
+ integrity sha512-7yn6hl8RIv+KNk6iIrGZ+D06VhVY35wLVf23Cz/mMu1zOr7u4MMP4j0nZ9tLf8+4ZFpnib8cFYgB/oYg9hfswA==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-transform-flow-strip-types" "^7.22.5"
+ "@babel/plugin-transform-flow-strip-types" "^7.23.3"
"@babel/preset-modules@0.1.6-no-external-plugins":
version "0.1.6-no-external-plugins"
@@ -1045,31 +1156,38 @@
"@babel/types" "^7.4.4"
esutils "^2.0.2"
-"@babel/preset-react@^7.12.1":
- version "7.22.15"
- resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.22.15.tgz#9a776892b648e13cc8ca2edf5ed1264eea6b6afc"
- integrity sha512-Csy1IJ2uEh/PecCBXXoZGAZBeCATTuePzCSB7dLYWS0vOEj6CNpjxIhW4duWwZodBNueH7QO14WbGn8YyeuN9w==
+"@babel/preset-react@^7.22.15":
+ version "7.23.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-react/-/preset-react-7.23.3.tgz#f73ca07e7590f977db07eb54dbe46538cc015709"
+ integrity sha512-tbkHOS9axH6Ysf2OUEqoSZ6T3Fa2SrNH6WTWSPBboxKzdxNc9qOICeLXkNG0ZEwbQ1HY8liwOce4aN/Ceyuq6w==
dependencies:
"@babel/helper-plugin-utils" "^7.22.5"
"@babel/helper-validator-option" "^7.22.15"
- "@babel/plugin-transform-react-display-name" "^7.22.5"
+ "@babel/plugin-transform-react-display-name" "^7.23.3"
"@babel/plugin-transform-react-jsx" "^7.22.15"
"@babel/plugin-transform-react-jsx-development" "^7.22.5"
- "@babel/plugin-transform-react-pure-annotations" "^7.22.5"
+ "@babel/plugin-transform-react-pure-annotations" "^7.23.3"
"@babel/regjsgen@^0.8.0":
version "0.8.0"
resolved "https://registry.yarnpkg.com/@babel/regjsgen/-/regjsgen-0.8.0.tgz#f0ba69b075e1f05fb2825b7fad991e7adbb18310"
integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA==
-"@babel/runtime@^7.12.5", "@babel/runtime@^7.8.4":
+"@babel/runtime@^7.23.2":
+ version "7.23.8"
+ resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.8.tgz#8ee6fe1ac47add7122902f257b8ddf55c898f650"
+ integrity sha512-Y7KbAP984rn1VGMbGqKmBLio9V7y5Je9GvU4rQPCPinCyNfUcToxIXl06d59URp/F3LwinvODxab5N/G6qggkw==
+ dependencies:
+ regenerator-runtime "^0.14.0"
+
+"@babel/runtime@^7.8.4":
version "7.23.2"
resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.23.2.tgz#062b0ac103261d68a966c4c7baf2ae3e62ec3885"
integrity sha512-mM8eg4yl5D6i3lu2QKPuPH4FArvJ8KhTofbE7jwMUv9KX5mBvwPAqnV3MlyBNqdp9RyRKP6Yck8TrfYrPvX3bg==
dependencies:
regenerator-runtime "^0.14.0"
-"@babel/template@^7.22.15", "@babel/template@^7.22.5":
+"@babel/template@^7.22.15":
version "7.22.15"
resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38"
integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==
@@ -1078,20 +1196,20 @@
"@babel/parser" "^7.22.15"
"@babel/types" "^7.22.15"
-"@babel/traverse@^7.23.2":
- version "7.23.2"
- resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.2.tgz#329c7a06735e144a506bdb2cad0268b7f46f4ad8"
- integrity sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==
+"@babel/traverse@^7.23.7":
+ version "7.23.7"
+ resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305"
+ integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg==
dependencies:
- "@babel/code-frame" "^7.22.13"
- "@babel/generator" "^7.23.0"
+ "@babel/code-frame" "^7.23.5"
+ "@babel/generator" "^7.23.6"
"@babel/helper-environment-visitor" "^7.22.20"
"@babel/helper-function-name" "^7.23.0"
"@babel/helper-hoist-variables" "^7.22.5"
"@babel/helper-split-export-declaration" "^7.22.6"
- "@babel/parser" "^7.23.0"
- "@babel/types" "^7.23.0"
- debug "^4.1.0"
+ "@babel/parser" "^7.23.6"
+ "@babel/types" "^7.23.6"
+ debug "^4.3.1"
globals "^11.1.0"
"@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.4.4":
@@ -1103,6 +1221,15 @@
"@babel/helper-validator-identifier" "^7.22.20"
to-fast-properties "^2.0.0"
+"@babel/types@^7.23.6":
+ version "7.23.6"
+ resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd"
+ integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==
+ dependencies:
+ "@babel/helper-string-parser" "^7.23.4"
+ "@babel/helper-validator-identifier" "^7.22.20"
+ to-fast-properties "^2.0.0"
+
"@cspotcode/source-map-support@^0.8.0":
version "0.8.1"
resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
@@ -1770,6 +1897,15 @@ babel-plugin-polyfill-corejs2@^0.4.6:
"@babel/helper-define-polyfill-provider" "^0.4.3"
semver "^6.3.1"
+babel-plugin-polyfill-corejs2@^0.4.7:
+ version "0.4.7"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c"
+ integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==
+ dependencies:
+ "@babel/compat-data" "^7.22.6"
+ "@babel/helper-define-polyfill-provider" "^0.4.4"
+ semver "^6.3.1"
+
babel-plugin-polyfill-corejs3@^0.8.5:
version "0.8.6"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.6.tgz#25c2d20002da91fe328ff89095c85a391d6856cf"
@@ -1778,6 +1914,14 @@ babel-plugin-polyfill-corejs3@^0.8.5:
"@babel/helper-define-polyfill-provider" "^0.4.3"
core-js-compat "^3.33.1"
+babel-plugin-polyfill-corejs3@^0.8.7:
+ version "0.8.7"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04"
+ integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.4.4"
+ core-js-compat "^3.33.1"
+
babel-plugin-polyfill-regenerator@^0.5.3:
version "0.5.3"
resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.3.tgz#d4c49e4b44614607c13fb769bcd85c72bb26a4a5"
@@ -1785,6 +1929,13 @@ babel-plugin-polyfill-regenerator@^0.5.3:
dependencies:
"@babel/helper-define-polyfill-provider" "^0.4.3"
+babel-plugin-polyfill-regenerator@^0.5.4:
+ version "0.5.4"
+ resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4"
+ integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.4.4"
+
babel-plugin-syntax-trailing-function-commas@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz#ba0360937f8d06e40180a43fe0d5616fff532cf3"
@@ -1859,6 +2010,16 @@ browserslist@^4.21.9, browserslist@^4.22.1:
node-releases "^2.0.13"
update-browserslist-db "^1.0.13"
+browserslist@^4.22.2:
+ version "4.22.2"
+ resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b"
+ integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==
+ dependencies:
+ caniuse-lite "^1.0.30001565"
+ electron-to-chromium "^1.4.601"
+ node-releases "^2.0.14"
+ update-browserslist-db "^1.0.13"
+
buffer-crc32@^0.2.1, buffer-crc32@^0.2.13:
version "0.2.13"
resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242"
@@ -1924,6 +2085,11 @@ caniuse-lite@^1.0.30001541:
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001553.tgz#e64e7dc8fd4885cd246bb476471420beb5e474b5"
integrity sha512-N0ttd6TrFfuqKNi+pMgWJTb9qrdJu4JSpgPFLe/lrD19ugC6fZgF0pUewRowDwzdDnb9V41mFcdlYgl/PyKf4A==
+caniuse-lite@^1.0.30001565:
+ version "1.0.30001576"
+ resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001576.tgz#893be772cf8ee6056d6c1e2d07df365b9ec0a5c4"
+ integrity sha512-ff5BdakGe2P3SQsMsiqmt1Lc8221NR1VzHj5jXN5vBny9A6fpze94HiVV/n7XRosOlsShJcvMv5mdnpjOGCEgg==
+
chai@4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/chai/-/chai-4.3.4.tgz#b55e655b31e1eac7099be4c08c21964fce2e6c49"
@@ -2172,13 +2338,6 @@ debug@4, debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.1, debug@^4.3.3:
dependencies:
ms "2.1.2"
-debug@4.1.1:
- version "4.1.1"
- resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz#3b72260255109c6b589cee050f1d516139664791"
- integrity sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==
- dependencies:
- ms "^2.1.1"
-
debug@4.3.1:
version "4.3.1"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.1.tgz#f0d229c505e0c6d8c49ac553d1b13dc183f6b2ee"
@@ -2371,6 +2530,11 @@ electron-to-chromium@^1.4.535:
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.565.tgz#205f3746a759ec3c43bce98b9eef5445f2721ea9"
integrity sha512-XbMoT6yIvg2xzcbs5hCADi0dXBh4//En3oFXmtPX+jiyyiCTiM9DGFT2SLottjpEs9Z8Mh8SqahbR96MaHfuSg==
+electron-to-chromium@^1.4.601:
+ version "1.4.625"
+ resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.4.625.tgz#a9a1d18ee911f9074a9c42d9e84b1c79b29f4059"
+ integrity sha512-DENMhh3MFgaPDoXWrVIqSPInQoLImywfCwrSmVl3cf9QHzoZSiutHwGaB/Ql3VkqcQV30rzgdM+BjKqBAJxo5Q==
+
elegant-spinner@^1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e"
@@ -2651,6 +2815,13 @@ esotope-hammerhead@0.6.4:
dependencies:
"@types/estree" "0.0.46"
+esotope-hammerhead@0.6.7:
+ version "0.6.7"
+ resolved "https://registry.yarnpkg.com/esotope-hammerhead/-/esotope-hammerhead-0.6.7.tgz#0ef43e8bb3e14b7ddc51ac0f46f213fda88807a3"
+ integrity sha512-nejJRHWvdoymlWnAXJGm8qfaK1hQ7NiMnTQzMSHPUzBrY7Nogu8O0Q6/HcY8AvY58pkkq2loto7oDDZ0zXYQcg==
+ dependencies:
+ "@types/estree" "0.0.46"
+
espree@^7.3.0, espree@^7.3.1:
version "7.3.1"
resolved "https://registry.yarnpkg.com/espree/-/espree-7.3.1.tgz#f2df330b752c6f55019f8bd89b7660039c1bbbb6"
@@ -3822,7 +3993,7 @@ lodash.union@^4.6.0:
resolved "https://registry.yarnpkg.com/lodash.union/-/lodash.union-4.6.0.tgz#48bb5088409f16f1821666641c44dd1aaae3cd88"
integrity sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==
-"lodash@4.6.1 || ^4.16.1", lodash@^4.14.0, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.4:
+"lodash@4.6.1 || ^4.16.1", lodash@^4.14.0, lodash@^4.17.13, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4:
version "4.17.21"
resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
@@ -4156,6 +4327,11 @@ node-releases@^2.0.13:
resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.13.tgz#d5ed1627c23e3461e819b02e57b75e4899b1c81d"
integrity sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==
+node-releases@^2.0.14:
+ version "2.0.14"
+ resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b"
+ integrity sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==
+
nopt@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/nopt/-/nopt-5.0.0.tgz#530942bb58a512fccafe53fe210f13a25355dc88"
@@ -5207,14 +5383,14 @@ tar@^6.0.2, tar@^6.1.11, tar@^6.1.2:
mkdirp "^1.0.3"
yallist "^4.0.0"
-testcafe-browser-provider-electron@0.0.19:
- version "0.0.19"
- resolved "https://registry.yarnpkg.com/testcafe-browser-provider-electron/-/testcafe-browser-provider-electron-0.0.19.tgz#739d0671630c4074e212ca4a23e71e58ef6cc677"
- integrity sha512-ecSf71hRPpT7ezUWwG3eB7l+hn7t2yVXXdu4k+uTn/REa+naBzT0Koa4WiDRug7HsV8QPbA7G87A3fQ8+7PfMA==
+testcafe-browser-provider-electron@0.0.20:
+ version "0.0.20"
+ resolved "https://registry.yarnpkg.com/testcafe-browser-provider-electron/-/testcafe-browser-provider-electron-0.0.20.tgz#3600b38f4f558159aa454eec005ed67f94dc456b"
+ integrity sha512-UN9HLZg5zPeHpJC8iuq7M0q1XpQ9uLl7+6fmYtpZoSpsK8evc1eCSWQmsOK3I193sYho4rW+OBRlwo2ql6JqaA==
dependencies:
babel-runtime "^6.25.0"
chrome-remote-interface "^0.31.3"
- debug "4.1.1"
+ debug "4.3.1"
dedent "^0.7.0"
endpoint-utils "^1.0.2"
lodash "^4.17.4"
@@ -5249,10 +5425,10 @@ testcafe-browser-tools@2.0.26:
read-file-relative "^1.2.0"
which-promise "^1.0.0"
-testcafe-hammerhead@31.6.1:
- version "31.6.1"
- resolved "https://registry.yarnpkg.com/testcafe-hammerhead/-/testcafe-hammerhead-31.6.1.tgz#181fe81cf10bd43115087d004dc6c2cad0d02f35"
- integrity sha512-tMdF183bTL+hMNzIdUUNpg32T2hlwaI9CEXxOJpgg6VnzCpy1RDV5+wcIJB1ywhs6cdd5ltQZuaHrm1tWbyR1A==
+testcafe-hammerhead@31.7.0:
+ version "31.7.0"
+ resolved "https://registry.yarnpkg.com/testcafe-hammerhead/-/testcafe-hammerhead-31.7.0.tgz#59b6172d3446233b4be7ef10e19e3bebddce52b7"
+ integrity sha512-80pF5RweoJKbsTgzroXXJAFbR2kkxa5SYVIOZyMICXdgI/JQz7GBcF7mEb4Uwq1+M9Pa9k8QDaO1v5xyDse9BQ==
dependencies:
"@adobe/css-tools" "^4.3.0-rc.1"
"@electron/asar" "^3.2.3"
@@ -5260,11 +5436,11 @@ testcafe-hammerhead@31.6.1:
bowser "1.6.0"
crypto-md5 "^1.0.0"
debug "4.3.1"
- esotope-hammerhead "0.6.4"
+ esotope-hammerhead "0.6.7"
http-cache-semantics "^4.1.0"
httpntlm "^1.8.10"
iconv-lite "0.5.1"
- lodash "^4.17.20"
+ lodash "^4.17.21"
lru-cache "2.6.3"
match-url-wildcard "0.0.4"
merge-stream "^1.0.1"
@@ -5370,27 +5546,27 @@ testcafe-selector-generator@^0.1.0:
resolved "https://registry.yarnpkg.com/testcafe-selector-generator/-/testcafe-selector-generator-0.1.0.tgz#852c86f71565e5d9320da625c2260d040cbed786"
integrity sha512-MTw+RigHsEYmFgzUFNErDxui1nTYUk6nm2bmfacQiKPdhJ9AHW/wue4J/l44mhN8x3E8NgOUkHHOI+1TDFXiLQ==
-testcafe@3.3.0:
- version "3.3.0"
- resolved "https://registry.yarnpkg.com/testcafe/-/testcafe-3.3.0.tgz#1446b1acca98b1e43c6843c49fce179c38754af4"
- integrity sha512-fffFnuZwAlZ4y9mkjygHZUGXad/7pXuj/RHkuwvft0GjRDqRHIcfR5aWrVLGnGpFeO55l48Z2kq1SxT2I+879g==
- dependencies:
- "@babel/core" "^7.12.1"
- "@babel/plugin-proposal-async-generator-functions" "^7.12.1"
- "@babel/plugin-proposal-class-properties" "^7.12.1"
- "@babel/plugin-proposal-decorators" "^7.12.1"
- "@babel/plugin-proposal-object-rest-spread" "^7.12.1"
- "@babel/plugin-proposal-private-methods" "^7.14.5"
+testcafe@3.5.0:
+ version "3.5.0"
+ resolved "https://registry.yarnpkg.com/testcafe/-/testcafe-3.5.0.tgz#0dd656215e917871f2e7f3b9548a9a297b0f46eb"
+ integrity sha512-EFy3mMMPpmWzkY35X3JDnQw/GNkw2sW90957t3eMj5zmspwu5FBlkEHRNm2SkmcQWHQTcpp0VZ5HXzVSEHvr6w==
+ dependencies:
+ "@babel/core" "^7.23.2"
+ "@babel/plugin-proposal-async-generator-functions" "^7.20.7"
+ "@babel/plugin-proposal-class-properties" "^7.18.6"
+ "@babel/plugin-proposal-decorators" "^7.23.2"
+ "@babel/plugin-proposal-object-rest-spread" "^7.20.7"
+ "@babel/plugin-proposal-private-methods" "^7.18.6"
"@babel/plugin-syntax-dynamic-import" "^7.8.3"
"@babel/plugin-syntax-import-meta" "^7.10.4"
- "@babel/plugin-transform-async-to-generator" "^7.12.1"
- "@babel/plugin-transform-exponentiation-operator" "^7.12.1"
- "@babel/plugin-transform-for-of" "^7.12.1"
- "@babel/plugin-transform-runtime" "^7.12.1"
- "@babel/preset-env" "^7.12.1"
- "@babel/preset-flow" "^7.12.1"
- "@babel/preset-react" "^7.12.1"
- "@babel/runtime" "^7.12.5"
+ "@babel/plugin-transform-async-to-generator" "^7.22.5"
+ "@babel/plugin-transform-exponentiation-operator" "^7.22.5"
+ "@babel/plugin-transform-for-of" "^7.22.15"
+ "@babel/plugin-transform-runtime" "7.23.3"
+ "@babel/preset-env" "^7.23.2"
+ "@babel/preset-flow" "^7.22.15"
+ "@babel/preset-react" "^7.22.15"
+ "@babel/runtime" "^7.23.2"
"@devexpress/bin-v8-flags-filter" "^1.3.0"
"@devexpress/callsite-record" "^4.1.6"
"@types/node" "^12.20.10"
@@ -5456,7 +5632,7 @@ testcafe@3.3.0:
source-map-support "^0.5.16"
strip-bom "^2.0.0"
testcafe-browser-tools "2.0.26"
- testcafe-hammerhead "31.6.1"
+ testcafe-hammerhead "31.7.0"
testcafe-legacy-api "5.1.6"
testcafe-reporter-json "^2.1.0"
testcafe-reporter-list "^2.2.0"
diff --git a/yarn.lock b/yarn.lock
index 5f279b5887..47ea59c719 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -1379,6 +1379,25 @@
optionalDependencies:
global-agent "^3.0.0"
+"@electron/rebuild@^3.3.0":
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/@electron/rebuild/-/rebuild-3.3.0.tgz#6ba0ae1cb545b2e314901d2ac175ca9c03a2e3da"
+ integrity sha512-S1vgpzIOS1wCJmsYjdLz97MTUV6UTLcMk/HE3w90HYtVxvW+PQdwxLbgsrECX2bysqcnmM5a0K6mXj/gwVgYtQ==
+ dependencies:
+ "@malept/cross-spawn-promise" "^2.0.0"
+ chalk "^4.0.0"
+ debug "^4.1.1"
+ detect-libc "^2.0.1"
+ fs-extra "^10.0.0"
+ got "^11.7.0"
+ node-abi "^3.45.0"
+ node-api-version "^0.1.4"
+ node-gyp "^9.0.0"
+ ora "^5.1.0"
+ semver "^7.3.5"
+ tar "^6.0.5"
+ yargs "^17.0.1"
+
"@electron/universal@1.2.1":
version "1.2.1"
resolved "https://registry.yarnpkg.com/@electron/universal/-/universal-1.2.1.tgz#3c2c4ff37063a4e9ab1e6ff57db0bc619bc82339"
@@ -5832,9 +5851,9 @@ destroy@1.2.0:
integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
detect-libc@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.1.tgz#e1897aa88fa6ad197862937fbc0441ef352ee0cd"
- integrity sha512-463v3ZeIrcWtdgIg6vI6XUncguvr2TnGl4SzDXinkt9mSLpBJKXT3mW6xT3VQdDN11+WVs29pgvivTc4Lp8v+w==
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-2.0.2.tgz#8ccf2ba9315350e1241b88d0ac3b0e1fbd99605d"
+ integrity sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==
detect-newline@^3.0.0:
version "3.1.0"
@@ -6237,26 +6256,6 @@ electron-publish@23.6.0:
lazy-val "^1.0.5"
mime "^2.5.2"
-electron-rebuild@^3.2.9:
- version "3.2.9"
- resolved "https://registry.yarnpkg.com/electron-rebuild/-/electron-rebuild-3.2.9.tgz#ea372be15f591f8d6d978ee9bca6526dadbcf20f"
- integrity sha512-FkEZNFViUem3P0RLYbZkUjC8LUFIK+wKq09GHoOITSJjfDAVQv964hwaNseTTWt58sITQX3/5fHNYcTefqaCWw==
- dependencies:
- "@malept/cross-spawn-promise" "^2.0.0"
- chalk "^4.0.0"
- debug "^4.1.1"
- detect-libc "^2.0.1"
- fs-extra "^10.0.0"
- got "^11.7.0"
- lzma-native "^8.0.5"
- node-abi "^3.0.0"
- node-api-version "^0.1.4"
- node-gyp "^9.0.0"
- ora "^5.1.0"
- semver "^7.3.5"
- tar "^6.0.5"
- yargs "^17.0.1"
-
electron-store@*, electron-store@^8.0.0:
version "8.1.0"
resolved "https://registry.yarnpkg.com/electron-store/-/electron-store-8.1.0.tgz#46a398f2bd9aa83c4a9daaae28380e2b3b9c7597"
@@ -6958,6 +6957,11 @@ expect@^29.0.0, expect@^29.7.0:
jest-message-util "^29.7.0"
jest-util "^29.7.0"
+exponential-backoff@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/exponential-backoff/-/exponential-backoff-3.1.1.tgz#64ac7526fe341ab18a39016cd22c787d01e00bf6"
+ integrity sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==
+
express@^4.17.3:
version "4.18.2"
resolved "https://registry.yarnpkg.com/express/-/express-4.18.2.tgz#3fabe08296e930c796c19e3c516979386ba9fd59"
@@ -9853,15 +9857,6 @@ lz4js@^0.2.0:
resolved "https://registry.yarnpkg.com/lz4js/-/lz4js-0.2.0.tgz#09f1a397cb2158f675146c3351dde85058cb322f"
integrity sha512-gY2Ia9Lm7Ep8qMiuGRhvUq0Q7qUereeldZPP1PMEJxPtEWHJLqw9pgX68oHajBH0nzJK4MaZEA/YNV3jT8u8Bg==
-lzma-native@^8.0.5:
- version "8.0.6"
- resolved "https://registry.yarnpkg.com/lzma-native/-/lzma-native-8.0.6.tgz#3ea456209d643bafd9b5d911781bdf0b396b2665"
- integrity sha512-09xfg67mkL2Lz20PrrDeNYZxzeW7ADtpYFbwSQh9U8+76RIzx5QsJBMy8qikv3hbUPfpy6hqwxt6FcGK81g9AA==
- dependencies:
- node-addon-api "^3.1.0"
- node-gyp-build "^4.2.1"
- readable-stream "^3.6.0"
-
make-dir@^2.0.0, make-dir@^2.1.0:
version "2.1.0"
resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz#5f0310e18b8be898cc07009295a30ae41e91e6f5"
@@ -10682,6 +10677,11 @@ minipass@^4.0.0:
resolved "https://registry.yarnpkg.com/minipass/-/minipass-4.2.8.tgz#f0010f64393ecfc1d1ccb5f582bcaf45f48e1a3a"
integrity sha512-fNzuVyifolSLFL4NzpF+wEF4qrgqaaKX0haXPQEdQ7NKAN+WecoKMHV09YcuL/DHxrUsYQOK3MiuDf7Ip2OXfQ==
+minipass@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/minipass/-/minipass-5.0.0.tgz#3e9788ffb90b694a5d0ec94479a45b5d8738133d"
+ integrity sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==
+
minizlib@^2.0.0, minizlib@^2.1.1, minizlib@^2.1.2:
version "2.1.2"
resolved "https://registry.yarnpkg.com/minizlib/-/minizlib-2.1.2.tgz#e90d3466ba209b932451508a11ce3d3632145931"
@@ -10841,10 +10841,10 @@ no-case@^3.0.4:
lower-case "^2.0.2"
tslib "^2.0.3"
-node-abi@^3.0.0:
- version "3.40.0"
- resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.40.0.tgz#51d8ed44534f70ff1357dfbc3a89717b1ceac1b4"
- integrity sha512-zNy02qivjjRosswoYmPi8hIKJRr8MpQyeKT6qlcq/OnOgA3Rhoae+IYOqsM9V5+JnHWmxKnWOT2GxvtqdtOCXA==
+node-abi@^3.45.0:
+ version "3.51.0"
+ resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-3.51.0.tgz#970bf595ef5a26a271307f8a4befa02823d4e87d"
+ integrity sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==
dependencies:
semver "^7.3.5"
@@ -10853,11 +10853,6 @@ node-addon-api@^1.6.3:
resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-1.7.2.tgz#3df30b95720b53c24e59948b49532b662444f54d"
integrity sha512-ibPK3iA+vaY1eEjESkQkM0BbCqFOaZMiXRTtdB0u7b4djtY6JnsjvPdUHVMg6xQt3B8fpTTWHI9A+ADjM9frzg==
-node-addon-api@^3.1.0:
- version "3.2.1"
- resolved "https://registry.yarnpkg.com/node-addon-api/-/node-addon-api-3.2.1.tgz#81325e0a2117789c0128dab65e7e38f07ceba161"
- integrity sha512-mmcei9JghVNDYydghQmeDX8KoAm0FAiYyIcUt/N4nhyAipB17pllZQDOJD2fotxABnt4Mdz+dKTO7eftLg4d0A==
-
node-api-version@^0.1.4:
version "0.1.4"
resolved "https://registry.yarnpkg.com/node-api-version/-/node-api-version-0.1.4.tgz#1ed46a485e462d55d66b5aa1fe2821720dedf080"
@@ -10889,11 +10884,6 @@ node-gyp-build-optional-packages@5.0.7:
resolved "https://registry.yarnpkg.com/node-gyp-build-optional-packages/-/node-gyp-build-optional-packages-5.0.7.tgz#5d2632bbde0ab2f6e22f1bbac2199b07244ae0b3"
integrity sha512-YlCCc6Wffkx0kHkmam79GKvDQ6x+QZkMjFGrIMxgFNILFvGSbCp2fCBC55pGTT9gVaz8Na5CLmxt/urtzRv36w==
-node-gyp-build@^4.2.1:
- version "4.6.0"
- resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.6.0.tgz#0c52e4cbf54bbd28b709820ef7b6a3c2d6209055"
- integrity sha512-NTZVKn9IylLwUzaKjkas1e4u2DLNcV4rdYagA4PWdPwW87Bi7z+BznyKSRwS/761tV/lzCGXplWsiaMjLqP2zQ==
-
node-gyp@^8.4.1:
version "8.4.1"
resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-8.4.1.tgz#3d49308fc31f768180957d6b5746845fbd429937"
@@ -10911,11 +10901,12 @@ node-gyp@^8.4.1:
which "^2.0.2"
node-gyp@^9.0.0:
- version "9.3.1"
- resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.3.1.tgz#1e19f5f290afcc9c46973d68700cbd21a96192e4"
- integrity sha512-4Q16ZCqq3g8awk6UplT7AuxQ35XN4R/yf/+wSAwcBUAjg7l58RTactWaP8fIDTi0FzI7YcVLujwExakZlfWkXg==
+ version "9.4.1"
+ resolved "https://registry.yarnpkg.com/node-gyp/-/node-gyp-9.4.1.tgz#8a1023e0d6766ecb52764cc3a734b36ff275e185"
+ integrity sha512-OQkWKbjQKbGkMf/xqI1jjy3oCTgMKJac58G2+bjZb3fza6gW2YrCSdMQYaoTb70crvE//Gngr4f0AgVHmqHvBQ==
dependencies:
env-paths "^2.2.0"
+ exponential-backoff "^3.1.1"
glob "^7.1.4"
graceful-fs "^4.2.6"
make-fetch-happen "^10.0.3"
@@ -13911,13 +13902,13 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0:
integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
tar@^6.0.2, tar@^6.0.5, tar@^6.1.11, tar@^6.1.2:
- version "6.1.13"
- resolved "https://registry.yarnpkg.com/tar/-/tar-6.1.13.tgz#46e22529000f612180601a6fe0680e7da508847b"
- integrity sha512-jdIBIN6LTIe2jqzay/2vtYLlBHa3JF42ot3h1dW8Q0PaAG4v8rm0cvpVePtau5C6OKXGGcgO9q2AMNSWxiLqKw==
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/tar/-/tar-6.2.0.tgz#b14ce49a79cb1cd23bc9b016302dea5474493f73"
+ integrity sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==
dependencies:
chownr "^2.0.0"
fs-minipass "^2.0.0"
- minipass "^4.0.0"
+ minipass "^5.0.0"
minizlib "^2.1.1"
mkdirp "^1.0.3"
yallist "^4.0.0"