-Timo Van Neerden
-Timo Van Neerden lehollandaisvolant
-VirtualTam
-VirtualTam
-VirtualTam
-Willi Eggeling
-Willi Eggeling
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
deleted file mode 100644
index 378b9512..00000000
--- a/.github/workflows/ci.yml
+++ /dev/null
@@ -1,106 +0,0 @@
-name: Shaarli CI
-on: [push, pull_request]
-jobs:
- php:
- runs-on: ubuntu-latest
- strategy:
- fail-fast: false
- matrix:
- php-versions: ['7.4', '8.0', '8.1', '8.2']
- name: PHP ${{ matrix.php-versions }}
- steps:
- - name: Set locales
- run: |
- sudo locale-gen de_DE.utf8 && \
- sudo locale-gen en_US.utf8 && \
- sudo locale-gen fr_FR.utf8 && \
- sudo dpkg-reconfigure --frontend=noninteractive locales
-
- - name: Install Gettext
- run: sudo apt-get install gettext
-
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Setup PHP
- uses: shivammathur/setup-php@v2
- with:
- php-version: ${{ matrix.php-versions }}
- extensions: gd, xml, curl, mbstring, intl, gettext
- tools: composer:v2
-
- - name: Check PHP version
- run: php -v
-
- - name: Setup Composer from PHP version + update
- run: composer config --unset platform && composer config platform.php ${{ matrix.php-versions }}
-
- - name: Update dependencies for PHP 8.x
- if: ${{ matrix.php-versions == '8.0' || matrix.php-versions == '8.1' }}
- run: |
- composer update && \
- composer remove --dev phpunit/phpunit && \
- composer require --dev phpunit/php-text-template ^2.0 && \
- composer require --dev phpunit/phpunit ^9.0
-
- - name: Update dependencies for PHP 7.x
- if: ${{ matrix.php-versions != '8.0' && matrix.php-versions != '8.1' }}
- run: composer update
-
- - name: Clean up
- run: make clean
-
- - name: Check permissions
- run: make check_permissions
-
- - name: Run PHPCS
- run: make code_sniffer
-
- - name: Run tests
- run: make all_tests
-
- node:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Setup Node.js
- uses: actions/setup-node@v3
- with:
- node-version: '14.x'
-
- - name: Yarn install
- run: yarnpkg install
-
- - name: Verify successful frontend builds
- run: yarnpkg run build
-
- - name: JS static analysis
- run: make eslint
-
- - name: Linter for SASS syntax
- run: make sasslint
-
- python:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Setup Python
- uses: actions/setup-python@v4
- with:
- python-version: 3.8
-
- - name: Build documentation
- run: make htmldoc
-
- trivy-repo:
- runs-on: ubuntu-latest
- steps:
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Run trivy scanner on repository (non-blocking)
- run: make test_trivy_repo TRIVY_EXIT_CODE=0
diff --git a/.github/workflows/docker-latest.yml b/.github/workflows/docker-latest.yml
deleted file mode 100644
index ad885b6a..00000000
--- a/.github/workflows/docker-latest.yml
+++ /dev/null
@@ -1,45 +0,0 @@
-name: Build/push Docker image (master/latest)
-on:
- push:
- branches: [ master ]
-jobs:
- docker-build:
- runs-on: ubuntu-latest
- steps:
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v2
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- - name: Login to DockerHub
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
- - name: Login to GitHub Container Registry
- uses: docker/login-action@v2
- with:
- registry: ghcr.io
- username: ${{ github.repository_owner }}
- password: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Checkout
- uses: actions/checkout@v3
-
- - name: Set shaarli version to the latest commit hash
- run: sed -i "s/dev/$(git rev-parse --short HEAD)/" shaarli_version.php
-
- - name: Build and push
- id: docker_build
- uses: docker/build-push-action@v4
- with:
- context: .
- push: true
- platforms: linux/amd64,linux/arm64,linux/arm/v7
- tags: |
- ${{ secrets.DOCKER_IMAGE }}:latest
- ghcr.io/${{ secrets.DOCKER_IMAGE }}:latest
- - name: Image digest
- run: echo ${{ steps.docker_build.outputs.digest }}
- - name: Run trivy scanner on latest docker image
- run: make test_trivy_docker TRIVY_TARGET_DOCKER_IMAGE=ghcr.io/${{ secrets.DOCKER_IMAGE }}:latest
diff --git a/.github/workflows/docker-pr.yml b/.github/workflows/docker-pr.yml
deleted file mode 100644
index 16adede9..00000000
--- a/.github/workflows/docker-pr.yml
+++ /dev/null
@@ -1,21 +0,0 @@
-name: Build Docker image (Pull Request)
-on:
- pull_request:
- branches: [ master ]
-
-jobs:
- docker-build:
- runs-on: ubuntu-latest
- steps:
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v1
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v1
- - name: Build Docker image
- id: docker_build
- uses: docker/build-push-action@v2
- with:
- push: false
- tags: shaarli/shaarli:pr-${{ github.event.number }}
- - name: Image digest
- run: echo ${{ steps.docker_build.outputs.digest }}
diff --git a/.github/workflows/docker-tags.yml b/.github/workflows/docker-tags.yml
deleted file mode 100644
index b9412f52..00000000
--- a/.github/workflows/docker-tags.yml
+++ /dev/null
@@ -1,43 +0,0 @@
-name: Build/push Docker image (tags/releases)
-on:
- push:
- tags:
- - "v*.*.*"
- branches:
- - "v*.*"
- - release
-jobs:
- docker-build:
- runs-on: ubuntu-latest
- steps:
- - name: Get the tag name
- run: echo "REF=${GITHUB_REF##*/}" >> $GITHUB_ENV
- - name: Set up QEMU
- uses: docker/setup-qemu-action@v2
- - name: Set up Docker Buildx
- uses: docker/setup-buildx-action@v2
-
- - name: Login to DockerHub
- uses: docker/login-action@v2
- with:
- username: ${{ secrets.DOCKERHUB_USERNAME }}
- password: ${{ secrets.DOCKERHUB_TOKEN }}
- -
- name: Login to GitHub Container Registry
- uses: docker/login-action@v2
- with:
- registry: ghcr.io
- username: ${{ github.repository_owner }}
- password: ${{ secrets.GITHUB_TOKEN }}
-
- - name: Build and push
- id: docker_build
- uses: docker/build-push-action@v3
- with:
- push: true
- platforms: linux/amd64,linux/arm/v7
- tags: |
- ${{ secrets.DOCKER_IMAGE }}:${{ env.REF }}
- ghcr.io/${{ secrets.DOCKER_IMAGE }}:${{ env.REF }}
- - name: Image digest
- run: echo ${{ steps.docker_build.outputs.digest }}
diff --git a/Dockerfile b/Dockerfile
deleted file mode 100644
index 8e995a6a..00000000
--- a/Dockerfile
+++ /dev/null
@@ -1,74 +0,0 @@
-# Stage 1:
-# - Copy Shaarli sources
-# - Build documentation
-FROM python:3-alpine as docs
-ADD . /usr/src/app/shaarli
-RUN cd /usr/src/app/shaarli \
- && apk add --no-cache gcc musl-dev make bash \
- && make htmldoc
-
-# Stage 2:
-# - Resolve PHP dependencies with Composer
-FROM composer:latest as composer
-COPY --from=docs /usr/src/app/shaarli /app/shaarli
-RUN cd shaarli \
- && composer --prefer-dist --no-dev install
-
-# Stage 3:
-# - Frontend dependencies
-FROM node:12-alpine as node
-COPY --from=composer /app/shaarli shaarli
-RUN cd shaarli \
- && yarnpkg install \
- && yarnpkg run build \
- && rm -rf node_modules
-
-# Stage 4:
-# - Shaarli image
-FROM alpine:3.16.7
-LABEL maintainer="Shaarli Community"
-
-RUN apk --update --no-cache add \
- ca-certificates \
- nginx \
- php8 \
- php8-ctype \
- php8-curl \
- php8-fpm \
- php8-gd \
- php8-gettext \
- php8-iconv \
- php8-intl \
- php8-json \
- php8-ldap \
- php8-mbstring \
- php8-openssl \
- php8-session \
- php8-xml \
- php8-simplexml \
- php8-zlib \
- s6
-
-COPY .docker/nginx.conf /etc/nginx/nginx.conf
-COPY .docker/php-fpm.conf /etc/php8/php-fpm.conf
-COPY .docker/services.d /etc/services.d
-
-RUN rm -rf /etc/php8/php-fpm.d/www.conf \
- && sed -i 's/post_max_size.*/post_max_size = 10M/' /etc/php8/php.ini \
- && sed -i 's/upload_max_filesize.*/upload_max_filesize = 10M/' /etc/php8/php.ini
-
-
-WORKDIR /var/www
-COPY --from=node /shaarli shaarli
-
-RUN chown -R nginx:nginx . \
- && ln -sf /dev/stdout /var/log/nginx/shaarli.access.log \
- && ln -sf /dev/stderr /var/log/nginx/shaarli.error.log
-
-VOLUME /var/www/shaarli/cache
-VOLUME /var/www/shaarli/data
-
-EXPOSE 80
-
-ENTRYPOINT ["/bin/s6-svscan", "/etc/services.d"]
-CMD []
diff --git a/Makefile b/Makefile
deleted file mode 100644
index 8f8d335b..00000000
--- a/Makefile
+++ /dev/null
@@ -1,215 +0,0 @@
-# The personal, minimalist, super fast, database-free, bookmarking service.
-# Makefile for PHP code analysis & testing, documentation and release generation
-
-BIN = vendor/bin
-
-all: check_permissions test
-
-##
-# Docker test adapter
-#
-# Shaarli sources and vendored libraries are copied from a shared volume
-# to a user-owned directory to enable running tests as a non-root user.
-##
-docker_%:
- rsync -az /shaarli/ ~/shaarli/
- cd ~/shaarli && make $*
-
-##
-# PHP_CodeSniffer
-# Detects PHP syntax errors
-# Documentation (usage, output formatting):
-# - http://pear.php.net/manual/en/package.php.php-codesniffer.usage.php
-# - http://pear.php.net/manual/en/package.php.php-codesniffer.reporting.php
-##
-PHPCS := $(BIN)/phpcs
-
-# Use GNU Tar where available
-ifneq (, $(shell which gtar))
-TAR := gtar
-else
-TAR := tar
-endif
-
-code_sniffer:
- @$(PHPCS)
-
-### - errors by Git author
-code_sniffer_blame:
- @$(PHPCS) --report-gitblame
-
-### - all errors/warnings
-code_sniffer_full:
- @$(PHPCS) --report-full --report-width=200
-
-### - errors grouped by kind
-code_sniffer_source:
- @$(PHPCS) --report-source || exit 0
-
-##
-# Checks source file & script permissions
-##
-check_permissions:
- @echo "----------------------"
- @echo "Check file permissions"
- @echo "----------------------"
- @for file in `git ls-files | grep -v docker`; do \
- if [ -x $$file ]; then \
- errors=true; \
- echo "$${file} is executable"; \
- fi \
- done; [ -z $$errors ] || false
-
-##
-# PHPUnit
-# Runs unitary and functional tests
-# Generates an HTML coverage report if Xdebug is enabled
-#
-# See phpunit.xml for configuration
-# https://phpunit.de/manual/current/en/appendixes.configuration.html
-##
-test: translate
- @echo "-------"
- @echo "PHPUNIT"
- @echo "-------"
- @mkdir -p sandbox coverage
- @$(BIN)/phpunit --coverage-php coverage/main.cov --bootstrap tests/bootstrap.php --testsuite unit-tests
-
-locale_test_%:
- @UT_LOCALE=$*.utf8 \
- $(BIN)/phpunit \
- --coverage-php coverage/$(firstword $(subst _, ,$*)).cov \
- --bootstrap tests/languages/bootstrap.php \
- --testsuite language-$(firstword $(subst _, ,$*))
-
-all_tests: test locale_test_de_DE locale_test_en_US locale_test_fr_FR
- @# --The current version is not compatible with PHP 7.2
- @#$(BIN)/phpcov merge --html coverage coverage
- @# --text doesn't work with phpunit 4.* (v5 requires PHP 5.6)
- @#$(BIN)/phpcov merge --text coverage/txt coverage
-
-### download 3rd-party PHP libraries, including dev dependencies
-composer_dependencies_dev: clean
- composer install --prefer-dist
-
-##
-# Custom release archive generation
-#
-# For each tagged revision, GitHub provides tar and zip archives that correspond
-# to the output of git-archive
-#
-# These targets produce similar archives, featuring 3rd-party dependencies
-# to ease deployment on shared hosting.
-##
-ARCHIVE_VERSION := shaarli-$$(git describe)-full
-ARCHIVE_PREFIX=Shaarli/
-
-release_archive: release_tar release_zip
-
-### download 3rd-party PHP libraries
-composer_dependencies: clean
- composer install --no-dev --prefer-dist
- find vendor/ -name ".git" -type d -exec rm -rf {} +
-
-### download 3rd-party frontend libraries
-frontend_dependencies:
- yarnpkg install
-
-### Build frontend dependencies
-build_frontend: frontend_dependencies
- yarnpkg run build
-
-### generate a release tarball and include 3rd-party dependencies and translations
-release_tar: composer_dependencies htmldoc translate build_frontend
- git archive --prefix=$(ARCHIVE_PREFIX) -o $(ARCHIVE_VERSION).tar HEAD
- $(TAR) rvf $(ARCHIVE_VERSION).tar --transform "s|^vendor|$(ARCHIVE_PREFIX)vendor|" vendor/
- $(TAR) rvf $(ARCHIVE_VERSION).tar --transform "s|^doc/html|$(ARCHIVE_PREFIX)doc/html|" doc/html/
- $(TAR) rvf $(ARCHIVE_VERSION).tar --transform "s|^tpl|$(ARCHIVE_PREFIX)tpl|" tpl/
- gzip $(ARCHIVE_VERSION).tar
-
-### generate a release zip and include 3rd-party dependencies and translations
-release_zip: composer_dependencies htmldoc translate build_frontend
- git archive --prefix=$(ARCHIVE_PREFIX) -o $(ARCHIVE_VERSION).zip -9 HEAD
- mkdir -p $(ARCHIVE_PREFIX)/doc
- mkdir -p $(ARCHIVE_PREFIX)/vendor
- rsync -a doc/html/ $(ARCHIVE_PREFIX)doc/html/
- zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)doc/
- rsync -a vendor/ $(ARCHIVE_PREFIX)vendor/
- zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)vendor/
- rsync -a tpl/ $(ARCHIVE_PREFIX)tpl/
- zip -r $(ARCHIVE_VERSION).zip $(ARCHIVE_PREFIX)tpl/
- rm -rf $(ARCHIVE_PREFIX)
-
-##
-# Targets for repository and documentation maintenance
-##
-
-### remove all unversioned files
-clean:
- @git clean -df
- @rm -rf sandbox trivy*
-
-### generate the AUTHORS file from Git commit information
-generate_authors:
- @cp .github/mailmap .mailmap
- @git shortlog -sne > AUTHORS
- @rm .mailmap
-
-### generate phpDocumentor documentation
-phpdoc: clean
- @docker run --rm -v $(PWD):/data -u `id -u`:`id -g` phpdoc/phpdoc
-
-### generate HTML documentation from Markdown pages with Sphinx
-htmldoc:
- python3 -m venv venv/
- bash -c 'source venv/bin/activate; \
- pip install wheel; \
- pip install sphinx==7.1.0 furo==2023.7.26 myst-parser sphinx-design; \
- sphinx-build -b html -c doc/ doc/md/ doc/html/'
- find doc/html/ -type f -exec chmod a-x '{}' \;
- rm -r venv
-
-### Generate Shaarli's translation compiled file (.mo)
-translate:
- @echo "----------------------"
- @echo "Compile translation files"
- @echo "----------------------"
- @for pofile in `find inc/languages/ -name shaarli.po`; do \
- echo "Compiling $$pofile"; \
- msgfmt -v "$$pofile" -o "`dirname "$$pofile"`/`basename "$$pofile" .po`.mo"; \
- done;
-
-### Run ESLint check against Shaarli's JS files
-eslint:
- @yarnpkg run eslint -c .dev/.eslintrc.js assets/vintage/js/
- @yarnpkg run eslint -c .dev/.eslintrc.js assets/default/js/
- @yarnpkg run eslint -c .dev/.eslintrc.js assets/common/js/
-
-### Run CSSLint check against Shaarli's SCSS files
-sasslint:
- @yarnpkg run stylelint --config .dev/.stylelintrc.js 'assets/default/scss/*.scss'
-
-##
-# Security scans
-##
-
-# trivy version (https://github.com/aquasecurity/trivy/releases)
-TRIVY_VERSION=0.44.0
-# default trivy exit code when vulnerabilities are found
-TRIVY_EXIT_CODE=1
-# default docker image to scan with trivy
-TRIVY_TARGET_DOCKER_IMAGE=ghcr.io/shaarli/shaarli:latest
-
-### download trivy vulneravbility scanner
-download_trivy:
- wget --quiet --continue -O trivy_$(TRIVY_VERSION)_Linux-64bit.tar.gz https://github.com/aquasecurity/trivy/releases/download/v$(TRIVY_VERSION)/trivy_$(TRIVY_VERSION)_Linux-64bit.tar.gz
- tar -z -x trivy -f trivy_$(TRIVY_VERSION)_Linux-64bit.tar.gz
-
-### run trivy vulnerability scanner on docker image
-test_trivy_docker: download_trivy
- ./trivy --exit-code $(TRIVY_EXIT_CODE) image $(TRIVY_TARGET_DOCKER_IMAGE)
-
-### run trivy vulnerability scanner on composer/yarn dependency trees
-test_trivy_repo: download_trivy
- ./trivy --exit-code $(TRIVY_EXIT_CODE) fs composer.lock
- ./trivy --exit-code $(TRIVY_EXIT_CODE) fs yarn.lock
diff --git a/docker-compose.yml b/docker-compose.yml
deleted file mode 100644
index c39b91fa..00000000
--- a/docker-compose.yml
+++ /dev/null
@@ -1,62 +0,0 @@
----
-# Shaarli - Docker Compose example configuration
-#
-# See:
-# - https://shaarli.readthedocs.io/en/master/Docker/#docker-compose
-#
-# Environment variables:
-# - SHAARLI_VIRTUAL_HOST Fully Qualified Domain Name for the Shaarli instance
-# - SHAARLI_LETSENCRYPT_EMAIL Contact email for certificate renewal
-# - SHAARLI_DOCKER_TAG Shaarli docker tag to use
-# See: https://github.com/shaarli/Shaarli/pkgs/container/shaarli/versions?filters%5Bversion_type%5D=tagged
-version: '3'
-
-networks:
- http-proxy:
-
-volumes:
- traefik-acme:
- shaarli-cache:
- shaarli-data:
-
-services:
- shaarli:
- image: ghcr.io/shaarli/shaarli:${SHAARLI_DOCKER_TAG}
- build: ./
- networks:
- - http-proxy
- volumes:
- - shaarli-cache:/var/www/shaarli/cache
- - shaarli-data:/var/www/shaarli/data
- labels:
- traefik.domain: "${SHAARLI_VIRTUAL_HOST}"
- traefik.backend: shaarli
- traefik.frontend.rule: "Host:${SHAARLI_VIRTUAL_HOST}"
-
- traefik:
- image: traefik:1.7-alpine
- command:
- - "--defaultentrypoints=http,https"
- - "--entrypoints=Name:http Address::80 Redirect.EntryPoint:https"
- - "--entrypoints=Name:https Address::443 TLS"
- - "--retry"
- - "--docker"
- - "--docker.domain=${SHAARLI_VIRTUAL_HOST}"
- - "--docker.exposedbydefault=true"
- - "--docker.watch=true"
- - "--acme"
- - "--acme.domains=${SHAARLI_VIRTUAL_HOST}"
- - "--acme.email=${SHAARLI_LETSENCRYPT_EMAIL}"
- - "--acme.entrypoint=https"
- - "--acme.onhostrule=true"
- - "--acme.storage=/acme/acme.json"
- - "--acme.httpchallenge"
- - "--acme.httpchallenge.entrypoint=http"
- networks:
- - http-proxy
- ports:
- - 80:80
- - 443:443
- volumes:
- - /var/run/docker.sock:/var/run/docker.sock:ro
- - traefik-acme:/acme
diff --git a/package-lock.json b/package-lock.json
deleted file mode 100644
index f381ea41..00000000
--- a/package-lock.json
+++ /dev/null
@@ -1,7486 +0,0 @@
-{
- "name": "shaarli",
- "lockfileVersion": 3,
- "requires": true,
- "packages": {
- "": {
- "name": "shaarli",
- "license": "SEE LICENSE IN COPYING",
- "dependencies": {
- "awesomplete": "^1.1.2",
- "blazy": "^1.8.2",
- "fork-awesome": "^1.1.7",
- "he": "^1.2.0",
- "pure-extras": "^1.0.0",
- "purecss": "^1.0.0"
- },
- "devDependencies": {
- "@babel/core": "^7.11.6",
- "@babel/preset-env": "^7.11.5",
- "babel-loader": "^8.1.0",
- "css-loader": "^7.1.2",
- "eslint": "^7.9.0",
- "eslint-config-airbnb-base": "^14.2.0",
- "eslint-plugin-import": "^2.22.0",
- "file-loader": "^1.1.6",
- "mini-css-extract-plugin": "^0.11.2",
- "sass": "^1.26.11",
- "sass-loader": "^10.0.2",
- "stylelint": "^16.6.1",
- "stylelint-config-standard": "^20.0.0",
- "stylelint-scss": "^6.3.2",
- "terser-webpack-plugin": "^4.2.2",
- "webpack": "^5.92.1",
- "webpack-cli": "^5.1.4"
- }
- },
- "node_modules/@babel/code-frame": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
- "integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/highlight": "^7.12.13"
- }
- },
- "node_modules/@babel/compat-data": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.14.0.tgz",
- "integrity": "sha512-vu9V3uMM/1o5Hl5OekMUowo3FqXLJSw+s+66nt0fSWVWTtmosdzn45JHOB3cPtZoe6CTBDzvSw0RdOY85Q37+Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@babel/core": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.14.0.tgz",
- "integrity": "sha512-8YqpRig5NmIHlMLw09zMlPTvUVMILjqCOtVgu+TVNWEBvy9b5I3RRyhqnrV4hjgEK7n8P9OqvkWJAFmEL6Wwfw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@babel/generator": "^7.14.0",
- "@babel/helper-compilation-targets": "^7.13.16",
- "@babel/helper-module-transforms": "^7.14.0",
- "@babel/helpers": "^7.14.0",
- "@babel/parser": "^7.14.0",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0",
- "convert-source-map": "^1.7.0",
- "debug": "^4.1.0",
- "gensync": "^1.0.0-beta.2",
- "json5": "^2.1.2",
- "semver": "^6.3.0",
- "source-map": "^0.5.0"
- },
- "engines": {
- "node": ">=6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/babel"
- }
- },
- "node_modules/@babel/core/node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/@babel/core/node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@babel/generator": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.14.1.tgz",
- "integrity": "sha512-TMGhsXMXCP/O1WtQmZjpEYDhCYC9vFhayWZPJSZCGkPJgUqX0rF0wwtrYvnzVxIjcF80tkUertXVk5cwqi5cAQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.14.1",
- "jsesc": "^2.5.1",
- "source-map": "^0.5.0"
- }
- },
- "node_modules/@babel/generator/node_modules/source-map": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
- "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/@babel/helper-annotate-as-pure": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.12.13.tgz",
- "integrity": "sha512-7YXfX5wQ5aYM/BOlbSccHDbuXXFPxeoUmfWtz8le2yTkTZc+BxsiEnENFoi2SlmA8ewDkG2LgIMIVzzn2h8kfw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.12.13.tgz",
- "integrity": "sha512-CZOv9tGphhDRlVjVkAgm8Nhklm9RzSmWpX2my+t7Ua/KT616pEzXsQCjinzvkRvHWJ9itO4f296efroX23XCMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-explode-assignable-expression": "^7.12.13",
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/helper-compilation-targets": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.16.tgz",
- "integrity": "sha512-3gmkYIrpqsLlieFwjkGgLaSHmhnvlAYzZLlYVjlW+QwI+1zE17kGxuJGmIqDQdYp56XdmGeD+Bswx0UTyG18xA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.13.15",
- "@babel/helper-validator-option": "^7.12.17",
- "browserslist": "^4.14.5",
- "semver": "^6.3.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-class-features-plugin": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.14.1.tgz",
- "integrity": "sha512-r8rsUahG4ywm0QpGcCrLaUSOuNAISR3IZCg4Fx05Ozq31aCUrQsTLH6KPxy0N5ULoQ4Sn9qjNdGNtbPWAC6hYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.12.13",
- "@babel/helper-function-name": "^7.12.13",
- "@babel/helper-member-expression-to-functions": "^7.13.12",
- "@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/helper-replace-supers": "^7.13.12",
- "@babel/helper-split-export-declaration": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-create-regexp-features-plugin": {
- "version": "7.12.17",
- "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.12.17.tgz",
- "integrity": "sha512-p2VGmBu9oefLZ2nQpgnEnG0ZlRPvL8gAGvPUMQwUdaE8k49rOMuZpOwdQoy5qJf6K8jL3bcAMhVUlHAjIgJHUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.12.13",
- "regexpu-core": "^4.7.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/helper-define-polyfill-provider": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.2.0.tgz",
- "integrity": "sha512-JT8tHuFjKBo8NnaUbblz7mIu1nnvUDiHVjXXkulZULyidvo/7P6TY7+YqpV37IfF+KUFxmlK04elKtGKXaiVgw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-compilation-targets": "^7.13.0",
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/traverse": "^7.13.0",
- "debug": "^4.1.1",
- "lodash.debounce": "^4.0.8",
- "resolve": "^1.14.2",
- "semver": "^6.1.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.4.0-0"
- }
- },
- "node_modules/@babel/helper-environment-visitor": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz",
- "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-explode-assignable-expression": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.13.0.tgz",
- "integrity": "sha512-qS0peLTDP8kOisG1blKbaoBg/o9OSa1qoumMjTK5pM+KDTtpxpsiubnCGP34vK8BXGcb2M9eigwgvoJryrzwWA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.13.0"
- }
- },
- "node_modules/@babel/helper-function-name": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
- "integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-get-function-arity": "^7.12.13",
- "@babel/template": "^7.12.13",
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/helper-get-function-arity": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
- "integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/helper-hoist-variables": {
- "version": "7.13.16",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.13.16.tgz",
- "integrity": "sha512-1eMtTrXtrwscjcAeO4BVK+vvkxaLJSPFz1w1KLawz6HLNi9bPFGBNwwDyVfiu1Tv/vRRFYfoGaKhmAQPGPn5Wg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/traverse": "^7.13.15",
- "@babel/types": "^7.13.16"
- }
- },
- "node_modules/@babel/helper-member-expression-to-functions": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
- "integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.13.12"
- }
- },
- "node_modules/@babel/helper-module-imports": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
- "integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.13.12"
- }
- },
- "node_modules/@babel/helper-module-transforms": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.14.0.tgz",
- "integrity": "sha512-L40t9bxIuGOfpIGA3HNkJhU9qYrf4y5A5LUSw7rGMSn+pcG8dfJ0g6Zval6YJGd2nEjI7oP00fRdnhLKndx6bw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.13.12",
- "@babel/helper-replace-supers": "^7.13.12",
- "@babel/helper-simple-access": "^7.13.12",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "@babel/helper-validator-identifier": "^7.14.0",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0"
- }
- },
- "node_modules/@babel/helper-optimise-call-expression": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
- "integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/helper-plugin-utils": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.13.0.tgz",
- "integrity": "sha512-ZPafIPSwzUlAoWT8DKs1W2VyF2gOWthGd5NGFMsBcMMol+ZhK+EQY/e6V96poa6PA/Bh+C9plWN0hXO1uB8AfQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@babel/helper-remap-async-to-generator": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.13.0.tgz",
- "integrity": "sha512-pUQpFBE9JvC9lrQbpX0TmeNIy5s7GnZjna2lhhcHC7DzgBs6fWn722Y5cfwgrtrqc7NAJwMvOa0mKhq6XaE4jg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.12.13",
- "@babel/helper-wrap-function": "^7.13.0",
- "@babel/types": "^7.13.0"
- }
- },
- "node_modules/@babel/helper-replace-supers": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
- "integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-member-expression-to-functions": "^7.13.12",
- "@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.12"
- }
- },
- "node_modules/@babel/helper-simple-access": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
- "integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.13.12"
- }
- },
- "node_modules/@babel/helper-skip-transparent-expression-wrappers": {
- "version": "7.12.1",
- "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.12.1.tgz",
- "integrity": "sha512-Mf5AUuhG1/OCChOJ/HcADmvcHM42WJockombn8ATJG3OnyiSxBK/Mm5x78BQWvmtXZKHgbjdGL2kin/HOLlZGA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.12.1"
- }
- },
- "node_modules/@babel/helper-split-export-declaration": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
- "integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/helper-string-parser": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.22.5.tgz",
- "integrity": "sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/helper-validator-identifier": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.14.0.tgz",
- "integrity": "sha512-V3ts7zMSu5lfiwWDVWzRDGIN+lnCEUdaXgtVHJgLb1rGaA6jMrtB9EmE7L18foXJIE8Un/A/h6NJfGQp/e1J4A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@babel/helper-validator-option": {
- "version": "7.12.17",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
- "integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@babel/helper-wrap-function": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.13.0.tgz",
- "integrity": "sha512-1UX9F7K3BS42fI6qd2A4BjKzgGjToscyZTdp1DjknHLCIvpgne6918io+aL5LXFcER/8QWiwpoY902pVEqgTXA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-function-name": "^7.12.13",
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.13.0",
- "@babel/types": "^7.13.0"
- }
- },
- "node_modules/@babel/helpers": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.14.0.tgz",
- "integrity": "sha512-+ufuXprtQ1D1iZTO/K9+EBRn+qPWMJjZSw/S0KlFrxCw4tkrzv9grgpDHkY9MeQTjTY8i2sp7Jep8DfU6tN9Mg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.12.13",
- "@babel/traverse": "^7.14.0",
- "@babel/types": "^7.14.0"
- }
- },
- "node_modules/@babel/highlight": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.0.tgz",
- "integrity": "sha512-YSCOwxvTYEIMSGaBQb5kDDsCopDdiUGsqpatp3fOlI4+2HQSkTmEVWnVuySdAC5EWCqSWWTv0ib63RjR7dTBdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.14.0",
- "chalk": "^2.0.0",
- "js-tokens": "^4.0.0"
- }
- },
- "node_modules/@babel/parser": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.14.1.tgz",
- "integrity": "sha512-muUGEKu8E/ftMTPlNp+mc6zL3E9zKWmF5sDHZ5MSsoTP9Wyz64AhEf9kD08xYJ7w6Hdcu8H550ircnPyWSIF0Q==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.13.12.tgz",
- "integrity": "sha512-d0u3zWKcoZf379fOeJdr1a5WPDny4aOFZ6hlfKivgK0LY7ZxNfoaHL2fWwdGtHyVvra38FC+HVYkO+byfSA8AQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
- "@babel/plugin-proposal-optional-chaining": "^7.13.12"
- },
- "peerDependencies": {
- "@babel/core": "^7.13.0"
- }
- },
- "node_modules/@babel/plugin-proposal-async-generator-functions": {
- "version": "7.13.15",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.13.15.tgz",
- "integrity": "sha512-VapibkWzFeoa6ubXy/NgV5U2U4MVnUlvnx6wo1XhlsaTrLYWE0UFpDQsVrmn22q5CzeloqJ8gEMHSKxuee6ZdA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-remap-async-to-generator": "^7.13.0",
- "@babel/plugin-syntax-async-generators": "^7.8.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-class-properties": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.13.0.tgz",
- "integrity": "sha512-KnTDjFNC1g+45ka0myZNvSBFLhNCLN+GeGYLDEA8Oq7MZ6yMgfLoIRh86GRT0FjtJhZw8JyUskP9uvj5pHM9Zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.13.0",
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-class-static-block": {
- "version": "7.13.11",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.13.11.tgz",
- "integrity": "sha512-fJTdFI4bfnMjvxJyNuaf8i9mVcZ0UhetaGEUHaHV9KEnibLugJkZAtXikR8KcYj+NYmI4DZMS8yQAyg+hvfSqg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-class-static-block": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.12.0"
- }
- },
- "node_modules/@babel/plugin-proposal-dynamic-import": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.13.8.tgz",
- "integrity": "sha512-ONWKj0H6+wIRCkZi9zSbZtE/r73uOhMVHh256ys0UzfM7I3d4n+spZNWjOnJv2gzopumP2Wxi186vI8N0Y2JyQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-export-namespace-from": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.12.13.tgz",
- "integrity": "sha512-INAgtFo4OnLN3Y/j0VwAgw3HDXcDtX+C/erMvWzuV9v71r7urb6iyMXu7eM9IgLr1ElLlOkaHjJ0SbCmdOQ3Iw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-json-strings": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.13.8.tgz",
- "integrity": "sha512-w4zOPKUFPX1mgvTmL/fcEqy34hrQ1CRcGxdphBc6snDnnqJ47EZDIyop6IwXzAC8G916hsIuXB2ZMBCExC5k7Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-json-strings": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-logical-assignment-operators": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.13.8.tgz",
- "integrity": "sha512-aul6znYB4N4HGweImqKn59Su9RS8lbUIqxtXTOcAGtNIDczoEFv+l1EhmX8rUBp3G1jMjKJm8m0jXVp63ZpS4A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.13.8.tgz",
- "integrity": "sha512-iePlDPBn//UhxExyS9KyeYU7RM9WScAG+D3Hhno0PLJebAEpDZMocbDe64eqynhNAnwz/vZoL/q/QB2T1OH39A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-numeric-separator": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.12.13.tgz",
- "integrity": "sha512-O1jFia9R8BUCl3ZGB7eitaAPu62TXJRHn7rh+ojNERCFyqRwJMTmhz+tJ+k0CwI6CLjX/ee4qW74FSqlq9I35w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-object-rest-spread": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.13.8.tgz",
- "integrity": "sha512-DhB2EuB1Ih7S3/IRX5AFVgZ16k3EzfRbq97CxAVI1KSYcW+lexV8VZb7G7L8zuPVSdQMRn0kiBpf/Yzu9ZKH0g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.13.8",
- "@babel/helper-compilation-targets": "^7.13.8",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-transform-parameters": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-catch-binding": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.13.8.tgz",
- "integrity": "sha512-0wS/4DUF1CuTmGo+NiaHfHcVSeSLj5S3e6RivPTg/2k3wOv3jO35tZ6/ZWsQhQMvdgI7CwphjQa/ccarLymHVA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-optional-chaining": {
- "version": "7.13.12",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.13.12.tgz",
- "integrity": "sha512-fcEdKOkIB7Tf4IxrgEVeFC4zeJSTr78no9wTdBuZZbqF64kzllU0ybo2zrzm7gUQfxGhBgq4E39oRs8Zx/RMYQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-methods": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.13.0.tgz",
- "integrity": "sha512-MXyyKQd9inhx1kDYPkFRVOBXQ20ES8Pto3T7UZ92xj2mY0EVD8oAVzeyYuVfy/mxAdTSIayOvg+aVzcHV2bn6Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-class-features-plugin": "^7.13.0",
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-private-property-in-object": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.14.0.tgz",
- "integrity": "sha512-59ANdmEwwRUkLjB7CRtwJxxwtjESw+X2IePItA+RGQh+oy5RmpCh/EvVVvh5XQc3yxsm5gtv0+i9oBZhaDNVTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.12.13",
- "@babel/helper-create-class-features-plugin": "^7.14.0",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-proposal-unicode-property-regex": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.12.13.tgz",
- "integrity": "sha512-XyJmZidNfofEkqFV5VC/bLabGmO5QzenPO/YOfGuEbgU+2sSwMmio3YLb4WtBgcmmdwZHyVyv8on77IUjQ5Gvg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-async-generators": {
- "version": "7.8.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
- "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz",
- "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-class-static-block": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.12.13.tgz",
- "integrity": "sha512-ZmKQ0ZXR0nYpHZIIuj9zE7oIqCx2hw9TKi+lIo73NNrMPAZGHfS92/VRV0ZmPj6H2ffBgyFHXvJ5NYsNeEaP2A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-dynamic-import": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz",
- "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-export-namespace-from": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz",
- "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-json-strings": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
- "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-logical-assignment-operators": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz",
- "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz",
- "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-numeric-separator": {
- "version": "7.10.4",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz",
- "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.10.4"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-object-rest-spread": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
- "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-catch-binding": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
- "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-optional-chaining": {
- "version": "7.8.3",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz",
- "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.8.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-private-property-in-object": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.0.tgz",
- "integrity": "sha512-bda3xF8wGl5/5btF794utNOL0Jw+9jE5C1sLZcoK7c4uonE/y3iQiyG+KbkF3WBV/paX58VCpjhxLPkdj5Fe4w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-syntax-top-level-await": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.12.13.tgz",
- "integrity": "sha512-A81F9pDwyS7yM//KwbCSDqy3Uj4NMIurtplxphWxoYtNPov7cJsDkAFNNyVlIZ3jwGycVsurZ+LtOA8gZ376iQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-arrow-functions": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.13.0.tgz",
- "integrity": "sha512-96lgJagobeVmazXFaDrbmCLQxBysKu7U6Do3mLsx27gf5Dk85ezysrs2BZUpXD703U/Su1xTBDxxar2oa4jAGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-async-to-generator": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.13.0.tgz",
- "integrity": "sha512-3j6E004Dx0K3eGmhxVJxwwI89CTJrce7lg3UrtFuDAVQ/2+SJ/h/aSFOeE6/n0WB1GsOffsJp6MnPQNQ8nmwhg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-imports": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-remap-async-to-generator": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoped-functions": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.12.13.tgz",
- "integrity": "sha512-zNyFqbc3kI/fVpqwfqkg6RvBgFpC4J18aKKMmv7KdQ/1GgREapSJAykLMVNwfRGO3BtHj3YQZl8kxCXPcVMVeg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-block-scoping": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.14.1.tgz",
- "integrity": "sha512-2mQXd0zBrwfp0O1moWIhPpEeTKDvxyHcnma3JATVP1l+CctWBuot6OJG8LQ4DnBj4ZZPSmlb/fm4mu47EOAnVA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-classes": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.13.0.tgz",
- "integrity": "sha512-9BtHCPUARyVH1oXGcSJD3YpsqRLROJx5ZNP6tN5vnk17N0SVf9WCtf8Nuh1CFmgByKKAIMstitKduoCmsaDK5g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-annotate-as-pure": "^7.12.13",
- "@babel/helper-function-name": "^7.12.13",
- "@babel/helper-optimise-call-expression": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-replace-supers": "^7.13.0",
- "@babel/helper-split-export-declaration": "^7.12.13",
- "globals": "^11.1.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-computed-properties": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.13.0.tgz",
- "integrity": "sha512-RRqTYTeZkZAz8WbieLTvKUEUxZlUTdmL5KGMyZj7FnMfLNKV4+r5549aORG/mgojRmFlQMJDUupwAMiF2Q7OUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-destructuring": {
- "version": "7.13.17",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.13.17.tgz",
- "integrity": "sha512-UAUqiLv+uRLO+xuBKKMEpC+t7YRNVRqBsWWq1yKXbBZBje/t3IXCiSinZhjn/DC3qzBfICeYd2EFGEbHsh5RLA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-dotall-regex": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.12.13.tgz",
- "integrity": "sha512-foDrozE65ZFdUC2OfgeOCrEPTxdB3yjqxpXh8CH+ipd9CHd4s/iq81kcUpyH8ACGNEPdFqbtzfgzbT/ZGlbDeQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-duplicate-keys": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.12.13.tgz",
- "integrity": "sha512-NfADJiiHdhLBW3pulJlJI2NB0t4cci4WTZ8FtdIuNc2+8pslXdPtRRAEWqUY+m9kNOk2eRYbTAOipAxlrOcwwQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-exponentiation-operator": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.12.13.tgz",
- "integrity": "sha512-fbUelkM1apvqez/yYx1/oICVnGo2KM5s63mhGylrmXUxK/IAXSIf87QIxVfZldWf4QsOafY6vV3bX8aMHSvNrA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-builder-binary-assignment-operator-visitor": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-for-of": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.13.0.tgz",
- "integrity": "sha512-IHKT00mwUVYE0zzbkDgNRP6SRzvfGCYsOxIRz8KsiaaHCcT9BWIkO+H9QRJseHBLOGBZkHUdHiqj6r0POsdytg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-function-name": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.12.13.tgz",
- "integrity": "sha512-6K7gZycG0cmIwwF7uMK/ZqeCikCGVBdyP2J5SKNCXO5EOHcqi+z7Jwf8AmyDNcBgxET8DrEtCt/mPKPyAzXyqQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-function-name": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-literals": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.12.13.tgz",
- "integrity": "sha512-FW+WPjSR7hiUxMcKqyNjP05tQ2kmBCdpEpZHY1ARm96tGQCCBvXKnpjILtDplUnJ/eHZ0lALLM+d2lMFSpYJrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-member-expression-literals": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.12.13.tgz",
- "integrity": "sha512-kxLkOsg8yir4YeEPHLuO2tXP9R/gTjpuTOjshqSpELUN3ZAg2jfDnKUvzzJxObun38sw3wm4Uu69sX/zA7iRvg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-amd": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.14.0.tgz",
- "integrity": "sha512-CF4c5LX4LQ03LebQxJ5JZes2OYjzBuk1TdiF7cG7d5dK4lAdw9NZmaxq5K/mouUdNeqwz3TNjnW6v01UqUNgpQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.14.0",
- "@babel/helper-plugin-utils": "^7.13.0",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-commonjs": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.14.0.tgz",
- "integrity": "sha512-EX4QePlsTaRZQmw9BsoPeyh5OCtRGIhwfLquhxGp5e32w+dyL8htOcDwamlitmNFK6xBZYlygjdye9dbd9rUlQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.14.0",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-simple-access": "^7.13.12",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-systemjs": {
- "version": "7.13.8",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.13.8.tgz",
- "integrity": "sha512-hwqctPYjhM6cWvVIlOIe27jCIBgHCsdH2xCJVAYQm7V5yTMoilbVMi9f6wKg0rpQAOn6ZG4AOyvCqFF/hUh6+A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-hoist-variables": "^7.13.0",
- "@babel/helper-module-transforms": "^7.13.0",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-validator-identifier": "^7.12.11",
- "babel-plugin-dynamic-import-node": "^2.3.3"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-modules-umd": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.14.0.tgz",
- "integrity": "sha512-nPZdnWtXXeY7I87UZr9VlsWme3Y0cfFFE41Wbxz4bbaexAjNMInXPFUpRRUJ8NoMm0Cw+zxbqjdPmLhcjfazMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-module-transforms": "^7.14.0",
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-named-capturing-groups-regex": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.12.13.tgz",
- "integrity": "sha512-Xsm8P2hr5hAxyYblrfACXpQKdQbx4m2df9/ZZSQ8MAhsadw06+jW7s9zsSw6he+mJZXRlVMyEnVktJo4zjk1WA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0"
- }
- },
- "node_modules/@babel/plugin-transform-new-target": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.12.13.tgz",
- "integrity": "sha512-/KY2hbLxrG5GTQ9zzZSc3xWiOy379pIETEhbtzwZcw9rvuaVV4Fqy7BYGYOWZnaoXIQYbbJ0ziXLa/sKcGCYEQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-object-super": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.12.13.tgz",
- "integrity": "sha512-JzYIcj3XtYspZDV8j9ulnoMPZZnF/Cj0LUxPOjR89BdBVx+zYJI9MdMIlUZjbXDX+6YVeS6I3e8op+qQ3BYBoQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13",
- "@babel/helper-replace-supers": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-parameters": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.13.0.tgz",
- "integrity": "sha512-Jt8k/h/mIwE2JFEOb3lURoY5C85ETcYPnbuAJ96zRBzh1XHtQZfs62ChZ6EP22QlC8c7Xqr9q+e1SU5qttwwjw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-property-literals": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.12.13.tgz",
- "integrity": "sha512-nqVigwVan+lR+g8Fj8Exl0UQX2kymtjcWfMOYM1vTYEKujeyv2SkMgazf2qNcK7l4SDiKyTA/nHCPqL4e2zo1A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-regenerator": {
- "version": "7.13.15",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.13.15.tgz",
- "integrity": "sha512-Bk9cOLSz8DiurcMETZ8E2YtIVJbFCPGW28DJWUakmyVWtQSm6Wsf0p4B4BfEr/eL2Nkhe/CICiUiMOCi1TPhuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerator-transform": "^0.14.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-reserved-words": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.12.13.tgz",
- "integrity": "sha512-xhUPzDXxZN1QfiOy/I5tyye+TRz6lA7z6xaT4CLOjPRMVg1ldRf0LHw0TDBpYL4vG78556WuHdyO9oi5UmzZBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-shorthand-properties": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.12.13.tgz",
- "integrity": "sha512-xpL49pqPnLtf0tVluuqvzWIgLEhuPpZzvs2yabUHSKRNlN7ScYU7aMlmavOeyXJZKgZKQRBlh8rHbKiJDraTSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-spread": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.13.0.tgz",
- "integrity": "sha512-V6vkiXijjzYeFmQTr3dBxPtZYLPcUfY34DebOU27jIl2M/Y8Egm52Hw82CSjjPqd54GTlJs5x+CR7HeNr24ckg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-skip-transparent-expression-wrappers": "^7.12.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-sticky-regex": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.12.13.tgz",
- "integrity": "sha512-Jc3JSaaWT8+fr7GRvQP02fKDsYk4K/lYwWq38r/UGfaxo89ajud321NH28KRQ7xy1Ybc0VUE5Pz8psjNNDUglg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-template-literals": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.13.0.tgz",
- "integrity": "sha512-d67umW6nlfmr1iehCcBv69eSUSySk1EsIS8aTDX4Xo9qajAh6mYtcl4kJrBkGXuxZPEgVr7RVfAvNW6YQkd4Mw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.13.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-typeof-symbol": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.12.13.tgz",
- "integrity": "sha512-eKv/LmUJpMnu4npgfvs3LiHhJua5fo/CysENxa45YCQXZwKnGCQKAg87bvoqSW1fFT+HA32l03Qxsm8ouTY3ZQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-escapes": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.12.13.tgz",
- "integrity": "sha512-0bHEkdwJ/sN/ikBHfSmOXPypN/beiGqjo+o4/5K+vxEFNPRPdImhviPakMKG4x96l85emoa0Z6cDflsdBusZbw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/plugin-transform-unicode-regex": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.12.13.tgz",
- "integrity": "sha512-mDRzSNY7/zopwisPZ5kM9XKCfhchqIYwAKRERtEnhYscZB79VRekuRSoYbN0+KVe3y8+q1h6A4svXtP7N+UoCA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-create-regexp-features-plugin": "^7.12.13",
- "@babel/helper-plugin-utils": "^7.12.13"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-env": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.14.1.tgz",
- "integrity": "sha512-0M4yL1l7V4l+j/UHvxcdvNfLB9pPtIooHTbEhgD/6UGyh8Hy3Bm1Mj0buzjDXATCSz3JFibVdnoJZCrlUCanrQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.14.0",
- "@babel/helper-compilation-targets": "^7.13.16",
- "@babel/helper-plugin-utils": "^7.13.0",
- "@babel/helper-validator-option": "^7.12.17",
- "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.13.12",
- "@babel/plugin-proposal-async-generator-functions": "^7.13.15",
- "@babel/plugin-proposal-class-properties": "^7.13.0",
- "@babel/plugin-proposal-class-static-block": "^7.13.11",
- "@babel/plugin-proposal-dynamic-import": "^7.13.8",
- "@babel/plugin-proposal-export-namespace-from": "^7.12.13",
- "@babel/plugin-proposal-json-strings": "^7.13.8",
- "@babel/plugin-proposal-logical-assignment-operators": "^7.13.8",
- "@babel/plugin-proposal-nullish-coalescing-operator": "^7.13.8",
- "@babel/plugin-proposal-numeric-separator": "^7.12.13",
- "@babel/plugin-proposal-object-rest-spread": "^7.13.8",
- "@babel/plugin-proposal-optional-catch-binding": "^7.13.8",
- "@babel/plugin-proposal-optional-chaining": "^7.13.12",
- "@babel/plugin-proposal-private-methods": "^7.13.0",
- "@babel/plugin-proposal-private-property-in-object": "^7.14.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.12.13",
- "@babel/plugin-syntax-async-generators": "^7.8.4",
- "@babel/plugin-syntax-class-properties": "^7.12.13",
- "@babel/plugin-syntax-class-static-block": "^7.12.13",
- "@babel/plugin-syntax-dynamic-import": "^7.8.3",
- "@babel/plugin-syntax-export-namespace-from": "^7.8.3",
- "@babel/plugin-syntax-json-strings": "^7.8.3",
- "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4",
- "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3",
- "@babel/plugin-syntax-numeric-separator": "^7.10.4",
- "@babel/plugin-syntax-object-rest-spread": "^7.8.3",
- "@babel/plugin-syntax-optional-catch-binding": "^7.8.3",
- "@babel/plugin-syntax-optional-chaining": "^7.8.3",
- "@babel/plugin-syntax-private-property-in-object": "^7.14.0",
- "@babel/plugin-syntax-top-level-await": "^7.12.13",
- "@babel/plugin-transform-arrow-functions": "^7.13.0",
- "@babel/plugin-transform-async-to-generator": "^7.13.0",
- "@babel/plugin-transform-block-scoped-functions": "^7.12.13",
- "@babel/plugin-transform-block-scoping": "^7.14.1",
- "@babel/plugin-transform-classes": "^7.13.0",
- "@babel/plugin-transform-computed-properties": "^7.13.0",
- "@babel/plugin-transform-destructuring": "^7.13.17",
- "@babel/plugin-transform-dotall-regex": "^7.12.13",
- "@babel/plugin-transform-duplicate-keys": "^7.12.13",
- "@babel/plugin-transform-exponentiation-operator": "^7.12.13",
- "@babel/plugin-transform-for-of": "^7.13.0",
- "@babel/plugin-transform-function-name": "^7.12.13",
- "@babel/plugin-transform-literals": "^7.12.13",
- "@babel/plugin-transform-member-expression-literals": "^7.12.13",
- "@babel/plugin-transform-modules-amd": "^7.14.0",
- "@babel/plugin-transform-modules-commonjs": "^7.14.0",
- "@babel/plugin-transform-modules-systemjs": "^7.13.8",
- "@babel/plugin-transform-modules-umd": "^7.14.0",
- "@babel/plugin-transform-named-capturing-groups-regex": "^7.12.13",
- "@babel/plugin-transform-new-target": "^7.12.13",
- "@babel/plugin-transform-object-super": "^7.12.13",
- "@babel/plugin-transform-parameters": "^7.13.0",
- "@babel/plugin-transform-property-literals": "^7.12.13",
- "@babel/plugin-transform-regenerator": "^7.13.15",
- "@babel/plugin-transform-reserved-words": "^7.12.13",
- "@babel/plugin-transform-shorthand-properties": "^7.12.13",
- "@babel/plugin-transform-spread": "^7.13.0",
- "@babel/plugin-transform-sticky-regex": "^7.12.13",
- "@babel/plugin-transform-template-literals": "^7.13.0",
- "@babel/plugin-transform-typeof-symbol": "^7.12.13",
- "@babel/plugin-transform-unicode-escapes": "^7.12.13",
- "@babel/plugin-transform-unicode-regex": "^7.12.13",
- "@babel/preset-modules": "^0.1.4",
- "@babel/types": "^7.14.1",
- "babel-plugin-polyfill-corejs2": "^0.2.0",
- "babel-plugin-polyfill-corejs3": "^0.2.0",
- "babel-plugin-polyfill-regenerator": "^0.2.0",
- "core-js-compat": "^3.9.0",
- "semver": "^6.3.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/preset-modules": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.4.tgz",
- "integrity": "sha512-J36NhwnfdzpmH41M1DrnkkgAqhZaqr/NBdPfQ677mLzlaXo+oDiv1deyCDtgAhz8p328otdob0Du7+xgHGZbKg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-plugin-utils": "^7.0.0",
- "@babel/plugin-proposal-unicode-property-regex": "^7.4.4",
- "@babel/plugin-transform-dotall-regex": "^7.4.4",
- "@babel/types": "^7.4.4",
- "esutils": "^2.0.2"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/@babel/runtime": {
- "version": "7.14.0",
- "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.14.0.tgz",
- "integrity": "sha512-JELkvo/DlpNdJ7dlyw/eY7E0suy5i5GQH+Vlxaq1nsNJ+H7f4Vtv3jMeCEgRhZZQFXTjldYfQgv2qmM6M1v5wA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerator-runtime": "^0.13.4"
- }
- },
- "node_modules/@babel/template": {
- "version": "7.12.13",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
- "integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.12.13",
- "@babel/parser": "^7.12.13",
- "@babel/types": "^7.12.13"
- }
- },
- "node_modules/@babel/traverse": {
- "version": "7.23.2",
- "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.2.tgz",
- "integrity": "sha512-azpe59SQ48qG6nu2CzcMLbxUudtN+dOM9kDbUqGq3HXUJRlo7i8fvPoxQUzYgLZ4cMVmuZgm8vvBpNeRhd6XSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.22.13",
- "@babel/generator": "^7.23.0",
- "@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",
- "globals": "^11.1.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/code-frame": {
- "version": "7.22.13",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.22.13.tgz",
- "integrity": "sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/highlight": "^7.22.13",
- "chalk": "^2.4.2"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/generator": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.0.tgz",
- "integrity": "sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.23.0",
- "@jridgewell/gen-mapping": "^0.3.2",
- "@jridgewell/trace-mapping": "^0.3.17",
- "jsesc": "^2.5.1"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/helper-function-name": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz",
- "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/template": "^7.22.15",
- "@babel/types": "^7.23.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/helper-hoist-variables": {
- "version": "7.22.5",
- "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz",
- "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/helper-split-export-declaration": {
- "version": "7.22.6",
- "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz",
- "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/types": "^7.22.5"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/helper-validator-identifier": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz",
- "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/highlight": {
- "version": "7.22.20",
- "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.22.20.tgz",
- "integrity": "sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.22.20",
- "chalk": "^2.4.2",
- "js-tokens": "^4.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/parser": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.0.tgz",
- "integrity": "sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "parser": "bin/babel-parser.js"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/template": {
- "version": "7.22.15",
- "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz",
- "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.22.13",
- "@babel/parser": "^7.22.15",
- "@babel/types": "^7.22.15"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/traverse/node_modules/@babel/types": {
- "version": "7.23.0",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.0.tgz",
- "integrity": "sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-string-parser": "^7.22.5",
- "@babel/helper-validator-identifier": "^7.22.20",
- "to-fast-properties": "^2.0.0"
- },
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/@babel/types": {
- "version": "7.14.1",
- "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.14.1.tgz",
- "integrity": "sha512-S13Qe85fzLs3gYRUnrpyeIrBJIMYv33qSTg1qoBwiG6nPKwUWAD9odSzWhEedpwOIzSEI6gbdQIWEMiCI42iBA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-validator-identifier": "^7.14.0",
- "to-fast-properties": "^2.0.0"
- }
- },
- "node_modules/@csstools/css-parser-algorithms": {
- "version": "2.6.3",
- "resolved": "https://registry.npmjs.org/@csstools/css-parser-algorithms/-/css-parser-algorithms-2.6.3.tgz",
- "integrity": "sha512-xI/tL2zxzEbESvnSxwFgwvy5HS00oCXxL4MLs6HUiDcYfwowsoQaABKxUElp1ARITrINzBnsECOc1q0eg2GOrA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "@csstools/css-tokenizer": "^2.3.1"
- }
- },
- "node_modules/@csstools/css-tokenizer": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/@csstools/css-tokenizer/-/css-tokenizer-2.3.1.tgz",
- "integrity": "sha512-iMNHTyxLbBlWIfGtabT157LH9DUx9X8+Y3oymFEuMj8HNc+rpE3dPFGFgHjpKfjeFDjLjYIAIhXPGvS2lKxL9g==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": "^14 || ^16 || >=18"
- }
- },
- "node_modules/@csstools/media-query-list-parser": {
- "version": "2.1.11",
- "resolved": "https://registry.npmjs.org/@csstools/media-query-list-parser/-/media-query-list-parser-2.1.11.tgz",
- "integrity": "sha512-uox5MVhvNHqitPP+SynrB1o8oPxPMt2JLgp5ghJOWf54WGQ5OKu47efne49r1SWqs3wRP8xSWjnO9MBKxhB1dA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "@csstools/css-parser-algorithms": "^2.6.3",
- "@csstools/css-tokenizer": "^2.3.1"
- }
- },
- "node_modules/@csstools/selector-specificity": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@csstools/selector-specificity/-/selector-specificity-3.1.1.tgz",
- "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/csstools"
- },
- {
- "type": "opencollective",
- "url": "https://opencollective.com/csstools"
- }
- ],
- "license": "MIT-0",
- "engines": {
- "node": "^14 || ^16 || >=18"
- },
- "peerDependencies": {
- "postcss-selector-parser": "^6.0.13"
- }
- },
- "node_modules/@discoveryjs/json-ext": {
- "version": "0.5.7",
- "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz",
- "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/@dual-bundle/import-meta-resolve": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/@dual-bundle/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz",
- "integrity": "sha512-+nxncfwHM5SgAtrVzgpzJOI1ol0PkumhVo469KCf9lUi21IGcY90G98VuHm9VRrUypmAzawAHO9bs6hqeADaVg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/@eslint/eslintrc": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.1.tgz",
- "integrity": "sha512-5v7TDE9plVhvxQeWLXDTvFvJBdH6pEsdnl2g/dAptmuFEPedQ4Erq5rsDsX+mvAM610IhNaO2W5V1dOOnDKxkQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.12.4",
- "debug": "^4.1.1",
- "espree": "^7.3.0",
- "globals": "^12.1.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.2.1",
- "js-yaml": "^3.13.1",
- "minimatch": "^3.0.4",
- "strip-json-comments": "^3.1.1"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/@eslint/eslintrc/node_modules/globals": {
- "version": "12.4.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz",
- "integrity": "sha512-BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.8.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/@jridgewell/gen-mapping": {
- "version": "0.3.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz",
- "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/set-array": "^1.2.1",
- "@jridgewell/sourcemap-codec": "^1.4.10",
- "@jridgewell/trace-mapping": "^0.3.24"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/resolve-uri": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz",
- "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/set-array": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz",
- "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/@jridgewell/source-map": {
- "version": "0.3.6",
- "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.6.tgz",
- "integrity": "sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/gen-mapping": "^0.3.5",
- "@jridgewell/trace-mapping": "^0.3.25"
- }
- },
- "node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.4.15",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz",
- "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@jridgewell/trace-mapping": {
- "version": "0.3.25",
- "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz",
- "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/resolve-uri": "^3.1.0",
- "@jridgewell/sourcemap-codec": "^1.4.14"
- }
- },
- "node_modules/@nodelib/fs.scandir": {
- "version": "2.1.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
- "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "2.0.5",
- "run-parallel": "^1.1.9"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.stat": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz",
- "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@nodelib/fs.walk": {
- "version": "1.2.8",
- "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz",
- "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.scandir": "2.1.5",
- "fastq": "^1.6.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/@npmcli/move-file": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/@npmcli/move-file/-/move-file-1.1.2.tgz",
- "integrity": "sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mkdirp": "^1.0.4",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@npmcli/move-file/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/@npmcli/move-file/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/@types/eslint": {
- "version": "8.56.10",
- "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz",
- "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/estree": "*",
- "@types/json-schema": "*"
- }
- },
- "node_modules/@types/eslint-scope": {
- "version": "3.7.7",
- "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz",
- "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/eslint": "*",
- "@types/estree": "*"
- }
- },
- "node_modules/@types/estree": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz",
- "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json-schema": {
- "version": "7.0.15",
- "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
- "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/json5": {
- "version": "0.0.29",
- "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz",
- "integrity": "sha1-7ihweulOEdK4J7y+UnC86n8+ce4=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@types/node": {
- "version": "15.0.2",
- "resolved": "https://registry.npmjs.org/@types/node/-/node-15.0.2.tgz",
- "integrity": "sha512-p68+a+KoxpoB47015IeYZYRrdqMUcpbK8re/zpFB8Ld46LHC1lPEbp3EXgkEhAYEcPvjJF6ZO+869SQ0aH1dcA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/ast": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.12.1.tgz",
- "integrity": "sha512-EKfMUOPRRUTy5UII4qJDGPpqfwjOmZ5jeGFwid9mnoqIFK+e0vqoi1qH56JpmZSzEL53jKnNzScdmftJyG5xWg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/helper-numbers": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/floating-point-hex-parser": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.6.tgz",
- "integrity": "sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-api-error": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.6.tgz",
- "integrity": "sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-buffer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.12.1.tgz",
- "integrity": "sha512-nzJwQw99DNDKr9BVCOZcLuJJUlqkJh+kVzVl6Fmq/tI5ZtEyWT1KZMyOXltXLZJmDtvLCDgwsyrkohEtopTXCw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-numbers": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.6.tgz",
- "integrity": "sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/floating-point-hex-parser": "1.11.6",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/helper-wasm-bytecode": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.6.tgz",
- "integrity": "sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/helper-wasm-section": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.12.1.tgz",
- "integrity": "sha512-Jif4vfB6FJlUlSbgEMHUyk1j234GTNG9dBJ4XJdOySoj518Xj0oGsNi59cUQF4RRMS9ouBUxDDdyBVfPTypa5g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/wasm-gen": "1.12.1"
- }
- },
- "node_modules/@webassemblyjs/ieee754": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.6.tgz",
- "integrity": "sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@xtuc/ieee754": "^1.2.0"
- }
- },
- "node_modules/@webassemblyjs/leb128": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.6.tgz",
- "integrity": "sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webassemblyjs/utf8": {
- "version": "1.11.6",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.6.tgz",
- "integrity": "sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/@webassemblyjs/wasm-edit": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.12.1.tgz",
- "integrity": "sha512-1DuwbVvADvS5mGnXbE+c9NfA8QRcZ6iKquqjjmR10k6o+zzsRVesil54DKexiowcFCPdr/Q0qaMgB01+SQ1u6g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/helper-wasm-section": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-opt": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1",
- "@webassemblyjs/wast-printer": "1.12.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-gen": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.12.1.tgz",
- "integrity": "sha512-TDq4Ojh9fcohAw6OIMXqiIcTq5KUXTGRkVxbSo1hQnSy6lAM5GSdfwWeSxpAo0YzgsgF182E/U0mDNhuA0tW7w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wasm-opt": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.12.1.tgz",
- "integrity": "sha512-Jg99j/2gG2iaz3hijw857AVYekZe2SAskcqlWIZXjji5WStnOpVoat3gQfT/Q5tb2djnCjBtMocY/Su1GfxPBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-buffer": "1.12.1",
- "@webassemblyjs/wasm-gen": "1.12.1",
- "@webassemblyjs/wasm-parser": "1.12.1"
- }
- },
- "node_modules/@webassemblyjs/wasm-parser": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.12.1.tgz",
- "integrity": "sha512-xikIi7c2FHXysxXe3COrVUPSheuBtpcfhbpFj4gmu7KRLYOzANztwUU0IbsqvMqzuNK2+glRGWCEqZo1WCLyAQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@webassemblyjs/helper-api-error": "1.11.6",
- "@webassemblyjs/helper-wasm-bytecode": "1.11.6",
- "@webassemblyjs/ieee754": "1.11.6",
- "@webassemblyjs/leb128": "1.11.6",
- "@webassemblyjs/utf8": "1.11.6"
- }
- },
- "node_modules/@webassemblyjs/wast-printer": {
- "version": "1.12.1",
- "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.12.1.tgz",
- "integrity": "sha512-+X4WAlOisVWQMikjbcvY2e0rwPsKQ9F688lksZhBcPycBBuii3O7m8FACbDMWDojpAqvjIncrG8J0XHKyQfVeA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@webassemblyjs/ast": "1.12.1",
- "@xtuc/long": "4.2.2"
- }
- },
- "node_modules/@webpack-cli/configtest": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz",
- "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.15.0"
- },
- "peerDependencies": {
- "webpack": "5.x.x",
- "webpack-cli": "5.x.x"
- }
- },
- "node_modules/@webpack-cli/info": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz",
- "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.15.0"
- },
- "peerDependencies": {
- "webpack": "5.x.x",
- "webpack-cli": "5.x.x"
- }
- },
- "node_modules/@webpack-cli/serve": {
- "version": "2.0.5",
- "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz",
- "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14.15.0"
- },
- "peerDependencies": {
- "webpack": "5.x.x",
- "webpack-cli": "5.x.x"
- },
- "peerDependenciesMeta": {
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/@xtuc/ieee754": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz",
- "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/@xtuc/long": {
- "version": "4.2.2",
- "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz",
- "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==",
- "dev": true,
- "license": "Apache-2.0"
- },
- "node_modules/acorn": {
- "version": "7.4.1",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz",
- "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/acorn-jsx": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz",
- "integrity": "sha512-K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
- }
- },
- "node_modules/aggregate-error": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/aggregate-error/-/aggregate-error-3.1.0.tgz",
- "integrity": "sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clean-stack": "^2.0.0",
- "indent-string": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ajv": {
- "version": "6.12.6",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz",
- "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "fast-json-stable-stringify": "^2.0.0",
- "json-schema-traverse": "^0.4.1",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/ajv-errors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz",
- "integrity": "sha512-DCRfO/4nQ+89p/RK43i8Ezd41EqdGIU4ld7nGF8OQ14oc/we5rEntLCUa7+jrn3nn83BosfwZA0wb4pon2o8iQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "ajv": ">=5.0.0"
- }
- },
- "node_modules/ajv-keywords": {
- "version": "3.5.2",
- "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz",
- "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "ajv": "^6.9.1"
- }
- },
- "node_modules/ansi-colors": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz",
- "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/ansi-regex": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz",
- "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/ansi-styles": {
- "version": "3.2.1",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
- "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^1.9.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/anymatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
- "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "normalize-path": "^3.0.0",
- "picomatch": "^2.0.4"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/argparse": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
- "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "sprintf-js": "~1.0.2"
- }
- },
- "node_modules/array-includes": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.3.tgz",
- "integrity": "sha512-gcem1KlBU7c9rB+Rq8/3PPKsK2kjqeEBa3bD5kkQo4nYlOHQCJqIJFqBXDEfwaRuYTT4E+FxA9xez7Gf/e3Q7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.2",
- "get-intrinsic": "^1.1.1",
- "is-string": "^1.0.5"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/array-union": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz",
- "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/array.prototype.flat": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.2.4.tgz",
- "integrity": "sha512-4470Xi3GAPAjZqFcljX2xzckv1qeKPizoNkiS0+O4IoPR2ZNpcjE0pkhdihlDouK+x6QOast26B4Q/O9DJnwSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/astral-regex": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz",
- "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/awesomplete": {
- "version": "1.1.5",
- "resolved": "https://registry.npmjs.org/awesomplete/-/awesomplete-1.1.5.tgz",
- "integrity": "sha512-UFw1mPW8NaSECDSTC36HbAOTpF9JK2wBUJcNn4MSvlNtK7SZ9N72gB+ajHtA6D1abYXRcszZnBA4nHBwvFwzHw==",
- "license": "MIT"
- },
- "node_modules/babel-loader": {
- "version": "8.2.2",
- "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.2.tgz",
- "integrity": "sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-cache-dir": "^3.3.1",
- "loader-utils": "^1.4.0",
- "make-dir": "^3.1.0",
- "schema-utils": "^2.6.5"
- },
- "engines": {
- "node": ">= 8.9"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0",
- "webpack": ">=2"
- }
- },
- "node_modules/babel-loader/node_modules/schema-utils": {
- "version": "2.7.1",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz",
- "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.5",
- "ajv": "^6.12.4",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 8.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/babel-plugin-dynamic-import-node": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
- "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object.assign": "^4.1.0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs2": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.2.0.tgz",
- "integrity": "sha512-9bNwiR0dS881c5SHnzCmmGlMkJLl0OUZvxrxHo9w/iNoRuqaPjqlvBf4HrovXtQs/au5yKkpcdgfT1cC5PAZwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/compat-data": "^7.13.11",
- "@babel/helper-define-polyfill-provider": "^0.2.0",
- "semver": "^6.1.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-polyfill-corejs3": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.2.0.tgz",
- "integrity": "sha512-zZyi7p3BCUyzNxLx8KV61zTINkkV65zVkDAFNZmrTCRVhjo1jAS+YLvDJ9Jgd/w2tsAviCwFHReYfxO3Iql8Yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.2.0",
- "core-js-compat": "^3.9.1"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/babel-plugin-polyfill-regenerator": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.2.0.tgz",
- "integrity": "sha512-J7vKbCuD2Xi/eEHxquHN14bXAW9CXtecwuLrOIDJtcZzTaPzV1VdEfoUf9AzcRBMolKUQKM9/GVojeh0hFiqMg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/helper-define-polyfill-provider": "^0.2.0"
- },
- "peerDependencies": {
- "@babel/core": "^7.0.0-0"
- }
- },
- "node_modules/balanced-match": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-2.0.0.tgz",
- "integrity": "sha512-1ugUSr8BHXRnK23KfuYS+gVMC3LB8QGH9W1iGtDPsNWoQbgtXSExkBu2aDR4epiGWZOjZsj6lDl/N/AqqTC3UA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/big.js": {
- "version": "5.2.2",
- "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz",
- "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": "*"
- }
- },
- "node_modules/binary-extensions": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
- "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/blazy": {
- "version": "1.8.2",
- "resolved": "https://registry.npmjs.org/blazy/-/blazy-1.8.2.tgz",
- "integrity": "sha1-UN/WOLqvkAPv1us6g2rKVBhKtto=",
- "license": "MIT"
- },
- "node_modules/brace-expansion": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "balanced-match": "^1.0.0",
- "concat-map": "0.0.1"
- }
- },
- "node_modules/brace-expansion/node_modules/balanced-match": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz",
- "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/braces": {
- "version": "3.0.3",
- "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
- "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fill-range": "^7.1.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/browserslist": {
- "version": "4.23.1",
- "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz",
- "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "caniuse-lite": "^1.0.30001629",
- "electron-to-chromium": "^1.4.796",
- "node-releases": "^2.0.14",
- "update-browserslist-db": "^1.0.16"
- },
- "bin": {
- "browserslist": "cli.js"
- },
- "engines": {
- "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
- }
- },
- "node_modules/buffer-from": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz",
- "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/cacache": {
- "version": "15.0.6",
- "resolved": "https://registry.npmjs.org/cacache/-/cacache-15.0.6.tgz",
- "integrity": "sha512-g1WYDMct/jzW+JdWEyjaX2zoBkZ6ZT9VpOyp2I/VMtDsNLffNat3kqPFfi1eDRSK9/SuKGyORDHcQMcPF8sQ/w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "@npmcli/move-file": "^1.0.1",
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "glob": "^7.1.4",
- "infer-owner": "^1.0.4",
- "lru-cache": "^6.0.0",
- "minipass": "^3.1.1",
- "minipass-collect": "^1.0.2",
- "minipass-flush": "^1.0.5",
- "minipass-pipeline": "^1.2.2",
- "mkdirp": "^1.0.3",
- "p-map": "^4.0.0",
- "promise-inflight": "^1.0.1",
- "rimraf": "^3.0.2",
- "ssri": "^8.0.1",
- "tar": "^6.0.2",
- "unique-filename": "^1.1.1"
- },
- "engines": {
- "node": ">= 10"
- }
- },
- "node_modules/cacache/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/cacache/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/call-bind": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
- "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/callsites": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz",
- "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/caniuse-lite": {
- "version": "1.0.30001636",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz",
- "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/caniuse-lite"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "CC-BY-4.0"
- },
- "node_modules/chalk": {
- "version": "2.4.2",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
- "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^3.2.1",
- "escape-string-regexp": "^1.0.5",
- "supports-color": "^5.3.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chalk/node_modules/supports-color": {
- "version": "5.5.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
- "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/chokidar": {
- "version": "3.5.1",
- "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.1.tgz",
- "integrity": "sha512-9+s+Od+W0VJJzawDma/gvBNQqkTiqYTWLuZoyAsivsI4AaWTCzHG06/TMjsf1cYe9Cb97UCEhjz7HvnPk2p/tw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "anymatch": "~3.1.1",
- "braces": "~3.0.2",
- "glob-parent": "~5.1.0",
- "is-binary-path": "~2.1.0",
- "is-glob": "~4.0.1",
- "normalize-path": "~3.0.0",
- "readdirp": "~3.5.0"
- },
- "engines": {
- "node": ">= 8.10.0"
- },
- "optionalDependencies": {
- "fsevents": "~2.3.1"
- }
- },
- "node_modules/chownr": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/chownr/-/chownr-2.0.0.tgz",
- "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/chrome-trace-event": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz",
- "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.0"
- }
- },
- "node_modules/clean-stack": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/clean-stack/-/clean-stack-2.2.0.tgz",
- "integrity": "sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-deep": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
- "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-plain-object": "^2.0.4",
- "kind-of": "^6.0.2",
- "shallow-clone": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/clone-deep/node_modules/is-plain-object": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
- "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "isobject": "^3.0.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/color-convert": {
- "version": "1.9.3",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
- "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "1.1.3"
- }
- },
- "node_modules/color-name": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
- "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/colorette": {
- "version": "2.0.20",
- "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.20.tgz",
- "integrity": "sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/commander": {
- "version": "2.20.3",
- "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
- "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/commondir": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
- "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/concat-map": {
- "version": "0.0.1",
- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
- "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/confusing-browser-globals": {
- "version": "1.0.10",
- "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.10.tgz",
- "integrity": "sha512-gNld/3lySHwuhaVluJUKLePYirM3QNCKzVxqAdhJII9/WXKVX5PURzMVJspS1jTslSqjeuG4KMVTSouit5YPHA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/contains-path": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz",
- "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/convert-source-map": {
- "version": "1.7.0",
- "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
- "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "~5.1.1"
- }
- },
- "node_modules/convert-source-map/node_modules/safe-buffer": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
- "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/core-js-compat": {
- "version": "3.37.1",
- "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz",
- "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "browserslist": "^4.23.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/core-js"
- }
- },
- "node_modules/cosmiconfig": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz",
- "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "env-paths": "^2.2.1",
- "import-fresh": "^3.3.0",
- "js-yaml": "^4.1.0",
- "parse-json": "^5.2.0"
- },
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/d-fischer"
- },
- "peerDependencies": {
- "typescript": ">=4.9.5"
- },
- "peerDependenciesMeta": {
- "typescript": {
- "optional": true
- }
- }
- },
- "node_modules/cosmiconfig/node_modules/argparse": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
- "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
- "dev": true,
- "license": "Python-2.0"
- },
- "node_modules/cosmiconfig/node_modules/js-yaml": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
- "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^2.0.1"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/cross-spawn": {
- "version": "7.0.3",
- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz",
- "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-key": "^3.1.0",
- "shebang-command": "^2.0.0",
- "which": "^2.0.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/cross-spawn/node_modules/which": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz",
- "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "node-which": "bin/node-which"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/css-functions-list": {
- "version": "3.2.2",
- "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.2.tgz",
- "integrity": "sha512-c+N0v6wbKVxTu5gOBBFkr9BEdBWaqqjQeiJ8QvSRIJOf+UxlJh930m8e6/WNeODIK0mYLFkoONrnj16i2EcvfQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12 || >=16"
- }
- },
- "node_modules/css-loader": {
- "version": "7.1.2",
- "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-7.1.2.tgz",
- "integrity": "sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "icss-utils": "^5.1.0",
- "postcss": "^8.4.33",
- "postcss-modules-extract-imports": "^3.1.0",
- "postcss-modules-local-by-default": "^4.0.5",
- "postcss-modules-scope": "^3.2.0",
- "postcss-modules-values": "^4.0.0",
- "postcss-value-parser": "^4.2.0",
- "semver": "^7.5.4"
- },
- "engines": {
- "node": ">= 18.12.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "@rspack/core": "0.x || 1.x",
- "webpack": "^5.27.0"
- },
- "peerDependenciesMeta": {
- "@rspack/core": {
- "optional": true
- },
- "webpack": {
- "optional": true
- }
- }
- },
- "node_modules/css-loader/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/css-tree": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz",
- "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mdn-data": "2.0.30",
- "source-map-js": "^1.0.1"
- },
- "engines": {
- "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0"
- }
- },
- "node_modules/cssesc": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
- "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "cssesc": "bin/cssesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/debug": {
- "version": "4.3.5",
- "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz",
- "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.1.2"
- },
- "engines": {
- "node": ">=6.0"
- },
- "peerDependenciesMeta": {
- "supports-color": {
- "optional": true
- }
- }
- },
- "node_modules/deep-is": {
- "version": "0.1.3",
- "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
- "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/define-properties": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
- "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object-keys": "^1.0.12"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/dir-glob": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz",
- "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "path-type": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/doctrine": {
- "version": "1.5.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz",
- "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=",
- "dev": true,
- "dependencies": {
- "esutils": "^2.0.2",
- "isarray": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/electron-to-chromium": {
- "version": "1.4.807",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.807.tgz",
- "integrity": "sha512-kSmJl2ZwhNf/bcIuCH/imtNOKlpkLDn2jqT5FJ+/0CXjhnFaOa9cOe9gHKKy71eM49izwuQjZhKk+lWQ1JxB7A==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/emoji-regex": {
- "version": "8.0.0",
- "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
- "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/emojis-list": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz",
- "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/enhanced-resolve": {
- "version": "5.17.0",
- "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz",
- "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.2.4",
- "tapable": "^2.2.0"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/enquirer": {
- "version": "2.3.6",
- "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz",
- "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-colors": "^4.1.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/env-paths": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz",
- "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/envinfo": {
- "version": "7.13.0",
- "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.13.0.tgz",
- "integrity": "sha512-cvcaMr7KqXVh4nyzGTVqTum+gAiL265x5jUWQIDLq//zOGbW+gSW/C+OWLleY/rs9Qole6AZLMXPbtIFQbqu+Q==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "envinfo": "dist/cli.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/error-ex": {
- "version": "1.3.2",
- "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
- "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-arrayish": "^0.2.1"
- }
- },
- "node_modules/es-abstract": {
- "version": "1.18.0",
- "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
- "integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "es-to-primitive": "^1.2.1",
- "function-bind": "^1.1.1",
- "get-intrinsic": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.2",
- "is-callable": "^1.2.3",
- "is-negative-zero": "^2.0.1",
- "is-regex": "^1.1.2",
- "is-string": "^1.0.5",
- "object-inspect": "^1.9.0",
- "object-keys": "^1.1.1",
- "object.assign": "^4.1.2",
- "string.prototype.trimend": "^1.0.4",
- "string.prototype.trimstart": "^1.0.4",
- "unbox-primitive": "^1.0.0"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/es-module-lexer": {
- "version": "1.5.3",
- "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz",
- "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/es-to-primitive": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
- "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-callable": "^1.1.4",
- "is-date-object": "^1.0.1",
- "is-symbol": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/escalade": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz",
- "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/escape-string-regexp": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
- "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.0"
- }
- },
- "node_modules/eslint": {
- "version": "7.26.0",
- "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.26.0.tgz",
- "integrity": "sha512-4R1ieRf52/izcZE7AlLy56uIHHDLT74Yzz2Iv2l6kDaYvEu9x+wMB5dZArVL8SYGXSYV2YAg70FcW5Y5nGGNIg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "7.12.11",
- "@eslint/eslintrc": "^0.4.1",
- "ajv": "^6.10.0",
- "chalk": "^4.0.0",
- "cross-spawn": "^7.0.2",
- "debug": "^4.0.1",
- "doctrine": "^3.0.0",
- "enquirer": "^2.3.5",
- "eslint-scope": "^5.1.1",
- "eslint-utils": "^2.1.0",
- "eslint-visitor-keys": "^2.0.0",
- "espree": "^7.3.1",
- "esquery": "^1.4.0",
- "esutils": "^2.0.2",
- "file-entry-cache": "^6.0.1",
- "functional-red-black-tree": "^1.0.1",
- "glob-parent": "^5.0.0",
- "globals": "^13.6.0",
- "ignore": "^4.0.6",
- "import-fresh": "^3.0.0",
- "imurmurhash": "^0.1.4",
- "is-glob": "^4.0.0",
- "js-yaml": "^3.13.1",
- "json-stable-stringify-without-jsonify": "^1.0.1",
- "levn": "^0.4.1",
- "lodash": "^4.17.21",
- "minimatch": "^3.0.4",
- "natural-compare": "^1.4.0",
- "optionator": "^0.9.1",
- "progress": "^2.0.0",
- "regexpp": "^3.1.0",
- "semver": "^7.2.1",
- "strip-ansi": "^6.0.0",
- "strip-json-comments": "^3.1.0",
- "table": "^6.0.4",
- "text-table": "^0.2.0",
- "v8-compile-cache": "^2.0.3"
- },
- "bin": {
- "eslint": "bin/eslint.js"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- },
- "funding": {
- "url": "https://opencollective.com/eslint"
- }
- },
- "node_modules/eslint-config-airbnb-base": {
- "version": "14.2.1",
- "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-14.2.1.tgz",
- "integrity": "sha512-GOrQyDtVEc1Xy20U7vsB2yAoB4nBlfH5HZJeatRXHleO+OS5Ot+MWij4Dpltw4/DyIkqUfqz1epfhVR5XWWQPA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "confusing-browser-globals": "^1.0.10",
- "object.assign": "^4.1.2",
- "object.entries": "^1.1.2"
- },
- "engines": {
- "node": ">= 6"
- },
- "peerDependencies": {
- "eslint": "^5.16.0 || ^6.8.0 || ^7.2.0",
- "eslint-plugin-import": "^2.22.1"
- }
- },
- "node_modules/eslint-import-resolver-node": {
- "version": "0.3.4",
- "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.4.tgz",
- "integrity": "sha512-ogtf+5AB/O+nM6DIeBUNr2fuT7ot9Qg/1harBfBtaP13ekEWFQEEMP94BCB7zaNW3gyY+8SHYF00rnqYwXKWOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^2.6.9",
- "resolve": "^1.13.1"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/eslint-import-resolver-node/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint-module-utils": {
- "version": "2.6.0",
- "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.6.0.tgz",
- "integrity": "sha512-6j9xxegbqe8/kZY8cYpcp0xhbK0EgJlg3g9mib3/miLaExuuwc3n5UEfSnU6hWMbT0FAYVvDbL9RrRgpUeQIvA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "debug": "^2.6.9",
- "pkg-dir": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-module-utils/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/eslint-module-utils/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint-module-utils/node_modules/pkg-dir": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz",
- "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^2.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint-plugin-import": {
- "version": "2.22.1",
- "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.22.1.tgz",
- "integrity": "sha512-8K7JjINHOpH64ozkAhpT3sd+FswIZTfMZTjdx052pnWrgRCVfp8op9tbjpAk3DdUeI/Ba4C8OjdC0r90erHEOw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-includes": "^3.1.1",
- "array.prototype.flat": "^1.2.3",
- "contains-path": "^0.1.0",
- "debug": "^2.6.9",
- "doctrine": "1.5.0",
- "eslint-import-resolver-node": "^0.3.4",
- "eslint-module-utils": "^2.6.0",
- "has": "^1.0.3",
- "minimatch": "^3.0.4",
- "object.values": "^1.1.1",
- "read-pkg-up": "^2.0.0",
- "resolve": "^1.17.0",
- "tsconfig-paths": "^3.9.0"
- },
- "engines": {
- "node": ">=4"
- },
- "peerDependencies": {
- "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/debug": {
- "version": "2.6.9",
- "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
- "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ms": "2.0.0"
- }
- },
- "node_modules/eslint-plugin-import/node_modules/ms": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
- "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint-scope": {
- "version": "5.1.1",
- "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz",
- "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "esrecurse": "^4.3.0",
- "estraverse": "^4.1.1"
- },
- "engines": {
- "node": ">=8.0.0"
- }
- },
- "node_modules/eslint-utils": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz",
- "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "eslint-visitor-keys": "^1.1.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- }
- },
- "node_modules/eslint-visitor-keys": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz",
- "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/eslint/node_modules/@babel/code-frame": {
- "version": "7.12.11",
- "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz",
- "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/highlight": "^7.10.4"
- }
- },
- "node_modules/eslint/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/chalk": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.1.tgz",
- "integrity": "sha512-diHzdDKxcU+bAsUboHLPEDQiw0qEe0qd7SYUn3HgcFlWgbDcfLGswOHYeGrHKzG9z6UYf01d9VFMfZxPM1xZSg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.1.0",
- "supports-color": "^7.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/chalk?sponsor=1"
- }
- },
- "node_modules/eslint/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/eslint/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/eslint/node_modules/doctrine": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz",
- "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "esutils": "^2.0.2"
- },
- "engines": {
- "node": ">=6.0.0"
- }
- },
- "node_modules/eslint/node_modules/eslint-visitor-keys": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz",
- "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==",
- "dev": true,
- "license": "Apache-2.0",
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint/node_modules/globals": {
- "version": "13.8.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-13.8.0.tgz",
- "integrity": "sha512-rHtdA6+PDBIjeEvA91rpqzEvk/k3/i7EeNQiryiWuJH0Hw9cpyJMAt2jtbAwUaRdhD+573X4vWw6IcjKPasi9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "type-fest": "^0.20.2"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/eslint/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/eslint/node_modules/type-fest": {
- "version": "0.20.2",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz",
- "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/espree": {
- "version": "7.3.1",
- "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz",
- "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "acorn": "^7.4.0",
- "acorn-jsx": "^5.3.1",
- "eslint-visitor-keys": "^1.3.0"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/esprima": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
- "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
- "dev": true,
- "license": "BSD-2-Clause",
- "bin": {
- "esparse": "bin/esparse.js",
- "esvalidate": "bin/esvalidate.js"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/esquery": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz",
- "integrity": "sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "estraverse": "^5.1.0"
- },
- "engines": {
- "node": ">=0.10"
- }
- },
- "node_modules/esquery/node_modules/estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz",
- "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "estraverse": "^5.2.0"
- },
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esrecurse/node_modules/estraverse": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz",
- "integrity": "sha512-BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/estraverse": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
- "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=4.0"
- }
- },
- "node_modules/esutils": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
- "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
- "dev": true,
- "license": "BSD-2-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/events": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.x"
- }
- },
- "node_modules/fast-deep-equal": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
- "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-glob": {
- "version": "3.3.2",
- "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz",
- "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@nodelib/fs.stat": "^2.0.2",
- "@nodelib/fs.walk": "^1.2.3",
- "glob-parent": "^5.1.2",
- "merge2": "^1.3.0",
- "micromatch": "^4.0.4"
- },
- "engines": {
- "node": ">=8.6.0"
- }
- },
- "node_modules/fast-json-stable-stringify": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
- "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fast-levenshtein": {
- "version": "2.0.6",
- "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
- "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/fastest-levenshtein": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
- "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4.9.1"
- }
- },
- "node_modules/fastq": {
- "version": "1.17.1",
- "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz",
- "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "reusify": "^1.0.4"
- }
- },
- "node_modules/file-entry-cache": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz",
- "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^3.0.4"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/file-loader": {
- "version": "1.1.11",
- "resolved": "https://registry.npmjs.org/file-loader/-/file-loader-1.1.11.tgz",
- "integrity": "sha512-TGR4HU7HUsGg6GCOPJnFk06RhWgEWFLAGWiT6rcD+GRC2keU3s9RGJ+b3Z6/U73jwwNb2gKLJ7YCrp+jvU4ALg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "loader-utils": "^1.0.2",
- "schema-utils": "^0.4.5"
- },
- "engines": {
- "node": ">= 4.3 < 5.0.0 || >= 5.10"
- },
- "peerDependencies": {
- "webpack": "^2.0.0 || ^3.0.0 || ^4.0.0"
- }
- },
- "node_modules/file-loader/node_modules/schema-utils": {
- "version": "0.4.7",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz",
- "integrity": "sha512-v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.1.0",
- "ajv-keywords": "^3.1.0"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/fill-range": {
- "version": "7.1.1",
- "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
- "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "to-regex-range": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/find-cache-dir": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.1.tgz",
- "integrity": "sha512-t2GDMt3oGC/v+BMwzmllWDuJF/xcDtE5j/fCGbqDD7OLuJkj0cfh1YSA5VKPvwMeLFLNDBkwOKZ2X85jGLVftQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "commondir": "^1.0.1",
- "make-dir": "^3.0.2",
- "pkg-dir": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/avajs/find-cache-dir?sponsor=1"
- }
- },
- "node_modules/find-up": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
- "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/flat": {
- "version": "5.0.2",
- "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz",
- "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==",
- "dev": true,
- "license": "BSD-3-Clause",
- "bin": {
- "flat": "cli.js"
- }
- },
- "node_modules/flat-cache": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz",
- "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.1.0",
- "rimraf": "^3.0.2"
- },
- "engines": {
- "node": "^10.12.0 || >=12.0.0"
- }
- },
- "node_modules/flat-cache/node_modules/rimraf": {
- "version": "3.0.2",
- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz",
- "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "glob": "^7.1.3"
- },
- "bin": {
- "rimraf": "bin.js"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/flatted": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz",
- "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fork-awesome": {
- "version": "1.1.7",
- "resolved": "https://registry.npmjs.org/fork-awesome/-/fork-awesome-1.1.7.tgz",
- "integrity": "sha512-IHI7XCSXrKfUIWslse8c/PaaVDT1oBaYge+ju40ihL2ooiQeBpTr4wvIXhgTd2NuhntlvX+M5jYHAPTzNlmv0g==",
- "license": "(OFL-1.1 AND MIT)",
- "engines": {
- "node": ">=0.10.3"
- }
- },
- "node_modules/fs-minipass": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-2.1.0.tgz",
- "integrity": "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/fs.realpath": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/fsevents": {
- "version": "2.3.3",
- "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz",
- "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==",
- "dev": true,
- "hasInstallScript": true,
- "license": "MIT",
- "optional": true,
- "os": [
- "darwin"
- ],
- "engines": {
- "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
- }
- },
- "node_modules/function-bind": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
- "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/functional-red-black-tree": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz",
- "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/gensync": {
- "version": "1.0.0-beta.2",
- "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
- "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.9.0"
- }
- },
- "node_modules/get-intrinsic": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
- "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has": "^1.0.3",
- "has-symbols": "^1.0.1"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/glob": {
- "version": "7.1.7",
- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz",
- "integrity": "sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "fs.realpath": "^1.0.0",
- "inflight": "^1.0.4",
- "inherits": "2",
- "minimatch": "^3.0.4",
- "once": "^1.3.0",
- "path-is-absolute": "^1.0.0"
- },
- "engines": {
- "node": "*"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/glob-parent": {
- "version": "5.1.2",
- "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
- "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "is-glob": "^4.0.1"
- },
- "engines": {
- "node": ">= 6"
- }
- },
- "node_modules/glob-to-regexp": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz",
- "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==",
- "dev": true,
- "license": "BSD-2-Clause"
- },
- "node_modules/global-modules": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-2.0.0.tgz",
- "integrity": "sha512-NGbfmJBp9x8IxyJSd1P+otYK8vonoJactOogrVfFRIAEY1ukil8RSKDz2Yo7wh1oihl51l/r6W4epkeKJHqL8A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "global-prefix": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/global-prefix": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-3.0.0.tgz",
- "integrity": "sha512-awConJSVCHVGND6x3tmMaKcQvwXLhjdkmomy2W+Goaui8YPgYgXJZewhg3fWC+DlfqqQuWg8AwqjGTD2nAPVWg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ini": "^1.3.5",
- "kind-of": "^6.0.2",
- "which": "^1.3.1"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/globals": {
- "version": "11.12.0",
- "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
- "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/globby": {
- "version": "11.1.0",
- "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz",
- "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "array-union": "^2.1.0",
- "dir-glob": "^3.0.1",
- "fast-glob": "^3.2.9",
- "ignore": "^5.2.0",
- "merge2": "^1.4.1",
- "slash": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/globby/node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/globjoin": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/globjoin/-/globjoin-0.1.4.tgz",
- "integrity": "sha1-L0SUrIkZ43Z8XLtpHp9GMyQoXUM=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/graceful-fs": {
- "version": "4.2.11",
- "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz",
- "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/has": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
- "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4.0"
- }
- },
- "node_modules/has-bigints": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
- "integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/has-flag": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
- "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/has-symbols": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
- "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/he": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
- "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
- "license": "MIT",
- "bin": {
- "he": "bin/he"
- }
- },
- "node_modules/hosted-git-info": {
- "version": "2.8.9",
- "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz",
- "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/html-tags": {
- "version": "3.3.1",
- "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-3.3.1.tgz",
- "integrity": "sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/icss-utils": {
- "version": "5.1.0",
- "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz",
- "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/ignore": {
- "version": "4.0.6",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz",
- "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/import-fresh": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz",
- "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "parent-module": "^1.0.0",
- "resolve-from": "^4.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/import-fresh/node_modules/resolve-from": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
- "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/import-local": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz",
- "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pkg-dir": "^4.2.0",
- "resolve-cwd": "^3.0.0"
- },
- "bin": {
- "import-local-fixture": "fixtures/cli.js"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/imurmurhash": {
- "version": "0.1.4",
- "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
- "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.8.19"
- }
- },
- "node_modules/indent-string": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz",
- "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/infer-owner": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz",
- "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/inflight": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "once": "^1.3.0",
- "wrappy": "1"
- }
- },
- "node_modules/inherits": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/ini": {
- "version": "1.3.8",
- "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz",
- "integrity": "sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/interpret": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz",
- "integrity": "sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/is-arrayish": {
- "version": "0.2.1",
- "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
- "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/is-bigint": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.2.tgz",
- "integrity": "sha512-0JV5+SOCQkIdzjBK9buARcV804Ddu7A0Qet6sHi3FimE9ne6m4BGQZfRn+NZiXbBk4F4XmHfDZIipLj9pX8dSA==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-binary-path": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
- "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "binary-extensions": "^2.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-boolean-object": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.1.tgz",
- "integrity": "sha512-bXdQWkECBUIAcCkeH1unwJLIpZYaa5VvuygSyS/c2lf719mTKZDU5UdDRlpd01UjADgmW8RfqaP+mRaVPdr/Ng==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-callable": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
- "integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-core-module": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.3.0.tgz",
- "integrity": "sha512-xSphU2KG9867tsYdLD4RWQ1VqdFl4HTO9Thf3I/3dLEfr0dbPTWKsuCKrgqMljg4nPE+Gq0VCnzT3gr0CyBmsw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-date-object": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.4.tgz",
- "integrity": "sha512-/b4ZVsG7Z5XVtIxs/h9W8nvfLgSAyKYdtGWQLbqy6jA1icmgjf8WCoTKgeS4wy5tYaPePouzFMANbnj94c2Z+A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-extglob": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
- "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-fullwidth-code-point": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
- "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/is-glob": {
- "version": "4.0.1",
- "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
- "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-extglob": "^2.1.1"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-negative-zero": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
- "integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-number": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
- "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.12.0"
- }
- },
- "node_modules/is-number-object": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.5.tgz",
- "integrity": "sha512-RU0lI/n95pMoUKu9v1BZP5MBcZuNSVJkMkAG2dJqC4z2GlkGUNeH68SuHuBKBD/XFe+LHZ+f9BKkLET60Niedw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-plain-obj": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz",
- "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-plain-object": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-5.0.0.tgz",
- "integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/is-regex": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.3.tgz",
- "integrity": "sha512-qSVXFz28HM7y+IWX6vLCsexdlvzT1PJNFSBuaQLQ5o0IEw8UDYW6/2+eCMVyIsbM8CNLX2a/QWmSpyxYEHY7CQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "has-symbols": "^1.0.2"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-string": {
- "version": "1.0.6",
- "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.6.tgz",
- "integrity": "sha512-2gdzbKUuqtQ3lYNrUTQYoClPhm7oQu4UdpSZMp1/DGgkHBT8E2Z1l0yMdb6D4zNAxwDiMv8MdulKROJGNl0Q0w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/is-symbol": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
- "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-symbols": "^1.0.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/isarray": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
- "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/isexe": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/isobject": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
- "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/jest-worker": {
- "version": "26.6.2",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz",
- "integrity": "sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/js-tokens": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
- "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/js-yaml": {
- "version": "3.14.1",
- "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz",
- "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "argparse": "^1.0.7",
- "esprima": "^4.0.0"
- },
- "bin": {
- "js-yaml": "bin/js-yaml.js"
- }
- },
- "node_modules/jsesc": {
- "version": "2.5.2",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
- "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "jsesc": "bin/jsesc"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/json-buffer": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz",
- "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-parse-even-better-errors": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz",
- "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-schema-traverse": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
- "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json-stable-stringify-without-jsonify": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz",
- "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/json5": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz",
- "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minimist": "^1.2.0"
- },
- "bin": {
- "json5": "lib/cli.js"
- }
- },
- "node_modules/keyv": {
- "version": "4.5.4",
- "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz",
- "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "json-buffer": "3.0.1"
- }
- },
- "node_modules/kind-of": {
- "version": "6.0.3",
- "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
- "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/klona": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.4.tgz",
- "integrity": "sha512-ZRbnvdg/NxqzC7L9Uyqzf4psi1OM4Cuc+sJAkQPjO6XkQIJTNbfK2Rsmbw8fx1p2mkZdp2FZYo2+LwXYY/uwIA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/known-css-properties": {
- "version": "0.31.0",
- "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.31.0.tgz",
- "integrity": "sha512-sBPIUGTNF0czz0mwGGUoKKJC8Q7On1GPbCSFPfyEsfHb2DyBG0Y4QtV+EVWpINSaiGKZblDNuF5AezxSgOhesQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/levn": {
- "version": "0.4.1",
- "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz",
- "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1",
- "type-check": "~0.4.0"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/lines-and-columns": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz",
- "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/load-json-file": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz",
- "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "graceful-fs": "^4.1.2",
- "parse-json": "^2.2.0",
- "pify": "^2.0.0",
- "strip-bom": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/load-json-file/node_modules/parse-json": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz",
- "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "error-ex": "^1.2.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/loader-runner": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz",
- "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6.11.5"
- }
- },
- "node_modules/loader-utils": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.2.tgz",
- "integrity": "sha512-I5d00Pd/jwMD2QCduo657+YM/6L3KZu++pmX9VFncxaxvHcru9jx1lBaFft+r4Mt2jK0Yhp41XlRAihzPxHNCg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^1.0.1"
- },
- "engines": {
- "node": ">=4.0.0"
- }
- },
- "node_modules/locate-path": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
- "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^2.0.0",
- "path-exists": "^3.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/lodash": {
- "version": "4.17.21",
- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
- "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.debounce": {
- "version": "4.0.8",
- "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz",
- "integrity": "sha1-gteb/zCmfEAF/9XiUVMArZyk168=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lodash.truncate": {
- "version": "4.4.2",
- "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz",
- "integrity": "sha1-WjUNoLERO4N+z//VgSy+WNbq4ZM=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/lru-cache": {
- "version": "6.0.0",
- "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz",
- "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/make-dir": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz",
- "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "semver": "^6.0.0"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/mathml-tag-names": {
- "version": "2.1.3",
- "resolved": "https://registry.npmjs.org/mathml-tag-names/-/mathml-tag-names-2.1.3.tgz",
- "integrity": "sha512-APMBEanjybaPzUrfqU0IMU5I0AswKMH7k8OTLs0vvV4KZpExkTkY87nR/zpbuTPj+gARop7aGUbl11pnDfW6xg==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/wooorm"
- }
- },
- "node_modules/mdn-data": {
- "version": "2.0.30",
- "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz",
- "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==",
- "dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/meow": {
- "version": "13.2.0",
- "resolved": "https://registry.npmjs.org/meow/-/meow-13.2.0.tgz",
- "integrity": "sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=18"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/merge-stream": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
- "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/merge2": {
- "version": "1.4.1",
- "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz",
- "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/micromatch": {
- "version": "4.0.7",
- "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz",
- "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "braces": "^3.0.3",
- "picomatch": "^2.3.1"
- },
- "engines": {
- "node": ">=8.6"
- }
- },
- "node_modules/mime-db": {
- "version": "1.52.0",
- "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
- "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mime-types": {
- "version": "2.1.35",
- "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
- "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "mime-db": "1.52.0"
- },
- "engines": {
- "node": ">= 0.6"
- }
- },
- "node_modules/mini-css-extract-plugin": {
- "version": "0.11.3",
- "resolved": "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.11.3.tgz",
- "integrity": "sha512-n9BA8LonkOkW1/zn+IbLPQmovsL0wMb9yx75fMJQZf2X1Zoec9yTZtyMePcyu19wPkmFbzZZA6fLTotpFhQsOA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "loader-utils": "^1.1.0",
- "normalize-url": "1.9.1",
- "schema-utils": "^1.0.0",
- "webpack-sources": "^1.1.0"
- },
- "engines": {
- "node": ">= 6.9.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.4.0 || ^5.0.0"
- }
- },
- "node_modules/minimatch": {
- "version": "3.1.2",
- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz",
- "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "brace-expansion": "^1.1.7"
- },
- "engines": {
- "node": "*"
- }
- },
- "node_modules/minimist": {
- "version": "1.2.7",
- "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz",
- "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/minipass": {
- "version": "3.1.3",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz",
- "integrity": "sha512-Mgd2GdMVzY+x3IJ+oHnVM+KG3lA5c8tnabyJKmHSaG2kAGpudxuOf8ToDkhumF7UzME7DecbQE9uOZhNm7PuJg==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minipass-collect": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/minipass-collect/-/minipass-collect-1.0.2.tgz",
- "integrity": "sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-flush": {
- "version": "1.0.5",
- "resolved": "https://registry.npmjs.org/minipass-flush/-/minipass-flush-1.0.5.tgz",
- "integrity": "sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/minipass-pipeline": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/minipass-pipeline/-/minipass-pipeline-1.2.4.tgz",
- "integrity": "sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/minizlib": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-2.1.2.tgz",
- "integrity": "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "minipass": "^3.0.0",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/ms": {
- "version": "2.1.2",
- "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
- "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/nanoid": {
- "version": "3.3.7",
- "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz",
- "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "bin": {
- "nanoid": "bin/nanoid.cjs"
- },
- "engines": {
- "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1"
- }
- },
- "node_modules/natural-compare": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz",
- "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/neo-async": {
- "version": "2.6.2",
- "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz",
- "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/node-releases": {
- "version": "2.0.14",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz",
- "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/normalize-package-data": {
- "version": "2.5.0",
- "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
- "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "hosted-git-info": "^2.1.4",
- "resolve": "^1.10.0",
- "semver": "2 || 3 || 4 || 5",
- "validate-npm-package-license": "^3.0.1"
- }
- },
- "node_modules/normalize-package-data/node_modules/semver": {
- "version": "5.7.2",
- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz",
- "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver"
- }
- },
- "node_modules/normalize-path": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
- "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/normalize-url": {
- "version": "1.9.1",
- "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz",
- "integrity": "sha1-LMDWazHqIwNkWENuNiDYWVTGbDw=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object-assign": "^4.0.1",
- "prepend-http": "^1.0.0",
- "query-string": "^4.1.0",
- "sort-keys": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/object-assign": {
- "version": "4.1.1",
- "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
- "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/object-inspect": {
- "version": "1.10.3",
- "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.10.3.tgz",
- "integrity": "sha512-e5mCJlSH7poANfC8z8S9s9S2IN5/4Zb3aZ33f5s8YqoazCFzNLloLU8r5VCG+G7WoqLvAAZoVMcy3tp/3X0Plw==",
- "dev": true,
- "license": "MIT",
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object-keys": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
- "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.assign": {
- "version": "4.1.2",
- "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
- "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "has-symbols": "^1.0.1",
- "object-keys": "^1.1.1"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/object.entries": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.3.tgz",
- "integrity": "sha512-ym7h7OZebNS96hn5IJeyUmaWhaSM4SVtAPPfNLQEI2MYWCO2egsITb9nab2+i/Pwibx+R0mtn+ltKJXRSeTMGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.0",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.1",
- "has": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- }
- },
- "node_modules/object.values": {
- "version": "1.1.3",
- "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.3.tgz",
- "integrity": "sha512-nkF6PfDB9alkOUxpf1HNm/QlkeW3SReqL5WXeBLpEJJnlPSvRaDQpW3gQTksTN3fgJX4hL42RzKyOin6ff3tyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3",
- "es-abstract": "^1.18.0-next.2",
- "has": "^1.0.3"
- },
- "engines": {
- "node": ">= 0.4"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/once": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "wrappy": "1"
- }
- },
- "node_modules/optionator": {
- "version": "0.9.1",
- "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz",
- "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "deep-is": "^0.1.3",
- "fast-levenshtein": "^2.0.6",
- "levn": "^0.4.1",
- "prelude-ls": "^1.2.1",
- "type-check": "^0.4.0",
- "word-wrap": "^1.2.3"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/p-limit": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
- "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-try": "^2.0.0"
- },
- "engines": {
- "node": ">=6"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-locate": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
- "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^1.1.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-locate/node_modules/p-limit": {
- "version": "1.3.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
- "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-try": "^1.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-locate/node_modules/p-try": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
- "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/p-map": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz",
- "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "aggregate-error": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/p-try": {
- "version": "2.2.0",
- "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
- "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parent-module": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz",
- "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "callsites": "^3.0.0"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/parse-json": {
- "version": "5.2.0",
- "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz",
- "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/code-frame": "^7.0.0",
- "error-ex": "^1.3.1",
- "json-parse-even-better-errors": "^2.3.0",
- "lines-and-columns": "^1.1.6"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/path-exists": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
- "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/path-is-absolute": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/path-key": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz",
- "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/path-parse": {
- "version": "1.0.7",
- "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
- "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/path-type": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
- "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/picocolors": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz",
- "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/picomatch": {
- "version": "2.3.1",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
- "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/jonschlinkert"
- }
- },
- "node_modules/pify": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz",
- "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/pkg-dir": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz",
- "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-dir/node_modules/find-up": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz",
- "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "locate-path": "^5.0.0",
- "path-exists": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-dir/node_modules/locate-path": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz",
- "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-locate": "^4.1.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-dir/node_modules/p-locate": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz",
- "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "p-limit": "^2.2.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/pkg-dir/node_modules/path-exists": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz",
- "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/postcss": {
- "version": "8.4.38",
- "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz",
- "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "nanoid": "^3.3.7",
- "picocolors": "^1.0.0",
- "source-map-js": "^1.2.0"
- },
- "engines": {
- "node": "^10 || ^12 || >=14"
- }
- },
- "node_modules/postcss-media-query-parser": {
- "version": "0.2.3",
- "resolved": "https://registry.npmjs.org/postcss-media-query-parser/-/postcss-media-query-parser-0.2.3.tgz",
- "integrity": "sha1-J7Ocb02U+Bsac7j3Y1HGCeXO8kQ=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/postcss-modules-extract-imports": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz",
- "integrity": "sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-local-by-default": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.5.tgz",
- "integrity": "sha512-6MieY7sIfTK0hYfafw1OMEG+2bg8Q1ocHCpoWLqOKj3JXlKu4G7btkmM/B7lFubYkYWmRSPLZi5chid63ZaZYw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "icss-utils": "^5.0.0",
- "postcss-selector-parser": "^6.0.2",
- "postcss-value-parser": "^4.1.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-scope": {
- "version": "3.2.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.2.0.tgz",
- "integrity": "sha512-oq+g1ssrsZOsx9M96c5w8laRmvEu9C3adDSjI8oTcbfkrTE8hx/zfyobUoWIxaKPO8bt6S62kxpw5GqypEw1QQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "postcss-selector-parser": "^6.0.4"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-modules-values": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz",
- "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "icss-utils": "^5.0.0"
- },
- "engines": {
- "node": "^10 || ^12 || >= 14"
- },
- "peerDependencies": {
- "postcss": "^8.1.0"
- }
- },
- "node_modules/postcss-resolve-nested-selector": {
- "version": "0.1.1",
- "resolved": "https://registry.npmjs.org/postcss-resolve-nested-selector/-/postcss-resolve-nested-selector-0.1.1.tgz",
- "integrity": "sha1-Kcy8fDfe36wwTp//C/FZaz9qDk4=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/postcss-safe-parser": {
- "version": "7.0.0",
- "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-7.0.0.tgz",
- "integrity": "sha512-ovehqRNVCpuFzbXoTb4qLtyzK3xn3t/CUBxOs8LsnQjQrShaB4lKiHoVqY8ANaC0hBMHq5QVWk77rwGklFUDrg==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/postcss/"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "engines": {
- "node": ">=18.0"
- },
- "peerDependencies": {
- "postcss": "^8.4.31"
- }
- },
- "node_modules/postcss-selector-parser": {
- "version": "6.1.0",
- "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.0.tgz",
- "integrity": "sha512-UMz42UD0UY0EApS0ZL9o1XnLhSTtvvvLe5Dc2H2O56fvRZi+KulDyf5ctDhhtYJBGKStV2FL1fy6253cmLgqVQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cssesc": "^3.0.0",
- "util-deprecate": "^1.0.2"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/postcss-value-parser": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz",
- "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/prelude-ls": {
- "version": "1.2.1",
- "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz",
- "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/prepend-http": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz",
- "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/progress": {
- "version": "2.0.3",
- "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz",
- "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/promise-inflight": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz",
- "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/pure-extras": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/pure-extras/-/pure-extras-1.0.0.tgz",
- "integrity": "sha1-N+PMNZDLqFCYFFTNpdso4npjhxo=",
- "license": "Open"
- },
- "node_modules/purecss": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/purecss/-/purecss-1.0.1.tgz",
- "integrity": "sha512-mTUc5ZzpzafswEhCmTDfSRMMyRFdLYdd+KywMwnBC/MuA/Th7jug2z0Xso4WkxvtxoU/BS9aRb7WnBNyuA7YJQ==",
- "license": "BSD"
- },
- "node_modules/query-string": {
- "version": "4.3.4",
- "resolved": "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz",
- "integrity": "sha1-u7aTucqRXCMlFbIosaArYJBD2+s=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "object-assign": "^4.1.0",
- "strict-uri-encode": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/queue-microtask": {
- "version": "1.2.3",
- "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
- "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/randombytes": {
- "version": "2.1.0",
- "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
- "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "safe-buffer": "^5.1.0"
- }
- },
- "node_modules/read-pkg": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz",
- "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "load-json-file": "^2.0.0",
- "normalize-package-data": "^2.3.2",
- "path-type": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg-up": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz",
- "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "find-up": "^2.0.0",
- "read-pkg": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/read-pkg/node_modules/path-type": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz",
- "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "pify": "^2.0.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/readdirp": {
- "version": "3.5.0",
- "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.5.0.tgz",
- "integrity": "sha512-cMhu7c/8rdhkHXWsY+osBhfSy0JikwpHK/5+imo+LpeasTF8ouErHrlYkwT0++njiyuDvc7OFY5T3ukvZ8qmFQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "picomatch": "^2.2.1"
- },
- "engines": {
- "node": ">=8.10.0"
- }
- },
- "node_modules/rechoir": {
- "version": "0.8.0",
- "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.8.0.tgz",
- "integrity": "sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve": "^1.20.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/regenerate": {
- "version": "1.4.2",
- "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz",
- "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/regenerate-unicode-properties": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
- "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regenerator-runtime": {
- "version": "0.13.7",
- "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz",
- "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/regenerator-transform": {
- "version": "0.14.5",
- "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.5.tgz",
- "integrity": "sha512-eOf6vka5IO151Jfsw2NO9WpGX58W6wWmefK3I1zEGr0lOD0u8rwPaNqQL1aRxUaxLeKO3ArNh3VYg1KbaD+FFw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@babel/runtime": "^7.8.4"
- }
- },
- "node_modules/regexpp": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz",
- "integrity": "sha512-ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/mysticatea"
- }
- },
- "node_modules/regexpu-core": {
- "version": "4.7.1",
- "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.1.tgz",
- "integrity": "sha512-ywH2VUraA44DZQuRKzARmw6S66mr48pQVva4LBeRhcOltJ6hExvWly5ZjFLYo67xbIxb6W1q4bAGtgfEl20zfQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "regenerate": "^1.4.0",
- "regenerate-unicode-properties": "^8.2.0",
- "regjsgen": "^0.5.1",
- "regjsparser": "^0.6.4",
- "unicode-match-property-ecmascript": "^1.0.4",
- "unicode-match-property-value-ecmascript": "^1.2.0"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/regjsgen": {
- "version": "0.5.2",
- "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.2.tgz",
- "integrity": "sha512-OFFT3MfrH90xIW8OOSyUrk6QHD5E9JOTeGodiJeBS3J6IwlgzJMNE/1bZklWz5oTg+9dCMyEetclvCVXOPoN3A==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/regjsparser": {
- "version": "0.6.9",
- "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.9.tgz",
- "integrity": "sha512-ZqbNRz1SNjLAiYuwY0zoXW8Ne675IX5q+YHioAGbCw4X96Mjl2+dcX9B2ciaeyYjViDAfvIjFpQjJgLttTEERQ==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "jsesc": "~0.5.0"
- },
- "bin": {
- "regjsparser": "bin/parser"
- }
- },
- "node_modules/regjsparser/node_modules/jsesc": {
- "version": "0.5.0",
- "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
- "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
- "dev": true,
- "bin": {
- "jsesc": "bin/jsesc"
- }
- },
- "node_modules/require-from-string": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz",
- "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/resolve": {
- "version": "1.20.0",
- "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz",
- "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-core-module": "^2.2.0",
- "path-parse": "^1.0.6"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/resolve-cwd": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz",
- "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "resolve-from": "^5.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/resolve-from": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz",
- "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/reusify": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
- "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "iojs": ">=1.0.0",
- "node": ">=0.10.0"
- }
- },
- "node_modules/run-parallel": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz",
- "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "queue-microtask": "^1.2.2"
- }
- },
- "node_modules/safe-buffer": {
- "version": "5.2.1",
- "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "dev": true,
- "funding": [
- {
- "type": "github",
- "url": "https://github.com/sponsors/feross"
- },
- {
- "type": "patreon",
- "url": "https://www.patreon.com/feross"
- },
- {
- "type": "consulting",
- "url": "https://feross.org/support"
- }
- ],
- "license": "MIT"
- },
- "node_modules/sass": {
- "version": "1.32.12",
- "resolved": "https://registry.npmjs.org/sass/-/sass-1.32.12.tgz",
- "integrity": "sha512-zmXn03k3hN0KaiVTjohgkg98C3UowhL1/VSGdj4/VAAiMKGQOE80PFPxFP2Kyq0OUskPKcY5lImkhBKEHlypJA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "chokidar": ">=3.0.0 <4.0.0"
- },
- "bin": {
- "sass": "sass.js"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/sass-loader": {
- "version": "10.1.1",
- "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-10.1.1.tgz",
- "integrity": "sha512-W6gVDXAd5hR/WHsPicvZdjAWHBcEJ44UahgxcIE196fW2ong0ZHMPO1kZuI5q0VlvMQZh32gpv69PLWQm70qrw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "klona": "^2.0.4",
- "loader-utils": "^2.0.0",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.0.0",
- "semver": "^7.3.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "fibers": ">= 3.1.0",
- "node-sass": "^4.0.0 || ^5.0.0",
- "sass": "^1.3.0",
- "webpack": "^4.36.0 || ^5.0.0"
- },
- "peerDependenciesMeta": {
- "fibers": {
- "optional": true
- },
- "node-sass": {
- "optional": true
- },
- "sass": {
- "optional": true
- }
- }
- },
- "node_modules/sass-loader/node_modules/json5": {
- "version": "2.2.3",
- "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
- "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "json5": "lib/cli.js"
- },
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/sass-loader/node_modules/loader-utils": {
- "version": "2.0.4",
- "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
- "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "big.js": "^5.2.2",
- "emojis-list": "^3.0.0",
- "json5": "^2.1.2"
- },
- "engines": {
- "node": ">=8.9.0"
- }
- },
- "node_modules/sass-loader/node_modules/schema-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
- "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.6",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/sass-loader/node_modules/semver": {
- "version": "7.5.4",
- "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz",
- "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "lru-cache": "^6.0.0"
- },
- "bin": {
- "semver": "bin/semver.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/schema-utils": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-1.0.0.tgz",
- "integrity": "sha512-i27Mic4KovM/lnGsy8whRCHhc7VicJajAjTrYg11K9zfZXnYIt4k5F+kZkwjnrhKzLic/HLU4j11mjsz2G/75g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ajv": "^6.1.0",
- "ajv-errors": "^1.0.0",
- "ajv-keywords": "^3.1.0"
- },
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/semver": {
- "version": "6.3.1",
- "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz",
- "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==",
- "dev": true,
- "license": "ISC",
- "bin": {
- "semver": "bin/semver.js"
- }
- },
- "node_modules/serialize-javascript": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz",
- "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/shallow-clone": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
- "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "kind-of": "^6.0.2"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-command": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz",
- "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "shebang-regex": "^3.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/shebang-regex": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz",
- "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/signal-exit": {
- "version": "4.1.0",
- "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
- "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=14"
- },
- "funding": {
- "url": "https://github.com/sponsors/isaacs"
- }
- },
- "node_modules/slash": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz",
- "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/slice-ansi": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz",
- "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-styles": "^4.0.0",
- "astral-regex": "^2.0.0",
- "is-fullwidth-code-point": "^3.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/slice-ansi?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/ansi-styles": {
- "version": "4.3.0",
- "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
- "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-convert": "^2.0.1"
- },
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-styles?sponsor=1"
- }
- },
- "node_modules/slice-ansi/node_modules/color-convert": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
- "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "color-name": "~1.1.4"
- },
- "engines": {
- "node": ">=7.0.0"
- }
- },
- "node_modules/slice-ansi/node_modules/color-name": {
- "version": "1.1.4",
- "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
- "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/sort-keys": {
- "version": "1.1.2",
- "resolved": "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz",
- "integrity": "sha1-RBttTTRnmPG05J6JIK37oOVD+a0=",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-plain-obj": "^1.0.0"
- },
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-list-map": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz",
- "integrity": "sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/source-map": {
- "version": "0.6.1",
- "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
- "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-js": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz",
- "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==",
- "dev": true,
- "license": "BSD-3-Clause",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/source-map-support": {
- "version": "0.5.21",
- "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz",
- "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "buffer-from": "^1.0.0",
- "source-map": "^0.6.0"
- }
- },
- "node_modules/spdx-correct": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz",
- "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "spdx-expression-parse": "^3.0.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-exceptions": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz",
- "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==",
- "dev": true,
- "license": "CC-BY-3.0"
- },
- "node_modules/spdx-expression-parse": {
- "version": "3.0.1",
- "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz",
- "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "spdx-exceptions": "^2.1.0",
- "spdx-license-ids": "^3.0.0"
- }
- },
- "node_modules/spdx-license-ids": {
- "version": "3.0.7",
- "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz",
- "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==",
- "dev": true,
- "license": "CC0-1.0"
- },
- "node_modules/sprintf-js": {
- "version": "1.0.3",
- "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
- "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
- "dev": true,
- "license": "BSD-3-Clause"
- },
- "node_modules/ssri": {
- "version": "8.0.1",
- "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz",
- "integrity": "sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "minipass": "^3.1.1"
- },
- "engines": {
- "node": ">= 8"
- }
- },
- "node_modules/strict-uri-encode": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz",
- "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/string-width": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
- "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "emoji-regex": "^8.0.0",
- "is-fullwidth-code-point": "^3.0.0",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/string.prototype.trimend": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
- "integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/string.prototype.trimstart": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
- "integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "call-bind": "^1.0.2",
- "define-properties": "^1.1.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/strip-ansi": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
- "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^5.0.1"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/strip-bom": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
- "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/strip-json-comments": {
- "version": "3.1.1",
- "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz",
- "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/stylelint": {
- "version": "16.6.1",
- "resolved": "https://registry.npmjs.org/stylelint/-/stylelint-16.6.1.tgz",
- "integrity": "sha512-yNgz2PqWLkhH2hw6X9AweV9YvoafbAD5ZsFdKN9BvSDVwGvPh+AUIrn7lYwy1S7IHmtFin75LLfX1m0D2tHu8Q==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/stylelint"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/stylelint"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "@csstools/css-parser-algorithms": "^2.6.3",
- "@csstools/css-tokenizer": "^2.3.1",
- "@csstools/media-query-list-parser": "^2.1.11",
- "@csstools/selector-specificity": "^3.1.1",
- "@dual-bundle/import-meta-resolve": "^4.1.0",
- "balanced-match": "^2.0.0",
- "colord": "^2.9.3",
- "cosmiconfig": "^9.0.0",
- "css-functions-list": "^3.2.2",
- "css-tree": "^2.3.1",
- "debug": "^4.3.4",
- "fast-glob": "^3.3.2",
- "fastest-levenshtein": "^1.0.16",
- "file-entry-cache": "^9.0.0",
- "global-modules": "^2.0.0",
- "globby": "^11.1.0",
- "globjoin": "^0.1.4",
- "html-tags": "^3.3.1",
- "ignore": "^5.3.1",
- "imurmurhash": "^0.1.4",
- "is-plain-object": "^5.0.0",
- "known-css-properties": "^0.31.0",
- "mathml-tag-names": "^2.1.3",
- "meow": "^13.2.0",
- "micromatch": "^4.0.7",
- "normalize-path": "^3.0.0",
- "picocolors": "^1.0.1",
- "postcss": "^8.4.38",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-safe-parser": "^7.0.0",
- "postcss-selector-parser": "^6.1.0",
- "postcss-value-parser": "^4.2.0",
- "resolve-from": "^5.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^7.1.0",
- "supports-hyperlinks": "^3.0.0",
- "svg-tags": "^1.0.0",
- "table": "^6.8.2",
- "write-file-atomic": "^5.0.1"
- },
- "bin": {
- "stylelint": "bin/stylelint.mjs"
- },
- "engines": {
- "node": ">=18.12.0"
- }
- },
- "node_modules/stylelint-config-recommended": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-recommended/-/stylelint-config-recommended-3.0.0.tgz",
- "integrity": "sha512-F6yTRuc06xr1h5Qw/ykb2LuFynJ2IxkKfCMf+1xqPffkxh0S09Zc902XCffcsw/XMFq/OzQ1w54fLIDtmRNHnQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "stylelint": ">=10.1.0"
- }
- },
- "node_modules/stylelint-config-standard": {
- "version": "20.0.0",
- "resolved": "https://registry.npmjs.org/stylelint-config-standard/-/stylelint-config-standard-20.0.0.tgz",
- "integrity": "sha512-IB2iFdzOTA/zS4jSVav6z+wGtin08qfj+YyExHB3LF9lnouQht//YyB0KZq9gGz5HNPkddHOzcY8HsUey6ZUlA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "stylelint-config-recommended": "^3.0.0"
- },
- "peerDependencies": {
- "stylelint": ">=10.1.0"
- }
- },
- "node_modules/stylelint-scss": {
- "version": "6.3.2",
- "resolved": "https://registry.npmjs.org/stylelint-scss/-/stylelint-scss-6.3.2.tgz",
- "integrity": "sha512-pNk9mXOVKkQtd+SROPC9io8ISSgX+tOVPhFdBE+LaKQnJMLdWPbGKAGYv4Wmf/RrnOjkutunNTN9kKMhkdE5qA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "known-css-properties": "^0.31.0",
- "postcss-media-query-parser": "^0.2.3",
- "postcss-resolve-nested-selector": "^0.1.1",
- "postcss-selector-parser": "^6.1.0",
- "postcss-value-parser": "^4.2.0"
- },
- "engines": {
- "node": ">=18.12.0"
- },
- "peerDependencies": {
- "stylelint": "^16.0.2"
- }
- },
- "node_modules/stylelint/node_modules/ansi-regex": {
- "version": "6.0.1",
- "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz",
- "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/ansi-regex?sponsor=1"
- }
- },
- "node_modules/stylelint/node_modules/file-entry-cache": {
- "version": "9.0.0",
- "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-9.0.0.tgz",
- "integrity": "sha512-6MgEugi8p2tiUhqO7GnPsmbCCzj0YRCwwaTbpGRyKZesjRSzkqkAE9fPp7V2yMs5hwfgbQLgdvSSkGNg1s5Uvw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flat-cache": "^5.0.0"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/stylelint/node_modules/flat-cache": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-5.0.0.tgz",
- "integrity": "sha512-JrqFmyUl2PnPi1OvLyTVHnQvwQ0S+e6lGSwu8OkAZlSaNIZciTY2H/cOOROxsBA1m/LZNHDsqAgDZt6akWcjsQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "flatted": "^3.3.1",
- "keyv": "^4.5.4"
- },
- "engines": {
- "node": ">=18"
- }
- },
- "node_modules/stylelint/node_modules/ignore": {
- "version": "5.3.1",
- "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz",
- "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">= 4"
- }
- },
- "node_modules/stylelint/node_modules/strip-ansi": {
- "version": "7.1.0",
- "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
- "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "ansi-regex": "^6.0.1"
- },
- "engines": {
- "node": ">=12"
- },
- "funding": {
- "url": "https://github.com/chalk/strip-ansi?sponsor=1"
- }
- },
- "node_modules/supports-color": {
- "version": "7.2.0",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
- "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-color/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/supports-hyperlinks": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-3.0.0.tgz",
- "integrity": "sha512-QBDPHyPQDRTy9ku4URNGY5Lah8PAaXs6tAAwp55sL5WCsSW7GIfdf6W5ixfziW+t7wh3GVvHyHHyQ1ESsoRvaA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0",
- "supports-color": "^7.0.0"
- },
- "engines": {
- "node": ">=14.18"
- }
- },
- "node_modules/supports-hyperlinks/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/svg-tags": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/svg-tags/-/svg-tags-1.0.0.tgz",
- "integrity": "sha1-WPcc7jvVGbWdSyqEO2x95krAR2Q=",
- "dev": true
- },
- "node_modules/table": {
- "version": "6.8.2",
- "resolved": "https://registry.npmjs.org/table/-/table-6.8.2.tgz",
- "integrity": "sha512-w2sfv80nrAh2VCbqR5AK27wswXhqcck2AhfnNW76beQXskGZ1V12GwS//yYVa3d3fcvAip2OUnbDAjW2k3v9fA==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "ajv": "^8.0.1",
- "lodash.truncate": "^4.4.2",
- "slice-ansi": "^4.0.0",
- "string-width": "^4.2.3",
- "strip-ansi": "^6.0.1"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/table/node_modules/ajv": {
- "version": "8.2.0",
- "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.2.0.tgz",
- "integrity": "sha512-WSNGFuyWd//XO8n/m/EaOlNLtO0yL8EXT/74LqT4khdhpZjP7lkj/kT5uwRmGitKEVp/Oj7ZUHeGfPtgHhQ5CA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "fast-deep-equal": "^3.1.1",
- "json-schema-traverse": "^1.0.0",
- "require-from-string": "^2.0.2",
- "uri-js": "^4.2.2"
- },
- "funding": {
- "type": "github",
- "url": "https://github.com/sponsors/epoberezkin"
- }
- },
- "node_modules/table/node_modules/json-schema-traverse": {
- "version": "1.0.0",
- "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz",
- "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/tapable": {
- "version": "2.2.1",
- "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz",
- "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/tar": {
- "version": "6.2.1",
- "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
- "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "chownr": "^2.0.0",
- "fs-minipass": "^2.0.0",
- "minipass": "^5.0.0",
- "minizlib": "^2.1.1",
- "mkdirp": "^1.0.3",
- "yallist": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/tar/node_modules/minipass": {
- "version": "5.0.0",
- "resolved": "https://registry.npmjs.org/minipass/-/minipass-5.0.0.tgz",
- "integrity": "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==",
- "dev": true,
- "license": "ISC",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/tar/node_modules/mkdirp": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
- "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "mkdirp": "bin/cmd.js"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser": {
- "version": "5.31.1",
- "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz",
- "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "@jridgewell/source-map": "^0.3.3",
- "acorn": "^8.8.2",
- "commander": "^2.20.0",
- "source-map-support": "~0.5.20"
- },
- "bin": {
- "terser": "bin/terser"
- },
- "engines": {
- "node": ">=10"
- }
- },
- "node_modules/terser-webpack-plugin": {
- "version": "4.2.3",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-4.2.3.tgz",
- "integrity": "sha512-jTgXh40RnvOrLQNgIkwEKnQ8rmHjHK4u+6UBEi+W+FPmvb+uo+chJXntKe7/3lW5mNysgSWD60KyesnhW8D6MQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "cacache": "^15.0.5",
- "find-cache-dir": "^3.3.1",
- "jest-worker": "^26.5.0",
- "p-limit": "^3.0.2",
- "schema-utils": "^3.0.0",
- "serialize-javascript": "^5.0.1",
- "source-map": "^0.6.1",
- "terser": "^5.3.4",
- "webpack-sources": "^1.4.3"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^4.0.0 || ^5.0.0"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/p-limit": {
- "version": "3.1.0",
- "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz",
- "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "yocto-queue": "^0.1.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- },
- "node_modules/terser-webpack-plugin/node_modules/schema-utils": {
- "version": "3.0.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz",
- "integrity": "sha512-6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.6",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/terser/node_modules/acorn": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
- "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/text-table": {
- "version": "0.2.0",
- "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz",
- "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/to-fast-properties": {
- "version": "2.0.0",
- "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
- "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/to-regex-range": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
- "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-number": "^7.0.0"
- },
- "engines": {
- "node": ">=8.0"
- }
- },
- "node_modules/tsconfig-paths": {
- "version": "3.9.0",
- "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz",
- "integrity": "sha512-dRcuzokWhajtZWkQsDVKbWyY+jgcLC5sqJhg2PSgf4ZkH2aHPvaOY8YWGhmjb68b5qqTfasSsDO9k7RUiEmZAw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json5": "^0.0.29",
- "json5": "^1.0.1",
- "minimist": "^1.2.0",
- "strip-bom": "^3.0.0"
- }
- },
- "node_modules/type-check": {
- "version": "0.4.0",
- "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz",
- "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "prelude-ls": "^1.2.1"
- },
- "engines": {
- "node": ">= 0.8.0"
- }
- },
- "node_modules/type-fest": {
- "version": "0.8.1",
- "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz",
- "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==",
- "dev": true,
- "license": "(MIT OR CC0-1.0)",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/unbox-primitive": {
- "version": "1.0.1",
- "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
- "integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "function-bind": "^1.1.1",
- "has-bigints": "^1.0.1",
- "has-symbols": "^1.0.2",
- "which-boxed-primitive": "^1.0.2"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/unicode-canonical-property-names-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
- "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-ecmascript": {
- "version": "1.0.4",
- "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
- "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "unicode-canonical-property-names-ecmascript": "^1.0.4",
- "unicode-property-aliases-ecmascript": "^1.0.4"
- },
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-match-property-value-ecmascript": {
- "version": "1.2.0",
- "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
- "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unicode-property-aliases-ecmascript": {
- "version": "1.1.0",
- "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
- "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=4"
- }
- },
- "node_modules/unique-filename": {
- "version": "1.1.1",
- "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz",
- "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "unique-slug": "^2.0.0"
- }
- },
- "node_modules/unique-slug": {
- "version": "2.0.2",
- "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz",
- "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4"
- }
- },
- "node_modules/update-browserslist-db": {
- "version": "1.0.16",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz",
- "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==",
- "dev": true,
- "funding": [
- {
- "type": "opencollective",
- "url": "https://opencollective.com/browserslist"
- },
- {
- "type": "tidelift",
- "url": "https://tidelift.com/funding/github/npm/browserslist"
- },
- {
- "type": "github",
- "url": "https://github.com/sponsors/ai"
- }
- ],
- "license": "MIT",
- "dependencies": {
- "escalade": "^3.1.2",
- "picocolors": "^1.0.1"
- },
- "bin": {
- "update-browserslist-db": "cli.js"
- },
- "peerDependencies": {
- "browserslist": ">= 4.21.0"
- }
- },
- "node_modules/uri-js": {
- "version": "4.4.1",
- "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz",
- "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==",
- "dev": true,
- "license": "BSD-2-Clause",
- "dependencies": {
- "punycode": "^2.1.0"
- }
- },
- "node_modules/uri-js/node_modules/punycode": {
- "version": "2.1.1",
- "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
- "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=6"
- }
- },
- "node_modules/util-deprecate": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/v8-compile-cache": {
- "version": "2.3.0",
- "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
- "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/validate-npm-package-license": {
- "version": "3.0.4",
- "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
- "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
- "dev": true,
- "license": "Apache-2.0",
- "dependencies": {
- "spdx-correct": "^3.0.0",
- "spdx-expression-parse": "^3.0.0"
- }
- },
- "node_modules/watchpack": {
- "version": "2.4.1",
- "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz",
- "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.1.2"
- },
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/webpack": {
- "version": "5.92.1",
- "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.1.tgz",
- "integrity": "sha512-JECQ7IwJb+7fgUFBlrJzbyu3GEuNBcdqr1LD7IbSzwkSmIevTm8PF+wej3Oxuz/JFBUZ6O1o43zsPkwm1C4TmA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/eslint-scope": "^3.7.3",
- "@types/estree": "^1.0.5",
- "@webassemblyjs/ast": "^1.12.1",
- "@webassemblyjs/wasm-edit": "^1.12.1",
- "@webassemblyjs/wasm-parser": "^1.12.1",
- "acorn": "^8.7.1",
- "acorn-import-attributes": "^1.9.5",
- "browserslist": "^4.21.10",
- "chrome-trace-event": "^1.0.2",
- "enhanced-resolve": "^5.17.0",
- "es-module-lexer": "^1.2.1",
- "eslint-scope": "5.1.1",
- "events": "^3.2.0",
- "glob-to-regexp": "^0.4.1",
- "graceful-fs": "^4.2.11",
- "json-parse-even-better-errors": "^2.3.1",
- "loader-runner": "^4.2.0",
- "mime-types": "^2.1.27",
- "neo-async": "^2.6.2",
- "schema-utils": "^3.2.0",
- "tapable": "^2.1.1",
- "terser-webpack-plugin": "^5.3.10",
- "watchpack": "^2.4.1",
- "webpack-sources": "^3.2.3"
- },
- "bin": {
- "webpack": "bin/webpack.js"
- },
- "engines": {
- "node": ">=10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependenciesMeta": {
- "webpack-cli": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli": {
- "version": "5.1.4",
- "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz",
- "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@discoveryjs/json-ext": "^0.5.0",
- "@webpack-cli/configtest": "^2.1.1",
- "@webpack-cli/info": "^2.0.2",
- "@webpack-cli/serve": "^2.0.5",
- "colorette": "^2.0.14",
- "commander": "^10.0.1",
- "cross-spawn": "^7.0.3",
- "envinfo": "^7.7.3",
- "fastest-levenshtein": "^1.0.12",
- "import-local": "^3.0.2",
- "interpret": "^3.1.1",
- "rechoir": "^0.8.0",
- "webpack-merge": "^5.7.3"
- },
- "bin": {
- "webpack-cli": "bin/cli.js"
- },
- "engines": {
- "node": ">=14.15.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "5.x.x"
- },
- "peerDependenciesMeta": {
- "@webpack-cli/generators": {
- "optional": true
- },
- "webpack-bundle-analyzer": {
- "optional": true
- },
- "webpack-dev-server": {
- "optional": true
- }
- }
- },
- "node_modules/webpack-cli/node_modules/commander": {
- "version": "10.0.1",
- "resolved": "https://registry.npmjs.org/commander/-/commander-10.0.1.tgz",
- "integrity": "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=14"
- }
- },
- "node_modules/webpack-merge": {
- "version": "5.10.0",
- "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz",
- "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "clone-deep": "^4.0.1",
- "flat": "^5.0.2",
- "wildcard": "^2.0.0"
- },
- "engines": {
- "node": ">=10.0.0"
- }
- },
- "node_modules/webpack-sources": {
- "version": "1.4.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz",
- "integrity": "sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "source-list-map": "^2.0.0",
- "source-map": "~0.6.1"
- }
- },
- "node_modules/webpack/node_modules/acorn": {
- "version": "8.12.0",
- "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz",
- "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==",
- "dev": true,
- "license": "MIT",
- "bin": {
- "acorn": "bin/acorn"
- },
- "engines": {
- "node": ">=0.4.0"
- }
- },
- "node_modules/webpack/node_modules/acorn-import-attributes": {
- "version": "1.9.5",
- "resolved": "https://registry.npmjs.org/acorn-import-attributes/-/acorn-import-attributes-1.9.5.tgz",
- "integrity": "sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==",
- "dev": true,
- "license": "MIT",
- "peerDependencies": {
- "acorn": "^8"
- }
- },
- "node_modules/webpack/node_modules/has-flag": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
- "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=8"
- }
- },
- "node_modules/webpack/node_modules/jest-worker": {
- "version": "27.5.1",
- "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz",
- "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/node": "*",
- "merge-stream": "^2.0.0",
- "supports-color": "^8.0.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- }
- },
- "node_modules/webpack/node_modules/schema-utils": {
- "version": "3.3.0",
- "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz",
- "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@types/json-schema": "^7.0.8",
- "ajv": "^6.12.5",
- "ajv-keywords": "^3.5.2"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- }
- },
- "node_modules/webpack/node_modules/serialize-javascript": {
- "version": "6.0.2",
- "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz",
- "integrity": "sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g==",
- "dev": true,
- "license": "BSD-3-Clause",
- "dependencies": {
- "randombytes": "^2.1.0"
- }
- },
- "node_modules/webpack/node_modules/supports-color": {
- "version": "8.1.1",
- "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz",
- "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "has-flag": "^4.0.0"
- },
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/chalk/supports-color?sponsor=1"
- }
- },
- "node_modules/webpack/node_modules/terser-webpack-plugin": {
- "version": "5.3.10",
- "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz",
- "integrity": "sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "@jridgewell/trace-mapping": "^0.3.20",
- "jest-worker": "^27.4.5",
- "schema-utils": "^3.1.1",
- "serialize-javascript": "^6.0.1",
- "terser": "^5.26.0"
- },
- "engines": {
- "node": ">= 10.13.0"
- },
- "funding": {
- "type": "opencollective",
- "url": "https://opencollective.com/webpack"
- },
- "peerDependencies": {
- "webpack": "^5.1.0"
- },
- "peerDependenciesMeta": {
- "@swc/core": {
- "optional": true
- },
- "esbuild": {
- "optional": true
- },
- "uglify-js": {
- "optional": true
- }
- }
- },
- "node_modules/webpack/node_modules/webpack-sources": {
- "version": "3.2.3",
- "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz",
- "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10.13.0"
- }
- },
- "node_modules/which": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
- "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "isexe": "^2.0.0"
- },
- "bin": {
- "which": "bin/which"
- }
- },
- "node_modules/which-boxed-primitive": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
- "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
- "dev": true,
- "license": "MIT",
- "dependencies": {
- "is-bigint": "^1.0.1",
- "is-boolean-object": "^1.1.0",
- "is-number-object": "^1.0.4",
- "is-string": "^1.0.5",
- "is-symbol": "^1.0.3"
- },
- "funding": {
- "url": "https://github.com/sponsors/ljharb"
- }
- },
- "node_modules/wildcard": {
- "version": "2.0.1",
- "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.1.tgz",
- "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==",
- "dev": true,
- "license": "MIT"
- },
- "node_modules/word-wrap": {
- "version": "1.2.4",
- "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.4.tgz",
- "integrity": "sha512-2V81OA4ugVo5pRo46hAoD2ivUJx8jXmWXfUkY4KFNw0hEptvN0QfH3K4nHiwzGeKl5rFKedV48QVoqYavy4YpA==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=0.10.0"
- }
- },
- "node_modules/wrappy": {
- "version": "1.0.2",
- "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
- "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/write-file-atomic": {
- "version": "5.0.1",
- "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz",
- "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==",
- "dev": true,
- "license": "ISC",
- "dependencies": {
- "imurmurhash": "^0.1.4",
- "signal-exit": "^4.0.1"
- },
- "engines": {
- "node": "^14.17.0 || ^16.13.0 || >=18.0.0"
- }
- },
- "node_modules/yallist": {
- "version": "4.0.0",
- "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz",
- "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==",
- "dev": true,
- "license": "ISC"
- },
- "node_modules/yocto-queue": {
- "version": "0.1.0",
- "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz",
- "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==",
- "dev": true,
- "license": "MIT",
- "engines": {
- "node": ">=10"
- },
- "funding": {
- "url": "https://github.com/sponsors/sindresorhus"
- }
- }
- }
-}
diff --git a/phpunit.xml b/phpunit.xml
deleted file mode 100644
index 8b66e6c5..00000000
--- a/phpunit.xml
+++ /dev/null
@@ -1,27 +0,0 @@
-
-
-
-
- tests
- tests/languages
-
-
- tests/languages/de
-
-
- tests/languages/en
-
-
- tests/languages/fr
-
-
-
-
-
- application
-
-
-
diff --git a/tests/.htaccess b/tests/.htaccess
deleted file mode 100644
index f601c1ee..00000000
--- a/tests/.htaccess
+++ /dev/null
@@ -1,13 +0,0 @@
-
- = 2.4>
- Require all denied
-
-
- Allow from none
- Deny from all
-
-
-
-
- Require all denied
-
diff --git a/tests/HistoryTest.php b/tests/HistoryTest.php
deleted file mode 100644
index e810104e..00000000
--- a/tests/HistoryTest.php
+++ /dev/null
@@ -1,206 +0,0 @@
-assertFileNotExists(self::$historyFilePath);
- }
-
- /**
- * Test that the history file is created if it doesn't exist.
- */
- public function testAddEventCreateFile()
- {
- $history = new History(self::$historyFilePath);
- $history->updateSettings();
- $this->assertFileExists(self::$historyFilePath);
- }
-
- /**
- * Not writable history file: raise an exception.
- */
- public function testConstructNotWritable()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessage('History file isn\'t readable or writable');
-
- touch(self::$historyFilePath);
- chmod(self::$historyFilePath, 0440);
- $history = new History(self::$historyFilePath);
- $history->updateSettings();
- }
-
- /**
- * Not parsable history file: raise an exception.
- */
- public function testConstructNotParsable()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessageRegExp('/Could not parse history file/');
-
- file_put_contents(self::$historyFilePath, 'not parsable');
- $history = new History(self::$historyFilePath);
- // gzinflate generates a warning
- @$history->updateSettings();
- }
-
- /**
- * Test add link event
- */
- public function testAddLink()
- {
- $history = new History(self::$historyFilePath);
- $bookmark = (new Bookmark())->setId(0);
- $history->addLink($bookmark);
- $actual = $history->getHistory()[0];
- $this->assertEquals(History::CREATED, $actual['event']);
- $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
- $this->assertEquals(0, $actual['id']);
-
- $history = new History(self::$historyFilePath);
- $bookmark = (new Bookmark())->setId(1);
- $history->addLink($bookmark);
- $actual = $history->getHistory()[0];
- $this->assertEquals(History::CREATED, $actual['event']);
- $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
- $this->assertEquals(1, $actual['id']);
- }
-
-// /**
-// * Test updated link event
-// */
-// public function testUpdateLink()
-// {
-// $history = new History(self::$historyFilePath);
-// $history->updateLink(['id' => 1]);
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::UPDATED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-// }
-//
-// /**
-// * Test delete link event
-// */
-// public function testDeleteLink()
-// {
-// $history = new History(self::$historyFilePath);
-// $history->deleteLink(['id' => 1]);
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::DELETED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-// }
-//
-// /**
-// * Test updated settings event
-// */
-// public function testUpdateSettings()
-// {
-// $history = new History(self::$historyFilePath);
-// $history->updateSettings();
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::SETTINGS, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEmpty($actual['id']);
-// }
-//
-// /**
-// * Make sure that new items are stored at the beginning
-// */
-// public function testHistoryOrder()
-// {
-// $history = new History(self::$historyFilePath);
-// $history->updateLink(['id' => 1]);
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::UPDATED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-//
-// $history->addLink(['id' => 1]);
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::CREATED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-// }
-//
-// /**
-// * Re-read history from file after writing an event
-// */
-// public function testHistoryRead()
-// {
-// $history = new History(self::$historyFilePath);
-// $history->updateLink(['id' => 1]);
-// $history = new History(self::$historyFilePath);
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::UPDATED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-// }
-//
-// /**
-// * Re-read history from file after writing an event and make sure that the order is correct
-// */
-// public function testHistoryOrderRead()
-// {
-// $history = new History(self::$historyFilePath);
-// $history->updateLink(['id' => 1]);
-// $history->addLink(['id' => 1]);
-//
-// $history = new History(self::$historyFilePath);
-// $actual = $history->getHistory()[0];
-// $this->assertEquals(History::CREATED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-//
-// $actual = $history->getHistory()[1];
-// $this->assertEquals(History::UPDATED, $actual['event']);
-// $this->assertTrue(new DateTime('-2 seconds') < $actual['datetime']);
-// $this->assertEquals(1, $actual['id']);
-// }
-//
-// /**
-// * Test retention time: delete old entries.
-// */
-// public function testHistoryRententionTime()
-// {
-// $history = new History(self::$historyFilePath, 5);
-// $history->updateLink(['id' => 1]);
-// $this->assertEquals(1, count($history->getHistory()));
-// $arr = $history->getHistory();
-// $arr[0]['datetime'] = new DateTime('-1 hour');
-// FileUtils::writeFlatDB(self::$historyFilePath, $arr);
-//
-// $history = new History(self::$historyFilePath, 60);
-// $this->assertEquals(1, count($history->getHistory()));
-// $this->assertEquals(1, $history->getHistory()[0]['id']);
-// $history->updateLink(['id' => 2]);
-// $this->assertEquals(1, count($history->getHistory()));
-// $this->assertEquals(2, $history->getHistory()[0]['id']);
-// }
-}
diff --git a/tests/LanguagesTest.php b/tests/LanguagesTest.php
deleted file mode 100644
index ce24c160..00000000
--- a/tests/LanguagesTest.php
+++ /dev/null
@@ -1,229 +0,0 @@
-conf = new ConfigManager(self::$configFile);
- }
-
- /**
- * Test t() with a simple non identified value.
- */
- public function testTranslateSingleNotIDGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- new Languages('en', $this->conf);
- $text = 'abcdé 564 fgK';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with a simple identified value in gettext mode.
- */
- public function testTranslateSingleIDGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- new Languages('en', $this->conf);
- $text = 'permalink';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with a non identified plural form in gettext mode.
- */
- public function testTranslatePluralNotIDGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- new Languages('en', $this->conf);
- $text = 'sandwich';
- $nText = 'sandwiches';
- $this->assertEquals('sandwiches', t($text, $nText, 0));
- $this->assertEquals('sandwich', t($text, $nText, 1));
- $this->assertEquals('sandwiches', t($text, $nText, 2));
- }
-
- /**
- * Test t() with an identified plural form in gettext mode.
- */
- public function testTranslatePluralIDGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- new Languages('en', $this->conf);
- $text = 'shaare';
- $nText = 'shaares';
- // In english, zero is followed by plural form
- $this->assertEquals('shaares', t($text, $nText, 0));
- $this->assertEquals('shaare', t($text, $nText, 1));
- $this->assertEquals('shaares', t($text, $nText, 2));
- }
-
- /**
- * Test t() with a simple non identified value.
- */
- public function testTranslateSingleNotIDPhp()
- {
- $this->conf->set('translation.mode', 'php');
- new Languages('en', $this->conf);
- $text = 'abcdé 564 fgK';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with a simple identified value in PHP mode.
- */
- public function testTranslateSingleIDPhp()
- {
- $this->conf->set('translation.mode', 'php');
- new Languages('en', $this->conf);
- $text = 'permalink';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with a non identified plural form in PHP mode.
- */
- public function testTranslatePluralNotIDPhp()
- {
- $this->conf->set('translation.mode', 'php');
- new Languages('en', $this->conf);
- $text = 'sandwich';
- $nText = 'sandwiches';
- $this->assertEquals('sandwiches', t($text, $nText, 0));
- $this->assertEquals('sandwich', t($text, $nText, 1));
- $this->assertEquals('sandwiches', t($text, $nText, 2));
- }
-
- /**
- * Test t() with an identified plural form in PHP mode.
- */
- public function testTranslatePluralIDPhp()
- {
- $this->conf->set('translation.mode', 'php');
- new Languages('en', $this->conf);
- $text = 'shaare';
- $nText = 'shaares';
- // In english, zero is followed by plural form
- $this->assertEquals('shaares', t($text, $nText, 0));
- $this->assertEquals('shaare', t($text, $nText, 1));
- $this->assertEquals('shaares', t($text, $nText, 2));
- }
-
- /**
- * Test t() with an invalid language set in the configuration in gettext mode.
- */
- public function testTranslateWithInvalidConfLanguageGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- $this->conf->set('translation.language', 'nope');
- new Languages('fr', $this->conf);
- $text = 'grumble';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with an invalid language set in the configuration in PHP mode.
- */
- public function testTranslateWithInvalidConfLanguagePhp()
- {
- $this->conf->set('translation.mode', 'php');
- $this->conf->set('translation.language', 'nope');
- new Languages('fr', $this->conf);
- $text = 'grumble';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with an invalid language set with auto language in gettext mode.
- */
- public function testTranslateWithInvalidAutoLanguageGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- new Languages('nope', $this->conf);
- $text = 'grumble';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with an invalid language set with auto language in PHP mode.
- */
- public function testTranslateWithInvalidAutoLanguagePhp()
- {
- $this->conf->set('translation.mode', 'php');
- new Languages('nope', $this->conf);
- $text = 'grumble';
- $this->assertEquals($text, t($text));
- }
-
- /**
- * Test t() with an extension language file coming from the theme in gettext mode
- */
- public function testTranslationThemeExtensionGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- $this->conf->set('raintpl_tpl', 'tests/utils/customtpl/');
- $this->conf->set('theme', 'dummy');
- new Languages('en', $this->conf);
- $txt = 'rooster'; // ignore me poedit
- $this->assertEquals('rooster', t($txt, $txt, 1, 'dummy'));
- }
-
- /**
- * Test t() with an extension language file coming from the theme in PHP mode
- */
- public function testTranslationThemeExtensionPhp()
- {
- $this->conf->set('translation.mode', 'php');
- $this->conf->set('raintpl_tpl', 'tests/utils/customtpl/');
- $this->conf->set('theme', 'dummy');
- new Languages('en', $this->conf);
- $txt = 'rooster'; // ignore me poedit
- $this->assertEquals('rooster', t($txt, $txt, 1, 'dummy'));
- }
-
- /**
- * Test t() with an extension language file in gettext mode
- */
- public function testTranslationExtensionGettext()
- {
- $this->conf->set('translation.mode', 'gettext');
- $this->conf->set('translation.extensions.test', 'tests/utils/languages/');
- new Languages('en', $this->conf);
- $txt = 'car'; // ignore me poedit
- $this->assertEquals('car', t($txt, $txt, 1, 'test'));
- $this->assertEquals('Search', t('Search', 'Search', 1, 'test'));
- }
-
- /**
- * Test t() with an extension language file in PHP mode
- */
- public function testTranslationExtensionPhp()
- {
- $this->conf->set('translation.mode', 'php');
- $this->conf->set('translation.extensions.test', 'tests/utils/languages/');
- new Languages('en', $this->conf);
- $txt = 'car'; // ignore me poedit
- $this->assertEquals('car', t($txt, $txt, 1, 'test'));
- $this->assertEquals('Search', t('Search', 'Search', 1, 'test'));
- }
-}
diff --git a/tests/PluginManagerTest.php b/tests/PluginManagerTest.php
deleted file mode 100644
index 81434fa2..00000000
--- a/tests/PluginManagerTest.php
+++ /dev/null
@@ -1,178 +0,0 @@
-pluginManager = new PluginManager($conf);
- }
-
- /**
- * Test plugin loading and hook execution.
- */
- public function testPlugin(): void
- {
- PluginManager::$PLUGINS_PATH = self::$pluginPath;
- $this->pluginManager->load([self::$pluginName]);
-
- $this->assertTrue(function_exists('hook_test_random'));
-
- $data = [0 => 'woot'];
- $this->pluginManager->executeHooks('random', $data);
-
- static::assertCount(2, $data);
- static::assertSame('woot', $data[1]);
-
- $data = [0 => 'woot'];
- $this->pluginManager->executeHooks('random', $data, ['target' => 'test']);
-
- static::assertCount(2, $data);
- static::assertSame('page test', $data[1]);
-
- $data = [0 => 'woot'];
- $this->pluginManager->executeHooks('random', $data, ['loggedin' => true]);
-
- static::assertCount(2, $data);
- static::assertEquals('loggedin', $data[1]);
-
- $data = [0 => 'woot'];
- $this->pluginManager->executeHooks('random', $data, ['loggedin' => null]);
-
- static::assertCount(3, $data);
- static::assertEquals('loggedin', $data[1]);
- static::assertArrayHasKey(2, $data);
- static::assertNull($data[2]);
- }
-
- /**
- * Test plugin loading and hook execution with an error: raise an incompatibility error.
- */
- public function testPluginWithPhpError(): void
- {
- PluginManager::$PLUGINS_PATH = self::$pluginPath;
- $this->pluginManager->load([self::$pluginName]);
-
- $this->assertTrue(function_exists('hook_test_error'));
-
- $data = [];
- $this->pluginManager->executeHooks('error', $data);
-
- $this->assertRegExp(
- '/test \[plugin incompatibility\]: Class [\'"]Unknown[\'"] not found/',
- $this->pluginManager->getErrors()[0]
- );
- }
-
- /**
- * Test missing plugin loading.
- */
- public function testPluginNotFound(): void
- {
- $this->pluginManager->load([]);
- $this->pluginManager->load(['nope', 'renope']);
- $this->addToAssertionCount(1);
- }
-
- /**
- * Test plugin metadata loading.
- */
- public function testGetPluginsMeta(): void
- {
- PluginManager::$PLUGINS_PATH = self::$pluginPath;
- $this->pluginManager->load([self::$pluginName]);
-
- $expectedParameters = [
- 'pop' => [
- 'value' => '',
- 'desc' => 'pop description',
- ],
- 'hip' => [
- 'value' => '',
- 'desc' => '',
- ],
- ];
- $meta = $this->pluginManager->getPluginsMeta();
- $this->assertEquals('test plugin', $meta[self::$pluginName]['description']);
- $this->assertEquals($expectedParameters, $meta[self::$pluginName]['parameters']);
- }
-
- /**
- * Test plugin custom routes - note that there is no check on callable functions
- */
- public function testRegisteredRoutes(): void
- {
- PluginManager::$PLUGINS_PATH = self::$pluginPath;
- $this->pluginManager->load([self::$pluginName]);
-
- $expectedParameters = [
- [
- 'method' => 'GET',
- 'route' => '/test',
- 'callable' => 'getFunction',
- ],
- [
- 'method' => 'POST',
- 'route' => '/custom',
- 'callable' => 'postFunction',
- ],
- ];
- $meta = $this->pluginManager->getRegisteredRoutes();
- static::assertSame($expectedParameters, $meta[self::$pluginName]);
- }
-
- /**
- * Test plugin custom routes with invalid route
- */
- public function testRegisteredRoutesInvalid(): void
- {
- $plugin = 'test_route_invalid';
- $this->pluginManager->load([$plugin]);
-
- $meta = $this->pluginManager->getRegisteredRoutes();
- static::assertSame([], $meta);
-
- $errors = $this->pluginManager->getErrors();
- static::assertSame(['test_route_invalid [plugin incompatibility]: trying to register invalid route.'], $errors);
- }
-
- public function testSearchFilterPlugin(): void
- {
- PluginManager::$PLUGINS_PATH = self::$pluginPath;
- $this->pluginManager->load([self::$pluginName]);
-
- static::assertNull($this->pluginManager->getFilterSearchEntryHooks());
-
- static::assertTrue($this->pluginManager->filterSearchEntry(new Bookmark(), ['_result' => true]));
-
- static::assertCount(1, $this->pluginManager->getFilterSearchEntryHooks());
- static::assertSame('hook_test_filter_search_entry', $this->pluginManager->getFilterSearchEntryHooks()[0]);
-
- static::assertFalse($this->pluginManager->filterSearchEntry(new Bookmark(), ['_result' => false]));
- }
-}
diff --git a/tests/TestCase.php b/tests/TestCase.php
deleted file mode 100644
index 781e7aa3..00000000
--- a/tests/TestCase.php
+++ /dev/null
@@ -1,77 +0,0 @@
-expectExceptionMessageMatches($regularExpression);
- } else {
- parent::expectExceptionMessageRegExp($regularExpression);
- }
- }
-
- /**
- * assertContains is now used for iterable, strings should use assertStringContainsString
- */
- public function assertContainsPolyfill($expected, $actual, string $message = ''): void
- {
- if (is_string($actual) && method_exists($this, 'assertStringContainsString')) {
- static::assertStringContainsString($expected, $actual, $message);
- } else {
- static::assertContains($expected, $actual, $message);
- }
- }
-
- /**
- * assertNotContains is now used for iterable, strings should use assertStringNotContainsString
- */
- public function assertNotContainsPolyfill($expected, $actual, string $message = ''): void
- {
- if (is_string($actual) && method_exists($this, 'assertStringNotContainsString')) {
- static::assertStringNotContainsString($expected, $actual, $message);
- } else {
- static::assertNotContains($expected, $actual, $message);
- }
- }
-
- /**
- * assertFileNotExists has been renamed in assertFileDoesNotExist
- */
- public static function assertFileNotExists(string $filename, string $message = ''): void
- {
- if (method_exists(TestCase::class, 'assertFileDoesNotExist')) {
- static::assertFileDoesNotExist($filename, $message);
- } else {
- parent::assertFileNotExists($filename, $message);
- }
- }
-
- /**
- * assertRegExp has been renamed in assertMatchesRegularExpression
- */
- public static function assertRegExp(string $pattern, string $string, string $message = ''): void
- {
- if (method_exists(TestCase::class, 'assertMatchesRegularExpression')) {
- static::assertMatchesRegularExpression($pattern, $string, $message);
- } else {
- parent::assertRegExp($pattern, $string, $message);
- }
- }
-
- public function isInTestsContext(): bool
- {
- return true;
- }
-}
diff --git a/tests/ThumbnailerTest.php b/tests/ThumbnailerTest.php
deleted file mode 100644
index 2ea5568e..00000000
--- a/tests/ThumbnailerTest.php
+++ /dev/null
@@ -1,115 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('thumbnails.mode', Thumbnailer::MODE_ALL);
- $this->conf->set('thumbnails.width', self::WIDTH);
- $this->conf->set('thumbnails.height', self::HEIGHT);
- $this->conf->set('dev.debug', true);
-
- $this->thumbnailer = new Thumbnailer($this->conf);
- // cache files in the sandbox
- WTConfigManager::addFile('tests/utils/config/wt.json');
- }
-
- protected function tearDown(): void
- {
- $this->rrmdirContent('sandbox/');
- }
-
- /**
- * Test a thumbnail with a custom size in 'all' mode.
- */
- public function testThumbnailAllValid()
- {
- $thumb = $this->thumbnailer->get('https://gitlab.com/shaarli/Shaarli');
- $this->assertNotFalse($thumb);
- $image = imagecreatefromstring(file_get_contents($thumb));
- $this->assertEquals(self::WIDTH, imagesx($image));
- $this->assertEquals(self::HEIGHT, imagesy($image));
- }
-
- /**
- * Test a thumbnail with a custom size in 'common' mode.
- */
- public function testThumbnailCommonValid()
- {
- $this->conf->set('thumbnails.mode', Thumbnailer::MODE_COMMON);
- $thumb = $this->thumbnailer->get('https://imgur.com/jlFgGpe');
- $this->assertNotFalse($thumb);
- $image = imagecreatefromstring(file_get_contents($thumb));
- $this->assertEquals(self::WIDTH, imagesx($image));
- $this->assertEquals(self::HEIGHT, imagesy($image));
- }
-
- /**
- * Test a thumbnail in 'common' mode which isn't include in common websites.
- */
- public function testThumbnailCommonInvalid()
- {
- $this->conf->set('thumbnails.mode', Thumbnailer::MODE_COMMON);
- $thumb = $this->thumbnailer->get('https://github.com/shaarli/Shaarli/');
- $this->assertFalse($thumb);
- }
-
- /**
- * Test a thumbnail that can't be retrieved.
- */
- public function testThumbnailNotValid()
- {
- $oldlog = ini_get('error_log');
- ini_set('error_log', '/dev/null');
-
- $thumbnailer = new Thumbnailer(new ConfigManager());
- $thumb = $thumbnailer->get('nope');
- $this->assertFalse($thumb);
-
- ini_set('error_log', $oldlog);
- }
-
- protected function rrmdirContent($dir)
- {
- if (is_dir($dir)) {
- $objects = scandir($dir);
- foreach ($objects as $object) {
- if ($object != "." && $object != "..") {
- if (is_dir($dir . "/" . $object)) {
- $this->rrmdirContent($dir . "/" . $object);
- } else {
- unlink($dir . "/" . $object);
- }
- }
- }
- }
- }
-}
diff --git a/tests/TimeZoneTest.php b/tests/TimeZoneTest.php
deleted file mode 100644
index ba520cf1..00000000
--- a/tests/TimeZoneTest.php
+++ /dev/null
@@ -1,104 +0,0 @@
-installedTimezones = [
- 'Antarctica/Syowa',
- 'Europe/London',
- 'Europe/Paris',
- 'UTC'
- ];
- }
-
- /**
- * Generate a timezone selection form
- */
- public function testGenerateTimeZoneForm()
- {
- $expected = [
- 'continents' => [
- 'Antarctica',
- 'Europe',
- 'UTC',
- 'selected' => '',
- ],
- 'cities' => [
- ['continent' => 'Antarctica', 'city' => 'Syowa'],
- ['continent' => 'Europe', 'city' => 'London'],
- ['continent' => 'Europe', 'city' => 'Paris'],
- ['continent' => 'UTC', 'city' => 'UTC'],
- 'selected' => '',
- ]
- ];
-
- list($continents, $cities) = generateTimeZoneData($this->installedTimezones);
-
- $this->assertEquals($expected['continents'], $continents);
- $this->assertEquals($expected['cities'], $cities);
- }
-
- /**
- * Generate a timezone selection form, with a preselected timezone
- */
- public function testGenerateTimeZoneFormPreselected()
- {
- $expected = [
- 'continents' => [
- 'Antarctica',
- 'Europe',
- 'UTC',
- 'selected' => 'Antarctica',
- ],
- 'cities' => [
- ['continent' => 'Antarctica', 'city' => 'Syowa'],
- ['continent' => 'Europe', 'city' => 'London'],
- ['continent' => 'Europe', 'city' => 'Paris'],
- ['continent' => 'UTC', 'city' => 'UTC'],
- 'selected' => 'Syowa',
- ]
- ];
-
- list($continents, $cities) = generateTimeZoneData($this->installedTimezones, 'Antarctica/Syowa');
-
- $this->assertEquals($expected['continents'], $continents);
- $this->assertEquals($expected['cities'], $cities);
- }
-
- /**
- * Check valid timezones
- */
- public function testValidTimeZone()
- {
- $this->assertTrue(isTimeZoneValid('America', 'Argentina/Ushuaia'));
- $this->assertTrue(isTimeZoneValid('Europe', 'Oslo'));
- }
-
- /**
- * Check invalid timezones
- */
- public function testInvalidTimeZone()
- {
- $this->assertFalse(isTimeZoneValid('CEST', 'CEST'));
- $this->assertFalse(isTimeZoneValid('Europe', 'Atlantis'));
- $this->assertFalse(isTimeZoneValid('Middle_Earth', 'Moria'));
- $this->assertFalse(isTimeZoneValid('UTC', 'UTC'));
- }
-}
diff --git a/tests/UtilsTest.php b/tests/UtilsTest.php
deleted file mode 100644
index a18c01bc..00000000
--- a/tests/UtilsTest.php
+++ /dev/null
@@ -1,463 +0,0 @@
-assertEquals('CyAAJw', smallHash('http://test.io'));
- $this->assertEquals(6, strlen(smallHash('https://github.com')));
- }
-
- /**
- * Look for a substring at the beginning of a string
- */
- public function testStartsWithCaseInsensitive()
- {
- $this->assertTrue(startsWith('Lorem ipsum', 'lorem', false));
- $this->assertTrue(startsWith('Lorem ipsum', 'LoReM i', false));
- }
-
- /**
- * Look for a substring at the beginning of a string (case-sensitive)
- */
- public function testStartsWithCaseSensitive()
- {
- $this->assertTrue(startsWith('Lorem ipsum', 'Lorem', true));
- $this->assertFalse(startsWith('Lorem ipsum', 'lorem', true));
- $this->assertFalse(startsWith('Lorem ipsum', 'LoReM i', true));
- }
-
- /**
- * Look for a substring at the beginning of a string (Unicode)
- */
- public function testStartsWithSpecialChars()
- {
- $this->assertTrue(startsWith('å!ùµ', 'å!', false));
- $this->assertTrue(startsWith('µ$åù', 'µ$', true));
- }
-
- /**
- * Look for a substring at the end of a string
- */
- public function testEndsWithCaseInsensitive()
- {
- $this->assertTrue(endsWith('Lorem ipsum', 'ipsum', false));
- $this->assertTrue(endsWith('Lorem ipsum', 'm IpsUM', false));
- }
-
- /**
- * Look for a substring at the end of a string (case-sensitive)
- */
- public function testEndsWithCaseSensitive()
- {
- $this->assertTrue(endsWith('lorem Ipsum', 'Ipsum', true));
- $this->assertFalse(endsWith('lorem Ipsum', 'ipsum', true));
- $this->assertFalse(endsWith('lorem Ipsum', 'M IPsuM', true));
- }
-
- /**
- * Look for a substring at the end of a string (Unicode)
- */
- public function testEndsWithSpecialChars()
- {
- $this->assertTrue(endsWith('å!ùµ', 'ùµ', false));
- $this->assertTrue(endsWith('µ$åù', 'åù', true));
- }
-
- /**
- * Check valid date strings, according to a DateTime format
- */
- public function testCheckValidDateFormat()
- {
- $this->assertTrue(checkDateFormat('Ymd', '20150627'));
- $this->assertTrue(checkDateFormat('Y-m-d', '2015-06-27'));
- }
-
- /**
- * Check erroneous date strings, according to a DateTime format
- */
- public function testCheckInvalidDateFormat()
- {
- $this->assertFalse(checkDateFormat('Ymd', '2015'));
- $this->assertFalse(checkDateFormat('Y-m-d', '2015-06'));
- $this->assertFalse(checkDateFormat('Ymd', 'DeLorean'));
- }
-
- /**
- * Test generate location with valid data.
- */
- public function testGenerateLocation()
- {
- $ref = 'http://localhost/?test';
- $this->assertEquals($ref, generateLocation($ref, 'localhost'));
- $ref = 'http://localhost:8080/?test';
- $this->assertEquals($ref, generateLocation($ref, 'localhost:8080'));
- $ref = '?localreferer#hash';
- $this->assertEquals($ref, generateLocation($ref, 'localhost:8080'));
- }
-
- /**
- * Test generate location - anti loop.
- */
- public function testGenerateLocationLoop()
- {
- $ref = 'http://localhost/?test';
- $this->assertEquals('./?', generateLocation($ref, 'localhost', ['test']));
- }
-
- /**
- * Test generate location - from other domain.
- */
- public function testGenerateLocationOut()
- {
- $ref = 'http://somewebsite.com/?test';
- $this->assertEquals('./?', generateLocation($ref, 'localhost'));
- }
-
-
- /**
- * Test generateSecretApi.
- */
- public function testGenerateSecretApi()
- {
- $this->assertEquals(12, strlen(generate_api_secret('foo', 'bar')));
- }
-
- /**
- * Test generateSecretApi with invalid parameters.
- */
- public function testGenerateSecretApiInvalid()
- {
- $this->assertFalse(generate_api_secret('', ''));
- $this->assertFalse(generate_api_secret(false, false));
- }
-
- /**
- * Test normalize_spaces.
- */
- public function testNormalizeSpace()
- {
- $str = ' foo bar is important ';
- $this->assertEquals('foo bar is important', normalize_spaces($str));
- $this->assertEquals('foo', normalize_spaces('foo'));
- $this->assertEquals('', normalize_spaces(''));
- $this->assertEquals(null, normalize_spaces(null));
- }
-
- /**
- * Test arrays_combine
- */
- public function testCartesianProductGenerator()
- {
- $arr = [['ab', 'cd'], ['ef', 'gh'], ['ij', 'kl'], ['m']];
- $expected = [
- ['ab', 'ef', 'ij', 'm'],
- ['ab', 'ef', 'kl', 'm'],
- ['ab', 'gh', 'ij', 'm'],
- ['ab', 'gh', 'kl', 'm'],
- ['cd', 'ef', 'ij', 'm'],
- ['cd', 'ef', 'kl', 'm'],
- ['cd', 'gh', 'ij', 'm'],
- ['cd', 'gh', 'kl', 'm'],
- ];
- $this->assertEquals($expected, iterator_to_array(cartesian_product_generator($arr)));
- }
-
- /**
- * Test date_format() with invalid parameter.
- */
- public function testDateFormatInvalid()
- {
- $this->assertFalse(format_date([]));
- $this->assertFalse(format_date(null));
- }
-
- /**
- * Test is_integer_mixed with valid values
- */
- public function testIsIntegerMixedValid()
- {
- $this->assertTrue(is_integer_mixed(12));
- $this->assertTrue(is_integer_mixed('12'));
- $this->assertTrue(is_integer_mixed(-12));
- $this->assertTrue(is_integer_mixed('-12'));
- $this->assertTrue(is_integer_mixed(0));
- $this->assertTrue(is_integer_mixed('0'));
- $this->assertTrue(is_integer_mixed(0x0a));
- }
-
- /**
- * Test is_integer_mixed with invalid values
- */
- public function testIsIntegerMixedInvalid()
- {
- $this->assertFalse(is_integer_mixed(true));
- $this->assertFalse(is_integer_mixed(false));
- $this->assertFalse(is_integer_mixed([]));
- $this->assertFalse(is_integer_mixed(['test']));
- $this->assertFalse(is_integer_mixed([12]));
- $this->assertFalse(is_integer_mixed(new DateTime()));
- $this->assertFalse(is_integer_mixed('0x0a'));
- $this->assertFalse(is_integer_mixed('12k'));
- $this->assertFalse(is_integer_mixed('k12'));
- $this->assertFalse(is_integer_mixed(''));
- }
-
- /**
- * Test return_bytes
- */
- public function testReturnBytes()
- {
- $this->assertEquals(2 * 1024, return_bytes('2k'));
- $this->assertEquals(2 * 1024, return_bytes('2K'));
- $this->assertEquals(2 * (pow(1024, 2)), return_bytes('2m'));
- $this->assertEquals(2 * (pow(1024, 2)), return_bytes('2M'));
- $this->assertEquals(2 * (pow(1024, 3)), return_bytes('2g'));
- $this->assertEquals(2 * (pow(1024, 3)), return_bytes('2G'));
- $this->assertEquals(374, return_bytes('374'));
- $this->assertEquals(374, return_bytes(374));
- $this->assertEquals(0, return_bytes('0'));
- $this->assertEquals(0, return_bytes(0));
- $this->assertEquals(-1, return_bytes('-1'));
- $this->assertEquals(-1, return_bytes(-1));
- $this->assertEquals('', return_bytes(''));
- }
-
- /**
- * Test human_bytes
- */
- public function testHumanBytes()
- {
- $this->assertEquals('2' . t('kiB'), human_bytes(2 * 1024));
- $this->assertEquals('2' . t('kiB'), human_bytes(strval(2 * 1024)));
- $this->assertEquals('2' . t('MiB'), human_bytes(2 * (pow(1024, 2))));
- $this->assertEquals('2' . t('MiB'), human_bytes(strval(2 * (pow(1024, 2)))));
- $this->assertEquals('2' . t('GiB'), human_bytes(2 * (pow(1024, 3))));
- $this->assertEquals('2' . t('GiB'), human_bytes(strval(2 * (pow(1024, 3)))));
- $this->assertEquals('374' . t('B'), human_bytes(374));
- $this->assertEquals('374' . t('B'), human_bytes('374'));
- $this->assertEquals('232' . t('kiB'), human_bytes(237481));
- $this->assertEquals(t('Unlimited'), human_bytes('0'));
- $this->assertEquals(t('Unlimited'), human_bytes(0));
- $this->assertEquals(t('Setting not set'), human_bytes(''));
- }
-
- /**
- * Test get_max_upload_size with formatting
- */
- public function testGetMaxUploadSize()
- {
- $this->assertEquals('1' . t('MiB'), get_max_upload_size(2097152, '1024k'));
- $this->assertEquals('1' . t('MiB'), get_max_upload_size('1m', '2m'));
- $this->assertEquals('100' . t('B'), get_max_upload_size(100, 100));
- }
-
- /**
- * Test get_max_upload_size without formatting
- */
- public function testGetMaxUploadSizeRaw()
- {
- $this->assertEquals('1048576', get_max_upload_size(2097152, '1024k', false));
- $this->assertEquals('1048576', get_max_upload_size('1m', '2m', false));
- $this->assertEquals('100', get_max_upload_size(100, 100, false));
- }
-
- /**
- * Test alphabetical_sort by value, not reversed, with php-intl.
- */
- public function testAlphabeticalSortByValue()
- {
- $arr = [
- 'zZz',
- 'éee',
- 'éae',
- 'eee',
- 'A',
- 'a',
- 'zzz',
- ];
- $expected = [
- 'a',
- 'A',
- 'éae',
- 'eee',
- 'éee',
- 'zzz',
- 'zZz',
- ];
-
- alphabetical_sort($arr);
- $this->assertEquals($expected, $arr);
- }
-
- /**
- * Test alphabetical_sort by value, reversed, with php-intl.
- */
- public function testAlphabeticalSortByValueReversed()
- {
- $arr = [
- 'zZz',
- 'éee',
- 'éae',
- 'eee',
- 'A',
- 'a',
- 'zzz',
- ];
- $expected = [
- 'zZz',
- 'zzz',
- 'éee',
- 'eee',
- 'éae',
- 'A',
- 'a',
- ];
-
- alphabetical_sort($arr, true);
- $this->assertEquals($expected, $arr);
- }
-
- /**
- * Test alphabetical_sort by keys, not reversed, with php-intl.
- */
- public function testAlphabeticalSortByKeys()
- {
- $arr = [
- 'zZz' => true,
- 'éee' => true,
- 'éae' => true,
- 'eee' => true,
- 'A' => true,
- 'a' => true,
- 'zzz' => true,
- ];
- $expected = [
- 'a' => true,
- 'A' => true,
- 'éae' => true,
- 'eee' => true,
- 'éee' => true,
- 'zzz' => true,
- 'zZz' => true,
- ];
-
- alphabetical_sort($arr, true, true);
- $this->assertEquals($expected, $arr);
- }
-
- /**
- * Test alphabetical_sort by keys, reversed, with php-intl.
- */
- public function testAlphabeticalSortByKeysReversed()
- {
- $arr = [
- 'zZz' => true,
- 'éee' => true,
- 'éae' => true,
- 'eee' => true,
- 'A' => true,
- 'a' => true,
- 'zzz' => true,
- ];
- $expected = [
- 'zZz' => true,
- 'zzz' => true,
- 'éee' => true,
- 'eee' => true,
- 'éae' => true,
- 'A' => true,
- 'a' => true,
- ];
-
- alphabetical_sort($arr, true, true);
- $this->assertEquals($expected, $arr);
- }
-}
diff --git a/tests/api/ApiMiddlewareTest.php b/tests/api/ApiMiddlewareTest.php
deleted file mode 100644
index 6e222681..00000000
--- a/tests/api/ApiMiddlewareTest.php
+++ /dev/null
@@ -1,262 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('api.secret', 'NapoleonWasALizard');
-
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
-
- $history = new History('sandbox/history.php');
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['history'] = $history;
- $this->container['pluginManager'] = new PluginManager($this->conf);
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- }
-
- /**
- * Invoke the middleware with a valid token
- */
- public function testInvokeMiddlewareWithValidToken(): void
- {
- $next = function (Request $request, Response $response): Response {
- return $response;
- };
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- 'HTTP_AUTHORIZATION' => 'Bearer ' . ApiUtilsTest::generateValidJwtToken('NapoleonWasALizard'),
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, $next);
-
- $this->assertEquals(200, $response->getStatusCode());
- }
-
- /**
- * Invoke the middleware with a valid token
- * Using specific Apache CGI redirected authorization.
- */
- public function testInvokeMiddlewareWithValidTokenFromRedirectedHeader(): void
- {
- $next = function (Request $request, Response $response): Response {
- return $response;
- };
-
- $token = 'Bearer ' . ApiUtilsTest::generateValidJwtToken('NapoleonWasALizard');
- $this->container->environment['REDIRECT_HTTP_AUTHORIZATION'] = $token;
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, $next);
-
- $this->assertEquals(200, $response->getStatusCode());
- }
-
- /**
- * Invoke the middleware with the API disabled:
- * should return a 401 error Unauthorized.
- */
- public function testInvokeMiddlewareApiDisabled()
- {
- $this->conf->set('api.enabled', false);
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, null);
-
- $this->assertEquals(401, $response->getStatusCode());
- $body = json_decode((string) $response->getBody());
- $this->assertEquals('Not authorized', $body);
- }
-
- /**
- * Invoke the middleware with the API disabled in debug mode:
- * should return a 401 error Unauthorized - with a specific message and a stacktrace.
- */
- public function testInvokeMiddlewareApiDisabledDebug()
- {
- $this->conf->set('api.enabled', false);
- $this->conf->set('dev.debug', true);
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, null);
-
- $this->assertEquals(401, $response->getStatusCode());
- $body = json_decode((string) $response->getBody());
- $this->assertEquals('Not authorized: API is disabled', $body->message);
- $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
- }
-
- /**
- * Invoke the middleware without a token (debug):
- * should return a 401 error Unauthorized - with a specific message and a stacktrace.
- */
- public function testInvokeMiddlewareNoTokenProvidedDebug()
- {
- $this->conf->set('dev.debug', true);
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, null);
-
- $this->assertEquals(401, $response->getStatusCode());
- $body = json_decode((string) $response->getBody());
- $this->assertEquals('Not authorized: JWT token not provided', $body->message);
- $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
- }
-
- /**
- * Invoke the middleware without a secret set in settings (debug):
- * should return a 401 error Unauthorized - with a specific message and a stacktrace.
- */
- public function testInvokeMiddlewareNoSecretSetDebug()
- {
- $this->conf->set('dev.debug', true);
- $this->conf->set('api.secret', '');
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- 'HTTP_AUTHORIZATION' => 'Bearer jwt',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, null);
-
- $this->assertEquals(401, $response->getStatusCode());
- $body = json_decode((string) $response->getBody());
- $this->assertEquals('Not authorized: Token secret must be set in Shaarli\'s administration', $body->message);
- $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
- }
-
- /**
- * Invoke the middleware with an invalid JWT token header
- */
- public function testInvalidJwtAuthHeaderDebug()
- {
- $this->conf->set('dev.debug', true);
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- 'HTTP_AUTHORIZATION' => 'PolarBearer jwt',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, null);
-
- $this->assertEquals(401, $response->getStatusCode());
- $body = json_decode((string) $response->getBody());
- $this->assertEquals('Not authorized: Invalid JWT header', $body->message);
- $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
- }
-
- /**
- * Invoke the middleware with an invalid JWT token (debug):
- * should return a 401 error Unauthorized - with a specific message and a stacktrace.
- *
- * Note: specific JWT errors tests are handled in ApiUtilsTest.
- */
- public function testInvokeMiddlewareInvalidJwtDebug()
- {
- $this->conf->set('dev.debug', true);
- $mw = new ApiMiddleware($this->container);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'REQUEST_URI' => '/echo',
- 'HTTP_AUTHORIZATION' => 'Bearer jwt',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = new Response();
- /** @var Response $response */
- $response = $mw($request, $response, null);
-
- $this->assertEquals(401, $response->getStatusCode());
- $body = json_decode((string) $response->getBody());
- $this->assertEquals('Not authorized: Malformed JWT token', $body->message);
- $this->assertContainsPolyfill('ApiAuthorizationException', $body->stacktrace);
- }
-}
diff --git a/tests/api/ApiUtilsTest.php b/tests/api/ApiUtilsTest.php
deleted file mode 100644
index db396228..00000000
--- a/tests/api/ApiUtilsTest.php
+++ /dev/null
@@ -1,354 +0,0 @@
-assertTrue(ApiUtils::validateJwtToken(self::generateValidJwtToken($secret), $secret));
- }
-
- /**
- * Test validateJwtToken() with a malformed JWT token.
- */
- public function testValidateJwtTokenMalformed()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Malformed JWT token');
-
- $token = 'ABC.DEF';
- ApiUtils::validateJwtToken($token, 'foo');
- }
-
- /**
- * Test validateJwtToken() with an empty JWT token.
- */
- public function testValidateJwtTokenMalformedEmpty()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Malformed JWT token');
-
- $token = false;
- ApiUtils::validateJwtToken($token, 'foo');
- }
-
- /**
- * Test validateJwtToken() with a JWT token without header.
- */
- public function testValidateJwtTokenMalformedEmptyHeader()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Malformed JWT token');
-
- $token = '.payload.signature';
- ApiUtils::validateJwtToken($token, 'foo');
- }
-
- /**
- * Test validateJwtToken() with a JWT token without payload
- */
- public function testValidateJwtTokenMalformedEmptyPayload()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Malformed JWT token');
-
- $token = 'header..signature';
- ApiUtils::validateJwtToken($token, 'foo');
- }
-
- /**
- * Test validateJwtToken() with a JWT token with an empty signature.
- */
- public function testValidateJwtTokenInvalidSignatureEmpty()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT signature');
-
- $token = 'header.payload.';
- ApiUtils::validateJwtToken($token, 'foo');
- }
-
- /**
- * Test validateJwtToken() with a JWT token with an invalid signature.
- */
- public function testValidateJwtTokenInvalidSignature()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT signature');
-
- $token = 'header.payload.nope';
- ApiUtils::validateJwtToken($token, 'foo');
- }
-
- /**
- * Test validateJwtToken() with a JWT token with a signature generated with the wrong API secret.
- */
- public function testValidateJwtTokenInvalidSignatureSecret()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT signature');
-
- ApiUtils::validateJwtToken(self::generateValidJwtToken('foo'), 'bar');
- }
-
- /**
- * Test validateJwtToken() with a JWT token with a an invalid header (not JSON).
- */
- public function testValidateJwtTokenInvalidHeader()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT header');
-
- $token = $this->generateCustomJwtToken('notJSON', '{"JSON":1}', 'secret');
- ApiUtils::validateJwtToken($token, 'secret');
- }
-
- /**
- * Test validateJwtToken() with a JWT token with a an invalid payload (not JSON).
- */
- public function testValidateJwtTokenInvalidPayload()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT payload');
-
- $token = $this->generateCustomJwtToken('{"JSON":1}', 'notJSON', 'secret');
- ApiUtils::validateJwtToken($token, 'secret');
- }
-
- /**
- * Test validateJwtToken() with a JWT token without issued time.
- */
- public function testValidateJwtTokenInvalidTimeEmpty()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT issued time');
-
- $token = $this->generateCustomJwtToken('{"JSON":1}', '{"JSON":1}', 'secret');
- ApiUtils::validateJwtToken($token, 'secret');
- }
-
- /**
- * Test validateJwtToken() with an expired JWT token.
- */
- public function testValidateJwtTokenInvalidTimeExpired()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT issued time');
-
- $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() - 600) . '}', 'secret');
- ApiUtils::validateJwtToken($token, 'secret');
- }
-
- /**
- * Test validateJwtToken() with a JWT token issued in the future.
- */
- public function testValidateJwtTokenInvalidTimeFuture()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiAuthorizationException::class);
- $this->expectExceptionMessage('Invalid JWT issued time');
-
- $token = $this->generateCustomJwtToken('{"JSON":1}', '{"iat":' . (time() + 60) . '}', 'secret');
- ApiUtils::validateJwtToken($token, 'secret');
- }
-
- /**
- * Test formatLink() with a link using all useful fields.
- */
- public function testFormatLinkComplete()
- {
- $indexUrl = 'https://domain.tld/sub/';
- $data = [
- 'id' => 12,
- 'url' => 'http://lol.lol',
- 'shorturl' => 'abc',
- 'title' => 'Important Title',
- 'description' => 'It is very lol' . PHP_EOL . 'new line',
- 'tags' => 'blip .blop ',
- 'private' => '1',
- 'created' => \DateTime::createFromFormat('Ymd_His', '20170107_160102'),
- 'updated' => \DateTime::createFromFormat('Ymd_His', '20170107_160612'),
- ];
- $bookmark = new Bookmark();
- $bookmark->fromArray($data);
-
- $expected = [
- 'id' => 12,
- 'url' => 'http://lol.lol',
- 'shorturl' => 'abc',
- 'title' => 'Important Title',
- 'description' => 'It is very lol' . PHP_EOL . 'new line',
- 'tags' => ['blip', '.blop'],
- 'private' => true,
- 'created' => '2017-01-07T16:01:02+00:00',
- 'updated' => '2017-01-07T16:06:12+00:00',
- ];
-
- $this->assertEquals($expected, ApiUtils::formatLink($bookmark, $indexUrl));
- }
-
- /**
- * Test formatLink() with only minimal fields filled, and internal link.
- */
- public function testFormatLinkMinimalNote()
- {
- $indexUrl = 'https://domain.tld/sub/';
- $data = [
- 'id' => 12,
- 'url' => '?abc',
- 'shorturl' => 'abc',
- 'title' => 'Note',
- 'description' => '',
- 'tags' => '',
- 'private' => '',
- 'created' => \DateTime::createFromFormat('Ymd_His', '20170107_160102'),
- ];
- $bookmark = new Bookmark();
- $bookmark->fromArray($data);
-
- $expected = [
- 'id' => 12,
- 'url' => 'https://domain.tld/sub/?abc',
- 'shorturl' => 'abc',
- 'title' => 'Note',
- 'description' => '',
- 'tags' => [],
- 'private' => false,
- 'created' => '2017-01-07T16:01:02+00:00',
- 'updated' => '',
- ];
-
- $this->assertEquals($expected, ApiUtils::formatLink($bookmark, $indexUrl));
- }
-
- /**
- * Test updateLink with valid data, and also unnecessary fields.
- */
- public function testUpdateLink()
- {
- $created = \DateTime::createFromFormat('Ymd_His', '20170107_160102');
- $data = [
- 'id' => 12,
- 'url' => '?abc',
- 'shorturl' => 'abc',
- 'title' => 'Note',
- 'description' => '',
- 'tags' => '',
- 'private' => '',
- 'created' => $created,
- ];
- $old = new Bookmark();
- $old->fromArray($data);
-
- $data = [
- 'id' => 13,
- 'shorturl' => 'nope',
- 'url' => 'http://somewhere.else',
- 'title' => 'Le Cid',
- 'description' => 'Percé jusques au fond du cœur [...]',
- 'tags' => 'corneille rodrigue',
- 'private' => true,
- 'created' => 'creation',
- 'updated' => 'updation',
- ];
- $new = new Bookmark();
- $new->fromArray($data);
-
- $result = ApiUtils::updateLink($old, $new);
- $this->assertEquals(12, $result->getId());
- $this->assertEquals('http://somewhere.else', $result->getUrl());
- $this->assertEquals('abc', $result->getShortUrl());
- $this->assertEquals('Le Cid', $result->getTitle());
- $this->assertEquals('Percé jusques au fond du cœur [...]', $result->getDescription());
- $this->assertEquals('corneille rodrigue', $result->getTagsString());
- $this->assertEquals(true, $result->isPrivate());
- $this->assertEquals($created, $result->getCreated());
- }
-
- /**
- * Test updateLink with minimal data.
- */
- public function testUpdateLinkMinimal()
- {
- $created = \DateTime::createFromFormat('Ymd_His', '20170107_160102');
- $data = [
- 'id' => 12,
- 'url' => '?abc',
- 'shorturl' => 'abc',
- 'title' => 'Note',
- 'description' => 'Interesting description!',
- 'tags' => 'doggo',
- 'private' => true,
- 'created' => $created,
- ];
- $old = new Bookmark();
- $old->fromArray($data);
-
- $new = new Bookmark();
-
- $result = ApiUtils::updateLink($old, $new);
- $this->assertEquals(12, $result->getId());
- $this->assertEquals('', $result->getUrl());
- $this->assertEquals('abc', $result->getShortUrl());
- $this->assertEquals('', $result->getTitle());
- $this->assertEquals('', $result->getDescription());
- $this->assertEquals('', $result->getTagsString());
- $this->assertEquals(false, $result->isPrivate());
- $this->assertEquals($created, $result->getCreated());
- }
-}
diff --git a/tests/api/controllers/history/HistoryTest.php b/tests/api/controllers/history/HistoryTest.php
deleted file mode 100644
index f0596b91..00000000
--- a/tests/api/controllers/history/HistoryTest.php
+++ /dev/null
@@ -1,215 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->refHistory = new ReferenceHistory();
- $this->refHistory->write(self::$testHistory);
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = true;
- $this->container['history'] = new History(self::$testHistory);
-
- $this->controller = new HistoryController($this->container);
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testHistory);
- }
-
- /**
- * Test /history service without parameter.
- */
- public function testGetHistory()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getHistory($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals($this->refHistory->count(), count($data));
-
- $this->assertEquals(History::DELETED, $data[0]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM),
- $data[0]['datetime']
- );
- $this->assertEquals(124, $data[0]['id']);
-
- $this->assertEquals(History::SETTINGS, $data[1]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170302_121215')->format(\DateTime::ATOM),
- $data[1]['datetime']
- );
- $this->assertNull($data[1]['id']);
-
- $this->assertEquals(History::UPDATED, $data[2]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170301_121214')->format(\DateTime::ATOM),
- $data[2]['datetime']
- );
- $this->assertEquals(123, $data[2]['id']);
-
- $this->assertEquals(History::CREATED, $data[3]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170201_121214')->format(\DateTime::ATOM),
- $data[3]['datetime']
- );
- $this->assertEquals(124, $data[3]['id']);
-
- $this->assertEquals(History::CREATED, $data[4]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170101_121212')->format(\DateTime::ATOM),
- $data[4]['datetime']
- );
- $this->assertEquals(123, $data[4]['id']);
- }
-
- /**
- * Test /history service with limit parameter.
- */
- public function testGetHistoryLimit()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'limit=1'
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getHistory($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals(1, count($data));
-
- $this->assertEquals(History::DELETED, $data[0]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM),
- $data[0]['datetime']
- );
- $this->assertEquals(124, $data[0]['id']);
- }
-
- /**
- * Test /history service with offset parameter.
- */
- public function testGetHistoryOffset()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'offset=4'
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getHistory($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals(1, count($data));
-
- $this->assertEquals(History::CREATED, $data[0]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170101_121212')->format(\DateTime::ATOM),
- $data[0]['datetime']
- );
- $this->assertEquals(123, $data[0]['id']);
- }
-
- /**
- * Test /history service with since parameter.
- */
- public function testGetHistorySince()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'since=2017-03-03T00:00:00%2B00:00'
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getHistory($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals(1, count($data));
-
- $this->assertEquals(History::DELETED, $data[0]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170303_121216')->format(\DateTime::ATOM),
- $data[0]['datetime']
- );
- $this->assertEquals(124, $data[0]['id']);
- }
-
- /**
- * Test /history service with since parameter.
- */
- public function testGetHistorySinceOffsetLimit()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'since=2017-02-01T00:00:00%2B00:00&offset=1&limit=1'
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getHistory($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals(1, count($data));
-
- $this->assertEquals(History::SETTINGS, $data[0]['event']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20170302_121215')->format(\DateTime::ATOM),
- $data[0]['datetime']
- );
- }
-}
diff --git a/tests/api/controllers/info/InfoTest.php b/tests/api/controllers/info/InfoTest.php
deleted file mode 100644
index 2b0fd510..00000000
--- a/tests/api/controllers/info/InfoTest.php
+++ /dev/null
@@ -1,131 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $this->pluginManager = new PluginManager($this->conf);
- $history = new History('sandbox/history.php');
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $history,
- $mutex,
- true
- );
- $this->container['history'] = null;
-
- $this->controller = new Info($this->container);
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- }
-
- /**
- * Test /info service.
- */
- public function testGetInfo()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getInfo($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']);
- $this->assertEquals(2, $data['private_counter']);
- $this->assertEquals('Shaarli', $data['settings']['title']);
- $this->assertEquals('?', $data['settings']['header_link']);
- $this->assertEquals('Europe/Paris', $data['settings']['timezone']);
- $this->assertEquals(ConfigManager::$DEFAULT_PLUGINS, $data['settings']['enabled_plugins']);
- $this->assertEquals(true, $data['settings']['default_private_links']);
-
- $title = 'My bookmarks';
- $headerLink = 'http://shaarli.tld';
- $timezone = 'Europe/Paris';
- $enabledPlugins = ['foo', 'bar'];
- $defaultPrivateLinks = true;
- $this->conf->set('general.title', $title);
- $this->conf->set('general.header_link', $headerLink);
- $this->conf->set('general.timezone', $timezone);
- $this->conf->set('general.enabled_plugins', $enabledPlugins);
- $this->conf->set('privacy.default_private_links', $defaultPrivateLinks);
-
- $response = $this->controller->getInfo($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
-
- $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, $data['global_counter']);
- $this->assertEquals(2, $data['private_counter']);
- $this->assertEquals($title, $data['settings']['title']);
- $this->assertEquals($headerLink, $data['settings']['header_link']);
- $this->assertEquals($timezone, $data['settings']['timezone']);
- $this->assertEquals($enabledPlugins, $data['settings']['enabled_plugins']);
- $this->assertEquals($defaultPrivateLinks, $data['settings']['default_private_links']);
- }
-}
diff --git a/tests/api/controllers/links/DeleteLinkTest.php b/tests/api/controllers/links/DeleteLinkTest.php
deleted file mode 100644
index 2c3c3ecc..00000000
--- a/tests/api/controllers/links/DeleteLinkTest.php
+++ /dev/null
@@ -1,153 +0,0 @@
-mutex = new NoMutex();
- $this->conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $refHistory = new ReferenceHistory();
- $refHistory->write(self::$testHistory);
- $this->history = new History(self::$testHistory);
- $this->pluginManager = new PluginManager($this->conf);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = $this->bookmarkService;
- $this->container['history'] = $this->history;
-
- $this->controller = new Links($this->container);
- }
-
- /**
- * After each test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- @unlink(self::$testHistory);
- }
-
- /**
- * Test DELETE link endpoint: the link should be removed.
- */
- public function testDeleteLinkValid()
- {
- $id = '41';
- $this->assertTrue($this->bookmarkService->exists($id));
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'DELETE',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->deleteLink($request, new Response(), ['id' => $id]);
- $this->assertEquals(204, $response->getStatusCode());
- $this->assertEmpty((string) $response->getBody());
-
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- $this->assertFalse($this->bookmarkService->exists($id));
-
- $historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(History::DELETED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- $this->assertEquals($id, $historyEntry['id']);
- }
-
- /**
- * Test DELETE link endpoint: reach not existing ID.
- */
- public function testDeleteLink404()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiLinkNotFoundException::class);
-
- $id = -1;
- $this->assertFalse($this->bookmarkService->exists($id));
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'DELETE',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $this->controller->deleteLink($request, new Response(), ['id' => $id]);
- }
-}
diff --git a/tests/api/controllers/links/GetLinkIdTest.php b/tests/api/controllers/links/GetLinkIdTest.php
deleted file mode 100644
index 5fbb7505..00000000
--- a/tests/api/controllers/links/GetLinkIdTest.php
+++ /dev/null
@@ -1,147 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $history = new History('sandbox/history.php');
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $pluginManager = new PluginManager($this->conf);
- $this->container['db'] = new BookmarkFileService(
- $this->conf,
- $pluginManager,
- $history,
- $mutex,
- true
- );
- $this->container['history'] = null;
-
- $this->controller = new Links($this->container);
- }
-
- /**
- * After each test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- }
-
- /**
- * Test basic getLink service: return link ID=41.
- */
- public function testGetLinkId()
- {
- // Used by index_url().
- $_SERVER['SERVER_NAME'] = 'domain.tld';
- $_SERVER['SERVER_PORT'] = 80;
- $_SERVER['SCRIPT_NAME'] = '/';
-
- $id = 41;
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getLink($request, new Response(), ['id' => $id]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals($id, $data['id']);
-
- // Check link elements
- $this->assertEquals('http://domain.tld/shaare/WDWyig', $data['url']);
- $this->assertEquals('WDWyig', $data['shorturl']);
- $this->assertEquals('Link title: @website', $data['title']);
- $this->assertEquals(
- 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag',
- $data['description']
- );
- $this->assertEquals('sTuff', $data['tags'][0]);
- $this->assertEquals(false, $data['private']);
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
- $data['created']
- );
- $this->assertEmpty($data['updated']);
- }
-
- /**
- * Test basic getLink service: get non existent link => ApiLinkNotFoundException.
- */
- public function testGetLink404()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiLinkNotFoundException::class);
- $this->expectExceptionMessage('Link not found');
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $this->controller->getLink($request, new Response(), ['id' => -1]);
- }
-}
diff --git a/tests/api/controllers/links/GetLinksTest.php b/tests/api/controllers/links/GetLinksTest.php
deleted file mode 100644
index 217eb5d1..00000000
--- a/tests/api/controllers/links/GetLinksTest.php
+++ /dev/null
@@ -1,492 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $history = new History('sandbox/history.php');
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $pluginManager = new PluginManager($this->conf);
- $this->container['db'] = new BookmarkFileService(
- $this->conf,
- $pluginManager,
- $history,
- $mutex,
- true
- );
- $this->container['history'] = null;
-
- $this->controller = new Links($this->container);
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- }
-
- /**
- * Test basic getLinks service: returns all bookmarks.
- */
- public function testGetLinks()
- {
- // Used by index_url().
- $_SERVER['SERVER_NAME'] = 'domain.tld';
- $_SERVER['SERVER_PORT'] = 80;
- $_SERVER['SCRIPT_NAME'] = '/';
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals($this->refDB->countLinks(), count($data));
-
- // Check order
- $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42];
- $cpt = 0;
- foreach ($data as $link) {
- $this->assertEquals(self::NB_FIELDS_LINK, count($link));
- $this->assertEquals($order[$cpt++], $link['id']);
- }
-
- // Check first element fields
- $first = $data[2];
- $this->assertEquals('http://domain.tld/shaare/WDWyig', $first['url']);
- $this->assertEquals('WDWyig', $first['shorturl']);
- $this->assertEquals('Link title: @website', $first['title']);
- $this->assertEquals(
- 'Stallman has a beard and is part of the Free Software Foundation (or not). Seriously, read this. #hashtag',
- $first['description']
- );
- $this->assertEquals('sTuff', $first['tags'][0]);
- $this->assertEquals(false, $first['private']);
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20150310_114651')->format(\DateTime::ATOM),
- $first['created']
- );
- $this->assertEmpty($first['updated']);
-
- // Multi tags
- $link = $data[3];
- $this->assertEquals(7, count($link['tags']));
-
- // Update date
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20160803_093033')->format(\DateTime::ATOM),
- $link['updated']
- );
- }
-
- /**
- * Test getLinks service with offset and limit parameter:
- * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC).
- */
- public function testGetLinksOffsetLimit()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'offset=3&limit=1'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(8, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- }
-
- /**
- * Test getLinks with limit=all (return all link).
- */
- public function testGetLinksLimitAll()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'limit=all'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals($this->refDB->countLinks(), count($data));
- // Check order
- $order = [10, 11, 41, 8, 6, 7, 0, 1, 9, 4, 42];
- $cpt = 0;
- foreach ($data as $link) {
- $this->assertEquals(self::NB_FIELDS_LINK, count($link));
- $this->assertEquals($order[$cpt++], $link['id']);
- }
- }
-
- /**
- * Test getLinks service with offset and limit parameter:
- * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC).
- */
- public function testGetLinksOffsetTooHigh()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'offset=100'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEmpty(count($data));
- }
-
- /**
- * Test getLinks with visibility parameter set to all
- */
- public function testGetLinksVisibilityAll()
- {
- $env = Environment::mock(
- [
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'visibility=all'
- ]
- );
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string)$response->getBody(), true);
- $this->assertEquals($this->refDB->countLinks(), count($data));
- $this->assertEquals(10, $data[0]['id']);
- $this->assertEquals(41, $data[2]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- }
-
- /**
- * Test getLinks with visibility parameter set to private
- */
- public function testGetLinksVisibilityPrivate()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'visibility=private'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals($this->refDB->countPrivateLinks(), count($data));
- $this->assertEquals(6, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- }
-
- /**
- * Test getLinks with visibility parameter set to public
- */
- public function testGetLinksVisibilityPublic()
- {
- $env = Environment::mock(
- [
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'visibility=public'
- ]
- );
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string)$response->getBody(), true);
- $this->assertEquals($this->refDB->countPublicLinks(), count($data));
- $this->assertEquals(10, $data[0]['id']);
- $this->assertEquals(41, $data[2]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- }
-
- /**
- * Test getLinks service with offset and limit parameter:
- * limit=1 and offset=1 should return only the second link, ID=8 (ordered by creation date DESC).
- */
- public function testGetLinksSearchTerm()
- {
- // Only in description - 1 result
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=Tropical'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(1, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
-
- // Only in tags - 1 result
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=tag3'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(0, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
-
- // Multiple results (2)
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=stallman'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(2, count($data));
- $this->assertEquals(41, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- $this->assertEquals(8, $data[1]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[1]));
-
- // Multiword - 2 results
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=stallman+software'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(2, count($data));
- $this->assertEquals(41, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- $this->assertEquals(8, $data[1]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[1]));
-
- // URL encoding
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=' . urlencode('@web')
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(2, count($data));
- $this->assertEquals(41, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- $this->assertEquals(8, $data[1]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[1]));
- }
-
- public function testGetLinksSearchTermNoResult()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=nope'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(0, count($data));
- }
-
- public function testGetLinksSearchTags()
- {
- // Single tag
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=dev',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(2, count($data));
- $this->assertEquals(0, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- $this->assertEquals(4, $data[1]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[1]));
-
- // Multitag + exclude
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=stuff+-gnu',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(41, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
-
- // wildcard: placeholder at the start
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=*Tuff',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(2, count($data));
- $this->assertEquals(41, $data[0]['id']);
-
- // wildcard: placeholder at the end
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=c*',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(5, count($data));
- $this->assertEquals(6, $data[0]['id']);
-
- // wildcard: placeholder at the middle
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=w*b',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(4, count($data));
- $this->assertEquals(6, $data[0]['id']);
-
- // wildcard: match all
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=*',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(ReferenceLinkDB::$NB_LINKS_TOTAL, count($data));
- $this->assertEquals(10, $data[0]['id']);
- $this->assertEquals(41, $data[2]['id']);
-
- // wildcard: optional ('*' does not need to expand)
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=*stuff*',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(2, count($data));
- $this->assertEquals(41, $data[0]['id']);
-
- // wildcard: exclusions
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=*a*+-*e*',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(41, $data[0]['id']); // finds '#hashtag' in descr.
-
- // wildcard: exclude all
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchtags=-*',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(0, count($data));
- }
-
- /**
- * Test getLinks service with search tags+terms.
- */
- public function testGetLinksSearchTermsAndTags()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'searchterm=poke&searchtags=dev',
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getLinks($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(0, $data[0]['id']);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data[0]));
- }
-}
diff --git a/tests/api/controllers/links/PostLinkTest.php b/tests/api/controllers/links/PostLinkTest.php
deleted file mode 100644
index faf43ee1..00000000
--- a/tests/api/controllers/links/PostLinkTest.php
+++ /dev/null
@@ -1,289 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $refHistory = new ReferenceHistory();
- $refHistory->write(self::$testHistory);
- $this->history = new History(self::$testHistory);
- $pluginManager = new PluginManager($this->conf);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $pluginManager,
- $this->history,
- $mutex,
- true
- );
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = $this->bookmarkService;
- $this->container['history'] = $this->history;
-
- $this->controller = new Links($this->container);
-
- $mock = $this->createMock(Router::class);
- $mock->expects($this->any())
- ->method('pathFor')
- ->willReturn('/api/v1/bookmarks/1');
-
- // affect @property-read... seems to work
- $this->controller->getCi()->router = $mock;
-
- // Used by index_url().
- $this->controller->getCi()['environment'] = [
- 'SERVER_NAME' => 'domain.tld',
- 'SERVER_PORT' => 80,
- 'SCRIPT_NAME' => '/',
- ];
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- @unlink(self::$testHistory);
- }
-
- /**
- * Test link creation without any field: creates a blank note.
- */
- public function testPostLinkMinimal()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'POST',
- ]);
-
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->postLink($request, new Response());
- $this->assertEquals(201, $response->getStatusCode());
- $this->assertEquals('/api/v1/bookmarks/1', $response->getHeader('Location')[0]);
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(43, $data['id']);
- $this->assertRegExp('/[\w_-]{6}/', $data['shorturl']);
- $this->assertEquals('http://domain.tld/shaare/' . $data['shorturl'], $data['url']);
- $this->assertEquals('/shaare/' . $data['shorturl'], $data['title']);
- $this->assertEquals('', $data['description']);
- $this->assertEquals([], $data['tags']);
- $this->assertEquals(true, $data['private']);
- $this->assertTrue(
- new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
- );
- $this->assertEquals('', $data['updated']);
-
- $historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(History::CREATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- $this->assertEquals(43, $historyEntry['id']);
- }
-
- /**
- * Test link creation with all available fields.
- */
- public function testPostLinkFull()
- {
- $link = [
- 'url' => 'website.tld/test?foo=bar',
- 'title' => 'new entry',
- 'description' => 'shaare description',
- 'tags' => ['one', 'two'],
- 'private' => true,
- 'created' => '2015-05-05T12:30:00+03:00',
- 'updated' => '2016-06-05T14:32:10+03:00',
- ];
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'POST',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->postLink($request, new Response());
-
- $this->assertEquals(201, $response->getStatusCode());
- $this->assertEquals('/api/v1/bookmarks/1', $response->getHeader('Location')[0]);
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(43, $data['id']);
- $this->assertRegExp('/[\w_-]{6}/', $data['shorturl']);
- $this->assertEquals('http://' . $link['url'], $data['url']);
- $this->assertEquals($link['title'], $data['title']);
- $this->assertEquals($link['description'], $data['description']);
- $this->assertEquals($link['tags'], $data['tags']);
- $this->assertEquals(true, $data['private']);
- $this->assertSame($link['created'], $data['created']);
- $this->assertSame($link['updated'], $data['updated']);
- }
-
- /**
- * Test link creation with an existing link (duplicate URL). Should return a 409 HTTP error and the existing link.
- */
- public function testPostLinkDuplicate()
- {
- $link = [
- 'url' => 'mediagoblin.org/',
- 'title' => 'new entry',
- 'description' => 'shaare description',
- 'tags' => ['one', 'two'],
- 'private' => true,
- ];
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'POST',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->postLink($request, new Response());
-
- $this->assertEquals(409, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(7, $data['id']);
- $this->assertEquals('IuWvgA', $data['shorturl']);
- $this->assertEquals('http://mediagoblin.org/', $data['url']);
- $this->assertEquals('MediaGoblin', $data['title']);
- $this->assertEquals('A free software media publishing platform #hashtagOther', $data['description']);
- $this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']);
- $this->assertEquals(false, $data['private']);
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130614_184135'),
- \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
- );
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130615_184230'),
- \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
- );
- }
-
- /**
- * Test link creation with a tag string provided
- */
- public function testPostLinkWithTagString(): void
- {
- $link = [
- 'tags' => 'one two',
- ];
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'POST',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->postLink($request, new Response());
-
- $this->assertEquals(201, $response->getStatusCode());
- $this->assertEquals('/api/v1/bookmarks/1', $response->getHeader('Location')[0]);
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(['one', 'two'], $data['tags']);
- }
-
- /**
- * Test link creation with a tag string provided
- */
- public function testPostLinkWithTagString2(): void
- {
- $link = [
- 'tags' => ['one two'],
- ];
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'POST',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->postLink($request, new Response());
-
- $this->assertEquals(201, $response->getStatusCode());
- $this->assertEquals('/api/v1/bookmarks/1', $response->getHeader('Location')[0]);
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(['one', 'two'], $data['tags']);
- }
-}
diff --git a/tests/api/controllers/links/PutLinkTest.php b/tests/api/controllers/links/PutLinkTest.php
deleted file mode 100644
index 9bd196db..00000000
--- a/tests/api/controllers/links/PutLinkTest.php
+++ /dev/null
@@ -1,292 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $refHistory = new ReferenceHistory();
- $refHistory->write(self::$testHistory);
- $this->history = new History(self::$testHistory);
- $pluginManager = new PluginManager($this->conf);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $pluginManager,
- $this->history,
- $mutex,
- true
- );
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = $this->bookmarkService;
- $this->container['history'] = $this->history;
-
- $this->controller = new Links($this->container);
-
- // Used by index_url().
- $this->controller->getCi()['environment'] = [
- 'SERVER_NAME' => 'domain.tld',
- 'SERVER_PORT' => 80,
- 'SCRIPT_NAME' => '/',
- ];
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- @unlink(self::$testHistory);
- }
-
- /**
- * Test link update without value: reset the link to default values
- */
- public function testPutLinkMinimal()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $id = '41';
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->putLink($request, new Response(), ['id' => $id]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals($id, $data['id']);
- $this->assertEquals('WDWyig', $data['shorturl']);
- $this->assertEquals('http://domain.tld/shaare/WDWyig', $data['url']);
- $this->assertEquals('/shaare/WDWyig', $data['title']);
- $this->assertEquals('', $data['description']);
- $this->assertEquals([], $data['tags']);
- $this->assertEquals(true, $data['private']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20150310_114651'),
- \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
- );
- $this->assertTrue(
- new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
- );
-
- $historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(History::UPDATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- $this->assertEquals($id, $historyEntry['id']);
- }
-
- /**
- * Test link update with new values
- */
- public function testPutLinkWithValues()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- 'CONTENT_TYPE' => 'application/json'
- ]);
- $id = 41;
- $update = [
- 'url' => 'http://somewhere.else',
- 'title' => 'Le Cid',
- 'description' => 'Percé jusques au fond du cœur [...]',
- 'tags' => ['corneille', 'rodrigue'],
- 'private' => true,
- ];
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($update);
-
- $response = $this->controller->putLink($request, new Response(), ['id' => $id]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals($id, $data['id']);
- $this->assertEquals('WDWyig', $data['shorturl']);
- $this->assertEquals('http://somewhere.else', $data['url']);
- $this->assertEquals('Le Cid', $data['title']);
- $this->assertEquals('Percé jusques au fond du cœur [...]', $data['description']);
- $this->assertEquals(['corneille', 'rodrigue'], $data['tags']);
- $this->assertEquals(true, $data['private']);
- $this->assertEquals(
- \DateTime::createFromFormat('Ymd_His', '20150310_114651'),
- \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
- );
- $this->assertTrue(
- new \DateTime('5 seconds ago') < \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
- );
- }
-
- /**
- * Test link update with an existing URL: 409 Conflict with the existing link as body
- */
- public function testPutLinkDuplicate()
- {
- $link = [
- 'url' => 'mediagoblin.org/',
- 'title' => 'new entry',
- 'description' => 'shaare description',
- 'tags' => ['one', 'two'],
- 'private' => true,
- ];
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->putLink($request, new Response(), ['id' => 41]);
-
- $this->assertEquals(409, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(7, $data['id']);
- $this->assertEquals('IuWvgA', $data['shorturl']);
- $this->assertEquals('http://mediagoblin.org/', $data['url']);
- $this->assertEquals('MediaGoblin', $data['title']);
- $this->assertEquals('A free software media publishing platform #hashtagOther', $data['description']);
- $this->assertEquals(['gnu', 'media', 'web', '.hidden', 'hashtag'], $data['tags']);
- $this->assertEquals(false, $data['private']);
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130614_184135'),
- \DateTime::createFromFormat(\DateTime::ATOM, $data['created'])
- );
- $this->assertEquals(
- \DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20130615_184230'),
- \DateTime::createFromFormat(\DateTime::ATOM, $data['updated'])
- );
- }
-
- /**
- * Test link update on non existent link => ApiLinkNotFoundException.
- */
- public function testGetLink404()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiLinkNotFoundException::class);
- $this->expectExceptionMessage('Link not found');
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $this->controller->putLink($request, new Response(), ['id' => -1]);
- }
-
- /**
- * Test link creation with a tag string provided
- */
- public function testPutLinkWithTagString(): void
- {
- $link = [
- 'tags' => 'one two',
- ];
- $id = '41';
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->putLink($request, new Response(), ['id' => $id]);
-
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(['one', 'two'], $data['tags']);
- }
-
- /**
- * Test link creation with a tag string provided
- */
- public function testPutLinkWithTagString2(): void
- {
- $link = [
- 'tags' => ['one two'],
- ];
- $id = '41';
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- 'CONTENT_TYPE' => 'application/json'
- ]);
-
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($link);
- $response = $this->controller->putLink($request, new Response(), ['id' => $id]);
-
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_LINK, count($data));
- $this->assertEquals(['one', 'two'], $data['tags']);
- }
-}
diff --git a/tests/api/controllers/tags/DeleteTagTest.php b/tests/api/controllers/tags/DeleteTagTest.php
deleted file mode 100644
index 63a3e264..00000000
--- a/tests/api/controllers/tags/DeleteTagTest.php
+++ /dev/null
@@ -1,198 +0,0 @@
-mutex = new NoMutex();
- $this->conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $refHistory = new ReferenceHistory();
- $refHistory->write(self::$testHistory);
- $this->history = new History(self::$testHistory);
- $this->pluginManager = new PluginManager($this->conf);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = $this->bookmarkService;
- $this->container['history'] = $this->history;
-
- $this->controller = new Tags($this->container);
- }
-
- /**
- * After each test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- @unlink(self::$testHistory);
- }
-
- /**
- * Test DELETE tag endpoint: the tag should be removed.
- */
- public function testDeleteTagValid()
- {
- $tagName = 'gnu';
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertTrue($tags[$tagName] > 0);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'DELETE',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->deleteTag($request, new Response(), ['tagName' => $tagName]);
- $this->assertEquals(204, $response->getStatusCode());
- $this->assertEmpty((string) $response->getBody());
-
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertFalse(isset($tags[$tagName]));
-
- // 2 bookmarks affected
- $historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(History::UPDATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- $historyEntry = $this->history->getHistory()[1];
- $this->assertEquals(History::UPDATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- }
-
- /**
- * Test DELETE tag endpoint: the tag should be removed.
- */
- public function testDeleteTagCaseSensitivity()
- {
- $tagName = 'sTuff';
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertTrue($tags[$tagName] > 0);
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'DELETE',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->deleteTag($request, new Response(), ['tagName' => $tagName]);
- $this->assertEquals(204, $response->getStatusCode());
- $this->assertEmpty((string) $response->getBody());
-
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertFalse(isset($tags[$tagName]));
- $this->assertTrue($tags[strtolower($tagName)] > 0);
-
- $historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(History::UPDATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- }
-
- /**
- * Test DELETE tag endpoint: reach not existing tag.
- */
- public function testDeleteLink404()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiTagNotFoundException::class);
- $this->expectExceptionMessage('Tag not found');
-
- $tagName = 'nopenope';
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertFalse(isset($tags[$tagName]));
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'DELETE',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $this->controller->deleteTag($request, new Response(), ['tagName' => $tagName]);
- }
-}
diff --git a/tests/api/controllers/tags/GetTagNameTest.php b/tests/api/controllers/tags/GetTagNameTest.php
deleted file mode 100644
index 8ba4b83c..00000000
--- a/tests/api/controllers/tags/GetTagNameTest.php
+++ /dev/null
@@ -1,147 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $history = new History('sandbox/history.php');
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->pluginManager = new PluginManager($this->conf);
- $this->container['db'] = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $history,
- $mutex,
- true
- );
- $this->container['history'] = null;
-
- $this->controller = new Tags($this->container);
- }
-
- /**
- * After each test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- }
-
- /**
- * Test basic getTag service: return gnu tag with 2 occurrences.
- */
- public function testGetTag()
- {
- $tagName = 'gnu';
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getTag($request, new Response(), ['tagName' => $tagName]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_TAG, count($data));
- $this->assertEquals($tagName, $data['name']);
- $this->assertEquals(2, $data['occurrences']);
- }
-
- /**
- * Test getTag service which is not case sensitive: occurrences with both sTuff and stuff
- */
- public function testGetTagNotCaseSensitive()
- {
- $tagName = 'sTuff';
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getTag($request, new Response(), ['tagName' => $tagName]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_TAG, count($data));
- $this->assertEquals($tagName, $data['name']);
- $this->assertEquals(2, $data['occurrences']);
- }
-
- /**
- * Test basic getTag service: get non existent tag => ApiTagNotFoundException.
- */
- public function testGetTag404()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiTagNotFoundException::class);
- $this->expectExceptionMessage('Tag not found');
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $this->controller->getTag($request, new Response(), ['tagName' => 'nopenope']);
- }
-}
diff --git a/tests/api/controllers/tags/GetTagsTest.php b/tests/api/controllers/tags/GetTagsTest.php
deleted file mode 100644
index 1a183081..00000000
--- a/tests/api/controllers/tags/GetTagsTest.php
+++ /dev/null
@@ -1,227 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $history = new History('sandbox/history.php');
- $this->pluginManager = new PluginManager($this->conf);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $history,
- $mutex,
- true
- );
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = $this->bookmarkService;
- $this->container['history'] = null;
-
- $this->controller = new Tags($this->container);
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- }
-
- /**
- * Test basic getTags service: returns all tags.
- */
- public function testGetTagsAll()
- {
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $response = $this->controller->getTags($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(count($tags), count($data));
-
- // Check order
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[0]));
- $this->assertEquals('web', $data[0]['name']);
- $this->assertEquals(4, $data[0]['occurrences']);
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[1]));
- $this->assertEquals('cartoon', $data[1]['name']);
- $this->assertEquals(3, $data[1]['occurrences']);
- // Case insensitive
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[5]));
- $this->assertEquals('sTuff', $data[5]['name']);
- $this->assertEquals(2, $data[5]['occurrences']);
- // End
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[count($data) - 1]));
- $this->assertEquals('w3c', $data[count($data) - 1]['name']);
- $this->assertEquals(1, $data[count($data) - 1]['occurrences']);
- }
-
- /**
- * Test getTags service with offset and limit parameter:
- * limit=1 and offset=1 should return only the second tag, cartoon with 3 occurrences
- */
- public function testGetTagsOffsetLimit()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'offset=1&limit=1'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getTags($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(1, count($data));
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[0]));
- $this->assertEquals('cartoon', $data[0]['name']);
- $this->assertEquals(3, $data[0]['occurrences']);
- }
-
- /**
- * Test getTags with limit=all (return all tags).
- */
- public function testGetTagsLimitAll()
- {
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'limit=all'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getTags($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(count($tags), count($data));
- }
-
- /**
- * Test getTags service with offset and limit parameter:
- * limit=1 and offset=1 should not return any tag
- */
- public function testGetTagsOffsetTooHigh()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'offset=100'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getTags($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEmpty(count($data));
- }
-
- /**
- * Test getTags with visibility parameter set to private
- */
- public function testGetTagsVisibilityPrivate()
- {
- $tags = $this->bookmarkService->bookmarksCountPerTag([], 'private');
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'visibility=private'
- ]);
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getTags($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(count($tags), count($data));
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[0]));
- $this->assertEquals('Mercurial', $data[0]['name']);
- $this->assertEquals(1, $data[0]['occurrences']);
- }
-
- /**
- * Test getTags with visibility parameter set to public
- */
- public function testGetTagsVisibilityPublic()
- {
- $tags = $this->bookmarkService->bookmarksCountPerTag([], 'public');
- $env = Environment::mock(
- [
- 'REQUEST_METHOD' => 'GET',
- 'QUERY_STRING' => 'visibility=public'
- ]
- );
- $request = Request::createFromEnvironment($env);
- $response = $this->controller->getTags($request, new Response());
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string)$response->getBody(), true);
- $this->assertEquals(count($tags), count($data));
- $this->assertEquals(self::NB_FIELDS_TAG, count($data[0]));
- $this->assertEquals('web', $data[0]['name']);
- $this->assertEquals(3, $data[0]['occurrences']);
- }
-}
diff --git a/tests/api/controllers/tags/PutTagTest.php b/tests/api/controllers/tags/PutTagTest.php
deleted file mode 100644
index b2ebcd52..00000000
--- a/tests/api/controllers/tags/PutTagTest.php
+++ /dev/null
@@ -1,225 +0,0 @@
-conf = new ConfigManager('tests/utils/config/configJson');
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $refHistory = new ReferenceHistory();
- $refHistory->write(self::$testHistory);
- $this->history = new History(self::$testHistory);
- $this->pluginManager = new PluginManager($this->conf);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $mutex,
- true
- );
-
- $this->container = new Container();
- $this->container['conf'] = $this->conf;
- $this->container['db'] = $this->bookmarkService;
- $this->container['history'] = $this->history;
-
- $this->controller = new Tags($this->container);
- }
-
- /**
- * After every test, remove the test datastore.
- */
- protected function tearDown(): void
- {
- @unlink(self::$testDatastore);
- @unlink(self::$testHistory);
- }
-
- /**
- * Test tags update
- */
- public function testPutLinkValid()
- {
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $tagName = 'gnu';
- $update = ['name' => $newName = 'newtag'];
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($update);
-
- $response = $this->controller->putTag($request, new Response(), ['tagName' => $tagName]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_TAG, count($data));
- $this->assertEquals($newName, $data['name']);
- $this->assertEquals(2, $data['occurrences']);
-
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertNotTrue(isset($tags[$tagName]));
- $this->assertEquals(2, $tags[$newName]);
-
- $historyEntry = $this->history->getHistory()[0];
- $this->assertEquals(History::UPDATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- $historyEntry = $this->history->getHistory()[1];
- $this->assertEquals(History::UPDATED, $historyEntry['event']);
- $this->assertTrue(
- (new \DateTime())->add(\DateInterval::createFromDateString('-5 seconds')) < $historyEntry['datetime']
- );
- }
-
- /**
- * Test tag update with an existing tag: they should be merged
- */
- public function testPutTagMerge()
- {
- $tagName = 'gnu';
- $newName = 'w3c';
-
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertEquals(1, $tags[$newName]);
- $this->assertEquals(2, $tags[$tagName]);
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $update = ['name' => $newName];
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($update);
-
- $response = $this->controller->putTag($request, new Response(), ['tagName' => $tagName]);
- $this->assertEquals(200, $response->getStatusCode());
- $data = json_decode((string) $response->getBody(), true);
- $this->assertEquals(self::NB_FIELDS_TAG, count($data));
- $this->assertEquals($newName, $data['name']);
- $this->assertEquals(3, $data['occurrences']);
-
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertNotTrue(isset($tags[$tagName]));
- $this->assertEquals(3, $tags[$newName]);
- }
-
- /**
- * Test tag update with an empty new tag name => ApiBadParametersException
- */
- public function testPutTagEmpty()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiBadParametersException::class);
- $this->expectExceptionMessage('New tag name is required in the request body');
-
- $tagName = 'gnu';
- $newName = '';
-
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertEquals(2, $tags[$tagName]);
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $update = ['name' => $newName];
- $request = Request::createFromEnvironment($env);
- $request = $request->withParsedBody($update);
-
- try {
- $this->controller->putTag($request, new Response(), ['tagName' => $tagName]);
- } catch (ApiBadParametersException $e) {
- $tags = $this->bookmarkService->bookmarksCountPerTag();
- $this->assertEquals(2, $tags[$tagName]);
- throw $e;
- }
- }
-
- /**
- * Test tag update on non existent tag => ApiTagNotFoundException.
- */
- public function testPutTag404()
- {
- $this->expectException(\Shaarli\Api\Exceptions\ApiTagNotFoundException::class);
- $this->expectExceptionMessage('Tag not found');
-
- $env = Environment::mock([
- 'REQUEST_METHOD' => 'PUT',
- ]);
- $request = Request::createFromEnvironment($env);
-
- $this->controller->putTag($request, new Response(), ['tagName' => 'nopenope']);
- }
-}
diff --git a/tests/bookmark/BookmarkArrayTest.php b/tests/bookmark/BookmarkArrayTest.php
deleted file mode 100644
index c2f90d66..00000000
--- a/tests/bookmark/BookmarkArrayTest.php
+++ /dev/null
@@ -1,224 +0,0 @@
-assertTrue(is_iterable($array));
- $this->assertEmpty($array);
- }
-
- /**
- * Test adding entries to the array, specifying the key offset or not.
- */
- public function testArrayAccessAddEntries()
- {
- $array = new BookmarkArray();
- $bookmark = new Bookmark();
- $bookmark->setId(11)->validate();
- $array[] = $bookmark;
- $this->assertCount(1, $array);
- $this->assertTrue(isset($array[11]));
- $this->assertNull($array[0]);
- $this->assertEquals($bookmark, $array[11]);
-
- $bookmark = new Bookmark();
- $bookmark->setId(14)->validate();
- $array[14] = $bookmark;
- $this->assertCount(2, $array);
- $this->assertTrue(isset($array[14]));
- $this->assertNull($array[0]);
- $this->assertEquals($bookmark, $array[14]);
- }
-
- /**
- * Test adding a bad entry: wrong type
- */
- public function testArrayAccessAddBadEntryInstance()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
-
- $array = new BookmarkArray();
- $array[] = 'nope';
- }
-
- /**
- * Test adding a bad entry: no id
- */
- public function testArrayAccessAddBadEntryNoId()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
-
- $array = new BookmarkArray();
- $bookmark = new Bookmark();
- $array[] = $bookmark;
- }
-
- /**
- * Test adding a bad entry: no url
- */
- public function testArrayAccessAddBadEntryNoUrl()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
-
- $array = new BookmarkArray();
- $bookmark = (new Bookmark())->setId(11);
- $array[] = $bookmark;
- }
-
- /**
- * Test adding a bad entry: invalid offset
- */
- public function testArrayAccessAddBadEntryOffset()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
-
- $array = new BookmarkArray();
- $bookmark = (new Bookmark())->setId(11);
- $bookmark->validate();
- $array['nope'] = $bookmark;
- }
-
- /**
- * Test adding a bad entry: ID/offset not consistent
- */
- public function testArrayAccessAddBadEntryIdOffset()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\InvalidBookmarkException::class);
-
- $array = new BookmarkArray();
- $bookmark = (new Bookmark())->setId(11);
- $bookmark->validate();
- $array[14] = $bookmark;
- }
-
- /**
- * Test update entries through array access.
- */
- public function testArrayAccessUpdateEntries()
- {
- $array = new BookmarkArray();
- $bookmark = new Bookmark();
- $bookmark->setId(11)->validate();
- $bookmark->setTitle('old');
- $array[] = $bookmark;
- $bookmark = new Bookmark();
- $bookmark->setId(11)->validate();
- $bookmark->setTitle('test');
- $array[] = $bookmark;
- $this->assertCount(1, $array);
- $this->assertEquals('test', $array[11]->getTitle());
-
- $bookmark = new Bookmark();
- $bookmark->setId(11)->validate();
- $bookmark->setTitle('test2');
- $array[11] = $bookmark;
- $this->assertCount(1, $array);
- $this->assertEquals('test2', $array[11]->getTitle());
- }
-
- /**
- * Test delete entries through array access.
- */
- public function testArrayAccessDeleteEntries()
- {
- $array = new BookmarkArray();
- $bookmark11 = new Bookmark();
- $bookmark11->setId(11)->validate();
- $array[] = $bookmark11;
- $bookmark14 = new Bookmark();
- $bookmark14->setId(14)->validate();
- $array[] = $bookmark14;
- $bookmark23 = new Bookmark();
- $bookmark23->setId(23)->validate();
- $array[] = $bookmark23;
- $bookmark0 = new Bookmark();
- $bookmark0->setId(0)->validate();
- $array[] = $bookmark0;
- $this->assertCount(4, $array);
-
- unset($array[14]);
- $this->assertCount(3, $array);
- $this->assertEquals($bookmark11, $array[11]);
- $this->assertEquals($bookmark23, $array[23]);
- $this->assertEquals($bookmark0, $array[0]);
-
- unset($array[23]);
- $this->assertCount(2, $array);
- $this->assertEquals($bookmark11, $array[11]);
- $this->assertEquals($bookmark0, $array[0]);
-
- unset($array[11]);
- $this->assertCount(1, $array);
- $this->assertEquals($bookmark0, $array[0]);
-
- unset($array[0]);
- $this->assertCount(0, $array);
- }
-
- /**
- * Test iterating through array access.
- */
- public function testArrayAccessIterate()
- {
- $array = new BookmarkArray();
- $bookmark11 = new Bookmark();
- $bookmark11->setId(11)->validate();
- $array[] = $bookmark11;
- $bookmark14 = new Bookmark();
- $bookmark14->setId(14)->validate();
- $array[] = $bookmark14;
- $bookmark23 = new Bookmark();
- $bookmark23->setId(23)->validate();
- $array[] = $bookmark23;
- $this->assertCount(3, $array);
-
- foreach ($array as $id => $bookmark) {
- $this->assertEquals(${'bookmark' . $id}, $bookmark);
- }
- }
-
- /**
- * Test reordering the array.
- */
- public function testReorder()
- {
- $refDB = new ReferenceLinkDB();
- $refDB->write('sandbox/datastore.php');
-
-
- $bookmarks = $refDB->getLinks();
- $bookmarks->reorder('ASC');
- $this->assertInstanceOf(BookmarkArray::class, $bookmarks);
-
- $stickyIds = [11, 10];
- $standardIds = [42, 4, 9, 1, 0, 7, 6, 8, 41];
- $linkIds = array_merge($stickyIds, $standardIds);
- $cpt = 0;
- foreach ($bookmarks as $key => $value) {
- $this->assertEquals($linkIds[$cpt++], $key);
- }
-
- $bookmarks = $refDB->getLinks();
- $bookmarks->reorder('DESC');
- $this->assertInstanceOf(BookmarkArray::class, $bookmarks);
-
- $linkIds = array_merge(array_reverse($stickyIds), array_reverse($standardIds));
- $cpt = 0;
- foreach ($bookmarks as $key => $value) {
- $this->assertEquals($linkIds[$cpt++], $key);
- }
- }
-}
diff --git a/tests/bookmark/BookmarkFileServiceTest.php b/tests/bookmark/BookmarkFileServiceTest.php
deleted file mode 100644
index 0a265e3c..00000000
--- a/tests/bookmark/BookmarkFileServiceTest.php
+++ /dev/null
@@ -1,1273 +0,0 @@
-mutex = new NoMutex();
-
- if (file_exists(self::$testDatastore)) {
- unlink(self::$testDatastore);
- }
-
- if (file_exists(self::$testConf . '.json.php')) {
- unlink(self::$testConf . '.json.php');
- }
-
- if (file_exists(self::$testUpdates)) {
- unlink(self::$testUpdates);
- }
-
- copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
- $this->conf = new ConfigManager(self::$testConf);
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->conf->set('resource.updates', self::$testUpdates);
- $this->refDB = new ReferenceLinkDB();
- $this->refDB->write(self::$testDatastore);
- $this->history = new History('sandbox/history.php');
- $this->pluginManager = new PluginManager($this->conf);
- $this->publicLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- false
- );
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- }
-
- /**
- * Test migrate() method with a legacy datastore.
- */
- public function testDatabaseMigration()
- {
- if (!defined('SHAARLI_VERSION')) {
- define('SHAARLI_VERSION', 'dev');
- }
-
- $this->refDB = new ReferenceLinkDB(true);
- $this->refDB->write(self::$testDatastore);
- $db = self::getMethod('migrate');
- $db->invokeArgs($this->privateLinkDB, []);
-
- $db = new FakeBookmarkService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- $this->assertInstanceOf(BookmarkArray::class, $db->getBookmarks());
- $this->assertEquals($this->refDB->countLinks(), $db->count());
- }
-
- /**
- * Test get() method for a defined and saved bookmark
- */
- public function testGetDefinedSaved()
- {
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals('Note: I have a big ID but an old date', $bookmark->getTitle());
- }
-
- /**
- * Test get() method for a defined and not saved bookmark
- */
- public function testGetDefinedNotSaved()
- {
- $bookmark = new Bookmark();
- $this->privateLinkDB->add($bookmark);
- $createdBookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $createdBookmark->getId());
- $this->assertEmpty($createdBookmark->getDescription());
- }
-
- /**
- * Test get() method for an undefined bookmark
- */
- public function testGetUndefined()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- $this->privateLinkDB->get(666);
- }
-
- /**
- * Test add() method for a bookmark fully built
- */
- public function testAddFull()
- {
- $bookmark = new Bookmark();
- $bookmark->setUrl($url = 'https://domain.tld/index.php');
- $bookmark->setShortUrl('abc');
- $bookmark->setTitle($title = 'This a brand new bookmark');
- $bookmark->setDescription($desc = 'It should be created and written');
- $bookmark->setTags($tags = ['tag1', 'tagssss']);
- $bookmark->setThumbnail($thumb = 'http://thumb.tld/dle.png');
- $bookmark->setPrivate(true);
- $bookmark->setSticky(true);
- $bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190518_140354'));
- $bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190518_150354'));
-
- $this->privateLinkDB->add($bookmark);
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
- $this->assertEquals($url, $bookmark->getUrl());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($title, $bookmark->getTitle());
- $this->assertEquals($desc, $bookmark->getDescription());
- $this->assertEquals($tags, $bookmark->getTags());
- $this->assertEquals($thumb, $bookmark->getThumbnail());
- $this->assertTrue($bookmark->isPrivate());
- $this->assertTrue($bookmark->isSticky());
- $this->assertEquals($created, $bookmark->getCreated());
- $this->assertEquals($updated, $bookmark->getUpdated());
-
- // reload from file
- $this->privateLinkDB = new FakeBookmarkService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
- $this->assertEquals($url, $bookmark->getUrl());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($title, $bookmark->getTitle());
- $this->assertEquals($desc, $bookmark->getDescription());
- $this->assertEquals($tags, $bookmark->getTags());
- $this->assertEquals($thumb, $bookmark->getThumbnail());
- $this->assertTrue($bookmark->isPrivate());
- $this->assertTrue($bookmark->isSticky());
- $this->assertEquals($created, $bookmark->getCreated());
- $this->assertEquals($updated, $bookmark->getUpdated());
- }
-
- /**
- * Test add() method for a bookmark without any field set
- */
- public function testAddMinimal()
- {
- $bookmark = new Bookmark();
- $this->privateLinkDB->add($bookmark);
-
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
- $this->assertRegExp('#/shaare/[\w\-]{6}#', $bookmark->getUrl());
- $this->assertRegExp('/[\w\-]{6}/', $bookmark->getShortUrl());
- $this->assertEquals($bookmark->getUrl(), $bookmark->getTitle());
- $this->assertEmpty($bookmark->getDescription());
- $this->assertEmpty($bookmark->getTags());
- $this->assertEmpty($bookmark->getThumbnail());
- $this->assertFalse($bookmark->isPrivate());
- $this->assertFalse($bookmark->isSticky());
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getCreated());
- $this->assertNull($bookmark->getUpdated());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
- $this->assertRegExp('#/shaare/[\w\-]{6}#', $bookmark->getUrl());
- $this->assertRegExp('/[\w\-]{6}/', $bookmark->getShortUrl());
- $this->assertEquals($bookmark->getUrl(), $bookmark->getTitle());
- $this->assertEmpty($bookmark->getDescription());
- $this->assertEmpty($bookmark->getTags());
- $this->assertEmpty($bookmark->getThumbnail());
- $this->assertFalse($bookmark->isPrivate());
- $this->assertFalse($bookmark->isSticky());
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getCreated());
- $this->assertNull($bookmark->getUpdated());
- }
-
- /**
- * Test add() method for a bookmark without any field set and without writing the data store
- */
- public function testAddMinimalNoWrite()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- $bookmark = new Bookmark();
- $this->privateLinkDB->add($bookmark, false);
-
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $this->privateLinkDB->get(43);
- }
-
- /**
- * Test add() method while logged out
- */
- public function testAddLoggedOut()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
-
- $this->publicLinkDB->add(new Bookmark());
- }
-
- /**
- * Test add() method with a Bookmark already containing an ID
- */
- public function testAddWithId()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessage('This bookmarks already exists');
-
- $bookmark = new Bookmark();
- $bookmark->setId(43);
- $this->privateLinkDB->add($bookmark);
- }
-
- /**
- * Test set() method for a bookmark fully built
- */
- public function testSetFull()
- {
- $bookmark = $this->privateLinkDB->get(42);
- $bookmark->setUrl($url = 'https://domain.tld/index.php');
- $bookmark->setShortUrl('abc');
- $bookmark->setTitle($title = 'This a brand new bookmark');
- $bookmark->setDescription($desc = 'It should be created and written');
- $bookmark->setTags($tags = ['tag1', 'tagssss']);
- $bookmark->setThumbnail($thumb = 'http://thumb.tld/dle.png');
- $bookmark->setPrivate(true);
- $bookmark->setSticky(true);
- $bookmark->setCreated($created = DateTime::createFromFormat('Ymd_His', '20190518_140354'));
- $bookmark->setUpdated($updated = DateTime::createFromFormat('Ymd_His', '20190518_150354'));
-
- $this->privateLinkDB->set($bookmark);
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals($url, $bookmark->getUrl());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($title, $bookmark->getTitle());
- $this->assertEquals($desc, $bookmark->getDescription());
- $this->assertEquals($tags, $bookmark->getTags());
- $this->assertEquals($thumb, $bookmark->getThumbnail());
- $this->assertTrue($bookmark->isPrivate());
- $this->assertTrue($bookmark->isSticky());
- $this->assertEquals($created, $bookmark->getCreated());
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getUpdated());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals($url, $bookmark->getUrl());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($title, $bookmark->getTitle());
- $this->assertEquals($desc, $bookmark->getDescription());
- $this->assertEquals($tags, $bookmark->getTags());
- $this->assertEquals($thumb, $bookmark->getThumbnail());
- $this->assertTrue($bookmark->isPrivate());
- $this->assertTrue($bookmark->isSticky());
- $this->assertEquals($created, $bookmark->getCreated());
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getUpdated());
- }
-
- /**
- * Test set() method for a bookmark without any field set
- */
- public function testSetMinimal()
- {
- $bookmark = $this->privateLinkDB->get(42);
- $this->privateLinkDB->set($bookmark);
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals('/shaare/WDWyig', $bookmark->getUrl());
- $this->assertEquals('1eYJ1Q', $bookmark->getShortUrl());
- $this->assertEquals('Note: I have a big ID but an old date', $bookmark->getTitle());
- $this->assertEquals('Used to test bookmarks reordering.', $bookmark->getDescription());
- $this->assertEquals(['ut'], $bookmark->getTags());
- $this->assertFalse($bookmark->getThumbnail());
- $this->assertFalse($bookmark->isPrivate());
- $this->assertFalse($bookmark->isSticky());
- $this->assertEquals(
- DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20100310_101010'),
- $bookmark->getCreated()
- );
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getUpdated());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals('/shaare/WDWyig', $bookmark->getUrl());
- $this->assertEquals('1eYJ1Q', $bookmark->getShortUrl());
- $this->assertEquals('Note: I have a big ID but an old date', $bookmark->getTitle());
- $this->assertEquals('Used to test bookmarks reordering.', $bookmark->getDescription());
- $this->assertEquals(['ut'], $bookmark->getTags());
- $this->assertFalse($bookmark->getThumbnail());
- $this->assertFalse($bookmark->isPrivate());
- $this->assertFalse($bookmark->isSticky());
- $this->assertEquals(
- DateTime::createFromFormat(Bookmark::LINK_DATE_FORMAT, '20100310_101010'),
- $bookmark->getCreated()
- );
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getUpdated());
- }
-
- /**
- * Test set() method for a bookmark without any field set and without writing the data store
- */
- public function testSetMinimalNoWrite()
- {
- $bookmark = $this->privateLinkDB->get(42);
- $bookmark->setTitle($title = 'hi!');
- $this->privateLinkDB->set($bookmark, false);
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals($title, $bookmark->getTitle());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals('Note: I have a big ID but an old date', $bookmark->getTitle());
- }
-
- /**
- * Test set() method while logged out
- */
- public function testSetLoggedOut()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
-
- $this->publicLinkDB->set(new Bookmark());
- }
-
- /**
- * Test set() method with a Bookmark without an ID defined.
- */
- public function testSetWithoutId()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- $bookmark = new Bookmark();
- $this->privateLinkDB->set($bookmark);
- }
-
- /**
- * Test set() method with a Bookmark with an unknow ID
- */
- public function testSetWithUnknownId()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- $bookmark = new Bookmark();
- $bookmark->setId(666);
- $this->privateLinkDB->set($bookmark);
- }
-
- /**
- * Test addOrSet() method with a new ID
- */
- public function testAddOrSetNew()
- {
- $bookmark = new Bookmark();
- $this->privateLinkDB->addOrSet($bookmark);
-
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(43);
- $this->assertEquals(43, $bookmark->getId());
- }
-
- /**
- * Test addOrSet() method with an existing ID
- */
- public function testAddOrSetExisting()
- {
- $bookmark = $this->privateLinkDB->get(42);
- $bookmark->setTitle($title = 'hi!');
- $this->privateLinkDB->addOrSet($bookmark);
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals($title, $bookmark->getTitle());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals($title, $bookmark->getTitle());
- }
-
- /**
- * Test addOrSet() method while logged out
- */
- public function testAddOrSetLoggedOut()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
-
- $this->publicLinkDB->addOrSet(new Bookmark());
- }
-
- /**
- * Test addOrSet() method for a bookmark without any field set and without writing the data store
- */
- public function testAddOrSetMinimalNoWrite()
- {
- $bookmark = $this->privateLinkDB->get(42);
- $bookmark->setTitle($title = 'hi!');
- $this->privateLinkDB->addOrSet($bookmark, false);
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals($title, $bookmark->getTitle());
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->assertEquals(42, $bookmark->getId());
- $this->assertEquals('Note: I have a big ID but an old date', $bookmark->getTitle());
- }
-
- /**
- * Test remove() method with an existing Bookmark
- */
- public function testRemoveExisting()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->privateLinkDB->remove($bookmark);
-
- $exception = null;
- try {
- $this->privateLinkDB->get(42);
- } catch (BookmarkNotFoundException $e) {
- $exception = $e;
- }
- $this->assertInstanceOf(BookmarkNotFoundException::class, $exception);
-
- // reload from file
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $this->privateLinkDB->get(42);
- }
-
- /**
- * Test remove() method while logged out
- */
- public function testRemoveLoggedOut()
- {
- $this->expectException(\Exception::class);
- $this->expectExceptionMessage('You\'re not authorized to alter the datastore');
-
- $bookmark = $this->privateLinkDB->get(42);
- $this->publicLinkDB->remove($bookmark);
- }
-
- /**
- * Test remove() method with a Bookmark with an unknown ID
- */
- public function testRemoveWithUnknownId()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- $bookmark = new Bookmark();
- $bookmark->setId(666);
- $this->privateLinkDB->remove($bookmark);
- }
-
- /**
- * Test exists() method
- */
- public function testExists()
- {
- $this->assertTrue($this->privateLinkDB->exists(42)); // public
- $this->assertTrue($this->privateLinkDB->exists(6)); // private
-
- $this->assertTrue($this->privateLinkDB->exists(42, BookmarkFilter::$ALL));
- $this->assertTrue($this->privateLinkDB->exists(6, BookmarkFilter::$ALL));
-
- $this->assertTrue($this->privateLinkDB->exists(42, BookmarkFilter::$PUBLIC));
- $this->assertFalse($this->privateLinkDB->exists(6, BookmarkFilter::$PUBLIC));
-
- $this->assertFalse($this->privateLinkDB->exists(42, BookmarkFilter::$PRIVATE));
- $this->assertTrue($this->privateLinkDB->exists(6, BookmarkFilter::$PRIVATE));
-
- $this->assertTrue($this->publicLinkDB->exists(42));
- $this->assertFalse($this->publicLinkDB->exists(6));
-
- $this->assertTrue($this->publicLinkDB->exists(42, BookmarkFilter::$PUBLIC));
- $this->assertFalse($this->publicLinkDB->exists(6, BookmarkFilter::$PUBLIC));
-
- $this->assertFalse($this->publicLinkDB->exists(42, BookmarkFilter::$PRIVATE));
- $this->assertTrue($this->publicLinkDB->exists(6, BookmarkFilter::$PRIVATE));
- }
-
- /**
- * Test initialize() method
- */
- public function testInitialize()
- {
- $dbSize = $this->privateLinkDB->count();
- $this->privateLinkDB->initialize();
- $this->assertEquals($dbSize + 3, $this->privateLinkDB->count());
- $this->assertStringStartsWith(
- 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
- $this->privateLinkDB->get(43)->getDescription()
- );
- $this->assertStringStartsWith(
- 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
- $this->privateLinkDB->get(44)->getDescription()
- );
- $this->assertStringStartsWith(
- 'Welcome to Shaarli!',
- $this->privateLinkDB->get(45)->getDescription()
- );
- }
-
- /*
- * The following tests have been taken from the legacy LinkDB test and adapted
- * to make sure that nothing have been broken in the migration process.
- * They mostly cover search/filters. Some of them might be redundant with the previous ones.
- */
- /**
- * Attempt to instantiate a LinkDB whereas the datastore is not writable
- */
- public function testConstructDatastoreNotWriteable()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\NotWritableDataStoreException::class);
- $this->expectExceptionMessageRegExp('#Couldn\'t load data from the data store file "null".*#');
-
- $conf = new ConfigManager('tests/utils/config/configJson');
- $conf->set('resource.datastore', 'null/store.db');
- new BookmarkFileService($conf, $this->pluginManager, $this->history, $this->mutex, true);
- }
-
- /**
- * The DB doesn't exist, ensure it is created with an empty datastore
- */
- public function testCheckDBNewLoggedIn()
- {
- unlink(self::$testDatastore);
- $this->assertFileNotExists(self::$testDatastore);
- new BookmarkFileService($this->conf, $this->pluginManager, $this->history, $this->mutex, true);
- $this->assertFileExists(self::$testDatastore);
-
- // ensure the correct data has been written
- $this->assertGreaterThan(0, filesize(self::$testDatastore));
- }
-
- /**
- * The DB doesn't exist, but not logged in, ensure it initialized, but the file is not written
- */
- public function testCheckDBNewLoggedOut()
- {
- unlink(self::$testDatastore);
- $this->assertFileNotExists(self::$testDatastore);
- $db = new FakeBookmarkService($this->conf, $this->pluginManager, $this->history, $this->mutex, false);
- $this->assertFileNotExists(self::$testDatastore);
- $this->assertInstanceOf(BookmarkArray::class, $db->getBookmarks());
- $this->assertCount(0, $db->getBookmarks());
- }
-
- /**
- * Load public bookmarks from the DB
- */
- public function testReadPublicDB()
- {
- $this->assertEquals(
- $this->refDB->countPublicLinks(),
- $this->publicLinkDB->count()
- );
- }
-
- /**
- * Load public and private bookmarks from the DB
- */
- public function testReadPrivateDB()
- {
- $this->assertEquals(
- $this->refDB->countLinks(),
- $this->privateLinkDB->count()
- );
- }
-
- /**
- * Save the bookmarks to the DB
- */
- public function testSave()
- {
- $testDB = new BookmarkFileService($this->conf, $this->pluginManager, $this->history, $this->mutex, true);
- $dbSize = $testDB->count();
-
- $bookmark = new Bookmark();
- $testDB->add($bookmark);
-
- $testDB = new BookmarkFileService($this->conf, $this->pluginManager, $this->history, $this->mutex, true);
- $this->assertEquals($dbSize + 1, $testDB->count());
- }
-
- /**
- * Count existing bookmarks - public bookmarks hidden
- */
- public function testCountHiddenPublic()
- {
- $this->conf->set('privacy.hide_public_links', true);
- $linkDB = new BookmarkFileService($this->conf, $this->pluginManager, $this->history, $this->mutex, false);
-
- $this->assertEquals(0, $linkDB->count());
- }
-
- /**
- * The URL corresponds to an existing entry in the DB
- */
- public function testGetKnownLinkFromURL()
- {
- $link = $this->publicLinkDB->findByUrl('http://mediagoblin.org/');
-
- $this->assertNotEquals(false, $link);
- $this->assertContainsPolyfill(
- 'A free software media publishing platform',
- $link->getDescription()
- );
- }
-
- /**
- * The URL is not in the DB
- */
- public function testGetUnknownLinkFromURL()
- {
- $this->assertEquals(
- false,
- $this->publicLinkDB->findByUrl('http://dev.null')
- );
- }
-
- /**
- * Lists all tags
- */
- public function testAllTags()
- {
- $this->assertEquals(
- [
- 'web' => 3,
- 'cartoon' => 2,
- 'gnu' => 2,
- 'dev' => 1,
- 'samba' => 1,
- 'media' => 1,
- 'software' => 1,
- 'stallman' => 1,
- 'free' => 1,
- '-exclude' => 1,
- 'hashtag' => 2,
- // The DB contains a link with `sTuff` and another one with `stuff` tag.
- // They need to be grouped with the first case found - order by date DESC: `sTuff`.
- 'sTuff' => 2,
- 'ut' => 1,
- 'assurance' => 1,
- 'coding-style' => 1,
- 'quality' => 1,
- 'standards' => 1,
- ],
- $this->publicLinkDB->bookmarksCountPerTag()
- );
-
- $this->assertEquals(
- [
- 'web' => 4,
- 'cartoon' => 3,
- 'gnu' => 2,
- 'dev' => 2,
- 'samba' => 1,
- 'media' => 1,
- 'software' => 1,
- 'stallman' => 1,
- 'free' => 1,
- 'html' => 1,
- 'w3c' => 1,
- 'css' => 1,
- 'Mercurial' => 1,
- 'sTuff' => 2,
- '-exclude' => 1,
- '.hidden' => 1,
- 'hashtag' => 2,
- 'tag1' => 1,
- 'tag2' => 1,
- 'tag3' => 1,
- 'tag4' => 1,
- 'ut' => 1,
- 'assurance' => 1,
- 'coding-style' => 1,
- 'quality' => 1,
- 'standards' => 1,
- ],
- $this->privateLinkDB->bookmarksCountPerTag()
- );
- $this->assertEquals(
- [
- 'cartoon' => 2,
- 'gnu' => 1,
- 'dev' => 1,
- 'samba' => 1,
- 'media' => 1,
- 'html' => 1,
- 'w3c' => 1,
- 'css' => 1,
- 'Mercurial' => 1,
- '.hidden' => 1,
- 'hashtag' => 1,
- ],
- $this->privateLinkDB->bookmarksCountPerTag(['web'])
- );
- $this->assertEquals(
- [
- 'html' => 1,
- 'w3c' => 1,
- 'css' => 1,
- 'Mercurial' => 1,
- ],
- $this->privateLinkDB->bookmarksCountPerTag(['web'], 'private')
- );
- }
-
- /**
- * Test filter with string.
- */
- public function testFilterString()
- {
- $tags = 'dev cartoon';
- $request = ['searchtags' => $tags];
- $this->assertEquals(
- 2,
- count($this->privateLinkDB->search($request, null, true)->getBookmarks())
- );
- }
-
- /**
- * Test filter with array.
- */
- public function testFilterArray()
- {
- $tags = ['dev', 'cartoon'];
- $request = ['searchtags' => $tags];
- $this->assertEquals(
- 2,
- count($this->privateLinkDB->search($request, null, true)->getBookmarks())
- );
- }
-
- /**
- * Test hidden tags feature:
- * tags starting with a dot '.' are only visible when logged in.
- */
- public function testHiddenTags()
- {
- $tags = '.hidden';
- $request = ['searchtags' => $tags];
- $this->assertEquals(
- 1,
- count($this->privateLinkDB->search($request, 'all', true)->getBookmarks())
- );
-
- $this->assertEquals(
- 0,
- count($this->publicLinkDB->search($request, 'public', true)->getBookmarks())
- );
- }
-
- /**
- * Test filterHash() with a valid smallhash.
- */
- public function testFilterHashValid()
- {
- $request = smallHash('20150310_114651');
- $this->assertSame(
- $request,
- $this->publicLinkDB->findByHash($request)->getShortUrl()
- );
- $request = smallHash('20150310_114633' . 8);
- $this->assertSame(
- $request,
- $this->publicLinkDB->findByHash($request)->getShortUrl()
- );
- }
-
- /**
- * Test filterHash() with an invalid smallhash.
- */
- public function testFilterHashInValid1()
- {
- $this->expectException(BookmarkNotFoundException::class);
-
- $request = 'blabla';
- $this->publicLinkDB->findByHash($request);
- }
-
- /**
- * Test filterHash() with an empty smallhash.
- */
- public function testFilterHashInValid()
- {
- $this->expectException(BookmarkNotFoundException::class);
-
- $this->publicLinkDB->findByHash('');
- }
-
- /**
- * Test filterHash() on a private bookmark while logged out.
- */
- public function testFilterHashPrivateWhileLoggedOut()
- {
- $this->expectException(BookmarkNotFoundException::class);
- $this->expectExceptionMessage('The link you are trying to reach does not exist or has been deleted');
-
- $hash = smallHash('20141125_084734' . 6);
-
- $this->publicLinkDB->findByHash($hash);
- }
-
- /**
- * Test filterHash() with private key.
- */
- public function testFilterHashWithPrivateKey()
- {
- $hash = smallHash('20141125_084734' . 6);
- $privateKey = 'this is usually auto generated';
-
- $bookmark = $this->privateLinkDB->findByHash($hash);
- $bookmark->setAdditionalContentEntry('private_key', $privateKey);
- $this->privateLinkDB->save();
-
- $this->privateLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- false
- );
- $bookmark = $this->privateLinkDB->findByHash($hash, $privateKey);
-
- static::assertSame(6, $bookmark->getId());
- }
-
- /**
- * Test linksCountPerTag all tags without filter.
- * Equal occurrences should be sorted alphabetically.
- */
- public function testCountLinkPerTagAllNoFilter()
- {
- $expected = [
- 'web' => 4,
- 'cartoon' => 3,
- 'dev' => 2,
- 'gnu' => 2,
- 'hashtag' => 2,
- 'sTuff' => 2,
- '-exclude' => 1,
- '.hidden' => 1,
- 'Mercurial' => 1,
- 'css' => 1,
- 'free' => 1,
- 'html' => 1,
- 'media' => 1,
- 'samba' => 1,
- 'software' => 1,
- 'stallman' => 1,
- 'tag1' => 1,
- 'tag2' => 1,
- 'tag3' => 1,
- 'tag4' => 1,
- 'ut' => 1,
- 'w3c' => 1,
- 'assurance' => 1,
- 'coding-style' => 1,
- 'quality' => 1,
- 'standards' => 1,
- ];
- $tags = $this->privateLinkDB->bookmarksCountPerTag();
-
- $this->assertEquals($expected, $tags, var_export($tags, true));
- }
-
- /**
- * Test linksCountPerTag all tags with filter.
- * Equal occurrences should be sorted alphabetically.
- */
- public function testCountLinkPerTagAllWithFilter()
- {
- $expected = [
- 'hashtag' => 2,
- '-exclude' => 1,
- '.hidden' => 1,
- 'free' => 1,
- 'media' => 1,
- 'software' => 1,
- 'stallman' => 1,
- 'stuff' => 1,
- 'web' => 1,
- ];
- $tags = $this->privateLinkDB->bookmarksCountPerTag(['gnu']);
-
- $this->assertEquals($expected, $tags, var_export($tags, true));
- }
-
- /**
- * Test linksCountPerTag public tags with filter.
- * Equal occurrences should be sorted alphabetically.
- */
- public function testCountLinkPerTagPublicWithFilter()
- {
- $expected = [
- 'hashtag' => 2,
- '-exclude' => 1,
- '.hidden' => 1,
- 'free' => 1,
- 'media' => 1,
- 'software' => 1,
- 'stallman' => 1,
- 'stuff' => 1,
- 'web' => 1,
- ];
- $tags = $this->privateLinkDB->bookmarksCountPerTag(['gnu'], 'public');
-
- $this->assertEquals($expected, $tags, var_export($tags, true));
- }
-
- /**
- * Test linksCountPerTag public tags with filter.
- * Equal occurrences should be sorted alphabetically.
- */
- public function testCountLinkPerTagPrivateWithFilter()
- {
- $expected = [
- 'cartoon' => 1,
- 'tag1' => 1,
- 'tag2' => 1,
- 'tag3' => 1,
- 'tag4' => 1,
- ];
- $tags = $this->privateLinkDB->bookmarksCountPerTag(['dev'], 'private');
-
- $this->assertEquals($expected, $tags, var_export($tags, true));
- }
-
- /**
- * Test linksCountPerTag public tags with filter.
- * Equal occurrences should be sorted alphabetically.
- */
- public function testCountTagsNoMarkdown()
- {
- $expected = [
- 'cartoon' => 3,
- 'dev' => 2,
- 'tag1' => 1,
- 'tag2' => 1,
- 'tag3' => 1,
- 'tag4' => 1,
- 'web' => 4,
- 'gnu' => 2,
- 'hashtag' => 2,
- 'sTuff' => 2,
- '-exclude' => 1,
- '.hidden' => 1,
- 'Mercurial' => 1,
- 'css' => 1,
- 'free' => 1,
- 'html' => 1,
- 'media' => 1,
- 'newTagToCount' => 1,
- 'samba' => 1,
- 'software' => 1,
- 'stallman' => 1,
- 'ut' => 1,
- 'w3c' => 1,
- 'assurance' => 1,
- 'coding-style' => 1,
- 'quality' => 1,
- 'standards' => 1,
- ];
- $bookmark = new Bookmark();
- $bookmark->setTags(['newTagToCount', BookmarkMarkdownFormatter::NO_MD_TAG]);
- $this->privateLinkDB->add($bookmark);
-
- $tags = $this->privateLinkDB->bookmarksCountPerTag();
-
- $this->assertEquals($expected, $tags, var_export($tags, true));
- }
-
- /**
- * Test find by dates in the middle of the datastore (sorted by dates) with a single bookmark as a result.
- */
- public function testFilterByDateMidTimePeriodSingleBookmark(): void
- {
- $bookmarks = $this->privateLinkDB->findByDate(
- DateTime::createFromFormat('Ymd_His', '20121206_150000'),
- DateTime::createFromFormat('Ymd_His', '20121206_160000'),
- $before,
- $after
- );
-
- static::assertCount(1, $bookmarks);
-
- static::assertSame(9, $bookmarks[0]->getId());
- static::assertEquals(DateTime::createFromFormat('Ymd_His', '20121206_142300'), $before);
- static::assertEquals(DateTime::createFromFormat('Ymd_His', '20121206_172539'), $after);
- }
-
- /**
- * Test find by dates in the middle of the datastore (sorted by dates) with a multiple bookmarks as a result.
- */
- public function testFilterByDateMidTimePeriodMultipleBookmarks(): void
- {
- $bookmarks = $this->privateLinkDB->findByDate(
- DateTime::createFromFormat('Ymd_His', '20121206_150000'),
- DateTime::createFromFormat('Ymd_His', '20121206_180000'),
- $before,
- $after
- );
-
- static::assertCount(2, $bookmarks);
-
- static::assertSame(1, $bookmarks[0]->getId());
- static::assertSame(9, $bookmarks[1]->getId());
- static::assertEquals(DateTime::createFromFormat('Ymd_His', '20121206_142300'), $before);
- static::assertEquals(DateTime::createFromFormat('Ymd_His', '20121206_182539'), $after);
- }
-
- /**
- * Test find by dates at the end of the datastore (sorted by dates).
- */
- public function testFilterByDateLastTimePeriod(): void
- {
- $after = new DateTime();
- $bookmarks = $this->privateLinkDB->findByDate(
- DateTime::createFromFormat('Ymd_His', '20150310_114640'),
- DateTime::createFromFormat('Ymd_His', '20450101_010101'),
- $before,
- $after
- );
-
- static::assertCount(1, $bookmarks);
-
- static::assertSame(41, $bookmarks[0]->getId());
- static::assertEquals(DateTime::createFromFormat('Ymd_His', '20150310_114633'), $before);
- static::assertNull($after);
- }
-
- /**
- * Test find by dates at the beginning of the datastore (sorted by dates).
- */
- public function testFilterByDateFirstTimePeriod(): void
- {
- $before = new DateTime();
- $bookmarks = $this->privateLinkDB->findByDate(
- DateTime::createFromFormat('Ymd_His', '20000101_101010'),
- DateTime::createFromFormat('Ymd_His', '20100309_110000'),
- $before,
- $after
- );
-
- static::assertCount(1, $bookmarks);
-
- static::assertSame(11, $bookmarks[0]->getId());
- static::assertNull($before);
- static::assertEquals(DateTime::createFromFormat('Ymd_His', '20100310_101010'), $after);
- }
-
- /**
- * Test getLatest with a sticky bookmark: it should be ignored and return the latest by creation date instead.
- */
- public function testGetLatestWithSticky(): void
- {
- $bookmark = $this->publicLinkDB->getLatest();
-
- static::assertSame(41, $bookmark->getId());
- }
-
- /**
- * Test getLatest with a sticky bookmark: it should be ignored and return the latest by creation date instead.
- */
- public function testGetLatestEmptyDatastore(): void
- {
- unlink($this->conf->get('resource.datastore'));
- $this->publicLinkDB = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- false
- );
-
- $bookmark = $this->publicLinkDB->getLatest();
-
- static::assertNull($bookmark);
- }
-
- /**
- * Allows to test LinkDB's private methods
- *
- * @see
- * https://sebastian-bergmann.de/archives/881-Testing-Your-Privates.html
- * http://stackoverflow.com/a/2798203
- */
- protected static function getMethod($name)
- {
- $class = new ReflectionClass('Shaarli\Bookmark\BookmarkFileService');
- $method = $class->getMethod($name);
- $method->setAccessible(true);
- return $method;
- }
-}
diff --git a/tests/bookmark/BookmarkFilterTest.php b/tests/bookmark/BookmarkFilterTest.php
deleted file mode 100644
index 7c5c3b6e..00000000
--- a/tests/bookmark/BookmarkFilterTest.php
+++ /dev/null
@@ -1,554 +0,0 @@
-set('resource.datastore', self::$testDatastore);
- static::$pluginManager = new PluginManager($conf);
- self::$refDB = new ReferenceLinkDB();
- self::$refDB->write(self::$testDatastore);
- $history = new History('sandbox/history.php');
- self::$bookmarkService = new FakeBookmarkService($conf, static::$pluginManager, $history, $mutex, true);
- self::$linkFilter = new BookmarkFilter(self::$bookmarkService->getBookmarks(), $conf, static::$pluginManager);
- }
-
- /**
- * Blank filter.
- */
- public function testFilter()
- {
- $this->assertEquals(
- self::$refDB->countLinks(),
- count(self::$linkFilter->filter('', ''))
- );
-
- $this->assertEquals(
- self::$refDB->countLinks(),
- count(self::$linkFilter->filter('', '', 'all'))
- );
-
- $this->assertEquals(
- self::$refDB->countLinks(),
- count(self::$linkFilter->filter('', '', 'randomstr'))
- );
-
- // Private only.
- $this->assertEquals(
- self::$refDB->countPrivateLinks(),
- count(self::$linkFilter->filter('', '', false, 'private'))
- );
-
- // Public only.
- $this->assertEquals(
- self::$refDB->countPublicLinks(),
- count(self::$linkFilter->filter('', '', false, 'public'))
- );
-
- $this->assertEquals(
- ReferenceLinkDB::$NB_LINKS_TOTAL,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, ''))
- );
-
- $this->assertEquals(
- self::$refDB->countUntaggedLinks(),
- count(
- self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG,
- /*$request=*/
- '',
- /*$casesensitive=*/
- false,
- /*$visibility=*/
- 'all',
- /*$untaggedonly=*/
- true
- )
- )
- );
-
- $this->assertEquals(
- ReferenceLinkDB::$NB_LINKS_TOTAL,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, ''))
- );
- }
-
- /**
- * Filter bookmarks using a tag
- */
- public function testFilterOneTag()
- {
- $this->assertEquals(
- 4,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false))
- );
-
- $this->assertEquals(
- 4,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '+web', false))
- );
-
- $this->assertEquals(
- 4,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'all'))
- );
-
- $this->assertEquals(
- 4,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'default-blabla'))
- );
-
- // Private only.
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'private'))
- );
-
- // Public only.
- $this->assertEquals(
- 3,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'web', false, 'public'))
- );
- }
-
- /**
- * Filter bookmarks using a tag - case-sensitive
- */
- public function testFilterCaseSensitiveTag()
- {
- $this->assertEquals(
- 0,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'mercurial', true))
- );
-
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'Mercurial', true))
- );
- }
-
- /**
- * Filter bookmarks using a tag combination
- */
- public function testFilterMultipleTags()
- {
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'dev cartoon', false))
- );
- }
-
- /**
- * Filter bookmarks using a non-existent tag
- */
- public function testFilterUnknownTag()
- {
- $this->assertEquals(
- 0,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'null', false))
- );
- }
-
- /**
- * Retrieve a link entry with its hash
- */
- public function testFilterSmallHash()
- {
- $links = self::$linkFilter->filter(BookmarkFilter::$FILTER_HASH, 'IuWvgA');
-
- $this->assertEquals(
- 1,
- count($links)
- );
-
- $this->assertEquals(
- 'MediaGoblin',
- $links[7]->getTitle()
- );
- }
-
- /**
- * No link for this hash
- */
- public function testFilterUnknownSmallHash()
- {
- $this->expectException(\Shaarli\Bookmark\Exception\BookmarkNotFoundException::class);
-
- self::$linkFilter->filter(BookmarkFilter::$FILTER_HASH, 'Iblaah');
- }
-
- /**
- * Full-text search - no result found.
- */
- public function testFilterFullTextNoResult()
- {
- $this->assertEquals(
- 0,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'azertyuiop'))
- );
- }
-
- /**
- * Full-text search - result from a link's URL
- */
- public function testFilterFullTextURL()
- {
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'ars.userfriendly.org'))
- );
-
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'ars org'))
- );
- }
-
- /**
- * Full-text search - result from a link's title only
- */
- public function testFilterFullTextTitle()
- {
- // use miscellaneous cases
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'userfriendly -'))
- );
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'UserFriendly -'))
- );
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'uSeRFrIendlY -'))
- );
-
- // use miscellaneous case and offset
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'RFrIendL'))
- );
- }
-
- /**
- * Full-text search - result from the link's description only
- */
- public function testFilterFullTextDescription()
- {
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'publishing media'))
- );
-
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'mercurial w3c'))
- );
-
- $this->assertEquals(
- 3,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, '"free software"'))
- );
- }
-
- /**
- * Full-text search - result from the link's tags only
- */
- public function testFilterFullTextTags()
- {
- $this->assertEquals(
- 6,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web'))
- );
-
- $this->assertEquals(
- 6,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', 'all'))
- );
-
- $this->assertEquals(
- 6,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', 'bla'))
- );
-
- // Private only.
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', false, 'private'))
- );
-
- // Public only.
- $this->assertEquals(
- 5,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'web', false, 'public'))
- );
- }
-
- /**
- * Full-text search - result set from mixed sources
- */
- public function testFilterFullTextMixed()
- {
- $this->assertEquals(
- 3,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'free software'))
- );
- }
-
- /**
- * Full-text search - test exclusion with '-'.
- */
- public function testExcludeSearch()
- {
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, 'free -gnu'))
- );
-
- $this->assertEquals(
- ReferenceLinkDB::$NB_LINKS_TOTAL - 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TEXT, '-revolution'))
- );
- }
-
- /**
- * Full-text search - test AND, exact terms and exclusion combined, across fields.
- */
- public function testMultiSearch()
- {
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TEXT,
- '"Free Software " stallman "read this" @website stuff'
- ))
- );
-
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TEXT,
- '"free software " stallman "read this" -beard @website stuff'
- ))
- );
- }
-
- /**
- * Full-text search - make sure that exact search won't work across fields.
- */
- public function testSearchExactTermMultiFieldsKo()
- {
- $this->assertEquals(
- 0,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TEXT,
- '"designer naming"'
- ))
- );
-
- $this->assertEquals(
- 0,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TEXT,
- '"designernaming"'
- ))
- );
- }
-
- /**
- * Tag search with exclusion.
- */
- public function testTagFilterWithExclusion()
- {
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, 'gnu -free'))
- );
-
- $this->assertEquals(
- ReferenceLinkDB::$NB_LINKS_TOTAL - 1,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '-free'))
- );
- }
-
- /**
- * Test crossed search (terms + tags).
- */
- public function testFilterCrossedSearch()
- {
- $terms = '"Free Software " stallman "read this" @website stuff';
- $tags = 'free';
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
- [$tags, $terms]
- ))
- );
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
- ['', $terms]
- ))
- );
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
- [false, 'PSR-2']
- ))
- );
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
- [$tags, '']
- ))
- );
- $this->assertEquals(
- ReferenceLinkDB::$NB_LINKS_TOTAL,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG | BookmarkFilter::$FILTER_TEXT,
- ''
- ))
- );
- }
-
- /**
- * Tag search with OR optional tags.
- */
- public function testTagFilterOr()
- {
- $this->assertEquals(
- 5,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '~cartoon ~web'))
- );
-
- $this->assertEquals(
- 6,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '~c*t*n ~st*'))
- );
-
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '~cartoon ~web dev'))
- );
-
- $this->assertEquals(
- 2,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '~cartoon ~web +dev'))
- );
-
- $this->assertEquals(
- 4,
- count(self::$linkFilter->filter(BookmarkFilter::$FILTER_TAG, '~cartoon ~web -samba'))
- );
- }
-
- /**
- * Filter bookmarks by #hashtag.
- */
- public function testFilterByHashtag()
- {
- $hashtag = 'hashtag';
- $this->assertEquals(
- 3,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG,
- $hashtag
- ))
- );
-
- $hashtag = 'private';
- $this->assertEquals(
- 1,
- count(self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TAG,
- $hashtag,
- false,
- 'private'
- ))
- );
- }
-
- /**
- * Test search result highlights in every field of bookmark reference #9.
- */
- public function testFullTextSearchHighlight(): void
- {
- $bookmarks = self::$linkFilter->filter(
- BookmarkFilter::$FILTER_TEXT,
- '"psr-2" coding guide http fig "psr-2/" "This guide" basic standard. coding-style quality assurance'
- );
-
- static::assertCount(1, $bookmarks);
- static::assertArrayHasKey(9, $bookmarks);
-
- $bookmark = $bookmarks[9];
- $expectedHighlights = [
- 'title' => [
- ['start' => 0, 'end' => 5], // "psr-2"
- ['start' => 7, 'end' => 13], // coding
- ['start' => 20, 'end' => 25], // guide
- ],
- 'description' => [
- ['start' => 0, 'end' => 10], // "This guide"
- ['start' => 45, 'end' => 50], // basic
- ['start' => 58, 'end' => 67], // standard.
- ],
- 'url' => [
- ['start' => 0, 'end' => 4], // http
- ['start' => 15, 'end' => 18], // fig
- ['start' => 27, 'end' => 33], // "psr-2/"
- ],
- 'tags' => [
- ['start' => 0, 'end' => 12], // coding-style
- ['start' => 23, 'end' => 30], // quality
- ['start' => 31, 'end' => 40], // assurance
- ],
- ];
- static::assertSame($expectedHighlights, $bookmark->getAdditionalContentEntry('search_highlight'));
- }
-}
diff --git a/tests/bookmark/BookmarkInitializerTest.php b/tests/bookmark/BookmarkInitializerTest.php
deleted file mode 100644
index 619cf83c..00000000
--- a/tests/bookmark/BookmarkInitializerTest.php
+++ /dev/null
@@ -1,185 +0,0 @@
-mutex = new NoMutex();
- if (file_exists(self::$testDatastore)) {
- unlink(self::$testDatastore);
- }
-
- copy('tests/utils/config/configJson.json.php', self::$testConf . '.json.php');
- $this->conf = new ConfigManager(self::$testConf);
- $this->conf->set('resource.datastore', self::$testDatastore);
- $this->pluginManager = new PluginManager($this->conf);
- $this->history = new History('sandbox/history.php');
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $this->initializer = new BookmarkInitializer($this->bookmarkService);
- }
-
- /**
- * Test initialize() with a data store containing bookmarks.
- */
- public function testInitializeNotEmptyDataStore(): void
- {
- $refDB = new ReferenceLinkDB();
- $refDB->write(self::$testDatastore);
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- $this->initializer = new BookmarkInitializer($this->bookmarkService);
-
- $this->initializer->initialize();
-
- $this->assertEquals($refDB->countLinks() + 3, $this->bookmarkService->count());
-
- $bookmark = $this->bookmarkService->get(43);
- $this->assertStringStartsWith(
- 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
- $bookmark->getDescription()
- );
- $this->assertTrue($bookmark->isPrivate());
-
- $bookmark = $this->bookmarkService->get(44);
- $this->assertStringStartsWith(
- 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
- $bookmark->getDescription()
- );
- $this->assertTrue($bookmark->isPrivate());
-
- $bookmark = $this->bookmarkService->get(45);
- $this->assertStringStartsWith(
- 'Welcome to Shaarli!',
- $bookmark->getDescription()
- );
- $this->assertFalse($bookmark->isPrivate());
-
- $this->bookmarkService->save();
-
- // Reload from file
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
- $this->assertEquals($refDB->countLinks() + 3, $this->bookmarkService->count());
-
- $bookmark = $this->bookmarkService->get(43);
- $this->assertStringStartsWith(
- 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
- $bookmark->getDescription()
- );
- $this->assertTrue($bookmark->isPrivate());
-
- $bookmark = $this->bookmarkService->get(44);
- $this->assertStringStartsWith(
- 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
- $bookmark->getDescription()
- );
- $this->assertTrue($bookmark->isPrivate());
-
- $bookmark = $this->bookmarkService->get(45);
- $this->assertStringStartsWith(
- 'Welcome to Shaarli!',
- $bookmark->getDescription()
- );
- $this->assertFalse($bookmark->isPrivate());
- }
-
- /**
- * Test initialize() with an a non existent datastore file .
- */
- public function testInitializeNonExistentDataStore(): void
- {
- $this->conf->set('resource.datastore', static::$testDatastore . '_empty');
- $this->bookmarkService = new BookmarkFileService(
- $this->conf,
- $this->pluginManager,
- $this->history,
- $this->mutex,
- true
- );
-
- $this->initializer->initialize();
-
- $this->assertEquals(3, $this->bookmarkService->count());
- $bookmark = $this->bookmarkService->get(0);
- $this->assertStringStartsWith(
- 'Shaarli will automatically pick up the thumbnail for links to a variety of websites.',
- $bookmark->getDescription()
- );
- $this->assertTrue($bookmark->isPrivate());
-
- $bookmark = $this->bookmarkService->get(1);
- $this->assertStringStartsWith(
- 'Adding a shaare without entering a URL creates a text-only "note" post such as this one.',
- $bookmark->getDescription()
- );
- $this->assertTrue($bookmark->isPrivate());
-
- $bookmark = $this->bookmarkService->get(2);
- $this->assertStringStartsWith(
- 'Welcome to Shaarli!',
- $bookmark->getDescription()
- );
- $this->assertFalse($bookmark->isPrivate());
- }
-}
diff --git a/tests/bookmark/BookmarkTest.php b/tests/bookmark/BookmarkTest.php
deleted file mode 100644
index 6a34e2ce..00000000
--- a/tests/bookmark/BookmarkTest.php
+++ /dev/null
@@ -1,468 +0,0 @@
- 1,
- 'shorturl' => 'abc',
- 'url' => 'https://domain.tld/oof.html?param=value#anchor',
- 'title' => 'This is an array link',
- 'description' => 'HTML desc
hi!
',
- 'thumbnail' => 'https://domain.tld/pic.png',
- 'sticky' => true,
- 'created' => new \DateTime('-1 minute'),
- 'tags' => ['tag1', 'tag2', 'chair'],
- 'updated' => new \DateTime(),
- 'private' => true,
- ];
-
- $bookmark = (new Bookmark())->fromArray($data);
- $this->assertEquals($data['id'], $bookmark->getId());
- $this->assertEquals($data['shorturl'], $bookmark->getShortUrl());
- $this->assertEquals($data['url'], $bookmark->getUrl());
- $this->assertEquals($data['title'], $bookmark->getTitle());
- $this->assertEquals($data['description'], $bookmark->getDescription());
- $this->assertEquals($data['thumbnail'], $bookmark->getThumbnail());
- $this->assertEquals($data['sticky'], $bookmark->isSticky());
- $this->assertEquals($data['created'], $bookmark->getCreated());
- $this->assertEquals($data['tags'], $bookmark->getTags());
- $this->assertEquals('tag1 tag2 chair', $bookmark->getTagsString());
- $this->assertEquals($data['updated'], $bookmark->getUpdated());
- $this->assertEquals($data['private'], $bookmark->isPrivate());
- $this->assertFalse($bookmark->isNote());
- }
-
- /**
- * Test fromArray() with a link with minimal data.
- * Note that I use null values everywhere but this should not happen in the real world.
- */
- public function testFromArrayMinimal()
- {
- $data = [
- 'id' => null,
- 'shorturl' => null,
- 'url' => null,
- 'title' => null,
- 'description' => null,
- 'created' => null,
- 'tags' => null,
- 'private' => null,
- ];
-
- $bookmark = (new Bookmark())->fromArray($data);
- $this->assertNull($bookmark->getId());
- $this->assertNull($bookmark->getShortUrl());
- $this->assertNull($bookmark->getUrl());
- $this->assertNull($bookmark->getTitle());
- $this->assertEquals('', $bookmark->getDescription());
- $this->assertNull($bookmark->getCreated());
- $this->assertEquals([], $bookmark->getTags());
- $this->assertEquals('', $bookmark->getTagsString());
- $this->assertNull($bookmark->getUpdated());
- $this->assertFalse($bookmark->getThumbnail());
- $this->assertFalse($bookmark->isSticky());
- $this->assertFalse($bookmark->isPrivate());
- $this->assertTrue($bookmark->isNote());
- }
-
- /**
- * Test fromArray() with a link with a custom tags separator
- */
- public function testFromArrayCustomTagsSeparator()
- {
- $data = [
- 'id' => 1,
- 'tags' => ['tag1', 'tag2', 'chair'],
- ];
-
- $bookmark = (new Bookmark())->fromArray($data, '@');
- $this->assertEquals($data['id'], $bookmark->getId());
- $this->assertEquals($data['tags'], $bookmark->getTags());
- $this->assertEquals('tag1@tag2@chair', $bookmark->getTagsString('@'));
- }
-
-
- /**
- * Test validate() with a valid minimal bookmark
- */
- public function testValidateValidFullBookmark()
- {
- $bookmark = new Bookmark();
- $bookmark->setId(2);
- $bookmark->setShortUrl('abc');
- $bookmark->setCreated($date = \DateTime::createFromFormat('Ymd_His', '20190514_200102'));
- $bookmark->setUpdated($dateUp = \DateTime::createFromFormat('Ymd_His', '20190514_210203'));
- $bookmark->setUrl($url = 'https://domain.tld/oof.html?param=value#anchor');
- $bookmark->setTitle($title = 'This is an array link');
- $bookmark->setDescription($desc = 'HTML desc
hi!
');
- $bookmark->setTags($tags = ['tag1', 'tag2', 'chair']);
- $bookmark->setThumbnail($thumb = 'https://domain.tld/pic.png');
- $bookmark->setPrivate(true);
- $bookmark->validate();
-
- $this->assertEquals(2, $bookmark->getId());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($date, $bookmark->getCreated());
- $this->assertEquals($dateUp, $bookmark->getUpdated());
- $this->assertEquals($url, $bookmark->getUrl());
- $this->assertEquals($title, $bookmark->getTitle());
- $this->assertEquals($desc, $bookmark->getDescription());
- $this->assertEquals($tags, $bookmark->getTags());
- $this->assertEquals(implode(' ', $tags), $bookmark->getTagsString());
- $this->assertEquals($thumb, $bookmark->getThumbnail());
- $this->assertTrue($bookmark->isPrivate());
- $this->assertFalse($bookmark->isNote());
- }
-
- /**
- * Test validate() with a valid minimal bookmark
- */
- public function testValidateValidMinimalBookmark()
- {
- $bookmark = new Bookmark();
- $bookmark->setId(1);
- $bookmark->setShortUrl('abc');
- $bookmark->setCreated($date = \DateTime::createFromFormat('Ymd_His', '20190514_200102'));
- $bookmark->validate();
-
- $this->assertEquals(1, $bookmark->getId());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($date, $bookmark->getCreated());
- $this->assertEquals('/shaare/abc', $bookmark->getUrl());
- $this->assertEquals('/shaare/abc', $bookmark->getTitle());
- $this->assertEquals('', $bookmark->getDescription());
- $this->assertEquals([], $bookmark->getTags());
- $this->assertEquals('', $bookmark->getTagsString());
- $this->assertFalse($bookmark->getThumbnail());
- $this->assertFalse($bookmark->isPrivate());
- $this->assertTrue($bookmark->isNote());
- $this->assertNull($bookmark->getUpdated());
- }
-
- /**
- * Test validate() with a a bookmark without ID.
- */
- public function testValidateNotValidNoId()
- {
- $bookmark = new Bookmark();
- $bookmark->setShortUrl('abc');
- $bookmark->setCreated(\DateTime::createFromFormat('Ymd_His', '20190514_200102'));
- $exception = null;
- try {
- $bookmark->validate();
- } catch (InvalidBookmarkException $e) {
- $exception = $e;
- }
- $this->assertNotNull($exception);
- $this->assertContainsPolyfill('- ID: ' . PHP_EOL, $exception->getMessage());
- }
-
- /**
- * Test validate() with a a bookmark without short url.
- */
- public function testValidateNotValidNoShortUrl()
- {
- $bookmark = new Bookmark();
- $bookmark->setId(1);
- $bookmark->setCreated(\DateTime::createFromFormat('Ymd_His', '20190514_200102'));
- $bookmark->setShortUrl(null);
- $exception = null;
- try {
- $bookmark->validate();
- } catch (InvalidBookmarkException $e) {
- $exception = $e;
- }
- $this->assertNotNull($exception);
- $this->assertContainsPolyfill('- ShortUrl: ' . PHP_EOL, $exception->getMessage());
- }
-
- /**
- * Test validate() with a a bookmark without created datetime.
- */
- public function testValidateNotValidNoCreated()
- {
- $bookmark = new Bookmark();
- $bookmark->setId(1);
- $bookmark->setShortUrl('abc');
- $bookmark->setCreated(null);
- $exception = null;
- try {
- $bookmark->validate();
- } catch (InvalidBookmarkException $e) {
- $exception = $e;
- }
- $this->assertNotNull($exception);
- $this->assertContainsPolyfill('- Created: ' . PHP_EOL, $exception->getMessage());
- }
-
- /**
- * Test setId() and make sure that default fields are generated.
- */
- public function testSetIdEmptyGeneratedFields()
- {
- $bookmark = new Bookmark();
- $bookmark->setId(2);
-
- $this->assertEquals(2, $bookmark->getId());
- $this->assertRegExp('/[\w\-]{6}/', $bookmark->getShortUrl());
- $this->assertTrue(new \DateTime('5 seconds ago') < $bookmark->getCreated());
- }
-
- /**
- * Test setId() and with generated fields already set.
- */
- public function testSetIdSetGeneratedFields()
- {
- $bookmark = new Bookmark();
- $bookmark->setShortUrl('abc');
- $bookmark->setCreated($date = \DateTime::createFromFormat('Ymd_His', '20190514_200102'));
- $bookmark->setId(2);
-
- $this->assertEquals(2, $bookmark->getId());
- $this->assertEquals('abc', $bookmark->getShortUrl());
- $this->assertEquals($date, $bookmark->getCreated());
- }
-
- /**
- * Test setUrl() and make sure it accepts custom protocols
- */
- public function testGetUrlWithValidProtocols()
- {
- $bookmark = new Bookmark();
- $bookmark->setUrl($url = 'myprotocol://helloworld', ['myprotocol']);
- $this->assertEquals($url, $bookmark->getUrl());
-
- $bookmark->setUrl($url = 'https://helloworld.tld', ['myprotocol']);
- $this->assertEquals($url, $bookmark->getUrl());
- }
-
- /**
- * Test setUrl() and make sure it accepts custom protocols
- */
- public function testGetUrlWithNotValidProtocols()
- {
- $bookmark = new Bookmark();
- $bookmark->setUrl('myprotocol://helloworld', []);
- $this->assertEquals('http://helloworld', $bookmark->getUrl());
-
- $bookmark->setUrl($url = 'https://helloworld.tld', []);
- $this->assertEquals($url, $bookmark->getUrl());
- }
-
- /**
- * Test addTag() and DeleteTag()
- */
-
- public function testAddDeleteTags()
- {
- $bookmark = new Bookmark();
-
- $bookmark->addTag('tag1');
- $this->assertEquals(
- [
- 'tag1',
- ],
- $bookmark->getTags()
- );
-
- // Ignore if tag is already present
- $bookmark->addTag('tag2');
- $bookmark->addTag('tag1');
- $this->assertEquals(
- [
- 'tag1',
- 'tag2',
- ],
- $bookmark->getTags()
- );
-
- // Ignore deleting tags not present
- $bookmark->deleteTag('tag5');
- $this->assertEquals(
- [
- 'tag1',
- 'tag2',
- ],
- $bookmark->getTags()
- );
-
- // Delete multiples
- $bookmark->setTags(['tag3', 'tag1', 'tag4', 'tag3', 'tag3', 'tag4']);
- $bookmark->deleteTag('tag3');
- $this->assertEquals(
- [
- 'tag1',
- 'tag4',
- 'tag4',
- ],
- $bookmark->getTags()
- );
- $bookmark->deleteTag('tag4');
- $this->assertEquals(
- [
- 'tag1',
- ],
- $bookmark->getTags()
- );
- }
-
- /**
- * Test setTagsString() with exotic data
- */
- public function testSetTagsString()
- {
- $bookmark = new Bookmark();
-
- $str = 'tag1 tag2 tag3.tag3-2 tag4 -tag5 ';
- $bookmark->setTagsString($str);
- $this->assertEquals(
- [
- 'tag1',
- 'tag2',
- 'tag3.tag3-2',
- 'tag4',
- 'tag5',
- ],
- $bookmark->getTags()
- );
- }
-
- /**
- * Test setTags() with exotic data
- */
- public function testSetTags()
- {
- $bookmark = new Bookmark();
-
- $array = [
- 'tag1 ',
- ' tag2',
- 'tag3.tag3-2',
- ' tag4',
- ' ',
- '-tag5 ',
- ];
- $bookmark->setTags($array);
- $this->assertEquals(
- [
- 'tag1',
- 'tag2',
- 'tag3.tag3-2',
- 'tag4',
- 'tag5',
- ],
- $bookmark->getTags()
- );
- }
-
- /**
- * Test renameTag()
- */
- public function testRenameTag()
- {
- $bookmark = new Bookmark();
- $bookmark->setTags(['tag1', 'tag2', 'chair']);
- $bookmark->renameTag('chair', 'table');
- $this->assertEquals(['tag1', 'tag2', 'table'], $bookmark->getTags());
- $bookmark->renameTag('tag1', 'tag42');
- $this->assertEquals(['tag42', 'tag2', 'table'], $bookmark->getTags());
- $bookmark->renameTag('tag42', 'tag43');
- $this->assertEquals(['tag43', 'tag2', 'table'], $bookmark->getTags());
- $bookmark->renameTag('table', 'desk');
- $this->assertEquals(['tag43', 'tag2', 'desk'], $bookmark->getTags());
- }
-
- /**
- * Test renameTag() with a tag that is not present in the bookmark
- */
- public function testRenameTagNotExists()
- {
- $bookmark = new Bookmark();
- $bookmark->setTags(['tag1', 'tag2', 'chair']);
- $bookmark->renameTag('nope', 'table');
- $this->assertEquals(['tag1', 'tag2', 'chair'], $bookmark->getTags());
- }
-
- /**
- * Test deleteTag()
- */
- public function testDeleteTag()
- {
- $bookmark = new Bookmark();
- $bookmark->setTags(['tag1', 'tag2', 'chair']);
- $bookmark->deleteTag('chair');
- $this->assertEquals(['tag1', 'tag2'], $bookmark->getTags());
- $bookmark->deleteTag('tag1');
- $this->assertEquals(['tag2'], $bookmark->getTags());
- $bookmark->deleteTag('tag2');
- $this->assertEquals([], $bookmark->getTags());
- }
-
- /**
- * Test deleteTag() with a tag that is not present in the bookmark
- */
- public function testDeleteTagNotExists()
- {
- $bookmark = new Bookmark();
- $bookmark->setTags(['tag1', 'tag2', 'chair']);
- $bookmark->deleteTag('nope');
- $this->assertEquals(['tag1', 'tag2', 'chair'], $bookmark->getTags());
- }
-
- /**
- * Test shouldUpdateThumbnail() with bookmarks needing an update.
- */
- public function testShouldUpdateThumbnail(): void
- {
- $bookmark = (new Bookmark())->setUrl('http://domain.tld/with-image');
-
- static::assertTrue($bookmark->shouldUpdateThumbnail());
-
- $bookmark = (new Bookmark())
- ->setUrl('http://domain.tld/with-image')
- ->setThumbnail('unknown file')
- ;
-
- static::assertTrue($bookmark->shouldUpdateThumbnail());
- }
-
- /**
- * Test shouldUpdateThumbnail() with bookmarks that should not update.
- */
- public function testShouldNotUpdateThumbnail(): void
- {
- $bookmark = (new Bookmark());
-
- static::assertFalse($bookmark->shouldUpdateThumbnail());
-
- $bookmark = (new Bookmark())
- ->setUrl('ftp://domain.tld/other-protocol', ['ftp'])
- ;
-
- static::assertFalse($bookmark->shouldUpdateThumbnail());
-
- $bookmark = (new Bookmark())
- ->setUrl('http://domain.tld/with-image')
- ->setThumbnail(__FILE__)
- ;
-
- static::assertFalse($bookmark->shouldUpdateThumbnail());
-
- $bookmark = (new Bookmark())->setUrl('/shaare/abcdef');
-
- static::assertFalse($bookmark->shouldUpdateThumbnail());
- }
-}
diff --git a/tests/bookmark/LinkUtilsTest.php b/tests/bookmark/LinkUtilsTest.php
deleted file mode 100644
index 922bb484..00000000
--- a/tests/bookmark/LinkUtilsTest.php
+++ /dev/null
@@ -1,767 +0,0 @@
-stuff' . $title . '