From 8a76def1eebf2ffc9a7c79d63f4ee33cfa156f1e Mon Sep 17 00:00:00 2001 From: Vitalij Mik Date: Thu, 25 Jan 2024 10:32:46 +0100 Subject: [PATCH] NTR: Squashed commit of the following: commit 95aa056782238f17a797b2fb4599b29e4b40cf73 Author: Vitalij Mik Date: Wed Jan 24 10:02:14 2024 +0100 NTR: test newer shopware version (#696) Co-authored-by: Vitalij Mik commit aab2afc732af848ba6c1052d0f79724f1b8d6426 Author: Vitalij Mik Date: Wed Jan 24 10:01:22 2024 +0100 NTR: change sw version release (#697) Co-authored-by: Vitalij Mik commit 2cee88b7dd3968afd382a13161d007ac9e29c10f Author: Vitalij Mik Date: Fri Jan 19 13:15:08 2024 +0100 NTR: prepare hotfix 4.4.1 (#694) Co-authored-by: Vitalij Mik commit 549addbfda33e355baa217881b078324691ea64a Author: Vitalij Mik Date: Thu Jan 18 13:47:44 2024 +0100 NTR: change min sw release version (#693) Co-authored-by: Vitalij Mik commit 01f09cf92687ec4a514af41305ed6a7c0e3fa356 Author: Vitalij Mik Date: Thu Jan 18 13:37:00 2024 +0100 NTR: Fix release version for production composer.json (#692) Co-authored-by: Vitalij Mik commit 4c75daf3a8edb3647999f6b891e68e4a273bbb61 Author: Vitalij Mik Date: Thu Jan 18 12:40:44 2024 +0100 NTR: new plugin version (#691) * NTR: new plugin version * NTR: Composer update * NTR: update composer --------- Co-authored-by: Vitalij Mik commit 08f42c54782f99d9834b76140900e2a7fe51aba6 Author: Vitalij Mik Date: Thu Jan 18 10:46:31 2024 +0100 NTR: revert shopware version (#690) Co-authored-by: Vitalij Mik commit a341cf12e4d906bdac1bf6e84144493ffbea0fc8 Author: Vitalij Mik Date: Thu Jan 18 09:12:28 2024 +0100 NTR: update shopware version (#689) Co-authored-by: Vitalij Mik commit fd8746e2568591dbf90d08eeb8c80ebf3a06f97b Author: Vitalij Mik Date: Wed Jan 17 16:13:37 2024 +0100 NTR: Fix saved credit card payment (#688) Co-authored-by: Vitalij Mik commit de772ee1940e639b9914e39d79bc9522bf2224b4 Author: Vitalij Mik Date: Wed Jan 17 08:52:26 2024 +0100 NTR: Update shopware version to 6.5.7.4 (#687) Co-authored-by: Vitalij Mik commit 5d763dddc14fd63e0e53d497d110c45f1035bfb5 Author: Vitalij Mik Date: Tue Jan 16 15:24:22 2024 +0100 MOL-1196: add shipping method for tracking url (#686) Co-authored-by: Vitalij Mik commit 190047478d635d7dea0e942099d2cb7aa84f8428 Author: Vitalij Mik Date: Tue Jan 16 11:21:25 2024 +0100 MOL-1196: fix automatic shipping and add error logs (#685) * MOL-1196: fix automatic shipping and add error logs * MOL-1196: remove comment --------- Co-authored-by: Vitalij Mik commit 32b0be3f47ae801c8bf9cf80a0c8b83fe6b7ddad Author: Vitalij Mik Date: Mon Jan 15 13:46:33 2024 +0100 MOL-1280: Fix retry route and add cypress tests (#683) * MOL-1280: Fix retry route and add cypress tests * MOL-1280: Update cypress ID * MOL-1280: cleanup cypress test --------- Co-authored-by: Vitalij Mik commit 9de44f902ef0596e16cb6f9541ca9965c3334ab6 Author: Vitalij Mik Date: Mon Jan 15 08:59:14 2024 +0100 NTR: PISHPS-204: store bank data in order custom fields (#664) Co-authored-by: Vitalij Mik commit cbcc33ca5969989e5299a3777679c95f825a8745 Author: Vitalij Mik Date: Fri Jan 12 13:54:42 2024 +0100 MOL-1280: Fix subscription metadata after retry (#682) Co-authored-by: Vitalij Mik commit 48281db551ef4a605b6e5dc317548fd6942f724c Author: Vitalij Mik Date: Thu Jan 11 15:21:13 2024 +0100 MOL-1255: Fix cypress tests (#681) Co-authored-by: Vitalij Mik commit 04c71dad576cc259550aa162d45d7d44f353c1da Author: Vitalij Mik Date: Thu Jan 11 09:50:58 2024 +0100 MOL-1287: Fix custom fields for payment methods (#680) Co-authored-by: Vitalij Mik commit 1491af387135c53d367e08c3d4af4ec758f03859 Author: Vitalij Mik Date: Wed Jan 10 10:35:50 2024 +0100 MOL-1287: do not overwrite exisisting technical name (#678) * MOL-1287: do not overwrite exisisting technical name * MOL-1287: technical name in 6.5.7 * MOL-1287: cs and stan fix --------- Co-authored-by: Vitalij Mik commit 37d176b63ec89032333fd7179897d0eb0a5e814b Author: Vitalij Mik Date: Tue Jan 9 11:49:11 2024 +0100 MOL-1294: force label to be empty string on null (#677) * MOL-1294: force label to be empty string on null * MOL-1294: update test --------- Co-authored-by: Vitalij Mik commit f411812bcdb237a975cc81e5dea5ad0f90008103 Author: Christian Date: Fri Jan 5 10:13:43 2024 +0100 MOL-1287: add technical name to payment methods (#675) commit 250a3d386469569e8cb153f8b721266076907397 Author: Christian Date: Fri Dec 22 12:34:53 2023 +0100 MOL-1206: create plugin config for log file retention days (#674) commit 5511d15b0dab22fe8a8624e711ed898265cb767d Author: Christian Date: Thu Dec 21 17:46:06 2023 +0100 MOL-1225: add batch shipments to administration (#665) commit 2bc7a18f72705cce42001fb84d4282c95ef339fb Author: Vitalij Mik Date: Wed Dec 20 12:13:35 2023 +0100 MOL-1285: use stock manager config (#669) Co-authored-by: Vitalij Mik commit 8b464a8b09d702bd10a4b018c56f0981582bc6fe Author: Christian Date: Wed Dec 20 11:34:20 2023 +0100 NTR: add one click payments to headless config (#672) commit c7622fadbaaf8a405d774b08ebd77f85f76c66de Author: Christian Date: Wed Dec 20 11:30:08 2023 +0100 NTR: add missing oneClick payments to swagger docs (#671) commit bb26750f6066ede36d55d37251f48f6ee142db63 Author: Christian Dangl Date: Thu Dec 14 17:17:15 2023 +0100 NTR: allow shopware-cli downgrades commit 0a614b2b5ccc5536e072a0c87cfbedb2211418ef Author: Christian Dangl Date: Thu Dec 14 17:08:20 2023 +0100 NTR: fix problem in automated shopware-cli installer commit 3906e26f814f4a614d4e951b2dd2baae517252e4 Author: Vitalij Mik Date: Thu Dec 14 16:35:44 2023 +0100 NTR: Set fixed version of shopware cli (#668) Co-authored-by: Vitalij Mik commit 22a6e8a8930962c3b34bd69d8522549b558231ad Author: Vitalij Mik Date: Thu Dec 14 09:35:57 2023 +0100 NTR: Fix make run (#666) * NTR: Fix make run * NTR: Fix build * NTR: update --------- Co-authored-by: Vitalij Mik commit ab42644d765646a01c4e0f39ee790ff73ecd46bf Author: Christian Date: Mon Dec 4 15:48:29 2023 +0100 MOL-1260: use technical state machine name for log entry on reopen (#663) commit f52ae300187e91aa6bfba04b3b1fcda744b998d5 Author: Vitalij Mik Date: Mon Dec 4 15:48:06 2023 +0100 MOL-1196: Tracking (#607) * MOL-1196: Tracking * MOL-1196: fix pipeline * MOL-1196: extract to factory * MOL-1196: check tracking code lenght * MOL-1196: update comment --------- Co-authored-by: Vitalij Mik commit c08c340565b1d37a3824f820ba99033923697f36 Author: Christian Dangl Date: Fri Dec 1 10:50:31 2023 +0100 NTR: fix typo in plugin config commit cc97b68f2d8bb1be13fac1640faeda965e7e54ed Author: Christian Dangl Date: Fri Dec 1 09:45:49 2023 +0100 NTR: add Shopware 6.5.7.3 to pipeline commit 54836bb72c0c5dd34ab1b2f75f668bd79f3b39a5 Author: Christian Date: Wed Nov 29 09:38:20 2023 +0100 MOL-1276: add store api config route for frontend components (#660) commit faa72b61abe9c92214dd87ecc983831ef5e1ac27 Author: Christian Date: Wed Nov 29 09:38:00 2023 +0100 MOL-1277: fix wrong syntax in OrderLifeTimeLimitDetectorService.js (#661) commit a420fa73a56445045bca31bb735ad8da659a3d09 Author: Christian Date: Wed Nov 29 09:37:47 2023 +0100 MOL-1278: fix ideal issuer reset leads to wrong url (#662) --- .github/actions/build-plugin/action.yml | 2 +- .github/workflows/ci_pipe.yml | 2 +- .github/workflows/nightly_pipe.yml | 2 +- .github/workflows/pr_pipe.yml | 2 +- composer.json | 2 +- composer.lock | 667 ++-- makefile | 14 +- .../FlowBuilder/Actions/ShipOrderAction.php | 24 +- .../Service/MollieLimitsRemover.php | 5 +- .../DAL/RefundItem/RefundItemEntity.php | 2 +- .../Exceptions/NoDeliveriesFoundException.php | 7 + .../NoLineItemsProvidedException.php | 7 + .../Models/ShipmentLineItem.php | 43 + .../ShipmentManager/Models/TrackingData.php | 58 + .../ShipmentManager/ShipmentManager.php | 405 +++ .../ShipmentManagerInterface.php | 54 + .../SubscriptionRemover.php | 5 +- .../Voucher/Service/VoucherRemover.php | 5 +- .../Api/Order/ShippingControllerBase.php | 765 +++-- .../Api/PluginConfig/ConfigControllerBase.php | 8 - .../Api/PluginConfig/Sw6/ConfigController.php | 16 - .../PluginConfig/Sw65/ConfigController.php | 17 - .../StoreApi/Config/ConfigControllerBase.php | 95 + .../Config/Response/ConfigResponse.php | 36 + .../StoreApi/Config/Sw6/ConfigController.php | 14 + .../StoreApi/Config/Sw65/ConfigController.php | 13 + .../StoreApi/iDEAL/iDealControllerBase.php | 6 + .../Payment/MollieFailureControllerBase.php | 44 +- .../Storefront/iDEAL/iDealControllerBase.php | 6 + .../MollieOrderShipmentTrackingEvent.php | 128 - .../OrderLineItemNotFoundException.php | 7 +- src/Facade/MolliePaymentDoPay.php | 13 +- src/Facade/MolliePaymentFinalize.php | 3 +- src/Facade/MollieShipment.php | 483 --- src/Facade/MollieShipmentInterface.php | 82 - src/Handler/Method/iDealPayment.php | 1 + src/Helper/DeliveryStateHelper.php | 144 - src/MolliePayments.php | 2 +- .../Language/LanguageRepository.php | 18 + .../Language/LanguageRepositoryInterface.php | 8 + .../api/mollie-payments-shipping.service.js | 82 +- .../core/service/utils/array-utils.service.js | 39 + .../OderLifeTimeLimitDetectorService.js | 22 +- .../mollie-ship-order/MollieShipping.js | 2 + .../components/mollie-ship-order/index.js | 72 +- .../mollie-ship-order.html.twig | 43 +- .../mollie-ship-order/mollie-ship-order.scss | 9 + .../sw-order-line-items-grid.html.twig | 2 +- .../sw-order-detail-general.html.twig | 2 +- .../app/administration/src/snippet/de-DE.json | 7 +- .../app/administration/src/snippet/en-GB.json | 7 +- .../app/administration/src/snippet/nl-NL.json | 7 +- .../core/utils/array-utils.service.spec.js | 62 + src/Resources/app/storefront/makefile | 2 +- .../app/storefront/package-lock.json | 2924 ++++++++++------- src/Resources/app/storefront/package.json | 2 +- .../plugins/ideal-issuer.plugin.js | 8 +- .../config/compatibility/controller.xml | 12 +- .../config/compatibility/controller_6.5.xml | 27 +- .../compatibility/flowbuilder/6.4.6.0.xml | 2 +- src/Resources/config/config.xml | 12 +- src/Resources/config/services.xml | 11 +- src/Resources/config/services/api.xml | 1 + src/Resources/config/services/facades.xml | 9 +- src/Resources/config/services/payment.xml | 8 +- src/Resources/config/services/services.xml | 14 +- src/Resources/config/services/subscriber.xml | 9 +- src/Service/ConfigService.php | 1 + src/Service/Logger/MollieLoggerFactory.php | 12 +- .../MollieApi/Models/MollieShippingItem.php | 43 + src/Service/MollieApi/Order.php | 39 +- src/Service/MollieApi/OrderDataExtractor.php | 55 - .../MollieApi/OrderDeliveryExtractor.php | 65 + src/Service/MollieApi/OrderItemsExtractor.php | 37 + src/Service/MollieApi/Shipment.php | 41 +- src/Service/MollieApi/ShipmentInterface.php | 52 + src/Service/Order/UpdateOrderLineItems.php | 19 +- src/Service/OrderDeliveryService.php | 2 + src/Service/OrderService.php | 48 +- .../Payment/Remover/PaymentMethodRemover.php | 12 +- .../Payment/Remover/RegularPaymentRemover.php | 5 +- src/Service/PaymentMethodService.php | 47 +- .../SalesChannel/SalesChannelLocale.php | 79 + src/Service/Stock/StockManager.php | 40 +- src/Service/TrackingInfoStructFactory.php | 129 + src/Service/TransactionService.php | 1 + .../TransactionTransitionService.php | 3 +- src/Setting/MollieSettingStruct.php | 28 + src/Struct/CustomerStruct.php | 10 + src/Struct/Order/OrderAttributes.php | 113 +- .../OrderLineItemEntityAttributes.php | 21 + .../CheckoutConfirmPageSubscriber.php | 90 +- src/Subscriber/OrderDeliverySubscriber.php | 64 +- src/Subscriber/ShippingSubscriber.php | 79 - src/Traits/StringTrait.php | 12 + switch-composer.php | 2 + .../cypress/e2e/store-api/config.cy.js | 33 + .../e2e/storefront/shipment/shipment.cy.js | 30 +- .../subscriptions/subscription.cy.js | 212 +- .../actions/admin/ShipThroughMollieAction.js | 23 +- .../FullShippingRepository.js | 16 + .../Actions/ShipOrderActionTest.php | 4 +- .../DAL/RefundItem/RefundItemTest.php | 11 + .../ShipmentManager/ShipmentManagerTest.php | 484 +++ .../CreateTrackingStructTest.php | 125 - .../Facade/MollieShipment/SetShipmentTest.php | 285 -- tests/PHPUnit/Fakes/FakeMollieShipment.php | 131 - tests/PHPUnit/Fakes/FakeShipment.php | 161 + tests/PHPUnit/Fakes/FakeShipmentManager.php | 105 + .../Repositories/FakeLanguageRepository.php | 49 + tests/PHPUnit/Service/MollieApi/OrderTest.php | 6 +- .../Service/MollieApi/ShipmentTest.php | 8 +- tests/PHPUnit/Service/OrderServiceTest.php | 3 + .../Service/PaymentMethodServiceTest.php | 13 + .../SalesChannel/SalesChannelLocaleTest.php | 158 + .../Service/TrackingInfoStructFactoryTest.php | 214 ++ .../Struct/Order/OrderAttributesTest.php | 43 + tests/PHPUnit/Traits/OrderTrait.php | 57 +- tests/Swagger/mollie-headless.yaml | 16 + tests/Swagger/mollie.yaml | 191 +- 120 files changed, 6350 insertions(+), 3789 deletions(-) create mode 100644 src/Components/ShipmentManager/Exceptions/NoDeliveriesFoundException.php create mode 100644 src/Components/ShipmentManager/Exceptions/NoLineItemsProvidedException.php create mode 100644 src/Components/ShipmentManager/Models/ShipmentLineItem.php create mode 100644 src/Components/ShipmentManager/Models/TrackingData.php create mode 100644 src/Components/ShipmentManager/ShipmentManager.php create mode 100644 src/Components/ShipmentManager/ShipmentManagerInterface.php create mode 100644 src/Controller/StoreApi/Config/ConfigControllerBase.php create mode 100644 src/Controller/StoreApi/Config/Response/ConfigResponse.php create mode 100644 src/Controller/StoreApi/Config/Sw6/ConfigController.php create mode 100644 src/Controller/StoreApi/Config/Sw65/ConfigController.php delete mode 100644 src/Event/MollieOrderShipmentTrackingEvent.php delete mode 100644 src/Facade/MollieShipment.php delete mode 100644 src/Facade/MollieShipmentInterface.php delete mode 100644 src/Helper/DeliveryStateHelper.php create mode 100644 src/Resources/app/administration/src/core/service/utils/array-utils.service.js create mode 100644 src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/mollie-ship-order.scss create mode 100644 src/Resources/app/administration/tests/core/utils/array-utils.service.spec.js create mode 100644 src/Service/MollieApi/Models/MollieShippingItem.php create mode 100644 src/Service/MollieApi/OrderDeliveryExtractor.php create mode 100644 src/Service/MollieApi/OrderItemsExtractor.php create mode 100644 src/Service/MollieApi/ShipmentInterface.php create mode 100644 src/Service/SalesChannel/SalesChannelLocale.php create mode 100644 src/Service/TrackingInfoStructFactory.php delete mode 100644 src/Subscriber/ShippingSubscriber.php create mode 100644 tests/Cypress/cypress/e2e/store-api/config.cy.js create mode 100644 tests/PHPUnit/Components/ShipmentManager/ShipmentManagerTest.php delete mode 100644 tests/PHPUnit/Facade/MollieShipment/CreateTrackingStructTest.php delete mode 100644 tests/PHPUnit/Facade/MollieShipment/SetShipmentTest.php delete mode 100644 tests/PHPUnit/Fakes/FakeMollieShipment.php create mode 100644 tests/PHPUnit/Fakes/FakeShipment.php create mode 100644 tests/PHPUnit/Fakes/FakeShipmentManager.php create mode 100644 tests/PHPUnit/Fakes/Repositories/FakeLanguageRepository.php create mode 100644 tests/PHPUnit/Service/SalesChannel/SalesChannelLocaleTest.php create mode 100644 tests/PHPUnit/Service/TrackingInfoStructFactoryTest.php diff --git a/.github/actions/build-plugin/action.yml b/.github/actions/build-plugin/action.yml index 95a8eeadd..516e4c0c2 100644 --- a/.github/actions/build-plugin/action.yml +++ b/.github/actions/build-plugin/action.yml @@ -8,7 +8,7 @@ runs: - name: Start Docker shell: bash run: | - docker run --rm --name shop --env NODE_VERSION=18 --env PHP_VERSION=8.1 -d dockware/dev:6.5.7.2 + docker run --rm --name shop --env NODE_VERSION=18 --env PHP_VERSION=8.1 -d dockware/dev:6.5.8.2 sleep 20 docker logs shop diff --git a/.github/workflows/ci_pipe.yml b/.github/workflows/ci_pipe.yml index e148064df..0e2f925d3 100644 --- a/.github/workflows/ci_pipe.yml +++ b/.github/workflows/ci_pipe.yml @@ -340,7 +340,7 @@ jobs: fail-fast: false matrix: include: - - shopware: '6.5.7.2' + - shopware: '6.5.8.2' php: '8.2' - shopware: '6.5.6.1' php: '8.2' diff --git a/.github/workflows/nightly_pipe.yml b/.github/workflows/nightly_pipe.yml index f5fd1d6e2..819eab8c6 100644 --- a/.github/workflows/nightly_pipe.yml +++ b/.github/workflows/nightly_pipe.yml @@ -334,7 +334,7 @@ jobs: fail-fast: false matrix: include: - - shopware: '6.5.7.2' + - shopware: '6.5.8.2' php: '8.2' - shopware: '6.5.6.1' php: '8.2' diff --git a/.github/workflows/pr_pipe.yml b/.github/workflows/pr_pipe.yml index f6feb6439..f2ac8b31f 100644 --- a/.github/workflows/pr_pipe.yml +++ b/.github/workflows/pr_pipe.yml @@ -333,7 +333,7 @@ jobs: fail-fast: false matrix: include: - - shopware: '6.5.6.1' + - shopware: '6.5.8.2' php: '8.2' - shopware: '6.5.5.2' php: '8.2' diff --git a/composer.json b/composer.json index 0003a294f..92ae63c84 100644 --- a/composer.json +++ b/composer.json @@ -1,7 +1,7 @@ { "name": "kiener/mollie-payments-plugin", "description": "Mollie Payments", - "version": "v4.3.0", + "version": "v4.4.2", "type": "shopware-platform-plugin", "license": "MIT", "authors": [ diff --git a/composer.lock b/composer.lock index 0ca26ab29..7008afb70 100644 --- a/composer.lock +++ b/composer.lock @@ -4,21 +4,21 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "142c7b8cbcdb5d977b01cd16691a89c6", + "content-hash": "40fe21aa04e3cd2a19c569d548e951ca", "packages": [], "packages-dev": [ { "name": "aws/aws-crt-php", - "version": "v1.2.3", + "version": "v1.2.4", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382" + "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/5545a4fa310aec39f54279fdacebcce33b3ff382", - "reference": "5545a4fa310aec39f54279fdacebcce33b3ff382", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2", + "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2", "shasum": "" }, "require": { @@ -57,22 +57,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.3" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4" }, - "time": "2023-10-16T20:10:06+00:00" + "time": "2023-11-08T00:42:13+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.285.0", + "version": "3.296.7", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "41c7a9491455f89052cba62c4e4f0c748af51265" + "reference": "da296909ceb8a4c156c4e849fe1c43ec9e2bb4b0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/41c7a9491455f89052cba62c4e4f0c748af51265", - "reference": "41c7a9491455f89052cba62c4e4f0c748af51265", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/da296909ceb8a4c156c4e849fe1c43ec9e2bb4b0", + "reference": "da296909ceb8a4c156c4e849fe1c43ec9e2bb4b0", "shasum": "" }, "require": { @@ -152,9 +152,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.285.0" + "source": "https://github.com/aws/aws-sdk-php/tree/3.296.7" }, - "time": "2023-11-07T19:33:47+00:00" + "time": "2024-01-22T19:11:58+00:00" }, { "name": "boxblinkracer/phpunuhi", @@ -162,12 +162,12 @@ "source": { "type": "git", "url": "https://github.com/boxblinkracer/phpunuhi.git", - "reference": "c565acf3f8a5d19bdc596410c0d6bcd347a1ec90" + "reference": "3286aa7bd310bebb02a9c83b7e739eb082849a17" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/boxblinkracer/phpunuhi/zipball/c565acf3f8a5d19bdc596410c0d6bcd347a1ec90", - "reference": "c565acf3f8a5d19bdc596410c0d6bcd347a1ec90", + "url": "https://api.github.com/repos/boxblinkracer/phpunuhi/zipball/3286aa7bd310bebb02a9c83b7e739eb082849a17", + "reference": "3286aa7bd310bebb02a9c83b7e739eb082849a17", "shasum": "" }, "require": { @@ -183,11 +183,17 @@ }, "require-dev": { "friendsofphp/php-cs-fixer": "^2.18", - "nunomaduro/phpinsights": "^1.14", + "infection/infection": "^0.21.5", "phpcompatibility/php-compatibility": "^9.3", "phpstan/phpstan": "*", - "phpunit/phpunit": "^8.5", + "phpunit/phpunit": "^9.6", + "povils/phpmnd": "^3.3", + "rector/rector": "0.19.1", + "roave/security-advisories": "dev-latest", + "rregeer/phpunit-coverage-check": "^0.3.1", + "spaze/phpstan-disallowed-calls": "^3.0", "squizlabs/php_codesniffer": "^3.7", + "staabm/phpstan-todo-by": "^0.1.16", "svrunit/svrunit": "dev-main" }, "default-branch": true, @@ -220,9 +226,9 @@ ], "support": { "issues": "https://github.com/boxblinkracer/phpunuhi/issues", - "source": "https://github.com/boxblinkracer/phpunuhi/tree/main" + "source": "https://github.com/boxblinkracer/phpunuhi/tree/v1.16.0" }, - "time": "2023-10-28T16:57:20+00:00" + "time": "2024-01-21T22:35:43+00:00" }, { "name": "brick/math", @@ -360,16 +366,16 @@ }, { "name": "composer/ca-bundle", - "version": "1.3.7", + "version": "1.4.0", "source": { "type": "git", "url": "https://github.com/composer/ca-bundle.git", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85" + "reference": "b66d11b7479109ab547f9405b97205640b17d385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/ca-bundle/zipball/76e46335014860eec1aa5a724799a00a2e47cc85", - "reference": "76e46335014860eec1aa5a724799a00a2e47cc85", + "url": "https://api.github.com/repos/composer/ca-bundle/zipball/b66d11b7479109ab547f9405b97205640b17d385", + "reference": "b66d11b7479109ab547f9405b97205640b17d385", "shasum": "" }, "require": { @@ -381,7 +387,7 @@ "phpstan/phpstan": "^0.12.55", "psr/log": "^1.0", "symfony/phpunit-bridge": "^4.2 || ^5", - "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0" + "symfony/process": "^2.5 || ^3.0 || ^4.0 || ^5.0 || ^6.0 || ^7.0" }, "type": "library", "extra": { @@ -416,7 +422,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/ca-bundle/issues", - "source": "https://github.com/composer/ca-bundle/tree/1.3.7" + "source": "https://github.com/composer/ca-bundle/tree/1.4.0" }, "funding": [ { @@ -432,7 +438,7 @@ "type": "tidelift" } ], - "time": "2023-08-30T09:31:38+00:00" + "time": "2023-12-18T12:05:55+00:00" }, { "name": "composer/composer", @@ -756,16 +762,16 @@ }, { "name": "composer/spdx-licenses", - "version": "1.5.7", + "version": "1.5.8", "source": { "type": "git", "url": "https://github.com/composer/spdx-licenses.git", - "reference": "c848241796da2abf65837d51dce1fae55a960149" + "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/c848241796da2abf65837d51dce1fae55a960149", - "reference": "c848241796da2abf65837d51dce1fae55a960149", + "url": "https://api.github.com/repos/composer/spdx-licenses/zipball/560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", + "reference": "560bdcf8deb88ae5d611c80a2de8ea9d0358cc0a", "shasum": "" }, "require": { @@ -814,9 +820,9 @@ "validator" ], "support": { - "irc": "irc://irc.freenode.org/composer", + "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/spdx-licenses/issues", - "source": "https://github.com/composer/spdx-licenses/tree/1.5.7" + "source": "https://github.com/composer/spdx-licenses/tree/1.5.8" }, "funding": [ { @@ -832,7 +838,7 @@ "type": "tidelift" } ], - "time": "2022-05-23T07:37:50+00:00" + "time": "2023-11-20T07:44:33+00:00" }, { "name": "composer/xdebug-handler", @@ -2096,16 +2102,16 @@ }, { "name": "enqueue/enqueue", - "version": "0.10.19", + "version": "0.10.20", "source": { "type": "git", "url": "https://github.com/php-enqueue/enqueue.git", - "reference": "9273d0760b40594bfc721c36117824f660a388df" + "reference": "4b3c6e98215cbc67c79fe0bfb6af55ccaac0e8fe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-enqueue/enqueue/zipball/9273d0760b40594bfc721c36117824f660a388df", - "reference": "9273d0760b40594bfc721c36117824f660a388df", + "url": "https://api.github.com/repos/php-enqueue/enqueue/zipball/4b3c6e98215cbc67c79fe0bfb6af55ccaac0e8fe", + "reference": "4b3c6e98215cbc67c79fe0bfb6af55ccaac0e8fe", "shasum": "" }, "require": { @@ -2188,7 +2194,7 @@ "issues": "https://github.com/php-enqueue/enqueue-dev/issues", "source": "https://github.com/php-enqueue/enqueue-dev" }, - "time": "2023-03-23T09:50:55+00:00" + "time": "2023-10-15T09:28:46+00:00" }, { "name": "enqueue/enqueue-bundle", @@ -2452,16 +2458,16 @@ }, { "name": "firebase/php-jwt", - "version": "v6.9.0", + "version": "v6.10.0", "source": { "type": "git", "url": "https://github.com/firebase/php-jwt.git", - "reference": "f03270e63eaccf3019ef0f32849c497385774e11" + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/firebase/php-jwt/zipball/f03270e63eaccf3019ef0f32849c497385774e11", - "reference": "f03270e63eaccf3019ef0f32849c497385774e11", + "url": "https://api.github.com/repos/firebase/php-jwt/zipball/a49db6f0a5033aef5143295342f1c95521b075ff", + "reference": "a49db6f0a5033aef5143295342f1c95521b075ff", "shasum": "" }, "require": { @@ -2509,9 +2515,9 @@ ], "support": { "issues": "https://github.com/firebase/php-jwt/issues", - "source": "https://github.com/firebase/php-jwt/tree/v6.9.0" + "source": "https://github.com/firebase/php-jwt/tree/v6.10.0" }, - "time": "2023-10-05T00:24:42+00:00" + "time": "2023-12-01T16:26:39+00:00" }, { "name": "friendsofphp/php-cs-fixer", @@ -2764,16 +2770,16 @@ }, { "name": "google/cloud-core", - "version": "v1.52.8", + "version": "v1.52.10", "source": { "type": "git", "url": "https://github.com/googleapis/google-cloud-php-core.git", - "reference": "2ebcaa410f7e92dca5677dd9cc4ec1f9f315e83c" + "reference": "5e34556498ecadee2161402fd1024bec7ce33186" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/2ebcaa410f7e92dca5677dd9cc4ec1f9f315e83c", - "reference": "2ebcaa410f7e92dca5677dd9cc4ec1f9f315e83c", + "url": "https://api.github.com/repos/googleapis/google-cloud-php-core/zipball/5e34556498ecadee2161402fd1024bec7ce33186", + "reference": "5e34556498ecadee2161402fd1024bec7ce33186", "shasum": "" }, "require": { @@ -2823,9 +2829,9 @@ ], "description": "Google Cloud PHP shared dependency, providing functionality useful to all components.", "support": { - "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.52.8" + "source": "https://github.com/googleapis/google-cloud-php-core/tree/v1.52.10" }, - "time": "2023-11-02T19:15:44+00:00" + "time": "2023-12-08T22:36:35+00:00" }, { "name": "google/cloud-storage", @@ -3181,16 +3187,16 @@ }, { "name": "google/protobuf", - "version": "v3.25.0", + "version": "v3.25.2", "source": { "type": "git", "url": "https://github.com/protocolbuffers/protobuf-php.git", - "reference": "e5a021e653ee3a7a78760caefa605b4ec31bba80" + "reference": "83ea4c147718666ce6a9b9332ac2aa588c9211eb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/e5a021e653ee3a7a78760caefa605b4ec31bba80", - "reference": "e5a021e653ee3a7a78760caefa605b4ec31bba80", + "url": "https://api.github.com/repos/protocolbuffers/protobuf-php/zipball/83ea4c147718666ce6a9b9332ac2aa588c9211eb", + "reference": "83ea4c147718666ce6a9b9332ac2aa588c9211eb", "shasum": "" }, "require": { @@ -3219,9 +3225,9 @@ "proto" ], "support": { - "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.25.0" + "source": "https://github.com/protocolbuffers/protobuf-php/tree/v3.25.2" }, - "time": "2023-11-01T22:12:38+00:00" + "time": "2024-01-09T22:12:32+00:00" }, { "name": "grpc/grpc", @@ -5128,16 +5134,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.17.1", + "version": "v4.18.0", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d" + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", - "reference": "a6303e50c90c355c7eeee2c4a8b27fe8dc8fef1d", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/1bcbb2179f97633e98bbbc87044ee2611c7d7999", + "reference": "1bcbb2179f97633e98bbbc87044ee2611c7d7999", "shasum": "" }, "require": { @@ -5178,22 +5184,22 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.17.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.18.0" }, - "time": "2023-08-13T19:53:39+00:00" + "time": "2023-12-10T21:03:43+00:00" }, { "name": "nyholm/psr7", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/Nyholm/psr7.git", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be" + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Nyholm/psr7/zipball/3cb4d163b58589e47b35103e8e5e6a6a475b47be", - "reference": "3cb4d163b58589e47b35103e8e5e6a6a475b47be", + "url": "https://api.github.com/repos/Nyholm/psr7/zipball/aa5fc277a4f5508013d571341ade0c3886d4d00e", + "reference": "aa5fc277a4f5508013d571341ade0c3886d4d00e", "shasum": "" }, "require": { @@ -5246,7 +5252,7 @@ ], "support": { "issues": "https://github.com/Nyholm/psr7/issues", - "source": "https://github.com/Nyholm/psr7/tree/1.8.0" + "source": "https://github.com/Nyholm/psr7/tree/1.8.1" }, "funding": [ { @@ -5258,7 +5264,7 @@ "type": "github" } ], - "time": "2023-05-02T11:26:24+00:00" + "time": "2023-11-13T09:31:12+00:00" }, { "name": "ondram/ci-detector", @@ -5593,23 +5599,23 @@ }, { "name": "phenx/php-font-lib", - "version": "0.5.4", + "version": "0.5.5", "source": { "type": "git", "url": "https://github.com/dompdf/php-font-lib.git", - "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4" + "reference": "671df0f3516252011aa94f9e8e3b3b66199339f8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/dd448ad1ce34c63d09baccd05415e361300c35b4", - "reference": "dd448ad1ce34c63d09baccd05415e361300c35b4", + "url": "https://api.github.com/repos/dompdf/php-font-lib/zipball/671df0f3516252011aa94f9e8e3b3b66199339f8", + "reference": "671df0f3516252011aa94f9e8e3b3b66199339f8", "shasum": "" }, "require": { "ext-mbstring": "*" }, "require-dev": { - "symfony/phpunit-bridge": "^3 || ^4 || ^5" + "symfony/phpunit-bridge": "^3 || ^4 || ^5 || ^6" }, "type": "library", "autoload": { @@ -5619,7 +5625,7 @@ }, "notification-url": "https://packagist.org/downloads/", "license": [ - "LGPL-3.0" + "LGPL-2.1-or-later" ], "authors": [ { @@ -5631,9 +5637,9 @@ "homepage": "https://github.com/PhenX/php-font-lib", "support": { "issues": "https://github.com/dompdf/php-font-lib/issues", - "source": "https://github.com/dompdf/php-font-lib/tree/0.5.4" + "source": "https://github.com/dompdf/php-font-lib/tree/0.5.5" }, - "time": "2021-12-17T19:44:54+00:00" + "time": "2024-01-07T18:13:29+00:00" }, { "name": "phenx/php-svg-lib", @@ -5738,16 +5744,16 @@ }, { "name": "php-http/discovery", - "version": "1.19.1", + "version": "1.19.2", "source": { "type": "git", "url": "https://github.com/php-http/discovery.git", - "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e" + "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-http/discovery/zipball/57f3de01d32085fea20865f9b16fb0e69347c39e", - "reference": "57f3de01d32085fea20865f9b16fb0e69347c39e", + "url": "https://api.github.com/repos/php-http/discovery/zipball/61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", + "reference": "61e1a1eb69c92741f5896d9e05fb8e9d7e8bb0cb", "shasum": "" }, "require": { @@ -5810,9 +5816,9 @@ ], "support": { "issues": "https://github.com/php-http/discovery/issues", - "source": "https://github.com/php-http/discovery/tree/1.19.1" + "source": "https://github.com/php-http/discovery/tree/1.19.2" }, - "time": "2023-07-11T07:02:26+00:00" + "time": "2023-11-30T16:49:05+00:00" }, { "name": "php-http/multipart-stream-builder", @@ -5993,23 +5999,23 @@ }, { "name": "phpunit/php-code-coverage", - "version": "9.2.29", + "version": "9.2.30", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76" + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/6a3a87ac2bbe33b25042753df8195ba4aa534c76", - "reference": "6a3a87ac2bbe33b25042753df8195ba4aa534c76", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ca2bd87d2f9215904682a9cb9bb37dda98e76089", + "reference": "ca2bd87d2f9215904682a9cb9bb37dda98e76089", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "ext-xmlwriter": "*", - "nikic/php-parser": "^4.15", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3", "phpunit/php-file-iterator": "^3.0.3", "phpunit/php-text-template": "^2.0.2", @@ -6059,7 +6065,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.29" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.30" }, "funding": [ { @@ -6067,7 +6073,7 @@ "type": "github" } ], - "time": "2023-09-19T04:57:46+00:00" + "time": "2023-12-22T06:47:57+00:00" }, { "name": "phpunit/php-file-iterator", @@ -6312,16 +6318,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.6.13", + "version": "9.6.16", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be" + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/f3d767f7f9e191eab4189abe41ab37797e30b1be", - "reference": "f3d767f7f9e191eab4189abe41ab37797e30b1be", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/3767b2c56ce02d01e3491046f33466a1ae60a37f", + "reference": "3767b2c56ce02d01e3491046f33466a1ae60a37f", "shasum": "" }, "require": { @@ -6395,7 +6401,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.13" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.16" }, "funding": [ { @@ -6411,7 +6417,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T05:39:22+00:00" + "time": "2024-01-19T07:03:14+00:00" }, { "name": "psr/cache", @@ -7098,23 +7104,23 @@ }, { "name": "react/promise", - "version": "v2.10.0", + "version": "v2.11.0", "source": { "type": "git", "url": "https://github.com/reactphp/promise.git", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38" + "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/reactphp/promise/zipball/f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", - "reference": "f913fb8cceba1e6644b7b90c4bfb678ed8a3ef38", + "url": "https://api.github.com/repos/reactphp/promise/zipball/1a8460931ea36dc5c76838fec5734d55c88c6831", + "reference": "1a8460931ea36dc5c76838fec5734d55c88c6831", "shasum": "" }, "require": { "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^9.5 || ^5.7 || ^4.8.36" + "phpunit/phpunit": "^9.6 || ^5.7 || ^4.8.36" }, "type": "library", "autoload": { @@ -7158,7 +7164,7 @@ ], "support": { "issues": "https://github.com/reactphp/promise/issues", - "source": "https://github.com/reactphp/promise/tree/v2.10.0" + "source": "https://github.com/reactphp/promise/tree/v2.11.0" }, "funding": [ { @@ -7166,7 +7172,7 @@ "type": "open_collective" } ], - "time": "2023-05-02T15:15:43+00:00" + "time": "2023-11-16T16:16:50+00:00" }, { "name": "rize/uri-template", @@ -7285,16 +7291,16 @@ }, { "name": "sanmai/later", - "version": "0.1.3", + "version": "0.1.4", "source": { "type": "git", "url": "https://github.com/sanmai/later.git", - "reference": "88a1d39965aa3659ceb96622e2801b9194d16e2c" + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sanmai/later/zipball/88a1d39965aa3659ceb96622e2801b9194d16e2c", - "reference": "88a1d39965aa3659ceb96622e2801b9194d16e2c", + "url": "https://api.github.com/repos/sanmai/later/zipball/e24c4304a4b1349c2a83151a692cec0c10579f60", + "reference": "e24c4304a4b1349c2a83151a692cec0c10579f60", "shasum": "" }, "require": { @@ -7337,7 +7343,7 @@ "description": "Later: deferred wrapper object", "support": { "issues": "https://github.com/sanmai/later/issues", - "source": "https://github.com/sanmai/later/tree/0.1.3" + "source": "https://github.com/sanmai/later/tree/0.1.4" }, "funding": [ { @@ -7345,7 +7351,7 @@ "type": "github" } ], - "time": "2023-10-23T13:38:10+00:00" + "time": "2023-10-24T00:25:28+00:00" }, { "name": "sanmai/pipeline", @@ -7735,20 +7741,20 @@ }, { "name": "sebastian/complexity", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/complexity.git", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88" + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/739b35e53379900cc9ac327b2147867b8b6efd88", - "reference": "739b35e53379900cc9ac327b2147867b8b6efd88", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", "shasum": "" }, "require": { - "nikic/php-parser": "^4.7", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -7780,7 +7786,7 @@ "homepage": "https://github.com/sebastianbergmann/complexity", "support": { "issues": "https://github.com/sebastianbergmann/complexity/issues", - "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.2" + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" }, "funding": [ { @@ -7788,7 +7794,7 @@ "type": "github" } ], - "time": "2020-10-26T15:52:27+00:00" + "time": "2023-12-22T06:19:30+00:00" }, { "name": "sebastian/diff", @@ -8062,20 +8068,20 @@ }, { "name": "sebastian/lines-of-code", - "version": "1.0.3", + "version": "1.0.4", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/lines-of-code.git", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc" + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/c1c2e997aa3146983ed888ad08b15470a2e22ecc", - "reference": "c1c2e997aa3146983ed888ad08b15470a2e22ecc", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", "shasum": "" }, "require": { - "nikic/php-parser": "^4.6", + "nikic/php-parser": "^4.18 || ^5.0", "php": ">=7.3" }, "require-dev": { @@ -8107,7 +8113,7 @@ "homepage": "https://github.com/sebastianbergmann/lines-of-code", "support": { "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", - "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.3" + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" }, "funding": [ { @@ -8115,7 +8121,7 @@ "type": "github" } ], - "time": "2020-11-28T06:42:11+00:00" + "time": "2023-12-22T06:20:34+00:00" }, { "name": "sebastian/object-enumerator", @@ -8458,16 +8464,16 @@ }, { "name": "seld/jsonlint", - "version": "1.10.0", + "version": "1.10.1", "source": { "type": "git", "url": "https://github.com/Seldaek/jsonlint.git", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1" + "reference": "76d449a358ece77d6f1d6331c68453e657172202" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/594fd6462aad8ecee0b45ca5045acea4776667f1", - "reference": "594fd6462aad8ecee0b45ca5045acea4776667f1", + "url": "https://api.github.com/repos/Seldaek/jsonlint/zipball/76d449a358ece77d6f1d6331c68453e657172202", + "reference": "76d449a358ece77d6f1d6331c68453e657172202", "shasum": "" }, "require": { @@ -8494,7 +8500,7 @@ { "name": "Jordi Boggiano", "email": "j.boggiano@seld.be", - "homepage": "http://seld.be" + "homepage": "https://seld.be" } ], "description": "JSON Linter", @@ -8506,7 +8512,7 @@ ], "support": { "issues": "https://github.com/Seldaek/jsonlint/issues", - "source": "https://github.com/Seldaek/jsonlint/tree/1.10.0" + "source": "https://github.com/Seldaek/jsonlint/tree/1.10.1" }, "funding": [ { @@ -8518,7 +8524,7 @@ "type": "tidelift" } ], - "time": "2023-05-11T13:16:46+00:00" + "time": "2023-12-18T13:03:25+00:00" }, { "name": "seld/phar-utils", @@ -9254,16 +9260,16 @@ }, { "name": "squizlabs/php_codesniffer", - "version": "3.7.2", + "version": "3.8.1", "source": { "type": "git", - "url": "https://github.com/squizlabs/PHP_CodeSniffer.git", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879" + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "14f5fff1e64118595db5408e946f3a22c75807f7" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/squizlabs/PHP_CodeSniffer/zipball/ed8e00df0a83aa96acf703f8c2979ff33341f879", - "reference": "ed8e00df0a83aa96acf703f8c2979ff33341f879", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/14f5fff1e64118595db5408e946f3a22c75807f7", + "reference": "14f5fff1e64118595db5408e946f3a22c75807f7", "shasum": "" }, "require": { @@ -9273,11 +9279,11 @@ "php": ">=5.4.0" }, "require-dev": { - "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0" + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" }, "bin": [ - "bin/phpcs", - "bin/phpcbf" + "bin/phpcbf", + "bin/phpcs" ], "type": "library", "extra": { @@ -9292,22 +9298,45 @@ "authors": [ { "name": "Greg Sherwood", - "role": "lead" + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" } ], "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", - "homepage": "https://github.com/squizlabs/PHP_CodeSniffer", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", "keywords": [ "phpcs", "standards", "static analysis" ], "support": { - "issues": "https://github.com/squizlabs/PHP_CodeSniffer/issues", - "source": "https://github.com/squizlabs/PHP_CodeSniffer", - "wiki": "https://github.com/squizlabs/PHP_CodeSniffer/wiki" + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" }, - "time": "2023-02-22T23:07:41+00:00" + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-01-11T20:47:48+00:00" }, { "name": "sroze/messenger-enqueue-transport", @@ -9431,16 +9460,16 @@ }, { "name": "symfony/amqp-messenger", - "version": "v5.4.28", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/amqp-messenger.git", - "reference": "24e5cc90da041e0e1b7bbe15b82ad7f27a508c01" + "reference": "8ba6a2c482d3fce9d450b702098ca033bbe42de4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/24e5cc90da041e0e1b7bbe15b82ad7f27a508c01", - "reference": "24e5cc90da041e0e1b7bbe15b82ad7f27a508c01", + "url": "https://api.github.com/repos/symfony/amqp-messenger/zipball/8ba6a2c482d3fce9d450b702098ca033bbe42de4", + "reference": "8ba6a2c482d3fce9d450b702098ca033bbe42de4", "shasum": "" }, "require": { @@ -9480,7 +9509,7 @@ "description": "Symfony AMQP extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.28" + "source": "https://github.com/symfony/amqp-messenger/tree/v5.4.31" }, "funding": [ { @@ -9496,20 +9525,20 @@ "type": "tidelift" } ], - "time": "2023-08-09T17:16:27+00:00" + "time": "2023-11-03T16:16:43+00:00" }, { "name": "symfony/asset", - "version": "v5.4.21", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/asset.git", - "reference": "1504b6773c6b90118f9871e90a67833b5d1dca3c" + "reference": "edb2457a0ef615d420d2319851f679a4cc3b3635" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/asset/zipball/1504b6773c6b90118f9871e90a67833b5d1dca3c", - "reference": "1504b6773c6b90118f9871e90a67833b5d1dca3c", + "url": "https://api.github.com/repos/symfony/asset/zipball/edb2457a0ef615d420d2319851f679a4cc3b3635", + "reference": "edb2457a0ef615d420d2319851f679a4cc3b3635", "shasum": "" }, "require": { @@ -9554,7 +9583,7 @@ "description": "Manages URL generation and versioning of web assets such as CSS stylesheets, JavaScript files and image files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/asset/tree/v5.4.21" + "source": "https://github.com/symfony/asset/tree/v5.4.31" }, "funding": [ { @@ -9570,20 +9599,20 @@ "type": "tidelift" } ], - "time": "2023-02-14T08:03:56+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/cache", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/cache.git", - "reference": "2742d1b595927210546bb7a0887094cf1494de21" + "reference": "b17f28169f7a2f2c0cddf2b044d729f5b75efe5a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/cache/zipball/2742d1b595927210546bb7a0887094cf1494de21", - "reference": "2742d1b595927210546bb7a0887094cf1494de21", + "url": "https://api.github.com/repos/symfony/cache/zipball/b17f28169f7a2f2c0cddf2b044d729f5b75efe5a", + "reference": "b17f28169f7a2f2c0cddf2b044d729f5b75efe5a", "shasum": "" }, "require": { @@ -9651,7 +9680,7 @@ "psr6" ], "support": { - "source": "https://github.com/symfony/cache/tree/v5.4.30" + "source": "https://github.com/symfony/cache/tree/v5.4.34" }, "funding": [ { @@ -9667,7 +9696,7 @@ "type": "tidelift" } ], - "time": "2023-10-17T14:17:25+00:00" + "time": "2023-12-18T14:56:06+00:00" }, { "name": "symfony/cache-contracts", @@ -9750,16 +9779,16 @@ }, { "name": "symfony/config", - "version": "v5.4.26", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/config.git", - "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650" + "reference": "dd5ea39de228813aba0c23c3a4153da2a4cf3cd9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/config/zipball/8109892f27beed9252bd1f1c1880aeb4ad842650", - "reference": "8109892f27beed9252bd1f1c1880aeb4ad842650", + "url": "https://api.github.com/repos/symfony/config/zipball/dd5ea39de228813aba0c23c3a4153da2a4cf3cd9", + "reference": "dd5ea39de228813aba0c23c3a4153da2a4cf3cd9", "shasum": "" }, "require": { @@ -9809,7 +9838,7 @@ "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/config/tree/v5.4.26" + "source": "https://github.com/symfony/config/tree/v5.4.31" }, "funding": [ { @@ -9825,20 +9854,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:21:11+00:00" + "time": "2023-11-09T08:22:43+00:00" }, { "name": "symfony/console", - "version": "v5.4.28", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827" + "reference": "4b4d8cd118484aa604ec519062113dd87abde18c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/f4f71842f24c2023b91237c72a365306f3c58827", - "reference": "f4f71842f24c2023b91237c72a365306f3c58827", + "url": "https://api.github.com/repos/symfony/console/zipball/4b4d8cd118484aa604ec519062113dd87abde18c", + "reference": "4b4d8cd118484aa604ec519062113dd87abde18c", "shasum": "" }, "require": { @@ -9908,7 +9937,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.4.28" + "source": "https://github.com/symfony/console/tree/v5.4.34" }, "funding": [ { @@ -9924,7 +9953,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T06:12:30+00:00" + "time": "2023-12-08T13:33:03+00:00" }, { "name": "symfony/debug-bundle", @@ -10007,16 +10036,16 @@ }, { "name": "symfony/dependency-injection", - "version": "v5.4.29", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/dependency-injection.git", - "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05" + "reference": "75d568165a65fa7d8124869ec7c3a90424352e6c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/338638ed8c9d5c7fcb136a73f5c7043465ae2f05", - "reference": "338638ed8c9d5c7fcb136a73f5c7043465ae2f05", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/75d568165a65fa7d8124869ec7c3a90424352e6c", + "reference": "75d568165a65fa7d8124869ec7c3a90424352e6c", "shasum": "" }, "require": { @@ -10076,7 +10105,7 @@ "description": "Allows you to standardize and centralize the way objects are constructed in your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/dependency-injection/tree/v5.4.29" + "source": "https://github.com/symfony/dependency-injection/tree/v5.4.34" }, "funding": [ { @@ -10092,7 +10121,7 @@ "type": "tidelift" } ], - "time": "2023-09-20T06:23:43+00:00" + "time": "2023-12-28T09:31:38+00:00" }, { "name": "symfony/deprecation-contracts", @@ -10163,16 +10192,16 @@ }, { "name": "symfony/doctrine-messenger", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/doctrine-messenger.git", - "reference": "132e2a95ef2fa634d3280103f3fb07ab76daf3e1" + "reference": "b7eb1454e806f94c1a4eac5225b3e9d116ad4d22" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/132e2a95ef2fa634d3280103f3fb07ab76daf3e1", - "reference": "132e2a95ef2fa634d3280103f3fb07ab76daf3e1", + "url": "https://api.github.com/repos/symfony/doctrine-messenger/zipball/b7eb1454e806f94c1a4eac5225b3e9d116ad4d22", + "reference": "b7eb1454e806f94c1a4eac5225b3e9d116ad4d22", "shasum": "" }, "require": { @@ -10216,7 +10245,7 @@ "description": "Symfony Doctrine Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.30" + "source": "https://github.com/symfony/doctrine-messenger/tree/v5.4.34" }, "funding": [ { @@ -10232,20 +10261,20 @@ "type": "tidelift" } ], - "time": "2023-10-25T13:42:14+00:00" + "time": "2023-12-24T09:04:02+00:00" }, { "name": "symfony/dotenv", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/dotenv.git", - "reference": "ceed2cd28442adcf3679a9a82dacd45baeefc458" + "reference": "07d75571cc7efc88f1aae96eddc5f671826c7327" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/dotenv/zipball/ceed2cd28442adcf3679a9a82dacd45baeefc458", - "reference": "ceed2cd28442adcf3679a9a82dacd45baeefc458", + "url": "https://api.github.com/repos/symfony/dotenv/zipball/07d75571cc7efc88f1aae96eddc5f671826c7327", + "reference": "07d75571cc7efc88f1aae96eddc5f671826c7327", "shasum": "" }, "require": { @@ -10287,7 +10316,7 @@ "environment" ], "support": { - "source": "https://github.com/symfony/dotenv/tree/v5.4.30" + "source": "https://github.com/symfony/dotenv/tree/v5.4.34" }, "funding": [ { @@ -10303,7 +10332,7 @@ "type": "tidelift" } ], - "time": "2023-10-26T16:37:39+00:00" + "time": "2023-12-28T12:17:46+00:00" }, { "name": "symfony/error-handler", @@ -10378,16 +10407,16 @@ }, { "name": "symfony/event-dispatcher", - "version": "v5.4.26", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac" + "reference": "e3bca343efeb613f843c254e7718ef17c9bdf7a3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/5dcc00e03413f05c1e7900090927bb7247cb0aac", - "reference": "5dcc00e03413f05c1e7900090927bb7247cb0aac", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/e3bca343efeb613f843c254e7718ef17c9bdf7a3", + "reference": "e3bca343efeb613f843c254e7718ef17c9bdf7a3", "shasum": "" }, "require": { @@ -10443,7 +10472,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.26" + "source": "https://github.com/symfony/event-dispatcher/tree/v5.4.34" }, "funding": [ { @@ -10459,7 +10488,7 @@ "type": "tidelift" } ], - "time": "2023-07-06T06:34:20+00:00" + "time": "2023-12-27T21:12:56+00:00" }, { "name": "symfony/event-dispatcher-contracts", @@ -10669,16 +10698,16 @@ }, { "name": "symfony/framework-bundle", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/framework-bundle.git", - "reference": "896ce662696a89e44ea38972df5e6263ddd02c74" + "reference": "ee446bb6a89ec758ffc1614f54c003124c7d7a88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/896ce662696a89e44ea38972df5e6263ddd02c74", - "reference": "896ce662696a89e44ea38972df5e6263ddd02c74", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/ee446bb6a89ec758ffc1614f54c003124c7d7a88", + "reference": "ee446bb6a89ec758ffc1614f54c003124c7d7a88", "shasum": "" }, "require": { @@ -10706,7 +10735,7 @@ "phpdocumentor/reflection-docblock": "<3.2.2", "phpdocumentor/type-resolver": "<1.4.0", "symfony/asset": "<5.3", - "symfony/console": "<5.2.5", + "symfony/console": "<5.2.5|>=7.0", "symfony/dom-crawler": "<4.4", "symfony/dotenv": "<5.1", "symfony/form": "<5.2", @@ -10799,7 +10828,7 @@ "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/framework-bundle/tree/v5.4.30" + "source": "https://github.com/symfony/framework-bundle/tree/v5.4.34" }, "funding": [ { @@ -10815,20 +10844,20 @@ "type": "tidelift" } ], - "time": "2023-10-26T16:43:35+00:00" + "time": "2023-12-29T14:52:40+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "671769f79de0532da1478c60968b42506e185d2e" + "reference": "4da1713e88cf9c44bd4bf65f54772681222fcbec" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/671769f79de0532da1478c60968b42506e185d2e", - "reference": "671769f79de0532da1478c60968b42506e185d2e", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/4da1713e88cf9c44bd4bf65f54772681222fcbec", + "reference": "4da1713e88cf9c44bd4bf65f54772681222fcbec", "shasum": "" }, "require": { @@ -10875,7 +10904,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.4.30" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.34" }, "funding": [ { @@ -10891,20 +10920,20 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:35:12+00:00" + "time": "2023-12-27T11:45:35+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "16b9b36f81631155546d9f05271dd027c83c3dd4" + "reference": "f2b00c66d1c7ef12f3fc625af2a0bc5d5857db7b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/16b9b36f81631155546d9f05271dd027c83c3dd4", - "reference": "16b9b36f81631155546d9f05271dd027c83c3dd4", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f2b00c66d1c7ef12f3fc625af2a0bc5d5857db7b", + "reference": "f2b00c66d1c7ef12f3fc625af2a0bc5d5857db7b", "shasum": "" }, "require": { @@ -10987,7 +11016,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.4.30" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.34" }, "funding": [ { @@ -11003,7 +11032,7 @@ "type": "tidelift" } ], - "time": "2023-10-29T00:07:40+00:00" + "time": "2023-12-30T13:02:02+00:00" }, { "name": "symfony/inflector", @@ -11169,16 +11198,16 @@ }, { "name": "symfony/lock", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/lock.git", - "reference": "759554c1831c8ef11ce36c9cebc32ad977ca518c" + "reference": "26ff165e2b501ff7ead2f30a02f7e0eb0975866e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/lock/zipball/759554c1831c8ef11ce36c9cebc32ad977ca518c", - "reference": "759554c1831c8ef11ce36c9cebc32ad977ca518c", + "url": "https://api.github.com/repos/symfony/lock/zipball/26ff165e2b501ff7ead2f30a02f7e0eb0975866e", + "reference": "26ff165e2b501ff7ead2f30a02f7e0eb0975866e", "shasum": "" }, "require": { @@ -11228,7 +11257,7 @@ "semaphore" ], "support": { - "source": "https://github.com/symfony/lock/tree/v5.4.30" + "source": "https://github.com/symfony/lock/tree/v5.4.34" }, "funding": [ { @@ -11244,20 +11273,20 @@ "type": "tidelift" } ], - "time": "2023-10-28T23:35:12+00:00" + "time": "2023-12-18T14:56:06+00:00" }, { "name": "symfony/mailer", - "version": "v5.4.22", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/mailer.git", - "reference": "6330cd465dfd8b7a07515757a1c37069075f7b0b" + "reference": "0d2c0e0fdd07c80d95eadcdbba6af41e9aafcfa5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mailer/zipball/6330cd465dfd8b7a07515757a1c37069075f7b0b", - "reference": "6330cd465dfd8b7a07515757a1c37069075f7b0b", + "url": "https://api.github.com/repos/symfony/mailer/zipball/0d2c0e0fdd07c80d95eadcdbba6af41e9aafcfa5", + "reference": "0d2c0e0fdd07c80d95eadcdbba6af41e9aafcfa5", "shasum": "" }, "require": { @@ -11304,7 +11333,7 @@ "description": "Helps sending emails", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/mailer/tree/v5.4.22" + "source": "https://github.com/symfony/mailer/tree/v5.4.34" }, "funding": [ { @@ -11320,20 +11349,20 @@ "type": "tidelift" } ], - "time": "2023-03-10T10:15:32+00:00" + "time": "2023-12-02T08:41:43+00:00" }, { "name": "symfony/messenger", - "version": "v5.4.30", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/messenger.git", - "reference": "f6c4ec041891b92e81dc422eba0ff88dafb57487" + "reference": "8f74256d181141d83649e9bee5caf34328feb3c8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/messenger/zipball/f6c4ec041891b92e81dc422eba0ff88dafb57487", - "reference": "f6c4ec041891b92e81dc422eba0ff88dafb57487", + "url": "https://api.github.com/repos/symfony/messenger/zipball/8f74256d181141d83649e9bee5caf34328feb3c8", + "reference": "8f74256d181141d83649e9bee5caf34328feb3c8", "shasum": "" }, "require": { @@ -11394,7 +11423,7 @@ "description": "Helps applications send and receive messages to/from other applications or via message queues", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/messenger/tree/v5.4.30" + "source": "https://github.com/symfony/messenger/tree/v5.4.31" }, "funding": [ { @@ -11410,7 +11439,7 @@ "type": "tidelift" } ], - "time": "2023-10-26T16:43:35+00:00" + "time": "2023-11-03T16:16:43+00:00" }, { "name": "symfony/mime", @@ -11498,16 +11527,16 @@ }, { "name": "symfony/monolog-bridge", - "version": "v5.4.22", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/monolog-bridge.git", - "reference": "34be6f0695e4187dbb832a05905fb4c6581ac39a" + "reference": "3e295d9b0a873476356cb6cff0ce39b3f528b387" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/34be6f0695e4187dbb832a05905fb4c6581ac39a", - "reference": "34be6f0695e4187dbb832a05905fb4c6581ac39a", + "url": "https://api.github.com/repos/symfony/monolog-bridge/zipball/3e295d9b0a873476356cb6cff0ce39b3f528b387", + "reference": "3e295d9b0a873476356cb6cff0ce39b3f528b387", "shasum": "" }, "require": { @@ -11562,7 +11591,7 @@ "description": "Provides integration for Monolog with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.22" + "source": "https://github.com/symfony/monolog-bridge/tree/v5.4.31" }, "funding": [ { @@ -11578,7 +11607,7 @@ "type": "tidelift" } ], - "time": "2023-03-06T21:29:33+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/monolog-bundle", @@ -11732,16 +11761,16 @@ }, { "name": "symfony/password-hasher", - "version": "v5.4.29", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/password-hasher.git", - "reference": "57cd0369af1a92b87c1e960251ebdf9457225bfd" + "reference": "f1a07181f3442836b0aadfd4c65841804d4173c4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/password-hasher/zipball/57cd0369af1a92b87c1e960251ebdf9457225bfd", - "reference": "57cd0369af1a92b87c1e960251ebdf9457225bfd", + "url": "https://api.github.com/repos/symfony/password-hasher/zipball/f1a07181f3442836b0aadfd4c65841804d4173c4", + "reference": "f1a07181f3442836b0aadfd4c65841804d4173c4", "shasum": "" }, "require": { @@ -11786,7 +11815,7 @@ "password" ], "support": { - "source": "https://github.com/symfony/password-hasher/tree/v5.4.29" + "source": "https://github.com/symfony/password-hasher/tree/v5.4.31" }, "funding": [ { @@ -11802,7 +11831,7 @@ "type": "tidelift" } ], - "time": "2023-09-19T07:33:45+00:00" + "time": "2023-11-02T10:18:11+00:00" }, { "name": "symfony/polyfill-ctype", @@ -12608,16 +12637,16 @@ }, { "name": "symfony/process", - "version": "v5.4.28", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b" + "reference": "8fa22178dfc368911dbd513b431cd9b06f9afe7a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", - "reference": "45261e1fccad1b5447a8d7a8e67aa7b4a9798b7b", + "url": "https://api.github.com/repos/symfony/process/zipball/8fa22178dfc368911dbd513b431cd9b06f9afe7a", + "reference": "8fa22178dfc368911dbd513b431cd9b06f9afe7a", "shasum": "" }, "require": { @@ -12650,7 +12679,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.4.28" + "source": "https://github.com/symfony/process/tree/v5.4.34" }, "funding": [ { @@ -12666,7 +12695,7 @@ "type": "tidelift" } ], - "time": "2023-08-07T10:36:04+00:00" + "time": "2023-12-02T08:41:43+00:00" }, { "name": "symfony/property-access", @@ -13067,16 +13096,16 @@ }, { "name": "symfony/redis-messenger", - "version": "v5.4.26", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/redis-messenger.git", - "reference": "55258642bca0d1869d147c85ee3277305549d5a3" + "reference": "d1a86778fc6386203bc0321a8692622042eb6c6b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/55258642bca0d1869d147c85ee3277305549d5a3", - "reference": "55258642bca0d1869d147c85ee3277305549d5a3", + "url": "https://api.github.com/repos/symfony/redis-messenger/zipball/d1a86778fc6386203bc0321a8692622042eb6c6b", + "reference": "d1a86778fc6386203bc0321a8692622042eb6c6b", "shasum": "" }, "require": { @@ -13114,7 +13143,7 @@ "description": "Symfony Redis extension Messenger Bridge", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/redis-messenger/tree/v5.4.26" + "source": "https://github.com/symfony/redis-messenger/tree/v5.4.34" }, "funding": [ { @@ -13130,20 +13159,20 @@ "type": "tidelift" } ], - "time": "2023-07-19T20:11:33+00:00" + "time": "2023-12-11T13:52:49+00:00" }, { "name": "symfony/routing", - "version": "v5.4.26", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "853fc7df96befc468692de0a48831b38f04d2cb2" + "reference": "f1d08ed59d7718845bb70acd7480fa7da8966ec0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/853fc7df96befc468692de0a48831b38f04d2cb2", - "reference": "853fc7df96befc468692de0a48831b38f04d2cb2", + "url": "https://api.github.com/repos/symfony/routing/zipball/f1d08ed59d7718845bb70acd7480fa7da8966ec0", + "reference": "f1d08ed59d7718845bb70acd7480fa7da8966ec0", "shasum": "" }, "require": { @@ -13204,7 +13233,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.4.26" + "source": "https://github.com/symfony/routing/tree/v5.4.34" }, "funding": [ { @@ -13220,7 +13249,7 @@ "type": "tidelift" } ], - "time": "2023-07-24T13:28:37+00:00" + "time": "2023-12-27T12:51:02+00:00" }, { "name": "symfony/security-core", @@ -13390,16 +13419,16 @@ }, { "name": "symfony/serializer", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/serializer.git", - "reference": "ceadb4e08830e69738d313b667cfb426269f67f6" + "reference": "b8353e4208e9161f34d22c4631c63404b26ba929" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/serializer/zipball/ceadb4e08830e69738d313b667cfb426269f67f6", - "reference": "ceadb4e08830e69738d313b667cfb426269f67f6", + "url": "https://api.github.com/repos/symfony/serializer/zipball/b8353e4208e9161f34d22c4631c63404b26ba929", + "reference": "b8353e4208e9161f34d22c4631c63404b26ba929", "shasum": "" }, "require": { @@ -13473,7 +13502,7 @@ "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/serializer/tree/v5.4.30" + "source": "https://github.com/symfony/serializer/tree/v5.4.34" }, "funding": [ { @@ -13489,7 +13518,7 @@ "type": "tidelift" } ], - "time": "2023-10-25T18:53:19+00:00" + "time": "2023-12-27T08:53:17+00:00" }, { "name": "symfony/service-contracts", @@ -13634,16 +13663,16 @@ }, { "name": "symfony/string", - "version": "v5.4.29", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d" + "reference": "e3f98bfc7885c957488f443df82d97814a3ce061" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/e41bdc93def20eaf3bfc1537c4e0a2b0680a152d", - "reference": "e41bdc93def20eaf3bfc1537c4e0a2b0680a152d", + "url": "https://api.github.com/repos/symfony/string/zipball/e3f98bfc7885c957488f443df82d97814a3ce061", + "reference": "e3f98bfc7885c957488f443df82d97814a3ce061", "shasum": "" }, "require": { @@ -13700,7 +13729,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.4.29" + "source": "https://github.com/symfony/string/tree/v5.4.34" }, "funding": [ { @@ -13716,20 +13745,20 @@ "type": "tidelift" } ], - "time": "2023-09-13T11:47:41+00:00" + "time": "2023-12-09T13:20:28+00:00" }, { "name": "symfony/translation", - "version": "v5.4.30", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "8560dc532e4e48d331937532a7cbfd2a9f9f53ce" + "reference": "ba72f72fceddf36f00bd495966b5873f2d17ad8f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/8560dc532e4e48d331937532a7cbfd2a9f9f53ce", - "reference": "8560dc532e4e48d331937532a7cbfd2a9f9f53ce", + "url": "https://api.github.com/repos/symfony/translation/zipball/ba72f72fceddf36f00bd495966b5873f2d17ad8f", + "reference": "ba72f72fceddf36f00bd495966b5873f2d17ad8f", "shasum": "" }, "require": { @@ -13797,7 +13826,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.4.30" + "source": "https://github.com/symfony/translation/tree/v5.4.31" }, "funding": [ { @@ -13813,7 +13842,7 @@ "type": "tidelift" } ], - "time": "2023-10-28T09:19:54+00:00" + "time": "2023-11-03T16:16:43+00:00" }, { "name": "symfony/translation-contracts", @@ -13895,16 +13924,16 @@ }, { "name": "symfony/twig-bridge", - "version": "v5.4.29", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/twig-bridge.git", - "reference": "8e94856da373b63e7ba69e51a6c4f834d991cd58" + "reference": "4ced0e91705d689b77763678367bd522d79f9f9a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/8e94856da373b63e7ba69e51a6c4f834d991cd58", - "reference": "8e94856da373b63e7ba69e51a6c4f834d991cd58", + "url": "https://api.github.com/repos/symfony/twig-bridge/zipball/4ced0e91705d689b77763678367bd522d79f9f9a", + "reference": "4ced0e91705d689b77763678367bd522d79f9f9a", "shasum": "" }, "require": { @@ -13996,7 +14025,7 @@ "description": "Provides integration for Twig with various Symfony components", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bridge/tree/v5.4.29" + "source": "https://github.com/symfony/twig-bridge/tree/v5.4.34" }, "funding": [ { @@ -14012,20 +14041,20 @@ "type": "tidelift" } ], - "time": "2023-09-06T21:54:06+00:00" + "time": "2023-12-15T11:59:38+00:00" }, { "name": "symfony/twig-bundle", - "version": "v5.4.27", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/twig-bundle.git", - "reference": "a16996ad54d75e220e91a0c7517437ad592eccca" + "reference": "62e3505a62f482a577f55ba08747dc6a3b7463b3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/a16996ad54d75e220e91a0c7517437ad592eccca", - "reference": "a16996ad54d75e220e91a0c7517437ad592eccca", + "url": "https://api.github.com/repos/symfony/twig-bundle/zipball/62e3505a62f482a577f55ba08747dc6a3b7463b3", + "reference": "62e3505a62f482a577f55ba08747dc6a3b7463b3", "shasum": "" }, "require": { @@ -14086,7 +14115,7 @@ "description": "Provides a tight integration of Twig into the Symfony full-stack framework", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/twig-bundle/tree/v5.4.27" + "source": "https://github.com/symfony/twig-bundle/tree/v5.4.31" }, "funding": [ { @@ -14102,20 +14131,20 @@ "type": "tidelift" } ], - "time": "2023-07-28T14:44:35+00:00" + "time": "2023-10-31T07:58:33+00:00" }, { "name": "symfony/validator", - "version": "v5.4.30", + "version": "v5.4.34", "source": { "type": "git", "url": "https://github.com/symfony/validator.git", - "reference": "ce65d7802d78e43d46669bfa08521bf6104880f0" + "reference": "0700751f19b5e8dcfadb6614662216a93f37e2dd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/validator/zipball/ce65d7802d78e43d46669bfa08521bf6104880f0", - "reference": "ce65d7802d78e43d46669bfa08521bf6104880f0", + "url": "https://api.github.com/repos/symfony/validator/zipball/0700751f19b5e8dcfadb6614662216a93f37e2dd", + "reference": "0700751f19b5e8dcfadb6614662216a93f37e2dd", "shasum": "" }, "require": { @@ -14198,7 +14227,7 @@ "description": "Provides tools to validate values", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/validator/tree/v5.4.30" + "source": "https://github.com/symfony/validator/tree/v5.4.34" }, "funding": [ { @@ -14214,7 +14243,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T07:38:31+00:00" + "time": "2023-12-29T15:57:36+00:00" }, { "name": "symfony/var-dumper", @@ -14307,16 +14336,16 @@ }, { "name": "symfony/var-exporter", - "version": "v5.4.26", + "version": "v5.4.32", "source": { "type": "git", "url": "https://github.com/symfony/var-exporter.git", - "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a" + "reference": "fdb022f0d3d41df240c18e2eb9a117c430f06add" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-exporter/zipball/11401fe94f960249b3c63a488c63ba73091c1e4a", - "reference": "11401fe94f960249b3c63a488c63ba73091c1e4a", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/fdb022f0d3d41df240c18e2eb9a117c430f06add", + "reference": "fdb022f0d3d41df240c18e2eb9a117c430f06add", "shasum": "" }, "require": { @@ -14360,7 +14389,7 @@ "serialize" ], "support": { - "source": "https://github.com/symfony/var-exporter/tree/v5.4.26" + "source": "https://github.com/symfony/var-exporter/tree/v5.4.32" }, "funding": [ { @@ -14376,20 +14405,20 @@ "type": "tidelift" } ], - "time": "2023-07-20T07:21:16+00:00" + "time": "2023-11-16T19:33:05+00:00" }, { "name": "symfony/yaml", - "version": "v5.4.30", + "version": "v5.4.31", "source": { "type": "git", "url": "https://github.com/symfony/yaml.git", - "reference": "c6980e82a6656f6ebfabfd82f7585794cb122554" + "reference": "f387675d7f5fc4231f7554baa70681f222f73563" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/yaml/zipball/c6980e82a6656f6ebfabfd82f7585794cb122554", - "reference": "c6980e82a6656f6ebfabfd82f7585794cb122554", + "url": "https://api.github.com/repos/symfony/yaml/zipball/f387675d7f5fc4231f7554baa70681f222f73563", + "reference": "f387675d7f5fc4231f7554baa70681f222f73563", "shasum": "" }, "require": { @@ -14435,7 +14464,7 @@ "description": "Loads and dumps YAML files", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/yaml/tree/v5.4.30" + "source": "https://github.com/symfony/yaml/tree/v5.4.31" }, "funding": [ { @@ -14451,7 +14480,7 @@ "type": "tidelift" } ], - "time": "2023-10-27T18:36:14+00:00" + "time": "2023-11-03T14:41:28+00:00" }, { "name": "tecnickcom/tcpdf", @@ -14666,16 +14695,16 @@ }, { "name": "theseer/tokenizer", - "version": "1.2.1", + "version": "1.2.2", "source": { "type": "git", "url": "https://github.com/theseer/tokenizer.git", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e" + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/theseer/tokenizer/zipball/34a41e998c2183e22995f158c581e7b5e755ab9e", - "reference": "34a41e998c2183e22995f158c581e7b5e755ab9e", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/b2ad5003ca10d4ee50a12da31de12a5774ba6b96", + "reference": "b2ad5003ca10d4ee50a12da31de12a5774ba6b96", "shasum": "" }, "require": { @@ -14704,7 +14733,7 @@ "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", "support": { "issues": "https://github.com/theseer/tokenizer/issues", - "source": "https://github.com/theseer/tokenizer/tree/1.2.1" + "source": "https://github.com/theseer/tokenizer/tree/1.2.2" }, "funding": [ { @@ -14712,7 +14741,7 @@ "type": "github" } ], - "time": "2021-07-28T10:34:58+00:00" + "time": "2023-11-20T00:12:19+00:00" }, { "name": "true/punycode", diff --git a/makefile b/makefile index 91afda248..49598c169 100644 --- a/makefile +++ b/makefile @@ -32,7 +32,7 @@ prod: ##1 Installs all production dependencies @composer validate @composer install --no-dev cd src/Resources/app/administration && npm install --omit=dev - cd src/Resources/app/storefront && npm install --production + cd src/Resources/app/storefront && npm install --omit=dev dev: ##1 Installs all dev dependencies php switch-composer.php dev @@ -40,7 +40,7 @@ dev: ##1 Installs all dev dependencies @composer install cd src/Resources/app/administration && npm install cd src/Resources/app/storefront && npm install - curl -1sLf 'https://dl.cloudsmith.io/public/friendsofshopware/stable/setup.deb.sh' | sudo -E bash && sudo apt install shopware-cli + curl -1sLf 'https://dl.cloudsmith.io/public/friendsofshopware/stable/setup.deb.sh' | sudo -E bash && sudo apt install -y --allow-downgrades shopware-cli=0.3.18 install: ##1 [deprecated] Installs all production dependencies. Please use "make prod" now. @make prod -B @@ -56,16 +56,18 @@ clean: ##1 Cleans all dependencies and files rm -rf ./src/Resources/app/storefront/dist/storefront # ------------------------------------------------------ rm -rf ./src/Resources/public/administration - rm -rf ./src/Resources/public/molllie-payments.js + rm -rf ./src/Resources/public/mollie-payments.js build: ##3 Installs the plugin, and builds the artifacts using the Shopware build commands. - php switch-composer.php prod - cd ../../.. && export NODE_OPTIONS=--openssl-legacy-provider && shopware-cli extension build custom/plugins/MolliePayments - php switch-composer.php dev # ----------------------------------------------------- # CUSTOM WEBPACK + php switch-composer.php dev cd ./src/Resources/app/storefront && make build -B # ----------------------------------------------------- + php switch-composer.php prod + cd ../../.. && export NODE_OPTIONS=--openssl-legacy-provider && shopware-cli extension build custom/plugins/MolliePayments + php switch-composer.php dev + # ----------------------------------------------------- cd ../../.. && php bin/console --no-debug theme:refresh cd ../../.. && php bin/console --no-debug theme:compile cd ../../.. && php bin/console --no-debug theme:refresh diff --git a/src/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderAction.php b/src/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderAction.php index 7ffe3448f..dc1a54993 100644 --- a/src/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderAction.php +++ b/src/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderAction.php @@ -2,9 +2,7 @@ namespace Kiener\MolliePayments\Compatibility\Bundles\FlowBuilder\Actions; -use Kiener\MolliePayments\Facade\MollieShipment; -use Kiener\MolliePayments\Facade\MollieShipmentInterface; -use Kiener\MolliePayments\Service\OrderService; +use Kiener\MolliePayments\Components\ShipmentManager\ShipmentManagerInterface; use Kiener\MolliePayments\Service\OrderServiceInterface; use Psr\Log\LoggerInterface; use Shopware\Core\Content\Flow\Dispatching\Action\FlowAction; @@ -27,20 +25,20 @@ class ShipOrderAction extends FlowAction implements EventSubscriberInterface private $orderService; /** - * @var MollieShipmentInterface + * @var ShipmentManagerInterface */ - private $shipmentFacade; + private $shipment; /** * @param OrderServiceInterface $orderService - * @param MollieShipmentInterface $shipment + * @param ShipmentManagerInterface $shipment * @param LoggerInterface $logger */ - public function __construct(OrderServiceInterface $orderService, MollieShipmentInterface $shipment, LoggerInterface $logger) + public function __construct(OrderServiceInterface $orderService, ShipmentManagerInterface $shipment, LoggerInterface $logger) { $this->orderService = $orderService; - $this->shipmentFacade = $shipment; + $this->shipment = $shipment; $this->logger = $logger; } @@ -122,13 +120,9 @@ private function shipOrder(string $orderId, Context $context): void $this->logger->info('Starting Shipment through Flow Builder Action for order: ' . $orderNumber); - $this->shipmentFacade->shipOrder( - $order, - '', - '', - '', - $context - ); + # ship (all or) the rest of the order without providing any specific tracking information. + # this will ensure tracking data is automatically taken from the order + $this->shipment->shipOrderRest($order, null, $context); } catch (\Exception $ex) { $this->logger->error( 'Error when shipping order with Flow Builder Action', diff --git a/src/Components/MollieLimits/Service/MollieLimitsRemover.php b/src/Components/MollieLimits/Service/MollieLimitsRemover.php index 06c7ca918..622dcc4e2 100644 --- a/src/Components/MollieLimits/Service/MollieLimitsRemover.php +++ b/src/Components/MollieLimits/Service/MollieLimitsRemover.php @@ -6,6 +6,7 @@ use Kiener\MolliePayments\Exception\MissingCartServiceException; use Kiener\MolliePayments\Exception\MissingRequestException; use Kiener\MolliePayments\Service\MollieApi\OrderDataExtractor; +use Kiener\MolliePayments\Service\MollieApi\OrderItemsExtractor; use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\Payment\Provider\ActivePaymentMethodsProviderInterface; use Kiener\MolliePayments\Service\Payment\Remover\PaymentMethodRemover; @@ -35,10 +36,10 @@ class MollieLimitsRemover extends PaymentMethodRemover * @param OrderService $orderService * @param SettingsService $settingsService * @param ActivePaymentMethodsProviderInterface $paymentMethodsProvider - * @param OrderDataExtractor $orderDataExtractor + * @param OrderItemsExtractor $orderDataExtractor * @param LoggerInterface $logger */ - public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, ActivePaymentMethodsProviderInterface $paymentMethodsProvider, OrderDataExtractor $orderDataExtractor, LoggerInterface $logger) + public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, ActivePaymentMethodsProviderInterface $paymentMethodsProvider, OrderItemsExtractor $orderDataExtractor, LoggerInterface $logger) { parent::__construct($container, $requestStack, $orderService, $settingsService, $orderDataExtractor, $logger); diff --git a/src/Components/RefundManager/DAL/RefundItem/RefundItemEntity.php b/src/Components/RefundManager/DAL/RefundItem/RefundItemEntity.php index cbf9ac211..0596561b5 100644 --- a/src/Components/RefundManager/DAL/RefundItem/RefundItemEntity.php +++ b/src/Components/RefundManager/DAL/RefundItem/RefundItemEntity.php @@ -175,7 +175,7 @@ public function setRefund(?RefundEntity $refund): void */ public function getLabel(): string { - return $this->label; + return (string) $this->label; } /** diff --git a/src/Components/ShipmentManager/Exceptions/NoDeliveriesFoundException.php b/src/Components/ShipmentManager/Exceptions/NoDeliveriesFoundException.php new file mode 100644 index 000000000..5edf344eb --- /dev/null +++ b/src/Components/ShipmentManager/Exceptions/NoDeliveriesFoundException.php @@ -0,0 +1,7 @@ +shopwareId = $shopwareId; + $this->quantity = $quantity; + } + + /** + * @return string + */ + public function getShopwareId(): string + { + return $this->shopwareId; + } + + /** + * @return int + */ + public function getQuantity(): int + { + return $this->quantity; + } +} diff --git a/src/Components/ShipmentManager/Models/TrackingData.php b/src/Components/ShipmentManager/Models/TrackingData.php new file mode 100644 index 000000000..b330e8782 --- /dev/null +++ b/src/Components/ShipmentManager/Models/TrackingData.php @@ -0,0 +1,58 @@ +carrier = $carrier; + $this->code = $code; + $this->trackingUrl = $trackingUrl; + } + + /** + * @return string + */ + public function getCarrier(): string + { + return $this->carrier; + } + + /** + * @return string + */ + public function getCode(): string + { + return $this->code; + } + + /** + * @return string + */ + public function getTrackingUrl(): string + { + return $this->trackingUrl; + } +} diff --git a/src/Components/ShipmentManager/ShipmentManager.php b/src/Components/ShipmentManager/ShipmentManager.php new file mode 100644 index 000000000..b06024d08 --- /dev/null +++ b/src/Components/ShipmentManager/ShipmentManager.php @@ -0,0 +1,405 @@ +deliveryTransitionService = $deliveryTransitionService; + $this->mollieApiOrderService = $mollieApiOrderService; + $this->shipmentService = $shipmentService; + $this->orderDeliveryService = $orderDeliveryService; + $this->orderService = $orderService; + $this->orderDataExtractor = $orderDataExtractor; + $this->orderItemsExtractor = $orderItemsExtractor; + $this->trackingFactory = $trackingFactory; + } + + + /** + * @param string $orderId + * @param Context $context + * @return array + */ + public function getStatus(string $orderId, Context $context): array + { + $order = $this->orderService->getOrder($orderId, $context); + $mollieOrderId = $this->orderService->getMollieOrderId($order); + + return $this->shipmentService->getStatus($mollieOrderId, $order->getSalesChannelId()); + } + + /** + * @param string $orderId + * @param Context $context + * @return array + */ + public function getTotals(string $orderId, Context $context): array + { + $order = $this->orderService->getOrder($orderId, $context); + $mollieOrderId = $this->orderService->getMollieOrderId($order); + + return $this->shipmentService->getTotals($mollieOrderId, $order->getSalesChannelId()); + } + + /** + * @param OrderEntity $order + * @param null|TrackingData $tracking + * @param array $shippingItems + * @param Context $context + * @throws NoDeliveriesFoundException + * @throws NoLineItemsProvidedException + * @return \Mollie\Api\Resources\Shipment + */ + public function shipOrder(OrderEntity $order, ?TrackingData $tracking, array $shippingItems, Context $context): \Mollie\Api\Resources\Shipment + { + if (empty($shippingItems)) { + throw new NoLineItemsProvidedException('Please provide a valid list of line items that should be shipped!'); + } + + + if ($tracking instanceof TrackingData) { + $trackingData = $this->trackingFactory->create( + $tracking->getCarrier(), + $tracking->getCode(), + $tracking->getTrackingUrl() + ); + } else { + $trackingData = $this->trackingFactory->trackingFromOrder($order); + } + + + $orderAttr = new OrderAttributes($order); + + $mollieOrderId = $orderAttr->getMollieOrderId(); + + $mollieShippingItems = []; + + # we have to look up our Mollie LineItem IDs from the order line items. + # so we iterate through both of our lists and search it + $orderLineItems = $order->getLineItems(); + + if ($orderLineItems instanceof OrderLineItemCollection) { + foreach ($shippingItems as $shippingItem) { + foreach ($orderLineItems as $orderLineItem) { + # now search the order line item by our provided shopware ID + if ($orderLineItem->getId() === $shippingItem->getShopwareId()) { + + # extract the Mollie order line ID from our custom fields + $attr = new OrderLineItemEntityAttributes($orderLineItem); + $mollieID = $attr->getMollieOrderLineID(); + + $mollieShippingItems[] = new MollieShippingItem( + $mollieID, + $shippingItem->getQuantity() + ); + + break; + } + } + } + } + + $shipment = $this->shipmentService->shipOrder( + $mollieOrderId, + $order->getSalesChannelId(), + $mollieShippingItems, + $trackingData + ); + + # -------------------------------------------------------------------------------------- + # post-shipping processing + + $this->transitionOrder($order, $mollieOrderId, $context); + + $this->markDeliveryCustomFields($order, $context); + + return $shipment; + } + + /** + * @param OrderEntity $order + * @param null|TrackingData $tracking + * @param Context $context + * @throws \Exception + * @return \Mollie\Api\Resources\Shipment + */ + public function shipOrderRest(OrderEntity $order, ?TrackingData $tracking, Context $context): \Mollie\Api\Resources\Shipment + { + if ($tracking instanceof TrackingData) { + $trackingData = $this->trackingFactory->create( + $tracking->getCarrier(), + $tracking->getCode(), + $tracking->getTrackingUrl() + ); + } else { + $trackingData = $this->trackingFactory->trackingFromOrder($order); + } + + $orderAttr = new OrderAttributes($order); + + $mollieOrderId = $orderAttr->getMollieOrderId(); + + # ship order with empty array + # so that the Mollie shipAll is being triggered + # which always ships everything or just the rest + $shipment = $this->shipmentService->shipOrder( + $mollieOrderId, + $order->getSalesChannelId(), + [], + $trackingData + ); + + # -------------------------------------------------------------------------------------- + # post-shipping processing + + $this->transitionOrder($order, $mollieOrderId, $context); + + $this->markDeliveryCustomFields($order, $context); + + return $shipment; + } + + /** + * @param OrderEntity $order + * @param string $itemIdentifier + * @param int $quantity + * @param null|TrackingData $tracking + * @param Context $context + * @throws \Exception + * @return \Mollie\Api\Resources\Shipment + */ + public function shipItem(OrderEntity $order, string $itemIdentifier, int $quantity, ?TrackingData $tracking, Context $context): \Mollie\Api\Resources\Shipment + { + $mollieOrderId = $this->orderService->getMollieOrderId($order); + + $lineItems = $this->findMatchingLineItems($order, $itemIdentifier, $context); + + if ($lineItems->count() > 1) { + throw new OrderLineItemFoundManyException($itemIdentifier); + } + + $lineItem = $lineItems->first(); + unset($lineItems); + + if (!$lineItem instanceof OrderLineItemEntity) { + throw new OrderLineItemNotFoundException($itemIdentifier); + } + + + if ($tracking instanceof TrackingData) { + $mollieTracking = $this->trackingFactory->create( + $tracking->getCarrier(), + $tracking->getCode(), + $tracking->getTrackingUrl() + ); + } else { + $mollieTracking = $this->trackingFactory->trackingFromOrder($order); + } + + $mollieOrderLineId = $this->orderService->getMollieOrderLineId($lineItem); + + # if we did not provide a quantity + # we ship everything that is left and shippable + if ($quantity === 0) { + $quantity = $this->mollieApiOrderService->getMollieOrderLine( + $mollieOrderId, + $mollieOrderLineId, + $order->getSalesChannelId() + )->shippableQuantity; + } + + $shipment = $this->shipmentService->shipItem( + $mollieOrderId, + $order->getSalesChannelId(), + $mollieOrderLineId, + $quantity, + $mollieTracking + ); + + # -------------------------------------------------------------------------------------- + # post-shipping processing + + $this->transitionOrder($order, $mollieOrderId, $context); + + $this->markDeliveryCustomFields($order, $context); + + return $shipment; + } + + /** + * @param OrderEntity $order + * @param string $mollieOrderId + * @param Context $context + * @return void + */ + private function transitionOrder(OrderEntity $order, string $mollieOrderId, Context $context): void + { + $delivery = $this->orderDataExtractor->extractDelivery($order, $context); + + # we need to see if our order is now "complete" + # if its complete it can be marked as fully shipped + # if not, then its only partially shipped + $mollieOrder = $this->mollieApiOrderService->getMollieOrder($mollieOrderId, $order->getSalesChannelId()); + + if ($mollieOrder->status === MollieStatus::COMPLETED) { + $this->deliveryTransitionService->shipDelivery($delivery, $context); + } else { + $this->deliveryTransitionService->partialShipDelivery($delivery, $context); + } + } + + /** + * @param OrderEntity $order + * @param Context $context + * @return void + */ + private function markDeliveryCustomFields(OrderEntity $order, Context $context) + { + $deliveries = $order->getDeliveries(); + + if (!$deliveries instanceof OrderDeliveryCollection) { + return; + } + + foreach ($deliveries as $delivery) { + $values = [ + CustomFieldsInterface::DELIVERY_SHIPPED => true + ]; + + $this->orderDeliveryService->updateCustomFields($delivery, $values, $context); + } + } + + /** + * Try to find lineItems matching the $itemIdentifier. Shopware does not have a unique human-readable identifier for + * order line items, so we have to check for several fields, like product number or the mollie order line id. + * + * @param OrderEntity $order + * @param string $itemIdentifier + * @param Context $context + * @return OrderLineItemCollection + */ + private function findMatchingLineItems(OrderEntity $order, string $itemIdentifier, Context $context): OrderLineItemCollection + { + return $this->orderItemsExtractor->extractLineItems($order)->filter(function ($lineItem) use ($itemIdentifier) { + /** @var OrderLineItemEntity $lineItem */ + + // Default Shopware: If the lineItem is of type "product" and has an associated ProductEntity, + // check if the itemIdentifier matches the product's product number. + if ($lineItem->getType() === LineItem::PRODUCT_LINE_ITEM_TYPE && + $lineItem->getProduct() instanceof ProductEntity && + $lineItem->getProduct()->getProductNumber() === $itemIdentifier) { + return true; + } + + // If it's not a "product" type lineItem, for example if it's a completely custom lineItem type, + // check if the payload has a productNumber in it that matches the itemIdentifier. + if (!empty($lineItem->getPayload()) && + array_key_exists('productNumber', $lineItem->getPayload()) && + $lineItem->getPayload()['productNumber'] === $itemIdentifier) { + return true; + } + + // Check itemIdentifier against the mollie order_line_id custom field + $customFields = $lineItem->getCustomFields() ?? []; + $mollieOrderLineId = $customFields[CustomFieldsInterface::MOLLIE_KEY]['order_line_id'] ?? null; + if (!is_null($mollieOrderLineId) && $mollieOrderLineId === $itemIdentifier) { + return true; + } + + // If it hasn't passed any of the above tests, check if the itemIdentifier is a valid Uuid... + if (!Uuid::isValid($itemIdentifier)) { + return false; + } + + // ... and then check if it matches the Id of the entity the lineItem is referencing, + // or if it matches the Id of the lineItem itself. + if ($lineItem->getReferencedId() === $itemIdentifier || $lineItem->getId() === $itemIdentifier) { + return true; + } + + // Otherwise, this lineItem does not match the itemIdentifier at all. + return false; + }); + } +} diff --git a/src/Components/ShipmentManager/ShipmentManagerInterface.php b/src/Components/ShipmentManager/ShipmentManagerInterface.php new file mode 100644 index 000000000..4e19520d2 --- /dev/null +++ b/src/Components/ShipmentManager/ShipmentManagerInterface.php @@ -0,0 +1,54 @@ + + */ + public function getStatus(string $orderId, Context $context): array; + + /** + * @param string $orderId + * @param Context $context + * @return array + */ + public function getTotals(string $orderId, Context $context): array; + + /** + * @param OrderEntity $order + * @param null|TrackingData $tracking + * @param ShipmentLineItem[] $shippingItems + * @param Context $context + * @return Shipment + */ + public function shipOrder(OrderEntity $order, ?TrackingData $tracking, array $shippingItems, Context $context): Shipment; + + /** + * @param OrderEntity $order + * @param null|TrackingData $tracking + * @param Context $context + * @return Shipment + */ + public function shipOrderRest(OrderEntity $order, ?TrackingData $tracking, Context $context): Shipment; + + /** + * @param OrderEntity $order + * @param string $itemIdentifier + * @param int $quantity + * @param null|TrackingData $tracking + * @param Context $context + * @return Shipment + */ + public function shipItem(OrderEntity $order, string $itemIdentifier, int $quantity, ?TrackingData $tracking, Context $context): Shipment; +} diff --git a/src/Components/Subscription/Services/PaymentMethodRemover/SubscriptionRemover.php b/src/Components/Subscription/Services/PaymentMethodRemover/SubscriptionRemover.php index b33329d26..4d81d3131 100644 --- a/src/Components/Subscription/Services/PaymentMethodRemover/SubscriptionRemover.php +++ b/src/Components/Subscription/Services/PaymentMethodRemover/SubscriptionRemover.php @@ -3,6 +3,7 @@ namespace Kiener\MolliePayments\Components\Subscription\Services\PaymentMethodRemover; use Kiener\MolliePayments\Service\MollieApi\OrderDataExtractor; +use Kiener\MolliePayments\Service\MollieApi\OrderItemsExtractor; use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\Payment\Remover\PaymentMethodRemover; use Kiener\MolliePayments\Service\SettingsService; @@ -39,10 +40,10 @@ class SubscriptionRemover extends PaymentMethodRemover * @param SettingsService $pluginSettings * @param OrderService $orderService * @param SettingsService $settingsService - * @param OrderDataExtractor $orderDataExtractor + * @param OrderItemsExtractor $orderDataExtractor * @param LoggerInterface $logger */ - public function __construct(ContainerInterface $container, RequestStack $requestStack, SettingsService $pluginSettings, OrderService $orderService, SettingsService $settingsService, OrderDataExtractor $orderDataExtractor, LoggerInterface $logger) + public function __construct(ContainerInterface $container, RequestStack $requestStack, SettingsService $pluginSettings, OrderService $orderService, SettingsService $settingsService, OrderItemsExtractor $orderDataExtractor, LoggerInterface $logger) { parent::__construct($container, $requestStack, $orderService, $settingsService, $orderDataExtractor, $logger); diff --git a/src/Components/Voucher/Service/VoucherRemover.php b/src/Components/Voucher/Service/VoucherRemover.php index 74e793273..31142b87f 100644 --- a/src/Components/Voucher/Service/VoucherRemover.php +++ b/src/Components/Voucher/Service/VoucherRemover.php @@ -5,6 +5,7 @@ use Kiener\MolliePayments\Service\Cart\Voucher\VoucherCartCollector; use Kiener\MolliePayments\Service\Cart\Voucher\VoucherService; use Kiener\MolliePayments\Service\MollieApi\OrderDataExtractor; +use Kiener\MolliePayments\Service\MollieApi\OrderItemsExtractor; use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\Payment\Remover\PaymentMethodRemover; use Kiener\MolliePayments\Service\SettingsService; @@ -34,10 +35,10 @@ class VoucherRemover extends PaymentMethodRemover * @param OrderService $orderService * @param SettingsService $settingsService * @param VoucherService $voucherService - * @param OrderDataExtractor $orderDataExtractor + * @param OrderItemsExtractor $orderDataExtractor * @param LoggerInterface $logger */ - public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, VoucherService $voucherService, OrderDataExtractor $orderDataExtractor, LoggerInterface $logger) + public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, VoucherService $voucherService, OrderItemsExtractor $orderDataExtractor, LoggerInterface $logger) { parent::__construct($container, $requestStack, $orderService, $settingsService, $orderDataExtractor, $logger); diff --git a/src/Controller/Api/Order/ShippingControllerBase.php b/src/Controller/Api/Order/ShippingControllerBase.php index 2796f58f6..5c6adc1fe 100644 --- a/src/Controller/Api/Order/ShippingControllerBase.php +++ b/src/Controller/Api/Order/ShippingControllerBase.php @@ -3,18 +3,24 @@ namespace Kiener\MolliePayments\Controller\Api\Order; use Exception; -use Kiener\MolliePayments\Facade\MollieShipment; +use Kiener\MolliePayments\Components\ShipmentManager\Models\ShipmentLineItem; +use Kiener\MolliePayments\Components\ShipmentManager\Models\TrackingData; +use Kiener\MolliePayments\Components\ShipmentManager\ShipmentManager; +use Kiener\MolliePayments\Service\OrderService; +use Kiener\MolliePayments\Struct\OrderLineItemEntity\OrderLineItemEntityAttributes; use Kiener\MolliePayments\Traits\Api\ApiTrait; use Mollie\Api\Resources\OrderLine; use Mollie\Api\Resources\Shipment; use Psr\Log\LoggerInterface; +use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection; +use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Framework\Context; -use Shopware\Core\Framework\Routing\Annotation\RouteScope; use Shopware\Core\Framework\ShopwareHttpException; use Shopware\Core\Framework\Validation\DataBag\QueryDataBag; use Shopware\Core\Framework\Validation\DataBag\RequestDataBag; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; class ShippingControllerBase extends AbstractController @@ -22,56 +28,288 @@ class ShippingControllerBase extends AbstractController use ApiTrait; /** - * @var MollieShipment + * @var ShipmentManager */ - private $shipmentFacade; + private $shipment; + + /** + * @var OrderService + */ + private $orderService; /** * @var LoggerInterface */ private $logger; + /** - * @param MollieShipment $shipmentFacade + * @param ShipmentManager $shipmentFacade + * @param OrderService $orderService * @param LoggerInterface $logger */ - public function __construct(MollieShipment $shipmentFacade, LoggerInterface $logger) + public function __construct(ShipmentManager $shipmentFacade, OrderService $orderService, LoggerInterface $logger) { - $this->shipmentFacade = $shipmentFacade; + $this->shipment = $shipmentFacade; + $this->orderService = $orderService; $this->logger = $logger; } + + /** + * @Route("/api/_action/mollie/ship/status", name="api.action.mollie.ship.status", methods={"POST"}) + * + * @param RequestDataBag $data + * @param Context $context + * @return JsonResponse + */ + public function status(RequestDataBag $data, Context $context): JsonResponse + { + return $this->getStatusResponse($data->get('orderId'), $context); + } + + /** + * @Route("/api/v{version}/_action/mollie/ship/status", name="api.action.mollie.ship.status.legacy", methods={"POST"}) + * + * @param RequestDataBag $data + * @param Context $context + * @return JsonResponse + */ + public function statusLegacy(RequestDataBag $data, Context $context): JsonResponse + { + return $this->getStatusResponse($data->get('orderId'), $context); + } + + /** + * @Route("/api/_action/mollie/ship/total", name="api.action.mollie.ship.total", methods={"POST"}) + * + * @param RequestDataBag $data + * @param Context $context + * @return JsonResponse + */ + public function total(RequestDataBag $data, Context $context): JsonResponse + { + return $this->getTotalResponse($data->get('orderId'), $context); + } + + /** + * @Route("/api/v{version}/_action/mollie/ship/total", name="api.action.mollie.ship.total.legacy", methods={"POST"}) + * + * @param RequestDataBag $data + * @param Context $context + * @return JsonResponse + */ + public function totalLegacy(RequestDataBag $data, Context $context): JsonResponse + { + return $this->getTotalResponse($data->get('orderId'), $context); + } + + + /** + * This is the custom operational route for shipping using the API. + * This shipment is based on ship all or rest of items automatically. + * It can be used by 3rd parties, ERP systems and more. + * + * @Route("/api/mollie/ship/order", name="api.mollie.ship.order", methods={"POST"}) + * + * @param Request $request + * @param Context $context + * @return JsonResponse + */ + public function shipOrderOperational(Request $request, Context $context): JsonResponse + { + $orderNumber = ''; + $trackingCarrier = ''; + $trackingCode = ''; + $trackingUrl = ''; + + try { + $content = (string)$request->getContent(); + $jsonData = json_decode($content, true); + + $orderNumber = (string)$jsonData['orderNumber']; + $trackingCarrier = (string)$jsonData['trackingCarrier']; + $trackingCode = (string)$jsonData['trackingCode']; + $trackingUrl = (string)$jsonData['trackingUrl']; + + if ($orderNumber === '') { + throw new \InvalidArgumentException('Missing Argument for Order Number!'); + } + + $order = $this->orderService->getOrderByNumber($orderNumber, $context); + + $tracking = new TrackingData($trackingCarrier, $trackingCode, $trackingUrl); + + $shipment = $this->shipment->shipOrderRest( + $order, + $tracking, + $context + ); + + return $this->shipmentToJson($shipment); + } catch (\Exception $e) { + $this->logger->error( + 'Error when shipping order: ' . $orderNumber, + [ + 'error' => $e + ] + ); + + $data = [ + 'orderNumber' => $orderNumber, + 'trackingCarrier' => $trackingCarrier, + 'trackingCode' => $trackingCode, + 'trackingUrl' => $trackingUrl, + ]; + + return $this->exceptionToJson($e, $data); + } + } + /** - * @Route("/api/mollie/ship/order", name="api.mollie.ship.order", methods={"GET"}) + * This is the custom operational route for shipping using the API. + * This shipment is based on ship all or rest of items automatically. + * It can be used by 3rd parties, ERP systems and more. + * This comes without tracking information. Please use the POST version. + * + * @Route("/api/mollie/ship/order", name="api.mollie.ship.order.deprecated", methods={"GET"}) * * @param QueryDataBag $query * @param Context $context * @return JsonResponse */ - public function shipOrderApi(QueryDataBag $query, Context $context): JsonResponse + public function shipOrderOperationalDeprecated(QueryDataBag $query, Context $context): JsonResponse { + $orderNumber = ''; + try { $orderNumber = $query->get('number'); - $trackingCarrier = $query->get('trackingCarrier', ''); - $trackingCode = $query->get('trackingCode', ''); - $trackingUrl = $query->get('trackingUrl', ''); if ($orderNumber === null) { throw new \InvalidArgumentException('Missing Argument for Order Number!'); } - $shipment = $this->shipmentFacade->shipOrderByOrderNumber( - $orderNumber, - $trackingCarrier, - $trackingCode, - $trackingUrl, + $order = $this->orderService->getOrderByNumber($orderNumber, $context); + + $shipment = $this->shipment->shipOrderRest( + $order, + null, $context ); return $this->shipmentToJson($shipment); } catch (\Exception $e) { + $this->logger->error( + 'Error when shipping order (deprecated): ' . $orderNumber, + [ + 'error' => $e + ] + ); + $data = [ 'orderNumber' => $orderNumber, + ]; + + return $this->exceptionToJson($e, $data); + } + } + + /** + * This is the custom operational route for batch shipping of orders using the API. + * This shipment requires a valid list of line items to be provided. + * It can be used by 3rd parties, ERP systems and more. + * + * @Route("/api/mollie/ship/order/batch", name="api.mollie.ship.order.batch", methods={"POST"}) + * + * @param Request $request + * @param Context $context + * @return JsonResponse + */ + public function shipOrderBatchOperational(Request $request, Context $context): JsonResponse + { + $orderNumber = ''; + $requestItems = []; + $trackingCarrier = ''; + $trackingCode = ''; + $trackingUrl = ''; + + try { + $content = (string)$request->getContent(); + $jsonData = json_decode($content, true); + + $orderNumber = (string)$jsonData['orderNumber']; + $requestItems = $jsonData['items']; + $trackingCarrier = (string)$jsonData['trackingCarrier']; + $trackingCode = (string)$jsonData['trackingCode']; + $trackingUrl = (string)$jsonData['trackingUrl']; + + if (!is_array($requestItems)) { + $requestItems = []; + } + + if ($orderNumber === '') { + throw new \InvalidArgumentException('Missing Argument for Order Number!'); + } + + if (empty($requestItems)) { + throw new \InvalidArgumentException('Missing Argument for Items!'); + } + + $order = $this->orderService->getOrderByNumber($orderNumber, $context); + + $orderItems = $order->getLineItems(); + + if (!$orderItems instanceof OrderLineItemCollection) { + throw new Exception('Shopware order does not have any line requestItems!'); + } + + $shipmentItems = []; + + # we need to look up the internal line item ids for the order + # because we are only provided product numbers + foreach ($orderItems as $orderItem) { + foreach ($requestItems as $requestItem) { + $orderItemAttr = new OrderLineItemEntityAttributes($orderItem); + + $productNumber = $requestItem['productNumber']; + $quantity = $requestItem['quantity']; + + # check if we have found our product by number + if ($orderItemAttr->getProductNumber() === $productNumber) { + $shipmentItems[] = new ShipmentLineItem( + $orderItem->getId(), + $quantity + ); + break; + } + } + } + + if (empty($shipmentItems)) { + throw new \InvalidArgumentException('Provided items have not been found in order!'); + } + + $tracking = new TrackingData($trackingCarrier, $trackingCode, $trackingUrl); + + $shipment = $this->shipment->shipOrder( + $order, + $tracking, + $shipmentItems, + $context + ); + + return $this->shipmentToJson($shipment); + } catch (\Exception $e) { + $this->logger->error( + 'Error when shipping batch order: ' . $orderNumber, + [ + 'error' => $e + ] + ); + + $data = [ + 'orderNumber' => $orderNumber, + 'items' => $requestItems, 'trackingCarrier' => $trackingCarrier, 'trackingCode' => $trackingCode, 'trackingUrl' => $trackingUrl, @@ -82,44 +320,65 @@ public function shipOrderApi(QueryDataBag $query, Context $context): JsonRespons } /** - * @Route("/api/mollie/ship/item", name="api.mollie.ship.item", methods={"GET"}) + * This is the custom operational route for shipping items using the API. + * It can be used by 3rd parties, ERP systems and more. * - * @param QueryDataBag $query + * @Route("/api/mollie/ship/item", name="api.mollie.ship.item", methods={"POST"}) + * + * @param Request $request * @param Context $context * @throws \Exception * @return JsonResponse */ - public function shipItemApi(QueryDataBag $query, Context $context): JsonResponse + public function shipItemOperational(Request $request, Context $context): JsonResponse { + $orderNumber = ''; + $itemIdentifier = ''; + $quantity = ''; + $trackingCarrier = ''; + $trackingCode = ''; + $trackingUrl = ''; + try { - $orderNumber = $query->get('order'); - $itemIdentifier = $query->get('item'); - $quantity = $query->getInt('quantity'); - $trackingCarrier = $query->get('trackingCarrier', ''); - $trackingCode = $query->get('trackingCode', ''); - $trackingUrl = $query->get('trackingUrl', ''); + $content = (string)$request->getContent(); + $jsonData = json_decode($content, true); + $orderNumber = (string)$jsonData['orderNumber']; + $itemProductNumber = (string)$jsonData['productNumber']; + $quantity = (int)$jsonData['quantity']; + $trackingCarrier = (string)$jsonData['trackingCarrier']; + $trackingCode = (string)$jsonData['trackingCode']; + $trackingUrl = (string)$jsonData['trackingUrl']; - if ($orderNumber === null) { + if ($orderNumber === '') { throw new \InvalidArgumentException('Missing Argument for Order Number!'); } - if ($itemIdentifier === null) { - throw new \InvalidArgumentException('Missing Argument for Item identifier!'); + if ($itemProductNumber === '') { + throw new \InvalidArgumentException('Missing Argument for item product number!'); } - $shipment = $this->shipmentFacade->shipItemByOrderNumber( - $orderNumber, - $itemIdentifier, + $order = $this->orderService->getOrderByNumber($orderNumber, $context); + + $tracking = new TrackingData($trackingCarrier, $trackingCode, $trackingUrl); + + $shipment = $this->shipment->shipItem( + $order, + $itemProductNumber, $quantity, - $trackingCarrier, - $trackingCode, - $trackingUrl, + $tracking, $context ); return $this->shipmentToJson($shipment); } catch (\Exception $e) { + $this->logger->error( + 'Error when shipping item of order: ' . $orderNumber, + [ + 'error' => $e + ] + ); + $data = [ 'orderNumber' => $orderNumber, 'item' => $itemIdentifier, @@ -133,160 +392,263 @@ public function shipItemApi(QueryDataBag $query, Context $context): JsonResponse } } - private function shipmentToJson(Shipment $shipment): JsonResponse + /** + * This is the custom operational route for shipping items using the API. + * It can be used by 3rd parties, ERP systems and more. + * This comes without tracking information. Please use the POST version. + * + * @Route("/api/mollie/ship/item", name="api.mollie.ship.item.deprecated", methods={"GET"}) + * + * @param QueryDataBag $query + * @param Context $context + * @throws \Exception + * @return JsonResponse + */ + public function shipItemOperationalDeprecated(QueryDataBag $query, Context $context): JsonResponse { - $lines = []; - /** @var OrderLine $orderLine */ - foreach ($shipment->lines() as $orderLine) { - $lines[] = [ - 'id' => $orderLine->id, - 'orderId' => $orderLine->orderId, - 'name' => $orderLine->name, - 'sku' => $orderLine->sku, - 'type' => $orderLine->type, - 'status' => $orderLine->status, - 'quantity' => $orderLine->quantity, - 'unitPrice' => (array)$orderLine->unitPrice, - 'vatRate' => $orderLine->vatRate, - 'vatAmount' => (array)$orderLine->vatAmount, - 'totalAmount' => (array)$orderLine->totalAmount, - 'createdAt' => $orderLine->createdAt + $orderNumber = ''; + $itemIdentifier = ''; + $quantity = ''; + + try { + $orderNumber = $query->get('order'); + $itemIdentifier = $query->get('item'); + $quantity = $query->getInt('quantity'); + + if ($orderNumber === '') { + throw new \InvalidArgumentException('Missing argument for Order Number!'); + } + + if ($itemIdentifier === '') { + throw new \InvalidArgumentException('Missing argument for Item identifier! Please provide a product number!'); + } + + $order = $this->orderService->getOrderByNumber($orderNumber, $context); + + $shipment = $this->shipment->shipItem( + $order, + $itemIdentifier, + $quantity, + null, + $context + ); + + return $this->shipmentToJson($shipment); + } catch (\Exception $e) { + $this->logger->error( + 'Error when shipping item of order (deprecated): ' . $orderNumber, + [ + 'error' => $e + ] + ); + + $data = [ + 'orderNumber' => $orderNumber, + 'item' => $itemIdentifier, + 'quantity' => $quantity, ]; - } - return $this->json([ - 'id' => $shipment->id, - 'orderId' => $shipment->orderId, - 'createdAt' => $shipment->createdAt, - 'lines' => $lines, - 'tracking' => $shipment->tracking - ]); + return $this->exceptionToJson($e, $data); + } } /** - * @param Exception $e - * @param array $additionalData + * This is the plain action API route that is used in the Shopware Administration. + * + * @Route("/api/_action/mollie/ship", name="api.action.mollie.ship.order", methods={"POST"}) + * + * @param RequestDataBag $data + * @param Context $context * @return JsonResponse */ - private function exceptionToJson(Exception $e, array $additionalData = []): JsonResponse + public function shipOrderAdmin(RequestDataBag $data, Context $context): JsonResponse { - $this->logger->error( - $e->getMessage(), - $additionalData - ); + $orderId = $data->getAlnum('orderId'); + $trackingCarrier = $data->get('trackingCarrier', ''); + $trackingCode = $data->get('trackingCode', ''); + $trackingUrl = $data->get('trackingUrl', ''); + $itemsBag = $data->get('items', []); + + $items = []; + if ($itemsBag instanceof RequestDataBag) { + $items = $itemsBag->all(); + } - return $this->json([ - 'error' => get_class($e), - 'message' => $e->getMessage(), - 'data' => $additionalData - ], 400); + return $this->processAdminShipOrder( + $orderId, + $trackingCarrier, + $trackingCode, + $trackingUrl, + $items, + $context + ); } - // Admin routes + /** + * @Route("/api/v{version}/_action/mollie/ship", name="api.action.mollie.ship.order.legacy", methods={"POST"}) + * + * @param RequestDataBag $data + * @param Context $context + * @return JsonResponse + */ + public function shipOrderAdminLegacy(RequestDataBag $data, Context $context): JsonResponse + { + $orderId = $data->getAlnum('orderId'); + $trackingCarrier = $data->get('trackingCarrier', ''); + $trackingCode = $data->get('trackingCode', ''); + $trackingUrl = $data->get('trackingUrl', ''); + $itemsBag = $data->get('items', []); + + $items = []; + if ($itemsBag instanceof RequestDataBag) { + $items = $itemsBag->all(); + } + + return $this->processAdminShipOrder( + $orderId, + $trackingCarrier, + $trackingCode, + $trackingUrl, + $items, + $context + ); + } /** - * @Route("/api/_action/mollie/ship", name="api.action.mollie.ship.order", methods={"POST"}) + * This is the plain action API route that is used in the Shopware Administration. + * + * @Route("/api/_action/mollie/ship/item", name="api.action.mollie.ship.item", methods={"POST"}) * * @param RequestDataBag $data * @param Context $context * @return JsonResponse */ - public function shipOrder(RequestDataBag $data, Context $context): JsonResponse + public function shipItemAdmin(RequestDataBag $data, Context $context): JsonResponse { - return $this->getShipOrderResponse( - $data->getAlnum('orderId'), - $data->get('trackingCarrier', ''), - $data->get('trackingCode', ''), - $data->get('trackingUrl', ''), + $orderId = $data->getAlnum('orderId'); + $itemId = $data->get('itemId', ''); + $quantity = $data->get('quantity', 0); + $trackingCarrier = $data->get('trackingCarrier', ''); + $trackingCode = $data->get('trackingCode', ''); + $trackingUrl = $data->get('trackingUrl', ''); + + return $this->processShipItem( + $orderId, + $itemId, + $quantity, + $trackingCarrier, + $trackingCode, + $trackingUrl, $context ); } /** - * @Route("/api/v{version}/_action/mollie/ship", name="api.action.mollie.ship.order.legacy", methods={"POST"}) + * @Route("/api/v{version}/_action/mollie/ship/item", name="api.action.mollie.ship.item.legacy", methods={"POST"}) * * @param RequestDataBag $data * @param Context $context * @return JsonResponse */ - public function shipOrderLegacy(RequestDataBag $data, Context $context): JsonResponse + public function shipItemAdminLegacy(RequestDataBag $data, Context $context): JsonResponse { - return $this->getShipOrderResponse( - $data->getAlnum('orderId'), - $data->get('trackingCarrier', ''), - $data->get('trackingCode', ''), - $data->get('trackingUrl', ''), + $orderId = $data->getAlnum('orderId'); + $itemId = $data->get('itemId', ''); + $quantity = $data->get('quantity', 0); + $trackingCarrier = $data->get('trackingCarrier', ''); + $trackingCode = $data->get('trackingCode', ''); + $trackingUrl = $data->get('trackingUrl', ''); + + return $this->processShipItem( + $orderId, + $itemId, + $quantity, + $trackingCarrier, + $trackingCode, + $trackingUrl, $context ); } + /** * @param string $orderId - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl * @param Context $context * @return JsonResponse */ - public function getShipOrderResponse(string $orderId, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): JsonResponse + private function getTotalResponse(string $orderId, Context $context): JsonResponse { try { - if (empty($orderId)) { - throw new \InvalidArgumentException('Missing Argument for Order ID!'); - } - - $shipment = $this->shipmentFacade->shipOrderByOrderId( - $orderId, - $trackingCarrier, - $trackingCode, - $trackingUrl, - $context - ); - - return $this->shipmentToJson($shipment); - } catch (\Exception $e) { - return $this->buildErrorResponse($e->getMessage()); + $totals = $this->shipment->getTotals($orderId, $context); + } catch (ShopwareHttpException $e) { + $this->logger->error($e->getMessage()); + return $this->json(['message' => $e->getMessage()], $e->getStatusCode()); + } catch (\Throwable $e) { + $this->logger->error($e->getMessage()); + return $this->json(['message' => $e->getMessage()], 500); } + + return $this->json($totals); } /** - * @Route("/api/_action/mollie/ship/item", name="api.action.mollie.ship.item", methods={"POST"}) - * - * @param RequestDataBag $data + * @param string $orderId * @param Context $context * @return JsonResponse */ - public function shipItem(RequestDataBag $data, Context $context): JsonResponse + private function getStatusResponse(string $orderId, Context $context): JsonResponse { - return $this->getShipItemResponse( - $data->getAlnum('orderId'), - $data->getAlnum('itemId'), - $data->getInt('quantity'), - $data->get('trackingCarrier', ''), - $data->get('trackingCode', ''), - $data->get('trackingUrl', ''), - $context - ); + try { + $status = $this->shipment->getStatus($orderId, $context); + } catch (ShopwareHttpException $e) { + $this->logger->error($e->getMessage()); + return $this->json(['message' => $e->getMessage()], $e->getStatusCode()); + } catch (\Throwable $e) { + $this->logger->error($e->getMessage()); + return $this->json(['message' => $e->getMessage()], 500); + } + + return $this->json($status); } /** - * @Route("/api/v{version}/_action/mollie/ship/item", name="api.action.mollie.ship.item.legacy", methods={"POST"}) - * - * @param RequestDataBag $data + * @param string $orderId + * @param string $trackingCarrier + * @param string $trackingCode + * @param string $trackingUrl + * @param array $lineItems * @param Context $context * @return JsonResponse */ - public function shipItemLegacy(RequestDataBag $data, Context $context): JsonResponse + private function processAdminShipOrder(string $orderId, string $trackingCarrier, string $trackingCode, string $trackingUrl, array $lineItems, Context $context): JsonResponse { - return $this->getShipItemResponse( - $data->getAlnum('orderId'), - $data->getAlnum('itemId'), - $data->getInt('quantity'), - $data->get('trackingCarrier', ''), - $data->get('trackingCode', ''), - $data->get('trackingUrl', ''), - $context - ); + try { + if (empty($orderId)) { + throw new \InvalidArgumentException('Missing Argument for Order ID!'); + } + + $order = $this->orderService->getOrder($orderId, $context); + + if (!$order instanceof OrderEntity) { + throw new \InvalidArgumentException('Order with ID: ' . $orderId . ' not found!'); + } + + # hydrate to our real item struct + $items = $this->hydrateShippingItems($lineItems); + + $tracking = new TrackingData($trackingCarrier, $trackingCode, $trackingUrl); + + $shipment = $this->shipment->shipOrder( + $order, + $tracking, + $items, + $context + ); + + return $this->shipmentToJson($shipment); + } catch (\Exception $e) { + return $this->buildErrorResponse($e->getMessage()); + } } /** @@ -299,15 +661,8 @@ public function shipItemLegacy(RequestDataBag $data, Context $context): JsonResp * @param Context $context * @return JsonResponse */ - public function getShipItemResponse( - string $orderId, - string $itemId, - int $quantity, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): JsonResponse { + private function processShipItem(string $orderId, string $itemId, int $quantity, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): JsonResponse + { try { if (empty($orderId)) { throw new \InvalidArgumentException('Missing Argument for Order ID!'); @@ -317,13 +672,19 @@ public function getShipItemResponse( throw new \InvalidArgumentException('Missing Argument for Item ID!'); } - $shipment = $this->shipmentFacade->shipItemByOrderId( - $orderId, + $order = $this->orderService->getOrder($orderId, $context); + + if (!$order instanceof OrderEntity) { + throw new \InvalidArgumentException('Order with id: ' . $orderId . ' not found!'); + } + + $tracking = new TrackingData($trackingCarrier, $trackingCode, $trackingUrl); + + $shipment = $this->shipment->shipItem( + $order, $itemId, $quantity, - $trackingCarrier, - $trackingCode, - $trackingUrl, + $tracking, $context ); @@ -343,90 +704,70 @@ public function getShipItemResponse( } /** - * @Route("/api/_action/mollie/ship/status", name="api.action.mollie.ship.status", methods={"POST"}) - * - * @param RequestDataBag $data - * @param Context $context - * @return JsonResponse - */ - public function status(RequestDataBag $data, Context $context): JsonResponse - { - return $this->getStatusResponse($data->get('orderId'), $context); - } - - /** - * @Route("/api/v{version}/_action/mollie/ship/status", name="api.action.mollie.ship.status.legacy", methods={"POST"}) - * - * @param RequestDataBag $data - * @param Context $context - * @return JsonResponse - */ - public function statusLegacy(RequestDataBag $data, Context $context): JsonResponse - { - return $this->getStatusResponse($data->get('orderId'), $context); - } - - /** - * @param string $orderId - * @param Context $context + * @param Shipment $shipment * @return JsonResponse */ - public function getStatusResponse(string $orderId, Context $context): JsonResponse + private function shipmentToJson(Shipment $shipment): JsonResponse { - try { - $status = $this->shipmentFacade->getStatus($orderId, $context); - } catch (ShopwareHttpException $e) { - $this->logger->error($e->getMessage()); - return $this->json(['message' => $e->getMessage()], $e->getStatusCode()); - } catch (\Throwable $e) { - $this->logger->error($e->getMessage()); - return $this->json(['message' => $e->getMessage()], 500); + $lines = []; + /** @var OrderLine $orderLine */ + foreach ($shipment->lines() as $orderLine) { + $lines[] = [ + 'id' => $orderLine->id, + 'orderId' => $orderLine->orderId, + 'name' => $orderLine->name, + 'sku' => $orderLine->sku, + 'type' => $orderLine->type, + 'status' => $orderLine->status, + 'quantity' => $orderLine->quantity, + 'unitPrice' => (array)$orderLine->unitPrice, + 'vatRate' => $orderLine->vatRate, + 'vatAmount' => (array)$orderLine->vatAmount, + 'totalAmount' => (array)$orderLine->totalAmount, + 'createdAt' => $orderLine->createdAt + ]; } - return $this->json($status); + return $this->json([ + 'id' => $shipment->id, + 'orderId' => $shipment->orderId, + 'createdAt' => $shipment->createdAt, + 'lines' => $lines, + 'tracking' => $shipment->tracking + ]); } /** - * @Route("/api/_action/mollie/ship/total", name="api.action.mollie.ship.total", methods={"POST"}) - * - * @param RequestDataBag $data - * @param Context $context + * @param Exception $e + * @param array $additionalData * @return JsonResponse */ - public function total(RequestDataBag $data, Context $context): JsonResponse + private function exceptionToJson(Exception $e, array $additionalData = []): JsonResponse { - return $this->getTotalResponse($data->get('orderId'), $context); - } + $this->logger->error( + $e->getMessage(), + $additionalData + ); - /** - * @Route("/api/v{version}/_action/mollie/ship/total", name="api.action.mollie.ship.total.legacy", methods={"POST"}) - * - * @param RequestDataBag $data - * @param Context $context - * @return JsonResponse - */ - public function totalLegacy(RequestDataBag $data, Context $context): JsonResponse - { - return $this->getTotalResponse($data->get('orderId'), $context); + return $this->json([ + 'error' => get_class($e), + 'message' => $e->getMessage(), + 'data' => $additionalData + ], 400); } /** - * @param string $orderId - * @param Context $context - * @return JsonResponse + * @param array $items + * @return ShipmentLineItem[] */ - public function getTotalResponse(string $orderId, Context $context): JsonResponse + private function hydrateShippingItems(array $items): array { - try { - $totals = $this->shipmentFacade->getTotals($orderId, $context); - } catch (ShopwareHttpException $e) { - $this->logger->error($e->getMessage()); - return $this->json(['message' => $e->getMessage()], $e->getStatusCode()); - } catch (\Throwable $e) { - $this->logger->error($e->getMessage()); - return $this->json(['message' => $e->getMessage()], 500); + $finalList = []; + + foreach ($items as $item) { + $finalList[] = new ShipmentLineItem($item['id'], $item['quantity']); } - return $this->json($totals); + return $finalList; } } diff --git a/src/Controller/Api/PluginConfig/ConfigControllerBase.php b/src/Controller/Api/PluginConfig/ConfigControllerBase.php index 09dea2bd5..88a1a5a9f 100644 --- a/src/Controller/Api/PluginConfig/ConfigControllerBase.php +++ b/src/Controller/Api/PluginConfig/ConfigControllerBase.php @@ -3,19 +3,11 @@ namespace Kiener\MolliePayments\Controller\Api\PluginConfig; use Exception; -use Kiener\MolliePayments\Facade\MollieShipment; -use Kiener\MolliePayments\Service\ConfigService; use Kiener\MolliePayments\Service\MollieApi\ApiKeyValidator; use Kiener\MolliePayments\Service\SettingsService; use Kiener\MolliePayments\Setting\MollieSettingStruct; -use Mollie\Api\MollieApiClient; -use Mollie\Api\Resources\Profile; use Shopware\Administration\Snippet\SnippetFinderInterface; -use Shopware\Core\Framework\Api\Context\AdminApiSource; -use Shopware\Core\Framework\Api\Context\Exception\InvalidContextSourceException; use Shopware\Core\Framework\Context; -use Shopware\Core\Framework\Routing\Annotation\RouteScope; -use Shopware\Core\Framework\Validation\DataBag\RequestDataBag; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\HttpFoundation\JsonResponse; use Symfony\Component\HttpFoundation\Request; diff --git a/src/Controller/Api/PluginConfig/Sw6/ConfigController.php b/src/Controller/Api/PluginConfig/Sw6/ConfigController.php index 51b78619c..fe2ec2cfe 100644 --- a/src/Controller/Api/PluginConfig/Sw6/ConfigController.php +++ b/src/Controller/Api/PluginConfig/Sw6/ConfigController.php @@ -2,24 +2,8 @@ namespace Kiener\MolliePayments\Controller\Api\PluginConfig\Sw6; -use Exception; use Kiener\MolliePayments\Controller\Api\PluginConfig\ConfigControllerBase; -use Kiener\MolliePayments\Facade\MollieShipment; -use Kiener\MolliePayments\Service\ConfigService; -use Kiener\MolliePayments\Service\MollieApi\ApiKeyValidator; -use Kiener\MolliePayments\Service\SettingsService; -use Kiener\MolliePayments\Setting\MollieSettingStruct; -use Mollie\Api\MollieApiClient; -use Mollie\Api\Resources\Profile; -use Shopware\Administration\Snippet\SnippetFinderInterface; -use Shopware\Core\Framework\Api\Context\AdminApiSource; -use Shopware\Core\Framework\Api\Context\Exception\InvalidContextSourceException; -use Shopware\Core\Framework\Context; use Shopware\Core\Framework\Routing\Annotation\RouteScope; -use Shopware\Core\Framework\Validation\DataBag\RequestDataBag; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; /** diff --git a/src/Controller/Api/PluginConfig/Sw65/ConfigController.php b/src/Controller/Api/PluginConfig/Sw65/ConfigController.php index c1e6f8c83..f9201a373 100644 --- a/src/Controller/Api/PluginConfig/Sw65/ConfigController.php +++ b/src/Controller/Api/PluginConfig/Sw65/ConfigController.php @@ -2,24 +2,7 @@ namespace Kiener\MolliePayments\Controller\Api\PluginConfig\Sw65; -use Exception; use Kiener\MolliePayments\Controller\Api\PluginConfig\ConfigControllerBase; -use Kiener\MolliePayments\Facade\MollieShipment; -use Kiener\MolliePayments\Service\ConfigService; -use Kiener\MolliePayments\Service\MollieApi\ApiKeyValidator; -use Kiener\MolliePayments\Service\SettingsService; -use Kiener\MolliePayments\Setting\MollieSettingStruct; -use Mollie\Api\MollieApiClient; -use Mollie\Api\Resources\Profile; -use Shopware\Administration\Snippet\SnippetFinderInterface; -use Shopware\Core\Framework\Api\Context\AdminApiSource; -use Shopware\Core\Framework\Api\Context\Exception\InvalidContextSourceException; -use Shopware\Core\Framework\Context; -use Shopware\Core\Framework\Routing\Annotation\RouteScope; -use Shopware\Core\Framework\Validation\DataBag\RequestDataBag; -use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; -use Symfony\Component\HttpFoundation\JsonResponse; -use Symfony\Component\HttpFoundation\Request; use Symfony\Component\Routing\Annotation\Route; /** diff --git a/src/Controller/StoreApi/Config/ConfigControllerBase.php b/src/Controller/StoreApi/Config/ConfigControllerBase.php new file mode 100644 index 000000000..b46f70e36 --- /dev/null +++ b/src/Controller/StoreApi/Config/ConfigControllerBase.php @@ -0,0 +1,95 @@ +settingsService = $settingsService; + $this->configService = $configService; + $this->salesChannelLocale = $salesChannelLocale; + $this->logger = $logger; + } + + + /** + * @Route("/store-api/mollie/config", name="store-api.mollie.config", methods={"GET"}) + * + * @param SalesChannelContext $context + * @throws \Exception + * @return StoreApiResponse + */ + public function getConfig(SalesChannelContext $context): StoreApiResponse + { + try { + $scId = $context->getSalesChannelId(); + + $settings = $this->settingsService->getSettings($scId); + + $profileId = (string)$settings->getProfileId(); + $locale = $this->salesChannelLocale->getLocale($context); + + if (empty($profileId)) { + # if its somehow not yet loaded (plugin config in admin when clicking save) + # then load it right now + $this->configService->fetchProfileId($scId); + + $settings = $this->settingsService->getSettings($scId); + $profileId = (string)$settings->getProfileId(); + } + + return new ConfigResponse( + $profileId, + $settings->isTestMode(), + $locale, + $settings->isOneClickPaymentsEnabled() + ); + } catch (\Exception $e) { + $this->logger->error( + 'Error when fetching config in Store API: ' . $e->getMessage(), + [ + 'error' => $e, + ] + ); + + throw $e; + } + } +} diff --git a/src/Controller/StoreApi/Config/Response/ConfigResponse.php b/src/Controller/StoreApi/Config/Response/ConfigResponse.php new file mode 100644 index 000000000..aff8a3ac7 --- /dev/null +++ b/src/Controller/StoreApi/Config/Response/ConfigResponse.php @@ -0,0 +1,36 @@ + + */ + protected $object; + + + /** + * @param string $profileId + * @param bool $isTestMode + * @param string $defaultLocale + * @param bool $oneClickEnabled + */ + public function __construct(string $profileId, bool $isTestMode, string $defaultLocale, bool $oneClickEnabled) + { + $this->object = new ArrayStruct( + [ + 'profileId' => $profileId, + 'testMode' => $isTestMode, + 'locale' => $defaultLocale, + 'oneClickPayments' => $oneClickEnabled, + ], + 'mollie_payments_config' + ); + + parent::__construct($this->object); + } +} diff --git a/src/Controller/StoreApi/Config/Sw6/ConfigController.php b/src/Controller/StoreApi/Config/Sw6/ConfigController.php new file mode 100644 index 000000000..bdc470999 --- /dev/null +++ b/src/Controller/StoreApi/Config/Sw6/ConfigController.php @@ -0,0 +1,14 @@ +customerService->setIDealIssuer( $customer, $issuerId, diff --git a/src/Controller/Storefront/Payment/MollieFailureControllerBase.php b/src/Controller/Storefront/Payment/MollieFailureControllerBase.php index d9a9d804c..1aa7d03e8 100644 --- a/src/Controller/Storefront/Payment/MollieFailureControllerBase.php +++ b/src/Controller/Storefront/Payment/MollieFailureControllerBase.php @@ -12,17 +12,22 @@ use Kiener\MolliePayments\Exception\MissingOrderInTransactionException; use Kiener\MolliePayments\Exception\MollieOrderCouldNotBeFetchedException; use Kiener\MolliePayments\Factory\MollieApiFactory; +use Kiener\MolliePayments\Service\CustomerService; use Kiener\MolliePayments\Service\Mollie\MolliePaymentStatus; use Kiener\MolliePayments\Service\Mollie\OrderStatusConverter; use Kiener\MolliePayments\Service\MollieApi\Order as MollieServiceOrder; use Kiener\MolliePayments\Service\Order\OrderStateService; +use Kiener\MolliePayments\Service\SettingsService; use Kiener\MolliePayments\Service\TransactionService; use Kiener\MolliePayments\Service\Transition\TransactionTransitionServiceInterface; use Kiener\MolliePayments\Struct\Order\OrderAttributes; +use Kiener\MolliePayments\Struct\OrderLineItemEntity\OrderLineItemEntityAttributes; use Mollie\Api\Exceptions\ApiException; use Mollie\Api\Resources\Order; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Cart\Exception\OrderNotFoundException; +use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity; +use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection; use Shopware\Core\Checkout\Order\Aggregate\OrderTransaction\OrderTransactionEntity; use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Checkout\Order\OrderStates; @@ -87,6 +92,16 @@ class MollieFailureControllerBase extends StorefrontController */ private $orderStatusConverter; + /** + * @var SettingsService + */ + private $settingsService; + + /** + * @var CustomerService + */ + private $customerService; + /** * @param RouterInterface $router * @param CompatibilityGatewayInterface $compatibilityGateway @@ -99,7 +114,7 @@ class MollieFailureControllerBase extends StorefrontController * @param MollieServiceOrder $mollieOrderService * @param OrderStatusConverter $orderStatusConverter */ - public function __construct(RouterInterface $router, CompatibilityGatewayInterface $compatibilityGateway, MollieApiFactory $apiFactory, OrderStateService $orderStateService, TransactionService $transactionService, LoggerInterface $logger, TransactionTransitionServiceInterface $transactionTransitionService, FlowBuilderFactoryInterface $flowBuilderFactory, MollieServiceOrder $mollieOrderService, OrderStatusConverter $orderStatusConverter) + public function __construct(RouterInterface $router, CompatibilityGatewayInterface $compatibilityGateway, MollieApiFactory $apiFactory, OrderStateService $orderStateService, TransactionService $transactionService, LoggerInterface $logger, TransactionTransitionServiceInterface $transactionTransitionService, FlowBuilderFactoryInterface $flowBuilderFactory, MollieServiceOrder $mollieOrderService, OrderStatusConverter $orderStatusConverter, SettingsService $settingsService, CustomerService $customerService) { $this->router = $router; $this->compatibilityGateway = $compatibilityGateway; @@ -112,6 +127,8 @@ public function __construct(RouterInterface $router, CompatibilityGatewayInterfa $this->orderStatusConverter = $orderStatusConverter; $this->eventDispatcher = $flowBuilderFactory->createDispatcher(); + $this->settingsService = $settingsService; + $this->customerService = $customerService; } /** @@ -240,7 +257,30 @@ public function retry(SalesChannelContext $context, string $transactionId): Redi # if its a failed status, then we have to create a new payment # otherwise no payment would exist, and we are not able to redirect to the payment screen if (MolliePaymentStatus::isFailedStatus('', $paymentStatus)) { - $mollieOrder->createPayment([]); + $settings = $this->settingsService->getSettings($context->getSalesChannelId()); + $paymentData = []; + + if ($settings->isSubscriptionsEnabled()) { + /** @var OrderLineItemCollection $lineItems */ + $lineItems = $order->getLineItems(); + /** @var OrderCustomerEntity $customer */ + $customer = $order->getOrderCustomer(); + /** @var string $customerId */ + $customerId = $customer->getCustomerId(); + + # mollie customer ID is required for recurring payments, see https://docs.mollie.com/reference/v2/orders-api/create-order-payment + $mollieCustomerId = $this->customerService->getMollieCustomerId($customerId, $context->getSalesChannelId(), $context->getContext()); + + foreach ($lineItems as $lineItem) { + $attributes = new OrderLineItemEntityAttributes($lineItem); + if ($attributes->isSubscriptionProduct()) { + $paymentData['sequenceType'] = 'first'; + $paymentData['customerId'] = $mollieCustomerId; + break; + } + } + } + $mollieOrder->createPayment($paymentData); } $redirectUrl = (string)$orderAttributes->getMolliePaymentUrl(); diff --git a/src/Controller/Storefront/iDEAL/iDealControllerBase.php b/src/Controller/Storefront/iDEAL/iDealControllerBase.php index 23ce1dfe3..1c764cca3 100644 --- a/src/Controller/Storefront/iDEAL/iDealControllerBase.php +++ b/src/Controller/Storefront/iDEAL/iDealControllerBase.php @@ -2,6 +2,7 @@ namespace Kiener\MolliePayments\Controller\Storefront\iDEAL; +use Kiener\MolliePayments\Handler\Method\iDealPayment; use Kiener\MolliePayments\Service\CustomerService; use Kiener\MolliePayments\Service\SettingsService; use Kiener\MolliePayments\Setting\MollieSettingStruct; @@ -45,6 +46,11 @@ public function storeIssuer(SalesChannelContext $context, string $customerId, st { $result = null; + # if we have a "reset" value, then empty our stored issuer + if ($issuerId === iDealPayment::ISSUER_RESET_VALUE) { + $issuerId = ''; + } + $customer = $this->customerService->getCustomer($customerId, $context->getContext()); if ($customer instanceof CustomerEntity) { diff --git a/src/Event/MollieOrderShipmentTrackingEvent.php b/src/Event/MollieOrderShipmentTrackingEvent.php deleted file mode 100644 index 645816ba2..000000000 --- a/src/Event/MollieOrderShipmentTrackingEvent.php +++ /dev/null @@ -1,128 +0,0 @@ -orderId = $orderId; - $this->context = $context; - $this->trackingCarrier = $trackingCarrier; - $this->trackingCode = $trackingCode; - $this->trackingUrl = $trackingUrl; - } - - /** - * @return string - */ - public function getOrderId(): string - { - return $this->orderId; - } - - /** - * @param string $orderId - */ - public function setOrderId(string $orderId): void - { - $this->orderId = $orderId; - } - - /** - * @return Context - */ - public function getContext(): Context - { - return $this->context; - } - - /** - * @param Context $context - */ - public function setContext(Context $context): void - { - $this->context = $context; - } - - /** - * @return string - */ - public function getTrackingCarrier(): string - { - return $this->trackingCarrier; - } - - /** - * @param string $trackingCarrier - */ - public function setTrackingCarrier(string $trackingCarrier): void - { - $this->trackingCarrier = $trackingCarrier; - } - - /** - * @return string - */ - public function getTrackingCode(): string - { - return $this->trackingCode; - } - - /** - * @param string $trackingCode - */ - public function setTrackingCode(string $trackingCode): void - { - $this->trackingCode = $trackingCode; - } - - /** - * @return string - */ - public function getTrackingUrl(): string - { - return $this->trackingUrl; - } - - /** - * @param string $trackingUrl - */ - public function setTrackingUrl(string $trackingUrl): void - { - $this->trackingUrl = $trackingUrl; - } -} diff --git a/src/Exception/OrderLineItemNotFoundException.php b/src/Exception/OrderLineItemNotFoundException.php index 18c982d56..2228a2225 100644 --- a/src/Exception/OrderLineItemNotFoundException.php +++ b/src/Exception/OrderLineItemNotFoundException.php @@ -14,7 +14,12 @@ class OrderLineItemNotFoundException extends ShopwareHttpException */ public function __construct(string $identifier, array $parameters = [], \Throwable $previous = null) { - $message = sprintf('Order lineitem with identifier %s could not be found', $identifier); + if (empty($identifier)) { + $message = 'Could not find an OrderLineItem. No identifier/productNumber provided'; + } else { + $message = sprintf('OrderLineItem with identifier: "%s" could not be found', $identifier); + } + parent::__construct($message, $parameters, $previous); } diff --git a/src/Facade/MolliePaymentDoPay.php b/src/Facade/MolliePaymentDoPay.php index 71c3fdff8..171d97b7d 100644 --- a/src/Facade/MolliePaymentDoPay.php +++ b/src/Facade/MolliePaymentDoPay.php @@ -8,6 +8,7 @@ use Kiener\MolliePayments\Exception\MollieOrderCancelledException; use Kiener\MolliePayments\Exception\MollieOrderExpiredException; use Kiener\MolliePayments\Exception\PaymentUrlException; +use Kiener\MolliePayments\Handler\Method\CreditCardPayment; use Kiener\MolliePayments\Handler\Method\PosPayment; use Kiener\MolliePayments\Handler\PaymentHandler; use Kiener\MolliePayments\Service\CustomerService; @@ -26,6 +27,7 @@ use Mollie\Api\Exceptions\ApiException; use Mollie\Api\Resources\OrderLine; use Psr\Log\LoggerInterface; +use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection; use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Checkout\Payment\Cart\AsyncPaymentTransactionStruct; use Shopware\Core\System\SalesChannel\SalesChannelContext; @@ -230,10 +232,14 @@ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactio $orderCustomFields->setSubscriptionData($subscriptionId, ''); } + /** + * @var OrderLineItemCollection $orderLineItems + */ + $orderLineItems = $order->getLineItems(); # we save that data in both, the order and # the order line items $this->updaterOrderCustomFields->updateOrder($order->getId(), $orderCustomFields, $salesChannelContext->getContext()); - $this->updaterLineItemCustomFields->updateOrderLineItems($molliePaymentData->getMollieLineItems(), $salesChannelContext); + $this->updaterLineItemCustomFields->updateOrderLineItems($molliePaymentData->getMollieLineItems(), $orderLineItems, $salesChannelContext); # this condition somehow looks weird to me (TODO) @@ -251,6 +257,11 @@ public function startMolliePayment(string $paymentMethod, AsyncPaymentTransactio $checkoutURL .= '&cs=' . urlencode($molliePaymentData->getChangeStatusUrl()); } } + + # if we save credit card information, we do not get a checkout url, so we have to use transactionStruct + if ($paymentHandler instanceof CreditCardPayment) { + $checkoutURL = $transactionStruct->getReturnUrl(); + } } return new MolliePaymentPrepareData((string)$checkoutURL, (string)$molliePaymentData->getId()); diff --git a/src/Facade/MolliePaymentFinalize.php b/src/Facade/MolliePaymentFinalize.php index 772d5fab7..208198740 100644 --- a/src/Facade/MolliePaymentFinalize.php +++ b/src/Facade/MolliePaymentFinalize.php @@ -205,7 +205,8 @@ public function finalize(AsyncPaymentTransactionStruct $transactionStruct, Sales if ($this->settingsService->getMollieCypressMode() && $orderAttributes->isTypeSubscription()) { if ($mollieOrder->payments() !== null && count($mollieOrder->payments()) > 0) { $paymentDetails = new MolliePaymentDetails(); - $mandateId = $paymentDetails->getMandateId($mollieOrder->payments()[0]); + $lasMolliePayment = count($mollieOrder->payments()) -1; + $mandateId = $paymentDetails->getMandateId($mollieOrder->payments()[$lasMolliePayment]); $this->subscriptionManager->confirmSubscription($order, $mandateId, $salesChannelContext->getContext()); } } diff --git a/src/Facade/MollieShipment.php b/src/Facade/MollieShipment.php deleted file mode 100644 index b6bf37498..000000000 --- a/src/Facade/MollieShipment.php +++ /dev/null @@ -1,483 +0,0 @@ -extractor = $extractor; - $this->deliveryTransitionService = $deliveryTransitionService; - $this->mollieApiOrderService = $mollieApiOrderService; - $this->mollieApiShipmentService = $mollieApiShipmentService; - $this->orderDeliveryService = $orderDeliveryService; - $this->orderService = $orderService; - $this->orderDataExtractor = $orderDataExtractor; - $this->logger = $logger; - } - - /** - * TODO: this is here just for now, because I cannot change it all right now, but we need to make sure someone can verify if the shipment should even be triggered to avoid logs being written when shipping other PSP orders - * - * @param string $orderDeliveryId - * @param Context $context - * @return null|OrderEntity - */ - public function isMollieOrder(string $orderDeliveryId, Context $context): ?OrderEntity - { - $delivery = $this->orderDeliveryService->getDelivery($orderDeliveryId, $context); - - if (!$delivery instanceof OrderDeliveryEntity) { - return null; - } - - $order = $delivery->getOrder(); - - if (!$order instanceof OrderEntity) { - return null; - } - - $lastTransaction = $this->extractor->extractLastMolliePayment($order->getTransactions()); - - if (!$lastTransaction instanceof OrderTransactionEntity) { - return null; - } - - return $order; - } - - /** - * @param string $orderDeliveryId - * @param Context $context - * @return bool - */ - public function setShipment(string $orderDeliveryId, Context $context): bool - { - $delivery = $this->orderDeliveryService->getDelivery($orderDeliveryId, $context); - - if (!$delivery instanceof OrderDeliveryEntity) { - $this->logger->warning( - sprintf('Order delivery with id %s could not be found in database', $orderDeliveryId) - ); - - return false; - } - - $order = $delivery->getOrder(); - - if (!$order instanceof OrderEntity) { - $this->logger->warning( - sprintf('Loaded delivery with id %s does not have an order in database', $orderDeliveryId) - ); - - return false; - } - - $customFields = $order->getCustomFields(); - $mollieOrderId = $customFields[CustomFieldsInterface::MOLLIE_KEY][CustomFieldsInterface::ORDER_KEY] ?? null; - - if (!$mollieOrderId) { - $this->logger->warning( - sprintf('Mollie orderId does not exist in shopware order (%s)', (string)$order->getOrderNumber()) - ); - - return false; - } - - // get last transaction if it is a mollie transaction - $lastTransaction = $this->extractor->extractLastMolliePayment($order->getTransactions()); - - if (!$lastTransaction instanceof OrderTransactionEntity) { - $this->logger->info( - sprintf( - 'The last transaction of the order (%s) is not a mollie payment! No shipment will be sent to mollie', - (string)$order->getOrderNumber() - ) - ); - - return false; - } - - $addedMollieShipment = $this->mollieApiOrderService->setShipment($mollieOrderId, $order->getSalesChannelId()); - - if ($addedMollieShipment) { - $values = [CustomFieldsInterface::DELIVERY_SHIPPED => true]; - $this->orderDeliveryService->updateCustomFields($delivery, $values, $context); - } - - return $addedMollieShipment; - } - - /** - * @param string $orderId - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return \Mollie\Api\Resources\Shipment - */ - public function shipOrderByOrderId( - string $orderId, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): \Mollie\Api\Resources\Shipment { - $order = $this->orderService->getOrder($orderId, $context); - return $this->shipOrder( - $order, - $trackingCarrier, - $trackingCode, - $trackingUrl, - $context - ); - } - - /** - * @param string $orderNumber - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return \Mollie\Api\Resources\Shipment - */ - public function shipOrderByOrderNumber( - string $orderNumber, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): \Mollie\Api\Resources\Shipment { - $order = $this->orderService->getOrderByNumber($orderNumber, $context); - return $this->shipOrder( - $order, - $trackingCarrier, - $trackingCode, - $trackingUrl, - $context - ); - } - - /** - * @param OrderEntity $order - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return \Mollie\Api\Resources\Shipment - */ - public function shipOrder( - OrderEntity $order, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): \Mollie\Api\Resources\Shipment { - $mollieOrderId = $this->orderService->getMollieOrderId($order); - - $shipment = $this->mollieApiShipmentService->shipOrder( - $mollieOrderId, - $order->getSalesChannelId(), - $this->createTrackingInfoStruct($trackingCarrier, $trackingCode, $trackingUrl) - ); - - $delivery = $this->orderDataExtractor->extractDelivery($order, $context); - - $this->deliveryTransitionService->shipDelivery($delivery, $context); - - return $shipment; - } - - /** - * @param string $orderId - * @param string $itemIdentifier - * @param int $quantity - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return \Mollie\Api\Resources\Shipment - */ - public function shipItemByOrderId( - string $orderId, - string $itemIdentifier, - int $quantity, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): \Mollie\Api\Resources\Shipment { - $order = $this->orderService->getOrder($orderId, $context); - return $this->shipItem( - $order, - $itemIdentifier, - $quantity, - $trackingCarrier, - $trackingCode, - $trackingUrl, - $context - ); - } - - /** - * @param string $orderNumber - * @param string $itemIdentifier - * @param int $quantity - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return \Mollie\Api\Resources\Shipment - */ - public function shipItemByOrderNumber( - string $orderNumber, - string $itemIdentifier, - int $quantity, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): \Mollie\Api\Resources\Shipment { - $order = $this->orderService->getOrderByNumber($orderNumber, $context); - return $this->shipItem( - $order, - $itemIdentifier, - $quantity, - $trackingCarrier, - $trackingCode, - $trackingUrl, - $context - ); - } - - /** - * @param OrderEntity $order - * @param string $itemIdentifier - * @param int $quantity - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return \Mollie\Api\Resources\Shipment - */ - public function shipItem( - OrderEntity $order, - string $itemIdentifier, - int $quantity, - string $trackingCarrier, - string $trackingCode, - string $trackingUrl, - Context $context - ): \Mollie\Api\Resources\Shipment { - $mollieOrderId = $this->orderService->getMollieOrderId($order); - - $lineItems = $this->findMatchingLineItems($order, $itemIdentifier, $context); - - if ($lineItems->count() > 1) { - throw new OrderLineItemFoundManyException($itemIdentifier); - } - - $lineItem = $lineItems->first(); - unset($lineItems); - - if (!$lineItem instanceof OrderLineItemEntity) { - throw new OrderLineItemNotFoundException($itemIdentifier); - } - - $mollieOrderLineId = $this->orderService->getMollieOrderLineId($lineItem); - - if ($quantity === 0) { - $quantity = $this->mollieApiOrderService->getMollieOrderLine( - $mollieOrderId, - $mollieOrderLineId, - $order->getSalesChannelId() - )->shippableQuantity; - } - - $shipment = $this->mollieApiShipmentService->shipItem( - $mollieOrderId, - $order->getSalesChannelId(), - $mollieOrderLineId, - $quantity, - $this->createTrackingInfoStruct($trackingCarrier, $trackingCode, $trackingUrl) - ); - - $delivery = $this->orderDataExtractor->extractDelivery($order, $context); - - if ($this->mollieApiOrderService->isCompletelyShipped($mollieOrderId, $order->getSalesChannelId())) { - $this->deliveryTransitionService->shipDelivery($delivery, $context); - } else { - $this->deliveryTransitionService->partialShipDelivery($delivery, $context); - } - - return $shipment; - } - - /** - * @param string $orderId - * @param Context $context - * @return array - */ - public function getStatus(string $orderId, Context $context): array - { - $order = $this->orderService->getOrder($orderId, $context); - $mollieOrderId = $this->orderService->getMollieOrderId($order); - - return $this->mollieApiShipmentService->getStatus($mollieOrderId, $order->getSalesChannelId()); - } - - /** - * @param string $orderId - * @param Context $context - * @return array - */ - public function getTotals(string $orderId, Context $context): array - { - $order = $this->orderService->getOrder($orderId, $context); - $mollieOrderId = $this->orderService->getMollieOrderId($order); - - return $this->mollieApiShipmentService->getTotals($mollieOrderId, $order->getSalesChannelId()); - } - - /** - * Try to find lineItems matching the $itemIdentifier. Shopware does not have a unique human-readable identifier for - * order line items, so we have to check for several fields, like product number or the mollie order line id. - * - * @param OrderEntity $order - * @param string $itemIdentifier - * @param Context $context - * @return OrderLineItemCollection - */ - private function findMatchingLineItems(OrderEntity $order, string $itemIdentifier, Context $context): OrderLineItemCollection - { - return $this->orderDataExtractor->extractLineItems($order, $context)->filter(function ($lineItem) use ($itemIdentifier) { - /** @var OrderLineItemEntity $lineItem */ - - // Default Shopware: If the lineItem is of type "product" and has an associated ProductEntity, - // check if the itemIdentifier matches the product's product number. - if ($lineItem->getType() === LineItem::PRODUCT_LINE_ITEM_TYPE && - $lineItem->getProduct() instanceof ProductEntity && - $lineItem->getProduct()->getProductNumber() === $itemIdentifier) { - return true; - } - - // If it's not a "product" type lineItem, for example if it's a completely custom lineItem type, - // check if the payload has a productNumber in it that matches the itemIdentifier. - if (!empty($lineItem->getPayload()) && - array_key_exists('productNumber', $lineItem->getPayload()) && - $lineItem->getPayload()['productNumber'] === $itemIdentifier) { - return true; - } - - // Check itemIdentifier against the mollie order_line_id custom field - $customFields = $lineItem->getCustomFields() ?? []; - $mollieOrderLineId = $customFields[CustomFieldsInterface::MOLLIE_KEY]['order_line_id'] ?? null; - if (!is_null($mollieOrderLineId) && $mollieOrderLineId === $itemIdentifier) { - return true; - } - - // If it hasn't passed any of the above tests, check if the itemIdentifier is a valid Uuid... - if (!Uuid::isValid($itemIdentifier)) { - return false; - } - - // ... and then check if it matches the Id of the entity the lineItem is referencing, - // or if it matches the Id of the lineItem itself. - if ($lineItem->getReferencedId() === $itemIdentifier || $lineItem->getId() === $itemIdentifier) { - return true; - } - - // Otherwise, this lineItem does not match the itemIdentifier at all. - return false; - }); - } - - private function createTrackingInfoStruct(string $trackingCarrier, string $trackingCode, string $trackingUrl): ?ShipmentTrackingInfoStruct - { - if (empty($trackingCarrier) && empty($trackingCode)) { - return null; - } - - if (empty($trackingCarrier)) { - throw new \InvalidArgumentException('Missing Argument for Tracking Carrier!'); - } - - if (empty($trackingCode)) { - throw new \InvalidArgumentException('Missing Argument for Tracking Code!'); - } - - return new ShipmentTrackingInfoStruct($trackingCarrier, $trackingCode, $trackingUrl); - } -} diff --git a/src/Facade/MollieShipmentInterface.php b/src/Facade/MollieShipmentInterface.php deleted file mode 100644 index 60a945e96..000000000 --- a/src/Facade/MollieShipmentInterface.php +++ /dev/null @@ -1,82 +0,0 @@ - $orderData diff --git a/src/Helper/DeliveryStateHelper.php b/src/Helper/DeliveryStateHelper.php deleted file mode 100644 index 829a74a4c..000000000 --- a/src/Helper/DeliveryStateHelper.php +++ /dev/null @@ -1,144 +0,0 @@ -deliveryService = $deliveryService; - $this->stateMachineRegistry = $stateMachineRegistry; - } - - /** - * Processes the order status of Mollie, if the order at Mollie is shipping, - * also synchronise it to Shopware. - * - * @param OrderEntity $order - * @param Order $mollieOrder - * @param Context $context - * @throws InconsistentCriteriaIdsException - */ - public function shipDelivery( - OrderEntity $order, - Order $mollieOrder, - Context $context - ): void { - /** @var OrderDeliveryEntity $orderDelivery */ - $orderDelivery = $this->deliveryService - ->getDeliveryByOrderId($order->getId(), $order->getVersionId()); - - /** - * Order is shipping. - */ - if ( - $orderDelivery !== null - && $mollieOrder->isShipping() - && ( - !isset($orderDelivery->getCustomFields()[self::PARAM_MOLLIE_PAYMENTS][self::PARAM_IS_SHIPPED]) - || $orderDelivery->getCustomFields()[self::PARAM_MOLLIE_PAYMENTS][self::PARAM_IS_SHIPPED] === false - ) - && ( - $orderDelivery->getStateMachineState() === null - || ( - $orderDelivery->getStateMachineState()->getTechnicalName() !== OrderDeliveryStates::STATE_SHIPPED - && $orderDelivery->getStateMachineState()->getTechnicalName() !== OrderDeliveryStates::STATE_PARTIALLY_SHIPPED - ) - ) - ) { - $transitionName = 'ship_partially'; - - if ($this->isOrderShipped($mollieOrder)) { - $transitionName = 'ship'; - } - - // Transition the order to being shipped - $this->stateMachineRegistry->transition( - new Transition( - 'order_delivery', - $orderDelivery->getId(), - $transitionName, - 'stateId' - ), - $context - ); - - // Add is shipped flag to custom fields - if ($transitionName === 'ship') { - $customFields = $order->getCustomFields() ?? []; - - $this->deliveryService->updateDelivery([ - self::PARAM_ID => $orderDelivery->getId(), - self::PARAM_CUSTOM_FIELDS => $this->deliveryService->addShippedToCustomFields($customFields, true), - ], $context); - } - } - } - - /** - * Returns whether the order is partially shipping. - * - * @param Order $order - * - * @return bool - */ - private function isOrderShipped(Order $order): bool - { - $linesQuantity = 0; - $shipmentsQuantity = 0; - - if ($order->lines()->count()) { - /** @var OrderLine $line */ - foreach ($order->lines() as $line) { - $linesQuantity += $line->quantity; - } - } - - if ($order->shipments()->count()) { - /** @var Shipment $shipment */ - foreach ($order->shipments() as $shipment) { - if ($shipment->lines()->count()) { - /** @var OrderLine $line */ - foreach ($shipment->lines() as $line) { - $shipmentsQuantity += $line->quantity; - } - } - } - } - - return ($shipmentsQuantity > 0 && $linesQuantity === $shipmentsQuantity); - } -} diff --git a/src/MolliePayments.php b/src/MolliePayments.php index c5f953ab7..7f6fdd702 100644 --- a/src/MolliePayments.php +++ b/src/MolliePayments.php @@ -24,7 +24,7 @@ class MolliePayments extends Plugin { - const PLUGIN_VERSION = '4.3.0'; + const PLUGIN_VERSION = '4.4.2'; /** diff --git a/src/Repository/Language/LanguageRepository.php b/src/Repository/Language/LanguageRepository.php index 1b04a65c9..b52028e47 100644 --- a/src/Repository/Language/LanguageRepository.php +++ b/src/Repository/Language/LanguageRepository.php @@ -7,6 +7,8 @@ use Shopware\Core\Framework\DataAbstractionLayer\EntityRepository; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult; +use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; +use Shopware\Core\System\Language\LanguageEntity; class LanguageRepository implements LanguageRepositoryInterface { @@ -32,4 +34,20 @@ public function search(Criteria $criteria, Context $context): EntitySearchResult { return $this->languageRepository->search($criteria, $context); } + + /** + * @param string $languageId + * @param Context $context + * @return null|LanguageEntity + */ + public function findById(string $languageId, Context $context): ?LanguageEntity + { + $languageCriteria = new Criteria(); + $languageCriteria->addAssociation('locale'); + $languageCriteria->addFilter(new EqualsFilter('id', $languageId)); + + $languagesResult = $this->search($languageCriteria, $context); + + return $languagesResult->first(); + } } diff --git a/src/Repository/Language/LanguageRepositoryInterface.php b/src/Repository/Language/LanguageRepositoryInterface.php index af18d99f0..d772d82c3 100644 --- a/src/Repository/Language/LanguageRepositoryInterface.php +++ b/src/Repository/Language/LanguageRepositoryInterface.php @@ -6,6 +6,7 @@ use Shopware\Core\Framework\Context; use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; use Shopware\Core\Framework\DataAbstractionLayer\Search\EntitySearchResult; +use Shopware\Core\System\Language\LanguageEntity; interface LanguageRepositoryInterface { @@ -15,4 +16,11 @@ interface LanguageRepositoryInterface * @return EntitySearchResult */ public function search(Criteria $criteria, Context $context): EntitySearchResult; + + /** + * @param string $languageId + * @param Context $context + * @return null|LanguageEntity + */ + public function findById(string $languageId, Context $context): ?LanguageEntity; } diff --git a/src/Resources/app/administration/src/core/service/api/mollie-payments-shipping.service.js b/src/Resources/app/administration/src/core/service/api/mollie-payments-shipping.service.js index 80cb01f8c..f933fc85a 100644 --- a/src/Resources/app/administration/src/core/service/api/mollie-payments-shipping.service.js +++ b/src/Resources/app/administration/src/core/service/api/mollie-payments-shipping.service.js @@ -2,33 +2,44 @@ const ApiService = Shopware.Classes.ApiService; class MolliePaymentsShippingService extends ApiService { + + /** + * + * @param httpClient + * @param loginService + * @param apiEndpoint + */ constructor(httpClient, loginService, apiEndpoint = 'mollie') { super(httpClient, loginService, apiEndpoint); } - __post(endpoint = '', data = {}, headers = {}) { - return this.httpClient - .post( - `_action/${this.getApiBasePath()}/ship${endpoint}`, - JSON.stringify(data), - { - headers: this.getBasicHeaders(headers), - } - ) - .then((response) => { - return ApiService.handleResponse(response); - }); - } + /** + * + * @param orderId + * @param trackingCarrier + * @param trackingCode + * @param trackingUrl + * @param items + * @returns {*} + */ + shipOrder(orderId, trackingCarrier, trackingCode, trackingUrl, items) { + + const data = { + orderId: orderId, + trackingCarrier: trackingCarrier, + trackingCode: trackingCode, + trackingUrl: trackingUrl, + items: items, + } - shipOrder(data = { - orderId: null, - trackingCarrier: null, - trackingCode: null, - trackingUrl: null, - }) { return this.__post('', data); } + /** + * + * @param data + * @returns {*} + */ shipItem(data = { orderId: null, itemId: null, @@ -40,13 +51,46 @@ class MolliePaymentsShippingService extends ApiService { return this.__post('/item', data); } + /** + * + * @param data + * @returns {*} + */ status(data = {orderId: null}) { return this.__post('/status', data); } + /** + * + * @param data + * @returns {*} + */ total(data = {orderId: null}) { return this.__post('/total', data); } + + /** + * + * @param endpoint + * @param data + * @param headers + * @returns {*} + * @private + */ + __post(endpoint = '', data = {}, headers = {}) { + return this.httpClient + .post( + `_action/${this.getApiBasePath()}/ship${endpoint}`, + JSON.stringify(data), + { + headers: this.getBasicHeaders(headers), + } + ) + .then((response) => { + return ApiService.handleResponse(response); + }); + } + } export default MolliePaymentsShippingService; diff --git a/src/Resources/app/administration/src/core/service/utils/array-utils.service.js b/src/Resources/app/administration/src/core/service/utils/array-utils.service.js new file mode 100644 index 000000000..8fbdbadfc --- /dev/null +++ b/src/Resources/app/administration/src/core/service/utils/array-utils.service.js @@ -0,0 +1,39 @@ +export default class ArrayUtilsService { + + /** + * + * @param array + * @param item + * @param key + */ + addUniqueItem(array, item, key) { + + const identifier = item[key]; + + // check if we already have this item + for (let i = 0; i < array.length; i++) { + const existingItem = array[i]; + if (existingItem[key] === identifier) { + return 2; + } + } + + array.push(item); + } + + /** + * + * @param array + * @param item + * @param key + */ + removeItem(array, item, key) { + for (let i = 0; i < array.length; i++) { + if (array[i][key] === item[key]) { + array.splice(i, 1); + return; + } + } + } + +} \ No newline at end of file diff --git a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/services/OderLifeTimeLimitDetectorService.js b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/services/OderLifeTimeLimitDetectorService.js index f842a1264..dab4604a8 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/services/OderLifeTimeLimitDetectorService.js +++ b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-pluginconfig-section-order-lifetime-warning/services/OderLifeTimeLimitDetectorService.js @@ -1,13 +1,29 @@ export default class OrderLifeTimeLimitsDetector { - maximumOrderLifeTimeKlarna = 28; - maximumOrderLifeTime = 100; + /** + * + */ + constructor() { + this.maximumOrderLifeTimeKlarna = 28; + this.maximumOrderLifeTime = 100; + } + + /** + * + * @param orderLifeTime + * @returns {boolean} + */ isOderLifeTimeLimitReached(orderLifeTime) { return orderLifeTime > this.maximumOrderLifeTime; } + /** + * + * @param orderLifeTime + * @returns {boolean} + */ isKlarnaOrderLifeTimeReached(orderLifeTime) { return orderLifeTime > this.maximumOrderLifeTimeKlarna && orderLifeTime <= this.maximumOrderLifeTime; } -} \ No newline at end of file +} diff --git a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/MollieShipping.js b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/MollieShipping.js index 8e0d83667..e207f586c 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/MollieShipping.js +++ b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/MollieShipping.js @@ -61,6 +61,8 @@ export default class MollieShipping { const lineItem = order.lineItems[i]; finalItems.push({ + id: lineItem.id, + mollieId: lineItem.mollieOrderLineId, label: lineItem.label, quantity: this._shippableQuantity(lineItem), }); diff --git a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/index.js b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/index.js index aeabe1fa0..8a35748dd 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/index.js +++ b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/index.js @@ -1,4 +1,5 @@ import template from './mollie-ship-order.html.twig'; +import './mollie-ship-order.scss'; import MollieShippingEvents from './MollieShippingEvents'; import MollieShipping from './MollieShipping'; @@ -51,12 +52,23 @@ Component.register('mollie-ship-order', { getShipOrderColumns() { return [ + { + property: 'itemselect', + label: '', + }, { property: 'label', label: this.$tc('mollie-payments.modals.shipping.order.itemHeader'), - }, { + }, + { property: 'quantity', label: this.$tc('mollie-payments.modals.shipping.order.quantityHeader'), + width: '160px', + }, + { + property: 'originalQuantity', + label: this.$tc('mollie-payments.modals.shipping.order.originalQuantityHeader'), + width: '160px', }, ]; }, @@ -93,6 +105,15 @@ Component.register('mollie-ship-order', { const shipping = new MollieShipping(this.MolliePaymentsShippingService); shipping.getShippableItems(this.order).then((items) => { + + // this is required to make sure the "select all" works + // because we need to have a default value + for (let i = 0; i < items.length; i++) { + const item = items[i]; + item.selected = false; + item.originalQuantity = item.quantity; + } + this.shippableLineItems = items; }); @@ -105,19 +126,54 @@ Component.register('mollie-ship-order', { } }, + /** + * + */ + btnSelectAllItems_Click() { + for (let i = 0; i < this.shippableLineItems.length; i++) { + const item = this.shippableLineItems[i]; + if (item.originalQuantity > 0) { + item.selected = true; + } + } + }, + + /** + * + */ + btnResetItems_Click() { + for (let i = 0; i < this.shippableLineItems.length; i++) { + const item = this.shippableLineItems[i]; + item.selected = false; + item.quantity = item.originalQuantity; + } + }, + /** * */ onShipOrder() { - const params = { - orderId: this.order.id, - trackingCarrier: this.tracking.carrier, - trackingCode: this.tracking.code, - trackingUrl: this.tracking.url, - }; + var shippingItems = []; + + for (let i = 0; i < this.shippableLineItems.length; i++) { + const item = this.shippableLineItems[i]; + + if (item.selected) { + shippingItems.push({ + 'id': item.id, + 'quantity': item.quantity, + }) + } + } - this.MolliePaymentsShippingService.shipOrder(params) + this.MolliePaymentsShippingService.shipOrder( + this.order.id, + this.tracking.carrier, + this.tracking.code, + this.tracking.url, + shippingItems, + ) .then(() => { // send global event diff --git a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/mollie-ship-order.html.twig b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/mollie-ship-order.html.twig index 344b541ab..6c841680a 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/mollie-ship-order.html.twig +++ b/src/Resources/app/administration/src/module/mollie-payments/components/mollie-ship-order/mollie-ship-order.html.twig @@ -1,6 +1,15 @@ - +

{{ $tc('mollie-payments.modals.shipping.order.description') }}

+ + + {{ $tc('mollie-payments.modals.shipping.selectAllButton') }} + + + {{ $tc('mollie-payments.modals.shipping.resetButton') }} + + + {% block sw_order_line_items_grid_grid_mollie_ship_item_modal_items %} + + + + + {% endblock %} - - {{ $tc('mollie-payments.modals.shipping.confirmButton') }} - + +
+ + {{ $tc('mollie-payments.modals.shipping.confirmButton') }} + +
{% block sw_order_line_items_grid_grid_mollie_ship_item_modal_tracking %} diff --git a/src/Resources/app/administration/src/module/mollie-payments/extension/sw-order/view/sw-order-detail-general/sw-order-detail-general.html.twig b/src/Resources/app/administration/src/module/mollie-payments/extension/sw-order/view/sw-order-detail-general/sw-order-detail-general.html.twig index 6e6bd1879..74fe784fe 100644 --- a/src/Resources/app/administration/src/module/mollie-payments/extension/sw-order/view/sw-order-detail-general/sw-order-detail-general.html.twig +++ b/src/Resources/app/administration/src/module/mollie-payments/extension/sw-order/view/sw-order-detail-general/sw-order-detail-general.html.twig @@ -37,7 +37,7 @@ SHOPWARE 6.5 {% block sw_order_detail_general_mollie_shipping %} diff --git a/src/Resources/app/administration/src/snippet/de-DE.json b/src/Resources/app/administration/src/snippet/de-DE.json index e3deb8fae..76b59f784 100644 --- a/src/Resources/app/administration/src/snippet/de-DE.json +++ b/src/Resources/app/administration/src/snippet/de-DE.json @@ -261,7 +261,8 @@ "order": { "description": "Die folgenden Artikelmengen werden versandt.", "itemHeader": "Artikel", - "quantityHeader": "Menge" + "quantityHeader": "Menge", + "originalQuantityHeader": "Menge (verschickbar)" }, "availableTracking": { "label": "Verfügbare Tracking-Codes", @@ -275,7 +276,9 @@ "invalid": "Bitte geben Sie sowohl Spediteur als auch Code ein" }, "confirmButton": "Bestellung versenden", - "cancelButton": "Abbrechen" + "cancelButton": "Abbrechen", + "selectAllButton": "Alle auswählen", + "resetButton": "Zurücksetzen" } }, "sw-flow": { diff --git a/src/Resources/app/administration/src/snippet/en-GB.json b/src/Resources/app/administration/src/snippet/en-GB.json index 7db602446..c8901c310 100644 --- a/src/Resources/app/administration/src/snippet/en-GB.json +++ b/src/Resources/app/administration/src/snippet/en-GB.json @@ -261,7 +261,8 @@ "order": { "description": "The following item quantities will be shipped.", "itemHeader": "Item", - "quantityHeader": "Quantity" + "quantityHeader": "Quantity", + "originalQuantityHeader": "Quantity (shippable)" }, "availableTracking": { "label": "Available tracking codes", @@ -275,7 +276,9 @@ "invalid": "Please enter both Carrier and Code" }, "confirmButton": "Ship order", - "cancelButton": "Cancel" + "cancelButton": "Cancel", + "selectAllButton": "Select all", + "resetButton": "Reset" } }, "sw-flow": { diff --git a/src/Resources/app/administration/src/snippet/nl-NL.json b/src/Resources/app/administration/src/snippet/nl-NL.json index a27cc250f..b3f8b10c0 100644 --- a/src/Resources/app/administration/src/snippet/nl-NL.json +++ b/src/Resources/app/administration/src/snippet/nl-NL.json @@ -261,7 +261,8 @@ "order": { "description": "De volgende product aantallen zullen worden verzonden.", "itemHeader": "Product", - "quantityHeader": "Aantal" + "quantityHeader": "Aantal", + "originalQuantityHeader": "Aantal (verzendbaar)" }, "availableTracking": { "label": "Beschikbare tracking codes", @@ -275,7 +276,9 @@ "invalid": "Voer zowel Carrier als Code in" }, "confirmButton": "Bestelling verzenden", - "cancelButton": "Annuleren" + "cancelButton": "Annuleren", + "selectAllButton": "Selecteer alles", + "resetButton": "Resetten" } }, diff --git a/src/Resources/app/administration/tests/core/utils/array-utils.service.spec.js b/src/Resources/app/administration/tests/core/utils/array-utils.service.spec.js new file mode 100644 index 000000000..f44e0e620 --- /dev/null +++ b/src/Resources/app/administration/tests/core/utils/array-utils.service.spec.js @@ -0,0 +1,62 @@ +import ArrayUtilsService from "../../../src/core/service/utils/array-utils.service"; + +const utils = new ArrayUtilsService(); + +test('Struct can be added', () => { + + const array = []; + + const data = { + id: 1, + name: 'test', + }; + + utils.addUniqueItem(array, data, 'id'); + + expect(array.length).toBe(1); +}); + + +test('Struct cannot be added twice', () => { + + const array = []; + + const data = { + id: 1, + name: 'test', + }; + + utils.addUniqueItem(array, data, 'id'); + utils.addUniqueItem(array, data, 'id'); + + expect(array.length).toBe(1); +}); + +test('Struct can be removed again', () => { + + const array = []; + + const data = { + id: 1, + name: 'test', + }; + + utils.addUniqueItem(array, data, 'id'); + utils.removeItem(array, data, 'id'); + + expect(array.length).toBe(0); +}); + +test('Remove on empty struct does not throw exception', () => { + + const array = []; + + const data = { + id: 1, + name: 'test', + }; + + utils.removeItem(array, data, 'id'); + + expect(array.length).toBe(0); +}); \ No newline at end of file diff --git a/src/Resources/app/storefront/makefile b/src/Resources/app/storefront/makefile index 6e3678677..d7f6588ac 100644 --- a/src/Resources/app/storefront/makefile +++ b/src/Resources/app/storefront/makefile @@ -6,7 +6,7 @@ .DEFAULT_GOAL := help help: - @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' # ------------------------------------------------------------------------------------------------------------ diff --git a/src/Resources/app/storefront/package-lock.json b/src/Resources/app/storefront/package-lock.json index e8211f3c4..ae44879b4 100644 --- a/src/Resources/app/storefront/package-lock.json +++ b/src/Resources/app/storefront/package-lock.json @@ -32,7 +32,16 @@ "stylelint-config-standard": "^24.0.0", "stylelint-scss": "^4.0.1", "webpack": "^5.82.0", - "webpack-cli": "^5.1.1" + "webpack-cli": "^5.1.4" + } + }, + "node_modules/@aashutoshrathi/word-wrap": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", + "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", + "dev": true, + "engines": { + "node": ">=0.10.0" } }, "node_modules/@ampproject/remapping": { @@ -49,14 +58,14 @@ } }, "node_modules/@babel/cli": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.21.5.tgz", - "integrity": "sha512-TOKytQ9uQW9c4np8F+P7ZfPINy5Kv+pizDIUwSVH8X5zHgYHV4AA8HE5LA450xXeu4jEfmUckTYvv1I4S26M/g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.23.4.tgz", + "integrity": "sha512-j3luA9xGKCXVyCa5R7lJvOMM+Kc2JEnAEIgz2ggtjQ/j5YUVgfsg/WsG95bbsgq7YLHuiCOzMnoSasuY16qiCw==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", "commander": "^4.0.1", - "convert-source-map": "^1.1.0", + "convert-source-map": "^2.0.0", "fs-readdir-recursive": "^1.1.0", "glob": "^7.2.0", "make-dir": "^2.1.0", @@ -78,47 +87,48 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.21.4.tgz", - "integrity": "sha512-LYvhNKfwWSPpocw8GI7gpK2nq3HSDuEPC/uSYaALSJu9xjsalaaYFOq0Pwt5KmVqwEbZlDu81aLXwBOmD/Fv9g==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", + "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", "dev": true, "dependencies": { - "@babel/highlight": "^7.18.6" + "@babel/highlight": "^7.23.4", + "chalk": "^2.4.2" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/compat-data": { - "version": "7.21.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.21.7.tgz", - "integrity": "sha512-KYMqFYTaenzMK4yUtf4EW9wc4N9ef80FsbMtkwool5zpwl4YrT1SdWYSTRcT94KO4hannogdS+LxY7L+arP3gA==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", + "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", - "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz", + "integrity": "sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helpers": "^7.21.5", - "@babel/parser": "^7.21.8", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5", - "convert-source-map": "^1.7.0", + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helpers": "^7.23.6", + "@babel/parser": "^7.23.6", + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6", + "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", - "json5": "^2.2.2", - "semver": "^6.3.0" + "json5": "^2.2.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -129,12 +139,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.5.tgz", - "integrity": "sha512-SrKK/sRv8GesIW1bDagf9cCG38IOMYZusoe1dfg0D8aiUe3Amvoj1QtjTPAWcfrZFvIwlleLb0gxzQidL9w14w==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", + "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5", + "@babel/types": "^7.23.6", "@jridgewell/gen-mapping": "^0.3.2", "@jridgewell/trace-mapping": "^0.3.17", "jsesc": "^2.5.1" @@ -144,63 +154,60 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.18.6.tgz", - "integrity": "sha512-duORpUiYrEpzKIop6iNbjnwKLAKnJ47csTyRACyEmWj0QdUrm5aqNJGHSSEQSUAvNW0ojX0dOmK9dZduvkfeXA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.22.5.tgz", + "integrity": "sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.21.5.tgz", - "integrity": "sha512-uNrjKztPLkUk7bpCNC0jEKDJzzkvel/W+HguzbN8krA+LPfC1CEobJEvAvGka2A/M+ViOqXdcRL0GqPUJSjx9g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.22.15.tgz", + "integrity": "sha512-QkBXwGgaoC2GtGZRoma6kv7Szfv06khvhFav67ZExau2RaXzy8MpHSMO2PNoP2XtmQphJQRHFfg77Bq731Yizw==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.21.5.tgz", - "integrity": "sha512-1RkbFGUKex4lvsB9yhIfWltJM5cZKUftB2eNajaDv3dCMEp49iBG0K14uH8NnX9IPux2+mK7JGEOB0jn48/J6w==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", + "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "browserslist": "^4.21.3", + "@babel/compat-data": "^7.23.5", + "@babel/helper-validator-option": "^7.23.5", + "browserslist": "^4.22.2", "lru-cache": "^5.1.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.21.8.tgz", - "integrity": "sha512-+THiN8MqiH2AczyuZrnrKL6cAxFRRQDKW9h1YkBvbgKmAm6mwiacig1qT73DHIWMGo40GRnsEfN3LA+E6NtmSw==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz", + "integrity": "sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-replace-supers": "^7.21.5", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/helper-split-export-declaration": "^7.18.6", - "semver": "^6.3.0" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-member-expression-to-functions": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -210,14 +217,14 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.21.8.tgz", - "integrity": "sha512-zGuSdedkFtsFHGbexAvNuipg1hbtitDLo2XE8/uf6Y9sOQV1xsYX/2pNbtedp/X0eU1pIt+kGvaqHCowkRbS5g==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.22.15.tgz", + "integrity": "sha512-29FkPLFjn4TPEa3RE7GpW+qbE8tlsu3jntNYNfcGsc49LphF1PQIiD+vMZ1z1xVOKt+93khA9tc2JBs3kBjA7w==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", + "@babel/helper-annotate-as-pure": "^7.22.5", "regexpu-core": "^5.3.1", - "semver": "^6.3.0" + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -227,130 +234,128 @@ } }, "node_modules/@babel/helper-define-polyfill-provider": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.3.tgz", - "integrity": "sha512-z5aQKU4IzbqCC1XH0nAqfsFLMVSo22SBKUc0BxGrLkolTdPTructy0ToNnlO2zA4j9Q/7pjMZf0DSY+DSTYzww==", + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz", + "integrity": "sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.17.7", - "@babel/helper-plugin-utils": "^7.16.7", + "@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", - "semver": "^6.1.2" + "resolve": "^1.14.2" }, "peerDependencies": { - "@babel/core": "^7.4.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/helper-environment-visitor": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.21.5.tgz", - "integrity": "sha512-IYl4gZ3ETsWocUWgsFZLM5i1BYx9SoemminVEXadgLBa9TdeorzgLKm8wWLA6J1N/kT3Kch8XIk1laNzYoHKvQ==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", + "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-function-name": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.21.0.tgz", - "integrity": "sha512-HfK1aMRanKHpxemaY2gqBmL04iAPOPRj7DxtNbiDOrJK+gdwkiNRVpCpUJYbUT+aZyemKN8brqTOxzCaG6ExRg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", + "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/types": "^7.21.0" + "@babel/template": "^7.22.15", + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-hoist-variables": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.18.6.tgz", - "integrity": "sha512-UlJQPkFqFULIcyW5sbzgbkxn2FKRgwWiRexcuaR8RNJRy8+LLveqPjwZV/bwrLZCN0eUHD/x8D0heK1ozuoo6Q==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", + "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.21.5.tgz", - "integrity": "sha512-nIcGfgwpH2u4n9GG1HpStW5Ogx7x7ekiFHbjjFRKXbn5zUvqO9ZgotCO4x1aNbKn/x/xOUaXEhyNHCwtFCpxWg==", + "version": "7.23.0", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.23.0.tgz", + "integrity": "sha512-6gfrPwh7OuT6gZyJZvd6WbTfrqAo7vm4xCzAXOusKqq/vWdKXphTpj5klHKNmRUU6/QRGlBsyU9mAIPaWHlqJA==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.23.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.21.4.tgz", - "integrity": "sha512-orajc5T2PsRYUN3ZryCEFeMDYwyw09c/pZeaQEZPH0MpKzSvn3e0uXsDBu3k03VI+9DBiRo+l22BfKTpKwa/Wg==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", + "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.4" + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.21.5.tgz", - "integrity": "sha512-bI2Z9zBGY2q5yMHoBvJ2a9iX3ZOAzJPm7Q8Yz6YeoUjU/Cvhmi2G4QyTNyPBqqXSgTjUxRg3L0xV45HvkNWWBw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", + "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-simple-access": "^7.21.5", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.19.1", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-simple-access": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.18.6.tgz", - "integrity": "sha512-HP59oD9/fEHQkdcbgFCnbmgH5vIQTJbxh2yf+CdM89/glUNnuzr87Q8GIjGEnOktTROemO0Pe0iPAYbqZuOUiA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.22.5.tgz", + "integrity": "sha512-HBwaojN0xFRx4yIvpwGqxiV2tUfl7401jlok564NgB9EHS1y6QT17FmKWm4ztqjeVdXLuC4fSvHc5ePpQjoTbw==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.21.5.tgz", - "integrity": "sha512-0WDaIlXKOX/3KfBK/dwP1oQGiPh6rjMkT7HIRv7i5RR2VUMwrx5ZL0dwBkKx7+SW1zwNdgjHd34IMk5ZjTeHVg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.22.5.tgz", + "integrity": "sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.9.tgz", - "integrity": "sha512-dI7q50YKd8BAv3VEfgg7PS7yD3Rtbi2J1XMXaalXO0W0164hYLnh8zpjRS0mte9MfVp/tltvr/cfdXPvJr1opA==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.22.20.tgz", + "integrity": "sha512-pBGyV4uBqOns+0UvhsTO8qgl8hO89PmiDYv+/COyp1aeMcmfrfruz+/nCMFiYyFF/Knn0yfrC85ZzNFjembFTw==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-wrap-function": "^7.18.9", - "@babel/types": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-wrap-function": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -360,122 +365,121 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.21.5.tgz", - "integrity": "sha512-/y7vBgsr9Idu4M6MprbOVUfH3vs7tsIfnVWv/Ml2xgwvyH6LTngdfbf5AdsKwkJy4zgy1X/kuNrEKvhhK28Yrg==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.22.20.tgz", + "integrity": "sha512-qsW0In3dbwQUbK8kejJ4R7IHVGwHJlV6lpG6UA7a9hSa2YEiAib+N1T2kr6PEeUT+Fl7najmSOS6SmAwCHK6Tw==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-member-expression-to-functions": "^7.21.5", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-member-expression-to-functions": "^7.22.15", + "@babel/helper-optimise-call-expression": "^7.22.5" }, "engines": { "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.21.5.tgz", - "integrity": "sha512-ENPDAMC1wAjR0uaCUwliBdiSl1KBJAVnMTzXqi64c2MG8MPR6ii4qf7bSXDqSFbr4W6W028/rf5ivoHop5/mkg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", + "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", "dev": true, "dependencies": { - "@babel/types": "^7.21.5" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.20.0.tgz", - "integrity": "sha512-5y1JYeNKfvnT8sZcK9DVRtpTbGiomYIHviSP3OQWmDPU3DeH4a1ZlT/N2lyQ5P8egjcRaT/Y9aNqUxK0WsnIIg==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.22.5.tgz", + "integrity": "sha512-tK14r66JZKiC43p8Ki33yLBVJKlQDFoA8GYN67lWCDCqoL6EMMSuM9b+Iff2jHaM/RRFYl7K+iiru7hbRqNx8Q==", "dev": true, "dependencies": { - "@babel/types": "^7.20.0" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-split-export-declaration": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.18.6.tgz", - "integrity": "sha512-bde1etTx6ZyTmobl9LLMMQsaizFVZrquTEHOqKeQESMKo4PlObf+8+JA25ZsIpZhT/WEd39+vOdLXAFG/nELpA==", + "version": "7.22.6", + "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", + "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.22.5" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.21.5.tgz", - "integrity": "sha512-5pTUx3hAJaZIdW99sJ6ZUUgWq/Y+Hja7TowEnLNMm1VivRgZQL3vpBY3qUACVsvw+yQU6+YgfBVmcbLaZtrA1w==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", + "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", + "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.21.0.tgz", - "integrity": "sha512-rmL/B8/f0mKS2baE9ZpyTcTavvEuWhTTW8amjzXNvYG4AwBsqTLikfXsEofsJEfKHf+HQVQbFOHy6o+4cnC/fQ==", + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", + "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.20.5.tgz", - "integrity": "sha512-bYMxIWK5mh+TgXGVqAtnu5Yn1un+v8DDZtqyzKRLUzrh70Eal2O3aZ7aPYiMADO4uKlkzOiRiZ6GX5q3qxvW9Q==", + "version": "7.22.20", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.22.20.tgz", + "integrity": "sha512-pms/UwkOpnQe/PDAEdV/d7dVCoBbB+R4FvYoHGZz+4VPcg7RtYy2KP7S2lbuWM6FCSgob5wshfGESbC/hzNXZw==", "dev": true, "dependencies": { - "@babel/helper-function-name": "^7.19.0", - "@babel/template": "^7.18.10", - "@babel/traverse": "^7.20.5", - "@babel/types": "^7.20.5" + "@babel/helper-function-name": "^7.22.5", + "@babel/template": "^7.22.15", + "@babel/types": "^7.22.19" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.21.5.tgz", - "integrity": "sha512-BSY+JSlHxOmGsPTydUkPf1MdMQ3M81x5xGCOVgWM3G8XH77sJ292Y2oqcp0CbbgxhqBuI46iUz1tT7hqP7EfgA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz", + "integrity": "sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA==", "dev": true, "dependencies": { - "@babel/template": "^7.20.7", - "@babel/traverse": "^7.21.5", - "@babel/types": "^7.21.5" + "@babel/template": "^7.22.15", + "@babel/traverse": "^7.23.6", + "@babel/types": "^7.23.6" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", + "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", "dev": true, "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", + "@babel/helper-validator-identifier": "^7.22.20", + "chalk": "^2.4.2", "js-tokens": "^4.0.0" }, "engines": { @@ -483,9 +487,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.21.8", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.8.tgz", - "integrity": "sha512-6zavDGdzG3gUqAdWvlLFfk+36RilI+Pwyuuh7HItyeScCWP3k6i8vKclAQ0bM/0y/Kz/xiwvxhMv9MgTJP5gmA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz", + "integrity": "sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -495,12 +499,12 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.18.6.tgz", - "integrity": "sha512-Dgxsyg54Fx1d4Nge8UnvTrED63vrwOdPmyvPzlNN/boaliRP54pm3pGzZD1SJUwrBA+Cs/xdG8kXX6Mn/RfISQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz", + "integrity": "sha512-iRkKcCqb7iGnq9+3G6rZ+Ciz5VywC4XNRHe57lKM+jOeYAoR0lVqdeeDRfh0tQcTfw/+vBhHn926FmQhLtlFLQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -510,14 +514,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.20.7.tgz", - "integrity": "sha512-sbr9+wNE5aXMBBFBICk01tt7sBf2Oc9ikRFEcem/ZORup9IMUdNhW7/wVLEbbtlWOsEubJet46mHAL2C8+2jKQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.23.3.tgz", + "integrity": "sha512-WwlxbfMNdVEpQjZmK5mhm7oSwD3dS6eU+Iwsi4Knl9wAletWem7kaRsGOG+8UEbRyqxY4SS5zvtfXwX+jMxUwQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-proposal-optional-chaining": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-transform-optional-chaining": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -526,28 +530,27 @@ "@babel/core": "^7.13.0" } }, - "node_modules/@babel/plugin-proposal-async-generator-functions": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.20.7.tgz", - "integrity": "sha512-xMbiLsn/8RK7Wq7VeVytytS2L6qE69bXPB10YCmMdDZbKF4okCqY74pI/jJQ/8U0b/F6NrT2+14b8/P9/3AMGA==", + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz", + "integrity": "sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w==", "dev": true, "dependencies": { - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -560,23 +563,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-class-static-block": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.21.0.tgz", - "integrity": "sha512-XP5G9MWNUskFuP30IfFSEFB0Z6HzLIUcjYM4bYOPHXl7eiJ9HFv8tWj6TXTN5QODiEhDZAeI4hLok2iHFFV4hw==", - "dev": true, - "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-class-static-block": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.12.0" - } - }, "node_modules/@babel/plugin-proposal-decorators": { "version": "7.21.0", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.21.0.tgz", @@ -596,158 +582,11 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-dynamic-import": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.18.6.tgz", - "integrity": "sha512-1auuwmK+Rz13SJj36R+jqFPMJWyKEDd7lLSdOj4oJK0UTgGueSAtkrCvz9ewmgyU/P941Rv2fQwZJN8s6QruXw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-dynamic-import": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-export-namespace-from": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.9.tgz", - "integrity": "sha512-k1NtHyOMvlDDFeb9G5PhUXuGj8m/wiwojgQVEhJ/fsVsMCpLyOP4h0uGEjYJKrRI+EVPlb5Jk+Gt9P97lOGwtA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9", - "@babel/plugin-syntax-export-namespace-from": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-json-strings": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.18.6.tgz", - "integrity": "sha512-lr1peyn9kOdbYc0xr0OdHTZ5FMqS6Di+H0Fz2I/JwMzGmzJETNeOFq2pBySw6X/KFL5EWDjlJuMsUGRFb8fQgQ==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-json-strings": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-logical-assignment-operators": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.20.7.tgz", - "integrity": "sha512-y7C7cZgpMIjWlKE5T7eJwp+tnRYM89HmRvWM5EQuB5BoHEONjmQ8lSNmBUwOyy/GFRsohJED51YBF79hE1djug==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-nullish-coalescing-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.18.6.tgz", - "integrity": "sha512-wQxQzxYeJqHcfppzBDnm1yAY0jSRkUXR2z8RePZYrKwMKgMlE8+Z6LUno+bd6LvbGh8Gltvy74+9pIYkr+XkKA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-numeric-separator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.18.6.tgz", - "integrity": "sha512-ozlZFogPqoLm8WBr5Z8UckIoE4YQ5KESVcNudyXOR8uqIkliTEgJ3RoketfG6pmzLdeZF0H/wjE9/cCEitBl7Q==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-numeric-separator": "^7.10.4" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-object-rest-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.20.7.tgz", - "integrity": "sha512-d2S98yCiLxDVmBmE8UjGcfPvNEUbA1U5q5WxaWFUGRzJSVAZqm5W6MbPct0jxnegUZ0niLeNX+IOzEs7wYg9Dg==", - "dev": true, - "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" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-catch-binding": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.18.6.tgz", - "integrity": "sha512-Q40HEhs9DJQyaZfUjjn6vE8Cv4GmMHCYuMGIWUnlxH6400VGxOuwWsPt4FxXxJkC/5eOzgn0z21M9gMT4MOhbw==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-proposal-optional-chaining": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.21.0.tgz", - "integrity": "sha512-p4zeefM72gpmEe2fkUr/OnOXpWEf8nAgk7ZYVqqfFiyIG7oFfVZcCrU64hWn5xp4tQ9LkV4bTIa5rD0KANpKNA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0", - "@babel/plugin-syntax-optional-chaining": "^7.8.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-proposal-private-methods": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.18.6.tgz", "integrity": "sha512-nutsvktDItsNn4rpGItSNV2sz1XwS+nfU0Rg8aCx3W3NOKVzdMjJRu0O5OkgDp3ZGICSTbgRpxZoWsxoKRvbeA==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-private-methods instead.", "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -761,16 +600,10 @@ } }, "node_modules/@babel/plugin-proposal-private-property-in-object": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0.tgz", - "integrity": "sha512-ha4zfehbJjc5MmXBlHec1igel5TJXXLDDRbuJ4+XT2TJcyD9/V1919BA8gMvsdHcNMBy4WBUBiRb3nw/EQUtBw==", + "version": "7.21.0-placeholder-for-preset-env.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.21.0-placeholder-for-preset-env.2.tgz", + "integrity": "sha512-SOSkfJDddaM7mak6cPEpswyTRnuRltl429hMraQEglW+OkovnCzsiszTmsrlY//qLFjCpQDFRvjdm2wA5pPm9w==", "dev": true, - "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5" - }, "engines": { "node": ">=6.9.0" }, @@ -778,22 +611,6 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-proposal-unicode-property-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", - "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, - "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" - }, - "engines": { - "node": ">=4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, "node_modules/@babel/plugin-syntax-async-generators": { "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", @@ -846,12 +663,12 @@ } }, "node_modules/@babel/plugin-syntax-decorators": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.21.0.tgz", - "integrity": "sha512-tIoPpGBR8UuM4++ccWN3gifhVvQu7ZizuR1fklhRJrd5ewgbkUS+0KVFeWWxELtn18NTLoW32XV7zyOgIAiz+w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.23.3.tgz", + "integrity": "sha512-cf7Niq4/+/juY67E0PbgH0TDhLQ5J7zS8C/Q5FFx+DWyrRa9sUQdTXkjqKu8zGvuqr7vw1muKiukseihU+PJDA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -885,12 +702,12 @@ } }, "node_modules/@babel/plugin-syntax-flow": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.21.4.tgz", - "integrity": "sha512-l9xd3N+XG4fZRxEP3vXdK6RW7vN1Uf5dxzRC/09wV86wqZ/YYQooBIGNsiRdfNR3/q2/5pPzV4B54J/9ctX5jw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.23.3.tgz", + "integrity": "sha512-YZiAIpkJAwQXBJLIQbRFayR5c+gJ35Vcz3bg954k7cd73zqjvhacJuL9RbrzPz8qPmZdgqP6EUKwy0PCNhaaPA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -900,12 +717,27 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.20.0.tgz", - "integrity": "sha512-IUh1vakzNoWalR8ch/areW7qFopR2AEw03JlG7BbrDqmQ4X3q9uuipQwSGrUn7oGiemKjtSLDhNtQHzMHr1JdQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.23.3.tgz", + "integrity": "sha512-lPgDSU+SJLK3xmFDTV2ZRQAiM7UuUjGidwBywFavObCiZc1BeAAcMtHJKUya92hPHO+at63JJPLygilZard8jw==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.23.3.tgz", + "integrity": "sha512-pawnE0P9g10xgoP7yKr6CK63K2FMsTE+FZidZO/1PwRdzmAPVs+HS1mAURUsgaoxammTJvULUdIkEK0gOcU2tA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.19.0" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -939,12 +771,12 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.21.4.tgz", - "integrity": "sha512-5hewiLct5OKyh6PLKEYaFclcqtIgCb6bmELouxjF6up5q3Sov7rOayW4RwhbaBL0dit8rA80GNfY+UuDp2mBbQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.23.3.tgz", + "integrity": "sha512-EB2MELswq55OHUoRZLGg/zC7QWUKfNLpE57m/S2yr1uEneIgsTgrSzXP3NXEsMkVn76OlaVVnzN+ugObuYGwhg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1056,12 +888,12 @@ } }, "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.21.4.tgz", - "integrity": "sha512-xz0D39NvhQn4t4RNsHmDnnsaQizIlUkdtYvLs8La1BlfjQ6JEwxkJGeqJMW2tAXx+q6H+WFuUTXNdYVpEya0YA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.23.3.tgz", + "integrity": "sha512-9EiNjVJOMwCO+43TqoTrgQ8jMwcAd0sWyXi9RPfIsLTj4R2MADDDQXELhffaUx/uJv2AYcxBgPwH6j4TIA4ytQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1070,13 +902,47 @@ "@babel/core": "^7.0.0-0" } }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-unicode-sets-regex/-/plugin-syntax-unicode-sets-regex-7.18.6.tgz", + "integrity": "sha512-727YkEAPwSIQTv5im8QHz3upqp92JTWhidIC81Tdx4VJYIte/VndKf1qKrfnnhPLiPghStWfvC/iFaMCQu7Nqg==", + "dev": true, + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.21.5.tgz", - "integrity": "sha512-wb1mhwGOCaXHDTcsRYMKF9e5bbMgqwxtqa2Y1ifH96dXJPwbuLX9qHy3clhrxVqgMz7nyNXs8VkxdH8UBcjKqA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.23.3.tgz", + "integrity": "sha512-NzQcQrzaQPkaEwoTm4Mhyl8jI1huEL/WWIEvudjTCMJ9aBZNpsJbMASx7EQECtQQPS/DcnFpo0FIh3LvEO9cxQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz", + "integrity": "sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw==", + "dev": true, + "dependencies": { + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20", + "@babel/plugin-syntax-async-generators": "^7.8.4" }, "engines": { "node": ">=6.9.0" @@ -1086,14 +952,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.20.7.tgz", - "integrity": "sha512-Uo5gwHPT9vgnSXQxqGtpdufUiWp96gk7yiP4Mp5bm1QMkEmLXBO7PAGYbKoJ6DhAwiNkcHFBol/x5zZZkL/t0Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.23.3.tgz", + "integrity": "sha512-A7LFsKi4U4fomjqXJlZg/u0ft/n8/7n7lpffUP/ZULx/DtV9SGlNKZolHH6PE8Xl1ngCc0M11OaeZptXVkfKSw==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-remap-async-to-generator": "^7.18.9" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-remap-async-to-generator": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1103,12 +969,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.18.6.tgz", - "integrity": "sha512-ExUcOqpPWnliRcPqves5HJcJOvHvIIWfuS4sroBUenPuMdmW+SMHDakmtS7qOo13sVppmUijqeTv7qqGsvURpQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.23.3.tgz", + "integrity": "sha512-vI+0sIaPIO6CNuM9Kk5VmXcMVRiOpDh7w2zZt9GXzmE/9KD70CUEVhvPR/etAeNK/FAEkhxQtXOzVF3EuRL41A==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1118,12 +984,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.21.0.tgz", - "integrity": "sha512-Mdrbunoh9SxwFZapeHVrwFmri16+oYotcZysSzhNIVDwIAb1UV+kvnxULSYq9J3/q5MDG+4X6w8QVgD1zhBXNQ==", + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.23.4.tgz", + "integrity": "sha512-0QqbP6B6HOh7/8iNR4CQU2Th/bbRtBp4KS9vcaZd1fZ0wSh5Fyssg0UCIHwxh+ka+pNDREbVLQnHCMHKZfPwfw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1132,20 +998,53 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-classes": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.21.0.tgz", - "integrity": "sha512-RZhbYTCEUAe6ntPehC4hlslPWosNHDox+vAs4On/mCLRLfoDVHf6hVEd7kuxr1RnHwJmxFfUM3cZiZRmPxJPXQ==", + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.23.3.tgz", + "integrity": "sha512-uM+AN8yCIjDPccsKGlw271xjJtGii+xQIF/uMPS8H15L12jZTsLfF4o5vNO7d/oUguOyfdikHGc/yi9ge4SGIg==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-compilation-targets": "^7.20.7", - "@babel/helper-environment-visitor": "^7.18.9", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-optimise-call-expression": "^7.18.6", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-replace-supers": "^7.20.7", - "@babel/helper-split-export-declaration": "^7.18.6", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.23.4.tgz", + "integrity": "sha512-nsWu/1M+ggti1SOALj3hfx5FXzAY06fwPJsUZD4/A5e1bWi46VUIWtD+kOX6/IdhXGsXBWllLFDSnqSCdUNydQ==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.23.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz", + "integrity": "sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-optimise-call-expression": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20", + "@babel/helper-split-export-declaration": "^7.22.6", "globals": "^11.1.0" }, "engines": { @@ -1156,13 +1055,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.21.5.tgz", - "integrity": "sha512-TR653Ki3pAwxBxUe8srfF3e4Pe3FTA46uaNHYyQwIoM4oWKSoOZiDNyHJ0oIoDIUPSRQbQG7jzgVBX3FPVne1Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz", + "integrity": "sha512-dTj83UVTLw/+nbiHqQSFdwO9CbTtwq1DsDqm3CUEtDrZNET5rT5E6bIdTlOftDTDLMYxvxHNEYO4B9SLl8SLZw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/template": "^7.20.7" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/template": "^7.22.15" }, "engines": { "node": ">=6.9.0" @@ -1172,12 +1071,12 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.21.3.tgz", - "integrity": "sha512-bp6hwMFzuiE4HqYEyoGJ/V2LeIWn+hLVKc4pnj++E5XQptwhtcGmSayM029d/j2X1bPKGTlsyPwAubuU22KhMA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.23.3.tgz", + "integrity": "sha512-n225npDqjDIr967cMScVKHXJs7rout1q+tt50inyBCPkyZ8KxeI6d+GIbSBTT/w/9WdlWDOej3V9HE5Lgk57gw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1187,13 +1086,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.18.6.tgz", - "integrity": "sha512-6S3jpun1eEbAxq7TdjLotAsl4WpQI9DxfkycRcKrjhQYzU87qpXdknpBg/e+TdcMehqGnLFi7tnFUBR02Vq6wg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.23.3.tgz", + "integrity": "sha512-vgnFYDHAKzFaTVp+mneDsIEbnJ2Np/9ng9iviHw3P/KVcgONxpNULEW/51Z/BaFojG2GI2GwwXck5uV1+1NOYQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1203,12 +1102,28 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.9.tgz", - "integrity": "sha512-d2bmXCtZXYc59/0SanQKbiWINadaJXqtvIQIzd4+hNwkWBgyCd5F/2t1kXoUdvPMrxzPvhK6EMQRROxsue+mfw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.23.3.tgz", + "integrity": "sha512-RrqQ+BQmU3Oyav3J+7/myfvRCq7Tbz+kKLLshUmMwNlDHExbGL7ARhajvoBJEvc+fCguPPu887N+3RRXBVKZUA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.23.4.tgz", + "integrity": "sha512-V6jIbLhdJK86MaLh4Jpghi8ho5fGzt3imHOBu/x0jlBaPYqDoWz4RDXjmMOfnh+JWNaQleEAByZLV0QzBT4YQQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1218,13 +1133,29 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.18.6.tgz", - "integrity": "sha512-wzEtc0+2c88FVR34aQmiz56dxEkxr2g8DQb/KfaFa1JYXOFVsbhvAonFN6PwVWj++fKmku8NP80plJ5Et4wqHw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.23.3.tgz", + "integrity": "sha512-5fhCsl1odX96u7ILKHBj4/Y8vipoqwsJMh4csSA8qFfxrZDEA4Ssku2DyNvMJSmZNOEBT750LfFPbtrnTP90BQ==", "dev": true, "dependencies": { - "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.23.4.tgz", + "integrity": "sha512-GzuSBcKkx62dGzZI1WVgTWvkkz84FZO5TC5T8dl/Tht/rAla6Dg/Mz9Yhypg+ezVACf/rgDuQt3kbWEv7LdUDQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1234,13 +1165,13 @@ } }, "node_modules/@babel/plugin-transform-flow-strip-types": { - "version": "7.21.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.21.0.tgz", - "integrity": "sha512-FlFA2Mj87a6sDkW4gfGrQQqwY/dLlBAyJa2dJEZ+FHXUVHBflO2wyKvg+OOEzXfrKYIa4HWl0mgmbCzt0cMb7w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.23.3.tgz", + "integrity": "sha512-26/pQTf9nQSNVJCrLB1IkHUKyPxR+lMrH2QDPG89+Znu9rAMbtrybdbWeE9bb7gzjmE5iXHEY+e0HUwM6Co93Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-flow": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-flow": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1250,12 +1181,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.21.5.tgz", - "integrity": "sha512-nYWpjKW/7j/I/mZkGVgHJXh4bA1sfdFnJoOXwJuj4m3Q2EraO/8ZyrkCau9P5tbHQk01RMSt6KYLCsW7730SXQ==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.23.6.tgz", + "integrity": "sha512-aYH4ytZ0qSuBbpfhuofbg/e96oQ7U2w1Aw/UQmKT+1l39uEhUPoFS3fHevDc1G0OvewyDudfMKY1OulczHzWIw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1265,14 +1197,30 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.9.tgz", - "integrity": "sha512-WvIBoRPaJQ5yVHzcnJFor7oS5Ls0PYixlTYE63lCj2RtdQEl15M68FXQlxnG6wdraJIXRdR7KI+hQ7q/9QjrCQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.23.3.tgz", + "integrity": "sha512-I1QXp1LxIvt8yLaib49dRW5Okt7Q4oaxao6tFVKS/anCdEOMtYwWVKoiOA1p34GOWIZjUK0E+zCp7+l1pfQyiw==", "dev": true, "dependencies": { - "@babel/helper-compilation-targets": "^7.18.9", - "@babel/helper-function-name": "^7.18.9", - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.23.4.tgz", + "integrity": "sha512-81nTOqM1dMwZ/aRXQ59zVubN9wHGqk6UtqRK+/q+ciXmRy8fSolhGVvG09HHRGo4l6fr/c4ZhXUQH0uFW7PZbg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-json-strings": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1282,12 +1230,28 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz", - "integrity": "sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.23.3.tgz", + "integrity": "sha512-wZ0PIXRxnwZvl9AYpqNUxpZ5BiTGrYt7kueGQ+N5FiQ7RCOD4cm8iShd6S6ggfVIWaJf2EMk8eRzAh52RfP4rQ==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.23.4.tgz", + "integrity": "sha512-Mc/ALf1rmZTP4JKKEhUwiORU+vcfarFVLfcFiolKUo6sewoxSEgl36ak5t+4WamRsNr6nzjZXQjM35WsU+9vbg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" }, "engines": { "node": ">=6.9.0" @@ -1297,12 +1261,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.18.6.tgz", - "integrity": "sha512-qSF1ihLGO3q+/g48k85tUjD033C29TNTVB2paCwZPVmOsjn9pClvYYrM2VeJpBY2bcNkuny0YUyTNRyRxJ54KA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.23.3.tgz", + "integrity": "sha512-sC3LdDBDi5x96LA+Ytekz2ZPk8i/Ck+DEuDbRAll5rknJ5XRTSaPKEYwomLcs1AA8wg9b3KjIQRsnApj+q51Ag==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1312,13 +1276,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.20.11.tgz", - "integrity": "sha512-NuzCt5IIYOW0O30UvqktzHYR2ud5bOWbY0yaxWZ6G+aFzOMJvrs5YHNikrbdaT15+KNO31nPOy5Fim3ku6Zb5g==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.23.3.tgz", + "integrity": "sha512-vJYQGxeKM4t8hYCKVBlZX/gtIY2I7mRGFNcm85sgXGMTBcoV3QdVtdpbcWEbzbfUIUZKwvgFT82mRvaQIebZzw==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1328,14 +1292,14 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.21.5.tgz", - "integrity": "sha512-OVryBEgKUbtqMoB7eG2rs6UFexJi6Zj6FDXx+esBLPTCxCNxAY9o+8Di7IsUGJ+AVhp5ncK0fxWUBd0/1gPhrQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.23.3.tgz", + "integrity": "sha512-aVS0F65LKsdNOtcz6FRCpE4OgsP2OFnW46qNxNIX9h3wuzaNcSQsJysuMwqSibC98HPrf2vCgtxKNwS0DAlgcA==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-simple-access": "^7.21.5" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-simple-access": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1345,15 +1309,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.20.11", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.20.11.tgz", - "integrity": "sha512-vVu5g9BPQKSFEmvt2TA4Da5N+QVS66EX21d8uoOihC+OCpUoGvzVsXeqFdtAEfVa5BILAeFt+U7yVmLbQnAJmw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz", + "integrity": "sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ==", "dev": true, "dependencies": { - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-module-transforms": "^7.20.11", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-validator-identifier": "^7.19.1" + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-identifier": "^7.22.20" }, "engines": { "node": ">=6.9.0" @@ -1363,13 +1327,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.18.6.tgz", - "integrity": "sha512-dcegErExVeXcRqNtkRU/z8WlBLnvD4MRnHgNs3MytRO1Mn1sHRyhbcpYbVMGclAqOjdW+9cfkdZno9dFdfKLfQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz", + "integrity": "sha512-zHsy9iXX2nIsCBFPud3jKn1IRPWg3Ing1qOZgeKV39m1ZgIdpJqvlWVeiHBZC6ITRG0MfskhYe9cLgntfSFPIg==", "dev": true, "dependencies": { - "@babel/helper-module-transforms": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-module-transforms": "^7.23.3", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1379,13 +1343,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.20.5.tgz", - "integrity": "sha512-mOW4tTzi5iTLnw+78iEq3gr8Aoq4WNRGpmSlrogqaiCBoR1HFhpU4JkpQFOHfeYx3ReVIFWOQJS4aZBRvuZ6mA==", + "version": "7.22.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.22.5.tgz", + "integrity": "sha512-YgLLKmS3aUBhHaxp5hi1WJTgOUb/NCuDHzGT9z9WTt3YG+CPRhJs6nprbStx6DnWM4dh6gt7SU3sZodbZ08adQ==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.20.5", - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-create-regexp-features-plugin": "^7.22.5", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1395,12 +1359,63 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.18.6.tgz", - "integrity": "sha512-DjwFA/9Iu3Z+vrAn+8pBUGcjhxKguSMlsFqeCKbhb9BAV756v0krzVK04CRDi/4aqmk8BsHb4a/gFcaA5joXRw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.23.3.tgz", + "integrity": "sha512-YJ3xKqtJMAT5/TIZnpAR3I+K+WaDowYbN3xyxI8zxx/Gsypwf9B9h0VB+1Nh6ACAAPRS5NSRje0uVv5i79HYGQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.23.4.tgz", + "integrity": "sha512-jHE9EVVqHKAQx+VePv5LLGHjmHSJR76vawFPTdlxR/LVJPfOEGxREQwQfjuZEOPTwG92X3LINSh3M40Rv4zpVA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.23.4.tgz", + "integrity": "sha512-mps6auzgwjRrwKEZA05cOwuDc9FAzoyFS4ZsG/8F43bTLf/TgkJg7QXOrPO1JO599iA3qgK9MXdMGOEC8O1h6Q==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.23.4.tgz", + "integrity": "sha512-9x9K1YyeQVw0iOXJlIzwm8ltobIIv7j2iLyP2jIhEbqPRQ7ScNgwQufU2I0Gq11VjyG4gI4yMXt2VFags+1N3g==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.3", + "@babel/helper-compilation-targets": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1410,13 +1425,46 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.18.6.tgz", - "integrity": "sha512-uvGz6zk+pZoS1aTZrOvrbj6Pp/kK2mp45t2B+bTDre2UgsZZ8EZLSJtUg7m/no0zOJUWgFONpB7Zv9W2tSaFlA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.23.3.tgz", + "integrity": "sha512-BwQ8q0x2JG+3lxCVFohg+KbQM7plfpBwThdW9A6TMtWwLsbDA01Ek2Zb/AgDN39BiZsExm4qrXxjk+P1/fzGrA==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-replace-supers": "^7.22.20" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.23.4.tgz", + "integrity": "sha512-XIq8t0rJPHf6Wvmbn9nFxU6ao4c7WhghTR5WyV8SrJfUFzyxhCm4nhC+iAp3HFhbAKLfYpgzhJ6t4XCtVwqO5A==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.23.4.tgz", + "integrity": "sha512-ZU8y5zWOfjM5vZ+asjgAPwDaBjJzgufjES89Rs4Lpq63O300R/kOz30WCLo6BxxX6QVEilwSlpClnG5cZaikTA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6", - "@babel/helper-replace-supers": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" }, "engines": { "node": ">=6.9.0" @@ -1426,12 +1474,46 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.21.3.tgz", - "integrity": "sha512-Wxc+TvppQG9xWFYatvCGPvZ6+SIUxQ2ZdiBP+PHYMIjnPXD+uThCshaz4NZOnODAtBjjcVQQ/3OKs9LW28purQ==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.23.3.tgz", + "integrity": "sha512-09lMt6UsUb3/34BbECKVbVwrT9bO6lILWln237z7sLaWnMsTi7Yc9fhX5DLpkJzAGfaReXI22wP41SZmnAA3Vw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2" + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.23.3.tgz", + "integrity": "sha512-UzqRcRtWsDMTLrRWFvUBDwmw06tCQH9Rl1uAjfh6ijMSmGYQ+fpdB+cnqRC8EMh5tuuxSv0/TejGL+7vyj+50g==", + "dev": true, + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.23.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.23.4.tgz", + "integrity": "sha512-9G3K1YqTq3F4Vt88Djx1UZ79PDyj+yKRnUy7cZGSMe+a7jkwD259uKKuUzQlPkGam7R+8RJwh5z4xO27fA1o2A==", + "dev": true, + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" }, "engines": { "node": ">=6.9.0" @@ -1441,12 +1523,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.18.6.tgz", - "integrity": "sha512-cYcs6qlgafTud3PAzrrRNbQtfpQ8+y/+M5tKmksS9+M1ckbH6kzY8MrexEM9mcA6JDsukE19iIRvAyYl463sMg==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.23.3.tgz", + "integrity": "sha512-jR3Jn3y7cZp4oEWPFAlRsSWjxKe4PZILGBSd4nis1TsC5qeSpb+nrtihJuDhNI7QHiVbUaiXa0X2RZY3/TI6Nw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1456,13 +1538,13 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.21.5.tgz", - "integrity": "sha512-ZoYBKDb6LyMi5yCsByQ5jmXsHAQDDYeexT1Szvlmui+lADvfSecr5Dxd/PkrTC3pAD182Fcju1VQkB4oCp9M+w==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.23.3.tgz", + "integrity": "sha512-KP+75h0KghBMcVpuKisx3XTu9Ncut8Q8TuvGO4IhY+9D5DFEckQefOuIsB/gQ2tG71lCke4NMrtIPS8pOj18BQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5", - "regenerator-transform": "^0.15.1" + "@babel/helper-plugin-utils": "^7.22.5", + "regenerator-transform": "^0.15.2" }, "engines": { "node": ">=6.9.0" @@ -1472,12 +1554,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.18.6.tgz", - "integrity": "sha512-oX/4MyMoypzHjFrT1CdivfKZ+XvIPMFXwwxHp/r0Ddy2Vuomt4HDFGmft1TAY2yiTKiNSsh3kjBAzcM8kSdsjA==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.23.3.tgz", + "integrity": "sha512-QnNTazY54YqgGxwIexMZva9gqbPa15t/x9VS+0fsEFWplwVpXYZivtgl43Z1vMpc1bdPP2PP8siFeVcnFvA3Cg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1487,17 +1569,17 @@ } }, "node_modules/@babel/plugin-transform-runtime": { - "version": "7.21.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.21.4.tgz", - "integrity": "sha512-1J4dhrw1h1PqnNNpzwxQ2UBymJUF8KuPjAAnlLwZcGhHAIqUigFW7cdK6GHoB64ubY4qXQNYknoUeks4Wz7CUA==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.6.tgz", + "integrity": "sha512-kF1Zg62aPseQ11orDhFRw+aPG/eynNQtI+TyY+m33qJa2cJ5EEvza2P2BNTIA9E5MyqFABHEyY6CPHwgdy9aNg==", "dev": true, "dependencies": { - "@babel/helper-module-imports": "^7.21.4", - "@babel/helper-plugin-utils": "^7.20.2", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "semver": "^6.3.0" + "@babel/helper-module-imports": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1507,12 +1589,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.18.6.tgz", - "integrity": "sha512-eCLXXJqv8okzg86ywZJbRn19YJHU4XUa55oz2wbHhaQVn/MM+XhukiT7SYqp/7o00dg52Rj51Ny+Ecw4oyoygw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.23.3.tgz", + "integrity": "sha512-ED2fgqZLmexWiN+YNFX26fx4gh5qHDhn1O2gvEhreLW2iI63Sqm4llRLCXALKrCnbN4Jy0VcMQZl/SAzqug/jg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1522,13 +1604,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.20.7.tgz", - "integrity": "sha512-ewBbHQ+1U/VnH1fxltbJqDeWBU1oNLG8Dj11uIv3xVf7nrQu0bPGe5Rf716r7K5Qz+SqtAOVswoVunoiBtGhxw==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.23.3.tgz", + "integrity": "sha512-VvfVYlrlBVu+77xVTOAoxQ6mZbnIq5FM0aGBSFEcIh03qHf+zNqA4DC/3XMUozTg7bZV3e3mZQ0i13VB6v5yUg==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/helper-skip-transparent-expression-wrappers": "^7.20.0" + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-skip-transparent-expression-wrappers": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1538,12 +1620,42 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.18.6.tgz", - "integrity": "sha512-kfiDrDQ+PBsQDO85yj1icueWMfGfJFKN1KCkndygtu/C9+XUfydLC8Iv5UYJqRwy4zk8EcplRxEOeLyjq1gm6Q==", + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.23.3.tgz", + "integrity": "sha512-HZOyN9g+rtvnOU3Yh7kSxXrKbzgrm5X4GncPY1QOquu7epga5MxKHVpYu2hvQnry/H+JjckSYRb93iNfsioAGg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.23.3.tgz", + "integrity": "sha512-Flok06AYNp7GV2oJPZZcP9vZdszev6vPBkHLwxwSpaIqx75wn6mUd3UFWsSsA0l8nXAKkyCmL/sR02m8RYGeHg==", + "dev": true, + "dependencies": { + "@babel/helper-plugin-utils": "^7.22.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.23.3.tgz", + "integrity": "sha512-4t15ViVnaFdrPC74be1gXBSMzXk3B4Us9lP7uLRQHTFpV5Dvt33pn+2MyyNxmN3VTTm3oTrZVMUmuw3oBnQ2oQ==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1552,13 +1664,16 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.9.tgz", - "integrity": "sha512-S8cOWfT82gTezpYOiVaGHrCbhlHgKhQt8XH5ES46P2XWmX92yisoZywf5km75wv5sYcXDUCLMmMxOLCtthDgMA==", + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.23.6.tgz", + "integrity": "sha512-6cBG5mBvUu4VUD04OHKnYzbuHNP8huDsD3EDqqpIpsswTDoqHCjLoHb6+QgsV1WsT2nipRqCPgxD3LXnEO7XfA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-annotate-as-pure": "^7.22.5", + "@babel/helper-create-class-features-plugin": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/plugin-syntax-typescript": "^7.23.3" }, "engines": { "node": ">=6.9.0" @@ -1567,13 +1682,13 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.18.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.9.tgz", - "integrity": "sha512-SRfwTtF11G2aemAZWivL7PD+C9z52v9EvMqH9BuYbabyPuKUvSWks3oCg6041pT925L4zVFqaVBeECwsmlguEw==", + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.23.3.tgz", + "integrity": "sha512-OMCUx/bU6ChE3r4+ZdylEqAjaQgHAgipgW8nsCfu5pGqDcFytVd91AwRvUJSBZDz0exPGgnjoqhgRYLRjFZc9Q==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.18.9" + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1582,16 +1697,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-typescript": { - "version": "7.21.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.21.3.tgz", - "integrity": "sha512-RQxPz6Iqt8T0uw/WsJNReuBpWpBqs/n7mNo18sKLoTbMp+UrEekhH+pKSVC7gWz+DNjo9gryfV8YzCiT45RgMw==", + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.23.3.tgz", + "integrity": "sha512-KcLIm+pDZkWZQAFJ9pdfmh89EwVfmNovFBcXko8szpBeF8z68kWIPeKlmSOkT9BXJxs2C0uk+5LxoxIv62MROA==", "dev": true, "dependencies": { - "@babel/helper-annotate-as-pure": "^7.18.6", - "@babel/helper-create-class-features-plugin": "^7.21.0", - "@babel/helper-plugin-utils": "^7.20.2", - "@babel/plugin-syntax-typescript": "^7.20.0" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1600,13 +1713,14 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.21.5.tgz", - "integrity": "sha512-LYm/gTOwZqsYohlvFUe/8Tujz75LqqVC2w+2qPHLR+WyWHGCZPN1KBpJCJn+4Bk4gOkQy/IXKIge6az5MqwlOg==", + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.23.3.tgz", + "integrity": "sha512-wMHpNA4x2cIA32b/ci3AfwNgheiva2W0WUKWTK7vBHBhDKfPsc5cFGNWm69WBqpwd86u1qwZ9PWevKqm1A3yAw==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.21.5" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" @@ -1615,55 +1729,43 @@ "@babel/core": "^7.0.0-0" } }, - "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.18.6.tgz", - "integrity": "sha512-gE7A6Lt7YLnNOL3Pb9BNeZvi+d8l7tcRrG4+pwJjK9hD2xX4mEvjlQW60G9EEmfXVYRPv9VRQcyegIVHCql/AA==", + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.23.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.23.3.tgz", + "integrity": "sha512-W7lliA/v9bNR83Qc3q1ip9CQMZ09CcHDbHfbLRDNuAhn1Mvkr1ZNF7hPmztMQvtTGVLJ9m8IZqWsTkXOml8dbw==", "dev": true, "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.18.6", - "@babel/helper-plugin-utils": "^7.18.6" + "@babel/helper-create-regexp-features-plugin": "^7.22.15", + "@babel/helper-plugin-utils": "^7.22.5" }, "engines": { "node": ">=6.9.0" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0" } }, "node_modules/@babel/preset-env": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.21.5.tgz", - "integrity": "sha512-wH00QnTTldTbf/IefEVyChtRdw5RJvODT/Vb4Vcxq1AZvtXj6T0YeX0cAcXhI6/BdGuiP3GcNIL4OQbI2DVNxg==", - "dev": true, - "dependencies": { - "@babel/compat-data": "^7.21.5", - "@babel/helper-compilation-targets": "^7.21.5", - "@babel/helper-plugin-utils": "^7.21.5", - "@babel/helper-validator-option": "^7.21.0", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.18.6", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.20.7", - "@babel/plugin-proposal-async-generator-functions": "^7.20.7", - "@babel/plugin-proposal-class-properties": "^7.18.6", - "@babel/plugin-proposal-class-static-block": "^7.21.0", - "@babel/plugin-proposal-dynamic-import": "^7.18.6", - "@babel/plugin-proposal-export-namespace-from": "^7.18.9", - "@babel/plugin-proposal-json-strings": "^7.18.6", - "@babel/plugin-proposal-logical-assignment-operators": "^7.20.7", - "@babel/plugin-proposal-nullish-coalescing-operator": "^7.18.6", - "@babel/plugin-proposal-numeric-separator": "^7.18.6", - "@babel/plugin-proposal-object-rest-spread": "^7.20.7", - "@babel/plugin-proposal-optional-catch-binding": "^7.18.6", - "@babel/plugin-proposal-optional-chaining": "^7.21.0", - "@babel/plugin-proposal-private-methods": "^7.18.6", - "@babel/plugin-proposal-private-property-in-object": "^7.21.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.18.6", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz", + "integrity": "sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ==", + "dev": true, + "dependencies": { + "@babel/compat-data": "^7.23.5", + "@babel/helper-compilation-targets": "^7.23.6", + "@babel/helper-plugin-utils": "^7.22.5", + "@babel/helper-validator-option": "^7.23.5", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.23.3", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.23.3", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.23.3", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", "@babel/plugin-syntax-class-static-block": "^7.14.5", "@babel/plugin-syntax-dynamic-import": "^7.8.3", "@babel/plugin-syntax-export-namespace-from": "^7.8.3", - "@babel/plugin-syntax-import-assertions": "^7.20.0", + "@babel/plugin-syntax-import-assertions": "^7.23.3", + "@babel/plugin-syntax-import-attributes": "^7.23.3", "@babel/plugin-syntax-import-meta": "^7.10.4", "@babel/plugin-syntax-json-strings": "^7.8.3", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", @@ -1674,45 +1776,61 @@ "@babel/plugin-syntax-optional-chaining": "^7.8.3", "@babel/plugin-syntax-private-property-in-object": "^7.14.5", "@babel/plugin-syntax-top-level-await": "^7.14.5", - "@babel/plugin-transform-arrow-functions": "^7.21.5", - "@babel/plugin-transform-async-to-generator": "^7.20.7", - "@babel/plugin-transform-block-scoped-functions": "^7.18.6", - "@babel/plugin-transform-block-scoping": "^7.21.0", - "@babel/plugin-transform-classes": "^7.21.0", - "@babel/plugin-transform-computed-properties": "^7.21.5", - "@babel/plugin-transform-destructuring": "^7.21.3", - "@babel/plugin-transform-dotall-regex": "^7.18.6", - "@babel/plugin-transform-duplicate-keys": "^7.18.9", - "@babel/plugin-transform-exponentiation-operator": "^7.18.6", - "@babel/plugin-transform-for-of": "^7.21.5", - "@babel/plugin-transform-function-name": "^7.18.9", - "@babel/plugin-transform-literals": "^7.18.9", - "@babel/plugin-transform-member-expression-literals": "^7.18.6", - "@babel/plugin-transform-modules-amd": "^7.20.11", - "@babel/plugin-transform-modules-commonjs": "^7.21.5", - "@babel/plugin-transform-modules-systemjs": "^7.20.11", - "@babel/plugin-transform-modules-umd": "^7.18.6", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.20.5", - "@babel/plugin-transform-new-target": "^7.18.6", - "@babel/plugin-transform-object-super": "^7.18.6", - "@babel/plugin-transform-parameters": "^7.21.3", - "@babel/plugin-transform-property-literals": "^7.18.6", - "@babel/plugin-transform-regenerator": "^7.21.5", - "@babel/plugin-transform-reserved-words": "^7.18.6", - "@babel/plugin-transform-shorthand-properties": "^7.18.6", - "@babel/plugin-transform-spread": "^7.20.7", - "@babel/plugin-transform-sticky-regex": "^7.18.6", - "@babel/plugin-transform-template-literals": "^7.18.9", - "@babel/plugin-transform-typeof-symbol": "^7.18.9", - "@babel/plugin-transform-unicode-escapes": "^7.21.5", - "@babel/plugin-transform-unicode-regex": "^7.18.6", - "@babel/preset-modules": "^0.1.5", - "@babel/types": "^7.21.5", - "babel-plugin-polyfill-corejs2": "^0.3.3", - "babel-plugin-polyfill-corejs3": "^0.6.0", - "babel-plugin-polyfill-regenerator": "^0.4.1", - "core-js-compat": "^3.25.1", - "semver": "^6.3.0" + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.23.3", + "@babel/plugin-transform-async-generator-functions": "^7.23.4", + "@babel/plugin-transform-async-to-generator": "^7.23.3", + "@babel/plugin-transform-block-scoped-functions": "^7.23.3", + "@babel/plugin-transform-block-scoping": "^7.23.4", + "@babel/plugin-transform-class-properties": "^7.23.3", + "@babel/plugin-transform-class-static-block": "^7.23.4", + "@babel/plugin-transform-classes": "^7.23.5", + "@babel/plugin-transform-computed-properties": "^7.23.3", + "@babel/plugin-transform-destructuring": "^7.23.3", + "@babel/plugin-transform-dotall-regex": "^7.23.3", + "@babel/plugin-transform-duplicate-keys": "^7.23.3", + "@babel/plugin-transform-dynamic-import": "^7.23.4", + "@babel/plugin-transform-exponentiation-operator": "^7.23.3", + "@babel/plugin-transform-export-namespace-from": "^7.23.4", + "@babel/plugin-transform-for-of": "^7.23.6", + "@babel/plugin-transform-function-name": "^7.23.3", + "@babel/plugin-transform-json-strings": "^7.23.4", + "@babel/plugin-transform-literals": "^7.23.3", + "@babel/plugin-transform-logical-assignment-operators": "^7.23.4", + "@babel/plugin-transform-member-expression-literals": "^7.23.3", + "@babel/plugin-transform-modules-amd": "^7.23.3", + "@babel/plugin-transform-modules-commonjs": "^7.23.3", + "@babel/plugin-transform-modules-systemjs": "^7.23.3", + "@babel/plugin-transform-modules-umd": "^7.23.3", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.22.5", + "@babel/plugin-transform-new-target": "^7.23.3", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.23.4", + "@babel/plugin-transform-numeric-separator": "^7.23.4", + "@babel/plugin-transform-object-rest-spread": "^7.23.4", + "@babel/plugin-transform-object-super": "^7.23.3", + "@babel/plugin-transform-optional-catch-binding": "^7.23.4", + "@babel/plugin-transform-optional-chaining": "^7.23.4", + "@babel/plugin-transform-parameters": "^7.23.3", + "@babel/plugin-transform-private-methods": "^7.23.3", + "@babel/plugin-transform-private-property-in-object": "^7.23.4", + "@babel/plugin-transform-property-literals": "^7.23.3", + "@babel/plugin-transform-regenerator": "^7.23.3", + "@babel/plugin-transform-reserved-words": "^7.23.3", + "@babel/plugin-transform-shorthand-properties": "^7.23.3", + "@babel/plugin-transform-spread": "^7.23.3", + "@babel/plugin-transform-sticky-regex": "^7.23.3", + "@babel/plugin-transform-template-literals": "^7.23.3", + "@babel/plugin-transform-typeof-symbol": "^7.23.3", + "@babel/plugin-transform-unicode-escapes": "^7.23.3", + "@babel/plugin-transform-unicode-property-regex": "^7.23.3", + "@babel/plugin-transform-unicode-regex": "^7.23.3", + "@babel/plugin-transform-unicode-sets-regex": "^7.23.3", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.6", + "babel-plugin-polyfill-corejs3": "^0.8.5", + "babel-plugin-polyfill-regenerator": "^0.5.3", + "core-js-compat": "^3.31.0", + "semver": "^6.3.1" }, "engines": { "node": ">=6.9.0" @@ -1722,19 +1840,17 @@ } }, "node_modules/@babel/preset-modules": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.5.tgz", - "integrity": "sha512-A57th6YRG7oR3cq/yt/Y84MvGgE0eJG2F1JLhKuyG+jFxEgrd/HAMJatiFtmOiZurz+0DkrvbheCLaV5f2JfjA==", + "version": "0.1.6-no-external-plugins", + "resolved": "https://registry.npmjs.org/@babel/preset-modules/-/preset-modules-0.1.6-no-external-plugins.tgz", + "integrity": "sha512-HrcgcIESLm9aIR842yhJ5RWan/gebQUJ6E/E5+rf0y9o6oj7w0Br+sWuL6kEQ/o/AdfvR1Je9jG18/gnpwjEyA==", "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", - "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", - "@babel/plugin-transform-dotall-regex": "^7.4.4", "@babel/types": "^7.4.4", "esutils": "^2.0.2" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" } }, "node_modules/@babel/preset-typescript": { @@ -1763,46 +1879,46 @@ "dev": true }, "node_modules/@babel/runtime": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.21.5.tgz", - "integrity": "sha512-8jI69toZqqcsnqGGqwGS4Qb1VwLOEp4hz+CXPywcvjs60u3B4Pom/U/7rm4W8tMOYEB+E9wgD0mW1l3r8qlI9Q==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz", + "integrity": "sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ==", "dev": true, "dependencies": { - "regenerator-runtime": "^0.13.11" + "regenerator-runtime": "^0.14.0" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/template": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.20.7.tgz", - "integrity": "sha512-8SegXApWe6VoNw0r9JHpSteLKTpTiLZ4rMlGIm9JQ18KiCtyQiAMEazujAHrUS5flrcqYZa75ukev3P6QmUwUw==", + "version": "7.22.15", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz", + "integrity": "sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.18.6", - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7" + "@babel/code-frame": "^7.22.13", + "@babel/parser": "^7.22.15", + "@babel/types": "^7.22.15" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.21.5.tgz", - "integrity": "sha512-AhQoI3YjWi6u/y/ntv7k48mcrCXmus0t79J9qPNlk/lAsFlCiJ047RmbfMOawySTHtywXhbXgpx/8nXMYd+oFw==", - "dev": true, - "dependencies": { - "@babel/code-frame": "^7.21.4", - "@babel/generator": "^7.21.5", - "@babel/helper-environment-visitor": "^7.21.5", - "@babel/helper-function-name": "^7.21.0", - "@babel/helper-hoist-variables": "^7.18.6", - "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.21.5", - "@babel/types": "^7.21.5", - "debug": "^4.1.0", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz", + "integrity": "sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ==", + "dev": true, + "dependencies": { + "@babel/code-frame": "^7.23.5", + "@babel/generator": "^7.23.6", + "@babel/helper-environment-visitor": "^7.22.20", + "@babel/helper-function-name": "^7.23.0", + "@babel/helper-hoist-variables": "^7.22.5", + "@babel/helper-split-export-declaration": "^7.22.6", + "@babel/parser": "^7.23.6", + "@babel/types": "^7.23.6", + "debug": "^4.3.1", "globals": "^11.1.0" }, "engines": { @@ -1810,13 +1926,13 @@ } }, "node_modules/@babel/types": { - "version": "7.21.5", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.21.5.tgz", - "integrity": "sha512-m4AfNvVF2mVC/F7fDEdH2El3HzUg9It/XsCxZiOTTA3m3qYfcSVSbTfM6Q9xG+hYDniZssYhlXKKUMD5m8tF4Q==", + "version": "7.23.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz", + "integrity": "sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.21.5", - "@babel/helper-validator-identifier": "^7.19.1", + "@babel/helper-string-parser": "^7.23.4", + "@babel/helper-validator-identifier": "^7.22.20", "to-fast-properties": "^2.0.0" }, "engines": { @@ -1901,9 +2017,9 @@ } }, "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -2582,6 +2698,12 @@ "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", "dev": true }, + "node_modules/@jest/transform/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/@jest/transform/node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -2722,9 +2844,9 @@ } }, "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", + "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", "dev": true, "engines": { "node": ">=6.0.0" @@ -2740,9 +2862,9 @@ } }, "node_modules/@jridgewell/source-map": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.3.tgz", - "integrity": "sha512-b+fsZXeLYi9fEULmfBrhxn4IrPlINf8fiNarzTof004v3lFdntdwa9PF7vFJqm3mg7s+ScJMxXaE3Acp1irZcg==", + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.5.tgz", + "integrity": "sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==", "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", @@ -2756,21 +2878,15 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.18", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.18.tgz", - "integrity": "sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz", + "integrity": "sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" } }, - "node_modules/@jridgewell/trace-mapping/node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, "node_modules/@nicolo-ribaudo/chokidar-2": { "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", @@ -2956,9 +3072,9 @@ } }, "node_modules/@stryker-mutator/core/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -2998,6 +3114,69 @@ "node": ">=14.18.0" } }, + "node_modules/@stryker-mutator/instrumenter/node_modules/@babel/core": { + "version": "7.21.8", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.21.8.tgz", + "integrity": "sha512-YeM22Sondbo523Sz0+CirSPnbj9bG3P0CdHcBZdqUuaeOaYEFbOLoGU7lebvGP6P5J/WE9wOn7u7C4J9HvS1xQ==", + "dev": true, + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.21.4", + "@babel/generator": "^7.21.5", + "@babel/helper-compilation-targets": "^7.21.5", + "@babel/helper-module-transforms": "^7.21.5", + "@babel/helpers": "^7.21.5", + "@babel/parser": "^7.21.8", + "@babel/template": "^7.20.7", + "@babel/traverse": "^7.21.5", + "@babel/types": "^7.21.5", + "convert-source-map": "^1.7.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.2", + "semver": "^6.3.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@stryker-mutator/instrumenter/node_modules/@babel/generator": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.21.9.tgz", + "integrity": "sha512-F3fZga2uv09wFdEjEQIJxXALXfz0+JaOb7SabvVMmjHxeVTuGW8wgE8Vp1Hd7O+zMTYtcfEISGRzPkeiaPPsvg==", + "dev": true, + "dependencies": { + "@babel/types": "^7.21.5", + "@jridgewell/gen-mapping": "^0.3.2", + "@jridgewell/trace-mapping": "^0.3.17", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@stryker-mutator/instrumenter/node_modules/@babel/parser": { + "version": "7.21.9", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.21.9.tgz", + "integrity": "sha512-q5PNg/Bi1OpGgx5jYlvWZwAorZepEudDMCLtj967aeS7WMont7dUZI46M2XwcIQqvUlMxWfdLFu4S/qSxeUu5g==", + "dev": true, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@stryker-mutator/instrumenter/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/@stryker-mutator/jest-runner": { "version": "6.4.2", "resolved": "https://registry.npmjs.org/@stryker-mutator/jest-runner/-/jest-runner-6.4.2.tgz", @@ -3068,9 +3247,9 @@ } }, "node_modules/@types/babel__core": { - "version": "7.20.0", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.0.tgz", - "integrity": "sha512-+n8dL/9GWblDO0iU6eZAwEIJVr5DWigtle+Q6HLOrh/pdbXOhOtqzq8VPPE2zvNJzSKY4vH/z3iT3tn0A3ypiQ==", + "version": "7.20.5", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", + "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", "dev": true, "dependencies": { "@babel/parser": "^7.20.7", @@ -3081,18 +3260,18 @@ } }, "node_modules/@types/babel__generator": { - "version": "7.6.4", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.4.tgz", - "integrity": "sha512-tFkciB9j2K755yrTALxD44McOrk+gfpIpvC3sxHjRawj6PfnQxrse4Clq5y/Rq+G3mrBurMax/lG8Qn2t9mSsg==", + "version": "7.6.7", + "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.6.7.tgz", + "integrity": "sha512-6Sfsq+EaaLrw4RmdFWE9Onp63TOUue71AWb4Gpa6JxzgTYtimbM086WnYTy2U67AofR++QKCo08ZP6pwx8YFHQ==", "dev": true, "dependencies": { "@babel/types": "^7.0.0" } }, "node_modules/@types/babel__template": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.1.tgz", - "integrity": "sha512-azBFKemX6kMg5Io+/rdGT0dkGreboUVR0Cdm3fz9QJWpaQGJRQXl7C+6hOTCZcMll7KFyEQpgbYI2lHdsS4U7g==", + "version": "7.4.4", + "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", + "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", "dev": true, "dependencies": { "@babel/parser": "^7.1.0", @@ -3100,18 +3279,18 @@ } }, "node_modules/@types/babel__traverse": { - "version": "7.18.5", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.18.5.tgz", - "integrity": "sha512-enCvTL8m/EHS/zIvJno9nE+ndYPh1/oNFzRYRmtUqJICG2VnCSBzMLW5VN2KCQU91f23tsNKR8v7VJJQMatl7Q==", + "version": "7.20.4", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz", + "integrity": "sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA==", "dev": true, "dependencies": { - "@babel/types": "^7.3.0" + "@babel/types": "^7.20.7" } }, "node_modules/@types/eslint": { - "version": "8.37.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.37.0.tgz", - "integrity": "sha512-Piet7dG2JBuDIfohBngQ3rCt7MgO9xCO4xIMKxBThCq5PNRB91IjlJ10eJVwfoNtvTErmxLzwBZ7rHZtbOMmFQ==", + "version": "8.44.9", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.44.9.tgz", + "integrity": "sha512-6yBxcvwnnYoYT1Uk2d+jvIfsuP4mb2EdIxFnrPABj5a/838qe5bGkNLFOiipX4ULQ7XVQvTxOh7jO+BTAiqsEw==", "dev": true, "dependencies": { "@types/estree": "*", @@ -3119,9 +3298,9 @@ } }, "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", + "version": "3.7.7", + "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", + "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", "dev": true, "dependencies": { "@types/eslint": "*", @@ -3129,48 +3308,48 @@ } }, "node_modules/@types/estree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.1.tgz", - "integrity": "sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==", "dev": true }, "node_modules/@types/graceful-fs": { - "version": "4.1.6", - "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.6.tgz", - "integrity": "sha512-Sig0SNORX9fdW+bQuTEovKj3uHcUL6LQKbCrrqb1X7J6/ReAbhCXRAhc+SMejhLELFj2QcyuxmUooZ4bt5ReSw==", + "version": "4.1.9", + "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", + "integrity": "sha512-olP3sd1qOEe5dXTSaFvQG+02VdRXcdytWLAZsAq1PecU8uqQAhkrnbli7DagjtXKW/Bl7YJbUsa8MPcuc8LHEQ==", "dev": true, "dependencies": { "@types/node": "*" } }, "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz", - "integrity": "sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==", + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", + "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", + "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" } }, "node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", + "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" } }, "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", "dev": true }, "node_modules/@types/json5": { @@ -3180,54 +3359,57 @@ "dev": true }, "node_modules/@types/minimist": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.2.tgz", - "integrity": "sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag==", "dev": true }, "node_modules/@types/node": { - "version": "20.1.4", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.1.4.tgz", - "integrity": "sha512-At4pvmIOki8yuwLtd7BNHl3CiWNbtclUbNtScGx4OHfBd4/oWoJC8KRCIxXwkdndzhxOsPXihrsOoydxBjlE9Q==", - "dev": true + "version": "20.10.4", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.10.4.tgz", + "integrity": "sha512-D08YG6rr8X90YB56tSIuBaddy/UXAA9RKJoFvrsnogAum/0pmjkgi4+2nx96A330FmioegBWmEYQ+syqCFaveg==", + "dev": true, + "dependencies": { + "undici-types": "~5.26.4" + } }, "node_modules/@types/normalize-package-data": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.1.tgz", - "integrity": "sha512-Gj7cI7z+98M282Tqmp2K5EIsoouUEzbBJhQQzDE3jSIRk6r9gsz0oUokqIUR4u1R3dMHo0pDHM7sNOHyhulypw==", + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/@types/normalize-package-data/-/normalize-package-data-2.4.4.tgz", + "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, "node_modules/@types/parse-json": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", "dev": true }, "node_modules/@types/prettier": { - "version": "2.7.2", - "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.2.tgz", - "integrity": "sha512-KufADq8uQqo1pYKVIYzfKbJfBAc0sOeXqGbFaSpv8MRmC/zXgowNZmFcbngndGk922QDmOASEXUZCaY48gs4cg==", + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-2.7.3.tgz", + "integrity": "sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==", "dev": true }, "node_modules/@types/stack-utils": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.1.tgz", - "integrity": "sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", + "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", "dev": true }, "node_modules/@types/yargs": { - "version": "16.0.5", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.5.tgz", - "integrity": "sha512-AxO/ADJOBFJScHbWhq2xAhlWP24rY4aCEG/NFaMvbT3X2MgRsLjhjQwsn0Zi5zn0LG9jUhCCZMeX9Dkuw6k+vQ==", + "version": "16.0.9", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-16.0.9.tgz", + "integrity": "sha512-tHhzvkFXZQeTECenFoRljLBYPZJ7jAVxqqtEI0qTLOmuultnFp4I9yKE17vTuhf7BkhCu7I4XuemPgikDVuYqA==", "dev": true, "dependencies": { "@types/yargs-parser": "*" } }, "node_modules/@types/yargs-parser": { - "version": "21.0.0", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.0.tgz", - "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", + "version": "21.0.3", + "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", + "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", "dev": true }, "node_modules/@webassemblyjs/ast": { @@ -3377,9 +3559,9 @@ } }, "node_modules/@webpack-cli/configtest": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.0.tgz", - "integrity": "sha512-K/vuv72vpfSEZoo5KIU0a2FsEoYdW0DUMtMpB5X3LlUwshetMZRZRxB7sCsVji/lFaSxtQQ3aM9O4eMolXkU9w==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-2.1.1.tgz", + "integrity": "sha512-wy0mglZpDSiSS0XHrVR+BAdId2+yxPSoJW8fsna3ZpYSlufjvxnP4YbKTCBZnNIcGN4r6ZPXV55X4mYExOfLmw==", "dev": true, "engines": { "node": ">=14.15.0" @@ -3390,9 +3572,9 @@ } }, "node_modules/@webpack-cli/info": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.1.tgz", - "integrity": "sha512-fE1UEWTwsAxRhrJNikE7v4EotYflkEhBL7EbajfkPlf6E37/2QshOy/D48Mw8G5XMFlQtS6YV42vtbG9zBpIQA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-2.0.2.tgz", + "integrity": "sha512-zLHQdI/Qs1UyT5UBdWNqsARasIA+AaF8t+4u2aS2nEpBQh2mWIVb8qAklq0eUENnC5mOItrIB4LiS9xMtph18A==", "dev": true, "engines": { "node": ">=14.15.0" @@ -3403,9 +3585,9 @@ } }, "node_modules/@webpack-cli/serve": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.4.tgz", - "integrity": "sha512-0xRgjgDLdz6G7+vvDLlaRpFatJaJ69uTalZLRSMX5B3VUrDmXcrVA3+6fXXQgmYz7bY9AAgs348XQdmtLsK41A==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-2.0.5.tgz", + "integrity": "sha512-lqaoKnRYBdo1UgDX8uF24AfGMifWK19TxPmM5FHc2vAGxrJ/qtyUyFBWoY1tISZdelsQ5fBcOusifo5o5wSJxQ==", "dev": true, "engines": { "node": ">=14.15.0" @@ -3436,6 +3618,7 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.6.tgz", "integrity": "sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==", + "deprecated": "Use your platform's native atob() and btoa() methods instead", "dev": true }, "node_modules/acorn": { @@ -3599,15 +3782,15 @@ } }, "node_modules/array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", + "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", "is-string": "^1.0.7" }, "engines": { @@ -3626,15 +3809,34 @@ "node": ">=8" } }, + "node_modules/array.prototype.findlastindex": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.3.tgz", + "integrity": "sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-shim-unscopables": "^1.0.0", + "get-intrinsic": "^1.2.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.2.tgz", + "integrity": "sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3645,14 +3847,14 @@ } }, "node_modules/array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.2.tgz", + "integrity": "sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", "es-shim-unscopables": "^1.0.0" }, "engines": { @@ -3662,6 +3864,27 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/arraybuffer.prototype.slice": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/arraybuffer.prototype.slice/-/arraybuffer.prototype.slice-1.0.2.tgz", + "integrity": "sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==", + "dev": true, + "dependencies": { + "array-buffer-byte-length": "^1.0.0", + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1", + "is-array-buffer": "^3.0.2", + "is-shared-array-buffer": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/arrify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", @@ -4069,42 +4292,42 @@ } }, "node_modules/babel-plugin-polyfill-corejs2": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", - "integrity": "sha512-8hOdmFYFSZhqg2C/JgLUQ+t52o5nirNwaWM2B9LWteozwIvM14VSwdsCAUET10qT+kmySAlseadmfeeSWFCy+Q==", + "version": "0.4.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz", + "integrity": "sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ==", "dev": true, "dependencies": { - "@babel/compat-data": "^7.17.7", - "@babel/helper-define-polyfill-provider": "^0.3.3", - "semver": "^6.1.1" + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.4.4", + "semver": "^6.3.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-corejs3": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.6.0.tgz", - "integrity": "sha512-+eHqR6OPcBhJOGgsIar7xoAB1GcSwVUA3XjAd7HJNzOXT4wv6/H7KIdA/Nc60cvUlDbKApmqNvD1B1bzOt4nyA==", + "version": "0.8.7", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz", + "integrity": "sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3", - "core-js-compat": "^3.25.1" + "@babel/helper-define-polyfill-provider": "^0.4.4", + "core-js-compat": "^3.33.1" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-polyfill-regenerator": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.4.1.tgz", - "integrity": "sha512-NtQGmyQDXjQqQ+IzRkBVwEOz9lQ4zxAQZgoAYEtU9dJjnl1Oc98qnN7jcp+bE7O7aYzVpavXE3/VKXNzUbh7aw==", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz", + "integrity": "sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg==", "dev": true, "dependencies": { - "@babel/helper-define-polyfill-provider": "^0.3.3" + "@babel/helper-define-polyfill-provider": "^0.4.4" }, "peerDependencies": { - "@babel/core": "^7.0.0-0" + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" } }, "node_modules/babel-plugin-syntax-async-functions": { @@ -4524,9 +4747,9 @@ } }, "node_modules/babel-preset-env/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -4723,9 +4946,9 @@ "dev": true }, "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", + "version": "4.22.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz", + "integrity": "sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A==", "dev": true, "funding": [ { @@ -4735,13 +4958,17 @@ { "type": "tidelift", "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" } ], "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" + "caniuse-lite": "^1.0.30001565", + "electron-to-chromium": "^1.4.601", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" }, "bin": { "browserslist": "cli.js" @@ -4790,13 +5017,14 @@ "dev": true }, "node_modules/call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.5.tgz", + "integrity": "sha512-C3nQxfFZxFRVoJoGKKI8y3MOEo129NQ+FgQ08iye+Mk4zNZZGdjfs06bVTr+DBSlA66Q2VEcMki/cUCP4SercQ==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" + "function-bind": "^1.1.2", + "get-intrinsic": "^1.2.1", + "set-function-length": "^1.1.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -4838,9 +5066,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001487", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001487.tgz", - "integrity": "sha512-83564Z3yWGqXsh2vaH/mhXfEM0wX+NlBCm1jYHOb97TrTWJEmPTccZgeLTPBUUb0PNVo+oomb7wkimZBIERClA==", + "version": "1.0.30001570", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001570.tgz", + "integrity": "sha512-+3e0ASu4sw1SWaoCtvPeyXp+5PsjigkSt8OXZbF9StH5pQWbxEjLAZE3n8Aup5udop1uRiKA7a4utUk/uoSpUw==", "dev": true, "funding": [ { @@ -4924,9 +5152,9 @@ } }, "node_modules/ci-info": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.8.0.tgz", - "integrity": "sha512-eXTggHWSooYhq49F2opQhuHWgzucfF2YgODK4e1566GQs5BIfP30B0oenwBJHfWxAs2fyPB1s7Mg949zLf61Yw==", + "version": "3.9.0", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", + "integrity": "sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==", "dev": true, "funding": [ { @@ -4939,9 +5167,9 @@ } }, "node_modules/cjs-module-lexer": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz", - "integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA==", + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz", + "integrity": "sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==", "dev": true }, "node_modules/cli-cursor": { @@ -4960,9 +5188,9 @@ } }, "node_modules/cli-spinners": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.0.tgz", - "integrity": "sha512-4/aL9X3Wh0yiMQlE+eeRhWP6vclO3QRtw1JHKIT0FFUs5FjpFmESqtMvYZ0+lbzBw900b95mS0hohy+qn2VK/g==", + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", "dev": true, "engines": { "node": ">=6" @@ -4972,9 +5200,9 @@ } }, "node_modules/cli-width": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.0.0.tgz", - "integrity": "sha512-ZksGS2xpa/bYkNzN3BAw1wEjsLV/ZKOf/CCrJ/QOBsxx6fOARIkwTutxp1XIOIohi6HKmOFjMoK/XaqDVUpEEw==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", "dev": true, "engines": { "node": ">= 12" @@ -5107,9 +5335,9 @@ } }, "node_modules/collect-v8-coverage": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.1.tgz", - "integrity": "sha512-iBPtljfCNcTKNAto0KEtDfZ3qzjJvqE3aTGZsbhjSBlorqpXJlaWWtPO35D+ZImoC3KWejX64o+yPGxhWSTzfg==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", + "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", "dev": true }, "node_modules/color-convert": { @@ -5167,9 +5395,9 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", - "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, "node_modules/core-js": { @@ -5181,12 +5409,12 @@ "hasInstallScript": true }, "node_modules/core-js-compat": { - "version": "3.30.2", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.30.2.tgz", - "integrity": "sha512-nriW1nuJjUgvkEjIot1Spwakz52V9YkYHZAQG6A1eCgC8AA1p0zngrQEP9R0+V6hji5XilWKG1Bd0YRppmGimA==", + "version": "3.34.0", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz", + "integrity": "sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA==", "dev": true, "dependencies": { - "browserslist": "^4.21.5" + "browserslist": "^4.22.2" }, "funding": { "type": "opencollective", @@ -5224,12 +5452,12 @@ } }, "node_modules/css-functions-list": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.1.0.tgz", - "integrity": "sha512-/9lCvYZaUbBGvYUgYGFJ4dcYiyqdhSjG7IPVluoV8A1ILjkF7ilmhp1OGUz8n+nmBcu0RNrQAzgD8B6FJbrt2w==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz", + "integrity": "sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ==", "dev": true, "engines": { - "node": ">=12.22" + "node": ">=12 || >=16" } }, "node_modules/cssesc": { @@ -5381,12 +5609,27 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/define-data-property": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.1.tgz", + "integrity": "sha512-E7uGkTzkk1d0ByLeSc6ZsFS79Axg+m1P/VsgYsxHgiuc3tFSj+MjMIwe90FC4lOAZzNBdY7kkO2P2wKdsQ1vgQ==", + "dev": true, + "dependencies": { + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.1.tgz", + "integrity": "sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==", "dev": true, "dependencies": { + "define-data-property": "^1.0.1", "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" }, @@ -5458,6 +5701,7 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/domexception/-/domexception-2.0.1.tgz", "integrity": "sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==", + "deprecated": "Use your platform's native DOMException instead", "dev": true, "dependencies": { "webidl-conversions": "^5.0.0" @@ -5482,9 +5726,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.394", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.394.tgz", - "integrity": "sha512-0IbC2cfr8w5LxTz+nmn2cJTGafsK9iauV2r5A5scfzyovqLrxuLoxOHE5OBobP3oVIggJT+0JfKnw9sm87c8Hw==", + "version": "1.4.612", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.612.tgz", + "integrity": "sha512-dM8BMtXtlH237ecSMnYdYuCkib2QHq0kpWfUnavjdYsyr/6OsAwg5ZGUfnQ9KD1Ga4QgB2sqXlB2NT8zy2GnVg==", "dev": true }, "node_modules/emittery": { @@ -5506,9 +5750,9 @@ "dev": true }, "node_modules/enhanced-resolve": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.14.0.tgz", - "integrity": "sha512-+DCows0XNwLDcUhbFJPdlQEVnT2zXlCv7hPxemTz86/O+B/hCQ+mb7ydkPKiflpVraqLPCAfu7lDy+hBXueojw==", + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.15.0.tgz", + "integrity": "sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==", "dev": true, "dependencies": { "graceful-fs": "^4.2.4", @@ -5519,21 +5763,22 @@ } }, "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.4.1.tgz", + "integrity": "sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==", "dev": true, "dependencies": { - "ansi-colors": "^4.1.1" + "ansi-colors": "^4.1.1", + "strip-ansi": "^6.0.1" }, "engines": { "node": ">=8.6" } }, "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.11.0.tgz", + "integrity": "sha512-G9/6xF1FPbIw0TtalAMaVPpiq2aDEuKLXM314jPVAO9r2fo2a4BLqMNkmRS7O/xPPZ+COAhGIz3ETvHEV3eUcg==", "dev": true, "bin": { "envinfo": "dist/cli.js" @@ -5552,25 +5797,26 @@ } }, "node_modules/es-abstract": { - "version": "1.21.2", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.2.tgz", - "integrity": "sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==", + "version": "1.22.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.3.tgz", + "integrity": "sha512-eiiY8HQeYfYH2Con2berK+To6GrK2RxbPawDkGq4UiCQQfZHb6wX9qQqkbpPqaxQFcl8d9QzZqo0tGE0VcrdwA==", "dev": true, "dependencies": { "array-buffer-byte-length": "^1.0.0", + "arraybuffer.prototype.slice": "^1.0.2", "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.5", "es-set-tostringtag": "^2.0.1", "es-to-primitive": "^1.2.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.2.0", + "function.prototype.name": "^1.1.6", + "get-intrinsic": "^1.2.2", "get-symbol-description": "^1.0.0", "globalthis": "^1.0.3", "gopd": "^1.0.1", - "has": "^1.0.3", "has-property-descriptors": "^1.0.0", "has-proto": "^1.0.1", "has-symbols": "^1.0.3", + "hasown": "^2.0.0", "internal-slot": "^1.0.5", "is-array-buffer": "^3.0.2", "is-callable": "^1.2.7", @@ -5578,19 +5824,23 @@ "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.2", "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", + "is-typed-array": "^1.1.12", "is-weakref": "^1.0.2", - "object-inspect": "^1.12.3", + "object-inspect": "^1.13.1", "object-keys": "^1.1.1", "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", + "regexp.prototype.flags": "^1.5.1", + "safe-array-concat": "^1.0.1", "safe-regex-test": "^1.0.0", - "string.prototype.trim": "^1.2.7", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", + "string.prototype.trim": "^1.2.8", + "string.prototype.trimend": "^1.0.7", + "string.prototype.trimstart": "^1.0.7", + "typed-array-buffer": "^1.0.0", + "typed-array-byte-length": "^1.0.0", + "typed-array-byte-offset": "^1.0.0", "typed-array-length": "^1.0.4", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" + "which-typed-array": "^1.1.13" }, "engines": { "node": ">= 0.4" @@ -5600,32 +5850,32 @@ } }, "node_modules/es-module-lexer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.2.1.tgz", - "integrity": "sha512-9978wrXM50Y4rTMmW5kXIC09ZdXQZqkE4mxhwkd8VbzsGkXGPgV4zWuqQJgCEzYngdo2dYDa0l8xhX4fkSwJSg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.4.1.tgz", + "integrity": "sha512-cXLGjP0c4T3flZJKQSuziYoq7MlT+rnvfZjfp7h+I7K9BNX54kP9nyWvdbwjQ4u1iWbOL4u96fgeZLToQlZC7w==", "dev": true }, "node_modules/es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.2.tgz", + "integrity": "sha512-BuDyupZt65P9D2D2vA/zqcI3G5xRsklm5N3xCwuiy+/vKy8i0ifdsQP1sLgO4tZDSCaQUSnmC48khknGMV3D2Q==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" + "get-intrinsic": "^1.2.2", + "has-tostringtag": "^1.0.0", + "hasown": "^2.0.0" }, "engines": { "node": ">= 0.4" } }, "node_modules/es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.2.tgz", + "integrity": "sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" } }, "node_modules/es-to-primitive": { @@ -5664,15 +5914,14 @@ } }, "node_modules/escodegen": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.0.0.tgz", - "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", "dev": true, "dependencies": { "esprima": "^4.0.1", "estraverse": "^5.2.0", - "esutils": "^2.0.2", - "optionator": "^0.8.1" + "esutils": "^2.0.2" }, "bin": { "escodegen": "bin/escodegen.js", @@ -5694,45 +5943,6 @@ "node": ">=4.0" } }, - "node_modules/escodegen/node_modules/levn": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", - "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/optionator": { - "version": "0.8.3", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz", - "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", - "dev": true, - "dependencies": { - "deep-is": "~0.1.3", - "fast-levenshtein": "~2.0.6", - "levn": "~0.3.0", - "prelude-ls": "~1.1.2", - "type-check": "~0.3.2", - "word-wrap": "~1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/escodegen/node_modules/prelude-ls": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", - "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/escodegen/node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5743,18 +5953,6 @@ "node": ">=0.10.0" } }, - "node_modules/escodegen/node_modules/type-check": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", - "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", - "dev": true, - "dependencies": { - "prelude-ls": "~1.1.2" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/eslint": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", @@ -5839,14 +6037,14 @@ } }, "node_modules/eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", + "version": "0.3.9", + "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.9.tgz", + "integrity": "sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==", "dev": true, "dependencies": { "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" + "is-core-module": "^2.13.0", + "resolve": "^1.22.4" } }, "node_modules/eslint-import-resolver-node/node_modules/debug": { @@ -5904,26 +6102,28 @@ } }, "node_modules/eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", + "version": "2.29.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.29.0.tgz", + "integrity": "sha512-QPOO5NO6Odv5lpoTkddtutccQjysJuFxoPS7fAHO+9m9udNHvTCPSAMW9zGAYj8lAIdr40I8yPCdUYrncXtrwg==", "dev": true, "dependencies": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", + "array-includes": "^3.1.7", + "array.prototype.findlastindex": "^1.2.3", + "array.prototype.flat": "^1.3.2", + "array.prototype.flatmap": "^1.3.2", "debug": "^3.2.7", "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", + "eslint-import-resolver-node": "^0.3.9", + "eslint-module-utils": "^2.8.0", + "hasown": "^2.0.0", + "is-core-module": "^2.13.1", "is-glob": "^4.0.3", "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" + "object.fromentries": "^2.0.7", + "object.groupby": "^1.0.1", + "object.values": "^1.1.7", + "semver": "^6.3.1", + "tsconfig-paths": "^3.14.2" }, "engines": { "node": ">=4" @@ -6006,9 +6206,9 @@ } }, "node_modules/eslint-plugin-node/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -6218,9 +6418,9 @@ } }, "node_modules/eslint/node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", "dev": true, "dependencies": { "type-fest": "^0.20.2" @@ -6272,9 +6472,9 @@ } }, "node_modules/eslint/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -6480,9 +6680,9 @@ "dev": true }, "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", @@ -6611,13 +6811,23 @@ "node": ">=8" } }, + "node_modules/flat": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", + "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", + "dev": true, + "bin": { + "flat": "cli.js" + } + }, "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", "dev": true, "dependencies": { - "flatted": "^3.1.0", + "flatted": "^3.2.9", + "keyv": "^4.5.3", "rimraf": "^3.0.2" }, "engines": { @@ -6640,9 +6850,9 @@ } }, "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", + "version": "3.2.9", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.9.tgz", + "integrity": "sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==", "dev": true }, "node_modules/flow-bin": { @@ -6707,9 +6917,9 @@ "dev": true }, "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", "dev": true, "hasInstallScript": true, "optional": true, @@ -6721,21 +6931,24 @@ } }, "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.6.tgz", + "integrity": "sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "functions-have-names": "^1.2.3" }, "engines": { "node": ">= 0.4" @@ -6778,15 +6991,15 @@ } }, "node_modules/get-intrinsic": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.1.tgz", - "integrity": "sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==", + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.2.tgz", + "integrity": "sha512-0gSo4ml/0j98Y3lngkFEot/zhiCeWsbYIlZ+uZOVgzLyLaUw7wxUL+nCTP0XJvJg1AXulJRI3UJi8GsbDuxdGA==", "dev": true, "dependencies": { - "function-bind": "^1.1.1", - "has": "^1.0.3", + "function-bind": "^1.1.2", "has-proto": "^1.0.1", - "has-symbols": "^1.0.3" + "has-symbols": "^1.0.3", + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -6984,9 +7197,9 @@ } }, "node_modules/globby/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -7034,18 +7247,6 @@ "node": ">=6" } }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, "node_modules/has-ansi": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", @@ -7086,12 +7287,12 @@ } }, "node_modules/has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz", + "integrity": "sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.1.1" + "get-intrinsic": "^1.2.2" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7136,6 +7337,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/hasown": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.0.tgz", + "integrity": "sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==", + "dev": true, + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hosted-git-info": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-4.1.0.tgz", @@ -7405,9 +7618,9 @@ } }, "node_modules/inquirer/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -7417,9 +7630,9 @@ } }, "node_modules/inquirer/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -7432,13 +7645,13 @@ } }, "node_modules/internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.6.tgz", + "integrity": "sha512-Xj6dv+PsbtwyPpEflsejS+oIZxmMlV44zAhG479uYu89MsjcYOhCFnNyKrkJrihbsiasQyY0afoCl/9BLR65bg==", "dev": true, "dependencies": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", + "get-intrinsic": "^1.2.2", + "hasown": "^2.0.0", "side-channel": "^1.0.4" }, "engines": { @@ -7537,12 +7750,12 @@ } }, "node_modules/is-core-module": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.12.0.tgz", - "integrity": "sha512-RECHCBCd/viahWmwj6enj19sKbHfJrddi/6cBDsNTKbNq0f7VeaUkBo60BqzvPqo/W54ChS62Z5qyun7cfOMqQ==", + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", "dev": true, "dependencies": { - "has": "^1.0.3" + "hasown": "^2.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -7745,16 +7958,12 @@ } }, "node_modules/is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", + "version": "1.1.12", + "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", + "integrity": "sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==", "dev": true, "dependencies": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" + "which-typed-array": "^1.1.11" }, "engines": { "node": ">= 0.4" @@ -7793,6 +8002,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -7809,9 +8024,9 @@ } }, "node_modules/istanbul-lib-coverage": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", - "integrity": "sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==", + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", + "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", "dev": true, "engines": { "node": ">=8" @@ -7834,17 +8049,17 @@ } }, "node_modules/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-wcdi+uAKzfiGT2abPpKZ0hSU1rGQjUQnLvtY5MpQ7QCTahD3VODhcu4wcfY1YtkGaDD5yuydOLINXsfbus9ROw==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", "dev": true, "dependencies": { "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^3.0.0", + "make-dir": "^4.0.0", "supports-color": "^7.1.0" }, "engines": { - "node": ">=8" + "node": ">=10" } }, "node_modules/istanbul-lib-report/node_modules/has-flag": { @@ -7856,21 +8071,48 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/make-dir": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", - "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", + "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", "dev": true, "dependencies": { - "semver": "^6.0.0" + "semver": "^7.5.3" }, "engines": { - "node": ">=8" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/istanbul-lib-report/node_modules/semver": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/istanbul-lib-report/node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -7883,6 +8125,12 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-report/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/istanbul-lib-source-maps": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-4.0.1.tgz", @@ -7907,9 +8155,9 @@ } }, "node_modules/istanbul-reports": { - "version": "3.1.5", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.5.tgz", - "integrity": "sha512-nUsEMa9pBt/NOHqbcbeJEgqIlY/K7rVWUX6Lql2orY5e9roQOthbR3vtY4zzf2orPELg80fnxxk9zUyPlgwD1w==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.1.6.tgz", + "integrity": "sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==", "dev": true, "dependencies": { "html-escaper": "^2.0.0", @@ -9503,9 +9751,9 @@ } }, "node_modules/jest-snapshot/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -9940,9 +10188,9 @@ } }, "node_modules/jsdom/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -9963,6 +10211,12 @@ "node": ">=4" } }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", @@ -10002,6 +10256,15 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, "node_modules/kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -10128,9 +10391,9 @@ } }, "node_modules/log-symbols/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -10190,9 +10453,9 @@ } }, "node_modules/make-dir/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -10421,9 +10684,9 @@ } }, "node_modules/nanoid": { - "version": "3.3.6", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.6.tgz", - "integrity": "sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==", + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", "dev": true, "funding": [ { @@ -10457,9 +10720,9 @@ "dev": true }, "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, "node_modules/normalize-package-data": { @@ -10490,9 +10753,9 @@ } }, "node_modules/normalize-package-data/node_modules/semver": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.1.tgz", - "integrity": "sha512-Wvss5ivl8TMRZXXESstBA4uR5iXgEN/VC5/sOcuXdVLzcdkz4HWetIoRfG5gb5X+ij/G9rw9YoGn3QoQ8OCSpw==", + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.5.4.tgz", + "integrity": "sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==", "dev": true, "dependencies": { "lru-cache": "^6.0.0" @@ -10547,15 +10810,15 @@ } }, "node_modules/nwsapi": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.4.tgz", - "integrity": "sha512-NHj4rzRo0tQdijE9ZqAx6kYDcoRwYwSYzCA8MY3JzfxlrvEU0jhnhJT9BhqhJs7I/dKcrDm6TyulaRqZPIhN5g==", + "version": "2.2.7", + "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.7.tgz", + "integrity": "sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==", "dev": true }, "node_modules/object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -10571,13 +10834,13 @@ } }, "node_modules/object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.5.tgz", + "integrity": "sha512-byy+U7gp+FVwmyzKPYhW2h5l3crpmGsxl7X2s8y43IgxvG4g3QZ6CffDtsNQy1WsmZpQbO+ybo0AlW7TY6DcBQ==", "dev": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", "has-symbols": "^1.0.3", "object-keys": "^1.1.1" }, @@ -10588,15 +10851,44 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/object.fromentries": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", + "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object.groupby": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.1.tgz", + "integrity": "sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "get-intrinsic": "^1.2.1" + } + }, "node_modules/object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", + "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -10630,17 +10922,17 @@ } }, "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", + "version": "0.9.3", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", + "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", "dev": true, "dependencies": { + "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" + "type-check": "^0.4.0" }, "engines": { "node": ">= 0.8.0" @@ -10682,9 +10974,9 @@ } }, "node_modules/ora/node_modules/chalk": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.2.0.tgz", - "integrity": "sha512-ree3Gqw/nazQAPuJJEy+avdl7QfZMcUvmHIKgEZkGL+xOBzRvup5Hxo6LHuMceSxOabuJLJm5Yp/92R9eMmMvA==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", "dev": true, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" @@ -10694,9 +10986,9 @@ } }, "node_modules/ora/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -10823,13 +11115,13 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.9.1.tgz", - "integrity": "sha512-UgmoiySyjFxP6tscZDgWGEAgsW5ok8W3F5CJDnnH2pozwSTGE6eH7vwTotMwATWA2r5xqdkKdxYPkwlJjAI/3g==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", + "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1", - "minipass": "^5.0.0 || ^6.0.0" + "lru-cache": "^9.1.1 || ^10.0.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -10839,18 +11131,18 @@ } }, "node_modules/path-scurry/node_modules/lru-cache": { - "version": "9.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-9.1.1.tgz", - "integrity": "sha512-65/Jky17UwSb0BuB9V+MyDpsOtXKmYwzhyl+cOa9XUiI4uV2Ouy/2voFP3+al0BjZbJgMBD8FojMpAf+Z+qn4A==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz", + "integrity": "sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag==", "dev": true, "engines": { "node": "14 || >=16.14" } }, "node_modules/path-scurry/node_modules/minipass": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-6.0.0.tgz", - "integrity": "sha512-mvD5U4pUen1aWcjTxUgdoMg6PB98dcV0obc/OiPzls79++IpgNoO+MCbOHRlKfWIOvjIjmjUygjZmSStP7B0Og==", + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -10893,9 +11185,9 @@ } }, "node_modules/pirates": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.5.tgz", - "integrity": "sha512-8V9+HQPupnaXMA23c5hvl69zXvTwTzyAYasnkb0Tts4XvO4CliqONMOnvlq26rkhLC3nWDFBJf73LU1e1VZLaQ==", + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", "dev": true, "engines": { "node": ">= 6" @@ -10914,9 +11206,9 @@ } }, "node_modules/postcss": { - "version": "8.4.23", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.23.tgz", - "integrity": "sha512-bQ3qMcpF6A/YjR55xtoTr0jGOlnPOKAIMdOWiv0EIT6HVPEaJiJB4NLljSbiHoC2RX7DN5Uvjtpbg1NPdwv1oA==", + "version": "8.4.32", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz", + "integrity": "sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw==", "dev": true, "funding": [ { @@ -10933,7 +11225,7 @@ } ], "dependencies": { - "nanoid": "^3.3.6", + "nanoid": "^3.3.7", "picocolors": "^1.0.0", "source-map-js": "^1.0.2" }, @@ -10970,9 +11262,9 @@ } }, "node_modules/postcss-selector-parser": { - "version": "6.0.12", - "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.12.tgz", - "integrity": "sha512-NdxGCAZdRrwVI1sy59+Wzrh+pMMHxapGnpfenDVlMEXoOcvt4pGE0JLK9YY2F5dLxcFYA/YbVQKhcGU+FtSYQg==", + "version": "6.0.13", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.13.tgz", + "integrity": "sha512-EaV1Gl4mUEV4ddhDnv/xtj7sxwrwxdetHdWUGnT4VJQf+4d05v6lHYZr8N573k5Z0BViss7BDhfWtKS3+sfAqQ==", "dev": true, "dependencies": { "cssesc": "^3.0.0", @@ -11061,18 +11353,18 @@ "dev": true }, "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", "dev": true, "engines": { "node": ">=6" } }, "node_modules/qs": { - "version": "6.11.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.1.tgz", - "integrity": "sha512-0wsrzgTz/kAVIeuxSjnpGC56rzYtr6JT/2BwEvMaPhFIoYa1aGO8LbzuU1R0uUYQkLpWBTOj0l/CLAJB64J6nQ==", + "version": "6.11.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.2.tgz", + "integrity": "sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==", "dev": true, "dependencies": { "side-channel": "^1.0.4" @@ -11194,9 +11486,9 @@ } }, "node_modules/read-pkg/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.2.tgz", + "integrity": "sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==", "dev": true, "bin": { "semver": "bin/semver" @@ -11270,9 +11562,9 @@ "dev": true }, "node_modules/regenerate-unicode-properties": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz", - "integrity": "sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==", + "version": "10.1.1", + "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.1.tgz", + "integrity": "sha512-X007RyZLsCJVVrjgEFVpLUTZwyOZk3oiL75ZcuYjlIWd6rNJtOjkBwQc5AsRrpbKVkxN6sklw/k/9m2jJYOf8Q==", "dev": true, "dependencies": { "regenerate": "^1.4.2" @@ -11282,29 +11574,29 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", + "version": "0.14.0", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.0.tgz", + "integrity": "sha512-srw17NI0TUWHuGa5CFGGmhfNIeja30WMBfbslPNhf6JrqQlLN5gcrvig1oqPxiVaXb0oW0XRKtH6Nngs5lKCIA==", "dev": true }, "node_modules/regenerator-transform": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.1.tgz", - "integrity": "sha512-knzmNAcuyxV+gQCufkYcvOqX/qIIfHLv0u5x79kRxuGojfYVky1f15TzZEu2Avte8QGepvUNTnLskf8E6X6Vyg==", + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.2.tgz", + "integrity": "sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==", "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } }, "node_modules/regexp.prototype.flags": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.0.tgz", - "integrity": "sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.1.tgz", + "integrity": "sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", "define-properties": "^1.2.0", - "functions-have-names": "^1.2.3" + "set-function-name": "^2.0.0" }, "engines": { "node": ">= 0.4" @@ -11394,12 +11686,12 @@ "dev": true }, "node_modules/resolve": { - "version": "1.22.2", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.2.tgz", - "integrity": "sha512-Sb+mjNHOULsBv818T40qSPeRiuWLyaGMa5ewydRLFimneixmVy2zdivRl+AF6jaYPC8ERxGDmFSiqui6SfPd+g==", + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", "dev": true, "dependencies": { - "is-core-module": "^2.11.0", + "is-core-module": "^2.13.0", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" }, @@ -11588,6 +11880,24 @@ "tslib": "^2.1.0" } }, + "node_modules/safe-array-concat": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz", + "integrity": "sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "has-symbols": "^1.0.3", + "isarray": "^2.0.5" + }, + "engines": { + "node": ">=0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -11641,9 +11951,9 @@ } }, "node_modules/schema-utils": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.2.tgz", - "integrity": "sha512-pvjEHOgWc9OWA/f/DE3ohBWTD6EleVLf7iFUkoSwAxttdBhB9QUebQgxER2kWueOvRJXPHNnyrvvh9eZINB8Eg==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.3.0.tgz", + "integrity": "sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==", "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", @@ -11690,9 +12000,9 @@ "dev": true }, "node_modules/semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", + "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", "dev": true, "bin": { "semver": "bin/semver.js" @@ -11707,6 +12017,35 @@ "randombytes": "^2.1.0" } }, + "node_modules/set-function-length": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz", + "integrity": "sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ==", + "dev": true, + "dependencies": { + "define-data-property": "^1.1.1", + "get-intrinsic": "^1.2.1", + "gopd": "^1.0.1", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/set-function-name": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/set-function-name/-/set-function-name-2.0.1.tgz", + "integrity": "sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==", + "dev": true, + "dependencies": { + "define-data-property": "^1.0.1", + "functions-have-names": "^1.2.3", + "has-property-descriptors": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/shallow-clone": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", @@ -11889,9 +12228,9 @@ } }, "node_modules/spdx-license-ids": { - "version": "3.0.13", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.13.tgz", - "integrity": "sha512-XkD+zwiqXHikFZm4AX/7JSCXA98U5Db4AFd5XUg/+9UNtnH75+Z9KxtpYiJZx36mUDVOwH83pl7yvCer6ewM3w==", + "version": "3.0.16", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.16.tgz", + "integrity": "sha512-eWN+LnM3GR6gPu35WxNgbGl8rmY1AEmoMDvL/QD6zYmPWgywxWqJWNdLGT+ke8dKNWrcYgYjPpG5gbTfghP8rw==", "dev": true }, "node_modules/sprintf-js": { @@ -12008,9 +12347,9 @@ "dev": true }, "node_modules/string-width/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" @@ -12023,14 +12362,14 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.7.tgz", - "integrity": "sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", + "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "engines": { "node": ">= 0.4" @@ -12040,28 +12379,28 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", + "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", + "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", "dev": true, "dependencies": { "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -12235,9 +12574,9 @@ "dev": true }, "node_modules/stylelint/node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.0.tgz", + "integrity": "sha512-g7dmpshy+gD7mh88OC9NwSGTKoc3kyLAZQRU1mt53Aw/vnvfXnbC+F/7F7QoYVKbV+KNvJx8wArewKy1vXMtlg==", "dev": true, "engines": { "node": ">= 4" @@ -12429,13 +12768,13 @@ } }, "node_modules/terser": { - "version": "5.17.3", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.17.3.tgz", - "integrity": "sha512-AudpAZKmZHkG9jueayypz4duuCFJMMNGRMwaPvQKWfxKedh8Z2x3OCoDqIIi1xx5+iwx1u6Au8XQcc9Lke65Yg==", + "version": "5.26.0", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz", + "integrity": "sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ==", "dev": true, "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", "commander": "^2.20.0", "source-map-support": "~0.5.20" }, @@ -12447,9 +12786,9 @@ } }, "node_modules/terser-webpack-plugin": { - "version": "5.3.8", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.8.tgz", - "integrity": "sha512-WiHL3ElchZMsK27P8uIUh4604IgJyAW47LVXGbEoB21DbQcZ+OuMpGjVYnEUaqcWM6dO8uS2qUbA7LSCWqvsbg==", + "version": "5.3.9", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz", + "integrity": "sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==", "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.17", @@ -12481,9 +12820,9 @@ } }, "node_modules/terser/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -12592,9 +12931,9 @@ } }, "node_modules/tough-cookie": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.2.tgz", - "integrity": "sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.3.tgz", + "integrity": "sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==", "dev": true, "dependencies": { "psl": "^1.1.33", @@ -12679,9 +13018,9 @@ } }, "node_modules/tslib": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", - "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.3.tgz", + "integrity": "sha512-mSxlJJwl3BMEQCUNnxXBU9jP4JBktcEGhURcPR6VQVlnP0FdDEsIaz0C35dXNGLyRfrATNofF0F5p2KPxQgB+w==", "dev": true }, "node_modules/tunnel": { @@ -12715,18 +13054,66 @@ } }, "node_modules/type-fest": { - "version": "3.10.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.10.0.tgz", - "integrity": "sha512-hmAPf1datm+gt3c2mvu0sJyhFy6lTkIGf0GzyaZWxRLnabQfPUqg6tF95RPg6sLxKI7nFLGdFxBcf2/7+GXI+A==", + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-3.13.1.tgz", + "integrity": "sha512-tLq3bSNx+xSpwvAJnzrK0Ep5CLNWjvFTOp71URMaAEWBfRb9nnJiBoUe0tF8bI4ZFO3omgBR6NvnbzVUT3Ly4g==", "dev": true, "engines": { "node": ">=14.16" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typed-array-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.0.tgz", + "integrity": "sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "get-intrinsic": "^1.2.1", + "is-typed-array": "^1.1.10" }, - "peerDependencies": { - "typescript": ">=4.7.0" + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/typed-array-byte-length": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-length/-/typed-array-byte-length-1.0.0.tgz", + "integrity": "sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==", + "dev": true, + "dependencies": { + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/typed-array-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.0.tgz", + "integrity": "sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==", + "dev": true, + "dependencies": { + "available-typed-arrays": "^1.0.5", + "call-bind": "^1.0.2", + "for-each": "^0.3.3", + "has-proto": "^1.0.1", + "is-typed-array": "^1.1.10" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" } }, "node_modules/typed-array-length": { @@ -12753,9 +13140,9 @@ } }, "node_modules/typed-rest-client": { - "version": "1.8.9", - "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.9.tgz", - "integrity": "sha512-uSmjE38B80wjL85UFX3sTYEUlvZ1JgCRhsWj/fJ4rZ0FqDUFoIuodtiVeE+cUqiVTOKPdKrp/sdftD15MDek6g==", + "version": "1.8.11", + "resolved": "https://registry.npmjs.org/typed-rest-client/-/typed-rest-client-1.8.11.tgz", + "integrity": "sha512-5UvfMpd1oelmUPRbbaVnq+rHP7ng2cE4qoQkQeAqxRL6PklkxsM0g32/HL0yfvruK6ojQ5x8EE+HF4YV6DtuCA==", "dev": true, "dependencies": { "qs": "^6.9.1", @@ -12772,20 +13159,6 @@ "is-typedarray": "^1.0.0" } }, - "node_modules/typescript": { - "version": "5.0.4", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.0.4.tgz", - "integrity": "sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==", - "dev": true, - "peer": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=12.20" - } - }, "node_modules/unbox-primitive": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", @@ -12807,6 +13180,12 @@ "integrity": "sha512-+A5Sja4HP1M08MaXya7p5LvjuM7K6q/2EaC0+iovj/wOcMsTzMvDFbasi/oSapiwOlt252IqsKqPjCl7huKS0A==", "dev": true }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "dev": true + }, "node_modules/unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -12857,9 +13236,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.11.tgz", - "integrity": "sha512-dCwEFf0/oT85M1fHBg4F0jtLwJrutGoHSQXCh7u4o2t1drG+c0a9Flnqww6XUKSfQMPpJBRjU8d4RXB09qtvaA==", + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", + "integrity": "sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==", "dev": true, "funding": [ { @@ -12912,9 +13291,9 @@ "dev": true }, "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz", + "integrity": "sha512-ocyWc3bAHBB/guyqJQVI5o4BZkPhznPYUG2ea80Gond/BgNWpap8TOmLSeeQG7bnh2KMISxskdADG59j7zruhw==", "dev": true }, "node_modules/v8-to-istanbul": { @@ -12931,6 +13310,12 @@ "node": ">=10.12.0" } }, + "node_modules/v8-to-istanbul/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true + }, "node_modules/validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", @@ -13010,9 +13395,9 @@ } }, "node_modules/webpack": { - "version": "5.82.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.82.1.tgz", - "integrity": "sha512-C6uiGQJ+Gt4RyHXXYt+v9f+SN1v83x68URwgxNQ98cvH8kxiuywWGP4XeNZ1paOzZ63aY3cTciCEQJNFUljlLw==", + "version": "5.89.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz", + "integrity": "sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw==", "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", @@ -13021,10 +13406,10 @@ "@webassemblyjs/wasm-edit": "^1.11.5", "@webassemblyjs/wasm-parser": "^1.11.5", "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", + "acorn-import-assertions": "^1.9.0", "browserslist": "^4.14.5", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.14.0", + "enhanced-resolve": "^5.15.0", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", @@ -13034,7 +13419,7 @@ "loader-runner": "^4.2.0", "mime-types": "^2.1.27", "neo-async": "^2.6.2", - "schema-utils": "^3.1.2", + "schema-utils": "^3.2.0", "tapable": "^2.1.1", "terser-webpack-plugin": "^5.3.7", "watchpack": "^2.4.0", @@ -13057,15 +13442,15 @@ } }, "node_modules/webpack-cli": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.1.tgz", - "integrity": "sha512-OLJwVMoXnXYH2ncNGU8gxVpUtm3ybvdioiTvHgUyBuyMLKiVvWy+QObzBsMtp5pH7qQoEuWgeEUQ/sU3ZJFzAw==", + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-5.1.4.tgz", + "integrity": "sha512-pIDJHIEI9LR0yxHXQ+Qh95k2EvXpWzZ5l+d+jIo+RdSm9MiHfzazIxwwni/p7+x4eJZuvG1AJwgC4TNQ7NRgsg==", "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^2.1.0", - "@webpack-cli/info": "^2.0.1", - "@webpack-cli/serve": "^2.0.4", + "@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", @@ -13111,12 +13496,13 @@ } }, "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", + "version": "5.10.0", + "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.10.0.tgz", + "integrity": "sha512-+4zXKdx7UnO+1jaN4l2lHVD+mFvnlZQP/6ljaJVb4SZiwIKeUnrT5l0gkT8z+n4hKpC+jpOv6O9R+gLtag7pSA==", "dev": true, "dependencies": { "clone-deep": "^4.0.1", + "flat": "^5.0.2", "wildcard": "^2.0.0" }, "engines": { @@ -13133,9 +13519,9 @@ } }, "node_modules/webpack/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", + "version": "8.11.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz", + "integrity": "sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -13227,17 +13613,16 @@ } }, "node_modules/which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.13.tgz", + "integrity": "sha512-P5Nra0qjSncduVPEAr7xhoF5guty49ArDTwzJ/yNuPIbZppyRxFQsRCWrocxIY+CnMVG+qfbU2FmDKyvSGClow==", "dev": true, "dependencies": { "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", + "call-bind": "^1.0.4", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" + "has-tostringtag": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -13252,15 +13637,6 @@ "integrity": "sha512-CC1bOL87PIWSBhDcTrdeLo6eGT7mCFtrg0uIJtqJUFyK+eJnzl8A1niH56uu7KMa5XFrtiV+AQuHO3n7DsHnLQ==", "dev": true }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/wrap-ansi": { "version": "8.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", @@ -13303,9 +13679,9 @@ } }, "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.0.1.tgz", - "integrity": "sha512-cXNxvT8dFNRVfhVME3JAe98mkXDYN2O1l7jmcwMnOslDeESg1rF/OZMtK0nRAhiari1unG5cD4jG3rapUAkLbw==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", "dev": true, "dependencies": { "ansi-regex": "^6.0.1" diff --git a/src/Resources/app/storefront/package.json b/src/Resources/app/storefront/package.json index 7eec08445..d22fd46bc 100644 --- a/src/Resources/app/storefront/package.json +++ b/src/Resources/app/storefront/package.json @@ -28,6 +28,6 @@ "stylelint-config-standard": "^24.0.0", "stylelint-scss": "^4.0.1", "webpack": "^5.82.0", - "webpack-cli": "^5.1.1" + "webpack-cli": "^5.1.4" } } diff --git a/src/Resources/app/storefront/src/mollie-payments/plugins/ideal-issuer.plugin.js b/src/Resources/app/storefront/src/mollie-payments/plugins/ideal-issuer.plugin.js index c1d6dc043..fc4085199 100644 --- a/src/Resources/app/storefront/src/mollie-payments/plugins/ideal-issuer.plugin.js +++ b/src/Resources/app/storefront/src/mollie-payments/plugins/ideal-issuer.plugin.js @@ -204,8 +204,14 @@ export default class MollieIDealIssuer extends Plugin { const client = new HttpClient(); + var selectedIssuer = issuersDropdown.value; + + if (selectedIssuer === undefined || selectedIssuer === null || selectedIssuer === '') { + selectedIssuer = 'ideal_reset'; + } + client.get( - shopUrl + '/mollie/ideal/store-issuer/' + customerId + '/' + issuersDropdown.value, + shopUrl + '/mollie/ideal/store-issuer/' + customerId + '/' + selectedIssuer, function () { onCompleted('issuer updated successfully'); }, diff --git a/src/Resources/config/compatibility/controller.xml b/src/Resources/config/compatibility/controller.xml index 79ef920bf..841877821 100644 --- a/src/Resources/config/compatibility/controller.xml +++ b/src/Resources/config/compatibility/controller.xml @@ -48,7 +48,8 @@ - + + @@ -104,6 +105,8 @@ + + @@ -193,6 +196,13 @@ + + + + + + + diff --git a/src/Resources/config/compatibility/controller_6.5.xml b/src/Resources/config/compatibility/controller_6.5.xml index 509ba3c00..21d62cb86 100644 --- a/src/Resources/config/compatibility/controller_6.5.xml +++ b/src/Resources/config/compatibility/controller_6.5.xml @@ -48,7 +48,8 @@ - + + @@ -103,6 +104,8 @@ + + @@ -153,14 +156,16 @@ - + - + @@ -186,7 +191,8 @@ - + @@ -200,7 +206,15 @@ - + + + + + + + + @@ -217,7 +231,8 @@ - + diff --git a/src/Resources/config/compatibility/flowbuilder/6.4.6.0.xml b/src/Resources/config/compatibility/flowbuilder/6.4.6.0.xml index ff709e35a..5a87686ef 100644 --- a/src/Resources/config/compatibility/flowbuilder/6.4.6.0.xml +++ b/src/Resources/config/compatibility/flowbuilder/6.4.6.0.xml @@ -9,7 +9,7 @@ - + diff --git a/src/Resources/config/config.xml b/src/Resources/config/config.xml index 777635ef4..178b4e007 100644 --- a/src/Resources/config/config.xml +++ b/src/Resources/config/config.xml @@ -62,6 +62,16 @@ uitgebreide logs mogelijk met meer informatie die helpen bij het oplossen van problemen. + + logFileDays + + + + 14 + Set the number of days how long log files are kept until they will be automatically deleted. + Legen Sie die Anzahl der Tage fest, wie lange Protokolldateien aufbewahrt werden, bis sie automatisch gelöscht werden. + Stel het aantal dagen in hoe lang logbestanden worden bewaard totdat ze automatisch worden verwijderd. + molliePluginConfigSectionApi @@ -842,7 +852,7 @@ subscriptionsAllowPauseResume false - + If enabled, customers are allowed to pause and also resume their subscriptions in their account. diff --git a/src/Resources/config/services.xml b/src/Resources/config/services.xml index c15ad23e6..b79e98b45 100644 --- a/src/Resources/config/services.xml +++ b/src/Resources/config/services.xml @@ -43,11 +43,6 @@ - - - - - @@ -91,6 +86,7 @@ + %kernel.shopware_version% @@ -148,9 +144,9 @@ - + @@ -177,6 +173,9 @@ %env(default::APP_URL)% + + + diff --git a/src/Resources/config/services/api.xml b/src/Resources/config/services/api.xml index 0b2b0d072..24a8f2e4e 100644 --- a/src/Resources/config/services/api.xml +++ b/src/Resources/config/services/api.xml @@ -26,6 +26,7 @@ + diff --git a/src/Resources/config/services/facades.xml b/src/Resources/config/services/facades.xml index b9b93894d..abfa9c8d4 100644 --- a/src/Resources/config/services/facades.xml +++ b/src/Resources/config/services/facades.xml @@ -5,15 +5,16 @@ xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd"> - - + + - - + + + diff --git a/src/Resources/config/services/payment.xml b/src/Resources/config/services/payment.xml index 13bc5466f..bbdd973fe 100644 --- a/src/Resources/config/services/payment.xml +++ b/src/Resources/config/services/payment.xml @@ -11,7 +11,7 @@ - + @@ -23,7 +23,7 @@ - + @@ -35,7 +35,7 @@ - + @@ -48,7 +48,7 @@ - + diff --git a/src/Resources/config/services/services.xml b/src/Resources/config/services/services.xml index 4c32a5a86..f2859303a 100644 --- a/src/Resources/config/services/services.xml +++ b/src/Resources/config/services/services.xml @@ -9,7 +9,6 @@ %kernel.logs_dir%/mollie_%kernel.environment%.log - 14 %env(DATABASE_URL)% @@ -60,6 +59,7 @@ + @@ -79,6 +79,7 @@ + @@ -87,6 +88,13 @@ + + + + + + + @@ -147,6 +155,10 @@ + + + + diff --git a/src/Resources/config/services/subscriber.xml b/src/Resources/config/services/subscriber.xml index 0f9f227b5..7c7f3d95d 100644 --- a/src/Resources/config/services/subscriber.xml +++ b/src/Resources/config/services/subscriber.xml @@ -8,7 +8,9 @@ - + + + @@ -21,11 +23,6 @@ - - - - - diff --git a/src/Service/ConfigService.php b/src/Service/ConfigService.php index 30396b3ee..1fa104f88 100644 --- a/src/Service/ConfigService.php +++ b/src/Service/ConfigService.php @@ -3,6 +3,7 @@ namespace Kiener\MolliePayments\Service; use Kiener\MolliePayments\Gateway\MollieGatewayInterface; +use Shopware\Core\System\SalesChannel\SalesChannelContext; use Shopware\Core\System\SystemConfig\SystemConfigService; class ConfigService diff --git a/src/Service/Logger/MollieLoggerFactory.php b/src/Service/Logger/MollieLoggerFactory.php index 39d746d99..0587792fc 100644 --- a/src/Service/Logger/MollieLoggerFactory.php +++ b/src/Service/Logger/MollieLoggerFactory.php @@ -31,11 +31,6 @@ class MollieLoggerFactory */ private $filename; - /** - * @var string - */ - private $retentionDays; - /** * @var string */ @@ -45,14 +40,12 @@ class MollieLoggerFactory /** * @param SettingsService $settingsService * @param string $filename - * @param string $retentionDays * @param string $dsn */ - public function __construct(SettingsService $settingsService, string $filename, string $retentionDays, string $dsn) + public function __construct(SettingsService $settingsService, string $filename, string $dsn) { $this->settingsService = $settingsService; $this->filename = $filename; - $this->retentionDays = $retentionDays; $this->dsn = $dsn; } @@ -70,8 +63,9 @@ public function createLogger(): LoggerInterface # 100 = DEBUG, 200 = INFO $minLevel = ($config->isDebugMode()) ? 100 : 200; + $retentionDays = $config->getLogFileDays(); - $fileHandler = new RotatingFileHandler($this->filename, (int)$this->retentionDays, $minLevel); + $fileHandler = new RotatingFileHandler($this->filename, $retentionDays, $minLevel); $processors = []; $processors[] = new AnonymousWebProcessor(new WebProcessor(), new URLAnonymizer()); diff --git a/src/Service/MollieApi/Models/MollieShippingItem.php b/src/Service/MollieApi/Models/MollieShippingItem.php new file mode 100644 index 000000000..968a581a9 --- /dev/null +++ b/src/Service/MollieApi/Models/MollieShippingItem.php @@ -0,0 +1,43 @@ +mollieItemId = $mollieItemId; + $this->quantity = $quantity; + } + + /** + * @return string + */ + public function getMollieItemId(): string + { + return $this->mollieItemId; + } + + /** + * @return int + */ + public function getQuantity(): int + { + return $this->quantity; + } +} diff --git a/src/Service/MollieApi/Order.php b/src/Service/MollieApi/Order.php index a329c4764..7bf097f9f 100644 --- a/src/Service/MollieApi/Order.php +++ b/src/Service/MollieApi/Order.php @@ -9,11 +9,14 @@ use Kiener\MolliePayments\Factory\MollieApiFactory; use Kiener\MolliePayments\Handler\Method\CreditCardPayment; use Kiener\MolliePayments\Handler\PaymentHandler; +use Kiener\MolliePayments\Service\CustomerService; use Kiener\MolliePayments\Service\MollieApi\Payment as MolliePayment; use Kiener\MolliePayments\Service\MollieApi\Payment as PaymentApiService; use Kiener\MolliePayments\Service\MollieApi\RequestAnonymizer\MollieRequestAnonymizer; use Kiener\MolliePayments\Service\Router\RoutingBuilder; use Kiener\MolliePayments\Service\SettingsService; +use Kiener\MolliePayments\Struct\MollieApi\ShipmentTrackingInfoStruct; +use Kiener\MolliePayments\Struct\OrderLineItemEntity\OrderLineItemEntityAttributes; use Mollie\Api\Exceptions\ApiException; use Mollie\Api\Resources\Order as MollieOrder; use Mollie\Api\Resources\OrderLine; @@ -25,7 +28,10 @@ use Psr\Log\LoggerInterface; use RuntimeException; use Shopware\Core\Checkout\Customer\CustomerEntity; +use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryEntity; +use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection; use Shopware\Core\Checkout\Order\OrderEntity; +use Shopware\Core\Checkout\Shipping\ShippingMethodEntity; use Shopware\Core\System\SalesChannel\SalesChannelContext; class Order @@ -60,6 +66,11 @@ class Order */ private $settingsService; + /** + * @var CustomerService + */ + private $customerService; + /** * @param MollieApiFactory $clientFactory * @param MolliePayment $paymentApiService @@ -68,7 +79,7 @@ class Order * @param LoggerInterface $logger * @param SettingsService $settingsService */ - public function __construct(MollieApiFactory $clientFactory, PaymentApiService $paymentApiService, RoutingBuilder $routingBuilder, MollieRequestAnonymizer $requestAnonymizer, LoggerInterface $logger, SettingsService $settingsService) + public function __construct(MollieApiFactory $clientFactory, PaymentApiService $paymentApiService, RoutingBuilder $routingBuilder, MollieRequestAnonymizer $requestAnonymizer, LoggerInterface $logger, SettingsService $settingsService, CustomerService $customerService) { $this->clientFactory = $clientFactory; $this->logger = $logger; @@ -76,6 +87,7 @@ public function __construct(MollieApiFactory $clientFactory, PaymentApiService $ $this->routingBuilder = $routingBuilder; $this->requestAnonymizer = $requestAnonymizer; $this->settingsService = $settingsService; + $this->customerService = $customerService; } /** @@ -357,6 +369,22 @@ private function createNewOrderPayment(MollieOrder $mollieOrder, string $payment $paymentHandler->setEnableSingleClickPayment(true); } + $lineItems = $order->getLineItems(); + + if ($settings->isSubscriptionsEnabled() && $lineItems instanceof OrderLineItemCollection) { + # mollie customer ID is required for recurring payments, see https://docs.mollie.com/reference/v2/orders-api/create-order-payment + $mollieCustomerId = $this->customerService->getMollieCustomerId($customer->getId(), $salesChannelContext->getSalesChannelId(), $salesChannelContext->getContext()); + + foreach ($lineItems as $lineItem) { + $attributes = new OrderLineItemEntityAttributes($lineItem); + if ($attributes->isSubscriptionProduct()) { + $newPaymentData['payment']['sequenceType'] = 'first'; + $newPaymentData['payment']['customerId'] = $mollieCustomerId; + break; + } + } + } + # now we have to add payment specific data # like we would do with initial orders too $tmpOrder = $paymentHandler->processPaymentMethodSpecificParameters($newPaymentData, $order, $salesChannelContext, $customer); @@ -391,14 +419,17 @@ public function getPaymentUrl(string $mollieOrderId, string $salesChannelId): ?s return $mollieOrder->status === 'created' ? $mollieOrder->getCheckoutUrl() : null; } - public function setShipment(string $mollieOrderId, string $salesChannelId): bool + public function setShipment(string $mollieOrderId, ?ShipmentTrackingInfoStruct $trackingInfoStruct, string $salesChannelId): bool { $mollieOrder = $this->getMollieOrder($mollieOrderId, $salesChannelId); - + $shipment = []; + if ($trackingInfoStruct instanceof ShipmentTrackingInfoStruct) { + $shipment['tracking'] = $trackingInfoStruct->toArray(); + } /** @var OrderLine $orderLine */ foreach ($mollieOrder->lines() as $orderLine) { if ($orderLine->shippableQuantity > 0) { - $mollieOrder->shipAll(); + $mollieOrder->shipAll($shipment); return true; } diff --git a/src/Service/MollieApi/OrderDataExtractor.php b/src/Service/MollieApi/OrderDataExtractor.php index 9d468f896..86d6a4d16 100644 --- a/src/Service/MollieApi/OrderDataExtractor.php +++ b/src/Service/MollieApi/OrderDataExtractor.php @@ -4,15 +4,11 @@ use Kiener\MolliePayments\Exception\OrderCurrencyNotFoundException; use Kiener\MolliePayments\Exception\OrderCustomerNotFoundException; -use Kiener\MolliePayments\Exception\OrderDeliveriesNotFoundException; -use Kiener\MolliePayments\Exception\OrderDeliveryNotFoundException; use Kiener\MolliePayments\Exception\OrderLineItemsNotFoundException; use Kiener\MolliePayments\Service\CustomerService; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Customer\CustomerEntity; use Shopware\Core\Checkout\Order\Aggregate\OrderCustomer\OrderCustomerEntity; -use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection; -use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryEntity; use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection; use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Framework\Context; @@ -103,55 +99,4 @@ public function extractLocale(OrderEntity $orderEntity, SalesChannelContext $sal return $salesChannelLanguage->getLocale(); } - - public function extractDeliveries(OrderEntity $orderEntity, Context $context): OrderDeliveryCollection - { - $deliveries = $orderEntity->getDeliveries(); - - if (!$deliveries instanceof OrderDeliveryCollection) { - $this->logger->critical( - sprintf('Could not fetch deliveries from order with id %s', $orderEntity->getId()) - ); - - throw new OrderDeliveriesNotFoundException($orderEntity->getId()); - } - - return $deliveries; - } - - public function extractDelivery(OrderEntity $orderEntity, Context $context): OrderDeliveryEntity - { - $deliveries = $this->extractDeliveries($orderEntity, $context); - - /** - * TODO: In future Shopware versions there might be multiple deliveries. There is support for multiple deliveries - * but as of writing only one delivery is created per order, which is why we use first() here. - */ - $delivery = $deliveries->first(); - - if (!$delivery instanceof OrderDeliveryEntity) { - $this->logger->critical( - sprintf('Could not fetch deliveries from order with id %s', $orderEntity->getId()) - ); - - throw new OrderDeliveryNotFoundException($orderEntity->getId()); - } - - return $delivery; - } - - public function extractLineItems(OrderEntity $orderEntity, Context $context): OrderLineItemCollection - { - $lineItems = $orderEntity->getLineItems(); - - if (!$lineItems instanceof OrderLineItemCollection) { - $this->logger->critical( - sprintf('Could not fetch line items from order with id %s', $orderEntity->getId()) - ); - - throw new OrderLineItemsNotFoundException($orderEntity->getId()); - } - - return $lineItems; - } } diff --git a/src/Service/MollieApi/OrderDeliveryExtractor.php b/src/Service/MollieApi/OrderDeliveryExtractor.php new file mode 100644 index 000000000..341157da4 --- /dev/null +++ b/src/Service/MollieApi/OrderDeliveryExtractor.php @@ -0,0 +1,65 @@ +logger = $loggerService; + } + + public function extractDeliveries(OrderEntity $orderEntity, Context $context): OrderDeliveryCollection + { + $deliveries = $orderEntity->getDeliveries(); + + if (!$deliveries instanceof OrderDeliveryCollection) { + $this->logger->critical( + sprintf('Could not fetch deliveries from order with id %s', $orderEntity->getId()) + ); + + throw new OrderDeliveriesNotFoundException($orderEntity->getId()); + } + + return $deliveries; + } + + public function extractDelivery(OrderEntity $orderEntity, Context $context): OrderDeliveryEntity + { + $deliveries = $this->extractDeliveries($orderEntity, $context); + + /** + * TODO: In future Shopware versions there might be multiple deliveries. There is support for multiple deliveries + * but as of writing only one delivery is created per order, which is why we use first() here. + */ + $delivery = $deliveries->first(); + + if (!$delivery instanceof OrderDeliveryEntity) { + $this->logger->critical( + sprintf('Could not fetch deliveries from order with id %s', $orderEntity->getId()) + ); + + throw new OrderDeliveryNotFoundException($orderEntity->getId()); + } + + return $delivery; + } +} diff --git a/src/Service/MollieApi/OrderItemsExtractor.php b/src/Service/MollieApi/OrderItemsExtractor.php new file mode 100644 index 000000000..df2a97069 --- /dev/null +++ b/src/Service/MollieApi/OrderItemsExtractor.php @@ -0,0 +1,37 @@ +getLineItems(); + + if (!$lineItems instanceof OrderLineItemCollection) { + throw new OrderLineItemsNotFoundException($orderEntity->getId()); + } + + return $lineItems; + } +} diff --git a/src/Service/MollieApi/Shipment.php b/src/Service/MollieApi/Shipment.php index a18cda11c..c838d53a6 100644 --- a/src/Service/MollieApi/Shipment.php +++ b/src/Service/MollieApi/Shipment.php @@ -3,6 +3,7 @@ namespace Kiener\MolliePayments\Service\MollieApi; use Kiener\MolliePayments\Exception\MollieOrderCouldNotBeShippedException; +use Kiener\MolliePayments\Service\MollieApi\Models\MollieShippingItem; use Kiener\MolliePayments\Struct\MollieApi\ShipmentTrackingInfoStruct; use Mollie\Api\Exceptions\ApiException; use Mollie\Api\Resources\OrderLine; @@ -10,7 +11,7 @@ use Mollie\Api\Resources\ShipmentCollection; use Mollie\Api\Types\OrderLineType; -class Shipment +class Shipment implements ShipmentInterface { /** * @var Order @@ -40,22 +41,38 @@ public function getShipments(string $mollieOrderId, string $salesChannelId): Shi /** * @param string $mollieOrderId * @param string $salesChannelId + * @param MollieShippingItem[] $items * @param null|ShipmentTrackingInfoStruct $tracking + * @throws \Exception * @return MollieShipment */ - public function shipOrder( - string $mollieOrderId, - string $salesChannelId, - ?ShipmentTrackingInfoStruct $tracking = null - ): MollieShipment { + public function shipOrder(string $mollieOrderId, string $salesChannelId, array $items, ?ShipmentTrackingInfoStruct $tracking): MollieShipment + { try { $options = []; + if ($tracking instanceof ShipmentTrackingInfoStruct) { $options['tracking'] = $tracking->toArray(); } $mollieOrder = $this->orderApiService->getMollieOrder($mollieOrderId, $salesChannelId); - return $mollieOrder->shipAll($options); + + # if we have no items + # then simply ship all + if (empty($items)) { + return $mollieOrder->shipAll($options); + } + + # if we have provided items, + # we need to build the structure first + foreach ($items as $item) { + $options['lines'][] = [ + 'id' => $item->getMollieItemId(), + 'quantity' => $item->getQuantity(), + ]; + } + + return $mollieOrder->createShipment($options); } catch (ApiException $e) { throw new MollieOrderCouldNotBeShippedException( $mollieOrderId, @@ -75,13 +92,8 @@ public function shipOrder( * @param null|ShipmentTrackingInfoStruct $tracking * @return MollieShipment */ - public function shipItem( - string $mollieOrderId, - string $salesChannelId, - string $mollieOrderLineId, - int $quantity, - ?ShipmentTrackingInfoStruct $tracking = null - ): MollieShipment { + public function shipItem(string $mollieOrderId, string $salesChannelId, string $mollieOrderLineId, int $quantity, ?ShipmentTrackingInfoStruct $tracking): MollieShipment + { try { $options = [ 'lines' => [ @@ -97,6 +109,7 @@ public function shipItem( } $mollieOrder = $this->orderApiService->getMollieOrder($mollieOrderId, $salesChannelId); + return $mollieOrder->createShipment($options); } catch (ApiException $e) { throw new MollieOrderCouldNotBeShippedException( diff --git a/src/Service/MollieApi/ShipmentInterface.php b/src/Service/MollieApi/ShipmentInterface.php new file mode 100644 index 000000000..7d2e512d9 --- /dev/null +++ b/src/Service/MollieApi/ShipmentInterface.php @@ -0,0 +1,52 @@ + + */ + public function getTotals(string $mollieOrderId, string $salesChannelId): array; + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @return array + */ + public function getStatus(string $mollieOrderId, string $salesChannelId): array; + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @return ShipmentCollection + */ + public function getShipments(string $mollieOrderId, string $salesChannelId): ShipmentCollection; + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @param MollieShippingItem[] $items + * @param null|ShipmentTrackingInfoStruct $tracking + * @return MollieShipment + */ + public function shipOrder(string $mollieOrderId, string $salesChannelId, array $items, ?ShipmentTrackingInfoStruct $tracking): MollieShipment; + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @param string $mollieOrderLineId + * @param int $quantity + * @param null|ShipmentTrackingInfoStruct $tracking + * @return MollieShipment + */ + public function shipItem(string $mollieOrderId, string $salesChannelId, string $mollieOrderLineId, int $quantity, ?ShipmentTrackingInfoStruct $tracking): MollieShipment; +} diff --git a/src/Service/Order/UpdateOrderLineItems.php b/src/Service/Order/UpdateOrderLineItems.php index 9fc158495..c014762c9 100644 --- a/src/Service/Order/UpdateOrderLineItems.php +++ b/src/Service/Order/UpdateOrderLineItems.php @@ -6,6 +6,8 @@ use Mollie\Api\Resources\Order; use Mollie\Api\Resources\OrderLine; use Mollie\Api\Types\OrderLineType; +use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemCollection; +use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity; use Shopware\Core\System\SalesChannel\SalesChannelContext; class UpdateOrderLineItems @@ -29,7 +31,7 @@ public function __construct(OrderLineItemRepositoryInterface $orderLineRepositor * @param SalesChannelContext $salesChannelContext * @return void */ - public function updateOrderLineItems(array $orderLines, SalesChannelContext $salesChannelContext): void + public function updateOrderLineItems(array $orderLines, OrderLineItemCollection $shopwareOrderLines, SalesChannelContext $salesChannelContext): void { foreach ($orderLines as $orderLine) { if ($orderLine->type === OrderLineType::TYPE_SHIPPING_FEE) { @@ -41,13 +43,20 @@ public function updateOrderLineItems(array $orderLines, SalesChannelContext $sal if (empty($shopwareLineItemId)) { continue; } + /** @var OrderLineItemEntity $shopwareLine */ + $shopwareLine = $shopwareOrderLines->get($shopwareLineItemId); + if (!$shopwareLine instanceof OrderLineItemEntity) { + continue; + } + + ## we need some customfields for later when we edit an order, for example subscription information + $originalCustomFields = $shopwareLine->getPayload()['customFields'] ?? []; + $originalCustomFields['order_line_id'] = $orderLine->id; $data = [ - 'id' => $shopwareLineItemId, + 'id' => $shopwareLine->getId(), 'customFields' => [ - 'mollie_payments' => [ - 'order_line_id' => $orderLine->id - ] + 'mollie_payments' => $originalCustomFields ] ]; diff --git a/src/Service/OrderDeliveryService.php b/src/Service/OrderDeliveryService.php index 0d50472c0..6c877f331 100644 --- a/src/Service/OrderDeliveryService.php +++ b/src/Service/OrderDeliveryService.php @@ -27,6 +27,8 @@ public function getDelivery(string $orderDeliveryId, Context $context): ?OrderDe { $criteria = new Criteria([$orderDeliveryId]); $criteria->addAssociation('order.transactions.paymentMethod'); + $criteria->addAssociation('order.deliveries.shippingMethod'); + $criteria->addAssociation('shippingMethod'); $result = $this->orderDeliveryRepository->search($criteria, $context); return $result->first(); diff --git a/src/Service/OrderService.php b/src/Service/OrderService.php index 46def6f4a..eabd648a4 100644 --- a/src/Service/OrderService.php +++ b/src/Service/OrderService.php @@ -16,6 +16,7 @@ use Mollie\Api\Types\PaymentMethod; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Cart\Exception\OrderNotFoundException; +use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryEntity; use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity; use Shopware\Core\Checkout\Order\OrderEntity; use Shopware\Core\Checkout\Order\SalesChannel\OrderService as ShopwareOrderService; @@ -52,27 +53,33 @@ class OrderService implements OrderServiceInterface */ private $updateOrderTransactionCustomFields; + /** + * @var OrderDeliveryService + */ + private $orderDeliveryService; + /** * @var LoggerInterface */ protected $logger; - /** * @param OrderRepositoryInterface $orderRepository * @param ShopwareOrderService $swOrderService * @param Order $mollieOrderService - * @param UpdateOrderCustomFields $customFieldsUpdater - * @param UpdateOrderTransactionCustomFields $orderTransactionCustomFields + * @param UpdateOrderCustomFields $updateOrderCustomFields + * @param UpdateOrderTransactionCustomFields $updateOrderTransactionCustomFields + * @param OrderDeliveryService $orderDeliveryService * @param LoggerInterface $logger */ - public function __construct(OrderRepositoryInterface $orderRepository, ShopwareOrderService $swOrderService, Order $mollieOrderService, UpdateOrderCustomFields $customFieldsUpdater, UpdateOrderTransactionCustomFields $orderTransactionCustomFields, LoggerInterface $logger) + public function __construct(OrderRepositoryInterface $orderRepository, ShopwareOrderService $swOrderService, Order $mollieOrderService, UpdateOrderCustomFields $updateOrderCustomFields, UpdateOrderTransactionCustomFields $updateOrderTransactionCustomFields, OrderDeliveryService $orderDeliveryService, LoggerInterface $logger) { $this->orderRepository = $orderRepository; $this->swOrderService = $swOrderService; $this->mollieOrderService = $mollieOrderService; - $this->updateOrderCustomFields = $customFieldsUpdater; - $this->updateOrderTransactionCustomFields = $orderTransactionCustomFields; + $this->updateOrderCustomFields = $updateOrderCustomFields; + $this->updateOrderTransactionCustomFields = $updateOrderTransactionCustomFields; + $this->orderDeliveryService = $orderDeliveryService; $this->logger = $logger; } @@ -104,7 +111,7 @@ public function getOrder(string $orderId, Context $context): OrderEntity $criteria->addAssociation('transactions.paymentMethod'); $criteria->addAssociation('transactions.paymentMethod.appPaymentMethod.app'); $criteria->addAssociation('transactions.stateMachineState'); - $criteria->addAssociation(OrderExtension::REFUND_PROPERTY_NAME.'.refundItems'); # for refund manager + $criteria->addAssociation(OrderExtension::REFUND_PROPERTY_NAME . '.refundItems'); # for refund manager $order = $this->orderRepository->search($criteria, $context)->first(); @@ -143,6 +150,29 @@ public function getOrderByNumber(string $orderNumber, Context $context): OrderEn throw new OrderNumberNotFoundException($orderNumber); } + /** + * @param string $deliveryId + * @param Context $context + * @throws \Exception + * @return OrderEntity + */ + public function getOrderByDeliveryId(string $deliveryId, Context $context): OrderEntity + { + $delivery = $this->orderDeliveryService->getDelivery($deliveryId, $context); + + if (!$delivery instanceof OrderDeliveryEntity) { + throw new \Exception('Delivery with id ' . $deliveryId . ' not found'); + } + + $order = $delivery->getOrder(); + + if (!$order instanceof OrderEntity) { + throw new \Exception('Order with id ' . $delivery->getOrderId() . ' not found'); + } + + return $order; + } + /** * @param OrderEntity $order * @throws CouldNotExtractMollieOrderIdException @@ -222,7 +252,7 @@ public function updateMollieDataCustomFields(OrderEntity $order, string $mollieO $thirdPartyPaymentId = ''; $molliePaymentID = ''; $creditCardDetails = null; - + $bankTransferDetails = null; try { // Add the transaction ID to the order's custom fields // We might need this later on for reconciliation @@ -238,6 +268,7 @@ public function updateMollieDataCustomFields(OrderEntity $order, string $mollieO # check if we have a Bank Transfer reference if (isset($molliePayment->details, $molliePayment->details->transferReference)) { $thirdPartyPaymentId = $molliePayment->details->transferReference; + $bankTransferDetails = $molliePayment->details; } # check for creditcard @@ -257,6 +288,7 @@ public function updateMollieDataCustomFields(OrderEntity $order, string $mollieO $customFieldsStruct->setMolliePaymentId($molliePaymentID); $customFieldsStruct->setThirdPartyPaymentId($thirdPartyPaymentId); $customFieldsStruct->setCreditCardDetails($creditCardDetails); + $customFieldsStruct->setBankTransferDetails($bankTransferDetails); $this->updateOrderCustomFields->updateOrder( $order->getId(), diff --git a/src/Service/Payment/Remover/PaymentMethodRemover.php b/src/Service/Payment/Remover/PaymentMethodRemover.php index 6bdcd3b98..7638ce681 100644 --- a/src/Service/Payment/Remover/PaymentMethodRemover.php +++ b/src/Service/Payment/Remover/PaymentMethodRemover.php @@ -6,6 +6,7 @@ use Kiener\MolliePayments\Exception\MissingRequestException; use Kiener\MolliePayments\Exception\MissingRouteException; use Kiener\MolliePayments\Service\MollieApi\OrderDataExtractor; +use Kiener\MolliePayments\Service\MollieApi\OrderItemsExtractor; use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\SettingsService; use Kiener\MolliePayments\Struct\LineItem\LineItemAttributes; @@ -36,7 +37,6 @@ abstract class PaymentMethodRemover implements PaymentMethodRemoverInterface, Ca */ protected $requestStack; - /** * @var OrderService */ @@ -48,7 +48,7 @@ abstract class PaymentMethodRemover implements PaymentMethodRemoverInterface, Ca protected $settingsService; /** - * @var OrderDataExtractor + * @var OrderItemsExtractor */ private $orderDataExtractor; @@ -62,10 +62,10 @@ abstract class PaymentMethodRemover implements PaymentMethodRemoverInterface, Ca * @param RequestStack $requestStack * @param OrderService $orderService * @param SettingsService $settingsService - * @param OrderDataExtractor $orderDataExtractor + * @param OrderItemsExtractor $orderDataExtractor * @param LoggerInterface $logger */ - public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, OrderDataExtractor $orderDataExtractor, LoggerInterface $logger) + public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, OrderItemsExtractor $orderDataExtractor, LoggerInterface $logger) { $this->container = $container; $this->requestStack = $requestStack; @@ -237,7 +237,7 @@ protected function isSubscriptionCart(Cart $cart): bool */ protected function isSubscriptionOrder(OrderEntity $order, Context $context): bool { - $lineItems = $this->orderDataExtractor->extractLineItems($order, $context); + $lineItems = $this->orderDataExtractor->extractLineItems($order); /** @var OrderLineItemEntity $lineItem */ foreach ($lineItems as $lineItem) { @@ -258,7 +258,7 @@ protected function isSubscriptionOrder(OrderEntity $order, Context $context): bo */ protected function isVoucherOrder(OrderEntity $order, Context $context): bool { - $lineItems = $this->orderDataExtractor->extractLineItems($order, $context); + $lineItems = $this->orderDataExtractor->extractLineItems($order); /** @var OrderLineItemEntity $lineItem */ foreach ($lineItems as $lineItem) { diff --git a/src/Service/Payment/Remover/RegularPaymentRemover.php b/src/Service/Payment/Remover/RegularPaymentRemover.php index ebe445b65..40ca6088a 100644 --- a/src/Service/Payment/Remover/RegularPaymentRemover.php +++ b/src/Service/Payment/Remover/RegularPaymentRemover.php @@ -3,6 +3,7 @@ namespace Kiener\MolliePayments\Service\Payment\Remover; use Kiener\MolliePayments\Service\MollieApi\OrderDataExtractor; +use Kiener\MolliePayments\Service\MollieApi\OrderItemsExtractor; use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\SettingsService; use Kiener\MolliePayments\Struct\PaymentMethod\PaymentMethodAttributes; @@ -20,10 +21,10 @@ class RegularPaymentRemover extends PaymentMethodRemover * @param RequestStack $requestStack * @param OrderService $orderService * @param SettingsService $settingsService - * @param OrderDataExtractor $orderDataExtractor + * @param OrderItemsExtractor $orderDataExtractor * @param LoggerInterface $logger */ - public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, OrderDataExtractor $orderDataExtractor, LoggerInterface $logger) + public function __construct(ContainerInterface $container, RequestStack $requestStack, OrderService $orderService, SettingsService $settingsService, OrderItemsExtractor $orderDataExtractor, LoggerInterface $logger) { parent::__construct($container, $requestStack, $orderService, $settingsService, $orderDataExtractor, $logger); } diff --git a/src/Service/PaymentMethodService.php b/src/Service/PaymentMethodService.php index cad8faee0..77f85f0bc 100644 --- a/src/Service/PaymentMethodService.php +++ b/src/Service/PaymentMethodService.php @@ -2,6 +2,7 @@ namespace Kiener\MolliePayments\Service; +use Kiener\MolliePayments\Compatibility\VersionCompare; use Kiener\MolliePayments\Handler\Method\ApplePayPayment; use Kiener\MolliePayments\Handler\Method\BanContactPayment; use Kiener\MolliePayments\Handler\Method\BankTransferPayment; @@ -46,6 +47,12 @@ class PaymentMethodService { + + /** + * + */ + public const TECHNICAL_NAME_PREFIX = 'payment_mollie_'; + /** * @var MediaService */ @@ -71,21 +78,29 @@ class PaymentMethodService */ private $httpClient; + /** + * @var VersionCompare + */ + private $versionCompare; + /** + * @param string $shopwareVersion * @param MediaService $mediaService * @param MediaRepositoryInterface $mediaRepository * @param PaymentMethodRepositoryInterface $paymentRepository * @param PluginIdProvider $pluginIdProvider * @param HttpClientInterface $httpClient */ - public function __construct(MediaService $mediaService, MediaRepositoryInterface $mediaRepository, PaymentMethodRepositoryInterface $paymentRepository, PluginIdProvider $pluginIdProvider, HttpClientInterface $httpClient) + public function __construct(string $shopwareVersion, MediaService $mediaService, MediaRepositoryInterface $mediaRepository, PaymentMethodRepositoryInterface $paymentRepository, PluginIdProvider $pluginIdProvider, HttpClientInterface $httpClient) { $this->mediaService = $mediaService; $this->mediaRepository = $mediaRepository; $this->paymentRepository = $paymentRepository; $this->pluginIdProvider = $pluginIdProvider; $this->httpClient = $httpClient; + + $this->versionCompare = new VersionCompare($shopwareVersion); } @@ -145,6 +160,7 @@ public function addPaymentMethods(array $paymentMethods, Context $context): void $existingPaymentMethod = null; } + $technicalName = ''; if ($existingPaymentMethod instanceof PaymentMethodEntity) { $paymentMethodData = [ @@ -155,9 +171,6 @@ public function addPaymentMethods(array $paymentMethods, Context $context): void # make sure to repair some fields in here # so that Mollie does always work for our wonderful customers :) 'pluginId' => $pluginId, - 'customFields' => [ - 'mollie_payment_method_name' => $paymentMethod['name'], - ], # ------------------------------------------ # unfortunately some fields are required (*sigh) # so we need to provide those with the value of @@ -165,7 +178,10 @@ public function addPaymentMethods(array $paymentMethods, Context $context): void 'name' => $existingPaymentMethod->getName(), ]; - $upsertData[] = $paymentMethodData; + if ($this->versionCompare->gte('6.5.7.0')) { + # we do a string cast here, since getTechnicalName will be not nullable in the future + $technicalName = (string)$existingPaymentMethod->getTechnicalName(); /** @phpstan-ignore-line */ + } } else { # let's create a full parameter list of everything # that our new payment method needs to have @@ -177,14 +193,25 @@ public function addPaymentMethods(array $paymentMethods, Context $context): void 'description' => '', 'mediaId' => $mediaId, 'afterOrderEnabled' => true, - # ------------------------------------------ - 'customFields' => [ - 'mollie_payment_method_name' => $paymentMethod['name'], - ], ]; + } + + if (mb_strlen($technicalName) === 0) { + $technicalName = self::TECHNICAL_NAME_PREFIX . $paymentMethod['name']; + } + + # custom field name is required to be specific, because we use it in the template to display components + $paymentMethodData['customFields'] = [ + 'mollie_payment_method_name' => $paymentMethod['name'] + ]; - $upsertData[] = $paymentMethodData; + # starting with Shopware 6.5.7.0 this has to be filled out + # so that you can still save the payment method in the administration + if ($this->versionCompare->gte('6.5.7.0')) { + $paymentMethodData['technicalName'] = $technicalName; } + + $upsertData[] = $paymentMethodData; } if (count($upsertData) > 0) { diff --git a/src/Service/SalesChannel/SalesChannelLocale.php b/src/Service/SalesChannel/SalesChannelLocale.php new file mode 100644 index 000000000..172d63b40 --- /dev/null +++ b/src/Service/SalesChannel/SalesChannelLocale.php @@ -0,0 +1,79 @@ +repoLanguages = $repoLanguages; + } + + + /** + * @param SalesChannelContext $salesChannelContext + * @return string + */ + public function getLocale(SalesChannelContext $salesChannelContext): string + { + # Get the language object from the sales channel context. + $locale = ''; + + $salesChannel = $salesChannelContext->getSalesChannel(); + $languageId = $salesChannel->getLanguageId(); + + $language = $this->repoLanguages->findById($languageId, $salesChannelContext->getContext()); + + if ($language !== null && $language->getLocale() !== null) { + $locale = $language->getLocale()->getCode(); + } + + # Set the locale based on the current storefront. + if ($locale !== null && $locale !== '') { + $locale = str_replace('-', '_', $locale); + } + + # Check if the shop locale is available. + if ($locale === '' || !in_array($locale, self::AVAILABLE_LOCALES, true)) { + $locale = 'en_GB'; + } + + return $locale; + } +} diff --git a/src/Service/Stock/StockManager.php b/src/Service/Stock/StockManager.php index c7e0673b1..76e9c2852 100644 --- a/src/Service/Stock/StockManager.php +++ b/src/Service/Stock/StockManager.php @@ -8,22 +8,44 @@ use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity; use Shopware\Core\Defaults; use Shopware\Core\Framework\DataAbstractionLayer\Doctrine\RetryableQuery; +use Shopware\Core\Framework\Feature; use Shopware\Core\Framework\Uuid\Uuid; +use Symfony\Component\DependencyInjection\ContainerInterface; class StockManager implements StockManagerInterface { + private const STOCK_MANAGER_PARAMETER_NAME = 'shopware.stock.enable_stock_management'; /** * @var Connection */ private $connection; + /** + * @var bool + */ + private $enableStockManagement; + /** * @param Connection $connection + * @param ContainerInterface $container */ - public function __construct(Connection $connection) + public function __construct(Connection $connection, ContainerInterface $container) { $this->connection = $connection; + + /** + * Enable stock management per default and disable it by config + */ + $this->enableStockManagement = true; + + /** + * We have to use here the container because the parameter does not exists in earlier shopware versions and we get an exceptions + * when activating the plugin + */ + if ($container->hasParameter(self::STOCK_MANAGER_PARAMETER_NAME)) { + $this->enableStockManagement = (bool)$container->getParameter(self::STOCK_MANAGER_PARAMETER_NAME); + } } /** @@ -35,12 +57,16 @@ public function __construct(Connection $connection) */ public function increaseStock(OrderLineItemEntity $lineItem, int $quantity, string $mollieRefundID): void { + if ($this->isEnabled() === false) { + return; + } + if ($lineItem->getPayload() === null) { return; } # check if we have a product - if (!isset($lineItem->getPayload()['productNumber'])) { + if (! isset($lineItem->getPayload()['productNumber'])) { return; } @@ -59,4 +85,14 @@ public function increaseStock(OrderLineItemEntity $lineItem, int $quantity, stri ] ); } + + /** + * We do not listen to Feature::isActive('STOCK_HANDLING') this feature is disabled by default and enabled in later versions + * if we listen to this feature, we will introduce breaking changes and this feature has to be enabled explicit so the refund manager will increase the stock + * @return bool + */ + private function isEnabled(): bool + { + return $this->enableStockManagement; + } } diff --git a/src/Service/TrackingInfoStructFactory.php b/src/Service/TrackingInfoStructFactory.php new file mode 100644 index 000000000..fdd07e955 --- /dev/null +++ b/src/Service/TrackingInfoStructFactory.php @@ -0,0 +1,129 @@ += 100 + */ + const MAX_TRACKING_CODE_LENGTH = 99; + + + /** + * @param OrderEntity $order + * @throws NoDeliveriesFoundException + * @return null|ShipmentTrackingInfoStruct + */ + public function trackingFromOrder(OrderEntity $order): ?ShipmentTrackingInfoStruct + { + # automatically extract from order + $deliveries = $order->getDeliveries(); + + if (!$deliveries instanceof OrderDeliveryCollection || $deliveries->count() === 0) { + throw new NoDeliveriesFoundException('No deliveries found for order with ID ' . $order->getId() . '!'); + } + + $orderDeliveryEntity = $deliveries->first(); + + $trackingCodes = $orderDeliveryEntity->getTrackingCodes(); + $shippingMethod = $orderDeliveryEntity->getShippingMethod(); + + if ($shippingMethod === null) { + return null; + } + + /** + * Currently we create one shipping in mollie for one order. one shipping object can have only one tracking code. + * When we have multiple Tracking Codes, we do not know which tracking code we should send to mollie. So we just dont send any tracking information at all + * + * https://docs.mollie.com/reference/v2/shipments-api/create-shipment + */ + if (count($trackingCodes) !== 1) { + return null; + } + + return $this->createInfoStruct( + (string)$shippingMethod->getName(), + $trackingCodes[0], + (string)$shippingMethod->getTrackingUrl() + ); + } + + /** + * @param string $trackingCarrier + * @param string $trackingCode + * @param string $trackingUrl + * @return null|ShipmentTrackingInfoStruct + */ + public function create(string $trackingCarrier, string $trackingCode, string $trackingUrl): ?ShipmentTrackingInfoStruct + { + return $this->createInfoStruct($trackingCarrier, $trackingCode, $trackingUrl); + } + + /** + * @param string $trackingCarrier + * @param string $trackingCode + * @param string $trackingUrl + * @return null|ShipmentTrackingInfoStruct + */ + private function createInfoStruct(string $trackingCarrier, string $trackingCode, string $trackingUrl): ?ShipmentTrackingInfoStruct + { + if (empty($trackingCarrier) && empty($trackingCode)) { + return null; + } + + if (empty($trackingCarrier)) { + throw new \InvalidArgumentException('Missing Argument for Tracking Carrier!'); + } + + if (empty($trackingCode)) { + throw new \InvalidArgumentException('Missing Argument for Tracking Code!'); + } + + # we just have to completely remove those codes, so that no tracking happens, but a shipping works. + # still, if we find multiple codes (because separators exist), then we use the first one only + if (mb_strlen($trackingCode) > self::MAX_TRACKING_CODE_LENGTH) { + if (strpos($trackingCode, ',') !== false) { + $trackingCode = trim(explode(',', $trackingCode)[0]); + } elseif (strpos($trackingCode, ';') !== false) { + $trackingCode = trim(explode(';', $trackingCode)[0]); + } + + # if we are still too long, then simply remove the code + if (mb_strlen($trackingCode) > self::MAX_TRACKING_CODE_LENGTH) { + return new ShipmentTrackingInfoStruct($trackingCarrier, '', ''); + } + } + + + # had the use case of this pattern, and it broke the sprintf below + if ($this->stringContains($trackingUrl, '%s%')) { + $trackingUrl = ''; + } + + $trackingUrl = trim(sprintf($trackingUrl, $trackingCode)); + + if (filter_var($trackingUrl, FILTER_VALIDATE_URL) === false) { + $trackingUrl = ''; + } + + # following characters are not allowed in the tracking URL {,},<,>,# + if (preg_match_all('/[{}<>#]/m', $trackingUrl)) { + $trackingUrl = ''; + } + + return new ShipmentTrackingInfoStruct($trackingCarrier, $trackingCode, $trackingUrl); + } +} diff --git a/src/Service/TransactionService.php b/src/Service/TransactionService.php index 56951789d..cf6ce1800 100644 --- a/src/Service/TransactionService.php +++ b/src/Service/TransactionService.php @@ -45,6 +45,7 @@ public function getTransactionById($transactionId, $versionId = null, Context $c } $transactionCriteria->addAssociation('order.currency'); + $transactionCriteria->addAssociation('order.lineItems'); /** @var OrderTransactionCollection $transactions */ $transactions = $this->orderTransactionRepository->search( diff --git a/src/Service/Transition/TransactionTransitionService.php b/src/Service/Transition/TransactionTransitionService.php index 15f2b9f80..0510788a8 100644 --- a/src/Service/Transition/TransactionTransitionService.php +++ b/src/Service/Transition/TransactionTransitionService.php @@ -72,7 +72,6 @@ public function processTransaction(OrderTransactionEntity $transaction, Context public function reOpenTransaction(OrderTransactionEntity $transaction, Context $context): void { $currentStatus = ($transaction->getStateMachineState() instanceof StateMachineStateEntity) ? $transaction->getStateMachineState()->getTechnicalName() : ''; - $currentStatusName = ($transaction->getStateMachineState() instanceof StateMachineStateEntity) ? $transaction->getStateMachineState()->getName() : ''; if ($this->isFinalOrTargetStatus($currentStatus, [OrderTransactionStates::STATE_OPEN])) { return; @@ -85,7 +84,7 @@ public function reOpenTransaction(OrderTransactionEntity $transaction, Context $ $this->logger->error( sprintf( 'It is not allowed to change status to open from %s. Aborting reopen transition', - $currentStatusName + $currentStatus ) ); diff --git a/src/Setting/MollieSettingStruct.php b/src/Setting/MollieSettingStruct.php index 300b2589e..6c136362f 100644 --- a/src/Setting/MollieSettingStruct.php +++ b/src/Setting/MollieSettingStruct.php @@ -51,6 +51,11 @@ class MollieSettingStruct extends Struct */ protected $debugMode = false; + /** + * @var int + */ + protected $logFileDays = 0; + /** * @var bool */ @@ -337,6 +342,29 @@ public function setTestMode(bool $testMode): self return $this; } + /** + * @return int + */ + public function getLogFileDays(): int + { + if ($this->logFileDays === 0) { + // better be safe than sorry, default was always 14 + return 14; + } + + return $this->logFileDays; + } + + /** + * @param int $logFileDays + * @return void + */ + public function setLogFileDays(int $logFileDays): void + { + $this->logFileDays = $logFileDays; + } + + /** * @return bool */ diff --git a/src/Struct/CustomerStruct.php b/src/Struct/CustomerStruct.php index 23d6e99f8..58a5bd941 100644 --- a/src/Struct/CustomerStruct.php +++ b/src/Struct/CustomerStruct.php @@ -30,6 +30,11 @@ class CustomerStruct extends Struct */ private $creditCardToken; + /** + * @var bool + */ + private $shouldSaveCardDetail; + /** * TODO: we need to get rid off this one day, no magic -> we need to explicitly load the values from the MySQL JSON * @param string $key @@ -155,6 +160,11 @@ public function toCustomFieldsArray(): array $mollieData['credit_card_token'] = (string)$this->creditCardToken; } + if (!empty($this->shouldSaveCardDetail)) { + $mollieData['shouldSaveCardDetail'] = $this->shouldSaveCardDetail; + } + + $fullCustomField = [ 'mollie_payments' => $mollieData ]; diff --git a/src/Struct/Order/OrderAttributes.php b/src/Struct/Order/OrderAttributes.php index 58dd60429..a9f0375b1 100644 --- a/src/Struct/Order/OrderAttributes.php +++ b/src/Struct/Order/OrderAttributes.php @@ -89,6 +89,20 @@ class OrderAttributes */ private $order; + /** + * @var string + */ + private $bankName; + + /** + * @var string + */ + private $bankAccount; + + /** + * @var string + */ + private $bankBic; /** * @param OrderEntity $order @@ -110,6 +124,9 @@ public function __construct(OrderEntity $order) $this->creditCardCountryCode = $this->getCustomFieldValue($order, 'creditCardCountryCode'); $this->creditCardSecurity = $this->getCustomFieldValue($order, 'creditCardSecurity'); $this->creditCardFeeRegion = $this->getCustomFieldValue($order, 'creditCardFeeRegion'); + $this->bankName = $this->getCustomFieldValue($order, 'bankName'); + $this->bankAccount = $this->getCustomFieldValue($order, 'bankAccount'); + $this->bankBic = $this->getCustomFieldValue($order, 'bankBic'); $this->timezone = $this->getCustomFieldValue($order, 'timezone'); } @@ -315,6 +332,56 @@ public function setCreditCardFeeRegion(string $creditCardFeeRegion): void $this->creditCardFeeRegion = $creditCardFeeRegion; } + /** + * @return string + */ + public function getBankName(): string + { + return $this->bankName; + } + + /** + * @param string $bankName + */ + public function setBankName(string $bankName): void + { + $this->bankName = $bankName; + } + + /** + * @return string + */ + public function getBankAccount(): string + { + return $this->bankAccount; + } + + /** + * @param string $bankAccount + */ + public function setBankAccount(string $bankAccount): void + { + $this->bankAccount = $bankAccount; + } + + /** + * @return string + */ + public function getBankBic(): string + { + return $this->bankBic; + } + + /** + * @param string $bankBic + */ + public function setBankBic(string $bankBic): void + { + $this->bankBic = $bankBic; + } + + + /** * @return string */ @@ -337,29 +404,45 @@ public function setTimezone(string $timezone): void */ public function setCreditCardDetails(?stdClass $details) { - if (!empty($details->cardNumber)) { + if (! empty($details->cardNumber)) { $this->creditCardNumber = $details->cardNumber; } - if (!empty($details->cardHolder)) { + if (! empty($details->cardHolder)) { $this->creditCardHolder = $details->cardHolder; } - if (!empty($details->cardAudience)) { + if (! empty($details->cardAudience)) { $this->creditCardAudience = $details->cardAudience; } - if (!empty($details->cardLabel)) { + if (! empty($details->cardLabel)) { $this->creditCardLabel = $details->cardLabel; } - if (!empty($details->cardCountryCode)) { + if (! empty($details->cardCountryCode)) { $this->creditCardCountryCode = $details->cardCountryCode; } - if (!empty($details->cardSecurity)) { + if (! empty($details->cardSecurity)) { $this->creditCardSecurity = $details->cardSecurity; } - if (!empty($details->feeRegion)) { + if (! empty($details->feeRegion)) { $this->creditCardFeeRegion = $details->feeRegion; } } + /** + * @param null|stdClass $details + * @return void + */ + public function setBankTransferDetails(?stdClass $details) + { + if (! empty($details->bankName)) { + $this->bankName = $details->bankName; + } + if (! empty($details->bankAccount)) { + $this->bankAccount = $details->bankAccount; + } + if (! empty($details->bankBic)) { + $this->bankBic = $details->bankBic; + } + } /** * @return array @@ -433,6 +516,18 @@ public function toArray(): array $mollieData['timezone'] = $this->timezone; } + if ((string)$this->bankName !== '') { + $mollieData['bankName'] = $this->bankName; + } + + if ((string)$this->bankAccount !== '') { + $mollieData['bankAccount'] = $this->bankAccount; + } + + if ((string)$this->bankBic !== '') { + $mollieData['bankBic'] = $this->bankBic; + } + return [ 'mollie_payments' => $mollieData, ]; @@ -445,12 +540,12 @@ public function isTypeSubscription(): bool { # if we already have a mollie subscription ID # then we KNOW it's a subscription - if (!empty($this->mollieSubscriptionId)) { + if (! empty($this->mollieSubscriptionId)) { return true; } # also a shopware subscription id reference, means we have one - if (!empty($this->swSubscriptionId)) { + if (! empty($this->swSubscriptionId)) { return true; } diff --git a/src/Struct/OrderLineItemEntity/OrderLineItemEntityAttributes.php b/src/Struct/OrderLineItemEntity/OrderLineItemEntityAttributes.php index 3968d8aae..669edbb7f 100644 --- a/src/Struct/OrderLineItemEntity/OrderLineItemEntityAttributes.php +++ b/src/Struct/OrderLineItemEntity/OrderLineItemEntityAttributes.php @@ -12,6 +12,10 @@ class OrderLineItemEntityAttributes */ private $item; + /** + * @var string + */ + private $productNumber; /** * @var string @@ -54,8 +58,16 @@ class OrderLineItemEntityAttributes */ public function __construct(OrderLineItemEntity $lineItem) { + $this->productNumber = ''; + $this->item = $lineItem; + $payload = $lineItem->getPayload(); + + if (is_array($payload) && array_key_exists('productNumber', $payload)) { + $this->productNumber = (string)$payload['productNumber']; + } + $this->voucherType = $this->getCustomFieldValue($lineItem, 'voucher_type'); $this->mollieOrderLineID = $this->getCustomFieldValue($lineItem, 'order_line_id'); @@ -67,6 +79,15 @@ public function __construct(OrderLineItemEntity $lineItem) $this->subscriptionRepetitionCount = (int)$this->getCustomFieldValue($lineItem, 'subscription_repetition'); } + + /** + * @return string + */ + public function getProductNumber(): string + { + return (string)$this->productNumber; + } + /** * @return string */ diff --git a/src/Subscriber/CheckoutConfirmPageSubscriber.php b/src/Subscriber/CheckoutConfirmPageSubscriber.php index 9c62e8db9..e3f5187c6 100644 --- a/src/Subscriber/CheckoutConfirmPageSubscriber.php +++ b/src/Subscriber/CheckoutConfirmPageSubscriber.php @@ -6,25 +6,18 @@ use Kiener\MolliePayments\Factory\MollieApiFactory; use Kiener\MolliePayments\Gateway\MollieGatewayInterface; use Kiener\MolliePayments\Handler\Method\CreditCardPayment; -use Kiener\MolliePayments\Handler\Method\PosPayment; -use Kiener\MolliePayments\Repository\Language\LanguageRepositoryInterface; -use Kiener\MolliePayments\Repository\Locale\LocaleRepositoryInterface; use Kiener\MolliePayments\Service\CustomerService; use Kiener\MolliePayments\Service\CustomFieldService; use Kiener\MolliePayments\Service\MandateServiceInterface; +use Kiener\MolliePayments\Service\SalesChannel\SalesChannelLocale; use Kiener\MolliePayments\Service\SettingsService; use Kiener\MolliePayments\Setting\MollieSettingStruct; use Kiener\MolliePayments\Struct\PaymentMethod\PaymentMethodAttributes; use Mollie\Api\Exceptions\ApiException; use Mollie\Api\MollieApiClient; use Mollie\Api\Resources\Method; -use Mollie\Api\Resources\Terminal; use Mollie\Api\Types\PaymentMethod; use Shopware\Core\Checkout\Customer\CustomerEntity; -use Shopware\Core\Checkout\Payment\PaymentMethodEntity; -use Shopware\Core\Framework\DataAbstractionLayer\Search\Criteria; -use Shopware\Core\Framework\DataAbstractionLayer\Search\Filter\EqualsFilter; -use Shopware\Core\System\Language\LanguageEntity; use Shopware\Storefront\Page\Account\Order\AccountEditOrderPageLoadedEvent; use Shopware\Storefront\Page\Checkout\Confirm\CheckoutConfirmPageLoadedEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -52,10 +45,9 @@ class CheckoutConfirmPageSubscriber implements EventSubscriberInterface private $settings; /** - * @var LanguageRepositoryInterface + * @var SalesChannelLocale */ - private $repoLanguages; - + private $salesChannelLocale; /** * @var MandateServiceInterface @@ -88,17 +80,17 @@ public static function getSubscribedEvents(): array /** * @param MollieApiFactory $apiFactory * @param SettingsService $settingsService - * @param LanguageRepositoryInterface $languageRepositoryInterface * @param MandateServiceInterface $mandateService * @param MollieGatewayInterface $mollieGateway + * @param SalesChannelLocale $salesChannelLocale */ - public function __construct(MollieApiFactory $apiFactory, SettingsService $settingsService, LanguageRepositoryInterface $languageRepositoryInterface, MandateServiceInterface $mandateService, MollieGatewayInterface $mollieGateway) + public function __construct(MollieApiFactory $apiFactory, SettingsService $settingsService, MandateServiceInterface $mandateService, MollieGatewayInterface $mollieGateway, SalesChannelLocale $salesChannelLocale) { $this->apiFactory = $apiFactory; $this->settingsService = $settingsService; - $this->repoLanguages = $languageRepositoryInterface; $this->mandateService = $mandateService; $this->mollieGateway = $mollieGateway; + $this->salesChannelLocale = $salesChannelLocale; } @@ -114,7 +106,7 @@ public function addDataToPage($args): void $mollieAttributes = new PaymentMethodAttributes($currentSelectedPaymentMethod); # load additional data only for mollie payment methods - if (! $mollieAttributes->isMolliePayment()) { + if (!$mollieAttributes->isMolliePayment()) { return; } @@ -144,75 +136,9 @@ public function addDataToPage($args): void */ private function addMollieLocaleVariableToPage($args): void { - /** - * Build an array of available locales. - */ - $availableLocales = [ - 'en_US', - 'en_GB', - 'nl_NL', - 'fr_FR', - 'it_IT', - 'de_DE', - 'de_AT', - 'de_CH', - 'es_ES', - 'ca_ES', - 'nb_NO', - 'pt_PT', - 'sv_SE', - 'fi_FI', - 'da_DK', - 'is_IS', - 'hu_HU', - 'pl_PL', - 'lv_LV', - 'lt_LT' - ]; - - /** - * Get the language object from the sales channel context. - */ - $locale = ''; - $salesChannelContext = $args->getSalesChannelContext(); - - $salesChannel = $salesChannelContext->getSalesChannel(); - if ($salesChannel !== null) { - $languageId = $salesChannel->getLanguageId(); - if ($languageId !== null) { - $languageCriteria = new Criteria(); - $languageCriteria->addAssociation('locale'); - $languageCriteria->addFilter(new EqualsFilter('id', $languageId)); - - $languagesResult = $this->repoLanguages->search($languageCriteria, $args->getContext()); - /** @var LanguageEntity $language */ - $language = $languagesResult->first(); - - if ($language !== null && $language->getLocale() !== null) { - $locale = $language->getLocale()->getCode(); - } - } - } - - - /** - * Set the locale based on the current storefront. - */ - - - if ($locale !== null && $locale !== '') { - $locale = str_replace('-', '_', $locale); - } - - /** - * Check if the shop locale is available. - */ - if ($locale === '' || !in_array($locale, $availableLocales, true)) { - $locale = 'en_GB'; - } - + $locale = $this->salesChannelLocale->getLocale($salesChannelContext); $args->getPage()->assign([ 'mollie_locale' => $locale, diff --git a/src/Subscriber/OrderDeliverySubscriber.php b/src/Subscriber/OrderDeliverySubscriber.php index 1786f0e34..a6a15a88f 100644 --- a/src/Subscriber/OrderDeliverySubscriber.php +++ b/src/Subscriber/OrderDeliverySubscriber.php @@ -2,10 +2,14 @@ namespace Kiener\MolliePayments\Subscriber; -use Kiener\MolliePayments\Facade\MollieShipment; +use Kiener\MolliePayments\Components\ShipmentManager\ShipmentManager; +use Kiener\MolliePayments\Repository\OrderTransaction\OrderTransactionRepositoryInterface; +use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\SettingsService; +use Kiener\MolliePayments\Struct\PaymentMethod\PaymentMethodAttributes; use Psr\Log\LoggerInterface; use Shopware\Core\Checkout\Order\OrderEntity; +use Shopware\Core\Checkout\Payment\PaymentMethodEntity; use Shopware\Core\System\StateMachine\Aggregation\StateMachineTransition\StateMachineTransitionActions; use Shopware\Core\System\StateMachine\Event\StateMachineStateChangeEvent; use Symfony\Component\EventDispatcher\EventSubscriberInterface; @@ -18,28 +22,42 @@ class OrderDeliverySubscriber implements EventSubscriberInterface private $settings; /** - * @var MollieShipment + * @var ShipmentManager */ private $mollieShipment; + /** + * @var OrderService + */ + private $orderService; + + /** + * @var OrderTransactionRepositoryInterface + */ + private $repoOrderTransactions; + /** * @var LoggerInterface */ private $logger; - /** * @param SettingsService $settings - * @param MollieShipment $mollieShipment + * @param ShipmentManager $mollieShipment + * @param OrderService $orderService + * @param OrderTransactionRepositoryInterface $repoOrderTransactions * @param LoggerInterface $logger */ - public function __construct(SettingsService $settings, MollieShipment $mollieShipment, LoggerInterface $logger) + public function __construct(SettingsService $settings, ShipmentManager $mollieShipment, OrderService $orderService, OrderTransactionRepositoryInterface $repoOrderTransactions, LoggerInterface $logger) { $this->settings = $settings; $this->mollieShipment = $mollieShipment; + $this->orderService = $orderService; + $this->repoOrderTransactions = $repoOrderTransactions; $this->logger = $logger; } + /** * @return array */ @@ -75,17 +93,35 @@ public function onOrderDeliveryChanged(StateMachineStateChangeEvent $event): voi return; } - /** @var ?OrderEntity $mollieOrder */ - $mollieOrder = $this->mollieShipment->isMollieOrder($event->getTransition()->getEntityId(), $event->getContext()); + $orderDeliveryId = $event->getTransition()->getEntityId(); - # don't do anything for orders of other PSPs. - # the code below would also create logs until we refactor it, which is wrong for other PSPs - if (!$mollieOrder instanceof OrderEntity) { + try { + $order = $this->orderService->getOrderByDeliveryId($orderDeliveryId, $event->getContext()); + + $swTransaction = $this->repoOrderTransactions->getLatestOrderTransaction($order->getId(), $event->getContext()); + + # verify if the customer really paid with Mollie in the end + $paymentMethod = $swTransaction->getPaymentMethod(); + + if (!$paymentMethod instanceof PaymentMethodEntity) { + throw new \Exception('Transaction ' . $swTransaction->getId() . ' has no payment method!'); + } + + $paymentMethodAttributes = new PaymentMethodAttributes($paymentMethod); + + if (!$paymentMethodAttributes->isMolliePayment()) { + # just skip it if it has been paid + # with another payment provider + # do NOT throw an error + return; + } + + $this->logger->info('Starting Shipment through Order Delivery Transition for order: ' . $order->getOrderNumber()); + + $this->mollieShipment->shipOrderRest($order, null, $event->getContext()); + } catch (\Throwable $ex) { + $this->logger->error('Failed to transfer delivery state to mollie: '.$ex->getMessage()); return; } - - $this->logger->info('Starting Shipment through Order Delivery Transition for order: ' . $mollieOrder->getOrderNumber()); - - $this->mollieShipment->setShipment($event->getTransition()->getEntityId(), $event->getContext()); } } diff --git a/src/Subscriber/ShippingSubscriber.php b/src/Subscriber/ShippingSubscriber.php deleted file mode 100644 index 0afdd4f33..000000000 --- a/src/Subscriber/ShippingSubscriber.php +++ /dev/null @@ -1,79 +0,0 @@ -shipmentFacade = $shipmentFacade; - $this->logger = $logger; - } - - public static function getSubscribedEvents() - { - return [ - MollieOrderShipmentTrackingEvent::class => 'onShipOrderWithTracking', - ]; - } - - /** - * @param MollieOrderShipmentTrackingEvent $event - */ - public function onShipOrderWithTracking(MollieOrderShipmentTrackingEvent $event): void - { - try { - $this->shipmentFacade->shipOrderByOrderId( - $event->getOrderId(), - $event->getTrackingCarrier(), - $event->getTrackingCode(), - $event->getTrackingUrl(), - $event->getContext() - ); - } catch (CouldNotExtractMollieOrderIdException $e) { - // We need to catch CouldNotExtractMollieOrderIdException, because if it's not a Mollie Order - // it obviously cannot get shipped with Mollie. We also don't have to log this, except for debugging. - // But if we don't catch it, the rest of the process might break. - $this->logger->debug($e->getMessage(), [ - 'orderId' => $event->getOrderId(), - 'trackingCarrier' => $event->getTrackingCarrier(), - 'trackingCode' => $event->getTrackingCode(), - 'trackingUrl' => $event->getTrackingUrl(), - ]); - } catch (\Exception $e) { - // We log the error, but don't rethrow so the rest of the proces can continue. - $this->logger->error( - sprintf( - "Error when shipping order from Mollie Event: \"%s\" in \"%s\" on line %s", - $e->getMessage(), - $e->getFile(), - $e->getLine() - ), - [ - 'orderId' => $event->getOrderId(), - 'trackingCarrier' => $event->getTrackingCarrier(), - 'trackingCode' => $event->getTrackingCode(), - 'trackingUrl' => $event->getTrackingUrl(), - ] - ); - } - } -} diff --git a/src/Traits/StringTrait.php b/src/Traits/StringTrait.php index 77113dd52..0c9430ffa 100644 --- a/src/Traits/StringTrait.php +++ b/src/Traits/StringTrait.php @@ -18,4 +18,16 @@ protected function stringStartsWith(string $haystack, string $needle): bool return false; } + + /** + * + */ + protected function stringContains(string $haystack, string $needle): bool + { + if (strpos($haystack, $needle) !== false) { + return true; + } + + return false; + } } diff --git a/switch-composer.php b/switch-composer.php index 903f660ab..540f13663 100644 --- a/switch-composer.php +++ b/switch-composer.php @@ -6,6 +6,8 @@ $composerContent = file_get_contents(__DIR__ . '/composer.json'); $composerContent = json_decode($composerContent, true); + +// >= 6.4.0.0 const SW_VERSIONS_RELEASE = '>=6.4.0'; const SW_VERSIONS_DEV = '*'; diff --git a/tests/Cypress/cypress/e2e/store-api/config.cy.js b/tests/Cypress/cypress/e2e/store-api/config.cy.js new file mode 100644 index 000000000..3285db595 --- /dev/null +++ b/tests/Cypress/cypress/e2e/store-api/config.cy.js @@ -0,0 +1,33 @@ +import StoreAPIClient from "Services/shopware/StoreAPIClient"; +import Shopware from "Services/shopware/Shopware" + +const shopware = new Shopware(); + +const client = new StoreAPIClient(shopware.getStoreApiToken()); + + +it('C2040032: Mollie Config can be retrieved using Store-API', () => { + + const request = new Promise((resolve) => { + client.get('/mollie/config').then(response => { + resolve({'data': response.data}); + }); + }) + + cy.wrap(request).its('data').then(response => { + cy.wrap(response).its('apiAlias').should('eq', 'mollie_payments_config') + + cy.wrap(response).its('profileId').should('exist'); + cy.wrap(response).its('profileId').should('not.eql', ''); + + cy.wrap(response).its('testMode').should('exist'); + cy.wrap(response).its('testMode').should('not.eql', ''); + + cy.wrap(response).its('locale').should('exist'); + cy.wrap(response).its('locale').should('not.eql', ''); + + cy.wrap(response).its('oneClickPayments').should('exist'); + cy.wrap(response).its('oneClickPayments').should('not.eql', ''); + }); +}) + diff --git a/tests/Cypress/cypress/e2e/storefront/shipment/shipment.cy.js b/tests/Cypress/cypress/e2e/storefront/shipment/shipment.cy.js index dfbc89c84..a7e30d72e 100644 --- a/tests/Cypress/cypress/e2e/storefront/shipment/shipment.cy.js +++ b/tests/Cypress/cypress/e2e/storefront/shipment/shipment.cy.js @@ -69,7 +69,7 @@ context("Order Shipping", () => { repoShippingFull.getFirstItemQuantity().should('contain.text', '1'); repoShippingFull.getSecondItemQuantity().should('contain.text', '1'); - shippingAction.shipOrder(); + shippingAction.shipFullOrder(); // verify delivery status and item shipped count assertShippingStatus('Shipped', 2); @@ -103,7 +103,7 @@ context("Order Shipping", () => { repoShippingFull.getTrackingCode().should('have.value', TRACKING_CODE); repoShippingFull.getTrackingUrl().should('not.have.value', ''); - shippingAction.shipOrder(); + shippingAction.shipFullOrder(); assertShippingStatus('Shipped', 2); @@ -119,7 +119,27 @@ context("Order Shipping", () => { repoOrderDetails.getMollieActionButtonShipThroughMollie().should('have.class', disabledClassName); }) - it('C4040: Partial Shipping in Administration', () => { + it('C2138608: Partial Batch Shipping in Administration', () => { + + createOrderAndOpenAdmin(2, 1); + + adminOrders.openShipThroughMollie(); + + // make sure our modal is visible + cy.contains('.sw-modal__header', 'Ship through Mollie', {timeout: 50000}); + + // verify we have 2x 1 item + // we use contain because linebreaks \n exist. + // but we don't add 11 items...so that should be fine + repoShippingFull.getFirstItemQuantity().should('contain.text', '1'); + repoShippingFull.getSecondItemQuantity().should('contain.text', '1'); + + shippingAction.shipBatchOrder(); + + assertShippingStatus('Shipped (partially)', 1); + }) + + it('C4040: Line Item Shipping in Administration', () => { createOrderAndOpenAdmin(2, 2); @@ -158,7 +178,7 @@ context("Order Shipping", () => { // so the first item is actually our second one that was not yet shipped. repoShippingFull.getFirstItemQuantity().should('contain.text', '2'); - shippingAction.shipOrder(); + shippingAction.shipFullOrder(); assertShippingStatus('Shipped', 4); @@ -175,7 +195,7 @@ context("Order Shipping", () => { repoOrderDetails.getMollieActionButtonShipThroughMollie().should('have.class', disabledClassName); }) - it('C4044: Partial Shipping with Tracking', () => { + it('C4044: Line Item Shipping with Tracking', () => { const TRACKING_CODE1 = 'code-1'; const TRACKING_CODE2 = 'code-2'; diff --git a/tests/Cypress/cypress/e2e/storefront/subscriptions/subscription.cy.js b/tests/Cypress/cypress/e2e/storefront/subscriptions/subscription.cy.js index 1ffb862f2..3baa86497 100644 --- a/tests/Cypress/cypress/e2e/storefront/subscriptions/subscription.cy.js +++ b/tests/Cypress/cypress/e2e/storefront/subscriptions/subscription.cy.js @@ -75,112 +75,31 @@ describe('Subscription', () => { }); describe('Storefront + Administration', function () { + it('C2339889: Purchase subscription after failed payment and verify data in Administration', () =>{ + purchaseSubscriptionAndGoToPayment(); - it('C4066: Purchase subscription and verify data in Administration', () => { - - configAction.setupPlugin(true, false, false, true); - configAction.updateProducts('', true, 3, 'weeks'); - - dummyUserScenario.execute(); - cy.visit('/'); - topMenu.clickOnSecondCategory(); - listing.clickOnFirstProduct(); - - // we have to see the subscription indicator - // and the add to basket button should show that we can subscribe - cy.contains('Subscription product'); - cy.contains('.btn', 'Subscribe'); - // we also want to see the translated interval - cy.contains('Every 3 weeks'); - - pdp.addToCart(2); - - // ------------------------------------------------------------------------------------------------------ - - // verify our warning information in our offcanvas - cy.contains('Not all payments methods are available when ordering subscription products'); - - checkout.goToCheckoutInOffCanvas(); - - // ------------------------------------------------------------------------------------------------------ - - // verify our warning information on the cart page - cy.contains('Not all payments methods are available when ordering subscription products'); - // we also want to see the translated interval - cy.contains('Every 3 weeks'); - - // now open our payment methods and verify - // that some of them are not available - // this is a check to at least see that it does something - // we also verify that we see all available methods (just to also check if mollie is even configured correctly). - if (shopware.isVersionGreaterEqual(6.4)) { - paymentAction.showAllPaymentMethods(); - } else { - paymentAction.openPaymentsModal(); - } - - assertAvailablePaymentMethods(); + molliePayment.selectFailed(); - if (shopware.isVersionLower(6.4)) { - paymentAction.closePaymentsModal(); - } + cy.url().should('include', '/payment/failed'); + cy.get('.container-main .btn-primary').click(); + cy.url().should('include','/checkout/select-method'); + cy.get('.grid-button-creditcard[value="creditcard"]').click(); - paymentAction.switchPaymentMethod('Card'); - - shopware.prepareDomainChange(); - checkout.placeOrderOnConfirm(); mollieSandbox.initSandboxCookie(); mollieCreditCardForm.enterValidCard(); mollieCreditCardForm.submitForm(); molliePayment.selectPaid(); - cy.url().should('include', '/checkout/finish'); - cy.contains('Thank you for your order'); - - - // ------------------------------------------------------------------------------------------------------ - - adminLogin.login(); - adminOrders.openOrders(); - adminOrders.openLastOrder(); - - // our latest order must have a subscription "badge" - repoOrdersDetails.getSubscriptionBadge().should('exist'); - - // ------------------------------------------------------------------------------------------------------ - - // verify that we have found a new subscription entry - // attention, this will not be 100% accurate if we have a persisting server - // or multiple subscription tests, but for now it has to work - adminSubscriptions.openSubscriptions(); - adminSubscriptions.openSubscription(0); - - // ------------------------------------------------------------------------------------------------------ + assertValidSubscriptionInAdmin(); + }) - repoAdminSubscriptonDetails.getMollieCustomerIdField().should('be.visible'); + it('C4066: Purchase subscription and verify data in Administration', () => { + purchaseSubscriptionAndGoToPayment(); - vueJs.textField(repoAdminSubscriptonDetails.getMollieCustomerIdField()).containsValue('cst_'); - vueJs.textField(repoAdminSubscriptonDetails.getCreatedAtField()).notEmptyValue(); + molliePayment.selectPaid(); - vueJs.textField(repoAdminSubscriptonDetails.getStatusField()).equalsValue('Active'); - vueJs.textField(repoAdminSubscriptonDetails.getCanceledAtField()).emptyValue(); - vueJs.textField(repoAdminSubscriptonDetails.getMollieSubscriptionIdField()).containsValue('sub_'); - vueJs.textField(repoAdminSubscriptonDetails.getMandateField()).containsValue('mdt_'); - vueJs.textField(repoAdminSubscriptonDetails.getNextPaymentAtField()).notEmptyValue(); - vueJs.textField(repoAdminSubscriptonDetails.getLastRemindedAtField()).emptyValue(); - - // just do a contains, because card-titles are just different - // across shopware versions, and in the end, we just need to make sure we see this exact string - cy.contains("History (2)"); - - // oldest history entry - cy.contains(repoAdminSubscriptonDetails.getHistoryStatusToSelector(1), 'pending', {matchCase: false}); - cy.contains(repoAdminSubscriptonDetails.getHistoryCommentSelector(1), 'created'); - // latest history entry - cy.contains(repoAdminSubscriptonDetails.getHistoryStatusFromSelector(0), 'pending', {matchCase: false}); - cy.contains(repoAdminSubscriptonDetails.getHistoryStatusToSelector(0), 'active', {matchCase: false}); - cy.contains(repoAdminSubscriptonDetails.getHistoryCommentSelector(0), 'confirmed'); + assertValidSubscriptionInAdmin(); }) }); @@ -413,6 +332,111 @@ describe('Subscription', () => { }) +function purchaseSubscriptionAndGoToPayment(){ + configAction.setupPlugin(true, false, false, true); + configAction.updateProducts('', true, 3, 'weeks'); + + dummyUserScenario.execute(); + cy.visit('/'); + topMenu.clickOnSecondCategory(); + listing.clickOnFirstProduct(); + + // we have to see the subscription indicator + // and the add to basket button should show that we can subscribe + cy.contains('Subscription product'); + cy.contains('.btn', 'Subscribe'); + // we also want to see the translated interval + cy.contains('Every 3 weeks'); + + pdp.addToCart(2); + + // ------------------------------------------------------------------------------------------------------ + + // verify our warning information in our offcanvas + cy.contains('Not all payments methods are available when ordering subscription products'); + + checkout.goToCheckoutInOffCanvas(); + + // ------------------------------------------------------------------------------------------------------ + + // verify our warning information on the cart page + cy.contains('Not all payments methods are available when ordering subscription products'); + // we also want to see the translated interval + cy.contains('Every 3 weeks'); + + // now open our payment methods and verify + // that some of them are not available + // this is a check to at least see that it does something + // we also verify that we see all available methods (just to also check if mollie is even configured correctly). + if (shopware.isVersionGreaterEqual(6.4)) { + paymentAction.showAllPaymentMethods(); + } else { + paymentAction.openPaymentsModal(); + } + + assertAvailablePaymentMethods(); + + if (shopware.isVersionLower(6.4)) { + paymentAction.closePaymentsModal(); + } + + paymentAction.switchPaymentMethod('Card'); + + shopware.prepareDomainChange(); + checkout.placeOrderOnConfirm(); + + mollieSandbox.initSandboxCookie(); + mollieCreditCardForm.enterValidCard(); + mollieCreditCardForm.submitForm(); +} + +function assertValidSubscriptionInAdmin(){ + cy.url().should('include', '/checkout/finish'); + cy.contains('Thank you for your order'); + // ------------------------------------------------------------------------------------------------------ + + adminLogin.login(); + adminOrders.openOrders(); + adminOrders.openLastOrder(); + + // our latest order must have a subscription "badge" + repoOrdersDetails.getSubscriptionBadge().should('exist'); + + // ------------------------------------------------------------------------------------------------------ + + // verify that we have found a new subscription entry + // attention, this will not be 100% accurate if we have a persisting server + // or multiple subscription tests, but for now it has to work + adminSubscriptions.openSubscriptions(); + adminSubscriptions.openSubscription(0); + + // ------------------------------------------------------------------------------------------------------ + + repoAdminSubscriptonDetails.getMollieCustomerIdField().should('be.visible'); + + vueJs.textField(repoAdminSubscriptonDetails.getMollieCustomerIdField()).containsValue('cst_'); + vueJs.textField(repoAdminSubscriptonDetails.getCreatedAtField()).notEmptyValue(); + + vueJs.textField(repoAdminSubscriptonDetails.getStatusField()).equalsValue('Active'); + vueJs.textField(repoAdminSubscriptonDetails.getCanceledAtField()).emptyValue(); + vueJs.textField(repoAdminSubscriptonDetails.getMollieSubscriptionIdField()).containsValue('sub_'); + vueJs.textField(repoAdminSubscriptonDetails.getMandateField()).containsValue('mdt_'); + vueJs.textField(repoAdminSubscriptonDetails.getNextPaymentAtField()).notEmptyValue(); + vueJs.textField(repoAdminSubscriptonDetails.getLastRemindedAtField()).emptyValue(); + + // just do a contains, because card-titles are just different + // across shopware versions, and in the end, we just need to make sure we see this exact string + cy.contains("History (2)"); + + // oldest history entry + cy.contains(repoAdminSubscriptonDetails.getHistoryStatusToSelector(1), 'pending', {matchCase: false}); + cy.contains(repoAdminSubscriptonDetails.getHistoryCommentSelector(1), 'created'); + // latest history entry + cy.contains(repoAdminSubscriptonDetails.getHistoryStatusFromSelector(0), 'pending', {matchCase: false}); + cy.contains(repoAdminSubscriptonDetails.getHistoryStatusToSelector(0), 'active', {matchCase: false}); + cy.contains(repoAdminSubscriptonDetails.getHistoryCommentSelector(0), 'confirmed'); +} + function assertAvailablePaymentMethods() { cy.contains('Pay later').should('not.exist'); cy.contains('paysafecard').should('not.exist'); diff --git a/tests/Cypress/cypress/support/actions/admin/ShipThroughMollieAction.js b/tests/Cypress/cypress/support/actions/admin/ShipThroughMollieAction.js index fdb8d4be7..5c1b84976 100644 --- a/tests/Cypress/cypress/support/actions/admin/ShipThroughMollieAction.js +++ b/tests/Cypress/cypress/support/actions/admin/ShipThroughMollieAction.js @@ -16,10 +16,31 @@ export default class ShipThroughMollieAction { /** * */ - shipOrder() { + shipFullOrder() { cy.wait(2000); + // select all items, otherwise + // nothing would be shipped + repoShippingFull.getSelectAllItemsButton().click(); + + repoShippingFull.getShippingButton().click(forceOption); + + // here are automatic reloads and things as it seems + // I really want to test the real UX, so we just wait like a human + cy.wait(4000); + } + + /** + * + */ + shipBatchOrder() { + + cy.wait(2000); + + // select our first item + repoShippingFull.getFirstItemSelectCheckbox().click(); + repoShippingFull.getShippingButton().click(forceOption); // here are automatic reloads and things as it seems diff --git a/tests/Cypress/cypress/support/repositories/admin/ship-through-mollie/FullShippingRepository.js b/tests/Cypress/cypress/support/repositories/admin/ship-through-mollie/FullShippingRepository.js index 868a43736..0a63f0271 100644 --- a/tests/Cypress/cypress/support/repositories/admin/ship-through-mollie/FullShippingRepository.js +++ b/tests/Cypress/cypress/support/repositories/admin/ship-through-mollie/FullShippingRepository.js @@ -1,6 +1,22 @@ export default class FullShippingRepository { + /** + * + * @returns {Cypress.Chainable>} + */ + getSelectAllItemsButton() { + return cy.get('[style="grid-template-columns: 1fr 1fr 4fr; place-items: stretch;"] > :nth-child(1) > .sw-button__content'); + } + + /** + * + * @returns {Cypress.Chainable>} + */ + getFirstItemSelectCheckbox() { + return cy.get('.sw-data-grid__row--0 > .sw-data-grid__cell--itemselect > .sw-data-grid__cell-content input'); + } + /** * * @returns {Cypress.Chainable>} diff --git a/tests/PHPUnit/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderActionTest.php b/tests/PHPUnit/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderActionTest.php index 2b7bdf392..2fa89effe 100644 --- a/tests/PHPUnit/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderActionTest.php +++ b/tests/PHPUnit/Compatibility/Bundles/FlowBuilder/Actions/ShipOrderActionTest.php @@ -6,7 +6,7 @@ use Kiener\MolliePayments\Compatibility\Bundles\FlowBuilder\Actions\ShipOrderAction; use Mollie\Api\Resources\Refund; use Mollie\Api\Types\RefundStatus; -use MolliePayments\Tests\Fakes\FakeMollieShipment; +use MolliePayments\Tests\Fakes\FakeShipmentManager; use MolliePayments\Tests\Fakes\FakeOrderService; use MolliePayments\Tests\Traits\FlowBuilderTestTrait; use PHPUnit\Framework\TestCase; @@ -50,7 +50,7 @@ public function testShippingAction() $order->setOrderNumber('ord-123'); $fakeOrderService = new FakeOrderService($order); - $fakeShipment = new FakeMollieShipment(); + $fakeShipment = new FakeShipmentManager(); $flowEvent = $this->buildOrderStateFlowEvent($order, 'action.mollie.order.ship'); diff --git a/tests/PHPUnit/Components/RefundManager/DAL/RefundItem/RefundItemTest.php b/tests/PHPUnit/Components/RefundManager/DAL/RefundItem/RefundItemTest.php index fd410983c..fa95d3702 100644 --- a/tests/PHPUnit/Components/RefundManager/DAL/RefundItem/RefundItemTest.php +++ b/tests/PHPUnit/Components/RefundManager/DAL/RefundItem/RefundItemTest.php @@ -77,4 +77,15 @@ public function testDALPayloadNoRefundIfEmpty(): void $this->assertArrayNotHasKey('refundId', $payload); } + /** + * This test verifies that no errors is thrown if the label have a null value from the database + * @return void + */ + public function testLabelHaveEmptyValueOnNUll(): void + { + $refundItem = new RefundItemEntity(); + $refundItem->label = null; + + $this->assertSame('',$refundItem->getLabel()); + } } diff --git a/tests/PHPUnit/Components/ShipmentManager/ShipmentManagerTest.php b/tests/PHPUnit/Components/ShipmentManager/ShipmentManagerTest.php new file mode 100644 index 000000000..d14ce1de2 --- /dev/null +++ b/tests/PHPUnit/Components/ShipmentManager/ShipmentManagerTest.php @@ -0,0 +1,484 @@ +fakeShipmentService = new FakeShipment(); + + $deliveryTransitionService = $this->createMock(DeliveryTransitionService::class); + $mollieApiOrderService = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock(); + $orderDeliveryService = $this->getMockBuilder(OrderDeliveryService::class)->disableOriginalConstructor()->getMock(); + $orderService = $this->getMockBuilder(OrderService::class)->disableOriginalConstructor()->getMock(); + $deliveryExtractor = new OrderDeliveryExtractor(new NullLogger()); + + $this->shipmentManager = new ShipmentManager( + $deliveryTransitionService, + $mollieApiOrderService, + $this->fakeShipmentService, + $orderDeliveryService, + $orderService, + $deliveryExtractor, + new OrderItemsExtractor(), + new TrackingInfoStructFactory() + ); + + $this->context = $this->getMockBuilder(Context::class)->disableOriginalConstructor()->getMock(); + } + + + /** + * This test verifies that our shipOrderRest works correctly. + * This is defined by passing an empty line item array to our shipment service. + * We also do not provide any tracking information. In this case, the tracking data will be + * read from the order, which is also empty in this test. + * + * @return void + * @throws \Exception + */ + public function testShipOrderRestWithoutTracking(): void + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + + $this->shipmentManager->shipOrderRest($order, null, $this->context); + + + $this->assertTrue($this->fakeShipmentService->isShipOrderCalled()); + # make sure that the correct order ID is passed on + $this->assertEquals('ord_123', $this->fakeShipmentService->getShippedMollieOrderId()); + # no items should be passed on to do a "shipAll" call + $this->assertCount(0, $this->fakeShipmentService->getShippedItems()); + # no tracking data should be passed on + $this->assertNull($this->fakeShipmentService->getShippedTracking()); + } + + /** + * This test verifies that our shipOrderRest works correctly. + * This is defined by passing an empty line item array to our shipment service. + * We also do not provide any tracking information. But our order as tracking information, + * so it should be passed on correctly to Mollie. + * + * @return void + * @throws \Exception + */ + public function testShipOrderRestWithTrackingFromDelivery(): void + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + + /** @var OrderDeliveryEntity $delivery */ + $delivery = $order->getDeliveries()->first(); + $delivery->setTrackingCodes(['code-123']); + + $this->shipmentManager->shipOrderRest($order, null, $this->context); + + + $this->assertTrue($this->fakeShipmentService->isShipOrderCalled()); + # make sure that the correct order ID is passed on + $this->assertEquals('ord_123', $this->fakeShipmentService->getShippedMollieOrderId()); + # no items should be passed on to do a "shipAll" call + $this->assertCount(0, $this->fakeShipmentService->getShippedItems()); + # delivery tracking data should be passed on + $this->assertEquals('code-123', $this->fakeShipmentService->getShippedTracking()->getCode()); + } + + /** + * This test verifies that our shipOrderRest works correctly. + * This is defined by passing an empty line item array to our shipment service. + * We also provide custom tracking data that needs to be used. + * + * @return void + * @throws \Exception + */ + public function testShipOrderRestWithCustomTracking(): void + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + + $trackingData = new TrackingData( + 'DHL Standard', + 'code-abc', + 'https://www.mollie.com?code=%s' + ); + + $this->shipmentManager->shipOrderRest($order, $trackingData, $this->context); + + + $this->assertTrue($this->fakeShipmentService->isShipOrderCalled()); + # make sure that the correct order ID is passed on + $this->assertEquals('ord_123', $this->fakeShipmentService->getShippedMollieOrderId()); + # no items should be passed on to do a "shipAll" call + $this->assertCount(0, $this->fakeShipmentService->getShippedItems()); + # custom tracking data should be passed on + $this->assertEquals('code-abc', $this->fakeShipmentService->getShippedTracking()->getCode()); + $this->assertEquals('DHL Standard', $this->fakeShipmentService->getShippedTracking()->getCarrier()); + $this->assertEquals('https://www.mollie.com?code=code-abc', $this->fakeShipmentService->getShippedTracking()->getUrl()); + } + + /** + * This test verifies that we get a successful exception + * if our order in Shopware somehow has no deliveries. + * + * @return void + * @throws \Exception + */ + public function testShipOrderRestFailsWithoutDeliveries() + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1])); + + # overwrite deliveries + $order->setDeliveries(new OrderDeliveryCollection([])); + + $this->expectException(NoDeliveriesFoundException::class); + + $this->shipmentManager->shipOrderRest( + $order, + null, + $this->context + ); + + # make sure we don't call the Mollie API + $this->assertFalse($this->fakeShipmentService->isShipOrderCalled()); + } + + /** + * This test verifies that our shipOrder throws a valid exception + * if no line items have been provided. + * + * @return void + * @throws \Exception + */ + public function testShipOrderWithoutTrackingNoLineItems() + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + + $this->expectException(NoLineItemsProvidedException::class); + + $this->shipmentManager->shipOrder($order, null, [], $this->context); + + # make sure we don't call the Mollie API + $this->assertFalse($this->fakeShipmentService->isShipOrderCalled()); + } + + /** + * This test verifies that our shipOrder work correctly. + * We need to provide a line item for this. + * In this test case we do not have any tracking information, neither in the + * custom request, nor in the order delivery itself, so nothing should be tracked. + * + * @return void + * @throws \Exception + */ + public function testShipOrderWithoutTracking() + { + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $lineItem2 = $this->buildLineItemEntity('SKU-2'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1, $lineItem2])); + + $this->shipmentManager->shipOrder( + $order, + null, + [ + new ShipmentLineItem($lineItem1->getId(), 1), + ], + $this->context + ); + + $this->assertTrue($this->fakeShipmentService->isShipOrderCalled()); + # make sure that the correct order ID is passed on + $this->assertEquals('ord_123', $this->fakeShipmentService->getShippedMollieOrderId()); + # 1 line item should be passed + $this->assertCount(1, $this->fakeShipmentService->getShippedItems()); + # no tracking is sent + $this->assertNull($this->fakeShipmentService->getShippedTracking()); + } + + /** + * This test verifies that our shipOrder work correctly. + * We need to provide a line item for this. + * In this test case we do provide any tracking information, + * but the order already has one, so it should be used. + * + * @return void + * @throws \Exception + */ + public function testShipOrderWithTrackingFromDelivery() + { + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $lineItem2 = $this->buildLineItemEntity('SKU-2'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1, $lineItem2])); + + /** @var OrderDeliveryEntity $delivery */ + $delivery = $order->getDeliveries()->first(); + $delivery->setTrackingCodes(['code-123']); + + $this->shipmentManager->shipOrder( + $order, + null, + [ + new ShipmentLineItem($lineItem1->getId(), 1), + ], + $this->context + ); + + $this->assertTrue($this->fakeShipmentService->isShipOrderCalled()); + # make sure that the correct order ID is passed on + $this->assertEquals('ord_123', $this->fakeShipmentService->getShippedMollieOrderId()); + # 1 line item should be passed + $this->assertCount(1, $this->fakeShipmentService->getShippedItems()); + # delivery tracking data should be passed on + $this->assertEquals('code-123', $this->fakeShipmentService->getShippedTracking()->getCode()); + } + + /** + * This test verifies that our shipOrder work correctly. + * We need to provide a line item for this. + * In this test case we provide custom tracking information, + * which should be used. + * + * @return void + * @throws \Exception + */ + public function testShipOrderWithCustomTracking() + { + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $lineItem2 = $this->buildLineItemEntity('SKU-2'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1, $lineItem2])); + + $trackingData = new TrackingData( + 'DHL Standard', + 'code-abc', + 'https://www.mollie.com?code=%s' + ); + + $this->shipmentManager->shipOrder( + $order, + $trackingData, + [ + new ShipmentLineItem($lineItem1->getId(), 1), + ], + $this->context + ); + + $this->assertTrue($this->fakeShipmentService->isShipOrderCalled()); + # make sure that the correct order ID is passed on + $this->assertEquals('ord_123', $this->fakeShipmentService->getShippedMollieOrderId()); + # 1 line item should be passed + $this->assertCount(1, $this->fakeShipmentService->getShippedItems()); + # custom tracking data should be passed on + $this->assertEquals('code-abc', $this->fakeShipmentService->getShippedTracking()->getCode()); + $this->assertEquals('DHL Standard', $this->fakeShipmentService->getShippedTracking()->getCarrier()); + $this->assertEquals('https://www.mollie.com?code=code-abc', $this->fakeShipmentService->getShippedTracking()->getUrl()); + } + + /** + * This test verifies that we get a successful exception + * if our order in Shopware somehow has no deliveries. + * + * @return void + * @throws \Exception + */ + public function testShipOrderFailsWithoutDeliveries() + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1])); + + # overwrite deliveries + $order->setDeliveries(new OrderDeliveryCollection([])); + + $this->expectException(NoDeliveriesFoundException::class); + + $this->shipmentManager->shipOrder( + $order, + null, + [ + new ShipmentLineItem($lineItem1->getId(), 1) + ], + $this->context + ); + + # make sure we don't call the Mollie API + $this->assertFalse($this->fakeShipmentService->isShipOrderCalled()); + } + + /** + * This test verifies if a specific item shipment is correctly being passed on. + * We do not provide any tracking information, neither in the custom request, nor in the order delivery itself. + * + * @return void + * @throws \Exception + */ + public function testShipItemWithoutTracking() + { + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $lineItem2 = $this->buildLineItemEntity('SKU-2'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1, $lineItem2])); + + $this->shipmentManager->shipItem( + $order, + 'SKU-1', + 2, + null, + $this->context + ); + + # make sure that the correct order ID is passed on + $this->assertTrue($this->fakeShipmentService->isShipItemCalled()); + # 1 line item should be passed + $this->assertCount(1, $this->fakeShipmentService->getShippedItems()); + $this->assertEquals(2, $this->fakeShipmentService->getShippedItemQty()); + # no tracking is sent + $this->assertNull($this->fakeShipmentService->getShippedTracking()); + } + + /** + * This test verifies if a specific item shipment is correctly being passed on. + * We do not provide custom tracking data, but our order delivery has data which should be used. + * + * @return void + * @throws \Exception + */ + public function testShipItemWithTrackingFromDelivery() + { + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $lineItem2 = $this->buildLineItemEntity('SKU-2'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1, $lineItem2])); + + /** @var OrderDeliveryEntity $delivery */ + $delivery = $order->getDeliveries()->first(); + $delivery->setTrackingCodes(['code-123']); + + $this->shipmentManager->shipItem( + $order, + 'SKU-1', + 2, + null, + $this->context + ); + + # make sure that the correct order ID is passed on + $this->assertTrue($this->fakeShipmentService->isShipItemCalled()); + # delivery tracking data should be passed on + $this->assertEquals('code-123', $this->fakeShipmentService->getShippedTracking()->getCode()); + } + + /** + * This test verifies if a specific item shipment is correctly being passed on. + * We do provide custom tracking data that should be used + * + * @return void + * @throws \Exception + */ + public function testShipItemWithCustomTracking() + { + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $lineItem2 = $this->buildLineItemEntity('SKU-2'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1, $lineItem2])); + + $this->shipmentManager->shipItem( + $order, + 'SKU-1', + 2, + new TrackingData( + 'DHL Standard', + 'code-abc', + 'https://www.mollie.com?code=%s'), + $this->context + ); + + # make sure that the correct order ID is passed on + $this->assertTrue($this->fakeShipmentService->isShipItemCalled()); + # delivery tracking data should be passed on + $this->assertEquals('code-abc', $this->fakeShipmentService->getShippedTracking()->getCode()); + } + + /** + * This test verifies that we get a successful exception + * if our order in Shopware somehow has no deliveries. + * + * @return void + * @throws \Exception + */ + public function testShipItemFailsWithoutDeliveries() + { + # we build an order without a delivery that contains tracking information + $order = $this->buildMollieOrder('ord_123'); + $lineItem1 = $this->buildLineItemEntity('SKU-1'); + $order->setLineItems(new OrderLineItemCollection([$lineItem1])); + + # overwrite deliveries + $order->setDeliveries(new OrderDeliveryCollection([])); + + $this->expectException(NoDeliveriesFoundException::class); + + $this->shipmentManager->shipItem( + $order, + 'SKU-1', + 2, + null, + $this->context + ); + + # make sure we don't call the Mollie API + $this->assertFalse($this->fakeShipmentService->isShipOrderCalled()); + } + +} \ No newline at end of file diff --git a/tests/PHPUnit/Facade/MollieShipment/CreateTrackingStructTest.php b/tests/PHPUnit/Facade/MollieShipment/CreateTrackingStructTest.php deleted file mode 100644 index 0664c1208..000000000 --- a/tests/PHPUnit/Facade/MollieShipment/CreateTrackingStructTest.php +++ /dev/null @@ -1,125 +0,0 @@ -order = $this->createConfiguredMock(OrderEntity::class, [ - 'getSalesChannelId' => 'foo' - ]); - - $this->delivery = $this->createMock(OrderDeliveryEntity::class); - - $this->shipment = $this->createMock(ShipmentResource::class); - - $this->shipmentApi = $this->createConfiguredMock(Shipment::class, [ - 'shipOrder' => $this->shipment - ]); - - $this->orderService = $this->createConfiguredMock(OrderService::class, [ - 'getMollieOrderId' => 'bar' - ]); - - $this->orderDataExtractor = $this->createConfiguredMock(OrderDataExtractor::class, [ - 'extractDelivery' => $this->delivery - ]); - - $this->shipmentFacade = new MollieShipment( - $this->createMock(MolliePaymentExtractor::class), - $this->createMock(DeliveryTransitionService::class), - $this->createMock(Order::class), - $this->shipmentApi, - $this->createMock(OrderDeliveryService::class), - $this->orderService, - $this->orderDataExtractor, - new NullLogger(), - ); - - $this->context = $this->createMock(Context::class); - } - - public function testTrackingInfoStructWithEmptyTrackingDataReturnsNull() - { - $this->shipmentApi - ->expects($this->once()) - ->method('shipOrder') - ->willReturnCallback(function ($mollieOrderId, $salesChannelId, $trackingInfoStruct) { - $this->assertNull($trackingInfoStruct); - }); - - $this->shipmentFacade->shipOrder($this->order, '', '', '', $this->context); - } - - public function testTrackingInfoStructWithMissingTrackingCarrierThrowsException() - { - $this->expectException(InvalidArgumentException::class); - - $this->shipmentFacade->shipOrder($this->order, '', '123456789', '', $this->context); - } - - public function testTrackingInfoStructWithMissingTrackingCodeThrowsException() - { - $this->expectException(InvalidArgumentException::class); - - $this->shipmentFacade->shipOrder($this->order, 'Mollie', '', '', $this->context); - } - - public function testTrackingInfoStructWithCorrectData() - { - $this->shipmentApi - ->expects($this->once()) - ->method('shipOrder') - ->willReturnCallback(function ($mollieOrderId, $salesChannelId, $trackingInfoStruct) { - $this->assertInstanceOf(ShipmentTrackingInfoStruct::class, $trackingInfoStruct); - }); - - $this->shipmentFacade->shipOrder($this->order, 'Mollie', '123456789', '', $this->context); - } -} diff --git a/tests/PHPUnit/Facade/MollieShipment/SetShipmentTest.php b/tests/PHPUnit/Facade/MollieShipment/SetShipmentTest.php deleted file mode 100644 index 3530ddde3..000000000 --- a/tests/PHPUnit/Facade/MollieShipment/SetShipmentTest.php +++ /dev/null @@ -1,285 +0,0 @@ -context = $this->getMockBuilder(Context::class)->disableOriginalConstructor()->getMock(); - $this->extractor = new MolliePaymentExtractor(); - $this->deliveryTransitionService = $this->createMock(DeliveryTransitionService::class); - $this->mollieApiOrderService = $this->getMockBuilder(Order::class)->disableOriginalConstructor()->getMock(); - $this->mollieApiShipmentService = $this->getMockBuilder(Shipment::class)->disableOriginalConstructor()->getMock(); - $this->orderDeliveryService = $this->getMockBuilder(OrderDeliveryService::class)->disableOriginalConstructor()->getMock(); - $this->orderService = $this->getMockBuilder(OrderService::class)->disableOriginalConstructor()->getMock(); - - $this->logger = new NullLogger(); - - $this->orderDataExtractor = new OrderDataExtractor( - $this->logger, - $this->createMock(CustomerService::class) - ); - - $this->mollieShipment = new MollieShipment( - $this->extractor, - $this->deliveryTransitionService, - $this->mollieApiOrderService, - $this->mollieApiShipmentService, - $this->orderDeliveryService, - $this->orderService, - $this->orderDataExtractor, - $this->logger - ); - $this->orderNumber = 'fooOrderNumber'; - } - - public function testInvalidDeliveryId(): void - { - $deliveryId = 'foo'; - $this->orderDeliveryService->method('getDelivery')->willReturn(null); - - // custom fields for shipping are never written - $this->orderDeliveryService->expects($this->never())->method('updateCustomFields'); - // api call is never done - $this->mollieApiOrderService->expects($this->never())->method('setShipment'); - // result value of facade is false - self::assertFalse($this->mollieShipment->setShipment($deliveryId, $this->context)); - } - - public function testMissingOrder(): void - { - $delivery = $this->createDelivery(null); - $deliveryId = $delivery->getId(); - $this->orderDeliveryService->method('getDelivery')->willReturn($delivery); - - // custom fields for shipping are never written - $this->orderDeliveryService->expects($this->never())->method('updateCustomFields'); - // api call is never done - $this->mollieApiOrderService->expects($this->never())->method('setShipment'); - // result value of facade is false - self::assertFalse($this->mollieShipment->setShipment($deliveryId, $this->context)); - } - - public function testMissingCustomFieldsInOrder(): void - { - $order = $this->createOrder(null); - $delivery = $this->createDelivery($order); - $deliveryId = $delivery->getId(); - $this->orderDeliveryService->method('getDelivery')->willReturn($delivery); - - // custom fields for shipping are never written - $this->orderDeliveryService->expects($this->never())->method('updateCustomFields'); - // api call is never done - $this->mollieApiOrderService->expects($this->never())->method('setShipment'); - // result value of facade is false - self::assertFalse($this->mollieShipment->setShipment($deliveryId, $this->context)); - } - - public function testMissingLastMollieTransaction(): void - { - $order = $this->createOrder(null); - $customFields[CustomFieldsInterface::MOLLIE_KEY][CustomFieldsInterface::ORDER_KEY] = 'foo'; - $order->setCustomFields($customFields); - $delivery = $this->createDelivery($order); - $deliveryId = $delivery->getId(); - $this->orderDeliveryService->method('getDelivery')->willReturn($delivery); - - // custom fields for shipping are never written - $this->orderDeliveryService->expects($this->never())->method('updateCustomFields'); - // api call is never done - $this->mollieApiOrderService->expects($this->never())->method('setShipment'); - // result value of facade is false - self::assertFalse($this->mollieShipment->setShipment($deliveryId, $this->context)); - } - - public function testThatOrderDeliveryCustomFieldsAreNotWrittenWhenApiCallUnsuccessful(): void - { - $transaction = $this->createTransaction('Kiener\MolliePayments\Handler\Method\FooMethod'); - $order = $this->createOrder($transaction); - $mollieOrderId = 'foo'; - $customFields[CustomFieldsInterface::MOLLIE_KEY][CustomFieldsInterface::ORDER_KEY] = $mollieOrderId; - $order->setCustomFields($customFields); - $salesChannel = $this->getMockBuilder(SalesChannelEntity::class)->disableOriginalConstructor()->getMock(); - $salesChannelId = 'bar'; - $salesChannel->method('getId')->willReturn($salesChannelId); - $order->setSalesChannel($salesChannel); - $order->setSalesChannelId($salesChannelId); - $delivery = $this->createDelivery($order); - $deliveryId = $delivery->getId(); - $this->orderDeliveryService->method('getDelivery')->willReturn($delivery); - $this->mollieApiOrderService->method('setShipment') - ->with($mollieOrderId, $salesChannelId) - ->willReturn(false); - - // custom fields for shipping are never written - $this->orderDeliveryService->expects($this->never())->method('updateCustomFields'); - - // result value of facade is false - self::assertFalse($this->mollieShipment->setShipment($deliveryId, $this->context)); - } - - public function testThatOrderDeliveryCustomFieldsAreWrittenWhenApiCallSuccessful(): void - { - $transaction = $this->createTransaction('Kiener\MolliePayments\Handler\Method\FooMethod'); - $order = $this->createOrder($transaction); - $mollieOrderId = 'foo'; - $customFields[CustomFieldsInterface::MOLLIE_KEY][CustomFieldsInterface::ORDER_KEY] = $mollieOrderId; - $order->setCustomFields($customFields); - $salesChannelId = 'bar'; - $salesChannel = $this->getMockBuilder(SalesChannelEntity::class)->disableOriginalConstructor()->getMock(); - $salesChannel->method('getId')->willReturn($salesChannelId); - $order->setSalesChannel($salesChannel); - $order->setSalesChannelId($salesChannelId); - $delivery = $this->createDelivery($order); - $deliveryId = $delivery->getId(); - $this->orderDeliveryService->method('getDelivery')->willReturn($delivery); - $this->mollieApiOrderService->method('setShipment') - ->with($mollieOrderId, $salesChannelId) - ->willReturn(true); - - // custom fields for shipping are written - $this->orderDeliveryService->expects($this->once()) - ->method('updateCustomFields') - ->with($delivery, [CustomFieldsInterface::DELIVERY_SHIPPED => true], $this->context); - - // result value of facade is true - self::assertTrue($this->mollieShipment->setShipment($deliveryId, $this->context)); - } - - /** - * create a delivery entity and set the order in delivery if given - * - * @param null|OrderEntity $order - * @return OrderDeliveryEntity - */ - private function createDelivery(?OrderEntity $order): OrderDeliveryEntity - { - $delivery = new OrderDeliveryEntity(); - $delivery->setId(Uuid::randomHex()); - - if ($order instanceof OrderEntity) { - $delivery->setOrder($order); - } - - return $delivery; - } - - /** - * create an order entity and set the transaction in order if given - * - * @param null|OrderTransactionEntity $transaction - * @return OrderEntity - */ - private function createOrder(?OrderTransactionEntity $transaction): OrderEntity - { - $order = new OrderEntity(); - $order->setId(Uuid::randomHex()); - $order->setOrderNumber($this->orderNumber); - $transactions = new OrderTransactionCollection([]); - if ($transaction instanceof OrderTransactionEntity) { - $transactions->add($transaction); - } - $order->setTransactions($transactions); - - return $order; - } - - /** - * create a transaction with a payment with given payment handler name - * - * @param string $paymentHandlerName - * @return OrderTransactionEntity - */ - private function createTransaction(string $paymentHandlerName): OrderTransactionEntity - { - $transaction = new OrderTransactionEntity(); - $transaction->setId(Uuid::randomHex()); - $paymentMethod = new PaymentMethodEntity(); - $paymentMethod->setId(Uuid::randomHex()); - $paymentMethod->setHandlerIdentifier($paymentHandlerName); - $transaction->setCreatedAt(new \DateTime()); - $transaction->setPaymentMethod($paymentMethod); - - return $transaction; - } -} diff --git a/tests/PHPUnit/Fakes/FakeMollieShipment.php b/tests/PHPUnit/Fakes/FakeMollieShipment.php deleted file mode 100644 index b789281af..000000000 --- a/tests/PHPUnit/Fakes/FakeMollieShipment.php +++ /dev/null @@ -1,131 +0,0 @@ -isFullyShipped = false; - $this->shippedOrderNumber = ''; - } - - - /** - * @return false - */ - public function isFullyShipped(): bool - { - return $this->isFullyShipped; - } - - /** - * @return string - */ - public function getShippedOrderNumber(): string - { - return $this->shippedOrderNumber; - } - - - /** - * @param string $orderDeliveryId - * @param Context $context - * @return bool - */ - public function setShipment(string $orderDeliveryId, Context $context): bool - { - return false; - } - - /** - * @param string $orderId - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return Shipment - */ - public function shipOrderByOrderId(string $orderId, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): Shipment - { - $this->isFullyShipped = true; - return new Shipment(new MollieApiClient()); - } - - /** - * @param string $orderNumber - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return Shipment - */ - public function shipOrderByOrderNumber(string $orderNumber, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): Shipment - { - $this->isFullyShipped = true; - $this->shippedOrderNumber = $orderNumber; - return new Shipment(new MollieApiClient()); - } - - /** - * @param OrderEntity $order - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return Shipment - */ - public function shipOrder(OrderEntity $order, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): Shipment - { - $this->isFullyShipped = true; - $this->shippedOrderNumber = $order->getOrderNumber(); - - return new Shipment(new MollieApiClient()); - } - - public function shipItemByOrderId(string $orderId, string $itemIdentifier, int $quantity, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): Shipment - { - return new Shipment(new MollieApiClient()); - } - - public function shipItemByOrderNumber(string $orderNumber, string $itemIdentifier, int $quantity, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): Shipment - { - return new Shipment(new MollieApiClient()); - } - - - /** - * @param OrderEntity $order - * @param string $itemIdentifier - * @param int $quantity - * @param string $trackingCarrier - * @param string $trackingCode - * @param string $trackingUrl - * @param Context $context - * @return Shipment - */ - public function shipItem(OrderEntity $order, string $itemIdentifier, int $quantity, string $trackingCarrier, string $trackingCode, string $trackingUrl, Context $context): Shipment - { - return new Shipment(new MollieApiClient()); - } -} diff --git a/tests/PHPUnit/Fakes/FakeShipment.php b/tests/PHPUnit/Fakes/FakeShipment.php new file mode 100644 index 000000000..3d0cad06d --- /dev/null +++ b/tests/PHPUnit/Fakes/FakeShipment.php @@ -0,0 +1,161 @@ + + */ + private $shippedItems; + + /** + * @var ?ShipmentTrackingInfoStruct + */ + private $shippedTracking; + + /** + * @var int + */ + private $shippedItemQty; + + + /** + * @return string + */ + public function getShippedMollieOrderId(): string + { + return $this->shippedMollieOrderId; + } + + /** + * @return mixed[] + */ + public function getShippedItems(): array + { + return $this->shippedItems; + } + + /** + * @return bool + */ + public function isShipItemCalled(): bool + { + return $this->shipItemCalled; + } + + /** + * @return bool + */ + public function isShipOrderCalled(): bool + { + return $this->shipOrderCalled; + } + + /** + * @return ShipmentTrackingInfoStruct|null + */ + public function getShippedTracking(): ?ShipmentTrackingInfoStruct + { + return $this->shippedTracking; + } + + /** + * @return int + */ + public function getShippedItemQty(): int + { + return $this->shippedItemQty; + } + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @return array|mixed[] + */ + public function getTotals(string $mollieOrderId, string $salesChannelId): array + { + // TODO: Implement getTotals() method. + } + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @return array|mixed[] + */ + public function getStatus(string $mollieOrderId, string $salesChannelId): array + { + // TODO: Implement getStatus() method. + } + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @return ShipmentCollection + */ + public function getShipments(string $mollieOrderId, string $salesChannelId): ShipmentCollection + { + // TODO: Implement getShipments() method. + } + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @param array $items + * @param ShipmentTrackingInfoStruct|null $tracking + * @return MollieShipment + */ + public function shipOrder(string $mollieOrderId, string $salesChannelId, array $items, ?ShipmentTrackingInfoStruct $tracking = null): MollieShipment + { + $this->shipOrderCalled = true; + $this->shippedMollieOrderId = $mollieOrderId; + $this->shippedItems = $items; + $this->shippedTracking = $tracking; + + return new Shipment(new MollieApiClient()); + } + + /** + * @param string $mollieOrderId + * @param string $salesChannelId + * @param string $mollieOrderLineId + * @param int $quantity + * @param ShipmentTrackingInfoStruct|null $tracking + * @return MollieShipment + */ + public function shipItem(string $mollieOrderId, string $salesChannelId, string $mollieOrderLineId, int $quantity, ?ShipmentTrackingInfoStruct $tracking = null): MollieShipment + { + $this->shipItemCalled = true; + $this->shippedMollieOrderId = $mollieOrderId; + $this->shippedItems = [$mollieOrderLineId]; + $this->shippedTracking = $tracking; + $this->shippedItemQty = $quantity; + + return new Shipment(new MollieApiClient()); + } + +} diff --git a/tests/PHPUnit/Fakes/FakeShipmentManager.php b/tests/PHPUnit/Fakes/FakeShipmentManager.php new file mode 100644 index 000000000..c76285bda --- /dev/null +++ b/tests/PHPUnit/Fakes/FakeShipmentManager.php @@ -0,0 +1,105 @@ +isFullyShipped = false; + $this->shippedOrderNumber = ''; + } + + + /** + * @return false + */ + public function isFullyShipped(): bool + { + return $this->isFullyShipped; + } + + /** + * @return string + */ + public function getShippedOrderNumber(): string + { + return $this->shippedOrderNumber; + } + + /** + * @param OrderEntity $order + * @param TrackingData|null $tracking + * @param array $shippingItems + * @param Context $context + * @return Shipment + */ + public function shipOrder(OrderEntity $order, ?TrackingData $tracking, array $shippingItems, Context $context): Shipment + { + $this->isFullyShipped = true; + $this->shippedOrderNumber = $order->getOrderNumber(); + + return new Shipment(new MollieApiClient()); + } + + /** + * @param OrderEntity $order + * @param string $itemIdentifier + * @param int $quantity + * @param TrackingData|null $tracking + * @param Context $context + * @return Shipment + */ + public function shipItem(OrderEntity $order, string $itemIdentifier, int $quantity, ?TrackingData $tracking, Context $context): Shipment + { + return new Shipment(new MollieApiClient()); + } + + /** + * @param OrderEntity $order + * @param TrackingData|null $tracking + * @param Context $context + * @return Shipment + */ + public function shipOrderRest(OrderEntity $order, ?TrackingData $tracking, Context $context): Shipment + { + $this->isFullyShipped = true; + $this->shippedOrderNumber = $order->getOrderNumber(); + + return new Shipment(new MollieApiClient()); + } + + public function getStatus(string $orderId, Context $context): array + { + // TODO: Implement getStatus() method. + } + + public function getTotals(string $orderId, Context $context): array + { + // TODO: Implement getTotals() method. + } + + +} diff --git a/tests/PHPUnit/Fakes/Repositories/FakeLanguageRepository.php b/tests/PHPUnit/Fakes/Repositories/FakeLanguageRepository.php new file mode 100644 index 000000000..32c45567e --- /dev/null +++ b/tests/PHPUnit/Fakes/Repositories/FakeLanguageRepository.php @@ -0,0 +1,49 @@ +foundLanguage = $foundLanguage; + } + + + /** + * @param Criteria $criteria + * @param Context $context + * @return EntitySearchResult + */ + public function search(Criteria $criteria, Context $context): EntitySearchResult + { + // TODO: Implement search() method. + } + + /** + * @param string $languageId + * @param Context $context + * @return LanguageEntity|null + */ + public function findById(string $languageId, Context $context): ?LanguageEntity + { + return $this->foundLanguage; + } + +} diff --git a/tests/PHPUnit/Service/MollieApi/OrderTest.php b/tests/PHPUnit/Service/MollieApi/OrderTest.php index 3ed09b1ee..1026177ff 100644 --- a/tests/PHPUnit/Service/MollieApi/OrderTest.php +++ b/tests/PHPUnit/Service/MollieApi/OrderTest.php @@ -4,6 +4,7 @@ use Kiener\MolliePayments\Exception\CouldNotFetchMollieOrderException; use Kiener\MolliePayments\Factory\MollieApiFactory; +use Kiener\MolliePayments\Service\CustomerService; use Kiener\MolliePayments\Service\MollieApi\Order as MollieOrderApi; use Kiener\MolliePayments\Service\MollieApi\Payment as MolliePaymentApi; use Kiener\MolliePayments\Service\MollieApi\RequestAnonymizer\MollieRequestAnonymizer; @@ -75,7 +76,8 @@ protected function setUp(): void $this->buildRoutingBuilder($this, ''), new MollieRequestAnonymizer('*'), new NullLogger(), - $this->createMock(SettingsService::class) + $this->createMock(SettingsService::class), + $this->createMock(CustomerService::class), ); } @@ -162,7 +164,7 @@ public function getIsCompletelyShippedData() [OrderLineType::TYPE_STORE_CREDIT, 1, false], // These two types are not (yet) being used by the Mollie plugin, so there should not be any order lines - // with these types in the Mollie order, and we cannot ship them using Facade/MollieShipment::shipItem. + // with these types in the Mollie order, and we cannot ship them using Facade/ShipmentManager::shipItem. // Therefore we mark the (Shopware) order completely shipped. [OrderLineType::TYPE_GIFT_CARD, 0, true], [OrderLineType::TYPE_GIFT_CARD, 1, true], diff --git a/tests/PHPUnit/Service/MollieApi/ShipmentTest.php b/tests/PHPUnit/Service/MollieApi/ShipmentTest.php index e3a8e7b56..1251dec14 100644 --- a/tests/PHPUnit/Service/MollieApi/ShipmentTest.php +++ b/tests/PHPUnit/Service/MollieApi/ShipmentTest.php @@ -106,7 +106,7 @@ public function testShipOrder() ->method('shipAll') ->willReturn($this->createMock(MollieShipment::class)); - $this->shipmentApiService->shipOrder('mollieOrderId', 'salesChannelId'); + $this->shipmentApiService->shipOrder('mollieOrderId', 'salesChannelId', [], null); } /** @@ -121,7 +121,7 @@ public function testShipOrderCannotBeShippedException() $this->expectException(MollieOrderCouldNotBeShippedException::class); - $this->shipmentApiService->shipOrder('mollieOrderId', 'salesChannelId'); + $this->shipmentApiService->shipOrder('mollieOrderId', 'salesChannelId', [], null); } /** @@ -134,7 +134,7 @@ public function testShipItem() ->method('createShipment') ->willReturn($this->createMock(MollieShipment::class)); - $this->shipmentApiService->shipItem('mollieOrderId', 'salesChannelId', 'mollieOrderLineId', 1); + $this->shipmentApiService->shipItem('mollieOrderId', 'salesChannelId', 'mollieOrderLineId', 1, null); } /** @@ -149,7 +149,7 @@ public function testShipItemCannotBeShippedException() $this->expectException(MollieOrderCouldNotBeShippedException::class); - $this->shipmentApiService->shipItem('mollieOrderId', 'salesChannelId', 'mollieOrderLineId', 1); + $this->shipmentApiService->shipItem('mollieOrderId', 'salesChannelId', 'mollieOrderLineId', 1, null); } /** diff --git a/tests/PHPUnit/Service/OrderServiceTest.php b/tests/PHPUnit/Service/OrderServiceTest.php index 8b8121b26..4a0d60519 100644 --- a/tests/PHPUnit/Service/OrderServiceTest.php +++ b/tests/PHPUnit/Service/OrderServiceTest.php @@ -6,6 +6,8 @@ use Kiener\MolliePayments\Exception\CouldNotExtractMollieOrderLineIdException; use Kiener\MolliePayments\Exception\OrderNumberNotFoundException; use Kiener\MolliePayments\Service\CustomFieldsInterface; +use Kiener\MolliePayments\Service\DeliveryService; +use Kiener\MolliePayments\Service\OrderDeliveryService; use Kiener\MolliePayments\Service\OrderService; use Kiener\MolliePayments\Service\UpdateOrderCustomFields; use Kiener\MolliePayments\Service\UpdateOrderTransactionCustomFields; @@ -51,6 +53,7 @@ protected function setUp(): void $this->createMock(\Kiener\MolliePayments\Service\MollieApi\Order::class), $this->createMock(UpdateOrderCustomFields::class), $this->createMock(UpdateOrderTransactionCustomFields::class), + $this->createMock(OrderDeliveryService::class), new NullLogger() ); } diff --git a/tests/PHPUnit/Service/PaymentMethodServiceTest.php b/tests/PHPUnit/Service/PaymentMethodServiceTest.php index 05d1c9273..67c4a3782 100644 --- a/tests/PHPUnit/Service/PaymentMethodServiceTest.php +++ b/tests/PHPUnit/Service/PaymentMethodServiceTest.php @@ -77,6 +77,7 @@ protected function setUp(): void $this->paymentMethodRepository = new FakePaymentMethodRepository($paymentMethod); $this->paymentMethodService = new PaymentMethodService( + '6.5.6.0', $this->createMock(MediaService::class), $this->mediaRepository, $this->paymentMethodRepository, @@ -85,6 +86,18 @@ protected function setUp(): void ); } + /** + * Starting with Shopware 6.5.7.0 a new technical name is + * required for a payment method. + * This test verifies that our used prefix is always the same. + * + * @return void + */ + public function testTechnicalPaymentMethodPrefix(): void + { + $this->assertEquals('payment_mollie_', PaymentMethodService::TECHNICAL_NAME_PREFIX); + } + /** * This test verifies that our list of officially supported payment * methods is not touched without recognizing it. diff --git a/tests/PHPUnit/Service/SalesChannel/SalesChannelLocaleTest.php b/tests/PHPUnit/Service/SalesChannel/SalesChannelLocaleTest.php new file mode 100644 index 000000000..a2a287fb3 --- /dev/null +++ b/tests/PHPUnit/Service/SalesChannel/SalesChannelLocaleTest.php @@ -0,0 +1,158 @@ +fakeSalesChannelContext = $this->getMockBuilder(SalesChannelContext::class) + ->disableOriginalConstructor() + ->getMock(); + } + + + /** + * This test verifies that the available locales are correct. + * This is a list of possible values that Mollie allows. + * + * @return void + */ + public function testAvailableLocales(): void + { + # our data provider has no flat list of values, but we still want to reuse it. + # so lets just extract the first internal value of each item to get a flat list + # of expected locales. + $expected = array_map(function ($list) { + return $list[0]; + }, $this->getAvailableLocales()); + + $this->assertEquals($expected, SalesChannelLocale::AVAILABLE_LOCALES); + } + + + /** + * @return string[] + */ + public function getAvailableLocales(): array + { + return [ + ['en_US'], + ['en_GB'], + ['nl_NL'], + ['fr_FR'], + ['it_IT'], + ['de_DE'], + ['de_AT'], + ['de_CH'], + ['es_ES'], + ['ca_ES'], + ['nb_NO'], + ['pt_PT'], + ['sv_SE'], + ['fi_FI'], + ['da_DK'], + ['is_IS'], + ['hu_HU'], + ['pl_PL'], + ['lv_LV'], + ['lt_LT'] + ]; + } + + /** + * This test verifies that a locale is correctly returned from a sales channel if available. + * We fake the repository that returns us a given locale for our sales channel. + * That locale is in the list of available locales and should therefore be correctly returned in our function. + * + * @dataProvider getAvailableLocales + * + * @param string $locale + * @return void + */ + public function testAvailableLocalesAreFound(string $locale): void + { + $scLanguage = $this->buildSalesChannelLanguage($locale); + + $repoLanguages = new FakeLanguageRepository($scLanguage); + + $service = new SalesChannelLocale($repoLanguages); + + $detectedLocale = $service->getLocale($this->fakeSalesChannelContext); + + $this->assertEquals($locale, $detectedLocale); + } + + /** + * This test verifies that an invalid locale leads to our default locale which + * is en_GB as result. + */ + public function testInvalidLocaleLeadsToEnglishDefault(): void + { + $scLanguage = $this->buildSalesChannelLanguage('zz_ZZ'); + + $repoLanguages = new FakeLanguageRepository($scLanguage); + + $service = new SalesChannelLocale($repoLanguages); + + $detectedLocale = $service->getLocale($this->fakeSalesChannelContext); + + $this->assertEquals('en_GB', $detectedLocale); + } + + /** + * This test verifies that we get en_GB as default if our sales channel + * does not have a locale or language set. + * + * @return void + */ + public function testSalesChannelWithoutLocale(): void + { + $repoLanguages = new FakeLanguageRepository(null); + + $service = new SalesChannelLocale($repoLanguages); + + $detectedLocale = $service->getLocale($this->fakeSalesChannelContext); + + $this->assertEquals('en_GB', $detectedLocale); + } + + /** + * @param string $locale + * @return LanguageEntity + */ + private function buildSalesChannelLanguage(string $locale): LanguageEntity + { + # we always need to make sure to use this pattern nl-NL + # this is how it looks like in Shopware + $locale = str_replace('_', '-', $locale); + + $foundLocale = new LocaleEntity(); + $foundLocale->setCode($locale); + + $scLanguage = new LanguageEntity(); + $scLanguage->setLocale($foundLocale); + + return $scLanguage; + } + +} diff --git a/tests/PHPUnit/Service/TrackingInfoStructFactoryTest.php b/tests/PHPUnit/Service/TrackingInfoStructFactoryTest.php new file mode 100644 index 000000000..15598acdc --- /dev/null +++ b/tests/PHPUnit/Service/TrackingInfoStructFactoryTest.php @@ -0,0 +1,214 @@ +factory = new TrackingInfoStructFactory(); + } + + + /** + * @return void + * @throws \Kiener\MolliePayments\Components\ShipmentManager\Exceptions\NoDeliveriesFoundException + */ + public function testTrackingFromOrder(): void + { + $expectedCode = '1234'; + $expectedCarrier = 'Test carrier'; + $expectedUrl = 'https://test.foo?code=1234'; + + $shippingMethod = new ShippingMethodEntity(); + $shippingMethod->setName($expectedCarrier); + $shippingMethod->setUniqueIdentifier('testShippingMethod'); + $shippingMethod->setTrackingUrl('https://test.foo?code=%s'); + + $deliveryEntity = new OrderDeliveryEntity(); + $deliveryEntity->setUniqueIdentifier('testDelivery'); + $deliveryEntity->setShippingMethod($shippingMethod); + $deliveryEntity->setTrackingCodes([$expectedCode]); + + $order = new OrderEntity(); + $order->setDeliveries(new OrderDeliveryCollection([$deliveryEntity])); + + + $trackingInfoStruct = $this->factory->trackingFromOrder($order); + + $this->assertNotNull($trackingInfoStruct); + $this->assertSame($expectedCode, $trackingInfoStruct->getCode()); + $this->assertSame($expectedUrl, $trackingInfoStruct->getUrl()); + $this->assertSame($expectedCarrier, $trackingInfoStruct->getCarrier()); + } + + /** + * @return void + * @throws NoDeliveriesFoundExceptions + */ + public function testOnlyOneCodeAccepted(): void + { + $shippingMethod = new ShippingMethodEntity(); + $shippingMethod->setName('Test carrier'); + $shippingMethod->setUniqueIdentifier('testShippingMethod'); + $shippingMethod->setTrackingUrl('https://test.foo?code=%s'); + + $deliveryEntity = new OrderDeliveryEntity(); + $deliveryEntity->setUniqueIdentifier('testDelivery'); + $deliveryEntity->setShippingMethod($shippingMethod); + $deliveryEntity->setTrackingCodes([ + '1234', + 'test' + ]); + + $order = new OrderEntity(); + $order->setDeliveries(new OrderDeliveryCollection([$deliveryEntity])); + + $trackingInfoStruct = $this->factory->trackingFromOrder($order); + + $this->assertNull($trackingInfoStruct); + } + + /** + * @return void + */ + public function testInfoStructCreatedByArguments(): void + { + $trackingInfoStruct = $this->factory->create( + 'Test carrier', + '1234', + 'https://test.foo?code=%s' + ); + + $this->assertNotNull($trackingInfoStruct); + + $this->assertSame('1234', $trackingInfoStruct->getCode()); + $this->assertSame('https://test.foo?code=1234', $trackingInfoStruct->getUrl()); + $this->assertSame('Test carrier', $trackingInfoStruct->getCarrier()); + } + + public function testUrlWithCodeIsInvalid(): void + { + $expectedCode = '/123 4%foo=bar?test'; + $expectedCarrier = 'Test carrier'; + $trackingInfoStruct = $this->factory->create($expectedCarrier, $expectedCode, 'https://test.foo?code=%s'); + $expectedUrl = ''; + + $this->assertNotNull($trackingInfoStruct); + $this->assertSame($expectedCode, $trackingInfoStruct->getCode()); + $this->assertSame($expectedUrl, $trackingInfoStruct->getUrl()); + $this->assertSame($expectedCarrier, $trackingInfoStruct->getCarrier()); + } + + public function testInfoStructWithCommaSeparator(): void + { + $expectedCode = '1234'; + $givenCode = $expectedCode . ',' . str_repeat('-', 100); + $expectedCarrier = 'Test carrier'; + $trackingInfoStruct = $this->factory->create($expectedCarrier, $givenCode, 'https://test.foo?code=%s'); + $expectedUrl = 'https://test.foo?code=1234'; + + $this->assertNotNull($trackingInfoStruct); + $this->assertSame($expectedCode, $trackingInfoStruct->getCode()); + $this->assertSame($expectedUrl, $trackingInfoStruct->getUrl()); + $this->assertSame($expectedCarrier, $trackingInfoStruct->getCarrier()); + } + + public function testInfoStructWithSemicolonSeparator(): void + { + $expectedCode = '1234'; + $givenCode = $expectedCode . ';' . str_repeat('-', 100); + $expectedCarrier = 'Test carrier'; + $trackingInfoStruct = $this->factory->create($expectedCarrier, $givenCode, 'https://test.foo?code=%s'); + $expectedUrl = 'https://test.foo?code=1234'; + + $this->assertNotNull($trackingInfoStruct); + $this->assertSame($expectedCode, $trackingInfoStruct->getCode()); + $this->assertSame($expectedUrl, $trackingInfoStruct->getUrl()); + $this->assertSame($expectedCarrier, $trackingInfoStruct->getCarrier()); + } + + public function testCommaSeparatorHasHigherPriority(): void + { + $expectedCode = '1234'; + $givenCode = $expectedCode . ',5678;' . str_repeat('-', 100); + $expectedCarrier = 'Test carrier'; + $trackingInfoStruct = $this->factory->create($expectedCarrier, $givenCode, 'https://test.foo?code=%s'); + $expectedUrl = 'https://test.foo?code=1234'; + + $this->assertNotNull($trackingInfoStruct); + $this->assertSame($expectedCode, $trackingInfoStruct->getCode()); + $this->assertSame($expectedUrl, $trackingInfoStruct->getUrl()); + $this->assertSame($expectedCarrier, $trackingInfoStruct->getCarrier()); + } + + + /** + * @return array + */ + public function invalidCodes(): array + { + return [ + ['some{code'], + ['some}code'], + ['somecode'], + ['some#code'], + ['some#<>{},' . str_repeat('1', 200)], + [str_repeat('1', 200)], + ]; + } + + /** + * @dataProvider invalidCodes + * @param string $invalidCode + * @return void + */ + public function testUrlEmptyOnInvalidCodes(string $invalidCode): void + { + $trackingInfoStruct = $this->factory->create('test', $invalidCode, 'https://foo.bar/%s'); + + $this->assertSame('', $trackingInfoStruct->getUrl()); + } + + + /** + * @return array + */ + public function invalidShippingUrlPatterns(): array + { + return [ + ['%s%'], + ]; + } + + /** + * @dataProvider invalidShippingUrlPatterns + * @param string $invalidPattern + * @return void + */ + public function testUrlEmptyOnInvalidShippingURLs(string $invalidPattern): void + { + $trackingInfoStruct = $this->factory->create('test', 'valid-code', 'https://foo.bar/' . $invalidPattern); + + $this->assertSame('', $trackingInfoStruct->getUrl()); + } + +} diff --git a/tests/PHPUnit/Struct/Order/OrderAttributesTest.php b/tests/PHPUnit/Struct/Order/OrderAttributesTest.php index 33a46f401..58e8a6d1c 100644 --- a/tests/PHPUnit/Struct/Order/OrderAttributesTest.php +++ b/tests/PHPUnit/Struct/Order/OrderAttributesTest.php @@ -54,4 +54,47 @@ public function testIsSubscriptionWithShopwareId() $this->assertEquals(true, $attributes->isTypeSubscription()); } + + public function testReadBankDataFromCustomFields() + { + + $expectedBankName = 'Stichting Mollie Payments'; + $expectedBankBIC = 'TESTNL10'; + $expectedBankAccount = 'NL10TEST000100100'; + $order = new OrderEntity(); + $order->setCustomFields([ + 'mollie_payments' => [ + 'bankName' => $expectedBankName, + 'bankBic' => $expectedBankBIC, + 'bankAccount' => $expectedBankAccount, + ] + ]); + + $attributes = new OrderAttributes($order); + + $this->assertSame($expectedBankName, $attributes->getBankName()); + $this->assertSame($expectedBankBIC, $attributes->getBankBic()); + $this->assertSame($expectedBankAccount, $attributes->getBankAccount()); + } + + public function testBankTransferDetailsAreSetFromApiStruct() + { + $expectedBankName = 'Stichting Mollie Payments'; + $expectedBankBIC = 'TESTNL10'; + $expectedBankAccount = 'NL10TEST000100100'; + + $bankTransferDetails = new \stdClass(); + $bankTransferDetails->bankName = $expectedBankName; + $bankTransferDetails->bankAccount = $expectedBankAccount; + $bankTransferDetails->bankBic = $expectedBankBIC; + + $order = new OrderEntity(); + + $attributes = new OrderAttributes($order); + $attributes->setBankTransferDetails($bankTransferDetails); + + $this->assertSame($expectedBankName, $attributes->getBankName()); + $this->assertSame($expectedBankBIC, $attributes->getBankBic()); + $this->assertSame($expectedBankAccount, $attributes->getBankAccount()); + } } diff --git a/tests/PHPUnit/Traits/OrderTrait.php b/tests/PHPUnit/Traits/OrderTrait.php index bad776246..acbdcd34f 100644 --- a/tests/PHPUnit/Traits/OrderTrait.php +++ b/tests/PHPUnit/Traits/OrderTrait.php @@ -9,8 +9,11 @@ use Shopware\Core\Checkout\Cart\Tax\Struct\CalculatedTaxCollection; use Shopware\Core\Checkout\Cart\Tax\Struct\TaxRuleCollection; use Shopware\Core\Checkout\Customer\Aggregate\CustomerAddress\CustomerAddressEntity; +use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryCollection; use Shopware\Core\Checkout\Order\Aggregate\OrderDelivery\OrderDeliveryEntity; use Shopware\Core\Checkout\Order\Aggregate\OrderLineItem\OrderLineItemEntity; +use Shopware\Core\Checkout\Order\OrderEntity; +use Shopware\Core\Checkout\Shipping\ShippingMethodEntity; use Shopware\Core\Content\Media\MediaEntity; use Shopware\Core\Content\Product\Aggregate\ProductMedia\ProductMediaCollection; use Shopware\Core\Content\Product\Aggregate\ProductMedia\ProductMediaEntity; @@ -25,6 +28,57 @@ trait OrderTrait { + + /** + * @param string $mollieOrderID + * @return OrderEntity + */ + protected function buildMollieOrder(string $mollieOrderID): OrderEntity + { + $order = new OrderEntity(); + $order->setId(Uuid::randomHex()); + $order->setSalesChannelId(Uuid::randomHex()); + + $order->setCustomFields([ + 'mollie_payments' => [ + 'order_id' => $mollieOrderID, + 'payment_id' => 'tr_unit_test', + ]]); + + + $shippingMethod = new ShippingMethodEntity(); + $shippingMethod->setId(Uuid::randomHex()); + $shippingMethod->setName('Test Shipping Method'); + $shippingMethod->setTrackingUrl('https://www.mollie.com/search?q=%s'); + + $delivery = new OrderDeliveryEntity(); + $delivery->setId(Uuid::randomHex()); + $delivery->setTrackingCodes([]); + $delivery->setShippingMethod($shippingMethod); + + $order->setDeliveries(new OrderDeliveryCollection([$delivery])); + + return $order; + } + + /** + * @param string $productNumber + * @return OrderLineItemEntity + */ + protected function buildLineItemEntity(string $productNumber): OrderLineItemEntity + { + $lineItem = new OrderLineItemEntity(); + + $lineItem->setId(Uuid::randomHex()); + + $lineItem->setPayload([ + 'productNumber' => $productNumber, + ]); + + return $lineItem; + } + + public function getCustomerAddressEntity( string $firstName, string $lastName, @@ -78,7 +132,8 @@ public function getOrderLineItem( string $seoUrl = '', string $imageUrl = '', int $position = 1 - ): OrderLineItemEntity { + ): OrderLineItemEntity + { $productId = Uuid::randomHex(); $totalPrice = $quantity * $unitPrice; $calculatedTax = new CalculatedTax($taxAmount, $taxRate, $totalPrice); diff --git a/tests/Swagger/mollie-headless.yaml b/tests/Swagger/mollie-headless.yaml index 3b36ae125..7466c56ed 100644 --- a/tests/Swagger/mollie-headless.yaml +++ b/tests/Swagger/mollie-headless.yaml @@ -142,6 +142,18 @@ paths: "200": description: "successful operation" + /store-api/mollie/config: + get: + tags: + - "Mollie Config" + summary: "Gets the basic Mollie configuration like Profile IDs and more for component integration." + security: + - AccessKey: [ ] + - AccessToken: [ ] + responses: + "200": + description: "successful operation" + /store-api/mollie/creditcard/store-token/{customerId}/{cardToken}: post: tags: @@ -159,6 +171,10 @@ paths: in: "path" description: "Credit Card Token from the Mollie API Response" required: true + - name: "shouldSaveCardDetail" + in: "path" + description: "(optional) If provided with TRUE, the credit card data will lead to a new reusable mandate inside Mollie for this customer." + required: false responses: "200": description: "successful operation" diff --git a/tests/Swagger/mollie.yaml b/tests/Swagger/mollie.yaml index 0061d784f..e3c345417 100644 --- a/tests/Swagger/mollie.yaml +++ b/tests/Swagger/mollie.yaml @@ -51,7 +51,7 @@ paths: summary: "Search for an order number" description: "Please insert your order number in the POST body." security: - - AdminAPI: [] + - AdminAPI: [ ] requestBody: content: application/json: @@ -95,19 +95,119 @@ paths: "200": description: "successful operation" + /api/mollie/ship/order: + post: + tags: + - "Shipping (Operational)" + summary: "Full shipment (all or rest of items)" + security: + - AdminAPI: [ ] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + orderNumber: + type: string + description: The Shopware order number + trackingCode: + type: string + description: The tracking code of the order + trackingCarrier: + type: string + description: The tracking carrier of the order + trackingUrl: + type: string + description: The tracking URL of the order + required: + - orderNumber + responses: + "200": + description: "successful operation" - /api/mollie/ship/order?number={number}: - get: + /api/mollie/ship/order/batch: + post: tags: - "Shipping (Operational)" - summary: "Full shipment" + summary: "Full shipment with selected items" security: - - AdminAPI: [] - parameters: - - name: "number" - in: "path" - description: "Shopware order number" - required: true + - AdminAPI: [ ] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + orderNumber: + type: string + description: The Shopware order number + items: + type: array + items: + type: object + properties: + productNumber: + type: string + description: The Shopware product number + quantity: + type: integer + description: The quantity of the product + default: 1 + trackingCode: + type: string + description: The tracking code of the order + trackingCarrier: + type: string + description: The tracking carrier of the order + trackingUrl: + type: string + description: The tracking URL of the order + required: + - orderNumber + - items + responses: + "200": + description: "successful operation" + + /api/mollie/ship/item: + post: + tags: + - "Shipping (Operational)" + summary: "Ship a provided line item." + security: + - AdminAPI: [ ] + requestBody: + required: true + content: + application/json: + schema: + type: object + properties: + orderNumber: + type: string + description: The Shopware order number + productNumber: + type: string + description: The Shopware product number + quantity: + type: integer + description: The quantity of the product + default: 1 + trackingCode: + type: string + description: The tracking code of the order + trackingCarrier: + type: string + description: The tracking carrier of the order + trackingUrl: + type: string + description: The tracking URL of the order + required: + - orderNumber + - productNumber responses: "200": description: "successful operation" @@ -116,9 +216,9 @@ paths: get: tags: - "Shipping (Operational)" - summary: "Partial shipment" + summary: "Ship a provided line item, deprecated - please use the POST request version!" security: - - AdminAPI: [] + - AdminAPI: [ ] parameters: - name: "order" in: "path" @@ -127,6 +227,7 @@ paths: - name: "item" in: "path" description: "product number" + required: true - name: "quantity" in: "path" description: "quantity" @@ -134,13 +235,29 @@ paths: "200": description: "successful operation" + /api/mollie/ship/order?number={number}: + get: + tags: + - "Shipping (Operational)" + summary: "Full shipment (all or rest of items), deprecated - please use the POST request version!" + security: + - AdminAPI: [ ] + parameters: + - name: "number" + in: "path" + description: "Shopware order number" + required: true + responses: + "200": + description: "successful operation" + /api/mollie/refund/order?number={number}&description={description}: get: tags: - "Refunds (Operational)" summary: "Full Refund" security: - - AdminAPI: [] + - AdminAPI: [ ] parameters: - name: "number" in: "path" @@ -159,7 +276,7 @@ paths: - "Refunds (Operational)" summary: "Partial Refund" security: - - AdminAPI: [] + - AdminAPI: [ ] parameters: - name: "number" in: "path" @@ -181,7 +298,7 @@ paths: - "Refunds (Technical)" summary: "Get data from Refund Manager" security: - - AdminAPI: [] + - AdminAPI: [ ] requestBody: content: application/json: @@ -201,7 +318,7 @@ paths: - "Refunds (Technical)" summary: "Refund with Refund Manager" security: - - AdminAPI: [] + - AdminAPI: [ ] requestBody: content: application/json: @@ -248,27 +365,27 @@ paths: description: "successful operation" /mollie/webhook/subscription/{subscriptionId}: - post: - tags: - - "Webhooks" - summary: "Start a subscription renewal or update an existing subscription order and payment status." - parameters: - - in: "path" - name: "subscriptionId" - description: "ID of the Shopware Subscription" - required: true - requestBody: - content: - application/x-www-form-urlencoded: - schema: - type: object - properties: - id: - type: string - description: "The matching transaction ID of Mollie that was captured. tr_xyz, ..." - responses: - "200": - description: "successful operation" + post: + tags: + - "Webhooks" + summary: "Start a subscription renewal or update an existing subscription order and payment status." + parameters: + - in: "path" + name: "subscriptionId" + description: "ID of the Shopware Subscription" + required: true + requestBody: + content: + application/x-www-form-urlencoded: + schema: + type: object + properties: + id: + type: string + description: "The matching transaction ID of Mollie that was captured. tr_xyz, ..." + responses: + "200": + description: "successful operation" /mollie/webhook/subscription/{subscriptionId}/renew: post: