Merge branch 'develop' into feature/unit-conversion

This commit is contained in:
vabene1111 2023-03-25 06:23:56 +01:00
commit 9241638686
24 changed files with 624 additions and 724 deletions

View File

@ -14,3 +14,8 @@ updates:
directory: "/vue/"
schedule:
interval: "monthly"
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: "monthly"

136
.github/workflows/build-docker.yml vendored Normal file
View File

@ -0,0 +1,136 @@
name: Build Docker Container
on: push
jobs:
build-container:
name: Build ${{ matrix.name }} Container
runs-on: ubuntu-latest
if: github.repository_owner == 'TandoorRecipes'
continue-on-error: ${{ matrix.continue-on-error }}
permissions:
contents: read
packages: write
strategy:
matrix:
include:
# Standard build config
- name: Standard
dockerfile: Dockerfile
platforms: linux/amd64,linux/arm64
suffix: ""
continue-on-error: false
# Raspi build config
- name: Raspi
dockerfile: Dockerfile-raspi
platforms: linux/arm/v7
suffix: "-raspi"
continue-on-error: true
steps:
- uses: actions/checkout@v3
- name: Get version number
id: get_version
run: |
if [[ "$GITHUB_REF" = refs/tags/* ]]; then
echo "VERSION=${GITHUB_REF/refs\/tags\//}" >> $GITHUB_OUTPUT
elif [[ "$GITHUB_REF" = refs/heads/beta ]]; then
echo VERSION=beta >> $GITHUB_OUTPUT
else
echo VERSION=develop >> $GITHUB_OUTPUT
fi
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.2
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v3
with:
node-version: '14'
cache: yarn
cache-dependency-path: vue/yarn.lock
- name: Install dependencies
working-directory: ./vue
run: yarn install --frozen-lockfile
- name: Build dependencies
working-directory: ./vue
run: yarn build
- name: Set up QEMU
uses: docker/setup-qemu-action@v2
- name: Set up Buildx
uses: docker/setup-buildx-action@v2
- name: Login to Docker Hub
uses: docker/login-action@v2
with:
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}
- name: Login to GitHub Container Registry
uses: docker/login-action@v2
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ github.token }}
- name: Docker meta
id: meta
uses: docker/metadata-action@v4
with:
images: |
vabene1111/recipes
ghcr.io/TandoorRecipes/recipes
flavor: |
latest=false
suffix=${{ matrix.suffix }}
tags: |
type=raw,value=latest,enable=${{ startsWith(github.ref, 'refs/tags/') }}
type=semver,pattern={{version}}
type=semver,pattern={{major}}.{{minor}}
type=semver,pattern={{major}}
type=ref,event=branch
- name: Build and Push
uses: docker/build-push-action@v4
with:
context: .
file: ${{ matrix.dockerfile }}
pull: true
push: true
platforms: ${{ matrix.platforms }}
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}
cache-from: type=gha
cache-to: type=gha,mode=max
notify-stable:
name: Notify Stable
runs-on: ubuntu-latest
needs: build-container
if: startsWith(github.ref, 'refs/tags/')
steps:
# Send stable discord notification
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}'
notify-beta:
name: Notify Beta
runs-on: ubuntu-latest
needs: build-container
if: github.ref == 'refs/heads/beta'
steps:
# Send beta discord notification
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 The BETA Image has been updated! 🥳'

View File

@ -12,7 +12,7 @@ jobs:
python-version: ['3.10']
steps:
- uses: actions/checkout@v1
- uses: actions/checkout@v3
- name: Set up Python 3.10
uses: actions/setup-python@v4
with:

View File

@ -12,7 +12,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v2
uses: actions/checkout@v3
with:
# We must fetch at least the immediate parents so that if this is
# a pull request then we can checkout the head.
@ -25,7 +25,7 @@ jobs:
# Initializes the CodeQL tools for scanning.
- name: Initialize CodeQL
uses: github/codeql-action/init@v1
uses: github/codeql-action/init@v2
# Override language selection by uncommenting this and choosing your languages
with:
languages: python, javascript
@ -47,6 +47,6 @@ jobs:
# make release
- name: Perform CodeQL Analysis
uses: github/codeql-action/analyze@v1
uses: github/codeql-action/analyze@v2
with:
languages: javascript, python

View File

@ -1,48 +0,0 @@
name: publish beta raspi image docker
on:
push:
branches:
- 'beta'
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = 'beta'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
tag: beta-raspi
dockerFile: Dockerfile-raspi
platform: linux/arm/v7
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
# Send discord notification
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 The BETA Image has been updated! 🥳'

View File

@ -1,47 +0,0 @@
name: publish beta image docker
on:
push:
branches:
- 'beta'
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = 'beta'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
tag: beta
platform: linux/amd64,linux/arm64
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
# Send discord notification
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_BETA_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 The BETA Image has been updated! 🥳'

View File

@ -1,42 +0,0 @@
name: publish dev image docker
on:
push:
branches:
- '*'
- '*/*'
- '!master'
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = 'develop'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Clear Cache
working-directory: ./vue
run: yarn cache clean --all
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Publish to Registry
uses: elgohr/Publish-Docker-Github-Action@2.13
with:
name: vabene1111/recipes
username: ${{ secrets.DOCKER_USERNAME }}
password: ${{ secrets.DOCKER_PASSWORD }}

View File

@ -1,45 +0,0 @@
name: publish latest raspi image docker
on:
push:
tags:
- '*'
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Get version number
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}-raspi
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}-raspi'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
dockerFile: Dockerfile-raspi
platform: linux/arm/v7
tag: latest-raspi
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}

View File

@ -1,44 +0,0 @@
name: publish latest image docker
on:
push:
tags:
- '*'
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@master
- name: Get version number
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
platform: linux/amd64,linux/arm64
tag: latest
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}

View File

@ -1,47 +0,0 @@
name: publish tagged raspi release docker
on:
release:
types: [published]
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
name: Build image job
steps:
- name: Checkout master
uses: actions/checkout@master
- name: Get version number
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
dockerFile: Dockerfile-raspi
platform: linux/arm/v7
tag: ${{ steps.get_version.outputs.VERSION }}-raspi
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}

View File

