diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 993c40a..ca6585e 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -14,22 +14,24 @@ on: jobs: tests: - runs-on: ubuntu-22.04 + runs-on: ubuntu-latest name: "Sylius ${{ matrix.sylius }}, PHP ${{ matrix.php }}, Symfony ${{ matrix.symfony }}, MySQL ${{ matrix.mysql }}" strategy: fail-fast: false matrix: - php: ["8.0"] - symfony: ["^5.4", "^6.0"] - sylius: ["~1.11.0", "~1.12.0"] - node: ["^14.17.x"] - mysql: ["5.7", "8.0"] + php: ["8.0", "8.1", "8.2", "8.3"] + symfony: ["^5.4", "^6.4"] + sylius: ["~1.12.0", "~1.13.0"] + node: ["^18.0", "^20.0"] + mysql: ["8.0"] exclude: - - sylius: ~1.11.0 - symfony: ^6.0 + - sylius: "~1.13.0" + php: "8.0" + - symfony: "^6.4" + php: "8.0" env: APP_ENV: test @@ -37,7 +39,7 @@ jobs: steps: - - uses: actions/checkout@v2 + uses: actions/checkout@v3 - name: Setup PHP @@ -50,7 +52,7 @@ jobs: - name: Setup Node - uses: actions/setup-node@v1 + uses: actions/setup-node@v4 with: node-version: "${{ matrix.node }}" @@ -96,7 +98,7 @@ jobs: - name: Cache Composer - uses: actions/cache@v2 + uses: actions/cache@v4 with: path: ${{ steps.composer-cache.outputs.dir }} key: ${{ runner.os }}-php-${{ matrix.php }}-composer-${{ hashFiles('**/composer.json **/composer.lock') }} @@ -123,7 +125,7 @@ jobs: - name: Get Yarn cache directory id: yarn-cache - run: echo "::set-output name=dir::$(yarn cache dir)" + run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT - name: Cache Yarn @@ -147,8 +149,8 @@ jobs: - name: Prepare test application assets run: | + (cd tests/Application && yarn encore dev) (cd tests/Application && bin/console assets:install public -vvv) - (cd tests/Application && yarn prod) - name: Prepare test application cache @@ -186,8 +188,8 @@ jobs: name: Behat logs path: etc/build/ if-no-files-found: ignore - - - + + - name: Failed build Slack notification uses: rtCamp/action-slack-notify@v2 if: ${{ failure() && (github.ref == 'refs/heads/main' || github.ref == 'refs/heads/master') }} diff --git a/README.md b/README.md index 71798dd..69dbbde 100644 --- a/README.md +++ b/README.md @@ -43,9 +43,9 @@ This **open-source plugin was developed to help the Sylius community**. If you h ## Installation ```bash -$ composer require bitbag/blacklist-plugin +composer require bitbag/blacklist-plugin --no-scripts ``` - + Add plugin dependencies to your `config/bundles.php` file: ```php return [ @@ -92,7 +92,56 @@ class Customer extends BaseCustomer implements CustomerInterface } ``` -Or this way if you use annotations: +Define new Entity mapping inside your src/Resources/config/doctrine directory. + +```xml + + + + + + + +``` + +Or edit Customer Entity this way if you use attributes: + +```php +fraudStatus; + } + + public function setFraudStatus(?string $fraudStatus): void + { + $this->fraudStatus = $fraudStatus; + } +} + +``` + +Or edit Customer Entity this way if you use annotations: ```php + public function getFraudStatus(): ?string + { + return $this->fraudStatus; + } - - - - - + public function setFraudStatus(?string $fraudStatus): void + { + $this->fraudStatus = $fraudStatus; + } +} ``` Create also interface, which is implemented by customer entity @@ -189,7 +230,7 @@ sylius_grid: bitbag_sylius_blacklist_plugin.ui.blacklisted: Blacklisted ``` -Override Customer form template (`@SyliusAdminBundle\Customer\_form.html.twig`) by adding lines below +Override Customer form template (`@SyliusAdminBundle\Customer\_form.html.twig` or `@SyliusAdminBundle/Customer/Form/_firstColumn.html.twig`) by adding lines below ```html
@@ -200,34 +241,52 @@ Override Customer form template (`@SyliusAdminBundle\Customer\_form.html.twig`) Update your database -``` -$ bin/console doctrine:migrations:migrate +```bash +bin/console doctrine:migrations:migrate ``` **Note:** If you are running it on production, add the `-e prod` flag to this command. +Update your database schema: + +```bash +doctrine:schema:update --dump-sql +``` + +If the list includes only changes for updating the database by adding 'fraud_status' you can use: + +```bash +doctrine:schema:update -f +``` + +If there are another changes, please make sure they will not destroy your database schema. + +## Functionalities + +All main functionalities of the plugin are described [here.](doc/functionalities.md) + ## Customization ### Available services you can [decorate](https://symfony.com/doc/current/service_container/service_decoration.html) and forms you can [extend](http://symfony.com/doc/current/form/create_form_type_extension.html) Run the below command to see what Symfony services are shared with this plugin: ```bash -$ bin/console debug:container | grep bitbag_sylius_blacklist_plugin +bin/console debug:container | grep bitbag_sylius_blacklist_plugin ``` ## Testing ```bash -$ composer install -$ cd tests/Application -$ yarn install -$ yarn build -$ bin/console assets:install public -e test -$ bin/console doctrine:schema:create -e test -$ bin/console server:run 127.0.0.1:8080 -d public -e test -$ open http://localhost:8080 -$ cd ../.. -$ vendor/bin/behat -$ vendor/bin/phpspec run +composer install +cd tests/Application +yarn install +yarn build +bin/console assets:install public -e test +bin/console doctrine:schema:create -e test +bin/console server:run 127.0.0.1:8080 -d public -e test +open http://localhost:8080 +cd ../.. +vendor/bin/behat +vendor/bin/phpspec run ``` # About us diff --git a/composer.json b/composer.json index 7ecb30c..1076bc9 100644 --- a/composer.json +++ b/composer.json @@ -5,14 +5,15 @@ "description": "Blacklist plugin for Sylius.", "license": "MIT", "require": { - "php": "^8.0", - "sylius/sylius": "~1.11.0 || ~1.12.0" + "php": "^8.0 || ^8.1 || ^8.2 || ^8.3", + "sylius/sylius": "~1.12.0 || ~1.13.0", + "doctrine/annotations": "^2.0.0" }, "require-dev": { - "behat/behat": "^3.7", + "behat/behat": "^3.7.0", "behat/mink": "^1.8", - "behat/mink-selenium2-driver": "^1.4", - "bitbag/coding-standard": "^1.0.1", + "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", "friends-of-behat/mink": "^1.8", @@ -26,19 +27,19 @@ "lchrusciel/api-test-case": "^4.1||^5.0", "phpspec/phpspec": "^7.0", "phpstan/extension-installer": "^1.0", - "phpstan/phpstan": "0.12.82", - "phpstan/phpstan-doctrine": "0.12.33", - "phpstan/phpstan-strict-rules": "^0.12.0", - "phpstan/phpstan-webmozart-assert": "0.12.12", + "phpstan/phpstan": "^1.4", + "phpstan/phpstan-doctrine": "^1.0", + "phpstan/phpstan-strict-rules": "^1.0", + "phpstan/phpstan-webmozart-assert": "^1.0", "phpunit/phpunit": "^9.5", "polishsymfonycommunity/symfony-mocker-container": "^1.0", - "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", - "symfony/webpack-encore-bundle": "^1.14", - "vimeo/psalm": "4.12" + "symfony/browser-kit": "^5.4 || 6.4", + "symfony/debug-bundle": "^5.4 || ^6.4", + "symfony/dotenv": "^5.4 || ^6.4", + "symfony/intl": "^5.4 || ^6.4", + "symfony/web-profiler-bundle": "^5.4 || ^6.4", + "vimeo/psalm": "^4.7 || ^5.0", + "symfony/webpack-encore-bundle": "^1.17" }, "autoload": { "psr-4": { diff --git a/doc/functionalities.md b/doc/functionalities.md new file mode 100644 index 0000000..59143be --- /dev/null +++ b/doc/functionalities.md @@ -0,0 +1,68 @@ +# Functionalities + +--- + +# About Blacklist plugin + +--- +A plugin designed to counteract suspicious behavior by blocking purchases using automated rules or manual customer behavior analysis. + +Customers are divided into three types: + +- blacklisted → blocked, cannot make purchases +- whitelisted → trusted, not checked by the plugin during purchases +- neutral → regular customer who can make purchases and is checked by the plugin with every order + +The customer's status can be changed manually in the customer edit panel(admin panel) or automatically using plugin functionalities. + +![Origin](images/change-status-manually.png) + +# Manual blacklisting rule + +--- +Blocking users can be done by creating rules manually: + +Manual blacklisting rules allow blocking orders where selected data repeats a certain number of times, such as shipping details. + +![Origin](images/manual-blacklisting-rule.png) + +If someone places 3 orders to the same address and tries to place a 4th, +the system will block it because the same address details have repeated 4 times. +(If multiple attributes are selected, ALL of them must repeat for the order to be counted as a strike). +Additionally, the user MUST already be on the Fraud Suspicion list. + +These rules can be applied to specific groups of customers, such as only for guest users. + +![Origin](images/groups-of-customers.png) + +If an order meets the given criteria, it will not be processed, and the user will be blocked. + +# Automatic blacklisting rule + +--- + +Blocking users can also be done using automatic rules (auto-blacklisting-config): + +- If a user places x orders within a certain period, they will be blocked. +- If a user makes x failed payment attempts within a certain period, they will be blocked. + +Additionally, in automatic rules, we can specify: + +- After the time limit specified in the rule expires, the user will be unblocked. +- The number of rule uses after which the user/order will be added to the list of suspected frauds. + +![Origin](images/change-status-auto.png) + +# Fraud suspicion list + +--- + +![Origin](images/fraud-suspicions-list.png) + +It is a list of orders that have been flagged as suspicious by automatic rules +(if the corresponding option was selected in the automatic rule) or manually added by the administrator. + +![Origin](images/manual-adding-fraud.png) + +Based on this list of suspicious frauds, we can decide, +that a particular user appears too frequently within a short period and should have their account blocked. diff --git a/doc/images/change-status-auto.png b/doc/images/change-status-auto.png new file mode 100644 index 0000000..8321307 Binary files /dev/null and b/doc/images/change-status-auto.png differ diff --git a/doc/images/change-status-manually.png b/doc/images/change-status-manually.png new file mode 100644 index 0000000..2af3c59 Binary files /dev/null and b/doc/images/change-status-manually.png differ diff --git a/doc/images/fraud-suspicions-list.png b/doc/images/fraud-suspicions-list.png new file mode 100644 index 0000000..8842f89 Binary files /dev/null and b/doc/images/fraud-suspicions-list.png differ diff --git a/doc/images/groups-of-customers.png b/doc/images/groups-of-customers.png new file mode 100644 index 0000000..b1b7414 Binary files /dev/null and b/doc/images/groups-of-customers.png differ diff --git a/doc/images/installation-error.png b/doc/images/installation-error.png new file mode 100644 index 0000000..293ffda Binary files /dev/null and b/doc/images/installation-error.png differ diff --git a/doc/images/manual-adding-fraud.png b/doc/images/manual-adding-fraud.png new file mode 100644 index 0000000..f62bf35 Binary files /dev/null and b/doc/images/manual-adding-fraud.png differ diff --git a/doc/images/manual-blacklisting-rule.png b/doc/images/manual-blacklisting-rule.png new file mode 100644 index 0000000..184198b Binary files /dev/null and b/doc/images/manual-blacklisting-rule.png differ diff --git a/ecs.php b/ecs.php index 34cb6c5..21a4b41 100644 --- a/ecs.php +++ b/ecs.php @@ -1,14 +1,10 @@ import('vendor/bitbag/coding-standard/ecs.php'); +return static function (ECSConfig $config): void { + putenv('ALLOW_BITBAG_OS_HEADER=1'); - $parameters = $containerConfigurator->parameters(); - $parameters->set(Option::PATHS, [ - __DIR__ . '/src', - __DIR__ . '/tests', - ]); + $config->import('vendor/bitbag/coding-standard/ecs.php'); + $config->paths(['src', 'tests']); }; diff --git a/src/BitBagSyliusBlacklistPlugin.php b/src/BitBagSyliusBlacklistPlugin.php index ccb6575..8d0efd4 100644 --- a/src/BitBagSyliusBlacklistPlugin.php +++ b/src/BitBagSyliusBlacklistPlugin.php @@ -1,10 +1,11 @@ modify('- ' . $blacklistingRule->getSettings()['date_modifier']); diff --git a/src/Checker/AutomaticBlacklistingRule/PaymentFailuresAutomaticBlacklistingRuleChecker.php b/src/Checker/AutomaticBlacklistingRule/PaymentFailuresAutomaticBlacklistingRuleChecker.php index 7217465..71ebebf 100644 --- a/src/Checker/AutomaticBlacklistingRule/PaymentFailuresAutomaticBlacklistingRuleChecker.php +++ b/src/Checker/AutomaticBlacklistingRule/PaymentFailuresAutomaticBlacklistingRuleChecker.php @@ -1,10 +1,11 @@ modify('- ' . $blacklistingRule->getSettings()['date_modifier']); diff --git a/src/Checker/BlacklistingRule/Address/CityBlacklistingRuleChecker.php b/src/Checker/BlacklistingRule/Address/CityBlacklistingRuleChecker.php index 6831b0c..578db90 100644 --- a/src/Checker/BlacklistingRule/Address/CityBlacklistingRuleChecker.php +++ b/src/Checker/BlacklistingRule/Address/CityBlacklistingRuleChecker.php @@ -1,10 +1,11 @@ fraudSuspicionRepository = $fraudSuspicionRepository; $this->customerStateResolver = $customerStateResolver; @@ -34,7 +35,7 @@ public function __construct( public function canAddFraudSuspicion( OrderInterface $order, - AutomaticBlacklistingConfigurationInterface $automaticBlacklistingConfiguration + AutomaticBlacklistingConfigurationInterface $automaticBlacklistingConfiguration, ): bool { if (null !== $this->fraudSuspicionRepository->findOneBy(['order' => $order])) { return false; @@ -47,7 +48,7 @@ public function canAddFraudSuspicion( $lastFraudSuspicionsOfCustomer = $this->fraudSuspicionRepository->countByCustomerAndCommentAndDate( $customer, FraudSuspicionInterface::AUTO_GENERATED_STATUS, - $date + $date, ); if ((int) $lastFraudSuspicionsOfCustomer >= $automaticBlacklistingConfiguration->getPermittedFraudSuspicionsNumber()) { diff --git a/src/Checker/FraudSuspicion/FraudSuspicionActionEligibilityCheckerInterface.php b/src/Checker/FraudSuspicion/FraudSuspicionActionEligibilityCheckerInterface.php index 2708098..2c95031 100644 --- a/src/Checker/FraudSuspicion/FraudSuspicionActionEligibilityCheckerInterface.php +++ b/src/Checker/FraudSuspicion/FraudSuspicionActionEligibilityCheckerInterface.php @@ -1,10 +1,11 @@ */ protected $channels; /** * @var Collection|AutomaticBlacklistingRuleInterface[] - * * @psalm-var Collection */ protected $rules; diff --git a/src/Entity/FraudPrevention/AutomaticBlacklistingConfigurationInterface.php b/src/Entity/FraudPrevention/AutomaticBlacklistingConfigurationInterface.php index 3cccb08..6db0c36 100644 --- a/src/Entity/FraudPrevention/AutomaticBlacklistingConfigurationInterface.php +++ b/src/Entity/FraudPrevention/AutomaticBlacklistingConfigurationInterface.php @@ -1,10 +1,11 @@ */ protected $channels; /** * @var Collection|CustomerGroupInterface[] - * * @psalm-var Collection */ protected $customerGroups; diff --git a/src/Entity/FraudPrevention/BlacklistingRuleInterface.php b/src/Entity/FraudPrevention/BlacklistingRuleInterface.php index d7ef378..5c1e41a 100644 --- a/src/Entity/FraudPrevention/BlacklistingRuleInterface.php +++ b/src/Entity/FraudPrevention/BlacklistingRuleInterface.php @@ -1,10 +1,11 @@ suspiciousOrderResolver = $suspiciousOrderResolver; $this->customerStateResolver = $customerStateResolver; diff --git a/src/Exception/WrongAddressTypeException.php b/src/Exception/WrongAddressTypeException.php index 88d4b9b..41b4297 100644 --- a/src/Exception/WrongAddressTypeException.php +++ b/src/Exception/WrongAddressTypeException.php @@ -1,10 +1,11 @@ attributeChoices = $attributeChoices; diff --git a/src/Form/Type/AutomaticBlacklistingRuleChoiceType.php b/src/Form/Type/AutomaticBlacklistingRuleChoiceType.php index 473294c..b81ab21 100644 --- a/src/Form/Type/AutomaticBlacklistingRuleChoiceType.php +++ b/src/Form/Type/AutomaticBlacklistingRuleChoiceType.php @@ -1,10 +1,11 @@ serviceRegistry = $serviceRegistry; $this->orderRepository = $orderRepository; @@ -84,7 +85,7 @@ public function process(OrderInterface $order): bool private function shouldOrderBeBlocked( AutomaticBlacklistingConfigurationInterface $automaticBlacklistingConfiguration, - OrderInterface $order + OrderInterface $order, ): bool { $automaticBlacklistingRules = $automaticBlacklistingConfiguration->getRules(); diff --git a/src/Processor/AutomaticBlacklistingRulesProcessorInterface.php b/src/Processor/AutomaticBlacklistingRulesProcessorInterface.php index 2a42894..9bcc7e2 100644 --- a/src/Processor/AutomaticBlacklistingRulesProcessorInterface.php +++ b/src/Processor/AutomaticBlacklistingRulesProcessorInterface.php @@ -1,10 +1,11 @@ createQueryBuilder('o') ->select(['COUNT(o.id)']) diff --git a/src/Repository/FraudSuspicionRepositoryInterface.php b/src/Repository/FraudSuspicionRepositoryInterface.php index aa296fe..dffdefb 100644 --- a/src/Repository/FraudSuspicionRepositoryInterface.php +++ b/src/Repository/FraudSuspicionRepositoryInterface.php @@ -1,10 +1,11 @@ serviceRegistry = $serviceRegistry; $this->fraudSuspicionRepository = $fraudSuspicionRepository; @@ -90,7 +91,7 @@ public function resolve(FraudSuspicionCommonModelInterface $fraudSuspicionCommon private function checkIfCustomerIsBlacklisted( QueryBuilder $builder, FraudSuspicionCommonModelInterface $fraudSuspicionCommonModel, - string $attribute + string $attribute, ): void { $checker = $this->serviceRegistry->get($attribute); diff --git a/src/Resolver/SuspiciousOrderResolverInterface.php b/src/Resolver/SuspiciousOrderResolverInterface.php index 995bb8a..ae25d3a 100644 --- a/src/Resolver/SuspiciousOrderResolverInterface.php +++ b/src/Resolver/SuspiciousOrderResolverInterface.php @@ -1,10 +1,11 @@ suspiciousOrderResolver = $suspiciousOrderResolver; $this->automaticBlacklistingRulesProcessor = $automaticBlacklistingRulesProcessor; diff --git a/tests/Application/.env b/tests/Application/.env index 0e90072..af06317 100644 --- a/tests/Application/.env +++ b/tests/Application/.env @@ -12,7 +12,7 @@ APP_SECRET=EDITME # Format described at http://docs.doctrine-project.org/projects/doctrine-dbal/en/latest/reference/configuration.html#connecting-using-a-url # For a sqlite database, use: "sqlite:///%kernel.project_dir%/var/data.db" # Set "serverVersion" to your server version to avoid edge-case exceptions and extra database calls -DATABASE_URL=mysql://root@127.0.0.1/bitbag_sylius_blacklist_plugin_%kernel.environment% +DATABASE_URL=mysql://root@127.0.0.1/bitbag_sylius_blacklist_plugin_%kernel.environment%?serverVersion=8.0 ###< doctrine/doctrine-bundle ### ###> lexik/jwt-authentication-bundle ### @@ -21,17 +21,14 @@ JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem JWT_PASSPHRASE=acme_plugin_development ###< lexik/jwt-authentication-bundle ### -###> symfony/swiftmailer-bundle ### -# For Gmail as a transport, use: "gmail://username:password@localhost" -# For a generic SMTP server, use: "smtp://localhost:25?encryption=&auth_mode=" -# Delivery is disabled by default via "null://localhost" -MAILER_URL=smtp://localhost -###< symfony/swiftmailer-bundle ### +###> symfony/mailer ### +MAILER_DSN=null://null +###< symfony/mailer ### ###> symfony/messenger ### -# Choose one of the transports below -# MESSENGER_TRANSPORT_DSN=amqp://guest:guest@localhost:5672/%2f/messages -# MESSENGER_TRANSPORT_DSN=doctrine://default -# MESSENGER_TRANSPORT_DSN=redis://localhost:6379/messages MESSENGER_TRANSPORT_DSN=sync:// +SYLIUS_MESSENGER_TRANSPORT_MAIN_DSN=doctrine://default +SYLIUS_MESSENGER_TRANSPORT_MAIN_FAILED_DSN=doctrine://default?queue_name=main_failed +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_DSN=doctrine://default?queue_name=catalog_promotion_removal +SYLIUS_MESSENGER_TRANSPORT_CATALOG_PROMOTION_REMOVAL_FAILED_DSN=doctrine://default?queue_name=catalog_promotion_removal_failed ###< symfony/messenger ### diff --git a/tests/Application/config/bootstrap.php b/tests/Application/config/bootstrap.php index ae509ac..e0439c1 100644 --- a/tests/Application/config/bootstrap.php +++ b/tests/Application/config/bootstrap.php @@ -15,7 +15,7 @@ throw new RuntimeException('Please run "composer require symfony/dotenv" to load the ".env" files configuring the application.'); } else { // load all the .env files - (new Dotenv())->loadEnv(dirname(__DIR__) . '/.env'); + (new Dotenv())->usePutenv()->loadEnv(dirname(__DIR__) . '/.env'); } $_SERVER['APP_ENV'] = $_ENV['APP_ENV'] = ($_SERVER['APP_ENV'] ?? $_ENV['APP_ENV'] ?? null) ?: 'dev'; diff --git a/tests/Application/config/bundles.php b/tests/Application/config/bundles.php index 4d3e208..77b90df 100644 --- a/tests/Application/config/bundles.php +++ b/tests/Application/config/bundles.php @@ -1,10 +1,11 @@ ['all' => true], @@ -62,4 +63,8 @@ Nelmio\Alice\Bridge\Symfony\NelmioAliceBundle::class => ['dev' => true, 'test' => true, 'test_cached' => true], Fidry\AliceDataFixtures\Bridge\Symfony\FidryAliceDataFixturesBundle::class => ['dev' => true, 'test' => true, 'test_cached' => 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], ]; diff --git a/tests/Application/config/sylius/1.12/packages/mailer.yaml b/tests/Application/config/packages/dev/mailer.yaml similarity index 100% rename from tests/Application/config/sylius/1.12/packages/mailer.yaml rename to tests/Application/config/packages/dev/mailer.yaml diff --git a/tests/Application/config/packages/mailer.yaml b/tests/Application/config/packages/mailer.yaml new file mode 100644 index 0000000..0a0697c --- /dev/null +++ b/tests/Application/config/packages/mailer.yaml @@ -0,0 +1,3 @@ +framework: + mailer: + dsn: '%env(MAILER_DSN)%' diff --git a/tests/Application/config/sylius/1.12/packages/test/mailer.yaml b/tests/Application/config/packages/test/mailer.yaml similarity index 100% rename from tests/Application/config/sylius/1.12/packages/test/mailer.yaml rename to tests/Application/config/packages/test/mailer.yaml diff --git a/tests/Application/config/sylius/1.11/packages/test/security.yaml b/tests/Application/config/packages/test/security.yaml similarity index 59% rename from tests/Application/config/sylius/1.11/packages/test/security.yaml rename to tests/Application/config/packages/test/security.yaml index e6c3df6..a6f2ff7 100644 --- a/tests/Application/config/sylius/1.11/packages/test/security.yaml +++ b/tests/Application/config/packages/test/security.yaml @@ -1,3 +1,3 @@ security: - encoders: + password_hashers: sha512: sha512 diff --git a/tests/Application/config/sylius/1.11/bundles.php b/tests/Application/config/sylius/1.11/bundles.php deleted file mode 100644 index 7579960..0000000 --- a/tests/Application/config/sylius/1.11/bundles.php +++ /dev/null @@ -1,15 +0,0 @@ - ['all' => true], - Symfony\Bundle\SwiftmailerBundle\SwiftmailerBundle::class => ['all' => true], - SyliusLabs\Polyfill\Symfony\Security\Bundle\SyliusLabsPolyfillSymfonySecurityBundle::class => ['all' => true], - Sylius\Calendar\SyliusCalendarBundle::class => ['all' => true], -]; diff --git a/tests/Application/config/sylius/1.11/packages/dev/jms_serializer.yaml b/tests/Application/config/sylius/1.11/packages/dev/jms_serializer.yaml deleted file mode 100644 index 2f32a9b..0000000 --- a/tests/Application/config/sylius/1.11/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/sylius/1.11/packages/dev/swiftmailer.yaml b/tests/Application/config/sylius/1.11/packages/dev/swiftmailer.yaml deleted file mode 100644 index 30eca8a..0000000 --- a/tests/Application/config/sylius/1.11/packages/dev/swiftmailer.yaml +++ /dev/null @@ -1,2 +0,0 @@ -swiftmailer: - disable_delivery: true diff --git a/tests/Application/config/sylius/1.11/packages/jms_serializer.yaml b/tests/Application/config/sylius/1.11/packages/jms_serializer.yaml deleted file mode 100644 index ed7bc61..0000000 --- a/tests/Application/config/sylius/1.11/packages/jms_serializer.yaml +++ /dev/null @@ -1,4 +0,0 @@ -jms_serializer: - visitors: - xml_serialization: - format_output: '%kernel.debug%' diff --git a/tests/Application/config/sylius/1.11/packages/prod/jms_serializer.yaml b/tests/Application/config/sylius/1.11/packages/prod/jms_serializer.yaml deleted file mode 100644 index c288182..0000000 --- a/tests/Application/config/sylius/1.11/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/sylius/1.11/packages/swiftmailer.yaml b/tests/Application/config/sylius/1.11/packages/swiftmailer.yaml deleted file mode 100644 index 73bba27..0000000 --- a/tests/Application/config/sylius/1.11/packages/swiftmailer.yaml +++ /dev/null @@ -1,2 +0,0 @@ -swiftmailer: - url: '%env(MAILER_URL)%' diff --git a/tests/Application/config/sylius/1.11/packages/test/swiftmailer.yaml b/tests/Application/config/sylius/1.11/packages/test/swiftmailer.yaml deleted file mode 100644 index aaac242..0000000 --- a/tests/Application/config/sylius/1.11/packages/test/swiftmailer.yaml +++ /dev/null @@ -1,6 +0,0 @@ -swiftmailer: - disable_delivery: true - logging: true - spool: - type: file - path: "%kernel.cache_dir%/spool" diff --git a/tests/Application/config/sylius/1.11/packages/test_cached/security.yaml b/tests/Application/config/sylius/1.11/packages/test_cached/security.yaml deleted file mode 100644 index e6c3df6..0000000 --- a/tests/Application/config/sylius/1.11/packages/test_cached/security.yaml +++ /dev/null @@ -1,3 +0,0 @@ -security: - encoders: - sha512: sha512 diff --git a/tests/Application/config/sylius/1.11/packages/test_cached/swiftmailer.yaml b/tests/Application/config/sylius/1.11/packages/test_cached/swiftmailer.yaml deleted file mode 100644 index aaac242..0000000 --- a/tests/Application/config/sylius/1.11/packages/test_cached/swiftmailer.yaml +++ /dev/null @@ -1,6 +0,0 @@ -swiftmailer: - disable_delivery: true - logging: true - spool: - type: file - path: "%kernel.cache_dir%/spool" diff --git a/tests/Application/config/sylius/1.12/bundles.php b/tests/Application/config/sylius/1.12/bundles.php deleted file mode 100644 index c1a8b60..0000000 --- a/tests/Application/config/sylius/1.12/bundles.php +++ /dev/null @@ -1,16 +0,0 @@ - ['all' => true], - Sylius\Calendar\SyliusCalendarBundle::class => ['all' => true], - BabDev\PagerfantaBundle\BabDevPagerfantaBundle::class => ['all' => true], - SyliusLabs\Polyfill\Symfony\Security\Bundle\SyliusLabsPolyfillSymfonySecurityBundle::class => ['all' => true], -]; diff --git a/tests/Application/config/sylius/1.12/packages/security.yaml b/tests/Application/config/sylius/1.12/packages/security.yaml index 4ed342f..842b093 100644 --- a/tests/Application/config/sylius/1.12/packages/security.yaml +++ b/tests/Application/config/sylius/1.12/packages/security.yaml @@ -1,124 +1,124 @@ security: - enable_authenticator_manager: true - providers: - sylius_admin_user_provider: - id: sylius.admin_user_provider.email_or_name_based - sylius_api_admin_user_provider: - id: sylius.admin_user_provider.email_or_name_based - sylius_shop_user_provider: - id: sylius.shop_user_provider.email_or_name_based - sylius_api_shop_user_provider: - id: sylius.shop_user_provider.email_or_name_based + enable_authenticator_manager: true + providers: + sylius_admin_user_provider: + id: sylius.admin_user_provider.email_or_name_based + sylius_api_admin_user_provider: + id: sylius.admin_user_provider.email_or_name_based + sylius_shop_user_provider: + id: sylius.shop_user_provider.email_or_name_based + sylius_api_shop_user_provider: + id: sylius.shop_user_provider.email_or_name_based - password_hashers: - Sylius\Component\User\Model\UserInterface: argon2i - firewalls: - admin: - switch_user: true - context: admin - pattern: "%sylius.security.admin_regex%" - provider: sylius_admin_user_provider - form_login: - provider: sylius_admin_user_provider - login_path: sylius_admin_login - check_path: sylius_admin_login_check - failure_path: sylius_admin_login - default_target_path: sylius_admin_dashboard - use_forward: false - use_referer: true - enable_csrf: true - csrf_parameter: _csrf_admin_security_token - csrf_token_id: admin_authenticate - remember_me: - secret: "%env(APP_SECRET)%" - path: "/%sylius_admin.path_name%" - name: APP_ADMIN_REMEMBER_ME - lifetime: 31536000 - remember_me_parameter: _remember_me - logout: - path: sylius_admin_logout - target: sylius_admin_login + password_hashers: + Sylius\Component\User\Model\UserInterface: argon2i + firewalls: + admin: + switch_user: true + context: admin + pattern: "%sylius.security.admin_regex%" + provider: sylius_admin_user_provider + form_login: + provider: sylius_admin_user_provider + login_path: sylius_admin_login + check_path: sylius_admin_login_check + failure_path: sylius_admin_login + default_target_path: sylius_admin_dashboard + use_forward: false + use_referer: true + enable_csrf: true + csrf_parameter: _csrf_admin_security_token + csrf_token_id: admin_authenticate + remember_me: + secret: "%env(APP_SECRET)%" + path: "/%sylius_admin.path_name%" + name: APP_ADMIN_REMEMBER_ME + lifetime: 31536000 + remember_me_parameter: _remember_me + logout: + path: sylius_admin_logout + target: sylius_admin_login - new_api_admin_user: - pattern: "%sylius.security.new_api_admin_regex%/.*" - provider: sylius_api_admin_user_provider - stateless: true - entry_point: jwt - json_login: - check_path: "%sylius.security.new_api_admin_route%/authentication-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_admin_user: + pattern: "%sylius.security.new_api_admin_regex%/.*" + provider: sylius_api_admin_user_provider + stateless: true + entry_point: jwt + json_login: + check_path: "%sylius.security.new_api_admin_route%/authentication-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%/.*" - provider: sylius_api_shop_user_provider - stateless: true - entry_point: jwt - json_login: - check_path: "%sylius.security.new_api_shop_route%/authentication-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%/.*" + provider: sylius_api_shop_user_provider + stateless: true + entry_point: jwt + json_login: + check_path: "%sylius.security.new_api_shop_route%/authentication-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 - shop: - switch_user: { role: ROLE_ALLOWED_TO_SWITCH } - context: shop - pattern: "%sylius.security.shop_regex%" - provider: sylius_shop_user_provider - form_login: - success_handler: sylius.authentication.success_handler - failure_handler: sylius.authentication.failure_handler - provider: sylius_shop_user_provider - login_path: sylius_shop_login - check_path: sylius_shop_login_check - failure_path: sylius_shop_login - default_target_path: sylius_shop_homepage - use_forward: false - use_referer: true - enable_csrf: true - csrf_parameter: _csrf_shop_security_token - csrf_token_id: shop_authenticate - remember_me: - secret: "%env(APP_SECRET)%" - name: APP_SHOP_REMEMBER_ME - lifetime: 31536000 - remember_me_parameter: _remember_me - logout: - path: sylius_shop_logout - target: sylius_shop_homepage - invalidate_session: false + shop: + switch_user: { role: ROLE_ALLOWED_TO_SWITCH } + context: shop + pattern: "%sylius.security.shop_regex%" + provider: sylius_shop_user_provider + form_login: + success_handler: sylius.authentication.success_handler + failure_handler: sylius.authentication.failure_handler + provider: sylius_shop_user_provider + login_path: sylius_shop_login + check_path: sylius_shop_login_check + failure_path: sylius_shop_login + default_target_path: sylius_shop_homepage + use_forward: false + use_referer: true + enable_csrf: true + csrf_parameter: _csrf_shop_security_token + csrf_token_id: shop_authenticate + remember_me: + secret: "%env(APP_SECRET)%" + name: APP_SHOP_REMEMBER_ME + lifetime: 31536000 + remember_me_parameter: _remember_me + logout: + path: sylius_shop_logout + target: sylius_shop_homepage + invalidate_session: false - dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ - security: false + dev: + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false - image_resolver: - pattern: ^/media/cache/resolve - security: false + image_resolver: + pattern: ^/media/cache/resolve + 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 } + 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%/login", role: PUBLIC_ACCESS } - - { path: "%sylius.security.shop_regex%/login", role: PUBLIC_ACCESS } + - { path: "%sylius.security.admin_regex%/login", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/login", role: PUBLIC_ACCESS } - - { path: "%sylius.security.shop_regex%/register", role: PUBLIC_ACCESS } - - { path: "%sylius.security.shop_regex%/verify", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/register", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/verify", role: PUBLIC_ACCESS } - - { path: "%sylius.security.admin_regex%", role: ROLE_ADMINISTRATION_ACCESS } - - { path: "%sylius.security.shop_regex%/account", role: ROLE_USER } + - { 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%/reset-password-requests", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS } - - { path: "%sylius.security.new_api_admin_route%/authentication-token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_user_account_regex%/.*", role: ROLE_USER } - - { path: "%sylius.security.new_api_shop_route%/authentication-token", role: PUBLIC_ACCESS } - - { path: "%sylius.security.new_api_shop_regex%/.*", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_admin_route%/reset-password-requests", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS } + - { path: "%sylius.security.new_api_admin_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_user_account_regex%/.*", role: ROLE_USER } + - { path: "%sylius.security.new_api_shop_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_shop_regex%/.*", role: PUBLIC_ACCESS } diff --git a/tests/Application/config/sylius/1.13/bundles.php b/tests/Application/config/sylius/1.13/bundles.php new file mode 100644 index 0000000..e615f85 --- /dev/null +++ b/tests/Application/config/sylius/1.13/bundles.php @@ -0,0 +1,14 @@ + ['all' => true], +]; diff --git a/tests/Application/config/sylius/1.13/packages/_sylius.yaml b/tests/Application/config/sylius/1.13/packages/_sylius.yaml new file mode 100644 index 0000000..baa3d7e --- /dev/null +++ b/tests/Application/config/sylius/1.13/packages/_sylius.yaml @@ -0,0 +1,10 @@ +parameters: + test_default_state_machine_adapter: 'symfony_workflow' + test_sylius_state_machine_adapter: '%env(string:default:test_default_state_machine_adapter:TEST_SYLIUS_STATE_MACHINE_ADAPTER)%' + +sylius_state_machine_abstraction: + graphs_to_adapters_mapping: + sylius_refund_refund_payment: '%test_sylius_state_machine_adapter%' + +sylius_api: + enabled: true diff --git a/tests/Application/config/sylius/1.11/packages/security.yaml b/tests/Application/config/sylius/1.13/packages/security.yaml similarity index 62% rename from tests/Application/config/sylius/1.11/packages/security.yaml rename to tests/Application/config/sylius/1.13/packages/security.yaml index ef43c09..4ed342f 100644 --- a/tests/Application/config/sylius/1.11/packages/security.yaml +++ b/tests/Application/config/sylius/1.13/packages/security.yaml @@ -1,11 +1,5 @@ -parameters: - sylius.security.admin_regex: "^/admin" - sylius.security.shop_regex: "^/(?!admin|new-api|api/.*|api$|media/.*)[^/]++" - sylius.security.new_api_route: "/new-api" - sylius.security.new_api_regex: "^%sylius.security.new_api_route%" - security: - always_authenticate_before_granting: true + enable_authenticator_manager: true providers: sylius_admin_user_provider: id: sylius.admin_user_provider.email_or_name_based @@ -15,11 +9,8 @@ security: id: sylius.shop_user_provider.email_or_name_based sylius_api_shop_user_provider: id: sylius.shop_user_provider.email_or_name_based - sylius_api_chain_provider: - chain: - providers: [sylius_api_shop_user_provider, sylius_api_admin_user_provider] - encoders: + password_hashers: Sylius\Component\User\Model\UserInterface: argon2i firewalls: admin: @@ -35,58 +26,44 @@ security: default_target_path: sylius_admin_dashboard use_forward: false use_referer: true - csrf_token_generator: security.csrf.token_manager + enable_csrf: true csrf_parameter: _csrf_admin_security_token csrf_token_id: admin_authenticate remember_me: secret: "%env(APP_SECRET)%" - path: /admin + path: "/%sylius_admin.path_name%" name: APP_ADMIN_REMEMBER_ME lifetime: 31536000 remember_me_parameter: _remember_me logout: path: sylius_admin_logout target: sylius_admin_login - anonymous: true new_api_admin_user: - pattern: "%sylius.security.new_api_route%/admin-user-authentication-token" - provider: sylius_admin_user_provider + pattern: "%sylius.security.new_api_admin_regex%/.*" + provider: sylius_api_admin_user_provider stateless: true - anonymous: true + entry_point: jwt json_login: - check_path: "%sylius.security.new_api_route%/admin-user-authentication-token" + check_path: "%sylius.security.new_api_admin_route%/authentication-token" username_path: email password_path: password success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure - guard: - authenticators: - - lexik_jwt_authentication.jwt_token_authenticator + jwt: true new_api_shop_user: - pattern: "%sylius.security.new_api_route%/shop-user-authentication-token" - provider: sylius_shop_user_provider + pattern: "%sylius.security.new_api_shop_regex%/.*" + provider: sylius_api_shop_user_provider stateless: true - anonymous: true + entry_point: jwt json_login: - check_path: "%sylius.security.new_api_route%/shop-user-authentication-token" + check_path: "%sylius.security.new_api_shop_route%/authentication-token" username_path: email password_path: password success_handler: lexik_jwt_authentication.handler.authentication_success failure_handler: lexik_jwt_authentication.handler.authentication_failure - guard: - authenticators: - - lexik_jwt_authentication.jwt_token_authenticator - - new_api: - pattern: "%sylius.security.new_api_regex%/*" - provider: sylius_api_chain_provider - stateless: true - anonymous: lazy - guard: - authenticators: - - lexik_jwt_authentication.jwt_token_authenticator + jwt: true shop: switch_user: { role: ROLE_ALLOWED_TO_SWITCH } @@ -103,7 +80,7 @@ security: default_target_path: sylius_shop_homepage use_forward: false use_referer: true - csrf_token_generator: security.csrf.token_manager + enable_csrf: true csrf_parameter: _csrf_shop_security_token csrf_token_id: shop_authenticate remember_me: @@ -113,26 +90,35 @@ security: remember_me_parameter: _remember_me logout: path: sylius_shop_logout - target: sylius_shop_login + target: sylius_shop_homepage invalidate_session: false - success_handler: sylius.handler.shop_user_logout - anonymous: true dev: - pattern: ^/(_(profiler|wdt)|css|images|js)/ + pattern: ^/(_(profiler|wdt)|css|images|js)/ + security: false + + image_resolver: + pattern: ^/media/cache/resolve security: false access_control: - - { path: "%sylius.security.admin_regex%/_partial", role: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } + - { 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: IS_AUTHENTICATED_ANONYMOUSLY, ips: [127.0.0.1, ::1] } + - { 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%/login", role: IS_AUTHENTICATED_ANONYMOUSLY } - - { path: "%sylius.security.shop_regex%/login", role: IS_AUTHENTICATED_ANONYMOUSLY } + - { path: "%sylius.security.admin_regex%/login", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/login", role: PUBLIC_ACCESS } - - { path: "%sylius.security.shop_regex%/register", role: IS_AUTHENTICATED_ANONYMOUSLY } - - { path: "%sylius.security.shop_regex%/verify", role: IS_AUTHENTICATED_ANONYMOUSLY } + - { path: "%sylius.security.shop_regex%/register", role: PUBLIC_ACCESS } + - { path: "%sylius.security.shop_regex%/verify", role: PUBLIC_ACCESS } - { 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%/reset-password-requests", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_admin_regex%/.*", role: ROLE_API_ACCESS } + - { path: "%sylius.security.new_api_admin_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_user_account_regex%/.*", role: ROLE_USER } + - { path: "%sylius.security.new_api_shop_route%/authentication-token", role: PUBLIC_ACCESS } + - { path: "%sylius.security.new_api_shop_regex%/.*", role: PUBLIC_ACCESS } diff --git a/tests/Application/config/symfony/4.4/packages/framework.yaml b/tests/Application/config/symfony/4.4/packages/framework.yaml deleted file mode 100644 index 62f82d3..0000000 --- a/tests/Application/config/symfony/4.4/packages/framework.yaml +++ /dev/null @@ -1,2 +0,0 @@ -framework: - templating: { engines: ["twig"] } diff --git a/tests/Application/package.json b/tests/Application/package.json index acfdc10..ac5c143 100644 --- a/tests/Application/package.json +++ b/tests/Application/package.json @@ -1,32 +1,36 @@ { "dependencies": { + "@babel/core": "^7.24.9", + "@babel/preset-env": "^7.14.7", "babel-polyfill": "^6.26.0", - "chart.js": "^3.7.1", - "jquery": "^3.4.0", + "chart.js": "^3.9.1", + "jquery": "^3.6.0", "jquery.dirtyforms": "^2.0.0", - "lightbox2": "^2.9.0", - "semantic-ui-css": "^2.2.0", + "lightbox2": "^2.11.0", + "semantic-ui-css": "^2.4.0", "slick-carousel": "^1.8.1" }, "devDependencies": { - "@symfony/webpack-encore": "^1.8.2", + "@symfony/webpack-encore": "^4.0.0", "babel-core": "^6.26.3", "babel-plugin-external-helpers": "^6.22.0", - "babel-plugin-module-resolver": "^3.1.1", + "babel-plugin-module-resolver": "^3.2.0", "babel-plugin-transform-object-rest-spread": "^6.26.0", "babel-preset-env": "^1.7.0", "babel-register": "^6.26.0", "dedent": "^0.7.0", - "eslint": "^4.19.1", - "eslint-config-airbnb-base": "^12.1.0", - "eslint-import-resolver-babel-module": "^4.0.0", - "eslint-plugin-import": "^2.11.0", - "fast-async": "^6.3.7", - "merge-stream": "^1.0.0", - "node-sass": "^4.14", - "sass-loader": "^7.0.1", - "upath": "^1.1.0", - "yargs": "^6.4.0" + "eslint": "^8.22.0", + "eslint-config-airbnb-base": "^15.0.0", + "eslint-import-resolver-babel-module": "^5.3.0", + "eslint-plugin-import": "^2.26.0", + "fast-async": "^7.0.6", + "merge-stream": "^2.0.0", + "sass": "^1.77.8", + "sass-loader": "^13.0.0", + "upath": "^2.0.0", + "webpack": "^5.93.0", + "webpack-cli": "^5.1.4", + "yargs": "^17.7.1" }, "scripts": { "dev": "yarn encore dev", diff --git a/tests/Application/public/media/image/.gitignore b/tests/Application/public/media/image/.gitignore deleted file mode 100644 index e69de29..0000000