diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5da7b9ff..f823f5c9 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,2 +1 @@ -* @BitBagCommerce -* @Sylius/core-team +* @Sylius/key-contributors @Sylius/development-team diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 4ea63b41..dc50c313 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -17,22 +17,26 @@ jobs: runs-on: ubuntu-latest name: "Sylius ${{ matrix.sylius }}, PHP ${{ matrix.php }}, Symfony ${{ matrix.symfony }}, - MySQL ${{ matrix.mysql }}, Node ${{ matrix.node }}" + MySQL ${{ matrix.mysql }}, State Machine Adapter ${{ matrix.state_machine_adapter }}" strategy: fail-fast: false matrix: - php: [ "8.1", "8.2", "8.3" ] - symfony: ["^5.4", "^6.4"] - sylius: [ "~1.13.0", "~1.14.0" ] - node: [ "18.x", "20.x" ] - mysql: ["8.0"] - - exclude: - - - php: "8.3" - symfony: "^5.4" - sylius: "~1.13.0" + php: [ "8.2", "8.3" ] + symfony: [ "^6.4", "^7.1" ] + sylius: [ "^2.0" ] + node: [ "20.x" ] + mysql: [ "8.4" ] + state_machine_adapter: ["symfony_workflow"] + + include: + - php: "8.3" + symfony: "^7.1" + database: "mysql" + sylius: "~2.0.1" + mysql: "8.4" + node: "20.x" + state_machine_adapter: "winzou_state_machine" env: APP_ENV: test @@ -52,15 +56,122 @@ jobs: coverage: none - - name: Build test application - uses: SyliusLabs/BuildTestAppAction@v1.3 + name: Setup Node + uses: actions/setup-node@v4 with: - sylius-version: "${{ matrix.sylius }}" - symfony-version: "${{ matrix.symfony }}" - mysql-version: "${{ matrix.mysql }}" node-version: "${{ matrix.node }}" - working-directory: "." - plugin-build: "yes" + + - + name: Shutdown default MySQL + run: sudo service mysql stop + + - + name: Setup MySQL + uses: mirromutth/mysql-action@v1.1 + with: + mysql version: "${{ matrix.mysql }}" + mysql root password: "root" + + - + name: Output PHP version for Symfony CLI + run: php -v | head -n 1 | awk '{ print $2 }' > .php-version + + - + name: Install certificates + run: symfony server:ca:install + + - + name: Run Chrome Headless + run: google-chrome-stable --enable-automation --disable-background-networking --no-default-browser-check --no-first-run --disable-popup-blocking --disable-default-apps --allow-insecure-localhost --disable-translate --disable-extensions --no-sandbox --enable-features=Metal --headless --remote-debugging-port=9222 --window-size=2880,1800 --proxy-server='direct://' --proxy-bypass-list='*' http://127.0.0.1 > /dev/null 2>&1 & + + - + name: Run webserver + run: (cd tests/Application && symfony server:start --port=8080 --dir=public --daemon) + + - + name: Get Composer cache directory + id: composer-cache + run: echo "::set-output name=dir::$(composer config cache-files-dir)" + + - + name: Cache Composer + uses: actions/cache@v4 + with: + path: ${{ steps.composer-cache.outputs.dir }} + key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json **/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php-${{ matrix.php }}-composer- + + - + name: Restrict Symfony version + if: matrix.symfony != '' + run: | + composer global config --no-plugins allow-plugins.symfony/flex true + composer global require --no-progress --no-scripts --no-plugins "symfony/flex:^2.4" + composer config --no-plugins allow-plugins.symfony/thanks true + composer config extra.symfony.require "${{ matrix.symfony }}" + + - + name: Restrict Sylius version + if: matrix.sylius != '' + run: composer require "sylius/sylius:${{ matrix.sylius }}" --no-update --no-scripts --no-interaction + + - + name: Require Winzou State Machine + if: "${{ matrix.state_machine_adapter == 'winzou_state_machine' }}" + run: | + composer require winzou/state-machine:^0.4 --no-update + composer require winzou/state-machine-bundle:^0.6 --no-update + + - + name: Install PHP dependencies + run: composer install --no-interaction + + - + name: Run PHPStan + run: vendor/bin/phpstan analyse -c phpstan.neon src/ + + - + name: Run ECS + run: vendor/bin/ecs + + - + name: Get Yarn cache directory + id: yarn-cache + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT + + - + name: Cache Yarn + uses: actions/cache@v4 + with: + path: ${{ steps.yarn-cache.outputs.dir }} + key: ${{ runner.os }}-node-${{ matrix.node }}-yarn-${{ hashFiles('**/package.json.~1.13.0.dist **/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-node-${{ matrix.node }}-yarn- + + - + name: Install JS dependencies + run: (cd tests/Application && yarn install) + + - + name: Prepare test application database + run: | + (cd tests/Application && bin/console doctrine:database:create -vvv) + (cd tests/Application && bin/console doctrine:migrations:migrate -vvv) + + - + name: Prepare test application assets + run: | + (cd tests/Application && bin/console assets:install public -vvv) + (cd tests/Application && yarn prod) + + - + name: Prepare test application cache + run: (cd tests/Application && bin/console cache:warmup -vvv) + + - + name: Load fixtures in test application + run: (cd tests/Application && bin/console sylius:fixtures:load -n) - name: Validate composer.json diff --git a/.github/workflows/coding_standard.yml b/.github/workflows/coding_standard.yml deleted file mode 100644 index ac6ee615..00000000 --- a/.github/workflows/coding_standard.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: Coding standard - -on: - push: - branches-ignore: - - 'dependabot/**' - pull_request: ~ - release: - types: [ created ] - workflow_dispatch: ~ - -jobs: - tests: - runs-on: ubuntu-latest - - name: "Sylius ${{ matrix.sylius }}, PHP ${{ matrix.php }}, Symfony ${{ matrix.symfony }}" - - strategy: - fail-fast: false - matrix: - php: [ "8.1", "8.2", "8.3" ] - symfony: [ "^5.4", "^6.4" ] - sylius: [ "^1.13", "^1.14" ] - node: [ "18.x", "20.x" ] - - steps: - - uses: actions/checkout@v3 - - - name: Setup PHP - uses: shivammathur/setup-php@v2 - with: - php-version: "${{ matrix.php }}" - extensions: intl - tools: symfony - coverage: none - - - name: Get Composer cache directory - id: composer-cache - run: echo "dir=$(composer config cache-files-dir)" >> $GITHUB_OUTPUT - - - name: Cache Composer - uses: actions/cache@v4 - with: - path: ${{ steps.composer-cache.outputs.dir }} - key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json', '**/composer.lock') }} - restore-keys: | - ${{ runner.os }}-php-${{ matrix.php }}-composer- - - - name: Restrict Symfony version - if: matrix.symfony != '' - run: | - composer global config --no-plugins allow-plugins.symfony/flex true - composer global require --no-progress --no-scripts --no-plugins "symfony/flex:^1.10" - composer config extra.symfony.require "${{ matrix.symfony }}" - - - name: Restrict Sylius version - if: matrix.sylius != '' - run: composer require "sylius/sylius:${{ matrix.sylius }}" --no-update --no-scripts --no-interaction - - - name: Install PHP dependencies - run: composer install --no-interaction - env: - SYMFONY_REQUIRE: ${{ matrix.symfony }} - - - name: Run PHPStan - run: vendor/bin/phpstan analyse -c phpstan.neon -l 8 src/ - - - name: Run ECS - run: vendor/bin/ecs - - - name: Failed build Slack notification - uses: rtCamp/action-slack-notify@v2 - if: ${{ failure() && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') }} - env: - SLACK_CHANNEL: ${{ secrets.FAILED_BUILD_SLACK_CHANNEL }} - SLACK_COLOR: ${{ job.status }} - SLACK_ICON: https://github.com/rtCamp.png?size=48 - SLACK_MESSAGE: ':x:' - SLACK_TITLE: Failed build on ${{ github.event.repository.name }} repository - SLACK_USERNAME: ${{ secrets.FAILED_BUILD_SLACK_USERNAME }} - SLACK_WEBHOOK: ${{ secrets.FAILED_BUILD_SLACK_WEBHOOK }} diff --git a/README.md b/README.md index 7a4c751b..edd50981 100644 --- a/README.md +++ b/README.md @@ -1,57 +1,28 @@ -# [![](https://bitbag.io/wp-content/uploads/2021/01/wishlist.png)](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) +

+ + + + + Sylius Logo. + + +

-# BitBag SyliusWishlistPlugin +

Wishlist Plugin

---- -[ ![](https://img.shields.io/packagist/l/bitbag/wishlist-plugin.svg) ](https://packagist.org/packages/bitbag/wishlist-plugin "License") -[ ![](https://img.shields.io/packagist/v/bitbag/wishlist-plugin.svg) ](https://packagist.org/packages/bitbag/wishlist-plugin "Version") +[ ![](https://img.shields.io/packagist/l/sylius/wishlist-plugin.svg) ](https://packagist.org/packages/sylius/wishlist-plugin "License") +[ ![](https://img.shields.io/packagist/v/sylius/wishlist-plugin.svg) ](https://packagist.org/packages/sylius/wishlist-plugin "Version") [ ![](https://img.shields.io/github/actions/workflow/status/BitBagCommerce/SyliusWishlistPlugin/build.yml) ](https://github.com/BitBagCommerce/SyliusWishlistPlugin/actions "Build status") [ ![](https://img.shields.io/scrutinizer/g/BitBagCommerce/SyliusWishlistPlugin.svg) ](https://scrutinizer-ci.com/g/BitBagCommerce/SyliusWishlistPlugin/ "Scrutinizer") -[ ![](https://poser.pugx.org/bitbag/wishlist-plugin/downloads)](https://packagist.org/packages/bitbag/wishlist-plugin "Total Downloads") +[ ![](https://poser.pugx.org/sylius/wishlist-plugin/downloads)](https://packagist.org/packages/sylius/wishlist-plugin "Total Downloads") [ ![Slack](https://img.shields.io/badge/community%20chat-slack-FF1493.svg)](http://sylius-devs.slack.com) [ ![Support](https://img.shields.io/badge/support-contact%20author-blue])](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) -

- -

- -We want to impact many unique eCommerce projects and build our brand recognition worldwide, so we are heavily involved in creating open-source solutions, especially for Sylius. We have already created over **35 extensions, which have been downloaded almost 2 million times.** - -You can find more information about our eCommerce services and technologies on our website: https://bitbag.io/. We have also created a **unique service dedicated to creating plugins:** https://bitbag.io/services/sylius-plugin-development. - -Do you like our work? Would you like to join us? Check out the **“Career” tab**: https://bitbag.io/pl/kariera. - -# About Us - -BitBag is a software house that implements tailor-made eCommerce platforms with the entire infrastructure—from creating eCommerce platforms to implementing PIM and CMS systems to developing custom eCommerce applications, specialist B2B solutions, and migrations from other platforms. - -We actively participate in Sylius's development. We have already completed **over 150 projects**, cooperating with clients from all over the world, including smaller enterprises and large international companies. We have completed projects for such important brands as **Mytheresa, Foodspring, Planeta Huerto (Carrefour Group), Albeco, Mollie, and ArtNight.** - -We have a 70-person team of experts: business analysts and eCommerce consultants, developers, project managers, and QA testers. - -**Our services:** -* B2B and B2C eCommerce platform implementations -* Multi-vendor marketplace platform implementations -* eCommerce migrations -* Sylius plugin development -* Sylius consulting -* Project maintenance and long-term support -* PIM and CMS implementations - -**Some numbers from BitBag regarding Sylius:** -* 70 experts on board -* +150 projects delivered on top of Sylius, -* 30 countries of BitBag’s customers, -* 7 years in the Sylius ecosystem. -* +35 plugins created for Sylius - ---- -[![](https://bitbag.io/wp-content/uploads/2024/09/badges-sylius.png)](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) - ---- - +

+---- ## Table of Content @@ -68,42 +39,45 @@ We have a 70-person team of experts: business analysts and eCommerce consultants * [Community](#community) # Overview + ---- The Wishlist Plugin is meticulously designed to seamlessly integrate wishlist features with any Sylius platform app, allowing users to curate and manage a list of their desired products effortlessly. This plugin serves as a functional enhancement to the Sylius ecosystem, ensuring users can smoothly browse, save, and revisit their preferred items without hassle. # Installation + ---- The SyliusWishlistPlugin **installation process** can be found [here](./doc/01-installation.md). ## Customization + ---- The SyliusWishlistPlugin **customization process** can be found [here](./doc/03-customization.md). ## Development + ---- The SyliusWishlistPlugin **development process** can be found [here](./doc/04-development.md). ## Testing + ---- The SyliusWishlistPlugin **testing process** can be found [here](./doc/05-testing.md). ## Usage + ---- The SyliusWishlistPlugin **usage** can be found [here](./doc/02-usage.md). # Functionalities + ---- -All main functionalities of the plugin are described [here](https://github.com/BitBagCommerce/SyliusWishlistPlugin/blob/master/doc/functionalities.md). +All main functionalities of the plugin are described [here](./doc/functionalities.md). # Demo + --- We created a demo app with some useful use-cases of plugins! Visit http://demo.sylius.com/ to take a look at it. -**If you need an overview of Sylius' capabilities, schedule a consultation with our expert.** - -[![](https://bitbag.io/wp-content/uploads/2020/10/button_free_consulatation-1.png)](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) - - # Additional resources for developers --- @@ -111,11 +85,6 @@ To learn more about our contribution workflow and more, we encourage you to use * [Sylius Documentation](https://docs.sylius.com/en/latest/) * [Sylius Contribution Guide](https://docs.sylius.com/en/latest/contributing/) * [Sylius Online Course](https://sylius.com/online-course/) -* [Sylius Wishlist Plugin Blog](https://bitbag.io/blog/sylius-wishlist-plugin) - ---- - -If you need some help with Sylius development, don't be hesitated to contact us directly. You can fill the form on [this site](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) or send us an e-mail at hello@bitbag.io! --- @@ -124,25 +93,3 @@ If you need some help with Sylius development, don't be hesitated to contact us ---- For online communication, we invite you to chat with us & other users on [Sylius Slack](https://sylius-devs.slack.com/). - -# License - ---- - -This plugin's source code is completely free and released under the terms of the MIT license. - -[//]: # (These are reference links used in the body of this note and get stripped out when the markdown processor does its job. There is no need to format nicely because it shouldn't be seen.) - -# Contact and Support - ---- -If you want to contact us, the best way is to fill the form on [our website](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) or send us an e-mail to hello@bitbag.io with your question(s). We guarantee that we answer as soon as we can! - - -# Community - ----- - -For online communication, we invite you to chat with us & other users on [Sylius Slack](https://sylius-devs.slack.com/). - -[![](https://bitbag.io/wp-content/uploads/2024/09/badges-partners.png)](https://bitbag.io/contact-us/?utm_source=github&utm_medium=referral&utm_campaign=plugins_wishlist) diff --git a/src/Resources/assets/admin/entry.js b/assets/entrypoint.js similarity index 100% rename from src/Resources/assets/admin/entry.js rename to assets/entrypoint.js diff --git a/src/Resources/assets/shop/js/WishlistVariantButton.js b/assets/js/WishlistVariantButton.js similarity index 100% rename from src/Resources/assets/shop/js/WishlistVariantButton.js rename to assets/js/WishlistVariantButton.js diff --git a/src/Resources/assets/shop/js/WishlistVariantPrice.js b/assets/js/WishlistVariantPrice.js similarity index 100% rename from src/Resources/assets/shop/js/WishlistVariantPrice.js rename to assets/js/WishlistVariantPrice.js diff --git a/src/Resources/assets/shop/js/copyToWishlistsListModal.js b/assets/js/copyToWishlistsListModal.js similarity index 95% rename from src/Resources/assets/shop/js/copyToWishlistsListModal.js rename to assets/js/copyToWishlistsListModal.js index d52c58a0..dbbe061f 100644 --- a/src/Resources/assets/shop/js/copyToWishlistsListModal.js +++ b/assets/js/copyToWishlistsListModal.js @@ -34,14 +34,14 @@ export class CreateCopyToWishlistsListModal { init() { if (this.config && typeof this.config !== 'object') { - throw new Error('BitBag - CreateCopyToWishlistsListModal - given config is not valid - expected object'); + throw new Error('CreateCopyToWishlistsListModal - given config is not valid - expected object'); } this._renderModal(); } _renderModal() { this.modal = this._modalTemplate(); - this.modal.classList.add('bitbag', 'copy-modal-initialization'); + this.modal.classList.add('sylius', 'copy-modal-initialization'); this._modalActions(this.modal); document.querySelector('body').appendChild(this.modal); this.modal.classList.remove('copy-modal-initialization'); @@ -86,7 +86,7 @@ export class CreateCopyToWishlistsListModal { _getWishlists() { const select = document.createElement('select') select.name = 'wishlist' - select.classList.add('ui', 'selection', 'dropdown') + select.classList.add('form-select') select.insertAdjacentHTML("beforeend" ,``) this.wishlistTargets.forEach(wishlist => { diff --git a/src/Resources/assets/shop/js/handleAddAnotherWishlistModal.js b/assets/js/handleAddAnotherWishlistModal.js similarity index 100% rename from src/Resources/assets/shop/js/handleAddAnotherWishlistModal.js rename to assets/js/handleAddAnotherWishlistModal.js diff --git a/src/Resources/assets/shop/js/handleCopyToWishlistListModal.js b/assets/js/handleCopyToWishlistListModal.js similarity index 100% rename from src/Resources/assets/shop/js/handleCopyToWishlistListModal.js rename to assets/js/handleCopyToWishlistListModal.js diff --git a/src/Resources/assets/shop/js/handleEditWishlistModal.js b/assets/js/handleEditWishlistModal.js similarity index 100% rename from src/Resources/assets/shop/js/handleEditWishlistModal.js rename to assets/js/handleEditWishlistModal.js diff --git a/src/Resources/assets/shop/js/handleRemoveWishlistModal.js b/assets/js/handleRemoveWishlistModal.js similarity index 100% rename from src/Resources/assets/shop/js/handleRemoveWishlistModal.js rename to assets/js/handleRemoveWishlistModal.js diff --git a/src/Resources/assets/shop/js/handleWishlistMainCheckbox.js b/assets/js/handleWishlistMainCheckbox.js similarity index 100% rename from src/Resources/assets/shop/js/handleWishlistMainCheckbox.js rename to assets/js/handleWishlistMainCheckbox.js diff --git a/src/Resources/assets/shop/js/index.js b/assets/js/index.js similarity index 100% rename from src/Resources/assets/shop/js/index.js rename to assets/js/index.js diff --git a/src/Resources/assets/shop/js/wishlistMainCheckboxUpdater.js b/assets/js/wishlistMainCheckboxUpdater.js similarity index 95% rename from src/Resources/assets/shop/js/wishlistMainCheckboxUpdater.js rename to assets/js/wishlistMainCheckboxUpdater.js index 0f1dc144..c0eaa7b8 100644 --- a/src/Resources/assets/shop/js/wishlistMainCheckboxUpdater.js +++ b/assets/js/wishlistMainCheckboxUpdater.js @@ -15,7 +15,7 @@ export class WishlistMainCheckboxUpdater { init() { if (this.config && typeof this.config !== 'object') { - throw new Error('BitBag - WishlistMainCheckboxUpdater - given config is not valid - expected object'); + throw new Error('WishlistMainCheckboxUpdater - given config is not valid - expected object'); } this._connectListeners(); } diff --git a/src/Resources/assets/shop/js/wishlistModal.js b/assets/js/wishlistModal.js similarity index 96% rename from src/Resources/assets/shop/js/wishlistModal.js rename to assets/js/wishlistModal.js index 072554f4..5838e9e6 100644 --- a/src/Resources/assets/shop/js/wishlistModal.js +++ b/assets/js/wishlistModal.js @@ -29,7 +29,7 @@ export class WishlistModal { init() { if (this.config && typeof this.config !== 'object') { - throw new Error('BitBag - WishlistsListModal - given config is not valid - expected object'); + throw new Error('WishlistsListModal - given config is not valid - expected object'); } this._renderModal(); @@ -37,7 +37,7 @@ export class WishlistModal { _renderModal() { this.modal = this._modalTemplate(); - this.modal.classList.add('bitbag', 'wishlist-modal-initialization'); + this.modal.classList.add('sylius', 'wishlist-modal-initialization'); this._modalActions(this.modal); document.querySelector('body').appendChild(this.modal); this.modal.classList.remove('wishlist-modal-initialization'); diff --git a/assets/scss/main.scss b/assets/scss/main.scss new file mode 100644 index 00000000..a5ca97cd --- /dev/null +++ b/assets/scss/main.scss @@ -0,0 +1,2 @@ +@import "utilities/main"; +@import "pages/main"; diff --git a/src/Resources/assets/shop/scss/pages/importWishlist.scss b/assets/scss/pages/importWishlist.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/importWishlist.scss rename to assets/scss/pages/importWishlist.scss diff --git a/assets/scss/pages/main.scss b/assets/scss/pages/main.scss new file mode 100644 index 00000000..17a50b96 --- /dev/null +++ b/assets/scss/pages/main.scss @@ -0,0 +1,5 @@ +@import "wishlist-details/main"; +@import "wishlist-modal/main"; +@import "importWishlist"; +@import "wishlist-group/index"; +@import "wishlist-button/index"; diff --git a/src/Resources/assets/shop/scss/pages/wishlist-button/index.scss b/assets/scss/pages/wishlist-button/index.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-button/index.scss rename to assets/scss/pages/wishlist-button/index.scss diff --git a/src/Resources/assets/shop/scss/pages/wishlist-details/_actions.scss b/assets/scss/pages/wishlist-details/_actions.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-details/_actions.scss rename to assets/scss/pages/wishlist-details/_actions.scss diff --git a/src/Resources/assets/shop/scss/pages/wishlist-details/_header.scss b/assets/scss/pages/wishlist-details/_header.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-details/_header.scss rename to assets/scss/pages/wishlist-details/_header.scss diff --git a/src/Resources/assets/shop/scss/pages/wishlist-details/_item.scss b/assets/scss/pages/wishlist-details/_item.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-details/_item.scss rename to assets/scss/pages/wishlist-details/_item.scss diff --git a/src/Resources/assets/shop/scss/pages/wishlist-details/_variant.scss b/assets/scss/pages/wishlist-details/_variant.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-details/_variant.scss rename to assets/scss/pages/wishlist-details/_variant.scss diff --git a/src/Resources/assets/shop/scss/pages/wishlist-details/bulkActions.scss b/assets/scss/pages/wishlist-details/bulkActions.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-details/bulkActions.scss rename to assets/scss/pages/wishlist-details/bulkActions.scss diff --git a/src/Resources/assets/shop/scss/pages/wishlist-details/main.scss b/assets/scss/pages/wishlist-details/main.scss similarity index 67% rename from src/Resources/assets/shop/scss/pages/wishlist-details/main.scss rename to assets/scss/pages/wishlist-details/main.scss index 6257365f..937405fe 100644 --- a/src/Resources/assets/shop/scss/pages/wishlist-details/main.scss +++ b/assets/scss/pages/wishlist-details/main.scss @@ -1,9 +1,9 @@ -@import "./actions"; -@import "./item"; -@import "./variant"; -@import "./wishlistChooseModal.scss"; -@import "./bulkActions.scss"; -@import "./header"; +@import "actions"; +@import "item"; +@import "variant"; +@import "wishlistChooseModal"; +@import "bulkActions"; +@import "header"; .bb-wishlist { font-size: 16px; @@ -18,8 +18,8 @@ .bb-copy-to-wishlist-sukces { animation: beep 1s cubic-bezier(0,0,.2,1) infinite !important; -} +} .bb-copy-to-wishlist-faliure { animation: beep 1s cubic-bezier(0,0,.2,1) infinite !important; -} +} diff --git a/assets/scss/pages/wishlist-details/wishlistChooseModal.scss b/assets/scss/pages/wishlist-details/wishlistChooseModal.scss new file mode 100644 index 00000000..82da55b1 --- /dev/null +++ b/assets/scss/pages/wishlist-details/wishlistChooseModal.scss @@ -0,0 +1,103 @@ +$bright_color: #ffffff; +$dark_color: #050428; +$transparent_color: rgba(0, 0, 0, 0.25); + +.copy-modal-initialization { + display: none; +} + +.copy-modal-initialized { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 899; + background-color: $transparent_color; +} + +.copy-confirmation-modal { + background-color: $bright_color; + border-radius: 8px; + padding: 24px; + + &__header, + &__body, + &__confirm { + padding: 16px 0; + text-align: center; + } + + &__header { + &--title { + font-size: 24px; + } + } + + &__body { + font-size: 16px; + + .form-body { + display: flex; + + &--item { + + padding-top: 1rem; + } + } + } + + &__confirm { + display: flex; + align-items: center; + justify-content: space-evenly; + + &--cancel, + &--perform { + cursor: pointer; + padding: 12px 8px; + text-align: center; + min-width: 125px; + transition: opacity 0.3s ease; + border-radius: 4px; + border: none; + font-weight: 650; + letter-spacing: 1.25px; + font-size: 14px; + text-transform: capitalize; + + &:hover { + opacity: 0.7; + } + } + + &--cancel { + color: $dark_color; + border: 1px solid $dark_color; + background-color: $bright_color; + + &:focus { + background-color: darken($bright_color, 20%); + } + } + + &--perform { + color: $bright_color; + border: 1px solid $dark_color; + background-color: $dark_color; + + &:focus { + background-color: lighten($dark_color, 20%); + } + } + } +} + +.copy-confirmation-modal__body--item { + padding-bottom: 1rem; + font-size: 16px; +} + diff --git a/src/Resources/assets/shop/scss/pages/wishlist-group/index.scss b/assets/scss/pages/wishlist-group/index.scss similarity index 100% rename from src/Resources/assets/shop/scss/pages/wishlist-group/index.scss rename to assets/scss/pages/wishlist-group/index.scss diff --git a/assets/scss/pages/wishlist-modal/main.scss b/assets/scss/pages/wishlist-modal/main.scss new file mode 100644 index 00000000..98dacd6b --- /dev/null +++ b/assets/scss/pages/wishlist-modal/main.scss @@ -0,0 +1 @@ +@import 'wishlistModal' diff --git a/assets/scss/pages/wishlist-modal/wishlistModal.scss b/assets/scss/pages/wishlist-modal/wishlistModal.scss new file mode 100644 index 00000000..a9d75a99 --- /dev/null +++ b/assets/scss/pages/wishlist-modal/wishlistModal.scss @@ -0,0 +1,133 @@ +$bright_color: #ffffff; +$dark_color: #050428; +$transparent_color: rgba(0, 0, 0, 0.25); + + +.wishlist-modal-initialization { + display: none; +} + +.wishlist-modal-initialized { + display: flex; + align-items: center; + justify-content: center; + position: fixed; + top: 0; + bottom: 0; + left: 0; + right: 0; + z-index: 899; + background-color: $transparent_color; +} + +.wishlist-confirmation-modal { + background-color: $bright_color; + border-radius: 8px; + padding: 24px; + + &__header, + &__body, + &__confirm { + padding: 16px 0; + text-align: center; + gap: 1rem; + } + + &__header { + &--title { + font-size: 24px; + } + } + + &__body { + display: flex; + flex-direction: column; + align-items: center; + font-size: 16px; + + &--input { + width: min-content; + padding-top: 1rem; + line-height: 1.4285em; + color: rgba(0, 0, 0, .87); + font-weight: 400; + -webkit-text-size-adjust: 100%; + border-color: #85b7d9; + text-align: left; + padding: .67857143em 1em; + border: 1px solid rgba(34, 36, 38, .15); + border-radius: .28571429rem; + -webkit-tap-highlight-color: rgba(255, 255, 255, 0); + } + + &--input::placeholder { + max-height: auto; + } + + &--input.error { + background-color: #FFF6F6; + border-color: #E0B4B4; + color: #9F3A38; + } + + .validation-error { + width: min-content; + white-space: nowrap; + } + + .form-body { + display: flex; + } + + } + + &__confirm { + display: flex; + align-items: center; + justify-content: space-evenly; + + &--cancel, + &--perform { + cursor: pointer; + padding: 12px 8px; + text-align: center; + min-width: 125px; + transition: opacity 0.3s ease; + border-radius: 4px; + border: none; + font-weight: 650; + letter-spacing: 1.25px; + font-size: 14px; + text-transform: capitalize; + + &:hover { + opacity: 0.7; + } + } + + &--cancel { + color: $dark_color; + border: 1px solid $dark_color; + background-color: $bright_color; + + &:focus { + background-color: darken($bright_color, 20%); + } + } + + &--perform { + color: $bright_color; + border: 1px solid $dark_color; + background-color: $dark_color; + + &:focus { + background-color: lighten($dark_color, 20%); + } + } + } +} + +.wishlist-confirmation-modal__body--item { + padding-bottom: 1rem; + font-size: 16px; +} diff --git a/src/Resources/assets/shop/scss/utilities/_variables.scss b/assets/scss/utilities/_variables.scss similarity index 100% rename from src/Resources/assets/shop/scss/utilities/_variables.scss rename to assets/scss/utilities/_variables.scss diff --git a/assets/scss/utilities/main.scss b/assets/scss/utilities/main.scss new file mode 100644 index 00000000..9132fb60 --- /dev/null +++ b/assets/scss/utilities/main.scss @@ -0,0 +1 @@ +@import "variables"; diff --git a/behat.yml.dist b/behat.yml.dist index cdd4d2eb..7c94ac13 100644 --- a/behat.yml.dist +++ b/behat.yml.dist @@ -21,38 +21,20 @@ default: files_path: "%paths.base%/vendor/sylius/sylius/src/Sylius/Behat/Resources/fixtures/" base_url: "https://127.0.0.1:8080/" default_session: symfony - javascript_session: chrome_headless + javascript_session: chrome sessions: symfony: symfony: ~ - chrome_headless: + chrome: chrome: api_url: http://127.0.0.1:9222 validate_certificate: false - chrome: - selenium2: - browser: chrome - capabilities: - browserName: chrome - browser: chrome - version: "" - marionette: null # https://github.com/Behat/MinkExtension/pull/311 - chrome: - switches: - - "start-fullscreen" - - "start-maximized" - - "no-sandbox" - extra_capabilities: - unexpectedAlertBehaviour: accept - firefox: - selenium2: - browser: firefox show_auto: false FriendsOfBehat\SymfonyExtension: bootstrap: tests/Application/config/bootstrap.php kernel: - class: Tests\BitBag\SyliusWishlistPlugin\Application\Kernel + class: Tests\Sylius\WishlistPlugin\Application\Kernel FriendsOfBehat\VariadicExtension: ~ diff --git a/composer.json b/composer.json index 585bb76e..9799a174 100644 --- a/composer.json +++ b/composer.json @@ -1,55 +1,57 @@ { - "name": "bitbag/wishlist-plugin", + "name": "sylius/wishlist-plugin", "type": "sylius-plugin", "description": "Wishlist plugin for Sylius.", "license": "MIT", "require": { - "php": "^8.1", - "sylius/sylius": "^1.13 || ^1.14", - "symfony/webpack-encore-bundle": "^1.15", + "php": "^8.2", + "sylius/sylius": "^2.0", "dompdf/dompdf": "^2.0" }, "require-dev": { - "behat/behat": "^3.7", - "behat/mink-selenium2-driver": "~1.6.0", - "bitbag/coding-standard": "^3.0.0", - "dmore/behat-chrome-extension": "^1.3", - "dmore/chrome-mink-driver": "^2.7", - "gedmo/doctrine-extensions": "^3.9", + "behat/behat": "^3.14", + "dmore/behat-chrome-extension": "^1.4", "friends-of-behat/mink": "^1.8", "friends-of-behat/mink-browserkit-driver": "^1.4", - "friends-of-behat/mink-debug-extension": "^2.0", + "friends-of-behat/mink-debug-extension": "^2.0.0", "friends-of-behat/mink-extension": "^2.4", "friends-of-behat/page-object-extension": "^0.3", "friends-of-behat/suite-settings-extension": "^1.0", "friends-of-behat/symfony-extension": "^2.1", "friends-of-behat/variadic-extension": "^1.3", + "nelmio/alice": "^3.10", + "nyholm/psr7": "^1.8", "phpspec/phpspec": "^7.0", "phpunit/phpunit": "^9.5", - "symfony/browser-kit": "^5.4 || ^6.0", - "symfony/debug-bundle": "^5.4 || ^6.0", - "symfony/dotenv": "^5.4 || ^6.0", - "symfony/intl": "^5.4 || ^6.0", - "symfony/web-profiler-bundle": "^5.4 || ^6.0", "polishsymfonycommunity/symfony-mocker-container": "^1.0", - "symfony/dependency-injection": "^5.4 || ^6.0", - "league/flysystem-bundle": "2.4.0", "sylius/mailer-bundle": "^1.8 || ^2.0@beta", + "sylius/sylius-rector": "^2.0", + "sylius-labs/coding-standard": "^4.4", + "sylius-labs/suite-tags-extension": "~0.2", + "symfony/browser-kit": "^6.4 || ^7.1", + "symfony/debug-bundle": "^6.4 || ^7.1", + "symfony/dotenv": "^6.4 || ^7.1", + "symfony/http-client": "^6.4 || ^7.1", + "symfony/intl": "^6.4 || ^7.1", + "symfony/web-profiler-bundle": "^6.4 || ^7.1", "lchrusciel/api-test-case": "^4.1 || ^5.0", - "nelmio/alice": "^3.10" + "robertfausk/behat-panther-extension": "^1.1", + "symfony/webpack-encore-bundle": "^2.1", + "phpstan/phpstan-doctrine": "^1.5", + "phpstan/phpstan-webmozart-assert": "^1.2" }, "prefer-stable": true, "autoload": { "psr-4": { - "BitBag\\SyliusWishlistPlugin\\": "src/", - "Tests\\BitBag\\SyliusWishlistPlugin\\": "tests/" + "Sylius\\WishlistPlugin\\": "src/", + "Tests\\Sylius\\WishlistPlugin\\": "tests/" } }, "autoload-dev": { "classmap": ["tests/Application/Kernel.php"], "psr-4": { - "BitBag\\SyliusWishlistPlugin\\": "src/", - "Tests\\BitBag\\SyliusWishlistPlugin\\": "tests/", + "Sylius\\WishlistPlugin\\": "src/", + "Tests\\Sylius\\WishlistPlugin\\": "tests/", "Sylius\\Tests\\Api\\": ["vendor/sylius/sylius/tests/Api/"] } }, @@ -58,7 +60,8 @@ "phpstan/extension-installer": true, "composer/package-versions-deprecated": true, "dealerdirect/phpcodesniffer-composer-installer": true, - "symfony/thanks": true + "symfony/thanks": true, + "php-http/discovery": true }, "preferred-install": { "sylius/sylius": "source" diff --git a/config/api_platform/properties/Wishlist.xml b/config/api_platform/properties/Wishlist.xml new file mode 100644 index 00000000..5001924c --- /dev/null +++ b/config/api_platform/properties/Wishlist.xml @@ -0,0 +1,8 @@ + + + + + diff --git a/config/api_platform/resources/admin/Wishlist.xml b/config/api_platform/resources/admin/Wishlist.xml new file mode 100644 index 00000000..c8eef6c3 --- /dev/null +++ b/config/api_platform/resources/admin/Wishlist.xml @@ -0,0 +1,37 @@ + + + + + + + + + + + + + sylius_wishlist:shop:wishlist:read + + + + + + + + diff --git a/config/api_platform/resources/shop/Wishlist.xml b/config/api_platform/resources/shop/Wishlist.xml new file mode 100644 index 00000000..a87b1e46 --- /dev/null +++ b/config/api_platform/resources/shop/Wishlist.xml @@ -0,0 +1,147 @@ + + + + + + + + + + + + + sylius_wishlist:shop:wishlist:create + + + + + + + + + sylius + + + + + + + + + + + + sylius_wishlist:shop:wishlist:read + + + + + + + + + + + + sylius_wishlist:shop:wishlist:add_product + + + + + + + + + sylius + + + + + + + + + + + + sylius_wishlist:shop:wishlist:add_product + + + + + + + + + sylius + + + + + + + + + + + + + + diff --git a/config/app/twig_hooks/base.yaml b/config/app/twig_hooks/base.yaml new file mode 100644 index 00000000..fa70da04 --- /dev/null +++ b/config/app/twig_hooks/base.yaml @@ -0,0 +1,6 @@ +sylius_twig_hooks: + hooks: + 'sylius_shop.base.header.content': + wishlist_header: + template: '@SyliusWishlistPlugin/wishlist_header.html.twig' + priority: 150 diff --git a/config/app/twig_hooks/product/show.yaml b/config/app/twig_hooks/product/show.yaml new file mode 100644 index 00000000..8077102f --- /dev/null +++ b/config/app/twig_hooks/product/show.yaml @@ -0,0 +1,9 @@ +sylius_twig_hooks: + hooks: + 'sylius_shop.product.show.content.info.summary': + add_to_wishlist: + component: 'sylius_shop:product:add_to_wishlist' + props: + product: '@=_context.product' + template: '@SyliusWishlistPlugin/product/show/add_to_wishlist.html.twig' + priority: 10 diff --git a/config/config.yaml b/config/config.yaml new file mode 100644 index 00000000..af18623c --- /dev/null +++ b/config/config.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "@SyliusWishlistPlugin/config/app/twig_hooks/**/*.yaml" } diff --git a/src/Resources/config/doctrine/Wishlist.orm.xml b/config/doctrine/Wishlist.orm.xml similarity index 90% rename from src/Resources/config/doctrine/Wishlist.orm.xml rename to config/doctrine/Wishlist.orm.xml index 51a51f91..e2b22021 100644 --- a/src/Resources/config/doctrine/Wishlist.orm.xml +++ b/config/doctrine/Wishlist.orm.xml @@ -6,7 +6,7 @@ xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> - + @@ -15,7 +15,7 @@ diff --git a/src/Resources/config/doctrine/WishlistProduct.orm.xml b/config/doctrine/WishlistProduct.orm.xml similarity index 81% rename from src/Resources/config/doctrine/WishlistProduct.orm.xml rename to config/doctrine/WishlistProduct.orm.xml index faf50283..0b8754c4 100644 --- a/src/Resources/config/doctrine/WishlistProduct.orm.xml +++ b/config/doctrine/WishlistProduct.orm.xml @@ -5,12 +5,12 @@ xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping http://doctrine-project.org/schemas/orm/doctrine-mapping.xsd"> - + - + diff --git a/config/routes.yaml b/config/routes.yaml new file mode 100644 index 00000000..2ef4ddb5 --- /dev/null +++ b/config/routes.yaml @@ -0,0 +1,11 @@ +sylius_wishlist_plugin_shop_no_prefix: + resource: "@SyliusWishlistPlugin/config/routes/shop.yaml" + name_prefix: 'sylius_wishlist_plugin_shop_' + +sylius_wishlist_plugin_shop: + resource: "@SyliusWishlistPlugin/config/routes/shop.yaml" + name_prefix: 'sylius_wishlist_plugin_shop_locale_' + prefix: /{_locale} + requirements: + _locale: ^[a-z]{2}(?:_[A-Z]{2})?$ + diff --git a/config/routes/shop.yaml b/config/routes/shop.yaml new file mode 100644 index 00000000..c52aaf20 --- /dev/null +++ b/config/routes/shop.yaml @@ -0,0 +1,111 @@ +wishlist_list_products: + path: /wishlist + methods: [GET] + defaults: + _controller: sylius_wishlist_plugin.controller.action.list_wishlist_products + +wishlist_add_products: + path: /wishlist/{wishlistId}/products + methods: [POST] + defaults: + _controller: sylius_wishlist_plugin.controller.action.add_products_to_wishlist + +wishlist_add_product: + path: /wishlist/add/{productId} + defaults: + _controller: sylius_wishlist_plugin.controller.action.add_product_to_wishlist + +wishlist_remove_product: + path: /wishlist/remove/{productId} + defaults: + _controller: sylius_wishlist_plugin.controller.action.remove_product_from_wishlist + +wishlist_remove_selected_products: + path: /wishlist/{wishlistId}/products/delete + defaults: + _controller: sylius_wishlist_plugin.controller.action.remove_selected_products_from_wishlist + +wishlist_add_selected_products: + path: /wishlist/{wishlistId}/products/add + defaults: + _controller: sylius_wishlist_plugin.controller.action.add_selected_products_to_cart + +wishlsit_export_selected_products_to_csv: + path: /wishlist/{wishlistId}/csv/export + defaults: + _controller: sylius_wishlist_plugin.controller.action.export_selected_products_to_csv + +wishlist_import_from_csv: + path: /wishlist/csv/import + defaults: + _controller: sylius_wishlist_plugin.controller.action.import_from_csv + +wishlist_remove_product_variant: + path: /wishlist/{wishlistId}/remove/variant/{variantId} + defaults: + _controller: sylius_wishlist_plugin.controller.action.remove_product_variant_from_wishlist + +wishlist_render_header_template: + path: /wishlist/header-template + defaults: + _controller: sylius_wishlist_plugin.controller.action.render_header_template + +wishlist_export_to_pdf: + path: /wishlist/{wishlistId}/export/pdf + defaults: + _controller: sylius_wishlist_plugin.controller.action.export_wishlist_to_pdf_action + +wishlist_clean: + path: /wishlist/clear/{wishlistId} + defaults: + _controller: sylius_wishlist_plugin.controller.action.clean_wishlist + +wishlist_list_wishlists: + path: /wishlists + defaults: + _controller: sylius_wishlist_plugin.controller.action.list_wishlists + +wishlist_create_new_wishlist: + path: /wishlists/create + methods: [GET, POST, DELETE] + defaults: + _controller: sylius_wishlist_plugin.controller.action.create_new_wishlist + +wishlist_remove_wishlist: + path: /wishlists/{id}/remove + methods: [GET, POST, DELETE] + defaults: + _controller: sylius_wishlist_plugin.controller.wishlist::deleteAction + _sylius: + csrf_protection: false + flash: sylius_wishlist_plugin.ui.remove_wishlist + redirect: + route: wishlist_list_wishlists + +wishlist_edit_wishlist_name: + path: /wishlists/{id}/edit + methods: [GET, PUT, POST] + defaults: + _controller: sylius_wishlist_plugin.controller.action.update_wishlist_name_action + +wishlist_show_chosen_wishlist: + path: /wishlists/{wishlistId} + defaults: + _controller: sylius_wishlist_plugin.controller.action.show_chosen_wishlist + +wishlist_add_product_to_selected_wishlist: + path: /wishlist/{wishlistId}/add/{productId} + defaults: + _controller: sylius_wishlist_plugin.controller.action.add_product_to_selected_wishlist + +wishlist_copy_selected_products_to_other_wishlist: + path: /wishlists/{wishlistId}/copy/{destinedWishlistId} + methods: [ POST ] + defaults: + _controller: sylius_wishlist_plugin.controller.action.copy_selected_products_to_other_wishlist + +wishlist_add_wishlist_to_user: + path: /wishlists/{id}/save-wishlist + methods: [GET, PUT, POST] + defaults: + _controller: sylius_wishlist_plugin.controller.action.add_wishlists_to_user diff --git a/src/Resources/config/serialization/Commands/Wishlist/AddProductToWishlist.xml b/config/serialization/Commands/Wishlist/AddProductToWishlist.xml similarity index 67% rename from src/Resources/config/serialization/Commands/Wishlist/AddProductToWishlist.xml rename to config/serialization/Commands/Wishlist/AddProductToWishlist.xml index 5b00cdda..bc219488 100644 --- a/src/Resources/config/serialization/Commands/Wishlist/AddProductToWishlist.xml +++ b/config/serialization/Commands/Wishlist/AddProductToWishlist.xml @@ -3,12 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping https://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd" > - + - shop:wishlist:add_product + sylius_wishlist:shop:wishlist:add_product - shop:wishlist:add_product + sylius_wishlist:shop:wishlist:add_product diff --git a/src/Resources/config/serialization/Commands/Wishlist/AddProductVariantToWishlist.xml b/config/serialization/Commands/Wishlist/AddProductVariantToWishlist.xml similarity index 72% rename from src/Resources/config/serialization/Commands/Wishlist/AddProductVariantToWishlist.xml rename to config/serialization/Commands/Wishlist/AddProductVariantToWishlist.xml index 212b5f38..2a939f71 100644 --- a/src/Resources/config/serialization/Commands/Wishlist/AddProductVariantToWishlist.xml +++ b/config/serialization/Commands/Wishlist/AddProductVariantToWishlist.xml @@ -3,9 +3,9 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping https://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd" > - + - shop:wishlist:add_product + sylius_wishlist:shop:wishlist:add_product diff --git a/src/Resources/config/serialization/Commands/Wishlist/CreateWishlist.xml b/config/serialization/Commands/Wishlist/CreateWishlist.xml similarity index 69% rename from src/Resources/config/serialization/Commands/Wishlist/CreateWishlist.xml rename to config/serialization/Commands/Wishlist/CreateWishlist.xml index 5e3b35cb..fc077a46 100644 --- a/src/Resources/config/serialization/Commands/Wishlist/CreateWishlist.xml +++ b/config/serialization/Commands/Wishlist/CreateWishlist.xml @@ -3,12 +3,12 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping https://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd" > - + - shop:wishlist:create + sylius_wishlist:shop:wishlist:create - shop:wishlist:create + sylius_wishlist:shop:wishlist:create diff --git a/src/Resources/config/serialization/Product.xml b/config/serialization/Product.xml similarity index 78% rename from src/Resources/config/serialization/Product.xml rename to config/serialization/Product.xml index 01bd7b03..c6c39b73 100644 --- a/src/Resources/config/serialization/Product.xml +++ b/config/serialization/Product.xml @@ -5,8 +5,8 @@ > - shop:wishlist:read - shop:wishlist:create + sylius_wishlist:shop:wishlist:read + sylius_wishlist:shop:wishlist:create diff --git a/src/Resources/config/serialization/ProductVariant.xml b/config/serialization/ProductVariant.xml similarity index 88% rename from src/Resources/config/serialization/ProductVariant.xml rename to config/serialization/ProductVariant.xml index 233a2e79..6f4af35c 100644 --- a/src/Resources/config/serialization/ProductVariant.xml +++ b/config/serialization/ProductVariant.xml @@ -5,7 +5,7 @@ > - shop:wishlist:read + sylius_wishlist:shop:wishlist:read diff --git a/src/Resources/config/serialization/ShopUser.xml b/config/serialization/ShopUser.xml similarity index 80% rename from src/Resources/config/serialization/ShopUser.xml rename to config/serialization/ShopUser.xml index 122c27dd..e44da7aa 100644 --- a/src/Resources/config/serialization/ShopUser.xml +++ b/config/serialization/ShopUser.xml @@ -5,10 +5,10 @@ > - shop:wishlist:read + sylius_wishlist:shop:wishlist:read - shop:wishlist:read + sylius_wishlist:shop:wishlist:read diff --git a/src/Resources/config/serialization/Wishlist.xml b/config/serialization/Wishlist.xml similarity index 65% rename from src/Resources/config/serialization/Wishlist.xml rename to config/serialization/Wishlist.xml index e1f54231..e250a305 100644 --- a/src/Resources/config/serialization/Wishlist.xml +++ b/config/serialization/Wishlist.xml @@ -3,18 +3,18 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping https://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd" > - + - shop:wishlist:read + sylius_wishlist:shop:wishlist:read - shop:wishlist:read + sylius_wishlist:shop:wishlist:read - shop:wishlist:read + sylius_wishlist:shop:wishlist:read - shop:wishlist:read + sylius_wishlist:shop:wishlist:read diff --git a/src/Resources/config/serialization/WishlistProduct.xml b/config/serialization/WishlistProduct.xml similarity index 67% rename from src/Resources/config/serialization/WishlistProduct.xml rename to config/serialization/WishlistProduct.xml index 77dde373..ba4fc5ba 100644 --- a/src/Resources/config/serialization/WishlistProduct.xml +++ b/config/serialization/WishlistProduct.xml @@ -3,15 +3,15 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://symfony.com/schema/dic/serializer-mapping https://symfony.com/schema/dic/serializer-mapping/serializer-mapping-1.0.xsd" > - + - shop:wishlist:read + sylius_wishlist:shop:wishlist:read - shop:wishlist:read + sylius_wishlist:shop:wishlist:read - shop:wishlist:read + sylius_wishlist:shop:wishlist:read diff --git a/src/Resources/config/services.xml b/config/services.xml similarity index 100% rename from src/Resources/config/services.xml rename to config/services.xml diff --git a/src/Resources/config/services/command.xml b/config/services/command.xml similarity index 61% rename from src/Resources/config/services/command.xml rename to config/services/command.xml index 4ac02aab..a50bdb9d 100644 --- a/src/Resources/config/services/command.xml +++ b/config/services/command.xml @@ -5,8 +5,10 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - - + + diff --git a/config/services/context.xml b/config/services/context.xml new file mode 100644 index 00000000..35e24d6f --- /dev/null +++ b/config/services/context.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + diff --git a/config/services/context_builders.xml b/config/services/context_builders.xml new file mode 100644 index 00000000..3c85aaf6 --- /dev/null +++ b/config/services/context_builders.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + diff --git a/config/services/controller.xml b/config/services/controller.xml new file mode 100644 index 00000000..c33c2259 --- /dev/null +++ b/config/services/controller.xml @@ -0,0 +1,204 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Resources/config/services/data_transformer.xml b/config/services/data_transformer.xml similarity index 63% rename from src/Resources/config/services/data_transformer.xml rename to config/services/data_transformer.xml index 0e8bcc1e..d4f0c468 100644 --- a/src/Resources/config/services/data_transformer.xml +++ b/config/services/data_transformer.xml @@ -5,7 +5,7 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - + diff --git a/config/services/denormalizer.xml b/config/services/denormalizer.xml new file mode 100644 index 00000000..f63efe71 --- /dev/null +++ b/config/services/denormalizer.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + diff --git a/src/Resources/config/services/duplicator.xml b/config/services/duplicator.xml similarity index 61% rename from src/Resources/config/services/duplicator.xml rename to config/services/duplicator.xml index d5a22146..3df45f03 100644 --- a/src/Resources/config/services/duplicator.xml +++ b/config/services/duplicator.xml @@ -5,10 +5,10 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - - + + - + diff --git a/config/services/event.xml b/config/services/event.xml new file mode 100644 index 00000000..ddf698b5 --- /dev/null +++ b/config/services/event.xml @@ -0,0 +1,25 @@ + + + + + + %sylius_wishlist_plugin.parameters.wishlist_cookie_token% + + + + + + + + + + + + + + + + diff --git a/config/services/exporter.xml b/config/services/exporter.xml new file mode 100644 index 00000000..32871d6a --- /dev/null +++ b/config/services/exporter.xml @@ -0,0 +1,18 @@ + + + + + + + + + + + + + + + diff --git a/src/Resources/config/services/facade.xml b/config/services/facade.xml similarity index 58% rename from src/Resources/config/services/facade.xml rename to config/services/facade.xml index 9997f17d..0c7ab3b5 100644 --- a/src/Resources/config/services/facade.xml +++ b/config/services/facade.xml @@ -5,8 +5,8 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - - + + diff --git a/config/services/factory.xml b/config/services/factory.xml new file mode 100644 index 00000000..bbbe9b02 --- /dev/null +++ b/config/services/factory.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/services/form.xml b/config/services/form.xml new file mode 100644 index 00000000..589c5874 --- /dev/null +++ b/config/services/form.xml @@ -0,0 +1,35 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Resources/config/services/generator.xml b/config/services/generator.xml similarity index 53% rename from src/Resources/config/services/generator.xml rename to config/services/generator.xml index 8b0dab01..4e0957b6 100644 --- a/src/Resources/config/services/generator.xml +++ b/config/services/generator.xml @@ -5,9 +5,9 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - - - + + + diff --git a/config/services/message_handler.xml b/config/services/message_handler.xml new file mode 100644 index 00000000..6c99dc50 --- /dev/null +++ b/config/services/message_handler.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + %sylius_wishlist_plugin.parameters.wishlist_cookie_token% + + + + + + + + + + + + + + + + + + + + + + + + + + + %sylius_wishlist_plugin.parameters.allowed_mime_types% + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/services/processor.xml b/config/services/processor.xml new file mode 100644 index 00000000..daeef6eb --- /dev/null +++ b/config/services/processor.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/config/services/resolver.xml b/config/services/resolver.xml new file mode 100644 index 00000000..23787757 --- /dev/null +++ b/config/services/resolver.xml @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + %sylius_wishlist_plugin.parameters.wishlist_cookie_token% + + + + + + + + + + + + + + + sylius_shop_product_thumbnail + + + diff --git a/src/Resources/config/services/twig.xml b/config/services/twig.xml similarity index 53% rename from src/Resources/config/services/twig.xml rename to config/services/twig.xml index 63d0c05d..762e73a0 100644 --- a/src/Resources/config/services/twig.xml +++ b/config/services/twig.xml @@ -5,9 +5,9 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - - - + + + diff --git a/config/services/twig/component/product.xml b/config/services/twig/component/product.xml new file mode 100644 index 00000000..112e274d --- /dev/null +++ b/config/services/twig/component/product.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/src/Resources/config/services/wishlist_voter.xml b/config/services/wishlist_voter.xml similarity index 78% rename from src/Resources/config/services/wishlist_voter.xml rename to config/services/wishlist_voter.xml index 8ee6b438..1c8aca3b 100644 --- a/src/Resources/config/services/wishlist_voter.xml +++ b/config/services/wishlist_voter.xml @@ -5,7 +5,7 @@ http://symfony.com/schema/dic/services/services-1.0.xsd"> - + diff --git a/doc/01-installation.md b/doc/01-installation.md index d9c4f27c..5dd9e65c 100644 --- a/doc/01-installation.md +++ b/doc/01-installation.md @@ -1,4 +1,4 @@ -# BitBag SyliusWishlistPlugin +# SyliusWishlistPlugin - [⬅️ Back](../README.md#overview) - [➡️ Usage](./02-usage.md) @@ -9,7 +9,7 @@ 1. *We work on stable, supported and up-to-date versions of packages. We recommend you to do the same.* ```bash -composer require bitbag/wishlist-plugin +composer require sylius/wishlist-plugin ``` 2. (optional) Add plugin dependencies to your `config/bundles.php` file: @@ -20,7 +20,7 @@ composer require bitbag/wishlist-plugin return [ ... - BitBag\SyliusWishlistPlugin\BitBagSyliusWishlistPlugin::class => ['all' => true], + Sylius\WishlistPlugin\SyliusWishlistPlugin::class => ['all' => true], ]; ``` @@ -30,82 +30,43 @@ return [ # config/packages/_sylius.yaml imports: ... - - { resource: "@BitBagSyliusWishlistPlugin/Resources/config/config.yml" } + - { resource: "@SyliusWishlistPlugin/config/config.yaml" } ``` 4. (optional) Import routing in your `config/routes.yaml` file: ```yaml # config/routes.yaml -bitbag_sylius_wishlist_plugin: - resource: "@BitBagSyliusWishlistPlugin/Resources/config/routing.yml" +sylius_wishlist_plugin: + resource: "@SyliusWishlistPlugin/config/routes.yaml" ``` -5. Override `OrderItemController` - -```yaml -sylius_order: - resources: - order_item: - classes: - controller: BitBag\SyliusWishlistPlugin\Controller\OrderItemController +5. Create `bundles/SyliusShopBundle/product/common` directory in your project `templates` dir if it does not exist yet: +```bash +mkdir -p templates/bundles/SyliusShopBundle/product/common ``` -6. Add plugin templates: +6. Copy `@SyliusShopBundle/product/common/card.html.twig` template in your project: -- Inject blocks: - -```yaml -sylius_ui: - events: - sylius.shop.layout.header.grid: - blocks: - cart: - template: "@BitBagSyliusWishlistPlugin/_cart.html.twig" - priority: 10 - sylius.shop.product.index.box: - blocks: - content: - template: "@BitBagSyliusWishlistPlugin/Product/Box/_content.html.twig" - priority: 10 - sylius.shop.layout.javascripts: - blocks: - plugin_scripts: - template: "@BitBagSyliusWishlistPlugin/Shop/_scripts.html.twig" - priority: 20 - sylius.shop.layout.stylesheets: - blocks: - plugin_stylesheets: - template: "@BitBagSyliusWishlistPlugin/Shop/_styles.html.twig" - priority: 20 - sylius.admin.layout.javascripts: - blocks: - plugin_scripts: - template: "@BitBagSyliusWishlistPlugin/Admin/_scripts.html.twig" - priority: 20 - sylius.admin.layout.stylesheets: - blocks: - plugin_stylesheets: - template: "@BitBagSyliusWishlistPlugin/Admin/_styles.html.twig" - priority: 20 - +```bash +cp vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle/templates/product/common/card.html.twig templates/bundles/SyliusShopBundle/product/common/card.html.twig ``` -- Override templates: +7. Add the following code to the end of the `card.html.twig` file, just before latest closing `` tag: -```bash -mkdir -p templates/bundles/SyliusShopBundle/Product/Show -cp vendor/bitbag/wishlist-plugin/src/Resources/views/Product/Show/_addToCart.html.twig templates/bundles/SyliusShopBundle/Product/Show +```twig +
+{% include '@SyliusWishlistPlugin/common/add_to_wishlist.html.twig' %} ``` -7. Clear application cache by using command: +8. Clear application cache by using command: ```bash bin/console cache:clear ``` -8. Update your database +9. Update your database ```bash bin/console doctrine:migrations:migrate @@ -113,21 +74,13 @@ bin/console doctrine:migrations:migrate **Note:** If you are running it on production, add the `-e prod` flag to this command. -9. Add plugin assets to your project - -We recommend you to use Webpack (Encore), for which we have prepared four different instructions on how to add this plugin's assets to your project: - -- [Import webpack config](./01.1-webpack-config.md)* -- [Add entry to existing config](./01.2-webpack-entry.md) -- [Import entries in your entry.js files](./01.3-import-entry.md) -- [Your own custom config](./01.4-custom-solution.md) +10. Add plugin assets to your project -* Default option for plugin development +Just add to your `asssets/admin/entrypoint.js` and `assets/shop/entrypoint.js` the following line (create these files if it does not exist yet): - -However, if you are not using Webpack, here are instructions on how to add optimized and compressed assets directly to your project templates: - -- [Non webpack solution](./01.5-non-webpack.md) +```javascript +import '../../vendor/sylius/wishlist-plugin/assets/entrypoint'; +``` ## Asynchronous Messenger case @@ -142,7 +95,7 @@ framework: transports: sync: 'sync://' routing: - 'BitBag\SyliusWishlistPlugin\Command\Wishlist\WishlistSyncCommandInterface': sync + 'Sylius\WishlistPlugin\Command\Wishlist\WishlistSyncCommandInterface': sync ``` All commands from the plugin implement the `WishlistSyncCommandInterface` interface, so there is no need for other configuration. diff --git a/doc/01.1-webpack-config.md b/doc/01.1-webpack-config.md deleted file mode 100644 index 6817dcb3..00000000 --- a/doc/01.1-webpack-config.md +++ /dev/null @@ -1,67 +0,0 @@ -# BitBag SyliusWishlistPlugin - -- [⬅️ Back](./01-installation.md) - -## Installation - Import Webpack Config - -- ✔️ Completely independent configuration -- ✔️ No need to add plugin assets globally (you can add it to specific pages) - -
- -1. Import plugin's `webpack.config.js` file - -```js -// webpack.config.js -const [ bitbagWishlistShop, bitbagWishlistAdmin ] = require('./vendor/bitbag/wishlist-plugin/webpack.config.js') -... - -module.exports = [..., bitbagWishlistShop, bitbagWishlistAdmin]; -``` - -2. Add new packages in `./config/packages/assets.yaml` - -```yml -# config/packages/assets.yaml - -framework: - assets: - packages: - # ... - shop: - json_manifest_path: '%kernel.project_dir%/public/build/shop/manifest.json' - wishlist_shop: - json_manifest_path: '%kernel.project_dir%/public/build/bitbag/wishlist/shop/manifest.json' - wishlist_admin: - json_manifest_path: '%kernel.project_dir%/public/build/bitbag/wishlist/admin/manifest.json' -``` - -3. Add new build paths in `./config/packages/webpack_encore.yml` - -```yml -# config/packages/webpack_encore.yml - -webpack_encore: - builds: - # ... - wishlist_shop: '%kernel.project_dir%/public/build/bitbag/wishlist/shop' - wishlist_admin: '%kernel.project_dir%/public/build/bitbag/wishlist/admin' -``` - -4. Add encore functions to your templates - -```twig -{# @SyliusShopBundle/_scripts.html.twig #} -{{ encore_entry_script_tags('bitbag-wishlist-shop', null, 'wishlist_shop') }} - -{# @SyliusShopBundle/_styles.html.twig #} -{{ encore_entry_link_tags('bitbag-wishlist-shop', null, 'wishlist_shop') }} - -{# @SyliusAdminBundle/_scripts.html.twig #} -{{ encore_entry_script_tags('bitbag-wishlist-admin', null, 'wishlist_admin') }} - -{# @SyliusAdminBundle/_styles.html.twig #} -{{ encore_entry_link_tags('bitbag-wishlist-admin', null, 'wishlist_admin') }} -``` - -5. Run `yarn encore dev` or `yarn encore production` diff --git a/doc/01.2-webpack-entry.md b/doc/01.2-webpack-entry.md deleted file mode 100644 index 3ab9ca2d..00000000 --- a/doc/01.2-webpack-entry.md +++ /dev/null @@ -1,39 +0,0 @@ -# BitBag SyliusWishlistPlugin - -- [⬅️ Back](./01-installation.md) - -## Installation - Add new entry to existing configs - -- ✔️ Same webpack configuration for plugin and project assets -- ✔️ No need to add plugin assets globally (you can add it to specific pages) - -
- -1. Add new entries to your `webpack.config.js` -```js -// ./webpack.config.js - -// Shop config - .addEntry('bitbag-wishlist-shop', 'vendor/bitbag/wishlist-plugin/src/Resources/assets/shop/entry.js') - -// Admin config - .addEntry('bitbag-wishlist-admin', 'vendor/bitbag/wishlist-plugin/src/Resources/assets/admin/entry.js') -``` - -2. Add encore functions to your templates - -```twig -{# @SyliusShopBundle/_scripts.html.twig #} -{{ encore_entry_script_tags('bitbag-wishlist-shop', null, 'shop') }} - -{# @SyliusShopBundle/_styles.html.twig #} -{{ encore_entry_link_tags('bitbag-wishlist-shop', null, 'shop') }} - -{# @SyliusAdminBundle/_scripts.html.twig #} -{{ encore_entry_script_tags('bitbag-wishlist-admin', null, 'admin') }} - -{# @SyliusAdminBundle/_styles.html.twig #} -{{ encore_entry_link_tags('bitbag-wishlist-admin', null, 'admin') }} -``` - -3. Run `yarn encore dev` or `yarn encore production` diff --git a/doc/01.3-import-entry.md b/doc/01.3-import-entry.md deleted file mode 100644 index 73f5c0e1..00000000 --- a/doc/01.3-import-entry.md +++ /dev/null @@ -1,21 +0,0 @@ -# BitBag SyliusWishlistPlugin - -- [⬅️ Back](./01-installation.md) - -## Installation - Import plugin entry into existing project entry.js files - -- ✔️ Same webpack configuration for plugin and project assets -- ✔️ No need to edit templates - it's good for quick testing -- ⚠ Assets are loaded globally which can affect page speed - -
- -1. Just add these imports into your entry.js files - -```js -// ./assets/shop/entry.js -import '../../vendor/bitbag/wishlist-plugin/src/Resources/assets/shop/entry.js'; - -// ./assets/admin/entry.js -import '../../vendor/bitbag/wishlist-plugin/src/Resources/assets/admin/entry.js'; -``` diff --git a/doc/01.4-custom-solution.md b/doc/01.4-custom-solution.md deleted file mode 100644 index 936c9abf..00000000 --- a/doc/01.4-custom-solution.md +++ /dev/null @@ -1,36 +0,0 @@ -# BitBag SyliusWishlistPlugin - -- [⬅️ Back](./01-installation.md) - -## Installation - Custom solution - -If none of the previous methods work for your project, you can write your own encore configuration: - -Main entry points: - -```js -// shop -.addEntry('/vendor/bitbag/wishlist-plugin/src/Resources/assets/shop/entry.js') - -// admin -.addEntry('/vendor/bitbag/wishlist-plugin/src/Resources/assets/admin/entry.js') -``` - -Style entry points: - -```js -// shop -.addStyleEntry('/vendor/bitbag/wishlist-plugin/src/Resources/assets/shop/scss/main.scss') - -// admin -.addStyleEntry('/vendor/bitbag/wishlist-plugin/src/Resources/assets/admin/scss/main.scss') -``` - -Location of the pictures: - -- shop: `/vendor/bitbag/wishlist-plugin/src/Resources/assets/shop/images/*` -- admin: `/vendor/bitbag/wishlist-plugin/src/Resources/assets/admin/images/*` - ---- - -More information: [Advanced Webpack Config](https://symfony.com/doc/current/frontend/encore/advanced-config.html) \ No newline at end of file diff --git a/doc/01.5-non-webpack.md b/doc/01.5-non-webpack.md deleted file mode 100644 index ebef2dc6..00000000 --- a/doc/01.5-non-webpack.md +++ /dev/null @@ -1,40 +0,0 @@ -# BitBag SyliusWishlistPlugin - -- [⬅️ Back](./01-installation.md) - -## Installation - Non-webpack solution - -- ✔️ No need to have a bundler on the project -- ✔️ No need to add plugin assets globally (you can add it to specific pages) -- ✖️ No possibility to edit/extend assets - -
- -1. Install plugin assets using: - -```bash -bin/console assets:install -``` - -2. Add twig inclusions in your templates: -```twig -{# @SyliusAdminBundle/_scripts.html.twig #} -{% include '@SyliusUi/_javascripts.html.twig' with { - 'path': 'bundles/bitbagsyliuswishlistplugin/bitbag-wishlist-admin.js' -} %} - -{# @SyliusAdminBundle/_styles.html.twig #} -{% include '@SyliusUi/_stylesheets.html.twig' with { - 'path': 'bundles/bitbagsyliuswishlistplugin/bitbag-wishlist-admin.css' -} %} - -{# @SyliusShopBundle/_scripts.html.twig #} -{% include '@SyliusUi/_javascripts.html.twig' with { - 'path': 'bundles/bitbagsyliuswishlistplugin/bitbag-wishlist-shop.js' -} %} - -{# @SyliusShopBundle/_styles.html.twig #} -{% include '@SyliusUi/_stylesheets.html.twig' with { - 'path': 'bundles/bitbagsyliuswishlistplugin/bitbag-wishlist-shop.css' -} %} -``` diff --git a/doc/02-usage.md b/doc/02-usage.md index fcedbf91..0af2623d 100644 --- a/doc/02-usage.md +++ b/doc/02-usage.md @@ -1,4 +1,4 @@ -# BitBag SyliusWishlistPlugin +# SyliusWishlistPlugin - [⬅️ Back](../README.md#overview) - [➡️ Customization](./03-customization.md) @@ -11,8 +11,6 @@ You can use these templates to enable adding/removing/displaying wishlist: -- `@BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig` -- `@BitBagSyliusWishlistPlugin/Common/_removeFromWishlist.html.twig` -- `@BitBagSyliusWishlistPlugin/Common/widget.html.twig` - -For an example on how to do that, take a look at [these source files](https://github.com/BitBagCommerce/SyliusWishlistPlugin/tree/master/tests/Application/templates/bundles/SyliusShopBundle). +- `@SyliusWishlistPlugin/common/add_to_wishlist.html.twig` +- `@SyliusWishlistPlugin/common/remove_from_wishlist.html.twig` +- `@SyliusWishlistPlugin/common/widget.html.twig` diff --git a/doc/03-customization.md b/doc/03-customization.md index 36b21de3..eaff0680 100644 --- a/doc/03-customization.md +++ b/doc/03-customization.md @@ -1,4 +1,4 @@ -# BitBag SyliusWishlistPlugin +# SyliusWishlistPlugin - [⬅️ Back](../README.md#overview) - [➡️ Development](./04-development.md) @@ -9,11 +9,10 @@ Run the below command to see what Symfony services are shared with this plugin: ```bash -bin/console debug:container | grep bitbag_sylius_wishlist_plugin +bin/console debug:container | grep sylius_wishlist_plugin ``` ### List of parameters you can override in your parameters.yml(.dist) file ```bash -bin/console debug:container --parameters | grep bitbag bin/console debug:container --parameters | grep wishlist ``` diff --git a/doc/04-development.md b/doc/04-development.md index 8d8c5f27..af9e212e 100644 --- a/doc/04-development.md +++ b/doc/04-development.md @@ -1,4 +1,4 @@ -# BitBag SyliusWishlistPlugin +# SyliusWishlistPlugin - [⬅️ Back](../README.md#overview) - [➡️ Testing](./05-testing.md) @@ -8,8 +8,6 @@ - [Installation](#installation) - [Development](#development) - [Frontend](#frontend) -- [Docker](#docker) - #### Installation @@ -29,16 +27,6 @@ bin/console doctrine:database:create bin/console doctrine:schema:create bin/console sylius:fixtures:load bin/console assets:install --symlink -``` - -Copy `package.json.~1.xx.dist` file to `package.json` for specific version of Sylius (example for 1.12.0): -```bash -cp package.json.\~1.12.dist package.json -``` - -Then: - -```bash yarn install yarn dev ``` @@ -68,18 +56,3 @@ yarn watch It's an infinite process, which will watch your changes in the assets folder and (re)build them. So all of your frontend changes should be done in `{root}/src/Resources/assets` directory. We have configured two independent entry points that should not be combined - `shop` for the storefront and `admin` for the admin panel. > **⚠ Note**: Before every commit, you should type the `yarn dist` command from the plugin root directory to rebuild dist assets, which are located in `{root}/src/Resources/public`.

You also shouldn't add assets to this folder manually because **they will be removed automatically** - -#### Docker - -To test plugin with docker You can use: - -```bash -$ docker-compose up -$ docker-compose exec -it app composer install -$ docker-compose exec -it app yarn install -$ docker-compose exec -it -w /app/tests/Application app bin/console d:d:c -$ docker-compose exec -it -w /app/tests/Application app bin/console d:s:c -$ docker-compose exec -it -w /app/tests/Application app bin/console sy:fi:lo -q -``` - -This should make sure test app from docker container is up and running. diff --git a/doc/05-testing.md b/doc/05-testing.md index 1e5d6ac1..0090acea 100644 --- a/doc/05-testing.md +++ b/doc/05-testing.md @@ -1,4 +1,4 @@ -# BitBag SyliusWishlistPlugin +# SyliusWishlistPlugin - [⬅️ Back](../README.md#overview) @@ -7,11 +7,7 @@ ```bash composer install cd tests/Application -``` - -Then: -```bash yarn install yarn dev APP_ENV=test bin/console assets:install public diff --git a/doc/images/add_homepage.png b/doc/images/add_homepage.png index 94518e03..10f8291f 100644 Binary files a/doc/images/add_homepage.png and b/doc/images/add_homepage.png differ diff --git a/doc/images/add_productpage.png b/doc/images/add_productpage.png index a146723d..9892835b 100644 Binary files a/doc/images/add_productpage.png and b/doc/images/add_productpage.png differ diff --git a/doc/images/add_taxon.png b/doc/images/add_taxon.png index 66438f9f..441eab27 100644 Binary files a/doc/images/add_taxon.png and b/doc/images/add_taxon.png differ diff --git a/doc/images/add_wishlist.png b/doc/images/add_wishlist.png index 601a45c9..2ceca57c 100644 Binary files a/doc/images/add_wishlist.png and b/doc/images/add_wishlist.png differ diff --git a/doc/images/index.png b/doc/images/index.png index 11f619a5..e591d9b9 100644 Binary files a/doc/images/index.png and b/doc/images/index.png differ diff --git a/doc/images/logo.png b/doc/images/logo.png deleted file mode 100644 index 80135c62..00000000 Binary files a/doc/images/logo.png and /dev/null differ diff --git a/doc/images/wishlist.png b/doc/images/wishlist.png index bf9e188e..a031c8c1 100644 Binary files a/doc/images/wishlist.png and b/doc/images/wishlist.png differ diff --git a/doc/images/wishlists.png b/doc/images/wishlists.png index 2fd98d40..8d35bd2a 100644 Binary files a/doc/images/wishlists.png and b/doc/images/wishlists.png differ diff --git a/doc/images/wishlists_view.png b/doc/images/wishlists_view.png index 70ea8e24..2bf757c9 100644 Binary files a/doc/images/wishlists_view.png and b/doc/images/wishlists_view.png differ diff --git a/ecs.php b/ecs.php index 7a2212bd..84242129 100644 --- a/ecs.php +++ b/ecs.php @@ -5,9 +5,6 @@ use Symplify\EasyCodingStandard\Config\ECSConfig; return static function (ECSConfig $config): void { - - putenv('ALLOW_BITBAG_OS_HEADER=1'); - - $config->import('vendor/bitbag/coding-standard/ecs.php'); + $config->import('vendor/sylius-labs/coding-standard/ecs.php'); $config->paths(['src', 'spec', 'tests/Integration', 'tests/Behat', 'tests/Functional']); }; diff --git a/features/adding_wishlist_product_to_cart.feature b/features/adding_wishlist_product_to_cart.feature index a5ecf8ab..5b988c24 100644 --- a/features/adding_wishlist_product_to_cart.feature +++ b/features/adding_wishlist_product_to_cart.feature @@ -7,7 +7,7 @@ Feature: Adding wishlist product to cart Background: Given the store operates on a single channel in "United States" - @ui + @ui @javascript Scenario: Adding a wishlist product to cart Given the store has a product "Jack Daniels Gentleman" priced at "$10.00" And all store products appear under a main taxonomy @@ -29,7 +29,7 @@ Feature: Adding wishlist product to cart And I add my wishlist products to cart Then I should be notified that "Jack Daniels Gentleman" does not have sufficient stock - @ui + @ui @javascript Scenario: Adding selected wishlist products to cart Given the store has a product "Jack Daniels Gentleman" priced at "$10.00" And all store products appear under a main taxonomy diff --git a/features/assigning_wishlist_to_user.feature b/features/assigning_wishlist_to_user.feature index 088f38b3..ad8b585c 100644 --- a/features/assigning_wishlist_to_user.feature +++ b/features/assigning_wishlist_to_user.feature @@ -13,7 +13,7 @@ Feature: Assigning a wishlist to a user @ui Scenario: Listing wishlists When I go to "/" - And I log in as "jdeer@sylius.pl" + And I log in as "jdeer@sylius.pl" with "sylius" password And I go to "/wishlists" Then I should have 2 wishlists @@ -23,9 +23,8 @@ Feature: Assigning a wishlist to a user And all store products appear under a main taxonomy And I add this product to wishlist When I go to "/" - And I log in as "jdeer@sylius.pl" + And I log in as "jdeer@sylius.pl" with "sylius" password And I go to "/wishlists" - And I follow "Save wishlist" Then I should have 3 wishlists And I should not see "Save wishlist" @@ -34,7 +33,7 @@ Feature: Assigning a wishlist to a user When I go to "/" And I go to "/wishlists" And I should have 0 wishlists - And I log in as "jdeer@sylius.pl" + And I log in as "jdeer@sylius.pl" with "sylius" password And I go to "/wishlists" And I should have 2 wishlists And I press "wishlist-edit-button-Wishlist1" diff --git a/features/restricting_access_to_other_user_wishlist.feature b/features/restricting_access_to_other_user_wishlist.feature index e8cd8b09..5e4d3364 100644 --- a/features/restricting_access_to_other_user_wishlist.feature +++ b/features/restricting_access_to_other_user_wishlist.feature @@ -14,7 +14,7 @@ Feature: Restricting access to other's user wishlist @ui Scenario: Restricting access to other users wishlist When I go to "/" - And I log in as "jdeer@sylius.pl" + And I log in as "jdeer@sylius.pl" with "sylius" password And I go to "/wishlists" Then I should have 1 wishlists When I try to access "jdeer2@sylius.pl" wishlist "Wishlist2" diff --git a/package.json b/package.json deleted file mode 100644 index 171e6f5f..00000000 --- a/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "@bitbag/wishlist-plugin", - "description": "Wishlist plugin for Sylius.", - "repository": "https://github.com/BitBagCommerce/SyliusWishlistPlugin.git", - "license": "MIT", - "scripts": { - "dist": "yarn encore production --config-name bitbag-plugin-dist" - } -} diff --git a/phpspec.yml.dist b/phpspec.yml.dist index 94bcaba0..d0bee51a 100644 --- a/phpspec.yml.dist +++ b/phpspec.yml.dist @@ -1,4 +1,4 @@ suites: main: - namespace: BitBag\SyliusWishlistPlugin - psr4_prefix: BitBag\SyliusWishlistPlugin + namespace: Sylius\WishlistPlugin + psr4_prefix: Sylius\WishlistPlugin diff --git a/phpstan.neon b/phpstan.neon index cfc0bd42..b165dafe 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,7 +1,10 @@ includes: - - vendor/bitbag/coding-standard/phpstan.neon + - vendor/phpstan/phpstan-doctrine/extension.neon + - vendor/phpstan/phpstan-webmozart-assert/extension.neon + parameters: - level: 8 + level: 3 + reportUnmatchedIgnoredErrors: false excludePaths: - src/Exception - tests/Integration diff --git a/phpunit.xml.dist b/phpunit.xml.dist index 14218120..4c170f67 100755 --- a/phpunit.xml.dist +++ b/phpunit.xml.dist @@ -14,7 +14,7 @@ - + @@ -23,7 +23,8 @@ - tests + tests/Functional + tests/Integration diff --git a/spec/Checker/ProductProcessingCheckerSpec.php b/spec/Checker/ProductProcessingCheckerSpec.php deleted file mode 100644 index 0b5627bf..00000000 --- a/spec/Checker/ProductProcessingCheckerSpec.php +++ /dev/null @@ -1,50 +0,0 @@ -shouldHaveType(ProductProcessingChecker::class); - } - - public function it_can_be_processed( - WishlistItem $wishlistProduct, - AddToCartCommandInterface $addToCartCommand, - OrderItemInterface $orderItem, - ): void { - $wishlistProduct->getCartItem()->willReturn($addToCartCommand); - $addToCartCommand->getCartItem()->willReturn($orderItem); - $orderItem->getQuantity()->willReturn(5); - - $this->canBeProcessed($wishlistProduct)->shouldReturn(true); - } - - public function it_cannot_be_processed( - WishlistItem $wishlistProduct, - AddToCartCommandInterface $addToCartCommand, - OrderItemInterface $orderItem, - ): void { - $wishlistProduct->getCartItem()->willReturn($addToCartCommand); - $addToCartCommand->getCartItem()->willReturn($orderItem); - $orderItem->getQuantity()->willReturn(0); - - $this->canBeProcessed($wishlistProduct)->shouldReturn(false); - } -} diff --git a/spec/Checker/ProductQuantityCheckerSpec.php b/spec/Checker/ProductQuantityCheckerSpec.php deleted file mode 100644 index c2468ac0..00000000 --- a/spec/Checker/ProductQuantityCheckerSpec.php +++ /dev/null @@ -1,40 +0,0 @@ -shouldHaveType(ProductQuantityChecker::class); - } - - public function it_has_positive_number_of_products( - OrderItemInterface $product, - ): void { - $product->getQuantity()->willReturn(4); - - $this->hasPositiveQuantity($product)->shouldReturn(true); - } - - public function it_has_zero_products( - OrderItemInterface $product, - ): void { - $product->getQuantity()->willReturn(0); - - $this->hasPositiveQuantity($product)->shouldReturn(false); - } -} diff --git a/spec/Checker/WishlistNameCheckerSpec.php b/spec/Checker/WishlistNameCheckerSpec.php deleted file mode 100644 index c3d7001a..00000000 --- a/spec/Checker/WishlistNameCheckerSpec.php +++ /dev/null @@ -1,39 +0,0 @@ -shouldHaveType(WishlistNameChecker::class); - } - - public function it_returns_true_if_names_are_equal(): void - { - $existingWishlistName = 'test1'; - $wishlistToCreate = 'test1'; - - $this->check($existingWishlistName, $wishlistToCreate)->shouldReturn(true); - } - - public function it_returns_false_if_names_are_not_equal(): void - { - $existingWishlistName = 'test1'; - $wishlistToCreate = 'test2'; - - $this->check($existingWishlistName, $wishlistToCreate)->shouldReturn(false); - } -} diff --git a/spec/CommandHandler/Wishlist/AddProductToSelectedWishlistHandlerSpec.php b/spec/CommandHandler/Wishlist/AddProductToSelectedWishlistHandlerSpec.php index c579e0fc..45399a87 100644 --- a/spec/CommandHandler/Wishlist/AddProductToSelectedWishlistHandlerSpec.php +++ b/spec/CommandHandler/Wishlist/AddProductToSelectedWishlistHandlerSpec.php @@ -1,24 +1,26 @@ isGranted(ResourceActions::DELETE, null)->willReturn(true); + $this->beConstructedWith( $productRepository, $wishlistRepository, $wishlistProductRepository, $wishlistManager, + $authorizationChecker, ); } @@ -53,16 +52,17 @@ public function it_removes_product_from_wishlist( ProductInterface $product, WishlistInterface $wishlist, WishlistProductInterface $wishlistProduct, + AuthorizationCheckerInterface $authorizationChecker, ): void { $removeProductCommand = new RemoveProductFromWishlist(1, 'wishlist_token'); $productRepository->find(1)->willReturn($product); $wishlistRepository->findByToken('wishlist_token')->willReturn($wishlist); - $wishlistProductRepository - ->findOneBy(['product' => $product, 'wishlist' => $wishlist]) - ->willReturn($wishlistProduct); + $wishlistProductRepository->findOneBy(['product' => $product, 'wishlist' => $wishlist])->willReturn($wishlistProduct); + + $authorizationChecker->isGranted(ResourceActions::DELETE, $wishlist)->willReturn(true); - $wishlist->removeProduct($wishlistProduct)->willReturn($wishlist); + $wishlist->removeProduct($wishlistProduct)->shouldBeCalled(); $wishlistManager->flush()->shouldBeCalled(); $this->__invoke($removeProductCommand)->shouldReturn($wishlist); @@ -82,16 +82,10 @@ public function it_throws_exception_when_wishlist_not_found( ProductRepositoryInterface $productRepository, WishlistRepositoryInterface $wishlistRepository, ProductInterface $product, - WishlistProductInterface $wishlistProduct, - RepositoryInterface $wishlistProductRepository, ): void { $removeProductCommand = new RemoveProductFromWishlist(1, 'wishlist_token'); $productRepository->find(1)->willReturn($product); - $wishlistProductRepository->findOneBy([ - 'product' => $product, - 'wishlist' => null, - ])->willReturn($wishlistProduct); $wishlistRepository->findByToken('wishlist_token')->willReturn(null); $this->shouldThrow(WishlistNotFoundException::class)->during('__invoke', [$removeProductCommand]); diff --git a/spec/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandlerSpec.php b/spec/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandlerSpec.php index 94d67ab6..9dfa3a5b 100644 --- a/spec/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandlerSpec.php +++ b/spec/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandlerSpec.php @@ -1,28 +1,23 @@ beConstructedWith( $wishlistRepository, $productVariantRepository, $wishlistProductRepository, $wishlistManager, + $authorizationChecker, ); } @@ -53,14 +50,17 @@ public function it_removes_product_variant_from_wishlist( ProductVariantInterface $variant, WishlistInterface $wishlist, WishlistProductInterface $wishlistProduct, + AuthorizationCheckerInterface $authorizationChecker, ): void { $removeProductVariantCommand = new RemoveProductVariantFromWishlist(1, 'wishlist_token'); $productVariantRepository->find(1)->willReturn($variant); - $wishlistProductRepository->findOneBy(['variant' => $variant])->willReturn($wishlistProduct); $wishlistRepository->findByToken('wishlist_token')->willReturn($wishlist); + $wishlistProductRepository->findOneBy(['variant' => $variant, 'wishlist' => $wishlist])->willReturn($wishlistProduct); + + $authorizationChecker->isGranted(ResourceActions::DELETE, $wishlist)->willReturn(true); - $wishlist->removeProductVariant($variant)->shouldBeCalled(); + $wishlist->removeProduct($wishlistProduct)->shouldBeCalled(); $wishlistManager->flush()->shouldBeCalled(); $this->__invoke($removeProductVariantCommand)->shouldReturn($wishlist); @@ -81,14 +81,15 @@ public function it_throws_exception_when_wishlist_not_found( WishlistRepositoryInterface $wishlistRepository, RepositoryInterface $wishlistProductRepository, ProductVariantInterface $variant, - WishlistProductInterface $wishlistProduct, + AuthorizationCheckerInterface $authorizationChecker, ): void { $removeProductVariantCommand = new RemoveProductVariantFromWishlist(1, 'wishlist_token'); $productVariantRepository->find(1)->willReturn($variant); - $wishlistProductRepository->findOneBy(['variant' => $variant])->willReturn($wishlistProduct); $wishlistRepository->findByToken('wishlist_token')->willReturn(null); + $authorizationChecker->isGranted(ResourceActions::DELETE, null)->willReturn(true); + $this->shouldThrow(WishlistNotFoundException::class)->during('__invoke', [$removeProductVariantCommand]); } } diff --git a/spec/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandlerSpec.php b/spec/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandlerSpec.php index 25189071..d20721f1 100644 --- a/spec/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandlerSpec.php +++ b/spec/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandlerSpec.php @@ -1,27 +1,29 @@ beConstructedWith( $tokenStorage, $wishlistRepository, $wishlistFactory, - 'bitbag_sylius_wishlist', + $wishlistCookieTokenResolver, $channelContext, $tokenUserResolver, ); @@ -63,9 +67,9 @@ public function it_creates_new_wishlist_if_no_cookie_and_user( WishlistFactoryInterface $wishlistFactory, WishlistInterface $wishlist, TokenUserResolverInterface $tokenUserResolver, + WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver, ): void { - $request->cookies = $parameterBag; - $parameterBag->get('bitbag_sylius_wishlist')->willReturn(null); + $wishlistCookieTokenResolver->resolve()->willReturn('nonexistent-token'); $tokenStorage->getToken()->willReturn($token); $tokenUserResolver->resolve($token)->willReturn(null); @@ -82,9 +86,9 @@ public function it_returns_cookie_wishlist_if_cookie_and_no_user( WishlistRepositoryInterface $wishlistRepository, WishlistInterface $wishlist, TokenUserResolverInterface $tokenUserResolver, + WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver, ): void { - $request->cookies = $parameterBag; - $parameterBag->get('bitbag_sylius_wishlist')->willReturn('Fq8N4W6mk12i9J2HX0U60POGG5UEzSgGW37OWd6sv2dd8FlBId'); + $wishlistCookieTokenResolver->resolve()->willReturn('Fq8N4W6mk12i9J2HX0U60POGG5UEzSgGW37OWd6sv2dd8FlBId'); $tokenStorage->getToken()->willReturn($token); $tokenUserResolver->resolve($token)->willReturn(null); $wishlistRepository->findByToken('Fq8N4W6mk12i9J2HX0U60POGG5UEzSgGW37OWd6sv2dd8FlBId')->willReturn($wishlist); @@ -101,9 +105,9 @@ public function it_returns_new_wishlist_if_cookie_not_found_and_no_user( WishlistFactoryInterface $wishlistFactory, WishlistInterface $wishlist, TokenUserResolverInterface $tokenUserResolver, + WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver, ): void { - $request->cookies = $parameterBag; - $parameterBag->get('bitbag_sylius_wishlist')->willReturn('Fq8N4W6mk12i9J2HX0U60POGG5UEzSgGW37OWd6sv2dd8FlBId'); + $wishlistCookieTokenResolver->resolve()->willReturn('Fq8N4W6mk12i9J2HX0U60POGG5UEzSgGW37OWd6sv2dd8FlBId'); $tokenStorage->getToken()->willReturn($token); $tokenUserResolver->resolve($token)->willReturn(null); $wishlistRepository->findByToken('Fq8N4W6mk12i9J2HX0U60POGG5UEzSgGW37OWd6sv2dd8FlBId')->willReturn(null); @@ -123,9 +127,9 @@ public function it_returns_user_wishlist_if_found_and_user_logged_in( ChannelContextInterface $channelContext, ChannelInterface $channel, TokenUserResolverInterface $tokenUserResolver, + WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver, ): void { - $request->cookies = $parameterBag; - $parameterBag->get('bitbag_sylius_wishlist')->willReturn(null); + $wishlistCookieTokenResolver->resolve()->willReturn('nonexistent-token'); $tokenStorage->getToken()->willReturn($token); $tokenUserResolver->resolve($token)->willReturn($shopUser); $channelContext->getChannel()->willReturn($channel); @@ -146,9 +150,9 @@ public function it_returns_new_wishlist_if_not_found_and_user_logged_in( ChannelContextInterface $channelContext, ChannelInterface $channel, TokenUserResolverInterface $tokenUserResolver, + WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver, ): void { - $request->cookies = $parameterBag; - $parameterBag->get('bitbag_sylius_wishlist')->willReturn(null); + $wishlistCookieTokenResolver->resolve()->willReturn('nonexistent-token'); $wishlistFactory->createNew()->willReturn($wishlist); $tokenStorage->getToken()->willReturn($token); $tokenUserResolver->resolve($token)->willReturn($shopUser); diff --git a/spec/Controller/Action/AddProductToWishlistActionSpec.php b/spec/Controller/Action/AddProductToWishlistActionSpec.php index 96b6aca9..1a9c3ad2 100644 --- a/spec/Controller/Action/AddProductToWishlistActionSpec.php +++ b/spec/Controller/Action/AddProductToWishlistActionSpec.php @@ -1,29 +1,31 @@ resolve()->willReturn('cookie-wishlist-token'); $wishlistProductFactory->createForWishlistAndProduct($wishlist1, $product)->willReturn($wishlistProduct); - $translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); $channelContext->getChannel()->willReturn($channel); $channel->getId()->willReturn(1); $wishlist1->getChannel()->willReturn($channel); @@ -133,7 +135,7 @@ public function it_handles_the_request_and_persist_new_wishlist_for_anonymous_us ObjectManager $wishlistManager, ChannelContextInterface $channelContext, ChannelInterface $channel, - ParameterBag $headers, + HeaderBag $headers, Session $session, FlashBagInterface $flashBag, WishlistCookieTokenResolverInterface $wishlistCookieTokenResolver, @@ -150,7 +152,7 @@ public function it_handles_the_request_and_persist_new_wishlist_for_anonymous_us $wishlistCookieTokenResolver->resolve()->willReturn('cookie-wishlist-token'); $wishlistProductFactory->createForWishlistAndProduct($wishlist1, $product)->willReturn($wishlistProduct); - $translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); $channelContext->getChannel()->willReturn($channel); $channel->getId()->willReturn(1); $wishlist1->getChannel()->willReturn($channel); diff --git a/spec/Controller/Action/AddProductVariantToWishlistActionSpec.php b/spec/Controller/Action/AddProductVariantToWishlistActionSpec.php index 5fd68ff3..e0a2001e 100644 --- a/spec/Controller/Action/AddProductVariantToWishlistActionSpec.php +++ b/spec/Controller/Action/AddProductVariantToWishlistActionSpec.php @@ -1,24 +1,26 @@ hasProductVariant($productVariant)->willReturn(false); $wishlistProductFactory->createForWishlistAndVariant($wishlist, $productVariant)->willReturn($wishlistProduct); - $translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); - $urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => 1])->willReturn('/wishlist/1'); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => 1])->willReturn('/wishlist/1'); $wishlist->addWishlistProduct($wishlistProduct)->shouldBeCalled(); $wishlistRepository->add($wishlist)->shouldBeCalled(); @@ -132,8 +134,8 @@ public function it_handles_the_request_and_persist_new_wishlist_for_anonymous_us $wishlist->hasProductVariant($productVariant)->willReturn(false); $wishlistProductFactory->createForWishlistAndVariant($wishlist, $productVariant)->willReturn($wishlistProduct); - $translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); - $urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => 1])->willReturn('/wishlist/1'); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product has been added to your wishlist.'); + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => 1])->willReturn('/wishlist/1'); $wishlist->addWishlistProduct($wishlistProduct)->shouldBeCalled(); $wishlistRepository->add($wishlist)->shouldBeCalled(); diff --git a/spec/Controller/Action/ListWishlistProductsActionSpec.php b/spec/Controller/Action/ListWishlistProductsActionSpec.php index 41713379..cc79a0c7 100644 --- a/spec/Controller/Action/ListWishlistProductsActionSpec.php +++ b/spec/Controller/Action/ListWishlistProductsActionSpec.php @@ -1,26 +1,28 @@ createView()->willReturn($formView); $twigEnvironment ->render( - '@BitBagSyliusWishlistPlugin/WishlistDetails/index.html.twig', + '@SyliusWishlistPlugin/wishlist_details/index.html.twig', [ 'wishlist' => $wishlist, 'form' => $formView, diff --git a/spec/Controller/Action/RemoveProductFromWishlistActionSpec.php b/spec/Controller/Action/RemoveProductFromWishlistActionSpec.php index 2a5491cc..e2cf62e7 100644 --- a/spec/Controller/Action/RemoveProductFromWishlistActionSpec.php +++ b/spec/Controller/Action/RemoveProductFromWishlistActionSpec.php @@ -1,25 +1,27 @@ getWishlist($request)->willReturn($wishlist); $wishlist->getWishlistProducts()->willReturn(new ArrayCollection([$wishlistProduct->getWrappedObject()])); $wishlistProduct->getProduct()->willReturn($product); - $translator->trans('bitbag_sylius_wishlist_plugin.ui.removed_wishlist_item')->willReturn('Product has been removed from your wishlist.'); - $urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_products')->willReturn('/wishlist'); + $translator->trans('sylius_wishlist_plugin.ui.removed_wishlist_item')->willReturn('Product has been removed from your wishlist.'); + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_products')->willReturn('/wishlist'); $wishlistProductManager->remove($wishlistProduct)->shouldBeCalled(); $wishlistProductManager->flush()->shouldBeCalled(); diff --git a/spec/Controller/Action/RenderHeaderTemplateActionSpec.php b/spec/Controller/Action/RenderHeaderTemplateActionSpec.php index 1d8d286a..fb32444f 100644 --- a/spec/Controller/Action/RenderHeaderTemplateActionSpec.php +++ b/spec/Controller/Action/RenderHeaderTemplateActionSpec.php @@ -1,19 +1,21 @@ resolve()->willReturn($wishlists); - $twigEnvironment->render('@BitBagSyliusWishlistPlugin/Common/widget.html.twig', [ + $twigEnvironment->render('@SyliusWishlistPlugin/common/widget.html.twig', [ 'wishlists' => $wishlists, ])->willReturn('TEMPLATE'); $this->__invoke($request)->shouldImplement(Response::class); diff --git a/spec/DependencyInjection/ConfigurationSpec.php b/spec/DependencyInjection/ConfigurationSpec.php index 34cb6fea..10246eef 100644 --- a/spec/DependencyInjection/ConfigurationSpec.php +++ b/spec/DependencyInjection/ConfigurationSpec.php @@ -1,15 +1,17 @@ shouldHaveType(BitBagSyliusWishlistExtension::class); + $this->shouldHaveType(SyliusWishlistExtension::class); } public function it_is_instance_of_prepend_extension_interface() diff --git a/spec/Duplicator/WishlistProductsToOtherWishlistDuplicatorSpec.php b/spec/Duplicator/WishlistProductsToOtherWishlistDuplicatorSpec.php index e62a742c..1ee049d7 100644 --- a/spec/Duplicator/WishlistProductsToOtherWishlistDuplicatorSpec.php +++ b/spec/Duplicator/WishlistProductsToOtherWishlistDuplicatorSpec.php @@ -1,25 +1,27 @@ render('@BitBagSyliusWishlistPlugin/_wishlist_pdf.html.twig', [ + $twigEnvironment->render('@SyliusWishlistPlugin/wishlist_pdf.html.twig', [ 'title' => 'My wishlist products', 'date' => date('d.m.Y'), 'products' => $data, diff --git a/spec/Facade/WishlistProductFactoryFacadeSpec.php b/spec/Facade/WishlistProductFactoryFacadeSpec.php index 66031051..d5ad4090 100644 --- a/spec/Facade/WishlistProductFactoryFacadeSpec.php +++ b/spec/Facade/WishlistProductFactoryFacadeSpec.php @@ -1,24 +1,26 @@ beConstructedWith( + $security, + $wishlistExtension, + $channelContext, + $wishlistProductFactory, + $requestStack, + $translator, + $urlGenerator, + $wishlistRepository, + ); + } + + public function it_is_initializable(): void + { + $this->shouldHaveType(AddProductVariantToWishlistProcessor::class); + } + + public function it_throws_resource_not_found_exception_when_wishlist_is_not_found_for_specific_id( + Security $security, + UserInterface $user, + WishlistExtension $wishlistExtension, + WishlistRepositoryInterface $wishlistRepository, + ProductVariantInterface $productVariant, + WishlistInterface $firstWishlist, + WishlistInterface $secondWishlist, + ): void { + $wishlistIdToFind = 999; + + $security->getUser()->willReturn($user); + $wishlistExtension->findAllByShopUserAndToken()->willReturn([$firstWishlist, $secondWishlist]); + + $wishlistRepository->find($wishlistIdToFind)->willReturn(null); + + $this->shouldThrow(ResourceNotFoundException::class) + ->during('process', [$productVariant, $wishlistIdToFind]); + } + + public function it_throws_error_if_no_wishlists_are_found_for_single_wishlist_scenario( + Security $security, + UserInterface $user, + WishlistExtension $wishlistExtension, + ProductVariantInterface $productVariant, + ): void { + $security->getUser()->willReturn($user); + + $wishlistExtension->findAllByShopUserAndToken()->willReturn([]); + + $this->shouldThrow(ResourceNotFoundException::class) + ->during('process', [$productVariant, null]); + } + + public function it_adds_product_to_the_single_wishlist_for_logged_in_user( + Security $security, + UserInterface $user, + WishlistExtension $wishlistExtension, + WishlistProductFactoryInterface $wishlistProductFactory, + RequestStack $requestStack, + TranslatorInterface $translator, + UrlGeneratorInterface $urlGenerator, + WishlistRepositoryInterface $wishlistRepository, + ProductVariantInterface $productVariant, + WishlistInterface $wishlist, + WishlistProductInterface $wishlistProduct, + Session $session, + FlashBagInterface $flashBag, + ): void { + $wishlistId = 123; + $wishlist->getId()->willReturn($wishlistId); + + $security->getUser()->willReturn($user); + $wishlistExtension->findAllByShopUserAndToken()->willReturn([$wishlist]); + + $wishlist->hasProductVariant($productVariant)->willReturn(false); + $wishlistProductFactory->createForWishlistAndVariant($wishlist, $productVariant)->willReturn($wishlistProduct); + + $requestStack->getSession()->willReturn($session); + $session->getFlashBag()->willReturn($flashBag); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product added.'); + $flashBag->add('success', 'Product added.')->shouldBeCalled(); + + $wishlist->addWishlistProduct($wishlistProduct)->shouldBeCalled(); + $wishlistRepository->add($wishlist)->shouldBeCalled(); + + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => $wishlistId]) + ->willReturn('/wishlist/' . $wishlistId); + + $response = $this->process($productVariant); + $response->shouldHaveType(RedirectResponse::class); + $response->getTargetUrl()->shouldReturn('/wishlist/' . $wishlistId); + } + + public function it_adds_product_to_a_specific_wishlist_for_logged_in_user_with_multiple_wishlists( + Security $security, + UserInterface $user, + WishlistExtension $wishlistExtension, + WishlistProductFactoryInterface $wishlistProductFactory, + RequestStack $requestStack, + TranslatorInterface $translator, + UrlGeneratorInterface $urlGenerator, + WishlistRepositoryInterface $wishlistRepository, + ProductVariantInterface $productVariant, + WishlistInterface $targetWishlist, + WishlistInterface $otherWishlist, + WishlistProductInterface $wishlistProduct, + Session $session, + FlashBagInterface $flashBag, + ): void { + $targetWishlistId = 789; + $targetWishlist->getId()->willReturn($targetWishlistId); + + $security->getUser()->willReturn($user); + $wishlistExtension->findAllByShopUserAndToken()->willReturn([$otherWishlist, $targetWishlist]); + + $wishlistRepository->find($targetWishlistId)->willReturn($targetWishlist); + + $targetWishlist->hasProductVariant($productVariant)->willReturn(false); + $wishlistProductFactory->createForWishlistAndVariant($targetWishlist, $productVariant)->willReturn($wishlistProduct); + + $requestStack->getSession()->willReturn($session); + $session->getFlashBag()->willReturn($flashBag); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product added to specific list.'); + $flashBag->add('success', 'Product added to specific list.')->shouldBeCalled(); + + $targetWishlist->addWishlistProduct($wishlistProduct)->shouldBeCalled(); + $wishlistRepository->add($targetWishlist)->shouldBeCalled(); + + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => $targetWishlistId]) + ->willReturn('/wishlist/' . $targetWishlistId); + + $response = $this->process($productVariant, $targetWishlistId); + $response->shouldHaveType(RedirectResponse::class); + $response->getTargetUrl()->shouldReturn('/wishlist/' . $targetWishlistId); + } + + public function it_adds_product_to_the_single_wishlist_for_anonymous_user( + Security $security, + ChannelContextInterface $channelContext, + ChannelInterface $channel, + WishlistExtension $wishlistExtension, + WishlistProductFactoryInterface $wishlistProductFactory, + RequestStack $requestStack, + TranslatorInterface $translator, + UrlGeneratorInterface $urlGenerator, + WishlistRepositoryInterface $wishlistRepository, + ProductVariantInterface $productVariant, + WishlistInterface $wishlist, + WishlistProductInterface $wishlistProduct, + Session $session, + FlashBagInterface $flashBag, + ): void { + $wishlistId = 456; + $wishlist->getId()->willReturn($wishlistId); + + $security->getUser()->willReturn(null); + $channelContext->getChannel()->willReturn($channel); + $wishlistExtension->findAllByAnonymousAndChannel($channel)->willReturn([$wishlist]); + + $wishlist->hasProductVariant($productVariant)->willReturn(false); + $wishlistProductFactory->createForWishlistAndVariant($wishlist, $productVariant)->willReturn($wishlistProduct); + + $requestStack->getSession()->willReturn($session); + $session->getFlashBag()->willReturn($flashBag); + $translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')->willReturn('Product added (anonymous).'); + $flashBag->add('success', 'Product added (anonymous).')->shouldBeCalled(); + + $wishlist->addWishlistProduct($wishlistProduct)->shouldBeCalled(); + $wishlistRepository->add($wishlist)->shouldBeCalled(); + + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => $wishlistId]) + ->willReturn('/wishlist/anon/' . $wishlistId); + + $response = $this->process($productVariant, null); + $response->shouldHaveType(RedirectResponse::class); + $response->getTargetUrl()->shouldReturn('/wishlist/anon/' . $wishlistId); + } + + public function it_adds_flash_error_if_product_variant_is_already_in_wishlist( + Security $security, + UserInterface $user, + WishlistExtension $wishlistExtension, + WishlistProductFactoryInterface $wishlistProductFactory, + RequestStack $requestStack, + TranslatorInterface $translator, + UrlGeneratorInterface $urlGenerator, + ProductVariantInterface $productVariant, + ProductInterface $product, + WishlistInterface $wishlist, + WishlistProductInterface $wishlistProduct, + Session $session, + FlashBagInterface $flashBag, + ): void { + $wishlistId = 123; + $productName = 'Awesome T-Shirt'; + $wishlist->getId()->willReturn($wishlistId); + $productVariant->getProduct()->willReturn($product); + $wishlistProduct->getProduct()->willReturn($product); + $product->getName()->willReturn($productName); + + $security->getUser()->willReturn($user); + $wishlistExtension->findAllByShopUserAndToken()->willReturn([$wishlist]); + + $wishlist->hasProductVariant($productVariant)->willReturn(true); + $wishlistProductFactory->createForWishlistAndVariant($wishlist, $productVariant)->willReturn($wishlistProduct); + + $requestStack->getSession()->willReturn($session); + $session->getFlashBag()->willReturn($flashBag); + $translator->trans( + 'sylius_wishlist_plugin.ui.wishlist_has_product_variant', + ['%productName%' => $productName], + )->willReturn('Product already in wishlist.'); + $flashBag->add('error', 'Product already in wishlist.')->shouldBeCalled(); + + $wishlist->addWishlistProduct($wishlistProduct)->shouldNotBeCalled(); + + $urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => $wishlistId]) + ->willReturn('/wishlist/' . $wishlistId); + + $response = $this->process($productVariant, null); + $response->shouldHaveType(RedirectResponse::class); + $response->getTargetUrl()->shouldReturn('/wishlist/' . $wishlistId); + } +} diff --git a/spec/Processor/SelectedWishlistProductsProcessorSpec.php b/spec/Processor/SelectedWishlistProductsProcessorSpec.php index 4feb946b..df72fbc2 100644 --- a/spec/Processor/SelectedWishlistProductsProcessorSpec.php +++ b/spec/Processor/SelectedWishlistProductsProcessorSpec.php @@ -1,21 +1,23 @@ beConstructedWith($requestStack, 'token'); } @@ -33,47 +24,32 @@ public function it_is_initializable(): void $this->shouldImplement(WishlistCookieTokenResolverInterface::class); } - public function it_returns_wishlist_cookie_token_from_main_request_cookies( - RequestStack $requestStack, - Request $request, - ParameterBag $inputBag, - ): void { + public function it_returns_token_from_cookies_if_present(RequestStack $requestStack): void + { + $request = new Request(); + $request->cookies = new InputBag(['token' => 'cookie_token']); $requestStack->getMainRequest()->willReturn($request); - $inputBag->get('token')->willReturn('wishlist_token'); - $request->cookies = $inputBag; - $this->resolve()->shouldReturn('wishlist_token'); + $this->resolve()->shouldReturn('cookie_token'); } - public function it_returns_wishlist_cookie_token_from_main_request_attributes( - RequestStack $requestStack, - Request $request, - ParameterBag $inputBagCookies, - ParameterBag $inputBagAttributes, - ): void { + public function it_returns_token_from_attributes_if_not_in_cookies(RequestStack $requestStack): void + { + $request = new Request(); + $request->cookies = new InputBag(); + $request->attributes = new InputBag(['token' => 'attribute_token']); $requestStack->getMainRequest()->willReturn($request); - $inputBagCookies->get('token')->willReturn(null); - $inputBagAttributes->get('token')->willReturn('wishlist_token'); - $request->cookies = $inputBagCookies; - $request->attributes = $inputBagAttributes; - $this->resolve()->shouldReturn('wishlist_token'); + $this->resolve()->shouldReturn('attribute_token'); } - public function it_returns_new_wishlist_token_class_if_not_found_in_cookies_nor_attributes( - RequestStack $requestStack, - Request $request, - ParameterBag $inputBagCookies, - ParameterBag $inputBagAttributes, - WishlistToken $wishlistToken, - ): void { + public function it_returns_new_token_if_not_in_cookies_nor_attributes(RequestStack $requestStack): void + { + $request = new Request(); + $request->cookies = new InputBag(); + $request->attributes = new InputBag(); $requestStack->getMainRequest()->willReturn($request); - $inputBagCookies->get('token')->willReturn(null); - $inputBagAttributes->get('token')->willReturn(null); - $request->cookies = $inputBagCookies; - $request->attributes = $inputBagAttributes; - $wishlistToken->getValue()->willReturn('wishlist_token'); - $this->resolve()->shouldBeString(); + $this->resolve()->shouldMatch("/^([a-f0-9\-]{36})$/"); } } diff --git a/spec/Resolver/WishlistsResolverSpec.php b/spec/Resolver/WishlistsResolverSpec.php index 846e6d77..0b5ef985 100644 --- a/spec/Resolver/WishlistsResolverSpec.php +++ b/spec/Resolver/WishlistsResolverSpec.php @@ -1,27 +1,29 @@ getCartItem(); - - if (null === $addToCartCommand) { - return false; - } - - $cartItem = $addToCartCommand->getCartItem(); - - return 0 < $cartItem->getQuantity(); - } -} diff --git a/src/Checker/ProductProcessingCheckerInterface.php b/src/Checker/ProductProcessingCheckerInterface.php deleted file mode 100644 index c58e2d95..00000000 --- a/src/Checker/ProductProcessingCheckerInterface.php +++ /dev/null @@ -1,19 +0,0 @@ -getQuantity()) { - return true; - } - - return false; - } -} diff --git a/src/Checker/ProductQuantityCheckerInterface.php b/src/Checker/ProductQuantityCheckerInterface.php deleted file mode 100644 index 9ad0f4b4..00000000 --- a/src/Checker/ProductQuantityCheckerInterface.php +++ /dev/null @@ -1,22 +0,0 @@ -setDescription('Removes guest wishlists') - ->addOption( - 'date', - 'd', - InputOption::VALUE_OPTIONAL, - 'The date to remove wishlists updated before (format: d-m-Y)', - ); + $this->addOption( + 'date', + 'd', + InputOption::VALUE_OPTIONAL, + 'The date to remove wishlists updated before (format: d-m-Y)', + ); } public function execute(InputInterface $input, OutputInterface $output): int diff --git a/src/Command/Wishlist/AddProductToSelectedWishlist.php b/src/Command/Wishlist/AddProductToSelectedWishlist.php index 6bd78735..ab77a33f 100644 --- a/src/Command/Wishlist/AddProductToSelectedWishlist.php +++ b/src/Command/Wishlist/AddProductToSelectedWishlist.php @@ -1,18 +1,20 @@ productCanBeProcessed($wishlistProduct)) { $this->addProductToWishlist($wishlistProduct); diff --git a/src/CommandHandler/Wishlist/AddSelectedProductsToCartHandler.php b/src/CommandHandler/Wishlist/AddSelectedProductsToCartHandler.php index 7450943f..1ecd6ea1 100644 --- a/src/CommandHandler/Wishlist/AddSelectedProductsToCartHandler.php +++ b/src/CommandHandler/Wishlist/AddSelectedProductsToCartHandler.php @@ -1,20 +1,18 @@ addSelectedProductsToCart($addSelectedProductsToCartCommand->getWishlistProducts()); } diff --git a/src/CommandHandler/Wishlist/AddWishlistToUserHandler.php b/src/CommandHandler/Wishlist/AddWishlistToUserHandler.php index ec5f21f5..2a334416 100644 --- a/src/CommandHandler/Wishlist/AddWishlistToUserHandler.php +++ b/src/CommandHandler/Wishlist/AddWishlistToUserHandler.php @@ -1,21 +1,23 @@ requestStack->getSession(); - $session->getFlashBag()->add('error', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.csv_file_contains_incorrect_products')); + $session->getFlashBag()->add('error', $this->translator->trans('sylius_wishlist_plugin.ui.csv_file_contains_incorrect_products')); } } } diff --git a/src/CommandHandler/Wishlist/RemoveProductFromWishlistHandler.php b/src/CommandHandler/Wishlist/RemoveProductFromWishlistHandler.php index 49cc83ab..3d7293eb 100644 --- a/src/CommandHandler/Wishlist/RemoveProductFromWishlistHandler.php +++ b/src/CommandHandler/Wishlist/RemoveProductFromWishlistHandler.php @@ -1,27 +1,32 @@ productRepository->find($productId); - /** @var ?WishlistInterface $wishlist */ - $wishlist = $this->wishlistRepository->findByToken($token); - - /** @var ?WishlistProductInterface $wishlistProduct */ - $wishlistProduct = $this->wishlistProductRepository->findOneBy(['product' => $product, 'wishlist' => $wishlist]); - - if (null === $product || null === $wishlistProduct) { + if (null === $product) { throw new ProductNotFoundException( sprintf('The Product %s does not exist', $productId), ); } + /** @var ?WishlistInterface $wishlist */ + $wishlist = $this->wishlistRepository->findByToken($token); + if (null === $wishlist) { throw new WishlistNotFoundException( sprintf('The Wishlist %s does not exist', $token), ); } - $wishlist = $wishlist->removeProduct($wishlistProduct); + if (!$this->authorizationChecker->isGranted(ResourceActions::DELETE, $wishlist)) { + throw new AccessDeniedException('You are not allowed to delete from this wishlist.'); + } + + /** @var ?WishlistProductInterface $wishlistProduct */ + $wishlistProduct = $this->wishlistProductRepository->findOneBy(['product' => $product, 'wishlist' => $wishlist]); + + if (null === $wishlistProduct) { + throw new ProductNotFoundException( + sprintf('The Product %s was not found in Wishlist %s', $productId, $token), + ); + } + + $wishlist->removeProduct($wishlistProduct); $this->wishlistManager->flush(); return $wishlist; diff --git a/src/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandler.php b/src/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandler.php index 90571fe9..6f22581e 100644 --- a/src/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandler.php +++ b/src/CommandHandler/Wishlist/RemoveProductVariantFromWishlistHandler.php @@ -1,27 +1,32 @@ productVariantRepository->find($variantId); - /** @var ?WishlistProductInterface $wishlistProduct */ - $wishlistProduct = $this->wishlistProductRepository->findOneBy(['variant' => $variant]); - /** @var ?WishlistInterface $wishlist */ - $wishlist = $this->wishlistRepository->findByToken($token); - if (null === $variant || null === $wishlistProduct) { + if (null === $variant) { throw new ProductVariantNotFoundException( - sprintf('The Product %s does not exist', $variantId), + sprintf('The Product Variant %s does not exist', $variantId), ); } + /** @var ?WishlistInterface $wishlist */ + $wishlist = $this->wishlistRepository->findByToken($token); + if (null === $wishlist) { throw new WishlistNotFoundException( sprintf('The Wishlist %s does not exist', $token), ); } - $wishlist->removeProductVariant($variant); + if (!$this->authorizationChecker->isGranted(ResourceActions::DELETE, $wishlist)) { + throw new AccessDeniedException('You are not allowed to delete from this wishlist.'); + } + + /** @var ?WishlistProductInterface $wishlistProduct */ + $wishlistProduct = $this->wishlistProductRepository->findOneBy(['variant' => $variant, 'wishlist' => $wishlist]); + + if (null === $wishlistProduct) { + throw new ProductVariantNotFoundException( + sprintf('The Product Variant %s was not found in Wishlist %s', $variantId, $token), + ); + } + + $wishlist->removeProduct($wishlistProduct); $this->wishlistManager->flush(); return $wishlist; diff --git a/src/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandler.php b/src/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandler.php index 4bf89526..74f59c58 100644 --- a/src/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandler.php +++ b/src/CommandHandler/Wishlist/RemoveSelectedProductsFromWishlistHandler.php @@ -1,25 +1,27 @@ cookies->get($this->wishlistCookieToken); + $cookieWishlistToken = $this->wishlistCookieTokenResolver->resolve(); /** @var ?TokenInterface $token */ $token = $this->tokenStorage->getToken(); - /** @var WishlistInterface $wishlist */ - $wishlist = $this->wishlistFactory->createNew(); - $user = $this->tokenUserResolver->resolve($token); - if (null === $cookieWishlistToken && null === $user) { - return $wishlist; - } + /** @var WishlistInterface $wishlist */ + $wishlist = $this->wishlistFactory->createNew(); - if (null !== $cookieWishlistToken && !$user instanceof ShopUserInterface) { + if (!$user instanceof ShopUserInterface) { return $this->wishlistRepository->findByToken($cookieWishlistToken) ?? $wishlist; } try { $channel = $this->channelContext->getChannel(); } catch (ChannelNotFoundException $exception) { - $channel = null; + return $wishlist; } - if (null !== $channel) { - if ($user instanceof ShopUserInterface) { - $wishlist = $this->wishlistRepository->findOneByShopUserAndChannel($user, $channel); - - return $wishlist ?? $this->wishlistFactory->createForUserAndChannel($user, $channel); - } - } + $wishlist = $this->wishlistRepository->findOneByShopUserAndChannel($user, $channel); - return $wishlist; + return $wishlist ?? $this->wishlistFactory->createForUserAndChannel($user, $channel); } } diff --git a/src/Context/WishlistContextInterface.php b/src/Context/WishlistContextInterface.php index 239f1d8d..12fa44bd 100644 --- a/src/Context/WishlistContextInterface.php +++ b/src/Context/WishlistContextInterface.php @@ -1,17 +1,19 @@ requestStack->getSession(); - $session->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')); + $session->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')); return new RedirectResponse( - $this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); diff --git a/src/Controller/Action/AddProductToWishlistAction.php b/src/Controller/Action/AddProductToWishlistAction.php index b08e8e8e..c43f770f 100644 --- a/src/Controller/Action/AddProductToWishlistAction.php +++ b/src/Controller/Action/AddProductToWishlistAction.php @@ -1,27 +1,29 @@ translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_not_found'), + $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_not_found'), ); } @@ -78,7 +80,7 @@ public function __invoke(Request $request): Response if (null !== $channel && $wishlistChannel->getId() !== $channel->getId()) { throw new WishlistNotFoundException( - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_for_channel_not_found'), + $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_for_channel_not_found'), ); } @@ -92,7 +94,7 @@ public function __invoke(Request $request): Response /** @var Session $session */ $session = $this->requestStack->getSession(); - $session->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')); + $session->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')); $referer = $request->headers->get('referer'); $refererPathInfo = Request::create((string) $referer)->getPathInfo(); diff --git a/src/Controller/Action/AddProductVariantToWishlistAction.php b/src/Controller/Action/AddProductVariantToWishlistAction.php index fb69a2e9..0d20fb04 100644 --- a/src/Controller/Action/AddProductVariantToWishlistAction.php +++ b/src/Controller/Action/AddProductVariantToWishlistAction.php @@ -1,22 +1,24 @@ urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); @@ -83,7 +85,7 @@ private function addProductToWishlist( $flashBag->add( 'error', $this->translator->trans( - 'bitbag_sylius_wishlist_plugin.ui.wishlist_has_product_variant', + 'sylius_wishlist_plugin.ui.wishlist_has_product_variant', ['%productName%' => $wishlistProduct->getProduct()->getName()], ), ); @@ -93,6 +95,6 @@ private function addProductToWishlist( $wishlist->addWishlistProduct($wishlistProduct); $this->wishlistRepository->add($wishlist); - $flashBag->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.added_wishlist_item')); + $flashBag->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')); } } diff --git a/src/Controller/Action/AddProductsToCartAction.php b/src/Controller/Action/AddProductsToCartAction.php index 328e1ed8..f925d8d6 100644 --- a/src/Controller/Action/AddProductsToCartAction.php +++ b/src/Controller/Action/AddProductsToCartAction.php @@ -1,32 +1,26 @@ get('items')->getData()); - $this->messageBus->dispatch($command); - if (false === $this->getFlashBag()->has('success')) { - $this->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.added_to_cart')); - } - } catch (HandlerFailedException $exception) { - $this->getFlashBag()->add('error', $this->getExceptionMessage($exception)); - } + return new AddProductsToCart($form->get('items')->getData()); } } diff --git a/src/Controller/Action/AddSelectedProductsToCartAction.php b/src/Controller/Action/AddSelectedProductsToCartAction.php index 931cf2bd..0bc404e1 100644 --- a/src/Controller/Action/AddSelectedProductsToCartAction.php +++ b/src/Controller/Action/AddSelectedProductsToCartAction.php @@ -1,18 +1,24 @@ getData()); $this->messageBus->dispatch($command); if (false === $this->getFlashBag()->has('success')) { - $this->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.added_to_cart')); + $this->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.added_to_cart')); } } catch (HandlerFailedException $exception) { $this->getFlashBag()->add('error', $this->getExceptionMessage($exception)); } } + + protected function getFlashBag(): FlashBagInterface + { + /** @var Session $session */ + $session = $this->requestStack->getSession(); + + return $session->getFlashBag(); + } + + private function getExceptionMessage(HandlerFailedException $exception): string + { + $previous = $exception->getPrevious(); + if ($previous instanceof InsufficientProductStockException) { + return $this->translator->trans('sylius_wishlist_plugin.ui.insufficient_stock', ['%productName%' => $previous->getProductName()]); + } + if ($previous instanceof InvalidProductQuantityException) { + return $this->translator->trans('sylius_wishlist_plugin.ui.increase_quantity'); + } + + return $exception->getMessage(); + } } diff --git a/src/Controller/Action/AddWishlistToUserAction.php b/src/Controller/Action/AddWishlistToUserAction.php index 86315c59..8f70954b 100644 --- a/src/Controller/Action/AddWishlistToUserAction.php +++ b/src/Controller/Action/AddWishlistToUserAction.php @@ -1,21 +1,23 @@ getFlashBag()->add( 'success', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_saved'), + $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_saved'), ); } catch (HandlerFailedException $exception) { $session->getFlashBag()->add( 'error', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.you_have_no_access_to_that_wishlist'), + $this->translator->trans('sylius_wishlist_plugin.ui.you_have_no_access_to_that_wishlist'), ); } - return new RedirectResponse($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); + return new RedirectResponse($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); } } diff --git a/src/Controller/Action/ApiPlatform/RemoveProductFromWishlistAction.php b/src/Controller/Action/ApiPlatform/RemoveProductFromWishlistAction.php index 030ff03f..e32d6bdc 100755 --- a/src/Controller/Action/ApiPlatform/RemoveProductFromWishlistAction.php +++ b/src/Controller/Action/ApiPlatform/RemoveProductFromWishlistAction.php @@ -1,17 +1,19 @@ getCommand($form); + + try { + $this->messageBus->dispatch($command); + if (false === $this->getFlashBag()->has('success')) { + $this->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.added_to_cart')); + } + } catch (HandlerFailedException $exception) { + $this->getFlashBag()->add('error', $this->getExceptionMessage($exception)); + } + } + + private function getExceptionMessage(HandlerFailedException $exception): string + { + $previous = $exception->getPrevious(); + if ($previous instanceof InsufficientProductStockException) { + return $this->translator->trans('sylius_wishlist_plugin.ui.insufficient_stock', ['%productName%' => $previous->getProductName()]); + } + if ($previous instanceof InvalidProductQuantityException) { + return $this->translator->trans('sylius_wishlist_plugin.ui.increase_quantity'); + } + + return $exception->getMessage(); + } +} diff --git a/src/Controller/Action/BaseWishlistProductsAction.php b/src/Controller/Action/BaseWishlistProductsAction.php index 9baffdd2..3304461d 100644 --- a/src/Controller/Action/BaseWishlistProductsAction.php +++ b/src/Controller/Action/BaseWishlistProductsAction.php @@ -1,23 +1,23 @@ createForm($wishlistId)) { return new RedirectResponse( - $this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists'), + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists'), ); } $form = $this->createForm($wishlistId); @@ -60,7 +59,7 @@ public function __invoke(int $wishlistId, Request $request): Response $this->handleCommand($form); return new RedirectResponse( - $this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); @@ -70,12 +69,12 @@ public function __invoke(int $wishlistId, Request $request): Response $session = $this->requestStack->getSession(); /** @var FormError $error */ - foreach ($form->getErrors() as $error) { + foreach ($form->getErrors(true) as $error) { $session->getFlashBag()->add('error', $error->getMessage()); } return new RedirectResponse( - $this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); @@ -91,19 +90,6 @@ protected function getFlashBag(): FlashBagInterface return $session->getFlashBag(); } - protected function getExceptionMessage(HandlerFailedException $exception): string - { - $previous = $exception->getPrevious(); - if ($previous instanceof InsufficientProductStockException) { - return $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.insufficient_stock', ['%productName%' => $previous->getProductName()]); - } - if ($previous instanceof InvalidProductQuantityException) { - return $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.increase_quantity'); - } - - return $exception->getMessage(); - } - private function createForm(int $wishlistId): ?FormInterface { /** @var ?WishlistInterface $wishlist */ @@ -114,7 +100,7 @@ private function createForm(int $wishlistId): ?FormInterface /** @var Session $session */ $session = $this->requestStack->getSession(); - $session->getFlashBag()->add('error', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_not_exists')); + $session->getFlashBag()->add('error', $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_not_exists')); return null; } diff --git a/src/Controller/Action/BaseWishlistsListingAction.php b/src/Controller/Action/BaseWishlistsListingAction.php index 26bbb30a..bbccc070 100644 --- a/src/Controller/Action/BaseWishlistsListingAction.php +++ b/src/Controller/Action/BaseWishlistsListingAction.php @@ -1,17 +1,19 @@ requestStack->getSession(); - $session->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.cleared_wishlist')); + $session->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.cleared_wishlist')); return new RedirectResponse( - $this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); diff --git a/src/Controller/Action/CopySelectedProductsToOtherWishlistAction.php b/src/Controller/Action/CopySelectedProductsToOtherWishlistAction.php index f37bd90f..19c60c9d 100644 --- a/src/Controller/Action/CopySelectedProductsToOtherWishlistAction.php +++ b/src/Controller/Action/CopySelectedProductsToOtherWishlistAction.php @@ -1,18 +1,20 @@ getFlashBag()->add( 'success', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.copied_selected_wishlist_items'), + $this->translator->trans('sylius_wishlist_plugin.ui.copied_selected_wishlist_items'), ); return new JsonResponse(); diff --git a/src/Controller/Action/CreateNewWishlistAction.php b/src/Controller/Action/CreateNewWishlistAction.php index d8db8f87..34dc86c5 100644 --- a/src/Controller/Action/CreateNewWishlistAction.php +++ b/src/Controller/Action/CreateNewWishlistAction.php @@ -1,19 +1,21 @@ getFlashBag()->add( 'success', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.create_new_wishlist'), + $this->translator->trans('sylius_wishlist_plugin.ui.create_new_wishlist'), ); } catch (HandlerFailedException $exception) { /** @var Session $session */ @@ -71,7 +73,7 @@ public function __invoke(Request $request): Response $session->getFlashBag()->add( 'error', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_name_already_exists'), + $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_name_already_exists'), ); return new JsonResponse([]); @@ -82,7 +84,7 @@ public function __invoke(Request $request): Response 'url' => $this ->urlGenerator ->generate( - 'bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', + 'sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', ['wishlistId' => $result], )], ); diff --git a/src/Controller/Action/ExportSelectedProductsToCsvAction.php b/src/Controller/Action/ExportSelectedProductsToCsvAction.php index 917e0967..027c3d52 100644 --- a/src/Controller/Action/ExportSelectedProductsToCsvAction.php +++ b/src/Controller/Action/ExportSelectedProductsToCsvAction.php @@ -1,23 +1,25 @@ urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); @@ -103,7 +105,7 @@ private function exportSelectedWishlistProductsToCsv(FormInterface $form): Respo $session->getFlashBag()->add('error', $this->translator->trans($e->getMessage())); - return new RedirectResponse($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_products')); + return new RedirectResponse($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_products')); } return $this->returnCsvFile($file); diff --git a/src/Controller/Action/ExportWishlistToPdfAction.php b/src/Controller/Action/ExportWishlistToPdfAction.php index 4a214090..6999657d 100644 --- a/src/Controller/Action/ExportWishlistToPdfAction.php +++ b/src/Controller/Action/ExportWishlistToPdfAction.php @@ -1,17 +1,19 @@ twigEnvironment->render('@BitBagSyliusWishlistPlugin/importWishlist.html.twig', [ + $this->twigEnvironment->render('@SyliusWishlistPlugin/import_wishlist.html.twig', [ 'form' => $form->createView(), ]), ); diff --git a/src/Controller/Action/ListWishlistProductsAction.php b/src/Controller/Action/ListWishlistProductsAction.php index 63281665..1601ee03 100644 --- a/src/Controller/Action/ListWishlistProductsAction.php +++ b/src/Controller/Action/ListWishlistProductsAction.php @@ -1,22 +1,24 @@ getSession(); - $session->getFlashBag()->add('error', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.go_to_wishlist_failure')); + $session->getFlashBag()->add('error', $this->translator->trans('sylius_wishlist_plugin.ui.go_to_wishlist_failure')); return new RedirectResponse($homepageUrl); } @@ -90,7 +92,7 @@ public function __invoke(Request $request): Response ]); return new Response( - $this->twigEnvironment->render('@BitBagSyliusWishlistPlugin/WishlistDetails/index.html.twig', [ + $this->twigEnvironment->render('@SyliusWishlistPlugin/wishlist_details/index.html.twig', [ 'wishlist' => $wishlist, 'form' => $form->createView(), ]), diff --git a/src/Controller/Action/ListWishlistsAction.php b/src/Controller/Action/ListWishlistsAction.php index 81a16471..00fd6bab 100644 --- a/src/Controller/Action/ListWishlistsAction.php +++ b/src/Controller/Action/ListWishlistsAction.php @@ -1,19 +1,21 @@ requestStack->getSession(); - $session->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.removed_wishlist_item')); + $session->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.removed_wishlist_item')); - return new RedirectResponse($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_products')); + return new RedirectResponse($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_products')); } } diff --git a/src/Controller/Action/RemoveProductVariantFromWishlistAction.php b/src/Controller/Action/RemoveProductVariantFromWishlistAction.php index 866b78c3..5b90566a 100644 --- a/src/Controller/Action/RemoveProductVariantFromWishlistAction.php +++ b/src/Controller/Action/RemoveProductVariantFromWishlistAction.php @@ -1,22 +1,24 @@ requestStack->getSession(); - $session->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.removed_wishlist_item')); + $session->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.removed_wishlist_item')); return new RedirectResponse( - $this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ 'wishlistId' => $wishlistId, ]), ); diff --git a/src/Controller/Action/RemoveSelectedProductsFromWishlistAction.php b/src/Controller/Action/RemoveSelectedProductsFromWishlistAction.php index bdd24dfc..31a23dcd 100644 --- a/src/Controller/Action/RemoveSelectedProductsFromWishlistAction.php +++ b/src/Controller/Action/RemoveSelectedProductsFromWishlistAction.php @@ -1,17 +1,19 @@ messageBus->dispatch($command); - $this->getFlashBag()->add('success', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.removed_selected_wishlist_items')); + $this->getFlashBag()->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.removed_selected_wishlist_items')); } catch (HandlerFailedException) { - $this->getFlashBag()->add('error', $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_product_not_found')); + $this->getFlashBag()->add('error', $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_product_not_found')); } } } diff --git a/src/Controller/Action/RenderHeaderTemplateAction.php b/src/Controller/Action/RenderHeaderTemplateAction.php index 3ebfd76a..36785c02 100644 --- a/src/Controller/Action/RenderHeaderTemplateAction.php +++ b/src/Controller/Action/RenderHeaderTemplateAction.php @@ -1,19 +1,21 @@ wishlistCookieTokenResolver->resolve(); if (null === $wishlist) { - return new RedirectResponse($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); + return new RedirectResponse($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); } $user = $this->tokenUserResolver->resolve($token); @@ -61,23 +63,23 @@ public function __invoke(string $wishlistId, Request $request): Response $wishlistUser = $wishlist->getShopUser(); if ($user !== $wishlistUser) { - return new RedirectResponse($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); + return new RedirectResponse($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); } if ($user instanceof ShopUserInterface || - $wishlist->getToken() === $wishlistCookieToken && null === $wishlistUser + ($wishlist->getToken() === $wishlistCookieToken && null === $wishlistUser) ) { $form = $this->createForm($wishlist); return new Response( - $this->twigEnvironment->render('@BitBagSyliusWishlistPlugin/WishlistDetails/index.html.twig', [ + $this->twigEnvironment->render('@SyliusWishlistPlugin/wishlist_details/index.html.twig', [ 'wishlist' => $wishlist, 'form' => $form->createView(), ]), ); } - return new RedirectResponse($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); + return new RedirectResponse($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_wishlists')); } private function createForm(WishlistInterface $wishlist): FormInterface diff --git a/src/Controller/Action/UpdateWishlistNameAction.php b/src/Controller/Action/UpdateWishlistNameAction.php index f52c96da..aae37eae 100644 --- a/src/Controller/Action/UpdateWishlistNameAction.php +++ b/src/Controller/Action/UpdateWishlistNameAction.php @@ -1,19 +1,21 @@ getFlashBag()->add( 'success', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_name_changed'), + $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_name_changed'), ); } catch (HandlerFailedException $exception) { $session->getFlashBag()->add( 'error', - $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.wishlist_name_already_exists'), + $this->translator->trans('sylius_wishlist_plugin.ui.wishlist_name_already_exists'), ); } - return new Response($this->urlGenerator->generate('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_list_products')); + return new Response($this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_list_products')); } } diff --git a/src/Controller/OrderItemController.php b/src/Controller/OrderItemController.php deleted file mode 100644 index 251cb035..00000000 --- a/src/Controller/OrderItemController.php +++ /dev/null @@ -1,91 +0,0 @@ -getCurrentCart(); - $configuration = $this->requestConfigurationFactory->create($this->metadata, $request); - - $this->isGrantedOr403($configuration, CartActions::ADD); - /** @var OrderItemInterface $orderItem */ - $orderItem = $this->newResourceFactory->create($configuration, $this->factory); - - $this->getQuantityModifier()->modify($orderItem, 1); - - /** @var string $formType */ - $formType = $configuration->getFormType(); - - $form = $this->getFormFactory()->create( - $formType, - $this->createAddToCartCommand($cart, $orderItem), - $configuration->getFormOptions(), - ); - - $form->handleRequest($request); - - /** @var SubmitButton $addToWishlist */ - $addToWishlist = $form->get('addToWishlist'); - - if ($addToWishlist->isClicked()) { - /** @var AddToCartCommandInterface $addToCartCommand */ - $addToCartCommand = $form->getData(); - - /** @var OrderItemInterface $item */ - $item = $addToCartCommand->getCartItem(); - /** @var ?ProductVariantInterface $variant */ - $variant = $item->getVariant(); - - /** @var ?WishlistInterface $wishlist */ - $wishlist = $form->get('wishlists')->getData(); - - if (null === $variant) { - throw new NotFoundHttpException('Could not find variant'); - } - - if (null === $wishlist) { - /** @var Session $session */ - $session = $request->getSession(); - /** @var ?TranslatorInterface $translator */ - $translator = $this->get('translator'); - - if (null !== $translator) { - $session->getFlashBag()->add('error', $translator->trans('bitbag_sylius_wishlist_plugin.ui.go_to_wishlist_failure')); - } - - return new Response($this->generateUrl('sylius_shop_homepage')); - } - - return new Response($this->generateUrl('bitbag_sylius_wishlist_plugin_shop_locale_wishlist_add_product_variant', [ - 'wishlistId' => $wishlist->getId(), - 'variantId' => $variant->getId(), - ])); - } - - return parent::addAction($request); - } -} diff --git a/src/DataTransformer/Wishlist/WishlistTokenValueAwareInputCommandDataTransformer.php b/src/DataTransformer/Wishlist/WishlistTokenValueAwareInputCommandDataTransformer.php deleted file mode 100644 index d48b85e5..00000000 --- a/src/DataTransformer/Wishlist/WishlistTokenValueAwareInputCommandDataTransformer.php +++ /dev/null @@ -1,44 +0,0 @@ -setWishlist($wishlist); - - return $object; - } - - /** - * @param WishlistTokenValueAwareInterface|mixed $object - */ - public function supportsTransformation($object): bool - { - return $object instanceof WishlistTokenValueAwareInterface; - } -} diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index af32f9cc..4573fbfa 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -1,24 +1,26 @@ getRootNode(); /** @phpstan-ignore-next-line */ $rootNode diff --git a/src/DependencyInjection/SyliusMessageBusPolyfillPass.php b/src/DependencyInjection/SyliusMessageBusPolyfillPass.php index 159aba89..f2e6b4a5 100644 --- a/src/DependencyInjection/SyliusMessageBusPolyfillPass.php +++ b/src/DependencyInjection/SyliusMessageBusPolyfillPass.php @@ -1,15 +1,17 @@ 'sylius_event.bus', ]; - public const COMMAND_BUS_TAG = 'bitbag.sylius_wishlist_plugin.command_bus'; + public const COMMAND_BUS_TAG = 'sylius.wishlist_plugin.command_bus'; private function setupDefaultCommandBus(array $buses, ContainerBuilder $container): void { diff --git a/src/DependencyInjection/BitBagSyliusWishlistExtension.php b/src/DependencyInjection/SyliusWishlistExtension.php similarity index 64% rename from src/DependencyInjection/BitBagSyliusWishlistExtension.php rename to src/DependencyInjection/SyliusWishlistExtension.php index d662106e..cec7705f 100644 --- a/src/DependencyInjection/BitBagSyliusWishlistExtension.php +++ b/src/DependencyInjection/SyliusWishlistExtension.php @@ -1,15 +1,17 @@ processConfiguration($this->getConfiguration([], $container), $config); - $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../Resources/config')); + $loader = new XmlFileLoader($container, new FileLocator(__DIR__ . '/../../config')); $loader->load('services.xml'); - $container->setParameter('bitbag_sylius_wishlist_plugin.parameters.wishlist_cookie_token', $config['wishlist_cookie_token']); - $container->setParameter('bitbag_sylius_wishlist_plugin.parameters.allowed_mime_types', $config['allowed_mime_types']); + $container->setParameter('sylius_wishlist_plugin.parameters.wishlist_cookie_token', $config['wishlist_cookie_token']); + $container->setParameter('sylius_wishlist_plugin.parameters.allowed_mime_types', $config['allowed_mime_types']); } public function prepend(ContainerBuilder $container): void { - trigger_deprecation('bitbag/wishlist-plugin', '2.0', 'Doctrine migrations existing in a bundle will be removed, move migrations to the project directory.'); + trigger_deprecation('sylius/wishlist-plugin', '2.0', 'Doctrine migrations existing in a bundle will be removed, move migrations to the project directory.'); $this->prependDoctrineMigrations($container); $config = $this->getCurrentConfiguration($container); - $this->registerResources('bitbag_sylius_wishlist_plugin', 'doctrine/orm', $config['resources'], $container); + $this->registerResources('sylius_wishlist_plugin', 'doctrine/orm', $config['resources'], $container); } protected function getMigrationsNamespace(): string { - return 'BitBag\SyliusWishlistPlugin\Migrations'; + return 'Sylius\WishlistPlugin\Migrations'; } protected function getMigrationsDirectory(): string { - return '@BitBagSyliusWishlistPlugin/Migrations'; + return '@SyliusWishlistPlugin/src/Migrations'; } protected function getNamespacesOfMigrationsExecutedBefore(): array diff --git a/src/Duplicator/WishlistProductsToOtherWishlistDuplicator.php b/src/Duplicator/WishlistProductsToOtherWishlistDuplicator.php index bfc55462..5d834e8e 100644 --- a/src/Duplicator/WishlistProductsToOtherWishlistDuplicator.php +++ b/src/Duplicator/WishlistProductsToOtherWishlistDuplicator.php @@ -1,22 +1,24 @@ hasProductVariant($variant)) { - $message = $this->translator->trans('bitbag_sylius_wishlist_plugin.ui.product_variant_exists_in_another_wishlist'); + $message = $this->translator->trans('sylius_wishlist_plugin.ui.product_variant_exists_in_another_wishlist'); /** @var Session $session */ $session = $this->requestStack->getSession(); diff --git a/src/Duplicator/WishlistProductsToOtherWishlistDuplicatorInterface.php b/src/Duplicator/WishlistProductsToOtherWishlistDuplicatorInterface.php index 8d8db253..d9094734 100644 --- a/src/Duplicator/WishlistProductsToOtherWishlistDuplicatorInterface.php +++ b/src/Duplicator/WishlistProductsToOtherWishlistDuplicatorInterface.php @@ -1,18 +1,20 @@ domPdfFactory->createNewWithDefaultOptions(); - $html = $this->twigEnvironment->render('@BitBagSyliusWishlistPlugin/_wishlist_pdf.html.twig', [ + $html = $this->twigEnvironment->render('@SyliusWishlistPlugin/wishlist_pdf.html.twig', [ 'title' => 'My wishlist products', 'date' => date('d.m.Y'), 'products' => $data, diff --git a/src/Exporter/DomPdfWishlistExporterInterface.php b/src/Exporter/DomPdfWishlistExporterInterface.php index 70344a9a..61058669 100644 --- a/src/Exporter/DomPdfWishlistExporterInterface.php +++ b/src/Exporter/DomPdfWishlistExporterInterface.php @@ -1,15 +1,17 @@ add('addToWishlist', SubmitType::class, [ - 'label' => 'bitbag_sylius_wishlist_plugin.ui.add_to_wishlist', + 'label' => 'sylius_wishlist_plugin.ui.add_to_wishlist', 'attr' => [ - 'class' => 'bitbag-add-variant-to-wishlist ui icon labeled button', + 'class' => 'sylius-add-variant-to-wishlist ui icon labeled button', ], ]) ->add('wishlists', EntityType::class, [ diff --git a/src/Form/Type/AddProductsToCartType.php b/src/Form/Type/AddProductsToCartType.php index 6069add6..e0e9c6ea 100644 --- a/src/Form/Type/AddProductsToCartType.php +++ b/src/Form/Type/AddProductsToCartType.php @@ -1,23 +1,25 @@ wishlistsResolver->resolveAndCreate(); + if (count($wishlists) > 1) { + $builder + ->add('wishlists', EntityType::class, [ + 'class' => Wishlist::class, + 'choices' => $wishlists, + 'choice_label' => 'name', + 'mapped' => false, + ]) + ; + } + } +} diff --git a/src/Form/Type/CreateNewWishlistType.php b/src/Form/Type/CreateNewWishlistType.php index fcf60c5f..0184dbc5 100644 --- a/src/Form/Type/CreateNewWishlistType.php +++ b/src/Form/Type/CreateNewWishlistType.php @@ -1,17 +1,19 @@ add('name', TextType::class, [ - 'label' => 'bitbag_sylius_wishlist_plugin.ui.create_new_wishlist_label', + 'label' => 'sylius_wishlist_plugin.ui.create_new_wishlist_label', 'required' => true, ]) ->add('save', SubmitType::class) diff --git a/src/Form/Type/EditWishlistNameType.php b/src/Form/Type/EditWishlistNameType.php index 1fe26480..8de8a476 100644 --- a/src/Form/Type/EditWishlistNameType.php +++ b/src/Form/Type/EditWishlistNameType.php @@ -1,15 +1,17 @@ add('name', TextType::class, [ - 'label' => 'bitbag_sylius_wishlist_plugin.ui.create_new_wishlist_label', + 'label' => 'sylius_wishlist_plugin.ui.create_new_wishlist_label', 'required' => true, ]) ->add('save', SubmitType::class) diff --git a/src/Form/Type/ImportWishlistFromCsvType.php b/src/Form/Type/ImportWishlistFromCsvType.php index 517f0eab..d556f2ce 100644 --- a/src/Form/Type/ImportWishlistFromCsvType.php +++ b/src/Form/Type/ImportWishlistFromCsvType.php @@ -1,17 +1,19 @@ 'name', ]) ->add('submit', SubmitType::class, [ - 'label' => 'bitbag_sylius_wishlist_plugin.ui.submit', + 'label' => 'sylius_wishlist_plugin.ui.submit', ]) ; } diff --git a/src/Form/Type/WishlistCollectionType.php b/src/Form/Type/WishlistCollectionType.php index 671f4a4b..ee417cba 100644 --- a/src/Form/Type/WishlistCollectionType.php +++ b/src/Form/Type/WishlistCollectionType.php @@ -1,17 +1,19 @@ add('addAll', SubmitType::class, [ - 'label' => 'bitbag_sylius_wishlist_plugin.ui.add_items_to_cart', + 'label' => 'sylius_wishlist_plugin.ui.add_items_to_cart', ]) ->addEventListener( FormEvents::SUBMIT, @@ -69,7 +71,7 @@ public function pickSelectedWishlistItems(FormEvent $event): void ); if ($selectedProducts->isEmpty()) { - $event->getForm()->addError(new FormError($this->translator->trans('bitbag_sylius_wishlist_plugin.ui.select_products'))); + $event->getForm()->addError(new FormError($this->translator->trans('sylius_wishlist_plugin.ui.select_products'))); } $event->setData($selectedProducts); diff --git a/src/Generator/ModelCreator.php b/src/Generator/ModelCreator.php index cd93e730..55508e75 100644 --- a/src/Generator/ModelCreator.php +++ b/src/Generator/ModelCreator.php @@ -1,22 +1,24 @@ addSql('RENAME TABLE bitbag_wishlist TO sylius_wishlist'); + $this->addSql('RENAME TABLE bitbag_wishlist_product TO sylius_wishlist_product'); + } + + public function down(Schema $schema): void + { + $this->addSql('RENAME TABLE sylius_wishlist TO bitbag_wishlist'); + $this->addSql('RENAME TABLE sylius_wishlist_product TO bitbag_wishlist_product'); + } +} diff --git a/src/Migrations/Version20250429195905.php b/src/Migrations/Version20250429195905.php new file mode 100644 index 00000000..85e76fcd --- /dev/null +++ b/src/Migrations/Version20250429195905.php @@ -0,0 +1,34 @@ +addSql('ALTER TABLE sylius_wishlist RENAME INDEX idx_578d4e77a45d93bf TO IDX_635A71DEA45D93BF'); + $this->addSql('ALTER TABLE sylius_wishlist RENAME INDEX idx_578d4e7772f5a1aa TO IDX_635A71DE72F5A1AA'); + $this->addSql('ALTER TABLE sylius_wishlist_product RENAME INDEX idx_3dbe67a0fb8e54cd TO IDX_8D0D7C6DFB8E54CD'); + $this->addSql('ALTER TABLE sylius_wishlist_product RENAME INDEX idx_3dbe67a04584665a TO IDX_8D0D7C6D4584665A'); + $this->addSql('ALTER TABLE sylius_wishlist_product RENAME INDEX idx_3dbe67a03b69a9af TO IDX_8D0D7C6D3B69A9AF'); + } + + public function down(Schema $schema): void + { + $this->addSql('ALTER TABLE sylius_wishlist RENAME INDEX idx_635a71dea45d93bf TO IDX_578D4E77A45D93BF'); + $this->addSql('ALTER TABLE sylius_wishlist RENAME INDEX idx_635a71de72f5a1aa TO IDX_578D4E7772F5A1AA'); + $this->addSql('ALTER TABLE sylius_wishlist_product RENAME INDEX idx_8d0d7c6d4584665a TO IDX_3DBE67A04584665A'); + $this->addSql('ALTER TABLE sylius_wishlist_product RENAME INDEX idx_8d0d7c6d3b69a9af TO IDX_3DBE67A03B69A9AF'); + $this->addSql('ALTER TABLE sylius_wishlist_product RENAME INDEX idx_8d0d7c6dfb8e54cd TO IDX_3DBE67A0FB8E54CD'); + } +} diff --git a/src/Model/DTO/CsvWishlistProduct.php b/src/Model/DTO/CsvWishlistProduct.php index 98a637ce..b2eabc4c 100644 --- a/src/Model/DTO/CsvWishlistProduct.php +++ b/src/Model/DTO/CsvWishlistProduct.php @@ -1,15 +1,17 @@ security->getUser(); + + $wishlists = null !== $user + ? $this->wishlistExtension->findAllByShopUserAndToken() + : $this->wishlistExtension->findAllByAnonymousAndChannel($this->channelContext->getChannel()); + + $isSingleWishlist = count($wishlists) < 2; + + /** @var ?WishlistInterface $wishlist */ + $wishlist = $isSingleWishlist ? ($wishlists[0] ?? null) : $this->wishlistRepository->find($wishlistId); + + if (null === $wishlist) { + throw new ResourceNotFoundException(); + } + + $wishlistProduct = $this->wishlistProductFactory->createForWishlistAndVariant($wishlist, $productVariant); + + $this->addProductToWishlist($wishlist, $productVariant, $wishlistProduct); + + return new RedirectResponse( + $this->urlGenerator->generate('sylius_wishlist_plugin_shop_locale_wishlist_show_chosen_wishlist', [ + 'wishlistId' => $wishlist->getId(), + ]), + ); + } + + private function addProductToWishlist( + WishlistInterface $wishlist, + ProductVariantInterface $variant, + WishlistProductInterface $wishlistProduct, + ): void { + /** @var Session $session */ + $session = $this->requestStack->getSession(); + + $flashBag = $session->getFlashBag(); + + if ($wishlist->hasProductVariant($variant)) { + $flashBag->add( + 'error', + $this->translator->trans( + 'sylius_wishlist_plugin.ui.wishlist_has_product_variant', + ['%productName%' => $wishlistProduct->getProduct()->getName()], + ), + ); + + return; + } + + $wishlist->addWishlistProduct($wishlistProduct); + $this->wishlistRepository->add($wishlist); + $flashBag->add('success', $this->translator->trans('sylius_wishlist_plugin.ui.added_wishlist_item')); + } +} diff --git a/src/Processor/AddProductVariantToWishlistProcessorInterface.php b/src/Processor/AddProductVariantToWishlistProcessorInterface.php new file mode 100644 index 00000000..17af6dca --- /dev/null +++ b/src/Processor/AddProductVariantToWishlistProcessorInterface.php @@ -0,0 +1,22 @@ +requestStack->getMainRequest(); - Assert::notNull($mainRequest); + if (null === $mainRequest) { + return (string) new WishlistToken(); + } $wishlistCookieToken = $mainRequest->cookies->get($this->wishlistCookieToken); diff --git a/src/Resolver/WishlistCookieTokenResolverInterface.php b/src/Resolver/WishlistCookieTokenResolverInterface.php index d9d62386..ad5980cc 100644 --- a/src/Resolver/WishlistCookieTokenResolverInterface.php +++ b/src/Resolver/WishlistCookieTokenResolverInterface.php @@ -1,15 +1,17 @@ - - - - - shop:wishlist:read - - - - - - shop:wishlist:write - - - - sylius - - - - GET - /admin/wishlists - - - - POST - /shop/wishlists - input - BitBag\SyliusWishlistPlugin\Command\Wishlist\CreateWishlist - - shop:wishlist:create - - - Creates wishlist resource - - - - - - - GET - /shop/wishlists/{token} - - - - PATCH - /shop/wishlists/{token}/product - input - BitBag\SyliusWishlistPlugin\Command\Wishlist\AddProductToWishlist - - shop:wishlist:add_product - - - Adds product to wishlist - - is_granted('update', object) - - - - PATCH - /shop/wishlists/{token}/variant - input - BitBag\SyliusWishlistPlugin\Command\Wishlist\AddProductVariantToWishlist - - shop:wishlist:add_product - - - Adds product variant to wishlist - - is_granted('update', object) - - - - DELETE - /shop/wishlists/{token}/products/{productId} - bitbag_sylius_wishlist_plugin.controller.action.api_platform.remove_product_from_wishlist_action - false - - shop:wishlist:remove_product - - - - - token - path - true - - string - - - - productId - path - true - - string - - - - - is_granted('delete', object) - - - - DELETE - /shop/wishlists/{token}/productVariants/{productVariantId} - bitbag_sylius_wishlist_plugin.controller.action.api_platform.remove_product_variant_from_wishlist_action - false - - shop:wishlist:remove_product_variant - - - - - token - path - true - - string - - - - productVariantId - path - true - - string - - - - - is_granted('delete', object) - - - - DELETE - /shop/wishlists/{token} - bitbag_sylius_wishlist_plugin.controller.action.api_platform.remove_wishlist_action - false - - shop:wishlist:remove_wishlist - - - - - token - path - true - - string - - - - - is_granted('delete', object) - - - - - - - diff --git a/src/Resources/config/config.yml b/src/Resources/config/config.yml deleted file mode 100644 index 53ed0724..00000000 --- a/src/Resources/config/config.yml +++ /dev/null @@ -1,2 +0,0 @@ -imports: - - { resource: "@BitBagSyliusWishlistPlugin/Resources/config/services.xml" } diff --git a/src/Resources/config/routing.yml b/src/Resources/config/routing.yml deleted file mode 100644 index 96c7323c..00000000 --- a/src/Resources/config/routing.yml +++ /dev/null @@ -1,11 +0,0 @@ -bitbag_sylius_wishlist_plugin_shop_no_prefix: - resource: "@BitBagSyliusWishlistPlugin/Resources/config/routing/shop.yml" - name_prefix: 'bitbag_sylius_wishlist_plugin_shop_' - -bitbag_sylius_wishlist_plugin_shop: - resource: "@BitBagSyliusWishlistPlugin/Resources/config/routing/shop.yml" - name_prefix: 'bitbag_sylius_wishlist_plugin_shop_locale_' - prefix: /{_locale} - requirements: - _locale: ^[a-z]{2}(?:_[A-Z]{2})?$ - diff --git a/src/Resources/config/routing/shop.yml b/src/Resources/config/routing/shop.yml deleted file mode 100644 index 57096679..00000000 --- a/src/Resources/config/routing/shop.yml +++ /dev/null @@ -1,116 +0,0 @@ -wishlist_list_products: - path: /wishlist - methods: [GET] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.list_wishlist_products - -wishlist_add_products: - path: /wishlist/{wishlistId}/products - methods: [POST] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.add_products_to_wishlist - -wishlist_add_product: - path: /wishlist/add/{productId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.add_product_to_wishlist - -wishlist_remove_product: - path: /wishlist/remove/{productId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.remove_product_from_wishlist - -wishlist_remove_selected_products: - path: /wishlist/{wishlistId}/products/delete - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.remove_selected_products_from_wishlist - -wishlist_add_product_variant: - path: /wishlist/{wishlistId}/add/variant/{variantId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.add_product_variant_to_wishlist - -wishlist_add_selected_products: - path: /wishlist/{wishlistId}/products/add - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.add_selected_products_to_cart - -wishlsit_export_selected_products_to_csv: - path: /wishlist/{wishlistId}/csv/export - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.export_selected_products_to_csv - -wishlist_import_from_csv: - path: /wishlist/csv/import - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.import_from_csv - -wishlist_remove_product_variant: - path: /wishlist/{wishlistId}/remove/variant/{variantId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.remove_product_variant_from_wishlist - -wishlist_render_header_template: - path: /wishlist/header-template - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.render_header_template - -wishlist_export_to_pdf: - path: /wishlist/{wishlistId}/export/pdf - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.export_wishlist_to_pdf_action - -wishlist_clean: - path: /wishlist/clear/{wishlistId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.clean_wishlist - -wishlist_list_wishlists: - path: /wishlists - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.list_wishlists - -wishlist_create_new_wishlist: - path: /wishlists/create - methods: [GET, POST, DELETE] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.create_new_wishlist - -wishlist_remove_wishlist: - path: /wishlists/{id}/remove - methods: [GET, POST, DELETE] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.wishlist::deleteAction - _sylius: - csrf_protection: false - flash: bitbag_sylius_wishlist_plugin.ui.remove_wishlist - redirect: - route: wishlist_list_wishlists - -wishlist_edit_wishlist_name: - path: /wishlists/{id}/edit - methods: [GET, PUT, POST] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.update_wishlist_name_action - -wishlist_show_chosen_wishlist: - path: /wishlists/{wishlistId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.show_chosen_wishlist - -wishlist_add_product_to_selected_wishlist: - path: /wishlist/{wishlistId}/add/{productId} - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.add_product_to_selected_wishlist - -wishlist_copy_selected_products_to_other_wishlist: - path: /wishlists/{wishlistId}/copy/{destinedWishlistId} - methods: [ POST ] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.copy_selected_products_to_other_wishlist - -wishlist_add_wishlist_to_user: - path: /wishlists/{id}/save-wishlist - methods: [GET, PUT, POST] - defaults: - _controller: bitbag_sylius_wishlist_plugin.controller.action.add_wishlists_to_user diff --git a/src/Resources/config/services.yml b/src/Resources/config/services.yml deleted file mode 100644 index 9567259f..00000000 --- a/src/Resources/config/services.yml +++ /dev/null @@ -1,2 +0,0 @@ -imports: - - { resource: "services/**/*.yml" } diff --git a/src/Resources/config/services/checker.xml b/src/Resources/config/services/checker.xml deleted file mode 100644 index a6ba0a4e..00000000 --- a/src/Resources/config/services/checker.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - - - diff --git a/src/Resources/config/services/context.xml b/src/Resources/config/services/context.xml deleted file mode 100644 index 190eed38..00000000 --- a/src/Resources/config/services/context.xml +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - %bitbag_sylius_wishlist_plugin.parameters.wishlist_cookie_token% - - - - - diff --git a/src/Resources/config/services/controller.xml b/src/Resources/config/services/controller.xml deleted file mode 100644 index 29c29888..00000000 --- a/src/Resources/config/services/controller.xml +++ /dev/null @@ -1,204 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services/event.xml b/src/Resources/config/services/event.xml deleted file mode 100644 index 0dfb8efa..00000000 --- a/src/Resources/config/services/event.xml +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - %bitbag_sylius_wishlist_plugin.parameters.wishlist_cookie_token% - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services/exporter.xml b/src/Resources/config/services/exporter.xml deleted file mode 100644 index 0c215b21..00000000 --- a/src/Resources/config/services/exporter.xml +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services/factory.xml b/src/Resources/config/services/factory.xml deleted file mode 100644 index 68f29d6c..00000000 --- a/src/Resources/config/services/factory.xml +++ /dev/null @@ -1,28 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services/form.xml b/src/Resources/config/services/form.xml deleted file mode 100644 index f7ad91cd..00000000 --- a/src/Resources/config/services/form.xml +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services/message_handler.xml b/src/Resources/config/services/message_handler.xml deleted file mode 100644 index 940e985e..00000000 --- a/src/Resources/config/services/message_handler.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - %bitbag_sylius_wishlist_plugin.parameters.wishlist_cookie_token% - - - - - - - - - - - - - - - - - - - - - - - - - - - %bitbag_sylius_wishlist_plugin.parameters.allowed_mime_types% - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/Resources/config/services/processor.xml b/src/Resources/config/services/processor.xml deleted file mode 100644 index 7eac2d2b..00000000 --- a/src/Resources/config/services/processor.xml +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - diff --git a/src/Resources/config/services/resolver.xml b/src/Resources/config/services/resolver.xml deleted file mode 100644 index 1f7ad82d..00000000 --- a/src/Resources/config/services/resolver.xml +++ /dev/null @@ -1,43 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - %bitbag_sylius_wishlist_plugin.parameters.wishlist_cookie_token% - - - - - - - - - - - - - - - sylius_shop_product_thumbnail - - - diff --git a/src/Resources/public/bitbag-wishlist-admin.css b/src/Resources/public/bitbag-wishlist-admin.css deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Resources/public/bitbag-wishlist-admin.js b/src/Resources/public/bitbag-wishlist-admin.js deleted file mode 100644 index e69de29b..00000000 diff --git a/src/Resources/public/bitbag-wishlist-shop.css b/src/Resources/public/bitbag-wishlist-shop.css deleted file mode 100644 index 5e7bef51..00000000 --- a/src/Resources/public/bitbag-wishlist-shop.css +++ /dev/null @@ -1 +0,0 @@ -.bb-wishlist-actions{align-items:center;display:flex;justify-content:flex-end;margin:1.875em 0 .9375em}.bb-wishlist-item{align-items:center;border-bottom:1px solid #e9ecef;display:grid;padding:.625em}@media screen and (max-width:768px){.bb-wishlist-item{grid-column-gap:.625em;grid-row-gap:.9375em;grid-template-areas:"image name name" "image price price" "variant variant variant" "quantity quantity actions";grid-template-columns:1fr 1.5fr 1fr}.bb-wishlist-item:first-of-type{display:none}}@media screen and (min-width:768px){.bb-wishlist-item{grid-column-gap:1.25em;grid-template-areas:"image name price quantity actions" "image variant price quantity actions";grid-template-columns:100px 5fr 1fr 1fr 1fr;grid-template-rows:1fr auto}}.bb-wishlist-item-image{grid-area:image}.bb-wishlist-item-name{font-size:1.2em;font-weight:700;grid-area:name}.bb-wishlist-item-variant{grid-area:variant}.bb-wishlist-item-price{grid-area:price;padding-right:1.25em}@media screen and (min-width:768px){.bb-wishlist-item-price{text-align:right}}.bb-wishlist-item-quantity{align-items:center;grid-area:quantity}.bb-wishlist-item-actions{align-items:center;display:flex;grid-area:actions;justify-content:center}.bb-wishlist-variant{grid-gap:.9375em;align-items:center;display:grid;font-size:.85em;margin:0}@media screen and (max-width:768px){.bb-wishlist-variant{grid-template-columns:1fr}}@media screen and (min-width:768px){.bb-wishlist-variant{grid-template-columns:repeat(3,1fr)}}.bb-wishlist-variant-label{display:block;margin:0 0 .3125em}.bb-wishlist-variant-select{font-size:.85em;font-weight:700;line-height:1}.bb-wishlist{font-size:16px} \ No newline at end of file diff --git a/src/Resources/public/bitbag-wishlist-shop.js b/src/Resources/public/bitbag-wishlist-shop.js deleted file mode 100644 index ff01afdc..00000000 --- a/src/Resources/public/bitbag-wishlist-shop.js +++ /dev/null @@ -1 +0,0 @@ -(()=>{"use strict";function e(e,t,r,n,i,a,o){try{var c=e[a](o),u=c.value}catch(e){return void r(e)}c.done?t(u):Promise.resolve(u).then(n,i)}function t(t){return function(){var r=this,n=arguments;return new Promise((function(i,a){var o=t.apply(r,n);function c(t){e(o,i,a,c,u,"next",t)}function u(t){e(o,i,a,c,u,"throw",t)}c(void 0)}))}}function r(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function n(e,t){for(var r=0;r1&&void 0!==arguments[1]?arguments[1]:{};if(r(this,e),null==t||!t.nodeType)throw new Error("The first parameter must be a NodeElement");var a=n.selectors;this.node=t,this.selectors=Object.assign({},i,a)}var a,o,c,u,s;return a=e,o=[{key:"init",value:function(){var e=this;this.node.addEventListener("click",(function(t){return e._addVariantToWishlist(t)}))}},{key:"_addVariantToWishlist",value:(s=t(regeneratorRuntime.mark((function e(t){var r;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return t.preventDefault(),e.next=3,this._getWishlistVariantUri();case 3:r=e.sent,this._redirectToWishlist(r);case 5:case"end":return e.stop()}}),e,this)}))),function(e){return s.apply(this,arguments)})},{key:"_getWishlistVariantUri",value:(u=t(regeneratorRuntime.mark((function e(){var t,r,n;return regeneratorRuntime.wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.prev=0,t=document.querySelector(this.selectors.form),(r=new FormData(t)).append(this.node.name,""),e.next=6,fetch(t.action,{method:"POST",body:r});case 6:return n=e.sent,e.next=9,n.text();case 9:return e.abrupt("return",e.sent);case 12:e.prev=12,e.t0=e.catch(0),console.error(e.t0);case 15:case"end":return e.stop()}}),e,this,[[0,12]])}))),function(){return u.apply(this,arguments)})},{key:"_redirectToWishlist",value:function(e){location.href=e}}],o&&n(a.prototype,o),c&&n(a,c),e}();function o(e,t){for(var r=0;re.length)&&(t=e.length);for(var r=0,n=new Array(t);r - - {{ 'bitbag_sylius_wishlist_plugin.ui.add_to_wishlist'|trans }} - - {% else %} - - {% endif %} -{% else %} - {% if findAllByAnonymousAndChannel(sylius.channel)|length < 2 %} - - - {{ 'bitbag_sylius_wishlist_plugin.ui.add_to_wishlist'|trans }} - - {% else %} - - {% endif %} -{% endif %} - - diff --git a/src/Resources/views/Common/_removeFromWishlist.html.twig b/src/Resources/views/Common/_removeFromWishlist.html.twig deleted file mode 100644 index 45067ac9..00000000 --- a/src/Resources/views/Common/_removeFromWishlist.html.twig +++ /dev/null @@ -1,9 +0,0 @@ - - - diff --git a/src/Resources/views/Common/widget.html.twig b/src/Resources/views/Common/widget.html.twig deleted file mode 100644 index 0ff3e771..00000000 --- a/src/Resources/views/Common/widget.html.twig +++ /dev/null @@ -1,25 +0,0 @@ -{% if wishlists|length < 2 %} - - {% set wishlistId = 0 %} - {% set wishlistProductsCount = 0 %} - - {% for data in wishlists %} - {% set wishlistId = data.id %} - {% set wishlistProductsCount = data.wishlistProducts.count %} - {% endfor %} - - - - - {{- wishlistProductsCount -}} - - -{% else %} - - - - - {{- wishlists|length -}} - - -{% endif %} diff --git a/src/Resources/views/CreateWishlist/index.html.twig b/src/Resources/views/CreateWishlist/index.html.twig deleted file mode 100644 index 423de849..00000000 --- a/src/Resources/views/CreateWishlist/index.html.twig +++ /dev/null @@ -1,19 +0,0 @@ -{% extends '@SyliusShop/layout.html.twig' %} - -{% import '@SyliusUi/Macro/messages.html.twig' as messages %} -{% form_theme form '@SyliusShop/Form/theme.html.twig' %} - -{% block content %} - {{ form_start(form) }} -

- {{ ('bitbag_sylius_wishlist_plugin.ui.change_wishlist_name'|trans) }} -

-
-
- {{ form_row(form.name) }} -
- - {{ form_row(form.save) }} -
- {{ form_end(form) }} -{% endblock %} diff --git a/src/Resources/views/Product/Box/_content.html.twig b/src/Resources/views/Product/Box/_content.html.twig deleted file mode 100644 index 04f4b3a2..00000000 --- a/src/Resources/views/Product/Box/_content.html.twig +++ /dev/null @@ -1,38 +0,0 @@ -{% import "@SyliusShop/Common/Macro/money.html.twig" as money %} - -
- -
-
-
-
{{ 'sylius.ui.view_more'|trans }}
-
-
-
- {% include '@SyliusShop/Product/_mainImage.html.twig' with {'product': product} %} -
-
- - {{ product.name }} - - - {% if not product.enabledVariants.empty() %} - {% set variant = product|sylius_resolve_variant %} - {% set price = money.calculatePrice(variant) %} - {% set originalPrice = money.calculateOriginalPrice(variant) %} - {% set appliedPromotions = variant.getAppliedPromotionsForChannel(sylius.channel) %} - - {% include '@SyliusShop/Product/Show/_catalogPromotionLabels.html.twig' with {'appliedPromotions': appliedPromotions, 'withDescription': false} %} - - {% if variant|sylius_has_discount({'channel': sylius.channel}) %} -
{{ originalPrice }}
- {% endif %} -
{{ price }}
- {% endif %} -
- - {% include '@BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig' %} -
-
diff --git a/src/Resources/views/Product/Show/_addToCart.html.twig b/src/Resources/views/Product/Show/_addToCart.html.twig deleted file mode 100644 index 2362e941..00000000 --- a/src/Resources/views/Product/Show/_addToCart.html.twig +++ /dev/null @@ -1,49 +0,0 @@ -{% set product = order_item.variant.product %} - -{% form_theme form '@SyliusShop/Form/theme.html.twig' %} - -
- {{ sylius_template_event('sylius.shop.product.show.before_add_to_cart', {'product': product, 'order_item': order_item}) }} - {{ form_start(form, { - 'action': path('sylius_shop_ajax_cart_add_item', {'productId': product.id}), - 'attr': { - 'id': 'sylius-product-adding-to-cart', - 'class': 'ui loadable form', - 'novalidate': 'novalidate', - 'autocomplete': 'off', - 'data-redirect': path(configuration.getRedirectRoute('summary')) - } - }) }} - - {{ form_errors(form) }} - - - - {% if not product.simple %} - {% if product.variantSelectionMethodChoice %} - {% include '@SyliusShop/Product/Show/_variants.html.twig' %} - {% else %} - {% include '@SyliusShop/Product/Show/_options.html.twig' %} - {% endif %} - {% endif %} - - {{ form_row(form.cartItem.quantity) }} - - {{ sylius_template_event('sylius.shop.product.show.add_to_cart_form', { - 'product': product, - 'order_item': order_item, - 'form': form - }) }} - -
- - - {% include '@BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig' %} -
- {{ form_row(form._token) }} - {{ form_end(form, {'render_rest': false}) }} -
diff --git a/src/Resources/views/Shop/_scripts.html.twig b/src/Resources/views/Shop/_scripts.html.twig deleted file mode 100644 index fafb7380..00000000 --- a/src/Resources/views/Shop/_scripts.html.twig +++ /dev/null @@ -1 +0,0 @@ -{{ encore_entry_script_tags('bitbag-wishlist-shop', null, 'wishlist_shop') }} diff --git a/src/Resources/views/Shop/_styles.html.twig b/src/Resources/views/Shop/_styles.html.twig deleted file mode 100644 index 49e9dd7f..00000000 --- a/src/Resources/views/Shop/_styles.html.twig +++ /dev/null @@ -1 +0,0 @@ -{{ encore_entry_link_tags('bitbag-wishlist-shop', null, 'wishlist_shop') }} diff --git a/src/Resources/views/WishlistDetails/_collectiveActions.html.twig b/src/Resources/views/WishlistDetails/_collectiveActions.html.twig deleted file mode 100644 index 09b97633..00000000 --- a/src/Resources/views/WishlistDetails/_collectiveActions.html.twig +++ /dev/null @@ -1,55 +0,0 @@ -{% if app.user %} - {% set wishlists = findAllByShopUserAndToken(app.user) %} -{% else %} - {% set wishlists = findAllByAnonymous() %} -{% endif %} - diff --git a/src/Resources/views/WishlistDetails/_globalActions.html.twig b/src/Resources/views/WishlistDetails/_globalActions.html.twig deleted file mode 100644 index d3b696f9..00000000 --- a/src/Resources/views/WishlistDetails/_globalActions.html.twig +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - diff --git a/src/Resources/views/WishlistDetails/_variantPrice.html.twig b/src/Resources/views/WishlistDetails/_variantPrice.html.twig deleted file mode 100644 index 32111660..00000000 --- a/src/Resources/views/WishlistDetails/_variantPrice.html.twig +++ /dev/null @@ -1,28 +0,0 @@ -{% import "@SyliusShop/Common/Macro/money.html.twig" as money %} - -{% set pricing = sylius_product_variant_prices(product, sylius.channel) %} - -{% set prices %} - [ - {%- for price in pricing -%} - { - {%- for option, value in price -%} - "{{- option -}}": - {%- if option == 'value' or option == 'original-price' -%} - "{{ money.convertAndFormat(value) -}}" - {%- elseif not value is iterable -%} - "{{ value|replace({'\"': '\''}) -}}" - {%- else -%} - "" - {%- endif -%} - {{- not loop.last ? ', '-}} - {%- endfor -%} - } - {{- not loop.last ? ', '-}} - {%- endfor -%} - ] -{% endset %} - - - {{ money.calculatePrice(variant) }} - diff --git a/src/Resources/views/WishlistDetails/index.html.twig b/src/Resources/views/WishlistDetails/index.html.twig deleted file mode 100644 index 84de2fd3..00000000 --- a/src/Resources/views/WishlistDetails/index.html.twig +++ /dev/null @@ -1,94 +0,0 @@ -{% extends '@SyliusShop/layout.html.twig' %} - -{% import '@SyliusUi/Macro/messages.html.twig' as messages %} - -{% block content %} -

- -
- {{ wishlist.name }} -
-

- {% if sylius.channel is not null %} - {% set wishlists = findAllByAnonymousAndChannel(sylius.channel) %} - {% else %} - {% set wishlists = findAllByAnonymous() %} - {% endif %} - {% if wishlists|length > 1 %} - {% else %} -
- - -
- {% endif %} - - - {% if wishlist.wishlistProducts.count > 0 %} - - - - - {{ form_start(form, { attr: { class: 'bb-wishlist ui form', id: "wishlist_form" } }) }} - -
- -
-
- -
-
- {{ 'sylius.ui.item'|trans }} -
-
- {{ 'sylius.ui.unit_price'|trans }} -
-
- {{ 'sylius.ui.qty'|trans }} -
-
- {{ 'sylius.ui.actions'|trans }} -
-
- - {% for itemForm in form.items %} - {% include "@BitBagSyliusWishlistPlugin/WishlistDetails/_item.html.twig" %} - - {% endfor %} - -
- {% include "@BitBagSyliusWishlistPlugin/WishlistDetails/_collectiveActions.html.twig" %} - {% include "@BitBagSyliusWishlistPlugin/WishlistDetails/_globalActions.html.twig" %} -
- -
- - {{ form_row(form._token) }} - {{ form_end(form, {'render_rest': false} ) }} - {% else %} -
-
- {{ messages.info('bitbag_sylius_wishlist_plugin.ui.your_wishlist_is_empty'|trans) }} -
- - - -
- {% endif %} - -{% endblock %} diff --git a/src/Resources/views/WishlistGroup/index.html.twig b/src/Resources/views/WishlistGroup/index.html.twig deleted file mode 100644 index 0e7f237a..00000000 --- a/src/Resources/views/WishlistGroup/index.html.twig +++ /dev/null @@ -1,88 +0,0 @@ -{% extends '@SyliusShop/layout.html.twig' %} - -{% import '@SyliusUi/Macro/messages.html.twig' as messages %} - -{% block content %} - - -
-
-

-
- {{ 'bitbag_sylius_wishlist_plugin.ui.your_wishlists'|trans }} -
-

-
-
- - -
-
- - -
- {% for wishlist in wishlists %} - - {% endfor %} -
- -{% endblock %} diff --git a/src/Resources/views/_cart.html.twig b/src/Resources/views/_cart.html.twig deleted file mode 100644 index 0ce557b2..00000000 --- a/src/Resources/views/_cart.html.twig +++ /dev/null @@ -1,4 +0,0 @@ -
- {% include '@BitBagSyliusWishlistPlugin/_wishlist_header.html.twig' %} - {{ render(url('sylius_shop_partial_cart_summary', {'template': '@SyliusShop/Cart/_widget.html.twig'})) }} -
diff --git a/src/Resources/views/_wishlist_header.html.twig b/src/Resources/views/_wishlist_header.html.twig deleted file mode 100644 index 4a5581a2..00000000 --- a/src/Resources/views/_wishlist_header.html.twig +++ /dev/null @@ -1 +0,0 @@ -{{ render(url('bitbag_sylius_wishlist_plugin_shop_wishlist_render_header_template')) }} diff --git a/src/Serializer/ContextBuilder/WishlistTokenValueAwareContextBuilder.php b/src/Serializer/ContextBuilder/WishlistTokenValueAwareContextBuilder.php new file mode 100644 index 00000000..24b4c12d --- /dev/null +++ b/src/Serializer/ContextBuilder/WishlistTokenValueAwareContextBuilder.php @@ -0,0 +1,45 @@ +decoratedContextBuilder->createFromRequest($request, $normalization, $extractedAttributes); + + $token = $request->attributes->get('token'); + if (null === $token) { + return $context; + } + + $wishlist = $this->wishlistRepository->findByToken($token); + if (null !== $wishlist) { + $context[ContextKeys::WISHLIST] = $wishlist; + } + + return $context; + } +} diff --git a/src/Serializer/ContextKeys.php b/src/Serializer/ContextKeys.php new file mode 100644 index 00000000..749f6e42 --- /dev/null +++ b/src/Serializer/ContextKeys.php @@ -0,0 +1,19 @@ +decoratedDenormalizer->denormalize($data, $type, $format, $context); + + if ($object instanceof WishlistTokenValueAwareInterface && + isset($context['wishlist']) && + $context['wishlist'] instanceof WishlistInterface + ) { + $object->setWishlist($context['wishlist']); + } + + return $object; + } + + public function supportsDenormalization(mixed $data, string $type, ?string $format = null, array $context = []): bool + { + if (method_exists($this->decoratedDenormalizer, 'supportsDenormalization') && + (new \ReflectionMethod($this->decoratedDenormalizer, 'supportsDenormalization'))->getNumberOfParameters() >= 4) { + /** + * @phpstan-ignore-next-line Method signature mismatch is handled by runtime reflection logic for Symfony 6.4/7+ compatibility. + */ + return $this->decoratedDenormalizer->supportsDenormalization($data, $type, $format, $context); + } + + // Fallback for symfony ^6.4 + return $this->decoratedDenormalizer->supportsDenormalization($data, $type, $format); + } + + public function getSupportedTypes(?string $format): array + { + return $this->decoratedDenormalizer->getSupportedTypes($format); + } +} diff --git a/src/BitBagSyliusWishlistPlugin.php b/src/SyliusWishlistPlugin.php similarity index 65% rename from src/BitBagSyliusWishlistPlugin.php rename to src/SyliusWishlistPlugin.php index 44ae9c32..e78fc7cc 100644 --- a/src/BitBagSyliusWishlistPlugin.php +++ b/src/SyliusWishlistPlugin.php @@ -1,27 +1,34 @@ containerExtension = $this->createContainerExtension() ?? false; diff --git a/src/Twig/Component/Product/AddToWishlistComponent.php b/src/Twig/Component/Product/AddToWishlistComponent.php new file mode 100644 index 00000000..61d39968 --- /dev/null +++ b/src/Twig/Component/Product/AddToWishlistComponent.php @@ -0,0 +1,103 @@ +initializeProduct($productRepository); + $this->initializeProductVariant($productVariantRepository); + } + + #[PostMount] + public function postMount(): void + { + /** @var ProductVariantInterface|null $variant * */ + $variant = $this->productVariantResolver->getVariant($this->product); + $this->variant = $variant; + } + + #[LiveListener(AddToCartFormComponent::SYLIUS_SHOP_VARIANT_CHANGED)] + public function updateProductVariant(#[LiveArg] mixed $variantId): void + { + if (null === $variantId) { + $this->variant = null; + + return; + } + + $changedVariant = $this->productVariantRepository->find($variantId); + + if ($changedVariant === $this->variant) { + return; + } + + $this->variant = $changedVariant?->isEnabled() ? $changedVariant : null; + } + + #[LiveAction] + public function addToWishlist(#[LiveArg] ?int $wishlistId = null): RedirectResponse + { + return $this->addProductVariantToWishlistProcessor->process( + $this->variant, + $wishlistId, + ); + } + + protected function instantiateForm(): FormInterface + { + return $this->formFactory->createNamed( + 'add_to_wishlist', + AddToWishlistType::class, + ); + } +} diff --git a/src/Twig/WishlistExtension.php b/src/Twig/WishlistExtension.php index 501ae8b4..0a3b2253 100644 --- a/src/Twig/WishlistExtension.php +++ b/src/Twig/WishlistExtension.php @@ -1,27 +1,29 @@ + {% if is_single_wishlist %} + + {{ ux_icon('mdi:heart', {'class': 'icon icon-sm'}) }} + {{ 'sylius_wishlist_plugin.ui.add_to_wishlist'|trans }} + + {% else %} + + {% endif %} + diff --git a/templates/common/remove_from_wishlist.html.twig b/templates/common/remove_from_wishlist.html.twig new file mode 100644 index 00000000..2d841b76 --- /dev/null +++ b/templates/common/remove_from_wishlist.html.twig @@ -0,0 +1,9 @@ + + {{ ux_icon('flowbite:x-outline', {'class': 'icon icon-sm'}) }} + diff --git a/templates/common/widget.html.twig b/templates/common/widget.html.twig new file mode 100644 index 00000000..58aa096f --- /dev/null +++ b/templates/common/widget.html.twig @@ -0,0 +1,24 @@ +{% if wishlists|length < 2 %} + + {% set wishlistId = 0 %} + {% set wishlistProductsCount = 0 %} + + {% for data in wishlists %} + {% set wishlistId = data.id %} + {% set wishlistProductsCount = data.wishlistProducts.count %} + {% endfor %} + + + {{ ux_icon('mdi:heart-outline') }} + + {{- wishlistProductsCount -}} + + +{% else %} + + {{ ux_icon('material-symbols:list') }} + + {{- wishlists|length -}} + + +{% endif %} diff --git a/src/Resources/views/importWishlist.html.twig b/templates/import_wishlist.html.twig similarity index 56% rename from src/Resources/views/importWishlist.html.twig rename to templates/import_wishlist.html.twig index a739c961..d4c18cfc 100644 --- a/src/Resources/views/importWishlist.html.twig +++ b/templates/import_wishlist.html.twig @@ -1,15 +1,14 @@ -{% extends '@SyliusShop/layout.html.twig' %} +{% extends '@SyliusShop/shared/layout/base.html.twig' %} -{% block content %} +{% form_theme form '@SyliusShop/form/theme.html.twig' %} -

- -
- {{ 'bitbag_sylius_wishlist_plugin.ui.import_from_csv'|trans }} -
-

+{% block content %} +
+

+ {{ 'sylius_wishlist_plugin.ui.import_from_csv'|trans }} +

- {{ form_start(form, { attr: { class: 'import-wishlist ui form', id: "wishlist_import_form" } }) }} + {{ form_start(form, { attr: { class: 'import-wishlist ui form', id: "wishlist_import_form" } }) }}
{{ form_widget(form.wishlist_file, { attr: { class: "ui input", } } ) }} @@ -21,6 +20,6 @@ {{ form_widget(form.submit, { attr: { class: "ui primary button", } } ) }}
- {{ form_end(form) }} - + {{ form_end(form) }} +
{% endblock %} diff --git a/templates/product/show/add_to_wishlist.html.twig b/templates/product/show/add_to_wishlist.html.twig new file mode 100644 index 00000000..3ef7d400 --- /dev/null +++ b/templates/product/show/add_to_wishlist.html.twig @@ -0,0 +1,48 @@ +{# Rendered with \Sylius\WishlistPlugin\Twig\Component\Product\AddToWishlistComponent #} + +{% set product = variant.product %} +{% set has_multiple_wishlists_to_choose_from = form.wishlists is defined and form.wishlists.vars.choices|length > 0 %} + +
+ {{ form_start(form, {'attr': {'data-action': 'live#action:prevent live#$render', 'data-live-action-param': 'addToWishlist'}}) }} + {{ form_errors(form) }} + + {% if not has_multiple_wishlists_to_choose_from %} + + {% else %} + + {% endif %} + + {{ form_row(form._token) }} + {{ form_end(form, {'render_rest': false}) }} +
diff --git a/templates/wishlist_details/collective_actions.html.twig b/templates/wishlist_details/collective_actions.html.twig new file mode 100644 index 00000000..495dab18 --- /dev/null +++ b/templates/wishlist_details/collective_actions.html.twig @@ -0,0 +1,69 @@ +{% if app.user %} + {% set wishlists = findAllByShopUserAndToken(app.user) %} +{% else %} + {% set wishlists = findAllByAnonymous() %} +{% endif %} + +{% set btn_class = 'btn btn-icon btn-outline-secondary text-nowrap w-100 justify-content-start' %} + + diff --git a/templates/wishlist_details/global_actions.html.twig b/templates/wishlist_details/global_actions.html.twig new file mode 100644 index 00000000..16da8194 --- /dev/null +++ b/templates/wishlist_details/global_actions.html.twig @@ -0,0 +1,19 @@ + + + + + + diff --git a/templates/wishlist_details/index.html.twig b/templates/wishlist_details/index.html.twig new file mode 100644 index 00000000..e79c7dd7 --- /dev/null +++ b/templates/wishlist_details/index.html.twig @@ -0,0 +1,92 @@ +{% extends '@SyliusShop/shared/layout/base.html.twig' %} + +{% import '@SyliusShop/shared/messages.html.twig' as messages %} + +{% block title %}{{ 'sylius_wishlist_plugin.ui.your_wishlist'|trans }} | {{ parent() }}{% endblock %} + +{% block content %} +
+

+ {{ wishlist.name }} +

+ {% if sylius.channel is not null %} + {% set wishlists = findAllByAnonymousAndChannel(sylius.channel) %} + {% else %} + {% set wishlists = findAllByAnonymous() %} + {% endif %} + {% if wishlists|length > 1 %} + {% else %} +
+ {% if wishlist.wishlistProducts.count > 0 %} + + {{ ux_icon('bx:x') }}{{ 'sylius_wishlist_plugin.ui.clear_wishlist'|trans }} + + {% endif %} + + +
+ {% endif %} + +
+ + {% if wishlist.wishlistProducts.count > 0 %} +
+ + {{ form_start(form, { attr: { class: 'bb-wishlist ui form', id: "wishlist_form" } }) }} + +
+
+
+ +
+
+ {{ 'sylius.ui.item'|trans }} +
+
+ {{ 'sylius.ui.unit_price'|trans }} +
+
+ {{ 'sylius.ui.qty'|trans }} +
+
+ {{ 'sylius.ui.actions'|trans }} +
+
+ + {% for itemForm in form.items %} + {% include "@SyliusWishlistPlugin/wishlist_details/item.html.twig" %} + + {% endfor %} + +
+ {% include "@SyliusWishlistPlugin/wishlist_details/collective_actions.html.twig" %} + {% include "@SyliusWishlistPlugin/wishlist_details/global_actions.html.twig" %} +
+ +
+ + {{ form_row(form._token) }} + {{ form_end(form, {'render_rest': false} ) }} + {% else %} + {{ messages.info('sylius_wishlist_plugin.ui.your_wishlist_is_empty'|trans) }} + + + + {% endif %} +
+{% endblock %} diff --git a/src/Resources/views/WishlistDetails/_item.html.twig b/templates/wishlist_details/item.html.twig similarity index 77% rename from src/Resources/views/WishlistDetails/_item.html.twig rename to templates/wishlist_details/item.html.twig index 2e09692c..aff6e413 100644 --- a/src/Resources/views/WishlistDetails/_item.html.twig +++ b/templates/wishlist_details/item.html.twig @@ -1,4 +1,4 @@ -{% import "@SyliusShop/Common/Macro/money.html.twig" as money %} +{% form_theme form '@SyliusShop/form/theme.html.twig' %} {% set variant = itemForm.vars.value.wishlistProduct.variant %} {% set product = variant.product %} @@ -6,23 +6,19 @@ {% set itemId = "wishlist_item_#{ variant.id }_#{ product.id }" %}
-
- {{ form_widget(itemForm.selected, { id: product.name }) }} + {{ form_widget(itemForm.selected, { id: product.name, label: false }) }}
-
- {% include '@SyliusShop/Product/_mainImage.html.twig' %} + {{ component('sylius_shop:main_image', { product: product }) }}
- -
- {% if itemForm.cartItem.cartItem.variant is defined %} + {% if itemForm.cartItem.cartItem.variant is defined %}
{% for child in itemForm.cartItem.cartItem.variant.children %}
@@ -33,13 +29,11 @@
{% endif %}
-
{% if not product.variants.empty() %} - {% include '@BitBagSyliusWishlistPlugin/WishlistDetails/_variantPrice.html.twig' %} + {% include '@SyliusWishlistPlugin/wishlist_details/variant_price.html.twig' %} {% endif %}
-
{{ form_widget(itemForm.cartItem.cartItem.quantity, { 'attr': { @@ -49,11 +43,7 @@ } }) }}
-
- {% include '@BitBagSyliusWishlistPlugin/Common/_removeFromWishlist.html.twig' %} + {% include '@SyliusWishlistPlugin/common/remove_from_wishlist.html.twig' %}
- - {{ sonata_block_render_event('sylius.shop.product.index.after_box', {'product': product}) }} -
diff --git a/templates/wishlist_details/variant_price.html.twig b/templates/wishlist_details/variant_price.html.twig new file mode 100644 index 00000000..62dcdbc4 --- /dev/null +++ b/templates/wishlist_details/variant_price.html.twig @@ -0,0 +1,6 @@ +{% import "@SyliusCore/Common/Macro/money.html.twig" as money %} + + + {{ money.convertAndFormat(variant|sylius_calculate_price({'channel': sylius.channel})) }} + + diff --git a/templates/wishlist_group/index.html.twig b/templates/wishlist_group/index.html.twig new file mode 100644 index 00000000..b4206410 --- /dev/null +++ b/templates/wishlist_group/index.html.twig @@ -0,0 +1,83 @@ +{% extends '@SyliusShop/shared/layout/base.html.twig' %} + +{% import '@SyliusShop/shared/messages.html.twig' as messages %} + +{% block content %} +
+
+
+

+ {{ 'sylius_wishlist_plugin.ui.your_wishlists'|trans }} +

+
+ + +
+
+
+
+ {% for wishlist in wishlists %} + + {% endfor %} +
+ +
+{% endblock %} diff --git a/templates/wishlist_header.html.twig b/templates/wishlist_header.html.twig new file mode 100644 index 00000000..4c039285 --- /dev/null +++ b/templates/wishlist_header.html.twig @@ -0,0 +1,3 @@ +
+ {{ render(url('sylius_wishlist_plugin_shop_wishlist_render_header_template')) }} +
diff --git a/src/Resources/views/_wishlist_pdf.html.twig b/templates/wishlist_pdf.html.twig similarity index 88% rename from src/Resources/views/_wishlist_pdf.html.twig rename to templates/wishlist_pdf.html.twig index 48586e2c..ff63025e 100644 --- a/src/Resources/views/_wishlist_pdf.html.twig +++ b/templates/wishlist_pdf.html.twig @@ -1,4 +1,4 @@ -{% import "@SyliusShop/Common/Macro/money.html.twig" as money %} +{% import "@SyliusCore/Common/Macro/money.html.twig" as money %} @@ -35,10 +35,10 @@ {{ product.variant.product.code }} {{ product.actualVariant }} {{ product.quantity }} - {{ money.calculatePrice(product.variant.product|sylius_resolve_variant) }} + {{ money.convertAndFormat(product.variant|sylius_calculate_price({'channel': sylius.channel})) }} {% endfor %} - \ No newline at end of file + diff --git a/tests/Application/.env.test b/tests/Application/.env.test index f17b0129..f1c24412 100755 --- a/tests/Application/.env.test +++ b/tests/Application/.env.test @@ -1,7 +1,7 @@ APP_ENV=test APP_SECRET='ch4mb3r0f5ecr3ts' -KERNEL_CLASS='Tests\BitBag\SyliusWishlistPlugin\Application\Kernel' +KERNEL_CLASS='Tests\Sylius\WishlistPlugin\Application\Kernel' DATABASE_URL='sqlite:///%kernel.project_dir%/var/data.db' ###> lexik/jwt-authentication-bundle ### diff --git a/tests/Application/Kernel.php b/tests/Application/Kernel.php index 10e4b4a8..f1eaaea9 100755 --- a/tests/Application/Kernel.php +++ b/tests/Application/Kernel.php @@ -2,10 +2,9 @@ declare(strict_types=1); -namespace Tests\BitBag\SyliusWishlistPlugin\Application; +namespace Tests\Sylius\WishlistPlugin\Application; use PSS\SymfonyMockerContainer\DependencyInjection\MockerContainer; -use Sylius\Bundle\CoreBundle\Application\Kernel as SyliusKernel; use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait; use Symfony\Component\Config\Loader\DelegatingLoader; use Symfony\Component\Config\Loader\LoaderInterface; @@ -25,6 +24,7 @@ use Symfony\Component\HttpKernel\Kernel as BaseKernel; use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator; use Webmozart\Assert\Assert; +use winzou\Bundle\StateMachineBundle\winzouStateMachineBundle; final class Kernel extends BaseKernel { @@ -51,6 +51,10 @@ public function registerBundles(): iterable } yield from $this->registerBundlesFromFile($bundlesFile); } + + if (class_exists(winzouStateMachineBundle::class)) { + yield new winzouStateMachineBundle(); + } } protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void @@ -58,18 +62,11 @@ protected function configureContainer(ContainerBuilder $container, LoaderInterfa $container->addResource(new FileResource($this->getProjectDir() . '/config/bundles.php')); $container->setParameter('container.dumper.inline_class_loader', true); $confDir = $this->getProjectDir() . '/config'; - $syliusDir = $this->getProjectDir() . '/config/sylius/' . SyliusKernel::MAJOR_VERSION . '.' . SyliusKernel::MINOR_VERSION; $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob'); $loader->load($confDir . '/{packages}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob'); $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob'); $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob'); - if (is_dir($syliusDir)) { - $loader->load($syliusDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob'); - $loader->load($syliusDir . '/{packages}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob'); - $loader->load($syliusDir . '/{services}' . self::CONFIG_EXTS, 'glob'); - $loader->load($syliusDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob'); - } $loader->load($confDir . '/{api_resources}/*' . self::CONFIG_EXTS, 'glob'); } diff --git a/tests/Application/assets/admin/entry.js b/tests/Application/assets/admin/entry.js deleted file mode 100644 index 635f5acc..00000000 --- a/tests/Application/assets/admin/entry.js +++ /dev/null @@ -1 +0,0 @@ -import 'sylius/bundle/AdminBundle/Resources/private/entry'; diff --git a/tests/Application/assets/admin/entrypoint.js b/tests/Application/assets/admin/entrypoint.js new file mode 100644 index 00000000..f3274ec2 --- /dev/null +++ b/tests/Application/assets/admin/entrypoint.js @@ -0,0 +1 @@ +import '../../../../assets/entrypoint'; diff --git a/tests/Application/assets/shop/entry.js b/tests/Application/assets/shop/entry.js deleted file mode 100644 index aadc3174..00000000 --- a/tests/Application/assets/shop/entry.js +++ /dev/null @@ -1 +0,0 @@ -import 'sylius/bundle/ShopBundle/Resources/private/entry'; diff --git a/tests/Application/assets/shop/entrypoint.js b/tests/Application/assets/shop/entrypoint.js new file mode 100644 index 00000000..f3274ec2 --- /dev/null +++ b/tests/Application/assets/shop/entrypoint.js @@ -0,0 +1 @@ +import '../../../../assets/entrypoint'; diff --git a/tests/Application/bin/console b/tests/Application/bin/console index e03721f7..3fc0b017 100755 --- a/tests/Application/bin/console +++ b/tests/Application/bin/console @@ -3,7 +3,7 @@ declare(strict_types=1); -use Tests\BitBag\SyliusWishlistPlugin\Application\Kernel; +use Tests\Sylius\WishlistPlugin\Application\Kernel; use Symfony\Bundle\FrameworkBundle\Console\Application; use Symfony\Component\Console\Input\ArgvInput; use Symfony\Component\Debug\Debug; diff --git a/tests/Application/composer.json b/tests/Application/composer.json index ecaabfd1..b113a830 100755 --- a/tests/Application/composer.json +++ b/tests/Application/composer.json @@ -1,5 +1,5 @@ { - "name": "bitbag/wishlist-plugin-test-application", + "name": "sylius/wishlist-plugin-test-application", "description": "Sylius application for plugin testing purposes (composer.json needed for project dir resolving)", "license": "MIT" } diff --git a/tests/Application/config/bundles.php b/tests/Application/config/bundles.php index 5368176a..8d06af1f 100755 --- a/tests/Application/config/bundles.php +++ b/tests/Application/config/bundles.php @@ -30,11 +30,6 @@ Sylius\Bundle\CoreBundle\SyliusCoreBundle::class => ['all' => true], Sylius\Bundle\ResourceBundle\SyliusResourceBundle::class => ['all' => true], Sylius\Bundle\GridBundle\SyliusGridBundle::class => ['all' => true], - winzou\Bundle\StateMachineBundle\winzouStateMachineBundle::class => ['all' => true], - Sonata\BlockBundle\SonataBlockBundle::class => ['all' => true], - Bazinga\Bundle\HateoasBundle\BazingaHateoasBundle::class => ['all' => true], - JMS\SerializerBundle\JMSSerializerBundle::class => ['all' => true], - FOS\RestBundle\FOSRestBundle::class => ['all' => true], Knp\Bundle\GaufretteBundle\KnpGaufretteBundle::class => ['all' => true], Knp\Bundle\MenuBundle\KnpMenuBundle::class => ['all' => true], Liip\ImagineBundle\LiipImagineBundle::class => ['all' => true], @@ -46,7 +41,6 @@ Sylius\Bundle\ThemeBundle\SyliusThemeBundle::class => ['all' => true], Sylius\Bundle\AdminBundle\SyliusAdminBundle::class => ['all' => true], Sylius\Bundle\ShopBundle\SyliusShopBundle::class => ['all' => true], - ApiPlatform\Core\Bridge\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], Sylius\Bundle\ApiBundle\SyliusApiBundle::class => ['all' => true], Symfony\Bundle\DebugBundle\DebugBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], Symfony\Bundle\WebProfilerBundle\WebProfilerBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], @@ -56,11 +50,17 @@ Sylius\Behat\Application\SyliusTestPlugin\SyliusTestPlugin::class => ['test' => true, 'test_cached' => true], Lexik\Bundle\JWTAuthenticationBundle\LexikJWTAuthenticationBundle::class => ['all' => true], SyliusLabs\DoctrineMigrationsExtraBundle\SyliusLabsDoctrineMigrationsExtraBundle::class => ['all' => true], - BitBag\SyliusWishlistPlugin\BitBagSyliusWishlistPlugin::class => ['all' => true], + Sylius\WishlistPlugin\SyliusWishlistPlugin::class => ['all' => true], Symfony\WebpackEncoreBundle\WebpackEncoreBundle::class => ['all' => true], League\FlysystemBundle\FlysystemBundle::class => ['all' => true], - Sylius\Calendar\SyliusCalendarBundle::class => ['all' => true], BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true], - SyliusLabs\Polyfill\Symfony\Security\Bundle\SyliusLabsPolyfillSymfonySecurityBundle::class => ['all' => true], Sylius\Abstraction\StateMachine\SyliusStateMachineAbstractionBundle::class => ['all' => true], + ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], + Sylius\TwigHooks\SyliusTwigHooksBundle::class => ['all' => true], + Sylius\TwigExtra\Symfony\SyliusTwigExtraBundle::class => ['all' => true], + Symfony\UX\TwigComponent\TwigComponentBundle::class => ['all' => true], + Symfony\UX\Icons\UXIconsBundle::class => ['all' => true], + Symfony\UX\LiveComponent\LiveComponentBundle::class => ['all' => true], + Symfony\UX\Autocomplete\AutocompleteBundle::class => ['all' => true], + Symfony\UX\StimulusBundle\StimulusBundle::class => ['all' => true], ]; diff --git a/tests/Application/config/packages/_sylius.yaml b/tests/Application/config/packages/_sylius.yaml index c011bee6..9cd95d9e 100755 --- a/tests/Application/config/packages/_sylius.yaml +++ b/tests/Application/config/packages/_sylius.yaml @@ -3,9 +3,10 @@ imports: - { resource: "@SyliusAdminBundle/Resources/config/app/config.yml" } - { resource: "@SyliusShopBundle/Resources/config/app/config.yml" } - { resource: "@SyliusApiBundle/Resources/config/app/config.yaml" } + - { resource: "@SyliusPayumBundle/Resources/config/app/config.yaml" } sylius_api: - enabled: true + enabled: true parameters: sylius_core.public_dir: '%kernel.project_dir%/public' @@ -19,3 +20,19 @@ sylius_shop: sylius_state_machine_abstraction: graphs_to_adapters_mapping: sylius_refund_refund_payment: '%test_sylius_state_machine_adapter%' + +sylius_twig_hooks: + hooks: + 'sylius_admin.base#stylesheets': + app_styles: + template: 'admin/stylesheets.html.twig' + 'sylius_admin.base#javascripts': + app_javascripts: + template: 'admin/javascripts.html.twig' + + 'sylius_shop.base#stylesheets': + app_styles: + template: 'shop/stylesheets.html.twig' + 'sylius_shop.base#javascripts': + app_javascripts: + template: 'shop/javascripts.html.twig' diff --git a/tests/Application/config/packages/api_platform.yaml b/tests/Application/config/packages/api_platform.yaml new file mode 100644 index 00000000..a3a47cec --- /dev/null +++ b/tests/Application/config/packages/api_platform.yaml @@ -0,0 +1,9 @@ +api_platform: + mapping: + paths: + - '%kernel.project_dir%/../../config/api_platform' + - '%kernel.project_dir%/config/api_platform' + patch_formats: + json: ['application/merge-patch+json'] + swagger: + versions: [3] diff --git a/tests/Application/config/packages/assets.yaml b/tests/Application/config/packages/assets.yaml index e7f38497..73f9d566 100644 --- a/tests/Application/config/packages/assets.yaml +++ b/tests/Application/config/packages/assets.yaml @@ -5,7 +5,7 @@ framework: json_manifest_path: '%kernel.project_dir%/public/build/shop/manifest.json' admin: json_manifest_path: '%kernel.project_dir%/public/build/admin/manifest.json' - wishlist_shop: - json_manifest_path: '%kernel.project_dir%/public/build/bitbag/wishlist/shop/manifest.json' - wishlist_admin: - json_manifest_path: '%kernel.project_dir%/public/build/bitbag/wishlist/admin/manifest.json' + app.admin: + json_manifest_path: '%kernel.project_dir%/public/build/app/admin/manifest.json' + app.shop: + json_manifest_path: '%kernel.project_dir%/public/build/app/shop/manifest.json' diff --git a/tests/Application/config/packages/bitbag_sylius_wishlist_plugin.yaml b/tests/Application/config/packages/bitbag_sylius_wishlist_plugin.yaml deleted file mode 100644 index 75c5f9e2..00000000 --- a/tests/Application/config/packages/bitbag_sylius_wishlist_plugin.yaml +++ /dev/null @@ -1,2 +0,0 @@ -imports: - - { resource: "@BitBagSyliusWishlistPlugin/Resources/config/config.yml" } diff --git a/tests/Application/config/packages/dev/jms_serializer.yaml b/tests/Application/config/packages/dev/jms_serializer.yaml deleted file mode 100755 index 2f32a9b1..00000000 --- a/tests/Application/config/packages/dev/jms_serializer.yaml +++ /dev/null @@ -1,12 +0,0 @@ -jms_serializer: - visitors: - json_serialization: - options: - - JSON_PRETTY_PRINT - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION - json_deserialization: - options: - - JSON_PRETTY_PRINT - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION diff --git a/tests/Application/config/packages/doctrine.yaml b/tests/Application/config/packages/doctrine.yaml index f51ba5a2..e5e4b2c3 100755 --- a/tests/Application/config/packages/doctrine.yaml +++ b/tests/Application/config/packages/doctrine.yaml @@ -8,7 +8,7 @@ parameters: doctrine: dbal: driver: 'pdo_mysql' - server_version: '5.7' + server_version: '8.0' charset: UTF8 url: '%env(resolve:DATABASE_URL)%' diff --git a/tests/Application/config/packages/fos_rest.yaml b/tests/Application/config/packages/fos_rest.yaml deleted file mode 100755 index a72eef7c..00000000 --- a/tests/Application/config/packages/fos_rest.yaml +++ /dev/null @@ -1,11 +0,0 @@ -fos_rest: - exception: true - view: - formats: - json: true - xml: true - empty_content: 204 - format_listener: - rules: - - { path: '^/api/.*', priorities: ['json', 'xml'], fallback_format: json, prefer_extension: true } - - { path: '^/', stop: true } diff --git a/tests/Application/config/packages/http_discovery.yaml b/tests/Application/config/packages/http_discovery.yaml new file mode 100644 index 00000000..2a789e73 --- /dev/null +++ b/tests/Application/config/packages/http_discovery.yaml @@ -0,0 +1,10 @@ +services: + Psr\Http\Message\RequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ResponseFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\ServerRequestFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\StreamFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UploadedFileFactoryInterface: '@http_discovery.psr17_factory' + Psr\Http\Message\UriFactoryInterface: '@http_discovery.psr17_factory' + + http_discovery.psr17_factory: + class: Http\Discovery\Psr17Factory diff --git a/tests/Application/config/packages/prod/jms_serializer.yaml b/tests/Application/config/packages/prod/jms_serializer.yaml deleted file mode 100755 index c2881820..00000000 --- a/tests/Application/config/packages/prod/jms_serializer.yaml +++ /dev/null @@ -1,10 +0,0 @@ -jms_serializer: - visitors: - json_serialization: - options: - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION - json_deserialization: - options: - - JSON_UNESCAPED_SLASHES - - JSON_PRESERVE_ZERO_FRACTION diff --git a/tests/Application/config/packages/security.yaml b/tests/Application/config/packages/security.yaml index c81f04ba..af38e750 100644 --- a/tests/Application/config/packages/security.yaml +++ b/tests/Application/config/packages/security.yaml @@ -1,5 +1,4 @@ security: - enable_authenticator_manager: true providers: sylius_admin_user_provider: id: sylius.admin_user_provider.email_or_name_based @@ -18,6 +17,7 @@ security: context: admin pattern: "%sylius.security.admin_regex%" provider: sylius_admin_user_provider + user_checker: security.user_checker.chain.admin form_login: provider: sylius_admin_user_provider login_path: sylius_admin_login @@ -39,26 +39,28 @@ security: path: sylius_admin_logout target: sylius_admin_login - new_api_admin_user: - pattern: "%sylius.security.new_api_admin_regex%/.*" + api_admin: + pattern: "%sylius.security.api_admin_regex%/.*" provider: sylius_api_admin_user_provider + user_checker: security.user_checker.chain.api_admin stateless: true entry_point: jwt json_login: - check_path: "%sylius.security.new_api_admin_route%/administrators/token" + check_path: "%sylius.security.api_admin_route%/administrators/token" username_path: email password_path: password success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure jwt: true - new_api_shop_user: - pattern: "%sylius.security.new_api_shop_regex%/.*" + api_shop: + pattern: "%sylius.security.api_shop_regex%/.*" provider: sylius_api_shop_user_provider + user_checker: security.user_checker.chain.api_shop stateless: true entry_point: jwt json_login: - check_path: "%sylius.security.new_api_shop_route%/customers/token" + check_path: "%sylius.security.api_shop_route%/customers/token" username_path: email password_path: password success_handler: lexik_jwt_authentication.handler.authentication_success @@ -70,6 +72,7 @@ security: context: shop pattern: "%sylius.security.shop_regex%" provider: sylius_shop_user_provider + user_checker: security.user_checker.chain.shop form_login: success_handler: sylius.authentication.success_handler failure_handler: sylius.authentication.failure_handler @@ -83,6 +86,12 @@ security: enable_csrf: true csrf_parameter: _csrf_shop_security_token csrf_token_id: shop_authenticate + json_login: + check_path: sylius_shop_json_login_check + username_path: _username + password_path: _password + success_handler: sylius.authentication.success_handler + failure_handler: sylius.authentication.failure_handler remember_me: secret: "%env(APP_SECRET)%" name: APP_SHOP_REMEMBER_ME @@ -93,19 +102,16 @@ security: target: sylius_shop_homepage invalidate_session: false - dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ - security: false - image_resolver: pattern: ^/media/cache/resolve security: false + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + access_control: - - { path: "%sylius.security.admin_regex%/_partial", role: PUBLIC_ACCESS, ips: [127.0.0.1, ::1] } - - { path: "%sylius.security.admin_regex%/_partial", role: ROLE_NO_ACCESS } - - { path: "%sylius.security.shop_regex%/_partial", role: PUBLIC_ACCESS, ips: [127.0.0.1, ::1] } - - { path: "%sylius.security.shop_regex%/_partial", role: ROLE_NO_ACCESS } + - { path: "%sylius.security.admin_regex%/forgotten-password", role: PUBLIC_ACCESS } - { path: "%sylius.security.admin_regex%/login", role: PUBLIC_ACCESS } - { path: "%sylius.security.shop_regex%/login", role: PUBLIC_ACCESS } @@ -116,9 +122,9 @@ security: - { path: "%sylius.security.admin_regex%", role: ROLE_ADMINISTRATION_ACCESS } - { path: "%sylius.security.shop_regex%/account", role: ROLE_USER } - - { path: "%sylius.security.new_api_admin_route%/administrators/reset-password", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS } - - { path: "%sylius.security.new_api_admin_route%/administrators/token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_user_account_regex%/.*", role: ROLE_USER } - - { path: "%sylius.security.new_api_shop_route%/customers/token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_shop_regex%/.*", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_admin_route%/administrators/reset-password", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_admin_regex%/.*", role: ROLE_API_ACCESS } + - { path: "%sylius.security.api_admin_route%/administrators/token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_shop_account_regex%/.*", role: ROLE_USER } + - { path: "%sylius.security.api_shop_route%/customers/token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.api_shop_regex%/.*", role: PUBLIC_ACCESS } diff --git a/tests/Application/config/packages/sylius_ui.yaml b/tests/Application/config/packages/sylius_ui.yaml deleted file mode 100644 index 26ae09d4..00000000 --- a/tests/Application/config/packages/sylius_ui.yaml +++ /dev/null @@ -1,32 +0,0 @@ -sylius_ui: - events: - sylius.shop.layout.header.grid: - blocks: - cart: - template: "@BitBagSyliusWishlistPlugin/_cart.html.twig" - priority: 10 - sylius.shop.product.index.box: - blocks: - content: - template: "@BitBagSyliusWishlistPlugin/Product/Box/_content.html.twig" - priority: 10 - sylius.shop.layout.javascripts: - blocks: - plugin_scripts: - template: "@BitBagSyliusWishlistPlugin/Shop/_scripts.html.twig" - priority: 20 - sylius.shop.layout.stylesheets: - blocks: - plugin_stylesheets: - template: "@BitBagSyliusWishlistPlugin/Shop/_styles.html.twig" - priority: 20 - sylius.admin.layout.javascripts: - blocks: - plugin_scripts: - template: "@BitBagSyliusWishlistPlugin/Admin/_scripts.html.twig" - priority: 20 - sylius.admin.layout.stylesheets: - blocks: - plugin_stylesheets: - template: "@BitBagSyliusWishlistPlugin/Admin/_styles.html.twig" - priority: 20 diff --git a/tests/Application/config/packages/sylius_wishlist_plugin.yaml b/tests/Application/config/packages/sylius_wishlist_plugin.yaml new file mode 100644 index 00000000..57cd6be6 --- /dev/null +++ b/tests/Application/config/packages/sylius_wishlist_plugin.yaml @@ -0,0 +1,2 @@ +imports: + - { resource: "@SyliusWishlistPlugin/config/config.yaml" } diff --git a/tests/Application/config/packages/test_cached/fos_rest.yaml b/tests/Application/config/packages/test_cached/fos_rest.yaml deleted file mode 100755 index 2b4189da..00000000 --- a/tests/Application/config/packages/test_cached/fos_rest.yaml +++ /dev/null @@ -1,3 +0,0 @@ -fos_rest: - exception: - debug: true diff --git a/tests/Application/config/packages/validator.yaml b/tests/Application/config/packages/validator.yaml old mode 100755 new mode 100644 index 61807db6..8ff7da13 --- a/tests/Application/config/packages/validator.yaml +++ b/tests/Application/config/packages/validator.yaml @@ -1,3 +1,3 @@ framework: validation: - enable_annotations: true + enable_attributes: true diff --git a/tests/Application/config/packages/webpack_encore.yaml b/tests/Application/config/packages/webpack_encore.yaml index 9e14060b..23ddaa20 100644 --- a/tests/Application/config/packages/webpack_encore.yaml +++ b/tests/Application/config/packages/webpack_encore.yaml @@ -3,5 +3,5 @@ webpack_encore: builds: shop: '%kernel.project_dir%/public/build/shop' admin: '%kernel.project_dir%/public/build/admin' - wishlist_shop: '%kernel.project_dir%/public/build/bitbag/wishlist/shop' - wishlist_admin: '%kernel.project_dir%/public/build/bitbag/wishlist/admin' + app.admin: '%kernel.project_dir%/public/build/app/admin' + app.shop: '%kernel.project_dir%/public/build/app/shop' diff --git a/tests/Application/config/resources.yml b/tests/Application/config/resources.yml deleted file mode 100644 index ea29f50e..00000000 --- a/tests/Application/config/resources.yml +++ /dev/null @@ -1,5 +0,0 @@ -sylius_order: - resources: - order_item: - classes: - controller: BitBag\SyliusWishlistPlugin\Controller\OrderItemController diff --git a/tests/Application/config/routes.yaml b/tests/Application/config/routes.yaml index ab44d02e..800a4e3b 100755 --- a/tests/Application/config/routes.yaml +++ b/tests/Application/config/routes.yaml @@ -1,2 +1,2 @@ -bitbag_sylius_wishlist_plugin: - resource: "@BitBagSyliusWishlistPlugin/Resources/config/routing.yml" +sylius_wishlist_plugin: + resource: "@SyliusWishlistPlugin/config/routes.yaml" diff --git a/tests/Application/config/routes/sylius_api.yaml b/tests/Application/config/routes/sylius_api.yaml index 4ed7e8f3..36a542f9 100644 --- a/tests/Application/config/routes/sylius_api.yaml +++ b/tests/Application/config/routes/sylius_api.yaml @@ -1,3 +1,3 @@ sylius_api: resource: "@SyliusApiBundle/Resources/config/routing.yml" - prefix: "%sylius.security.new_api_route%" + prefix: "%sylius.security.api_route%" diff --git a/tests/Application/config/routes/sylius_shop.yaml b/tests/Application/config/routes/sylius_shop.yaml index 9116420d..0d096a7a 100755 --- a/tests/Application/config/routes/sylius_shop.yaml +++ b/tests/Application/config/routes/sylius_shop.yaml @@ -2,13 +2,13 @@ sylius_shop: resource: "@SyliusShopBundle/Resources/config/routing.yml" prefix: /{_locale} requirements: - _locale: ^[a-z]{2}(?:_[A-Z]{2})?$ + _locale: ^[A-Za-z]{2,4}(_([A-Za-z]{4}|[0-9]{3}))?(_([A-Za-z]{2}|[0-9]{3}))?$ sylius_shop_payum: - resource: "@SyliusShopBundle/Resources/config/routing/payum.yml" + resource: "@SyliusPayumBundle/Resources/config/routing/integrations/sylius_shop.yaml" sylius_shop_default_locale: path: / methods: [GET] defaults: - _controller: sylius.controller.shop.locale_switch::switchAction + _controller: sylius_shop.controller.locale_switch::switchAction diff --git a/tests/Application/package.json b/tests/Application/package.json index dfe32583..96d31839 100755 --- a/tests/Application/package.json +++ b/tests/Application/package.json @@ -3,11 +3,19 @@ "scripts": { "build": "encore dev", "build:prod": "encore production", - "postinstall": "semantic-ui-css-patch", - "lint": "yarn lint:js", - "watch": "encore dev --watch" + "watch": "encore dev --watch", + "prod": "yarn build:prod" + }, + "dependencies": { + "@sylius-ui/admin": "file:../../vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle", + "@sylius-ui/shop": "file:../../vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle", + "@symfony/ux-autocomplete": "file:../../vendor/symfony/ux-autocomplete/assets", + "@symfony/ux-live-component": "file:../../vendor/symfony/ux-live-component/assets" }, "devDependencies": { - "@sylius-ui/frontend": "^1.0" + "@hotwired/stimulus": "^3.0.0", + "@symfony/stimulus-bridge": "^3.2.0", + "@symfony/webpack-encore": "^5.0.1", + "tom-select": "^2.2.2" } } diff --git a/tests/Application/public/index.php b/tests/Application/public/index.php index aa21ff6e..98569059 100755 --- a/tests/Application/public/index.php +++ b/tests/Application/public/index.php @@ -4,7 +4,7 @@ use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; -use Tests\BitBag\SyliusWishlistPlugin\Application\Kernel; +use Tests\Sylius\WishlistPlugin\Application\Kernel; require dirname(__DIR__) . '/config/bootstrap.php'; diff --git a/tests/Application/templates/admin/javascripts.html.twig b/tests/Application/templates/admin/javascripts.html.twig new file mode 100644 index 00000000..f6071973 --- /dev/null +++ b/tests/Application/templates/admin/javascripts.html.twig @@ -0,0 +1 @@ +{{ encore_entry_script_tags('app-admin-entry', null, 'app.admin') }} diff --git a/tests/Application/templates/admin/stylesheets.html.twig b/tests/Application/templates/admin/stylesheets.html.twig new file mode 100644 index 00000000..dc98d751 --- /dev/null +++ b/tests/Application/templates/admin/stylesheets.html.twig @@ -0,0 +1 @@ +{{ encore_entry_link_tags('app-admin-entry', null, 'app.admin') }} diff --git a/tests/Application/templates/bundles/SyliusShopBundle/Product/Show/_addToCart.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/Product/Show/_addToCart.html.twig deleted file mode 100644 index 915dad7b..00000000 --- a/tests/Application/templates/bundles/SyliusShopBundle/Product/Show/_addToCart.html.twig +++ /dev/null @@ -1 +0,0 @@ -{% include '@BitBagSyliusWishlistPlugin/Product/Show/_addToCart.html.twig' %} diff --git a/tests/Application/templates/bundles/SyliusShopBundle/product/common/card.html.twig b/tests/Application/templates/bundles/SyliusShopBundle/product/common/card.html.twig new file mode 100644 index 00000000..6cc4da06 --- /dev/null +++ b/tests/Application/templates/bundles/SyliusShopBundle/product/common/card.html.twig @@ -0,0 +1,20 @@ +
+ +
+
+ {{ component('sylius_shop:main_image', { product: product, class: "w-100 h-100 object-fit-cover" }) }} +
+
+
+ {{ product.name }} +
+
+
+ {% if not product.enabledVariants.empty() %} + {{ component('sylius_shop:catalog_promotions', { variant: variant, appliedPromotions: applied_promotions, withDescription: false }) }} + {{ component('sylius_shop:product:card:price', { variant: variant, template: '@SyliusShop/product/common/price.html.twig' }) }} + {% endif %} +
+
+ {% include '@SyliusWishlistPlugin/common/add_to_wishlist.html.twig' %} +
diff --git a/tests/Application/templates/shop/javascripts.html.twig b/tests/Application/templates/shop/javascripts.html.twig new file mode 100644 index 00000000..a659c2c1 --- /dev/null +++ b/tests/Application/templates/shop/javascripts.html.twig @@ -0,0 +1 @@ +{{ encore_entry_script_tags('app-shop-entry', null, 'app.shop') }} diff --git a/tests/Application/templates/shop/stylesheets.html.twig b/tests/Application/templates/shop/stylesheets.html.twig new file mode 100644 index 00000000..b439fca1 --- /dev/null +++ b/tests/Application/templates/shop/stylesheets.html.twig @@ -0,0 +1 @@ +{{ encore_entry_link_tags('app-shop-entry', null, 'app.shop') }} diff --git a/tests/Application/webpack.config.js b/tests/Application/webpack.config.js index 0b302b68..5bbadcb0 100644 --- a/tests/Application/webpack.config.js +++ b/tests/Application/webpack.config.js @@ -1,48 +1,47 @@ const path = require('path'); const Encore = require('@symfony/webpack-encore'); -const [bitbagWishlistShop, bitbagWishlistAdmin] = require('../../webpack.config.js') -const syliusBundles = path.resolve(__dirname, '../../vendor/sylius/sylius/src/Sylius/Bundle/'); -const uiBundleScripts = path.resolve(syliusBundles, 'UiBundle/Resources/private/js/'); -const uiBundleResources = path.resolve(syliusBundles, 'UiBundle/Resources/private/'); +const SyliusAdmin = require('@sylius-ui/admin'); +const SyliusShop = require('@sylius-ui/shop'); + +// Admin config +const adminConfig = SyliusAdmin.getWebpackConfig(path.resolve(__dirname)); // Shop config +const shopConfig = SyliusShop.getWebpackConfig(path.resolve(__dirname)); + +// App shop config Encore - .setOutputPath('public/build/shop/') - .setPublicPath('/build/shop') - .addEntry('shop-entry', './assets/shop/entry.js') - .disableSingleRuntimeChunk() - .cleanupOutputBeforeBuild() - .enableSourceMaps(!Encore.isProduction()) - .enableVersioning(Encore.isProduction()) - .enableSassLoader(); - -const shopConfig = Encore.getWebpackConfig(); - -shopConfig.resolve.alias['sylius/ui'] = uiBundleScripts; -shopConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; -shopConfig.resolve.alias['sylius/bundle'] = syliusBundles; -shopConfig.name = 'shop'; + .setOutputPath('public/build/app/shop') + .setPublicPath('/build/app/shop') + .addEntry('app-shop-entry', './assets/shop/entrypoint.js') + .disableSingleRuntimeChunk() + .cleanupOutputBeforeBuild() + .enableSourceMaps(!Encore.isProduction()) + .enableVersioning(Encore.isProduction()) + .enableSassLoader(); + +const appShopConfig = Encore.getWebpackConfig(); + +appShopConfig.externals = Object.assign({}, appShopConfig.externals, { window: 'window', document: 'document' }); +appShopConfig.name = 'app.shop'; Encore.reset(); -// Admin config +// App admin config Encore - .setOutputPath('public/build/admin/') - .setPublicPath('/build/admin') - .addEntry('admin-entry', './assets/admin/entry.js') - .disableSingleRuntimeChunk() - .cleanupOutputBeforeBuild() - .enableSourceMaps(!Encore.isProduction()) - .enableVersioning(Encore.isProduction()) - .enableSassLoader(); - -const adminConfig = Encore.getWebpackConfig(); - -adminConfig.resolve.alias['sylius/ui'] = uiBundleScripts; -adminConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources; -adminConfig.resolve.alias['sylius/bundle'] = syliusBundles; -adminConfig.externals = Object.assign({}, adminConfig.externals, { window: 'window', document: 'document' }); -adminConfig.name = 'admin'; - -module.exports = [shopConfig, adminConfig, bitbagWishlistShop, bitbagWishlistAdmin]; + .setOutputPath('public/build/app/admin') + .setPublicPath('/build/app/admin') + .addEntry('app-admin-entry', './assets/admin/entrypoint.js') + .disableSingleRuntimeChunk() + .cleanupOutputBeforeBuild() + .enableSourceMaps(!Encore.isProduction()) + .enableVersioning(Encore.isProduction()) + .enableSassLoader(); + +const appAdminConfig = Encore.getWebpackConfig(); + +appAdminConfig.externals = Object.assign({}, appAdminConfig.externals, { window: 'window', document: 'document' }); +appAdminConfig.name = 'app.admin'; + +module.exports = [shopConfig, adminConfig, appShopConfig, appAdminConfig]; diff --git a/tests/Application/yarn.lock b/tests/Application/yarn.lock new file mode 100644 index 00000000..2e25fb50 --- /dev/null +++ b/tests/Application/yarn.lock @@ -0,0 +1,3207 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@ampproject/remapping@^2.2.0": + version "2.3.0" + resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" + integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + +"@babel/code-frame@^7.26.2": + version "7.26.2" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.26.2.tgz#4b5fab97d33338eff916235055f0ebc21e573a85" + integrity sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ== + dependencies: + "@babel/helper-validator-identifier" "^7.25.9" + js-tokens "^4.0.0" + picocolors "^1.0.0" + +"@babel/compat-data@^7.20.5", "@babel/compat-data@^7.22.6", "@babel/compat-data@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.26.8.tgz#821c1d35641c355284d4a870b8a4a7b0c141e367" + integrity sha512-oH5UPLMWR3L2wEFLnFJ1TZXqHufiTKAiLfqw5zkhS4dKXLJ10yVztfil/twG8EDTA4F/tvVNw9nOl4ZMslB8rQ== + +"@babel/core@^7.17.0": + version "7.26.10" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.26.10.tgz#5c876f83c8c4dcb233ee4b670c0606f2ac3000f9" + integrity sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ== + dependencies: + "@ampproject/remapping" "^2.2.0" + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.26.10" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helpers" "^7.26.10" + "@babel/parser" "^7.26.10" + "@babel/template" "^7.26.9" + "@babel/traverse" "^7.26.10" + "@babel/types" "^7.26.10" + convert-source-map "^2.0.0" + debug "^4.1.0" + gensync "^1.0.0-beta.2" + json5 "^2.2.3" + semver "^6.3.1" + +"@babel/generator@^7.26.10", "@babel/generator@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.27.0.tgz#764382b5392e5b9aff93cadb190d0745866cbc2c" + integrity sha512-VybsKvpiN1gU1sdMZIp7FcqphVVKEwcuj02x73uvcHE0PTihx1nlBcowYWhDwjpoAXRv43+gDzyggGnn1XZhVw== + dependencies: + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + jsesc "^3.0.2" + +"@babel/helper-annotate-as-pure@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.25.9.tgz#d8eac4d2dc0d7b6e11fa6e535332e0d3184f06b4" + integrity sha512-gv7320KBUFJz1RnylIg5WWYPRXKZ884AGkYpgpWW02TH66Dl+HaC1t1CKd0z3R4b6hdYEcmrNZHUmfCP+1u3/g== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-compilation-targets@^7.20.7", "@babel/helper-compilation-targets@^7.22.6", "@babel/helper-compilation-targets@^7.25.9", "@babel/helper-compilation-targets@^7.26.5": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.0.tgz#de0c753b1cd1d9ab55d473c5a5cf7170f0a81880" + integrity sha512-LVk7fbXml0H2xH34dFzKQ7TDZ2G4/rVTOrq9V+icbbadjbVxxeFeDsNHv2SrZeWoA+6ZiTyWYWtScEIW07EAcA== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-validator-option" "^7.25.9" + browserslist "^4.24.0" + lru-cache "^5.1.1" + semver "^6.3.1" + +"@babel/helper-create-class-features-plugin@^7.25.9": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.27.0.tgz#518fad6a307c6a96f44af14912b2c20abe9bfc30" + integrity sha512-vSGCvMecvFCd/BdpGlhpXYNhhC4ccxyvQWpbGL4CWbvfEoLFWUZuSuf7s9Aw70flgQF+6vptvgK2IfOnKlRmBg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/helper-replace-supers" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/traverse" "^7.27.0" + semver "^6.3.1" + +"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.25.9": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.27.0.tgz#0e41f7d38c2ebe06ebd9cf0e02fb26019c77cd95" + integrity sha512-fO8l08T76v48BhpNRW/nQ0MxfnSdoSKUJBMjubOAYffsVuGG5qOfMq7N6Es7UJvi7Y8goXXo07EfcHZXDPuELQ== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + regexpu-core "^6.2.0" + semver "^6.3.1" + +"@babel/helper-define-polyfill-provider@^0.6.3", "@babel/helper-define-polyfill-provider@^0.6.4": + version "0.6.4" + resolved "https://registry.yarnpkg.com/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.6.4.tgz#15e8746368bfa671785f5926ff74b3064c291fab" + integrity sha512-jljfR1rGnXXNWnmQg2K3+bvhkxB51Rl32QRaOTuwwjviGrHzIbSc8+x9CpraDtbT7mfyjXObULP4w/adunNwAw== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + +"@babel/helper-member-expression-to-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.25.9.tgz#9dfffe46f727005a5ea29051ac835fb735e4c1a3" + integrity sha512-wbfdZ9w5vk0C0oyHqAJbc62+vet5prjj01jjJ8sKn3j9h3MQQlflEdXYvuqRWjHnM12coDEqiC1IRCi0U/EKwQ== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-imports@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz#e7f8d20602ebdbf9ebbea0a0751fb0f2a4141715" + integrity sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-module-transforms@^7.25.9", "@babel/helper-module-transforms@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.26.0.tgz#8ce54ec9d592695e58d84cd884b7b5c6a2fdeeae" + integrity sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-optimise-call-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.25.9.tgz#3324ae50bae7e2ab3c33f60c9a877b6a0146b54e" + integrity sha512-FIpuNaz5ow8VyrYcnXQTDRGvV6tTjkNtCK/RYNDXGSLlUD6cBuQTSw43CShGxjvfBTfcUA/r6UhUCbtYqkhcuQ== + dependencies: + "@babel/types" "^7.25.9" + +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.20.2", "@babel/helper-plugin-utils@^7.22.5", "@babel/helper-plugin-utils@^7.25.9", "@babel/helper-plugin-utils@^7.26.5", "@babel/helper-plugin-utils@^7.8.0": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz#18580d00c9934117ad719392c4f6585c9333cc35" + integrity sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg== + +"@babel/helper-remap-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.9.tgz#e53956ab3d5b9fb88be04b3e2f31b523afd34b92" + integrity sha512-IZtukuUeBbhgOcaW2s06OXTzVNJR0ybm4W5xC1opWFFJMZbwRj5LCk+ByYH7WdZPZTt8KnFwA8pvjN2yqcPlgw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-wrap-function" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/helper-replace-supers@^7.25.9", "@babel/helper-replace-supers@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz#6cb04e82ae291dae8e72335dfe438b0725f14c8d" + integrity sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg== + dependencies: + "@babel/helper-member-expression-to-functions" "^7.25.9" + "@babel/helper-optimise-call-expression" "^7.25.9" + "@babel/traverse" "^7.26.5" + +"@babel/helper-skip-transparent-expression-wrappers@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.25.9.tgz#0b2e1b62d560d6b1954893fd2b705dc17c91f0c9" + integrity sha512-K4Du3BFa3gvyhzgPcntrkDgZzQaq6uozzcpGbOO1OEJaI+EJdqWIMTLgFgQf6lrfiDFo5FU+BxKepI9RmZqahA== + dependencies: + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helper-string-parser@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz#1aabb72ee72ed35789b4bbcad3ca2862ce614e8c" + integrity sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA== + +"@babel/helper-validator-identifier@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz#24b64e2c3ec7cd3b3c547729b8d16871f22cbdc7" + integrity sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ== + +"@babel/helper-validator-option@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-validator-option/-/helper-validator-option-7.25.9.tgz#86e45bd8a49ab7e03f276577f96179653d41da72" + integrity sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw== + +"@babel/helper-wrap-function@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.25.9.tgz#d99dfd595312e6c894bd7d237470025c85eea9d0" + integrity sha512-ETzz9UTjQSTmw39GboatdymDq4XIQbR8ySgVrylRhPOFpsd+JrKHIuF0de7GCWmem+T4uC5z7EZguod7Wj4A4g== + dependencies: + "@babel/template" "^7.25.9" + "@babel/traverse" "^7.25.9" + "@babel/types" "^7.25.9" + +"@babel/helpers@^7.26.10": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.27.0.tgz#53d156098defa8243eab0f32fa17589075a1b808" + integrity sha512-U5eyP/CTFPuNE3qk+WZMxFkp/4zUzdceQlfzf7DdGdhp+Fezd7HD+i8Y24ZuTMKX3wQBld449jijbGq6OdGNQg== + dependencies: + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" + +"@babel/parser@^7.26.10", "@babel/parser@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.27.0.tgz#3d7d6ee268e41d2600091cbd4e145ffee85a44ec" + integrity sha512-iaepho73/2Pz7w2eMS0Q5f83+0RKI7i4xmiYeBmDzfRVbQtTOG7Ts0S4HzJVsTMGI9keU8rNfuZr8DKfSt7Yyg== + dependencies: + "@babel/types" "^7.27.0" + +"@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.9.tgz#cc2e53ebf0a0340777fff5ed521943e253b4d8fe" + integrity sha512-ZkRyVkThtxQ/J6nv3JFYv1RYY+JT5BvU0y3k5bWrmuG4woXypRa4PXmm9RhOwodRkYFWqC0C0cqcJ4OqR7kW+g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-bugfix-safari-class-field-initializer-scope@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.9.tgz#af9e4fb63ccb8abcb92375b2fcfe36b60c774d30" + integrity sha512-MrGRLZxLD/Zjj0gdU15dfs+HH/OXvnw/U4jJD8vpcP2CJQapPEv1IWwjc/qMg7ItBlPwSv1hRBbb7LeuANdcnw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.9.tgz#e8dc26fcd616e6c5bf2bd0d5a2c151d4f92a9137" + integrity sha512-2qUwwfAFpJLZqxd02YW9btUCZHl+RFvdDkNfZwaIJrvB8Tesjsk8pEQkTvGwZXLqXUx/2oyY3ySRhm6HOXuCug== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.25.9.tgz#807a667f9158acac6f6164b4beb85ad9ebc9e1d1" + integrity sha512-6xWgLZTJXwilVjlnV7ospI3xi+sl8lN8rXXbBD6vYn3UYDlGsag8wrZkKcSI8G6KgqKP7vNFaDgeDnfAABq61g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + +"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.9.tgz#de7093f1e7deaf68eadd7cc6b07f2ab82543269e" + integrity sha512-aLnMXYPnzwwqhYSCyXfKkIkYgJ8zv9RK+roo9DkTXz38ynIhd9XCbN08s3MGvqL2MYGVUGdRQLL/JqBIeJhJBg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-proposal-object-rest-spread@^7.20.7": + version "7.20.7" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz#aa662940ef425779c75534a5c41e9d936edc390a" + integrity sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg== + dependencies: + "@babel/compat-data" "^7.20.5" + "@babel/helper-compilation-targets" "^7.20.7" + "@babel/helper-plugin-utils" "^7.20.2" + "@babel/plugin-syntax-object-rest-spread" "^7.8.3" + "@babel/plugin-transform-parameters" "^7.20.7" + +"@babel/plugin-proposal-private-property-in-object@7.21.0-placeholder-for-preset-env.2": + version "7.21.0-placeholder-for-preset-env.2" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz#7844f9289546efa9febac2de4cfe358a050bd703" + integrity sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w== + +"@babel/plugin-syntax-import-assertions@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.26.0.tgz#620412405058efa56e4a564903b79355020f445f" + integrity sha512-QCWT5Hh830hK5EQa7XzuqIkQU9tT/whqbDz7kuaZMHFl1inRRg7JnuAEOQ0Ur0QUl0NufCk1msK2BeY79Aj/eg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-import-attributes@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.26.0.tgz#3b1412847699eea739b4f2602c74ce36f6b0b0f7" + integrity sha512-e2dttdsJ1ZTpi3B9UYGLw41hifAubg19AtCu/2I/F1QNVclOBr1dYpTdmdyZ84Xiz43BS/tCUkMAZNLv12Pi+A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-syntax-object-rest-spread@^7.8.3": + version "7.8.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz#60e225edcbd98a640332a2e72dd3e66f1af55871" + integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA== + dependencies: + "@babel/helper-plugin-utils" "^7.8.0" + +"@babel/plugin-syntax-unicode-sets-regex@^7.18.6": + version "7.18.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz#d49a3b3e6b52e5be6740022317580234a6a47357" + integrity sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.18.6" + "@babel/helper-plugin-utils" "^7.18.6" + +"@babel/plugin-transform-arrow-functions@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.25.9.tgz#7821d4410bee5daaadbb4cdd9a6649704e176845" + integrity sha512-6jmooXYIwn9ca5/RylZADJ+EnSxVUS5sjeJ9UPk6RWRzXCmOJCy6dqItPJFpw2cuCangPK4OYr5uhGKcmrm5Qg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-async-generator-functions@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.26.8.tgz#5e3991135e3b9c6eaaf5eff56d1ae5a11df45ff8" + integrity sha512-He9Ej2X7tNf2zdKMAGOsmg2MrFc+hfoAhd3po4cWfo/NWjzEAKa0oQruj1ROVUdl0e6fb6/kE/G3SSxE0lRJOg== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-remap-async-to-generator" "^7.25.9" + "@babel/traverse" "^7.26.8" + +"@babel/plugin-transform-async-to-generator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.25.9.tgz#c80008dacae51482793e5a9c08b39a5be7e12d71" + integrity sha512-NT7Ejn7Z/LjUH0Gv5KsBCxh7BH3fbLTV0ptHvpeMvrt3cPThHfJfst9Wrb7S8EvJ7vRTFI7z+VAvFVEQn/m5zQ== + dependencies: + "@babel/helper-module-imports" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-remap-async-to-generator" "^7.25.9" + +"@babel/plugin-transform-block-scoped-functions@^7.26.5": + version "7.26.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz#3dc4405d31ad1cbe45293aa57205a6e3b009d53e" + integrity sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-block-scoping@^7.25.9": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.27.0.tgz#acc2c0d98a7439bbde4244588ddbd4904701d47f" + integrity sha512-u1jGphZ8uDI2Pj/HJj6YQ6XQLZCNjOlprjxB5SVz6rq2T6SwAR+CdrWK0CP7F+9rDVMXdB0+r6Am5G5aobOjAQ== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-class-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.9.tgz#a8ce84fedb9ad512549984101fa84080a9f5f51f" + integrity sha512-bbMAII8GRSkcd0h0b4X+36GksxuheLFjP65ul9w6C3KgAamI3JqErNgSrosX6ZPj+Mpim5VvEbawXxJCyEUV3Q== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-class-static-block@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.26.0.tgz#6c8da219f4eb15cae9834ec4348ff8e9e09664a0" + integrity sha512-6J2APTs7BDDm+UMqP1useWqhcRAXo0WIoVj26N7kPFB6S73Lgvyka4KTZYIxtgYXiN5HTyRObA72N2iu628iTQ== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-classes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.9.tgz#7152457f7880b593a63ade8a861e6e26a4469f52" + integrity sha512-mD8APIXmseE7oZvZgGABDyM34GUmK45Um2TXiBUt7PnuAxrgoSVf123qUzPxEr/+/BHrRn5NMZCdE2m/1F8DGg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + "@babel/traverse" "^7.25.9" + globals "^11.1.0" + +"@babel/plugin-transform-computed-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.25.9.tgz#db36492c78460e534b8852b1d5befe3c923ef10b" + integrity sha512-HnBegGqXZR12xbcTHlJ9HGxw1OniltT26J5YpfruGqtUHlz/xKf/G2ak9e+t0rVqrjXa9WOhvYPz1ERfMj23AA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/template" "^7.25.9" + +"@babel/plugin-transform-destructuring@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.25.9.tgz#966ea2595c498224340883602d3cfd7a0c79cea1" + integrity sha512-WkCGb/3ZxXepmMiX101nnGiU+1CAdut8oHyEOHxkKuS1qKpU2SMXE2uSvfz8PBuLd49V6LEsbtyPhWC7fnkgvQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-dotall-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.25.9.tgz#bad7945dd07734ca52fe3ad4e872b40ed09bb09a" + integrity sha512-t7ZQ7g5trIgSRYhI9pIJtRl64KHotutUJsh4Eze5l7olJv+mRSg4/MmbZ0tv1eeqRbdvo/+trvJD/Oc5DmW2cA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-duplicate-keys@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.25.9.tgz#8850ddf57dce2aebb4394bb434a7598031059e6d" + integrity sha512-LZxhJ6dvBb/f3x8xwWIuyiAHy56nrRG3PeYTpBkkzkYRRQ6tJLu68lEF5VIqMUZiAV7a8+Tb78nEoMCMcqjXBw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-duplicate-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.9.tgz#6f7259b4de127721a08f1e5165b852fcaa696d31" + integrity sha512-0UfuJS0EsXbRvKnwcLjFtJy/Sxc5J5jhLHnFhy7u4zih97Hz6tJkLU+O+FMMrNZrosUPxDi6sYxJ/EA8jDiAog== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-dynamic-import@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.25.9.tgz#23e917de63ed23c6600c5dd06d94669dce79f7b8" + integrity sha512-GCggjexbmSLaFhqsojeugBpeaRIgWNTcgKVq/0qIteFEqY2A+b9QidYadrWlnbWQUrW5fn+mCvf3tr7OeBFTyg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-exponentiation-operator@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.26.3.tgz#e29f01b6de302c7c2c794277a48f04a9ca7f03bc" + integrity sha512-7CAHcQ58z2chuXPWblnn1K6rLDnDWieghSOEmqQsrBenH0P9InCUtOJYD89pvngljmZlJcz3fcmgYsXFNGa1ZQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-export-namespace-from@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.25.9.tgz#90745fe55053394f554e40584cda81f2c8a402a2" + integrity sha512-2NsEz+CxzJIVOPx2o9UsW1rXLqtChtLoVnwYHHiB04wS5sgn7mrV45fWMBX0Kk+ub9uXytVYfNP2HjbVbCB3Ww== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-for-of@^7.26.9": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.26.9.tgz#27231f79d5170ef33b5111f07fe5cafeb2c96a56" + integrity sha512-Hry8AusVm8LW5BVFgiyUReuoGzPUpdHQQqJY5bZnbbf+ngOHWuCuYFKw/BqaaWlvEUrF91HMhDtEaI1hZzNbLg== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-function-name@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.9.tgz#939d956e68a606661005bfd550c4fc2ef95f7b97" + integrity sha512-8lP+Yxjv14Vc5MuWBpJsoUCd3hD6V9DgBon2FVYL4jJgbnVQ9fTgYmonchzZJOVNgzEgbxp4OwAf6xz6M/14XA== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-json-strings@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.25.9.tgz#c86db407cb827cded902a90c707d2781aaa89660" + integrity sha512-xoTMk0WXceiiIvsaquQQUaLLXSW1KJ159KP87VilruQm0LNNGxWzahxSS6T6i4Zg3ezp4vA4zuwiNUR53qmQAw== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.9.tgz#1a1c6b4d4aa59bc4cad5b6b3a223a0abd685c9de" + integrity sha512-9N7+2lFziW8W9pBl2TzaNht3+pgMIRP74zizeCSrtnSKVdUl8mAjjOP2OOVQAfZ881P2cNjDj1uAMEdeD50nuQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-logical-assignment-operators@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.25.9.tgz#b19441a8c39a2fda0902900b306ea05ae1055db7" + integrity sha512-wI4wRAzGko551Y8eVf6iOY9EouIDTtPb0ByZx+ktDGHwv6bHFimrgJM/2T021txPZ2s4c7bqvHbd+vXG6K948Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-member-expression-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.25.9.tgz#63dff19763ea64a31f5e6c20957e6a25e41ed5de" + integrity sha512-PYazBVfofCQkkMzh2P6IdIUaCEWni3iYEerAsRWuVd8+jlM1S9S9cz1dF9hIzyoZ8IA3+OwVYIp9v9e+GbgZhA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-amd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.25.9.tgz#49ba478f2295101544abd794486cd3088dddb6c5" + integrity sha512-g5T11tnI36jVClQlMlt4qKDLlWnG5pP9CSM4GhdRciTNMRgkfpo5cR6b4rGIOYPgRRuFAvwjPQ/Yk+ql4dyhbw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-commonjs@^7.26.3": + version "7.26.3" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.26.3.tgz#8f011d44b20d02c3de44d8850d971d8497f981fb" + integrity sha512-MgR55l4q9KddUDITEzEFYn5ZsGDXMSsU9E+kh7fjRXTIC3RHqfCo8RPRbyReYJh44HQ/yomFkqbOFohXvDCiIQ== + dependencies: + "@babel/helper-module-transforms" "^7.26.0" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-modules-systemjs@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.9.tgz#8bd1b43836269e3d33307151a114bcf3ba6793f8" + integrity sha512-hyss7iIlH/zLHaehT+xwiymtPOpsiwIIRlCAOwBB04ta5Tt+lNItADdlXw3jAWZ96VJ2jlhl/c+PNIQPKNfvcA== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + "@babel/traverse" "^7.25.9" + +"@babel/plugin-transform-modules-umd@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.25.9.tgz#6710079cdd7c694db36529a1e8411e49fcbf14c9" + integrity sha512-bS9MVObUgE7ww36HEfwe6g9WakQ0KF07mQF74uuXdkoziUPfKyu/nIm663kz//e5O1nPInPFx36z7WJmJ4yNEw== + dependencies: + "@babel/helper-module-transforms" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-named-capturing-groups-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.25.9.tgz#454990ae6cc22fd2a0fa60b3a2c6f63a38064e6a" + integrity sha512-oqB6WHdKTGl3q/ItQhpLSnWWOpjUJLsOCLVyeFgeTktkBSCiurvPOsyt93gibI9CmuKvTUEtWmG5VhZD+5T/KA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-new-target@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.25.9.tgz#42e61711294b105c248336dcb04b77054ea8becd" + integrity sha512-U/3p8X1yCSoKyUj2eOBIx3FOn6pElFOKvAAGf8HTtItuPyB+ZeOqfn+mvTtg9ZlOAjsPdK3ayQEjqHjU/yLeVQ== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-nullish-coalescing-operator@^7.26.6": + version "7.26.6" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.6.tgz#fbf6b3c92cb509e7b319ee46e3da89c5bedd31fe" + integrity sha512-CKW8Vu+uUZneQCPtXmSBUC6NCAUdya26hWCElAWh5mVSlSRsmiCPUUDKb3Z0szng1hiAJa098Hkhg9o4SE35Qw== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-numeric-separator@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.25.9.tgz#bfed75866261a8b643468b0ccfd275f2033214a1" + integrity sha512-TlprrJ1GBZ3r6s96Yq8gEQv82s8/5HnCVHtEJScUj90thHQbwe+E5MLhi2bbNHBEJuzrvltXSru+BUxHDoog7Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-object-rest-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.25.9.tgz#0203725025074164808bcf1a2cfa90c652c99f18" + integrity sha512-fSaXafEE9CVHPweLYw4J0emp1t8zYTXyzN3UuG+lylqkvYd7RMrsOQ8TYx5RF231be0vqtFC6jnx3UmpJmKBYg== + dependencies: + "@babel/helper-compilation-targets" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + +"@babel/plugin-transform-object-super@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.25.9.tgz#385d5de135162933beb4a3d227a2b7e52bb4cf03" + integrity sha512-Kj/Gh+Rw2RNLbCK1VAWj2U48yxxqL2x0k10nPtSdRa0O2xnHXalD0s+o1A6a0W43gJ00ANo38jxkQreckOzv5A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-replace-supers" "^7.25.9" + +"@babel/plugin-transform-optional-catch-binding@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.25.9.tgz#10e70d96d52bb1f10c5caaac59ac545ea2ba7ff3" + integrity sha512-qM/6m6hQZzDcZF3onzIhZeDHDO43bkNNlOX0i8n3lR6zLbu0GN2d8qfM/IERJZYauhAHSLHy39NF0Ctdvcid7g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-optional-chaining@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.25.9.tgz#e142eb899d26ef715435f201ab6e139541eee7dd" + integrity sha512-6AvV0FsLULbpnXeBjrY4dmWF8F7gf8QnvTEoO/wX/5xm/xE1Xo8oPuD3MPS+KS9f9XBEAWN7X1aWr4z9HdOr7A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-parameters@^7.20.7", "@babel/plugin-transform-parameters@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.25.9.tgz#b856842205b3e77e18b7a7a1b94958069c7ba257" + integrity sha512-wzz6MKwpnshBAiRmn4jR8LYz/g8Ksg0o80XmwZDlordjwEk9SxBzTWC7F5ef1jhbrbOW2DJ5J6ayRukrJmnr0g== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-private-methods@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.9.tgz#847f4139263577526455d7d3223cd8bda51e3b57" + integrity sha512-D/JUozNpQLAPUVusvqMxyvjzllRaF8/nSrP1s2YGQT/W4LHK4xxsMcHjhOGTS01mp9Hda8nswb+FblLdJornQw== + dependencies: + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-private-property-in-object@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.25.9.tgz#9c8b73e64e6cc3cbb2743633885a7dd2c385fe33" + integrity sha512-Evf3kcMqzXA3xfYJmZ9Pg1OvKdtqsDMSWBDzZOPLvHiTt36E75jLDQo5w1gtRU95Q4E5PDttrTf25Fw8d/uWLw== + dependencies: + "@babel/helper-annotate-as-pure" "^7.25.9" + "@babel/helper-create-class-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-property-literals@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.25.9.tgz#d72d588bd88b0dec8b62e36f6fda91cedfe28e3f" + integrity sha512-IvIUeV5KrS/VPavfSM/Iu+RE6llrHrYIKY1yfCzyO/lMXHQ+p7uGhonmGVisv6tSBSVgWzMBohTcvkC9vQcQFA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-regenerator@^7.25.9": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.27.0.tgz#822feebef43d6a59a81f696b2512df5b1682db31" + integrity sha512-LX/vCajUJQDqE7Aum/ELUMZAY19+cDpghxrnyt5I1tV6X5PyC86AOoWXWFYFeIvauyeSA6/ktn4tQVn/3ZifsA== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + regenerator-transform "^0.15.2" + +"@babel/plugin-transform-regexp-modifiers@^7.26.0": + version "7.26.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.26.0.tgz#2f5837a5b5cd3842a919d8147e9903cc7455b850" + integrity sha512-vN6saax7lrA2yA/Pak3sCxuD6F5InBjn9IcrIKQPjpsLvuHYLVroTxjdlVRHjjBWxKOqIwpTXDkOssYT4BFdRw== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-reserved-words@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.25.9.tgz#0398aed2f1f10ba3f78a93db219b27ef417fb9ce" + integrity sha512-7DL7DKYjn5Su++4RXu8puKZm2XBPHyjWLUidaPEkCUBbE7IPcsrkRHggAOOKydH1dASWdcUBxrkOGNxUv5P3Jg== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-shorthand-properties@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.25.9.tgz#bb785e6091f99f826a95f9894fc16fde61c163f2" + integrity sha512-MUv6t0FhO5qHnS/W8XCbHmiRWOphNufpE1IVxhK5kuN3Td9FT1x4rx4K42s3RYdMXCXpfWkGSbCSd0Z64xA7Ng== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-spread@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.25.9.tgz#24a35153931b4ba3d13cec4a7748c21ab5514ef9" + integrity sha512-oNknIB0TbURU5pqJFVbOOFspVlrpVwo2H1+HUIsVDvp5VauGGDP1ZEvO8Nn5xyMEs3dakajOxlmkNW7kNgSm6A== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + "@babel/helper-skip-transparent-expression-wrappers" "^7.25.9" + +"@babel/plugin-transform-sticky-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.25.9.tgz#c7f02b944e986a417817b20ba2c504dfc1453d32" + integrity sha512-WqBUSgeVwucYDP9U/xNRQam7xV8W5Zf+6Eo7T2SRVUFlhRiMNFdFz58u0KZmCVVqs2i7SHgpRnAhzRNmKfi2uA== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-template-literals@^7.26.8": + version "7.26.8" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.26.8.tgz#966b15d153a991172a540a69ad5e1845ced990b5" + integrity sha512-OmGDL5/J0CJPJZTHZbi2XpO0tyT2Ia7fzpW5GURwdtp2X3fMmN8au/ej6peC/T33/+CRiIpA8Krse8hFGVmT5Q== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-typeof-symbol@^7.26.7": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.27.0.tgz#044a0890f3ca694207c7826d0c7a65e5ac008aae" + integrity sha512-+LLkxA9rKJpNoGsbLnAgOCdESl73vwYn+V6b+5wHbrE7OGKVDPHIQvbFSzqE6rwqaCw2RE+zdJrlLkcf8YOA0w== + dependencies: + "@babel/helper-plugin-utils" "^7.26.5" + +"@babel/plugin-transform-unicode-escapes@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.25.9.tgz#a75ef3947ce15363fccaa38e2dd9bc70b2788b82" + integrity sha512-s5EDrE6bW97LtxOcGj1Khcx5AaXwiMmi4toFWRDP9/y0Woo6pXC+iyPu/KuhKtfSrNFd7jJB+/fkOtZy6aIC6Q== + dependencies: + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-property-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.25.9.tgz#a901e96f2c1d071b0d1bb5dc0d3c880ce8f53dd3" + integrity sha512-Jt2d8Ga+QwRluxRQ307Vlxa6dMrYEMZCgGxoPR8V52rxPyldHu3hdlHspxaqYmE7oID5+kB+UKUB/eWS+DkkWg== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.25.9.tgz#5eae747fe39eacf13a8bd006a4fb0b5d1fa5e9b1" + integrity sha512-yoxstj7Rg9dlNn9UQxzk4fcNivwv4nUYz7fYXBaKxvw/lnmPuOm/ikoELygbYq68Bls3D/D+NBPHiLwZdZZ4HA== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/plugin-transform-unicode-sets-regex@^7.25.9": + version "7.25.9" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.9.tgz#65114c17b4ffc20fa5b163c63c70c0d25621fabe" + integrity sha512-8BYqO3GeVNHtx69fdPshN3fnzUNLrWdHhk/icSwigksJGczKSizZ+Z6SBCxTs723Fr5VSNorTIK7a+R2tISvwQ== + dependencies: + "@babel/helper-create-regexp-features-plugin" "^7.25.9" + "@babel/helper-plugin-utils" "^7.25.9" + +"@babel/preset-env@^7.25.8": + version "7.26.9" + resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.26.9.tgz#2ec64e903d0efe743699f77a10bdf7955c2123c3" + integrity sha512-vX3qPGE8sEKEAZCWk05k3cpTAE3/nOYca++JA+Rd0z2NCNzabmYvEiSShKzm10zdquOIAVXsy2Ei/DTW34KlKQ== + dependencies: + "@babel/compat-data" "^7.26.8" + "@babel/helper-compilation-targets" "^7.26.5" + "@babel/helper-plugin-utils" "^7.26.5" + "@babel/helper-validator-option" "^7.25.9" + "@babel/plugin-bugfix-firefox-class-in-computed-class-key" "^7.25.9" + "@babel/plugin-bugfix-safari-class-field-initializer-scope" "^7.25.9" + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.25.9" + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.25.9" + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.25.9" + "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" + "@babel/plugin-syntax-import-assertions" "^7.26.0" + "@babel/plugin-syntax-import-attributes" "^7.26.0" + "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" + "@babel/plugin-transform-arrow-functions" "^7.25.9" + "@babel/plugin-transform-async-generator-functions" "^7.26.8" + "@babel/plugin-transform-async-to-generator" "^7.25.9" + "@babel/plugin-transform-block-scoped-functions" "^7.26.5" + "@babel/plugin-transform-block-scoping" "^7.25.9" + "@babel/plugin-transform-class-properties" "^7.25.9" + "@babel/plugin-transform-class-static-block" "^7.26.0" + "@babel/plugin-transform-classes" "^7.25.9" + "@babel/plugin-transform-computed-properties" "^7.25.9" + "@babel/plugin-transform-destructuring" "^7.25.9" + "@babel/plugin-transform-dotall-regex" "^7.25.9" + "@babel/plugin-transform-duplicate-keys" "^7.25.9" + "@babel/plugin-transform-duplicate-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-dynamic-import" "^7.25.9" + "@babel/plugin-transform-exponentiation-operator" "^7.26.3" + "@babel/plugin-transform-export-namespace-from" "^7.25.9" + "@babel/plugin-transform-for-of" "^7.26.9" + "@babel/plugin-transform-function-name" "^7.25.9" + "@babel/plugin-transform-json-strings" "^7.25.9" + "@babel/plugin-transform-literals" "^7.25.9" + "@babel/plugin-transform-logical-assignment-operators" "^7.25.9" + "@babel/plugin-transform-member-expression-literals" "^7.25.9" + "@babel/plugin-transform-modules-amd" "^7.25.9" + "@babel/plugin-transform-modules-commonjs" "^7.26.3" + "@babel/plugin-transform-modules-systemjs" "^7.25.9" + "@babel/plugin-transform-modules-umd" "^7.25.9" + "@babel/plugin-transform-named-capturing-groups-regex" "^7.25.9" + "@babel/plugin-transform-new-target" "^7.25.9" + "@babel/plugin-transform-nullish-coalescing-operator" "^7.26.6" + "@babel/plugin-transform-numeric-separator" "^7.25.9" + "@babel/plugin-transform-object-rest-spread" "^7.25.9" + "@babel/plugin-transform-object-super" "^7.25.9" + "@babel/plugin-transform-optional-catch-binding" "^7.25.9" + "@babel/plugin-transform-optional-chaining" "^7.25.9" + "@babel/plugin-transform-parameters" "^7.25.9" + "@babel/plugin-transform-private-methods" "^7.25.9" + "@babel/plugin-transform-private-property-in-object" "^7.25.9" + "@babel/plugin-transform-property-literals" "^7.25.9" + "@babel/plugin-transform-regenerator" "^7.25.9" + "@babel/plugin-transform-regexp-modifiers" "^7.26.0" + "@babel/plugin-transform-reserved-words" "^7.25.9" + "@babel/plugin-transform-shorthand-properties" "^7.25.9" + "@babel/plugin-transform-spread" "^7.25.9" + "@babel/plugin-transform-sticky-regex" "^7.25.9" + "@babel/plugin-transform-template-literals" "^7.26.8" + "@babel/plugin-transform-typeof-symbol" "^7.26.7" + "@babel/plugin-transform-unicode-escapes" "^7.25.9" + "@babel/plugin-transform-unicode-property-regex" "^7.25.9" + "@babel/plugin-transform-unicode-regex" "^7.25.9" + "@babel/plugin-transform-unicode-sets-regex" "^7.25.9" + "@babel/preset-modules" "0.1.6-no-external-plugins" + babel-plugin-polyfill-corejs2 "^0.4.10" + babel-plugin-polyfill-corejs3 "^0.11.0" + babel-plugin-polyfill-regenerator "^0.6.1" + core-js-compat "^3.40.0" + semver "^6.3.1" + +"@babel/preset-modules@0.1.6-no-external-plugins": + version "0.1.6-no-external-plugins" + resolved "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz#ccb88a2c49c817236861fee7826080573b8a923a" + integrity sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA== + dependencies: + "@babel/helper-plugin-utils" "^7.0.0" + "@babel/types" "^7.4.4" + esutils "^2.0.2" + +"@babel/runtime@^7.8.4": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.27.0.tgz#fbee7cf97c709518ecc1f590984481d5460d4762" + integrity sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw== + dependencies: + regenerator-runtime "^0.14.0" + +"@babel/template@^7.25.9", "@babel/template@^7.26.9", "@babel/template@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.27.0.tgz#b253e5406cc1df1c57dcd18f11760c2dbf40c0b4" + integrity sha512-2ncevenBqXI6qRMukPlXwHKHchC7RyMuu4xv5JBXRfOGVcTy1mXCD12qrp7Jsoxll1EV3+9sE4GugBVRjT2jFA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/parser" "^7.27.0" + "@babel/types" "^7.27.0" + +"@babel/traverse@^7.25.9", "@babel/traverse@^7.26.10", "@babel/traverse@^7.26.5", "@babel/traverse@^7.26.8", "@babel/traverse@^7.27.0": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.27.0.tgz#11d7e644779e166c0442f9a07274d02cd91d4a70" + integrity sha512-19lYZFzYVQkkHkl4Cy4WrAVcqBkgvV2YM2TU3xG6DIwO7O3ecbDPfW3yM3bjAGcqcQHi+CCtjMR3dIEHxsd6bA== + dependencies: + "@babel/code-frame" "^7.26.2" + "@babel/generator" "^7.27.0" + "@babel/parser" "^7.27.0" + "@babel/template" "^7.27.0" + "@babel/types" "^7.27.0" + debug "^4.3.1" + globals "^11.1.0" + +"@babel/types@^7.25.9", "@babel/types@^7.26.10", "@babel/types@^7.27.0", "@babel/types@^7.4.4": + version "7.27.0" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.27.0.tgz#ef9acb6b06c3173f6632d993ecb6d4ae470b4559" + integrity sha512-H45s8fVLYjbhFH62dIJ3WtmJ6RSPt/3DRO0ZcT2SUiYiQyz3BLVb9ADEnLl91m74aQPS3AzzeajZHYOalWe3bg== + dependencies: + "@babel/helper-string-parser" "^7.25.9" + "@babel/helper-validator-identifier" "^7.25.9" + +"@discoveryjs/json-ext@^0.5.0": + version "0.5.7" + resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70" + integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw== + +"@hotwired/stimulus-webpack-helpers@^1.0.1": + version "1.0.1" + resolved "https://registry.yarnpkg.com/@hotwired/stimulus-webpack-helpers/-/stimulus-webpack-helpers-1.0.1.tgz#4cd74487adeca576c9865ac2b9fe5cb20cef16dd" + integrity sha512-wa/zupVG0eWxRYJjC1IiPBdt3Lruv0RqGN+/DTMmUWUyMAEB27KXmVY6a8YpUVTM7QwVuaLNGW4EqDgrS2upXQ== + +"@hotwired/stimulus@^3.0.0": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@hotwired/stimulus/-/stimulus-3.2.2.tgz#071aab59c600fed95b97939e605ff261a4251608" + integrity sha512-eGeIqNOQpXoPAIP7tC1+1Yc1yl1xnwYqg+3mzqxyrbE5pg5YFBZcA6YoTiByJB6DKAEsiWtl6tjTJS4IYtbB7A== + +"@jest/schemas@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/schemas/-/schemas-29.6.3.tgz#430b5ce8a4e0044a7e3819663305a7b3091c8e03" + integrity sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA== + dependencies: + "@sinclair/typebox" "^0.27.8" + +"@jest/types@^29.6.3": + version "29.6.3" + resolved "https://registry.yarnpkg.com/@jest/types/-/types-29.6.3.tgz#1131f8cf634e7e84c5e77bab12f052af585fba59" + integrity sha512-u3UPsIilWKOM3F9CXtrG8LEJmNxwoCQC/XVj4IKYXvvpx7QIi/Kg1LI5uDmDpKlac62NUtX7eLjRh+jVZcLOzw== + dependencies: + "@jest/schemas" "^29.6.3" + "@types/istanbul-lib-coverage" "^2.0.0" + "@types/istanbul-reports" "^3.0.0" + "@types/node" "*" + "@types/yargs" "^17.0.8" + chalk "^4.0.0" + +"@jridgewell/gen-mapping@^0.3.5": + version "0.3.8" + resolved "https://registry.yarnpkg.com/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz#4f0e06362e01362f823d348f1872b08f666d8142" + integrity sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA== + dependencies: + "@jridgewell/set-array" "^1.2.1" + "@jridgewell/sourcemap-codec" "^1.4.10" + "@jridgewell/trace-mapping" "^0.3.24" + +"@jridgewell/resolve-uri@^3.1.0": + version "3.1.2" + resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" + integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw== + +"@jridgewell/set-array@^1.2.1": + version "1.2.1" + resolved "https://registry.yarnpkg.com/@jridgewell/set-array/-/set-array-1.2.1.tgz#558fb6472ed16a4c850b889530e6b36438c49280" + integrity sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A== + +"@jridgewell/source-map@^0.3.3": + version "0.3.6" + resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.6.tgz#9d71ca886e32502eb9362c9a74a46787c36df81a" + integrity sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.25" + +"@jridgewell/sourcemap-codec@^1.4.10", "@jridgewell/sourcemap-codec@^1.4.14": + version "1.5.0" + resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz#3188bcb273a414b0d215fd22a58540b989b9409a" + integrity sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ== + +"@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25": + version "0.3.25" + resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0" + integrity sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + +"@nuxt/friendly-errors-webpack-plugin@^2.5.1": + version "2.6.0" + resolved "https://registry.yarnpkg.com/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.6.0.tgz#bd0cf6cd73b6e1d3e7c7f1c0de43333e69cc660c" + integrity sha512-3IZj6MXbzlvUxDncAxgBMLQwGPY/JlNhy2i+AGyOHCAReR5HcBxYjVRBvyaKM9R3s5k4OODYKeHAbrToZH/47w== + dependencies: + chalk "^2.4.2" + consola "^3.2.3" + error-stack-parser "^2.1.4" + string-width "^4.2.3" + +"@orchidjs/sifter@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@orchidjs/sifter/-/sifter-1.1.0.tgz#b36154ad0cda4898305d1ac44f318b41048a0438" + integrity sha512-mYwHCfr736cIWWdhhSZvDbf90AKt2xyrJspKFC3qyIJG1LtrJeJunYEqCGG4Aq2ijENbc4WkOjszcvNaIAS/pQ== + dependencies: + "@orchidjs/unicode-variants" "^1.1.2" + +"@orchidjs/unicode-variants@^1.1.2": + version "1.1.2" + resolved "https://registry.yarnpkg.com/@orchidjs/unicode-variants/-/unicode-variants-1.1.2.tgz#1fd71791a67fdd1591ebe0dcaadd3964537a824e" + integrity sha512-5DobW1CHgnBROOEpFlEXytED5OosEWESFvg/VYmH0143oXcijYTprRYJTs+55HzGM4IqxiLFSuqEzu9mPNwVsA== + +"@popperjs/core@^2.11.8": + version "2.11.8" + resolved "https://registry.yarnpkg.com/@popperjs/core/-/core-2.11.8.tgz#6b79032e760a0899cd4204710beede972a3a185f" + integrity sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A== + +"@sinclair/typebox@^0.27.8": + version "0.27.8" + resolved "https://registry.yarnpkg.com/@sinclair/typebox/-/typebox-0.27.8.tgz#6667fac16c436b5434a387a34dedb013198f6e6e" + integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== + +"@sylius-ui/admin@file:../../vendor/sylius/sylius/src/Sylius/Bundle/AdminBundle": + version "2.0.0" + dependencies: + "@babel/core" "^7.17.0" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" + "@babel/preset-env" "^7.25.8" + "@hotwired/stimulus" "^3.0.0" + "@popperjs/core" "^2.11.8" + "@symfony/stimulus-bridge" "^3.2.0" + "@symfony/webpack-encore" "^5.0.1" + "@tabler/core" "~1.0.0" + apexcharts "^3.41.0" + bootstrap "^5.3.3" + infinite-tree "^1.17.1" + sass "~1.64.2" + sass-loader "^16.0.1" + slugify "^1.6" + spotlight.js "^0.7.8" + stimulus-use "^0.52" + tom-select "^2.2.2" + webpack "^5.72" + webpack-cli "^5.1.4" + +"@sylius-ui/shop@file:../../vendor/sylius/sylius/src/Sylius/Bundle/ShopBundle": + version "2.0.0" + dependencies: + "@babel/core" "^7.17.0" + "@babel/plugin-proposal-object-rest-spread" "^7.20.7" + "@babel/preset-env" "^7.25.8" + "@hotwired/stimulus" "^3.0.0" + "@popperjs/core" "^2.11.8" + "@symfony/stimulus-bridge" "^3.2.0" + "@symfony/webpack-encore" "^5.0.1" + bootstrap "^5.3.3" + sass "~1.64.2" + sass-loader "^16.0.1" + spotlight.js "^0.7.8" + webpack "^5.72" + webpack-cli "^5.1.4" + +"@symfony/stimulus-bridge@^3.2.0": + version "3.2.3" + resolved "https://registry.yarnpkg.com/@symfony/stimulus-bridge/-/stimulus-bridge-3.2.3.tgz#1c496d4b11e24051be26a11045118f29f9c3f9b7" + integrity sha512-36rQTihQ2MGOn8EmdOYCr3DQfP3WS1CNcUUXKTPY5ghtFOeb7OVuhbc32AjRowE2/vaVDOUCPOTv3VLf5VtXBA== + dependencies: + "@hotwired/stimulus-webpack-helpers" "^1.0.1" + "@types/webpack-env" "^1.16.4" + acorn "^8.0.5" + loader-utils "^2.0.0" + schema-utils "^3.0.0" + +"@symfony/ux-autocomplete@file:../../vendor/symfony/ux-autocomplete/assets": + version "2.23.0" + +"@symfony/ux-live-component@file:../../vendor/symfony/ux-live-component/assets": + version "2.23.0" + dependencies: + idiomorph "^0.3.0" + +"@symfony/webpack-encore@^5.0.1": + version "5.1.0" + resolved "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-5.1.0.tgz#d5664153136959e3baf3e248c9b55350c2c81a6d" + integrity sha512-uSaRnssJj+ZHH9UcHRGI8kQzFb5hfCiPtBwP15vuKH5hTPGeJjQouDDo4UaPB3LuSYJXudKFiSDAnj/4d2z4aQ== + dependencies: + "@nuxt/friendly-errors-webpack-plugin" "^2.5.1" + babel-loader "^9.1.3" + css-loader "^7.1.0" + css-minimizer-webpack-plugin "^7.0.0" + fastest-levenshtein "^1.0.16" + mini-css-extract-plugin "^2.6.0" + picocolors "^1.1.0" + pretty-error "^4.0.0" + resolve-url-loader "^5.0.0" + semver "^7.3.2" + style-loader "^3.3.0" + tapable "^2.2.1" + terser-webpack-plugin "^5.3.0" + tmp "^0.2.1" + yargs-parser "^21.0.0" + +"@tabler/core@~1.0.0": + version "1.0.0" + resolved "https://registry.yarnpkg.com/@tabler/core/-/core-1.0.0.tgz#08736378108663b5893a31ad462be7d12e64be67" + integrity sha512-uFmv6f8TAaW2JaGwzjT1LfK+TjmBQSTCoznCMdV5uur4cv4TtJlV8Hh1Beu55YX0svMtOQ0Xts7tYv/+qBEcfA== + dependencies: + "@popperjs/core" "^2.11.8" + "@tabler/icons" "^3.29.0" + bootstrap "5.3.3" + +"@tabler/icons@^3.29.0": + version "3.31.0" + resolved "https://registry.yarnpkg.com/@tabler/icons/-/icons-3.31.0.tgz#92d39dc336f2e3e312170420b00ffe9ca474925e" + integrity sha512-dblAdeKY3+GA1U+Q9eziZ0ooVlZMHsE8dqP0RkwvRtEsAULoKOYaCUOcJ4oW1DjWegdxk++UAt2SlQVnmeHv+g== + +"@trysound/sax@0.2.0": + version "0.2.0" + resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad" + integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA== + +"@types/eslint-scope@^3.7.7": + version "3.7.7" + resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.7.tgz#3108bd5f18b0cdb277c867b3dd449c9ed7079ac5" + integrity sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg== + dependencies: + "@types/eslint" "*" + "@types/estree" "*" + +"@types/eslint@*": + version "9.6.1" + resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-9.6.1.tgz#d5795ad732ce81715f27f75da913004a56751584" + integrity sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag== + dependencies: + "@types/estree" "*" + "@types/json-schema" "*" + +"@types/estree@*", "@types/estree@^1.0.6": + version "1.0.7" + resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.7.tgz#4158d3105276773d5b7695cd4834b1722e4f37a8" + integrity sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ== + +"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz#7739c232a1fee9b4d3ce8985f314c0c6d33549d7" + integrity sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w== + +"@types/istanbul-lib-report@*": + version "3.0.3" + resolved "https://registry.yarnpkg.com/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz#53047614ae72e19fc0401d872de3ae2b4ce350bf" + integrity sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA== + dependencies: + "@types/istanbul-lib-coverage" "*" + +"@types/istanbul-reports@^3.0.0": + version "3.0.4" + resolved "https://registry.yarnpkg.com/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz#0f03e3d2f670fbdac586e34b433783070cc16f54" + integrity sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ== + dependencies: + "@types/istanbul-lib-report" "*" + +"@types/json-schema@*", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9": + version "7.0.15" + resolved "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.15.tgz#596a1747233694d50f6ad8a7869fcb6f56cf5841" + integrity sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA== + +"@types/node@*": + version "22.14.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-22.14.1.tgz#53b54585cec81c21eee3697521e31312d6ca1e6f" + integrity sha512-u0HuPQwe/dHrItgHHpmw3N2fYCR6x4ivMNbPHRkBVP4CvN+kiRrKHWk3i8tXiO/joPwXLMYvF9TTF0eqgHIuOw== + dependencies: + undici-types "~6.21.0" + +"@types/webpack-env@^1.16.4": + version "1.18.8" + resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.18.8.tgz#71f083718c094204d7b64443701d32f1db3989e3" + integrity sha512-G9eAoJRMLjcvN4I08wB5I7YofOb/kaJNd5uoCMX+LbKXTPCF+ZIHuqTnFaK9Jz1rgs035f9JUPUhNFtqgucy/A== + +"@types/yargs-parser@*": + version "21.0.3" + resolved "https://registry.yarnpkg.com/@types/yargs-parser/-/yargs-parser-21.0.3.tgz#815e30b786d2e8f0dcd85fd5bcf5e1a04d008f15" + integrity sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ== + +"@types/yargs@^17.0.8": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/yargs/-/yargs-17.0.33.tgz#8c32303da83eec050a84b3c7ae7b9f922d13e32d" + integrity sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA== + dependencies: + "@types/yargs-parser" "*" + +"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6" + integrity sha512-nuBEDgQfm1ccRp/8bCQrx1frohyufl4JlbMMZ4P1wpeOfDhF6FQkxZJ1b/e+PLwr6X1Nhw6OLme5usuBWYBvuQ== + dependencies: + "@webassemblyjs/helper-numbers" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + +"@webassemblyjs/floating-point-hex-parser@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.13.2.tgz#fcca1eeddb1cc4e7b6eed4fc7956d6813b21b9fb" + integrity sha512-6oXyTOzbKxGH4steLbLNOu71Oj+C8Lg34n6CqRvqfS2O71BxY6ByfMDRhBytzknj9yGUPVJ1qIKhRlAwO1AovA== + +"@webassemblyjs/helper-api-error@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.13.2.tgz#e0a16152248bc38daee76dd7e21f15c5ef3ab1e7" + integrity sha512-U56GMYxy4ZQCbDZd6JuvvNV/WFildOjsaWD3Tzzvmw/mas3cXzRJPMjP83JqEsgSbyrmaGjBfDtV7KDXV9UzFQ== + +"@webassemblyjs/helper-buffer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.14.1.tgz#822a9bc603166531f7d5df84e67b5bf99b72b96b" + integrity sha512-jyH7wtcHiKssDtFPRB+iQdxlDf96m0E39yb0k5uJVhFGleZFoNw1c4aeIcVUPPbXUVJ94wwnMOAqUHyzoEPVMA== + +"@webassemblyjs/helper-numbers@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.13.2.tgz#dbd932548e7119f4b8a7877fd5a8d20e63490b2d" + integrity sha512-FE8aCmS5Q6eQYcV3gI35O4J789wlQA+7JrqTTpJqn5emA4U2hvwJmvFRC0HODS+3Ye6WioDklgd6scJ3+PLnEA== + dependencies: + "@webassemblyjs/floating-point-hex-parser" "1.13.2" + "@webassemblyjs/helper-api-error" "1.13.2" + "@xtuc/long" "4.2.2" + +"@webassemblyjs/helper-wasm-bytecode@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.13.2.tgz#e556108758f448aae84c850e593ce18a0eb31e0b" + integrity sha512-3QbLKy93F0EAIXLh0ogEVR6rOubA9AoZ+WRYhNbFyuB70j3dRdwH9g+qXhLAO0kiYGlg3TxDV+I4rQTr/YNXkA== + +"@webassemblyjs/helper-wasm-section@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.14.1.tgz#9629dda9c4430eab54b591053d6dc6f3ba050348" + integrity sha512-ds5mXEqTJ6oxRoqjhWDU83OgzAYjwsCV8Lo/N+oRsNDmx/ZDpqalmrtgOMkHwxsG0iI//3BwWAErYRHtgn0dZw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/wasm-gen" "1.14.1" + +"@webassemblyjs/ieee754@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.13.2.tgz#1c5eaace1d606ada2c7fd7045ea9356c59ee0dba" + integrity sha512-4LtOzh58S/5lX4ITKxnAK2USuNEvpdVV9AlgGQb8rJDHaLeHciwG4zlGr0j/SNWlr7x3vO1lDEsuePvtcDNCkw== + dependencies: + "@xtuc/ieee754" "^1.2.0" + +"@webassemblyjs/leb128@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.13.2.tgz#57c5c3deb0105d02ce25fa3fd74f4ebc9fd0bbb0" + integrity sha512-Lde1oNoIdzVzdkNEAWZ1dZ5orIbff80YPdHx20mrHwHrVNNTjNr8E3xz9BdpcGqRQbAEa+fkrCb+fRFTl/6sQw== + dependencies: + "@xtuc/long" "4.2.2" + +"@webassemblyjs/utf8@1.13.2": + version "1.13.2" + resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.13.2.tgz#917a20e93f71ad5602966c2d685ae0c6c21f60f1" + integrity sha512-3NQWGjKTASY1xV5m7Hr0iPeXD9+RDobLll3T9d2AO+g3my8xy5peVyjSag4I50mR1bBSN/Ct12lo+R9tJk0NZQ== + +"@webassemblyjs/wasm-edit@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.14.1.tgz#ac6689f502219b59198ddec42dcd496b1004d597" + integrity sha512-RNJUIQH/J8iA/1NzlE4N7KtyZNHi3w7at7hDjvRNm5rcUXa00z1vRz3glZoULfJ5mpvYhLybmVcwcjGrC1pRrQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/helper-wasm-section" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-opt" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + "@webassemblyjs/wast-printer" "1.14.1" + +"@webassemblyjs/wasm-gen@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.14.1.tgz#991e7f0c090cb0bb62bbac882076e3d219da9570" + integrity sha512-AmomSIjP8ZbfGQhumkNvgC33AY7qtMCXnN6bL2u2Js4gVCg8fp735aEiMSBbDR7UQIj90n4wKAFUSEd0QN2Ukg== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wasm-opt@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.14.1.tgz#e6f71ed7ccae46781c206017d3c14c50efa8106b" + integrity sha512-PTcKLUNvBqnY2U6E5bdOQcSM+oVP/PmrDY9NzowJjislEjwP/C4an2303MCVS2Mg9d3AJpIGdUFIQQWbPds0Sw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-buffer" "1.14.1" + "@webassemblyjs/wasm-gen" "1.14.1" + "@webassemblyjs/wasm-parser" "1.14.1" + +"@webassemblyjs/wasm-parser@1.14.1", "@webassemblyjs/wasm-parser@^1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.14.1.tgz#b3e13f1893605ca78b52c68e54cf6a865f90b9fb" + integrity sha512-JLBl+KZ0R5qB7mCnud/yyX08jWFw5MsoalJ1pQ4EdFlgj9VdXKGuENGsiCIjegI1W7p91rUlcB/LB5yRJKNTcQ== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@webassemblyjs/helper-api-error" "1.13.2" + "@webassemblyjs/helper-wasm-bytecode" "1.13.2" + "@webassemblyjs/ieee754" "1.13.2" + "@webassemblyjs/leb128" "1.13.2" + "@webassemblyjs/utf8" "1.13.2" + +"@webassemblyjs/wast-printer@1.14.1": + version "1.14.1" + resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.14.1.tgz#3bb3e9638a8ae5fdaf9610e7a06b4d9f9aa6fe07" + integrity sha512-kPSSXE6De1XOR820C90RIo2ogvZG+c3KiHzqUoO/F34Y2shGzesfqv7o57xrxovZJH/MetF5UjroJ/R/3isoiw== + dependencies: + "@webassemblyjs/ast" "1.14.1" + "@xtuc/long" "4.2.2" + +"@webpack-cli/configtest@^2.1.1": + version "2.1.1" + resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-2.1.1.tgz#3b2f852e91dac6e3b85fb2a314fb8bef46d94646" + integrity sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw== + +"@webpack-cli/info@^2.0.2": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-2.0.2.tgz#cc3fbf22efeb88ff62310cf885c5b09f44ae0fdd" + integrity sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A== + +"@webpack-cli/serve@^2.0.5": + version "2.0.5" + resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-2.0.5.tgz#325db42395cd49fe6c14057f9a900e427df8810e" + integrity sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ== + +"@xtuc/ieee754@^1.2.0": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790" + integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA== + +"@xtuc/long@4.2.2": + version "4.2.2" + resolved "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz#d291c6a4e97989b5c61d9acf396ae4fe133a718d" + integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ== + +"@yr/monotone-cubic-spline@^1.0.3": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@yr/monotone-cubic-spline/-/monotone-cubic-spline-1.0.3.tgz#7272d89f8e4f6fb7a1600c28c378cc18d3b577b9" + integrity sha512-FQXkOta0XBSUPHndIKON2Y9JeQz5ZeMqLYZVVK93FliNBFm7LNMIZmY6FrMEB9XPcDbE2bekMbZD6kzDkxwYjA== + +acorn@^8.0.5, acorn@^8.14.0, acorn@^8.8.2: + version "8.14.1" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.14.1.tgz#721d5dc10f7d5b5609a891773d47731796935dfb" + integrity sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg== + +adjust-sourcemap-loader@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/adjust-sourcemap-loader/-/adjust-sourcemap-loader-4.0.0.tgz#fc4a0fd080f7d10471f30a7320f25560ade28c99" + integrity sha512-OXwN5b9pCUXNQHJpwwD2qP40byEmSgzj8B4ydSN0uMNYWiFmJ6x6KwUllMmfk8Rwu/HJDFR7U8ubsWBoN0Xp0A== + dependencies: + loader-utils "^2.0.0" + regex-parser "^2.2.11" + +ajv-formats@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520" + integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA== + dependencies: + ajv "^8.0.0" + +ajv-keywords@^3.5.2: + version "3.5.2" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.5.2.tgz#31f29da5ab6e00d1c2d329acf7b5929614d5014d" + integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ== + +ajv-keywords@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16" + integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw== + dependencies: + fast-deep-equal "^3.1.3" + +ajv@^6.12.5: + version "6.12.6" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.12.6.tgz#baf5a62e802b07d977034586f8c3baf5adf26df4" + integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g== + 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" + +ajv@^8.0.0, ajv@^8.9.0: + version "8.17.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.17.1.tgz#37d9a5c776af6bc92d7f4f9510eba4c0a60d11a6" + integrity sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g== + dependencies: + fast-deep-equal "^3.1.3" + fast-uri "^3.0.1" + json-schema-traverse "^1.0.0" + require-from-string "^2.0.2" + +ansi-regex@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304" + integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== + +ansi-styles@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== + dependencies: + color-convert "^1.9.0" + +ansi-styles@^4.1.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937" + integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg== + dependencies: + color-convert "^2.0.1" + +anymatch@~3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.3.tgz#790c58b19ba1720a84205b57c618d5ad8524973e" + integrity sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw== + dependencies: + normalize-path "^3.0.0" + picomatch "^2.0.4" + +apexcharts@^3.41.0: + version "3.54.1" + resolved "https://registry.yarnpkg.com/apexcharts/-/apexcharts-3.54.1.tgz#9b78a6ee10e4225d5e04309c8e5b379e2c5c9da2" + integrity sha512-E4et0h/J1U3r3EwS/WlqJCQIbepKbp6wGUmaAwJOMjHUP4Ci0gxanLa7FR3okx6p9coi4st6J853/Cb1NP0vpA== + dependencies: + "@yr/monotone-cubic-spline" "^1.0.3" + svg.draggable.js "^2.2.2" + svg.easing.js "^2.0.0" + svg.filter.js "^2.0.2" + svg.pathmorphing.js "^0.1.3" + svg.resize.js "^1.4.3" + svg.select.js "^3.0.1" + +babel-loader@^9.1.3: + version "9.2.1" + resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-9.2.1.tgz#04c7835db16c246dd19ba0914418f3937797587b" + integrity sha512-fqe8naHt46e0yIdkjUZYqddSXfej3AHajX+CSO5X7oy0EmPc6o5Xh+RClNoHjnieWz9AW4kZxW9yyFMhVB1QLA== + dependencies: + find-cache-dir "^4.0.0" + schema-utils "^4.0.0" + +babel-plugin-polyfill-corejs2@^0.4.10: + version "0.4.13" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.13.tgz#7d445f0e0607ebc8fb6b01d7e8fb02069b91dd8b" + integrity sha512-3sX/eOms8kd3q2KZ6DAhKPc0dgm525Gqq5NtWKZ7QYYZEv57OQ54KtblzJzH1lQF/eQxO8KjWGIK9IPUJNus5g== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.6.4" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.11.0: + version "0.11.1" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.11.1.tgz#4e4e182f1bb37c7ba62e2af81d8dd09df31344f6" + integrity sha512-yGCqvBT4rwMczo28xkH/noxJ6MZ4nJfkVYdoDaC/utLtWrXxv27HVrzAeSbqR8SxDsp46n0YF47EbHoixy6rXQ== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.3" + core-js-compat "^3.40.0" + +babel-plugin-polyfill-regenerator@^0.6.1: + version "0.6.4" + resolved "https://registry.yarnpkg.com/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.6.4.tgz#428c615d3c177292a22b4f93ed99e358d7906a9b" + integrity sha512-7gD3pRadPrbjhjLyxebmx/WrFYcuSjZ0XbdUujQMZ/fcE9oeewk2U/7PCvez84UeuK3oSjmPZ0Ch0dlupQvGzw== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.6.4" + +big.js@^5.2.2: + version "5.2.2" + resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" + integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ== + +binary-extensions@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.3.0.tgz#f6e14a97858d327252200242d4ccfe522c445522" + integrity sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw== + +boolbase@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz#68dff5fbe60c51eb37725ea9e3ed310dcc1e776e" + integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww== + +bootstrap@5.3.3: + version "5.3.3" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.3.tgz#de35e1a765c897ac940021900fcbb831602bac38" + integrity sha512-8HLCdWgyoMguSO9o+aH+iuZ+aht+mzW0u3HIMzVu7Srrpv7EBBxTnrFlSCskwdY1+EOFQSm7uMJhNQHkdPcmjg== + +bootstrap@^5.3.3: + version "5.3.5" + resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-5.3.5.tgz#be42cfe0d580e97ee1abb7d38ce94f5c393c9bb6" + integrity sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA== + +braces@~3.0.2: + version "3.0.3" + resolved "https://registry.yarnpkg.com/braces/-/braces-3.0.3.tgz#490332f40919452272d55a8480adc0c441358789" + integrity sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA== + dependencies: + fill-range "^7.1.1" + +browserslist@^4.0.0, browserslist@^4.23.3, browserslist@^4.24.0, browserslist@^4.24.4: + version "4.24.4" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.24.4.tgz#c6b2865a3f08bcb860a0e827389003b9fe686e4b" + integrity sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A== + dependencies: + caniuse-lite "^1.0.30001688" + electron-to-chromium "^1.5.73" + node-releases "^2.0.19" + update-browserslist-db "^1.1.1" + +buffer-from@^1.0.0: + version "1.1.2" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5" + integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ== + +caniuse-api@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz#5e4d90e2274961d46291997df599e3ed008ee4c0" + integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw== + dependencies: + browserslist "^4.0.0" + caniuse-lite "^1.0.0" + lodash.memoize "^4.1.2" + lodash.uniq "^4.5.0" + +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001688: + version "1.0.30001714" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001714.tgz#cfd27ff07e6fa20a0f45c7a10d28a0ffeaba2122" + integrity sha512-mtgapdwDLSSBnCI3JokHM7oEQBLxiJKVRtg10AxM1AyeiKcM96f0Mkbqeq+1AbiCtvMcHRulAAEMu693JrSWqg== + +chalk@^2.4.2: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chalk@^4.0.0: + version "4.1.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" + integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + +"chokidar@>=3.0.0 <4.0.0": + version "3.6.0" + resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.6.0.tgz#197c6cc669ef2a8dc5e7b4d97ee4e092c3eb0d5b" + integrity sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw== + dependencies: + anymatch "~3.1.2" + braces "~3.0.2" + glob-parent "~5.1.2" + is-binary-path "~2.1.0" + is-glob "~4.0.1" + normalize-path "~3.0.0" + readdirp "~3.6.0" + optionalDependencies: + fsevents "~2.3.2" + +chrome-trace-event@^1.0.2: + version "1.0.4" + resolved "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.4.tgz#05bffd7ff928465093314708c93bdfa9bd1f0f5b" + integrity sha512-rNjApaLzuwaOTjCiT8lSDdGN1APCiqkChLMJxJPWLunPAt5fy8xgU9/jNOchV84wfIxrA0lRQB7oCT8jrn/wrQ== + +ci-info@^3.2.0: + version "3.9.0" + resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" + integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== + +classnames@^2.2.5: + version "2.5.1" + resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.5.1.tgz#ba774c614be0f016da105c858e7159eae8e7687b" + integrity sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow== + +clone-deep@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz#c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387" + integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ== + dependencies: + is-plain-object "^2.0.4" + kind-of "^6.0.2" + shallow-clone "^3.0.0" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== + dependencies: + color-name "1.1.3" + +color-convert@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3" + integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ== + dependencies: + color-name "~1.1.4" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw== + +color-name@~1.1.4: + version "1.1.4" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" + integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA== + +colord@^2.9.3: + version "2.9.3" + resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43" + integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw== + +colorette@^2.0.14: + version "2.0.20" + resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.20.tgz#9eb793e6833067f7235902fcd3b09917a000a95a" + integrity sha512-IfEDxwoWIjkeXL1eXcDiow4UbKjhLdq6/EuSVR9GMN7KVH3r9gQ83e73hsz1Nd1T3ijd5xv1wcWRYO+D6kCI2w== + +commander@^10.0.1: + version "10.0.1" + resolved "https://registry.yarnpkg.com/commander/-/commander-10.0.1.tgz#881ee46b4f77d1c1dccc5823433aa39b022cbe06" + integrity sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug== + +commander@^2.20.0: + version "2.20.3" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz#fd485e84c03eb4881c20722ba48035e8531aeb33" + integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ== + +commander@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7" + integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw== + +common-path-prefix@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/common-path-prefix/-/common-path-prefix-3.0.0.tgz#7d007a7e07c58c4b4d5f433131a19141b29f11e0" + integrity sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w== + +consola@^3.2.3: + version "3.4.2" + resolved "https://registry.yarnpkg.com/consola/-/consola-3.4.2.tgz#5af110145397bb67afdab77013fdc34cae590ea7" + integrity sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA== + +convert-source-map@^1.7.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.9.0.tgz#7faae62353fb4213366d0ca98358d22e8368b05f" + integrity sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A== + +convert-source-map@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-2.0.0.tgz#4b560f649fc4e918dd0ab75cf4961e8bc882d82a" + integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== + +core-js-compat@^3.40.0: + version "3.41.0" + resolved "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.41.0.tgz#4cdfce95f39a8f27759b667cf693d96e5dda3d17" + integrity sha512-RFsU9LySVue9RTwdDVX/T0e2Y6jRYWXERKElIjpuEOEnxaXffI0X7RUwVzfYLfzuLXSNJDYoRYUAmRUcyln20A== + dependencies: + browserslist "^4.24.4" + +cross-spawn@^7.0.3: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.6.tgz#8a58fe78f00dcd70c370451759dfbfaf03e8ee9f" + integrity sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA== + dependencies: + path-key "^3.1.0" + shebang-command "^2.0.0" + which "^2.0.1" + +css-declaration-sorter@^7.2.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz#6dec1c9523bc4a643e088aab8f09e67a54961024" + integrity sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow== + +css-loader@^7.1.0: + version "7.1.2" + resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-7.1.2.tgz#64671541c6efe06b0e22e750503106bdd86880f8" + integrity sha512-6WvYYn7l/XEGN8Xu2vWFt9nVzrCn39vKyTEFf/ExEyoksJjjSZV/0/35XPlMbpnr6VGhZIUg5yJrL8tGfes/FA== + 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" + +css-minimizer-webpack-plugin@^7.0.0: + version "7.0.2" + resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-7.0.2.tgz#aa1b01c6033f5b2f86ddb60c1f5bddd012b50cac" + integrity sha512-nBRWZtI77PBZQgcXMNqiIXVshiQOVLGSf2qX/WZfG8IQfMbeHUMXaBWQmiiSTmPJUflQxHjZjzAmuyO7tpL2Jg== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + cssnano "^7.0.4" + jest-worker "^29.7.0" + postcss "^8.4.40" + schema-utils "^4.2.0" + serialize-javascript "^6.0.2" + +css-select@^4.1.3: + version "4.3.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" + integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ== + dependencies: + boolbase "^1.0.0" + css-what "^6.0.1" + domhandler "^4.3.1" + domutils "^2.8.0" + nth-check "^2.0.1" + +css-select@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/css-select/-/css-select-5.1.0.tgz#b8ebd6554c3637ccc76688804ad3f6a6fdaea8a6" + integrity sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg== + dependencies: + boolbase "^1.0.0" + css-what "^6.1.0" + domhandler "^5.0.2" + domutils "^3.0.1" + nth-check "^2.0.1" + +css-tree@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.3.1.tgz#10264ce1e5442e8572fc82fbe490644ff54b5c20" + integrity sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw== + dependencies: + mdn-data "2.0.30" + source-map-js "^1.0.1" + +css-tree@~2.2.0: + version "2.2.1" + resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-2.2.1.tgz#36115d382d60afd271e377f9c5f67d02bd48c032" + integrity sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA== + dependencies: + mdn-data "2.0.28" + source-map-js "^1.0.1" + +css-what@^6.0.1, css-what@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/css-what/-/css-what-6.1.0.tgz#fb5effcf76f1ddea2c81bdfaa4de44e79bac70f4" + integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw== + +cssesc@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz#37741919903b868565e1c09ea747445cd18983ee" + integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg== + +cssnano-preset-default@^7.0.6: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-7.0.6.tgz#0220fa7507478369aa2a226bac03e1204cd024c1" + integrity sha512-ZzrgYupYxEvdGGuqL+JKOY70s7+saoNlHSCK/OGn1vB2pQK8KSET8jvenzItcY+kA7NoWvfbb/YhlzuzNKjOhQ== + dependencies: + browserslist "^4.23.3" + css-declaration-sorter "^7.2.0" + cssnano-utils "^5.0.0" + postcss-calc "^10.0.2" + postcss-colormin "^7.0.2" + postcss-convert-values "^7.0.4" + postcss-discard-comments "^7.0.3" + postcss-discard-duplicates "^7.0.1" + postcss-discard-empty "^7.0.0" + postcss-discard-overridden "^7.0.0" + postcss-merge-longhand "^7.0.4" + postcss-merge-rules "^7.0.4" + postcss-minify-font-values "^7.0.0" + postcss-minify-gradients "^7.0.0" + postcss-minify-params "^7.0.2" + postcss-minify-selectors "^7.0.4" + postcss-normalize-charset "^7.0.0" + postcss-normalize-display-values "^7.0.0" + postcss-normalize-positions "^7.0.0" + postcss-normalize-repeat-style "^7.0.0" + postcss-normalize-string "^7.0.0" + postcss-normalize-timing-functions "^7.0.0" + postcss-normalize-unicode "^7.0.2" + postcss-normalize-url "^7.0.0" + postcss-normalize-whitespace "^7.0.0" + postcss-ordered-values "^7.0.1" + postcss-reduce-initial "^7.0.2" + postcss-reduce-transforms "^7.0.0" + postcss-svgo "^7.0.1" + postcss-unique-selectors "^7.0.3" + +cssnano-utils@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-5.0.0.tgz#b53a0343dd5d21012911882db6ae7d2eae0e3687" + integrity sha512-Uij0Xdxc24L6SirFr25MlwC2rCFX6scyUmuKpzI+JQ7cyqDEwD42fJ0xfB3yLfOnRDU5LKGgjQ9FA6LYh76GWQ== + +cssnano@^7.0.4: + version "7.0.6" + resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-7.0.6.tgz#63d54fd42bc017f6aaed69e47d9aaef85b7850ec" + integrity sha512-54woqx8SCbp8HwvNZYn68ZFAepuouZW4lTwiMVnBErM3VkO7/Sd4oTOt3Zz3bPx3kxQ36aISppyXj2Md4lg8bw== + dependencies: + cssnano-preset-default "^7.0.6" + lilconfig "^3.1.2" + +csso@^5.0.5: + version "5.0.5" + resolved "https://registry.yarnpkg.com/csso/-/csso-5.0.5.tgz#f9b7fe6cc6ac0b7d90781bb16d5e9874303e2ca6" + integrity sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ== + dependencies: + css-tree "~2.2.0" + +debug@^4.1.0, debug@^4.1.1, debug@^4.3.1: + version "4.4.0" + resolved "https://registry.yarnpkg.com/debug/-/debug-4.4.0.tgz#2b3f2aea2ffeb776477460267377dc8710faba8a" + integrity sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA== + dependencies: + ms "^2.1.3" + +dom-converter@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" + integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA== + dependencies: + utila "~0.4" + +dom-serializer@^1.0.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-1.4.1.tgz#de5d41b1aea290215dc45a6dae8adcf1d32e2d30" + integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.2.0" + entities "^2.0.0" + +dom-serializer@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-2.0.0.tgz#e41b802e1eedf9f6cae183ce5e622d789d7d8e53" + integrity sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg== + dependencies: + domelementtype "^2.3.0" + domhandler "^5.0.2" + entities "^4.2.0" + +domelementtype@^2.0.1, domelementtype@^2.2.0, domelementtype@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.3.0.tgz#5c45e8e869952626331d7aab326d01daf65d589d" + integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw== + +domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1: + version "4.3.1" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-4.3.1.tgz#8d792033416f59d68bc03a5aa7b018c1ca89279c" + integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ== + dependencies: + domelementtype "^2.2.0" + +domhandler@^5.0.2, domhandler@^5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/domhandler/-/domhandler-5.0.3.tgz#cc385f7f751f1d1fc650c21374804254538c7d31" + integrity sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w== + dependencies: + domelementtype "^2.3.0" + +domutils@^2.5.2, domutils@^2.8.0: + version "2.8.0" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-2.8.0.tgz#4437def5db6e2d1f5d6ee859bd95ca7d02048135" + integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A== + dependencies: + dom-serializer "^1.0.1" + domelementtype "^2.2.0" + domhandler "^4.2.0" + +domutils@^3.0.1: + version "3.2.2" + resolved "https://registry.yarnpkg.com/domutils/-/domutils-3.2.2.tgz#edbfe2b668b0c1d97c24baf0f1062b132221bc78" + integrity sha512-6kZKyUajlDuqlHKVX1w7gyslj9MPIXzIFiz/rGu35uC1wMi+kMhQwGhl4lt9unC9Vb9INnY9Z3/ZA3+FhASLaw== + dependencies: + dom-serializer "^2.0.0" + domelementtype "^2.3.0" + domhandler "^5.0.3" + +electron-to-chromium@^1.5.73: + version "1.5.138" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.138.tgz#319e775179bd0889ed96a04d4390d355fb315a44" + integrity sha512-FWlQc52z1dXqm+9cCJ2uyFgJkESd+16j6dBEjsgDNuHjBpuIzL8/lRc0uvh1k8RNI6waGo6tcy2DvwkTBJOLDg== + +element-class@^0.2.2: + version "0.2.2" + resolved "https://registry.yarnpkg.com/element-class/-/element-class-0.2.2.tgz#9d3bbd0767f9013ef8e1c8ebe722c1402a60050e" + integrity sha512-e4tkRAFtQkGiZB8fzxAFdjEbx5zajMb1GpiRwKs3lhOLxQcvdOIG7XlERT1sTX3/ulIUGZrgL02YZ0cRNC5OLQ== + +emoji-regex@^8.0.0: + version "8.0.0" + resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37" + integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== + +emojis-list@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz#5570662046ad29e2e916e71aae260abdff4f6a78" + integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q== + +enhanced-resolve@^5.17.1: + version "5.18.1" + resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz#728ab082f8b7b6836de51f1637aab5d3b9568faf" + integrity sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg== + dependencies: + graceful-fs "^4.2.4" + tapable "^2.2.0" + +entities@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-2.2.0.tgz#098dc90ebb83d8dffa089d55256b351d34c4da55" + integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A== + +entities@^4.2.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/entities/-/entities-4.5.0.tgz#5d268ea5e7113ec74c4d033b79ea5a35a488fb48" + integrity sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw== + +envinfo@^7.7.3: + version "7.14.0" + resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.14.0.tgz#26dac5db54418f2a4c1159153a0b2ae980838aae" + integrity sha512-CO40UI41xDQzhLB1hWyqUKgFhs250pNcGbyGKe1l/e4FSaI/+YE4IMG76GDt0In67WLPACIITC+sOi08x4wIvg== + +error-stack-parser@^2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286" + integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ== + dependencies: + stackframe "^1.3.4" + +es-module-lexer@^1.2.1: + version "1.6.0" + resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-1.6.0.tgz#da49f587fd9e68ee2404fe4e256c0c7d3a81be21" + integrity sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ== + +escalade@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/escalade/-/escalade-3.2.0.tgz#011a3f69856ba189dffa7dc8fcce99d2a87903e5" + integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== + +escape-html@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" + integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow== + +escape-string-regexp@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" + integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== + +eslint-scope@5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c" + integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw== + dependencies: + esrecurse "^4.3.0" + estraverse "^4.1.1" + +esrecurse@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921" + integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag== + dependencies: + estraverse "^5.2.0" + +estraverse@^4.1.1: + version "4.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz#398ad3f3c5a24948be7725e83d11a7de28cdbd1d" + integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw== + +estraverse@^5.2.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-5.3.0.tgz#2eea5290702f26ab8fe5370370ff86c965d21123" + integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA== + +esutils@^2.0.2: + version "2.0.3" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz#74d2eb4de0b8da1293711910d50775b9b710ef64" + integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== + +events@^3.2.0, events@^3.3.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400" + integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q== + +fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz#3a7d56b559d6cbc3eb512325244e619a65c6c525" + integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q== + +fast-json-stable-stringify@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz#874bf69c6f404c2b5d99c481341399fd55892633" + integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw== + +fast-uri@^3.0.1: + version "3.0.6" + resolved "https://registry.yarnpkg.com/fast-uri/-/fast-uri-3.0.6.tgz#88f130b77cfaea2378d56bf970dea21257a68748" + integrity sha512-Atfo14OibSv5wAp4VWNsFYE1AchQRTv9cBGWET4pZWHzYshFSS9NQI6I57rdKn9croWVMbYFbLhJ+yJvmZIIHw== + +fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.16: + version "1.0.16" + resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5" + integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg== + +fill-range@^7.1.1: + version "7.1.1" + resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-7.1.1.tgz#44265d3cac07e3ea7dc247516380643754a05292" + integrity sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg== + dependencies: + to-regex-range "^5.0.1" + +find-cache-dir@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-4.0.0.tgz#a30ee0448f81a3990708f6453633c733e2f6eec2" + integrity sha512-9ZonPT4ZAK4a+1pUPVPZJapbi7O5qbbJPdYw/NOQWZZbVLdDTYM3A4R9z/DpAM08IDaFGsvPgiGZ82WEwUDWjg== + dependencies: + common-path-prefix "^3.0.0" + pkg-dir "^7.0.0" + +find-up@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz#97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19" + integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw== + dependencies: + locate-path "^5.0.0" + path-exists "^4.0.0" + +find-up@^6.3.0: + version "6.3.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-6.3.0.tgz#2abab3d3280b2dc7ac10199ef324c4e002c8c790" + integrity sha512-v2ZsoEuVHYy8ZIlYqwPe/39Cy+cFDzp4dXPaxNvkEuouymu+2Jbz0PxpKarJHYJTmv2HWT3O382qY8l4jMWthw== + dependencies: + locate-path "^7.1.0" + path-exists "^5.0.0" + +flat@^5.0.2: + version "5.0.2" + resolved "https://registry.yarnpkg.com/flat/-/flat-5.0.2.tgz#8ca6fe332069ffa9d324c327198c598259ceb241" + integrity sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ== + +flattree@^0.11.1: + version "0.11.1" + resolved "https://registry.yarnpkg.com/flattree/-/flattree-0.11.1.tgz#5fd0be125e74eb28d3885e3f6dcfa784844cac56" + integrity sha512-3+Rup2VS406JqWsf+eGKVvwfs7aCmquu+GIFb3KyB8/8vnlj3KCfoDUx7xjMSmolyoebEjjvXIthj1s0uC2CvA== + +fsevents@~2.3.2: + version "2.3.3" + resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.3.tgz#cac6407785d03675a2a5e1a5305c697b347d90d6" + integrity sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw== + +function-bind@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.2.tgz#2c02d864d97f3ea6c8830c464cbd11ab6eab7a1c" + integrity sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA== + +gensync@^1.0.0-beta.2: + version "1.0.0-beta.2" + resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0" + integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg== + +glob-parent@~5.1.2: + version "5.1.2" + resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.2.tgz#869832c58034fe68a4093c17dc15e8340d8401c4" + integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow== + dependencies: + is-glob "^4.0.1" + +glob-to-regexp@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e" + integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw== + +globals@^11.1.0: + version "11.12.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e" + integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA== + +graceful-fs@^4.1.2, graceful-fs@^4.2.11, graceful-fs@^4.2.4, graceful-fs@^4.2.9: + version "4.2.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.11.tgz#4183e4e8bf08bb6e05bbb2f7d2e0c8f712ca40e3" + integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw== + +has-flag@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" + integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== + +hasown@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/hasown/-/hasown-2.0.2.tgz#003eaf91be7adc372e84ec59dc37252cedb80003" + integrity sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ== + dependencies: + function-bind "^1.1.2" + +html5-tag@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/html5-tag/-/html5-tag-0.3.0.tgz#44d27c151aa427c156e1b9eac44fd8068635580f" + integrity sha512-iKRpQPtaS0ncHw5+S9PX3y1S6XE/G6eQc0aGgLJPAZRbX2ZhnvYuvqzEDk+4O/+WmJzWuyoCiPtqMYRUsD89OQ== + dependencies: + escape-html "^1.0.3" + +htmlparser2@^6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-6.1.0.tgz#c4d762b6c3371a05dbe65e94ae43a9f845fb8fb7" + integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A== + dependencies: + domelementtype "^2.0.1" + domhandler "^4.0.0" + domutils "^2.5.2" + entities "^2.0.0" + +icss-utils@^5.0.0, icss-utils@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae" + integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA== + +idiomorph@^0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/idiomorph/-/idiomorph-0.3.0.tgz#f6675bc5bef1a72c94021e43141a3f605d2d6288" + integrity sha512-UhV1Ey5xCxIwR9B+OgIjQa+1Jx99XQ1vQHUsKBU1RpQzCx1u+b+N6SOXgf5mEJDqemUI/ffccu6+71l2mJUsRA== + +immutable@^4.0.0: + version "4.3.7" + resolved "https://registry.yarnpkg.com/immutable/-/immutable-4.3.7.tgz#c70145fc90d89fb02021e65c84eb0226e4e5a381" + integrity sha512-1hqclzwYwjRDFLjcFxOM5AYkkG0rpFPpr1RLPMEuGczoS7YA8gLhy8SWXYRAA/XwfEHpfo3cw5JGioS32fnMRw== + +import-local@^3.0.2: + version "3.2.0" + resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.2.0.tgz#c3d5c745798c02a6f8b897726aba5100186ee260" + integrity sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA== + dependencies: + pkg-dir "^4.2.0" + resolve-cwd "^3.0.0" + +infinite-tree@^1.17.1: + version "1.18.0" + resolved "https://registry.yarnpkg.com/infinite-tree/-/infinite-tree-1.18.0.tgz#447b9e7c6435fe0394be1d0e01e6a5ddcb2a5163" + integrity sha512-roQt1aH7uMXix6c8yzMIa6cqDwiVJu4ikgm5/hBz0sbPDcb5ysOrrKhSGvaF24uB5k3GhpakHpMxNlaDKTkSoA== + dependencies: + classnames "^2.2.5" + element-class "^0.2.2" + escape-html "^1.0.3" + events "^3.3.0" + flattree "^0.11.1" + html5-tag "^0.3.0" + is-dom "^1.1.0" + +interpret@^3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-3.1.1.tgz#5be0ceed67ca79c6c4bc5cf0d7ee843dcea110c4" + integrity sha512-6xwYfHbajpoF0xLW+iwLkhwgvLoZDfjYfoFNu8ftMoXINzwuymNLd9u/KmwtdT2GbR+/Cz66otEGEVVUHX9QLQ== + +is-binary-path@~2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz#ea1f7f3b80f064236e83470f86c09c254fb45b09" + integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw== + dependencies: + binary-extensions "^2.0.0" + +is-core-module@^2.16.0: + version "2.16.1" + resolved "https://registry.yarnpkg.com/is-core-module/-/is-core-module-2.16.1.tgz#2a98801a849f43e2add644fbb6bc6229b19a4ef4" + integrity sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w== + dependencies: + hasown "^2.0.2" + +is-dom@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-dom/-/is-dom-1.1.0.tgz#af1fced292742443bb59ca3f76ab5e80907b4e8a" + integrity sha512-u82f6mvhYxRPKpw8V1N0W8ce1xXwOrQtgGcxl6UCL5zBmZu3is/18K0rR7uFCnMDuAsS/3W54mGL4vsaFUQlEQ== + dependencies: + is-object "^1.0.1" + is-window "^1.0.2" + +is-extglob@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" + integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ== + +is-fullwidth-code-point@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d" + integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== + +is-glob@^4.0.1, is-glob@~4.0.1: + version "4.0.3" + resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.3.tgz#64f61e42cbbb2eec2071a9dac0b28ba1e65d5084" + integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg== + dependencies: + is-extglob "^2.1.1" + +is-number@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz#7535345b896734d5f80c4d06c50955527a14f12b" + integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng== + +is-object@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.2.tgz#a56552e1c665c9e950b4a025461da87e72f86fcf" + integrity sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA== + +is-plain-object@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz#2c163b3fafb1b606d9d17928f05c2a1c38e07677" + integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og== + dependencies: + isobject "^3.0.1" + +is-window@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-window/-/is-window-1.0.2.tgz#2c896ca53db97de45d3c33133a65d8c9f563480d" + integrity sha512-uj00kdXyZb9t9RcAUAwMZAnkBUwdYGhYlt7djMXhfyhUCzwNba50tIiBKR7q0l7tdoBtFVw/3JmLY6fI3rmZmg== + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== + +isobject@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz#4e431e92b11a9731636aa1f9c8d1ccbcfdab78df" + integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg== + +jest-util@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-29.7.0.tgz#23c2b62bfb22be82b44de98055802ff3710fc0bc" + integrity sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA== + dependencies: + "@jest/types" "^29.6.3" + "@types/node" "*" + chalk "^4.0.0" + ci-info "^3.2.0" + graceful-fs "^4.2.9" + picomatch "^2.2.3" + +jest-worker@^27.4.5: + version "27.5.1" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0" + integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg== + dependencies: + "@types/node" "*" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +jest-worker@^29.7.0: + version "29.7.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-29.7.0.tgz#acad073acbbaeb7262bd5389e1bcf43e10058d4a" + integrity sha512-eIz2msL/EzL9UFTFFx7jBTkeZfku0yUAyZZZmJ93H2TYEiroIx2PQjEXcwYtYl8zXCxb+PAmA2hLIt/6ZEkPHw== + dependencies: + "@types/node" "*" + jest-util "^29.7.0" + merge-stream "^2.0.0" + supports-color "^8.0.0" + +js-tokens@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" + integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== + +jsesc@^3.0.2: + version "3.1.0" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.1.0.tgz#74d335a234f67ed19907fdadfac7ccf9d409825d" + integrity sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA== + +jsesc@~3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-3.0.2.tgz#bb8b09a6597ba426425f2e4a07245c3d00b9343e" + integrity sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g== + +json-parse-even-better-errors@^2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d" + integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w== + +json-schema-traverse@^0.4.1: + version "0.4.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" + integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== + +json-schema-traverse@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2" + integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug== + +json5@^2.1.2, json5@^2.2.3: + version "2.2.3" + resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283" + integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg== + +kind-of@^6.0.2: + version "6.0.3" + resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz#07c05034a6c349fa06e24fa35aa76db4580ce4dd" + integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw== + +lilconfig@^3.1.2: + version "3.1.3" + resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-3.1.3.tgz#a1bcfd6257f9585bf5ae14ceeebb7b559025e4c4" + integrity sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw== + +loader-runner@^4.2.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1" + integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg== + +loader-utils@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.4.tgz#8b5cb38b5c34a9a018ee1fc0e6a066d1dfcc528c" + integrity sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw== + dependencies: + big.js "^5.2.2" + emojis-list "^3.0.0" + json5 "^2.1.2" + +locate-path@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz#1afba396afd676a6d42504d0a67a3a7eb9f62aa0" + integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g== + dependencies: + p-locate "^4.1.0" + +locate-path@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-7.2.0.tgz#69cb1779bd90b35ab1e771e1f2f89a202c2a8a8a" + integrity sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA== + dependencies: + p-locate "^6.0.0" + +lodash.debounce@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/lodash.debounce/-/lodash.debounce-4.0.8.tgz#82d79bff30a67c4005ffd5e2515300ad9ca4d7af" + integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow== + +lodash.memoize@^4.1.2: + version "4.1.2" + resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" + integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag== + +lodash.uniq@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" + integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ== + +lodash@^4.17.20, lodash@^4.17.21: + version "4.17.21" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c" + integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== + +lru-cache@^5.1.1: + version "5.1.1" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz#1da27e6710271947695daf6848e847f01d84b920" + integrity sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w== + dependencies: + yallist "^3.0.2" + +mdn-data@2.0.28: + version "2.0.28" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.28.tgz#5ec48e7bef120654539069e1ae4ddc81ca490eba" + integrity sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g== + +mdn-data@2.0.30: + version "2.0.30" + resolved "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.30.tgz#ce4df6f80af6cfbe218ecd5c552ba13c4dfa08cc" + integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== + +merge-stream@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60" + integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.27: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +mini-css-extract-plugin@^2.6.0: + version "2.9.2" + resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-2.9.2.tgz#966031b468917a5446f4c24a80854b2947503c5b" + integrity sha512-GJuACcS//jtq4kCtd5ii/M0SZf7OZRH+BxdqXZHaJfb8TJiVl+NgQRPwiYt2EuqeSkNydn/7vP+bcE27C5mb9w== + dependencies: + schema-utils "^4.0.0" + tapable "^2.2.1" + +ms@^2.1.3: + version "2.1.3" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.3.tgz#574c8138ce1d2b5861f0b44579dbadd60c6615b2" + integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA== + +nanoid@^3.3.8: + version "3.3.11" + resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.11.tgz#4f4f112cefbe303202f2199838128936266d185b" + integrity sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w== + +neo-async@^2.6.2: + version "2.6.2" + resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f" + integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw== + +node-releases@^2.0.19: + version "2.0.19" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" + integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + +normalize-path@^3.0.0, normalize-path@~3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz#0dcd69ff23a1c9b11fd0978316644a0388216a65" + integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA== + +nth-check@^2.0.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/nth-check/-/nth-check-2.1.1.tgz#c9eab428effce36cd6b92c924bdb000ef1f1ed1d" + integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w== + dependencies: + boolbase "^1.0.0" + +p-limit@^2.2.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz#3dd33c647a214fdfffd835933eb086da0dc21db1" + integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w== + dependencies: + p-try "^2.0.0" + +p-limit@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-4.0.0.tgz#914af6544ed32bfa54670b061cafcbd04984b644" + integrity sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ== + dependencies: + yocto-queue "^1.0.0" + +p-locate@^4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz#a3428bb7088b3a60292f66919278b7c297ad4f07" + integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A== + dependencies: + p-limit "^2.2.0" + +p-locate@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-6.0.0.tgz#3da9a49d4934b901089dca3302fa65dc5a05c04f" + integrity sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw== + dependencies: + p-limit "^4.0.0" + +p-try@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" + integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== + +path-exists@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz#513bdbe2d3b95d7762e8c1137efa195c6c61b5b3" + integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w== + +path-exists@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-5.0.0.tgz#a6aad9489200b21fab31e49cf09277e5116fb9e7" + integrity sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ== + +path-key@^3.1.0: + version "3.1.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375" + integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q== + +path-parse@^1.0.7: + version "1.0.7" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.7.tgz#fbc114b60ca42b30d9daf5858e4bd68bbedb6735" + integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw== + +picocolors@^1.0.0, picocolors@^1.1.0, picocolors@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/picocolors/-/picocolors-1.1.1.tgz#3d321af3eab939b083c8f929a1d12cda81c26b6b" + integrity sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA== + +picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.2.3: + version "2.3.1" + resolved "https://registry.yarnpkg.com/picomatch/-/picomatch-2.3.1.tgz#3ba3833733646d9d3e4995946c1365a67fb07a42" + integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA== + +pkg-dir@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz#f099133df7ede422e81d1d8448270eeb3e4261f3" + integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ== + dependencies: + find-up "^4.0.0" + +pkg-dir@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-7.0.0.tgz#8f0c08d6df4476756c5ff29b3282d0bab7517d11" + integrity sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA== + dependencies: + find-up "^6.3.0" + +postcss-calc@^10.0.2: + version "10.1.1" + resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-10.1.1.tgz#52b385f2e628239686eb6e3a16207a43f36064ca" + integrity sha512-NYEsLHh8DgG/PRH2+G9BTuUdtf9ViS+vdoQ0YA5OQdGsfN4ztiwtDWNtBl9EKeqNMFnIu8IKZ0cLxEQ5r5KVMw== + dependencies: + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.2.0" + +postcss-colormin@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-7.0.2.tgz#6f3c53c13158168669f45adc3926f35cb240ef8e" + integrity sha512-YntRXNngcvEvDbEjTdRWGU606eZvB5prmHG4BF0yLmVpamXbpsRJzevyy6MZVyuecgzI2AWAlvFi8DAeCqwpvA== + dependencies: + browserslist "^4.23.3" + caniuse-api "^3.0.0" + colord "^2.9.3" + postcss-value-parser "^4.2.0" + +postcss-convert-values@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-7.0.4.tgz#fc13ecedded6365f3c794b502dbcf77d298da12c" + integrity sha512-e2LSXPqEHVW6aoGbjV9RsSSNDO3A0rZLCBxN24zvxF25WknMPpX8Dm9UxxThyEbaytzggRuZxaGXqaOhxQ514Q== + dependencies: + browserslist "^4.23.3" + postcss-value-parser "^4.2.0" + +postcss-discard-comments@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-7.0.3.tgz#9c414e8ee99d3514ad06a3465ccc20ec1dbce780" + integrity sha512-q6fjd4WU4afNhWOA2WltHgCbkRhZPgQe7cXF74fuVB/ge4QbM9HEaOIzGSiMvM+g/cOsNAUGdf2JDzqA2F8iLA== + dependencies: + postcss-selector-parser "^6.1.2" + +postcss-discard-duplicates@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-7.0.1.tgz#f87f2fe47d8f01afb1e98361c1db3ce1e8afd1a3" + integrity sha512-oZA+v8Jkpu1ct/xbbrntHRsfLGuzoP+cpt0nJe5ED2FQF8n8bJtn7Bo28jSmBYwqgqnqkuSXJfSUEE7if4nClQ== + +postcss-discard-empty@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-7.0.0.tgz#218829d1ef0a5d5142dd62f0aa60e00e599d2033" + integrity sha512-e+QzoReTZ8IAwhnSdp/++7gBZ/F+nBq9y6PomfwORfP7q9nBpK5AMP64kOt0bA+lShBFbBDcgpJ3X4etHg4lzA== + +postcss-discard-overridden@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-7.0.0.tgz#b123ea51e3d4e1d0a254cf71eaff1201926d319c" + integrity sha512-GmNAzx88u3k2+sBTZrJSDauR0ccpE24omTQCVmaTTZFz1du6AasspjaUPMJ2ud4RslZpoFKyf+6MSPETLojc6w== + +postcss-merge-longhand@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-7.0.4.tgz#a52d0662b4b29420f3b64a8d5b0ac5133d8db776" + integrity sha512-zer1KoZA54Q8RVHKOY5vMke0cCdNxMP3KBfDerjH/BYHh4nCIh+1Yy0t1pAEQF18ac/4z3OFclO+ZVH8azjR4A== + dependencies: + postcss-value-parser "^4.2.0" + stylehacks "^7.0.4" + +postcss-merge-rules@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-7.0.4.tgz#648cc864d3121e6ec72c2a4f08df1cc801e60ce8" + integrity sha512-ZsaamiMVu7uBYsIdGtKJ64PkcQt6Pcpep/uO90EpLS3dxJi6OXamIobTYcImyXGoW0Wpugh7DSD3XzxZS9JCPg== + dependencies: + browserslist "^4.23.3" + caniuse-api "^3.0.0" + cssnano-utils "^5.0.0" + postcss-selector-parser "^6.1.2" + +postcss-minify-font-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-7.0.0.tgz#d16a75a2548e000779566b3568fc874ee5d0aa17" + integrity sha512-2ckkZtgT0zG8SMc5aoNwtm5234eUx1GGFJKf2b1bSp8UflqaeFzR50lid4PfqVI9NtGqJ2J4Y7fwvnP/u1cQog== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-minify-gradients@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-7.0.0.tgz#f6d84456e6d49164a55d0e45bb1b1809c6cf0959" + integrity sha512-pdUIIdj/C93ryCHew0UgBnL2DtUS3hfFa5XtERrs4x+hmpMYGhbzo6l/Ir5de41O0GaKVpK1ZbDNXSY6GkXvtg== + dependencies: + colord "^2.9.3" + cssnano-utils "^5.0.0" + postcss-value-parser "^4.2.0" + +postcss-minify-params@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-7.0.2.tgz#264a76e25f202d8b5ca5290569c0e8c3ac599dfe" + integrity sha512-nyqVLu4MFl9df32zTsdcLqCFfE/z2+f8GE1KHPxWOAmegSo6lpV2GNy5XQvrzwbLmiU7d+fYay4cwto1oNdAaQ== + dependencies: + browserslist "^4.23.3" + cssnano-utils "^5.0.0" + postcss-value-parser "^4.2.0" + +postcss-minify-selectors@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-7.0.4.tgz#2b69c99ec48a1c223fce4840609d9c53340a11f5" + integrity sha512-JG55VADcNb4xFCf75hXkzc1rNeURhlo7ugf6JjiiKRfMsKlDzN9CXHZDyiG6x/zGchpjQS+UAgb1d4nqXqOpmA== + dependencies: + cssesc "^3.0.0" + postcss-selector-parser "^6.1.2" + +postcss-modules-extract-imports@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.1.0.tgz#b4497cb85a9c0c4b5aabeb759bb25e8d89f15002" + integrity sha512-k3kNe0aNFQDAZGbin48pL2VNidTF0w4/eASDsxlyspobzU3wZQLOGj7L9gfRe0Jo9/4uud09DsjFNH7winGv8Q== + +postcss-modules-local-by-default@^4.0.5: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.2.0.tgz#d150f43837831dae25e4085596e84f6f5d6ec368" + integrity sha512-5kcJm/zk+GJDSfw+V/42fJ5fhjL5YbFDl8nVdXkJPLLW+Vf9mTD5Xe0wqIaDnLuL2U6cDNpTr+UQ+v2HWIBhzw== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^7.0.0" + postcss-value-parser "^4.1.0" + +postcss-modules-scope@^3.2.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.2.1.tgz#1bbccddcb398f1d7a511e0a2d1d047718af4078c" + integrity sha512-m9jZstCVaqGjTAuny8MdgE88scJnCiQSlSrOWcTQgM2t32UBe+MUmFSO5t7VMSfAf/FJKImAxBav8ooCHJXCJA== + dependencies: + postcss-selector-parser "^7.0.0" + +postcss-modules-values@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" + integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ== + dependencies: + icss-utils "^5.0.0" + +postcss-normalize-charset@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-7.0.0.tgz#92244ae73c31bf8f8885d5f16ff69e857ac6c001" + integrity sha512-ABisNUXMeZeDNzCQxPxBCkXexvBrUHV+p7/BXOY+ulxkcjUZO0cp8ekGBwvIh2LbCwnWbyMPNJVtBSdyhM2zYQ== + +postcss-normalize-display-values@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-7.0.0.tgz#01fb50e5e97ef8935363629bea5a6d3b3aac1342" + integrity sha512-lnFZzNPeDf5uGMPYgGOw7v0BfB45+irSRz9gHQStdkkhiM0gTfvWkWB5BMxpn0OqgOQuZG/mRlZyJxp0EImr2Q== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-positions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-7.0.0.tgz#4eebd7c9d3dde40c97b8047cad38124fc844c463" + integrity sha512-I0yt8wX529UKIGs2y/9Ybs2CelSvItfmvg/DBIjTnoUSrPxSV7Z0yZ8ShSVtKNaV/wAY+m7bgtyVQLhB00A1NQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-repeat-style@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-7.0.0.tgz#0cb784655d5714d29bd3bda6dee2fb628aa7227b" + integrity sha512-o3uSGYH+2q30ieM3ppu9GTjSXIzOrRdCUn8UOMGNw7Af61bmurHTWI87hRybrP6xDHvOe5WlAj3XzN6vEO8jLw== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-string@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-7.0.0.tgz#a119d3e63a9614570d8413d572fb9fc8c6a64e8c" + integrity sha512-w/qzL212DFVOpMy3UGyxrND+Kb0fvCiBBujiaONIihq7VvtC7bswjWgKQU/w4VcRyDD8gpfqUiBQ4DUOwEJ6Qg== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-timing-functions@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-7.0.0.tgz#99d0ee8c4b23b7f4355fafb91385833b9b07108b" + integrity sha512-tNgw3YV0LYoRwg43N3lTe3AEWZ66W7Dh7lVEpJbHoKOuHc1sLrzMLMFjP8SNULHaykzsonUEDbKedv8C+7ej6g== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-unicode@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-7.0.2.tgz#095f8d36ea29adfdf494069c1de101112992a713" + integrity sha512-ztisabK5C/+ZWBdYC+Y9JCkp3M9qBv/XFvDtSw0d/XwfT3UaKeW/YTm/MD/QrPNxuecia46vkfEhewjwcYFjkg== + dependencies: + browserslist "^4.23.3" + postcss-value-parser "^4.2.0" + +postcss-normalize-url@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-7.0.0.tgz#c88cb7cf8952d3ff631e4eba924e7b060ca802f6" + integrity sha512-+d7+PpE+jyPX1hDQZYG+NaFD+Nd2ris6r8fPTBAjE8z/U41n/bib3vze8x7rKs5H1uEw5ppe9IojewouHk0klQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-normalize-whitespace@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-7.0.0.tgz#46b025f0bea72139ddee63015619b0c21cebd845" + integrity sha512-37/toN4wwZErqohedXYqWgvcHUGlT8O/m2jVkAfAe9Bd4MzRqlBmXrJRePH0e9Wgnz2X7KymTgTOaaFizQe3AQ== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-ordered-values@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-7.0.1.tgz#8b4b5b8070ca7756bd49f07d5edf274b8f6782e0" + integrity sha512-irWScWRL6nRzYmBOXReIKch75RRhNS86UPUAxXdmW/l0FcAsg0lvAXQCby/1lymxn/o0gVa6Rv/0f03eJOwHxw== + dependencies: + cssnano-utils "^5.0.0" + postcss-value-parser "^4.2.0" + +postcss-reduce-initial@^7.0.2: + version "7.0.2" + resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-7.0.2.tgz#3dc085347a5943e18547d4b0aa5bd4ff5a93b2c5" + integrity sha512-pOnu9zqQww7dEKf62Nuju6JgsW2V0KRNBHxeKohU+JkHd/GAH5uvoObqFLqkeB2n20mr6yrlWDvo5UBU5GnkfA== + dependencies: + browserslist "^4.23.3" + caniuse-api "^3.0.0" + +postcss-reduce-transforms@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-7.0.0.tgz#0386080a14e5faad9f8eda33375b79fe7c4f9677" + integrity sha512-pnt1HKKZ07/idH8cpATX/ujMbtOGhUfE+m8gbqwJE05aTaNw8gbo34a2e3if0xc0dlu75sUOiqvwCGY3fzOHew== + dependencies: + postcss-value-parser "^4.2.0" + +postcss-selector-parser@^6.1.2: + version "6.1.2" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz#27ecb41fb0e3b6ba7a1ec84fff347f734c7929de" + integrity sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-selector-parser@^7.0.0: + version "7.1.0" + resolved "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-7.1.0.tgz#4d6af97eba65d73bc4d84bcb343e865d7dd16262" + integrity sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA== + dependencies: + cssesc "^3.0.0" + util-deprecate "^1.0.2" + +postcss-svgo@^7.0.1: + version "7.0.1" + resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-7.0.1.tgz#2b63571d8e9568384df334bac9917baff4d23f58" + integrity sha512-0WBUlSL4lhD9rA5k1e5D8EN5wCEyZD6HJk0jIvRxl+FDVOMlJ7DePHYWGGVc5QRqrJ3/06FTXM0bxjmJpmTPSA== + dependencies: + postcss-value-parser "^4.2.0" + svgo "^3.3.2" + +postcss-unique-selectors@^7.0.3: + version "7.0.3" + resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-7.0.3.tgz#483fc11215b23d517d5d9bbe5833d9915619ca33" + integrity sha512-J+58u5Ic5T1QjP/LDV9g3Cx4CNOgB5vz+kM6+OxHHhFACdcDeKhBXjQmB7fnIZM12YSTvsL0Opwco83DmacW2g== + dependencies: + postcss-selector-parser "^6.1.2" + +postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0: + version "4.2.0" + resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" + integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== + +postcss@^8.2.14, postcss@^8.4.33, postcss@^8.4.40: + version "8.5.3" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.5.3.tgz#1463b6f1c7fb16fe258736cba29a2de35237eafb" + integrity sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A== + dependencies: + nanoid "^3.3.8" + picocolors "^1.1.1" + source-map-js "^1.2.1" + +pretty-error@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-4.0.0.tgz#90a703f46dd7234adb46d0f84823e9d1cb8f10d6" + integrity sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw== + dependencies: + lodash "^4.17.20" + renderkid "^3.0.0" + +punycode@^2.1.0: + version "2.3.1" + resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.1.tgz#027422e2faec0b25e1549c3e1bd8309b9133b6e5" + integrity sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg== + +randombytes@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz#df6f84372f0270dc65cdf6291349ab7a473d4f2a" + integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ== + dependencies: + safe-buffer "^5.1.0" + +readdirp@~3.6.0: + version "3.6.0" + resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-3.6.0.tgz#74a370bd857116e245b29cc97340cd431a02a6c7" + integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA== + dependencies: + picomatch "^2.2.1" + +rechoir@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.8.0.tgz#49f866e0d32146142da3ad8f0eff352b3215ff22" + integrity sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ== + dependencies: + resolve "^1.20.0" + +regenerate-unicode-properties@^10.2.0: + version "10.2.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-10.2.0.tgz#626e39df8c372338ea9b8028d1f99dc3fd9c3db0" + integrity sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA== + dependencies: + regenerate "^1.4.2" + +regenerate@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.2.tgz#b9346d8827e8f5a32f7ba29637d398b69014848a" + integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A== + +regenerator-runtime@^0.14.0: + version "0.14.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz#356ade10263f685dda125100cd862c1db895327f" + integrity sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw== + +regenerator-transform@^0.15.2: + version "0.15.2" + resolved "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.15.2.tgz#5bbae58b522098ebdf09bca2f83838929001c7a4" + integrity sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg== + dependencies: + "@babel/runtime" "^7.8.4" + +regex-parser@^2.2.11: + version "2.3.1" + resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.3.1.tgz#ee3f70e50bdd81a221d505242cb9a9c275a2ad91" + integrity sha512-yXLRqatcCuKtVHsWrNg0JL3l1zGfdXeEvDa0bdu4tCDQw0RpMDZsqbkyRTUnKMR0tXF627V2oEWjBEaEdqTwtQ== + +regexpu-core@^6.2.0: + version "6.2.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-6.2.0.tgz#0e5190d79e542bf294955dccabae04d3c7d53826" + integrity sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA== + dependencies: + regenerate "^1.4.2" + regenerate-unicode-properties "^10.2.0" + regjsgen "^0.8.0" + regjsparser "^0.12.0" + unicode-match-property-ecmascript "^2.0.0" + unicode-match-property-value-ecmascript "^2.1.0" + +regjsgen@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.8.0.tgz#df23ff26e0c5b300a6470cad160a9d090c3a37ab" + integrity sha512-RvwtGe3d7LvWiDQXeQw8p5asZUmfU1G/l6WbUXeHta7Y2PEIvBTwH6E2EfmYUK8pxcxEdEmaomqyp0vZZ7C+3Q== + +regjsparser@^0.12.0: + version "0.12.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.12.0.tgz#0e846df6c6530586429377de56e0475583b088dc" + integrity sha512-cnE+y8bz4NhMjISKbgeVJtqNbtf5QpjZP+Bslo+UqkIt9QPnX9q095eiRRASJG1/tz6dlNr6Z5NsBiWYokp6EQ== + dependencies: + jsesc "~3.0.2" + +renderkid@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-3.0.0.tgz#5fd823e4d6951d37358ecc9a58b1f06836b6268a" + integrity sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg== + dependencies: + css-select "^4.1.3" + dom-converter "^0.2.0" + htmlparser2 "^6.1.0" + lodash "^4.17.21" + strip-ansi "^6.0.1" + +require-from-string@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909" + integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw== + +resolve-cwd@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d" + integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg== + dependencies: + resolve-from "^5.0.0" + +resolve-from@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69" + integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw== + +resolve-url-loader@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz#ee3142fb1f1e0d9db9524d539cfa166e9314f795" + integrity sha512-uZtduh8/8srhBoMx//5bwqjQ+rfYOUq8zC9NrMUGtjBiGTtFJM42s58/36+hTqeqINcnYe08Nj3LkK9lW4N8Xg== + dependencies: + adjust-sourcemap-loader "^4.0.0" + convert-source-map "^1.7.0" + loader-utils "^2.0.0" + postcss "^8.2.14" + source-map "0.6.1" + +resolve@^1.14.2, resolve@^1.20.0: + version "1.22.10" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.22.10.tgz#b663e83ffb09bbf2386944736baae803029b8b39" + integrity sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w== + dependencies: + is-core-module "^2.16.0" + path-parse "^1.0.7" + supports-preserve-symlinks-flag "^1.0.0" + +safe-buffer@^5.1.0: + version "5.2.1" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6" + integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ== + +sass-loader@^16.0.1: + version "16.0.5" + resolved "https://registry.yarnpkg.com/sass-loader/-/sass-loader-16.0.5.tgz#257bc90119ade066851cafe7f2c3f3504c7cda98" + integrity sha512-oL+CMBXrj6BZ/zOq4os+UECPL+bWqt6OAC6DWS8Ln8GZRcMDjlJ4JC3FBDuHJdYaFWIdKNIBYmtZtK2MaMkNIw== + dependencies: + neo-async "^2.6.2" + +sass@~1.64.2: + version "1.64.2" + resolved "https://registry.yarnpkg.com/sass/-/sass-1.64.2.tgz#0d9805ad6acf31c59c3acc725fcfb91b7fcc6909" + integrity sha512-TnDlfc+CRnUAgLO9D8cQLFu/GIjJIzJCGkE7o4ekIGQOH7T3GetiRR/PsTWJUHhkzcSPrARkPI+gNWn5alCzDg== + dependencies: + chokidar ">=3.0.0 <4.0.0" + immutable "^4.0.0" + source-map-js ">=0.6.2 <2.0.0" + +schema-utils@^3.0.0: + version "3.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.3.0.tgz#f50a88877c3c01652a15b622ae9e9795df7a60fe" + integrity sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg== + dependencies: + "@types/json-schema" "^7.0.8" + ajv "^6.12.5" + ajv-keywords "^3.5.2" + +schema-utils@^4.0.0, schema-utils@^4.2.0, schema-utils@^4.3.0: + version "4.3.0" + resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.3.0.tgz#3b669f04f71ff2dfb5aba7ce2d5a9d79b35622c0" + integrity sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g== + dependencies: + "@types/json-schema" "^7.0.9" + ajv "^8.9.0" + ajv-formats "^2.1.1" + ajv-keywords "^5.1.0" + +semver@^6.3.1: + version "6.3.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-6.3.1.tgz#556d2ef8689146e46dcea4bfdd095f3434dffcb4" + integrity sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA== + +semver@^7.3.2, semver@^7.5.4: + version "7.7.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-7.7.1.tgz#abd5098d82b18c6c81f6074ff2647fd3e7220c9f" + integrity sha512-hlq8tAfn0m/61p4BVRcPzIGr6LKiMwo4VM6dGi6pt4qcRkmNzTcWq6eCEjEh+qXjkMDvPlOFFSGwQjoEa6gyMA== + +serialize-javascript@^6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== + dependencies: + randombytes "^2.1.0" + +shallow-clone@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz#8f2981ad92531f55035b01fb230769a40e02efa3" + integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA== + dependencies: + kind-of "^6.0.2" + +shebang-command@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea" + integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA== + dependencies: + shebang-regex "^3.0.0" + +shebang-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172" + integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A== + +slugify@^1.6: + version "1.6.6" + resolved "https://registry.yarnpkg.com/slugify/-/slugify-1.6.6.tgz#2d4ac0eacb47add6af9e04d3be79319cbcc7924b" + integrity sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw== + +"source-map-js@>=0.6.2 <2.0.0", source-map-js@^1.0.1, source-map-js@^1.2.1: + version "1.2.1" + resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.2.1.tgz#1ce5650fddd87abc099eda37dcff024c2667ae46" + integrity sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA== + +source-map-support@~0.5.20: + version "0.5.21" + resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f" + integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w== + dependencies: + buffer-from "^1.0.0" + source-map "^0.6.0" + +source-map@0.6.1, source-map@^0.6.0: + version "0.6.1" + resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" + integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== + +spotlight.js@^0.7.8: + version "0.7.8" + resolved "https://registry.yarnpkg.com/spotlight.js/-/spotlight.js-0.7.8.tgz#0620371701508222d736e0658e8db3fbe9ddc53b" + integrity sha512-zq822gqhjaMHt31oZi4do211NwqBcxZ4u7Xtb+OEsbLrz37dcELhBCoQXFu/0sTiomqD6tm5g6tmqvE7S6h4ng== + +stackframe@^1.3.4: + version "1.3.4" + resolved "https://registry.yarnpkg.com/stackframe/-/stackframe-1.3.4.tgz#b881a004c8c149a5e8efef37d51b16e412943310" + integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw== + +stimulus-use@^0.52: + version "0.52.3" + resolved "https://registry.yarnpkg.com/stimulus-use/-/stimulus-use-0.52.3.tgz#d6f35fa93277274957a2ed98a7b04b4d702cb1d6" + integrity sha512-stZ5dID6FUrGCR/ChWUa0FT5Z8iqkzT6lputOAb50eF+Ayg7RzJj4U/HoRlp2NV333QfvoRidru9HLbom4hZVw== + +string-width@^4.2.3: + version "4.2.3" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010" + integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g== + dependencies: + emoji-regex "^8.0.0" + is-fullwidth-code-point "^3.0.0" + strip-ansi "^6.0.1" + +strip-ansi@^6.0.1: + version "6.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9" + integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A== + dependencies: + ansi-regex "^5.0.1" + +style-loader@^3.3.0: + version "3.3.4" + resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== + +stylehacks@^7.0.4: + version "7.0.4" + resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-7.0.4.tgz#9c21f7374f4bccc0082412b859b3c89d77d3277c" + integrity sha512-i4zfNrGMt9SB4xRK9L83rlsFCgdGANfeDAYacO1pkqcE7cRHPdWHwnKZVz7WY17Veq/FvyYsRAU++Ga+qDFIww== + dependencies: + browserslist "^4.23.3" + postcss-selector-parser "^6.1.2" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== + dependencies: + has-flag "^3.0.0" + +supports-color@^7.1.0: + version "7.2.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da" + integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== + dependencies: + has-flag "^4.0.0" + +supports-color@^8.0.0: + version "8.1.1" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c" + integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q== + dependencies: + has-flag "^4.0.0" + +supports-preserve-symlinks-flag@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz#6eda4bd344a3c94aea376d4cc31bc77311039e09" + integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w== + +svg.draggable.js@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/svg.draggable.js/-/svg.draggable.js-2.2.2.tgz#c514a2f1405efb6f0263e7958f5b68fce50603ba" + integrity sha512-JzNHBc2fLQMzYCZ90KZHN2ohXL0BQJGQimK1kGk6AvSeibuKcIdDX9Kr0dT9+UJ5O8nYA0RB839Lhvk4CY4MZw== + dependencies: + svg.js "^2.0.1" + +svg.easing.js@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/svg.easing.js/-/svg.easing.js-2.0.0.tgz#8aa9946b0a8e27857a5c40a10eba4091e5691f12" + integrity sha512-//ctPdJMGy22YoYGV+3HEfHbm6/69LJUTAqI2/5qBvaNHZ9uUFVC82B0Pl299HzgH13rKrBgi4+XyXXyVWWthA== + dependencies: + svg.js ">=2.3.x" + +svg.filter.js@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/svg.filter.js/-/svg.filter.js-2.0.2.tgz#91008e151389dd9230779fcbe6e2c9a362d1c203" + integrity sha512-xkGBwU+dKBzqg5PtilaTb0EYPqPfJ9Q6saVldX+5vCRy31P6TlRCP3U9NxH3HEufkKkpNgdTLBJnmhDHeTqAkw== + dependencies: + svg.js "^2.2.5" + +svg.js@>=2.3.x, svg.js@^2.0.1, svg.js@^2.2.5, svg.js@^2.4.0, svg.js@^2.6.5: + version "2.7.1" + resolved "https://registry.yarnpkg.com/svg.js/-/svg.js-2.7.1.tgz#eb977ed4737001eab859949b4a398ee1bb79948d" + integrity sha512-ycbxpizEQktk3FYvn/8BH+6/EuWXg7ZpQREJvgacqn46gIddG24tNNe4Son6omdXCnSOaApnpZw6MPCBA1dODA== + +svg.pathmorphing.js@^0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/svg.pathmorphing.js/-/svg.pathmorphing.js-0.1.3.tgz#c25718a1cc7c36e852ecabc380e758ac09bb2b65" + integrity sha512-49HWI9X4XQR/JG1qXkSDV8xViuTLIWm/B/7YuQELV5KMOPtXjiwH4XPJvr/ghEDibmLQ9Oc22dpWpG0vUDDNww== + dependencies: + svg.js "^2.4.0" + +svg.resize.js@^1.4.3: + version "1.4.3" + resolved "https://registry.yarnpkg.com/svg.resize.js/-/svg.resize.js-1.4.3.tgz#885abd248e0cd205b36b973c4b578b9a36f23332" + integrity sha512-9k5sXJuPKp+mVzXNvxz7U0uC9oVMQrrf7cFsETznzUDDm0x8+77dtZkWdMfRlmbkEEYvUn9btKuZ3n41oNA+uw== + dependencies: + svg.js "^2.6.5" + svg.select.js "^2.1.2" + +svg.select.js@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-2.1.2.tgz#e41ce13b1acff43a7441f9f8be87a2319c87be73" + integrity sha512-tH6ABEyJsAOVAhwcCjF8mw4crjXSI1aa7j2VQR8ZuJ37H2MBUbyeqYr5nEO7sSN3cy9AR9DUwNg0t/962HlDbQ== + dependencies: + svg.js "^2.2.5" + +svg.select.js@^3.0.1: + version "3.0.1" + resolved "https://registry.yarnpkg.com/svg.select.js/-/svg.select.js-3.0.1.tgz#a4198e359f3825739226415f82176a90ea5cc917" + integrity sha512-h5IS/hKkuVCbKSieR9uQCj9w+zLHoPh+ce19bBYyqF53g6mnPB8sAtIbe1s9dh2S2fCmYX2xel1Ln3PJBbK4kw== + dependencies: + svg.js "^2.6.5" + +svgo@^3.3.2: + version "3.3.2" + resolved "https://registry.yarnpkg.com/svgo/-/svgo-3.3.2.tgz#ad58002652dffbb5986fc9716afe52d869ecbda8" + integrity sha512-OoohrmuUlBs8B8o6MB2Aevn+pRIH9zDALSR+6hhqVfa6fRwG/Qw9VUMSMW9VNg2CFc/MTIfabtdOVl9ODIJjpw== + dependencies: + "@trysound/sax" "0.2.0" + commander "^7.2.0" + css-select "^5.1.0" + css-tree "^2.3.1" + css-what "^6.1.0" + csso "^5.0.5" + picocolors "^1.0.0" + +tapable@^2.1.1, tapable@^2.2.0, tapable@^2.2.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0" + integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ== + +terser-webpack-plugin@^5.3.0, terser-webpack-plugin@^5.3.11: + version "5.3.14" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.14.tgz#9031d48e57ab27567f02ace85c7d690db66c3e06" + integrity sha512-vkZjpUjb6OMS7dhV+tILUW6BhpDR7P2L/aQSAv+Uwk+m8KATX9EccViHTJR2qDtACKPIYndLGCyl3FMo+r2LMw== + dependencies: + "@jridgewell/trace-mapping" "^0.3.25" + jest-worker "^27.4.5" + schema-utils "^4.3.0" + serialize-javascript "^6.0.2" + terser "^5.31.1" + +terser@^5.31.1: + version "5.39.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.39.0.tgz#0e82033ed57b3ddf1f96708d123cca717d86ca3a" + integrity sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + +tmp@^0.2.1: + version "0.2.3" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.3.tgz#eb783cc22bc1e8bebd0671476d46ea4eb32a79ae" + integrity sha512-nZD7m9iCPC5g0pYmcaxogYKggSfLsdxl8of3Q/oIbqCqLLIO9IAF0GWjX1z9NZRHPiXv8Wex4yDCaZsgEw0Y8w== + +to-regex-range@^5.0.1: + version "5.0.1" + resolved "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz#1648c44aae7c8d988a326018ed72f5b4dd0392e4" + integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ== + dependencies: + is-number "^7.0.0" + +tom-select@^2.2.2: + version "2.4.3" + resolved "https://registry.yarnpkg.com/tom-select/-/tom-select-2.4.3.tgz#1daa4131cd317de691f39eb5bf41148265986c1f" + integrity sha512-MFFrMxP1bpnAMPbdvPCZk0KwYxLqhYZso39torcdoefeV/NThNyDu8dV96/INJ5XQVTL3O55+GqQ78Pkj5oCfw== + dependencies: + "@orchidjs/sifter" "^1.1.0" + "@orchidjs/unicode-variants" "^1.1.2" + +undici-types@~6.21.0: + version "6.21.0" + resolved "https://registry.yarnpkg.com/undici-types/-/undici-types-6.21.0.tgz#691d00af3909be93a7faa13be61b3a5b50ef12cb" + integrity sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ== + +unicode-canonical-property-names-ecmascript@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.1.tgz#cb3173fe47ca743e228216e4a3ddc4c84d628cc2" + integrity sha512-dA8WbNeb2a6oQzAQ55YlT5vQAWGV9WXOsi3SskE3bcCdM0P4SDd+24zS/OCacdRq5BkdsRj9q3Pg6YyQoxIGqg== + +unicode-match-property-ecmascript@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz#54fd16e0ecb167cf04cf1f756bdcc92eba7976c3" + integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q== + dependencies: + unicode-canonical-property-names-ecmascript "^2.0.0" + unicode-property-aliases-ecmascript "^2.0.0" + +unicode-match-property-value-ecmascript@^2.1.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.2.0.tgz#a0401aee72714598f739b68b104e4fe3a0cb3c71" + integrity sha512-4IehN3V/+kkr5YeSSDDQG8QLqO26XpL2XP3GQtqwlT/QYSECAwFztxVHjlbh0+gjJ3XmNLS0zDsbgs9jWKExLg== + +unicode-property-aliases-ecmascript@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz#43d41e3be698bd493ef911077c9b131f827e8ccd" + integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w== + +update-browserslist-db@^1.1.1: + version "1.1.3" + resolved "https://registry.yarnpkg.com/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz#348377dd245216f9e7060ff50b15a1b740b75420" + integrity sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw== + dependencies: + escalade "^3.2.0" + picocolors "^1.1.1" + +uri-js@^4.2.2: + version "4.4.1" + resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.4.1.tgz#9b1a52595225859e55f669d928f88c6c57f2a77e" + integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg== + dependencies: + punycode "^2.1.0" + +util-deprecate@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw== + +utila@~0.4: + version "0.4.0" + resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" + integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA== + +watchpack@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.2.tgz#2feeaed67412e7c33184e5a79ca738fbd38564da" + integrity sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw== + dependencies: + glob-to-regexp "^0.4.1" + graceful-fs "^4.1.2" + +webpack-cli@^5.1.4: + version "5.1.4" + resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-5.1.4.tgz#c8e046ba7eaae4911d7e71e2b25b776fcc35759b" + integrity sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg== + 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" + +webpack-merge@^5.7.3: + version "5.10.0" + resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.10.0.tgz#a3ad5d773241e9c682803abf628d4cd62b8a4177" + integrity sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA== + dependencies: + clone-deep "^4.0.1" + flat "^5.0.2" + wildcard "^2.0.0" + +webpack-sources@^3.2.3: + version "3.2.3" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde" + integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w== + +webpack@^5.72: + version "5.99.5" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.99.5.tgz#86e3b3a5a03377ea5da271c929934003f5ac5dd8" + integrity sha512-q+vHBa6H9qwBLUlHL4Y7L0L1/LlyBKZtS9FHNCQmtayxjI5RKC9yD8gpvLeqGv5lCQp1Re04yi0MF40pf30Pvg== + dependencies: + "@types/eslint-scope" "^3.7.7" + "@types/estree" "^1.0.6" + "@webassemblyjs/ast" "^1.14.1" + "@webassemblyjs/wasm-edit" "^1.14.1" + "@webassemblyjs/wasm-parser" "^1.14.1" + acorn "^8.14.0" + browserslist "^4.24.0" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.17.1" + 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 "^4.3.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.11" + watchpack "^2.4.1" + webpack-sources "^3.2.3" + +which@^2.0.1: + version "2.0.2" + resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1" + integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA== + dependencies: + isexe "^2.0.0" + +wildcard@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.1.tgz#5ab10d02487198954836b6349f74fff961e10f67" + integrity sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ== + +yallist@^3.0.2: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz#dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd" + integrity sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g== + +yargs-parser@^21.0.0: + version "21.1.1" + resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" + integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== + +yocto-queue@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-1.2.1.tgz#36d7c4739f775b3cbc28e6136e21aa057adec418" + integrity sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg== diff --git a/tests/Behat/Context/Api/WishlistContext.php b/tests/Behat/Context/Api/WishlistContext.php index 5472e5b6..f71756e6 100644 --- a/tests/Behat/Context/Api/WishlistContext.php +++ b/tests/Behat/Context/Api/WishlistContext.php @@ -1,20 +1,20 @@ router->generate('api_wishlists_shop_create_wishlist_collection'); + $uri = $this->router->generate('sylius_wishlist_shop_create_wishlist'); $response = $this->client->request( Request::METHOD_POST, sprintf('%s%s', self::$domain, $uri), @@ -245,7 +247,7 @@ public function userShouldHaveProductVariantInTheWishlist(ProductVariantInterfac */ public function userRemovesProductFromTheWishlist(ProductInterface $product): void { - $uri = $this->router->generate('api_wishlists_shop_remove_product_from_wishlist_item', [ + $uri = $this->router->generate('sylius_wishlist_shop_remove_product_from_wishlist', [ 'token' => $this->wishlist->getToken(), 'productId' => $product->getId(), ]); @@ -286,7 +288,7 @@ public function userTriesToAddProductVariantToTheWishlist(ProductVariantInterfac */ public function userRemovesProductVariantFromTheWishlist(ProductVariantInterface $variant): void { - $uri = $this->router->generate('api_wishlists_shop_remove_product_variant_from_wishlist_item', [ + $uri = $this->router->generate('sylius_wishlist_shop_remove_product_variant_from_wishlist', [ 'token' => $this->wishlist->getToken(), 'productVariantId' => $variant->getId(), ]); @@ -366,7 +368,7 @@ public function setupDomain(): void */ public function userHasAWishlistInChannel(ChannelInterface $channel): void { - $uri = $this->router->generate('api_wishlists_shop_create_wishlist_collection'); + $uri = $this->router->generate('sylius_wishlist_shop_create_wishlist'); $response = $this->client->request( Request::METHOD_POST, sprintf('%s%s', self::$domain, $uri), @@ -420,7 +422,7 @@ private function addProductToTheWishlist( ProductInterface $product, ChannelInterface $channel = null, ): ResponseInterface { - $uri = $this->router->generate('api_wishlists_shop_add_product_to_wishlist_item', [ + $uri = $this->router->generate('sylius_wishlist_shop_add_product_to_wishlist', [ 'token' => $wishlist->getToken(), ]); @@ -445,7 +447,7 @@ private function addProductToTheWishlist( private function addProductVariantToTheWishlist(WishlistInterface $wishlist, ProductVariantInterface $variant): ResponseInterface { - $uri = $this->router->generate('api_wishlists_shop_add_product_variant_to_wishlist_item', [ + $uri = $this->router->generate('sylius_wishlist_shop_add_product_variant_to_wishlist', [ 'token' => $wishlist->getToken(), ]); @@ -465,7 +467,7 @@ private function addProductVariantToTheWishlist(WishlistInterface $wishlist, Pro */ private function removeProductFromTheWishlist(WishlistInterface $wishlist, ProductInterface $product): ResponseInterface { - $uri = $this->router->generate('api_wishlists_shop_remove_product_from_wishlist_item', [ + $uri = $this->router->generate('sylius_wishlist_shop_remove_product_from_wishlist', [ 'token' => $wishlist->getToken(), 'productId' => $product->getId(), ]); diff --git a/tests/Behat/Context/Cli/WishlistContext.php b/tests/Behat/Context/Cli/WishlistContext.php index 9da2219a..2eefd67b 100644 --- a/tests/Behat/Context/Cli/WishlistContext.php +++ b/tests/Behat/Context/Cli/WishlistContext.php @@ -1,15 +1,17 @@ wishlistRepository->findOneBy([]); Assert::notNull($wishlist); - $url = $this->router->generate('bitbag_sylius_wishlist_plugin_shop_wishlist_export_to_pdf', ['wishlistId' => $wishlist->getId()], UrlGeneratorInterface::RELATIVE_PATH); + $url = $this->router->generate('sylius_wishlist_plugin_shop_wishlist_export_to_pdf', ['wishlistId' => $wishlist->getId()], UrlGeneratorInterface::RELATIVE_PATH); $response = $guzzle->get(sprintf('%s%s', $baseUrl, $url)); @@ -493,6 +495,8 @@ public function iShouldHaveProductInMyWishlist(string $productName): void */ public function iShouldHaveProductInMyCart(string $productName): void { + $this->iShouldWaitForOneSecond(); + Assert::true( $this->wishlistPage->hasProductInCart($productName), sprintf('Product %s was not found in the cart.', $productName), diff --git a/tests/Behat/Page/Shop/ProductIndexPage.php b/tests/Behat/Page/Shop/ProductIndexPage.php index ee53cbc9..c9556f10 100644 --- a/tests/Behat/Page/Shop/ProductIndexPage.php +++ b/tests/Behat/Page/Shop/ProductIndexPage.php @@ -1,15 +1,17 @@ getDocument()->find('css', '.ui.cart.popup > .list > .item > strong'); + $productNameElement = $this->getDocument()->find('css', '#offcanvasCart .h6 [data-test-product-name]'); if (null === $productNameElement) { return false; } - $productNameOnPage = $productNameElement->getText(); + $productNameOnPage = $productNameElement->getAttribute('data-test-product-name'); return $productName === $productNameOnPage; } public function hasProductOutOfStockValidationMessage(ProductInterface $product): bool { - $outOfStockValidationErrorElement = $this->getDocument()->find('css', '.sylius-flash-message p'); + $outOfStockValidationErrorElement = $this->getDocument()->find('css', '.alert [data-test-flash-messages]'); if (null === $outOfStockValidationErrorElement) { return false; @@ -184,7 +186,7 @@ public function hasProductOutOfStockValidationMessage(ProductInterface $product) public function hasWishlistClearedValidationMessage(): bool { - $hasWishlistClearedValidationMessage = $this->getDocument()->find('css', '.sylius-flash-message p'); + $hasWishlistClearedValidationMessage = $this->getDocument()->find('css', '.alert [data-test-flash-messages]'); if (null === $hasWishlistClearedValidationMessage) { return false; @@ -197,20 +199,20 @@ public function hasWishlistClearedValidationMessage(): bool public function addMoreProductsWishlistValidationMessage(): bool { - $notEnoughQuantityOfItemsValidationError = $this->getDocument()->find('css', '.sylius-flash-message p'); + $notEnoughQuantityOfItemsValidationError = $this->getDocument()->find('css', '.alert [data-test-flash-messages]'); if (null === $notEnoughQuantityOfItemsValidationError) { return false; } - $message = sprintf('Increase the quantity of at least one item.'); + $message = sprintf('Quantity must be between 1 and 9999.'); return $notEnoughQuantityOfItemsValidationError->getText() === $message; } public function getRouteName(): string { - return 'bitbag_sylius_wishlist_plugin_shop_wishlist_list_products'; + return 'sylius_wishlist_plugin_shop_wishlist_list_products'; } protected function getDefinedElements(): array diff --git a/tests/Behat/Page/Shop/WishlistPageInterface.php b/tests/Behat/Page/Shop/WishlistPageInterface.php index db9c9708..df4d23d4 100644 --- a/tests/Behat/Page/Shop/WishlistPageInterface.php +++ b/tests/Behat/Page/Shop/WishlistPageInterface.php @@ -1,15 +1,17 @@ fixturesData['empty_olivier_wishlist']; + $token = $wishlist->getToken(); /** @var ProductInterface $product */ $product = $this->fixturesData['product_1']; @@ -83,7 +86,6 @@ public function test_user_can_add_product_to_wishlist(): void $this->assertCount(0, $wishlist->getWishlistProducts()); $this->client->request('PATCH', '/api/v2/shop/wishlists/' . $token . '/product', [], [], $header, json_encode([ 'productId' => $product->getId(), - 'wishlist' => $wishlist, ])); $response = $this->client->getResponse(); @@ -135,7 +137,6 @@ public function test_user_can_delete_product_from_wishlist(): void $this->assertCount(1, $wishlist->getWishlistProducts()); $this->client->request('DELETE', '/api/v2/shop/wishlists/' . $token . '/products/' . $product->getId(), [], [], $header); - $response = $this->client->getResponse(); /** @var ?WishlistInterface $updatedWishlist */ diff --git a/tests/Functional/DataFixtures/ORM/Api/WishlistTest/wishlist.yaml b/tests/Functional/DataFixtures/ORM/Api/WishlistTest/wishlist.yaml index 093787b1..fd4b770f 100644 --- a/tests/Functional/DataFixtures/ORM/Api/WishlistTest/wishlist.yaml +++ b/tests/Functional/DataFixtures/ORM/Api/WishlistTest/wishlist.yaml @@ -1,19 +1,21 @@ Sylius\Component\Locale\Model\Locale: locale: - createdAt: '' code: 'en_US' + Sylius\Component\Currency\Model\Currency: dollar: code: 'USD' + Sylius\Component\Core\Model\Channel: channel_us: code: 'US' - name: 'name' + name: 'United States' defaultLocale: '@locale' - locales: [ '@locale' ] + locales: ['@locale'] taxCalculationStrategy: 'order_items_based' baseCurrency: '@dollar' enabled: true + Sylius\Component\Core\Model\AdminUser: test_admin: enabled: true @@ -23,75 +25,88 @@ Sylius\Component\Core\Model\AdminUser: email: "admin@example.com" emailCanonical: "admin@example.com" localeCode: 'en_US' - roles: ["ROLE_ADMINISTRATION_ACCESS","ROLE_API_ACCESS"] + roles: ["ROLE_ADMINISTRATION_ACCESS", "ROLE_API_ACCESS"] + plainPassword: 'adminpass' + Sylius\Component\Core\Model\Customer: customer_oliver: firstName: 'John' lastName: 'Nowak' email: 'oliver@queen.com' - emailCanonical: 'test2@example.com' + emailCanonical: 'oliver@queen.com' + customer_bruce: firstName: 'Bruce' lastName: 'Wayne' email: 'bruce@wayne.com' - emailCanonical: 'test@example.com' + emailCanonical: 'bruce@wayne.com' + Sylius\Component\Core\Model\ShopUser: user_oliver: plainPassword: '123password' - roles: [ 'ROLE_USER' ] - enabled: 'true' + roles: ['ROLE_USER'] + enabled: true customer: '@customer_oliver' username: 'oliver@queen.com' usernameCanonical: 'oliver@queen.com' + user_bruce: plainPassword: '123password' - roles: [ 'ROLE_USER' ] - enabled: 'true' + roles: ['ROLE_USER'] + enabled: true customer: '@customer_bruce' username: 'bruce@wayne.com' usernameCanonical: 'bruce@wayne.com' + Sylius\Component\Core\Model\Product: product_{1..10}: code: 'product__code' enabled: true + Sylius\Component\Core\Model\ProductTranslation: product_translation_en_{1..10}: - translatable: '@product_' - name: '' - description: '' - shortDescription: '' + locale: 'en_US' + name: 'Sample product 1' slug: '' - locale: 'en' + description: 'A test product' + shortDescription: 'Short test' + translatable: '@product_' + Sylius\Component\Core\Model\ProductVariant: product_variant_{1..10}: code: 'product_variant__code' product: '@product_' + Sylius\Component\Product\Model\ProductVariantTranslation: product_variant_translation_en_{1..10}: - translatable: '@product_variant_' name: '' locale: 'en' -BitBag\SyliusWishlistPlugin\Entity\Wishlist: + translatable: '@product_variant_' + +Sylius\WishlistPlugin\Entity\Wishlist: olivier_wishlist: name: 'Olivier Wishlist' shopUser: '@user_oliver' channel: '@channel_us' + olivier_wishlist2: name: 'Olivier Wishlist 2' shopUser: '@user_oliver' channel: '@channel_us' + empty_olivier_wishlist: name: 'Empty Olivier Wishlist' shopUser: '@user_oliver' channel: '@channel_us' + bruce_wishlist: name: 'Bruce Wishlist' shopUser: '@user_bruce' channel: '@channel_us' -BitBag\SyliusWishlistPlugin\Entity\WishlistProduct: + +Sylius\WishlistPlugin\Entity\WishlistProduct: wishlist_product_1: wishlist: '@olivier_wishlist' product: '@product_1' variant: '@product_variant_1' - quantity: '' - + quantity: 1 diff --git a/tests/Functional/FunctionalTestCase.php b/tests/Functional/FunctionalTestCase.php index bb2288c5..45dd0fff 100644 --- a/tests/Functional/FunctionalTestCase.php +++ b/tests/Functional/FunctionalTestCase.php @@ -1,17 +1,19 @@ entityManager = $this->getContainer()->get('doctrine.orm.entity_manager'); - $this->repository = $this->getContainer()->get('bitbag_sylius_wishlist_plugin.repository.wishlist'); + $this->repository = $this->getContainer()->get('sylius_wishlist_plugin.repository.wishlist'); } public function testItFindsOneWishlistByShopUser(): void diff --git a/src/Resources/translations/flashes.en_US.yml b/translations/flashes.en_US.yml similarity index 65% rename from src/Resources/translations/flashes.en_US.yml rename to translations/flashes.en_US.yml index 2d145f36..3b995667 100644 --- a/src/Resources/translations/flashes.en_US.yml +++ b/translations/flashes.en_US.yml @@ -1,3 +1,3 @@ -bitbag_sylius_wishlist_plugin: +sylius_wishlist_plugin: ui: remove_wishlist: Wishlist has been removed. diff --git a/src/Resources/translations/flashes.pl_PL.yml b/translations/flashes.pl_PL.yml similarity index 68% rename from src/Resources/translations/flashes.pl_PL.yml rename to translations/flashes.pl_PL.yml index bcc42477..244b9734 100644 --- a/src/Resources/translations/flashes.pl_PL.yml +++ b/translations/flashes.pl_PL.yml @@ -1,3 +1,3 @@ -bitbag_sylius_wishlist_plugin: +sylius_wishlist_plugin: ui: remove_wishlist: Lista życzeń została usunięta. diff --git a/src/Resources/translations/messages.en.yml b/translations/messages.en.yml similarity index 98% rename from src/Resources/translations/messages.en.yml rename to translations/messages.en.yml index 3c02617f..f2fe2c78 100644 --- a/src/Resources/translations/messages.en.yml +++ b/translations/messages.en.yml @@ -1,10 +1,11 @@ -bitbag_sylius_wishlist_plugin: +sylius_wishlist_plugin: ui: wishlist: Wishlist go_to_wishlist_failure: There was a problem with the redirection. Try again add_to_wishlist: Add to wishlist remove_from_wishlist: Remove from wishlist your_wishlist_is_empty: Your wishlist is empty + your_wishlist: Your wishlist your_wishlists: Your wishlists add_another_wishlist: Add another wishlist added_wishlist_item: Product has been added to your wishlist. diff --git a/src/Resources/translations/messages.fr.yml b/translations/messages.fr.yml similarity index 95% rename from src/Resources/translations/messages.fr.yml rename to translations/messages.fr.yml index 58d26981..e6df27a4 100644 --- a/src/Resources/translations/messages.fr.yml +++ b/translations/messages.fr.yml @@ -1,4 +1,4 @@ -bitbag_sylius_wishlist_plugin: +sylius_wishlist_plugin: ui: wishlist: Favoris add_to_wishlist: Ajouter aux favoris diff --git a/src/Resources/translations/messages.lt.yml b/translations/messages.lt.yml similarity index 95% rename from src/Resources/translations/messages.lt.yml rename to translations/messages.lt.yml index a2a9886d..86455f7d 100644 --- a/src/Resources/translations/messages.lt.yml +++ b/translations/messages.lt.yml @@ -1,4 +1,4 @@ -bitbag_sylius_wishlist_plugin: +sylius_wishlist_plugin: ui: wishlist: Norų sąrašas add_to_wishlist: Įtraukti į norų sąrašą diff --git a/src/Resources/translations/messages.pl.yml b/translations/messages.pl.yml similarity index 98% rename from src/Resources/translations/messages.pl.yml rename to translations/messages.pl.yml index d3f29d04..35597469 100644 --- a/src/Resources/translations/messages.pl.yml +++ b/translations/messages.pl.yml @@ -1,9 +1,10 @@ -bitbag_sylius_wishlist_plugin: +sylius_wishlist_plugin: ui: wishlist: Lista życzeń add_to_wishlist: Dodaj do listy życzeń remove_from_wishlist: Usuń z listy życzeń your_wishlist_is_empty: Twoja lista życzeń jest pusta + your_wishlist: Twoja lista życzeń your_wishlists: Twoje listy życzeń add_another_wishlist: Dodaj kolejną listę życzeń added_wishlist_item: Produkt został dodany do listy życzeń. diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 0d7c4c30..00000000 --- a/webpack.config.js +++ /dev/null @@ -1,41 +0,0 @@ -const path = require('path'); -const Encore = require('@symfony/webpack-encore'); -const pluginName = 'wishlist'; - -const getConfig = (pluginName, type) => { - Encore.reset(); - - Encore - .setOutputPath(`public/build/bitbag/${pluginName}/${type}/`) - .setPublicPath(`/build/bitbag/${pluginName}/${type}/`) - .addEntry(`bitbag-${pluginName}-${type}`, path.resolve(__dirname, `./src/Resources/assets/${type}/entry.js`)) - .disableSingleRuntimeChunk() - .cleanupOutputBeforeBuild() - .enableSourceMaps(!Encore.isProduction()) - .enableVersioning(Encore.isProduction()) - .enableSassLoader(); - - const config = Encore.getWebpackConfig(); - config.name = `bitbag-${pluginName}-${type}`; - - return config; -} - -Encore - .setOutputPath(`src/Resources/public/`) - .setPublicPath(`/public/`) - .addEntry(`bitbag-${pluginName}-shop`, path.resolve(__dirname, `./src/Resources/assets/shop/entry.js`)) - .addEntry(`bitbag-${pluginName}-admin`, path.resolve(__dirname, `./src/Resources/assets/admin/entry.js`)) - .cleanupOutputBeforeBuild() - .disableSingleRuntimeChunk() - .enableSassLoader(); - -const distConfig = Encore.getWebpackConfig(); -distConfig.name = `bitbag-plugin-dist`; - -Encore.reset(); - -const shopConfig = getConfig(pluginName, 'shop') -const adminConfig = getConfig(pluginName, 'admin') - -module.exports = [shopConfig, adminConfig, distConfig];