@ -1,53 +0,0 @@
name: publish tagged release docker
on:
release:
types: [published]
jobs:
build:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
name: Build image job
steps:
- name: Checkout master
uses: actions/checkout@master
- name: Get version number
id: get_version
run: echo ::set-output name=VERSION::${GITHUB_REF/refs\/tags\//}
# Update Version number
- name: Update version file
uses: DamianReeves/write-file-action@v1.0
with:
path: recipes/version.py
contents: |
VERSION_NUMBER = '${{ steps.get_version.outputs.VERSION }}'
BUILD_REF = '${{ github.sha }}'
write-mode: overwrite
# Build Vue frontend
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Install dependencies
working-directory: ./vue
run: yarn install
- name: Build dependencies
working-directory: ./vue
run: yarn build
# Build container
- name: Build and publish image
uses: ilteoood/docker_buildx@master
with:
publish: true
imageName: vabene1111/recipes
platform: linux/amd64,linux/arm64
tag: ${{ steps.get_version.outputs.VERSION }}
dockerUser: ${{ secrets.DOCKER_USERNAME }}
dockerPassword: ${{ secrets.DOCKER_PASSWORD }}
# Send discord notification
- name: Discord notification
env:
DISCORD_WEBHOOK: ${{ secrets.DISCORD_RELEASE_WEBHOOK }}
uses: Ilshidur/action-discord@0.3.2
with:
args: '🚀 Version {{ EVENT_PAYLOAD.release.tag_name }} of tandoor has been released 🥳 Check it out https://github.com/vabene1111/recipes/releases/tag/{{ EVENT_PAYLOAD.release.tag_name }}'

View File

@ -9,8 +9,8 @@ jobs:
if: github.repository_owner == 'TandoorRecipes'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-python@v2
- uses: actions/checkout@v3
- uses: actions/setup-python@v4
with:
python-version: 3.x
- run: pip install mkdocs-material mkdocs-include-markdown-plugin

View File

@ -247,10 +247,27 @@ def parse_description(description):
def clean_instruction_string(instruction):
normalized_string = normalize_string(instruction)
# handle HTML tags that can be converted to markup
normalized_string = instruction \
.replace("<nobr>", "**") \
.replace("</nobr>", "**") \
.replace("<strong>", "**") \
.replace("</strong>", "**")
normalized_string = normalize_string(normalized_string)
normalized_string = normalized_string.replace('\n', ' \n')
normalized_string = normalized_string.replace(' \n \n', '\n\n')
return normalized_string
# handle unsupported, special UTF8 character in Thermomix-specific instructions,
# that happen in nearly every recipe on Cookidoo, Zaubertopf Club, Rezeptwelt
# and in Thermomix-specific recipes on many other sites
return normalized_string \
.replace("", _('reverse rotation')) \
.replace("", _('careful rotation')) \
.replace("", _('knead')) \
.replace("Andicken ", _('thicken')) \
.replace("Erwärmen ", _('warm up')) \
.replace("Fermentieren ", _('ferment')) \
.replace("Sous-vide ", _("sous-vide"))
def parse_instructions(instructions):

View File

@ -528,6 +528,35 @@ msgstr "Du hast mehr Benutzer in Deinem Space als erlaubt."
msgid "One of queryset or hash_key must be provided"
msgstr "Es muss die Abfrage oder der Hash_Key angeben werden"
#: .\cookbook\helper\recipe_url_import.py:265
msgid "reverse rotation"
msgstr "Linkslauf"
#: .\cookbook\helper\recipe_url_import.py:266
msgid "careful rotation"
msgstr "Kochlöffel"
#: .\cookbook\helper\recipe_url_import.py:267
msgid "knead"
msgstr "Kneten"
#: .\cookbook\helper\recipe_url_import.py:268
msgid "thicken"
msgstr "Andicken"
#: .\cookbook\helper\recipe_url_import.py:269
msgid "warm up"
msgstr "Erwärmen"
#: .\cookbook\helper\recipe_url_import.py:270
msgid "ferment"
msgstr "Fermentieren"
#: .\cookbook\helper\recipe_url_import.py:271
msgid "sous-vide"
msgstr "Sous-vide"
#: .\cookbook\helper\shopping_helper.py:152
msgid "You must supply a servings size"
msgstr "Sie müssen eine Portionsgröße angeben"

View File

@ -1,5 +1,5 @@
There are several questions and issues that come up from time to time. Here are some answers.
Please note that the existence of some questions is due the application not being perfect in some parts.
There are several questions and issues that come up from time to time, here are some answers:
please note that the existence of some questions is due the application not being perfect in some parts.
Many of those shortcomings are planned to be fixed in future release but simply could not be addressed yet due to time limits.
## Is there a Tandoor app?
@ -22,14 +22,14 @@ Open Tandoor, open the menu behind the three vertical dots at the top right, sel
Open Tandoor, open the menu behind the three horizontal dots at the top right, select `Apps > Install Tandoor Recipes`
## Why is Tandoor not working correctly?
If you just set up your Tandoor instance and you're having issues like...
If you just set up your Tandoor instance and you're having issues like;
- Links not working
- CSRF errors
- CORS errors
- No recipes are loading
... then make sure, that you have set [all required headers](install/docker.md#required-headers) in your reverse proxy correctly.
then make sure you have set [all required headers](install/docker.md#required-headers) in your reverse proxy correctly.
If that doesn't fix it, you can also refer to the appropriate sub section in the [reverse proxy documentation](install/docker.md#reverse-proxy) and verify your general webserver configuration.
## Why am I getting CSRF Errors?
@ -62,7 +62,7 @@ The markdown renderer follows this markdown specification https://daringfireball
Please refer to [here](install/docker.md#setup-issues-on-raspberry-pi).
## How can I create users?
To create a new user click on your name (top right corner) and select 'space settings'. There under invites click create.
To create a new user click on your name (top right corner) and select 'space settings'. Click create listed below invites.
It is not possible to create users through the admin because users must be assigned a default group and space.
@ -72,8 +72,8 @@ If you use an external auth provider or proxy authentication make sure to specif
environment configuration.
## What are spaces?
Spaces are a feature used to separate one installation of Tandoor into several parts.
In technical terms it is a multi tenant system.
Spaces are is a type of feature used to separate one installation of Tandoor into several parts.
In technical terms it is a multi-tenant system.
You can compare a space to something like google drive or dropbox.
There is only one installation of the Dropbox system, but it handles multiple users without them noticing each other.
@ -83,7 +83,7 @@ If you want to host the collection of your friends, family, or neighbor you can
Sharing between spaces is currently not possible but is planned for future releases.
## How can I reset passwords?
To reset a lost password if access to the container is lost you need to
To reset a lost password if access to the container is lost you need to:
1. execute into the container using `docker-compose exec web_recipes sh`
2. activate the virtual environment `source venv/bin/activate`

View File

@ -49,7 +49,7 @@ spec:
secretKeyRef:
name: recipes
key: postgresql-postgres-password
image: vabene1111/recipes:1.0.1
image: vabene1111/recipes
imagePullPolicy: Always
resources:
requests:
@ -110,7 +110,7 @@ spec:
subPath: nginx-config
readOnly: true
- name: recipes
image: vabene1111/recipes:1.0.1
image: vabene1111/recipes
imagePullPolicy: IfNotPresent
command:
- /opt/recipes/venv/bin/gunicorn
@ -159,6 +159,8 @@ spec:
secretKeyRef:
name: recipes
key: secret-key
- name: GUNICORN_MEDIA
value: "0"
- name: DB_ENGINE
value: django.db.backends.postgresql_psycopg2
- name: POSTGRES_HOST

View File

@ -61,6 +61,14 @@ The deployment first fires up a init container to do the database migrations and
The deployment then runs two containers, the recipes-nginx and the recipes container which runs the gunicorn app. The nginx container gets it's nginx.conf via config map to deliver static content `/static` and `/media`. The guincorn container gets it's secret key and the database password from the secret `recipes`. `gunicorn` runs as user `nobody`.
Currently, this deployment is using the `latest` image. You may want to explicitly set the tag, e.g.
~~~
image: vabene1111/recipes:1.4.7
~~~
It is **extremely important** to use the same image in both the initialization `init-chmod-data` and the main `recipes` containers.
### 60-service.yaml
Creating the app service.
@ -91,7 +99,9 @@ I don't know how this check works, but this warning is simply wrong! ;-) Media a
## Updates
These manifests are tested against Release 1.0.1. Newer versions may not work without changes.
These manifests have been tested for several releases. Newer versions may not work without changes.
If everything works as expected, the `init-chmod-data` initialization container performs the database migration and the update procedure is transparent. However, it is recommended to use specific tags to increase stability and avoid unnecessary migrations.
## Apply the manifets

50
docs/install/wsl.md Normal file
View File

@ -0,0 +1,50 @@
# Ubuntu Installation on Windows (WSL) and Docker Desktop
Install Docker from https://docs.docker.com/desktop/install/windows-install/
Be sure to select the Use WSL 2 instead of Hyper-V option on the configuration page when prompted
Follow the instructions to install Tandoor on Docker. Tandoor installation instructions using Docker is gotten from https://docs.tandoor.dev/install/docker/
You may get the error below if you are using Docker Desktop:
/usr/bin/docker-credential-desktop.exe: Invalid argument
This indicates that Docker Compose is not able to pull authentication credentials that are needed to pull recipe files.
Run the command:
export DOCKER_CONFIG=/non-existent-directory
"non-existent-directory" could be an arbitrary directory of your choosing. It could be empty,
we are just giving docker a file to point to. You can create a credentials file at a later date to add security to your application.
After you run the command docker-compose up -d, you may encounter an error similar to the one below:
fixing permissions on existing directory /var/lib/postgresql/data ... 2023-03-01T15:38:27.140501700Z chmod: /var/lib/postgresql/data: Operation not permitted
This indicates that the postgresql user 'postgres' does not have the necessary permissions to
change the permissions of the /var/lib/postgresql/data directory.
Note: This issue does not occuer in the Powershell terminal, so it might be easier to install Tandoor in powershell and continue development using WSL.
Steps to fix this error:
Since the permissions have to be changed within the docker container, we will need to create a file that runs as soon as the container starts up. This container will change the permissions of the /var/lib/postgresql/data directory before the db_recipes-1 container is started up. This container sets up the database to accept connections.
Docker allows us to set up an entrypoint in the docker-compose.yml file. This is where we will set the commands to change the permissions of the postgres user.
Steps to set up entry-point file:
1. Create a new file docker-entrypoint.sh in the same directory as your docker-compose.yml file. This will be a bash file.
2. Add the following commands to the file
a. #!/bin/sh (This is called a shebang. It tells the OS the shell to use which is the sh shell in this case)
b. chmod 777 /var/lib/postgresql/data (Gives read, write and execute permissions on the directory to all users, you may change these permissions as you wish)
c. exec “@” (Runs the script with the commands above)
Your folder structure should look like this with docker-compose.yml and docker-entrypoint.sh in the same directory:
![image](https://user-images.githubusercontent.com/100102599/225214709-322417a1-1cab-47a6-83dd-555a4234e72a.png)
The docker-entrypoint.sh file should look like this:
![image](https://user-images.githubusercontent.com/100102599/225214795-102c9e53-b790-498a-a6d6-ad0bcc980b2f.png)
3. Open the docker-compose.yml file
4. Add an entrypoint configuration to the db_recipes service
entrypoint:
- docker-entrypoint.sh
This command makes sure that the docker-entrypoint.sh file is run first before the db_recipes services is started. Using this, we set the database user permission before they are needed, so it gets rid of the error.
Your docker-compose.yml file should look like this:
![image](https://user-images.githubusercontent.com/100102599/225214865-869c9b24-61cf-4069-aa98-a7e18a165105.png)
5. Run docker-compose up -d, all the containers should run!

View File

@ -33,6 +33,7 @@ nav:
- Synology: install/synology.md
- Kubernetes: install/kubernetes.md
- KubeSail or PiBox: install/kubesail.md
- WSL: install/wsl.md
- Manual: install/manual.md
- Other setups: install/other.md
- Features:

View File

@ -388,6 +388,7 @@ LANGUAGES = [
('en', _('English')),
('fr', _('French')),
('de', _('German')),
('hu', _('Hungarian')),
('it', _('Italian')),
('lv', _('Latvian')),
('pl', _('Polish')),

View File

@ -2,9 +2,9 @@ Django==4.1.7
cryptography==39.0.1
django-annoying==0.10.6
django-autocomplete-light==3.9.4
django-cleanup==6.0.0
django-cleanup==7.0.0
django-crispy-forms==1.14.0
django-tables2==2.4.1
django-tables2==2.5.3
djangorestframework==3.14.0
drf-writable-nested==0.7.0
django-oauth-toolkit==2.2.0
@ -17,7 +17,7 @@ Markdown==3.4.1
Pillow==9.4.0
psycopg2-binary==2.9.5
python-dotenv==0.21.0
requests==2.28.1
requests==2.28.2
six==1.16.0
webdavclient3==3.14.6
whitenoise==6.2.0
@ -27,12 +27,12 @@ uritemplate==4.1.1
beautifulsoup4==4.11.1
microdata==0.8.0
Jinja2==3.1.2
django-webpack-loader==1.8.0
django-webpack-loader==1.8.1
git+https://github.com/BITSOLVER/django-js-reverse@071e304fd600107bc64bbde6f2491f1fe049ec82
django-allauth==0.52.0
recipe-scrapers==14.30.0
django-scopes==1.2.0.post1
pytest==7.2.0
pytest==7.2.2
pytest-django==4.5.2
django-treebeard==4.5.1
django-cors-headers==3.13.0

View File

@ -8,7 +8,7 @@
"lint": "vue-cli-service lint"
},
"dependencies": {
"@babel/eslint-parser": "^7.19.1",
"@babel/eslint-parser": "^7.21.3",
"@emoji-mart/data": "^1.1.1",
"@popperjs/core": "^2.11.6",
"@riophae/vue-treeselect": "^0.4.0",
@ -19,7 +19,7 @@
"babel-core": "^6.26.3",
"babel-loader": "^9.1.0",
"bootstrap-vue": "^2.23.1",
"core-js": "^3.27.1",
"core-js": "^3.29.1",
"emoji-mart": "^5.4.0",
"emoji-mart-vue-fast": "^12.0.1",
"html2pdf.js": "^0.10.1",
@ -41,7 +41,7 @@
"vue-property-decorator": "^9.1.2",
"vue-sanitize": "^0.2.2",
"vue-simple-calendar": "TandoorRecipes/vue-simple-calendar#lastvue2",
"vue-template-compiler": "2.6.14",
"vue-template-compiler": "2.7.14",
"vue2-touch-events": "^3.2.2",
"vuedraggable": "^2.24.3",
"workbox-webpack-plugin": "^6.5.4",
@ -49,8 +49,8 @@
},
"devDependencies": {
"@kazupon/vue-i18n-loader": "^0.5.0",
"@typescript-eslint/eslint-plugin": "^4.33.0",
"@typescript-eslint/parser": "^5.47.1",
"@typescript-eslint/eslint-plugin": "^5.56.0",
"@typescript-eslint/parser": "^5.56.0",
"@vue/cli-plugin-babel": "^5.0.8",
"@vue/cli-plugin-eslint": "~5.0.8",
"@vue/cli-plugin-pwa": "^5.0.8",
@ -63,7 +63,7 @@
"eslint-plugin-vue": "^8.7.1",
"typescript": "~4.9.3",
"vue-cli-plugin-i18n": "^2.3.1",
"webpack-bundle-tracker": "1.8.0",
"webpack-bundle-tracker": "1.8.1",
"workbox-background-sync": "^6.5.4",
"workbox-expiration": "^6.5.4",
"workbox-navigation-preload": "^6.5.4",

View File

@ -13,240 +13,240 @@
"success_moving_resource": "Recurso movido com sucesso!",
"success_merging_resource": "Recurso mesclado com sucesso!",
"file_upload_disabled": "Upload de arquivos não está habilitado para seu espaço.",
"step_time_minutes": "",
"confirm_delete": "",
"import_running": "",
"all_fields_optional": "",
"convert_internal": "",
"show_only_internal": "",
"show_split_screen": "",
"Log_Recipe_Cooking": "",
"External_Recipe_Image": "",
"Add_to_Shopping": "",
"Add_to_Plan": "",
"Step_start_time": "",
"Sort_by_new": "",
"Table_of_Contents": "",
"Recipes_per_page": "",
"Show_as_header": "",
"Hide_as_header": "",
"Add_nutrition_recipe": "",
"Remove_nutrition_recipe": "",
"Copy_template_reference": "",
"Save_and_View": "",
"Manage_Books": "",
"Meal_Plan": "",
"Select_Book": "",
"Select_File": "",
"Recipe_Image": "",
"Import_finished": "",
"View_Recipes": "",
"Log_Cooking": "",
"New_Recipe": "",
"Url_Import": "",
"Reset_Search": "",
"Recently_Viewed": "",
"Load_More": "",
"New_Keyword": "",
"Delete_Keyword": "",
"Edit_Keyword": "",
"Edit_Recipe": "",
"Move_Keyword": "",
"Merge_Keyword": "",
"Hide_Keywords": "",
"Hide_Recipes": "",
"Move_Up": "",
"Move_Down": "",
"Step_Name": "",
"Step_Type": "",
"Make_Header": "",
"Make_Ingredient": "",
"Enable_Amount": "",
"Disable_Amount": "",
"Add_Step": "",
"Keywords": "",
"Books": "",
"Proteins": "",
"Fats": "",
"Carbohydrates": "",
"Calories": "",
"Energy": "",
"Nutrition": "",
"Date": "",
"Share": "",
"Automation": "",
"Parameter": "",
"Export": "",
"Copy": "",
"Rating": "",
"Close": "",
"Cancel": "",
"Link": "",
"Add": "",
"New": "",
"Note": "",
"Success": "",
"Failure": "",
"Ingredients": "",
"Supermarket": "",
"Categories": "",
"Category": "",
"Selected": "",
"min": "",
"Servings": "",
"Waiting": "",
"Preparation": "",
"External": "",
"Size": "",
"Files": "",
"File": "",
"Edit": "",
"Image": "",
"Delete": "",
"Open": "",
"Ok": "",
"Save": "",
"Step": "",
"Search": "",
"Import": "",
"Print": "",
"Settings": "",
"or": "",
"and": "",
"Information": "",
"Download": "",
"Create": "",
"Search Settings": "",
"View": "",
"Recipes": "",
"Move": "",
"Merge": "",
"Parent": "",
"delete_confirmation": "",
"move_confirmation": "",
"merge_confirmation": "",
"create_rule": "",
"move_selection": "",
"merge_selection": "",
"Root": "",
"Ignore_Shopping": "",
"Shopping_Category": "",
"Shopping_Categories": "",
"Edit_Food": "",
"Move_Food": "",
"New_Food": "",
"Hide_Food": "",
"Food_Alias": "",
"Unit_Alias": "",
"Keyword_Alias": "",
"Delete_Food": "",
"No_ID": "",
"Meal_Plan_Days": "",
"merge_title": "",
"move_title": "",
"Food": "",
"Recipe_Book": "",
"del_confirmation_tree": "",
"delete_title": "",
"create_title": "",
"edit_title": "",
"Name": "",
"Type": "",
"Description": "",
"Recipe": "",
"tree_root": "",
"Icon": "",
"Unit": "",
"No_Results": "",
"New_Unit": "",
"Create_New_Shopping Category": "",
"Create_New_Food": "",
"Create_New_Keyword": "",
"Create_New_Unit": "",
"Create_New_Meal_Type": "",
"and_up": "",
"and_down": "",
"Instructions": "",
"Unrated": "",
"Automate": "",
"Empty": "",
"Key_Ctrl": "",
"Key_Shift": "",
"Time": "",
"Text": "",
"Shopping_list": "",
"Added_by": "",
"Added_on": "",
"AddToShopping": "",
"IngredientInShopping": "",
"NotInShopping": "",
"OnHand": "",
"FoodOnHand": "",
"FoodNotOnHand": "",
"Undefined": "",
"Create_Meal_Plan_Entry": "",
"Edit_Meal_Plan_Entry": "",
"Title": "",
"Week": "",
"Month": "",
"Year": "",
"Planner": "",
"Planner_Settings": "",
"Period": "",
"Plan_Period_To_Show": "",
"Periods": "",
"Plan_Show_How_Many_Periods": "",
"Starting_Day": "",
"Meal_Types": "",
"Meal_Type": "",
"Clone": "",
"Drag_Here_To_Delete": "",
"Meal_Type_Required": "",
"Title_or_Recipe_Required": "",
"Color": "",
"New_Meal_Type": "",
"AddFoodToShopping": "",
"RemoveFoodFromShopping": "",
"DeleteShoppingConfirm": "",
"IgnoredFood": "",
"Add_Servings_to_Shopping": "",
"Week_Numbers": "",
"Show_Week_Numbers": "",
"Export_As_ICal": "",
"Export_To_ICal": "",
"Cannot_Add_Notes_To_Shopping": "",
"Added_To_Shopping_List": "",
"Shopping_List_Empty": "",
"Next_Period": "",
"Previous_Period": "",
"Current_Period": "",
"Next_Day": "",
"Previous_Day": "",
"Inherit": "",
"InheritFields": "",
"FoodInherit": "",
"ShowUncategorizedFood": "",
"GroupBy": "",
"SupermarketCategoriesOnly": "",
"MoveCategory": "",
"CountMore": "",
"IgnoreThis": "",
"DelayFor": "",
"Warning": "",
"NoCategory": "",
"InheritWarning": "",
"ShowDelayed": "",
"Completed": "",
"OfflineAlert": "",
"shopping_share": "",
"shopping_auto_sync": "",
"mealplan_autoadd_shopping": "",
"mealplan_autoexclude_onhand": "",
"mealplan_autoinclude_related": "",
"default_delay": "",
"shopping_share_desc": "",
"shopping_auto_sync_desc": "",
"mealplan_autoadd_shopping_desc": "",
"step_time_minutes": "tempo da etapa em minutos",
"confirm_delete": "Tem a certeza que pretende eliminar este {object}?",
"import_running": "Importação a decorrer, por favor aguarde!",
"all_fields_optional": "Todo os campos são opcionais e podem ficar vazios.",
"convert_internal": "Converter em receita interna",
"show_only_internal": "Mostrar apenas receitas internas",
"show_split_screen": "Vista dividida",
"Log_Recipe_Cooking": "Registrar Receitas de Culinária",
"External_Recipe_Image": "Imagem da receita externa",
"Add_to_Shopping": "Adicionar á lista de compras",
"Add_to_Plan": "Adicionar ao plano",
"Step_start_time": "Hora de Inicio do passo",
"Sort_by_new": "Ordenar por mais recente",
"Table_of_Contents": "Tabela de Conteúdos",
"Recipes_per_page": "Receitas por página",
"Show_as_header": "Mostrar como cabeçalho",
"Hide_as_header": "Esconder como cabeçalho",
"Add_nutrition_recipe": "Adicionar valor nutricional á receita",
"Remove_nutrition_recipe": "Remover valor nutricional da receita",
"Copy_template_reference": "Copiar modelo de referencia",
"Save_and_View": "Gravar & Ver",
"Manage_Books": "Gerenciar Livros",
"Meal_Plan": "Plano de Refeição",
"Select_Book": "Selecionar Livro",
"Select_File": "Selecionar Ficheiro",
"Recipe_Image": "Imagem da Receita",
"Import_finished": "Importação terminada",
"View_Recipes": "Ver Receitas",
"Log_Cooking": "Registrar Culinária",
"New_Recipe": "Nova Receita",
"Url_Import": "Importação de URL",
"Reset_Search": "Repor Pesquisa",
"Recently_Viewed": "Vistos Recentemente",
"Load_More": "Carregar Mais",
"New_Keyword": "Nova Palavra Chave",
"Delete_Keyword": "Eliminar Palavra Chave",
"Edit_Keyword": "Editar Palavra Chave",
"Edit_Recipe": "Editar receita",
"Move_Keyword": "Mover palavra-chave",
"Merge_Keyword": "Unir palavra-chave",
"Hide_Keywords": "Esconder palavra-chave",
"Hide_Recipes": "Esconder Receitas",
"Move_Up": "Mover para cima",
"Move_Down": "Mover para baixo",
"Step_Name": "Nome do Passo",
"Step_Type": "Tipo do passo",
"Make_Header": "Tornar cabeçalho",
"Make_Ingredient": "Fazer ingrediente",
"Enable_Amount": "Ativar quantidade",
"Disable_Amount": "Desativar quantidade",
"Add_Step": "Adicionar passo",
"Keywords": "Palavras-chave",
"Books": "Livros",
"Proteins": "Proteínas",
"Fats": "Gorduras",
"Carbohydrates": "Carboidratos",
"Calories": "Calorias",
"Energy": "Energia",
"Nutrition": "Nutrição",
"Date": "Data",
"Share": "Partilhar",
"Automation": "Automação",
"Parameter": "Parâmetro",
"Export": "Exportar",
"Copy": "Copiar",
"Rating": "Avaliação",
"Close": "Fechar",
"Cancel": "Cancelar",
"Link": "Ligação",
"Add": "Adicionar",
"New": "Novo",
"Note": "Nota",
"Success": "Sucesso",
"Failure": "Falha",
"Ingredients": "Ingredientes",
"Supermarket": "Supermercado",
"Categories": "Categorias",
"Category": "Categoria",
"Selected": "Selecionado",
"min": "minimo",
"Servings": "Doses",
"Waiting": "Em espera",
"Preparation": "Preparação",
"External": "Externo",
"Size": "Tamanho",
"Files": "Ficheiros",
"File": "Ficheiro",
"Edit": "Editar",
"Image": "Image",
"Delete": "Apagar",
"Open": "Abrir",
"Ok": "Ok",
"Save": "Guardar",
"Step": "Passo",
"Search": "Pesquisar",
"Import": "Importar",
"Print": "Imprimir",
"Settings": "Definições",
"or": "ou",
"and": "e",
"Information": "Informação",
"Download": "Transferência",
"Create": "Criar",
"Search Settings": "Definições de Pesquisa",
"View": "Vista",
"Recipes": "Receitas",
"Move": "Mover",
"Merge": "Juntar",
"Parent": "Parente",
"delete_confirmation": "Tem a certeza que pretende eliminar {source}?",
"move_confirmation": "Mover <i> {child}</i>para parente <i>{parent}</i>",
"merge_confirmation": "Substituir <i>{source}</i> por <i>{target}</i>",
"create_rule": "e criar automação",
"move_selection": "Selecionar um parente {type} para mover {source} para.",
"merge_selection": "Substituir todas as ocorrências de {source} por {type}.",
"Root": "Raiz",
"Ignore_Shopping": "Ignorar compras",
"Shopping_Category": "Categoria de Compras",
"Shopping_Categories": "Categorias de Compras",
"Edit_Food": "Editar comida",
"Move_Food": "Mover comida",
"New_Food": "Nova comida",
"Hide_Food": "Esconder comida",
"Food_Alias": "Alcunha da comida",
"Unit_Alias": "Alcunha da unidade",
"Keyword_Alias": "Alcunha da palavra-chave",
"Delete_Food": "Eliminar comida",
"No_ID": "identificação não encontrada, impossível eliminar.",
"Meal_Plan_Days": "Planos de alimentação futuros",
"merge_title": "Unir {type}",
"move_title": "Mover {type}",
"Food": "Comida",
"Recipe_Book": "Livro de Receitas",
"del_confirmation_tree": "Tem a certeza que pretende eliminar {source} e todas as suas crianças?",
"delete_title": "Eliminar {type}",
"create_title": "Novo {type}",
"edit_title": "Editar {type}",
"Name": "Nome",
"Type": "Tipo",
"Description": "Descrição",
"Recipe": "Receita",
"tree_root": "Raiz da árvore",
"Icon": "Ícone",
"Unit": "Unidade",
"No_Results": "Sem resultados",
"New_Unit": "Nova Unidade",
"Create_New_Shopping Category": "Criar nova categoria de Compras",
"Create_New_Food": "Adicionar nova comida",
"Create_New_Keyword": "Adicionar nova palavra-chave",
"Create_New_Unit": "Adicionar nova unidade",
"Create_New_Meal_Type": "Adicionar novo tipo de refeição",
"and_up": "e para cima",
"and_down": "e para baixo",
"Instructions": "Instruções",
"Unrated": "Sem classificação",
"Automate": "Automatizar",
"Empty": "Esvaziar",
"Key_Ctrl": "Ctrl",
"Key_Shift": "Shift",
"Time": "tempo",
"Text": "Texto",
"Shopping_list": "Lista de Compras",
"Added_by": "Adicionado por",
"Added_on": "Adicionado a",
"AddToShopping": "Adicionar á lista de compras",
"IngredientInShopping": "Este ingrediente está na sua lista de compras.",
"NotInShopping": "{food} não está na sua lista de compras.",
"OnHand": "Atualmente disponível",
"FoodOnHand": "Tem {food} disponível.",
"FoodNotOnHand": "Não têm {food} disponível.",
"Undefined": "Não definido",
"Create_Meal_Plan_Entry": "Criar entrada para plano de refeições",
"Edit_Meal_Plan_Entry": "Editar entrada de plano de refeições",
"Title": "Título",
"Week": "Semana",
"Month": "Mês",
"Year": "Ano",
"Planner": "Planeador",
"Planner_Settings": "Definições do planeador",
"Period": "Período",
"Plan_Period_To_Show": "Mostrar semanas, meses ou anos",
"Periods": "Períodos",
"Plan_Show_How_Many_Periods": "Quantos períodos mostrar",
"Starting_Day": "Dia de início da semana",
"Meal_Types": "Tipos de refeições",
"Meal_Type": "Tipo de refeição",
"Clone": "Clonar",
"Drag_Here_To_Delete": "Arraste para aqui para eliminar",
"Meal_Type_Required": "Tipo de refeição é necessário",
"Title_or_Recipe_Required": "Título ou seleção de receitas é necessário",
"Color": "Cor",
"New_Meal_Type": "Novo tipo de refeição",
"AddFoodToShopping": "Adicionar {food} à sua lista de compras",
"RemoveFoodFromShopping": "Remover {food} da sua lista de compras",
"DeleteShoppingConfirm": "Tem a certeza que pretende remover toda {food} da sua lista de compras?",
"IgnoredFood": "{food} está definida para ignorar compras.",
"Add_Servings_to_Shopping": "Adicionar {servings} doses ás compras",
"Week_Numbers": "Números das semanas",
"Show_Week_Numbers": "Mostrar números das semanas?",
"Export_As_ICal": "Exportar período atual para o formato ICal",
"Export_To_ICal": "Exportar .ics",
"Cannot_Add_Notes_To_Shopping": "Notas não podem ser adicionadas à lista de compras",
"Added_To_Shopping_List": "Adicionado à lista de compras",
"Shopping_List_Empty": "A sua lista de compras encontra-se vazia, pode adicionar itens através do menu de contexto de um plano de refeições (carregar com o botão direito no cartão ou carregar com o botão esquerdo no ícone do menu)",
"Next_Period": "Próximo período",
"Previous_Period": "Período anterior",
"Current_Period": "Período atual",
"Next_Day": "Dia seguinte",
"Previous_Day": "Dia anterior",
"Inherit": "Herdado",
"InheritFields": "Campos herdados",
"FoodInherit": "Campos herdados por comida",
"ShowUncategorizedFood": "Mostrar não definidos",
"GroupBy": "Agrupar por",
"SupermarketCategoriesOnly": "Apenas categorias do supermercado",
"MoveCategory": "Mover para: ",
"CountMore": "...+{count} mais",
"IgnoreThis": "Nunca adicionar automaticamente {food} á lista de compras",
"DelayFor": "Atrasar por {hours} horas",
"Warning": "Aviso",
"NoCategory": "Nenhuma categoria selecionada.",
"InheritWarning": "{food} esta definida para herdar, alterações podem não persistir.",
"ShowDelayed": "Mostrar itens atrasados",
"Completed": "Completo",
"OfflineAlert": "Está offline, lista das compras poderá não sincronizar.",
"shopping_share": "Partilhar lista de compras",
"shopping_auto_sync": "Sincronização automática",
"mealplan_autoadd_shopping": "Adicionar automaticamente plano de refeições",
"mealplan_autoexclude_onhand": "Excluir comida disponível",
"mealplan_autoinclude_related": "Adicionar receitas relacionadas",
"default_delay": "Horas de atraso por padrão",
"shopping_share_desc": "Utilizadores poderão ver todos os itens que adicionar à sua lista de compras. Eles devem adicioná-lo para ver os itens na lista deles.",
"shopping_auto_sync_desc": "Definir a 0 irá desativar a sincronização automática. Quando se visualiza uma lista de compras a lista é atualizada após um número determinado de segundos para sincronizar com possíveis alterações feitas por outrem. Útil quando se partilha a lista de compras porém irá consumir dados móveis.",
"mealplan_autoadd_shopping_desc": "Adicionar automaticamente ingredientes do plano de refeições á lista de compras.",
"mealplan_autoexclude_onhand_desc": "",
"mealplan_autoinclude_related_desc": "",
"default_delay_desc": "",
@ -381,7 +381,7 @@
"create_food_desc": "Criar a comida e ligar a esta receita.",
"err_deleting_protected_resource": "O objeto que você está tentando deletar ainda está sendo utilizado, portanto não pode ser deletado.",
"food_inherit_info": "Campos no alimento que devem ser herdados por padrão.",
"warning_space_delete": "Você pode deletar seu espaço, inclusive todas as receitas, listas de mercado, planos de comida e tudo mais que você criou. Esta ação não poderá ser desfeita! Você tem certeza que quer fazer isto?",
"warning_space_delete": "Pode eliminar o seu espaço incluindo todas as receitas, listas de compras, planos de refeição e tudo o que tenha criado. Isto não pode ser desfeito! Tem a certeza que quer fazer isto?",
"facet_count_info": "Mostrar quantidade de receitas nos filtros de busca.",
"Plural": "",
"plural_short": "",
@ -389,5 +389,28 @@
"Use_Plural_Unit_Simple": "",
"Use_Plural_Food_Always": "",
"Use_Plural_Food_Simple": "",
"plural_usage_info": ""
"plural_usage_info": "",
"Protected": "Protegido",
"Copy Token": "Copiar Chave",
"Ingredient Editor": "Editor de Ingredientes",
"Amount": "Quantidade",
"plan_share_desc": "Novas entradas do plano de refeições serão automaticamente partilhadas com os utilizadores selecionados.",
"New_Entry": "Nova entrada",
"Decimals": "Casas decimais",
"Default_Unit": "Unidade padrão",
"Use_Fractions": "Usar frações",
"Use_Fractions_Help": "Converter automaticamente casas decimais para frações enquanto se visualiza uma receita.",
"Language": "Linguagem",
"Private_Recipe": "Receita Privada",
"Auto_Sort": "Classificação automática",
"Create_New_Shopping_Category": "Adicionar nova categoria de compras",
"Description_Replace": "Substituir descrição",
"Instruction_Replace": "Substituir Instrução",
"Auto_Sort_Help": "Mover todos os ingredientes para o passo mais indicado.",
"Private_Recipe_Help": "A receita só é mostrada ás pessoas com que foi partilhada.",
"reusable_help_text": "O link de convite poderá ser usado por mais do que um utilizador.",
"Copy Link": "Copiar Ligação",
"Theme": "Tema",
"one_url_per_line": "Um URL por linha",
"Original_Text": "Texto original"
}

View File

@ -183,10 +183,10 @@
json5 "^2.2.2"
semver "^6.3.0"
"@babel/eslint-parser@^7.19.1":
version "7.19.1"
resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.19.1.tgz#4f68f6b0825489e00a24b41b6a1ae35414ecd2f4"
integrity sha512-AqNf2QWt1rtu2/1rLswy6CDP7H9Oh3mMhk177Y67Rg8d7RD9WfOLLv8CGn6tisFvS2htm86yIe1yLF6I1UDaGQ==
"@babel/eslint-parser@^7.21.3":
version "7.21.3"
resolved "https://registry.yarnpkg.com/@babel/eslint-parser/-/eslint-parser-7.21.3.tgz#d79e822050f2de65d7f368a076846e7184234af7"
integrity sha512-kfhmPimwo6k4P8zxNs8+T7yR44q1LdpsZdE1NkCsVlfiuTPRfnGgjaF8Qgug9q9Pou17u6wneYF0lDCZJATMFg==
dependencies:
"@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1"
eslint-visitor-keys "^2.1.0"
@ -1160,6 +1160,18 @@
resolved "https://registry.yarnpkg.com/@emoji-mart/data/-/data-1.1.2.tgz#777c976f8f143df47cbb23a7077c9ca9fe5fc513"
integrity sha512-1HP8BxD2azjqWJvxIaWAMyTySeZY0Osr83ukYjltPVkNXeJvTz7yDrPLBtnrD5uqJ3tg4CcLuuBW09wahqL/fg==
"@eslint-community/eslint-utils@^4.2.0":
version "4.4.0"
resolved "https://registry.yarnpkg.com/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz#a23514e8fb9af1269d5f7788aa556798d61c6b59"
integrity sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==
dependencies:
eslint-visitor-keys "^3.3.0"
"@eslint-community/regexpp@^4.4.0":
version "4.4.1"
resolved "https://registry.yarnpkg.com/@eslint-community/regexpp/-/regexpp-4.4.1.tgz#087cb8d9d757bb22e9c9946c9c0c2bf8806830f1"
integrity sha512-BISJ6ZE4xQsuL/FmsyRaiffpq977bMlsKfGHTQrOGFErfByxIe6iZTxPf/00Zon9b9a7iUykfQwejN3s2ZW/Bw==
"@eslint/eslintrc@^0.4.3":
version "0.4.3"
resolved "https://registry.yarnpkg.com/@eslint/eslintrc/-/eslintrc-0.4.3.tgz#9e42981ef035beb3dd49add17acb96e8ff6f394c"
@ -1737,7 +1749,7 @@
ast-types "0.12.1"
recast "0.17.2"
"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.7", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
"@types/json-schema@*", "@types/json-schema@^7.0.4", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.11.tgz#d421b6c527a3037f7c84433fd2c4229e016863d3"
integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
@ -1867,148 +1879,88 @@
dependencies:
"@types/node" "*"
"@typescript-eslint/eslint-plugin@^4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.33.0.tgz#c24dc7c8069c7706bc40d99f6fa87edcb2005276"
integrity sha512-aINiAxGVdOl1eJyVjaWn/YcVAq4Gi/Yo35qHGCnqbWVz61g39D0h23veY/MA0rFFGfxK7TySg2uwDeNv+JgVpg==
"@typescript-eslint/eslint-plugin@^5.0.0", "@typescript-eslint/eslint-plugin@^5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.56.0.tgz#e4fbb4d6dd8dab3e733485c1a44a02189ae75364"
integrity sha512-ZNW37Ccl3oMZkzxrYDUX4o7cnuPgU+YrcaYXzsRtLB16I1FR5SHMqga3zGsaSliZADCWo2v8qHWqAYIj8nWCCg==
dependencies:
"@typescript-eslint/experimental-utils" "4.33.0"
"@typescript-eslint/scope-manager" "4.33.0"
debug "^4.3.1"
functional-red-black-tree "^1.0.1"
ignore "^5.1.8"
regexpp "^3.1.0"
semver "^7.3.5"
tsutils "^3.21.0"
"@typescript-eslint/eslint-plugin@^5.0.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.51.0.tgz#da3f2819633061ced84bb82c53bba45a6fe9963a"
integrity sha512-wcAwhEWm1RgNd7dxD/o+nnLW8oH+6RK1OGnmbmkj/GGoDPV1WWMVP0FXYQBivKHdwM1pwii3bt//RC62EriIUQ==
dependencies:
"@typescript-eslint/scope-manager" "5.51.0"
"@typescript-eslint/type-utils" "5.51.0"
"@typescript-eslint/utils" "5.51.0"
"@eslint-community/regexpp" "^4.4.0"
"@typescript-eslint/scope-manager" "5.56.0"
"@typescript-eslint/type-utils" "5.56.0"
"@typescript-eslint/utils" "5.56.0"
debug "^4.3.4"
grapheme-splitter "^1.0.4"
ignore "^5.2.0"
natural-compare-lite "^1.4.0"
regexpp "^3.2.0"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/experimental-utils@4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/experimental-utils/-/experimental-utils-4.33.0.tgz#6f2a786a4209fa2222989e9380b5331b2810f7fd"
integrity sha512-zeQjOoES5JFjTnAhI5QY7ZviczMzDptls15GFsI6jyUOq0kOf9+WonkhtlIhh0RgHRnqj5gdNxW5j1EvAyYg6Q==
"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.56.0.tgz#42eafb44b639ef1dbd54a3dbe628c446ca753ea6"
integrity sha512-sn1OZmBxUsgxMmR8a8U5QM/Wl+tyqlH//jTqCg8daTAmhAk26L2PFhcqPLlYBhYUJMZJK276qLXlHN3a83o2cg==
dependencies:
"@types/json-schema" "^7.0.7"
"@typescript-eslint/scope-manager" "4.33.0"
"@typescript-eslint/types" "4.33.0"
"@typescript-eslint/typescript-estree" "4.33.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
"@typescript-eslint/parser@^5.0.0", "@typescript-eslint/parser@^5.47.1":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/parser/-/parser-5.51.0.tgz#2d74626652096d966ef107f44b9479f02f51f271"
integrity sha512-fEV0R9gGmfpDeRzJXn+fGQKcl0inIeYobmmUWijZh9zA7bxJ8clPhV9up2ZQzATxAiFAECqPQyMDB4o4B81AaA==
dependencies:
"@typescript-eslint/scope-manager" "5.51.0"
"@typescript-eslint/types" "5.51.0"
"@typescript-eslint/typescript-estree" "5.51.0"
"@typescript-eslint/scope-manager" "5.56.0"
"@typescript-eslint/types" "5.56.0"
"@typescript-eslint/typescript-estree" "5.56.0"
debug "^4.3.4"
"@typescript-eslint/scope-manager@4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-4.33.0.tgz#d38e49280d983e8772e29121cf8c6e9221f280a3"
integrity sha512-5IfJHpgTsTZuONKbODctL4kKuQje/bzBRkwHE8UOZ4f89Zeddg+EGZs8PD8NcN4LdM3ygHWYB3ukPAYjvl/qbQ==
"@typescript-eslint/scope-manager@5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.56.0.tgz#62b4055088903b5254fa20403010e1c16d6ab725"
integrity sha512-jGYKyt+iBakD0SA5Ww8vFqGpoV2asSjwt60Gl6YcO8ksQ8s2HlUEyHBMSa38bdLopYqGf7EYQMUIGdT/Luw+sw==
dependencies:
"@typescript-eslint/types" "4.33.0"
"@typescript-eslint/visitor-keys" "4.33.0"
"@typescript-eslint/types" "5.56.0"
"@typescript-eslint/visitor-keys" "5.56.0"
"@typescript-eslint/scope-manager@5.51.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/scope-manager/-/scope-manager-5.51.0.tgz#ad3e3c2ecf762d9a4196c0fbfe19b142ac498990"
integrity sha512-gNpxRdlx5qw3yaHA0SFuTjW4rxeYhpHxt491PEcKF8Z6zpq0kMhe0Tolxt0qjlojS+/wArSDlj/LtE69xUJphQ==
"@typescript-eslint/type-utils@5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.56.0.tgz#e6f004a072f09c42e263dc50e98c70b41a509685"
integrity sha512-8WxgOgJjWRy6m4xg9KoSHPzBNZeQbGlQOH7l2QEhQID/+YseaFxg5J/DLwWSsi9Axj4e/cCiKx7PVzOq38tY4A==
dependencies:
"@typescript-eslint/types" "5.51.0"
"@typescript-eslint/visitor-keys" "5.51.0"
"@typescript-eslint/type-utils@5.51.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/type-utils/-/type-utils-5.51.0.tgz#7af48005531700b62a20963501d47dfb27095988"
integrity sha512-QHC5KKyfV8sNSyHqfNa0UbTbJ6caB8uhcx2hYcWVvJAZYJRBo5HyyZfzMdRx8nvS+GyMg56fugMzzWnojREuQQ==
dependencies:
"@typescript-eslint/typescript-estree" "5.51.0"
"@typescript-eslint/utils" "5.51.0"
"@typescript-eslint/typescript-estree" "5.56.0"
"@typescript-eslint/utils" "5.56.0"
debug "^4.3.4"
tsutils "^3.21.0"
"@typescript-eslint/types@4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-4.33.0.tgz#a1e59036a3b53ae8430ceebf2a919dc7f9af6d72"
integrity sha512-zKp7CjQzLQImXEpLt2BUw1tvOMPfNoTAfb8l51evhYbOEEzdWyQNmHWWGPR6hwKJDAi+1VXSBmnhL9kyVTTOuQ==
"@typescript-eslint/types@5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.56.0.tgz#b03f0bfd6fa2afff4e67c5795930aff398cbd834"
integrity sha512-JyAzbTJcIyhuUhogmiu+t79AkdnqgPUEsxMTMc/dCZczGMJQh1MK2wgrju++yMN6AWroVAy2jxyPcPr3SWCq5w==
"@typescript-eslint/types@5.51.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/types/-/types-5.51.0.tgz#e7c1622f46c7eea7e12bbf1edfb496d4dec37c90"
integrity sha512-SqOn0ANn/v6hFn0kjvLwiDi4AzR++CBZz0NV5AnusT2/3y32jdc0G4woXPWHCumWtUXZKPAS27/9vziSsC9jnw==
"@typescript-eslint/typescript-estree@4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-4.33.0.tgz#0dfb51c2908f68c5c08d82aefeaf166a17c24609"
integrity sha512-rkWRY1MPFzjwnEVHsxGemDzqqddw2QbTJlICPD9p9I9LfsO8fdmfQPOX3uKfUaGRDFJbfrtm/sXhVXN4E+bzCA==
"@typescript-eslint/typescript-estree@5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.56.0.tgz#48342aa2344649a03321e74cab9ccecb9af086c3"
integrity sha512-41CH/GncsLXOJi0jb74SnC7jVPWeVJ0pxQj8bOjH1h2O26jXN3YHKDT1ejkVz5YeTEQPeLCCRY0U2r68tfNOcg==
dependencies:
"@typescript-eslint/types" "4.33.0"
"@typescript-eslint/visitor-keys" "4.33.0"
debug "^4.3.1"
globby "^11.0.3"
is-glob "^4.0.1"
semver "^7.3.5"
tsutils "^3.21.0"
"@typescript-eslint/typescript-estree@5.51.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/typescript-estree/-/typescript-estree-5.51.0.tgz#0ec8170d7247a892c2b21845b06c11eb0718f8de"
integrity sha512-TSkNupHvNRkoH9FMA3w7TazVFcBPveAAmb7Sz+kArY6sLT86PA5Vx80cKlYmd8m3Ha2SwofM1KwraF24lM9FvA==
dependencies:
"@typescript-eslint/types" "5.51.0"
"@typescript-eslint/visitor-keys" "5.51.0"
"@typescript-eslint/types" "5.56.0"
"@typescript-eslint/visitor-keys" "5.56.0"
debug "^4.3.4"
globby "^11.1.0"
is-glob "^4.0.3"
semver "^7.3.7"
tsutils "^3.21.0"
"@typescript-eslint/utils@5.51.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.51.0.tgz#074f4fabd5b12afe9c8aa6fdee881c050f8b4d47"
integrity sha512-76qs+5KWcaatmwtwsDJvBk4H76RJQBFe+Gext0EfJdC3Vd2kpY2Pf//OHHzHp84Ciw0/rYoGTDnIAr3uWhhJYw==
"@typescript-eslint/utils@5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/utils/-/utils-5.56.0.tgz#db64705409b9a15546053fb4deb2888b37df1f41"
integrity sha512-XhZDVdLnUJNtbzaJeDSCIYaM+Tgr59gZGbFuELgF7m0IY03PlciidS7UQNKLE0+WpUTn1GlycEr6Ivb/afjbhA==
dependencies:
"@eslint-community/eslint-utils" "^4.2.0"
"@types/json-schema" "^7.0.9"
"@types/semver" "^7.3.12"
"@typescript-eslint/scope-manager" "5.51.0"
"@typescript-eslint/types" "5.51.0"
"@typescript-eslint/typescript-estree" "5.51.0"
"@typescript-eslint/scope-manager" "5.56.0"
"@typescript-eslint/types" "5.56.0"
"@typescript-eslint/typescript-estree" "5.56.0"
eslint-scope "^5.1.1"
eslint-utils "^3.0.0"
semver "^7.3.7"
"@typescript-eslint/visitor-keys@4.33.0":
version "4.33.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-4.33.0.tgz#2a22f77a41604289b7a186586e9ec48ca92ef1dd"
integrity sha512-uqi/2aSz9g2ftcHWf8uLPJA70rUv6yuMW5Bohw+bwcuzaxQIHaKFZCKGoGXIrc9vkTJ3+0txM73K0Hq3d5wgIg==
"@typescript-eslint/visitor-keys@5.56.0":
version "5.56.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.56.0.tgz#f19eb297d972417eb13cb69b35b3213e13cc214f"
integrity sha512-1mFdED7u5bZpX6Xxf5N9U2c18sb+8EvU3tyOIj6LQZ5OOvnmj8BVeNNP603OFPm5KkS1a7IvCIcwrdHXaEMG/Q==
dependencies:
"@typescript-eslint/types" "4.33.0"
eslint-visitor-keys "^2.0.0"
"@typescript-eslint/visitor-keys@5.51.0":
version "5.51.0"
resolved "https://registry.yarnpkg.com/@typescript-eslint/visitor-keys/-/visitor-keys-5.51.0.tgz#c0147dd9a36c0de758aaebd5b48cae1ec59eba87"
integrity sha512-Oh2+eTdjHjOFjKA27sxESlA87YPSOJafGCR0md5oeMdh1ZcCfAGCIOL216uTBAkAIptvLIfKQhl7lHxMJet4GQ==
dependencies:
"@typescript-eslint/types" "5.51.0"
"@typescript-eslint/types" "5.56.0"
eslint-visitor-keys "^3.3.0"
"@vue/babel-helper-vue-jsx-merge-props@^1.4.0":
@ -4368,10 +4320,10 @@ core-js@^2.4.0, core-js@^2.5.0:
resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
core-js@^3.23.5, core-js@^3.27.1, core-js@^3.6.0, core-js@^3.7.0, core-js@^3.8.3:
version "3.27.2"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.27.2.tgz#85b35453a424abdcacb97474797815f4d62ebbf7"
integrity sha512-9ashVQskuh5AZEZ1JdQWp1GqSoC1e1G87MzRqg2gIfVAQ7Qn9K+uFj8EcniUFA4P2NLZfV+TOlX1SzoKfo+s7w==
core-js@^3.23.5, core-js@^3.29.1, core-js@^3.6.0, core-js@^3.7.0, core-js@^3.8.3:
version "3.29.1"
resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.29.1.tgz#40ff3b41588b091aaed19ca1aa5cb111803fa9a6"
integrity sha512-+jwgnhg6cQxKYIIjGtAHq2nwUOolo9eoFZ4sHfUH09BLXBgxnH4gA0zEd+t+BO2cNB8idaBtZFcFTRjQJRJmAw==
core-util-is@~1.0.0:
version "1.0.3"
@ -4652,7 +4604,7 @@ debug@^3.2.7:
dependencies:
ms "^2.1.1"
debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.0, debug@^4.3.1, debug@^4.3.2, debug@^4.3.4:
debug@^4.0.1, debug@^4.1.0, debug@^4.1.1, debug@^4.3.0, debug@^4.3.2, debug@^4.3.4:
version "4.3.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-4.3.4.tgz#1319f6579357f2338d3337d2cdd4914bb5dcc865"
integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
@ -6407,7 +6359,7 @@ hash.js@^1.0.0, hash.js@^1.0.3:
inherits "^2.0.3"
minimalistic-assert "^1.0.1"
he@^1.1.0, he@^1.2.0:
he@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f"
integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==
@ -6618,7 +6570,7 @@ ignore@^4.0.6:
resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc"
integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==
ignore@^5.1.8, ignore@^5.2.0:
ignore@^5.2.0:
version "5.2.4"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-5.2.4.tgz#a291c0c6178ff1b960befe47fcdec301674a6324"
integrity sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==
@ -9346,7 +9298,7 @@ regexp.prototype.flags@^1.4.3:
define-properties "^1.1.3"
functions-have-names "^1.2.2"
regexpp@^3.1.0, regexpp@^3.2.0:
regexpp@^3.1.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-3.2.0.tgz#0425a2768d8f23bad70ca4b90461fa2f1213e1b2"
integrity sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==
@ -11250,13 +11202,13 @@ vue-style-loader@^4.1.0, vue-style-loader@^4.1.3:
hash-sum "^1.0.2"
loader-utils "^1.0.2"
vue-template-compiler@2.6.14:
version "2.6.14"
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.14.tgz#a2f0e7d985670d42c9c9ee0d044fed7690f4f763"
integrity sha512-ODQS1SyMbjKoO1JBJZojSw6FE4qnh9rIpUZn2EUT86FKizx9uH5z6uXiIrm4/Nb/gwxTi/o17ZDEGWAXHvtC7g==
vue-template-compiler@2.7.14:
version "2.7.14"
resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.7.14.tgz#4545b7dfb88090744c1577ae5ac3f964e61634b1"
integrity sha512-zyA5Y3ArvVG0NacJDkkzJuPQDF8RFeRlzV2vLeSnhSpieO6LK2OVbdLPi5MPPs09Ii+gMO8nY4S3iKQxBxDmWQ==
dependencies:
de-indent "^1.0.2"
he "^1.1.0"
he "^1.2.0"
vue-template-es2015-compiler@^1.9.0:
version "1.9.1"
@ -11353,10 +11305,10 @@ webpack-bundle-analyzer@^4.4.0:
sirv "^1.0.7"
ws "^7.3.1"
webpack-bundle-tracker@1.8.0:
version "1.8.0"
resolved "https://registry.yarnpkg.com/webpack-bundle-tracker/-/webpack-bundle-tracker-1.8.0.tgz#18135492d74e7cff56e87306bfbe7d7b17171537"
integrity sha512-5SihX9O+wZVzAvxKIHEW18zTd2BBy5AqV7lMdkKTHd+sQFMpDKNmTcFt6ZgaiV47Db3zB2I0l6MO2pmc2ob+Gg==
webpack-bundle-tracker@1.8.1:
version "1.8.1"
resolved "https://registry.yarnpkg.com/webpack-bundle-tracker/-/webpack-bundle-tracker-1.8.1.tgz#d1cdbd62da622abe1243f099657af86a6ca2656d"
integrity sha512-X1qtXG4ue92gjWQO2VhLVq8HDEf9GzUWE0OQyAQObVEZsFB1SUtSQ7o47agF5WZIaHfJUTKak4jEErU0gzoPcQ==
dependencies:
lodash.assign "^4.2.0"
lodash.defaults "^4.2.0"