*/
+ public function getShippingMethods(): Collection;
+
+ public function hasShippingMethod(VendorShippingMethodInterface $shippingMethod): bool;
+
+ public function addShippingMethod(VendorShippingMethodInterface $shippingMethod): void;
+
+ public function removeShippingMethod(VendorShippingMethodInterface $shippingMethod): void;
+
+ public function getCommission(): ?int;
+
+ public function setCommission(?int $commission): void;
+
+ public function getCommissionType(): string;
+
+ public function setCommissionType(string $commissionType): void;
+
+ public function getSettlementFrequency(): string;
+
+ public function setSettlementFrequency(string $settlementFrequency): void;
+
+ public function getValidSettlementFrequency(): array;
+
+ public function getSettlements(): Collection;
+
+ public function setSettlements(Collection $settlements): void;
+
+ public function getCreatedAt(): DateTimeInterface;
+
+ public function setCreatedAt(DateTimeInterface $createdAt): void;
+
+ public function hasCyclicalSettlementFrequency(): bool;
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Entity/VendorShippingMethod.php b/OpenMarketplace/src/Component/Vendor/Entity/VendorShippingMethod.php
new file mode 100644
index 0000000..0872772
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Entity/VendorShippingMethod.php
@@ -0,0 +1,60 @@
+id;
+ }
+
+ public function getVendor(): ?VendorInterface
+ {
+ return $this->vendor;
+ }
+
+ public function setVendor(?VendorInterface $vendor): void
+ {
+ $this->vendor = $vendor;
+ }
+
+ public function getShippingMethod(): ?ShippingMethodInterface
+ {
+ return $this->shippingMethod;
+ }
+
+ public function setShippingMethod(?ShippingMethodInterface $shippingMethod): void
+ {
+ $this->shippingMethod = $shippingMethod;
+ }
+
+ public function getChannelCode(): ?string
+ {
+ return $this->channelCode;
+ }
+
+ public function setChannelCode(?string $channelCode): void
+ {
+ $this->channelCode = $channelCode;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Entity/VendorShippingMethodInterface.php b/OpenMarketplace/src/Component/Vendor/Entity/VendorShippingMethodInterface.php
new file mode 100644
index 0000000..d9f5972
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Entity/VendorShippingMethodInterface.php
@@ -0,0 +1,30 @@
+defaultCommission = (int) $defaultCommission;
+ $this->defaultCommissionType = $defaultCommissionType;
+ }
+
+ /** @return VendorInterface */
+ public function createNew()
+ {
+ $vendor = new Vendor();
+ $vendor->setCommission($this->defaultCommission);
+ $vendor->setCommissionType($this->defaultCommissionType);
+
+ return $vendor;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Factory/VendorShippingMethodFactory.php b/OpenMarketplace/src/Component/Vendor/Factory/VendorShippingMethodFactory.php
new file mode 100755
index 0000000..ea2790e
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Factory/VendorShippingMethodFactory.php
@@ -0,0 +1,39 @@
+createNew();
+
+ $vendorShippingMethod->setChannelCode($channelCode);
+ $vendorShippingMethod->setShippingMethod($shippingMethod);
+ $vendorShippingMethod->setVendor($vendor);
+
+ return $vendorShippingMethod;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Factory/VendorShippingMethodFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Factory/VendorShippingMethodFactoryInterface.php
new file mode 100644
index 0000000..46134de
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Factory/VendorShippingMethodFactoryInterface.php
@@ -0,0 +1,27 @@
+vendorRepository = $vendorRepository;
+ }
+
+ public function generateSlug(string $companyName): string
+ {
+ if (null == $baseSlug = preg_replace('/\s+/', '-', $companyName)) {
+ throw new \Exception('Cannot generate slug from given company name.');
+ }
+
+ $slug = $baseSlug;
+ $number = 1;
+ while ($this->slugExists($slug)) {
+ $slug = $baseSlug . '-' . $number;
+ ++$number;
+ }
+
+ return $slug;
+ }
+
+ private function slugExists(string $slug): bool
+ {
+ $slug = $this->vendorRepository->findOneBy(['slug' => $slug]);
+
+ return !(null === $slug);
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Generator/SlugGeneratorInterface.php b/OpenMarketplace/src/Component/Vendor/Generator/SlugGeneratorInterface.php
new file mode 100644
index 0000000..80f0514
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Generator/SlugGeneratorInterface.php
@@ -0,0 +1,17 @@
+getBackgroundImage();
+
+ if (!$backgroundImageUpdate) {
+ return;
+ }
+
+ /** @var BackgroundImageInterface $backgroundImageEntity */
+ $backgroundImageEntity = $vendor->getBackgroundImage();
+ if (!$vendor->getBackgroundImage()) {
+ $backgroundImageEntity = $this->vendorBackgroundImageFactory->createNew();
+ }
+
+ $backgroundImageEntity->setPath($backgroundImageUpdate->getPath());
+ $backgroundImageEntity->setOwner($vendor);
+ $vendor->setBackgroundImage($backgroundImageEntity);
+
+ $backgroundImageUpdate->setPath(null);
+
+ $this->entityManager->persist($backgroundImageUpdate);
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/BackgroundImageOperatorInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/BackgroundImageOperatorInterface.php
new file mode 100644
index 0000000..6d371e0
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/BackgroundImageOperatorInterface.php
@@ -0,0 +1,20 @@
+setCountry($country);
+ $address->setPostalCode($postalCode);
+ $address->setStreet($street);
+ $address->setCity($city);
+
+ return $address;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/AddressFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/AddressFactoryInterface.php
new file mode 100644
index 0000000..90a3e3f
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/AddressFactoryInterface.php
@@ -0,0 +1,25 @@
+setPath($path);
+ $vendorBackgroundImage->setOwner($vendor);
+
+ return $vendorBackgroundImage;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/BackgroundImageFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/BackgroundImageFactoryInterface.php
new file mode 100644
index 0000000..9bc8b90
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/BackgroundImageFactoryInterface.php
@@ -0,0 +1,25 @@
+setPath($path);
+ $vendorImage->setOwner($vendor);
+
+ return $vendorImage;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/LogoImageFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/LogoImageFactoryInterface.php
new file mode 100644
index 0000000..03b473b
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/LogoImageFactoryInterface.php
@@ -0,0 +1,25 @@
+vendorFactory = $vendorFactory;
+ }
+
+ public function createVendor(
+ string $companyName,
+ string $taxIdentifier,
+ string $bankAccountNumber,
+ string $phoneNumber,
+ string $description,
+ AddressInterface $address
+ ): ProfileInterface {
+ $vendor = $this->createNew();
+ $vendor->setPhoneNumber($phoneNumber);
+ $vendor->setCompanyName($companyName);
+ $vendor->setTaxIdentifier($taxIdentifier);
+ $vendor->setBankAccountNumber($bankAccountNumber);
+ $vendor->setDescription($description);
+ $vendor->setVendorAddress($address);
+
+ return $vendor;
+ }
+
+ public function createNew(): ProfileInterface
+ {
+ /** @var ProfileInterface $vendor */
+ $vendor = $this->vendorFactory->createNew();
+
+ return $vendor;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileFactoryInterface.php
new file mode 100644
index 0000000..94ca4d1
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileFactoryInterface.php
@@ -0,0 +1,29 @@
+createNew();
+ $backgroundImage->setFile($uploadedBackgroundImage->getFile());
+ $backgroundImage->setOwner($vendorProfile);
+
+ return $backgroundImage;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateBackgroundImageFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateBackgroundImageFactoryInterface.php
new file mode 100644
index 0000000..032e66b
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateBackgroundImageFactoryInterface.php
@@ -0,0 +1,22 @@
+tokenGenerator = $tokenGenerator;
+ }
+
+ public function createWithGeneratedTokenAndVendor(
+ VendorInterface $vendor
+ ): ProfileUpdateInterface {
+ $vendorUpdate = new ProfileUpdate();
+ $vendorUpdate->setVendorAddress(new Address());
+ $vendorUpdate->setToken($this->tokenGenerator->generate());
+ $vendorUpdate->setVendor($vendor);
+
+ return $vendorUpdate;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateFactoryInterface.php
new file mode 100644
index 0000000..22cd18e
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateFactoryInterface.php
@@ -0,0 +1,20 @@
+createNew();
+ $image->setFile($uploadedImage->getFile());
+ $image->setOwner($vendorProfile);
+
+ return $image;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateLogoImageFactoryInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateLogoImageFactoryInterface.php
new file mode 100644
index 0000000..038d9da
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/Factory/ProfileUpdateLogoImageFactoryInterface.php
@@ -0,0 +1,22 @@
+getImage();
+
+ if ($imageUpdate) {
+ /** @var LogoImageInterface $imageEntity */
+ $imageEntity = $vendor->getImage();
+ if (!$vendor->getImage()) {
+ $imageEntity = $this->vendorImageFactory->createNew();
+ }
+
+ $imageEntity->setPath($imageUpdate->getPath());
+ $imageEntity->setOwner($vendor);
+ $vendor->setImage($imageEntity);
+
+ $imageUpdate->setPath(null);
+
+ $this->entityManager->persist($imageUpdate);
+ }
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/LogoImageOperatorInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/LogoImageOperatorInterface.php
new file mode 100644
index 0000000..63c9ace
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/LogoImageOperatorInterface.php
@@ -0,0 +1,20 @@
+getVendorAddress();
+
+ if (null !== $pendingAddressChange) {
+ $this->entityManager->remove($pendingAddressChange);
+ }
+
+ $this->entityManager->remove($profileUpdate);
+ $this->entityManager->flush();
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Profile/ProfileUpdateRemoverInterface.php b/OpenMarketplace/src/Component/Vendor/Profile/ProfileUpdateRemoverInterface.php
new file mode 100644
index 0000000..ccfad7d
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Profile/ProfileUpdateRemoverInterface.php
@@ -0,0 +1,19 @@
+profileUpdateFactory->createWithGeneratedTokenAndVendor($currentVendor);
+
+ if ($image && $image->getFile()) {
+ $imageEntity = $this->imageFactory->createWithFileAndOwner($image, $pendingVendorUpdate);
+
+ $this->imageUploader->upload($imageEntity);
+ $pendingVendorUpdate->setImage($imageEntity);
+ $this->entityManager->persist($imageEntity);
+ }
+
+ if ($image && !$image->getPath()) {
+ $currentVendor->setImage(null);
+ }
+
+ if ($backgroundImage && $backgroundImage->getFile()) {
+ $backgroundImageEntity = $this->backgroundImageFactory->createWithFileAndOwner($backgroundImage, $pendingVendorUpdate);
+
+ $this->imageUploader->upload($backgroundImageEntity);
+ $pendingVendorUpdate->setBackgroundImage($backgroundImageEntity);
+ $this->entityManager->persist($backgroundImageEntity);
+ }
+
+ if ($backgroundImage && !$backgroundImage->getPath()) {
+ $currentVendor->setBackgroundImage(null);
+ }
+
+ $this->entityManager->persist($pendingVendorUpdate);
+
+ $token = $pendingVendorUpdate->getToken();
+
+ $this->setVendorFromData($pendingVendorUpdate, $vendorData);
+
+ $this->entityManager->flush();
+ $shopUser = $currentVendor->getShopUser();
+ $email = $shopUser->getEmail();
+
+ $this->sender->send('vendor_profile_update', [$email], ['token' => $token]);
+ }
+
+ public function setVendorFromData(
+ ProfileInterface $vendor,
+ ProfileInterface $data
+ ): void {
+ $vendor->setCompanyName($data->getCompanyName());
+ $vendor->setTaxIdentifier($data->getTaxIdentifier());
+ $vendor->setBankAccountNumber($data->getBankAccountNumber());
+ $vendor->setPhoneNumber($data->getPhoneNumber());
+ $vendor->setDescription($data->getDescription());
+
+ $newVendorAddress = $data->getVendorAddress();
+
+ if (null === $newVendorAddress) {
+ return;
+ }
+
+ if (null !== $vendor->getVendorAddress()) {
+ $vendor->getVendorAddress()->setCity($newVendorAddress->getCity());
+ $vendor->getVendorAddress()->setCountry($newVendorAddress->getCountry());
+ $vendor->getVendorAddress()->setPostalCode($newVendorAddress->getPostalCode());
+ $vendor->getVendorAddress()->setStreet($newVendorAddress->getStreet());
+ }
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ public function updateVendorFromPendingData(ProfileUpdateInterface $vendorData): void
+ {
+ $vendor = $vendorData->getVendor();
+
+ $this->setVendorFromData($vendor, $vendorData);
+
+ if (null !== $vendorData->getBackgroundImage()) {
+ $this->vendorBackgroundImageOperator->replaceVendorImage($vendorData, $vendor);
+ }
+ if (null !== $vendorData->getImage()) {
+ $this->vendorLogoOperator->replaceVendorImage($vendorData, $vendor);
+ }
+
+ $this->remover->removePendingUpdate($vendorData);
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/ProfileUpdaterInterface.php b/OpenMarketplace/src/Component/Vendor/ProfileUpdaterInterface.php
new file mode 100644
index 0000000..c8bea15
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/ProfileUpdaterInterface.php
@@ -0,0 +1,32 @@
+getId();
+
+ return $this->createQueryBuilder('c')
+ ->innerJoin('c.orders', 'o', )
+ ->andWhere('o.vendor = :vendor')
+ ->setParameter('vendor', $vendorId)
+ ;
+ }
+
+ public function findCustomerForVendor(VendorInterface $vendor, string $id): ?CustomerInterface
+ {
+ $vendorId = $vendor->getId();
+
+ return $this->createQueryBuilder('c')
+ ->innerJoin('c.orders', 'o')
+ ->andWhere('o.vendor = :vendor')
+ ->andWhere('c.id = :id')
+ ->setParameter('vendor', $vendorId)
+ ->setParameter('id', $id)
+ ->setMaxResults(1)
+ ->getQuery()
+ ->getOneOrNullResult();
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Repository/CustomerRepositoryInterface.php b/OpenMarketplace/src/Component/Vendor/Repository/CustomerRepositoryInterface.php
new file mode 100644
index 0000000..ff0645c
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Repository/CustomerRepositoryInterface.php
@@ -0,0 +1,23 @@
+createListQueryBuilder()
+ ->andWhere('o.parent IS NULL')
+ ->getQuery()
+ ->getOneOrNullResult()
+ ;
+
+ return $qb;
+ }
+
+ return $this->findOneBySlug($slug, $locale);
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Repository/TaxonRepositoryInterface.php b/OpenMarketplace/src/Component/Vendor/Repository/TaxonRepositoryInterface.php
new file mode 100644
index 0000000..f0f0249
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Repository/TaxonRepositoryInterface.php
@@ -0,0 +1,19 @@
+createQueryBuilder('v')
+ ->andWhere('v.slug = :slug')
+ ->setParameter('slug', $slug)
+ ->getQuery()
+ ->getOneOrNullResult()
+ ;
+ }
+
+ public function findAllBySettlementFrequency(string $frequency): iterable
+ {
+ return $this->createQueryBuilder('v')
+ ->andWhere('v.settlementFrequency = :frequency')
+ ->setParameter('frequency', $frequency)
+ ->getQuery()
+ ->getResult()
+ ;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Repository/VendorRepositoryInterface.php b/OpenMarketplace/src/Component/Vendor/Repository/VendorRepositoryInterface.php
new file mode 100644
index 0000000..f186ddf
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Repository/VendorRepositoryInterface.php
@@ -0,0 +1,23 @@
+createQueryBuilder('o')
+ ->andWhere('o.vendor = :vendor')
+ ->andWhere('o.channelCode = :channelCode')
+ ->setParameter('vendor', $vendor)
+ ->setParameter('channelCode', $channel->getCode())
+ ->getQuery()
+ ->getResult()
+ ;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/Repository/VendorShippingMethodRepositoryInterface.php b/OpenMarketplace/src/Component/Vendor/Repository/VendorShippingMethodRepositoryInterface.php
new file mode 100644
index 0000000..998d133
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Repository/VendorShippingMethodRepositoryInterface.php
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/BackgroundImage.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/BackgroundImage.orm.xml
new file mode 100644
index 0000000..cbcc1a6
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/BackgroundImage.orm.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/LogoImage.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/LogoImage.orm.xml
new file mode 100644
index 0000000..308b102
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/LogoImage.orm.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.Address.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.Address.orm.xml
new file mode 100644
index 0000000..51a9dae
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.Address.orm.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.BackgroundImage.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.BackgroundImage.orm.xml
new file mode 100644
index 0000000..9eb6ca6
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.BackgroundImage.orm.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.LogoImage.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.LogoImage.orm.xml
new file mode 100644
index 0000000..584ba72
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.LogoImage.orm.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.ProfileUpdate.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.ProfileUpdate.orm.xml
new file mode 100644
index 0000000..bc30740
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ProfileUpdate.ProfileUpdate.orm.xml
@@ -0,0 +1,50 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ShopUser.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ShopUser.orm.xml
new file mode 100644
index 0000000..7d5f9b7
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/ShopUser.orm.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/Vendor.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/Vendor.orm.xml
new file mode 100644
index 0000000..dd0b8f9
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/Vendor.orm.xml
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ weekly
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/doctrine/VendorShippingMethod.orm.xml b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/VendorShippingMethod.orm.xml
new file mode 100644
index 0000000..f5dfb4f
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/doctrine/VendorShippingMethod.orm.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/services.xml b/OpenMarketplace/src/Component/Vendor/Resources/services.xml
new file mode 100644
index 0000000..788d597
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/services.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/services/factories.xml b/OpenMarketplace/src/Component/Vendor/Resources/services/factories.xml
new file mode 100644
index 0000000..15b2cc5
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/services/factories.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+ %env(DEFAULT_VENDOR_COMMISSION)%
+ %env(string:DEFAULT_VENDOR_COMMISSION_TYPE)%
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/services/generators.xml b/OpenMarketplace/src/Component/Vendor/Resources/services/generators.xml
new file mode 100644
index 0000000..f45d506
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/services/generators.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/services/profile.xml b/OpenMarketplace/src/Component/Vendor/Resources/services/profile.xml
new file mode 100644
index 0000000..41f1de1
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/services/profile.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/services/repositories.xml b/OpenMarketplace/src/Component/Vendor/Resources/services/repositories.xml
new file mode 100644
index 0000000..d839cf1
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/services/repositories.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+ BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor
+
+
+
+
+
+
+
+
+
+
+ %sylius.model.taxon.class%
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/validation/Address.xml b/OpenMarketplace/src/Component/Vendor/Resources/validation/Address.xml
new file mode 100644
index 0000000..1dae756
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/validation/Address.xml
@@ -0,0 +1,79 @@
+
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 255
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 255
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 255
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/validation/BackgroundImage.xml b/OpenMarketplace/src/Component/Vendor/Resources/validation/BackgroundImage.xml
new file mode 100644
index 0000000..a502af5
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/validation/BackgroundImage.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ validator.message.not_blank
+
+ ApiUploadVendorBackgroundImage
+
+
+
+ 1000
+ validator.message.minimum_image_width
+ 1400
+ validator.message.maximum_image_width
+ 200
+ validator.message.minimum_image_height
+ 300
+ validator.message.maximum_image_height
+
+ VendorLogo
+ ApiUploadVendorImage
+
+
+
+ 2048000
+ validator.message.maximum_file_size
+
+ image/jpeg
+ image/png
+ image/svg+xml
+
+ validator.message.image_mime_type
+
+ VendorBackground
+ ApiUploadVendorBackgroundImage
+
+
+
+
+
+ validator.message.not_blank
+
+ ApiUploadVendorBackgroundImage
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/validation/Conversation.xml b/OpenMarketplace/src/Component/Vendor/Resources/validation/Conversation.xml
new file mode 100644
index 0000000..ac2e18a
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/validation/Conversation.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/validation/LogoImage.xml b/OpenMarketplace/src/Component/Vendor/Resources/validation/LogoImage.xml
new file mode 100644
index 0000000..86a240b
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/validation/LogoImage.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+ validator.message.not_blank
+
+ ApiUploadVendorImage
+
+
+
+ 100
+ validator.message.minimum_image_width
+ 300
+ validator.message.maximum_image_width
+ 100
+ validator.message.minimum_image_height
+ 300
+ validator.message.maximum_image_height
+
+ VendorLogo
+ ApiUploadVendorImage
+
+
+
+ 2048000
+ validator.message.maximum_file_size
+
+ image/jpeg
+ image/png
+ image/svg+xml
+
+ validator.message.image_mime_type
+
+ VendorLogo
+ ApiUploadVendorImage
+
+
+
+
+
+ validator.message.not_blank
+
+ ApiUploadVendorImage
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/validation/ProductVariant.xml b/OpenMarketplace/src/Component/Vendor/Resources/validation/ProductVariant.xml
new file mode 100644
index 0000000..a405026
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/validation/ProductVariant.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+ 1000000000
+
+ sylius
+
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/Resources/validation/Vendor.xml b/OpenMarketplace/src/Component/Vendor/Resources/validation/Vendor.xml
new file mode 100644
index 0000000..f2bde3b
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/Resources/validation/Vendor.xml
@@ -0,0 +1,125 @@
+
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 255
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ validator.message.not_valid_iban
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 255
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 255
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+ 3
+ 2048
+ validator.message.minimum
+ validator.message.maximum
+
+ Default
+ VendorUser
+ VendorUserRegister
+
+
+
+
+
+ validator.message.not_blank
+
+
+ validator.message.positive_or_zero_commission
+
+
+
+
+ getValidSettlementFrequency
+ validator.message.not_valid_choice
+
+
+
+
diff --git a/OpenMarketplace/src/Component/Vendor/TaxonContext.php b/OpenMarketplace/src/Component/Vendor/TaxonContext.php
new file mode 100644
index 0000000..f16f00e
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/TaxonContext.php
@@ -0,0 +1,30 @@
+taxonRepository = $taxonRepository;
+ }
+
+ public function getForVendorPage(?string $slug, string $locale): ?TaxonInterface
+ {
+ return $this->taxonRepository->findForVendorPage($slug, $locale);
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/TaxonContextInterface.php b/OpenMarketplace/src/Component/Vendor/TaxonContextInterface.php
new file mode 100644
index 0000000..2526a0a
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/TaxonContextInterface.php
@@ -0,0 +1,19 @@
+security = $security;
+ }
+
+ public function getVendor(): VendorInterface
+ {
+ /** @var ShopUserInterface|UserInterface|null $user */
+ $user = $this->security->getUser();
+ if (false === $user instanceof ShopUserInterface) {
+ throw new ShopUserNotFoundException();
+ }
+
+ /** @var VendorInterface|null $vendor */
+ $vendor = $user->getVendor();
+
+ if (null === $vendor) {
+ throw new ShopUserHasNoVendorContextException();
+ }
+
+ return $vendor;
+ }
+}
diff --git a/OpenMarketplace/src/Component/Vendor/VendorContextInterface.php b/OpenMarketplace/src/Component/Vendor/VendorContextInterface.php
new file mode 100644
index 0000000..6023c34
--- /dev/null
+++ b/OpenMarketplace/src/Component/Vendor/VendorContextInterface.php
@@ -0,0 +1,19 @@
+getProjectDir() . '/var/cache/' . $this->environment;
+ }
+
+ public function getLogDir(): string
+ {
+ return $this->getProjectDir() . '/var/log';
+ }
+
+ public function registerBundles(): iterable
+ {
+ foreach ($this->getConfigurationDirectories() as $confDir) {
+ $bundlesFile = $confDir . '/bundles.php';
+ if (false === is_file($bundlesFile)) {
+ continue;
+ }
+ yield from $this->registerBundlesFromFile($bundlesFile);
+ }
+ }
+
+ private function isTestEnvironment(): bool
+ {
+ return 0 === strpos($this->getEnvironment(), 'test');
+ }
+
+ protected function configureContainer(ContainerBuilder $container, LoaderInterface $loader): void
+ {
+ foreach ($this->getConfigurationDirectories() as $confDir) {
+ $bundlesFile = $confDir . '/bundles.php';
+ if (false === is_file($bundlesFile)) {
+ continue;
+ }
+ $container->addResource(new FileResource($bundlesFile));
+ }
+
+ $container->setParameter('container.dumper.inline_class_loader', true);
+
+ foreach ($this->getConfigurationDirectories() as $confDir) {
+ $this->loadContainerConfiguration($loader, $confDir);
+ }
+ }
+
+ protected function configureRoutes(RouteCollectionBuilder $routes): void
+ {
+ foreach ($this->getConfigurationDirectories() as $confDir) {
+ $this->loadRoutesConfiguration($routes, $confDir);
+ }
+ }
+
+ protected function getContainerBaseClass(): string
+ {
+ if ($this->isTestEnvironment() && class_exists(MockerContainer::class)) {
+ return MockerContainer::class;
+ }
+
+ return parent::getContainerBaseClass();
+ }
+
+ /**
+ * @return BundleInterface[]
+ */
+ private function registerBundlesFromFile(string $bundlesFile): iterable
+ {
+ $contents = require $bundlesFile;
+ foreach ($contents as $class => $envs) {
+ if (isset($envs['all']) || isset($envs[$this->environment])) {
+ /** @phpstan-ignore-next-line */
+ yield new $class();
+ }
+ }
+ }
+
+ /**
+ * @return string[]
+ */
+ private function getConfigurationDirectories(): iterable
+ {
+ yield $this->getProjectDir() . '/config';
+ $syliusConfigDir = $this->getProjectDir() . '/config/sylius/' . SyliusKernel::MAJOR_VERSION . '.' . SyliusKernel::MINOR_VERSION;
+ if (is_dir($syliusConfigDir)) {
+ yield $syliusConfigDir;
+ }
+ $symfonyConfigDir = $this->getProjectDir() . '/config/symfony/' . BaseKernel::MAJOR_VERSION . '.' . BaseKernel::MINOR_VERSION;
+ if (is_dir($symfonyConfigDir)) {
+ yield $symfonyConfigDir;
+ }
+ }
+
+ private function loadContainerConfiguration(LoaderInterface $loader, string $confDir): void
+ {
+ $loader->load($confDir . '/{config}' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{packages}/*' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{packages}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{services}' . self::CONFIG_EXTS, 'glob');
+ $loader->load($confDir . '/{services}_' . $this->environment . self::CONFIG_EXTS, 'glob');
+ }
+
+ private function loadRoutesConfiguration(RouteCollectionBuilder $routes, string $confDir): void
+ {
+ $routes->import($confDir . '/{routes}/*' . self::CONFIG_EXTS, '/', 'glob');
+ $routes->import($confDir . '/{routes}/' . $this->environment . '/**/*' . self::CONFIG_EXTS, '/', 'glob');
+ $routes->import($confDir . '/{routes}' . self::CONFIG_EXTS, '/', 'glob');
+ $routes->import($confDir . '/{routing}' . self::CONFIG_EXTS, '/', 'glob');
+ }
+}
diff --git a/OpenMarketplace/symfony.lock b/OpenMarketplace/symfony.lock
new file mode 100644
index 0000000..24f7e06
--- /dev/null
+++ b/OpenMarketplace/symfony.lock
@@ -0,0 +1,491 @@
+{
+ "api-platform/core": {
+ "version": "2.7",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.5",
+ "ref": "05b57782a78c21a664a42055dc11cf1954ca36bb"
+ },
+ "files": [
+ "config/packages/api_platform.yaml",
+ "config/routes/api_platform.yaml",
+ "src/Entity/.gitignore"
+ ]
+ },
+ "babdev/pagerfanta-bundle": {
+ "version": "v3.7.0"
+ },
+ "bitbag/cms-plugin": {
+ "version": "3.3",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "3.0",
+ "ref": "e3c6714d3910e4a76171a069242fe2a2ceb220af"
+ }
+ },
+ "bitbag/wishlist-plugin": {
+ "version": "v3.0.3"
+ },
+ "doctrine/annotations": {
+ "version": "1.14",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "1.0",
+ "ref": "a2759dd6123694c8d901d0ec80006e044c2e6457"
+ },
+ "files": [
+ "config/routes/annotations.yaml"
+ ]
+ },
+ "doctrine/doctrine-bundle": {
+ "version": "2.7",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.4",
+ "ref": "013b823e7fee65890b23e40f31e6667a1ac519ac"
+ },
+ "files": [
+ "config/packages/doctrine.yaml",
+ "src/Entity/.gitignore",
+ "src/Repository/.gitignore"
+ ]
+ },
+ "doctrine/doctrine-migrations-bundle": {
+ "version": "3.1",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "3.1",
+ "ref": "1d01ec03c6ecbd67c3375c5478c9a423ae5d6a33"
+ },
+ "files": [
+ "config/packages/doctrine_migrations.yaml",
+ "migrations/.gitignore"
+ ]
+ },
+ "friends-of-behat/symfony-extension": {
+ "version": "2.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "2.0",
+ "ref": "1e012e04f573524ca83795cd19df9ea690adb604"
+ }
+ },
+ "friendsofphp/php-cs-fixer": {
+ "version": "3.14",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "3.0",
+ "ref": "be2103eb4a20942e28a6dd87736669b757132435"
+ },
+ "files": [
+ ".php-cs-fixer.dist.php"
+ ]
+ },
+ "friendsofsymfony/ckeditor-bundle": {
+ "version": "2.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "2.0",
+ "ref": "f5ad42002183a6881962683e6d84bbb25cdfce5d"
+ }
+ },
+ "friendsofsymfony/oauth-server-bundle": {
+ "version": "2.0",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.6",
+ "ref": "7300db1277b1ba025cdc2791171d9bf3e7adcc42"
+ }
+ },
+ "friendsofsymfony/rest-bundle": {
+ "version": "3.5",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "2.2",
+ "ref": "fa845143b7e0a4c70aedd1a88c549e6d977e9ae5"
+ }
+ },
+ "jms/serializer-bundle": {
+ "version": "4.2",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "4.0",
+ "ref": "cc04e10cf7171525b50c18b36004edf64cb478be"
+ }
+ },
+ "knplabs/knp-gaufrette-bundle": {
+ "version": "v0.8.0"
+ },
+ "knplabs/knp-menu-bundle": {
+ "version": "v3.2.0"
+ },
+ "lexik/jwt-authentication-bundle": {
+ "version": "2.18",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.5",
+ "ref": "5b2157bcd5778166a5696e42f552ad36529a07a6"
+ },
+ "files": [
+ "config/packages/lexik_jwt_authentication.yaml"
+ ]
+ },
+ "liip/imagine-bundle": {
+ "version": "2.10",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.8",
+ "ref": "d1227d002b70d1a1f941d91845fcd7ac7fbfc929"
+ }
+ },
+ "nelmio/alice": {
+ "version": "3.10",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "3.3",
+ "ref": "42b52d2065dc3fde27912d502c18ca1926e35ae2"
+ },
+ "files": [
+ "config/packages/nelmio_alice.yaml"
+ ]
+ },
+ "payum/payum-bundle": {
+ "version": "2.5",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "2.4",
+ "ref": "518ac22defa04a8a1d82479ed362e2921487adf0"
+ }
+ },
+ "phpunit/phpunit": {
+ "version": "9.6",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "9.3",
+ "ref": "a6249a6c4392e9169b87abf93225f7f9f59025e6"
+ },
+ "files": [
+ ".env.test",
+ "phpunit.xml.dist",
+ "tests/bootstrap.php"
+ ]
+ },
+ "ramsey/uuid-doctrine": {
+ "version": "1.8",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.3",
+ "ref": "471aed0fbf5620b8d7f92b7a5ebbbf6c0945c27a"
+ }
+ },
+ "sensiolabs/security-checker": {
+ "version": "6.0",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "4.0",
+ "ref": "160c9b600564faa1224e8f387d49ef13ceb8b793"
+ },
+ "files": [
+ "config/packages/security_checker.yaml"
+ ]
+ },
+ "sonata-project/block-bundle": {
+ "version": "4.19",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "4.11",
+ "ref": "b4edd2a1e6ac1827202f336cac2771cb529de542"
+ }
+ },
+ "sonata-project/doctrine-extensions": {
+ "version": "1.18",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.8",
+ "ref": "4ea4a4b6730f83239608d7d4c849533645c70169"
+ }
+ },
+ "sonata-project/form-extensions": {
+ "version": "1.18",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.4",
+ "ref": "9c8a1e8ce2b1f215015ed16652c4ed18eb5867fd"
+ }
+ },
+ "squizlabs/php_codesniffer": {
+ "version": "3.7",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "3.6",
+ "ref": "1019e5c08d4821cb9b77f4891f8e9c31ff20ac6f"
+ }
+ },
+ "stof/doctrine-extensions-bundle": {
+ "version": "1.7",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.2",
+ "ref": "e805aba9eff5372e2d149a9ff56566769e22819d"
+ }
+ },
+ "sylius-labs/doctrine-migrations-extra-bundle": {
+ "version": "v0.1.4"
+ },
+ "sylius/calendar": {
+ "version": "v0.3.0"
+ },
+ "sylius/fixtures-bundle": {
+ "version": "v1.8.0"
+ },
+ "sylius/grid-bundle": {
+ "version": "v1.12.0"
+ },
+ "sylius/mailer-bundle": {
+ "version": "v1.8.1"
+ },
+ "sylius/resource-bundle": {
+ "version": "1.10",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "1.6",
+ "ref": "bfd4306c8e26b4aed0790ebde89a2c949e1398a2"
+ }
+ },
+ "sylius/theme-bundle": {
+ "version": "v2.3.0"
+ },
+ "symfony/console": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "da0c8be8157600ad34f10ff0c9cc91232522e047"
+ },
+ "files": [
+ "bin/console"
+ ]
+ },
+ "symfony/debug-bundle": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "5aa8aa48234c8eb6dbdd7b3cd5d791485d2cec4b"
+ },
+ "files": [
+ "config/packages/debug.yaml"
+ ]
+ },
+ "symfony/flex": {
+ "version": "1.19",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "1.0",
+ "ref": "146251ae39e06a95be0fe3d13c807bcf3938b172"
+ },
+ "files": [
+ ".env"
+ ]
+ },
+ "symfony/framework-bundle": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.4",
+ "ref": "3cd216a4d007b78d8554d44a5b1c0a446dab24fb"
+ },
+ "files": [
+ "config/packages/cache.yaml",
+ "config/packages/framework.yaml",
+ "config/preload.php",
+ "config/routes/framework.yaml",
+ "config/services.yaml",
+ "public/index.php",
+ "src/Controller/.gitignore",
+ "src/Kernel.php"
+ ]
+ },
+ "symfony/messenger": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.4",
+ "ref": "8bd5f27013fb1d7217191c548e340f0bdb11912c"
+ },
+ "files": [
+ "config/packages/messenger.yaml"
+ ]
+ },
+ "symfony/monolog-bundle": {
+ "version": "3.8",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "3.7",
+ "ref": "213676c4ec929f046dfde5ea8e97625b81bc0578"
+ },
+ "files": [
+ "config/packages/monolog.yaml"
+ ]
+ },
+ "symfony/routing": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "85de1d8ae45b284c3c84b668171d2615049e698f"
+ },
+ "files": [
+ "config/packages/routing.yaml",
+ "config/routes.yaml"
+ ]
+ },
+ "symfony/security-bundle": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "98f1f2b0d635908c2b40f3675da2d23b1a069d30"
+ },
+ "files": [
+ "config/packages/security.yaml"
+ ]
+ },
+ "symfony/swiftmailer-bundle": {
+ "version": "3.5",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "2.5",
+ "ref": "f0b2fccdca2dfd97dc2fd5ad216d5e27c4f895ac"
+ },
+ "files": [
+ "config/packages/dev/swiftmailer.yaml",
+ "config/packages/swiftmailer.yaml",
+ "config/packages/test/swiftmailer.yaml"
+ ]
+ },
+ "symfony/translation": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "da64f5a2b6d96f5dc24914517c0350a5f91dee43"
+ },
+ "files": [
+ "config/packages/translation.yaml",
+ "translations/.gitignore"
+ ]
+ },
+ "symfony/twig-bundle": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.4",
+ "ref": "bb2178c57eee79e6be0b297aa96fc0c0def81387"
+ },
+ "files": [
+ "config/packages/twig.yaml",
+ "templates/base.html.twig"
+ ]
+ },
+ "symfony/validator": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "c32cfd98f714894c4f128bb99aa2530c1227603c"
+ },
+ "files": [
+ "config/packages/validator.yaml"
+ ]
+ },
+ "symfony/web-profiler-bundle": {
+ "version": "5.4",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "5.3",
+ "ref": "24bbc3d84ef2f427f82104f766014e799eefcc3e"
+ },
+ "files": [
+ "config/packages/web_profiler.yaml",
+ "config/routes/web_profiler.yaml"
+ ]
+ },
+ "symfony/webpack-encore-bundle": {
+ "version": "1.16",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "1.10",
+ "ref": "f8fc53f1942f76679e9ee3c25fd44865355707b5"
+ },
+ "files": [
+ "assets/app.js",
+ "assets/bootstrap.js",
+ "assets/controllers.json",
+ "assets/controllers/hello_controller.js",
+ "assets/styles/app.css",
+ "config/packages/webpack_encore.yaml",
+ "package.json",
+ "webpack.config.js"
+ ]
+ },
+ "theofidry/alice-data-fixtures": {
+ "version": "1.5",
+ "recipe": {
+ "repo": "github.com/symfony/recipes",
+ "branch": "main",
+ "version": "1.0",
+ "ref": "fe5a50faf580eb58f08ada2abe8afbd2d4941e05"
+ }
+ },
+ "willdurand/hateoas-bundle": {
+ "version": "2.5",
+ "recipe": {
+ "repo": "github.com/symfony/recipes-contrib",
+ "branch": "main",
+ "version": "2.0",
+ "ref": "34df072c6edaa61ae19afb2f3a239f272fecab87"
+ }
+ },
+ "winzou/state-machine-bundle": {
+ "version": "0.6.0"
+ }
+}
diff --git a/OpenMarketplace/templates/.gitignore b/OpenMarketplace/templates/.gitignore
new file mode 100644
index 0000000..e69de29
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/Show/details.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/Show/details.html.twig
new file mode 100644
index 0000000..7b3eed2
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/Show/details.html.twig
@@ -0,0 +1,8 @@
+
+
+
+
+ {{ sylius_template_event('open_marketplace.admin.settlement.show.details_content', _context) }}
+
+
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/Show/detailsTable.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/Show/detailsTable.html.twig
new file mode 100644
index 0000000..e19b34c
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/Show/detailsTable.html.twig
@@ -0,0 +1,52 @@
+{% import "@SyliusAdmin/Common/Macro/money.html.twig" as money %}
+
+
+
+
+ {{ 'open_marketplace.ui.status'|trans }}
+
+ {% include 'Configuration/Grid/Admin/Field/settlementStatus.html.twig' with {data: settlement.status} %}
+
+
+
+ {{ 'open_marketplace.ui.total_amount'|trans }}
+
+ {{ money.format(settlement.totalAmount, settlement.channel.baseCurrency.code) }}
+
+
+ {{ 'open_marketplace.ui.total_commission_amount'|trans }}
+ {{ money.format(settlement.totalCommissionAmount, settlement.channel.baseCurrency.code) }}
+
+
+ {{ 'open_marketplace.ui.total_profit_amount'|trans }}
+ {{ money.format(settlement.totalAmount - settlement.totalCommissionAmount, settlement.channel.baseCurrency.code) }}
+
+
+ {{ 'open_marketplace.ui.period'|trans }}
+
+ {{ settlement.startDate|format_datetime() }} -
+ {{ settlement.endDate|format_datetime() }}
+
+
+
+ {{ 'open_marketplace.ui.created_at'|trans }}
+
+ {{ settlement.createdAt|format_datetime() }}
+
+
+ {{ 'open_marketplace.ui.updated_at'|trans }}
+
+ {{ settlement.updatedAt|format_datetime() }}
+
+
+ {{ 'open_marketplace.ui.channel'|trans }}
+ {% include '@SyliusAdmin/Common/_channel.html.twig' with {'channel': settlement.channel} %}
+
+
+ {{ 'open_marketplace.ui.total_orders'|trans }}
+ {{ count_orders_for_settlement(settlement) }}
+
+
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/ShowOrders/details.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/ShowOrders/details.html.twig
new file mode 100644
index 0000000..defee44
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/ShowOrders/details.html.twig
@@ -0,0 +1 @@
+{{ sylius_template_event('open_marketplace.admin.settlement.show_orders.details_content', _context) }}
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/ShowOrders/grid.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/ShowOrders/grid.html.twig
new file mode 100644
index 0000000..f470d42
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Settlement/ShowOrders/grid.html.twig
@@ -0,0 +1 @@
+{{ sylius_grid_render(resources, '@SyliusAdmin/Grid/_default.html.twig') }}
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/details.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/details.html.twig
new file mode 100644
index 0000000..f1c753f
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/details.html.twig
@@ -0,0 +1,8 @@
+
+
+
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.show.details_content', _context) }}
+
+
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/detailsLabels.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/detailsLabels.html.twig
new file mode 100644
index 0000000..6fcb8ba
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/detailsLabels.html.twig
@@ -0,0 +1,11 @@
+{% if vendor.status == constant('BitBag\\OpenMarketplace\\Component\\Vendor\\Entity\\VendorInterface::STATUS_VERIFIED') %}
+ {{ 'open_marketplace.ui.verified'|trans }}
+{% else %}
+ {{ 'open_marketplace.ui.unverified'|trans }}
+{% endif %}
+
+{% if vendor.enabled == true %}
+ {{ 'open_marketplace.ui.enabled'|trans }}
+{% else %}
+ {{ 'open_marketplace.ui.disabled'|trans }}
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/detailsTable.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/detailsTable.html.twig
new file mode 100644
index 0000000..5c49274
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Show/detailsTable.html.twig
@@ -0,0 +1,61 @@
+
+
+
+ {{ 'open_marketplace.ui.shop_user'|trans }}
+
+ {{ vendor.shopUser.username }}
+
+
+
+ {{ 'open_marketplace.ui.company_name'|trans }}
+ {{ vendor.companyName }}
+
+ {% if vendor.image is not null %}
+
+ {{ 'open_marketplace.ui.logo'|trans }}
+
+
+
+ {% endif %}
+
+ {{ 'open_marketplace.ui.tax_id'|trans }}
+ {{ vendor.taxIdentifier }}
+
+
+ {{ 'open_marketplace.ui.bank_account_number'|trans }}
+ {{ vendor.bankAccountNumber }}
+
+
+ {{ 'open_marketplace.ui.phone_number'|trans }}
+ {{ vendor.phoneNumber }}
+
+
+ {{ 'open_marketplace.ui.country'|trans }}
+ {{ vendor.vendorAddress.country }}
+
+
+ {{ 'open_marketplace.ui.city'|trans }}
+ {{ vendor.vendorAddress.city }}
+
+
+ {{ 'open_marketplace.ui.street'|trans }}
+ {{ vendor.vendorAddress.street }}
+
+
+ {{ 'open_marketplace.ui.postal_code'|trans }}
+ {{ vendor.vendorAddress.postalCode }}
+
+
+ {{ 'open_marketplace.ui.commission'|trans }} (%)
+ {{ vendor.commission }}
+
+
+ {{ 'open_marketplace.ui.commission_type'|trans }}
+ {{ vendor.commissionType }}
+
+
+ {{ 'open_marketplace.ui.settlement_frequency'|trans }}
+ {{ ['open_marketplace.ui', vendor.settlementFrequency]|join('.')|trans }}
+
+
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_commission.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_commission.html.twig
new file mode 100644
index 0000000..2815554
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_commission.html.twig
@@ -0,0 +1,6 @@
+
+
+
+ {{ form_row(form.commission) }}
+ {{ form_row(form.commissionType) }}
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_details.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_details.html.twig
new file mode 100644
index 0000000..756ec2d
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_details.html.twig
@@ -0,0 +1,12 @@
+{% if vendor.editedAt is not null %}
+ {{ 'Vendor requested changes on ' ~ vendor.editedAt|date("d.m.Y H:i:s") }}
+{% endif %}
+
+
+
+ {{ form_row(form.companyName) }}
+ {{ form_row(form.taxIdentifier) }}
+
+
+{{ form_row(form.bankAccountNumber) }}
+{{ form_row(form.phoneNumber) }}
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_settlement.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_settlement.html.twig
new file mode 100644
index 0000000..e486c65
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/_settlement.html.twig
@@ -0,0 +1,5 @@
+
+
+
+ {{ form_row(form.settlementFrequency) }}
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/columns.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/columns.html.twig
new file mode 100644
index 0000000..01ae34d
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/columns.html.twig
@@ -0,0 +1,7 @@
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.first_column', _context) }}
+
+
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.second_column', _context) }}
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/content.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/content.html.twig
new file mode 100644
index 0000000..03abdd3
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/content.html.twig
@@ -0,0 +1,27 @@
+{% set index_url = path(
+ configuration.vars.index.route.name|default(configuration.getRouteName('index')),
+ configuration.vars.index.route.parameters|default(configuration.vars.route.parameters|default({}))
+)
+%}
+
+
+ {{ form_start(form, {'action': path(configuration.getRouteName('update'), configuration.vars.route.parameters|default({ 'id': resource.id })), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+
+ {% include '@SyliusAdmin/Crud/form_validation_errors_checker.html.twig' %}
+
+ {% if not form._token.isRendered %}
+ {{ form_row(form._token) }}
+
+ {{ form_errors(form) }}
+
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.content', _context) }}
+
+ {% endif %}
+
+ {{ sylius_template_event([event_prefix ~ '.form', 'sylius.admin.update.form'], {'metadata': metadata, 'resource': resource, 'form': form}) }}
+
+ {% include '@SyliusUi/Form/Buttons/_update.html.twig' with {'paths': {'cancel': index_url}} %}
+
+ {{ form_end(form, {'render_rest': false}) }}
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/firstColumn.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/firstColumn.html.twig
new file mode 100644
index 0000000..b1b72ce
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/firstColumn.html.twig
@@ -0,0 +1,7 @@
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.vendor_details', _context) }}
+
+
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.vendor_commission', _context) }}
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/secondColumn.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/secondColumn.html.twig
new file mode 100644
index 0000000..5a9e598
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/secondColumn.html.twig
@@ -0,0 +1,6 @@
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.vendor_address', _context) }}
+
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.form.vendor_settlement', _context) }}
+
diff --git a/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/vendorAddress.html.twig b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/vendorAddress.html.twig
new file mode 100644
index 0000000..36c572c
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Admin/Vendor/Update/vendorAddress.html.twig
@@ -0,0 +1,6 @@
+
+
+{{ form_row(form.vendorAddress.country) }}
+{{ form_row(form.vendorAddress.city) }}
+{{ form_row(form.vendorAddress.street) }}
+{{ form_row(form.vendorAddress.postalCode) }}
diff --git a/OpenMarketplace/templates/Configuration/Event/Shop/Account/Menu/content.html.twig b/OpenMarketplace/templates/Configuration/Event/Shop/Account/Menu/content.html.twig
new file mode 100644
index 0000000..78bc830
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Event/Shop/Account/Menu/content.html.twig
@@ -0,0 +1 @@
+{{ knp_menu_render('open_marketplace.core.vendor.menu', {'template': '@SyliusShop/Menu/simple.html.twig'}) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/editVendor.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/editVendor.html.twig
new file mode 100644
index 0000000..694f0c4
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/editVendor.html.twig
@@ -0,0 +1,9 @@
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+
+{% set path = options.link.url|default(path(options.link.route|default(grid.requestConfiguration.getRouteName('update')), options.link.parameters|default({'id': data.id}))) %}
+
+{% if data.status == 'verified' %}
+ {{ buttons.default(path, 'open_marketplace.ui.edit', data.id, 'pencil', options.class is defined ? options.class : '') }}
+{% endif %}
+
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/enableVendor.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/enableVendor.html.twig
new file mode 100644
index 0000000..df28b6b
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/enableVendor.html.twig
@@ -0,0 +1,13 @@
+{% set path_suffix = data.enabled ? 'disable' : 'enable' %}
+{% set path = 'open_marketplace_admin_vendor_' ~ path_suffix %}
+{% set label = 'open_marketplace.ui.' ~ path_suffix %}
+{% set icon = data.enabled ? 'lock' : 'lock open'%}
+{% set color = data.enabled ? 'yellow' : 'primary'%}
+
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/productDetails.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/productDetails.html.twig
new file mode 100644
index 0000000..a4b2dac
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/productDetails.html.twig
@@ -0,0 +1,5 @@
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+
+{% set path = options.link.url|default(path(options.link.route|default(options.link.route), options.link.parameters|default({'id': data.id}))) %}
+
+{{ buttons.show(path, action.label) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/restore.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/restore.html.twig
new file mode 100644
index 0000000..1a4985a
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/restore.html.twig
@@ -0,0 +1,9 @@
+{% set path = path('open_marketplace_admin_product_listing_restore', { 'id': data.id }) %}
+
+{% if data.removed == true %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorProductListings.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorProductListings.html.twig
new file mode 100644
index 0000000..9595478
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorProductListings.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'open_marketplace.ui.show_product_listings'|trans }}
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorSettlements.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorSettlements.html.twig
new file mode 100644
index 0000000..55d9e66
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorSettlements.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'open_marketplace.ui.show_settlements'|trans }}
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorVirtualWallets.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorVirtualWallets.html.twig
new file mode 100644
index 0000000..b9fa292
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Action/showVendorVirtualWallets.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'open_marketplace.ui.show_virtual_wallets'|trans }}
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/enabled.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/enabled.html.twig
new file mode 100644
index 0000000..3edf228
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/enabled.html.twig
@@ -0,0 +1,2 @@
+{% import '@SyliusUi/Macro/labels.html.twig' as label %}
+{{ label.status(data) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/money.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/money.html.twig
new file mode 100644
index 0000000..4b6a43e
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/money.html.twig
@@ -0,0 +1 @@
+{{ attribute(data, options.vars.method)|sylius_format_money(data.channel.baseCurrency.code, sylius_base_locale) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/productListingName.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/productListingName.html.twig
new file mode 100644
index 0000000..6bd5211
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/productListingName.html.twig
@@ -0,0 +1,7 @@
+{% if data %}
+ {{ data }}
+{% else %}
+
+ {{ 'sylius.ui.missing_translation'|trans }}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/productListingVendor.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/productListingVendor.html.twig
new file mode 100644
index 0000000..849adb4
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/productListingVendor.html.twig
@@ -0,0 +1,3 @@
+
+ {{ data.companyName ~ ' ' ~ data.shopUser.customer.fullName }}
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementPeriod.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementPeriod.html.twig
new file mode 100644
index 0000000..f3fa5b7
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementPeriod.html.twig
@@ -0,0 +1 @@
+{{ [data.startDate|format_date(pattern='dd/MM/YYYY'), data.endDate|format_date(pattern='dd/MM/YYYY')]|join(' - ') }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementStatus.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementStatus.html.twig
new file mode 100644
index 0000000..26deaba
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementStatus.html.twig
@@ -0,0 +1,3 @@
+{% set value = 'open_marketplace.ui.settlement_status.' ~ data %}
+
+{% include '@SyliusUi/Label/_default.html.twig' with {'value': value} %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementTotals.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementTotals.html.twig
new file mode 100644
index 0000000..4b6a43e
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/settlementTotals.html.twig
@@ -0,0 +1 @@
+{{ attribute(data, options.vars.method)|sylius_format_money(data.channel.baseCurrency.code, sylius_base_locale) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Field/status.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/status.html.twig
new file mode 100644
index 0000000..787fe45
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Field/status.html.twig
@@ -0,0 +1,8 @@
+{% set map = {
+ 'verified': {'color': 'teal', 'icon': 'check'},
+ 'unverified': {'color': 'yellow', 'icon': 'clock'}
+} %}
+
+
+ {{ data|capitalize }}
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/productListingStatus.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/productListingStatus.html.twig
new file mode 100644
index 0000000..0daf498
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/productListingStatus.html.twig
@@ -0,0 +1,3 @@
+{% form_theme form '@SyliusUi/Form/theme.html.twig' %}
+
+{{ form_row(form, {'label': filter.label}) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/settlementPeriod.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/settlementPeriod.html.twig
new file mode 100644
index 0000000..0daf498
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/settlementPeriod.html.twig
@@ -0,0 +1,3 @@
+{% form_theme form '@SyliusUi/Form/theme.html.twig' %}
+
+{{ form_row(form, {'label': filter.label}) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/settlementStatus.html.twig b/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/settlementStatus.html.twig
new file mode 100644
index 0000000..0daf498
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Admin/Filter/settlementStatus.html.twig
@@ -0,0 +1,3 @@
+{% form_theme form '@SyliusUi/Form/theme.html.twig' %}
+
+{{ form_row(form, {'label': filter.label}) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Common/Field/productListingStatus.html.twig b/OpenMarketplace/templates/Configuration/Grid/Common/Field/productListingStatus.html.twig
new file mode 100644
index 0000000..1d09681
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Common/Field/productListingStatus.html.twig
@@ -0,0 +1,10 @@
+{% set map = {
+ 'verified': {'color': 'teal', 'icon': 'check', 'text': 'open_marketplace.ui.verified'|trans},
+ 'under_verification': {'color': 'yellow', 'icon': 'clock', 'text': 'open_marketplace.ui.under_verification'|trans},
+ 'created': {'color': 'blue', 'icon': 'plus', 'text': 'sylius.ui.created'|trans},
+ 'rejected': {'color': 'red', 'icon': 'ban', 'text': 'sylius.ui.rejected'|trans}
+} %}
+
+
+ {{ map[data].text|capitalize }}
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/accept.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/accept.html.twig
new file mode 100644
index 0000000..b82b2fc
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/accept.html.twig
@@ -0,0 +1,11 @@
+{% if data.status == 'new' %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/editProductListing.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/editProductListing.html.twig
new file mode 100644
index 0000000..a336648
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/editProductListing.html.twig
@@ -0,0 +1,7 @@
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+
+{% set path = options.link.url|default(path(options.link.route|default(grid.requestConfiguration.getRouteName('update')), options.link.parameters|default({'id': data.id}))) %}
+
+{% if data.latestDraft.status != 'under_verification' %}
+ {{ buttons.default(path, 'open_marketplace.ui.edit', data.id, 'pencil', options.class is defined ? options.class : '') }}
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/productListingDropdown.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/productListingDropdown.html.twig
new file mode 100644
index 0000000..ab35d37
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/productListingDropdown.html.twig
@@ -0,0 +1,41 @@
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+
+{% if data.latestDraft.status != 'under_verification' %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/productReviewDropdown.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/productReviewDropdown.html.twig
new file mode 100644
index 0000000..bb008f9
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/productReviewDropdown.html.twig
@@ -0,0 +1,34 @@
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/rejectProductListing.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/rejectProductListing.html.twig
new file mode 100644
index 0000000..047f0d6
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/rejectProductListing.html.twig
@@ -0,0 +1,7 @@
+{% set path = path('open_marketplace_admin_product_listing_reject', { 'id': productListing.id }) %}
+
+
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/withdraw.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/withdraw.html.twig
new file mode 100644
index 0000000..d3ac867
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Action/withdraw.html.twig
@@ -0,0 +1,11 @@
+{% if data.vendor.settlementFrequency|default(null) == constant('BitBag\\OpenMarketplace\\Component\\Vendor\\Contracts\\VendorSettlementFrequency::VIRTUAL_WALLET') %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/money.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/money.html.twig
new file mode 100644
index 0000000..4b6a43e
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/money.html.twig
@@ -0,0 +1 @@
+{{ attribute(data, options.vars.method)|sylius_format_money(data.channel.baseCurrency.code, sylius_base_locale) }}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/productListingProductName.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/productListingProductName.html.twig
new file mode 100644
index 0000000..3549aac
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/productListingProductName.html.twig
@@ -0,0 +1,15 @@
+{% set product = data.productListing.product %}
+{% if product is same as null%}
+
+ {{ data.getName(current_locale()) }}
+
+{% else %}
+ {% set slug = data.getSlug(current_locale()) %}
+ {% if slug != '' %}
+
+ {{ data.getName(current_locale()) }}
+
+ {% else %}
+ {{ 'N/A (' ~ 'open_marketplace.ui.missing_translation'|trans ~ ')' }}
+ {% endif %}
+{% endif %}
diff --git a/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/productListingVerifiedAt.html.twig b/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/productListingVerifiedAt.html.twig
new file mode 100644
index 0000000..e88d0e2
--- /dev/null
+++ b/OpenMarketplace/templates/Configuration/Grid/Vendor/Field/productListingVerifiedAt.html.twig
@@ -0,0 +1,5 @@
+{% if data is not null %}
+ {{ data | date }}
+{% else %}
+ N/A
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Admin/Conversation/_applicant.html.twig b/OpenMarketplace/templates/Context/Admin/Conversation/_applicant.html.twig
new file mode 100755
index 0000000..ba72a06
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Conversation/_applicant.html.twig
@@ -0,0 +1,15 @@
+{% set userRole = '' %}
+{% for role in data.roles %}
+ {% set userRole = role %}
+{% endfor %}
+
+ {% if userRole is same as 'ROLE_VENDOR' %}
+ {{ data.vendor.companyName }}
+ {% else %}
+ {{ data.customer.firstName }} {{ data.customer.lastName }}
+ {% endif %}
+
+
+ {{ 'open_marketplace.ui.conversations_listing.username'|trans }}: {{ data.username }}
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/Conversation/_archiveConversation.html.twig b/OpenMarketplace/templates/Context/Admin/Conversation/_archiveConversation.html.twig
new file mode 100755
index 0000000..9ff77cd
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Conversation/_archiveConversation.html.twig
@@ -0,0 +1,9 @@
+{% if data.isClosed() == false %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Admin/Conversation/_category.html.twig b/OpenMarketplace/templates/Context/Admin/Conversation/_category.html.twig
new file mode 100755
index 0000000..3c85035
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Conversation/_category.html.twig
@@ -0,0 +1,13 @@
+{% if data.name is defined %}
+
+
+ {{ data.name }}
+
+
+{% else %}
+
+
+ {{ 'category'|trans }}
+
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Admin/Conversation/create.html.twig b/OpenMarketplace/templates/Context/Admin/Conversation/create.html.twig
new file mode 100755
index 0000000..5be8dbd
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Conversation/create.html.twig
@@ -0,0 +1,7 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+
+{% form_theme form '@SyliusAdmin/Form/theme.html.twig' %}
+
+{% block content %}
+ {% include "Context/Common/Conversation/_createConversationForm.html.twig" %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Admin/Conversation/show.html.twig b/OpenMarketplace/templates/Context/Admin/Conversation/show.html.twig
new file mode 100755
index 0000000..bc22850
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Conversation/show.html.twig
@@ -0,0 +1,9 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+
+{% block title %}
+ {{ 'open_marketplace.ui.conversations'|trans}} | Sylius
+{% endblock %}
+
+{% block content %}
+ {% include "Context/Common/Conversation/_showConversation.html.twig" %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/_details.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/_details.html.twig
new file mode 100644
index 0000000..38203d6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/_details.html.twig
@@ -0,0 +1,34 @@
+
+
+ {% include 'Context/Admin/ProductListing/details/_details.html.twig' %}
+
+
+
+ {% include 'Context/Admin/ProductListing/details/_taxons.html.twig' %}
+
+
+ {% include 'Context/Admin/ProductListing/details/_channels.html.twig' %}
+
+
+
+ {% include 'Context/Common/ProductListing/_pricing.html.twig' with { taxCategory: true } %}
+
+
+
+
+{% include 'Context/Admin/ProductListing/details/_moreDetails.html.twig' %}
+
+
+{% include 'Context/Admin/ProductListing/details/_shipping.html.twig' %}
+
+
+{% include 'Context/Admin/ProductListing/details/_media.html.twig' %}
+
+
+{% include 'Context/Admin/ProductListing/details/_attributes.html.twig' %}
+
+{% if productDraft.status == 'under_verification' %}
+
+
+ {% include 'Context/Admin/ProductListing/details/_verificationForm.html.twig' %}
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_attributes.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_attributes.html.twig
new file mode 100644
index 0000000..4be934e
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_attributes.html.twig
@@ -0,0 +1,49 @@
+{% import '@SyliusUi/Macro/flags.html.twig' as flags %}
+
+
+
+ {% if productDraft.attributes|length == 0 %}
+ {{ 'open_marketplace.ui.no_draft_attributes'|trans }}
+ {% else %}
+
+ {% for locale in setLocales %}
+ {% set data_tab = (locale is not null ? locale|sylius_locale_name : 'non-translatable') %}
+
+
+
+ {% for attributeValue in productDraft.attributes|filter(attributeValue => attributeValue.localeCode == locale) %}
+
+
+ {{ attributeValue.name }}
+
+
+ {% include [
+ '@SyliusAdmin/Product/Show/Types/' ~ attributeValue.type ~ '.html.twig',
+ '@SyliusAttribute/Types/' ~ attributeValue.type ~ '.html.twig',
+ '@SyliusAdmin/Product/Show/Types/default.html.twig'
+ ] with {
+ 'attribute': attributeValue
+ } %}
+
+
+ {% endfor %}
+
+
+
+ {% endfor %}
+ {% endif %}
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_channels.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_channels.html.twig
new file mode 100644
index 0000000..f4712a2
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_channels.html.twig
@@ -0,0 +1,16 @@
+
+
+
+
+
+ {% for channel in productDraft.channels %}
+
+
+ {{ channel.code|sylius_channel_name }}
+
+
+ {% endfor %}
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_details.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_details.html.twig
new file mode 100644
index 0000000..42fb1ec
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_details.html.twig
@@ -0,0 +1,44 @@
+
+
+
+
+
+
+ {{ 'open_marketplace.ui.vendor'|trans }}
+
+ {% set vendor = productDraft.productListing.vendor %}
+
+ {{ vendor.companyName ~ ' ' ~ vendor.shopUser.customer.fullName }}
+
+
+
+
+ {{ 'open_marketplace.ui.name'|trans }}
+
+ {{ productDraft.code }}
+
+
+
+ {{ 'open_marketplace.ui.published_at'|trans }}
+
+ {{ productDraft.publishedAt | date }}
+
+
+
+ {{ 'open_marketplace.ui.status'|trans }}
+
+ {% if productDraft.status == 'rejected' %}
+ {{ 'open_marketplace.ui.rejected'|trans }}
+ {% elseif productDraft.status == 'under_verification' %}
+ {{ 'open_marketplace.ui.under_verification'|trans }}
+ {% elseif productDraft.status == 'verified' %}
+ {{ 'open_marketplace.ui.verified'|trans }}
+ {% else %}
+ {{ 'open_marketplace.ui.created'|trans }}
+ {% endif %}
+
+
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_media.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_media.html.twig
new file mode 100644
index 0000000..a82ccce
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_media.html.twig
@@ -0,0 +1,27 @@
+{% if productDraft.images|length == 0 %}
+
+{% else %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_moreDetails.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_moreDetails.html.twig
new file mode 100644
index 0000000..5bc8c57
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_moreDetails.html.twig
@@ -0,0 +1,42 @@
+
+
+
+ {% for translation in productDraft.translations %}
+
+
+
+ {{ translation.locale|sylius_locale_name }}
+
+
+
+
+
+ {{ 'sylius.ui.name'|trans }}
+ {{ translation.name }}
+
+
+ {{ 'sylius.ui.slug'|trans }}
+ {{ translation.slug }}
+
+
+ {{ 'sylius.ui.description'|trans }}
+ {{ translation.description|nl2br }}
+
+
+ {{ 'sylius.ui.meta_keywords'|trans }}
+ {{ translation.metaKeywords }}
+
+
+ {{ 'sylius.ui.meta_description'|trans }}
+ {{ translation.metaDescription }}
+
+
+ {{ 'sylius.ui.short_description'|trans }}
+ {{ translation.shortDescription }}
+
+
+
+
+ {% endfor %}
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_shipping.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_shipping.html.twig
new file mode 100644
index 0000000..7d9fd39
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_shipping.html.twig
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+ {{ 'open_marketplace.ui.is_shipping_required'|trans }}
+
+ {% if productDraft.shippingRequired %}
+ {{ 'open_marketplace.ui.yes'|trans }}
+ {% else %}
+ {{ 'open_marketplace.ui.no'|trans }}
+ {% endif %}
+
+
+
+ {{ 'open_marketplace.ui.shipping_category'|trans }}
+
+ {% if productDraft.shippingCategory is not null %}
+ {{ productDraft.shippingCategory.name }}
+ {% else %}
+ {{ 'open_marketplace.ui.none'|trans }}
+ {% endif %}
+
+
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_taxons.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_taxons.html.twig
new file mode 100644
index 0000000..71b7d3f
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_taxons.html.twig
@@ -0,0 +1,30 @@
+
+
+
+ {% if productDraft.mainTaxon == null and productDraft.productDraftTaxons|length == 0 %}
+ {{ 'open_marketplace.ui.no_draft_taxons'|trans }}
+ {% else %}
+
+
+ {% if productDraft.mainTaxon != null %}
+
+ {{ 'sylius.ui.main_taxon'|trans }}
+ {{ productDraft.mainTaxon.getFullName }}
+
+ {% endif %}
+
+ {{ 'sylius.ui.product_taxons'|trans }}
+
+
+ {% for productDraftTaxon in productDraft.productDraftTaxons %}
+ {{ productDraftTaxon.getTaxon.getFullName }}
+ {% endfor %}
+
+
+
+
+
+ {% endif %}
+
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/details/_verificationForm.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_verificationForm.html.twig
new file mode 100644
index 0000000..7bdfc1b
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/details/_verificationForm.html.twig
@@ -0,0 +1,34 @@
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/ProductListing/show.html.twig b/OpenMarketplace/templates/Context/Admin/ProductListing/show.html.twig
new file mode 100644
index 0000000..d157498
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/ProductListing/show.html.twig
@@ -0,0 +1,10 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+
+{% block title %}
+ {{ 'open_marketplace.ui.product_listing'|trans}} | Sylius
+{% endblock %}
+
+{% block content %}
+ {% include 'Context/Admin/ProductListing/_details.html.twig' %}
+{% endblock %}
+
diff --git a/OpenMarketplace/templates/Context/Admin/Settlement/Show/_breadcrumb.html.twig b/OpenMarketplace/templates/Context/Admin/Settlement/Show/_breadcrumb.html.twig
new file mode 100644
index 0000000..439f3a6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Settlement/Show/_breadcrumb.html.twig
@@ -0,0 +1,10 @@
+{% import '@SyliusAdmin/Macro/breadcrumb.html.twig' as breadcrumb %}
+
+{% set breadcrumbs = [
+ { label: 'sylius.ui.administration'|trans, url: path('sylius_admin_dashboard') },
+ { label: 'open_marketplace.ui.settlements'|trans, url: path('open_marketplace_admin_settlement_index') },
+ { label: settlement.vendor.companyName, url: path('open_marketplace_admin_settlement_index', {'criteria': {'vendor': settlement.vendor.id}}) },
+ { label: settlement.id }
+] %}
+
+{{ breadcrumb.crumble(breadcrumbs) }}
diff --git a/OpenMarketplace/templates/Context/Admin/Settlement/Show/_header.html.twig b/OpenMarketplace/templates/Context/Admin/Settlement/Show/_header.html.twig
new file mode 100644
index 0000000..058b827
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Settlement/Show/_header.html.twig
@@ -0,0 +1,19 @@
+
+
+
+ {% include "Context/Admin/Settlement/Show/_breadcrumb.html.twig" %}
+
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/Settlement/ShowOrders/_breadcrumb.html.twig b/OpenMarketplace/templates/Context/Admin/Settlement/ShowOrders/_breadcrumb.html.twig
new file mode 100644
index 0000000..107c4b6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Settlement/ShowOrders/_breadcrumb.html.twig
@@ -0,0 +1,11 @@
+{% import '@SyliusAdmin/Macro/breadcrumb.html.twig' as breadcrumb %}
+
+{% set breadcrumbs = [
+ { label: 'sylius.ui.administration'|trans, url: path('sylius_admin_dashboard') },
+ { label: 'open_marketplace.ui.settlements'|trans, url: path('open_marketplace_admin_settlement_index') },
+ { label: settlement.vendor.companyName, url: path('open_marketplace_admin_settlement_index', {'criteria': {'vendor': settlement.vendor.id}}) },
+ { label: settlement.id, url: path('open_marketplace_admin_settlement_show', {'id': settlement.id}) },
+ { label: 'sylius.ui.orders'|trans }
+] %}
+
+{{ breadcrumb.crumble(breadcrumbs) }}
diff --git a/OpenMarketplace/templates/Context/Admin/Settlement/ShowOrders/_header.html.twig b/OpenMarketplace/templates/Context/Admin/Settlement/ShowOrders/_header.html.twig
new file mode 100644
index 0000000..c5e2355
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Settlement/ShowOrders/_header.html.twig
@@ -0,0 +1,12 @@
+
+
+
+ {% include "Context/Admin/Settlement/ShowOrders/_breadcrumb.html.twig" %}
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/Settlement/show.html.twig b/OpenMarketplace/templates/Context/Admin/Settlement/show.html.twig
new file mode 100644
index 0000000..28224e6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Settlement/show.html.twig
@@ -0,0 +1,11 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+{% block title %}{{ 'open_marketplace.ui.settlement'|trans }} | {{ settlement.vendor.companyName }}{% endblock %}
+
+{% block content %}
+ {% include 'Context/Admin/Settlement/Show/_header.html.twig' %}
+
+
+ {{ sylius_template_event('open_marketplace.admin.settlement.show.details', _context) }}
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Admin/Settlement/showOrders.html.twig b/OpenMarketplace/templates/Context/Admin/Settlement/showOrders.html.twig
new file mode 100644
index 0000000..fe6349f
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Settlement/showOrders.html.twig
@@ -0,0 +1,11 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+{% block title %}{{ 'open_marketplace.ui.settlement'|trans }} | {{ settlement.vendor.companyName }}{% endblock %}
+
+{% block content %}
+ {% include 'Context/Admin/Settlement/ShowOrders/_header.html.twig' %}
+
+
+ {{ sylius_template_event('open_marketplace.admin.settlement.show_orders.details', _context) }}
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/Show/_breadcrumb.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/Show/_breadcrumb.html.twig
new file mode 100644
index 0000000..1b96f9c
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/Show/_breadcrumb.html.twig
@@ -0,0 +1,9 @@
+{% import '@SyliusAdmin/Macro/breadcrumb.html.twig' as breadcrumb %}
+
+{% set breadcrumbs = [
+ { label: 'sylius.ui.administration'|trans, url: path('sylius_admin_dashboard') },
+ { label: 'open_marketplace.ui.vendors'|trans, url: path('open_marketplace_admin_vendor_index') },
+ { label: resource.name|default(resource.code|default(resource.companyName)) }
+] %}
+
+{{ breadcrumb.crumble(breadcrumbs) }}
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/Show/_header.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/Show/_header.html.twig
new file mode 100644
index 0000000..63028d7
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/Show/_header.html.twig
@@ -0,0 +1,16 @@
+
+
+
+ {% include "Context/Admin/Vendor/Show/_breadcrumb.html.twig" %}
+
+
+
+ {% include 'Context/Admin/Vendor/Show/_verifyButton.html.twig' %}
+
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/Show/_verifyButton.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/Show/_verifyButton.html.twig
new file mode 100644
index 0000000..e5027c6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/Show/_verifyButton.html.twig
@@ -0,0 +1,10 @@
+{% if vendor.status == constant('BitBag\\OpenMarketplace\\Component\\Vendor\\Entity\\VendorInterface::STATUS_UNVERIFIED') %}
+
+{% endif %}
+
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/Update/_breadcrumb.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/Update/_breadcrumb.html.twig
new file mode 100644
index 0000000..1b2ec2d
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/Update/_breadcrumb.html.twig
@@ -0,0 +1,10 @@
+{% import '@SyliusAdmin/Macro/breadcrumb.html.twig' as breadcrumb %}
+
+{% set breadcrumbs = [
+ { label: 'sylius.ui.administration'|trans, url: path('sylius_admin_dashboard') },
+ { label: 'open_marketplace.ui.vendors'|trans, url: path('open_marketplace_admin_vendor_index') },
+ { label: resource.name|default(resource.code|default(resource.companyName)) },
+ { label: 'open_marketplace.ui.edit'|trans }
+] %}
+
+{{ breadcrumb.crumble(breadcrumbs) }}
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/Update/_header.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/Update/_header.html.twig
new file mode 100644
index 0000000..150c297
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/Update/_header.html.twig
@@ -0,0 +1,12 @@
+
+
+
+
+ {% include "Context/Admin/Vendor/Update/_breadcrumb.html.twig" %}
+
+
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/show.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/show.html.twig
new file mode 100644
index 0000000..597cfcb
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/show.html.twig
@@ -0,0 +1,12 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+
+{% block title %}{{ 'open_marketplace.ui.vendor'|trans }} | {{ vendor.companyName }}{% endblock %}
+
+{% block content %}
+ {% include 'Context/Admin/Vendor/Show/_header.html.twig' %}
+
+
+ {{ sylius_template_event('open_marketplace.admin.vendor.show.details', _context) }}
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Admin/Vendor/update.html.twig b/OpenMarketplace/templates/Context/Admin/Vendor/update.html.twig
new file mode 100644
index 0000000..d7fea8b
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Admin/Vendor/update.html.twig
@@ -0,0 +1,25 @@
+{% extends '@SyliusAdmin/layout.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.edit_'~metadata.name) %}
+{% set event_prefix = metadata.applicationName ~ '.admin.' ~ metadata.name ~ '.update' %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% form_theme form '@SyliusAdmin/Form/theme.html.twig' %}
+
+{% block content %}
+ {% include 'Context/Admin/Vendor/Update/_header.html.twig' %}
+ {{ sylius_template_event('open_marketplace.admin.vendor.form', _context) }}
+{% endblock %}
+
+{% block stylesheets %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.update.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.javascripts', 'sylius.admin.update.javascripts'], { 'metadata': metadata }) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Common/Conversation/_archiveRequestMessage.html.twig b/OpenMarketplace/templates/Context/Common/Conversation/_archiveRequestMessage.html.twig
new file mode 100755
index 0000000..9b197fa
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Common/Conversation/_archiveRequestMessage.html.twig
@@ -0,0 +1,24 @@
+
+
+ {{ 'open_marketplace.ui.conversation.archive_request_text_first_line'|trans }}
+ {{ 'open_marketplace.ui.conversation.archive_request_text_second_line'|trans }}
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Common/Conversation/_createConversationForm.html.twig b/OpenMarketplace/templates/Context/Common/Conversation/_createConversationForm.html.twig
new file mode 100755
index 0000000..995414e
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Common/Conversation/_createConversationForm.html.twig
@@ -0,0 +1,43 @@
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Common/Conversation/_showConversation.html.twig b/OpenMarketplace/templates/Context/Common/Conversation/_showConversation.html.twig
new file mode 100755
index 0000000..ceacdb6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Common/Conversation/_showConversation.html.twig
@@ -0,0 +1,145 @@
+{% import '@SyliusUi/Macro/messages.html.twig' as messages %}
+
+{% block content %}
+ {% set messagePath = app.request.requestUri ~ "/message/add" %}
+
+
+
+
+ {% if conversation.rejectedListingURL %}
+
+ {% endif %}
+
+
+
+
+
+ {% if conversation.isClosed() %}
+ {{ messages.info('open_marketplace.ui.conversations_listing.reading_closed_conversation') }}
+ {% endif %}
+
+
+ {% for message in conversation.messages %}
+ {% if app.user is same as message.author %}
+
+ {% if message.content|raw is same as "
ARCHIVE_REQUEST_MESSAGE " %}
+
+
+
+ {% include "Context/Common/Conversation/_archiveRequestMessage.html.twig" %}
+
+
+ {% else %}
+
+
+
+
+
{{ message.content|raw }}
+
+
+
+ {% endif %}
+
+
+ {% else %}
+
+
+ {% if message.content|raw is same as "
ARCHIVE_REQUEST_MESSAGE " %}
+
+
+
+ {% include "Context/Common/Conversation/_archiveRequestMessage.html.twig" %}
+
+
+ {% else %}
+
+
+
+
+
{{ message.content|raw }}
+
+
+
+ {% endif %}
+
+ {% endif %}
+ {% endfor %}
+
+
+ {% if conversation.isOpen() %}
+
+
+
+ {% endif %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Common/ProductListing/_pricing.html.twig b/OpenMarketplace/templates/Context/Common/ProductListing/_pricing.html.twig
new file mode 100644
index 0000000..82b2250
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Common/ProductListing/_pricing.html.twig
@@ -0,0 +1,11 @@
+
+
+
+
+ {% include 'Context/Common/ProductListing/details/_pricingTable.html.twig' %}
+
+ {% if taxCategory is defined %}
+ {% include 'Context/Common/ProductListing/details/_taxCategory.html.twig' %}
+ {% endif %}
+
+
diff --git a/OpenMarketplace/templates/Context/Common/ProductListing/details/_pricingTable.html.twig b/OpenMarketplace/templates/Context/Common/ProductListing/details/_pricingTable.html.twig
new file mode 100644
index 0000000..52c83d5
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Common/ProductListing/details/_pricingTable.html.twig
@@ -0,0 +1,28 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+
+
+
+ {{ 'sylius.ui.channels'|trans }}
+ {{ 'sylius.ui.price'|trans }}
+ {{ 'sylius.ui.original_price'|trans }}
+
+
+
+ {% for channelPricing in productDraft.productListingPrices %}
+ {% set channel = get_channel(channelPricing.channelCode) %}
+
+
+
+ {{ channelPricing.channelCode|sylius_channel_name }}
+
+ {{ money.format(channelPricing.price, channel.baseCurrency.code) }}
+ {% if channelPricing.originalPrice != null %}
+ {{ money.format(channelPricing.originalPrice, channel.baseCurrency.code) }}
+ {% else %}
+ N/A
+ {% endif %}
+
+ {% endfor %}
+
+
diff --git a/OpenMarketplace/templates/Context/Common/ProductListing/details/_taxCategory.html.twig b/OpenMarketplace/templates/Context/Common/ProductListing/details/_taxCategory.html.twig
new file mode 100644
index 0000000..0b25026
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Common/ProductListing/details/_taxCategory.html.twig
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+ {{ 'open_marketplace.ui.tax_category'|trans }}
+
+
+
+ {{ productDraft.taxCategory|default('-') }}
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Shop/Cart/Summary/_item.html.twig b/OpenMarketplace/templates/Context/Shop/Cart/Summary/_item.html.twig
new file mode 100644
index 0000000..5a41002
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Cart/Summary/_item.html.twig
@@ -0,0 +1,32 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+{% set product_variant = item.variant %}
+{% set original_price_to_display = sylius_order_item_original_price_to_display(item) %}
+
+
+
+ {% include '@SyliusShop/Product/_info.html.twig' with {'variant': product_variant} %}
+
+
+
+ {% if original_price_to_display is not null %}
+
+ {{ money.convertAndFormat(original_price_to_display) }}
+
+ {% endif %}
+ {{ money.convertAndFormat(item.discountedUnitPrice) }}
+
+
+ {{ form_row(form.quantity, sylius_test_form_attribute('cart-item-quantity-input', item.productName)|sylius_merge_recursive({'attr': {'form': main_form}})) }}
+
+
+
+
+
+ {{ money.convertAndFormat(item.subtotal) }}
+
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_form.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_form.html.twig
new file mode 100644
index 0000000..e4d85a9
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_form.html.twig
@@ -0,0 +1,7 @@
+
+ {% for key, shipment in order.shipments %}
+ {% include 'Context/Shop/Checkout/SelectShipping/_shipment.html.twig' with {'form': form.shipments[key]} %}
+ {% else %}
+ {% include '@SyliusShop/Checkout/SelectShipping/_unavailable.html.twig' %}
+ {% endfor %}
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_itemUnit.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_itemUnit.html.twig
new file mode 100644
index 0000000..2af222a
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_itemUnit.html.twig
@@ -0,0 +1,24 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+{% set product_variant = item.variant %}
+{% set original_price_to_display = sylius_order_item_original_price_to_display(item) %}
+
+
+
+ {% include '@SyliusShop/Product/_info.html.twig' with {'variant': product_variant} %}
+
+
+ {% if original_price_to_display is not null %}
+
+ {{ money.convertAndFormat(original_price_to_display) }}
+
+ {% endif %}
+ {{ money.convertAndFormat(item.discountedUnitPrice) }}
+
+
+ {{ item.quantity }}
+
+
+ {{ money.convertAndFormat(item.subtotal) }}
+
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_shipment.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_shipment.html.twig
new file mode 100644
index 0000000..9440317
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/SelectShipping/_shipment.html.twig
@@ -0,0 +1,43 @@
+
+ {% if shipment.vendor.companyName is defined %}
+
+ {% endif %}
+
+ {{ form_errors(form.method) }}
+
+
+
+
+ {{ 'sylius.ui.item'|trans }}
+ {{ 'sylius.ui.unit_price'|trans }}
+ {{ 'sylius.ui.qty'|trans }}
+ {{ 'sylius.ui.total'|trans }}
+
+
+
+ {% set items = [] %}
+ {% for key, unit in shipment.units %}
+ {% set orderItem = unit.orderItem %}
+ {% if orderItem not in items %}
+ {% set items = items|merge([orderItem]) %}
+ {% endif %}
+ {% endfor %}
+
+ {% for item in items %}
+ {% if item.variant.shippingRequired %}
+ {% include 'Context/Shop/Checkout/SelectShipping/_itemUnit.html.twig' with {'item': item} %}
+ {% endif %}
+ {% endfor %}
+
+
+
+
+ {% for key, choice_form in form.method %}
+ {% set fee = form.method.vars.shipping_costs[choice_form.vars.value] %}
+ {% set method = form.method.vars.choices[key].data %}
+ {% include '@SyliusShop/Checkout/SelectShipping/_choice.html.twig' with {'form': choice_form, 'method': method, 'fee': fee} %}
+ {% else %}
+ {% include '@SyliusShop/Checkout/SelectShipping/_unavailable.html.twig' %}
+ {% endfor %}
+
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_headers.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_headers.html.twig
new file mode 100644
index 0000000..7ba015c
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_headers.html.twig
@@ -0,0 +1,5 @@
+
+ {{ 'open_marketplace.ui.vendors'|trans }}
+ {{ 'sylius.ui.item'|trans }}
+ {{ 'sylius.ui.shipment'|trans }}
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_item.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_item.html.twig
new file mode 100644
index 0000000..fdf1278
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_item.html.twig
@@ -0,0 +1,22 @@
+
+
+ {% if secondaryOrder.vendor.companyName is defined %}
+ {{ secondaryOrder.vendor.companyName }}
+ {% endif %}
+
+
+ {% for item in secondaryOrder.items %}
+ {% if secondaryOrder.items|length > 1 %}
+ {% if loop.last %}
+ {% include '@SyliusShop/Product/_info.html.twig' with {'variant': item.variant} %}
+ {% else %}
+ {% include '@SyliusShop/Product/_info.html.twig' with {'variant': item.variant} %}
+
+ {% endif %}
+ {% else %}
+ {% include '@SyliusShop/Product/_info.html.twig' with {'variant': item.variant} %}
+ {% endif %}
+ {% endfor %}
+
+ {% include 'Context/Shop/Checkout/ThankYouPage/Table/_shipments.html.twig' %}
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_items.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_items.html.twig
new file mode 100644
index 0000000..b78401b
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_items.html.twig
@@ -0,0 +1,3 @@
+{% for secondaryOrder in order.secondaryOrders %}
+ {% include 'Context/Shop/Checkout/ThankYouPage/Table/_item.html.twig' %}
+{% endfor %}
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_shipments.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_shipments.html.twig
new file mode 100644
index 0000000..bcfc2bc
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/Table/_shipments.html.twig
@@ -0,0 +1,14 @@
+{% set item = secondaryOrder.items|last %}
+{% for shipment in order.shipments %}
+ {% if shipment.vendor is same as item.productOwner %}
+ {% set state = shipment.state %}
+
+ {% endif %}
+{% endfor %}
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/_table.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/_table.html.twig
new file mode 100644
index 0000000..ced682c
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/ThankYouPage/_table.html.twig
@@ -0,0 +1,8 @@
+
+
+ {% include 'Context/Shop/Checkout/ThankYouPage/Table/_headers.html.twig' %}
+
+
+ {% include 'Context/Shop/Checkout/ThankYouPage/Table/_items.html.twig' %}
+
+
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/selectShipping.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/selectShipping.html.twig
new file mode 100644
index 0000000..ce83571
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/selectShipping.html.twig
@@ -0,0 +1,34 @@
+{% extends '@SyliusShop/Checkout/layout.html.twig' %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.shipping'|trans }} | {{ parent() }}{% endblock %}
+
+{% block content %}
+ {{ sylius_template_event(['sylius.shop.checkout.select_shipping.steps', 'sylius.shop.checkout.steps'], _context|merge({'active': 'select_shipping', 'orderTotal': order.total})) }}
+
+
+
+
+ {{ sylius_template_event('sylius.shop.checkout.select_shipping.before_form', {'order': order}) }}
+
+ {{ form_start(form, {'action': path('sylius_shop_checkout_select_shipping'), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+ {{ form_errors(form) }}
+
+
+ {% include 'Context/Shop/Checkout/SelectShipping/_form.html.twig' %}
+
+
+ {{ sylius_template_event('sylius.shop.checkout.select_shipping.before_navigation', {'order': order}) }}
+
+ {% include '@SyliusShop/Checkout/SelectShipping/_navigation.html.twig' %}
+
+ {{ form_row(form._token) }}
+ {{ form_end(form, {'render_rest': false}) }}
+
+
+
+ {{ sylius_template_event(['sylius.shop.checkout.select_shipping.sidebar', 'sylius.shop.checkout.sidebar'], _context) }}
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Shop/Checkout/thankYou.html.twig b/OpenMarketplace/templates/Context/Shop/Checkout/thankYou.html.twig
new file mode 100644
index 0000000..8baa2c5
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Shop/Checkout/thankYou.html.twig
@@ -0,0 +1,44 @@
+{% extends '@SyliusShop/layout.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.thank_you'|trans }} | {{ parent() }}{% endblock %}
+
+{% block content %}
+
+
+
+
+ {% include 'Context/Shop/Checkout/ThankYouPage/_table.html.twig' %}
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Common/_address.html.twig b/OpenMarketplace/templates/Context/Vendor/Common/_address.html.twig
new file mode 100644
index 0000000..c9f6801
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Common/_address.html.twig
@@ -0,0 +1,16 @@
+{% import "@SyliusUi/Macro/flags.html.twig" as flags %}
+
+
+ {{ address.firstName }} {{ address.lastName }}
+ {% if address.company %}
+ {{ address.company }}
+ {% endif %}
+ {{ address.phoneNumber }}
+ {{ address.street }}
+ {{ address.city }}
+ {% if address|sylius_province_name is not empty %}
+ {{ address|sylius_province_name }}
+ {% endif %}
+ {{ flags.fromCountryCode(address.countryCode) }}
+ {{ address.countryCode|sylius_country_name|upper }} {{ address.postcode }}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Common/_breadcrumb.html.twig b/OpenMarketplace/templates/Context/Vendor/Common/_breadcrumb.html.twig
new file mode 100644
index 0000000..ff5f194
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Common/_breadcrumb.html.twig
@@ -0,0 +1,9 @@
+{% block breadcrumb %}
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Conversation/create.html.twig b/OpenMarketplace/templates/Context/Vendor/Conversation/create.html.twig
new file mode 100755
index 0000000..a1541c4
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Conversation/create.html.twig
@@ -0,0 +1,15 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.conversations_listing.breadcrumb_header'|trans }}
+ /
+ {{ 'open_marketplace.ui.create_new_conversation_breadcrumb'|trans }}
+{% endblock %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+{% block subcontent %}
+
+ {% include "Context/Common/Conversation/_createConversationForm.html.twig" %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Conversation/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Conversation/index.html.twig
new file mode 100755
index 0000000..d9dd5c1
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Conversation/index.html.twig
@@ -0,0 +1,115 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+{% import '@SyliusUi/Macro/messages.html.twig' as messages %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.conversations_listing.breadcrumb_header'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+
+
+
+
+
+ {% if account_disabled %}
+
+
+
+ {{ 'open_marketplace.ui.your_account_has_been_disabled'|trans }}
+
+
+
+ {% endif %}
+
+ {% if conversations|length == 0 %}
+ {% if app.request.query.get('closed') %}
+ {{ messages.info('open_marketplace.ui.conversations_listing.no_closed_conversations') }}
+ {% else %}
+ {{ messages.info('open_marketplace.ui.conversations_listing.no_open_conversations') }}
+ {% endif %}
+ {% endif %}
+
+ {% if conversations|length > 0 %}
+ {% for conversation in conversations %}
+
+ {% endfor %}
+ {% endif %}
+{% endblock %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Conversation/show.html.twig b/OpenMarketplace/templates/Context/Vendor/Conversation/show.html.twig
new file mode 100755
index 0000000..1b644f1
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Conversation/show.html.twig
@@ -0,0 +1,27 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.conversations_listing.breadcrumb_header'|trans }}
+ /
+
+ {% if conversation is not null %}
+ {% if conversation.category is not null %}
+ {{ conversation.category.name }}
+ {% else %}
+ {% set author = conversation.messages.first.author %}
+ {% if conversation.messages.first.vendorUser is not null %}
+ {{ author.customer.firstName ~ ' ' ~ author.customer.lastName }}
+ {% elseif conversation.messages.first.shopUser is not null %}
+ {{ author.username }}
+ {% else %}
+ {{ author.firstName ~ ' ' ~ author.lastName }}
+ {% endif %}
+ {% endif %}
+ {% endif %}
+{% endblock %}
+
+{% block subcontent %}
+
+ {% include "Context/Common/Conversation/_showConversation.html.twig" %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Customers/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Customers/index.html.twig
new file mode 100644
index 0000000..75da273
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Customers/index.html.twig
@@ -0,0 +1,18 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.order_history'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.customers'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.customers',
+ "subheader": 'open_marketplace.ui.manage_customers',
+ "icon": 'users'
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusAdmin/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Customers/show.html.twig b/OpenMarketplace/templates/Context/Vendor/Customers/show.html.twig
new file mode 100644
index 0000000..6e38f09
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Customers/show.html.twig
@@ -0,0 +1,97 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.customer'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.customers'|trans }}
+ /
+ {{ resource.id }}
+ /
+ {{ 'sylius.ui.show'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+
+
+
+
+
+ {% set menu = knp_menu_get('sylius.vendor.customer.show', [], {'customer': customer}) %}
+ {{ knp_menu_render(menu, {'template': '@SyliusUi/Menu/top.html.twig'}) }}
+
+
+
+
+
+
+
+
+ {{ 'sylius.ui.customer_since'|trans }} {{ customer.createdAt|date }}
+
+ {% if customer.group is not null %}
+ {{ 'sylius.ui.group_membership'|trans }}: {{ customer.group }}
+ {% endif %}
+
+
+
+
+
+ {{ 'sylius.ui.subscribed_to_newsletter'|trans }}
+
+ {% if customer.user is not null %}
+ {% set user = customer.user %}
+
+
+ {{ 'sylius.ui.email_verified'|trans }}
+
+ {% endif %}
+
+
+
+
+
+
+
+ {% if customer.defaultAddress is not null %}
+ {% include 'Context/Vendor/Common/_address.html.twig' with {'address': customer.defaultAddress} %}
+ {% else %}
+ {{ 'sylius.ui.this_customer_does_not_have_a_default_address'|trans }}
+ {% endif %}
+
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/DraftAttributes/_menu.html.twig b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/_menu.html.twig
new file mode 100644
index 0000000..1f58a5e
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/_menu.html.twig
@@ -0,0 +1,16 @@
+
diff --git a/OpenMarketplace/templates/Context/Vendor/DraftAttributes/attributeTypes.html.twig b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/attributeTypes.html.twig
new file mode 100644
index 0000000..4135372
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/attributeTypes.html.twig
@@ -0,0 +1,7 @@
+{% for name, attributeType in types %}
+ {% set createRouteName = metadata.applicationName~'_admin_'~metadata.name~'_create' %}
+
+ {% set label = 'sylius.form.attribute_type.' ~ attributeType.type %}
+ {{ label|trans }}
+
+{% endfor %}
diff --git a/OpenMarketplace/templates/Context/Vendor/DraftAttributes/create.html.twig b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/create.html.twig
new file mode 100644
index 0000000..93c41c3
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/create.html.twig
@@ -0,0 +1,56 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.new_'~metadata.name) %}
+{% set event_prefix = metadata.applicationName ~ '.admin.' ~ metadata.name ~ '.create' %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.attributes'|trans }}
+ /
+ {{ 'sylius.ui.create'|trans }}
+{% endblock %}
+
+{% form_theme form '@SyliusAdmin/Form/theme.html.twig' %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.create_draft_attribute',
+ "icon": 'tag'
+ } %}
+
+ {{ form_start(form, {'action': path('open_marketplace_vendor_attributes_create', configuration.vars.route.parameters|default({})), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+ {% include '@SyliusAdmin/Crud/form_validation_errors_checker.html.twig' %}
+
+ {% if configuration.vars.templates.form is defined %}
+ {% include configuration.vars.templates.form %}
+ {% if not form._token.isRendered %}
+ {{ form_row(form._token) }}
+ {% endif %}
+ {% else %}
+ {{ form_widget(form) }}
+ {% endif %}
+
+
+ {% include '@SyliusUi/Form/Buttons/_create.html.twig' with {'paths': {'cancel': path('open_marketplace_vendor_attributes_index', configuration.vars.route.parameters|default({}))}} %}
+
+ {{ form_end(form, {'render_rest': false}) }}
+
+{% endblock %}
+
+{% block topbar %}
+{% endblock %}
+
+
+{% block stylesheets %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.create.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.javascripts', 'sylius.admin.create.javascripts'], { 'metadata': metadata }) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/DraftAttributes/index.html.twig b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/index.html.twig
new file mode 100644
index 0000000..02e68a7
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/index.html.twig
@@ -0,0 +1,20 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% set definition = resources.definition %}
+{% block title %}{{ 'open_marketplace.ui.draft_attributes'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.attributes'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.draft_attributes',
+ "subheader": 'open_marketplace.ui.manage_product_listing_attributes',
+ "icon": 'tag',
+ "buttons": 'Context/Vendor/DraftAttributes/_menu.html.twig'
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusAdmin/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/DraftAttributes/update.html.twig b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/update.html.twig
new file mode 100644
index 0000000..b940a8a
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/DraftAttributes/update.html.twig
@@ -0,0 +1,57 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.new_'~metadata.name) %}
+{% set event_prefix = metadata.applicationName ~ '.admin.' ~ metadata.name ~ '.create' %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.attributes'|trans }}
+ /
+ {{ resource.id }}
+ /
+ {{ 'sylius.ui.edit'|trans }}
+{% endblock %}
+
+{% form_theme form '@SyliusAdmin/Form/theme.html.twig' %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.edit_draft_attribute',
+ "icon": 'tag'
+ } %}
+
+ {{ form_start(form, {'action': path('open_marketplace_product_draft_attribute_update', configuration.vars.route.parameters|default({})), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+ {% include '@SyliusAdmin/Crud/form_validation_errors_checker.html.twig' %}
+
+ {% if configuration.vars.templates.form is defined %}
+ {% include configuration.vars.templates.form %}
+ {% if not form._token.isRendered %}
+ {{ form_row(form._token) }}
+ {% endif %}
+ {% else %}
+ {{ form_widget(form) }}
+ {% endif %}
+
+
+ {% include '@SyliusUi/Form/Buttons/_create.html.twig' with {'paths': {'cancel': path('open_marketplace_vendor_attributes_index', configuration.vars.route.parameters|default({}))}} %}
+
+ {{ form_end(form, {'render_rest': false}) }}
+{% endblock %}
+
+{% block topbar %}
+{% endblock %}
+
+
+{% block stylesheets %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.create.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.javascripts', 'sylius.admin.create.javascripts'], { 'metadata': metadata }) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Email/profileUpdate.html.twig b/OpenMarketplace/templates/Context/Vendor/Email/profileUpdate.html.twig
new file mode 100644
index 0000000..93242cd
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Email/profileUpdate.html.twig
@@ -0,0 +1,21 @@
+{% extends '@SyliusCore/Email/layout.html.twig' %}
+
+{% block subject %}
+ {{ 'open_marketplace.email.vendor_profile_update'|trans }}
+{% endblock %}
+
+{% block body %}
+
+ {{ 'open_marketplace.email.request_profile_update_greeting' | trans }}
+
+
+
+ {{ 'open_marketplace.email.request_profile_update_info' | trans }}
+
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Email/settlementsCreated.html.twig b/OpenMarketplace/templates/Context/Vendor/Email/settlementsCreated.html.twig
new file mode 100644
index 0000000..63e3c61
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Email/settlementsCreated.html.twig
@@ -0,0 +1,30 @@
+{% extends '@SyliusCore/Email/layout.html.twig' %}
+
+{% block subject %}
+ {{ 'open_marketplace.email.settlements_created.subject'|trans }}
+{% endblock %}
+
+{% block body %}
+
+ {{ 'open_marketplace.email.settlements_created.greetings' | trans }}
+
+
+
+ {{ 'open_marketplace.email.settlements_created.info' | trans }}
+
+
+ {{ 'open_marketplace.ui.period'|trans }}
+ {{ 'open_marketplace.ui.channel'|trans }}
+ {{ 'open_marketplace.ui.total_commission_amount'|trans }}
+
+ {% for settlement in settlements %}
+
+ {{ [settlement.startDate|format_date(pattern='dd/MM/YYYY'), settlement.endDate|format_date(pattern='dd/MM/YYYY')]|join(' - ') }}
+ {{ settlement.channelName }}
+ {{ settlement.commissionTotal }}
+
+ {% endfor %}
+
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Inventory/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Inventory/index.html.twig
new file mode 100644
index 0000000..8eb4ade
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Inventory/index.html.twig
@@ -0,0 +1,18 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.order_history'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.inventory'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.inventory',
+ "subheader": 'open_marketplace.ui.manage_product_listing_stock',
+ "icon": 'clipboard'
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusShop/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Inventory/update.html.twig b/OpenMarketplace/templates/Context/Vendor/Inventory/update.html.twig
new file mode 100644
index 0000000..4922c14
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Inventory/update.html.twig
@@ -0,0 +1,61 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.order_history'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.inventory'|trans }}
+ /
+ {{ resource.id }}
+ /
+ {{ 'sylius.ui.edit'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.edit_inventory',
+ "icon": 'clipboard'
+ } %}
+
+
+
{{ resource.code }}
+ {{ form_start(form, {'action': path('open_marketplace_vendor_inventory_update', { 'id': resource.id }), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+
+ {% include '@SyliusAdmin/Crud/form_validation_errors_checker.html.twig' %}
+
+ {% if not form._token.isRendered %}
+ {{ form_row(form._token) }}
+ {% endif %}
+
+
+
+ {{ form_row(form.onHand) }}
+
+
+
+ {{ form_widget(form.tracked) }}
+
+ {{ 'sylius.ui.tracked'|trans }}
+
+
+
+
+
+ {{ 'sylius.ui.save_changes'|trans }}
+
+
+ {{ form_end(form, {'render_rest': true}) }}
+
+
+{% endblock %}
+
+{% block stylesheets %}
+ {{ parent() }}
+
+ {{ sylius_template_event(['sylius.admin.product_variant.stylesheets', 'sylius.admin.update.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+{% block javascripts %}
+ {{ parent() }}
+
+ {{ sylius_template_event(['sylius.admin.product_variant.javascripts', 'sylius.admin.update.javascripts'], { 'metadata': metadata }) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Login/_vendorDefaultCredentials.html.twig b/OpenMarketplace/templates/Context/Vendor/Login/_vendorDefaultCredentials.html.twig
new file mode 100644
index 0000000..5231001
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Login/_vendorDefaultCredentials.html.twig
@@ -0,0 +1,25 @@
+
+
+
+
+
+ {{ 'open_marketplace.ui.username'|trans }}: camille@example.com
+ {{ 'open_marketplace.ui.password'|trans }}: password
+
+
+ {{ 'open_marketplace.ui.username'|trans }}: good-and-better@example.com
+ {{ 'open_marketplace.ui.password'|trans }}: password
+
+
+
+
+ {{ 'open_marketplace.ui.username'|trans }}: lisa-comp@example.com
+ {{ 'open_marketplace.ui.password'|trans }}: password
+
+
+ {{ 'open_marketplace.ui.username'|trans }}: health@example.com
+ {{ 'open_marketplace.ui.password'|trans }}: password
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_cancelled.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_cancelled.html.twig
new file mode 100644
index 0000000..6e7decf
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_cancelled.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'sylius.ui.cancelled'|trans }}
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_partiallyShipped.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_partiallyShipped.html.twig
new file mode 100644
index 0000000..1bd6e05
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_partiallyShipped.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'sylius.ui.partially_shipped'|trans }}
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_ready.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_ready.html.twig
new file mode 100644
index 0000000..cd9f001
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_ready.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'sylius.ui.ready'|trans }}
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_shipmentsForm.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_shipmentsForm.html.twig
new file mode 100644
index 0000000..4cd73d2
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_shipmentsForm.html.twig
@@ -0,0 +1,10 @@
+
+ {{ form_start(form, {'action': path('open_marketplace_vendor_orders_shipment_ship', {'id': shipment.id, 'orderId': order.id}), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+
+
+ {{ form_widget(form.tracking, {'attr': {'placeholder': 'sylius.ui.tracking_code'|trans ~ '...'}}) }}
+ {{ 'sylius.ui.ship'|trans }}
+
+ {{ form_row(form._token) }}
+ {{ form_end(form, {'render_rest': false}) }}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_shipped.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_shipped.html.twig
new file mode 100644
index 0000000..6ab7ca9
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/Shippings/_shipped.html.twig
@@ -0,0 +1,4 @@
+
+
+ {{ 'sylius.ui.shipped'|trans }}
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_address.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_address.html.twig
new file mode 100644
index 0000000..4d2a2d4
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_address.html.twig
@@ -0,0 +1,16 @@
+{% import "@SyliusUi/Macro/flags.html.twig" as flags %}
+
+
+ {{ address.firstName }} {{ address.lastName }}
+ {% if address.company %}
+ {{ address.company }}
+ {% endif %}
+ {{ address.phoneNumber }}
+ {{ address.street }}
+ {{ address.city }}
+ {% if address|sylius_province_name is not empty %}
+ {{ address|sylius_province_name }}
+ {% endif %}
+ {{ flags.fromCountryCode(address.countryCode) }}
+ {{ address.countryCode|sylius_country_name|upper }} {{ address.postcode }}
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_addresses.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_addresses.html.twig
new file mode 100644
index 0000000..8b0f3d2
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_addresses.html.twig
@@ -0,0 +1,16 @@
+{% if order.billingAddress is not null %}
+
+
+ {% include 'Context/Vendor/Order/Partials/_address.html.twig' with {'address': order.billingAddress} %}
+
+{% endif %}
+{% if order.shippingAddress is not null %}
+
+
+ {% include 'Context/Vendor/Order/Partials/_address.html.twig' with {'address': order.shippingAddress} %}
+
+{% endif %}
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_customerInfo.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_customerInfo.html.twig
new file mode 100644
index 0000000..378a287
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_customerInfo.html.twig
@@ -0,0 +1,32 @@
+
+
+
+
+
+ {% if customer.phoneNumber is not empty %}
+
+ {% endif %}
+ {% if order.customerIp is defined and order.customerIp is not empty %}
+
+ {% endif %}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_item.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_item.html.twig
new file mode 100644
index 0000000..2e24d6d
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_item.html.twig
@@ -0,0 +1,50 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+{% set orderPromotionAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::ORDER_PROMOTION_ADJUSTMENT') %}
+{% set unitPromotionAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::ORDER_UNIT_PROMOTION_ADJUSTMENT') %}
+{% set shippingAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::SHIPPING_ADJUSTMENT') %}
+{% set taxAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::TAX_ADJUSTMENT') %}
+
+{% set variant = item.variant %}
+{% set product = variant.product %}
+
+{% set aggregatedUnitPromotionAdjustments = item.getAdjustmentsTotalRecursively(unitPromotionAdjustment) + item.getAdjustmentsTotalRecursively(orderPromotionAdjustment) %}
+{% set subtotal = (item.unitPrice * item.quantity) + aggregatedUnitPromotionAdjustments %}
+
+{% set taxIncluded = sylius_admin_order_unit_tax_included(item) %}
+{% set taxExcluded = sylius_admin_order_unit_tax_excluded(item) %}
+
+
+
+ {% include '@SyliusAdmin/Product/_info.html.twig' %}
+
+
+ {{ money.format(item.unitPrice, order.currencyCode) }}
+
+
+ {{ money.format(item.units.first.adjustmentsTotal(unitPromotionAdjustment), order.currencyCode) }}
+
+
+ ~ {{ money.format(item.units.first.adjustmentsTotal(orderPromotionAdjustment), order.currencyCode) }}
+
+
+ {{ money.format(item.fullDiscountedUnitPrice, order.currencyCode) }}
+
+
+ {{ item.quantity }}
+
+
+ {{ money.format(subtotal, order.currencyCode) }}
+
+
+ {{ money.format(taxExcluded, order.currencyCode) }}
+
+
{{ money.format(taxIncluded, order.currencyCode) }}
+
+
({{ 'sylius.ui.included_in_price'|trans }})
+
+
+
+ {{ money.format(item.total, order.currencyCode) }}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderDetails.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderDetails.html.twig
new file mode 100644
index 0000000..6e866ea
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderDetails.html.twig
@@ -0,0 +1,22 @@
+
+
+
+ {% include 'Context/Vendor/Order/Partials/_payments.html.twig' %}
+
+
+ {% include 'Context/Vendor/Order/Partials/_shipments.html.twig' %}
+
+
+
+
+ {% set customer = order.customer %}
+ {% include 'Context/Vendor/Order/Partials/_customerInfo.html.twig' %}
+
+
+ {% include 'Context/Vendor/Order/Partials/_addresses.html.twig' %}
+
+
+ {% include 'Context/Vendor/Order/Partials/_resendEmail.html.twig' %}
+
+
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderTable.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderTable.html.twig
new file mode 100644
index 0000000..da1b037
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderTable.html.twig
@@ -0,0 +1,23 @@
+
+
+
+ {{ 'sylius.ui.order_item_product'|trans }}
+ {{ 'sylius.ui.unit_price'|trans }}
+ {{ 'sylius.ui.unit_discount'|trans }}
+ {{ 'sylius.ui.distributed_order_discount'|trans }}
+ {{ 'sylius.ui.discounted_unit_price'|trans }}
+ {{ 'sylius.ui.quantity'|trans }}
+ {{ 'sylius.ui.subtotal'|trans }}
+ {{ 'sylius.ui.tax'|trans }}
+ {{ 'sylius.ui.total'|trans }}
+
+
+
+ {% for item in order.items %}
+ {% include 'Context/Vendor/Order/Partials/_item.html.twig' %}
+ {% endfor %}
+
+
+ {% include 'Context/Vendor/Order/Partials/_totals.html.twig' %}
+
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderTitle.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderTitle.html.twig
new file mode 100644
index 0000000..2f8a92b
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_orderTitle.html.twig
@@ -0,0 +1,29 @@
+
+
+
+
+
+
+ {% set menu = knp_menu_get('sylius.vendor.order.show', [], {'order': order}) %}
+ {{ knp_menu_render(menu, {'template': '@SyliusUi/Menu/top.html.twig'}) }}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_payments.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_payments.html.twig
new file mode 100644
index 0000000..42a2ec3
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_payments.html.twig
@@ -0,0 +1,30 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+{% if order.hasPayments %}
+
+ {% include '@SyliusAdmin/Order/Label/PaymentState/' ~ order.paymentState ~ '.html.twig' with { 'value': 'sylius.ui.' ~ order.paymentState, 'attached': true } %}
+
+
+ {% for payment in order.payments %}
+
+
+ {% include '@SyliusAdmin/Common/Label/paymentState.html.twig' with {'data': payment.state} %}
+
+
+
+
+ {{ money.format(payment.amount, payment.order.currencyCode) }}
+
+
+
+ {% endfor %}
+
+
+{% else %}
+
+
+ {{ 'sylius.ui.no_payments'|trans }}
+
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_resendEmail.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_resendEmail.html.twig
new file mode 100644
index 0000000..a781e1e
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_resendEmail.html.twig
@@ -0,0 +1,6 @@
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_shipments.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_shipments.html.twig
new file mode 100644
index 0000000..f9f9432
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_shipments.html.twig
@@ -0,0 +1,47 @@
+{% set shippingStates = {
+ 'ready': 'Context/Vendor/Order/Partials/Shippings/_ready.html.twig',
+ 'partially_shipped': 'Context/Vendor/Order/Partials/Shippings/_partiallyShipped.html.twig',
+ 'shipped': 'Context/Vendor/Order/Partials/Shippings/_shipped.html.twig',
+ 'cancelled': 'Context/Vendor/Order/Partials/Shippings/_cancelled.html.twig'
+} %}
+
+
+ {% include shippingStates[order.shippingState] %}
+
+ {% if order.hasShipments %}
+
+
+ {% for shipment in order.shipments %}
+
+
+ {% include '@SyliusAdmin/Common/Label/shipmentState.html.twig' with {'data': shipment.state} %}
+
+
+
+
+
+
+ {{ shipment.method.zone }}
+
+ {% if shipment.shippedAt is not empty %}
+ {{ 'sylius.ui.shipped_at'|trans }}:
{{ shipment.shippedAt|date('d-m-Y H:i:s') }}
+ {% endif %}
+
+
+ {% if shipment.tracking is not empty %}
+
+
{{ 'sylius.ui.tracking_code'|trans|upper }}
+
{{ shipment.tracking }}
+
+ {% endif %}
+
+ {% if sm_can(shipment, 'ship', 'sylius_shipment') %}
+ {% include 'Context/Vendor/Order/Partials/Shippings/_shipmentsForm.html.twig' %}
+ {% endif %}
+
+ {% endfor %}
+
+ {% endif %}
+
\ No newline at end of file
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_totals.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_totals.html.twig
new file mode 100644
index 0000000..ed0506d
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_totals.html.twig
@@ -0,0 +1,96 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+{% set orderShippingPromotionAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::ORDER_SHIPPING_PROMOTION_ADJUSTMENT') %}
+{% set shippingAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::SHIPPING_ADJUSTMENT') %}
+{% set taxAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::TAX_ADJUSTMENT') %}
+
+{% set orderShippingPromotions = sylius_aggregate_adjustments(order.getAdjustmentsRecursively(orderShippingPromotionAdjustment)) %}
+
+
+
+
+ {{ 'sylius.ui.tax_total'|trans }} :
+ {{ money.format(order.taxTotal, order.currencyCode) }}
+
+
+ {{ 'sylius.ui.items_total'|trans }} :
+ {{ money.format(order.itemsTotal, order.currencyCode) }}
+
+
+
+
+
+ {{ 'open_marketplace.ui.commission'|trans }} ({{ 'sylius.ui.included_in_price'|trans }})
+
+
+ {{ 'open_marketplace.ui.commission'|trans }} :
+ {{ money.format(order.commissionTotal, order.currencyCode) }}
+
+
+
+
+
+ {% if not order.adjustments(shippingAdjustment).isEmpty() %}
+
+
{{ 'sylius.ui.shipping'|trans }}:
+ {% for shipment in order.shipments %}
+ {% for adjustment in shipment.adjustments(shippingAdjustment) %}
+
+
{{ money.format(adjustment.amount, order.currencyCode) }}
+
+
+ {{ adjustment.label }} :
+
+
+
+ {% endfor %}
+
+ {% for adjustment in shipment.adjustments(taxAdjustment) %}
+
+
+ {{ money.format(adjustment.amount, order.currencyCode) }}
+ {% if adjustment.isNeutral %}
+ ({{ 'sylius.ui.included_in_price'|trans }})
+ {% endif %}
+
+
+
+ {{ adjustment.label }} :
+
+
+
+ {% endfor %}
+ {% endfor %}
+
+ {% else %}
+ {{ 'sylius.ui.no_shipping_charges'|trans }}
+ {% endif %}
+
+ {% if not orderShippingPromotions is empty %}
+
+
+
{{ 'sylius.ui.shipping_discount'|trans }}:
+ {% for label, amount in orderShippingPromotions %}
+
+
+ {{ money.format(amount, order.currencyCode) }}
+
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ {{ 'sylius.ui.shipping_total'|trans }} :
+ {{ money.format(order.shippingTotal, order.currencyCode) }}
+
+
+
+{% include 'Context/Vendor/Order/Partials/_totalsPromotions.html.twig' %}
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/Partials/_totalsPromotions.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_totalsPromotions.html.twig
new file mode 100644
index 0000000..4d5ecd6
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/Partials/_totalsPromotions.html.twig
@@ -0,0 +1,31 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+{% set orderPromotionAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::ORDER_PROMOTION_ADJUSTMENT') %}
+{% set unitPromotionAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::ORDER_UNIT_PROMOTION_ADJUSTMENT') %}
+
+
+
+ {% set orderPromotionAdjustments = sylius_aggregate_adjustments(order.getAdjustmentsRecursively(orderPromotionAdjustment)) %}
+ {% set unitPromotionAdjustments = sylius_aggregate_adjustments(order.getAdjustmentsRecursively(unitPromotionAdjustment)) %}
+ {% set promotionAdjustments = orderPromotionAdjustments|merge(unitPromotionAdjustments) %}
+ {% if not promotionAdjustments is empty %}
+
+
{{ 'sylius.ui.promotions'|trans }}:
+ {% for label, amount in promotionAdjustments %}
+
+
{{ money.format(amount, order.currencyCode) }}
+
{{ label }} :
+
+ {% endfor %}
+
+ {% else %}
+ {{ 'sylius.ui.no_promotion'|trans }}.
+ {% endif %}
+
+
+ {% set orderPromotionTotal = order.getAdjustmentsTotalRecursively(orderPromotionAdjustment) %}
+ {% set unitPromotionTotal = order.getAdjustmentsTotalRecursively(unitPromotionAdjustment) %}
+ {{ 'sylius.ui.promotion_total'|trans }} :
+ {{ money.format(orderPromotionTotal + unitPromotionTotal, order.currencyCode) }}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/index.html.twig
new file mode 100644
index 0000000..6344da9
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/index.html.twig
@@ -0,0 +1,18 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.order_history'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.order_history'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.orders',
+ "subheader": 'open_marketplace.ui.manage_orders',
+ "icon": 'suitcase'
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusShop/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Order/show.html.twig b/OpenMarketplace/templates/Context/Vendor/Order/show.html.twig
new file mode 100644
index 0000000..bfa563b
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Order/show.html.twig
@@ -0,0 +1,19 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.order_history'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.order_history'|trans }}
+ /
+ {{ resource.id }}
+ /
+ {{ 'sylius.ui.show'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include 'Context/Vendor/Order/Partials/_orderTitle.html.twig' %}
+ {% include 'Context/Vendor/Order/Partials/_orderTable.html.twig' %}
+ {% include 'Context/Vendor/Order/Partials/_orderDetails.html.twig' %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/_form.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/_form.html.twig
new file mode 100644
index 0000000..b87fc20
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/_form.html.twig
@@ -0,0 +1,145 @@
+{% block subcontent %}
+ {% set header = 'open_marketplace.ui.create_product_listing' %}
+ {% if editMode == true %}
+ {% set header = 'open_marketplace.ui.edit_product_listing' %}
+ {% endif %}
+
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": header,
+ "icon": 'edit'
+ } %}
+
+ {{ form_start(form, { 'attr': {'class': 'ui form dirtylisten'}}) }}
+ {% include '@SyliusAdmin/Crud/form_validation_errors_checker.html.twig' %}
+
+ {{ form_end(form, {'render_rest': true}) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/_menu.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/_menu.html.twig
new file mode 100644
index 0000000..ecf1bcf
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/_menu.html.twig
@@ -0,0 +1,9 @@
+
+
+ {% if definition.actionGroups.main is defined %}
+ {% for action in definition.getEnabledActions('main') %}
+ {{ sylius_grid_render_action(grid, action, null) }}
+ {% endfor %}
+ {% endif %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/_productListings.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/_productListings.html.twig
new file mode 100644
index 0000000..839a1ad
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/_productListings.html.twig
@@ -0,0 +1,77 @@
+{% import '@SyliusUi/Macro/pagination.html.twig' as pagination %}
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+{% import '@SyliusUi/Macro/messages.html.twig' as messages %}
+{% import '@SyliusUi/Macro/table.html.twig' as table %}
+
+{% set definition = grid.definition %}
+{% set data = grid.data %}
+
+{% set path = path(app.request.attributes.get('_route'), app.request.attributes.get('_route_params')) %}
+{% set criteria = app.request.query.get('criteria') %}
+
+{% if definition.enabledFilters|length > 0 %}
+
+
+
+
+
+ {{ 'sylius.ui.filters'|trans }}
+
+
+
+{% endif %}
+
+
+
+
+ {% if data|length > 0 and definition.actionGroups.bulk is defined and definition.getEnabledActions('bulk')|length > 0 %}
+
+ {% for action in definition.getEnabledActions('bulk') %}
+ {{ sylius_grid_render_bulk_action(grid, action, null) }}
+ {% endfor %}
+
+ {% endif %}
+
+ {% if definition.limits|length > 1 and data|length > min(definition.limits) %}
+
+
+
+ {% endif %}
+
+
+ {% if data|length > 0 %}
+
+
+
+
+ {{ table.headers(grid, definition, app.request.attributes) }}
+
+
+
+ {% for row in data %}
+ {{ table.row(grid, definition, row) }}
+ {% endfor %}
+
+
+
+ {% else %}
+ {{ messages.info('sylius.ui.no_results_to_display') }}
+ {% endif %}
+ {{ pagination.simple(data) }}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/create.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/create.html.twig
new file mode 100644
index 0000000..bf75335
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/create.html.twig
@@ -0,0 +1,35 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.new_'~metadata.name) %}
+{% set event_prefix = metadata.applicationName ~ '.vendor.' ~ metadata.name ~ '.create' %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% form_theme form '@SyliusAdmin/Form/theme.html.twig' %}
+
+{% block breadcrumb %}
+
+{% endblock %}
+
+{% block subcontent %}
+ {{ include('Context/Vendor/ProductListing/_form.html.twig', {"editMode": false}) }}
+{% endblock %}
+
+{% block stylesheets %}
+ {{ parent() }}
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.create.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ encore_entry_script_tags('admin-entry', null, 'admin') }}
+{% endblock %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/details.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/details.html.twig
new file mode 100644
index 0000000..48cfe9c
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/details.html.twig
@@ -0,0 +1,82 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.my_account'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.product_list'|trans }}
+ /
+ {{ 'sylius.ui.show'|trans }}
+{% endblock %}
+
+{% set productDraft = product_draft %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.show_product_listing',
+ "icon": 'file',
+ } %}
+
+ {% set productDraft = product_draft%}
+
+
+
+
+
+
+ {{ 'open_marketplace.ui.code'|trans }}
+
+ {{ productDraft.code }}
+
+
+
+ {{ 'open_marketplace.ui.published_at'|trans }}
+
+ {{ productDraft.publishedAt | date }}
+
+
+
+ {{ 'open_marketplace.ui.status'|trans }}
+
+ {{ productDraft.status }}
+
+
+
+ {{ 'open_marketplace.ui.status'|trans }}
+
+ {% if productDraft.status == 'rejected' %}
+ {{ 'open_marketplace.ui.rejected'|trans }}
+ {% elseif productDraft.status == 'under_verification' %}
+ {{ 'open_marketplace.ui.under_verification'|trans }}
+ {% elseif productDraft.status == 'verified' %}
+ {{ 'open_marketplace.ui.verified'|trans }}
+ {% else %}
+ {{ 'open_marketplace.ui.created'|trans }}
+ {% endif %}
+
+
+
+
+
+
+
+ {% include 'Context/Common/ProductListing/_pricing.html.twig' with { taxCategory: true } %}
+
+ {% include 'Context/Vendor/ProductListing/details/_shipping.html.twig' %}
+
+ {% include 'Context/Vendor/ProductListing/details/_taxons.html.twig' %}
+
+ {% include 'Context/Vendor/ProductListing/details/_moreDetails.html.twig' %}
+
+ {% include 'Context/Vendor/ProductListing/details/_attributes.html.twig' %}
+
+ {% include 'Context/Vendor/ProductListing/details/_media.html.twig' %}
+
+{% endblock %}
+
+{% set event_prefix = metadata.applicationName ~ '.vendor.' ~ metadata.name ~ '.create' %}
+{% block stylesheets %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.create.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_attributes.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_attributes.html.twig
new file mode 100644
index 0000000..4be934e
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_attributes.html.twig
@@ -0,0 +1,49 @@
+{% import '@SyliusUi/Macro/flags.html.twig' as flags %}
+
+
+
+ {% if productDraft.attributes|length == 0 %}
+ {{ 'open_marketplace.ui.no_draft_attributes'|trans }}
+ {% else %}
+
+ {% for locale in setLocales %}
+ {% set data_tab = (locale is not null ? locale|sylius_locale_name : 'non-translatable') %}
+
+
+
+ {% for attributeValue in productDraft.attributes|filter(attributeValue => attributeValue.localeCode == locale) %}
+
+
+ {{ attributeValue.name }}
+
+
+ {% include [
+ '@SyliusAdmin/Product/Show/Types/' ~ attributeValue.type ~ '.html.twig',
+ '@SyliusAttribute/Types/' ~ attributeValue.type ~ '.html.twig',
+ '@SyliusAdmin/Product/Show/Types/default.html.twig'
+ ] with {
+ 'attribute': attributeValue
+ } %}
+
+
+ {% endfor %}
+
+
+
+ {% endfor %}
+ {% endif %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_media.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_media.html.twig
new file mode 100644
index 0000000..a82ccce
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_media.html.twig
@@ -0,0 +1,27 @@
+{% if productDraft.images|length == 0 %}
+
+{% else %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_moreDetails.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_moreDetails.html.twig
new file mode 100644
index 0000000..5bc8c57
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_moreDetails.html.twig
@@ -0,0 +1,42 @@
+
+
+
+ {% for translation in productDraft.translations %}
+
+
+
+ {{ translation.locale|sylius_locale_name }}
+
+
+
+
+
+ {{ 'sylius.ui.name'|trans }}
+ {{ translation.name }}
+
+
+ {{ 'sylius.ui.slug'|trans }}
+ {{ translation.slug }}
+
+
+ {{ 'sylius.ui.description'|trans }}
+ {{ translation.description|nl2br }}
+
+
+ {{ 'sylius.ui.meta_keywords'|trans }}
+ {{ translation.metaKeywords }}
+
+
+ {{ 'sylius.ui.meta_description'|trans }}
+ {{ translation.metaDescription }}
+
+
+ {{ 'sylius.ui.short_description'|trans }}
+ {{ translation.shortDescription }}
+
+
+
+
+ {% endfor %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_shipping.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_shipping.html.twig
new file mode 100644
index 0000000..93fe8eb
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_shipping.html.twig
@@ -0,0 +1,31 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+
+
+
+
+
+
+ {{ 'open_marketplace.ui.is_shipping_required'|trans }}
+
+ {% if productDraft.shippingRequired %}
+ {{ 'open_marketplace.ui.yes'|trans }}
+ {% else %}
+ {{ 'open_marketplace.ui.no'|trans }}
+ {% endif %}
+
+
+
+ {{ 'open_marketplace.ui.shipping_category'|trans }}
+
+ {% if productDraft.shippingCategory %}
+ {{ productDraft.shippingCategory.name }}
+ {% else %}
+ {{ 'open_marketplace.ui.none'|trans }}
+ {% endif %}
+
+
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_taxons.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_taxons.html.twig
new file mode 100644
index 0000000..a992dad
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/details/_taxons.html.twig
@@ -0,0 +1,29 @@
+
+
+
+ {% if productDraft.mainTaxon == null and productDraft.productDraftTaxons|length == 0 %}
+ {{ 'open_marketplace.ui.no_draft_taxons'|trans }}
+ {% else %}
+
+
+ {% if productDraft.mainTaxon != null %}
+
+ {{ 'sylius.ui.main_taxon'|trans }}
+ {{ productDraft.mainTaxon.getFullName }}
+
+ {% endif %}
+
+ {{ 'sylius.ui.product_taxons'|trans }}
+
+
+ {% for productDraftTaxon in productDraft.productDraftTaxons %}
+ {{ productDraftTaxon.getTaxon.getFullName }}
+ {% endfor %}
+
+
+
+
+
+ {% endif %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/form/_attributeChoice.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/_attributeChoice.html.twig
new file mode 100644
index 0000000..33416ae
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/_attributeChoice.html.twig
@@ -0,0 +1,6 @@
+
+ {{ form_widget(form, {'attr': {'class': 'ui fluid search dropdown', 'id': 'sylius_product_attribute_choice'}}) }}
+
+ {{ 'sylius.ui.add_attributes'|trans }}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/form/_images.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/_images.html.twig
new file mode 100644
index 0000000..3119103
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/_images.html.twig
@@ -0,0 +1,10 @@
+{% form_theme form 'Context/Vendor/ProductListing/form/theme/image_theme.html.twig' %}
+
+
+
+
{{ 'sylius.ui.media'|trans }}
+
+
+
{{ form_row(form.images, {'label': false}) }}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/form/attributeValues.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/attributeValues.html.twig
new file mode 100644
index 0000000..2f07c49
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/attributeValues.html.twig
@@ -0,0 +1,83 @@
+{% import _self as self %}
+{% import '@SyliusUi/Macro/flags.html.twig' as flags %}
+
+{% set subject = 'product' %}
+
+{% for code, localeCodes in forms %}
+
+
+
+ {% for localeCode, form in localeCodes %}
+
+ {% set id = form.vars.label|replace({' ': '_'})|lower %}
+
+
+
+ {% if localeCode %}
+ {{ flags.fromLocaleCode(localeCode) }}
+ {% else %}
+
+ {% endif %}
+ {{ form.vars.label }}
+
+
+
+
+
+
+
+ {% set count = count + 1 %}
+
+ {% endfor %}
+
+
+{% endfor %}
+
+{% macro formField(item, count, id, prefix, subject, applicationName) %}
+ {% from _self import formField %}
+ {% if item.children|length > 0 %}
+ {% set prefix = prefix ~ '_' ~ item.vars.name %}
+ {% for child in item.children %}
+ {{ formField(child, count, id, prefix, subject, applicationName) }}
+ {% endfor %}
+ {% elseif item.vars.name != '_token' %}
+ {% set namePrefix = prefix|replace({'_': ']['}) %}
+ {% set dataName = applicationName ~ '_' ~ subject ~ '[attributes][' ~ count~namePrefix ~ '][' ~ item.vars.name ~ ']' %}
+ {% if item.vars.multiple is defined and item.vars.multiple %}
+ {% set dataName = dataName ~ '[]' %}
+ {% endif %}
+
+ {{ form_widget(item, {'id': id, 'attr': {'data-name': dataName }}) }}
+ {% endif %}
+{% endmacro %}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/form/theme/form_theme.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/theme/form_theme.html.twig
new file mode 100644
index 0000000..73a2d11
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/theme/form_theme.html.twig
@@ -0,0 +1,130 @@
+{% extends '@SyliusUi/Form/theme.html.twig' %}
+
+{% block collection_widget -%}
+ {% from '@SyliusResource/Macros/notification.html.twig' import error %}
+ {% import _self as self %}
+ {% set attr = attr|merge({'class': attr.class|default ~ ' controls collection-widget'}) %}
+
+ {% apply spaceless %}
+
+ {{ error(form.vars.errors) }}
+
+ {% if prototypes|default is iterable %}
+ {% for key, subPrototype in prototypes %}
+
+ {% endfor %}
+ {% endif %}
+
+
+ {% for child in form %}
+ {{ self.collection_item(child, allow_delete, button_delete_label, loop.index0) }}
+ {% endfor %}
+
+
+ {% if prototype is defined and allow_add %}
+
+
+ {{ button_add_label|trans }}
+
+ {% endif %}
+
+ {% endapply %}
+{%- endblock collection_widget %}
+
+{% macro collection_item(form, allow_delete, button_delete_label, index) %}
+ {% apply spaceless %}
+
+ {% endapply %}
+{% endmacro %}
+
+{% block sylius_product_image_widget %}
+ {% apply spaceless %}
+ {{ form_row(form.type) }}
+ {{ 'sylius.ui.choose_file'|trans }}
+ {% if form.vars.value.path|default(null) is not null %}
+
+ {% endif %}
+
+ {{ form_widget(form.file) }}
+
+
+ {{- form_errors(form.file) -}}
+
+{# {% if product.id is not null and 0 != product.variants|length and not product.simple %}#}
+{# {{ form_row(form.productVariants) }}#}
+{# {% endif %}#}
+ {% endapply %}
+{% endblock %}
+
+{% block sylius_taxon_image_widget %}
+ {% apply spaceless %}
+ {{ form_row(form.type) }}
+ {% if form.vars.value.path|default(null) is null %}
+ {{ 'sylius.ui.choose_file'|trans }}
+ {% else %}
+
+ {{ 'sylius.ui.change_file'|trans }}
+ {% endif %}
+
+ {{ form_widget(form.file) }}
+
+
+ {{- form_errors(form.file) -}}
+
+ {% endapply %}
+{% endblock %}
+
+{% block sylius_avatar_image_widget %}
+ {% apply spaceless %}
+ {% if form.vars.value.path|default(null) is not null %}
+
+ {% endif %}
+
+ {{ form_widget(form.file) }}
+
+
+ {{ 'sylius.ui.choose_file'|trans }}
+
+
+ {{- form_errors(form.file) -}}
+
+ {% endapply %}
+{% endblock %}
+
+{% block sylius_image_widget %}
+ {% apply spaceless %}
+ {{ form_row(form.type) }}
+ {{ 'sylius.ui.choose_file'|trans }}
+ {% if form.vars.value.path|default(null) is not null %}
+
+ {% endif %}
+
+ {{ form_widget(form.file) }}
+
+
+ {{- form_errors(form.file) -}}
+
+ {% endapply %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/form/theme/image_theme.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/theme/image_theme.html.twig
new file mode 100644
index 0000000..c58e6da
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/form/theme/image_theme.html.twig
@@ -0,0 +1,5 @@
+{% extends 'Context/Vendor/ProductListing/form/theme/form_theme.html.twig' %}
+
+{% block sylius_product_image_widget %}
+ {{ block('sylius_image_widget') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/index.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/index.html.twig
new file mode 100644
index 0000000..397dbf4
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/index.html.twig
@@ -0,0 +1,23 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'open_marketplace.ui.product_list'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.product_list'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.product_listings',
+ "subheader": 'open_marketplace.ui.manage_products',
+ "icon": 'list',
+ "buttons": "Context/Vendor/ProductListing/_menu.html.twig",
+ "buttonsData": {
+ "definition": resources.definition,
+ "data": resources.data,
+ "grid": resources,
+ },
+ } %}
+ {{ sylius_grid_render(resources, 'Context/Vendor/ProductListing/_productListings.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductListing/update.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductListing/update.html.twig
new file mode 100644
index 0000000..623f4af
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductListing/update.html.twig
@@ -0,0 +1,31 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.edit_'~metadata.name) %}
+{% set event_prefix = metadata.applicationName ~ '.vendor.' ~ metadata.name ~ '.create' %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% form_theme form '@SyliusAdmin/Form/theme.html.twig' %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.product_list'|trans }}
+ /
+ {{ 'sylius.ui.edit'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {{ include('Context/Vendor/ProductListing/_form.html.twig', {"editMode": true}) }}
+{% endblock %}
+
+{% block stylesheets %}
+ {{ parent() }}
+
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.create.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ encore_entry_script_tags('admin-entry', null, 'admin') }}
+{% endblock %}
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductReviews/_author.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductReviews/_author.html.twig
new file mode 100644
index 0000000..b34cc71
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductReviews/_author.html.twig
@@ -0,0 +1,28 @@
+{% set author = product_review.author %}
+
+
+
+ {% if is_vendor_client(product_review.reviewSubject.vendor, author) is same as true %}
+
+ {% else %}
+
+ {% endif %}
+
+ {{ 'sylius.ui.customer_since'|trans }} {{ author.createdAt|format_date }}.
+
+
+
+ {% if author.phoneNumber is not empty %}
+
+ {% endif %}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductReviews/_product.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductReviews/_product.html.twig
new file mode 100644
index 0000000..1a1be44
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductReviews/_product.html.twig
@@ -0,0 +1,8 @@
+{% set product = product_review.reviewSubject %}
+
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductReviews/index.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductReviews/index.html.twig
new file mode 100644
index 0000000..456deaa
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductReviews/index.html.twig
@@ -0,0 +1,18 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.product_reviews'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.product_reviews'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.product_reviews',
+ "subheader": 'open_marketplace.ui.manage_product_reviews',
+ "icon": 'star'
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusAdmin/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ProductReviews/update.html.twig b/OpenMarketplace/templates/Context/Vendor/ProductReviews/update.html.twig
new file mode 100644
index 0000000..a0233ec
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ProductReviews/update.html.twig
@@ -0,0 +1,44 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.edit_'~metadata.name) %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.product_reviews'|trans }}
+ /
+ {{ resource.id }}
+ /
+ {{ 'sylius.ui.edit'|trans }}
+{% endblock %}
+
+{% form_theme form '@SyliusUi/Form/theme.html.twig' %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.edit_product_review',
+ "icon": 'star'
+ } %}
+
+
+ {{ form_start(form, { 'attr': {'class': 'ui form'}}) }}
+
+
+
+ {{ form_errors(form) }}
+ {{ form_row(form.title) }}
+ {{ form_row(form.comment) }}
+
+
+ {{ 'sylius.ui.save_changes'|trans }}
+
+
+
+ {% include 'Context/Vendor/ProductReviews/_product.html.twig' %}
+ {% include 'Context/Vendor/ProductReviews/_author.html.twig' %}
+
+
+ {{ form_end(form) }}
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Profile/_menu.html.twig b/OpenMarketplace/templates/Context/Vendor/Profile/_menu.html.twig
new file mode 100644
index 0000000..64aed2d
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Profile/_menu.html.twig
@@ -0,0 +1,8 @@
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Profile/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Profile/index.html.twig
new file mode 100644
index 0000000..0ec1a37
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Profile/index.html.twig
@@ -0,0 +1,75 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.my_account'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.profile'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.my_vendor_account',
+ "subheader": 'open_marketplace.ui.manage_your_vendor_information_and_preferences',
+ "icon": 'user',
+ "buttons": "Context/Vendor/Profile/_menu.html.twig"
+ } %}
+
+
+
+ {{ sylius_template_event('sylius.shop.account.dashboard.after_content_header', {'vendor': vendor}) }}
+
+
+ {{ sylius_template_event('sylius.shop.account.dashboard.after_information', {'vendor': vendor}) }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Profile/update.html.twig b/OpenMarketplace/templates/Context/Vendor/Profile/update.html.twig
new file mode 100644
index 0000000..a345608
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Profile/update.html.twig
@@ -0,0 +1,55 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.your_profile'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.profile'|trans }}
+ /
+ {{ 'sylius.ui.edit'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.your_vendor_profile',
+ "subheader": 'open_marketplace.ui.edit_your_vendor_information',
+ "icon": 'user',
+ } %}
+
+
+ {{ form_start(form, {'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+ {{ form_row(form.companyName, sylius_test_form_attribute('companyName')) }}
+ {{ form_row(form.taxIdentifier) }}
+ {{ form_row(form.bankAccountNumber) }}
+ {{ form_row(form.phoneNumber) }}
+
+
+ {% form_theme form 'Context/Vendor/ProductListing/form/theme/image_theme.html.twig' %}
+ {{ 'sylius.ui.image'|trans }}
+ {{ form_row(form.image, {'label': false}) }}
+
+
+
+ {% form_theme form 'Context/Vendor/ProductListing/form/theme/image_theme.html.twig' %}
+ {{ 'open_marketplace.ui.background'|trans }}
+ {{ form_row(form.backgroundImage, {'label': false}) }}
+
+
+ {{ form_row(form.description) }}
+ {{ form_row(form.vendorAddress) }}
+
+ {{ sylius_template_event('sylius.shop.account.profile.update.form', {'vendor': vendor, 'form': form}) }}
+
+
{{ 'sylius.ui.save_changes'|trans }}
+ {{ form_row(form._token) }}
+ {{ form_end(form, {'render_rest': false}) }}
+
+{% endblock %}
+
+{% block javascripts %}
+ {{ parent() }}
+
+{% endblock %}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Register/_form.html.twig b/OpenMarketplace/templates/Context/Vendor/Register/_form.html.twig
new file mode 100644
index 0000000..c563fdf
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Register/_form.html.twig
@@ -0,0 +1,33 @@
+
+ {{ sylius_template_event('sylius.shop.register.before_form') }}
+
+ {{ form_start(form, {'action': path('open_marketplace_vendor_register_form'), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate'}}) }}
+
+ {{ form_row(form.companyName, sylius_test_form_attribute('companyName')) }}
+ {{ form_row(form.taxIdentifier) }}
+ {{ form_row(form.bankAccountNumber) }}
+ {{ form_row(form.phoneNumber) }}
+
+ {% form_theme form 'Context/Vendor/ProductListing/form/theme/image_theme.html.twig' %}
+ {{ 'sylius.ui.image'|trans }}
+ {{ form_row(form.image, {'label': false}) }}
+
+
+
+ {% form_theme form 'Context/Vendor/ProductListing/form/theme/image_theme.html.twig' %}
+ {{ 'open_marketplace.ui.background'|trans }}
+ {{ form_row(form.backgroundImage, {'label': false}) }}
+
+
+ {{ form_row(form.description) }}
+ {{ form_row(form.vendorAddress) }}
+
+ {{ sylius_template_event('sylius.shop.register.form', {'form': form}) }}
+
+
+ {{ 'open_marketplace.ui.become_a_vendor'|trans }}
+
+
+ {{ form_row(form._token) }}
+ {{ form_end(form, {'render_rest': false}) }}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Register/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Register/index.html.twig
new file mode 100644
index 0000000..430ed57
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Register/index.html.twig
@@ -0,0 +1,18 @@
+{% extends "@SyliusShop/Account/dashboard.html.twig" %}
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+{% block subcontent %}
+ {% if null == app.user.vendor %}
+ {{ include('Context/Vendor/Register/_form.html.twig') }}
+ {% elseif app.user.vendor.verified %}
+ {% set vars = {messageTranslationKey: 'open_marketplace.ui.vendor_verification_accepted'} %}
+ {% include 'Context/Vendor/_Alert/infoMessage.html.twig' with vars %}
+ {% else %}
+ {% set vars = {messageTranslationKey: 'open_marketplace.ui.vendor_under_verification'} %}
+ {% include 'Context/Vendor/_Alert/infoMessage.html.twig' with vars %}
+ {% endif %}
+{% endblock %}
+
+{% block javascripts %}
+ {{ parent() }}
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Settlement/_form.html.twig b/OpenMarketplace/templates/Context/Vendor/Settlement/_form.html.twig
new file mode 100644
index 0000000..b9b8328
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Settlement/_form.html.twig
@@ -0,0 +1,29 @@
+{% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.virtual_wallets',
+ "subheader": 'open_marketplace.ui.manage_your_wallets',
+ "icon": 'credit card'
+} %}
+
+{{ form_start(form, { 'attr': {'class': 'ui form dirtylisten'}}) }}
+{% include '@SyliusAdmin/Crud/form_validation_errors_checker.html.twig' %}
+
+ {{ form_errors(form) }}
+
+
+
+
+
+ {% set balance = bitbag_open_marketplace_settlement_virtual_wallet_balance_by_channel(channel)%}
+ {{ "open_marketplace.ui.virtual_wallet_balance"|trans }} :
+ {{ balance|sylius_format_money(channel.baseCurrency.code, sylius_base_locale) }}
+
+
+
+ {{ form_row(form.totalAmount) }}
+
+
+ {{ form_widget(form.save) }}
+ {{ form_row(form._token) }}
+
+
+{{ form_end(form, {'render_rest': true}) }}
diff --git a/OpenMarketplace/templates/Context/Vendor/Settlement/_menu.html.twig b/OpenMarketplace/templates/Context/Vendor/Settlement/_menu.html.twig
new file mode 100644
index 0000000..f67ab27
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Settlement/_menu.html.twig
@@ -0,0 +1,10 @@
+
diff --git a/OpenMarketplace/templates/Context/Vendor/Settlement/create.html.twig b/OpenMarketplace/templates/Context/Vendor/Settlement/create.html.twig
new file mode 100644
index 0000000..93ad65c
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Settlement/create.html.twig
@@ -0,0 +1,33 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+
+{% set header = configuration.vars.header|default(metadata.applicationName~'.ui.new_'~metadata.name) %}
+{% set event_prefix = metadata.applicationName ~ '.vendor.' ~ metadata.name ~ '.create' %}
+
+{% block title %}{{ header|trans }} {{ parent() }}{% endblock %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+{% block breadcrumb %}
+
+{% endblock %}
+
+{% block subcontent %}
+ {{ include('Context/Vendor/Settlement/_form.html.twig') }}
+{% endblock %}
+
+{% block stylesheets %}
+ {{ parent() }}
+ {{ sylius_template_event([event_prefix ~ '.stylesheets', 'sylius.admin.create.stylesheets'], { 'metadata': metadata }) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ encore_entry_script_tags('admin-entry', null, 'admin') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/Settlement/index.html.twig b/OpenMarketplace/templates/Context/Vendor/Settlement/index.html.twig
new file mode 100644
index 0000000..a78adbb
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/Settlement/index.html.twig
@@ -0,0 +1,19 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'open_marketplace.ui.settlements'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.settlements'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.settlements',
+ "subheader": 'open_marketplace.ui.manage_your_finances',
+ "icon": 'money',
+ "buttons": 'Context/Vendor/Settlement/_menu.html.twig',
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusShop/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/ShippingMethods/index.html.twig b/OpenMarketplace/templates/Context/Vendor/ShippingMethods/index.html.twig
new file mode 100644
index 0000000..ba61f2f
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/ShippingMethods/index.html.twig
@@ -0,0 +1,45 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.your_profile'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'sylius.ui.shipping_method'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.shipping_methods',
+ "subheader": 'open_marketplace.ui.manage_shipping_methods',
+ "icon": 'shipping',
+ } %}
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/VendorPage/_main.html.twig b/OpenMarketplace/templates/Context/Vendor/VendorPage/_main.html.twig
new file mode 100644
index 0000000..94b7624
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/VendorPage/_main.html.twig
@@ -0,0 +1,23 @@
+{% import '@SyliusUi/Macro/messages.html.twig' as messages %}
+{% import '@SyliusUi/Macro/pagination.html.twig' as pagination %}
+
+{{ sylius_template_event('open_marketplace.shop.product.index.search', _context) }}
+
+
+
+{{ sylius_template_event('sylius.shop.product.index.before_list', {'products': resources.data}) }}
+
+{% if resources.data|length > 0 %}
+
+ {% for product in resources.data %}
+ {% include '@SyliusShop/Product/_box.html.twig' %}
+ {% endfor %}
+
+
+
+ {{ sylius_template_event('sylius.shop.product.index.before_pagination', {'products': resources.data}) }}
+
+ {{ pagination.simple(resources.data) }}
+{% else %}
+ {{ messages.info('sylius.ui.no_results_to_display') }}
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Vendor/VendorPage/_search.html.twig b/OpenMarketplace/templates/Context/Vendor/VendorPage/_search.html.twig
new file mode 100644
index 0000000..183f255
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/VendorPage/_search.html.twig
@@ -0,0 +1,24 @@
+{% if app.request.attributes.get('slug') is null %}
+{% set slug = get_channel_main_taxon().slug %}
+{% else %}
+{% set slug = app.request.attributes.get('slug') %}
+{% endif %}
+
diff --git a/OpenMarketplace/templates/Context/Vendor/VendorPage/_sidebar.html.twig b/OpenMarketplace/templates/Context/Vendor/VendorPage/_sidebar.html.twig
new file mode 100644
index 0000000..4774ce2
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/VendorPage/_sidebar.html.twig
@@ -0,0 +1,14 @@
+{% if app.request.attributes.get('slug') is null %}
+ {% set slug = get_channel_main_taxon().slug %}
+ {{ render(url('open_marketplace_shop_vendor_page_partial_taxon_show_by_slug', {
+ 'vendor_slug': app.request.attributes.get('vendor_slug'),
+ 'slug': slug,
+ 'template': 'Context/Vendor/VendorPage/_verticalMenu.html.twig'
+ })) }}
+{% else %}
+ {{ render(url('open_marketplace_shop_vendor_page_partial_taxon_show_by_slug', {
+ 'vendor_slug': app.request.attributes.get('vendor_slug'),
+ 'slug': app.request.attributes.get('slug'),
+ 'template': 'Context/Vendor/VendorPage/_verticalMenu.html.twig'
+ })) }}
+{% endif %}
diff --git a/OpenMarketplace/templates/Context/Vendor/VendorPage/_verticalMenu.html.twig b/OpenMarketplace/templates/Context/Vendor/VendorPage/_verticalMenu.html.twig
new file mode 100644
index 0000000..7475dcb
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/VendorPage/_verticalMenu.html.twig
@@ -0,0 +1,15 @@
+{{ sylius_template_event('sylius.shop.product.index.before_vertical_menu', {'taxon': taxon}) }}
+
+
+
+{{ sylius_template_event('sylius.shop.product.index.after_vertical_menu', {'taxon': taxon}) }}
diff --git a/OpenMarketplace/templates/Context/Vendor/VendorPage/index.html.twig b/OpenMarketplace/templates/Context/Vendor/VendorPage/index.html.twig
new file mode 100644
index 0000000..ba14e57
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/VendorPage/index.html.twig
@@ -0,0 +1,55 @@
+{% extends '@SyliusShop/layout.html.twig' %}
+
+{% set reviewsCount = 0 %}
+{% set vendor = products.definition.driverConfiguration.repository.arguments.vendor %}
+
+{% block content %}
+
+
+
+ {% if vendor.getBackgroundImage is not null %}
+
+ {% endif %}
+
+
+ {% if vendor.getImage is not null %}
+
+
+
+ {% endif %}
+
{{ vendor.companyName }}
+
+
+
+
+
+
{{ vendor.getAverageRatingData()['reviewsCount'] }}
+ {% if vendor.getAverageRatingData()['reviewsCount'] == 1 %}
+
{{ 'open_marketplace.ui.review'|trans }}
+ {% else %}
+
{{ 'sylius.ui.reviews'|trans }}
+ {% endif %}
+
+
+
+
+
+
+
+
+
+
{{ vendor.description}}
+
+
+
+ {% include 'Context/Vendor/VendorPage/_sidebar.html.twig' %}
+
+
+ {% include 'Context/Vendor/VendorPage/_main.html.twig' %}
+
+
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/VirtualWallet/index.html.twig b/OpenMarketplace/templates/Context/Vendor/VirtualWallet/index.html.twig
new file mode 100644
index 0000000..913a397
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/VirtualWallet/index.html.twig
@@ -0,0 +1,18 @@
+{% extends '@SyliusShop/Account/layout.html.twig' %}
+{% use 'Context/Vendor/Common/_breadcrumb.html.twig' %}
+
+{% block title %}{{ 'open_marketplace.ui.virtual_wallets'|trans }} | {{ parent() }}{% endblock %}
+
+{% block breadcrumb_page %}
+ {{ 'open_marketplace.ui.virtual_wallets'|trans }}
+{% endblock %}
+
+{% block subcontent %}
+ {% include "Context/Vendor/_header.html.twig" with {
+ "header": 'open_marketplace.ui.virtual_wallets',
+ "subheader": 'open_marketplace.ui.manage_your_wallets',
+ "icon": 'credit card',
+ } %}
+
+ {{ sylius_grid_render(resources, '@SyliusShop/Grid/_default.html.twig') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/Context/Vendor/_Alert/infoMessage.html.twig b/OpenMarketplace/templates/Context/Vendor/_Alert/infoMessage.html.twig
new file mode 100644
index 0000000..858dc28
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/_Alert/infoMessage.html.twig
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+ {{ messageTranslationKey |trans }}
+
+
+
+
diff --git a/OpenMarketplace/templates/Context/Vendor/_header.html.twig b/OpenMarketplace/templates/Context/Vendor/_header.html.twig
new file mode 100644
index 0000000..45aeef9
--- /dev/null
+++ b/OpenMarketplace/templates/Context/Vendor/_header.html.twig
@@ -0,0 +1,23 @@
+
+
+
+
+
+ {% if buttons is defined %}
+ {% if buttonsData is not defined %}
+ {% set buttonsData = {} %}
+ {% endif %}
+
+ {% include buttons with buttonsData %}
+ {% endif %}
+
+
+
diff --git a/OpenMarketplace/templates/bundles/BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig b/OpenMarketplace/templates/bundles/BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig
new file mode 100644
index 0000000..2f88d4c
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig
@@ -0,0 +1,65 @@
+{% if app.user %}
+ {% if findAllByShopUserAndToken(app.user)|length < 2 %}
+
+
+ {{ 'bitbag_sylius_wishlist_plugin.ui.add_to_wishlist'|trans }}
+
+ {% else %}
+
+
+ Add to wishlist
+
+
+ {% endif %}
+{% else %}
+ {% if findAllByAnonymousAndChannel(sylius.channel)|length < 2 %}
+
+
+ {{ 'bitbag_sylius_wishlist_plugin.ui.add_to_wishlist'|trans }}
+
+ {% else %}
+
+
+ Add to wishlist
+
+
+ {% endif %}
+{% endif %}
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig
new file mode 100644
index 0000000..68e7612
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Layout/_logo.html.twig
@@ -0,0 +1,5 @@
+
+
+
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/Order/Show/Summary/_totals.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Order/Show/Summary/_totals.html.twig
new file mode 100644
index 0000000..78167f1
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Order/Show/Summary/_totals.html.twig
@@ -0,0 +1,96 @@
+{% import "@SyliusAdmin/Common/Macro/money.html.twig" as money %}
+
+{% set orderShippingPromotionAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::ORDER_SHIPPING_PROMOTION_ADJUSTMENT') %}
+{% set shippingAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::SHIPPING_ADJUSTMENT') %}
+{% set taxAdjustment = constant('Sylius\\Component\\Core\\Model\\AdjustmentInterface::TAX_ADJUSTMENT') %}
+
+{% set orderShippingPromotions = sylius_aggregate_adjustments(order.getAdjustmentsRecursively(orderShippingPromotionAdjustment)) %}
+
+
+
+
+ {{ 'sylius.ui.tax_total'|trans }} :
+ {{ money.format(order.taxTotal, order.currencyCode) }}
+
+
+ {{ 'sylius.ui.items_total'|trans }} :
+ {{ money.format(order.itemsTotal, order.currencyCode) }}
+
+
+
+
+
+ {{ 'open_marketplace.ui.commission'|trans }} ({{ 'sylius.ui.included_in_price'|trans }})
+
+
+ {{ 'open_marketplace.ui.commission'|trans }} :
+ {{ money.format(order.commissionTotal, order.currencyCode) }}
+
+
+
+
+
+ {% if not order.adjustments(shippingAdjustment).isEmpty() %}
+
+
{{ 'sylius.ui.shipping'|trans }}:
+ {% for shipment in order.shipments %}
+ {% for adjustment in shipment.adjustments(shippingAdjustment) %}
+
+
{{ money.format(adjustment.amount, order.currencyCode) }}
+
+
+ {{ adjustment.label }} :
+
+
+
+ {% endfor %}
+
+ {% for adjustment in shipment.adjustments(taxAdjustment) %}
+
+
+ {{ money.format(adjustment.amount, order.currencyCode) }}
+ {% if adjustment.isNeutral %}
+ ({{ 'sylius.ui.included_in_price'|trans }})
+ {% endif %}
+
+
+
+ {{ adjustment.label }} :
+
+
+
+ {% endfor %}
+ {% endfor %}
+
+ {% else %}
+ {{ 'sylius.ui.no_shipping_charges'|trans }}
+ {% endif %}
+
+ {% if not orderShippingPromotions is empty %}
+
+
+
{{ 'sylius.ui.shipping_discount'|trans }}:
+ {% for label, amount in orderShippingPromotions %}
+
+
+ {{ money.format(amount, order.currencyCode) }}
+
+
+ {% endfor %}
+
+
+ {% endif %}
+
+ {{ 'sylius.ui.shipping_total'|trans }} :
+ {{ money.format(order.shippingTotal, order.currencyCode) }}
+
+
+
+{% include '@SyliusAdmin/Order/Show/Summary/_totalsPromotions.html.twig' %}
+
+
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/Security/_content.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Security/_content.html.twig
new file mode 100644
index 0000000..ce17621
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Security/_content.html.twig
@@ -0,0 +1,6 @@
+{% include '@SyliusUi/Security/_login.html.twig'
+ with {
+ 'action': path('sylius_admin_login_check'),
+ 'paths': {'logo': asset('build/admin/images/logo.png', 'admin')}
+}
+%}
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/Security/login.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Security/login.html.twig
new file mode 100644
index 0000000..5239937
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/Security/login.html.twig
@@ -0,0 +1,15 @@
+{% extends '@SyliusUi/Layout/centered.html.twig' %}
+
+{% block title %}BitBag Open Marketplace | {{ 'sylius.ui.administration_panel_login'|trans }}{% endblock %}
+
+{% block stylesheets %}
+ {{ sylius_template_event('sylius.admin.layout.stylesheets') }}
+{% endblock %}
+
+{% block content %}
+ {{ sylius_template_event('sylius.admin.login.content', _context) }}
+{% endblock %}
+
+{% block javascripts %}
+ {{ sylius_template_event('sylius.admin.layout.javascripts') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/_scripts.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/_scripts.html.twig
new file mode 100644
index 0000000..77e26d2
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/_scripts.html.twig
@@ -0,0 +1,3 @@
+{{ encore_entry_script_tags('admin-entry', null, 'admin') }}
+{{ encore_entry_script_tags('bitbag-cms-admin', null, 'cms_admin') }}
+{{ encore_entry_script_tags('bitbag-wishlist-admin', null, 'wishlist_admin') }}
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/_styles.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/_styles.html.twig
new file mode 100644
index 0000000..12e5e3f
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/_styles.html.twig
@@ -0,0 +1,3 @@
+{{ encore_entry_link_tags('admin-entry', null, 'admin') }}
+{{ encore_entry_link_tags('bitbag-cms-admin', null, 'cms_admin') }}
+{{ encore_entry_link_tags('bitbag-wishlist-admin', null, 'wishlist_admin') }}
diff --git a/OpenMarketplace/templates/bundles/SyliusAdminBundle/layout.html.twig b/OpenMarketplace/templates/bundles/SyliusAdminBundle/layout.html.twig
new file mode 100644
index 0000000..266cc75
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusAdminBundle/layout.html.twig
@@ -0,0 +1,39 @@
+{% extends '@SyliusUi/Layout/sidebar.html.twig' %}
+
+{% block title %} | BitBag OpenMarketplace{% endblock %}
+
+{% block metatags %}
+
+{% endblock %}
+
+{% block stylesheets %}
+ {{ sylius_template_event('sylius.admin.layout.stylesheets') }}
+{% endblock %}
+
+{% block flash_messages %}
+ {% include '@SyliusAdmin/_flashes.html.twig' %}
+{% endblock %}
+
+{% block topbar %}
+ {{ sylius_template_event('sylius.admin.layout.topbar_left') }}
+
+
+
+ {{ sylius_template_event('sylius.admin.layout.topbar_middle') }}
+
+
+
+ {{ sylius_template_event('sylius.admin.layout.topbar_right') }}
+{% endblock %}
+
+{% block sidebar %}
+ {{ sylius_template_event('sylius.admin.layout.sidebar') }}
+{% endblock %}
+
+{% block footer %}
+ {{ 'sylius.ui.powered_by'|trans }} Sylius v{{ sylius_meta.version }} . {{ 'sylius.ui.see_issue'|trans }}? {{ 'sylius.ui.report_it'|trans }}!
+{% endblock %}
+
+{% block javascripts %}
+ {{ sylius_template_event('sylius.admin.layout.javascripts') }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/bundles/SyliusCoreBundle/Email/Blocks/OrderConfirmation/_content.html.twig b/OpenMarketplace/templates/bundles/SyliusCoreBundle/Email/Blocks/OrderConfirmation/_content.html.twig
new file mode 100644
index 0000000..11b63db
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusCoreBundle/Email/Blocks/OrderConfirmation/_content.html.twig
@@ -0,0 +1,33 @@
+
+ {{ 'sylius.email.order_confirmation.your_order_number'|trans({}, null, localeCode) }}
+
+ {% if order.primary %}
+ {% for suborder in order.secondaryOrders %}
+
+ {{ suborder.number }}
+
+ {% endfor %}
+ {% else %}
+
+ {{ order.number }}
+
+ {% endif %}
+
+
+ {{ 'sylius.email.order_confirmation.has_been_successfully_placed'|trans({}, null, localeCode) }}
+
+
+{% if sylius_bundle_loaded_checker('SyliusShopBundle') %}
+ {% set url = channel.hostname is not null ? 'http://' ~ channel.hostname ~ path('sylius_shop_order_show', {'tokenValue': order.tokenValue, '_locale': localeCode}) : url('sylius_shop_order_show', {'tokenValue': order.tokenValue, '_locale': localeCode}) %}
+
+
+{% endif %}
+
+
+ {{ 'sylius.email.order_confirmation.thank_you'|trans({}, null, localeCode) }}
+
diff --git a/OpenMarketplace/templates/bundles/SyliusCoreBundle/Email/layout.html.twig b/OpenMarketplace/templates/bundles/SyliusCoreBundle/Email/layout.html.twig
new file mode 100644
index 0000000..824d9c4
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusCoreBundle/Email/layout.html.twig
@@ -0,0 +1,28 @@
+{% block body %}
+ {% autoescape false %}
+ {% set logo = channel.hostname is not null ? 'http://' ~ channel.hostname ~ asset('open-marketplace-logo.png') : absolute_url(asset('open-marketplace-logo.png')) %}
+
+
+
+
+ {% if sylius_bundle_loaded_checker('SyliusShopBundle') %}
+ {% set url = channel.hostname is not null ? 'http://' ~ channel.hostname ~ path('sylius_shop_homepage', {'_locale': localeCode}) : url('sylius_shop_homepage', {'_locale': localeCode}) %}
+
+
+
+ {% else %}
+
+ {% endif %}
+
+
+
+ {% block content %}{% endblock %}
+
+
+
+
+
+ {% endautoescape %}
+{% endblock %}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Account/Order/Show/_header.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Account/Order/Show/_header.html.twig
new file mode 100644
index 0000000..a1a438b
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Account/Order/Show/_header.html.twig
@@ -0,0 +1,29 @@
+{% import '@SyliusUi/Macro/buttons.html.twig' as buttons %}
+{% import '@SyliusUi/Macro/flags.html.twig' as flags %}
+
+
+
+{% if order.paymentState in ['awaiting_payment'] %}
+ {{ buttons.default(path('sylius_shop_order_show', {'tokenValue': order.primaryOrder.tokenValue}), 'sylius.ui.pay', null, 'credit card alternative', 'fluid blue') }}
+{% endif %}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Cart/Summary/_items.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Cart/Summary/_items.html.twig
new file mode 100644
index 0000000..66b17ef
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Cart/Summary/_items.html.twig
@@ -0,0 +1,34 @@
+
+ {{ form_start(form, {'action': path('sylius_shop_cart_save'), 'attr': {'class': 'ui loadable form', 'novalidate': 'novalidate', 'id': form.vars.id}}) }}
+ {{ form_errors(form) }}
+
+ {{ form_row(form._token) }}
+ {{ form_end(form, {'render_rest': false}) }}
+
+ {{ sylius_template_event('sylius.shop.cart.summary.items', {'cart': cart, 'form': form}) }}
+
+
+
+ {{ 'sylius.ui.item'|trans }}
+ {{ 'sylius.ui.unit_price'|trans }}
+ {{ 'sylius.ui.qty'|trans }}
+
+ {{ 'sylius.ui.total'|trans }}
+
+
+
+ {% for key, item in cart.items %}
+
+ {% include 'Context/Shop/Cart/Summary/_item.html.twig' with {'item': item, 'form': form.items[key], 'main_form': form.vars.id, 'loop_index': loop.index} %}
+ {% endfor %}
+
+
+ {% if form.promotionCoupon is defined %}
+
+
+ {{ sylius_template_event('sylius.shop.cart.coupon', {'cart': cart, 'form': form, 'main_form': form.vars.id}) }}
+
+ {% endif %}
+
+ {% include '@SyliusShop/Cart/Summary/_update.html.twig' with {'main_form': form.vars.id} %}
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Checkout/_header.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Checkout/_header.html.twig
new file mode 100644
index 0000000..43c1dc6
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Checkout/_header.html.twig
@@ -0,0 +1,30 @@
+
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig
new file mode 100644
index 0000000..bb594f7
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Homepage/_banner.html.twig
@@ -0,0 +1,2 @@
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_plus.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_plus.html.twig
new file mode 100644
index 0000000..26afe2b
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Footer/Grid/_plus.html.twig
@@ -0,0 +1,7 @@
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Footer/_content.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Footer/_content.html.twig
new file mode 100644
index 0000000..82c1b1b
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Footer/_content.html.twig
@@ -0,0 +1,9 @@
+
+
{{ 'open_marketplace.ui.footer_signature'|trans }}
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig
new file mode 100644
index 0000000..6e619de
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Layout/Header/_logo.html.twig
@@ -0,0 +1,5 @@
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Order/_summary.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Order/_summary.html.twig
new file mode 100644
index 0000000..a03aec4
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Order/_summary.html.twig
@@ -0,0 +1,28 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_addToCart.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_addToCart.html.twig
new file mode 100644
index 0000000..9a152b0
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_addToCart.html.twig
@@ -0,0 +1,59 @@
+{% set product = order_item.variant.product %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+
+ {{ sonata_block_render_event('sylius.shop.product.show.before_add_to_cart', {'product': product, 'order_item': order_item}) }}
+
+ {{ form_start(form, {
+ 'action': path('sylius_shop_ajax_cart_add_item', {'productId': product.id}),
+ 'attr': {
+ 'id': 'sylius-product-adding-to-cart',
+ 'class': 'ui loadable form',
+ 'novalidate': 'novalidate',
+ 'data-redirect': path(configuration.getRedirectRoute('summary'))
+ }
+ }) }}
+
+ {{ form_errors(form) }}
+
+
+
+ {% if not product.simple %}
+ {% if product.variantSelectionMethodChoice %}
+ {% include '@SyliusShop/Product/Show/_variants.html.twig' %}
+ {% else %}
+ {% include '@SyliusShop/Product/Show/_options.html.twig' %}
+ {% endif %}
+ {% endif %}
+
+ {{ form_row(form.cartItem.quantity) }}
+
+ {{ sonata_block_render_event('sylius.shop.product.show.add_to_cart_form', {
+ 'product': product,
+ 'order_item': order_item
+ }) }}
+
+ {{ form_widget(form.wishlists) }}
+
+ {% if product.getVendor() is null or product.getVendor().isEnabled() %}
+
+
+ {{ 'sylius.ui.add_to_cart'|trans }}
+
+ {% endif %}
+
+
+
+ {{ form.addToWishlist.vars.label|trans }}
+
+
+ {{ form_row(form._token) }}
+ {{ form_end(form, {'render_rest': false}) }}
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_images.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_images.html.twig
new file mode 100644
index 0000000..fe2d2bf
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_images.html.twig
@@ -0,0 +1,42 @@
+{% set mainPhoto = null %}
+
+{% if product.imagesByType('main') is not empty %}
+ {% set mainPhoto = product.imagesByType('main').first %}
+{% elseif product.images.first %}
+ {% set mainPhoto = product.images.first %}
+{% endif %}
+
+{% if mainPhoto is not null %}
+ {% set source_path = mainPhoto.path %}
+ {% set original_path = source_path|imagine_filter('sylius_shop_product_original') %}
+ {% set path = source_path|imagine_filter(filter|default('sylius_shop_product_large_thumbnail')) %}
+{% else %}
+ {% set original_path = asset('assets/shop/img/400x300.png') %}
+ {% set path = original_path %}
+{% endif %}
+
+
+
+
+
+{% if product.images|length > 1 %}
+
+
+ {{ sylius_template_event('sylius.shop.product.show.before_thumbnails', {'product': product}) }}
+
+
+ {% for image in product.images if mainPhoto != image %}
+ {% set path = image.path is not null
+ ? image.path|imagine_filter('sylius_shop_product_small_thumbnail')
+ : asset('assets/shop/img/200x200.png') %}
+
+ {% if product.isConfigurable() and product.enabledVariants|length > 0 %}
+ {% include '@SyliusShop/Product/Show/_imageVariants.html.twig' %}
+ {% endif %}
+
+
+
+
+ {% endfor %}
+
+{% endif %}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_inventory.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_inventory.html.twig
new file mode 100644
index 0000000..3661478
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_inventory.html.twig
@@ -0,0 +1,6 @@
+{% if product.enabledVariants.empty() or product.simple and not sylius_inventory_is_available(product.enabledVariants.first) %}
+ {{ render(url('sylius_shop_partial_cart_add_item', {'template': '@SyliusShop/Product/Show/_outOfStock.html.twig', 'productId': product.id })) }}
+ {% include '@BitBagSyliusWishlistPlugin/Common/_addToWishlist.html.twig' %}
+{% else %}
+ {{ render(url('sylius_shop_partial_cart_add_item', {'template': '@SyliusShop/Product/Show/_addToCart.html.twig', 'productId': product.id})) }}
+{% endif %}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_outOfStock.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_outOfStock.html.twig
new file mode 100644
index 0000000..958a20e
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_outOfStock.html.twig
@@ -0,0 +1,6 @@
+
+
+
+ {{ 'sylius.ui.out_of_stock'|trans }}
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_reviews.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_reviews.html.twig
new file mode 100644
index 0000000..4be6376
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/Show/_reviews.html.twig
@@ -0,0 +1,13 @@
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/_box.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/_box.html.twig
new file mode 100644
index 0000000..d07f3ea
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Product/_box.html.twig
@@ -0,0 +1,33 @@
+{% import "@SyliusShop/Common/Macro/money.html.twig" as money %}
+
+{{ sonata_block_render_event('sylius.shop.product.index.before_box', {'product': product}) }}
+
+
+
+{{ sonata_block_render_event('sylius.shop.product.index.after_box', {'product': product}) }}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/Taxon/_horizontalMenu.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/Taxon/_horizontalMenu.html.twig
new file mode 100644
index 0000000..0b61766
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/Taxon/_horizontalMenu.html.twig
@@ -0,0 +1,27 @@
+{% macro item(taxon) %}
+ {% import _self as macros %}
+ {% if taxon.isEnabled() %}
+ {% if taxon.children|length > 0 %}
+
+ {{ taxon.name }}
+
+
+
+ {% else %}
+ {{ taxon.name }}
+ {% endif %}
+ {% endif %}
+{% endmacro %}
+
+{% import _self as macros %}
+
+{% if taxons|length > 0 %}
+ {% for taxon in taxons %}
+ {{ macros.item(taxon) }}
+ {% endfor %}
+{% endif %}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/_header.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/_header.html.twig
new file mode 100644
index 0000000..ce327f5
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/_header.html.twig
@@ -0,0 +1,12 @@
+
+
+ {% include "@SyliusShop/Layout/Header/_logo.html.twig" %}
+
+ {{ sonata_block_render_event('sylius.shop.layout.header') }}
+
+
+ {{ render(url('bitbag_sylius_wishlist_plugin_shop_wishlist_render_header_template')) }}
+ {{ render(url('sylius_shop_partial_cart_summary', {'template': '@SyliusShop/Cart/_widget.html.twig'})) }}
+
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/_scripts.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/_scripts.html.twig
new file mode 100644
index 0000000..4437be1
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/_scripts.html.twig
@@ -0,0 +1,3 @@
+{{ encore_entry_script_tags('shop-entry', null, 'shop') }}
+{{ encore_entry_script_tags('bitbag-cms-shop', null, 'cms_shop') }}
+{{ encore_entry_script_tags('bitbag-wishlist-shop', null, 'wishlist_shop') }}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/_styles.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/_styles.html.twig
new file mode 100644
index 0000000..3f8b68a
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/_styles.html.twig
@@ -0,0 +1,3 @@
+{{ encore_entry_link_tags('shop-entry', null, 'shop') }}
+{{ encore_entry_link_tags('bitbag-cms-shop', null, 'cms_shop') }}
+{{ encore_entry_link_tags('bitbag-wishlist-shop', null, 'wishlist_shop') }}
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/layout.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/layout.html.twig
new file mode 100755
index 0000000..9464904
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/layout.html.twig
@@ -0,0 +1,139 @@
+
+
+
+
+
+
+
+ {% block title %}BitBag OpenMarketplace{% endblock %}
+
+
+
+
+ {% block metatags %}
+ {% endblock %}
+
+ {% block stylesheets %}
+
+
+
+
+ {{ sonata_block_render_event('sylius.shop.layout.stylesheets') }}
+ {{ sylius_template_event('sylius.shop.layout.stylesheets') }}
+ {% endblock %}
+
+ {{ sonata_block_render_event('sylius.shop.layout.head') }}
+
+
+
+{{ sonata_block_render_event('sylius.shop.layout.before_body') }}
+
+ {% block top %}
+
+ {% endblock %}
+
+ {% block header %}
+
+ {% include '@SyliusShop/_header.html.twig' %}
+
+ {{ sonata_block_render_event('sylius.shop.layout.after_header') }}
+
+
+
+ {% endblock %}
+
+ {% include '@SyliusUi/_flashes.html.twig' %}
+
+ {{ sonata_block_render_event('sylius.shop.layout.before_content') }}
+
+ {% block content %}
+ {% endblock %}
+
+ {{ sonata_block_render_event('sylius.shop.layout.after_content') }}
+
+
+ {% block footer %}
+ {% include '@SyliusShop/_footer.html.twig' %}
+ {% endblock %}
+
+
+{% block javascripts %}
+ {% include '@SyliusUi/_javascripts.html.twig' with {'path': 'assets/shop/js/app.js'} %}
+ {{ sylius_template_event('sylius.shop.layout.javascripts') }}
+ {{ sonata_block_render_event('sylius.shop.layout.javascripts') }}
+{% endblock %}
+
+{% include '@SyliusUi/Modal/_confirmation.html.twig' %}
+{{ sonata_block_render_event('sylius.shop.layout.after_body') }}
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusShopBundle/login.html.twig b/OpenMarketplace/templates/bundles/SyliusShopBundle/login.html.twig
new file mode 100644
index 0000000..042120b
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusShopBundle/login.html.twig
@@ -0,0 +1,24 @@
+{% extends '@SyliusShop/layout.html.twig' %}
+
+{% form_theme form '@SyliusShop/Form/theme.html.twig' %}
+
+{% block title %}{{ 'sylius.ui.customer_login'|trans }} | {{ parent() }}{% endblock %}
+
+{% block content %}
+ {% include '@SyliusShop/Login/_header.html.twig' %}
+ {% include 'Context/Vendor/Login/_vendorDefaultCredentials.html.twig' %}
+ {{ sylius_template_event('sylius.shop.login.after_content_header') }}
+
+
+
+
+ {{ sylius_template_event('sylius.shop.login.main_column', _context) }}
+
+
+
+
+ {{ sylius_template_event('sylius.shop.login.register_column', _context) }}
+
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/bundles/SyliusUiBundle/Layout/centered.html.twig b/OpenMarketplace/templates/bundles/SyliusUiBundle/Layout/centered.html.twig
new file mode 100644
index 0000000..76a2ca4
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusUiBundle/Layout/centered.html.twig
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+ {% block title %}BitBag OpenMarketplace{% endblock %}
+
+
+
+
+ {% block metatags %}
+ {% endblock %}
+
+ {% block stylesheets %}
+
+ {% endblock %}
+
+
+{% block pre_content %}
+{% endblock %}
+
+{% block content %}
+{% endblock %}
+
+{% block post_content %}
+{% endblock %}
+
+{% block javascripts %}
+{% endblock %}
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusUiBundle/Modal/_confirmation.html.twig b/OpenMarketplace/templates/bundles/SyliusUiBundle/Modal/_confirmation.html.twig
new file mode 100644
index 0000000..1ab5dfa
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusUiBundle/Modal/_confirmation.html.twig
@@ -0,0 +1,19 @@
+
+
+
+
{{ 'sylius.ui.are_your_sure_you_want_to_perform_this_action'|trans }}
+
+
+
diff --git a/OpenMarketplace/templates/bundles/SyliusUiBundle/Security/_logo.html.twig b/OpenMarketplace/templates/bundles/SyliusUiBundle/Security/_logo.html.twig
new file mode 100644
index 0000000..db48876
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/SyliusUiBundle/Security/_logo.html.twig
@@ -0,0 +1,5 @@
+{% if paths.logo is defined %}
+
+
+
+{% endif %}
diff --git a/OpenMarketplace/templates/bundles/TwigBundle/Exception/error.html.twig b/OpenMarketplace/templates/bundles/TwigBundle/Exception/error.html.twig
new file mode 100644
index 0000000..2024e9f
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/TwigBundle/Exception/error.html.twig
@@ -0,0 +1,19 @@
+{% extends '@SyliusShop/layout.html.twig' %}
+
+{% block content %}
+
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/OpenMarketplace/templates/bundles/TwigBundle/Exception/error403.html.twig b/OpenMarketplace/templates/bundles/TwigBundle/Exception/error403.html.twig
new file mode 100644
index 0000000..dcb2688
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/TwigBundle/Exception/error403.html.twig
@@ -0,0 +1,5 @@
+{% extends '@Twig/Exception/error.html.twig' %}
+
+{% block error_message %}
+ {{ 'sylius.ui.the_page_you_are_looking_for_is_forbidden'|trans }}
+{% endblock %}
diff --git a/OpenMarketplace/templates/bundles/TwigBundle/Exception/error404.html.twig b/OpenMarketplace/templates/bundles/TwigBundle/Exception/error404.html.twig
new file mode 100644
index 0000000..d38c585
--- /dev/null
+++ b/OpenMarketplace/templates/bundles/TwigBundle/Exception/error404.html.twig
@@ -0,0 +1,5 @@
+{% extends '@Twig/Exception/error.html.twig' %}
+
+{% block error_message %}
+ {{ 'sylius.ui.the_page_you_are_looking_for_does_not_exist'|trans }}
+{% endblock %}
diff --git a/OpenMarketplace/tests/Behat/Context/Common/GridSortingContext.php b/OpenMarketplace/tests/Behat/Context/Common/GridSortingContext.php
new file mode 100644
index 0000000..371febc
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Common/GridSortingContext.php
@@ -0,0 +1,45 @@
+ 'asc',
+ 'descending' => 'desc',
+ ];
+
+ private const SORTING = 'sorting';
+
+ public function __construct(
+ private SharedStorageInterface $sharedStorage,
+ ) {
+ }
+
+ /**
+ * @Then I sort the list by :sortField in :value order
+ */
+ public function iSortTheListByInOrder($sortField, $value): void
+ {
+ $this->sharedStorage->set(
+ self::SORTING,
+ [
+ self::SORTING => [
+ $sortField => self::SORT_TYPES[$value],
+ ],
+ ]
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/ConversationContext.php b/OpenMarketplace/tests/Behat/Context/ConversationContext.php
new file mode 100644
index 0000000..9bc620b
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/ConversationContext.php
@@ -0,0 +1,103 @@
+manager = $manager;
+ $this->vendorProfileFactory = $vendorProfileFactory;
+ $this->userFactory = $userFactory;
+ $this->addressFactory = $addressFactory;
+ $this->sharedStorage = $sharedStorage;
+ $this->userRepository = $userRepository;
+ }
+
+ /**
+ * @Given there is a vendor user :vendor_user_email registered in country :country_code
+ */
+ public function thereIsAVendorUserRegisteredInCountry($vendor_user_email, $country_code): void
+ {
+ $user = $this->userFactory->create(['email' => $vendor_user_email, 'password' => 'password', 'enabled' => true]);
+ $country = $this->manager->getRepository(Country::class)->findOneBy(['code' => $country_code]);
+ $this->sharedStorage->set('user', $user);
+
+ $this->userRepository->add($user);
+ $address = $this->addressFactory->createAddress('Grand avenue', 'Berlin', '22-111', $country);
+
+ $vendor = $this->vendorProfileFactory->createVendor(
+ 'someCompany',
+ 'TaxID',
+ 'iban',
+ '333222111',
+ 'description',
+ $address
+ );
+
+ $vendor->setSlug('vendor-slug');
+ $vendor->setShopUser($user);
+ $this->manager->persist($vendor);
+ $this->manager->flush();
+ $this->sharedStorage->set('vendor', $vendor);
+ }
+
+ /**
+ * @Given there is conversation category :categoryName
+ */
+ public function thereIsConversationCategory($categoryName)
+ {
+ $category = new Category();
+ $category->setName($categoryName);
+ $this->manager->persist($category);
+ $this->manager->flush();
+ }
+
+ /**
+ * @return DocumentElement
+ */
+ private function getPage()
+ {
+ return $this->getSession()->getPage();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/AdminUserContext.php b/OpenMarketplace/tests/Behat/Context/Setup/AdminUserContext.php
new file mode 100644
index 0000000..b06abb2
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/AdminUserContext.php
@@ -0,0 +1,37 @@
+adminUserExample->create();
+ $admin->setUsername($username);
+ $admin->setPlainPassword($password);
+ $this->entityManager->persist($admin);
+ $this->entityManager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/DraftAttributeContext.php b/OpenMarketplace/tests/Behat/Context/Setup/DraftAttributeContext.php
new file mode 100644
index 0000000..5a254d0
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/DraftAttributeContext.php
@@ -0,0 +1,42 @@
+sharedStorage->get('vendor');
+ $draftAttribute = $this->draftAttributeFactory->createTyped($type, $vendor);
+ $draftAttribute->setCode($code);
+
+ $this->sharedStorage->set(sprintf('draft_attribute_%s', $code), $draftAttribute);
+ $this->entityManager->persist($draftAttribute);
+
+ $this->entityManager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/Factory/VendorFactory.php b/OpenMarketplace/tests/Behat/Context/Setup/Factory/VendorFactory.php
new file mode 100644
index 0000000..cb6d32d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/Factory/VendorFactory.php
@@ -0,0 +1,41 @@
+setCompanyName($companyName);
+ $vendor->setTaxIdentifier($taxIdentifier);
+ $vendor->setPhoneNumber($phoneNumber);
+ $vendor->setSlug($slug);
+ $vendor->setDescription($description);
+ $vendor->setStatus($status);
+ $vendor->setEditedAt(null);
+
+ return $vendor;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/Factory/VendorFactoryInterface.php b/OpenMarketplace/tests/Behat/Context/Setup/Factory/VendorFactoryInterface.php
new file mode 100644
index 0000000..1beb94a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/Factory/VendorFactoryInterface.php
@@ -0,0 +1,28 @@
+createVirtualWallet($channel, $vendor, $customer);
+ $shopUser = $vendor->getShopUser();
+ $customer = $shopUser->getCustomer();
+ Assert::isInstanceOf($customer, CustomerInterface::class);
+
+ $order = $this->orderExampleFactory->createOrderWithTotalAmount(
+ $channel,
+ $vendor,
+ $customer,
+ $balance,
+ );
+
+ $virtualWallet->stash($order);
+
+ return $virtualWallet;
+ }
+
+ public function createVirtualWallet(
+ ChannelInterface $channel,
+ VendorInterface $vendor,
+ CustomerInterface $customer,
+ ): VirtualWalletInterface {
+ $virtualWallet = new VirtualWallet();
+ $virtualWallet->setChannel($channel);
+ $virtualWallet->setVendor($vendor);
+
+ return $virtualWallet;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/Factory/VirtualWalletFactoryInterface.php b/OpenMarketplace/tests/Behat/Context/Setup/Factory/VirtualWalletFactoryInterface.php
new file mode 100644
index 0000000..fc1644b
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/Factory/VirtualWalletFactoryInterface.php
@@ -0,0 +1,33 @@
+sharedStorage->get('vendor');
+
+ $order = $this->createDefaultOrder();
+ $order->setVendor($vendor);
+
+ if (str_contains($propertyName, 'CompletedAt')) {
+ $date = new \DateTime($value);
+ $order->{'set' . ucfirst($propertyName)}($date);
+ } else {
+ $order->{'set' . ucfirst($propertyName)}($value);
+ }
+
+ $this->sharedStorage->set('order', $order);
+
+ $this->orderRepository->add($order);
+ }
+
+ /**
+ * @Given There is order with property :propertyName with value :value made with other seller
+ */
+ public function thereIsOrderWithPropertyWithValueMadeWithSomeSeller(
+ string $propertyName,
+ string $value
+ ): void {
+ $vendor = $this->createDefaultVendor();
+
+ $order = $this->createDefaultOrder();
+ $order->setVendor($vendor);
+
+ if (str_contains($propertyName, 'CompletedAt')) {
+ $date = new \DateTime($value);
+ $order->{'set' . ucfirst($propertyName)}($date);
+ } else {
+ $order->{'set' . ucfirst($propertyName)}($value);
+ }
+
+ $this->sharedStorage->set('order', $order);
+
+ $this->orderRepository->add($order);
+ }
+
+ /**
+ * @Given The order is made by customer with first name :firstName
+ */
+ public function theOrderIsMadeByCustomerWithFirstName(string $firstName): void
+ {
+ $order = $this->sharedStorage->get('order');
+ $client = $order->getCustomer();
+ $client->setFirstName($firstName);
+ $this->entityManager->persist($client);
+ $this->entityManager->flush();
+ $this->sharedStorage->set('order', $order);
+ }
+
+ /**
+ * @Given There is :count orders made with logged in seller
+ */
+ public function thereIsOrdersMadeWithLoggedInSeller($count)
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $orders = [];
+
+ for ($i = 0; $i < $count; ++$i) {
+ $orders[$i] = $this->createDefaultOrder();
+ $orders[$i]->setVendor($vendor);
+
+ $this->orderRepository->add($orders[$i]);
+ }
+ $this->sharedStorage->set('orders', $orders);
+ }
+
+ /**
+ * @Given /^(this order) has new shipment$/
+ */
+ public function thisOrderHasNewShipment(OrderInterface $order): void
+ {
+ $shippingMethod = $this->shippingMethodRepository->findOneBy([]);
+ Assert::notEmpty($shippingMethod);
+
+ $shipment = $this->shipmentFactory->createNew();
+ $shipment->setMethod($shippingMethod);
+ $shipment->setOrder($order);
+ $order->addShipment($shipment);
+
+ $this->stateMachineFactory->get($order, OrderShippingTransitions::GRAPH)->apply(OrderShippingTransitions::TRANSITION_REQUEST_SHIPPING);
+ $this->applyShipmentTransitionOnOrder($order, ShipmentTransitions::TRANSITION_CREATE);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given /^(this order) has already been shipped$/
+ */
+ public function thisOrderHasAlreadyBeenShipped(OrderInterface $order): void
+ {
+ $this->stateMachineFactory->get($order, OrderShippingTransitions::GRAPH)->apply(OrderShippingTransitions::TRANSITION_SHIP);
+ $this->applyShipmentTransitionOnOrder($order, ShipmentTransitions::TRANSITION_SHIP);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given this order has new shipping address city: :city, postalCode: :postalCode, street: :street
+ */
+ public function thisOrderHasNewShippingAddressCityPostalCodeStreet(
+ string $city,
+ string $postalCode,
+ string $street
+ ): void {
+ $country = $this->entityManager->getRepository(Country::class)->findOneBy([]);
+ Assert::notEmpty($country);
+
+ /** @var OrderInterface $order */
+ $order = $this->sharedStorage->get('order');
+ $customer = $order->getCustomer();
+ $order->setShippingAddress($this->createAddress($customer, $country, $city, $postalCode, $street));
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given this order has new billing address city: :city, postalCode: :postalCode, street: :street
+ */
+ public function thisOrderHasNewBillingAddressCityPostalCodeStreet(
+ string $city,
+ string $postalCode,
+ string $street
+ ): void {
+ $country = $this->entityManager->getRepository(Country::class)->findOneBy([]);
+ Assert::notEmpty($country);
+
+ /** @var OrderInterface $order */
+ $order = $this->sharedStorage->get('order');
+ $customer = $order->getCustomer();
+ $order->setBillingAddress($this->createAddress($customer, $country, $city, $postalCode, $street));
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given The customer :customer has new order
+ */
+ public function thereIsFulfilledOrder(string $customer): void
+ {
+ $orders = $this->orderExampleFactory->createArray(['customer' => $customer]);
+
+ foreach ($orders as $order) {
+ $this->orderRepository->add($order);
+ }
+
+ $this->sharedStorage->set('primary_order', reset($orders));
+ }
+
+ private function createOrder(
+ CustomerInterface $customer,
+ ?string $number = null,
+ ?ChannelInterface $channel = null,
+ ?string $localeCode = null
+ ) {
+ $order = $this->createCart($customer, $channel, $localeCode);
+
+ if (null !== $number) {
+ $order->setNumber($number);
+ }
+
+ $order->completeCheckout();
+
+ return $order;
+ }
+
+ private function createCart(
+ CustomerInterface $customer,
+ ChannelInterface $channel = null,
+ string $localeCode = null
+ ): OrderInterface {
+ /** @var OrderInterface $order */
+ $order = $this->orderFactory->createNew();
+
+ $order->setCustomer($customer);
+ $order->setChannel($channel ?? $this->sharedStorage->get('channel'));
+ $order->setLocaleCode($localeCode ?? $this->sharedStorage->get('locale')->getCode());
+ $order->setCurrencyCode($order->getChannel()->getBaseCurrency()->getCode());
+
+ return $order;
+ }
+
+ private function createDefaultOrder(): OrderInterface
+ {
+ $user = $this->userExampleFactory->create();
+ $customer = $user->getCustomer();
+ $channel = $this->sharedStorage->get('channel');
+ $localeCode = $this->sharedStorage->get('locale')->getCode();
+
+ /** @var OpenMarketplaceOrderInterface $secondaryOrder */
+ $secondaryOrder = $this->createOrder(
+ $customer,
+ $number = null,
+ $channel,
+ $localeCode
+ );
+ $primaryOrder = $this->createOrder(
+ $customer,
+ $number = null,
+ $channel,
+ $localeCode
+ );
+ $this->entityManager->persist($primaryOrder);
+ $secondaryOrder->setPrimaryOrder($primaryOrder);
+
+ return $secondaryOrder;
+ }
+
+ private function createDefaultVendor(): VendorInterface
+ {
+ $user = $this->userExampleFactory->create(['email' => 'test@x.x', 'password' => 'password', 'enabled' => true]);
+
+ $this->sharedStorage->set('user', $user);
+
+ $this->userRepository->add($user);
+
+ $country = $this->entityManager->getRepository(Country::class)->findAll()[0];
+ $options = [
+ 'company_name' => 'Company Name',
+ 'phone_number' => '333333333',
+ 'tax_identifier' => '543455',
+ 'street' => 'Tajna 13',
+ 'city' => 'Warsaw',
+ 'postcode' => '00-111',
+ 'slug' => 'vendor-slug',
+ 'description' => 'description',
+ 'country' => $country,
+ ];
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $vendor->setShopUser($user);
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ $this->sharedStorage->set('vendor', $vendor);
+
+ return $vendor;
+ }
+
+ private function applyShipmentTransitionOnOrder(OrderInterface $order, $transition): void
+ {
+ foreach ($order->getShipments() as $shipment) {
+ $this->stateMachineFactory->get($shipment, ShipmentTransitions::GRAPH)->apply($transition);
+ }
+ }
+
+ private function createAddress(
+ CustomerInterface $customer,
+ CountryInterface $country,
+ string $city,
+ string $postalCode,
+ string $street
+ ): AddressInterface {
+ $address = $this->addressFactory->createNew();
+ $address->setFirstName($customer->getFirstName());
+ $address->setLastName($customer->getLastName());
+ $address->setCountryCode($country->getCode());
+ $address->setCity($city);
+ $address->setPostcode($postalCode);
+ $address->setStreet($street);
+
+ return $address;
+ }
+
+ /**
+ * @Given I am on customer details page
+ */
+ public function iAmOnCustomerDetailsPage()
+ {
+ $order = $this->sharedStorage->get('order');
+ $this->visitPath('/en_US/account/vendor/customers/' . $order->getCustomer()->getId());
+ }
+
+ /**
+ * @Given vendor :vendorEmail has an order with number :number for :price in channel :channelCode
+ * @Given vendor :vendorEmail has an order with number :number priced at :price in channel :channelCode
+ */
+ public function vendorHasAnOrderWithCodeForInChannel(
+ string $vendorEmail,
+ string $number,
+ string $price,
+ string $channelCode
+ ): void {
+ $price = $this->getPriceFromString($price);
+
+ /** @var ShopUserInterface $shopUser */
+ $shopUser = $this->userRepository->findOneBy(['username' => $vendorEmail]);
+ $channel = $this->entityManager->getRepository(Channel::class)->findOneBy(['name' => $channelCode]);
+
+ /** @var VendorInterface $vendor */
+ $vendor = $shopUser->getVendor();
+
+ /** @var CoreCustomerInterface $customer */
+ $customer = $shopUser->getCustomer();
+
+ $order = $this->orderExampleFactory->createOrderWithTotalAmount(
+ $channel,
+ $vendor,
+ $customer ?? $this->sharedStorage->get('customer'),
+ $price
+ );
+
+ $order->setNumber($number);
+
+ $this->entityManager->persist($order);
+ $this->entityManager->flush();
+
+ $this->sharedStorage->set($number, $order);
+ }
+
+ /**
+ * @Given order :orderNumber has been paid in current settlement cycle
+ */
+ public function orderHasBeenPaidInCurrentSettlementCycle(string $orderNumber): void
+ {
+ $faker = Factory::create();
+ $lastSettlement = $this->entityManager->getRepository(SettlementInterface::class)->findOneBy([]);
+ $order = $this->sharedStorage->get($orderNumber);
+
+ /** @var VendorInterface $vendor */
+ $vendor = $order->getVendor();
+ Assert::isInstanceOf($vendor, VendorInterface::class);
+
+ [$from, $to] = $this->settlementPeriodResolver->getSettlementDateRangeForVendor(
+ $vendor,
+ $vendor->hasCyclicalSettlementFrequency(),
+ $lastSettlement?->getEndDate()
+ );
+ $paidAt = $faker->dateTimeBetween($from, $to);
+ $order->setPaidAt($paidAt);
+
+ $this->entityManager->persist($order);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given order :orderNumber has been paid at the beginning of current settlement cycle
+ */
+ public function orderHasBeenPaidAtTheBeginningOfCurrentSettlementCycle(string $orderNumber): void
+ {
+ $lastSettlement = $this->entityManager->getRepository(SettlementInterface::class)->findOneBy([]);
+ $order = $this->sharedStorage->get($orderNumber);
+
+ /** @var VendorInterface $vendor */
+ $vendor = $order->getVendor();
+ Assert::isInstanceOf($vendor, VendorInterface::class);
+
+ $frequency = $vendor->getSettlementFrequency();
+
+ switch ($frequency) {
+ case VendorSettlementFrequency::MONTHLY:
+ $modifier = '-1 month';
+
+ break;
+ case VendorSettlementFrequency::WEEKLY:
+ $modifier = '-1 week';
+
+ break;
+ case VendorSettlementFrequency::QUARTERLY:
+ $modifier = '-3 months';
+
+ break;
+ default:
+ $modifier = '-1 day';
+
+ break;
+ }
+
+ [$from, $to] = $this->settlementPeriodResolver->getSettlementDateRangeForVendor(
+ $vendor,
+ $vendor->hasCyclicalSettlementFrequency(),
+ $lastSettlement?->getEndDate()
+ );
+
+ $from = min($from->modify($modifier), $vendor->getCreatedAt());
+
+ $order->setPaidAt($from->modify('+1 hour'));
+
+ $this->entityManager->persist($order);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given order :orderNumber has been included in previously generated settlement
+ */
+ public function orderHasBeenIncludedInPreviouslyGeneratedSettlement(string $orderNumber): void
+ {
+ $lastSettlement = $this->entityManager->getRepository(SettlementInterface::class)->findOneBy([]);
+ $order = $this->sharedStorage->get($orderNumber);
+
+ /** @var VendorInterface $vendor */
+ $vendor = $order->getVendor();
+ Assert::isInstanceOf($vendor, VendorInterface::class);
+
+ [$from, $to] = $this->settlementPeriodResolver->getSettlementDateRangeForVendor(
+ $vendor,
+ $vendor->hasCyclicalSettlementFrequency(),
+ $lastSettlement?->getEndDate()
+ );
+ $paidAt = $from->modify('-1 day');
+ $order->setPaidAt($paidAt);
+
+ $this->settlementCreator->createSettlementsForAutoGeneration(
+ $vendor,
+ [$order->getChannel()],
+ );
+
+ $this->entityManager->persist($order);
+ $this->entityManager->flush();
+ }
+
+ private function getPriceFromString(string $priceString): int
+ {
+ $sign = $priceString[0];
+ $price = substr($priceString, 1);
+ $this->validatePriceString($price);
+
+ $price = (int) round((float) $price * 100, 2);
+
+ if ('-' === $sign) {
+ $price *= -1;
+ }
+
+ return $price;
+ }
+
+ private function validatePriceString(string $price): void
+ {
+ if (!preg_match('/^\d+(?:\.\d{1,2})?$/', $price)) {
+ throw new \InvalidArgumentException('Price string should not have more than 2 decimal digits.');
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/PaymentMethodContext.php b/OpenMarketplace/tests/Behat/Context/Setup/PaymentMethodContext.php
new file mode 100644
index 0000000..42a981d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/PaymentMethodContext.php
@@ -0,0 +1,50 @@
+paymentMethodFactory->createNew();
+ $paymentMethod->setName($paymentMethodName);
+ $paymentMethod->setCode($paymentMethodCode);
+
+ $gateway = new GatewayConfig();
+ $gateway->setGatewayName('offline');
+ $gateway->setFactoryName('offline');
+ $gateway->setConfig([]);
+
+ $paymentMethod->addChannel($this->sharedStorage->get('channel'));
+ $paymentMethod->setGatewayConfig($gateway);
+
+ $this->paymentMethodRepository->add($paymentMethod);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/ProductContext.php b/OpenMarketplace/tests/Behat/Context/Setup/ProductContext.php
new file mode 100644
index 0000000..61b973c
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/ProductContext.php
@@ -0,0 +1,444 @@
+vendorRepository = $vendorRepository;
+ $this->productVariantRepository = $productVariantRepository;
+ $this->productRepository = $productRepository;
+ $this->userExampleFactory = $userExampleFactory;
+ $this->entityManager = $entityManager;
+ $this->productExampleFactory = $productExampleFactory;
+ $this->taxonFactory = $taxonFactory;
+ $this->sharedStorage = $sharedStorage;
+ $this->shippingMethodRepository = $shippingMethodRepository;
+ $this->slugGenerator = $slugGenerator;
+ $this->defaultVariantResolver = $defaultVariantResolver;
+ $this->productFactory = $productFactory;
+ $this->channelPricingFactory = $channelPricingFactory;
+ $this->vendorExampleFactory = $vendorExampleFactory;
+ $this->userRepository = $userRepository;
+ }
+
+ /**
+ * @Given store has :productsCount products from same Vendor
+ */
+ public function storeHasProductsFromSameVendor($productsCount): void
+ {
+ $this->createTaxon();
+ $vendor = $this->createDefaultVendor(null);
+ for ($i = 1; $i <= $productsCount; ++$i) {
+ $products[$i] = $this->productExampleFactory->create();
+ $products[$i]->setVendor($vendor);
+ $this->vendorRepository->add($vendor);
+ $this->productRepository->add($products[$i]);
+ $this->sharedStorage->set('vendor', $vendor);
+ $this->sharedStorage->set('products', $products);
+ }
+ }
+
+ /**
+ * @Given store has :productsCount products from vendor :username
+ */
+ public function storeHasProductsFromVendorNamed($productsCount, $username): void
+ {
+ $this->createTaxon();
+ /** @var ShopUserInterface $user */
+ $user = $this->userRepository->findOneBy(['username' => $username]);
+ $vendor = $user->getVendor();
+ for ($i = 1; $i <= $productsCount; ++$i) {
+ $products[$i] = $this->productExampleFactory->create();
+ $products[$i]->setVendor($vendor);
+ $this->vendorRepository->add($vendor);
+ $this->productRepository->add($products[$i]);
+
+ $this->sharedStorage->set('products', $products);
+ }
+ }
+
+ /**
+ * @Given store has :productsCount products created by admin
+ */
+ public function storeHasProductsFromAdmin($productsCount): void
+ {
+ $this->createTaxon();
+ for ($i = 1; $i <= $productsCount; ++$i) {
+ $products[$i] = $this->productExampleFactory->create();
+ $this->productRepository->add($products[$i]);
+
+ $this->sharedStorage->set('products', $products);
+ }
+ }
+
+ /**
+ * @Given store has :productsCount products from different Vendors
+ * @Given store has :productsCount products from different Vendors with default commission settings
+ */
+ public function storeHasProductsFromDifferentVendors($productsCount)
+ {
+ $this->createTaxon();
+ for ($i = 1; $i <= $productsCount; ++$i) {
+ $vendors[$i] = $this->createDefaultVendor($i);
+ $products[$i] = $this->productExampleFactory->create();
+ $products[$i]->setVendor($vendors[$i]);
+ $this->vendorRepository->add($vendors[$i]);
+ $this->productRepository->add($products[$i]);
+
+ $this->sharedStorage->set('products', $products);
+ }
+ }
+
+ /**
+ * @Given store has :productsCount products from different Vendors with random commission settings
+ */
+ public function storeHasProductsFromDifferentVendorsWithRandomCommissions($productsCount)
+ {
+ $this->createTaxon();
+ $commissionTypes = [VendorInterface::NET_COMMISSION, VendorInterface::GROSS_COMMISSION];
+ for ($i = 1; $i <= $productsCount; ++$i) {
+ $vendor = $this->createDefaultVendor($i);
+ $vendor->setCommission(random_int(1, 10));
+ $vendor->setCommissionType($commissionTypes[array_rand($commissionTypes)]);
+ $vendors[$i] = $vendor;
+ $products[$i] = $this->productExampleFactory->create();
+ $products[$i]->setVendor($vendors[$i]);
+ $this->vendorRepository->add($vendors[$i]);
+ $this->productRepository->add($products[$i]);
+
+ $this->sharedStorage->set('products', $products);
+ }
+ }
+
+ /**
+ * @Given store has :vendorsCount vendors with different product each
+ */
+ public function storeHasVendorsWithDifferentProductEach(int $vendorsCount)
+ {
+ $name = 'product-';
+ $basePrice = 100;
+ for ($i = 1; $i <= $vendorsCount; ++$i) {
+ $vendors[$i] = $this->createDefaultVendor($i);
+ $products[$i] = $this->createProduct(sprintf('%s%d', $name, $i), $vendors[$i], $basePrice * $i);
+ $this->vendorRepository->add($vendors[$i]);
+ $this->productRepository->add($products[$i]);
+
+ $this->sharedStorage->set('products', $products);
+ }
+ }
+
+ /**
+ * @Given there is a product :name attached to the product listing
+ */
+ public function thereIsProductsForListing(string $name): void
+ {
+ $listing = $this->sharedStorage->get('product_listing');
+ Assert::isInstanceOf($listing, ListingInterface::class);
+
+ $product = $this->createProduct(
+ $name,
+ $listing->getVendor()
+ );
+
+ $listing->setProduct($product);
+
+ $this->sharedStorage->set('product', $product);
+
+ $this->entityManager->persist($product);
+ $this->entityManager->persist($listing);
+
+ $this->entityManager->flush();
+ }
+
+ private function createProduct(
+ string $productName,
+ VendorInterface $vendor,
+ int $price = 100,
+ string $date = 'now',
+ ChannelInterface $channel = null
+ ): \Sylius\Component\Core\Model\ProductInterface {
+ if (null === $channel && $this->sharedStorage->has('channel')) {
+ $channel = $this->sharedStorage->get('channel');
+ }
+
+ $date = new \DateTime($date);
+
+ /** @var ProductInterface $product */
+ $product = $this->productFactory->createWithVariant();
+
+ $product->setCode(StringInflector::nameToUppercaseCode($productName));
+ $product->setName($productName);
+ $product->setSlug($this->slugGenerator->generate($productName));
+ $product->setVendor($vendor);
+ $product->setCreatedAt($date);
+
+ if (null !== $channel) {
+ $product->addChannel($channel);
+
+ foreach ($channel->getLocales() as $locale) {
+ $product->setFallbackLocale($locale->getCode());
+ $product->setCurrentLocale($locale->getCode());
+
+ $product->setName($productName);
+ $product->setSlug($this->slugGenerator->generate($productName));
+ }
+ }
+
+ /** @var ProductVariantInterface $productVariant */
+ $productVariant = $this->defaultVariantResolver->getVariant($product);
+
+ if (null !== $channel) {
+ $productVariant->addChannelPricing($this->createChannelPricingForChannel($price, $channel));
+ }
+
+ $productVariant->setCode($product->getCode());
+ $productVariant->setName($product->getName());
+ $productVariant->setCreatedAt($date);
+ $productVariant->setUpdatedAt($date);
+
+ return $product;
+ }
+
+ private function createChannelPricingForChannel(int $price, ChannelInterface $channel = null)
+ {
+ /** @var ChannelPricingInterface $channelPricing */
+ $channelPricing = $this->channelPricingFactory->createNew();
+ $channelPricing->setPrice($price);
+ $channelPricing->setChannelCode($channel->getCode());
+
+ return $channelPricing;
+ }
+
+ /**
+ * @Then product on hand count should be :count
+ */
+ public function productOnHoldCountShouldBe(int $count)
+ {
+ $product = $this->sharedStorage->get('product');
+
+ $variant = $this->productVariantRepository->findOneBy(['product' => $product]);
+ $this->entityManager->refresh($variant);
+ Assert::same($count, $variant->getOnHand());
+ }
+
+ /**
+ * @Given There is a product with variant code :variant_code owned by logged in vendor
+ */
+ public function thereIsProductWithVariantCodeOwnedByLoggedInVendor($variant_code)
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ $this->createTaxon();
+ $product = $this->productExampleFactory->create();
+ $product->setVendor($vendor);
+ $product->getVariants()[0]->setCode($variant_code);
+ $this->productRepository->add($product);
+ $this->sharedStorage->set('product', $product);
+ }
+
+ /**
+ * @Given one of it belongs to :shippingCategory shipping category
+ */
+ public function oneOfItBelongsToShippingCategory(ShippingCategoryInterface $shippingCategory)
+ {
+ $products = $this->sharedStorage->get('products');
+ $products[1]->getVariants()->first()->setShippingCategory($shippingCategory);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given one of it not belongs to :shippingCategory shipping category
+ */
+ public function oneOfItNotBelongsToShippingCategory(ShippingCategoryInterface $shippingCategory)
+ {
+ $products = $this->sharedStorage->get('products');
+ $products[1]->getVariants()->first()->setShippingCategory(null);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given vendor uses this shipping method
+ */
+ public function vendorUsesThisShippingMethod()
+ {
+ /** @var VendorInterface $vendor */
+ $vendor = $this->sharedStorage->get('vendor');
+ /** @var VendorShippingMethodInterface $shippingMethod */
+ $shippingMethod = $this->shippingMethodRepository->findOneBy(['code' => 'ENVELOPE-US']);
+ $vendorShippingMethod = new VendorShippingMethod();
+ $vendorShippingMethod->setVendor($vendor);
+ $vendorShippingMethod->setShippingMethod($shippingMethod);
+ $vendorShippingMethod->setChannelCode($this->sharedStorage->get('channel')->getCode());
+ $vendor->addShippingMethod($vendorShippingMethod);
+ $this->entityManager->persist($vendorShippingMethod);
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given product belongs to :taxonSlug taxon
+ */
+ public function onlyOneProductBelongsToTaxon($taxonSlug)
+ {
+ $channel = $this->sharedStorage->get('channel');
+ $menuTaxon = $channel->getMenuTaxon();
+ /** @var TaxonInterface $taxon */
+ $taxon = $this->taxonFactory->create();
+ $taxon->setCode('code');
+ $taxon->setSlug($taxonSlug);
+ $taxon->setEnabled(true);
+
+ $taxon->setParent($menuTaxon);
+
+ $products = $this->sharedStorage->get('products');
+
+ $products[1]->setMainTaxon($taxon);
+
+ $productTaxon = new ProductTaxon();
+ $productTaxon->setProduct($products[1]);
+ $productTaxon->setTaxon($taxon);
+
+ $this->entityManager->persist($productTaxon);
+ $this->entityManager->persist($products[1]);
+ $this->entityManager->persist($taxon);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given product has name :name
+ */
+ public function productHasName($name)
+ {
+ $products = $this->sharedStorage->get('products');
+
+ $products[1]->setName($name);
+
+ $this->entityManager->persist($products[1]);
+
+ $this->entityManager->flush();
+ }
+
+ private function createDefaultVendor(?int $iteration): VendorInterface
+ {
+ if (1 === $iteration) {
+ $iteration = null;
+ }
+ $userFactory = $this->userExampleFactory;
+ $user = $userFactory->create();
+
+ $options = [
+ 'company_name' => 'company',
+ 'phone_number' => '333',
+ 'tax_identifier' => '111',
+ 'slug' => 'SLUG' . "$iteration",
+ 'description' => 'description',
+ ];
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorExampleFactory->create($options);
+ $vendor->setShopUser($user);
+
+ $this->entityManager->persist($user);
+
+ return $vendor;
+ }
+
+ private function createTaxon()
+ {
+ $taxon = $this->taxonFactory->create();
+ $channel = $this->sharedStorage->get('channel');
+ $channel->setMenuTaxon($taxon);
+ $this->entityManager->persist($channel);
+ $this->entityManager->persist($taxon);
+ $this->entityManager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/ProductListingContext.php b/OpenMarketplace/tests/Behat/Context/Setup/ProductListingContext.php
new file mode 100644
index 0000000..fdb7c53
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/ProductListingContext.php
@@ -0,0 +1,350 @@
+visitPath('/en_US/account/dashboard');
+ }
+
+ /**
+ * @Given I am on a conversations page
+ */
+ public function iAmOnConversationsPage(): void
+ {
+ $this->visitPath('/en_US/account/vendor/conversations');
+ }
+
+ /**
+ * @Given I am on an admin dashboard page
+ */
+ public function iAmOnAnAdminDashboardPage(): void
+ {
+ $this->visitPath('/admin');
+ }
+
+ /**
+ * @Given There is a verified product listing created by vendor
+ */
+ public function thereIsAVerifiedProductListingCreatedByVendor(): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $productListing = $this->createProductListing(
+ $vendor,
+ DraftInterface::STATUS_VERIFIED
+ );
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given There is a rejected product listing created by vendor
+ */
+ public function thereIsARejectedProductListingCreatedByVendor(): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $productListing = $this->createProductListing(
+ $vendor,
+ DraftInterface::STATUS_REJECTED
+ );
+
+ $this->entityManager->persist($productListing);
+
+ /** @var DraftInterface $draft */
+ $draft = $productListing->getLatestDraft();
+
+ $draftViewURL = $this->router->generate(
+ 'open_marketplace_vendor_product_listings_show',
+ [
+ 'id' => $draft->getId(),
+ '_locale' => 'en_US',
+ ],
+ UrlGenerator::ABSOLUTE_URL
+ );
+
+ $category = $this->categoryFactory->createNewWithName(
+ 'Product listing rejection'
+ );
+
+ $this->entityManager->persist($category);
+
+ $conversation = $this->conversationFactory->createNew();
+ $conversation->setShopUser($productListing->getVendor()->getShopUser());
+ $conversation->setRejectedListingURL($draftViewURL);
+ $conversation->setCategory($category);
+
+ $message = $this->createMessage(
+ 'Listing with selected tax category was rejected',
+ );
+
+ $conversation->addMessage($message);
+
+ $this->entityManager->persist($conversation);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given There is an under verification product listing created by vendor
+ */
+ public function thereIsAUnderVerificationProductListingCreatedByVendor(): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $productListing = $this->createProductListing(
+ $vendor,
+ DraftInterface::STATUS_UNDER_VERIFICATION
+ );
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->flush();
+ }
+
+ private function createProductListing(
+ VendorInterface $vendor,
+ string $draftStatus,
+ ): Listing {
+ $productListing = new Listing();
+ $productListing->setCode('code');
+ $productListing->setVendor($vendor);
+
+ $productDraft = $this->createProductDraft($draftStatus);
+ $productDraft->setProductListing($productListing);
+ $productListing->insertDraft($productDraft);
+
+ $productTranslation = $this->createProductTranslation($productDraft);
+ $this->entityManager->persist($productTranslation);
+
+ $productPricing = $this->createProductPricing($productDraft);
+ $this->entityManager->persist($productPricing);
+
+ return $productListing;
+ }
+
+ /**
+ * @Given This product draft has Tax category named :taxCategoryName
+ */
+ public function thisProductDraftHasStatusAccepted(string $taxCategoryName): void
+ {
+ /** @var DraftInterface $productDraft */
+ $productDraft = $this->entityManager->getRepository(Draft::class)
+ ->findOneBy(['code' => 'code']);
+
+ /** @var TaxCategory $taxCategory */
+ $taxCategory = $this->entityManager->getRepository(TaxCategory::class)
+ ->findOneBy(['name' => $taxCategoryName]);
+
+ $productDraft->setTaxCategory($taxCategory);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given This product listing has status accepted
+ */
+ public function thisProductListingHasStatusAccepted(): void
+ {
+ /** @var DraftInterface $draft */
+ $draft = $this->entityManager->getRepository(Draft::class)->findOneBy(['code' => 'code']);
+ $newProduct = $this->acceptanceOperator->convertToSimpleProduct($draft);
+ $draft->setStatus('verified');
+ $this->entityManager->persist($newProduct);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Then I click button with id :id
+ */
+ public function iClickButton(string $id): void
+ {
+ $page = $this->getSession()->getPage();
+ $button = $page->find('css', '#' . $id);
+ $button->press();
+ }
+
+ /**
+ * @Then I should be notified no page exits
+ */
+ public function iShouldBeNotifiedNoPageExits(): void
+ {
+ $status = $this->getSession()->getStatusCode();
+ Assert::eq($status, 404);
+ }
+
+ /**
+ * @Then I fill in conversation message content with :message
+ */
+ public function iFillInConversationMessageContentWithMessage(
+ string $message
+ ): void {
+ $this->showAdminPage->fillRejectMessage($message);
+ }
+
+ /**
+ * @Then I fill in Tax category with :taxCategory
+ */
+ public function iFillInTaxCategoryWithTaxCategory(
+ string $taxCategoryName,
+ ): void {
+ $this->productListingCreateVendorPage->fillTaxCategory($taxCategoryName);
+ }
+
+ /**
+ * @Given there is tax category :taxCategoryName with code :code
+ */
+ public function thereIsTaxCategoryWithCode(
+ string $taxCategoryName,
+ string $code,
+ ): void {
+ /** @var TaxCategoryInterface $taxCategory */
+ $taxCategory = $this->taxCategoryExampleFactory->createNew();
+ $taxCategory->setName($taxCategoryName);
+ $taxCategory->setCode($code);
+
+ $this->entityManager->persist($taxCategory);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given I should see taxCategory :taxCategoryName for product listing
+ */
+ public function iShouldSeeTaxCategoryForProductListing(
+ string $taxCategoryName
+ ): void {
+ $productListingTaxCategory = $this->getPage()
+ ->find(
+ 'css',
+ sprintf(
+ 'table > tbody > tr > td:contains("%s")',
+ $taxCategoryName,
+ ),
+ );
+ Assert::notNull($productListingTaxCategory);
+ }
+
+ /**
+ * @return DocumentElement
+ */
+ private function getPage()
+ {
+ return $this->getSession()->getPage();
+ }
+
+ private function createProductDraft(
+ string $status
+ ): DraftInterface {
+ $productDraft = new Draft();
+ $productDraft->setCode('code');
+ $productDraft->setStatus($status);
+ $productDraft->setPublishedAt(new \DateTime());
+ $productDraft->setVersionNumber(0);
+
+ return $productDraft;
+ }
+
+ private function createProductTranslation(
+ DraftInterface $productDraft
+ ): DraftTranslationInterface {
+ $productTranslation = new DraftTranslation();
+ $productTranslation->setLocale('en_US');
+ $productTranslation->setSlug('product-listing-slug');
+ $productTranslation->setName('ProductListingName');
+ $productTranslation->setDescription('product-listing-');
+ $productTranslation->setProductDraft($productDraft);
+
+ return $productTranslation;
+ }
+
+ private function createProductPricing(
+ DraftInterface $productDraft
+ ): ListingPriceInterface {
+ $productPricing = new ListingPrice();
+ $productPricing->setProductDraft($productDraft);
+ $productPricing->setPrice(1000);
+ $productPricing->setOriginalPrice(1000);
+ $productPricing->setMinimumPrice(1000);
+ $productPricing->setChannelCode('en_US');
+
+ return $productPricing;
+ }
+
+ private function createMessage(
+ string $content,
+ ): MessageInterface {
+ /** @var MessageInterface $message */
+ $message = $this->messageFactory->createNew();
+
+ $user = $this->userContext->getUser();
+
+ if ($user instanceof AdminUserInterface) {
+ $message->setAdminUser($user);
+ }
+
+ if ($user instanceof ShopUserInterface) {
+ $message->setShopUser($user);
+ $message->setAuthor($user);
+ }
+
+ $message->setContent($content);
+
+ return $message;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/SettlementContext.php b/OpenMarketplace/tests/Behat/Context/Setup/SettlementContext.php
new file mode 100644
index 0000000..fd637b9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/SettlementContext.php
@@ -0,0 +1,101 @@
+sharedStorage->get('vendor');
+
+ $settlement = $this->settlementExampleFactory->create([
+ 'status' => $status,
+ 'totalAmount' => (int) floor($totalAmount * 100),
+ 'totalCommissionAmount' => (int) floor($commissionTotalAmount * 100),
+ 'vendor' => $vendor,
+ ]);
+
+ $this->entityManager->persist($settlement);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is a settlement with period from :from to :to
+ */
+ public function thereIsASettlementWithPeriodFromTo(
+ string $from,
+ string $to,
+ ): void {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ $settlement = $this->settlementExampleFactory->create([
+ 'vendor' => $vendor,
+ 'startDate' => \DateTime::createFromFormat('d/m/Y H:i:s', sprintf('%s 00:00:00', $from)),
+ 'endDate' => \DateTime::createFromFormat('d/m/Y H:i:s', sprintf('%s 23:59:59', $to)),
+ ]);
+
+ $this->entityManager->persist($settlement);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is a :status settlement for vendor :vendorEmail
+ */
+ public function thereIsASettlementForVendor(
+ string $status,
+ string $vendorEmail,
+ ): void {
+ $settlement = $this->settlementExampleFactory->create([
+ 'status' => $status,
+ 'vendor' => $vendorEmail,
+ ]);
+
+ $this->entityManager->persist($settlement);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is a settlement for channel :channelName
+ */
+ public function thereIsASettlementForChannel(string $channelName): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ $settlement = $this->settlementExampleFactory->create([
+ 'vendor' => $vendor,
+ 'channel' => StringInflector::nameToLowercaseCode($channelName),
+ ]);
+
+ $this->entityManager->persist($settlement);
+ $this->entityManager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/VendorContext.php b/OpenMarketplace/tests/Behat/Context/Setup/VendorContext.php
new file mode 100644
index 0000000..16ae2cc
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/VendorContext.php
@@ -0,0 +1,154 @@
+shopUserExampleFactory->create(['email' => $vendorUserEmail, 'password' => 'password', 'enabled' => true]);
+ $user->setVerifiedAt(new \DateTime());
+ $user->addRole('ROLE_USER');
+ $user->addRole('ROLE_VENDOR');
+
+ $this->sharedStorage->set('user', $user);
+
+ $this->entityManager->persist($user);
+
+ $country = $this->entityManager->getRepository(Country::class)->findOneBy(['code' => $countryCode]);
+ if (null === $country) {
+ /** @var CountryInterface $country */
+ $country = $this->countryFactory->createNew();
+ $country->setCode($countryCode);
+ $country->enable();
+ $this->entityManager->persist($country);
+ }
+
+ $options = [
+ 'company_name' => $name ?? 'Test',
+ 'phone_number' => '333333333',
+ 'tax_identifier' => '543455',
+ 'bank_account_number' => 'NL31INGB4405427607',
+ 'street' => 'Secret 13',
+ 'city' => 'Warsaw',
+ 'postcode' => '00-111',
+ 'slug' => 'vendor-slug',
+ 'description' => 'description',
+ 'country' => $country,
+ 'status' => $status,
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+ $vendor->setShopUser($user);
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ $this->sharedStorage->set('vendor', $vendor);
+ }
+
+ /**
+ * @Given there is an vendor user :username with password :password
+ */
+ public function thereIsAnVendorUserWithPassword(string $username, string $password): void
+ {
+ /** @var ShopUserInterface $user */
+ $user = $this->shopUserExampleFactory->create();
+ $user->setUsername($username);
+ $user->setPlainPassword($password);
+ $user->setEmail($username . '@email.com');
+ $this->entityManager->persist($user);
+
+ $options = [
+ 'company_name' => 'vendor',
+ 'phone_number' => '987654321',
+ 'tax_identifier' => '123456789',
+ 'slug' => 'vendor-slug',
+ 'description' => 'description',
+ ];
+
+ /** @var Vendor $vendor */
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $vendor->setShopUser($user);
+ $this->entityManager->persist($vendor);
+
+ $this->entityManager->flush();
+
+ $this->sharedStorage->set('vendor', $vendor);
+ }
+
+ /**
+ * @Given vendor :vendorEmail has :frequency settlement frequency
+ */
+ public function vendorHasSettlementFrequency(string $vendorEmail, string $frequency): void
+ {
+ $frequency = StringInflector::nameToLowercaseCode($frequency);
+ Assert::inArray($frequency, VendorSettlementFrequency::SETTLEMENT_FREQUENCIES);
+ $vendor = $this->getVendorByEmail($vendorEmail);
+ $vendor->setSettlementFrequency($frequency);
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given vendor :vendorEmail was created on :dateTimeString
+ */
+ public function vendorWasCreatedOn(string $vendorEmail, string $dateTimeString): void
+ {
+ $vendor = $this->getVendorByEmail($vendorEmail);
+ $vendor->setCreatedAt(new \DateTime($dateTimeString));
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ private function getVendorByEmail(string $vendorEmail): VendorInterface
+ {
+ $shopUser = $this->entityManager->getRepository(ShopUserInterface::class)->findOneBy(['username' => $vendorEmail]);
+ $vendor = $shopUser->getVendor();
+ Assert::isInstanceOf($vendor, VendorInterface::class);
+
+ return $vendor;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Setup/VirtualWalletContext.php b/OpenMarketplace/tests/Behat/Context/Setup/VirtualWalletContext.php
new file mode 100644
index 0000000..0d5f267
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Setup/VirtualWalletContext.php
@@ -0,0 +1,116 @@
+getVendorByEmail($vendorEmail);
+ $channel = $this->entityManager->getRepository(Channel::class)->findOneBy(['name' => $channelName]);
+
+ $virtualWallet = $this->virtualWalletFactory->createVirtualWalletWithBalance(
+ $channel,
+ $vendor,
+ $this->getCustomer($vendor),
+ (int) floor($balance * 100),
+ );
+
+ $this->entityManager->persist($virtualWallet);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is a virtual wallet for channel :channelName with balance :balance
+ */
+ public function thereIsAVirtualWalletForChannelAndBalance(string $channelName, float $balance): void
+ {
+ $channel = $this->entityManager->getRepository(Channel::class)->findOneBy(['name' => $channelName]);
+ $vendor = $this->sharedStorage->get('vendor');
+
+ $virtualWallet = $this->virtualWalletFactory->createVirtualWalletWithBalance(
+ $channel,
+ $vendor,
+ $this->getCustomer($vendor),
+ (int) floor($balance * 100),
+ );
+
+ $this->entityManager->persist($virtualWallet);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is a virtual wallet for vendor :vendorEmail with balance :balance
+ */
+ public function thereIsAVirtualWalletForVendorAndBalance(string $channelName, float $balance): void
+ {
+ $vendor = $this->entityManager->getRepository(Vendor::class)->findOneBy(['email' => $vendorEmail]);
+ $channel = $this->sharedStorage->get('channel');
+
+ $virtualWallet = $this->virtualWalletFactory->createVirtualWalletWithBalance(
+ $vendor,
+ $channel,
+ $this->getCustomer($vendor),
+ (int) floor($balance * 100),
+ );
+
+ $this->entityManager->persist($virtualWallet);
+ $this->entityManager->flush();
+ }
+
+ private function getVendorByEmail(string $vendorEmail): VendorInterface
+ {
+ $shopUser = $this->entityManager->getRepository(ShopUser::class)->findOneBy(['username' => $vendorEmail]);
+ Assert::isInstanceOf($shopUser, ShopUser::class);
+
+ $vendor = $shopUser->getVendor();
+ Assert::isInstanceOf($vendor, VendorInterface::class);
+
+ return $vendor;
+ }
+
+ private function getCustomer(VendorInterface $vendor): CustomerInterface
+ {
+ $shopUser = $vendor->getShopUser();
+ Assert::isInstanceOf($shopUser, ShopUser::class);
+
+ $customer = $shopUser->getCustomer();
+
+ return ($customer instanceof CustomerInterface)
+ ? $customer
+ : $this->sharedStorage->get('customer');
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Shop/OrderContext.php b/OpenMarketplace/tests/Behat/Context/Shop/OrderContext.php
new file mode 100644
index 0000000..58c1a3e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Shop/OrderContext.php
@@ -0,0 +1,388 @@
+productPage = $productPage;
+ $this->sharedStorage = $sharedStorage;
+ $this->orderRepository = $orderRepository;
+ $this->paymentMethodFactory = $paymentMethodFactory;
+ $this->methodRepository = $methodRepository;
+ }
+
+ /**
+ * @Then I should see :count orders
+ */
+ public function iShouldSeeOrders($count)
+ {
+ $page = $this->getSession()->getPage();
+ $tableWrapper = $page->find('css', 'table');
+ $orders = $tableWrapper->findAll('css', '.item');
+ Assert::eq(count($orders), $count);
+ }
+
+ /**
+ * @Then I should see :count :mode order(s)
+ */
+ public function iShouldSeeOrdersWithMode($count, $mode)
+ {
+ $page = $this->getSession()->getPage();
+ $tableWrapper = $page->find('css', 'table');
+ $orders = $tableWrapper->findAll('css', '.item');
+ Assert::eq(count($orders), $count);
+ $htmlString = $page->getHtml();
+ $pattern = "/\/admin\/orders\/(\d+)/";
+ preg_match_all($pattern, $htmlString, $matches);
+ $orders = $this->orderRepository->findBy(['id' => $matches[1]]);
+ Assert::eq(count($orders), $count);
+ foreach ($orders as $order) {
+ Assert::eq($order->getMode(), $mode);
+ }
+ }
+
+ /**
+ * @Then I should see :count :mode order(s) in order history
+ */
+ public function iShouldSeeOrdersWithModeInHistory($count, $mode)
+ {
+ $page = $this->getSession()->getPage();
+ $tableWrapper = $page->find('css', 'table');
+ $orders = $tableWrapper->findAll('css', '.item');
+ Assert::eq(count($orders), $count);
+ $htmlString = $page->getHtml();
+ $pattern = "/\/.*\/account\/orders\/(\d+)/";
+ preg_match_all($pattern, $htmlString, $matches);
+ $orders = $this->orderRepository->findBy(['number' => $matches[1]]);
+ Assert::eq(count($orders), $count);
+ foreach ($orders as $order) {
+ Assert::eq($order->getMode(), $mode);
+ }
+ }
+
+ /**
+ * @Then I should see :count orders with :status status label :color
+ */
+ public function iShouldSeeOrdersWithStatus(
+ int $count,
+ string $status,
+ string $color
+ ) {
+ $page = $this->getSession()->getPage();
+ $tableWrapper = $page->find('css', 'table');
+ $orders = $tableWrapper->findAll('css', '.item');
+ Assert::eq(count($orders), $count);
+ $labels = $page->findAll('css', '.ui.' . $color . 'label');
+ foreach ($labels as $label) {
+ Assert::eq($label->getText(), $status);
+ }
+ }
+
+ /**
+ * @Given I complete checkout
+ */
+ public function iCompleteCheckout()
+ {
+ $page = $this->getSession()->getPage();
+ $page->find('css', 'button')->press();
+ }
+
+ /**
+ * @Given I submit form
+ */
+ public function iSubmitForm()
+ {
+ $page = $this->getSession()->getPage();
+ $page->find('css', '.ui.large.primary.icon.labeled.button')->press();
+ }
+
+ /**
+ * @Given I choose shipment
+ */
+ public function iChooseShipment()
+ {
+ $page = $this->getSession()->getPage();
+ $page->find('css', '.ui.large.primary.icon.labeled.button')->press();
+ }
+
+ /**
+ * @Given I choose payment
+ */
+ public function iChoosePayment()
+ {
+ $page = $this->getSession()->getPage();
+ $page->find('css', '.ui.large.primary.icon.labeled.button')->press();
+ }
+
+ /**
+ * @Given I choose payment method by code :code
+ */
+ public function iChoosePaymentMethodByCode(string $code): void
+ {
+ $page = $this->getSession()->getPage();
+
+ $radioButton = $page->find('css', "input[type='radio']");
+
+ if (null === $radioButton) {
+ throw new \InvalidArgumentException(sprintf('Could not find payment method with code "%s".', $code));
+ }
+
+ $radioButton->selectOption($code);
+ $page->find('css', '.ui.large.primary.icon.labeled.button')->press();
+ }
+
+ /**
+ * @Given I have :count products in cart
+ */
+ public function iHaveProductsInCart($count)
+ {
+ $products = $this->sharedStorage->get('products');
+ for ($i = 1; $i <= $count; ++$i) {
+ $slug = $products[$i]->getSlug();
+ $this->productPage->open(['slug' => $slug]);
+ $this->productPage->addToCart();
+ }
+ $this->sharedStorage->set('products', $products);
+ }
+
+ /**
+ * @Given I have product :name in cart
+ */
+ public function iHaveProductInCart(string $name)
+ {
+ $product = $this->sharedStorage->get('product');
+ $slug = $product->getSlug();
+ $this->productPage->open(['slug' => $slug]);
+ $this->productPage->addToCart();
+ }
+
+ /**
+ * @Given I click :button
+ */
+ public function iClickButton($button)
+ {
+ $this->getSession()->getPage()->pressButton($button);
+ }
+
+ /**
+ * @Then I should see :ordersCount orders on page :pageNumber
+ */
+ public function iShouldSeeOrdersOnPage($ordersCount, $pageNumber)
+ {
+ $paginationLimit = $this->sharedStorage->get('pagination_limit');
+ $this->visitPath("/en_US/account/vendor/orders?limit=$paginationLimit&page=$pageNumber");
+ $page = $this->getSession()->getPage();
+ $table = $page->find('css', '.ui.sortable.stackable.very.basic.celled.table');
+ $orderRows = $table->findAll('css', '.item');
+
+ Assert::count($orderRows, $ordersCount);
+ }
+
+ /**
+ * @Given Pagination is set to display :paginationLimit orders per page
+ */
+ public function paginationIsSetToDisplayOrderPerPage($paginationLimit)
+ {
+ $this->sharedStorage->set('pagination_limit', $paginationLimit);
+ }
+
+ /**
+ * @Then I should see customer with name :name
+ */
+ public function iShouldSeeClientWithName($name)
+ {
+ $page = $this->getSession()->getPage();
+ $table = $page->find('css', '.ui.sortable.stackable.very.basic.celled.table');
+ assertStringContainsString($name, $table->getText());
+ }
+
+ /**
+ * @Then I should not see customer with name :name
+ */
+ public function iShouldNotSeeClientWithName($name)
+ {
+ $page = $this->getSession()->getPage();
+ assertStringNotContainsString($name, $page->getText());
+ }
+
+ /**
+ * @Given I am on customers page
+ */
+ public function iAmOnCustomersPage()
+ {
+ $this->visitPath('en_US/account/vendor/customers');
+ }
+
+ /**
+ * @Then I should see customer details with name :name
+ */
+ public function iShouldSeeCustomerDetailsWithName($name)
+ {
+ $page = $this->getSession()->getPage();
+ $card = $page->find('css', '.ui.fluid.card');
+ assertStringContainsString($name, $card->getText());
+ }
+
+ /**
+ * @Given I add this product to the cart
+ */
+ public function iAddThisProductToTheCart()
+ {
+ $product = $this->sharedStorage->get('product');
+
+ $slug = $product->getSlug();
+ $this->productPage->open(['slug' => $slug]);
+ $this->productPage->addToCart();
+
+ $this->sharedStorage->set('product', $product);
+ }
+
+ /**
+ * @Given I finalize order
+ */
+ public function iFinalizeOrder()
+ {
+ $this->iProvideAddressInformation();
+ $this->iChooseShipment();
+ $this->iChoosePayment();
+ $this->iCompleteCheckout();
+ }
+
+ /**
+ * @Given I finalize order with payment method :code
+ */
+ public function iFinalizeOrderWithPaymentMethodCode(string $code)
+ {
+ $this->iProvideAddressInformation();
+ $this->iChooseShipment();
+ $this->iChoosePaymentMethodByCode($code);
+ $this->iCompleteCheckout();
+ }
+
+ /**
+ * @Given I provide address information
+ */
+ public function iProvideAddressInformation(): void
+ {
+ $this->visitPath('/en_US/checkout/address');
+ $this->fillField('sylius_checkout_address[billingAddress][firstName]', 'Test name');
+ $this->fillField('sylius_checkout_address[billingAddress][lastName]', 'Test name');
+ $this->fillField('sylius_checkout_address[billingAddress][company]', 'Test company');
+ $this->fillField('sylius_checkout_address[billingAddress][street]', 'Test street');
+ $this->selectOption('sylius_checkout_address[billingAddress][countryCode]', 'United States');
+ $this->fillField('sylius_checkout_address[billingAddress][city]', 'Test city');
+ $this->fillField('sylius_checkout_address[billingAddress][postcode]', 'Test code');
+ $this->iSubmitForm();
+ }
+
+ /**
+ * @Then primary order should not have number
+ */
+ public function primaryOrderShouldNotHaveNumber()
+ {
+ /** @var Order|null $order */
+ $order = $this->orderRepository->findOneBy(['mode' => OrderInterface::PRIMARY_ORDER_MODE]);
+
+ if (null !== $order) {
+ Assert::eq($order->getNumber(), null);
+ }
+ }
+
+ private function fillField($field, $value)
+ {
+ $field = $this->fixStepArgument($field);
+ $value = $this->fixStepArgument($value);
+ $this->getSession()->getPage()->fillField($field, $value);
+ }
+
+ private function fixStepArgument($argument): array|string
+ {
+ return str_replace('\\"', '"', $argument);
+ }
+
+ private function selectOption($select, $option): void
+ {
+ $select = $this->fixStepArgument($select);
+ $option = $this->fixStepArgument($option);
+ $this->getSession()->getPage()->selectFieldOption($select, $option);
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+
+ /**
+ * @Given There is payment method
+ */
+ public function thereIsPaymentMethod(): void
+ {
+ $payment = $this->paymentMethodFactory->create([
+ 'name' => ucfirst($name),
+ 'code' => $code,
+ 'description' => $description,
+ 'gatewayName' => $gatewayFactory,
+ 'gatewayFactory' => $gatewayFactory,
+ 'enabled' => true,
+ 'channels' => ($addForCurrentChannel && $this->sharedStorage->has('channel')) ? [$this->sharedStorage->get('channel')] : [],
+ ]);
+ $this->methodRepository->add($payment);
+ }
+
+ /**
+ * @Then I should see :name payment method
+ */
+ public function iShouldSeePaymentMethod(string $name): void
+ {
+ $this->assertSession()->pageTextContains($this->fixStepArgument($name));
+ }
+
+ /**
+ * @Then I follow :label button
+ */
+ public function iFollowButton(string $label): void
+ {
+ $label = $this->fixStepArgument($label);
+ $this->getSession()->getPage()->clickLink($label);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/AdminContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/AdminContext.php
new file mode 100644
index 0000000..444d700
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/AdminContext.php
@@ -0,0 +1,35 @@
+visitPath('/admin/login');
+ $page = $this->getPage();
+ $page->fillField('Username', 'admin');
+ $page->fillField('Password', 'admin');
+ $page->pressButton('Login');
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/DashboardStatisticsContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/DashboardStatisticsContext.php
new file mode 100644
index 0000000..62a9392
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/DashboardStatisticsContext.php
@@ -0,0 +1,36 @@
+entityManager = $entityManager;
+ }
+
+ /**
+ * @BeforeScenario
+ */
+ public function clearData()
+ {
+ $purger = new ORMPurger($this->entityManager);
+ $purger->purge();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/OrderContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/OrderContext.php
new file mode 100644
index 0000000..45f8df9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/OrderContext.php
@@ -0,0 +1,18 @@
+adminUserExampleFactory->create();
+ $admin->setUsername($username);
+ $admin->setPlainPassword($password);
+ $admin->setEmail('admin@email.com');
+ $this->entityManager->persist($admin);
+ $this->entityManager->flush();
+
+ $admin->setPlainPassword($password);
+ $this->sharedStorage->set('admin', $admin);
+ }
+
+ /**
+ * @Given I am logged in as an admin
+ */
+ public function iAmLoggedInAsAnAdmin()
+ {
+ $admin = $this->sharedStorage->get('admin');
+
+ $this->visitPath('/admin/login');
+ $this->getPage()->fillField('Username', $admin->getUsername());
+ $this->getPage()->fillField('Password', $admin->getPlainPassword());
+ $this->getPage()->pressButton('Login');
+ ($this->getPage()->findLink('Logout'));
+ }
+
+ /**
+ * @Given I am logged in as an user :email with password :password
+ */
+ public function iAmLoggedInAsUserWithPassword(string $email, string $password)
+ {
+ $this->visitPath('/en_US/login');
+ $this->getPage()->fillField('Username', $email);
+ $this->getPage()->fillField('Password', $password);
+ $this->getPage()->pressButton('Login');
+ }
+
+ /**
+ * @Given there is a vendor user :vendor_user_email registered in country :country_code
+ */
+ public function thereIsAVendorUserRegisteredInCountry($vendor_user_email, $country_code): void
+ {
+ $user = $this->shopUserExampleFactory->create(['email' => $vendor_user_email, 'password' => 'password', 'enabled' => true]);
+
+ $this->sharedStorage->set('user', $user);
+
+ $this->userRepository->add($user);
+
+ $country = $this->entityManager->getRepository(Country::class)->findOneBy(['code' => $country_code]);
+
+ if (null === $country) {
+ /** @var CountryInterface $country */
+ $country = $this->countryFactory->createNew();
+ $country->setCode($country_code);
+ $country->enable();
+ $this->entityManager->persist($country);
+ }
+
+ $options = [
+ 'company_name' => 'Company Name',
+ 'phone_number' => '333333333',
+ 'tax_identifier' => '543455',
+ 'street' => 'Tajna 13',
+ 'city' => 'Warsaw',
+ 'postcode' => '00-111',
+ 'slug' => 'vendor-slug',
+ 'description' => 'description',
+ 'country' => $country,
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $vendor->getVendorAddress()->setCountry($country);
+ $vendor->setShopUser($user);
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ $this->sharedStorage->set('vendor', $vendor);
+ }
+
+ /**
+ * @Given there is :arg2 product listing created by vendor
+ */
+ public function thereIsProductListingCreatedByVendor($count)
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ for ($i = 0; $i < $count; ++$i) {
+ $productListing = new Listing();
+ $productListing->setCode('code' . $i);
+ $productListing->setVendor($vendor);
+
+ $productDraft = new Draft();
+ $productDraft->setCode('code' . $i);
+ $productDraft->setVersionNumber(0);
+ $productDraft->setProductListing($productListing);
+ $productListing->sendToVerification($productDraft);
+
+ $productTranslation = new DraftTranslation();
+ $productTranslation->setLocale('en_US');
+ $productTranslation->setSlug('product-listing-' . $i);
+ $productTranslation->setName('product-listing-' . $i);
+ $productTranslation->setDescription('product-listing-' . $i);
+ $productTranslation->setProductDraft($productDraft);
+
+ $productPricing = new ListingPrice();
+ $productPricing->setProductDraft($productDraft);
+ $productPricing->setPrice(1000);
+ $productPricing->setOriginalPrice(1000);
+ $productPricing->setMinimumPrice(1000);
+ $productPricing->setChannelCode('web_us');
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+
+ $this->sharedStorage->set('product_listing' . $i, $productListing);
+ }
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is/are :count product listing(s)
+ */
+ public function thereAreProductListings($count)
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ for ($i = 0; $i < $count; ++$i) {
+ $productListing = $this->createProductListing($vendor, 'code' . $i);
+ $productDraft = $this->createProductListingDraft($productListing, 'code' . $i);
+ $productTranslation = $this->createProductListingTranslation(
+ $productDraft,
+ 'product-listing-' . $i,
+ 'product-listing-' . $i,
+ 'product-listing-' . $i
+ );
+ $productPricing = $this->createProductListingPricing($productDraft);
+
+ $productListing->setPublishedAt($productDraft->getPublishedAt());
+ $productListing->setVerificationStatus($productDraft->getStatus());
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+ }
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is product listing enabled for channel
+ */
+ public function thereIsProductListingForChannel()
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $channel = $this->getChannel();
+
+ $productListing = $this->createProductListing($vendor, 'code');
+ $productDraft = $this->createProductListingDraft($productListing, 'code');
+ $productDraft->addChannel($channel);
+ $productTranslation = $this->createProductListingTranslation(
+ $productDraft,
+ 'product-listing-',
+ 'product-listing-',
+ 'product-listing-'
+ );
+ $productPricing = $this->createProductListingPricing($productDraft);
+
+ $productListing->insertDraft($productDraft);
+ $productListing->setPublishedAt($productDraft->getPublishedAt());
+ $productListing->setVerificationStatus($productDraft->getStatus());
+
+ $this->sharedStorage->set('product_listing', $productListing);
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Then there should be product with channel enabled
+ */
+ public function thereShouldBeProductWithChannel()
+ {
+ $setChannel = $this->getChannel();
+ $products = $this->entityManager->getRepository(Product::class)->findAll();
+ Assert::count($products, 1);
+ /** @var ProductInterface $product */
+ $product = $products[0];
+ Assert::count($product->getChannels(), 1);
+ $productChannels = $product->getChannels();
+ /** @var ChannelInterface $productChannel */
+ $productChannel = $productChannels[0];
+ Assert::eq($setChannel, $productChannel);
+ }
+
+ /**
+ * @Given there is a product listing with code :code and name :name and status :status
+ */
+ public function thereIsAProductListingWithCodeAndNameAndStatus(
+ string $code,
+ string $name,
+ string $status
+ ) {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ $productListing = $this->createProductListing($vendor, $code);
+ $productDraft = $this->createProductListingDraft($productListing, $code, $status);
+ $productTranslation = $this->createProductListingTranslation($productDraft, $name);
+ $productPricing = $this->createProductListingPricing($productDraft);
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Then I should see :count product listing(s)
+ */
+ public function iShouldSeeProductListings($count)
+ {
+ $rows = $this->getPage()->findAll('css', 'table > tbody > tr');
+ Assert::notEmpty($rows, 'Could not find any rows');
+ Assert::eq($count, count($rows), 'Rows numbers are not equal');
+ }
+
+ /**
+ * @Then I should see url :url
+ */
+ public function iShouldSeeUrl($url)
+ {
+ $currentUrl = $this->getSession()->getCurrentUrl();
+ $matches = preg_match($url, $currentUrl);
+ Assert::eq(1, $matches);
+ }
+
+ /**
+ * @Given I should see product's listing status :status
+ */
+ public function iShouldSeeProductsListingStatus($status)
+ {
+ $productListingStatus = $this->getPage()->find('css', sprintf('table > tbody > tr > td:contains("%s")', $status));
+ Assert::notNull($productListingStatus);
+ }
+
+ /**
+ * @Given I click :button button
+ */
+ public function iClickButton($button)
+ {
+ $this->getPage()->pressButton($button);
+ }
+
+ /**
+ * @Then I should be redirected to :url
+ */
+ public function iShouldBeRedirectedTo($url)
+ {
+ Assert::eq($url, $this->getSession()->getCurrentUrl());
+ }
+
+ /**
+ * @Given There is attribute with code :code
+ */
+ public function thereIsAttributeWithCode($code): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ /** @var DraftAttribute $attribute */
+ $attribute = $this->draftAttributeFactory->createNew();
+ $attribute->setType('text');
+ $attribute->setStorageType('text');
+ $attribute->setCode($code);
+ $attribute->setVendor($vendor);
+
+ $translation = new DraftAttributeTranslation();
+ $translation->setLocale('en_US');
+ $translation->setTranslatable($attribute);
+ $translation->setName('attribute');
+
+ $attribute->addTranslation($translation);
+ $this->sharedStorage->set('attribute', $attribute);
+
+ $this->entityManager->persist($attribute);
+ }
+
+ /**
+ * @Given there is a product listing with code :code and name :name and status :status with attribute and image
+ */
+ public function thereIsAProductListingWithCodeAndNameAndStatusWithAttributeAndImage(
+ $code,
+ $name,
+ $status
+ ): void {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ $attribute = $this->sharedStorage->get('attribute');
+
+ $attributeValue = new DraftAttributeValue();
+ $attributeValue->setAttribute($attribute);
+ $attributeValue->setLocaleCode('en_US');
+ $attributeValue->setValue('attribute_testing_value');
+
+ $productListing = $this->createProductListing($vendor, $code);
+ /** @var DraftInterface $productDraft */
+ $productDraft = $this->createProductListingDraft($productListing, $code, $status);
+ $productDraft->addAttribute($attributeValue);
+ $productTranslation = $this->createProductListingTranslation($productDraft, $name);
+
+ $productPricing = $this->createProductListingPricing($productDraft);
+
+ $draftImage = new DraftImage();
+ $draftImage->setOwner($productDraft);
+ $draftImage->setPath('path/to/file');
+
+ $productDraft->addImage($draftImage);
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+ $this->entityManager->persist($attributeValue);
+ $this->entityManager->persist($draftImage);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @When I click :buttonText
+ */
+ public function iClick($buttonText): void
+ {
+ $this->getPage()->pressButton($buttonText);
+ }
+
+ /**
+ * @Then I should see image
+ */
+ public function iShouldSeeImage(): void
+ {
+ $page = $this->getSession()->getPage();
+
+ $mediaContainer = $page->find('css', '#media');
+ $image = $mediaContainer->find('css', 'img');
+ $imagePath = $image->getAttribute('src');
+
+ Assert::contains($imagePath, 'path/to/file', 'no image found');
+ }
+
+ /**
+ * @Given product listing has attribute :code with value :value
+ */
+ public function productListingHasAttributeWithValue(string $code, string $value): void
+ {
+ $productListing = $this->sharedStorage->get('product_listing');
+ Assert::isInstanceOf($productListing, ListingInterface::class);
+
+ $attribute = $this->sharedStorage->get(sprintf('draft_attribute_%s', $code));
+ Assert::isInstanceOf($attribute, DraftAttributeInterface::class);
+
+ $attributeValue = new DraftAttributeValue();
+
+ $attributeValue->setAttribute($attribute);
+ $attributeValue->setLocaleCode('en_US');
+ $attributeValue->setValue($value);
+
+ $latestDraft = $productListing->getLatestDraft();
+ $latestDraft->addAttribute($attributeValue);
+
+ $this->entityManager->persist($latestDraft);
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($attributeValue);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is already published product with attribute :string with value :value
+ */
+ public function thereIsAlreadyPublishedProductWithAttributeWithValue(
+ string $code,
+ string $value
+ ): void {
+ $productListing = $this->sharedStorage->get('product_listing');
+ Assert::isInstanceOf($productListing, ListingInterface::class);
+
+ $attribute = $this->sharedStorage->get(sprintf('draft_attribute_%s', $code));
+ Assert::isInstanceOf($attribute, DraftAttributeInterface::class);
+
+ $product = $this->sharedStorage->get('product');
+ Assert::isInstanceOf($product, ProductInterface::class);
+ $productListing->setProduct($product);
+
+ $productAttribute = $this->productAttributeFactory->createClone($attribute);
+
+ $productAttributeValue = $this->productAttributeValueFactory->createWithProductAttributeAndValue(
+ $productAttribute,
+ $value
+ );
+
+ $product->addAttribute($productAttributeValue);
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productAttribute);
+ $this->entityManager->persist($productAttributeValue);
+ $this->entityManager->persist($product);
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @When I should see :attribute with value :value
+ */
+ public function iShouldSeeWithValue(string $attribute, string $value)
+ {
+ $page = $this->getPage();
+
+ $element = $page->find('css', 'div#attributes');
+ $attribFound = $element->find('css', sprintf('table > tbody > tr > td:contains("%s")', $value));
+
+ Assert::notNull($attribFound);
+ }
+
+ /**
+ * @When I should not see :attribute with value :value
+ */
+ public function iShouldNotSeeWithValue(string $attribute, string $value): void
+ {
+ $page = $this->getPage();
+
+ $element = $page->find('css', 'div#attributes');
+ $foundAttribute = $element->find('css', sprintf('table > tbody > tr > td:contains("%s")', $value));
+
+ Assert::null($foundAttribute);
+ }
+
+ /**
+ * @return DocumentElement
+ */
+ private function getPage()
+ {
+ return $this->getSession()->getPage();
+ }
+
+ private function createProductListing(VendorInterface $vendor, string $code): ListingInterface
+ {
+ $productListing = new Listing();
+ $productListing->setCode($code);
+ $productListing->setVendor($vendor);
+
+ return $productListing;
+ }
+
+ private function createProductListingDraft(
+ ListingInterface $productListing,
+ string $code = 'code',
+ string $status = 'under_verification',
+ int $versionNumber = 0,
+ string $publishedAt = 'now'
+ ): DraftInterface {
+ $productDraft = new Draft();
+ $productDraft->setCode($code);
+ $productDraft->setStatus($status);
+ $productDraft->setPublishedAt(new \DateTime($publishedAt));
+ $productDraft->setVersionNumber($versionNumber);
+ $productDraft->setProductListing($productListing);
+ $channel = $this->getChannel();
+ $productDraft->setChannels(new ArrayCollection([$channel]));
+
+ return $productDraft;
+ }
+
+ private function createProductListingTranslation(
+ DraftInterface $productDraft,
+ string $name = 'product-listing-name',
+ string $description = 'product-listing-description',
+ string $slug = 'product-listing-slug',
+ string $locale = 'en_US'
+ ): DraftTranslationInterface {
+ $productTranslation = new DraftTranslation();
+ $productTranslation->setLocale($locale);
+ $productTranslation->setSlug($slug);
+ $productTranslation->setName($name);
+ $productTranslation->setDescription($description);
+ $productTranslation->setProductDraft($productDraft);
+
+ return $productTranslation;
+ }
+
+ private function createProductListingPricing(
+ DraftInterface $productDraft,
+ int $price = 1000,
+ int $originalPrice = 1000,
+ int $minimumPrice = 1000,
+ string $channelCode = 'web_us'
+ ): ListingPriceInterface {
+ $productPricing = new ListingPrice();
+ $productPricing->setProductDraft($productDraft);
+ $productPricing->setPrice($price);
+ $productPricing->setOriginalPrice($originalPrice);
+ $productPricing->setMinimumPrice($minimumPrice);
+ $productPricing->setChannelCode($channelCode);
+
+ return $productPricing;
+ }
+
+ private function getChannel(): ChannelInterface
+ {
+ return $this->entityManager->getRepository(ChannelInterface::class)
+ ->findAll()[0];
+ }
+
+ /**
+ * @Given there is conversation category :categoryName
+ */
+ public function thereIsConversationCategory($categoryName)
+ {
+ $category = new Category();
+ $category->setName($categoryName);
+ $this->entityManager->persist($category);
+ $this->entityManager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/SettlementContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/SettlementContext.php
new file mode 100644
index 0000000..2bb78a9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/SettlementContext.php
@@ -0,0 +1,136 @@
+adminSettlementPage->openSettlementsIndex();
+ }
+
+ /**
+ * @When I should see :count settlements with status :status
+ * @When I should see :count settlements
+ */
+ public function iSeeSettlementsWithStatus(string $count, string $status = null): void
+ {
+ $settlements = $this->adminSettlementPage->getSettlementsWithStatus($status);
+
+ Assert::eq(count($settlements), $count);
+ }
+
+ /**
+ * @When I should see :count settlement(s) for vendor :vendorName
+ */
+ public function iSeeSettlementsForVendor(string $count, string $vendorName): void
+ {
+ $settlements = $this->adminSettlementPage->getSettlementsForVendor($vendorName);
+
+ Assert::eq(count($settlements), $count);
+ }
+
+ /**
+ * @When I should see settlement total with amount of :amount for :channelName channel
+ */
+ public function iSeeSettlementForAmountForChannel(string $amount, string $channelName): void
+ {
+ $settlements = $this->adminSettlementPage->checkExistsSettlementForAmountAndChannel($amount, $channelName);
+ }
+
+ /**
+ * @When I filter settlements by status :status
+ */
+ public function iFilterSettlementsByStatus(string $status): void
+ {
+ $this->adminSettlementPage->filterByStatus($status);
+ }
+
+ /**
+ * @When I filter settlements by period :period
+ */
+ public function iFilterSettlementsByPeriod(string $period): void
+ {
+ $this->adminSettlementPage->filterByPeriod($period);
+ }
+
+ /**
+ * @When I filter settlements by vendor :vendor
+ */
+ public function iFilterSettlementsByVendor(string $vendor): void
+ {
+ $this->adminSettlementPage->filterByVendor($vendor);
+ }
+
+ /**
+ * @Then I filter settlements by channel :channelName
+ */
+ public function iFilterSettlementsByChannel(string $channelName): void
+ {
+ $this->adminSettlementPage->filterByChannel($channelName);
+ }
+
+ /**
+ * @Then I should see settlement for channel :channelName first
+ */
+ public function iShouldSeeSettlementForChannelFirst(string $channelName): void
+ {
+ $sorting = $this->sharedStorage->get('sorting');
+
+ $settlements = $this->adminSettlementPage->getSortedSettlements($sorting);
+ $firstSettlement = $settlements[0];
+
+ Assert::contains($firstSettlement->getText(), $channelName);
+ }
+
+ /**
+ * @Then I should see :amount settlement(s) with today as end of settlement period
+ */
+ public function iShouldSeeSettlementsEndingToday(string $amount): void
+ {
+ $settlements = $this->adminSettlementPage->getSettlementsByPeriodEndsToday(true);
+ Assert::count($settlements, (int) $amount);
+ }
+
+ /**
+ * @Then I should see :amount settlement(s) with different day as end of settlement period
+ */
+ public function iShouldSeeSettlementsEndingDifferentDay(string $amount): void
+ {
+ $settlements = $this->adminSettlementPage->getSettlementsByPeriodEndsToday(false);
+ Assert::count($settlements, (int) $amount);
+ }
+
+ /**
+ * @Then I clear settlement filters
+ */
+ public function iClearFilters(): void
+ {
+ $this->adminSettlementPage->clearFilters();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorDisablingContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorDisablingContext.php
new file mode 100644
index 0000000..f17a6eb
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorDisablingContext.php
@@ -0,0 +1,97 @@
+entityManager = $entityManager;
+ $this->vendorExampleFactory = $vendorExampleFactory;
+ }
+
+ /**
+ * @Given There is a :ifEnabled vendor
+ */
+ public function thereIsAVendor($ifEnabled)
+ {
+ $flag = 'enabled' == $ifEnabled ? true : false;
+
+ $options = [
+ 'company_name' => 'vendor',
+ 'phone_number' => 'vendorPhone',
+ 'tax_identifier' => 'vendorTax',
+ 'slug' => 'slug',
+ 'description' => 'description',
+ 'enabled' => $flag,
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @When I click :buttonText
+ */
+ public function iClick($buttonText)
+ {
+ $this->getPage()->pressButton($buttonText);
+ }
+
+ /**
+ * @When I choose :element
+ */
+ public function iChoose($element)
+ {
+ $page = $this->getSession()->getPage();
+ $findName = $page->find('css', $element);
+ if (!$findName) {
+ throw new Exception($element . ' could not be found');
+ }
+ $findName->click();
+ }
+
+ /**
+ * @Then I should not see :ifEnabled button
+ */
+ public function iShouldNotSeeButton($ifEnabled)
+ {
+ $element = '#' . strtolower($ifEnabled);
+ $page = $this->getSession()->getPage();
+ $findName = $page->find('css', $element);
+ Assert::null($findName);
+ }
+
+ /**
+ * @return DocumentElement
+ */
+ private function getPage()
+ {
+ return $this->getSession()->getPage();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorListingContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorListingContext.php
new file mode 100644
index 0000000..88782c9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorListingContext.php
@@ -0,0 +1,104 @@
+ 'vendor ' . $i,
+ 'phone_number' => 'vendorPhone' . $i,
+ 'tax_identifier' => 'vendorTax' . $i,
+ 'slug' => 'vendor-' . $i,
+ 'description' => 'description',
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $this->entityManager->persist($vendor);
+ }
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Then I should see :count vendor rows
+ */
+ public function iShouldSeeVendorRows($count): void
+ {
+ $rows = $this->getPage()->findAll('css', 'table > tbody > tr');
+ Assert::notEmpty($rows, 'Could not find any rows');
+ Assert::eq($count, count($rows), 'Rows numbers are not equal');
+ }
+
+ /**
+ * @Then page should contain valid customer :email link
+ */
+ public function iShouldSeeValidCustomerLink(string $email): void
+ {
+ /** @var Customer $customer */
+ $customer = $this->entityManager->getRepository(Customer::class)->findOneBy(['email' => $email]);
+ $link = sprintf('%s ', $customer->getId(), $email);
+ Assert::contains($this->getPage()->getHtml(), $link);
+ }
+
+ /**
+ * @Given /^I should see vendors commission data$/
+ */
+ public function iShouldSeeVendorsCommissionData(): void
+ {
+ $content = $this->getPage()->getText();
+ Assert::contains($content, 'Commission (%)');
+ Assert::contains($content, 'Commission Type');
+ }
+
+ /**
+ * @Given I am on admin vendor listing page
+ * @Given I visit admin vendor listing page
+ */
+ public function iAmOnAdminVendorListingPage(): void
+ {
+ $this->vendorPage->open();
+ }
+
+ /**
+ * @When I click edit button for :vendorName
+ */
+ public function iClickFor(string $vendorName): void
+ {
+ $this->vendorPage->clickEditButton($vendorName);
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorUpdateContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorUpdateContext.php
new file mode 100644
index 0000000..202c5f0
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorUpdateContext.php
@@ -0,0 +1,76 @@
+ 'vendor',
+ 'phone_number' => 'vendorPhone',
+ 'tax_identifier' => 'vendorTax',
+ 'slug' => 'slug',
+ 'description' => 'description',
+ 'status' => $ifVerified,
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ if ('requested' === $ifRequested) {
+ $vendor->setEditedAt(new DateTime());
+ }
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given /^I should see settlement frequency "([^"]*)"$/
+ */
+ public function iShouldSeeSettlementFrequency(string $frequency): void
+ {
+ $this->vendorUpdatePage->checkSettlementFrequency($frequency);
+ }
+
+ /**
+ * @When I set settlement frequency to :frequency
+ */
+ public function iSetSettlementFrequencyTo(string $frequency): void
+ {
+ $this->vendorUpdatePage->setSettlementFrequency($frequency);
+ }
+
+ /**
+ * @When I submit vendor update form
+ */
+ public function iSubmitVendorUpdateForm(): void
+ {
+ $this->vendorUpdatePage->submitVendorForm();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorVerificationContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorVerificationContext.php
new file mode 100644
index 0000000..333cf41
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VendorVerificationContext.php
@@ -0,0 +1,75 @@
+entityManager = $entityManager;
+ $this->container = $container;
+ $this->vendorExampleFactory = $vendorExampleFactory;
+ }
+
+ /**
+ * @Given There is an unverified Vendor
+ */
+ public function thereIsAnUnverifiedVendor()
+ {
+ $vendorCountry = $this->container->get('sylius.factory.country')->createNew();
+ $vendorCountry->setCode('US');
+ $this->entityManager->persist($vendorCountry);
+
+ $options = [
+ 'company_name' => 'vendor',
+ 'phone_number' => 'vendorPhone',
+ 'tax_identifier' => 'vendorTax',
+ 'street' => 'vendorStreet',
+ 'city' => 'vendorCity',
+ 'postcode' => 'vendorCode',
+ 'slug' => 'slug',
+ 'description' => 'description',
+ 'country' => $vendorCountry,
+ 'status' => 'unverified',
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $this->entityManager->persist($vendorCountry);
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @When I click :buttonText
+ */
+ public function iClick($buttonText)
+ {
+ $this->getSession()->getPage()->pressButton($buttonText);
+ sleep(1);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/ViewPaymentContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/ViewPaymentContext.php
new file mode 100644
index 0000000..3de210e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/ViewPaymentContext.php
@@ -0,0 +1,133 @@
+entityManager = $entityManager;
+ $this->orderExampleFactory = $orderExampleFactory;
+ $this->orderRepository = $orderRepository;
+ $this->sharedStorage = $sharedStorage;
+ }
+
+ /**
+ * @BeforeScenario
+ */
+ public function clearData()
+ {
+ $purger = new ORMPurger($this->entityManager);
+ $purger->purge();
+ }
+
+ /**
+ * @Given store has primary and secondary order
+ */
+ public function storeHasPrimaryAndSecondaryOrderWithPayment()
+ {
+ $options['complete_date'] = new \DateTime();
+ $orders = $this->orderExampleFactory->createArray($options);
+
+ foreach ($orders as $order) {
+ $this->orderRepository->add($order);
+ }
+ }
+
+ /**
+ * @Given store has primary and secondary order with payment state :paymentState
+ */
+ public function storeHasPrimaryAndSecondaryOrderWithPaymentState(string $paymentState)
+ {
+ $options['complete_date'] = new \DateTime();
+ $orders = $this->orderExampleFactory->createArray($options);
+
+ /** @var Order $order */
+ foreach ($orders as $order) {
+ $order->setPaymentState($paymentState);
+ $this->orderRepository->add($order);
+ }
+ }
+
+ /**
+ * @Then I should see :count payment(s) for :mode order(s)
+ */
+ public function iShouldSeePayments($count, $mode)
+ {
+ $page = $this->getSession()->getPage();
+ $tableWrapper = $page->find('css', 'table');
+ $payments = $tableWrapper->findAll('css', '.item');
+ Assert::eq(count($payments), $count);
+ $htmlString = $page->getHtml();
+ $pattern = "/\/admin\/orders\/(\d+)/";
+ preg_match_all($pattern, $htmlString, $matches);
+ $orderRepository = $this->entityManager->getRepository(Order::class);
+ $orders = $orderRepository->findBy(['id' => $matches[1]]);
+ foreach ($orders as $order) {
+ Assert::eq($order->getMode(), $mode);
+ }
+ }
+
+ /**
+ * @Then statistics should omit primary order
+ */
+ public function iViewStatistics()
+ {
+ $page = $this->getSession()->getPage();
+ $totalSalesStats = $this->currencyToInt($page->find('css', '#total-sales')->getText());
+ $newOrdersStats = (int) $page->find('css', '#new-orders')->getText();
+ $avarageOrderValueStats = $this->currencyToInt($page->find('css', '#average-order-value')->getText());
+
+ /** @var Order $order */
+ $order = $this->orderRepository->findOneBy(['mode' => OrderInterface::SECONDARY_ORDER_MODE]);
+ $channel = $this->sharedStorage->get('channel');
+ $year = $order->getCheckoutCompletedAt()->format('Y');
+ $startDate = new \DateTime("01-01-{$year}");
+ $endDate = new \DateTime("31-12-{$year}");
+
+ $totalSales = $this->orderRepository->getTotalPaidSalesForChannelInPeriod($channel, $startDate, $endDate);
+ $newOrders = $this->orderRepository->countPaidForChannelInPeriod($channel, $startDate, $endDate);
+ $avarageOrderValue = $totalSales / $newOrders;
+
+ Assert::eq($totalSalesStats, $totalSales);
+ Assert::eq($newOrdersStats, $newOrders);
+ Assert::eq($avarageOrderValueStats, $avarageOrderValue);
+ }
+
+ private function currencyToInt(string $value): int
+ {
+ return (int) preg_replace('/[^0-9]/', '', $value);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/ViewShipmentContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/ViewShipmentContext.php
new file mode 100644
index 0000000..bb3349c
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/ViewShipmentContext.php
@@ -0,0 +1,110 @@
+entityManager = $entityManager;
+ $this->orderExampleFactory = $orderExampleFactory;
+ $this->orderRepository = $orderRepository;
+ $this->shipmentFactory = $shipmentFactory;
+ $this->sharedStorage = $sharedStorage;
+ $this->stateMachineFactory = $stateMachineFactory;
+ }
+
+ /**
+ * @BeforeScenario
+ */
+ public function clearData()
+ {
+ $purger = new ORMPurger($this->entityManager);
+ $purger->purge();
+ }
+
+ /**
+ * @Given store has primary and secondary order
+ */
+ public function storeHasPrimaryAndSecondaryOrderWithPayment()
+ {
+ /** @var Order[] $orders */
+ $orders = $this->orderExampleFactory->createArray();
+ $shippingMethod = $this->sharedStorage->get('shipping_method');
+
+ foreach ($orders as $order) {
+ $shipment = $this->shipmentFactory->createNewWithOrder($order);
+ $shipment->setMethod($shippingMethod);
+ $order->addShipment($shipment);
+ $this->applyShipmentTransitionOnOrder($order, ShipmentTransitions::TRANSITION_CREATE);
+ $this->orderRepository->add($order);
+ }
+ }
+
+ /**
+ * @Then I should see :count shipment(s) for :mode order(s)
+ */
+ public function iShouldSeeShipments($count, $mode)
+ {
+ $page = $this->getSession()->getPage();
+ $tableWrapper = $page->find('css', 'table');
+ $shipments = $tableWrapper->findAll('css', '.item');
+ Assert::eq(count($shipments), $count);
+ $htmlString = $page->getHtml();
+ $pattern = "/\/admin\/orders\/(\d+)/";
+ preg_match_all($pattern, $htmlString, $matches);
+ $orderRepository = $this->entityManager->getRepository(Order::class);
+ $orders = $orderRepository->findBy(['id' => $matches[1]]);
+ foreach ($orders as $order) {
+ Assert::eq($order->getMode(), $mode);
+ }
+ }
+
+ private function applyShipmentTransitionOnOrder(OrderInterface $order, $transition): void
+ {
+ foreach ($order->getShipments() as $shipment) {
+ $this->stateMachineFactory->get($shipment, ShipmentTransitions::GRAPH)->apply($transition);
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Admin/VirtualWalletContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VirtualWalletContext.php
new file mode 100644
index 0000000..c9860ea
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Admin/VirtualWalletContext.php
@@ -0,0 +1,102 @@
+virtualWalletPage->open();
+ }
+
+ /**
+ * @When I filter virtual wallets by vendor :vendor
+ */
+ public function iFilterVirtualWalletsByVendor(string $vendor): void
+ {
+ $this->virtualWalletPage->filterByVendor($vendor);
+ }
+
+ /**
+ * @Then I filter virtual wallets by channel :channelName
+ */
+ public function iFilterVirtualWalletsByChannel(string $channelName): void
+ {
+ $this->virtualWalletPage->filterByChannel($channelName);
+ }
+
+ /**
+ * @Then I should see virtual wallet for channel :channelName first
+ */
+ public function iShouldSeeVirtualWalletForChannelFirst(string $channelName): void
+ {
+ $sorting = $this->sharedStorage->get('sorting');
+
+ $sortedVirtualWallets = $this->virtualWalletPage->getSortedVirtualWallets($sorting);
+ $firstVirtualWallet = $sortedVirtualWallets[0];
+
+ Assert::contains($firstVirtualWallet->getText(), $channelName);
+ }
+
+ /**
+ * @Then I should see virtual wallet for vendor :vendorName first
+ */
+ public function iShouldSeeVirtualWalletForVendorFirst(string $vendorName): void
+ {
+ $sorting = $this->sharedStorage->get('sorting');
+
+ $virtualWallets = $this->virtualWalletPage->getSortedVirtualWallets($sorting);
+ $firstVirtualWallet = $virtualWallets[0];
+
+ Assert::contains($firstVirtualWallet->getText(), $vendorName);
+ }
+
+ /**
+ * @When I should see :count virtual wallets
+ */
+ public function iSeeVirtualWallets(string $count): void
+ {
+ $settlements = $this->virtualWalletPage->getVirtualWallets();
+
+ Assert::eq(count($settlements), $count);
+ }
+
+ /**
+ * @Then I should see :amount as balance for :channelName channel
+ */
+ public function iShouldSeeAsBalanceForChannel(string $amount, string $channelName): void
+ {
+ $this->virtualWalletPage->checkExistsVirtualWalletForAmountAndChannel($amount, $channelName);
+ }
+
+ /**
+ * @When I clear virtual wallets filters
+ */
+ public function iClearVirtualWalletsFilters(): void
+ {
+ $this->virtualWalletPage->clearFilters();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Shop/Account/OrderContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Shop/Account/OrderContext.php
new file mode 100644
index 0000000..79b5998
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Shop/Account/OrderContext.php
@@ -0,0 +1,33 @@
+sharedStorage->get('primary_order');
+
+ $this->assertSession()->addressEquals(sprintf('/en_US/order/%s', $order->getTokenValue()));
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Ui/Vendor/ProductListingContext.php b/OpenMarketplace/tests/Behat/Context/Ui/Vendor/ProductListingContext.php
new file mode 100644
index 0000000..a03c163
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Ui/Vendor/ProductListingContext.php
@@ -0,0 +1,385 @@
+entityManager);
+ $purger->purge();
+ }
+
+ /**
+ * @Given there is an :verified vendor user :username with password :password
+ */
+ public function thereIsAnVendorUserWithPassword(
+ $verified,
+ $username,
+ $password
+ ) {
+ /** @var ShopUserInterface $user */
+ $user = $this->shopUserExampleFactory->create();
+ $user->setUsername($username);
+ $user->setPlainPassword($password);
+ $user->setEmail('vendor@email.com');
+ $user->setVerifiedAt(new \DateTime());
+ $user->addRole('ROLE_USER');
+ $user->addRole('ROLE_VENDOR');
+ $this->entityManager->persist($user);
+
+ /** @var Vendor $vendor */
+ $vendor = $this->vendorFactory->createNew();
+ $vendor->setStatus($verified);
+ $vendor->setCompanyName('vendor');
+ $vendor->setShopUser($user);
+ $vendor->setSlug('vendor-slug');
+ $vendor->setDescription('description');
+ $vendor->setPhoneNumber('987654321');
+ $vendor->setTaxIdentifier('123456789');
+ $vendor->setBankAccountNumber('iban');
+ $this->entityManager->persist($vendor);
+
+ $this->sharedStorage->set('vendor', $vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given the product listing is removed
+ */
+ public function thereProductListingIsRemoved()
+ {
+ $productListing = $this->sharedStorage->get('product_listing');
+ $productListing->setRemoved(true);
+ $this->entityManager->persist($productListing);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @When I am on edit page product listing :url
+ */
+ public function iAmOnProductListingPageWithIUrl($url)
+ {
+ $productListing = $this->sharedStorage->get('product_listing');
+ $this->productListingEditVendorPage->tryToOpen(['id' => $productListing->getId()]);
+ }
+
+ /**
+ * @Given I should see product's listing status :status
+ */
+ public function iShouldSeeProductsListingStatus($status)
+ {
+ $productListingStatus = $this->productListingShowVendorPage->findStatus($status);
+ Assert::notNull($productListingStatus);
+ }
+
+ /**
+ * @Then I should see :count product listing(s)
+ */
+ public function iShouldSeeProductListings($count)
+ {
+ $rows = $this->productListingShowVendorPage->getTableRows();
+ Assert::notEmpty($rows, 'Could not find any rows');
+ Assert::eq($count, count($rows), 'Rows numbers are not equal');
+ }
+
+ /**
+ * @Given I click :button button
+ */
+ public function iClickButton($button)
+ {
+ $this->getPage()->pressButton($button);
+ }
+
+ /**
+ * @return DocumentElement
+ */
+ private function getPage()
+ {
+ return $this->getSession()->getPage();
+ }
+
+ /**
+ * @Given there is :arg2 product listing created by vendor
+ */
+ public function thereIsProductListingCreatedByVendor(int $count): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ for ($i = 0; $i < $count; ++$i) {
+ $productListing = new Listing();
+ $productListing->setCode('code' . $i);
+ $productListing->setVendor($vendor);
+
+ $productDraft = new Draft();
+ $productDraft->setCode('code' . $i);
+ $productDraft->setStatus(DraftInterface::STATUS_UNDER_VERIFICATION);
+ $productDraft->setPublishedAt(new \DateTime());
+ $productDraft->setVersionNumber(0);
+ $productDraft->setProductListing($productListing);
+
+ $productTranslation = new DraftTranslation();
+ $productTranslation->setLocale('en_US');
+ $productTranslation->setSlug('product-listing-' . $i);
+ $productTranslation->setName('product-listing-' . $i);
+ $productTranslation->setDescription('product-listing-' . $i);
+ $productTranslation->setProductDraft($productDraft);
+
+ $productPricing = new ListingPrice();
+ $productPricing->setProductDraft($productDraft);
+ $productPricing->setPrice(1000);
+ $productPricing->setOriginalPrice(1000);
+ $productPricing->setMinimumPrice(1000);
+ $productPricing->setChannelCode('en_US');
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+
+ $this->sharedStorage->set('product_listing', $productListing);
+ }
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given there is :count product listing created by vendor with status :status
+ */
+ public function thereIsProductListingCreatedByVendorWithStatus2(
+ int $count,
+ string $status,
+ ): void {
+ $vendor = $this->sharedStorage->get('vendor');
+
+ for ($i = 0; $i < $count; ++$i) {
+ $productListing = new Listing();
+ $productListing->setCode('code' . $i);
+ $productListing->setVendor($vendor);
+ $productListing->setVerificationStatus($status);
+
+ $productDraft = new Draft();
+ $productDraft->setCode('code' . $i);
+ $productDraft->setStatus($status);
+ $productDraft->setPublishedAt(new \DateTime());
+ $productDraft->setVersionNumber(0);
+ $productDraft->setProductListing($productListing);
+
+ $productTranslation = new DraftTranslation();
+ $productTranslation->setLocale('en_US');
+ $productTranslation->setSlug('product-listing-' . $i);
+ $productTranslation->setName('product-listing-' . $i);
+ $productTranslation->setDescription('product-listing-' . $i);
+ $productTranslation->setProductDraft($productDraft);
+
+ $productPricing = new ListingPrice();
+ $productPricing->setProductDraft($productDraft);
+ $productPricing->setPrice(1000);
+ $productPricing->setOriginalPrice(1000);
+ $productPricing->setMinimumPrice(1000);
+ $productPricing->setChannelCode('en_US');
+
+ $this->entityManager->persist($productListing);
+ $this->entityManager->persist($productDraft);
+ $this->entityManager->persist($productTranslation);
+ $this->entityManager->persist($productPricing);
+
+ $this->sharedStorage->set('product_listing', $productListing);
+ }
+
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given Product listing status is :arg1
+ */
+ public function productListingStatusIs($arg1): void
+ {
+ $draft = $this->entityManager->getRepository(Draft::class)->findOneBy(['code' => 'code0']);
+ $draft->setStatus(DraftInterface::STATUS_CREATED);
+ $this->entityManager->persist($draft);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Then I should see dropdown with hide option
+ */
+ public function iShouldSeeDropdownWithHideOption(): void
+ {
+ $dropdown = $this->productListingShowVendorPage->findDropdownLink();
+ Assert::notNull($dropdown);
+ }
+
+ /**
+ * @Then I should see url :url
+ */
+ public function iShouldSeeUrl($url): void
+ {
+ $currentUrl = $this->getSession()->getCurrentUrl();
+ $matches = preg_match($url, $currentUrl);
+ Assert::eq(1, $matches);
+ }
+
+ /**
+ * @When I fill form with non unique code
+ */
+ public function iFillFormWithNonUniqueCode(): void
+ {
+ $page = $this->getPage();
+
+ $page->fillField('Code', 'code0');
+ $page->fillField('Price', '10');
+ $page->fillField('Original price', '20');
+ $page->fillField('Minimum price', '30');
+ $page->fillField('Name', 'test');
+ $page->fillField('Slug', 'product');
+ $page->fillField('Description', 'product description');
+ }
+
+ /**
+ * @Then I should see non unique code error message
+ */
+ public function iShouldSeeNonUniqueCodeMessage()
+ {
+ $text = $this->getPage()->getText();
+ $isErrorMessagePresent = false !== stripos($text, 'Product Listing with given code already exists');
+ Assert::true($isErrorMessagePresent);
+ }
+
+ /**
+ * @Given I choose main taxon :taxon
+ */
+ public function iChooseMainTaxon($taxon)
+ {
+ $page = $this->getPage();
+ $page->findById('sylius_product_mainTaxon')->setValue($taxon);
+ }
+
+ /**
+ * @Then I should get validation error
+ */
+ public function iShouldGetValidationError()
+ {
+ $page = $this->getSession()->getPage();
+ $this->getSession()->reload();
+
+ $label = $page->find('css', '.ui.red.label.sylius-validation-error');
+ Assert::eq($label->getText(), 'You must define price for every channel.');
+ }
+
+ /**
+ * @Given there is an admin user :username with password :password
+ */
+ public function thereIsAnAdminUserWithPassword($username, $password)
+ {
+ $admin = $this->adminUserExampleFactory->create();
+ $admin->setUsername($username);
+ $admin->setPlainPassword($password);
+ $admin->setEmail('admin@email.com');
+ $this->entityManager->persist($admin);
+ $this->entityManager->flush();
+
+ $admin->setPlainPassword($password);
+ $this->sharedStorage->set('admin', $admin);
+ }
+
+ /**
+ * @Given I am logged in as an admin
+ */
+ public function iAmLoggedInAsAnAdmin()
+ {
+ $admin = $this->sharedStorage->get('admin');
+
+ $this->visitPath('/admin/login');
+ $this->getPage()->fillField('Username', $admin->getUsername());
+ $this->getPage()->fillField('Password', $admin->getPlainPassword());
+ $this->getPage()->pressButton('Login');
+ ($this->getPage()->findLink('Logout'));
+ }
+
+ /**
+ * @When I click :label on confirmation modal
+ */
+ public function iClickOnConfirmationModal(string $label): void
+ {
+ $confirmationModal = $this->getPage()->findById($label);
+ $confirmationModal->click();
+ }
+
+ /**
+ * @Given the channel uses another locale :locales
+ */
+ public function theChannelUsesAnotherLocale(string $locales): void
+ {
+ /** @var Channel $channel */
+ $channel = $this->sharedStorage->get('channel');
+
+ $locale = $this->localeFactory->createNew();
+ $locale->setCode($locales);
+ $channel->addLocale($locale);
+
+ $this->entityManager->persist($locale);
+ $this->entityManager->persist($channel);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @When I fill form with default data
+ */
+ public function iFillFormWithDefaultData(): void
+ {
+ $page = $this->getPage();
+
+ $page->fillField('Code', 'code');
+ $page->fillField('Price', '10');
+ $page->fillField('Original price', '20');
+ $page->fillField('Minimum price', '30');
+ $page->fillField('Name', 'test');
+ $page->fillField('Slug', 'product');
+ $page->fillField('Description', 'product description');
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/CustomerDashboardContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/CustomerDashboardContext.php
new file mode 100644
index 0000000..07a320d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/CustomerDashboardContext.php
@@ -0,0 +1,106 @@
+dashboardPage = $dashboardPage;
+ $this->userRepository = $userRepository;
+ $this->userFactory = $userFactory;
+ $this->manager = $manager;
+ $this->vendorExampleFactory = $vendorExampleFactory;
+ }
+
+ /**
+ * @Then I should see :arg1 inside sidebar
+ */
+ public function iShouldSeeInsideSidebar($arg1): void
+ {
+ Assert::true($this->dashboardPage->itemWithValueExistsInsideSidebar($arg1), "Cannot find $arg1 inside sidebar");
+ }
+
+ /**
+ * @Then I should not see :arg1 inside sidebar
+ */
+ public function iShouldNotSeeInsideSidebar($arg1): void
+ {
+ Assert::true($this->dashboardPage->itemWithValueDoesntExistsInsideSidebar($arg1), "Found $arg1 inside sidebar");
+ }
+
+ /**
+ * @Given there is a :status vendor user :vendor_user_email registered in country :country_code
+ */
+ public function thereIsAVendorUserRegisteredInCountry(
+ $status,
+ $vendor_user_email,
+ $country_code
+ ): void {
+ /** @var ShopUserInterface $user */
+ $user = $this->userFactory->create(['email' => $vendor_user_email, 'password' => 'password', 'enabled' => true]);
+ $user->setVerifiedAt(new \DateTime());
+ $user->addRole('ROLE_USER');
+ $user->addRole('ROLE_VENDOR');
+
+ $this->userRepository->add($user);
+
+ $country = $this->manager->getRepository(Country::class)->findOneBy(['code' => $country_code]);
+
+ $options = [
+ 'company_name' => 'Test',
+ 'phone_number' => '333333333',
+ 'tax_identifier' => '543455',
+ 'bank_account_number' => 'NL31INGB4405427607',
+ 'street' => 'Secret 13',
+ 'city' => 'Warsaw',
+ 'postcode' => '00-111',
+ 'slug' => 'vendor-slug',
+ 'description' => 'description',
+ 'country' => $country,
+ 'status' => $status,
+ ];
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorExampleFactory->create($options);
+ $vendor->setShopUser($user);
+ $user->setVendor($vendor);
+ $this->manager->persist($vendor);
+ $this->manager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/DraftAttributeContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/DraftAttributeContext.php
new file mode 100644
index 0000000..e673362
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/DraftAttributeContext.php
@@ -0,0 +1,141 @@
+sharedStorage = $sharedStorage;
+ $this->attributeRepository = $attributeRepository;
+ }
+
+ /**
+ * @When I fill form with :code and name with :name and submit
+ */
+ public function iFillCodeWithAndNameWith($code, $name)
+ {
+ $page = $this->getSession()->getPage();
+ $codeInput = $page->find('css', '#sylius_product_attribute_code');
+ $codeInput->setValue($code);
+
+ $nameInput = $page->find('css', '#sylius_product_attribute_translations_en_US_name');
+ $nameInput->setValue($name);
+
+ $submitButton = $page->find('css', '.ui.labeled.icon.primary.button');
+ $submitButton->press();
+ }
+
+ /**
+ * @Then I should see attribute with :arg1 and :arg2 type :type
+ */
+ public function iShouldSeeAttributeWithAnd(
+ $code,
+ $name,
+ $type
+ ) {
+ $page = $this->getSession()->getPage();
+ $gridTable = $page->find('css', '.ui.sortable.stackable.very.basic.celled.table');
+ $rows = $gridTable->findAll('css', '.item');
+ foreach ($rows as $row) {
+ if (
+ str_contains($row->getText(), $code) &&
+ str_contains($row->getText(), $name) &&
+ str_contains($row->getText(), $type)
+ ) {
+ $rowWithValueExist = true;
+ }
+ }
+
+ assertTrue($rowWithValueExist);
+ }
+
+ /**
+ * @Given I have Attribute type :type name :name code :code
+ */
+ public function iHaveAttributeTypeNameCode(
+ $type,
+ $name,
+ $code
+ ) {
+ $vendor = $this->sharedStorage->get('vendor');
+ $locale = $this->sharedStorage->get('locale');
+
+ $draftAttributeTranslation = new DraftAttributeTranslation();
+ $draftAttributeTranslation->setLocale($locale->getCode());
+ $draftAttributeTranslation->setName($name);
+
+ $attribute = new DraftAttribute();
+ $draftAttributeTranslation->setTranslatable($attribute);
+
+ $attribute->setTranslatable(false);
+ $attribute->setCreatedAt(new \DateTime());
+ $attribute->setVendor($vendor);
+ $attribute->setCode($code);
+ $attribute->setStorageType('text');
+ $attribute->addTranslation($draftAttributeTranslation);
+
+ $this->attributeRepository->add($attribute);
+ }
+
+ /**
+ * @Given I fill product draft form
+ */
+ public function iFillProductDraftForm()
+ {
+ $page = $this->getSession()->getPage();
+
+ $codeInput = $page->find('css', '#sylius_product_code');
+ $codeInput->setValue('Testingcode');
+
+ $nameInput = $page->find('css', '#sylius_product_translations_en_US_name');
+ $nameInput->setValue('TestingName');
+
+ $slugInput = $page->find('css', '#sylius_product_translations_en_US_slug');
+ $slugInput->setValue('TestingSlug');
+
+ $priceInput = $page->find('css', '#sylius_product_productListingPrice_WEB-US_price');
+ $priceInput->setValue(1);
+
+ $originalPriceInput = $page->find('css', '#sylius_product_productListingPrice_WEB-US_originalPrice');
+ $originalPriceInput->setValue(1);
+
+ $priceInput = $page->find('css', '#sylius_product_productListingPrice_WEB-US_price');
+ $priceInput->setValue(1);
+ }
+
+ /**
+ * @Given I pick attribute
+ */
+ public function iPickAttribute()
+ {
+ $page = $this->getSession()->getPage();
+
+ $wrapper = $page->find('css', '.ui.fluid.action.input');
+ $wrapper->press();
+
+ $div = $page->find('css', '[data-value="name"]');
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/InventoryContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/InventoryContext.php
new file mode 100644
index 0000000..5553a4e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/InventoryContext.php
@@ -0,0 +1,47 @@
+getSession()->getPage();
+ $element = $page->find('css', '#sylius_save_changes_button');
+ $element->press();
+ }
+
+ /**
+ * @Given I set product as tracked
+ */
+ public function iSetTracked(): void
+ {
+ $page = $this->getSession()->getPage();
+ $element = $page->find('css', '#sylius_product_variant_tracked');
+ $element->setValue(true);
+ }
+
+ /**
+ * @Given I set product as untracked
+ */
+ public function iSetUntracked(): void
+ {
+ $page = $this->getSession()->getPage();
+ $element = $page->find('css', '#sylius_product_variant_tracked');
+ $element->setValue(false);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/OrderContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/OrderContext.php
new file mode 100644
index 0000000..16a231b
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/OrderContext.php
@@ -0,0 +1,102 @@
+orderShowPage = $orderShowPage;
+ $this->sharedStorage = $sharedStorage;
+ }
+
+ /**
+ * @Then I should see order with number :number
+ */
+ public function iShouldSeeOrderWithNumber(string $number): void
+ {
+ $headerText = $this->orderShowPage->getHeaderText();
+ assertStringContainsString($number, $headerText);
+ }
+
+ /**
+ * @When I visit order details page
+ */
+ public function iAmOnOrderDetailsPage(): void
+ {
+ $order = $this->sharedStorage->get('order');
+ $this->orderShowPage->open(['id' => $order->getId()]);
+ }
+
+ /**
+ * @When I try to open order details page
+ */
+ public function iToTryOpenOrderDetailsPage(): void
+ {
+ $order = $this->sharedStorage->get('order');
+ $this->orderShowPage->tryToOpen(['id' => $order->getId()]);
+ }
+
+ /**
+ * @Given I resend the order confirmation email as vendor
+ */
+ public function iResendTheOrderConfirmationEmailAsVendor()
+ {
+ $this->orderShowPage->clickResendEmail();
+ }
+
+ /**
+ * @Then I should see customer details with name :name
+ */
+ public function iShouldSeeCustomerDetailsWithName(string $name): void
+ {
+ $customerText = $this->orderShowPage->getCustomerText();
+ assertStringContainsString($name, $customerText);
+ }
+
+ /**
+ * @Then I should see customer billing address :address
+ */
+ public function iShouldSeeCustomerBillingAddress(string $address): void
+ {
+ $billingAddressText = $this->orderShowPage->getBillingAddressText();
+ assertStringContainsString($address, $billingAddressText);
+ }
+
+ /**
+ * @Then I should see customer shipping address :address
+ */
+ public function iShouldSeeCustomerShippingAddress(string $address): void
+ {
+ $shippingAddressText = $this->orderShowPage->getShippingAddressText();
+ assertStringContainsString($address, $shippingAddressText);
+ }
+
+ /**
+ * @Then I should see shipping state :state
+ */
+ public function iShouldSeeShippingState(string $state)
+ {
+ $shippingStateText = $this->orderShowPage->getShippingStateText();
+ assertStringContainsString($state, $shippingStateText);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/ProductReviewContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/ProductReviewContext.php
new file mode 100644
index 0000000..fe65b2a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/ProductReviewContext.php
@@ -0,0 +1,123 @@
+productReviewPage = $productReviewPage;
+ $this->sharedStorage = $sharedStorage;
+ $this->manager = $manager;
+ $this->productReviewRepository = $productReviewRepository;
+ $this->customerRepository = $customerRepository;
+ }
+
+ /**
+ * @Then I should see :count reviews
+ */
+ public function iShouldSeeReviews($count): void
+ {
+ $reviews = $this->productReviewPage->getReviews();
+ Assert::eq(count($reviews), $count);
+ }
+
+ /**
+ * @Given I click :button
+ */
+ public function iClick(string $button): void
+ {
+ $this->productReviewPage->clickButton($button);
+ }
+
+ /**
+ * @When I click :button first review
+ */
+ public function iClickFirstReview(string $button): void
+ {
+ $this->productReviewPage->clickButtonFirstReview($button);
+ }
+
+ /**
+ * @When I edit first review
+ */
+ public function iEditFirstReview(): void
+ {
+ $this->productReviewPage->clickEditFirstReview();
+ }
+
+ /**
+ * @Then /^(this product) has (\d+) "([^"]+)" reviews$/
+ */
+ public function thisProductHasReview(
+ ProductInterface $product,
+ int $count,
+ string $status,
+ ): void {
+ $productReviews = $this->productReviewRepository->findBy(['reviewSubject' => $product, 'status' => $status]);
+ Assert::count($productReviews, $count);
+ }
+
+ /**
+ * @Given /^I am on edit page of review added by "([^"]+)" to (this product)$/
+ */
+ public function iAmOnEditPageOfReviewAddedByToProduct(string $customer, ProductInterface $product)
+ {
+ $customer = $this->customerRepository->findOneBy(['email' => $customer]);
+ $productReview = $this->productReviewRepository->findOneBy(['reviewSubject' => $product, 'author' => $customer]);
+ $this->sharedStorage->set('review', $productReview);
+
+ $this->productReviewPage->open(['id' => $productReview->getId()]);
+ }
+
+ /**
+ * @Then /^(this review) should have name "([^"]+)"$/
+ */
+ public function thisReviewShouldHaveName(ReviewInterface $review, string $name): void
+ {
+ $this->manager->refresh($review);
+ Assert::same($review->getTitle(), $name);
+ }
+
+ /**
+ * @Then /^(this review) should have comment "([^"]+)"$/
+ */
+ public function thisReviewShouldHaveComment(ReviewInterface $review, string $comment): void
+ {
+ $this->manager->refresh($review);
+ Assert::same($review->getComment(), $comment);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/SettlementContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/SettlementContext.php
new file mode 100644
index 0000000..8fd3be4
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/SettlementContext.php
@@ -0,0 +1,79 @@
+settlementPage->openSettlementsIndex();
+ }
+
+ /**
+ * @When I accept first possible settlement
+ */
+ public function iAcceptFirstPossibleSettlement(): void
+ {
+ $button = $this->settlementPage->findFirstAcceptButton();
+ Assert::notNull($button);
+
+ $button->click();
+ }
+
+ /**
+ * @When I should see :count settlements with status :status
+ * @When I should see :count settlements
+ */
+ public function iSeeSettlementsWithStatus(string $count, string $status = null): void
+ {
+ $settlements = $this->settlementPage->getSettlementsWithStatus($status);
+
+ Assert::eq(count($settlements), $count);
+ }
+
+ /**
+ * @Then I should not see any accept button
+ */
+ public function iShouldNotSeeAnyAcceptButton(): void
+ {
+ $button = $this->settlementPage->findFirstAcceptButton();
+ Assert::null($button);
+ }
+
+ /**
+ * @When I filter settlements by status :status
+ */
+ public function iFilterSettlementsByStatus(string $status): void
+ {
+ $this->settlementPage->filterByStatus($status);
+ }
+
+ /**
+ * @When I filter settlements by period :period
+ */
+ public function iFilterSettlementsByPeriod(string $period): void
+ {
+ $this->settlementPage->filterByPeriod($period);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/VendorCommissionContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/VendorCommissionContext.php
new file mode 100644
index 0000000..f4860ce
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/VendorCommissionContext.php
@@ -0,0 +1,161 @@
+orderRepository = $orderRepository;
+ }
+
+ /**
+ * @Then commission should be calculated for each secondary order
+ */
+ public function commissionShouldBeCalculatedForEachSecondaryOrder(): void
+ {
+ $orders = $this->orderRepository->findBy(['mode' => OrderInterface::SECONDARY_ORDER_MODE]);
+
+ /** @var OrderInterface $order */
+ foreach ($orders as $order) {
+ $this->testCommission($order);
+ }
+ }
+
+ /**
+ * @Then commissions should not be calculated for primary orders
+ */
+ public function commissionShouldNotBeCalculatedForPrimaryOrders(): void
+ {
+ $orders = $this->orderRepository->findBy(['mode' => OrderInterface::PRIMARY_ORDER_MODE]);
+
+ /** @var OrderInterface $order */
+ foreach ($orders as $order) {
+ Assert::eq(0, $order->getCommissionTotal());
+ }
+ }
+
+ /**
+ * @Then /^I should see valid commission information's$/
+ */
+ public function iShouldSeeCommissionInformations(): void
+ {
+ $text = $this->getSession()->getPage()->getText();
+
+ Assert::true(str_contains($text, 'Commission (Included in price)'));
+ Assert::true(str_contains($text, 'Commission:'));
+
+ $urlArray = explode('/', $this->getSession()->getCurrentUrl());
+ $orderId = (int) end($urlArray);
+ /** @var OrderInterface $order */
+ $order = $this->orderRepository->find($orderId);
+ $decimalCommission = number_format($order->getCommissionTotal() / 100, 2, '.', ',');
+
+ $this->commissionDisplayedShouldBeEqual($decimalCommission);
+ }
+
+ /**
+ * @Then /^I should see no commission$/
+ */
+ public function iShouldSeeNoCommission(): void
+ {
+ $text = $this->getSession()->getPage()->getText();
+
+ Assert::true(str_contains($text, 'Commission (Included in price)'));
+ Assert::true(str_contains($text, 'Commission:'));
+ $this->commissionDisplayedShouldBeEqual('0.00');
+ }
+
+ /**
+ * @Then I should get commission value validation error
+ */
+ public function iShouldGetValidationError(): void
+ {
+ $page = $this->getSession()->getPage();
+ $this->getSession()->reload();
+
+ $label = $page->find('css', '.ui.red.label.sylius-validation-error');
+ Assert::eq($label->getText(), 'Commission value must be positive or zero');
+ }
+
+ /**
+ * @Then every secondary order should have valid commission total
+ */
+ public function everySecondaryOrderShouldHaveValidCommission(): void
+ {
+ $orders = $this->orderRepository->findBy(['mode' => OrderInterface::SECONDARY_ORDER_MODE]);
+ /** @var OrderInterface $order */
+ foreach ($orders as $order) {
+ $this->testCommission($order);
+ }
+ }
+
+ private function commissionDisplayedShouldBeEqual(string $value): void
+ {
+ $text = $this->getSession()->getPage()->getText();
+ $pattern = '/Commission: \$([\d.,]+)/';
+ preg_match($pattern, $text, $matches);
+ Assert::eq($matches[1], $value);
+ }
+
+ private function calculateNetCommission(OrderInterface $order, int $commission): int
+ {
+ $floatTotal = $order->getItemsTotal() / 100;
+
+ $floatCommission = round(($floatTotal * ($commission / 100)), 2);
+ $intCommission = $floatCommission * 100;
+
+ return (int) $intCommission;
+ }
+
+ private function calculateGrossCommission(OrderInterface $order, int $commission): int
+ {
+ $floatTotal = $order->getTotal() / 100;
+
+ $floatCommission = round(($floatTotal * ($commission / 100)), 2);
+ $intCommission = $floatCommission * 100;
+
+ return (int) $intCommission;
+ }
+
+ private function testCommission(OrderInterface $order): void
+ {
+ $vendor = $order->getVendor();
+
+ if (null === $vendor) {
+ Assert::eq($order->getCommissionTotal(), 0);
+
+ return;
+ }
+
+ /** @var int $vendorCommission */
+ $vendorCommission = $vendor->getCommission();
+ $validCommissionTotal =
+ match ($vendor->getCommissionType()) {
+ VendorInterface::NET_COMMISSION => $this->calculateNetCommission($order, $vendorCommission),
+ VendorInterface::GROSS_COMMISSION => $this->calculateGrossCommission($order, $vendorCommission),
+ default => throw new \InvalidArgumentException('Invalid Commission Type')
+ };
+
+ Assert::eq($order->getCommissionTotal(), $validCommissionTotal);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/VendorRegisterContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/VendorRegisterContext.php
new file mode 100644
index 0000000..9bc4f36
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/VendorRegisterContext.php
@@ -0,0 +1,36 @@
+vendorRegisterPage = $vendorRegisterPage;
+ }
+
+ /**
+ * @Then I should see :itemCLass :times times
+ */
+ public function iShouldSeeTimes($itemCLass, $times): void
+ {
+ $validationMessageCount = $this->vendorRegisterPage->getValidationMessageCount($itemCLass);
+ Assert::eq($times, $validationMessageCount, "expected $times got $validationMessageCount");
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/VendorSetupContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/VendorSetupContext.php
new file mode 100644
index 0000000..0961e8d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/VendorSetupContext.php
@@ -0,0 +1,50 @@
+sharedStorage = $sharedStorage;
+ $this->userRepository = $userRepository;
+ $this->userFactory = $userFactory;
+ $this->manager = $manager;
+ }
+
+ /**
+ * @Given vendor company name is :companyName
+ */
+ public function vendorCompanyName($companyName): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $vendor->setCompanyName($companyName);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/VendorShippingMethodsContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/VendorShippingMethodsContext.php
new file mode 100644
index 0000000..5784a9c
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/VendorShippingMethodsContext.php
@@ -0,0 +1,81 @@
+getSession()->getPage()->pressButton($button);
+ }
+
+ /**
+ * @Then I should see :name shipping method in :channel channel
+ */
+ public function iShouldSeeShippingMethod(string $name, ChannelInterface $channel): void
+ {
+ $page = $this->getSession()->getPage();
+ $channelTag = sprintf('#vendor_shipping_methods_channels_%s', $channel->getCode());
+ $channelSection = $page->find('css', $channelTag);
+ $input = $channelSection->find('css', sprintf('input[value=%s]', $name));
+
+ assertNotNull($input);
+ assertStringContainsString($name, $input->getAttribute('value'));
+ }
+
+ /**
+ * @Then I enable :name shipping method in :channel channel
+ */
+ public function iEnableShippingMethod(string $name, ChannelInterface $channel): void
+ {
+ $page = $this->getSession()->getPage();
+ $channelTag = sprintf('#vendor_shipping_methods_channels_%s', $channel->getCode());
+ $channelSection = $page->find('css', $channelTag);
+ $input = $channelSection->find('css', sprintf('input[value=%s]', $name));
+ $input->check();
+ }
+
+ /**
+ * @Then I should see :name enabled shipping method in :channel channel
+ */
+ public function iShouldSeeEnabledShippingMethod(string $name, ChannelInterface $channel): void
+ {
+ $page = $this->getSession()->getPage();
+ $channelTag = sprintf('#vendor_shipping_methods_channels_%s', $channel->getCode());
+ $channelSection = $page->find('css', $channelTag);
+ $input = $channelSection->find('css', sprintf('input[value=%s][checked=checked]', $name));
+
+ assertStringContainsString($name, $input->getAttribute('value'));
+ }
+
+ /**
+ * @Then I should see :name disabled shipping method in :channel channel
+ */
+ public function iShouldSeeDisabledShippingMethod(string $name, ChannelInterface $channel): void
+ {
+ $page = $this->getSession()->getPage();
+ $channelTag = sprintf('#vendor_shipping_methods_channels_%s', $channel->getCode());
+ $channelSection = $page->find('css', $channelTag);
+ $input = $channelSection->find('css', sprintf('input[value=%s]:not([checked=checked])', $name));
+
+ assertStringContainsString($name, $input->getAttribute('value'));
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/Vendor/VendorUpdateContext.php b/OpenMarketplace/tests/Behat/Context/Vendor/VendorUpdateContext.php
new file mode 100644
index 0000000..b86e209
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/Vendor/VendorUpdateContext.php
@@ -0,0 +1,259 @@
+sharedStorage = $sharedStorage;
+ $this->userRepository = $userRepository;
+ $this->userFactory = $userFactory;
+ $this->manager = $manager;
+ $this->vendorImageFactory = $vendorImageFactory;
+ $this->taxonFactory = $taxonFactory;
+ $this->vendorExampleFactory = $vendorExampleFactory;
+ $this->countryFactory = $countryFactory;
+ }
+
+ /**
+ * @Given there is a :status vendor user :vendor_user_email registered in country :country_code
+ */
+ public function thereIsAVendorUserRegisteredInCountry(
+ $status,
+ $vendor_user_email,
+ $country_code
+ ): void {
+ /** @var ShopUserInterface $user */
+ $user = $this->userFactory->create(['email' => $vendor_user_email, 'password' => 'password', 'enabled' => true]);
+ $user->setVerifiedAt(new \DateTime());
+ $user->addRole('ROLE_USER');
+ $user->addRole('ROLE_VENDOR');
+
+ $this->sharedStorage->set('user', $user);
+
+ $this->userRepository->add($user);
+
+ $country = $this->manager->getRepository(Country::class)->findOneBy(['code' => $country_code]);
+ if (null === $country) {
+ /** @var CountryInterface $country */
+ $country = $this->countryFactory->createNew();
+ $country->setCode($country_code);
+ $country->enable();
+ $this->manager->persist($country);
+ }
+
+ $options = [
+ 'company_name' => 'Test',
+ 'phone_number' => '333333333',
+ 'tax_identifier' => '543455',
+ 'bank_account_number' => 'NL31INGB4405427607',
+ 'street' => 'Secret 13',
+ 'city' => 'Warsaw',
+ 'postcode' => '00-111',
+ 'slug' => 'vendor-slug',
+ 'description' => 'description',
+ 'country' => $country,
+ 'status' => $status,
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+ $vendor->setShopUser($user);
+ $this->manager->persist($vendor);
+ $this->manager->flush();
+ $this->sharedStorage->set('vendor', $vendor);
+ }
+
+ /**
+ * @Then Pending update data should appear in database
+ */
+ public function pendingUpdateDataShouldAppearInDatabase()
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $pendingData = $this->manager->getRepository(ProfileUpdate::class)->findOneBy(['vendor' => $vendor]);
+
+ Assert::notEq(null, $pendingData);
+ }
+
+ /**
+ * @Given There is pending update data with token value :token for logged in vendor
+ */
+ public function thereIsPendingUpdateDataWithTokenValueForLoggedInVendor($token): void
+ {
+ $vendor = $this->sharedStorage->get('vendor');
+ $country = $this->manager->getRepository(Country::class)->findOneBy(['code' => 'PL']);
+ $pendigUpdate = new ProfileUpdate();
+ $pendigUpdate->setVendorAddress(new Address());
+ $pendigUpdate->setVendor($vendor);
+ $pendigUpdate->setToken($token);
+ $pendigUpdate->setCompanyName('new Company');
+ $pendigUpdate->setTaxIdentifier('new ID');
+ $pendigUpdate->setBankAccountNumber('new iban');
+ $pendigUpdate->setPhoneNumber('new number');
+ $pendigUpdate->setDescription('new description');
+ $pendigUpdate->getVendorAddress()->setStreet('new street');
+ $pendigUpdate->getVendorAddress()->setCity('new city');
+ $pendigUpdate->getVendorAddress()->setPostalCode('new code');
+ $pendigUpdate->getVendorAddress()->setCountry($country);
+
+ $this->manager->persist($pendigUpdate);
+ $this->manager->flush();
+
+ $this->sharedStorage->set('pendingUpdate', $pendigUpdate);
+ }
+
+ /**
+ * @Then I should get validation error
+ */
+ public function iShouldGetValidationError()
+ {
+ $page = $this->getSession()->getPage();
+ $label = $page->find('css', '.ui.red.pointing.label.sylius-validation-error');
+ }
+
+ /**
+ * @Given vendor have logo attached to profile
+ */
+ public function vendorHaveLogoAttachedToProfile()
+ {
+ /** @var VendorInterface $vendor */
+ $vendor = $this->sharedStorage->get('vendor');
+ $path = 'path/to/file.png';
+ $image = $this->vendorImageFactory->create($path, $vendor);
+ $vendor->setImage($image);
+ $this->sharedStorage->set('path', $path);
+ }
+
+ /**
+ * @When I visit confirmation page
+ */
+ public function iVisitConfirmationPage()
+ {
+ $repository = $this->manager->getRepository(ProfileUpdate::class);
+ $updateData = $repository->findAll();
+ $token = $updateData[0]->getToken();
+ $session = $this->getSession();
+ $session->visit('/en_US/account/vendor/profile-update/' . $token);
+ }
+
+ /**
+ * @Then Logo should be updated
+ */
+ public function imageShouldBeUpdated()
+ {
+ $oldImagePath = $this->sharedStorage->get('path');
+ $session = $this->getSession();
+ $session->visit('/en_US/vendors/vendor-slug');
+
+ $page = $session->getPage();
+ $logo = $page->find('css', '#vendor_logo');
+ $newPath = $logo->getAttribute('src');
+ Assert::notEq($oldImagePath, $newPath);
+ }
+
+ /**
+ * @Given Vendor company name is :companyName tax ID is :taxId phone number is :phoneNumber
+ */
+ public function vendorCompanyNameIsTaxIdIsPhoneNumberIs(
+ $companyName,
+ $taxId,
+ $phoneNumber
+ ) {
+ /** @var VendorInterface $vendor */
+ $vendor = $this->sharedStorage->get('vendor');
+ $vendor->setCompanyName($companyName);
+ $vendor->setTaxIdentifier($taxId);
+ $vendor->setPhoneNumber($phoneNumber);
+
+ $this->manager->persist($vendor);
+ $this->manager->flush();
+ $this->sharedStorage->set('vendor', $vendor);
+ }
+
+ /**
+ * @Then I should see form initialized with :companyName :taxId :phoneNumber
+ */
+ public function iShouldSeeAsDefaultFormValues(
+ $companyName,
+ $taxId,
+ $phoneNumber
+ ) {
+ $page = $this->getSession()->getPage();
+ $companyNameInput = $page->find('css', '#profile_companyName');
+ $taxIdInput = $page->find('css', '#profile_taxIdentifier');
+ $phoneNumberInput = $page->find('css', '#profile_phoneNumber');
+
+ Assert::eq($companyName, $companyNameInput->getAttribute('value'));
+ Assert::eq($taxId, $taxIdInput->getAttribute('value'));
+ Assert::eq($phoneNumber, $phoneNumberInput->getAttribute('value'));
+ }
+
+ /**
+ * @Given the channel has a menu taxon
+ */
+ public function theChannelHasAsAMenuTaxon()
+ {
+ /** @var ChannelInterface $channel */
+ $channel = $this->sharedStorage->get('channel');
+ $taxon = $this->taxonFactory->createNew();
+ $taxon->setCode('menu_category');
+ $taxon->setName('main');
+ $taxon->setSlug('main');
+ $taxon->enable();
+ $channel->setMenuTaxon($taxon);
+
+ $this->manager->persist($taxon);
+ $this->manager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Context/VendorPageContext.php b/OpenMarketplace/tests/Behat/Context/VendorPageContext.php
new file mode 100644
index 0000000..71e6add
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Context/VendorPageContext.php
@@ -0,0 +1,327 @@
+entityManager = $entityManager;
+ $this->countryRepository = $countryRepository;
+ $this->vendorRepository = $vendorRepository;
+ $this->productFactory = $productFactory;
+ $this->slugGenerator = $slugGenerator;
+ $this->defaultVariantResolver = $defaultVariantResolver;
+ $this->sharedStorage = $sharedStorage;
+ $this->productRepository = $productRepository;
+ $this->channelPricingFactory = $channelPricingFactory;
+ $this->vendorPagePage = $vendorPagePage;
+ $this->vendorExampleFactory = $vendorExampleFactory;
+ }
+
+ /**
+ * @Given there is a :vendorStatus vendor
+ */
+ public function thereIsAVendor(string $verifiedStatus)
+ {
+ $shopUser = $this->sharedStorage->get('user');
+
+ $country = $this->countryRepository->findOneBy(['code' => 'US']);
+
+ $options = [
+ 'company_name' => 'test company',
+ 'phone_number' => '123123123',
+ 'tax_identifier' => '123123123',
+ 'street' => 'test',
+ 'city' => 'test',
+ 'postcode' => 'test',
+ 'slug' => 'test-company',
+ 'description' => 'test-company',
+ 'country' => $country,
+ 'status' => $verifiedStatus,
+ ];
+
+ $vendor = $this->vendorExampleFactory->create($options);
+
+ $vendor->setShopUser($shopUser);
+
+ $this->entityManager->persist($vendor);
+ $this->entityManager->flush();
+ }
+
+ /**
+ * @Given the vendor has :number products
+ */
+ public function theVendorHasMoreThanOnePageOfProducts(int $number)
+ {
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'test-company']);
+ for ($i = 1; $i <= $number; ++$i) {
+ $this->saveProduct($this->createProduct("product-$i", $vendor));
+ }
+ }
+
+ /**
+ * @Given the vendor has :number products with different dates and prices
+ */
+ public function theVendorHasMoreThanOnePageOfProductsWithDifferentDatesAndPrices(int $number)
+ {
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'test-company']);
+ if (null === $vendor) {
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'vendor-slug']);
+ }
+ for ($i = 1; $i <= $number; ++$i) {
+ $date = strtotime("+$i day", strtotime('2007-02-28'));
+ $this->saveProduct($this->createProduct("product-$i", $vendor, $i * 100, date('Y-m-d', $date)));
+ }
+ }
+
+ /**
+ * @Then the first product should have name :name
+ */
+ public function theFirstProductShouldHaveName(string $name): void
+ {
+ Assert::same($this->vendorPagePage->getFirstProductNameFromList(), $name);
+ }
+
+ /**
+ * @Then the last product should have name :name
+ */
+ public function theLastProductShouldHaveName(string $name): void
+ {
+ Assert::same($this->vendorPagePage->getLastProductNameFromList(), $name);
+ }
+
+ /**
+ * @Then I should see :count products in the list
+ */
+ public function iShouldSeeProductsInTheList(int $count)
+ {
+ $this->vendorPagePage->open(['vendor_slug' => 'SLUG']);
+ $productsCount = $this->vendorPagePage->countProduct();
+ Assert::same($productsCount, $count);
+ }
+
+ /**
+ * @Then I should see :count products on page :pageNumber
+ */
+ public function iShouldSeeProductsOnPage(int $count, string $pageNumber)
+ {
+ $this->vendorPagePage->open(
+ [
+ 'vendor_slug' => 'SLUG',
+ 'limit' => 2,
+ 'page' => $pageNumber,
+ ]
+ );
+ $productsCount = $this->vendorPagePage->countProduct();
+
+ Assert::same($count, $productsCount, );
+ }
+
+ /**
+ * @Given sorting is set to :sortField :value
+ */
+ public function sortingIsSetTo($sortField, $value)
+ {
+ $sortType = [
+ 'ascending' => 'asc',
+ 'descending' => 'desc',
+ ];
+
+ $this->sharedStorage->set(
+ 'sorting',
+ [
+ 'field' => $sortField,
+ 'value' => $sortType[$value],
+ ]
+ );
+ }
+
+ /**
+ * @Then i should see products sorted by :field
+ */
+ public function iShouldSeeProductsSorted()
+ {
+ $shopSorting = $this->sharedStorage->get('sorting');
+
+ $this->vendorPagePage->open(
+ [
+ 'vendor_slug' => 'SLUG',
+ 'sorting' => [
+ $shopSorting['field'] => $shopSorting['value'],
+ ],
+ ]
+ );
+
+ assertTrue($this->vendorPagePage->productsSorted($shopSorting));
+ }
+
+ /**
+ * @Then I should see :count products on :slug taxon page
+ */
+ public function iShouldSeeProductsOnTaxonPage($count, $slug)
+ {
+ $this->visit("/en_US/vendors/SLUG/taxons/$slug");
+
+ $page = $this->getSession()->getPage();
+ $productCards = $page->findAll('css', '.ui.fluid.card');
+
+ Assert::count($productCards, $count);
+ }
+
+ /**
+ * @Then I should see :count products when search for :name
+ */
+ public function iShouldSeeProductsWhenSearchFor($count, $name)
+ {
+ $this->vendorPagePage->open(
+ [
+ 'vendor_slug' => 'SLUG',
+ 'criteria' => [
+ 'search' => $name,
+ ],
+ ]
+ );
+
+ $page = $this->getSession()->getPage();
+
+ $productCards = $page->findAll('css', '.ui.fluid.card');
+
+ Assert::count($productCards, $count);
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+
+ private function createProduct(
+ string $productName,
+ VendorInterface $vendor,
+ int $price = 100,
+ string $date = 'now',
+ ?ChannelInterface $channel = null
+ ): ProductInterface {
+ if (null === $channel && $this->sharedStorage->has('channel')) {
+ $channel = $this->sharedStorage->get('channel');
+ }
+
+ $date = new \DateTime($date);
+
+ /** @var ProductInterface $product */
+ $product = $this->productFactory->createWithVariant();
+
+ $product->setCode(StringInflector::nameToUppercaseCode($productName));
+ $product->setName($productName);
+ $product->setSlug($this->slugGenerator->generate($productName));
+ $product->setVendor($vendor);
+ $product->setCreatedAt($date);
+
+ if (null !== $channel) {
+ $product->addChannel($channel);
+
+ foreach ($channel->getLocales() as $locale) {
+ $product->setFallbackLocale($locale->getCode());
+ $product->setCurrentLocale($locale->getCode());
+
+ $product->setName($productName);
+ $product->setSlug($this->slugGenerator->generate($productName));
+ }
+ }
+
+ /** @var ProductVariantInterface $productVariant */
+ $productVariant = $this->defaultVariantResolver->getVariant($product);
+
+ if (null !== $channel) {
+ $productVariant->addChannelPricing($this->createChannelPricingForChannel($price, $channel));
+ }
+
+ $productVariant->setCode($product->getCode());
+ $productVariant->setName($product->getName());
+ $productVariant->setCreatedAt($date);
+ $productVariant->setUpdatedAt($date);
+
+ return $product;
+ }
+
+ private function saveProduct(ProductInterface $product)
+ {
+ $this->productRepository->add($product);
+ $this->sharedStorage->set('product', $product);
+ }
+
+ private function createChannelPricingForChannel(int $price, ChannelInterface $channel = null)
+ {
+ /** @var ChannelPricingInterface $channelPricing */
+ $channelPricing = $this->channelPricingFactory->createNew();
+ $channelPricing->setPrice($price);
+ $channelPricing->setChannelCode($channel->getCode());
+
+ return $channelPricing;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Admin/ProductListing/ShowPage.php b/OpenMarketplace/tests/Behat/Page/Admin/ProductListing/ShowPage.php
new file mode 100644
index 0000000..78bd573
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Admin/ProductListing/ShowPage.php
@@ -0,0 +1,30 @@
+getDocument()
+ ->fillField(
+ 'mvm_conversation[messages][__name__][content]',
+ $message,
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Admin/ProductListing/ShowPageInterface.php b/OpenMarketplace/tests/Behat/Page/Admin/ProductListing/ShowPageInterface.php
new file mode 100644
index 0000000..712db71
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Admin/ProductListing/ShowPageInterface.php
@@ -0,0 +1,19 @@
+open($sorting);
+ }
+
+ public function getSettlements(): array
+ {
+ return $this->getDocument()
+ ->find('css', 'table.table')
+ ->findAll('css', 'tr.item');
+ }
+
+ public function getSettlementsWithStatus(string $status = null): array
+ {
+ $locator = null !== $status
+ ? sprintf('table.table > tbody > tr.item:contains("%s")', $status)
+ : 'table.table > tbody > tr.item'
+ ;
+
+ return $this->getDocument()->findAll('css', $locator);
+ }
+
+ public function getSettlementsForVendor(string $vendorName): array
+ {
+ $locator = sprintf('table.table > tbody > tr.item:contains("%s")', $vendorName);
+
+ return $this->getDocument()->findAll('css', $locator);
+ }
+
+ public function checkExistsSettlementForAmountAndChannel(string $amount, string $channelName): void
+ {
+ $locator = sprintf('table.table > tbody > tr.item:contains("%s") > td:contains("%s")', $amount, $channelName);
+
+ $row = $this->getDocument()->find('css', $locator);
+ Assert::notNull($row);
+ }
+
+ public function getSettlementsByPeriodEndsToday(bool $endsToday): array
+ {
+ $endsTodayString = sprintf(' - %s', date('d/m/Y'));
+
+ $locator = $endsToday
+ ? sprintf('table.table > tbody > tr.item:contains("%s")', $endsTodayString)
+ : sprintf('table.table > tbody > tr.item:not(:contains("%s"))', $endsTodayString)
+ ;
+
+ return $this->getDocument()->findAll('css', $locator);
+ }
+
+ public function getSortedSettlements(array $sorting): array
+ {
+ $this->open($sorting);
+
+ return $this->getSettlements();
+ }
+
+ public function filterByStatus(string $status): void
+ {
+ $form = $this->getForm();
+ $statusDropdown = $form->find('css', 'select[id="criteria_status_status"]');
+ $statusDropdown->selectOption($status);
+
+ $form->submit();
+ }
+
+ public function filterByPeriod(string $period): void
+ {
+ $form = $this->getForm();
+ $periodDropdown = $form->find('css', 'select[id="criteria_period_period"]');
+ $periodDropdown->selectOption($period);
+
+ $form->submit();
+ }
+
+ public function filterByVendor(string $vendor): void
+ {
+ $form = $this->getForm();
+ $vendorDropdown = $form->find('css', 'select[id="criteria_vendor"]');
+ $vendorDropdown->selectOption($vendor);
+
+ $form->submit();
+ }
+
+ public function filterByChannel(string $channelName): void
+ {
+ $form = $this->getForm();
+ $vendorDropdown = $form->find('css', 'select[id="criteria_channel"]');
+ $vendorDropdown->selectOption($channelName);
+
+ $form->submit();
+ }
+
+ public function clearFilters(): void
+ {
+ $form = $this->getForm();
+ $form->clickLink('Clear filters');
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+
+ private function getForm(): NodeElement
+ {
+ $page = $this->getPage();
+ $content = $page->find('css', 'div[class="ui styled fluid accordion"]');
+
+ return $content->find('css', 'form');
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Admin/SettlementPageInterface.php b/OpenMarketplace/tests/Behat/Page/Admin/SettlementPageInterface.php
new file mode 100644
index 0000000..7820a78
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Admin/SettlementPageInterface.php
@@ -0,0 +1,39 @@
+getDocument()->findAll('css', 'table.table > tbody > tr.item:contains("' . $vendorName . '")');
+ $link = $row[0]->find('css', 'a:contains("Edit")');
+ $link->click();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Admin/VendorPageInterface.php b/OpenMarketplace/tests/Behat/Page/Admin/VendorPageInterface.php
new file mode 100644
index 0000000..53110d5
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Admin/VendorPageInterface.php
@@ -0,0 +1,17 @@
+getPage()->getText();
+ Assert::contains($content, $frequency);
+ }
+
+ public function setSettlementFrequency(string $frequency): void
+ {
+ $settlementFrequencyField = $this->getDocument()->find('css', 'select[name="vendor[settlementFrequency]"]');
+ $settlementFrequencyField->selectOption($frequency);
+ }
+
+ public function submitVendorForm(): void
+ {
+ $this->getDocument()->pressButton('Save changes');
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Admin/VendorUpdatePageInterface.php b/OpenMarketplace/tests/Behat/Page/Admin/VendorUpdatePageInterface.php
new file mode 100644
index 0000000..20c8362
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Admin/VendorUpdatePageInterface.php
@@ -0,0 +1,21 @@
+getDocument()
+ ->find('css', 'table.table')
+ ->findAll('css', 'tr.item');
+ }
+
+ public function getSortedVirtualWallets(array $sorting): array
+ {
+ $this->open($sorting);
+
+ return $this->getVirtualWallets();
+ }
+
+ public function checkExistsVirtualWalletForAmountAndChannel(string $amount, string $channelName): void
+ {
+ $locator = sprintf('table.table > tbody > tr.item:contains("%s") > td:contains("%s")', $amount, $channelName);
+
+ $row = $this->getDocument()->find('css', $locator);
+ Assert::notNull($row);
+ }
+
+ public function filterByVendor(string $vendor): void
+ {
+ $form = $this->getForm();
+ $vendorDropdown = $form->find('css', 'select[id="criteria_vendor"]');
+ $vendorDropdown->selectOption($vendor);
+
+ $form->submit();
+ }
+
+ public function filterByChannel(string $channelName): void
+ {
+ $form = $this->getForm();
+ $vendorDropdown = $form->find('css', 'select[id="criteria_channel"]');
+ $vendorDropdown->selectOption($channelName);
+
+ $form->submit();
+ }
+
+ public function clearFilters(): void
+ {
+ $form = $this->getForm();
+ $form->clickLink('Clear filters');
+ }
+
+ private function getPage(): DocumentElement
+ {
+ return $this->getSession()->getPage();
+ }
+
+ private function getForm(): NodeElement
+ {
+ $page = $this->getPage();
+ $content = $page->find('css', 'div[class="ui styled fluid accordion"]');
+
+ return $content->find('css', 'form');
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Admin/VirtualWalletPageInterface.php b/OpenMarketplace/tests/Behat/Page/Admin/VirtualWalletPageInterface.php
new file mode 100644
index 0000000..0aeaa65
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Admin/VirtualWalletPageInterface.php
@@ -0,0 +1,32 @@
+getElement('confirmation_button')->click();
+ }
+
+ public function openActionDropdown(): void
+ {
+ $this->getElement('action_dropdown')->click();
+ }
+
+ protected function getDefinedElements(): array
+ {
+ return array_merge(parent::getDefinedElements(), [
+ 'action_dropdown' => '.ui.labeled.icon.floating.dropdown.link.button',
+ ]);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Shop/Vendor/ProductListingIndexPageInterface.php b/OpenMarketplace/tests/Behat/Page/Shop/Vendor/ProductListingIndexPageInterface.php
new file mode 100644
index 0000000..9d421c1
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Shop/Vendor/ProductListingIndexPageInterface.php
@@ -0,0 +1,21 @@
+getDocument()->find('css', 'button');
+ $addToCart->click();
+ }
+
+ private function waitForCartSummary(): void
+ {
+ if ($this->getDriver() instanceof Selenium2Driver || $this->getDriver() instanceof ChromeDriver) {
+ JQueryHelper::waitForAsynchronousActionsToFinish($this->getSession());
+ $this->getDocument()->waitFor(3, function (): bool {
+ return $this->summaryPage->isOpen();
+ });
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/Conversation/IndexPage.php b/OpenMarketplace/tests/Behat/Page/Vendor/Conversation/IndexPage.php
new file mode 100644
index 0000000..0c3a2dd
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/Conversation/IndexPage.php
@@ -0,0 +1,21 @@
+getDocument()->findAll('css', '.grid .four .menu');
+ foreach ($sidebars as $sidebar) {
+ $links = $sidebar->findAll('css', '.item');
+ foreach ($links as $link) {
+ if ($value === $link->getText()) {
+ return true;
+ }
+ }
+ }
+
+ return false;
+ }
+
+ public function itemWithValueDoesntExistsInsideSidebar($value): bool
+ {
+ $sidebars = $this->getDocument()->findAll('css', '.grid .four .menu');
+ foreach ($sidebars as $sidebar) {
+ $links = $sidebar->findAll('css', '.item');
+ foreach ($links as $link) {
+ if ($value === $link->getText()) {
+ return false;
+ }
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/OrderShowPage.php b/OpenMarketplace/tests/Behat/Page/Vendor/OrderShowPage.php
new file mode 100644
index 0000000..0e6efc5
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/OrderShowPage.php
@@ -0,0 +1,61 @@
+getDocument()->clickLink('Resend the order confirmation email');
+ }
+
+ public function getHeaderText(): string
+ {
+ $page = $this->getDocument();
+
+ return $page->find('css', '.ui.header')->getText();
+ }
+
+ public function getCustomerText(): string
+ {
+ $page = $this->getDocument();
+
+ return $page->find('css', '#customer')->getText();
+ }
+
+ public function getBillingAddressText(): string
+ {
+ $page = $this->getDocument();
+
+ return $page->find('css', '#billing-address')->getText();
+ }
+
+ public function getShippingAddressText(): string
+ {
+ $page = $this->getDocument();
+
+ return $page->find('css', '#shipping-address')->getText();
+ }
+
+ public function getShippingStateText(): string
+ {
+ $page = $this->getDocument();
+
+ return $page->find('css', '#shipping-state')->getText();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/OrderShowPageInterface.php b/OpenMarketplace/tests/Behat/Page/Vendor/OrderShowPageInterface.php
new file mode 100644
index 0000000..9811b75
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/OrderShowPageInterface.php
@@ -0,0 +1,29 @@
+getDocument()
+ ->fillField(
+ 'sylius_product[taxCategory]',
+ $taxCategoryName,
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/CreatePageInterface.php b/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/CreatePageInterface.php
new file mode 100644
index 0000000..a74af3f
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/CreatePageInterface.php
@@ -0,0 +1,18 @@
+getDocument()
+ ->fillField(
+ 'sylius_product[taxCategory]',
+ $taxCategoryName,
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/EditPageInterface.php b/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/EditPageInterface.php
new file mode 100644
index 0000000..dc2ca83
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/EditPageInterface.php
@@ -0,0 +1,18 @@
+getDocument()
+ ->findAll(
+ 'css',
+ 'table > tbody > tr',
+ );
+ }
+
+ public function findStatus(string $status): ?NodeElement
+ {
+ return $this->getDocument()
+ ->find(
+ 'css',
+ sprintf('table > tbody > tr > td:contains("%s")', $status),
+ );
+ }
+
+ public function findDropdownLink(): ?NodeElement
+ {
+ return $this->getDocument()
+ ->find(
+ 'css',
+ '.ui.labeled.icon.floating.dropdown.link.button',
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/IndexPageInterface.php b/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/IndexPageInterface.php
new file mode 100644
index 0000000..7770501
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/ProductListing/IndexPageInterface.php
@@ -0,0 +1,24 @@
+getDocument();
+ $tableWrapper = $page->find('css', 'table.table');
+
+ return $tableWrapper->findAll('css', 'tr.item');
+ }
+
+ public function clickButton(string $button): void
+ {
+ $this->getDocument()->pressButton($button);
+ }
+
+ public function clickButtonFirstReview(string $button): void
+ {
+ $page = $this->getDocument();
+ $firstReview = $page->find('css', 'table.table tr.item:first-child');
+ $firstReview->pressButton($button);
+ }
+
+ public function clickEditFirstReview(): void
+ {
+ $page = $this->getDocument();
+ $editLint = $page->find('css', 'table.table tr.item:first-child a');
+ $editLint->press();
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/ProductReviewPageInterface.php b/OpenMarketplace/tests/Behat/Page/Vendor/ProductReviewPageInterface.php
new file mode 100644
index 0000000..06aa631
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/ProductReviewPageInterface.php
@@ -0,0 +1,26 @@
+open();
+ }
+
+ public function getSettlements(): array
+ {
+ return $this->getDocument()
+ ->find('css', 'table.table')
+ ->findAll('css', 'tr.item')
+ ;
+ }
+
+ public function findFirstAcceptButton(): ?NodeElement
+ {
+ return $this->getDocument()->findButton('Accept');
+ }
+
+ public function getSettlementsWithStatus(string $status = null): array
+ {
+ $locator = null !== $status
+ ? sprintf('table.table > tbody > tr.item:contains("%s")', $status)
+ : 'table.table > tbody > tr.item'
+ ;
+
+ return $this->getDocument()->findAll('css', $locator);
+ }
+
+ public function filterByStatus(string $status): void
+ {
+ $form = $this->getForm();
+ $statusDropdown = $form->find('css', 'select[id="criteria_status_status"]');
+ $statusDropdown->selectOption($status);
+
+ $form->submit();
+ }
+
+ public function filterByPeriod(string $period): void
+ {
+ $form = $this->getSession()->getPage()->find('css', 'form');
+ $periodDropdown = $form->find('css', 'select[id="criteria_period_period"]');
+ $periodDropdown->selectOption($period);
+
+ $form->submit();
+ }
+
+ private function getForm()
+ {
+ $session = $this->getSession();
+ $page = $session->getPage();
+
+ return $page->find('css', 'form');
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/Vendor/SettlementPageInterface.php b/OpenMarketplace/tests/Behat/Page/Vendor/SettlementPageInterface.php
new file mode 100644
index 0000000..1fdca2c
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/Vendor/SettlementPageInterface.php
@@ -0,0 +1,29 @@
+getDocument();
+ $validationMessages = $page->findAll('css', ".$messageClass");
+
+ return count($validationMessages);
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/VendorPagePage.php b/OpenMarketplace/tests/Behat/Page/VendorPagePage.php
new file mode 100644
index 0000000..1340a64
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/VendorPagePage.php
@@ -0,0 +1,72 @@
+getDocument();
+ $productsList = $page->findById('products');
+
+ return $productsList->find('css', '[data-test-product]:first-child [data-test-product-content] [data-test-product-name]')->getText();
+ }
+
+ public function getLastProductNameFromList(): string
+ {
+ $page = $this->getDocument();
+ $productsList = $page->findById('products');
+
+ return $productsList->find('css', '[data-test-product]:last-child [data-test-product-content] [data-test-product-name]')->getText();
+ }
+
+ public function countProduct(): int
+ {
+ $page = $this->getDocument();
+ $productCards = $page->findAll('css', '.ui.fluid.card');
+
+ return count($productCards);
+ }
+
+ public function productsSorted(array $sorting): bool
+ {
+ $page = $this->getDocument();
+
+ $productCards = $page->findAll('css', '.ui.fluid.card');
+
+ foreach ($productCards as $i => $productCard) {
+ $productField[$i] = $productCard->find('css', '.sylius-product-' . $sorting['field'])->getText();
+
+ if (0 === $i) {
+ continue;
+ }
+
+ $comparationValue = $productField[$i - 1] <= $productField[$i];
+
+ if (
+ ('asc' === $sorting['value'] && !$comparationValue) ||
+ ('desc' === $sorting['value'] && $comparationValue)
+ ) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+}
diff --git a/OpenMarketplace/tests/Behat/Page/VendorPagePageInterface.php b/OpenMarketplace/tests/Behat/Page/VendorPagePageInterface.php
new file mode 100644
index 0000000..e406293
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Page/VendorPagePageInterface.php
@@ -0,0 +1,22 @@
+alert('Executing JS')
diff --git a/OpenMarketplace/tests/Behat/Resources/services.xml b/OpenMarketplace/tests/Behat/Resources/services.xml
new file mode 100644
index 0000000..a5c046e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts.xml
new file mode 100644
index 0000000..bcaafc6
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts.xml
@@ -0,0 +1,8 @@
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/settlement.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/settlement.xml
new file mode 100644
index 0000000..9993de7
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/settlement.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/ui.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/ui.xml
new file mode 100644
index 0000000..3e38a8f
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/ui.xml
@@ -0,0 +1,57 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/view_payment.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/view_payment.xml
new file mode 100644
index 0000000..8ad652e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/view_payment.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/view_shipment.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/view_shipment.xml
new file mode 100644
index 0000000..1a66ef6
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/view_shipment.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/virtual_wallet.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/virtual_wallet.xml
new file mode 100644
index 0000000..2e43cb3
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/admin/virtual_wallet.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/common/conversation_context.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/common/conversation_context.xml
new file mode 100644
index 0000000..d6cb1bd
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/common/conversation_context.xml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/common/grid_sorting.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/common/grid_sorting.xml
new file mode 100644
index 0000000..85266e1
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/common/grid_sorting.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/admin_user.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/admin_user.xml
new file mode 100644
index 0000000..6f441b3
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/admin_user.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/draft_attribute.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/draft_attribute.xml
new file mode 100644
index 0000000..83cf9cc
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/draft_attribute.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/paymentMethod.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/paymentMethod.xml
new file mode 100644
index 0000000..c8d1aa5
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/paymentMethod.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/product.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/product.xml
new file mode 100644
index 0000000..25fd61e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/product.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/product_listing.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/product_listing.xml
new file mode 100644
index 0000000..ac0588c
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/product_listing.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/settlement.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/settlement.xml
new file mode 100644
index 0000000..3f3b2df
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/settlement.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/vendor.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/vendor.xml
new file mode 100644
index 0000000..ae70105
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/vendor.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/virtual_wallet.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/virtual_wallet.xml
new file mode 100644
index 0000000..944baa7
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/setup/virtual_wallet.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/shop/order.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/shop/order.xml
new file mode 100644
index 0000000..91ef7d4
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/shop/order.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/ui/shop.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/ui/shop.xml
new file mode 100644
index 0000000..a7bf483
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/ui/shop.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/customer_dashboard.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/customer_dashboard.xml
new file mode 100644
index 0000000..8b620d9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/customer_dashboard.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/draft_attribute.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/draft_attribute.xml
new file mode 100644
index 0000000..1647c6a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/draft_attribute.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/factory.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/factory.xml
new file mode 100644
index 0000000..4b9cba3
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/factory.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/inventory.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/inventory.xml
new file mode 100644
index 0000000..5923535
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/inventory.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/order.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/order.xml
new file mode 100644
index 0000000..afa4b54
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/order.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/order_setup.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/order_setup.xml
new file mode 100644
index 0000000..82ad8ae
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/order_setup.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/product_review.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/product_review.xml
new file mode 100644
index 0000000..24882b1
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/product_review.xml
@@ -0,0 +1,15 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/settlement.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/settlement.xml
new file mode 100644
index 0000000..36fd68d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/settlement.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/ui.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/ui.xml
new file mode 100644
index 0000000..b4ec4b1
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/ui.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_commission.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_commission.xml
new file mode 100644
index 0000000..31b2bfd
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_commission.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_register.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_register.xml
new file mode 100644
index 0000000..ffaf7cc
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_register.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_setup.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_setup.xml
new file mode 100644
index 0000000..8657818
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_setup.xml
@@ -0,0 +1,14 @@
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_shipping_methods.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_shipping_methods.xml
new file mode 100644
index 0000000..17edf08
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_shipping_methods.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_update.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_update.xml
new file mode 100644
index 0000000..5d8f78d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor/vendor_update.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor_page.xml b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor_page.xml
new file mode 100644
index 0000000..54f12bc
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/contexts/vendor_page.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/settlement.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/settlement.xml
new file mode 100644
index 0000000..e718757
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/settlement.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/vendor.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/vendor.xml
new file mode 100644
index 0000000..51ebc0f
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/vendor.xml
@@ -0,0 +1,28 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/virtual_wallet.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/virtual_wallet.xml
new file mode 100644
index 0000000..4025b57
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Admin/virtual_wallet.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Shop/product_show.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Shop/product_show.xml
new file mode 100644
index 0000000..9d8e611
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Shop/product_show.xml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/customer_dashboard.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/customer_dashboard.xml
new file mode 100644
index 0000000..c4ef0b1
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/customer_dashboard.xml
@@ -0,0 +1,10 @@
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/order_show.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/order_show.xml
new file mode 100644
index 0000000..26b0f87
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/order_show.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/productListingPage.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/productListingPage.xml
new file mode 100644
index 0000000..2a966c9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/productListingPage.xml
@@ -0,0 +1,30 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/product_review.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/product_review.xml
new file mode 100644
index 0000000..c4a7476
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/product_review.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/settlement.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/settlement.xml
new file mode 100644
index 0000000..ae03951
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/settlement.xml
@@ -0,0 +1,21 @@
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/vendor.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/vendor.xml
new file mode 100644
index 0000000..f941218
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/vendor.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/vendor_register.xml b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/vendor_register.xml
new file mode 100644
index 0000000..d3dd993
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/pages/Vendor/vendor_register.xml
@@ -0,0 +1,9 @@
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/services/services.xml b/OpenMarketplace/tests/Behat/Resources/services/services.xml
new file mode 100644
index 0000000..531a5dd
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/services/services.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
diff --git a/OpenMarketplace/tests/Behat/Resources/suites.yml b/OpenMarketplace/tests/Behat/Resources/suites.yml
new file mode 100644
index 0000000..5159bc2
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites.yml
@@ -0,0 +1,38 @@
+imports:
+ - suites/vendor/customer_dashboard.yml
+ - suites/vendor/vendor_register.yml
+ - suites/vendor/vendor_update.yml
+ - suites/vendor/vendor_commission.yml
+ - suites/ui/vendor/product_listing.yml
+ - suites/ui/admin/product_listing.yml
+ - suites/start_conversation.yml
+ - suites/ui/admin/message_categories.yml
+ - suites/ui/admin/managing_vendors.yml
+ - suites/ui/admin/verifying_vendors.yml
+ - suites/ui/admin/order_viewing.yml
+ - suites/ui/admin/viewing_payments.yml
+ - suites/ui/admin/viewing_shipments.yml
+ - suites/ui/admin/disabling_vendors.yml
+ - suites/ui/admin/restoring_product.yml
+ - suites/ui/admin/editing_vendors.yml
+ - suites/ui/admin/product_listing.yml
+ - suites/ui/admin/dashboard_statistics.yml
+ - suites/ui/admin/customer_orders.yml
+ - suites/shop/order.yml
+ - suites/vendor/order_listing.yml
+ - suites/vendor/clients_listing.yml
+ - suites/vendor/inventory_management.yml
+ - suites/vendor/order_details.yml
+ - suites/vendor/draft_attribute.yml
+ - suites/vendor/customer_details.yml
+ - suites/vendor/customer_details.yml
+ - suites/vendor/shipping_methods.yml
+ - suites/ui/vendor/product_delete_vendor.yml
+ - suites/vendor/product_reviews.yml
+ - suites/vendor/enable_product_listing.yml
+ - suites/shop/vendor_page.yml
+ - suites/ui/admin/product_pricing.yml
+ - suites/vendor/settlements.yml
+ - suites/ui/admin/settlements.yml
+ - suites/ui/admin/virtual_wallets.yml
+ - suites/ui/admin/settlements_frequency.yml
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/shop/account_order.yml b/OpenMarketplace/tests/Behat/Resources/suites/shop/account_order.yml
new file mode 100644
index 0000000..c1c6a27
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/shop/account_order.yml
@@ -0,0 +1,21 @@
+default:
+ suites:
+ shop_account_order:
+ contexts:
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.setup.product
+ - tests.open_marketplace.behat.context.ui.shop.account.order
+
+ - sylius.behat.context.ui.shop.account
+
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.payment
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.shop_security
+
+ - sylius.behat.context.transform.order
+ - sylius.behat.context.hook.doctrine_orm
+ - Behat\MinkExtension\Context\MinkContext
+ filters:
+ tags: "@shop_account_order&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/shop/order.yml b/OpenMarketplace/tests/Behat/Resources/suites/shop/order.yml
new file mode 100644
index 0000000..484901e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/shop/order.yml
@@ -0,0 +1,25 @@
+default:
+ suites:
+ shop_order:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - sylius.behat.context.setup.payment
+ - sylius.behat.context.setup.admin_security
+ - tests.open_marketplace.behat.context.setup.product
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.shipping_category
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.transform.shipping_category
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.transform.shipping_method
+ - sylius.behat.context.transform.shared_storage
+ - sylius.behat.context.setup.user
+ - Behat\MinkExtension\Context\MinkContext
+ - tests.open_marketplace.behat.context.setup.payment_method
+ filters:
+ tags: "@shop_order&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/shop/vendor_page.yml b/OpenMarketplace/tests/Behat/Resources/suites/shop/vendor_page.yml
new file mode 100644
index 0000000..ed8956a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/shop/vendor_page.yml
@@ -0,0 +1,16 @@
+default:
+ suites:
+ vendor_page:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.product
+ - tests.open_marketplace.behat.context.vendor_page_context
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.user
+ filters:
+ tags: "@vendor_page"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/start_conversation.yml b/OpenMarketplace/tests/Behat/Resources/suites/start_conversation.yml
new file mode 100644
index 0000000..143406b
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/start_conversation.yml
@@ -0,0 +1,16 @@
+default:
+ suites:
+ start_conversation:
+ contexts:
+ - tests.bitbag.open_marketplace.behat.context.vendor.vendor_setup_context
+ - tests.open_marketplace.behat.context.conversation_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.admin_user
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.locale
+ - sylius.behat.context.ui.shop.account
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: '@admin_start_conversation'
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/customer_orders.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/customer_orders.yml
new file mode 100644
index 0000000..04b82de
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/customer_orders.yml
@@ -0,0 +1,27 @@
+default:
+ suites:
+ customer_orders:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.admin.view_payment_context
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.order
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.product
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.zone
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.zone
+ - sylius.behat.context.transform.payment
+ - sylius.behat.context.setup.payment
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.cart
+ - sylius.behat.context.setup.currency
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.transform.shared_storage
+ filters:
+ tags: "@hiding_primary_orders_in_customer_tab&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/dashboard_statistics.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/dashboard_statistics.yml
new file mode 100644
index 0000000..aa53956
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/dashboard_statistics.yml
@@ -0,0 +1,27 @@
+default:
+ suites:
+ dashboard_statistics:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.dashboard_statistics
+ - tests.open_marketplace.behat.context.admin.view_payment_context
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.order
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.product
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.zone
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.zone
+ - sylius.behat.context.transform.payment
+ - sylius.behat.context.setup.payment
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.cart
+ - sylius.behat.context.setup.currency
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.transform.shared_storage
+ filters:
+ tags: "@dashboard_statistics&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/disabling_vendors.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/disabling_vendors.yml
new file mode 100644
index 0000000..cf884b7
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/disabling_vendors.yml
@@ -0,0 +1,10 @@
+default:
+ suites:
+ ui_disabling_vendors:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.vendor_disabling
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: "@disabling_vendors&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/editing_vendors.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/editing_vendors.yml
new file mode 100644
index 0000000..5ca7be4
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/editing_vendors.yml
@@ -0,0 +1,10 @@
+default:
+ suites:
+ ui_editing_vendors:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.vendor_editing
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: "@editing_vendors&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/managing_vendors.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/managing_vendors.yml
new file mode 100644
index 0000000..17f1a50
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/managing_vendors.yml
@@ -0,0 +1,13 @@
+default:
+ suites:
+ ui_managing_vendors:
+ contexts:
+ - tests.open_marketplace.behat.context.setup.admin_user
+ - open_marketplace.behat.context.setup.vendor
+ - open_marketplace.behat.context.ui.admin.vendor_listing
+ - open_marketplace.behat.context.ui.admin.vendor_editing
+ - open_marketplace.behat.context.ui.admin.admin
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: "@managing_vendors&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/message_categories.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/message_categories.yml
new file mode 100644
index 0000000..c5599e5
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/message_categories.yml
@@ -0,0 +1,13 @@
+default:
+ suites:
+ ui_message_category:
+ contexts:
+ - tests.open_marketplace.behat.context.conversation_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.admin_user
+ - sylius.behat.context.ui.shop.account
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: '@messaging'
+
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/order_viewing.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/order_viewing.yml
new file mode 100644
index 0000000..a2c2939
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/order_viewing.yml
@@ -0,0 +1,27 @@
+default:
+ suites:
+ order_viewing:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.admin.view_payment_context
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.order
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.product
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.zone
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.zone
+ - sylius.behat.context.transform.payment
+ - sylius.behat.context.setup.payment
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.cart
+ - sylius.behat.context.setup.currency
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.transform.shared_storage
+ filters:
+ tags: "@order_viewing&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/product_listing.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/product_listing.yml
new file mode 100644
index 0000000..f0ddf3b
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/product_listing.yml
@@ -0,0 +1,15 @@
+default:
+ suites:
+ ui_managing_product_listings:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.product_listing
+ - open_marketplace.behat.context.setup.product_listing
+ - tests.open_marketplace.behat.context.setup.draft_attribute
+ - tests.open_marketplace.behat.context.setup.product
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.channel
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: '@managing_product_listings&&@ui'
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/product_pricing.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/product_pricing.yml
new file mode 100644
index 0000000..3d59c6f
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/product_pricing.yml
@@ -0,0 +1,16 @@
+default:
+ suites:
+ product_pricing:
+ contexts:
+ - sylius.behat.context.hook.doctrine_orm
+ - open_marketplace.behat.context.ui.admin.vendor_disabling
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.domain.managing_products
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.transform.product_variant
+ - sylius.behat.context.setup.product
+ filters:
+ tags: "@product_pricing&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/restoring_product.yaml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/restoring_product.yaml
new file mode 100644
index 0000000..380484d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/restoring_product.yaml
@@ -0,0 +1,12 @@
+default:
+ suites:
+ restoring_visibility_admin:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.product_listing
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.channel
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: '@product_removal_admin@javascript&&@ui'
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/restoring_product.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/restoring_product.yml
new file mode 100644
index 0000000..c70ac3e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/restoring_product.yml
@@ -0,0 +1,12 @@
+default:
+ suites:
+ restoring_visibility:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.product_listing
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.channel
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: '@product_removal_admin&&@ui'
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/settlements.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/settlements.yml
new file mode 100644
index 0000000..a2e48a5
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/settlements.yml
@@ -0,0 +1,15 @@
+default:
+ suites:
+ admin_settlements:
+ contexts:
+ - tests.open_marketplace.behat.context.admin.settlement
+ - tests.open_marketplace.behat.context.setup.settlement
+ - tests.open_marketplace.behat.context.setup.admin_user
+ - tests.open_marketplace.behat.context.common.grid_sorting
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ filters:
+ tags: "@admin_settlements&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/settlements_frequency.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/settlements_frequency.yml
new file mode 100644
index 0000000..5c7070d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/settlements_frequency.yml
@@ -0,0 +1,26 @@
+default:
+ suites:
+ admin_settlements_frequency:
+ contexts:
+ - sylius.behat.context.transform.shared_storage
+ - sylius.behat.context.transform.channel
+ - tests.open_marketplace.behat.context.setup.settlement
+ - tests.open_marketplace.behat.context.setup.admin_user
+ - tests.open_marketplace.behat.context.setup.virtual_wallet
+ - tests.open_marketplace.behat.context.setup.order
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.hook.doctrine_orm
+ - open_marketplace.behat.context.ui.admin.vendor_editing
+ - open_marketplace.behat.context.ui.admin.vendor_listing
+ - open_marketplace.behat.context.ui.admin.admin
+ - tests.open_marketplace.behat.context.admin.settlement
+ - tests.open_marketplace.behat.context.admin.virtual_wallet
+ - tests.open_marketplace.behat.context.common.grid_sorting
+ - sylius.behat.context.transform.lexical
+ filters:
+ tags: "@admin_settlements_frequency&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/verifying_vendors.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/verifying_vendors.yml
new file mode 100644
index 0000000..d957b0f
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/verifying_vendors.yml
@@ -0,0 +1,10 @@
+default:
+ suites:
+ ui_verifying_vendors:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.vendor_verification
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: "@verifying_vendors&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/viewing_payments.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/viewing_payments.yml
new file mode 100644
index 0000000..fcd5d9e
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/viewing_payments.yml
@@ -0,0 +1,22 @@
+default:
+ suites:
+ payment_viewing:
+ contexts:
+ - tests.open_marketplace.behat.context.admin.view_payment_context
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.cart
+ - sylius.behat.context.setup.currency
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.shared_storage
+ - sylius.behat.context.setup.zone
+ - sylius.behat.context.setup.payment
+ - Behat\MinkExtension\Context\MinkContext
+ filters:
+ tags: "@payment_viewing&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/viewing_shipments.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/viewing_shipments.yml
new file mode 100644
index 0000000..5afd514
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/viewing_shipments.yml
@@ -0,0 +1,22 @@
+default:
+ suites:
+ shipment_viewing:
+ contexts:
+ - tests.open_marketplace.behat.context.admin.view_shipment_context
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.cart
+ - sylius.behat.context.setup.currency
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.shared_storage
+ - sylius.behat.context.setup.zone
+ - sylius.behat.context.setup.payment
+ - Behat\MinkExtension\Context\MinkContext
+ filters:
+ tags: "@shipment_viewing&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/virtual_wallets.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/virtual_wallets.yml
new file mode 100644
index 0000000..dfeb745
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/admin/virtual_wallets.yml
@@ -0,0 +1,20 @@
+default:
+ suites:
+ admin_virtual_wallets:
+ contexts:
+ - tests.open_marketplace.behat.context.admin.virtual_wallet
+ - tests.open_marketplace.behat.context.setup.virtual_wallet
+ - tests.open_marketplace.behat.context.setup.admin_user
+ - tests.open_marketplace.behat.context.common.grid_sorting
+ - tests.open_marketplace.behat.context.setup.product
+ - sylius.behat.context.setup.product
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.shared_storage
+ filters:
+ tags: "@admin_virtual_wallets&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/vendor/product_delete_vendor.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/vendor/product_delete_vendor.yml
new file mode 100644
index 0000000..fff048c
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/vendor/product_delete_vendor.yml
@@ -0,0 +1,12 @@
+default:
+ suites:
+ restoring_visibility:
+ contexts:
+ - open_marketplace.behat.context.ui.vendor.product_listing
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.channel
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ filters:
+ tags: '@product_removal_vendor&&@javascript&&@ui'
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/ui/vendor/product_listing.yml b/OpenMarketplace/tests/Behat/Resources/suites/ui/vendor/product_listing.yml
new file mode 100644
index 0000000..c4bda2a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/ui/vendor/product_listing.yml
@@ -0,0 +1,14 @@
+default:
+ suites:
+ vendor_ui_managing_product_listings:
+ contexts:
+ - open_marketplace.behat.context.ui.vendor.product_listing
+ - open_marketplace.behat.context.setup.product_listing
+ - tests.open_marketplace.behat.context.setup.draft_attribute
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.taxonomy
+ filters:
+ tags: '@vendor_managing_product_listings&&@ui'
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/clients_listing.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/clients_listing.yml
new file mode 100644
index 0000000..0d5bca1
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/clients_listing.yml
@@ -0,0 +1,14 @@
+default:
+ suites:
+ clients_listing:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ filters:
+ tags: "@clients_listing&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/customer_dashboard.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/customer_dashboard.yml
new file mode 100644
index 0000000..cf5fe3a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/customer_dashboard.yml
@@ -0,0 +1,11 @@
+default:
+ suites:
+ customer_dashboard:
+ contexts:
+ - tests.open_marketplace.behat.context.vendor.customer_dashboard_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.geographical
+ filters:
+ tags: "@customer_dashboard"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/customer_details.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/customer_details.yml
new file mode 100644
index 0000000..0558f96
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/customer_details.yml
@@ -0,0 +1,15 @@
+default:
+ suites:
+ customers_details:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ filters:
+ tags: "@customers_details&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/draft_attribute.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/draft_attribute.yml
new file mode 100644
index 0000000..ac9b1e6
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/draft_attribute.yml
@@ -0,0 +1,14 @@
+default:
+ suites:
+ draft_attribute:
+ contexts:
+ - tests.open_marketplace.behat.context.draft_attribute_context
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.locale
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.geographical
+ - Behat\MinkExtension\Context\MinkContext
+ filters:
+ tags: "@draft_attribute&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/enable_product_listing.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/enable_product_listing.yml
new file mode 100644
index 0000000..2a44a5d
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/enable_product_listing.yml
@@ -0,0 +1,17 @@
+default:
+ suites:
+ enable_product:
+ contexts:
+ - open_marketplace.behat.context.setup.product_listing
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - tests.open_marketplace.behat.context.setup.product
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ filters:
+ tags: "@enable_product&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/inventory_management.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/inventory_management.yml
new file mode 100644
index 0000000..d4577b8
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/inventory_management.yml
@@ -0,0 +1,17 @@
+default:
+ suites:
+ inventory_management:
+ contexts:
+ - tests.open_marketplace.behat.context.vendor.inventory_context
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - tests.open_marketplace.behat.context.setup.product
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ filters:
+ tags: "@inventory_management&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/order_details.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/order_details.yml
new file mode 100644
index 0000000..2c3dea0
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/order_details.yml
@@ -0,0 +1,17 @@
+default:
+ suites:
+ order_details:
+ contexts:
+ - tests.open_marketplace.behat.context.vendor.order_context
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.transform.shared_storage
+ filters:
+ tags: "@order_details&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/order_listing.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/order_listing.yml
new file mode 100644
index 0000000..affbf5a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/order_listing.yml
@@ -0,0 +1,15 @@
+default:
+ suites:
+ order_listing:
+ contexts:
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.order
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - Behat\MinkExtension\Context\MinkContext
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ filters:
+ tags: "@order_listing&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/product_reviews.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/product_reviews.yml
new file mode 100644
index 0000000..02538de
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/product_reviews.yml
@@ -0,0 +1,20 @@
+default:
+ suites:
+ product_reviews:
+ contexts:
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - sylius.behat.context.setup.product_review
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.transform.shared_storage
+ - sylius.behat.context.transform.customer
+ - Behat\MinkExtension\Context\MinkContext
+
+ - tests.open_marketplace.behat.context.setup.product
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - tests.open_marketplace.behat.context.vendor.product_review_context
+ filters:
+ tags: "@product_reviews&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/settlements.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/settlements.yml
new file mode 100644
index 0000000..5e8b386
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/settlements.yml
@@ -0,0 +1,13 @@
+default:
+ suites:
+ vendor_settlements:
+ contexts:
+ - tests.open_marketplace.behat.context.vendor.settlement_context
+ - tests.open_marketplace.behat.context.setup.settlement
+ - open_marketplace.behat.context.setup.vendor
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ filters:
+ tags: "@vendor_settlements&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/shipping_methods.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/shipping_methods.yml
new file mode 100644
index 0000000..7aed742
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/shipping_methods.yml
@@ -0,0 +1,21 @@
+default:
+ suites:
+ shipping_methods:
+ contexts:
+ - sylius.behat.context.hook.doctrine_orm
+
+ - sylius.behat.context.transform.channel
+ - sylius.behat.context.transform.lexical
+ - sylius.behat.context.transform.zone
+
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.shipping
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.zone
+
+ - tests.open_marketplace.behat.context.vendor.vendor_shipping_methods_context
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - Behat\MinkExtension\Context\MinkContext
+ filters:
+ tags: "@shipping_methods&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/unverified_vendor_page.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/unverified_vendor_page.yml
new file mode 100644
index 0000000..2485f8f
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/unverified_vendor_page.yml
@@ -0,0 +1,14 @@
+default:
+ suites:
+ unverified_vendor_page:
+ contexts:
+ - sylius.behat.context.hook.doctrine_orm
+ - tests.open_marketplace.behat.context.vendor_page_context
+
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+
+ - sylius.behat.context.ui.shop.product
+
+ filters:
+ tags: "@unverified_vendor_page&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_commission.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_commission.yml
new file mode 100644
index 0000000..3c7af57
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_commission.yml
@@ -0,0 +1,19 @@
+default:
+ suites:
+ vendor_register:
+ contexts:
+ - open_marketplace.behat.context.ui.admin.product_listing
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.locale
+ - sylius.behat.context.ui.shop.account
+ - tests.open_marketplace.behat.context.shop.order
+ - tests.open_marketplace.behat.context.setup.product
+ - sylius.behat.context.setup.customer
+ - sylius.behat.context.setup.user
+ - tests.bitbag.open_marketplace.behat.context.vendor.vendor_commission_context
+ - open_marketplace.behat.context.ui.admin.vendor_listing
+ filters:
+ tags: "@vendor_commission"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_page_pagination.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_page_pagination.yml
new file mode 100644
index 0000000..8796de6
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_page_pagination.yml
@@ -0,0 +1,18 @@
+default:
+ suites:
+ vendor_page_pagination:
+ contexts:
+ - sylius.behat.context.hook.doctrine_orm
+ - tests.open_marketplace.behat.context.vendor_page_context
+
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.locale
+ - sylius.behat.context.setup.user
+
+ - sylius.behat.context.ui.shop.account
+ - sylius.behat.context.ui.shop.product
+
+ filters:
+ tags: "@vendor_page_pagination&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_page_sorting.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_page_sorting.yml
new file mode 100644
index 0000000..22980a6
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_page_sorting.yml
@@ -0,0 +1,18 @@
+default:
+ suites:
+ vendor_page_sorting:
+ contexts:
+ - sylius.behat.context.hook.doctrine_orm
+ - tests.open_marketplace.behat.context.vendor_page_context
+
+ - sylius.behat.context.setup.product
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+
+ - sylius.behat.context.domain.managing_products
+ - sylius.behat.context.domain.notification
+ - sylius.behat.context.domain.security
+
+ - sylius.behat.context.ui.shop.product
+ filters:
+ tags: "@vendor_page_sorting&&@ui"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_register.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_register.yml
new file mode 100644
index 0000000..a479fa9
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_register.yml
@@ -0,0 +1,13 @@
+default:
+ suites:
+ vendor_register:
+ contexts:
+ - tests.open_marketplace.behat.context.vendor.vendor_register_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.admin_security
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.locale
+ - sylius.behat.context.ui.shop.account
+ filters:
+ tags: "@vendor_register"
diff --git a/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_update.yml b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_update.yml
new file mode 100644
index 0000000..3030b7a
--- /dev/null
+++ b/OpenMarketplace/tests/Behat/Resources/suites/vendor/vendor_update.yml
@@ -0,0 +1,13 @@
+default:
+ suites:
+ vendor_dashboard:
+ contexts:
+ - tests.open_marketplace.behat.context.vendor.vendor_update_context
+ - sylius.behat.context.setup.shop_security
+ - sylius.behat.context.hook.doctrine_orm
+ - sylius.behat.context.setup.channel
+ - sylius.behat.context.setup.user
+ - sylius.behat.context.setup.geographical
+ - Behat\MinkExtension\Context\MinkContext
+ filters:
+ tags: "@vendor_dashboard"
diff --git a/OpenMarketplace/tests/End2End/Api/CheckoutProcessEnd2EndTest.php b/OpenMarketplace/tests/End2End/Api/CheckoutProcessEnd2EndTest.php
new file mode 100644
index 0000000..285294f
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Api/CheckoutProcessEnd2EndTest.php
@@ -0,0 +1,250 @@
+loadFixturesFromFile('CheckoutProcessEnd2EndTest/test_it_for_shipment_methods_for_multiple_vendors.yml');
+ $token = $this->createCartAndCheckResponse();
+ $this->addProductsToCartAndCheckResponse($token);
+ $extractedOrderResponse = $this->fillAddressInformationAndCheckResponse($token);
+ $this->checkAvailableShippingMethods($token, $extractedOrderResponse['shipments']);
+ $this->changeDefaultShippingMethodAndCheckResponse($token, (string) $extractedOrderResponse['shipments'][1]['id']);
+ $this->selectPaymentMethodAndCheckResponse($token, (string) $extractedOrderResponse['payments'][0]['id']);
+ $this->completeCheckoutAndCheckResponse($token);
+ }
+
+ private function createCartAndCheckResponse(): string
+ {
+ $response = $this->executeCreateCartRequest();
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/create_order_response',
+ Response::HTTP_CREATED
+ );
+
+ return $this->extractTokenValue($response);
+ }
+
+ private function addProductsToCartAndCheckResponse(string $token): void
+ {
+ $response = $this->executeAddCartItemRequest($token, [
+ 'productVariant' => '/api/v2/shop/product-variants/olivier_1_1',
+ 'quantity' => 3,
+ ]);
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/add_item_first_product_variant_response',
+ Response::HTTP_CREATED
+ );
+
+ $response = $this->executeAddCartItemRequest($token, [
+ 'productVariant' => '/api/v2/shop/product-variants/bruce_1_1',
+ 'quantity' => 1,
+ ]);
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/add_item_second_product_variant_response',
+ Response::HTTP_CREATED
+ );
+ }
+
+ private function fillAddressInformationAndCheckResponse(string $token): array
+ {
+ $response = $this->executeAddAddressInformationToOrderRequest($token);
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/add_addresses_information_response',
+ Response::HTTP_OK
+ );
+
+ return $this->extractResponse($response);
+ }
+
+ private function checkAvailableShippingMethods(string $token, array $shipments): void
+ {
+ $response = $this->executeGetShipmentMethodsRequest($token, (string) $shipments[0]['id']);
+ $this->assertResponse($response, 'CheckoutProcessEnd2EndTest/get_first_shipment_available_shipping_methods_response', Response::HTTP_OK);
+
+ $response = $this->executeGetShipmentMethodsRequest($token, (string) $shipments[1]['id']);
+ $this->assertResponse($response, 'CheckoutProcessEnd2EndTest/get_second_shipment_available_shipping_methods_response', Response::HTTP_OK);
+ }
+
+ private function changeDefaultShippingMethodAndCheckResponse(string $token, $shipmentId): void
+ {
+ $response = $this->executeChangeDefaultShippingMethodRequest($token, $shipmentId);
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/change_default_shipping_method_for_second_shipment_response',
+ Response::HTTP_OK
+ );
+ }
+
+ private function selectPaymentMethodAndCheckResponse(string $token, string $paymentId): void
+ {
+ $response = $this->executeSelectPaymentMethodRequest($token, $paymentId);
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/select_payment_method_response',
+ Response::HTTP_OK
+ );
+ }
+
+ private function completeCheckoutAndCheckResponse(string $token): void
+ {
+ $response = $this->executeCompleteCheckoutRequest($token);
+ $this->assertResponse(
+ $response,
+ 'CheckoutProcessEnd2EndTest/complete_checkout_response',
+ Response::HTTP_OK
+ );
+ }
+
+ private function executeCreateCartRequest(): Response
+ {
+ $this->client->request(
+ 'POST',
+ '/api/v2/shop/orders',
+ [],
+ [],
+ self::CONTENT_TYPE_HEADER,
+ json_encode([])
+ );
+
+ return $this->client->getResponse();
+ }
+
+ private function extractTokenValue(Response $response): string
+ {
+ $data = json_decode($response->getContent(), true);
+
+ return $data['tokenValue'];
+ }
+
+ private function executeAddCartItemRequest(string $token, array $data): Response
+ {
+ $this->client->request(
+ 'POST',
+ '/api/v2/shop/orders/' . $token . '/items',
+ [],
+ [],
+ self::CONTENT_TYPE_HEADER,
+ json_encode($data)
+ );
+
+ return $this->client->getResponse();
+ }
+
+ private function executeAddAddressInformationToOrderRequest(string $token): Response
+ {
+ $this->client->request(
+ 'PUT',
+ '/api/v2/shop/orders/' . $token,
+ [],
+ [],
+ self::CONTENT_TYPE_HEADER,
+ json_encode([
+ 'email' => 'test@bigbag.com',
+ 'shippingAddress' => [
+ 'firstName' => 'John',
+ 'lastName' => 'Novak',
+ 'countryCode' => 'PL',
+ 'city' => 'Warszawa',
+ 'street' => 'Testowa 3',
+ 'postcode' => '11-123',
+ ],
+ 'billingAddress' => [
+ 'firstName' => 'John',
+ 'lastName' => 'Novak',
+ 'countryCode' => 'PL',
+ 'city' => 'Warszawa',
+ 'street' => 'Testowa 3',
+ 'postcode' => '11-123',
+ ],
+ 'quantity' => 1,
+ ])
+ );
+
+ return $this->client->getResponse();
+ }
+
+ private function extractResponse(Response $response): array
+ {
+ return json_decode($response->getContent(), true);
+ }
+
+ private function executeGetShipmentMethodsRequest(string $token, string $shipmentsIds): Response
+ {
+ $this->client->request(
+ 'GET',
+ '/api/v2/shop/orders/' . $token . '/shipments/' . $shipmentsIds . '/methods',
+ [],
+ [],
+ self::CONTENT_TYPE_HEADER
+ );
+
+ return $this->client->getResponse();
+ }
+
+ private function executeChangeDefaultShippingMethodRequest(string $token, string $shipmentsIds): Response
+ {
+ $this->client->request(
+ 'PATCH',
+ '/api/v2/shop/orders/' . $token . '/shipments/' . $shipmentsIds,
+ [],
+ [],
+ ['CONTENT_TYPE' => 'application/merge-patch+json', 'HTTP_ACCEPT' => 'application/ld+json'],
+ json_encode([
+ 'shippingMethod' => '/api/v2/shop/shipping-methods/fedex',
+ ])
+ );
+
+ return $this->client->getResponse();
+ }
+
+ private function executeSelectPaymentMethodRequest(string $token, string $paymentId): Response
+ {
+ $this->client->request(
+ 'PATCH',
+ '/api/v2/shop/orders/' . $token . '/payments/' . $paymentId,
+ [],
+ [],
+ ['CONTENT_TYPE' => 'application/merge-patch+json', 'HTTP_ACCEPT' => 'application/ld+json'],
+ json_encode([
+ 'paymentMethod' => '/api/v2/shop/payment-methods/CASH_ON_DELIVERY',
+ ])
+ );
+
+ return $this->client->getResponse();
+ }
+
+ private function executeCompleteCheckoutRequest(string $token): Response
+ {
+ $this->client->request(
+ 'PATCH',
+ '/api/v2/shop/orders/' . $token . '/complete',
+ [],
+ [],
+ ['CONTENT_TYPE' => 'application/merge-patch+json', 'HTTP_ACCEPT' => 'application/ld+json'],
+ json_encode([
+ 'notes' => 'notes',
+ ])
+ );
+
+ return $this->client->getResponse();
+ }
+}
diff --git a/OpenMarketplace/tests/End2End/DataFixtures/ORM/CheckoutProcessEnd2EndTest/test_it_for_shipment_methods_for_multiple_vendors.yml b/OpenMarketplace/tests/End2End/DataFixtures/ORM/CheckoutProcessEnd2EndTest/test_it_for_shipment_methods_for_multiple_vendors.yml
new file mode 100644
index 0000000..d58eaf4
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/DataFixtures/ORM/CheckoutProcessEnd2EndTest/test_it_for_shipment_methods_for_multiple_vendors.yml
@@ -0,0 +1,212 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Addressing\Model\Zone:
+ pl:
+ code: 'PL'
+ name: 'Poland'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_pl:
+ code: 'PL'
+ belongsTo: '@pl'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+ locale_2:
+ createdAt: ''
+ code: 'pl_PL'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: "John"
+ lastName: "Nowak"
+ email: "test@example.com"
+ emailCanonical: "test2@example.com"
+ customer_bruce:
+ firstName: "Bruce"
+ lastName: "Wayne"
+ email: "test2@example.com"
+ emailCanonical: "test@example.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_oliver'
+ username: "oliver@queen.com"
+ usernameCanonical: "oliver@queen.com"
+ user_bruce:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_bruce'
+ username: "bruce@wayne.com"
+ usernameCanonical: "bruce@wayne.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+ bruce_vendor_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL96109024023279659782853256'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL43109024021774571831923272'
+ phoneNumber: '333111222'
+ vendorAddress: '@bruce_vendor_address'
+ slug: 'bruce-wayne-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ vendor_olivier_first_product:
+ vendor: '@vendor_oliver'
+ code: "olivier_1"
+ enabled: true
+ channels: ['@channel']
+ vendor_bruce_first_product:
+ vendor: '@vendor_bruce'
+ code: "bruce_1"
+ enabled: true
+ channels: ['@channel']
+Sylius\Component\Core\Model\ProductTranslation:
+ vendor_olivier_first_product_translation:
+ slug: 'olivier_first_product'
+ locale: 'en_US'
+ name: 'olivier_first_product'
+ description: ''
+ translatable: '@vendor_olivier_first_product'
+ vendor_bruce_first_product_translation:
+ slug: 'bruce_first_product'
+ locale: 'en_US'
+ name: 'bruce_first_product'
+ description: ''
+ translatable: '@vendor_bruce_first_product'
+Sylius\Component\Core\Model\ProductVariant:
+ vendor_olivier_first_product_variant:
+ product: '@vendor_olivier_first_product'
+ code: "olivier_1_1"
+ enabled: true
+ onHand: 3
+ tracked: true
+ vendor_bruce_first_product_variant:
+ product: '@vendor_bruce_first_product'
+ code: "bruce_1_1"
+ enabled: true
+ onHand: 3
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ vendor_olivier_first_product_variant_pricing:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'CODE'
+ productVariant: '@vendor_olivier_first_product_variant'
+ vendor_bruce_first_product_variant_pricing:
+ price: 11
+ originalPrice: 16
+ minimumPrice: 0
+ channelCode: 'CODE'
+ productVariant: '@vendor_bruce_first_product_variant'
+Sylius\Component\Product\Model\ProductVariantTranslation:
+ vendor_olivier_first_product_variant_translation:
+ locale: 'en_US'
+ name: 'vendor_olivier_first_product_variant'
+ translatable: '@vendor_olivier_first_product_variant'
+ vendor_bruce_first_product_variant_translation:
+ locale: 'en_US'
+ name: 'vendor_bruce_first_product_variant'
+ translatable: '@vendor_bruce_first_product_variant'
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@pl'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@pl'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Shipping\Model\ShippingMethodTranslation:
+ shipping_method_ups_translation:
+ translatable: '@shipping_method_ups'
+ name: 'ups'
+ locale: 'en_US'
+ shipping_method_fedex_translation:
+ translatable: '@shipping_method_fedex'
+ name: 'fedex'
+ locale: 'en_US'
+BitBag\OpenMarketplace\Component\Vendor\Entity\VendorShippingMethod:
+ vendor_olivier_shipping_method_ups:
+ vendor: '@vendor_oliver'
+ shippingMethod: '@shipping_method_ups'
+ channelCode: 'CODE'
+ vendor_bruce_shipping_method_fedex:
+ vendor: '@vendor_bruce'
+ shippingMethod: '@shipping_method_fedex'
+ channelCode: 'CODE'
+ vendor_bruce_shipping_method_ups:
+ vendor: '@vendor_bruce'
+ shippingMethod: '@shipping_method_ups'
+ channelCode: 'CODE'
+Sylius\Component\Core\Model\PaymentMethod:
+ payment_method_cash_on_delivery:
+ code: 'CASH_ON_DELIVERY'
+ enabled: true
+ gatewayConfig: '@gateway_offline'
+ currentLocale: 'en_US'
+ translations:
+ - '@payment_method_cash_on_delivery_translation'
+ channels: ['@channel']
+Sylius\Component\Payment\Model\PaymentMethodTranslation:
+ payment_method_cash_on_delivery_translation:
+ name: 'Cash on delivery'
+ locale: 'en_US'
+ description: ''
+ translatable: '@payment_method_cash_on_delivery'
+Sylius\Bundle\PayumBundle\Model\GatewayConfig:
+ gateway_offline:
+ gatewayName: 'Offline'
+ factoryName: 'offline'
+ config: []
diff --git a/OpenMarketplace/tests/End2End/End2EndTestCase.php b/OpenMarketplace/tests/End2End/End2EndTestCase.php
new file mode 100644
index 0000000..591f195
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/End2EndTestCase.php
@@ -0,0 +1,28 @@
+dataFixturesPath = __DIR__ . '/DataFixtures/ORM';
+ $this->expectedResponsesPath = __DIR__ . '/Responses/Expected';
+ }
+}
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_addresses_information_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_addresses_information_response.json
new file mode 100644
index 0000000..244973b
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_addresses_information_response.json
@@ -0,0 +1,99 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "shippingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "billingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "payments": [
+ {
+ "@id": "\/api\/v2\/shop\/payments\/@integer@",
+ "@type": "Payment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/payment-methods\/CASH_ON_DELIVERY"
+ }
+ ],
+ "shipments": [
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "oliver-queen-company"
+ }
+ },
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/fedex",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "bruce-wayne-company"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "localeCode": "en_US",
+ "checkoutState": "addressed",
+ "paymentState": "cart",
+ "shippingState": "cart",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/olivier_1_1",
+ "productName": "olivier_first_product",
+ "id": "@integer@",
+ "quantity": 3,
+ "unitPrice": 10,
+ "originalUnitPrice": 15,
+ "total": 30,
+ "discountedUnitPrice": 10,
+ "subtotal": 30
+ },
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/bruce_1_1",
+ "productName": "bruce_first_product",
+ "id": "@integer@",
+ "quantity": 1,
+ "unitPrice": 11,
+ "originalUnitPrice": 16,
+ "total": 11,
+ "discountedUnitPrice": 11,
+ "subtotal": 11
+ }
+ ],
+ "itemsTotal": 41,
+ "total": 51,
+ "taxTotal": 0,
+ "shippingTotal": 10,
+ "orderPromotionTotal": 0
+}
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_item_first_product_variant_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_item_first_product_variant_response.json
new file mode 100644
index 0000000..af87b47
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_item_first_product_variant_response.json
@@ -0,0 +1,54 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "payments": [
+ {
+ "@id": "\/api\/v2\/shop\/payments\/@integer@",
+ "@type": "Payment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/payment-methods\/CASH_ON_DELIVERY"
+ }
+ ],
+ "shipments": {
+ "0": {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "oliver-queen-company"
+ }
+ }
+ },
+ "currencyCode": "USD",
+ "localeCode": "en_US",
+ "checkoutState": "cart",
+ "paymentState": "cart",
+ "shippingState": "cart",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/olivier_1_1",
+ "productName": "olivier_first_product",
+ "id": "@integer@",
+ "quantity": 3,
+ "unitPrice": 10,
+ "originalUnitPrice": 15,
+ "total": 30,
+ "discountedUnitPrice": 10,
+ "subtotal": 30
+ }
+ ],
+ "itemsTotal": 30,
+ "total": 35,
+ "taxTotal": 0,
+ "shippingTotal": 5,
+ "orderPromotionTotal": 0
+}
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_item_second_product_variant_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_item_second_product_variant_response.json
new file mode 100644
index 0000000..28630ea
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/add_item_second_product_variant_response.json
@@ -0,0 +1,79 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "payments": [
+ {
+ "@id": "\/api\/v2\/shop\/payments\/@integer@",
+ "@type": "Payment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/payment-methods\/CASH_ON_DELIVERY"
+ }
+ ],
+ "shipments": {
+ "0": {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "oliver-queen-company"
+ }
+ },
+ "1": {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/fedex",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "bruce-wayne-company"
+ }
+ }
+ },
+ "currencyCode": "USD",
+ "localeCode": "en_US",
+ "checkoutState": "cart",
+ "paymentState": "cart",
+ "shippingState": "cart",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/olivier_1_1",
+ "productName": "olivier_first_product",
+ "id": "@integer@",
+ "quantity": 3,
+ "unitPrice": 10,
+ "originalUnitPrice": 15,
+ "total": 30,
+ "discountedUnitPrice": 10,
+ "subtotal": 30
+ },
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/bruce_1_1",
+ "productName": "bruce_first_product",
+ "id": "@integer@",
+ "quantity": 1,
+ "unitPrice": 11,
+ "originalUnitPrice": 16,
+ "total": 11,
+ "discountedUnitPrice": 11,
+ "subtotal": 11
+ }
+ ],
+ "itemsTotal": 41,
+ "total": 51,
+ "taxTotal": 0,
+ "shippingTotal": 10,
+ "orderPromotionTotal": 0
+}
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/change_default_shipping_method_for_second_shipment_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/change_default_shipping_method_for_second_shipment_response.json
new file mode 100644
index 0000000..5988585
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/change_default_shipping_method_for_second_shipment_response.json
@@ -0,0 +1,99 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "shippingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "billingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "payments": [
+ {
+ "@id": "\/api\/v2\/shop\/payments\/@integer@",
+ "@type": "Payment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/payment-methods\/CASH_ON_DELIVERY"
+ }
+ ],
+ "shipments": [
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "oliver-queen-company"
+ }
+ },
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/fedex",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "bruce-wayne-company"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "localeCode": "en_US",
+ "checkoutState": "shipping_selected",
+ "paymentState": "cart",
+ "shippingState": "cart",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/olivier_1_1",
+ "productName": "olivier_first_product",
+ "id": "@integer@",
+ "quantity": 3,
+ "unitPrice": 10,
+ "originalUnitPrice": 15,
+ "total": 30,
+ "discountedUnitPrice": 10,
+ "subtotal": 30
+ },
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/bruce_1_1",
+ "productName": "bruce_first_product",
+ "id": "@integer@",
+ "quantity": 1,
+ "unitPrice": 11,
+ "originalUnitPrice": 16,
+ "total": 11,
+ "discountedUnitPrice": 11,
+ "subtotal": 11
+ }
+ ],
+ "itemsTotal": 41,
+ "total": 51,
+ "taxTotal": 0,
+ "shippingTotal": 10,
+ "orderPromotionTotal": 0
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/complete_checkout_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/complete_checkout_response.json
new file mode 100644
index 0000000..6665a72
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/complete_checkout_response.json
@@ -0,0 +1,99 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "shippingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "billingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "payments": [
+ {
+ "@id": "\/api\/v2\/shop\/payments\/@integer@",
+ "@type": "Payment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/payment-methods\/CASH_ON_DELIVERY"
+ }
+ ],
+ "shipments": [
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "oliver-queen-company"
+ }
+ },
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/fedex",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "bruce-wayne-company"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "localeCode": "en_US",
+ "checkoutState": "completed",
+ "paymentState": "awaiting_payment",
+ "shippingState": "ready",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/olivier_1_1",
+ "productName": "olivier_first_product",
+ "id": "@integer@",
+ "quantity": 3,
+ "unitPrice": 10,
+ "originalUnitPrice": 15,
+ "total": 30,
+ "discountedUnitPrice": 10,
+ "subtotal": 30
+ },
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/bruce_1_1",
+ "productName": "bruce_first_product",
+ "id": "@integer@",
+ "quantity": 1,
+ "unitPrice": 11,
+ "originalUnitPrice": 16,
+ "total": 11,
+ "discountedUnitPrice": 11,
+ "subtotal": 11
+ }
+ ],
+ "itemsTotal": 41,
+ "total": 51,
+ "taxTotal": 0,
+ "shippingTotal": 10,
+ "orderPromotionTotal": 0
+}
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/create_order_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/create_order_response.json
new file mode 100644
index 0000000..cd9263b
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/create_order_response.json
@@ -0,0 +1,8 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "itemsTotal": 0
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/get_first_shipment_available_shipping_methods_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/get_first_shipment_available_shipping_methods_response.json
new file mode 100644
index 0000000..4ca6c8b
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/get_first_shipment_available_shipping_methods_response.json
@@ -0,0 +1,17 @@
+{
+ "@context": "\/api\/v2\/contexts\/ShippingMethod",
+ "@id": "\/api\/v2\/shop\/orders\/@string@\/shipments\/@integer@\/methods",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "@type": "ShippingMethod",
+ "id": "@integer@",
+ "code": "ups",
+ "position": 0,
+ "name": "ups",
+ "price": 5
+ }
+ ],
+ "hydra:totalItems": 1
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/get_second_shipment_available_shipping_methods_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/get_second_shipment_available_shipping_methods_response.json
new file mode 100644
index 0000000..dd50c6b
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/get_second_shipment_available_shipping_methods_response.json
@@ -0,0 +1,26 @@
+{
+ "@context": "\/api\/v2\/contexts\/ShippingMethod",
+ "@id": "\/api\/v2\/shop\/orders\/@string@\/shipments\/@integer@\/methods",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/shipping-methods\/fedex",
+ "@type": "ShippingMethod",
+ "id": "@integer@",
+ "code": "fedex",
+ "position": 1,
+ "name": "fedex",
+ "price": 5
+ },
+ {
+ "@id": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "@type": "ShippingMethod",
+ "id": "@integer@",
+ "code": "ups",
+ "position": 0,
+ "name": "ups",
+ "price": 5
+ }
+ ],
+ "hydra:totalItems": 2
+}
diff --git a/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/select_payment_method_response.json b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/select_payment_method_response.json
new file mode 100644
index 0000000..db82cce
--- /dev/null
+++ b/OpenMarketplace/tests/End2End/Responses/Expected/CheckoutProcessEnd2EndTest/select_payment_method_response.json
@@ -0,0 +1,99 @@
+{
+ "@context": "\/api\/v2\/contexts\/Order",
+ "@id": "\/api\/v2\/shop\/orders\/@string@",
+ "@type": "Order",
+ "shippingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "billingAddress": {
+ "@id": "\/api\/v2\/shop\/addresses\/@integer@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Novak",
+ "countryCode": "PL",
+ "street": "Testowa 3",
+ "city": "Warszawa",
+ "postcode": "11-123"
+ },
+ "payments": [
+ {
+ "@id": "\/api\/v2\/shop\/payments\/@integer@",
+ "@type": "Payment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/payment-methods\/CASH_ON_DELIVERY"
+ }
+ ],
+ "shipments": [
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/ups",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "oliver-queen-company"
+ }
+ },
+ {
+ "@id": "\/api\/v2\/shop\/shipments\/@integer@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "\/api\/v2\/shop\/shipping-methods\/fedex",
+ "vendor": {
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "bruce-wayne-company"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "localeCode": "en_US",
+ "checkoutState": "payment_selected",
+ "paymentState": "cart",
+ "shippingState": "cart",
+ "tokenValue": "@string@",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/olivier_1_1",
+ "productName": "olivier_first_product",
+ "id": "@integer@",
+ "quantity": 3,
+ "unitPrice": 10,
+ "originalUnitPrice": 15,
+ "total": 30,
+ "discountedUnitPrice": 10,
+ "subtotal": 30
+ },
+ {
+ "@id": "\/api\/v2\/shop\/order-items\/@integer@",
+ "@type": "OrderItem",
+ "variant": "\/api\/v2\/shop\/product-variants\/bruce_1_1",
+ "productName": "bruce_first_product",
+ "id": "@integer@",
+ "quantity": 1,
+ "unitPrice": 11,
+ "originalUnitPrice": 16,
+ "total": 11,
+ "discountedUnitPrice": 11,
+ "subtotal": 11
+ }
+ ],
+ "itemsTotal": 41,
+ "total": 51,
+ "taxTotal": 0,
+ "shippingTotal": 10,
+ "orderPromotionTotal": 0
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Api/ConversationTest.php b/OpenMarketplace/tests/Functional/Api/ConversationTest.php
new file mode 100644
index 0000000..9057eb3
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/ConversationTest.php
@@ -0,0 +1,139 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->orderRepository = $this->entityManager->getRepository(Order::class);
+
+ $this->fixturesData = $this->loadFixturesFromFile('Api/ConversationTest/conversation.yml');
+ }
+
+ public function test_vendor_can_start_conversation(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+ $category = $this->fixturesData['peter_category'];
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/conversations', [], [], $header, json_encode([
+ 'category' => '/api/v2/shop/account/vendor/categories/' . $category->getId(),
+ 'messages' => [
+ [
+ 'content' => 'hello',
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertEquals('hello', json_decode($response->getContent(), true)['messages'][0]['content']);
+ }
+
+ public function test_vendor_can_reply_to_conversation(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+ $category = $this->fixturesData['peter_category'];
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/conversations', [], [], $header, json_encode([
+ 'category' => '/api/v2/shop/account/vendor/categories/' . $category->getId(),
+ ]));
+
+ $response = $this->client->getResponse();
+ $conversationIRI = json_decode($response->getContent(), true)['hydra:member'][0]['@id'];
+
+ $this->client->request('PUT', $conversationIRI, [], [], $header, json_encode([
+ 'messages' => [
+ [
+ 'content' => 'hello',
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertEquals('hello', json_decode($response->getContent(), true)['messages'][1]['content']);
+ }
+
+ public function test_vendor_cannot_reply_to_others_conversation(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/conversations', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $conversationIRI = json_decode($response->getContent(), true)['hydra:member'][0]['@id'];
+
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+ $this->client->request('PUT', $conversationIRI, [], [], $header, json_encode([
+ 'messages' => [
+ [
+ 'content' => 'hello',
+ ],
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponseCode($response, 403);
+ }
+
+ public function test_vendor_can_list_his_conversation(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/conversations', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $responseData = json_decode($response->getContent(), true);
+ $this->assertEquals($this->count($responseData['hydra:member']), 1);
+ $this->assertEquals($responseData['hydra:member'][0]['messages'][0]['content'], 'Own by Peter');
+ }
+
+ public function test_vendor_can_archive_his_conversation(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/conversations', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $responseData = json_decode($response->getContent(), true);
+ $archiveIRI = $responseData['hydra:member'][1]['@id'];
+
+ $this->client->request('PATCH', $archiveIRI . '/archive', [], [], $header);
+ $response = $this->client->getResponse();
+ $responseData = json_decode($response->getContent(), true);
+
+ $this->assertEquals($responseData['status'], 'closed');
+ }
+
+ public function test_validate_not_blank_category(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/conversations', [], [], $header, json_encode([
+ 'messages' => [
+ [
+ 'content' => 'hello',
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorConversation/test_validate_not_blank_category_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/CustomerTest.php b/OpenMarketplace/tests/Functional/Api/CustomerTest.php
new file mode 100644
index 0000000..82dfd58
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/CustomerTest.php
@@ -0,0 +1,138 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->customerRepository = $this->entityManager->getRepository(Customer::class);
+
+ $this->loadFixturesFromFile('Api/CustomerTest/customer.yml');
+ }
+
+ public function test_it_get_customers_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/customers', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/CustomerTest/test_it_get_customers_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_it_get_customers_by_vendor_filter_email(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/customers', ['email' => 'john'], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/CustomerTest/test_it_get_customers_by_vendor_filter_email', Response::HTTP_OK);
+ }
+
+ public function test_denies_access_get_orders_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/customers', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_get_customer_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var CustomerInterface $customer */
+ $customer = $this->customerRepository->findOneBy(['email' => 'john.smith@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/customers/' . $customer->getId(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/CustomerTest/test_it_get_customer_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_not_found_get_customer_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var CustomerInterface $customer */
+ $customer = $this->customerRepository->findOneBy(['email' => 'john.smith@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/customers/' . $customer->getId(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/not_found_response', Response::HTTP_NOT_FOUND);
+ }
+
+ public function test_denies_access_get_customer_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var CustomerInterface $customer */
+ $customer = $this->customerRepository->findOneBy(['email' => 'john.smith@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/customers/' . $customer->getId(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_get_shop_customer_by_user(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var CustomerInterface $customer */
+ $customer = $this->customerRepository->findOneBy(['email' => 'john.smith@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/customers/' . $customer->getId(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/CustomerTest/test_get_shop_customer_by_user', Response::HTTP_OK);
+ }
+
+ public function test_get_shop_customer_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var CustomerInterface $customer */
+ $customer = $this->customerRepository->findOneBy(['email' => 'bruce.wayne@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/customers/' . $customer->getId(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/CustomerTest/test_get_shop_customer_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_get_shop_customer_by_different_user(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var CustomerInterface $customer */
+ $customer = $this->customerRepository->findOneBy(['email' => 'john.smith@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/customers/' . $customer->getId(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/not_found_response', Response::HTTP_NOT_FOUND);
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/DraftAttributeTest.php b/OpenMarketplace/tests/Functional/Api/DraftAttributeTest.php
new file mode 100644
index 0000000..8f99f04
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/DraftAttributeTest.php
@@ -0,0 +1,300 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->draftAttributeRepository = $this->entityManager->getRepository(DraftAttribute::class);
+ $this->draftAttributeTranslationRepository = $this->entityManager->getRepository(DraftAttributeTranslation::class);
+
+ $this->loadFixturesFromFile('Api/DraftAttributeTest/draft_attribute.yml');
+ }
+
+ public function test_it_get_only_draft_attributes_for_current_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-draft/attributes', [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/DraftAttributeTest/test_it_get_only_draft_attributes_for_current_vendor_response', Response::HTTP_OK);
+ }
+
+ public function test_it_prevents_to_get_different_vendor_draft_attribute(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_peter_1',
+ ]);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_to_get_attribute_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_peter_1',
+ ]);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_get_attribute_by_owner_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/DraftAttributeTest/test_it_get_attribute_by_owner_vendor_response', Response::HTTP_OK);
+ }
+
+ public function test_it_prevents_creating_attribute_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/product-draft/attributes', [], [], $header, json_encode([
+ 'code' => 'test',
+ 'type' => 'text',
+ 'storageType' => 'text',
+ 'position' => 1,
+ 'configuration' => [],
+ 'translations' => [
+ 'en_US' => [
+ 'locale' => 'en_US',
+ 'name' => 'test',
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_creating_attribute_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/product-draft/attributes', [], [], $header, json_encode([
+ 'code' => 'test',
+ 'type' => 'text',
+ 'storageType' => 'text',
+ 'position' => 1,
+ 'configuration' => [],
+ 'translations' => [
+ 'en_US' => [
+ 'locale' => 'en_US',
+ 'name' => 'test',
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/DraftAttributeTest/test_creating_attribute_by_vendor_response', Response::HTTP_CREATED);
+ }
+
+ public function test_validate_not_blank_rules(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/product-draft/attributes', [], [], $header, json_encode([
+ 'code' => '',
+ 'type' => '',
+ 'storageType' => '',
+ 'translations' => [
+ 'en_US' => [
+ 'locale' => '',
+ 'name' => '',
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/DraftAttributeTest/test_validate_not_blank_rules_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_it_prevents_update_attribute_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header, json_encode([
+ 'configuration' => [
+ 'min' => 2,
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_update_attribute_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_peter_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header, json_encode([
+ 'configuration' => [
+ 'min' => 2,
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_update_attribute_by_vendor_owner(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header, json_encode([
+ 'configuration' => [
+ 'min' => 2,
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/DraftAttributeTest/test_it_update_attribute_by_vendor_owner_response', Response::HTTP_OK);
+ }
+
+ public function test_it_update_attribute_translation_by_vendor_owner(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ /** @var DraftAttributeTranslationInterface $draftAttributeTranslation */
+ $draftAttributeTranslation = $this->draftAttributeTranslationRepository->findOneBy([
+ 'translatable' => $draftAttribute,
+ 'locale' => 'en_US',
+ 'name' => 'attribute_bruce_1_us',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-draft/attribute-translations/' . $draftAttributeTranslation->getUuid()->toString(), [], [], $header, json_encode([
+ 'name' => 'changed translation name',
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/DraftAttributeTest/test_it_update_attribute_translation_by_vendor_owner_response', Response::HTTP_OK);
+ }
+
+ public function test_it_prevent_update_attribute_translation_by_other_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ /** @var DraftAttributeTranslationInterface $draftAttributeTranslation */
+ $draftAttributeTranslation = $this->draftAttributeTranslationRepository->findOneBy([
+ 'translatable' => $draftAttribute,
+ 'locale' => 'en_US',
+ 'name' => 'attribute_bruce_1_us',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-draft/attribute-translations/' . $draftAttributeTranslation->getUuid()->toString(), [], [], $header, json_encode([
+ 'name' => 'changed translation name',
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_delete_attribute_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_peter_1',
+ ]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_delete_attribute_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_peter_1',
+ ]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_delete_attribute_by_owner_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var DraftAttributeInterface $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid()->toString(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
+ $this->assertEquals('', $response->getContent());
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/OrderTest.php b/OpenMarketplace/tests/Functional/Api/OrderTest.php
new file mode 100644
index 0000000..a03a1e7
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/OrderTest.php
@@ -0,0 +1,176 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->orderRepository = $this->entityManager->getRepository(Order::class);
+
+ $this->loadFixturesFromFile('Api/OrderTest/order.yml');
+ }
+
+ public function test_it_get_orders_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/orders', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/OrderTest/test_it_get_orders_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_it_get_orders_by_vendor_filter_payment_state(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/orders', ['paymentState' => 'paid'], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/OrderTest/test_it_get_orders_by_vendor_filter_payment_state', Response::HTTP_OK);
+ }
+
+ public function test_denies_access_get_orders_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/orders', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_get_order_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/OrderTest/test_it_get_order_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_forbidden_get_order_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_denies_access_get_order_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_cancel_order_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('PATCH', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_2/cancel', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/OrderTest/test_it_cancel_order_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_it_cancel_not_paid_order_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('PATCH', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1/cancel', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_cancel_order_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ $this->client->request('PATCH', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_2/cancel', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_cancel_order_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('PATCH', '/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_2/cancel', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_get_shop_orders_by_user(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/orders', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/OrderTest/test_get_shop_orders_by_shop_user', Response::HTTP_OK);
+ }
+
+ public function test_get_shop_orders_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/orders', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/OrderTest/test_get_shop_orders_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_it_sets_paid_at_for_secondary_orders_when_primary_order_is_paid(): void
+ {
+ $header = $this->getHeaderForAdmin('clark.kent@example.com');
+ /** @var OrderInterface $order */
+ $order = $this->orderRepository->findOneBy(['tokenValue' => 'order_made_by_peter_main']);
+ foreach ($order->getSecondaryOrders() as $secondaryOrder) {
+ $this->assertNull($secondaryOrder->getPaidAt());
+ }
+ $paymentId = $order->getLastPayment()->getId();
+
+ $this->client->request(
+ 'PATCH',
+ sprintf('/api/v2/admin/payments/%d/complete', $paymentId),
+ [],
+ [],
+ $header
+ );
+ $this->assertResponseCode($this->client->getResponse(), 200);
+
+ $order = $this->orderRepository->findOneBy(['tokenValue' => 'order_made_by_peter_main']);
+
+ foreach ($order->getSecondaryOrders() as $secondaryOrder) {
+ $this->assertNotNull($secondaryOrder->getPaidAt());
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/ProductDraftTest.php b/OpenMarketplace/tests/Functional/Api/ProductDraftTest.php
new file mode 100644
index 0000000..69b2714
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/ProductDraftTest.php
@@ -0,0 +1,65 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->productDraftRepository = $this->entityManager->getRepository(Draft::class);
+
+ $this->loadFixturesFromFile('Api/ProductDraftTest/product_draft.yml');
+ }
+
+ public function test_it_get_by_current_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Draft $productDraft */
+ $productDraft = $this->productDraftRepository->findOneBy(['code' => 'product_draft_bruce_1']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-drafts/' . $productDraft->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductDraftTest/test_it_get_by_current_vendor', Response::HTTP_OK);
+ }
+
+ public function test_it_get_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var Draft $productDraft */
+ $productDraft = $this->productDraftRepository->findOneBy(['code' => 'product_draft_bruce_1']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-drafts/' . $productDraft->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_get_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var Draft $productDraft */
+ $productDraft = $this->productDraftRepository->findOneBy(['code' => 'product_draft_bruce_1']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-drafts/' . $productDraft->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/ProductListingTest.php b/OpenMarketplace/tests/Functional/Api/ProductListingTest.php
new file mode 100644
index 0000000..8f5d2ac
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/ProductListingTest.php
@@ -0,0 +1,421 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->productListingRepository = $this->entityManager->getRepository(Listing::class);
+ $this->taxonRepository = $this->entityManager->getRepository(Taxon::class);
+ $this->draftAttributeRepository = $this->entityManager->getRepository(DraftAttribute::class);
+
+ $this->loadFixturesFromFile('Api/ProductListingTest/product_listings.yml');
+ }
+
+ public function test_it_gets_only_product_listings_for_current_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-listings', [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_response', Response::HTTP_OK);
+ }
+
+ public function test_it_gets_only_product_listings_for_current_vendor_filter_by_verification_status(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-listings', ['verificationStatus' => 'verified'], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_verification_status', Response::HTTP_OK);
+ }
+
+ public function test_it_gets_only_product_listings_for_current_vendor_filter_by_code(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-listings', ['code' => 'bruce_1'], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_code', Response::HTTP_OK);
+ }
+
+ public function test_it_prevents_to_get_different_vendor_product_listing(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_peter_1',
+ ]);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_to_get_product_listing_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_peter_1',
+ ]);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_gets_product_listing_by_owner_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_gets_product_listing_by_owner_vendor_response', Response::HTTP_OK);
+ }
+
+ public function test_it_prevents_creating_product_listing_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/product-listings', [], [], $header, json_encode([
+ 'productDraft' => [
+ 'code' => 'test',
+ 'images' => [],
+ 'translations' => [],
+ 'productListingPrices' => [],
+ 'attributes' => [],
+ 'productDraftTaxons' => [],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_creating_product_listing_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Taxon $mainTaxon */
+ $mainTaxon = $this->taxonRepository->findOneBy(['code' => 'CATEGORY']);
+ /** @var Taxon $additionalTaxon */
+ $additionalTaxon = $this->taxonRepository->findOneBy(['code' => 'MUG']);
+
+ /** @var DraftAttribute $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/product-listings', [], [
+ 'images' => [
+ $this->getUploadedProductImageFile(),
+ ],
+ ], $header, json_encode([
+ 'productDraft' => [
+ 'code' => 'test',
+ 'translations' => [
+ 'en_US' => [
+ 'locale' => 'en_US',
+ 'name' => 'Test',
+ 'description' => 'Test description',
+ 'metaKeywords' => 'Test metaKeywords',
+ 'metaDescription' => 'Test metaDescription',
+ 'shortDescription' => 'Test shortDescription',
+ ],
+ ],
+ 'productListingPrices' => [
+ [
+ 'channelCode' => 'CODE',
+ 'price' => 100,
+ 'originalPrice' => 110,
+ 'minimumPrice' => 80,
+ ],
+ ],
+ 'attributes' => [
+ [
+ 'attribute' => '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid(),
+ 'value' => 'example text value',
+ ],
+ ],
+ 'mainTaxon' => '/api/v2/shop/taxons/' . $mainTaxon->getCode(),
+ 'productDraftTaxons' => [
+ [
+ 'taxon' => '/api/v2/shop/taxons/' . $additionalTaxon->getCode(),
+ 'position' => 2,
+ ],
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_creating_product_listing_by_vendor_response', Response::HTTP_CREATED);
+ }
+
+ public function test_validates_not_blank_product_draft_when_creating_product_listing(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/product-listings', [], [], $header, json_encode([]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_validates_not_blank_product_draft_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_it_prevents_updating_product_listing_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header, json_encode([
+ 'productDraft' => [
+ 'images' => [],
+ 'translations' => [],
+ 'productListingPrices' => [],
+ 'attributes' => [],
+ 'productDraftTaxons' => [],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_updating_product_listing_by_other_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_peter_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header, json_encode([
+ 'productDraft' => [
+ 'images' => [],
+ 'translations' => [],
+ 'productListingPrices' => [],
+ 'attributes' => [],
+ 'productDraftTaxons' => [],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_update_product_listing_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ /** @var Taxon $replacementMainTaxon */
+ $replacementMainTaxon = $this->taxonRepository->findOneBy(['code' => 'SECOND_CATEGORY']);
+
+ /** @var Taxon $replacementAdditionalTaxon */
+ $replacementAdditionalTaxon = $this->taxonRepository->findOneBy(['code' => 'HAT']);
+
+ /** @var DraftAttribute $draftAttribute */
+ $draftAttribute = $this->draftAttributeRepository->findOneBy([
+ 'code' => 'attribute_bruce_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [
+ 'images' => [
+ ],
+ ], $header, json_encode([
+ 'productDraft' => [
+ 'translations' => [
+ 'en_US' => [
+ 'locale' => 'en_US',
+ 'name' => 'Changed name',
+ 'slug' => 'Changed slug',
+ 'description' => 'Changed description',
+ 'metaKeywords' => 'Test metaKeywords',
+ 'metaDescription' => 'Test metaDescription',
+ 'shortDescription' => 'Test shortDescription',
+ ],
+ ],
+ 'productListingPrices' => [
+ [
+ 'channelCode' => 'CODE',
+ 'price' => 120,
+ 'originalPrice' => 110,
+ 'minimumPrice' => 115,
+ ],
+ ],
+ 'attributes' => [
+ [
+ 'attribute' => '/api/v2/shop/account/vendor/product-draft/attributes/' . $draftAttribute->getUuid(),
+ 'value' => 'changed value',
+ ],
+ ],
+ 'mainTaxon' => '/api/v2/shop/taxons/' . $replacementMainTaxon->getCode(),
+ 'productDraftTaxons' => [
+ [
+ 'taxon' => '/api/v2/shop/taxons/' . $replacementAdditionalTaxon->getCode(),
+ 'position' => 2,
+ ],
+ ],
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_update_product_listing_by_vendor_response', Response::HTTP_OK);
+ }
+
+ public function test_validates_not_blank_product_draft_when_updating_product_listing(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header, json_encode([]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_validates_not_blank_product_draft_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_it_prevents_send_to_verification_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('PUT', sprintf('/api/v2/shop/account/vendor/product-listings/%s/send-to-verification', $productListing->getUuid()), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_send_to_verification_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('PUT', sprintf('/api/v2/shop/account/vendor/product-listings/%s/send-to-verification', $productListing->getUuid()), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_send_to_verification_by_owner_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('PUT', sprintf('/api/v2/shop/account/vendor/product-listings/%s/send-to-verification', $productListing->getUuid()), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductListingTest/test_it_send_to_verification_by_owner_vendor', Response::HTTP_OK);
+ }
+
+ public function test_it_prevents_delete_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_prevents_delete_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_delete_by_owner_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var Listing $productListing */
+ $productListing = $this->productListingRepository->findOneBy([
+ 'code' => 'product_listing_bruce_1',
+ ]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/product-listings/' . $productListing->getUuid(), [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
+ $this->assertEquals('', $response->getContent());
+ }
+
+ private function getUploadedProductImageFile(): UploadedFile
+ {
+ $fileName = 'product1.png';
+
+ $file = new UploadedFile(
+ $this->getFilePath($fileName),
+ $fileName,
+ 'image/png',
+ );
+
+ return $file;
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/ProductVariant/InventoryTest.php b/OpenMarketplace/tests/Functional/Api/ProductVariant/InventoryTest.php
new file mode 100644
index 0000000..a68e8f9
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/ProductVariant/InventoryTest.php
@@ -0,0 +1,130 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->vendorRepository = $this->entityManager->getRepository(Vendor::class);
+
+ $this->loadFixturesFromFile('Api/ProductVariant/InventoryTest/inventory.yml');
+ }
+
+ public function test_it_get_product_variants_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-variants/inventory', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductVariant/InventoryTest/test_it_get_product_variants_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_denies_access_get_product_variants_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-variants/inventory', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_get_product_variant_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-variants/bruce_1_2/inventory', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductVariant/InventoryTest/test_it_get_product_variant_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_not_found_get_product_variant_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-variants/bruce_1_2/inventory', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_denies_access_get_product_variant_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('GET', '/api/v2/shop/account/vendor/product-variants/bruce_1_2/inventory', [], [], $header);
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_update_product_variant_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-variants/bruce_2_1/inventory', [], [], $header, json_encode([
+ 'amount' => 5,
+ 'tracked' => true,
+ ], \JSON_THROW_ON_ERROR));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductVariant/InventoryTest/test_it_update_product_variant_by_vendor', Response::HTTP_OK);
+ }
+
+ public function test_amount_validator_update_product_variant_by_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-variants/bruce_1_1/inventory', [], [], $header, json_encode([
+ 'amount' => 1,
+ ], \JSON_THROW_ON_ERROR));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/ProductVariant/InventoryTest/test_amount_validator_update_product_variant_by_vendor', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_not_found_update_product_variant_by_different_vendor(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-variants/bruce_2_1/inventory', [], [], $header, json_encode([
+ 'amount' => 5,
+ 'tracked' => true,
+ ], \JSON_THROW_ON_ERROR));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_denies_access_update_product_variant_by_user_without_vendor_context(): void
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendor/product-variants/bruce_2_1/inventory', [], [], $header, json_encode([
+ 'amount' => 5,
+ 'tracked' => true,
+ ], \JSON_THROW_ON_ERROR));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/VendorProfileTest.php b/OpenMarketplace/tests/Functional/Api/VendorProfileTest.php
new file mode 100644
index 0000000..13141ea
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/VendorProfileTest.php
@@ -0,0 +1,430 @@
+entityManager = static::getContainer()->get('doctrine.orm.entity_manager');
+ $this->vendorRepository = $this->entityManager->getRepository(Vendor::class);
+ $this->customerRepository = $this->entityManager->getRepository(Customer::class);
+ $this->vendorImageRepository = $this->entityManager->getRepository(LogoImage::class);
+ $this->vendorBackgroundImageRepository = $this->entityManager->getRepository(BackgroundImage::class);
+ $this->loadFixturesFromFile('Api/VendorProfileTest/vendor_profile.yml');
+ }
+
+ public function test_customer_has_vendor_data()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $customer = $this->customerRepository->findOneBy(['email' => 'bruce.wayne@example.com']);
+
+ $this->client->request('GET', '/api/v2/shop/customers/' . $customer->getId(), [], [], $header);
+ $response = $this->client->getResponse();
+ $data = json_decode($response->getContent(), true);
+
+ $this->assertArrayHasKey('user', $data);
+ $this->assertEquals('Wayne-Enterprises-Inc', $data['user']['vendor']['slug']);
+ }
+
+ public function test_it_get_shop_vendor_data_for_shop_user()
+ {
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('GET', '/api/v2/shop/vendors/' . $vendor->getUuid()->toString(), [], [], self::CONTENT_TYPE_HEADER);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorProfileTest/test_it_get_shop_vendor_data_for_shop_user', Response::HTTP_OK);
+ }
+
+ public function test_it_gets_vendor_data_for_shop_user_in_his_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendors/' . (string) $vendor->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+
+ $this->assertResponse($response, 'Api/VendorProfileTest/test_it_gets_vendor_data_for_shop_user_in_his_vendor_context', Response::HTTP_OK);
+ }
+
+ public function test_it_denies_access_on_get_vendor_data_when_shop_user_is_not_in_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_get_vendor_not_found_when_shop_user_has_different_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('GET', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/not_found_response', Response::HTTP_NOT_FOUND);
+ }
+
+ public function test_it_successful_update_vendor_data_for_shop_user_in_his_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'companyName' => 'Wayne Enterprises',
+ 'taxIdentifier' => '345',
+ 'bankAccountNumber' => 'PL14109024029586826934815556',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayne Enterprises Desc',
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'New York',
+ 'street' => 'Wall St. 1',
+ 'postalCode' => '12123',
+ ],
+ ], \JSON_THROW_ON_ERROR));
+ $response = $this->client->getResponse();
+
+ $this->assertEquals('Wayne-Enterprises', $vendor->getSlug());
+ $this->assertResponse($response, 'Api/VendorProfileTest/test_it_successful_update_vendor_data_for_shop_user_in_his_vendor_context', Response::HTTP_OK);
+ }
+
+ public function test_it_denies_access_on_update_vendor_when_shop_user_is_not_in_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_update_vendor_not_found_when_shop_user_has_different_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/not_found_response', Response::HTTP_NOT_FOUND);
+ }
+
+ public function test_not_blank_validation_rules()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'companyName' => '',
+ 'taxIdentifier' => '',
+ 'bankAccountNumber' => '',
+ 'phoneNumber' => '',
+ 'description' => '',
+ 'vendorAddress' => [
+ 'city' => '',
+ 'street' => '',
+ 'postalCode' => '',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorProfileTest/test_not_blank_validation_rules', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_wrong_iri_for_country_error()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'vendorAddress' => [
+ 'country' => 'PL',
+ ],
+ ]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/internal_server_error', Response::HTTP_INTERNAL_SERVER_ERROR);
+ }
+
+ public function test_not_existed_country()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/shop/account/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/RO',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/internal_server_error', Response::HTTP_INTERNAL_SERVER_ERROR);
+ }
+
+ public function test_vendor_logo_upload_successfully()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/logo', [], [
+ 'file' => $this->getUploadedFile(),
+ ], $header, json_encode([]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorProfileTest/test_vendor_image_upload_successfully', Response::HTTP_CREATED);
+ }
+
+ public function test_it_denies_access_on_logo_upload_from_user_without_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/logo', [], [
+ 'file' => $this->getUploadedFile(),
+ ], $header, json_encode([]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_not_blank_vendor_logo_file_validation_rule()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/logo', [], [], $header, json_encode([]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorProfileTest/test_not_blank_vendor_image_file_validation_rule', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_it_denies_access_on_delete_vendor_logo_by_different_vendor()
+ {
+ $header = $this->getHeaderForLoginShopUser('bruce.wayne@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ /** @var LogoImage $vendorImage */
+ $vendorImage = $this->vendorImageRepository->findOneBy(['owner' => $vendor]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/logo/' . $vendorImage->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_denies_access_on_delete_vendor_logo_by_user_without_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ /** @var LogoImage $vendorImage */
+ $vendorImage = $this->vendorImageRepository->findOneBy(['owner' => $vendor]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/logo/' . $vendorImage->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_deletes_vendor_logo_by_right_owner()
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ /** @var LogoImage $vendorImage */
+ $vendorImage = $this->vendorImageRepository->findOneBy(['owner' => $vendor]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/logo/' . $vendorImage->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+
+ $this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
+ $this->assertEmpty($response->getContent());
+ }
+
+ public function test_it_denies_access_on_delete_vendor_background_image_by_user_without_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ /** @var BackgroundImage $vendorImage */
+ $vendorImage = $this->vendorBackgroundImageRepository->findOneBy(['owner' => $vendor]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/background-image/' . $vendorImage->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_deletes_vendor_background_image_by_right_owner()
+ {
+ $header = $this->getHeaderForLoginShopUser('peter.weyland@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ /** @var BackgroundImage $vendorImage */
+ $vendorImage = $this->vendorBackgroundImageRepository->findOneBy(['owner' => $vendor]);
+
+ $this->client->request('DELETE', '/api/v2/shop/account/vendor/background-image/' . $vendorImage->getUuid()->toString(), [], [], $header);
+ $response = $this->client->getResponse();
+
+ $this->assertResponseCode($response, Response::HTTP_NO_CONTENT);
+ $this->assertEmpty($response->getContent());
+ }
+
+ public function test_it_denies_access_on_background_image_upload_from_user_without_vendor_context()
+ {
+ $header = $this->getHeaderForLoginShopUser('john.smith@example.com');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/background-image', [], [
+ 'file' => $this->getUploadedFile(),
+ ], $header, json_encode([]));
+
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/access_denied_response', Response::HTTP_FORBIDDEN);
+ }
+
+ public function test_it_lists_vendors()
+ {
+ $header = $this->getHeaderForAdmin('clark.kent@example.com');
+
+ $this->client->request('GET', '/api/v2/admin/vendors', [], [], $header);
+ $response = $this->client->getResponse();
+
+ $readableResponse = json_decode($response->getContent(), true);
+ $this->assertCount(2, $readableResponse['hydra:member'], 'Number of listed vendors is invalid');
+ }
+
+ public function test_it_successful_update_vendor_data_by_admin()
+ {
+ $header = $this->getHeaderForAdmin('clark.kent@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/admin/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'companyName' => 'Wayne Enterprises',
+ 'taxIdentifier' => '345',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayne Enterprises Desc',
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'New York',
+ 'street' => 'Wall St. 1',
+ 'postalCode' => '12123',
+ ],
+ ], \JSON_THROW_ON_ERROR));
+ $response = $this->client->getResponse();
+ $content = json_decode($response->getContent(), true);
+ $this->assertEquals('Wayne-Enterprises', $vendor->getSlug());
+ $this->assertEquals($content['companyName'], 'Wayne Enterprises');
+ }
+
+ public function test_it_successful_enable_vendor_by_admin()
+ {
+ $header = $this->getHeaderForAdmin('clark.kent@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/admin/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'companyName' => 'Wayne Enterprises',
+ 'taxIdentifier' => '345',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayne Enterprises Desc',
+ 'enabled' => true,
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'New York',
+ 'street' => 'Wall St. 1',
+ 'postalCode' => '12123',
+ ],
+ ], \JSON_THROW_ON_ERROR));
+ $response = $this->client->getResponse();
+ $content = json_decode($response->getContent(), true);
+
+ $this->assertEquals('Wayne-Enterprises', $vendor->getSlug());
+ $this->assertTrue($content['enabled']);
+ }
+
+ public function test_it_successful_disable_vendor_by_admin()
+ {
+ $header = $this->getHeaderForAdmin('clark.kent@example.com');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+
+ $this->client->request('PUT', '/api/v2/admin/vendors/' . $vendor->getUuid()->toString(), [], [], $header, json_encode([
+ 'companyName' => 'Wayne Enterprises',
+ 'taxIdentifier' => '345',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayne Enterprises Desc',
+ 'enabled' => false,
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'New York',
+ 'street' => 'Wall St. 1',
+ 'postalCode' => '12123',
+ ],
+ ], \JSON_THROW_ON_ERROR));
+ $response = $this->client->getResponse();
+ $content = json_decode($response->getContent(), true);
+
+ $this->assertEquals('Wayne-Enterprises', $vendor->getSlug());
+ $this->assertFalse($content['enabled']);
+ }
+
+ private function getUploadedFile(): UploadedFile
+ {
+ $fileName = 'avatar.png';
+
+ $file = new UploadedFile(
+ $this->getFilePath($fileName),
+ $fileName,
+ 'image/png',
+ );
+
+ return $file;
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Api/VendorRegistrationTest.php b/OpenMarketplace/tests/Functional/Api/VendorRegistrationTest.php
new file mode 100644
index 0000000..1f22746
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Api/VendorRegistrationTest.php
@@ -0,0 +1,224 @@
+loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => 'Wayland Corp',
+ 'taxIdentifier' => '345',
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayland Corp Desc',
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'Warszawa',
+ 'street' => 'Jasna 1',
+ 'postalCode' => '12-123',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/success_registration_response', Response::HTTP_CREATED);
+ }
+
+ public function test_vendor_unauthorized_registration()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], self::CONTENT_TYPE_HEADER, json_encode([]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/unauthorized_registration_response', Response::HTTP_UNAUTHORIZED);
+ }
+
+ public function test_existed_vendor_registration()
+ {
+ $this->loadFixturesFromFiles(['Api/VendorRegistrationTest/test_vendor_basic_registration.yml', 'Api/VendorRegistrationTest/test_existed_vendor_registration.yml']);
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => 'Wayland Corp',
+ 'taxIdentifier' => '345',
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayland Corp Desc',
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'Warszawa',
+ 'street' => 'Jasna 1',
+ 'postalCode' => '12-123',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/existed_vendor_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_not_blank_validation_rules()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/not_blank_validation_errors_response', Response::HTTP_BAD_REQUEST);
+ }
+
+ public function test_not_blank_address_fields_validation_rules()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => 'Wayland Corp',
+ 'taxIdentifier' => '345',
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayland Corp Desc',
+ 'vendorAddress' => [
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/not_blank_address_fields_validation_errors_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_wrong_iri_for_country_error()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => 'Wayland Corp',
+ 'taxIdentifier' => '345',
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayland Corp Desc',
+ 'vendorAddress' => [
+ 'country' => 'PL',
+ 'city' => 'Warszawa',
+ 'street' => 'Jasna 1',
+ 'postalCode' => '12-123',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/internal_server_error', Response::HTTP_INTERNAL_SERVER_ERROR);
+ }
+
+ public function test_not_existed_country()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => 'Wayland Corp',
+ 'taxIdentifier' => '345',
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => '123456789',
+ 'description' => 'Wayland Corp Desc',
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/RO',
+ 'city' => 'Warszawa',
+ 'street' => 'Jasna 1',
+ 'postalCode' => '12-123',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/internal_server_error', Response::HTTP_INTERNAL_SERVER_ERROR);
+ }
+
+ public function test_min_length_validation_rules()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::$container->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => 'Wa',
+ 'taxIdentifier' => '34',
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => '12',
+ 'description' => 'Wa',
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => 'Wa',
+ 'street' => 'Ja',
+ 'postalCode' => '12',
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/min_length_validation_errors_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+
+ public function test_max_length_validation_rules()
+ {
+ $this->loadFixturesFromFile('Api/VendorRegistrationTest/test_vendor_basic_registration.yml');
+
+ $loginData = $this->logInShopUser('test@example.com');
+ $authorizationHeader = self::getContainer()->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+ $header = array_merge($header, self::CONTENT_TYPE_HEADER);
+
+ $string256Length = str_repeat('a', 256);
+ $string2049Length = str_repeat('a', 2049);
+
+ $this->client->request('POST', '/api/v2/shop/account/vendor/register', [], [], $header, json_encode([
+ 'companyName' => $string256Length,
+ 'taxIdentifier' => $string256Length,
+ 'bankAccountNumber' => 'PL10109024026243964796978514',
+ 'phoneNumber' => $string256Length,
+ 'description' => $string2049Length,
+ 'vendorAddress' => [
+ 'country' => '/api/v2/shop/countries/PL',
+ 'city' => $string256Length,
+ 'street' => $string256Length,
+ 'postalCode' => $string256Length,
+ ],
+ ]));
+ $response = $this->client->getResponse();
+ $this->assertResponse($response, 'Api/VendorRegistrationTest/max_length_validation_errors_response', Response::HTTP_UNPROCESSABLE_ENTITY);
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ConversationTest/conversation.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ConversationTest/conversation.yml
new file mode 100644
index 0000000..0607071
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ConversationTest/conversation.yml
@@ -0,0 +1,139 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: "Bruce"
+ lastName: "Wayne"
+ email: "bruce.wayne@example.com"
+ emailCanonical: "bruce.wayne@example.com"
+ customer_peter:
+ firstName: "Peter"
+ lastName: "Weyland"
+ email: "peter.weyland@example.com"
+ emailCanonical: "peter.weyland@example.com"
+ customer_john:
+ firstName: "John"
+ lastName: "Smith"
+ email: "john.smith@example.com"
+ emailCanonical: "john.smith@example.com"
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_bruce'
+ username: "bruce.wayne@example.com"
+ usernameCanonical: "bruce.wayne@example.com"
+ user_peter:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_peter'
+ username: "peter.weyland@example.com"
+ usernameCanonical: "peter.weyland@example.com"
+ user_john:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_john'
+ username: "john.smith@example.com"
+ usernameCanonical: "john.smith@example.com"
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: "John"
+ lastName: "Smith"
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL84109024022516138548468193'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL11109024028914597692969454'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Messaging\Entity\Conversation:
+ bruce_conversation:
+ shopUser: '@user_bruce'
+ peter_conversation:
+ category: '@peter_category'
+ shopUser: '@user_peter'
+ conversation_to_archive:
+ shopUser: '@user_bruce'
+BitBag\OpenMarketplace\Component\Messaging\Entity\Message:
+ peter_message:
+ content: "Own by Peter"
+ conversation: '@peter_conversation'
+ bruce_message:
+ content: "Own by Bruce"
+ conversation: '@bruce_conversation'
+ archive_request:
+ content: '\ARCHIVE_REQUEST_MESSAGE '
+ conversation: "@conversation_to_archive"
+BitBag\OpenMarketplace\Component\Messaging\Entity\Category:
+ peter_category:
+ name: "Category for Peter"
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/CustomerTest/customer.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/CustomerTest/customer.yml
new file mode 100644
index 0000000..b1c4cb9
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/CustomerTest/customer.yml
@@ -0,0 +1,152 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: "Bruce"
+ lastName: "Wayne"
+ email: "bruce.wayne@example.com"
+ emailCanonical: "bruce.wayne@example.com"
+ customer_peter:
+ firstName: "Peter"
+ lastName: "Weyland"
+ email: "peter.weyland@example.com"
+ emailCanonical: "peter.weyland@example.com"
+ customer_john:
+ firstName: "John"
+ lastName: "Smith"
+ email: "john.smith@example.com"
+ emailCanonical: "john.smith@example.com"
+ phoneNumber: 123456789
+ defaultAddress: '@address_john'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_bruce'
+ username: "bruce.wayne@example.com"
+ usernameCanonical: "bruce.wayne@example.com"
+ user_peter:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_peter'
+ username: "peter.weyland@example.com"
+ usernameCanonical: "peter.weyland@example.com"
+ user_john:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_john'
+ username: "john.smith@example.com"
+ usernameCanonical: "john.smith@example.com"
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: "John"
+ lastName: "Smith"
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL65109024029994763689555936'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL19109024027219726634879744'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1:
+ currency_code: "USD"
+ locale_code: "en-US"
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: "awaiting_payment"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ mode: 'secondary'
+ bruce_order_made_by_john_2:
+ currency_code: "USD"
+ locale_code: "en-US"
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ mode: 'secondary'
+ order_made_by_peter:
+ currency_code: "USD"
+ locale_code: "en-US"
+ vendor: '@vendor_bruce'
+ customer: '@customer_peter'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter'
+ mode: 'secondary'
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/DraftAttributeTest/draft_attribute.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/DraftAttributeTest/draft_attribute.yml
new file mode 100644
index 0000000..7add089
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/DraftAttributeTest/draft_attribute.yml
@@ -0,0 +1,123 @@
+Sylius\Component\Addressing\Model\Country:
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'CODE'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: ['ROLE_USER', 'ROLE_VENDOR']
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: ['ROLE_USER', 'ROLE_VENDOR']
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: ['ROLE_USER']
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address_bruce:
+ country: '@country_us'
+ city: 'Arkham City'
+ postalCode: '00000'
+ street: 'Avenue 2115'
+ vendor_address_peter:
+ country: '@country_us'
+ city: 'San Francisco'
+ postalCode: '94016'
+ street: 'Unknown 1'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ vendorAddress: '@vendor_address_bruce'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL52109024028343758388462523'
+ phoneNumber: '555444333'
+ vendorAddress: '@vendor_address_peter'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ attribute_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_peter_1:
+ vendor: '@vendor_peter'
+ code: 'attribute_peter_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeTranslation:
+ attribute_bruce_1_translations_us:
+ translatable: '@attribute_bruce_1'
+ locale: 'en_US'
+ name: 'attribute_bruce_1_us'
+ attribute_peter_1_translations_us:
+ translatable: '@attribute_peter_1'
+ locale: 'en_US'
+ name: 'attribute_peter_1_us'
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/OrderTest/order.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/OrderTest/order.yml
new file mode 100644
index 0000000..cdacf22
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/OrderTest/order.yml
@@ -0,0 +1,333 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: ['@channel']
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: "Bruce"
+ lastName: "Wayne"
+ email: "bruce.wayne@example.com"
+ emailCanonical: "bruce.wayne@example.com"
+ customer_peter:
+ firstName: "Peter"
+ lastName: "Weyland"
+ email: "peter.weyland@example.com"
+ emailCanonical: "peter.weyland@example.com"
+ customer_john:
+ firstName: "John"
+ lastName: "Smith"
+ email: "john.smith@example.com"
+ emailCanonical: "john.smith@example.com"
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_bruce'
+ username: "bruce.wayne@example.com"
+ usernameCanonical: "bruce.wayne@example.com"
+ user_peter:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_peter'
+ username: "peter.weyland@example.com"
+ usernameCanonical: "peter.weyland@example.com"
+ user_john:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_john'
+ username: "john.smith@example.com"
+ usernameCanonical: "john.smith@example.com"
+Sylius\Component\Core\Model\AdminUser:
+ test_admin:
+ enabled: true
+ username: "Clark Kent"
+ firstName: "Clark"
+ lastName: "Kent"
+ email: "clark.kent@example.com"
+ emailCanonical: "clark.kent@example.com"
+ localeCode: 'en_US'
+ roles: ["ROLE_ADMINISTRATION_ACCESS","ROLE_API_ACCESS"]
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: "John"
+ lastName: "Smith"
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: "bruce_1"
+ enabled: true
+ channels: ['@channel']
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: "peter_2"
+ enabled: true
+ channels: [ '@channel' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: "bruce_1_1"
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: "bruce_1_2"
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: "peter_1_1"
+ enabled: true
+ onHand: 3
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_peter_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: "primary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ customer: '@customer_john'
+ paymentState: "awaiting_payment"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: "secondary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: "awaiting_payment"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ bruce_order_made_by_john_2_main:
+ mode: "primary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ customer: '@customer_john'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: "secondary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ peter_order_made_by_john_main:
+ mode: "primary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ customer: '@customer_john'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john_main'
+ peter_order_made_by_john:
+ primaryOrder: '@peter_order_made_by_john'
+ mode: "secondary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
+ order_made_by_peter_main:
+ mode: "primary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ customer: '@customer_peter'
+ paymentState: "paid"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_main'
+ order_made_by_peter_1:
+ primaryOrder: '@order_made_by_peter_main'
+ mode: "secondary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ customer: '@customer_peter'
+ paymentState: "awaiting_payment"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_1'
+ order_made_by_peter_2:
+ primaryOrder: '@order_made_by_peter_main'
+ mode: "secondary"
+ currency_code: "USD"
+ locale_code: "en-US"
+ customer: '@customer_peter'
+ paymentState: "awaiting_payment"
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_2'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ peter_order_made_by_john_1_item_1:
+ order: '@peter_order_made_by_john'
+ variant: '@product_variant_product_peter_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+ peter_order_made_by_john_shipment:
+ vendor: '@vendor_peter'
+ order: '@peter_order_made_by_john'
+ method: '@shipping_method_ups'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: ["@bruce_order_made_by_john_1_item_1"]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+Sylius\Component\Core\Model\PaymentMethod:
+ payment_method_cash_on_delivery:
+ code: 'CASH_ON_DELIVERY'
+ enabled: true
+ gatewayConfig: '@gateway_offline'
+ currentLocale: 'en_US'
+ translations:
+ - '@payment_method_cash_on_delivery_translation'
+ channels: ['@channel']
+Sylius\Component\Payment\Model\PaymentMethodTranslation:
+ payment_method_cash_on_delivery_translation:
+ name: 'Cash on delivery'
+ locale: 'en_US'
+ description: ''
+ translatable: '@payment_method_cash_on_delivery'
+Sylius\Bundle\PayumBundle\Model\GatewayConfig:
+ gateway_offline:
+ gatewayName: 'Offline'
+ factoryName: 'offline'
+ config: []
+Sylius\Component\Core\Model\Payment:
+ peter_order_payment_main:
+ order: "@order_made_by_peter_main"
+ method: "@payment_method_cash_on_delivery"
+ currencyCode: "USD"
+ state: "new"
+ peter_order_payment_1:
+ order: "@order_made_by_peter_1"
+ method: "@payment_method_cash_on_delivery"
+ currencyCode: "USD"
+ state: "new"
+ peter_order_payment_2:
+ order: "@order_made_by_peter_2"
+ method: "@payment_method_cash_on_delivery"
+ currencyCode: "USD"
+ state: "new"
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductDraftTest/product_draft.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductDraftTest/product_draft.yml
new file mode 100644
index 0000000..7e94824
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductDraftTest/product_draft.yml
@@ -0,0 +1,262 @@
+Sylius\Component\Addressing\Model\Country:
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ""
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'CODE'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: ['ROLE_USER', 'ROLE_VENDOR']
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: ['ROLE_USER', 'ROLE_VENDOR']
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: ['ROLE_USER']
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address_bruce:
+ country: '@country_us'
+ city: 'Arkham City'
+ postalCode: '00000'
+ street: 'Avenue 2115'
+ vendor_address_peter:
+ country: '@country_us'
+ city: 'San Francisco'
+ postalCode: '94016'
+ street: 'Unknown 1'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ vendorAddress: '@vendor_address_bruce'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ vendorAddress: '@vendor_address_peter'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ attribute_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_bruce_2:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_2'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_peter_1:
+ vendor: '@vendor_peter'
+ code: 'attribute_peter_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeTranslation:
+ attribute_bruce_1_translations_us:
+ translatable: '@attribute_bruce_1'
+ locale: 'en_US'
+ name: 'attribute_bruce_1_us'
+ attribute_bruce_2_translations_us:
+ translatable: '@attribute_bruce_2'
+ locale: 'en_US'
+ name: 'attribute_bruce_2_us'
+ attribute_peter_1_translations_us:
+ translatable: '@attribute_peter_1'
+ locale: 'en_US'
+ name: 'attribute_peter_1_us'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Listing:
+ product_listing_bruce_1:
+ code: 'product_listing_bruce_1'
+ vendor: '@vendor_bruce'
+ product_listing_bruce_2:
+ code: 'product_listing_bruce_2'
+ vendor: '@vendor_bruce'
+ verificationStatus: 'verified'
+ product_listing_peter_1:
+ code: 'product_listing_peter_1'
+ vendor: '@vendor_peter'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftImage:
+ product_draft_image_bruce_1:
+ owner: '@product_draft_bruce_1'
+ path: '/dummy/file/path'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Draft:
+ product_draft_bruce_1:
+ code: 'product_draft_bruce_1'
+ productListing: '@product_listing_bruce_1'
+ images: ['@product_draft_image_bruce_1']
+ productListingPrices: ['@product_draft_listing_price_bruce_1']
+ attributes: ['@product_draft_attribute_value_bruce_1']
+ mainTaxon: '@category_taxon'
+ productDraftTaxons: ['@product_draft_taxon_bruce_1']
+ product_draft_bruce_2:
+ code: 'product_draft_bruce_2'
+ productListing: '@product_listing_bruce_2'
+ productListingPrices: ['@product_draft_listing_price_bruce_2']
+ attributes: ['@product_draft_attribute_value_bruce_2']
+ mainTaxon: '@category_taxon'
+ productDraftTaxons: ['@product_draft_taxon_bruce_2']
+ product_draft_peter_1:
+ code: 'product_draft_peter_1'
+ productListing: '@product_listing_peter_1'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftTranslation:
+ product_draft_bruce_1_translations_us:
+ productDraft: '@product_draft_bruce_1'
+ locale: 'en_US'
+ name: 'product_draft_bruce_1_translations_us'
+ slug: 'product_draft_bruce_1_translations_us'
+ product_draft_bruce_2_translations_us:
+ productDraft: '@product_draft_bruce_2'
+ locale: 'en_US'
+ name: 'product_draft_bruce_2_translations_us'
+ slug: 'product_draft_bruce_2_translations_us'
+ product_draft_peter_1_translations_us:
+ productDraft: '@product_draft_peter_1'
+ locale: 'en_US'
+ name: 'product_draft_peter_1_translations_us'
+ slug: 'product_draft_peter_1_translations_us'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeValue:
+ product_draft_attribute_value_bruce_1:
+ draft: '@product_draft_bruce_1'
+ attribute: '@attribute_bruce_1'
+ value: 'example value'
+ product_draft_attribute_value_bruce_2:
+ draft: '@product_draft_bruce_2'
+ attribute: '@attribute_bruce_2'
+ value: 'example value'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\ListingPrice:
+ product_draft_listing_price_bruce_1:
+ productDraft: '@product_draft_bruce_1'
+ price: 100
+ originalPrice: 80
+ minimumPrice: 90
+ channelCode: 'CODE'
+ product_draft_listing_price_bruce_2:
+ productDraft: '@product_draft_bruce_2'
+ price: 150
+ originalPrice: 200
+ minimumPrice: 90
+ channelCode: 'CODE'
+Sylius\Component\Core\Model\Taxon:
+ category_taxon:
+ code: 'CATEGORY'
+ currentLocale: 'en_US'
+ translations: ['@en_us_category_translation']
+ children: ['@mug_taxon', '@hat_taxon']
+ second_category_taxon:
+ code: 'SECOND_CATEGORY'
+ currentLocale: 'en_US'
+ translations: ['@en_us_second_category_translation']
+ children: ['@hat_taxon']
+ mug_taxon:
+ code: 'MUG'
+ currentLocale: 'en_US'
+ translations: ['@en_us_mug_taxon_translation']
+ parent: '@category_taxon'
+ position: 0
+ hat_taxon:
+ code: 'HAT'
+ currentLocale: 'en_US'
+ translations: ['@en_us_hat_translation']
+ parent: '@category_taxon'
+ position: 1
+Sylius\Component\Taxonomy\Model\TaxonTranslation:
+ en_us_category_translation:
+ slug: 'categories'
+ locale: 'en_US'
+ name: 'Categories'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@category_taxon'
+ en_us_second_category_translation:
+ slug: 'second-categories'
+ locale: 'en_US'
+ name: 'Second categories'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@second_category_taxon'
+ en_us_mug_taxon_translation:
+ slug: 'categories/mugs'
+ locale: 'en_US'
+ name: 'Mugs'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@mug_taxon'
+ en_us_hat_translation:
+ slug: 'categories/hats'
+ locale: 'en_US'
+ name: 'Hats'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@hat_taxon'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftTaxon:
+ product_draft_taxon_bruce_1:
+ productDraft: '@product_draft_bruce_1'
+ taxon: '@mug_taxon'
+ position: 1
+ product_draft_taxon_bruce_2:
+ productDraft: '@product_draft_bruce_2'
+ taxon: '@hat_taxon'
+ position: 2
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductListingTest/product_listings.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductListingTest/product_listings.yml
new file mode 100644
index 0000000..63fa271
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductListingTest/product_listings.yml
@@ -0,0 +1,258 @@
+Sylius\Component\Addressing\Model\Country:
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ""
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'CODE'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: ['ROLE_USER', 'ROLE_VENDOR']
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: ['ROLE_USER', 'ROLE_VENDOR']
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: ['ROLE_USER']
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address_bruce:
+ country: '@country_us'
+ city: 'Arkham City'
+ postalCode: '00000'
+ street: 'Avenue 2115'
+ vendor_address_peter:
+ country: '@country_us'
+ city: 'San Francisco'
+ postalCode: '94016'
+ street: 'Unknown 1'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ vendorAddress: '@vendor_address_bruce'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ vendorAddress: '@vendor_address_peter'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ attribute_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_bruce_2:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_2'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_peter_1:
+ vendor: '@vendor_peter'
+ code: 'attribute_peter_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeTranslation:
+ attribute_bruce_1_translations_us:
+ translatable: '@attribute_bruce_1'
+ locale: 'en_US'
+ name: 'attribute_bruce_1_us'
+ attribute_bruce_2_translations_us:
+ translatable: '@attribute_bruce_2'
+ locale: 'en_US'
+ name: 'attribute_bruce_2_us'
+ attribute_peter_1_translations_us:
+ translatable: '@attribute_peter_1'
+ locale: 'en_US'
+ name: 'attribute_peter_1_us'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Listing:
+ product_listing_bruce_1:
+ code: 'product_listing_bruce_1'
+ vendor: '@vendor_bruce'
+ product_listing_bruce_2:
+ code: 'product_listing_bruce_2'
+ vendor: '@vendor_bruce'
+ verificationStatus: 'verified'
+ product_listing_peter_1:
+ code: 'product_listing_peter_1'
+ vendor: '@vendor_peter'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Draft:
+ product_draft_bruce_1:
+ code: 'product_draft_bruce_1'
+ productListing: '@product_listing_bruce_1'
+ productListingPrices: ['@product_draft_listing_price_bruce_1']
+ attributes: ['@product_draft_attribute_value_bruce_1']
+ mainTaxon: '@category_taxon'
+ productDraftTaxons: ['@product_draft_taxon_bruce_1']
+ status: "created"
+ product_draft_bruce_2:
+ code: 'product_draft_bruce_2'
+ productListing: '@product_listing_bruce_2'
+ productListingPrices: ['@product_draft_listing_price_bruce_2']
+ attributes: ['@product_draft_attribute_value_bruce_2']
+ mainTaxon: '@category_taxon'
+ productDraftTaxons: ['@product_draft_taxon_bruce_2']
+ product_draft_peter_1:
+ code: 'product_draft_peter_1'
+ productListing: '@product_listing_peter_1'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftTranslation:
+ product_draft_bruce_1_translations_us:
+ productDraft: '@product_draft_bruce_1'
+ locale: 'en_US'
+ name: 'product_draft_bruce_1_translations_us'
+ slug: 'product_draft_bruce_1_translations_us'
+ product_draft_bruce_2_translations_us:
+ productDraft: '@product_draft_bruce_2'
+ locale: 'en_US'
+ name: 'product_draft_bruce_2_translations_us'
+ slug: 'product_draft_bruce_2_translations_us'
+ product_draft_peter_1_translations_us:
+ productDraft: '@product_draft_peter_1'
+ locale: 'en_US'
+ name: 'product_draft_peter_1_translations_us'
+ slug: 'product_draft_peter_1_translations_us'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeValue:
+ product_draft_attribute_value_bruce_1:
+ draft: '@product_draft_bruce_1'
+ attribute: '@attribute_bruce_1'
+ value: 'example value'
+ product_draft_attribute_value_bruce_2:
+ draft: '@product_draft_bruce_2'
+ attribute: '@attribute_bruce_2'
+ value: 'example value'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\ListingPrice:
+ product_draft_listing_price_bruce_1:
+ productDraft: '@product_draft_bruce_1'
+ price: 100
+ originalPrice: 80
+ minimumPrice: 90
+ channelCode: 'CODE'
+ product_draft_listing_price_bruce_2:
+ productDraft: '@product_draft_bruce_2'
+ price: 150
+ originalPrice: 200
+ minimumPrice: 90
+ channelCode: 'CODE'
+Sylius\Component\Core\Model\Taxon:
+ category_taxon:
+ code: 'CATEGORY'
+ currentLocale: 'en_US'
+ translations: ['@en_us_category_translation']
+ children: ['@mug_taxon', '@hat_taxon']
+ second_category_taxon:
+ code: 'SECOND_CATEGORY'
+ currentLocale: 'en_US'
+ translations: ['@en_us_second_category_translation']
+ children: ['@hat_taxon']
+ mug_taxon:
+ code: 'MUG'
+ currentLocale: 'en_US'
+ translations: ['@en_us_mug_taxon_translation']
+ parent: '@category_taxon'
+ position: 0
+ hat_taxon:
+ code: 'HAT'
+ currentLocale: 'en_US'
+ translations: ['@en_us_hat_translation']
+ parent: '@category_taxon'
+ position: 1
+Sylius\Component\Taxonomy\Model\TaxonTranslation:
+ en_us_category_translation:
+ slug: 'categories'
+ locale: 'en_US'
+ name: 'Categories'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@category_taxon'
+ en_us_second_category_translation:
+ slug: 'second-categories'
+ locale: 'en_US'
+ name: 'Second categories'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@second_category_taxon'
+ en_us_mug_taxon_translation:
+ slug: 'categories/mugs'
+ locale: 'en_US'
+ name: 'Mugs'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@mug_taxon'
+ en_us_hat_translation:
+ slug: 'categories/hats'
+ locale: 'en_US'
+ name: 'Hats'
+ description: 'Some description Lorem ipsum dolor sit amet.'
+ translatable: '@hat_taxon'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftTaxon:
+ product_draft_taxon_bruce_1:
+ productDraft: '@product_draft_bruce_1'
+ taxon: '@mug_taxon'
+ position: 1
+ product_draft_taxon_bruce_2:
+ productDraft: '@product_draft_bruce_2'
+ taxon: '@hat_taxon'
+ position: 2
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductVariant/InventoryTest/inventory.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductVariant/InventoryTest/inventory.yml
new file mode 100644
index 0000000..c6faf49
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/ProductVariant/InventoryTest/inventory.yml
@@ -0,0 +1,169 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: "Bruce"
+ lastName: "Wayne"
+ email: "bruce.wayne@example.com"
+ emailCanonical: "bruce.wayne@example.com"
+ customer_peter:
+ firstName: "Peter"
+ lastName: "Weyland"
+ email: "peter.weyland@example.com"
+ emailCanonical: "peter.weyland@example.com"
+ customer_john:
+ firstName: "John"
+ lastName: "Smith"
+ email: "john.smith@example.com"
+ emailCanonical: "john.smith@example.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_bruce'
+ username: "bruce.wayne@example.com"
+ usernameCanonical: "bruce.wayne@example.com"
+ user_peter:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_peter'
+ username: "peter.weyland@example.com"
+ usernameCanonical: "peter.weyland@example.com"
+ user_john:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_john'
+ username: "john.smith@example.com"
+ usernameCanonical: "john.smith@example.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: "bruce_1"
+ enabled: true
+ channels: ['@channel']
+ product_bruce_2:
+ vendor: '@vendor_bruce'
+ code: "bruce_2"
+ enabled: true
+ channels: ['@channel']
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: "peter_2"
+ enabled: true
+ channels: [ '@channel' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: "bruce_1_1"
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: "bruce_1_2"
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_bruce_2_1:
+ product: '@product_bruce_2'
+ code: "bruce_2_1"
+ enabled: true
+ onHand: 0
+ tracked: false
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: "peter_1_1"
+ enabled: true
+ onHand: 3
+ tracked: true
+ product_variant_product_peter_1_2:
+ product: '@product_peter_1'
+ code: "peter_1_2"
+ enabled: true
+ onHand: 1
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_bruce_2_1:
+ price: 8
+ originalPrice: 11
+ minimumPrice: 5
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_bruce_2_1'
+ pricing_product_variant_product_peter_1_1:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_peter_1_1'
+ pricing_product_variant_product_peter_1_2:
+ price: 123
+ originalPrice: 222
+ minimumPrice: 100
+ channelCode: 'CODE'
+ productVariant: '@product_variant_product_peter_1_2'
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorProfileTest/vendor_profile.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorProfileTest/vendor_profile.yml
new file mode 100644
index 0000000..827617d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorProfileTest/vendor_profile.yml
@@ -0,0 +1,121 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\AdminUser:
+ test_admin:
+ enabled: true
+ username: "Clark Kent"
+ firstName: "Clark"
+ lastName: "Kent"
+ email: "clark.kent@example.com"
+ emailCanonical: "clark.kent@example.com"
+ localeCode: 'en_US'
+ roles: ["ROLE_ADMINISTRATION_ACCESS","ROLE_API_ACCESS"]
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: "Bruce"
+ lastName: "Wayne"
+ email: "bruce.wayne@example.com"
+ emailCanonical: "bruce.wayne@example.com"
+ customer_peter:
+ firstName: "Peter"
+ lastName: "Weyland"
+ email: "peter.weyland@example.com"
+ emailCanonical: "peter.weyland@example.com"
+ customer_john:
+ firstName: "John"
+ lastName: "Smith"
+ email: "john.smith@example.com"
+ emailCanonical: "john.smith@example.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_bruce'
+ username: "bruce.wayne@example.com"
+ usernameCanonical: "bruce.wayne@example.com"
+ user_peter:
+ plainPassword: "123password"
+ roles: ["ROLE_USER", "ROLE_VENDOR"]
+ enabled: "true"
+ customer: '@customer_peter'
+ username: "peter.weyland@example.com"
+ usernameCanonical: "peter.weyland@example.com"
+ user_john:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_john'
+ username: "john.smith@example.com"
+ usernameCanonical: "john.smith@example.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address_bruce:
+ country: '@country_us'
+ city: 'Arkham City'
+ postalCode: '00000'
+ street: 'Avenue 2115'
+ vendor_address_peter:
+ country: '@country_us'
+ city: 'San Francisco'
+ postalCode: '94016'
+ street: 'Unknown 1'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ vendorAddress: '@vendor_address_bruce'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ vendorAddress: '@vendor_address_peter'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Vendor\Entity\LogoImage:
+ vendor_image_peter:
+ owner: "@vendor_peter"
+ path: "/dummy/file/path"
+BitBag\OpenMarketplace\Component\Vendor\Entity\BackgroundImage:
+ vendor_backgroundimage_peter:
+ owner: "@vendor_peter"
+ path: "/dummy/file/path"
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorRegistrationTest/test_existed_vendor_registration.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorRegistrationTest/test_existed_vendor_registration.yml
new file mode 100644
index 0000000..9c72f79
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorRegistrationTest/test_existed_vendor_registration.yml
@@ -0,0 +1,18 @@
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL65109024029994763689555936'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
diff --git a/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorRegistrationTest/test_vendor_basic_registration.yml b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorRegistrationTest/test_vendor_basic_registration.yml
new file mode 100644
index 0000000..96613b9
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/DataFixtures/ORM/Api/VendorRegistrationTest/test_vendor_basic_registration.yml
@@ -0,0 +1,43 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Addressing\Model\Zone:
+ pl:
+ code: 'PL'
+ name: 'Polska'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_pl:
+ code: 'PL'
+ belongsTo: '@pl'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'pl_PL'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: "CODE"
+ name: "name"
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: "John"
+ lastName: "Nowak"
+ email: "test@example.com"
+ emailCanonical: "test@example.com"
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: "123password"
+ roles: ["ROLE_USER"]
+ enabled: "true"
+ customer: '@customer_oliver'
+ username: "oliver@queen.com"
+ usernameCanonical: "oliver@queen.com"
diff --git a/OpenMarketplace/tests/Functional/FunctionalTestCase.php b/OpenMarketplace/tests/Functional/FunctionalTestCase.php
new file mode 100644
index 0000000..ad4f225
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/FunctionalTestCase.php
@@ -0,0 +1,57 @@
+dataFixturesPath = __DIR__ . \DIRECTORY_SEPARATOR . 'DataFixtures' . \DIRECTORY_SEPARATOR . 'ORM';
+ $this->expectedResponsesPath = __DIR__ . \DIRECTORY_SEPARATOR . 'Responses' . \DIRECTORY_SEPARATOR . 'Expected';
+ $this->filesPath = __DIR__ . \DIRECTORY_SEPARATOR . 'Resources' . \DIRECTORY_SEPARATOR . 'files';
+ }
+
+ public function getFilePath(string $fileName): string
+ {
+ return $this->filesPath . \DIRECTORY_SEPARATOR . $fileName;
+ }
+
+ protected function getHeaderForLoginShopUser(string $email): array
+ {
+ $loginData = $this->logInShopUser($email);
+ $authorizationHeader = self::getContainer()->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+
+ return array_merge($header, self::CONTENT_TYPE_HEADER);
+ }
+
+ protected function getHeaderForAdmin(string $email): array
+ {
+ $loginData = $this->logInAdminUser($email);
+ $authorizationHeader = self::getContainer()->getParameter('sylius.api.authorization_header');
+ $header['HTTP_' . $authorizationHeader] = 'Bearer ' . $loginData;
+
+ return array_merge($header, self::CONTENT_TYPE_HEADER);
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Resources/files/avatar.png b/OpenMarketplace/tests/Functional/Resources/files/avatar.png
new file mode 100644
index 0000000..d80a1da
Binary files /dev/null and b/OpenMarketplace/tests/Functional/Resources/files/avatar.png differ
diff --git a/OpenMarketplace/tests/Functional/Resources/files/product1.png b/OpenMarketplace/tests/Functional/Resources/files/product1.png
new file mode 100644
index 0000000..d80a1da
Binary files /dev/null and b/OpenMarketplace/tests/Functional/Resources/files/product1.png differ
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_get_shop_customer_by_user.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_get_shop_customer_by_user.json
new file mode 100644
index 0000000..9474056
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_get_shop_customer_by_user.json
@@ -0,0 +1,18 @@
+{
+ "@context": "/api/v2/contexts/Customer",
+ "@id": "/api/v2/shop/customers/@string@",
+ "@type": "Customer",
+ "defaultAddress": "/api/v2/shop/addresses/@string@",
+ "user": {
+ "@type": "ShopUser",
+ "@id": "true",
+ "vendor": null,
+ "verified": false
+ },
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "gender": "u",
+ "subscribedToNewsletter": false,
+ "fullName": "John Smith"
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_get_shop_customer_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_get_shop_customer_by_vendor.json
new file mode 100644
index 0000000..5d0f530
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_get_shop_customer_by_vendor.json
@@ -0,0 +1,23 @@
+{
+ "@context": "/api/v2/contexts/Customer",
+ "@id": "/api/v2/shop/customers/@string@",
+ "@type": "Customer",
+ "defaultAddress": null,
+ "user": {
+ "@type": "ShopUser",
+ "@id": "true",
+ "vendor": {
+ "@id": "/api/v2/shop/vendors/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "Wayne-Enterprises-Inc"
+ },
+ "verified": false
+ },
+ "email": "bruce.wayne@example.com",
+ "firstName": "Bruce",
+ "lastName": "Wayne",
+ "gender": "u",
+ "subscribedToNewsletter": false,
+ "fullName": "Bruce Wayne"
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customer_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customer_by_vendor.json
new file mode 100644
index 0000000..50760b8
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customer_by_vendor.json
@@ -0,0 +1,31 @@
+{
+ "@context": "/api/v2/contexts/Customer",
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "defaultAddress": {
+ "@id": "/api/v2/shop/addresses/@string@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Smith",
+ "phoneNumber": null,
+ "company": null,
+ "countryCode": "US",
+ "provinceCode": null,
+ "provinceName": null,
+ "street": "Avenue 2115",
+ "city": "Arkham City",
+ "postcode": "00000"
+ },
+ "user": {
+ "@type": "ShopUser",
+ "@id": "true",
+ "enabled": true,
+ "vendor": null,
+ "verified": false
+ },
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "gender": "u",
+ "phoneNumber": "123456789"
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customers_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customers_by_vendor.json
new file mode 100644
index 0000000..0b01630
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customers_by_vendor.json
@@ -0,0 +1,86 @@
+{
+ "@context": "/api/v2/contexts/Customer",
+ "@id": "/api/v2/shop/account/vendor/customers",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "defaultAddress": null,
+ "user": {
+ "@type": "ShopUser",
+ "@id": "true",
+ "enabled": true,
+ "vendor": "/api/v2/shop/vendors/@string@",
+ "verified": false
+ },
+ "email": "peter.weyland@example.com",
+ "firstName": "Peter",
+ "lastName": "Weyland",
+ "gender": "u",
+ "phoneNumber": null
+ },
+ {
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "defaultAddress": {
+ "@id": "/api/v2/shop/addresses/@string@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Smith",
+ "phoneNumber": null,
+ "company": null,
+ "countryCode": "US",
+ "provinceCode": null,
+ "provinceName": null,
+ "street": "Avenue 2115",
+ "city": "Arkham City",
+ "postcode": "00000"
+ },
+ "user": {
+ "@type": "ShopUser",
+ "@id": "true",
+ "enabled": true,
+ "vendor": null,
+ "verified": false
+ },
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "gender": "u",
+ "phoneNumber": "123456789"
+ }
+ ],
+ "hydra:totalItems": 2,
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/customers{?firstName,lastName,email,user.enabled}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "firstName",
+ "property": "firstName",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "lastName",
+ "property": "lastName",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "email",
+ "property": "email",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "user.enabled",
+ "property": "user.enabled",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customers_by_vendor_filter_email.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customers_by_vendor_filter_email.json
new file mode 100644
index 0000000..551fbce
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/CustomerTest/test_it_get_customers_by_vendor_filter_email.json
@@ -0,0 +1,73 @@
+{
+ "@context": "/api/v2/contexts/Customer",
+ "@id": "/api/v2/shop/account/vendor/customers",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "defaultAddress": {
+ "@id": "/api/v2/shop/addresses/@string@",
+ "@type": "Address",
+ "firstName": "John",
+ "lastName": "Smith",
+ "phoneNumber": null,
+ "company": null,
+ "countryCode": "US",
+ "provinceCode": null,
+ "provinceName": null,
+ "street": "Avenue 2115",
+ "city": "Arkham City",
+ "postcode": "00000"
+ },
+ "user": {
+ "@type": "ShopUser",
+ "@id": "true",
+ "enabled": true,
+ "vendor": null,
+ "verified": false
+ },
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "gender": "u",
+ "phoneNumber": "123456789"
+ }
+ ],
+ "hydra:totalItems": 1,
+ "hydra:view": {
+ "@id": "/api/v2/shop/account/vendor/customers?email=john",
+ "@type": "hydra:PartialCollectionView"
+ },
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/customers{?firstName,lastName,email,user.enabled}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "firstName",
+ "property": "firstName",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "lastName",
+ "property": "lastName",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "email",
+ "property": "email",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "user.enabled",
+ "property": "user.enabled",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_creating_attribute_by_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_creating_attribute_by_vendor_response.json
new file mode 100644
index 0000000..b69c584
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_creating_attribute_by_vendor_response.json
@@ -0,0 +1,21 @@
+{
+ "@context": "\/api\/v2\/contexts\/DraftAttribute",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft/attributes\/@string@",
+ "@type": "DraftAttribute",
+ "vendor": "\/api\/v2\/shop\/vendors\/@string@",
+ "uuid": "@string@",
+ "code": "test",
+ "type": "text",
+ "configuration": [],
+ "storageType": "text",
+ "position": 1,
+ "translations": {
+ "en_US": {
+ "@id": "/api/v2/shop/account/vendor/product-draft/attribute-translations/@string@",
+ "@type": "DraftAttributeTranslation",
+ "uuid": "@string@",
+ "name": "test",
+ "locale": "en_US"
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_get_attribute_by_owner_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_get_attribute_by_owner_vendor_response.json
new file mode 100644
index 0000000..c45008e
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_get_attribute_by_owner_vendor_response.json
@@ -0,0 +1,21 @@
+{
+ "@context": "\/api\/v2\/contexts\/DraftAttribute",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "@type": "DraftAttribute",
+ "vendor": "\/api\/v2\/shop\/vendors\/@string@",
+ "uuid": "@string@",
+ "code": "attribute_bruce_1",
+ "type": "text",
+ "configuration": [],
+ "storageType": "text",
+ "position": 0,
+ "translations": {
+ "en_US": {
+ "@id": "/api/v2/shop/account/vendor/product-draft/attribute-translations/@string@",
+ "@type": "DraftAttributeTranslation",
+ "uuid": "@string@",
+ "name": "attribute_bruce_1_us",
+ "locale": "en_US"
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_get_only_draft_attributes_for_current_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_get_only_draft_attributes_for_current_vendor_response.json
new file mode 100644
index 0000000..8e1027d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_get_only_draft_attributes_for_current_vendor_response.json
@@ -0,0 +1,28 @@
+{
+ "@context": "\/api\/v2\/contexts\/DraftAttribute",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "@type": "DraftAttribute",
+ "vendor": "\/api\/v2\/shop\/vendors\/@string@",
+ "uuid": "@string@",
+ "code": "attribute_bruce_1",
+ "type": "text",
+ "configuration": [],
+ "storageType": "text",
+ "position": "@integer@",
+ "translations": {
+ "en_US": {
+ "@id": "/api/v2/shop/account/vendor/product-draft/attribute-translations/@string@",
+ "@type": "DraftAttributeTranslation",
+ "uuid": "@string@",
+ "name": "attribute_bruce_1_us",
+ "locale": "en_US"
+ }
+ }
+ }
+ ],
+ "hydra:totalItems": 1
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_update_attribute_by_vendor_owner_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_update_attribute_by_vendor_owner_response.json
new file mode 100644
index 0000000..6d2fa11
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_update_attribute_by_vendor_owner_response.json
@@ -0,0 +1,23 @@
+{
+ "@context": "\/api\/v2\/contexts\/DraftAttribute",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "@type": "DraftAttribute",
+ "vendor": "\/api\/v2\/shop\/vendors\/@string@",
+ "uuid": "@string@",
+ "code": "attribute_bruce_1",
+ "type": "text",
+ "configuration": {
+ "min": 2
+ },
+ "storageType": "text",
+ "position": 0,
+ "translations": {
+ "en_US": {
+ "@id": "/api/v2/shop/account/vendor/product-draft/attribute-translations/@string@",
+ "@type": "DraftAttributeTranslation",
+ "uuid": "@string@",
+ "name": "attribute_bruce_1_us",
+ "locale": "en_US"
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_update_attribute_translation_by_vendor_owner_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_update_attribute_translation_by_vendor_owner_response.json
new file mode 100644
index 0000000..0bd8e23
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_it_update_attribute_translation_by_vendor_owner_response.json
@@ -0,0 +1,8 @@
+{
+ "@context": "\/api\/v2\/contexts\/DraftAttributeTranslation",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft/attribute-translations\/@string@",
+ "@type": "DraftAttributeTranslation",
+ "uuid": "@string@",
+ "name": "changed translation name",
+ "locale": "en_US"
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_validate_not_blank_rules_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_validate_not_blank_rules_response.json
new file mode 100644
index 0000000..15ef837
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/DraftAttributeTest/test_validate_not_blank_rules_response.json
@@ -0,0 +1,33 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "code: This field cannot be empty\ntype: This field cannot be empty\nstorageType: This field cannot be empty\ntranslations[].locale: This field cannot be empty\ntranslations[].name: This field cannot be empty",
+ "violations": [
+ {
+ "propertyPath": "code",
+ "message": "This field cannot be empty",
+ "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
+ },
+ {
+ "propertyPath": "type",
+ "message": "This field cannot be empty",
+ "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
+ },
+ {
+ "propertyPath": "storageType",
+ "message": "This field cannot be empty",
+ "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
+ },
+ {
+ "propertyPath": "translations[].locale",
+ "message": "This field cannot be empty",
+ "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
+ },
+ {
+ "propertyPath": "translations[].name",
+ "message": "This field cannot be empty",
+ "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_get_shop_orders_by_shop_user.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_get_shop_orders_by_shop_user.json
new file mode 100644
index 0000000..4a999c5
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_get_shop_orders_by_shop_user.json
@@ -0,0 +1,29 @@
+{
+ "@context": "/api/v2/contexts/Order",
+ "@id": "/api/v2/shop/orders",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "/api/v2/shop/orders/bruce_order_made_by_john_1",
+ "@type": "Order",
+ "tokenValue": "bruce_order_made_by_john_1",
+ "id": "@integer@",
+ "itemsTotal": 0
+ },
+ {
+ "@id": "/api/v2/shop/orders/bruce_order_made_by_john_2",
+ "@type": "Order",
+ "tokenValue": "bruce_order_made_by_john_2",
+ "id": "@integer@",
+ "itemsTotal": 0
+ },
+ {
+ "@id": "/api/v2/shop/orders/peter_order_made_by_john",
+ "@type": "Order",
+ "tokenValue": "peter_order_made_by_john",
+ "id": "@integer@",
+ "itemsTotal": 0
+ }
+ ],
+ "hydra:totalItems": 3
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_get_shop_orders_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_get_shop_orders_by_vendor.json
new file mode 100644
index 0000000..c00a23c
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_get_shop_orders_by_vendor.json
@@ -0,0 +1,22 @@
+{
+ "@context": "/api/v2/contexts/Order",
+ "@id": "/api/v2/shop/orders",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "/api/v2/shop/orders/order_made_by_peter_1",
+ "@type": "Order",
+ "tokenValue": "order_made_by_peter_1",
+ "id": "@integer@",
+ "itemsTotal": 0
+ },
+ {
+ "@id": "/api/v2/shop/orders/order_made_by_peter_2",
+ "@type": "Order",
+ "tokenValue": "order_made_by_peter_2",
+ "id": "@integer@",
+ "itemsTotal": 0
+ }
+ ],
+ "hydra:totalItems": 2
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_cancel_order_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_cancel_order_by_vendor.json
new file mode 100644
index 0000000..aa39cca
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_cancel_order_by_vendor.json
@@ -0,0 +1,47 @@
+{
+ "@context": "/api/v2/contexts/Order",
+ "@id": "/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_2",
+ "@type": "Order",
+ "customer": "/api/v2/shop/account/vendor/customers/@string@",
+ "payments": [],
+ "shipments": [
+ {
+ "@id": "/api/v2/shop/shipments/@string@",
+ "@type": "Shipment",
+ "id": "@integer@",
+ "method": "/api/v2/shop/shipping-methods/fedex",
+ "vendor": {
+ "@id": "/api/v2/shop/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "slug": "Wayne-Enterprises-Inc"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "localeCode": "en-US",
+ "checkoutState": "completed",
+ "paymentState": "paid",
+ "shippingState": "cart",
+ "tokenValue": "bruce_order_made_by_john_2",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "/api/v2/shop/order-items/@string@",
+ "@type": "OrderItem",
+ "variant": "/api/v2/shop/product-variants/bruce_1_2",
+ "id": "@integer@",
+ "quantity": 0,
+ "unitPrice": 0,
+ "originalUnitPrice": 0,
+ "total": 0,
+ "subtotal": 0
+ }
+ ],
+ "itemsTotal": 0,
+ "total": 0,
+ "state": "cancelled",
+ "taxTotal": 0,
+ "shippingTotal": 0,
+ "orderPromotionTotal": 0
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_order_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_order_by_vendor.json
new file mode 100644
index 0000000..a91678e
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_order_by_vendor.json
@@ -0,0 +1,87 @@
+{
+ "@context": "/api/v2/contexts/Order",
+ "@id": "/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1",
+ "@type": "Order",
+ "customer": "/api/v2/shop/account/vendor/customers/@string@",
+ "shippingAddress": {
+ "@id": "/api/v2/shop/addresses/@string@",
+ "@type": "Address",
+ "id": "@integer@",
+ "firstName": "John",
+ "lastName": "Smith",
+ "countryCode": "US",
+ "street": "Avenue 2115",
+ "city": "Arkham City",
+ "postcode": "00000"
+ },
+ "billingAddress": {
+ "@id": "/api/v2/shop/addresses/@string@",
+ "@type": "Address",
+ "id": "@integer@",
+ "firstName": "John",
+ "lastName": "Smith",
+ "countryCode": "US",
+ "street": "Avenue 2115",
+ "city": "Arkham City",
+ "postcode": "00000"
+ },
+ "shipments": [
+ "/api/v2/shop/shipments/@string@"
+ ],
+ "currencyCode": "USD",
+ "localeCode": "en-US",
+ "checkoutState": "completed",
+ "paymentState": "awaiting_payment",
+ "tokenValue": "bruce_order_made_by_john_1",
+ "id": "@integer@",
+ "items": [
+ {
+ "@id": "/api/v2/shop/order-items/@string@",
+ "@type": "OrderItem",
+ "variant": {
+ "@id": "/api/v2/shop/product-variants/bruce_1_1",
+ "@type": "ProductVariant",
+ "code": "bruce_1_1"
+ },
+ "id": "@integer@",
+ "order": "/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1",
+ "quantity": 1,
+ "unitPrice": 0,
+ "originalUnitPrice": 0,
+ "total": 0,
+ "units": [
+ {
+ "@id": "/api/v2/shop/order-item-units/@string@",
+ "@type": "OrderItemUnit",
+ "id": "@integer@",
+ "adjustments": [],
+ "adjustmentsTotal": 0,
+ "shippable": {
+ "@id": "/api/v2/shop/product-variants/bruce_1_1",
+ "@type": "ProductVariant",
+ "code": "bruce_1_1"
+ }
+ }
+ ],
+ "adjustments": [],
+ "adjustmentsTotal": 0,
+ "product": {
+ "@id": "/api/v2/shop/products/bruce_1",
+ "@type": "Product",
+ "defaultVariant": "/api/v2/shop/product-variants/bruce_1_1"
+ },
+ "discountedUnitPrice": 0,
+ "subtotal": 0,
+ "adjustmentsRecursively": [],
+ "adjustmentsTotalRecursively": 0
+ }
+ ],
+ "itemsTotal": 0,
+ "adjustments": [],
+ "adjustmentsTotal": 0,
+ "total": 0,
+ "state": "new",
+ "taxTotal": 0,
+ "shippingTotal": 0,
+ "orderPromotionTotal": 0
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_orders_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_orders_by_vendor.json
new file mode 100644
index 0000000..60001e2
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_orders_by_vendor.json
@@ -0,0 +1,157 @@
+{
+ "@context": "/api/v2/contexts/Order",
+ "@id": "/api/v2/shop/account/vendor/orders",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_1",
+ "@type": "Order",
+ "customer": {
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "phoneNumber": "123456789",
+ "subscribedToNewsletter": false
+ },
+ "shipments": [
+ {
+ "@id": "/api/v2/shop/shipments/@string@",
+ "@type": "Shipment",
+ "method": {
+ "@id": "/api/v2/shop/shipping-methods/ups",
+ "@type": "ShippingMethod",
+ "code": "ups"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "checkoutState": "completed",
+ "paymentState": "awaiting_payment",
+ "id": "@integer@",
+ "state": "new"
+ },
+ {
+ "@id": "/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_2",
+ "@type": "Order",
+ "customer": {
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "phoneNumber": "123456789",
+ "subscribedToNewsletter": false
+ },
+ "shipments": [
+ {
+ "@id": "/api/v2/shop/shipments/@string@",
+ "@type": "Shipment",
+ "method": {
+ "@id": "/api/v2/shop/shipping-methods/fedex",
+ "@type": "ShippingMethod",
+ "code": "fedex"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "checkoutState": "completed",
+ "paymentState": "paid",
+ "id": "@integer@",
+ "state": "new"
+ }
+ ],
+ "hydra:totalItems": 2,
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/orders{?number,state,state[],paymentState,paymentState[],shippingState,shippingState[],shipments.method.code,shipments.method.code[],customer.email,checkoutCompletedAt[before],checkoutCompletedAt[strictly_before],checkoutCompletedAt[after],checkoutCompletedAt[strictly_after]}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "number",
+ "property": "number",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "state",
+ "property": "state",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "state[]",
+ "property": "state",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "paymentState",
+ "property": "paymentState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "paymentState[]",
+ "property": "paymentState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shippingState",
+ "property": "shippingState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shippingState[]",
+ "property": "shippingState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shipments.method.code",
+ "property": "shipments.method.code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shipments.method.code[]",
+ "property": "shipments.method.code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "customer.email",
+ "property": "customer.email",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[before]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[strictly_before]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[after]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[strictly_after]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_orders_by_vendor_filter_payment_state.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_orders_by_vendor_filter_payment_state.json
new file mode 100644
index 0000000..187a623
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/OrderTest/test_it_get_orders_by_vendor_filter_payment_state.json
@@ -0,0 +1,132 @@
+{
+ "@context": "/api/v2/contexts/Order",
+ "@id": "/api/v2/shop/account/vendor/orders",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "/api/v2/shop/account/vendor/orders/bruce_order_made_by_john_2",
+ "@type": "Order",
+ "customer": {
+ "@id": "/api/v2/shop/account/vendor/customers/@string@",
+ "@type": "Customer",
+ "email": "john.smith@example.com",
+ "firstName": "John",
+ "lastName": "Smith",
+ "phoneNumber": "123456789",
+ "subscribedToNewsletter": false
+ },
+ "shipments": [
+ {
+ "@id": "/api/v2/shop/shipments/@string@",
+ "@type": "Shipment",
+ "method": {
+ "@id": "/api/v2/shop/shipping-methods/fedex",
+ "@type": "ShippingMethod",
+ "code": "fedex"
+ }
+ }
+ ],
+ "currencyCode": "USD",
+ "checkoutState": "completed",
+ "paymentState": "paid",
+ "id": "@integer@",
+ "state": "new"
+ }
+ ],
+ "hydra:totalItems": 1,
+ "hydra:view": {
+ "@id": "/api/v2/shop/account/vendor/orders?paymentState=paid",
+ "@type": "hydra:PartialCollectionView"
+ },
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/orders{?number,state,state[],paymentState,paymentState[],shippingState,shippingState[],shipments.method.code,shipments.method.code[],customer.email,checkoutCompletedAt[before],checkoutCompletedAt[strictly_before],checkoutCompletedAt[after],checkoutCompletedAt[strictly_after]}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "number",
+ "property": "number",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "state",
+ "property": "state",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "state[]",
+ "property": "state",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "paymentState",
+ "property": "paymentState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "paymentState[]",
+ "property": "paymentState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shippingState",
+ "property": "shippingState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shippingState[]",
+ "property": "shippingState",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shipments.method.code",
+ "property": "shipments.method.code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "shipments.method.code[]",
+ "property": "shipments.method.code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "customer.email",
+ "property": "customer.email",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[before]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[strictly_before]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[after]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "checkoutCompletedAt[strictly_after]",
+ "property": "checkoutCompletedAt",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductDraftTest/test_it_get_by_current_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductDraftTest/test_it_get_by_current_vendor.json
new file mode 100644
index 0000000..d78eb21
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductDraftTest/test_it_get_by_current_vendor.json
@@ -0,0 +1,26 @@
+{
+ "@context": "/api/v2/contexts/Draft",
+ "@id": "/api/v2/shop/account/vendor/product-drafts/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_1",
+ "status": "created",
+ "verifiedAt": null,
+ "publishedAt": null,
+ "images": [
+ []
+ ],
+ "translations": {
+ "en_US": "/api/v2/shop/account/vendor/product-draft/translations/@string@"
+ },
+ "productListingPrices": {
+ "CODE": []
+ },
+ "attributes": [
+ []
+ ],
+ "mainTaxon": "/api/v2/shop/taxons/CATEGORY",
+ "productDraftTaxons": [
+ []
+ ]
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_creating_product_listing_by_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_creating_product_listing_by_vendor_response.json
new file mode 100644
index 0000000..e436d48
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_creating_product_listing_by_vendor_response.json
@@ -0,0 +1,65 @@
+{
+ "@context": "\/api\/v2\/contexts\/Listing",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings\/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "test",
+ "enabled": true,
+ "verificationStatus": "created",
+ "latestDraft": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-drafts\/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "test",
+ "status": "created",
+ "images": [
+ {
+ "@type": "DraftImage",
+ "uuid": "@string@",
+ "path": "@string@\/product1.png"
+ }
+ ],
+ "translations": [
+ {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/translations\/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "Test",
+ "description": "Test description",
+ "metaKeywords": "Test metaKeywords",
+ "metaDescription": "Test metaDescription",
+ "shortDescription": "Test shortDescription",
+ "locale": "en_US"
+ }
+ ],
+ "productListingPrices": [
+ {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 100,
+ "originalPrice": 110,
+ "minimumPrice": 80,
+ "channelCode": "CODE"
+ }
+ ],
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "value": "example text value"
+ }
+ ],
+ "mainTaxon": "\/api\/v2\/shop\/taxons\/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "\/api\/v2\/shop\/taxons\/MUG",
+ "position": 2
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_code.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_code.json
new file mode 100644
index 0000000..fc12246
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_code.json
@@ -0,0 +1,98 @@
+{
+ "@context": "\/api\/v2\/contexts\/Listing",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings\/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_1",
+ "enabled": true,
+ "verificationStatus": "created",
+ "latestDraft": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-drafts\/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_1",
+ "status": "created",
+ "verifiedAt": null,
+ "publishedAt": null,
+ "images": [],
+ "translations": {
+ "en_US": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/translations\/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "product_draft_bruce_1_translations_us",
+ "slug": "product_draft_bruce_1_translations_us",
+ "description": null,
+ "metaKeywords": null,
+ "metaDescription": null,
+ "shortDescription": null,
+ "locale": "en_US"
+ }
+ },
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 100,
+ "originalPrice": 80,
+ "minimumPrice": 90,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "value": "example value"
+ }
+ ],
+ "mainTaxon": "\/api\/v2\/shop\/taxons\/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "\/api\/v2\/shop\/taxons\/MUG",
+ "position": 1
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+ }
+ ],
+ "hydra:totalItems": 1,
+ "hydra:view": {
+ "@id": "/api/v2/shop/account/vendor/product-listings?code=bruce_1",
+ "@type": "hydra:PartialCollectionView"
+ },
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/product-listings{?code,verificationStatus,verificationStatus[]}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "code",
+ "property": "code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "verificationStatus",
+ "property": "verificationStatus",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "verificationStatus[]",
+ "property": "verificationStatus",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_verification_status.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_verification_status.json
new file mode 100644
index 0000000..f066a1a
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_filter_by_verification_status.json
@@ -0,0 +1,98 @@
+{
+ "@context": "\/api\/v2\/contexts\/Listing",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings\/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_2",
+ "enabled": true,
+ "verificationStatus": "verified",
+ "latestDraft": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-drafts\/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_2",
+ "status": "created",
+ "verifiedAt": null,
+ "publishedAt": null,
+ "images": [],
+ "translations": {
+ "en_US": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/translations\/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "product_draft_bruce_2_translations_us",
+ "slug": "product_draft_bruce_2_translations_us",
+ "description": null,
+ "metaKeywords": null,
+ "metaDescription": null,
+ "shortDescription": null,
+ "locale": "en_US"
+ }
+ },
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 150,
+ "originalPrice": 200,
+ "minimumPrice": 90,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "value": "example value"
+ }
+ ],
+ "mainTaxon": "\/api\/v2\/shop\/taxons\/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "\/api\/v2\/shop\/taxons\/HAT",
+ "position": 2
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+ }
+ ],
+ "hydra:totalItems": 1,
+ "hydra:view": {
+ "@id": "/api/v2/shop/account/vendor/product-listings?verificationStatus=verified",
+ "@type": "hydra:PartialCollectionView"
+ },
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/product-listings{?code,verificationStatus,verificationStatus[]}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "code",
+ "property": "code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "verificationStatus",
+ "property": "verificationStatus",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "verificationStatus[]",
+ "property": "verificationStatus",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_response.json
new file mode 100644
index 0000000..6df7955
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_only_product_listings_for_current_vendor_response.json
@@ -0,0 +1,155 @@
+{
+ "@context": "\/api\/v2\/contexts\/Listing",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings\/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_1",
+ "enabled": true,
+ "verificationStatus": "created",
+ "latestDraft": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-drafts\/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_1",
+ "status": "created",
+ "verifiedAt": null,
+ "publishedAt": null,
+ "images": [],
+ "translations": {
+ "en_US": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/translations\/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "product_draft_bruce_1_translations_us",
+ "slug": "product_draft_bruce_1_translations_us",
+ "description": null,
+ "metaKeywords": null,
+ "metaDescription": null,
+ "shortDescription": null,
+ "locale": "en_US"
+ }
+ },
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 100,
+ "originalPrice": 80,
+ "minimumPrice": 90,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "value": "example value"
+ }
+ ],
+ "mainTaxon": "\/api\/v2\/shop\/taxons\/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "\/api\/v2\/shop\/taxons\/MUG",
+ "position": 1
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+ },
+ {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings\/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_2",
+ "enabled": true,
+ "verificationStatus": "verified",
+ "latestDraft": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-drafts\/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_2",
+ "status": "created",
+ "verifiedAt": null,
+ "publishedAt": null,
+ "images": [],
+ "translations": {
+ "en_US": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft\/translations\/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "product_draft_bruce_2_translations_us",
+ "slug": "product_draft_bruce_2_translations_us",
+ "description": null,
+ "metaKeywords": null,
+ "metaDescription": null,
+ "shortDescription": null,
+ "locale": "en_US"
+ }
+ },
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 150,
+ "originalPrice": 200,
+ "minimumPrice": 90,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "value": "example value"
+ }
+ ],
+ "mainTaxon": "\/api\/v2\/shop\/taxons\/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "\/api\/v2\/shop\/taxons\/HAT",
+ "position": 2
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+ }
+ ],
+ "hydra:totalItems": 2,
+ "hydra:search": {
+ "@type": "hydra:IriTemplate",
+ "hydra:template": "/api/v2/shop/account/vendor/product-listings{?code,verificationStatus,verificationStatus[]}",
+ "hydra:variableRepresentation": "BasicRepresentation",
+ "hydra:mapping": [
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "code",
+ "property": "code",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "verificationStatus",
+ "property": "verificationStatus",
+ "required": false
+ },
+ {
+ "@type": "IriTemplateMapping",
+ "variable": "verificationStatus[]",
+ "property": "verificationStatus",
+ "required": false
+ }
+ ]
+ }
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_product_listing_by_owner_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_product_listing_by_owner_vendor_response.json
new file mode 100644
index 0000000..21358b9
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_gets_product_listing_by_owner_vendor_response.json
@@ -0,0 +1,62 @@
+{
+ "@context": "\/api\/v2\/contexts\/Listing",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-listings\/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_1",
+ "enabled": true,
+ "verificationStatus": "created",
+ "latestDraft": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-drafts\/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_1",
+ "status": "created",
+ "verifiedAt": null,
+ "publishedAt": null,
+ "images": [],
+ "translations": {
+ "en_US": {
+ "@id": "\/api\/v2\/shop\/account\/vendor\/product-draft/translations\/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "product_draft_bruce_1_translations_us",
+ "slug": "product_draft_bruce_1_translations_us",
+ "description": null,
+ "metaKeywords": null,
+ "metaDescription": null,
+ "shortDescription": null,
+ "locale": "en_US"
+ }
+ },
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 100,
+ "originalPrice": 80,
+ "minimumPrice": 90,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "\/api\/v2\/shop\/account\/vendor\/product-draft\/attributes\/@string@",
+ "value": "example value"
+ }
+ ],
+ "mainTaxon": "\/api\/v2\/shop\/taxons\/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "\/api\/v2\/shop\/taxons\/MUG",
+ "position": 1
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_send_to_verification_by_owner_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_send_to_verification_by_owner_vendor.json
new file mode 100644
index 0000000..438aa4e
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_send_to_verification_by_owner_vendor.json
@@ -0,0 +1,62 @@
+{
+ "@context": "/api/v2/contexts/Listing",
+ "@id": "/api/v2/shop/account/vendor/product-listings/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_1",
+ "enabled": true,
+ "verificationStatus": "under_verification",
+ "latestDraft": {
+ "@id": "/api/v2/shop/account/vendor/product-drafts/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_1",
+ "status": "under_verification",
+ "verifiedAt": null,
+ "publishedAt": "@string@.isDateTime()",
+ "images": [],
+ "translations": {
+ "en_US": {
+ "@id": "/api/v2/shop/account/vendor/product-draft\/translations/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "name": "product_draft_bruce_1_translations_us",
+ "slug": "product_draft_bruce_1_translations_us",
+ "description": null,
+ "metaKeywords": null,
+ "metaDescription": null,
+ "shortDescription": null,
+ "locale": "en_US"
+ }
+ },
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 100,
+ "originalPrice": 80,
+ "minimumPrice": 90,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "/api/v2/shop/account/vendor/product-draft/attributes/@string@",
+ "value": "example value"
+ }
+ ],
+ "mainTaxon": "/api/v2/shop/taxons/CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "/api/v2/shop/taxons/MUG",
+ "position": 1
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_validates_not_blank_product_draft_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_validates_not_blank_product_draft_response.json
new file mode 100644
index 0000000..1f57aee
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_it_validates_not_blank_product_draft_response.json
@@ -0,0 +1,13 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "productDraft: This field cannot be empty",
+ "violations": [
+ {
+ "propertyPath": "productDraft",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_update_product_listing_by_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_update_product_listing_by_vendor_response.json
new file mode 100644
index 0000000..de1c952
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductListingTest/test_update_product_listing_by_vendor_response.json
@@ -0,0 +1,62 @@
+{
+ "@context": "/api/v2/contexts/Listing",
+ "@id": "/api/v2/shop/account/vendor/product-listings/@string@",
+ "@type": "Listing",
+ "uuid": "@string@",
+ "code": "product_listing_bruce_1",
+ "enabled": true,
+ "verificationStatus": "created",
+ "latestDraft": {
+ "@id": "/api/v2/shop/account/vendor/product-drafts/@string@",
+ "@type": "Draft",
+ "uuid": "@string@",
+ "code": "product_draft_bruce_1",
+ "status": "created",
+ "images": [],
+ "verifiedAt": null,
+ "publishedAt": null,
+ "translations": {
+ "en_US": {
+ "@id": "/api/v2/shop/account/vendor/product-draft/translations/@string@",
+ "@type": "DraftTranslation",
+ "uuid": "@string@",
+ "locale": "en_US",
+ "name": "Changed name",
+ "slug": "Changed slug",
+ "description": "Changed description",
+ "metaKeywords": "Test metaKeywords",
+ "metaDescription": "Test metaDescription",
+ "shortDescription": "Test shortDescription"
+ }
+},
+ "productListingPrices": {
+ "CODE": {
+ "@type": "ListingPrice",
+ "uuid": "@string@",
+ "price": 120,
+ "originalPrice": 110,
+ "minimumPrice": 115,
+ "channelCode": "CODE"
+ }
+ },
+ "attributes": [
+ {
+ "@type": "DraftAttributeValue",
+ "uuid": "@string@",
+ "attribute": "/api/v2/shop/account/vendor/product-draft/attributes/@string@",
+ "value": "changed value"
+ }
+ ],
+ "mainTaxon": "/api/v2/shop/taxons/SECOND_CATEGORY",
+ "productDraftTaxons": [
+ {
+ "@type": "DraftTaxon",
+ "uuid": "@string@",
+ "taxon": "/api/v2/shop/taxons/HAT",
+ "position": 2
+ }
+ ]
+ },
+ "product": null,
+ "lastVerifiedAt": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_amount_validator_update_product_variant_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_amount_validator_update_product_variant_by_vendor.json
new file mode 100644
index 0000000..fbf3e0d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_amount_validator_update_product_variant_by_vendor.json
@@ -0,0 +1,13 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "amount: On hand must be greater than the number of on hold units",
+ "violations": [
+ {
+ "propertyPath": "amount",
+ "message": "On hand must be greater than the number of on hold units",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_get_product_variant_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_get_product_variant_by_vendor.json
new file mode 100644
index 0000000..e1c18f2
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_get_product_variant_by_vendor.json
@@ -0,0 +1,10 @@
+{
+ "@context": "\/api\/v2\/contexts\/ProductVariant",
+ "@id": "\/api\/v2\/shop\/product-variants\/bruce_1_2",
+ "@type": "ProductVariant",
+ "onHold": 0,
+ "amount": 1,
+ "tracked": true,
+ "code": "bruce_1_2",
+ "position": 1
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_get_product_variants_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_get_product_variants_by_vendor.json
new file mode 100644
index 0000000..12268d6
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_get_product_variants_by_vendor.json
@@ -0,0 +1,35 @@
+{
+ "@context": "\/api\/v2\/contexts\/ProductVariant",
+ "@id": "\/api\/v2\/shop\/product-variants",
+ "@type": "hydra:Collection",
+ "hydra:member": [
+ {
+ "@id": "\/api\/v2\/shop\/product-variants\/bruce_1_1",
+ "@type": "ProductVariant",
+ "onHold": 2,
+ "amount": 3,
+ "tracked": true,
+ "code": "bruce_1_1",
+ "position": 0
+ },
+ {
+ "@id": "\/api\/v2\/shop\/product-variants\/bruce_1_2",
+ "@type": "ProductVariant",
+ "onHold": 0,
+ "amount": 1,
+ "tracked": true,
+ "code": "bruce_1_2",
+ "position": 1
+ },
+ {
+ "@id": "\/api\/v2\/shop\/product-variants\/bruce_2_1",
+ "@type": "ProductVariant",
+ "onHold": 0,
+ "amount": 0,
+ "tracked": false,
+ "code": "bruce_2_1",
+ "position": 0
+ }
+ ],
+ "hydra:totalItems": 3
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_update_product_variant_by_vendor.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_update_product_variant_by_vendor.json
new file mode 100644
index 0000000..c554409
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/ProductVariant/InventoryTest/test_it_update_product_variant_by_vendor.json
@@ -0,0 +1,10 @@
+{
+ "@context": "\/api\/v2\/contexts\/ProductVariant",
+ "@id": "\/api\/v2\/shop\/product-variants\/bruce_2_1",
+ "@type": "ProductVariant",
+ "onHold": 0,
+ "amount": 5,
+ "tracked": true,
+ "code": "bruce_2_1",
+ "position": 0
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorConversation/test_validate_not_blank_category_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorConversation/test_validate_not_blank_category_response.json
new file mode 100644
index 0000000..761ac9e
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorConversation/test_validate_not_blank_category_response.json
@@ -0,0 +1,13 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "category: This value should not be blank.",
+ "violations": [
+ {
+ "propertyPath": "category",
+ "message": "This value should not be blank.",
+ "code": "c1051bb4-d103-4f74-8988-acbcafc7fdc3"
+ }
+ ]
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_get_shop_vendor_data_for_shop_user.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_get_shop_vendor_data_for_shop_user.json
new file mode 100644
index 0000000..b05c317
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_get_shop_vendor_data_for_shop_user.json
@@ -0,0 +1,10 @@
+{
+ "@context": "\/api\/v2\/contexts\/Vendor",
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "companyName": "Wayne Enterprises, Inc.",
+ "slug": "Wayne-Enterprises-Inc",
+ "image": null,
+ "backgroundImage": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_gets_vendor_data_for_shop_user_in_his_vendor_context.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_gets_vendor_data_for_shop_user_in_his_vendor_context.json
new file mode 100644
index 0000000..bba1656
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_gets_vendor_data_for_shop_user_in_his_vendor_context.json
@@ -0,0 +1,21 @@
+{
+ "@context": "\/api\/v2\/contexts\/Vendor",
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "companyName": "Wayne Enterprises, Inc.",
+ "taxIdentifier": "1234567",
+ "bankAccountNumber": "PL31109024026812185484588836",
+ "phoneNumber": "555123123",
+ "vendorAddress": {
+ "@type": "Address",
+ "country": "\/api\/v2\/shop\/countries\/US",
+ "city": "Arkham City",
+ "street": "Avenue 2115",
+ "postalCode": "00000"
+ },
+ "slug": "Wayne-Enterprises-Inc",
+ "description": "description",
+ "image": null,
+ "backgroundImage": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_successful_update_vendor_data_for_shop_user_in_his_vendor_context.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_successful_update_vendor_data_for_shop_user_in_his_vendor_context.json
new file mode 100644
index 0000000..4978d3d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_it_successful_update_vendor_data_for_shop_user_in_his_vendor_context.json
@@ -0,0 +1,21 @@
+{
+ "@context": "\/api\/v2\/contexts\/Vendor",
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "companyName": "Wayne Enterprises",
+ "taxIdentifier": "345",
+ "bankAccountNumber": "PL14109024029586826934815556",
+ "phoneNumber": "123456789",
+ "vendorAddress": {
+ "@type": "Address",
+ "country": "\/api\/v2\/shop\/countries\/PL",
+ "city": "New York",
+ "street": "Wall St. 1",
+ "postalCode": "12123"
+ },
+ "slug": "Wayne-Enterprises",
+ "description": "Wayne Enterprises Desc",
+ "image": null,
+ "backgroundImage": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_validation_rules.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_validation_rules.json
new file mode 100644
index 0000000..f624562
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_validation_rules.json
@@ -0,0 +1,55 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "taxIdentifier: This field cannot be empty\ntaxIdentifier: Required length: 3 characters.\nbankAccountNumber: This field cannot be empty\ncompanyName: This field cannot be empty\ncompanyName: Required length: 3 characters.\nphoneNumber: This field cannot be empty\nphoneNumber: Required length: 3 characters.\ndescription: This field cannot be empty\ndescription: Required length: 3 characters.",
+
+
+ "violations": [
+ {
+ "propertyPath": "taxIdentifier",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "taxIdentifier",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "bankAccountNumber",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "companyName",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "companyName",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "phoneNumber",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "phoneNumber",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "description",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "description",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ }
+ ]
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_vendor_image_file_validation_rule.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_vendor_image_file_validation_rule.json
new file mode 100644
index 0000000..784957c
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_vendor_image_file_validation_rule.json
@@ -0,0 +1,13 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "file: This field cannot be empty",
+ "violations": [
+ {
+ "propertyPath": "file",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_vendor_image_owner_validation_rule.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_vendor_image_owner_validation_rule.json
new file mode 100644
index 0000000..fd535ab
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_not_blank_vendor_image_owner_validation_rule.json
@@ -0,0 +1,13 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "owner: This field cannot be empty",
+ "violations": [
+ {
+ "propertyPath": "owner",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_vendor_image_upload_successfully.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_vendor_image_upload_successfully.json
new file mode 100644
index 0000000..6050643
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/test_vendor_image_upload_successfully.json
@@ -0,0 +1,8 @@
+{
+ "@context": "\/api\/v2\/contexts\/VendorLogo",
+ "@id": "\/api\/v2\/shop\/account\/vendor\/logo\/@string@",
+ "@type": "VendorLogo",
+ "uuid": "@string@",
+ "path": "@string@\/avatar.png",
+ "owner": "\/api\/v2\/shop\/vendors\/@string@"
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/vendor_not_found_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/vendor_not_found_response.json
new file mode 100644
index 0000000..523a62f
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorProfileTest/vendor_not_found_response.json
@@ -0,0 +1,4 @@
+{
+ "code": 500,
+ "message": "Item not found for \u0022\/api\/v2\/shop\/account\/vendors\/@string@\u0022."
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/existed_vendor_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/existed_vendor_response.json
new file mode 100644
index 0000000..1003088
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/existed_vendor_response.json
@@ -0,0 +1,13 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "Vendor for current user already exists",
+ "violations": [
+ {
+ "propertyPath": "",
+ "message": "Vendor for current user already exists",
+ "code": null
+ }
+ ]
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/max_length_validation_errors_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/max_length_validation_errors_response.json
new file mode 100644
index 0000000..086256d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/max_length_validation_errors_response.json
@@ -0,0 +1,43 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "taxIdentifier: This field cannot be longer than 255\ncompanyName: This field cannot be longer than 255\nphoneNumber: This field cannot be longer than 255\ndescription: This field cannot be longer than 2048\nvendorAddress.city: This field cannot be longer than 255\nvendorAddress.street: This field cannot be longer than 255\nvendorAddress.postalCode: This field cannot be longer than 255",
+ "violations": [
+ {
+ "propertyPath": "taxIdentifier",
+ "message": "This field cannot be longer than 255",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "companyName",
+ "message": "This field cannot be longer than 255",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "phoneNumber",
+ "message": "This field cannot be longer than 255",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "description",
+ "message": "This field cannot be longer than 2048",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.city",
+ "message": "This field cannot be longer than 255",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.street",
+ "message": "This field cannot be longer than 255",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.postalCode",
+ "message": "This field cannot be longer than 255",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/min_length_validation_errors_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/min_length_validation_errors_response.json
new file mode 100644
index 0000000..b78b1e9
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/min_length_validation_errors_response.json
@@ -0,0 +1,43 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "taxIdentifier: Required length: 3 characters.\ncompanyName: Required length: 3 characters.\nphoneNumber: Required length: 3 characters.\ndescription: Required length: 3 characters.\nvendorAddress.city: Required length: 3 characters.\nvendorAddress.street: Required length: 3 characters.\nvendorAddress.postalCode: Required length: 3 characters.",
+ "violations": [
+ {
+ "propertyPath": "taxIdentifier",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "companyName",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "phoneNumber",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "description",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.city",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.street",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.postalCode",
+ "message": "Required length: 3 characters.",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/not_blank_address_fields_validation_errors_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/not_blank_address_fields_validation_errors_response.json
new file mode 100644
index 0000000..159252d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/not_blank_address_fields_validation_errors_response.json
@@ -0,0 +1,28 @@
+{
+ "@context": "\/api\/v2\/contexts\/ConstraintViolationList",
+ "@type": "ConstraintViolationList",
+ "hydra:title": "An error occurred",
+ "hydra:description": "vendorAddress.country: This field cannot be empty\nvendorAddress.city: This field cannot be empty\nvendorAddress.street: This field cannot be empty\nvendorAddress.postalCode: This field cannot be empty",
+ "violations": [
+ {
+ "propertyPath": "vendorAddress.country",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.city",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.street",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ },
+ {
+ "propertyPath": "vendorAddress.postalCode",
+ "message": "This field cannot be empty",
+ "code": "@string@"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/not_blank_validation_errors_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/not_blank_validation_errors_response.json
new file mode 100644
index 0000000..ea8ce85
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/not_blank_validation_errors_response.json
@@ -0,0 +1,4 @@
+{
+ "code": 400,
+ "message": "Request does not have the following required fields specified: companyName, taxIdentifier, bankAccountNumber, phoneNumber, description, vendorAddress."
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/success_registration_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/success_registration_response.json
new file mode 100644
index 0000000..e4b290f
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/success_registration_response.json
@@ -0,0 +1,21 @@
+{
+ "@context": "\/api\/v2\/contexts\/Vendor",
+ "@id": "\/api\/v2\/shop\/vendors\/@string@",
+ "@type": "Vendor",
+ "uuid": "@string@",
+ "companyName": "Wayland Corp",
+ "taxIdentifier": "345",
+ "bankAccountNumber": "PL10109024026243964796978514",
+ "phoneNumber": "123456789",
+ "vendorAddress": {
+ "@type": "Address",
+ "country": "\/api\/v2\/shop\/countries\/PL",
+ "city": "Warszawa",
+ "street": "Jasna 1",
+ "postalCode": "12-123"
+ },
+ "slug": "Wayland-Corp",
+ "description": "Wayland Corp Desc",
+ "image": null,
+ "backgroundImage": null
+}
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/unauthorized_registration_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/unauthorized_registration_response.json
new file mode 100644
index 0000000..40bf1d2
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/VendorRegistrationTest/unauthorized_registration_response.json
@@ -0,0 +1,4 @@
+{
+ "code": 401,
+ "message": "JWT Token not found"
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/access_denied_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/access_denied_response.json
new file mode 100644
index 0000000..fb8544e
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/access_denied_response.json
@@ -0,0 +1,6 @@
+{
+ "@context": "/api/v2/contexts/Error",
+ "@type": "hydra:Error",
+ "hydra:title": "An error occurred",
+ "hydra:description": "Access Denied."
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/empty_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/empty_response.json
new file mode 100644
index 0000000..e69de29
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/internal_server_error.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/internal_server_error.json
new file mode 100644
index 0000000..0d8e60d
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/internal_server_error.json
@@ -0,0 +1,6 @@
+{
+ "@context": "/api/v2/contexts/Error",
+ "@type": "hydra:Error",
+ "hydra:title": "An error occurred",
+ "hydra:description": "Internal Server Error"
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Functional/Responses/Expected/Api/not_found_response.json b/OpenMarketplace/tests/Functional/Responses/Expected/Api/not_found_response.json
new file mode 100644
index 0000000..5343641
--- /dev/null
+++ b/OpenMarketplace/tests/Functional/Responses/Expected/Api/not_found_response.json
@@ -0,0 +1,6 @@
+{
+ "@context": "/api/v2/contexts/Error",
+ "@type": "hydra:Error",
+ "hydra:title": "An error occurred",
+ "hydra:description": "Not Found"
+}
\ No newline at end of file
diff --git a/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/CustomerFilterStrategyTest.php b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/CustomerFilterStrategyTest.php
new file mode 100644
index 0000000..9776efa
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/CustomerFilterStrategyTest.php
@@ -0,0 +1,58 @@
+getContainer()->get('doctrine.orm.entity_manager');
+ $this->customerRepository = $entityManager->getRepository(Customer::class);
+ $this->vendorRepository = $entityManager->getRepository(Vendor::class);
+ }
+
+ public function test_supported_class(): void
+ {
+ $customerFilterStrategy = new CustomerFilterStrategy();
+ $result = $customerFilterStrategy->supports(CustomerInterface::class);
+
+ self::assertTrue($result);
+ }
+
+ public function test_unsupported_class(): void
+ {
+ $customerFilterStrategy = new CustomerFilterStrategy();
+ $result = $customerFilterStrategy->supports(OrderInterface::class);
+
+ self::assertFalse($result);
+ }
+
+ public function test_it_filters_resources(): void
+ {
+ $this->loadFixturesFromFile('VendorContextStrategy/CustomerFilterStrategyTest/customer_filter_strategy.yaml');
+
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $queryBuilder = $this->customerRepository->createQueryBuilder('o');
+
+ $customerFilterStrategy = new customerFilterStrategy();
+ $customerFilterStrategy->filterByVendor($queryBuilder, $vendor);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(2, $result);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/ProductDraftFilterStrategyTest.php b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/ProductDraftFilterStrategyTest.php
new file mode 100644
index 0000000..37401cb
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/ProductDraftFilterStrategyTest.php
@@ -0,0 +1,58 @@
+getContainer()->get('doctrine.orm.entity_manager');
+ $this->productDraftRepository = $entityManager->getRepository(Draft::class);
+ $this->vendorRepository = $entityManager->getRepository(Vendor::class);
+ }
+
+ public function test_supported_class(): void
+ {
+ $productDraftFilterStrategy = new ProductDraftFilterStrategy();
+ $result = $productDraftFilterStrategy->supports(DraftInterface::class);
+
+ self::assertTrue($result);
+ }
+
+ public function test_unsupported_class(): void
+ {
+ $productDraftFilterStrategy = new ProductDraftFilterStrategy();
+ $result = $productDraftFilterStrategy->supports(ListingInterface::class);
+
+ self::assertFalse($result);
+ }
+
+ public function test_it_filters_resources(): void
+ {
+ $this->loadFixturesFromFile('VendorContextStrategy/ProductDraftFilterStrategyTest/product_draft_filter_strategy.yaml');
+
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $queryBuilder = $this->productDraftRepository->createQueryBuilder('o');
+
+ $productDraftFilterStrategy = new ProductDraftFilterStrategy();
+ $productDraftFilterStrategy->filterByVendor($queryBuilder, $vendor);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(2, $result);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/ProductVariantFilterStrategyTest.php b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/ProductVariantFilterStrategyTest.php
new file mode 100644
index 0000000..0bd828b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/ProductVariantFilterStrategyTest.php
@@ -0,0 +1,58 @@
+getContainer()->get('doctrine.orm.entity_manager');
+ $this->productVariantRepository = $entityManager->getRepository(ProductVariant::class);
+ $this->vendorRepository = $entityManager->getRepository(Vendor::class);
+ }
+
+ public function test_supported_class(): void
+ {
+ $productVariantFilterStrategy = new ProductVariantFilterStrategy();
+ $result = $productVariantFilterStrategy->supports(ProductVariantInterface::class);
+
+ self::assertTrue($result);
+ }
+
+ public function test_unsupported_class(): void
+ {
+ $productVariantFilterStrategy = new ProductVariantFilterStrategy();
+ $result = $productVariantFilterStrategy->supports(ProductInterface::class);
+
+ self::assertFalse($result);
+ }
+
+ public function test_it_filters_resources(): void
+ {
+ $this->loadFixturesFromFile('VendorContextStrategy/ProductVariantFilterStrategyTest/product_variant_filter_strategy.yaml');
+
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $queryBuilder = $this->productVariantRepository->createQueryBuilder('o');
+
+ $productVariantFilterStrategy = new ProductVariantFilterStrategy();
+ $productVariantFilterStrategy->filterByVendor($queryBuilder, $vendor);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(3, $result);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/VendorFilterStrategyTest.php b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/VendorFilterStrategyTest.php
new file mode 100644
index 0000000..cdae679
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Api/Doctrine/QueryExtension/Vendor/VendorContextStrategy/VendorFilterStrategyTest.php
@@ -0,0 +1,67 @@
+getContainer()->get('doctrine.orm.entity_manager');
+ $this->draftAttributeRepository = $entityManager->getRepository(DraftAttribute::class);
+ $this->vendorRepository = $entityManager->getRepository(Vendor::class);
+ }
+
+ public function test_supported_class_optional_vendor_aware(): void
+ {
+ $vendorFilterStrategy = new VendorFilterStrategy();
+ $result = $vendorFilterStrategy->supports(OptionalVendorAwareInterface::class);
+
+ self::assertTrue($result);
+ }
+
+ public function test_supported_class_vendor_aware(): void
+ {
+ $vendorFilterStrategy = new VendorFilterStrategy();
+ $result = $vendorFilterStrategy->supports(VendorAwareInterface::class);
+
+ self::assertTrue($result);
+ }
+
+ public function test_unsupported_class(): void
+ {
+ $vendorFilterStrategy = new VendorFilterStrategy();
+ $result = $vendorFilterStrategy->supports(ProductVariantInterface::class);
+
+ self::assertFalse($result);
+ }
+
+ public function test_it_filters_resources(): void
+ {
+ $this->loadFixturesFromFile('VendorContextStrategy/VendorFilterStrategyTest/vendor_filter_strategy.yaml');
+
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $queryBuilder = $this->draftAttributeRepository->createQueryBuilder('o');
+
+ $vendorFilterStrategy = new VendorFilterStrategy();
+ $vendorFilterStrategy->filterByVendor($queryBuilder, $vendor);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(2, $result);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Cli/SettlementGenerateCommandTest.php b/OpenMarketplace/tests/Integration/Cli/SettlementGenerateCommandTest.php
new file mode 100644
index 0000000..083c4a3
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Cli/SettlementGenerateCommandTest.php
@@ -0,0 +1,278 @@
+find('bitbag:settlement:generate');
+ $this->commandTester = new CommandTester($command);
+ $this->settlementRepository = self::getContainer()->get('open_marketplace.repository.settlement');
+ $this->vendorRepository = self::getContainer()->get('bitbag.open_marketplace.component.vendor.repository.vendor');
+ $this->channelRepository = self::getContainer()->get('sylius.repository.channel');
+ $this->orderRepository = self::getContainer()->get('sylius.repository.order');
+ }
+
+ public function test_it_throws_exception_if_period_resolver_for_settlement_frequency_does_not_exist(): void
+ {
+ $this->loadFixturesFromFile('SettlementGenerateCommandTest/test_it_throws_exception_if_period_resolver_for_settlement_frequency_does_not_exist.yaml');
+
+ $this->expectException(\InvalidArgumentException::class);
+ $this->expectExceptionMessage('Could not find period resolver for vendor with settlement frequency "daily"');
+ $this->commandTester->execute([]);
+ }
+
+ public function test_it_generates_settlements_for_all_vendors(): void
+ {
+ $this->loadFixturesFromFile('SettlementGenerateCommandTest/test_it_generates_settlements_for_all_vendors.yaml');
+ $this->assertCount(0, $this->settlementRepository->findAll());
+ $this->commandTester->execute([]);
+ $this->commandTester->assertCommandIsSuccessful();
+ $vendorWeyland = $this->vendorRepository->findOneBySlug('Weyland-Corp');
+ $vendorWayne = $this->vendorRepository->findOneBySlug('Wayne-Enterprises-Inc');
+ $vendorTommy = $this->vendorRepository->findOneBySlug('Tommy-Corp');
+ $channelEu = $this->channelRepository->findOneBy(['code' => 'EU']);
+ $channelUs = $this->channelRepository->findOneBy(['code' => 'US']);
+ $settlementsVendorWeyland = $this->settlementRepository->findBy(['vendor' => $vendorWeyland]);
+ $settlementsVendorWayne = $this->settlementRepository->findBy(['vendor' => $vendorWayne]);
+ $settlementsVendorTommy = $this->settlementRepository->findBy(['vendor' => $vendorTommy]);
+ [$weeklyStartDate, $weeklyEndDate] = $this->getStartAndEndDate('weekly');
+ [$monthlyStartDate, $monthlyEndDate] = $this->getStartAndEndDate('monthly');
+ [$quarterlyStartDate, $quarterlyEndDate] = $this->getStartAndEndDate('quarterly');
+
+ $this->assertCount(2, $settlementsVendorWayne);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 540,
+ 'totalCommissionAmount' => 35,
+ 'startDate' => $monthlyStartDate,
+ 'endDate' => $monthlyEndDate,
+ 'channel' => $channelUs,
+ ],
+ $settlementsVendorWayne[0]
+ );
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 1002,
+ 'totalCommissionAmount' => 70,
+ 'startDate' => $monthlyStartDate,
+ 'endDate' => $monthlyEndDate,
+ 'channel' => $channelEu,
+ ],
+ $settlementsVendorWayne[1]
+ );
+
+ $this->assertCount(2, $settlementsVendorWeyland);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 0,
+ 'totalCommissionAmount' => 0,
+ 'startDate' => $weeklyStartDate,
+ 'endDate' => $weeklyEndDate,
+ 'channel' => $channelUs,
+ ],
+ $settlementsVendorWeyland[0]
+ );
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 700,
+ 'totalCommissionAmount' => 100,
+ 'startDate' => $weeklyStartDate,
+ 'endDate' => $weeklyEndDate,
+ 'channel' => $channelEu,
+ ],
+ $settlementsVendorWeyland[1]
+ );
+
+ $this->assertCount(2, $settlementsVendorTommy);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 400,
+ 'totalCommissionAmount' => 10,
+ 'startDate' => $quarterlyStartDate,
+ 'endDate' => $quarterlyEndDate,
+ 'channel' => $channelUs,
+ ],
+ $settlementsVendorTommy[0]
+ );
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 0,
+ 'totalCommissionAmount' => 0,
+ 'startDate' => $quarterlyStartDate,
+ 'endDate' => $quarterlyEndDate,
+ 'channel' => $channelEu,
+ ],
+ $settlementsVendorTommy[1]
+ );
+ }
+
+ public function test_it_not_generates_settlements_for_if_settlement_already_exist(): void
+ {
+ $this->loadFixturesFromFile('SettlementGenerateCommandTest/test_it_not_generates_settlements_for_if_settlement_already_exist.yaml');
+ $settlements = $this->settlementRepository->findAll();
+ $vendorWeyland = $this->vendorRepository->findOneBySlug('Weyland-Corp');
+ $vendorWayne = $this->vendorRepository->findOneBySlug('Wayne-Enterprises-Inc');
+ $channelEu = $this->channelRepository->findOneBy(['code' => 'EU']);
+ $channelUs = $this->channelRepository->findOneBy(['code' => 'US']);
+ [$startDate, $endDate] = $this->getStartAndEndDate('weekly');
+ $this->assertCount(1, $settlements);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 1002,
+ 'totalCommissionAmount' => 70,
+ 'startDate' => $startDate,
+ 'endDate' => $endDate,
+ 'channel' => $channelEu,
+ ],
+ $settlements[0]
+ );
+
+ $this->commandTester->execute([]);
+ $this->commandTester->assertCommandIsSuccessful();
+ $settlementsVendorWeyland = $this->settlementRepository->findBy(['vendor' => $vendorWeyland]);
+ $settlementsVendorWayne = $this->settlementRepository->findBy(['vendor' => $vendorWayne]);
+ $this->assertCount(2, $settlementsVendorWayne);
+ $this->assertSame($settlements[0], $settlementsVendorWayne[0]);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 540,
+ 'totalCommissionAmount' => 35,
+ 'startDate' => $startDate,
+ 'endDate' => $endDate,
+ 'channel' => $channelUs,
+ ],
+ $settlementsVendorWayne[1]
+ );
+
+ $this->assertCount(2, $settlementsVendorWeyland);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 0,
+ 'totalCommissionAmount' => 0,
+ 'startDate' => $startDate,
+ 'endDate' => $endDate,
+ 'channel' => $channelUs,
+ ],
+ $settlementsVendorWeyland[0]
+ );
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 700,
+ 'totalCommissionAmount' => 100,
+ 'startDate' => $startDate,
+ 'endDate' => $endDate,
+ 'channel' => $channelEu,
+ ],
+ $settlementsVendorWeyland[1]
+ );
+ }
+
+ public function test_it_generates_settlements_for_incomplete_period(): void
+ {
+ $this->loadFixturesFromFile('SettlementGenerateCommandTest/test_it_generates_settlements_for_incomplete_period.yaml');
+ $settlements = $this->settlementRepository->findAll();
+ $vendorWayne = $this->vendorRepository->findOneBySlug('Wayne-Enterprises-Inc');
+ $channelUs = $this->channelRepository->findOneBy(['code' => 'US']);
+ $channelEu = $this->channelRepository->findOneBy(['code' => 'EU']);
+
+ [$startDate, $endDate] = $this->getStartAndEndDate('weekly');
+
+ /** @var OrderInterface $lastWayneOrder */
+ $lastWayneOrder = $this->orderRepository->findOneBy(['vendor' => $vendorWayne], ['paidAt' => 'DESC']);
+
+ $to = \DateTime::createFromInterface($lastWayneOrder->getPaidAt())->modify('- 1 hour');
+ $from = new \DateTime('last week monday');
+
+ $settlement = $settlements[0];
+ $settlement->setStartDate($from);
+ $settlement->setEndDate($to);
+
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 1002,
+ 'totalCommissionAmount' => 70,
+ 'startDate' => $from,
+ 'endDate' => $to,
+ 'channel' => $channelEu,
+ ],
+ $settlement
+ );
+
+ $this->getEntityManager()->flush();
+
+ $this->commandTester->execute([]);
+ $this->commandTester->assertCommandIsSuccessful();
+ $settlementsVendorWayne = $this->settlementRepository->findBy(['vendor' => $vendorWayne]);
+ $this->assertCount(3, $settlementsVendorWayne);
+ $this->assertSame($settlements[0], $settlementsVendorWayne[0]);
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 0,
+ 'totalCommissionAmount' => 0,
+ 'startDate' => $startDate,
+ 'endDate' => $endDate,
+ 'channel' => $channelUs,
+ ],
+ $settlementsVendorWayne[1]
+ );
+
+ $this->assertSettlementSame(
+ [
+ 'totalAmount' => 540,
+ 'totalCommissionAmount' => 35,
+ 'startDate' => \DateTime::createFromInterface($settlement->getEndDate())->modify('+ 1 second'),
+ 'endDate' => $endDate,
+ 'channel' => $channelEu,
+ ],
+ $settlementsVendorWayne[2]
+ );
+ }
+
+ private function getStartAndEndDate(string $frequency): array
+ {
+ return match ($frequency) {
+ 'weekly' => [
+ new \DateTime('last week monday 00:00:00'),
+ new \DateTime('last week sunday 23:59:59'),
+ ],
+ 'monthly' => [
+ new \DateTime('first day of last month 00:00:00'),
+ new \DateTime('last day of last month 23:59:59'),
+ ],
+ 'quarterly' => [
+ (new \DateTime())->setTimestamp(QuarterlySettlementPeriodResolver::getLastQuarterStartDate()),
+ (new \DateTime())->setTimestamp(QuarterlySettlementPeriodResolver::getLastQuarterEndDate()),
+ ],
+ };
+ }
+
+ private function assertSettlementSame(array $expected, SettlementInterface $actual): void
+ {
+ $this->assertSame($expected['totalAmount'], $actual->getTotalAmount());
+ $this->assertSame($expected['totalCommissionAmount'], $actual->getTotalCommissionAmount());
+ $this->assertSame($expected['startDate']->getTimestamp(), $actual->getStartDate()->getTimestamp());
+ $this->assertSame($expected['endDate']->getTimestamp(), $actual->getEndDate()->getTimestamp());
+ $this->assertSame($expected['channel'], $actual->getChannel());
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Converter/AttributesConverterTest.php b/OpenMarketplace/tests/Integration/Converter/AttributesConverterTest.php
new file mode 100644
index 0000000..28b48d1
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Converter/AttributesConverterTest.php
@@ -0,0 +1,43 @@
+entityManager = $this->getContainer()
+ ->get('doctrine')
+ ->getManager()
+ ;
+
+ $this->attributesConverter = $this->getContainer()->get('bitbag.open_marketplace.component.product_listing.draft_converter.operator.attributes');
+ }
+
+ public function test_it_removes_attributes_from_product(): void
+ {
+ $this->loadFixturesFromFile('AttributesConverterTest/test_it_removes_attributes_from_product.yaml');
+ $draft = $this->entityManager->getRepository(Draft::class)->findAll()[0];
+
+ $productListing = $draft->getProductListing();
+ $product = $productListing->getProduct();
+
+ $this->assertCount(1, $product->getAttributes());
+
+ $this->attributesConverter->convert($draft, $product);
+ $this->entityManager->flush();
+
+ $freshProduct = $this->entityManager->getRepository(Product::class)->findAll()[0];
+ $this->entityManager->refresh($freshProduct);
+
+ $this->assertCount(0, $freshProduct->getAttributes());
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Custom/Vendor/BackgroundImageCascadesTest.php b/OpenMarketplace/tests/Integration/Custom/Vendor/BackgroundImageCascadesTest.php
new file mode 100644
index 0000000..9361da9
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Custom/Vendor/BackgroundImageCascadesTest.php
@@ -0,0 +1,42 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->vendorRepository = $this->entityManager->getRepository(Vendor::class);
+
+ $this->backgroundImageRepository = $this->entityManager->getRepository(BackgroundImage::class);
+ }
+
+ public function test_it_removes_background_image_only(): void
+ {
+ $this->loadFixturesFromFile('BackgroundImageCascadesTest/cascade_tests.yaml');
+
+ /** @var VendorInterface $vendor */
+ $vendor = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ /** @var BackgroundImage $vendorImage */
+ $vendorImage = $this->backgroundImageRepository->findOneBy(['owner' => $vendor]);
+ $this->backgroundImageRepository->remove($vendorImage);
+
+ self::assertSame($vendor->getSlug(), 'Weyland-Corp');
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/AttributesConverterTest/test_it_removes_attributes_from_product.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/AttributesConverterTest/test_it_removes_attributes_from_product.yaml
new file mode 100644
index 0000000..65008f5
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/AttributesConverterTest/test_it_removes_attributes_from_product.yaml
@@ -0,0 +1,88 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'oliver@queen.com'
+ emailCanonical: 'oliver@queen.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@wayne.co'
+ emailCanonical: 'bruce.wayne@wayne.co'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'someslug'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+Sylius\Component\Product\Model\ProductAttributeTranslation:
+ attributeTranslation1:
+ locale: de
+ name: 'Becher Sammlung'
+ translatable: '@productAttribute1'
+ attributeTranslation2:
+ locale: en_US
+ name: 'Mug collection'
+ translatable: '@productAttribute1'
+Sylius\Component\Product\Model\ProductAttribute:
+ productAttribute1:
+ translatable: true
+ fallbackLocale: en_US
+ currentLocale: de
+ code: mug_material
+ type: text
+ storage_type: text
+ translations:
+ - '@attributeTranslation1'
+ - '@attributeTranslation2'
+Sylius\Component\Product\Model\ProductAttributeValue:
+ test_value:
+ subject: '@some_product'
+ attribute: '@productAttribute1'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ attribute:
+ vendor: '@vendor_oliver'
+ storage_type: 'text'
+ code: 'test_code'
+ productAttribute: '@productAttribute1'
+BitBag\OpenMarketPlace\Component\Product\Entity\Product:
+ some_product:
+ code: 'test_code'
+ vendor: '@vendor_oliver'
+ attributes:
+ - '@test_value'
+BitBag\OpenMarketPlace\Component\ProductListing\Entity\Listing:
+ test_listing:
+ code: 'test_code'
+ vendor: '@vendor_oliver'
+ product: '@some_product'
+BitBag\OpenMarketPlace\Component\ProductListing\Entity\Draft:
+ some_draft:
+ code: 'test_code'
+ productListing: '@test_listing'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/BackgroundImageCascadesTest/cascade_tests.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/BackgroundImageCascadesTest/cascade_tests.yaml
new file mode 100644
index 0000000..7b4ae82
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/BackgroundImageCascadesTest/cascade_tests.yaml
@@ -0,0 +1,111 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'CODE'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address_bruce:
+ country: '@country_us'
+ city: 'Arkham City'
+ postalCode: '00000'
+ street: 'Avenue 2115'
+ vendor_address_peter:
+ country: '@country_us'
+ city: 'San Francisco'
+ postalCode: '94016'
+ street: 'Unknown 1'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ vendorAddress: '@vendor_address_bruce'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL14109024029586826934815556'
+ phoneNumber: '555444333'
+ vendorAddress: '@vendor_address_peter'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Vendor\Entity\LogoImage:
+ vendor_image_peter:
+ owner: '@vendor_peter'
+ path: '/dummy/file/path'
+BitBag\OpenMarketplace\Component\Vendor\Entity\BackgroundImage:
+ vendor_backgroundimage_peter:
+ owner: '@vendor_peter'
+ path: '/dummy/file/path'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ChannelRepositoryTest/test_it_finds_all_enabled_channels.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ChannelRepositoryTest/test_it_finds_all_enabled_channels.yaml
new file mode 100644
index 0000000..17e72ae
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ChannelRepositoryTest/test_it_finds_all_enabled_channels.yaml
@@ -0,0 +1,32 @@
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_de:
+ code: 'DE'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_disabled:
+ code: 'disabled'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: false
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ChannelRepositoryTest/test_it_finds_enabled_channel_by_code.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ChannelRepositoryTest/test_it_finds_enabled_channel_by_code.yaml
new file mode 100644
index 0000000..70e6e54
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ChannelRepositoryTest/test_it_finds_enabled_channel_by_code.yaml
@@ -0,0 +1,16 @@
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ConversationRepositoryTest/test_it_finds_all_conversations_with_status_and_user.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ConversationRepositoryTest/test_it_finds_all_conversations_with_status_and_user.yaml
new file mode 100644
index 0000000..bdb83e5
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ConversationRepositoryTest/test_it_finds_all_conversations_with_status_and_user.yaml
@@ -0,0 +1,57 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'oliver@queen.com'
+ emailCanonical: 'oliver@queen.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@wayne.co'
+ emailCanonical: 'bruce.wayne@wayne.co'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'someslug'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Messaging\Entity\Conversation:
+ opened_conversation_with_oliver:
+ shopUser: '@user_oliver'
+ status: 'open'
+ closed_conversation_with_oliver:
+ shopUser: '@user_oliver'
+ status: 'closed'
+ opened_conversation_with_bruce:
+ shopUser: '@user_bruce'
+ status: 'open'
+ closed_conversation_with_bruce:
+ shopUser: '@user_bruce'
+ status: 'closed'
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/CustomerRepositoryTest/test_it_finds_all_customers_of_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/CustomerRepositoryTest/test_it_finds_all_customers_of_vendor.yaml
new file mode 100644
index 0000000..de3c19b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/CustomerRepositoryTest/test_it_finds_all_customers_of_vendor.yaml
@@ -0,0 +1,77 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ vendor: '@vendor_oliver'
+ code: 'code'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/CustomerRepositoryTest/test_it_finds_order_for_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/CustomerRepositoryTest/test_it_finds_order_for_vendor.yaml
new file mode 100644
index 0000000..de3c19b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/CustomerRepositoryTest/test_it_finds_order_for_vendor.yaml
@@ -0,0 +1,77 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ vendor: '@vendor_oliver'
+ code: 'code'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/DraftAttributeRepositoryTest/test_it_finds_all_draft_attributes_for_given_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/DraftAttributeRepositoryTest/test_it_finds_all_draft_attributes_for_given_vendor.yaml
new file mode 100644
index 0000000..2d78526
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/DraftAttributeRepositoryTest/test_it_finds_all_draft_attributes_for_given_vendor.yaml
@@ -0,0 +1,117 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'code'
+ name: 'name'
+ default_locale: '@locale'
+ tax_calculation_strategy: 'order_items_based'
+ base_currency: '@dollar'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+ bruce_vendor_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@bruce_vendor_address'
+ slug: 'bruce-wayne-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeTranslation:
+ translation1:
+ translatable: '@first_olivers_attribute'
+ name: 'name1'
+ locale: '@locale'
+ translation2:
+ translatable: '@second_olivers_attribute'
+ name: 'name2'
+ locale: '@locale'
+ translation3:
+ translatable: '@first_bruces_attribute'
+ name: 'name3'
+ locale: '@locale'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ first_olivers_attribute:
+ addTranslation: '@translation1'
+ currentLocale: '@locale'
+ vendor: '@vendor_oliver'
+ code: 'testcode1'
+ name: 'testname1'
+ type: 'checkbox'
+ storage_type: 'boolean'
+ translatable: false
+ second_olivers_attribute:
+ addTranslation: '@translation2'
+ currentLocale: '@locale'
+ vendor: '@vendor_oliver'
+ code: 'testcode2'
+ name: 'testname2'
+ type: 'checkbox'
+ storage_type: 'boolean'
+ first_bruces_attribute:
+ addTranslation: '@translation3'
+ currentLocale: '@locale'
+ vendor: '@vendor_bruce'
+ code: 'testcode3'
+ name: 'testname3'
+ type: 'checkbox'
+ storage_type: 'boolean'
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_counts_order_for_settlement.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_counts_order_for_settlement.yaml
new file mode 100644
index 0000000..04952d3
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_counts_order_for_settlement.yaml
@@ -0,0 +1,312 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ createdAt: ''
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ channels: [ '@channel_us' ]
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: 'peter_2'
+ enabled: true
+ channels: [ '@channel_us' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: 'peter_1_1'
+ enabled: true
+ onHand: 3
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1_us:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_us:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_us:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'US'
+ productVariant: '@product_variant_product_peter_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ channel: '@channel_us'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ paid_at: ''
+ commission_total: 35
+ channel: '@channel_us'
+ bruce_order_made_by_john_2_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ paid_at: ''
+ channel: '@channel_us'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ paid_at: ''
+ commission_total: 70
+ channel: '@channel_us'
+ peter_order_made_by_john_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john_main'
+ channel: '@channel_us'
+ peter_order_made_by_john:
+ primaryOrder: '@peter_order_made_by_john'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
+ paid_at: ''
+ commission_total: 100
+ channel: '@channel_us'
+ order_made_by_peter_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_main'
+ channel: '@channel_us'
+ order_made_by_peter:
+ primaryOrder: '@order_made_by_peter_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter'
+ paid_at: ''
+ commission_total: 10
+ channel: '@channel_us'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ unit_price: 540
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ unit_price: 1002
+ peter_order_made_by_john_1_item_1:
+ order: '@peter_order_made_by_john'
+ variant: '@product_variant_product_peter_1_1'
+ unit_price: 700
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+ peter_order_made_by_john_shipment:
+ vendor: '@vendor_peter'
+ order: '@peter_order_made_by_john'
+ method: '@shipping_method_ups'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_1_item_1' ]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+ bruce_order_made_by_john_2_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_2_item_1' ]
+ shipment: '@bruce_order_made_by_john_2_shipment'
+ peter_order_made_by_john_1_item_1_unit:
+ __construct: [ '@peter_order_made_by_john_1_item_1' ]
+ shipment: '@peter_order_made_by_john_shipment'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement:
+ vendor: '@vendor_bruce'
+ total_amount: 1002
+ total_commission_amount: 70
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_create_query_builder_to_find_order_for_settlement.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_create_query_builder_to_find_order_for_settlement.yaml
new file mode 100644
index 0000000..04952d3
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_create_query_builder_to_find_order_for_settlement.yaml
@@ -0,0 +1,312 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ createdAt: ''
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ channels: [ '@channel_us' ]
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: 'peter_2'
+ enabled: true
+ channels: [ '@channel_us' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: 'peter_1_1'
+ enabled: true
+ onHand: 3
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1_us:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_us:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_us:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'US'
+ productVariant: '@product_variant_product_peter_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ channel: '@channel_us'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ paid_at: ''
+ commission_total: 35
+ channel: '@channel_us'
+ bruce_order_made_by_john_2_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ paid_at: ''
+ channel: '@channel_us'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ paid_at: ''
+ commission_total: 70
+ channel: '@channel_us'
+ peter_order_made_by_john_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john_main'
+ channel: '@channel_us'
+ peter_order_made_by_john:
+ primaryOrder: '@peter_order_made_by_john'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
+ paid_at: ''
+ commission_total: 100
+ channel: '@channel_us'
+ order_made_by_peter_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_main'
+ channel: '@channel_us'
+ order_made_by_peter:
+ primaryOrder: '@order_made_by_peter_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter'
+ paid_at: ''
+ commission_total: 10
+ channel: '@channel_us'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ unit_price: 540
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ unit_price: 1002
+ peter_order_made_by_john_1_item_1:
+ order: '@peter_order_made_by_john'
+ variant: '@product_variant_product_peter_1_1'
+ unit_price: 700
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+ peter_order_made_by_john_shipment:
+ vendor: '@vendor_peter'
+ order: '@peter_order_made_by_john'
+ method: '@shipping_method_ups'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_1_item_1' ]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+ bruce_order_made_by_john_2_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_2_item_1' ]
+ shipment: '@bruce_order_made_by_john_2_shipment'
+ peter_order_made_by_john_1_item_1_unit:
+ __construct: [ '@peter_order_made_by_john_1_item_1' ]
+ shipment: '@peter_order_made_by_john_shipment'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement:
+ vendor: '@vendor_bruce'
+ total_amount: 1002
+ total_commission_amount: 70
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_all_vendor_orders.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_all_vendor_orders.yaml
new file mode 100644
index 0000000..de3c19b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_all_vendor_orders.yaml
@@ -0,0 +1,77 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ vendor: '@vendor_oliver'
+ code: 'code'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_for_settlement.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_for_settlement.yaml
new file mode 100644
index 0000000..9f619bd
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_for_settlement.yaml
@@ -0,0 +1,332 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: 'peter_2'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: 'peter_1_1'
+ enabled: true
+ onHand: 3
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1_us:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_us:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_us:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'US'
+ productVariant: '@product_variant_product_peter_1_1'
+ pricing_product_variant_product_bruce_1_1_eu:
+ price: 9
+ originalPrice: 14
+ minimumPrice: 0
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_eu:
+ price: 12
+ originalPrice: 24
+ minimumPrice: 9
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_eu:
+ price: 8
+ originalPrice: 11
+ minimumPrice: 4
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_peter_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ channel: '@channel_us'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ paid_at: ''
+ commission_total: 35
+ channel: '@channel_us'
+ bruce_order_made_by_john_2_main:
+ mode: 'primary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ channel: '@channel_us'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: 'secondary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ paid_at: ''
+ commission_total: 70
+ channel: '@channel_us'
+ peter_order_made_by_john_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john_main'
+ channel: '@channel_us'
+ peter_order_made_by_john:
+ primaryOrder: '@peter_order_made_by_john'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
+ paid_at: ''
+ commission_total: 100
+ channel: '@channel_us'
+ order_made_by_peter_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_main'
+ channel: '@channel_us'
+ order_made_by_peter:
+ primaryOrder: '@order_made_by_peter_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter'
+ paid_at: ''
+ commission_total: 10
+ channel: '@channel_us'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ unit_price: 540
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ unit_price: 1002
+ peter_order_made_by_john_1_item_1:
+ order: '@peter_order_made_by_john'
+ variant: '@product_variant_product_peter_1_1'
+ unit_price: 700
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+ peter_order_made_by_john_shipment:
+ vendor: '@vendor_peter'
+ order: '@peter_order_made_by_john'
+ method: '@shipping_method_ups'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_1_item_1' ]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+ bruce_order_made_by_john_2_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_2_item_1' ]
+ shipment: '@bruce_order_made_by_john_2_shipment'
+ peter_order_made_by_john_1_item_1_unit:
+ __construct: [ '@peter_order_made_by_john_1_item_1' ]
+ shipment: '@peter_order_made_by_john_shipment'
+
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_order_for_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_order_for_vendor.yaml
new file mode 100644
index 0000000..de3c19b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_order_for_vendor.yaml
@@ -0,0 +1,77 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ vendor: '@vendor_oliver'
+ code: 'code'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_orders_for_vendors_customer.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_orders_for_vendors_customer.yaml
new file mode 100644
index 0000000..de3c19b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/OrderRepositoryTest/test_it_finds_orders_for_vendors_customer.yaml
@@ -0,0 +1,77 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ vendor: '@vendor_oliver'
+ code: 'code'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductDraftFilesOperatorTest/test_it_copies_draft_images_to_product.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductDraftFilesOperatorTest/test_it_copies_draft_images_to_product.yaml
new file mode 100644
index 0000000..c4e1ecc
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductDraftFilesOperatorTest/test_it_copies_draft_images_to_product.yaml
@@ -0,0 +1,48 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'oliver@queen.com'
+ emailCanonical: 'oliver@queen.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@wayne.co'
+ emailCanonical: 'bruce.wayne@wayne.co'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ description: 'description'
+ slug: 'test-slug'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Listing:
+ listing:
+ createdAt: ''
+ code: 'Test'
+ vendor: '@vendor_oliver'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft.yaml
new file mode 100644
index 0000000..d4440b1
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft.yaml
@@ -0,0 +1,87 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+ bruce_vendor_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@bruce_vendor_address'
+ slug: 'bruce-wayne-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Listing:
+ product_listing_oliver_1:
+ vendor: '@vendor_oliver'
+ code: 'Oliver product'
+ product_listing_oliver_2:
+ vendor: '@vendor_oliver'
+ code: 'Oliver product 2'
+ product_listing_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'Bruce product'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Draft:
+ product_draft_oliver_1_1:
+ product_listing: '@product_listing_oliver_1'
+ version_number: '1'
+ product_draft_oliver_1_2:
+ product_listing: '@product_listing_oliver_1'
+ version_number: '2'
+ product_draft_oliver_2_1:
+ product_listing: '@product_listing_oliver_2'
+ version_number: '1'
+ product_draft_bruce_1:
+ product_listing: '@product_listing_bruce_1'
+ version_number: '1'
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft_by_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft_by_vendor.yaml
new file mode 100644
index 0000000..d4440b1
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft_by_vendor.yaml
@@ -0,0 +1,87 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+ bruce_vendor_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@bruce_vendor_address'
+ slug: 'bruce-wayne-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Listing:
+ product_listing_oliver_1:
+ vendor: '@vendor_oliver'
+ code: 'Oliver product'
+ product_listing_oliver_2:
+ vendor: '@vendor_oliver'
+ code: 'Oliver product 2'
+ product_listing_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'Bruce product'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Draft:
+ product_draft_oliver_1_1:
+ product_listing: '@product_listing_oliver_1'
+ version_number: '1'
+ product_draft_oliver_1_2:
+ product_listing: '@product_listing_oliver_1'
+ version_number: '2'
+ product_draft_oliver_2_1:
+ product_listing: '@product_listing_oliver_2'
+ version_number: '1'
+ product_draft_bruce_1:
+ product_listing: '@product_listing_bruce_1'
+ version_number: '1'
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductRepositoryTest/test_it_finds_vendor_products.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductRepositoryTest/test_it_finds_vendor_products.yaml
new file mode 100644
index 0000000..6d11cc7
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductRepositoryTest/test_it_finds_vendor_products.yaml
@@ -0,0 +1,139 @@
+Sylius\Component\Addressing\Model\Country:
+ USA:
+ code: 'US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'code'
+ name: 'name'
+ locales:
+ - '@locale'
+ default_locale: '@locale'
+ tax_calculation_strategy: 'order_items_based'
+ base_currency: '@dollar'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@USA'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+Sylius\Component\Taxonomy\Model\TaxonTranslation:
+ taxon_translation:
+ locale: 'en_US'
+ name: 'dsa'
+ slug: 'dsa'
+Sylius\Component\Core\Model\Taxon:
+ taxon:
+ code: 'menu_category'
+ translations:
+ - '@taxon_translation'
+ enabled: true
+Sylius\Component\Core\Model\ProductTranslation:
+ first_product_US_translation:
+ name: 'test_name1'
+ slug: 'test_slug1'
+ locale: 'en_US'
+ second_product_US_translation:
+ name: 'test_name2'
+ slug: 'test_slug2'
+ locale: 'en_US'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ mainTaxon: '@taxon'
+ vendor: '@vendor_oliver'
+ code: 'code'
+ channels:
+ - '@channel'
+ translations:
+ - '@first_product_US_translation'
+ second_product:
+ mainTaxon: '@taxon'
+ vendor: '@vendor_oliver'
+ code: 'code2'
+ channels:
+ - '@channel'
+ translations:
+ - '@second_product_US_translation'
+ third_product_without_translation:
+ mainTaxon: '@taxon'
+ vendor: '@vendor_oliver'
+ code: 'code3'
+ channels:
+ - '@channel'
+Sylius\Component\Core\Model\ProductTaxon:
+ firs_relation:
+ taxon: '@taxon'
+ product: '@first_product'
+ second_relation:
+ taxon: '@taxon'
+ product: '@second_product'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductReviewRepositoryTest/found_product_reviews_for_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductReviewRepositoryTest/found_product_reviews_for_vendor.yaml
new file mode 100644
index 0000000..d3c30bd
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductReviewRepositoryTest/found_product_reviews_for_vendor.yaml
@@ -0,0 +1,93 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_adam:
+ firstName: 'Adam'
+ lastName: 'Ondra'
+ email: 'adam@example.com'
+ emailCanonical: 'adam@example.com'
+ customer_alex:
+ firstName: 'Alex'
+ lastName: 'Honnold'
+ email: 'alex@example.com'
+ emailCanonical: 'alex@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_adam:
+ plainPassword: 'password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_adam'
+ username: 'adam@ondra.com'
+ usernameCanonical: 'adam@ondara.com'
+ user_alex:
+ plainPassword: 'password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_alex'
+ username: 'alex@honnold.com'
+ usernameCanonical: 'alex@honnold.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_adam_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+ vendor_alex_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 20'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_adam:
+ shopUser: '@user_adam'
+ companyName: 'Skalnik'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_adam_address'
+ slug: 'adam-ondra-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_alex:
+ shopUser: '@user_alex'
+ companyName: '8a'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '123432234'
+ vendorAddress: '@vendor_alex_address'
+ slug: 'alex-honnold-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_adam_1:
+ vendor: '@vendor_adam'
+ code: 'Harness-adam'
+ product_adam_2:
+ vendor: '@vendor_adam'
+ code: 'Climbing boots-adam'
+ product_alex_1:
+ vendor: '@vendor_alex'
+ code: 'Harness-alex'
+Sylius\Component\Core\Model\ProductReview:
+ first_product_review:
+ title: 'Product Review'
+ comment: 'comment'
+ rating: '3'
+ author: '@customer_alex'
+ reviewSubject: '@product_adam_1'
+ second_product_review:
+ title: 'Best Product Review'
+ comment: 'comment'
+ rating: '5'
+ author: '@customer_alex'
+ reviewSubject: '@product_adam_2'
+ third_product_review:
+ title: 'Good Product Review'
+ comment: 'comment'
+ rating: '4'
+ author: '@customer_adam'
+ reviewSubject: '@product_alex_1'
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductReviewRepositoryTest/not_found_product_reviews_for_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductReviewRepositoryTest/not_found_product_reviews_for_vendor.yaml
new file mode 100644
index 0000000..10c80c6
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/ProductReviewRepositoryTest/not_found_product_reviews_for_vendor.yaml
@@ -0,0 +1,93 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_adam:
+ firstName: 'Adam'
+ lastName: 'Ondra'
+ email: 'adam@example.com'
+ emailCanonical: 'adam@example.com'
+ customer_alex:
+ firstName: 'Alex'
+ lastName: 'Honnold'
+ email: 'alex@example.com'
+ emailCanonical: 'alex@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_adam:
+ plainPassword: 'password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_adam'
+ username: 'adam@ondra.com'
+ usernameCanonical: 'adam@ondara.com'
+ user_alex:
+ plainPassword: 'password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_alex'
+ username: 'alex@honnold.com'
+ usernameCanonical: 'alex@honnold.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_adam_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+ vendor_alex_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 20'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_adam:
+ shopUser: '@user_adam'
+ companyName: 'Skalnik'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_adam_address'
+ slug: 'adam-ondra-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_alex:
+ shopUser: '@user_alex'
+ companyName: '8a'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '123432234'
+ vendorAddress: '@vendor_alex_address'
+ slug: 'alex-honnold-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_adam_1:
+ vendor: '@vendor_adam'
+ code: 'Harness-adam'
+ product_adam_2:
+ vendor: '@vendor_adam'
+ code: 'Climbing boots-adam'
+ product_alex_1:
+ vendor: '@vendor_alex'
+ code: 'Harness-alex'
+Sylius\Component\Core\Model\ProductReview:
+ first_product_review:
+ title: 'Product Review'
+ comment: 'comment'
+ rating: '3'
+ author: '@customer_alex'
+ reviewSubject: '@product_adam_1'
+ second_product_review:
+ title: 'Best Product Review'
+ comment: 'comment'
+ rating: '5'
+ author: '@customer_alex'
+ reviewSubject: '@product_adam_2'
+ third_product_review:
+ title: 'Good Product Review'
+ comment: 'comment'
+ rating: '4'
+ author: '@customer_adam'
+ reviewSubject: '@product_adam_1'
+
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_generates_settlements_for_all_vendors.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_generates_settlements_for_all_vendors.yaml
new file mode 100644
index 0000000..ba1e990
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_generates_settlements_for_all_vendors.yaml
@@ -0,0 +1,454 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+ customer_tommy:
+ firstName: 'Tommy'
+ lastName: 'Mush'
+ email: 'tommy.mush@example.com'
+ emailCanonical: 'tommy.mush@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+ user_tommy:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_tommy'
+ username: 'tommy.mush@example.com'
+ usernameCanonical: 'tommy.mush@example.com'
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ createdAt: ''
+ settlement_frequency: 'monthly'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ settlement_frequency: 'weekly'
+ vendor_tommy:
+ shopUser: '@user_tommy'
+ companyName: 'Tommy Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'NL78INGB4783095582'
+ phoneNumber: '555444333'
+ slug: 'Tommy-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ settlement_frequency: 'quarterly'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: 'peter_1'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ product_tommy_1:
+ vendor: '@vendor_tommy'
+ code: 'tommy_1'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ tracked: false
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ tracked: false
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: 'peter_1_1'
+ enabled: true
+ tracked: false
+ product_variant_product_tommy_1_1:
+ product: '@product_tommy_1'
+ code: 'tommy_1_1'
+ enabled: true
+ tracked: false
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1_us:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_us:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_us:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'US'
+ productVariant: '@product_variant_product_peter_1_1'
+ pricing_product_variant_product_bruce_1_1_eu:
+ price: 9
+ originalPrice: 14
+ minimumPrice: 0
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_eu:
+ price: 12
+ originalPrice: 24
+ minimumPrice: 9
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_eu:
+ price: 8
+ originalPrice: 11
+ minimumPrice: 4
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_peter_1_1'
+ pricing_product_variant_product_tommy_1_1_eu:
+ price: 20
+ originalPrice: 50
+ minimumPrice: 30
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_tommy_1_1'
+ pricing_product_variant_product_tommy_1_1_us:
+ price: 23
+ originalPrice: 78
+ minimumPrice: 45
+ channelCode: 'US'
+ productVariant: '@product_variant_product_tommy_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ channel: '@channel_us'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ paid_at: ''
+ commission_total: 35
+ channel: '@channel_us'
+ bruce_order_made_by_john_2_main:
+ mode: 'primary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ channel: '@channel_eu'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: 'secondary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ paid_at: ''
+ commission_total: 70
+ channel: '@channel_eu'
+ peter_order_made_by_john_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john_main'
+ channel: '@channel_eu'
+ peter_order_made_by_john:
+ primaryOrder: '@peter_order_made_by_john'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
+ paid_at: ''
+ commission_total: 100
+ channel: '@channel_eu'
+ tommy_order_made_by_peter_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'tommy_order_made_by_peter_main'
+ channel: '@channel_us'
+ tommy_order_made_by_peter:
+ primaryOrder: '@tommy_order_made_by_peter_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ vendor: '@vendor_tommy'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'tommy_order_made_by_peter'
+ paid_at: ''
+ commission_total: 10
+ channel: '@channel_us'
+ tommy_order_made_by_john_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'tommy_order_made_by_john_main'
+ channel: '@channel_us'
+ tommy_order_made_by_john:
+ primaryOrder: '@tommy_order_made_by_john_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ vendor: '@vendor_tommy'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'tommy_order_made_by_john'
+ paid_at: ''
+ commission_total: 10
+ channel: '@channel_us'
+ tommy_order_made_by_john_eu_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ channel: '@channel_eu'
+ tommy_order_made_by_john_eu:
+ primaryOrder: '@tommy_order_made_by_john_eu_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_tommy'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'tommy_order_made_by_john_eu'
+ paid_at: ''
+ commission_total: 55
+ channel: '@channel_eu'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ unit_price: 540
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ unit_price: 1002
+ peter_order_made_by_john_1_item_1:
+ order: '@peter_order_made_by_john'
+ variant: '@product_variant_product_peter_1_1'
+ unit_price: 700
+ tommy_order_made_by_john_eu_item_1:
+ order: '@tommy_order_made_by_john_eu'
+ variant: '@product_variant_product_tommy_1_1'
+ unit_price: 400
+ tommy_order_made_by_peter_item_1:
+ order: '@tommy_order_made_by_peter'
+ variant: '@product_variant_product_tommy_1_1'
+ unit_price: 400
+ tommy_order_made_by_john_item_1:
+ order: '@tommy_order_made_by_john'
+ variant: '@product_variant_product_tommy_1_1'
+ unit_price: 400
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+ tommy_order_made_by_john_eu_shipment:
+ vendor: '@vendor_bruce'
+ order: '@tommy_order_made_by_john_eu'
+ method: '@shipping_method_fedex'
+ tommy_order_made_by_peter_shipment:
+ vendor: '@vendor_bruce'
+ order: '@tommy_order_made_by_peter'
+ method: '@shipping_method_fedex'
+ tommy_order_made_by_john_shipment:
+ vendor: '@vendor_bruce'
+ order: '@tommy_order_made_by_john'
+ method: '@shipping_method_fedex'
+ peter_order_made_by_john_shipment:
+ vendor: '@vendor_peter'
+ order: '@peter_order_made_by_john'
+ method: '@shipping_method_ups'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_1_item_1' ]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+ bruce_order_made_by_john_2_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_2_item_1' ]
+ shipment: '@bruce_order_made_by_john_2_shipment'
+ peter_order_made_by_john_1_item_1_unit:
+ __construct: [ '@peter_order_made_by_john_1_item_1' ]
+ shipment: '@peter_order_made_by_john_shipment'
+ tommy_order_made_by_john_eu_item_1_unit:
+ __construct: [ '@tommy_order_made_by_john_eu_item_1' ]
+ shipment: '@tommy_order_made_by_john_eu_shipment'
+ tommy_order_made_by_peter_item_1_unit:
+ __construct: [ '@tommy_order_made_by_peter_item_1' ]
+ shipment: '@tommy_order_made_by_john_eu_shipment'
+ tommy_order_made_by_john_item_1_unit:
+ __construct: [ '@tommy_order_made_by_john_item_1' ]
+ shipment: '@tommy_order_made_by_john_shipment'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_generates_settlements_for_incomplete_period.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_generates_settlements_for_incomplete_period.yaml
new file mode 100644
index 0000000..f8555fa
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_generates_settlements_for_incomplete_period.yaml
@@ -0,0 +1,236 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ createdAt: ''
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ channels: [ '@channel_eu' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1_us:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_us:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_bruce_1_1_eu:
+ price: 9
+ originalPrice: 14
+ minimumPrice: 0
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_eu:
+ price: 12
+ originalPrice: 24
+ minimumPrice: 9
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_2'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ channel: '@channel_eu'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ paid_at: ''
+ commission_total: 35
+ channel: '@channel_eu'
+ bruce_order_made_by_john_2_main:
+ mode: 'primary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ channel: '@channel_eu'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: 'secondary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ paid_at: ''
+ commission_total: 70
+ channel: '@channel_eu'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ unit_price: 540
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ unit_price: 1002
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_1_item_1' ]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+ bruce_order_made_by_john_2_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_2_item_1' ]
+ shipment: '@bruce_order_made_by_john_2_shipment'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement:
+ vendor: '@vendor_bruce'
+ total_amount: 1002
+ total_commission_amount: 70
+ start_date: ''
+ end_date: ''
+ channel: '@channel_eu'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_not_generates_settlements_for_if_settlement_already_exist.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_not_generates_settlements_for_if_settlement_already_exist.yaml
new file mode 100644
index 0000000..99067a6
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_not_generates_settlements_for_if_settlement_already_exist.yaml
@@ -0,0 +1,340 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+ phoneNumber: 123456789
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+Sylius\Component\Core\Model\Address:
+ address_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ countryCode: 'US'
+ city: 'Arkham City'
+ postcode: '00000'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ createdAt: ''
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL17109024022586255711928552'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: 'peter_2'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: 'peter_1_1'
+ enabled: true
+ onHand: 3
+ tracked: true
+Sylius\Component\Core\Model\ChannelPricing:
+ pricing_product_variant_product_bruce_1_1_us:
+ price: 10
+ originalPrice: 15
+ minimumPrice: 0
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_us:
+ price: 13
+ originalPrice: 25
+ minimumPrice: 10
+ channelCode: 'US'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_us:
+ price: 9
+ originalPrice: 12
+ minimumPrice: 5
+ channelCode: 'US'
+ productVariant: '@product_variant_product_peter_1_1'
+ pricing_product_variant_product_bruce_1_1_eu:
+ price: 9
+ originalPrice: 14
+ minimumPrice: 0
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_1'
+ pricing_product_variant_product_bruce_1_2_eu:
+ price: 12
+ originalPrice: 24
+ minimumPrice: 9
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_bruce_1_2'
+ pricing_product_variant_product_peter_1_1_eu:
+ price: 8
+ originalPrice: 11
+ minimumPrice: 4
+ channelCode: 'EU'
+ productVariant: '@product_variant_product_peter_1_1'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1_main'
+ channel: '@channel_us'
+ bruce_order_made_by_john_1:
+ primaryOrder: '@bruce_order_made_by_john_1_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ shippingAddress: '@address_john'
+ billingAddress: '@address_john'
+ paid_at: ''
+ commission_total: 35
+ channel: '@channel_us'
+ bruce_order_made_by_john_2_main:
+ mode: 'primary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2_main'
+ paid_at: ''
+ channel: '@channel_eu'
+ bruce_order_made_by_john_2:
+ primaryOrder: '@bruce_order_made_by_john_2_main'
+ mode: 'secondary'
+ currency_code: 'EUR'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_2'
+ paid_at: ''
+ commission_total: 70
+ channel: '@channel_eu'
+ peter_order_made_by_john_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john_main'
+ channel: '@channel_eu'
+ peter_order_made_by_john:
+ primaryOrder: '@peter_order_made_by_john'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
+ paid_at: ''
+ commission_total: 100
+ channel: '@channel_eu'
+ order_made_by_peter_main:
+ mode: 'primary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter_main'
+ channel: '@channel_us'
+ order_made_by_peter:
+ primaryOrder: '@order_made_by_peter_main'
+ mode: 'secondary'
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'order_made_by_peter'
+ paid_at: ''
+ commission_total: 10
+ channel: '@channel_us'
+BitBag\OpenMarketplace\Component\Order\Entity\OrderItem:
+ bruce_order_made_by_john_1_item_1:
+ order: '@bruce_order_made_by_john_1'
+ variant: '@product_variant_product_bruce_1_1'
+ unit_price: 540
+ bruce_order_made_by_john_2_item_1:
+ order: '@bruce_order_made_by_john_2'
+ variant: '@product_variant_product_bruce_1_2'
+ unit_price: 1002
+ peter_order_made_by_john_1_item_1:
+ order: '@peter_order_made_by_john'
+ variant: '@product_variant_product_peter_1_1'
+ unit_price: 700
+BitBag\OpenMarketplace\Component\Order\Entity\Shipment:
+ bruce_order_made_by_john_1_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_1'
+ method: '@shipping_method_ups'
+ bruce_order_made_by_john_2_shipment:
+ vendor: '@vendor_bruce'
+ order: '@bruce_order_made_by_john_2'
+ method: '@shipping_method_fedex'
+ peter_order_made_by_john_shipment:
+ vendor: '@vendor_peter'
+ order: '@peter_order_made_by_john'
+ method: '@shipping_method_ups'
+Sylius\Component\Core\Model\OrderItemUnit:
+ bruce_order_made_by_john_1_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_1_item_1' ]
+ shipment: '@bruce_order_made_by_john_1_shipment'
+ bruce_order_made_by_john_2_item_1_unit:
+ __construct: [ '@bruce_order_made_by_john_2_item_1' ]
+ shipment: '@bruce_order_made_by_john_2_shipment'
+ peter_order_made_by_john_1_item_1_unit:
+ __construct: [ '@peter_order_made_by_john_1_item_1' ]
+ shipment: '@peter_order_made_by_john_shipment'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement:
+ vendor: '@vendor_bruce'
+ total_amount: 1002
+ total_commission_amount: 70
+ start_date: ''
+ end_date: ''
+ channel: '@channel_eu'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_throws_exception_if_period_resolver_for_settlement_frequency_does_not_exist.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_throws_exception_if_period_resolver_for_settlement_frequency_does_not_exist.yaml
new file mode 100644
index 0000000..8735ea0
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementGenerateCommandTest/test_it_throws_exception_if_period_resolver_for_settlement_frequency_does_not_exist.yaml
@@ -0,0 +1,87 @@
+Sylius\Component\Addressing\Model\Country:
+ country_pl:
+ code: 'PL'
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+ shipping_method_fedex:
+ code: 'fedex'
+ calculator: 'flat_rate'
+ zone: '@zone_us'
+ enabled: true
+ channels: [ '@channel_us', '@channel_eu' ]
+ configuration:
+ CODE:
+ amount: 5
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL31109024026812185484588836'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ createdAt: ''
+ settlement_frequency: 'daily'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_all_available_periods.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_all_available_periods.yaml
new file mode 100644
index 0000000..cbf950e
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_all_available_periods.yaml
@@ -0,0 +1,107 @@
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_tommy:
+ firstName: 'Tommy'
+ lastName: 'Doe'
+ email: 'tommy.doe@example.com'
+ emailCanonical: 'tommy.doe@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ user_tommy:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_tommy'
+ username: 'tommy.doe@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_tommy:
+ shopUser: '@user_tommy'
+ companyName: 'Tommy Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'NL41ABNA3195199319'
+ phoneNumber: '555123123'
+ slug: 'Tommy-Enterprises-Inc'
+ description: 'description'
+ commission: 15
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement_1:
+ vendor: '@vendor_bruce'
+ total_amount: 10600
+ total_commission_amount: 200
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_bruce_settlement_2:
+ vendor: '@vendor_bruce'
+ total_amount: 10000
+ total_commission_amount: 100
+ start_date: ''
+ end_date: ''
+ channel: '@channel_eu'
+ vendor_bruce_settlement_3:
+ vendor: '@vendor_bruce'
+ total_amount: 100500
+ total_commission_amount: 1029
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_tommy_settlement_1:
+ vendor: '@vendor_tommy'
+ total_amount: 100500
+ total_commission_amount: 1029
+ start_date: ''
+ end_date: ''
+ channel: '@channel_eu'
+ vendor_tommy_settlement_2:
+ vendor: '@vendor_tommy'
+ total_amount: 500
+ total_commission_amount: 10
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_all_settlements_by_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_all_settlements_by_vendor.yaml
new file mode 100644
index 0000000..cbf950e
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_all_settlements_by_vendor.yaml
@@ -0,0 +1,107 @@
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+ euro:
+ code: 'EUR'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+ channel_eu:
+ code: 'EU'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@euro'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_tommy:
+ firstName: 'Tommy'
+ lastName: 'Doe'
+ email: 'tommy.doe@example.com'
+ emailCanonical: 'tommy.doe@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ user_tommy:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_tommy'
+ username: 'tommy.doe@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_tommy:
+ shopUser: '@user_tommy'
+ companyName: 'Tommy Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'NL41ABNA3195199319'
+ phoneNumber: '555123123'
+ slug: 'Tommy-Enterprises-Inc'
+ description: 'description'
+ commission: 15
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement_1:
+ vendor: '@vendor_bruce'
+ total_amount: 10600
+ total_commission_amount: 200
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_bruce_settlement_2:
+ vendor: '@vendor_bruce'
+ total_amount: 10000
+ total_commission_amount: 100
+ start_date: ''
+ end_date: ''
+ channel: '@channel_eu'
+ vendor_bruce_settlement_3:
+ vendor: '@vendor_bruce'
+ total_amount: 100500
+ total_commission_amount: 1029
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_tommy_settlement_1:
+ vendor: '@vendor_tommy'
+ total_amount: 100500
+ total_commission_amount: 1029
+ start_date: ''
+ end_date: ''
+ channel: '@channel_eu'
+ vendor_tommy_settlement_2:
+ vendor: '@vendor_tommy'
+ total_amount: 500
+ total_commission_amount: 10
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_last_settlement_for_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_last_settlement_for_vendor.yaml
new file mode 100644
index 0000000..997bfc1
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/SettlementRepositoryTest/test_it_finds_last_settlement_for_vendor.yaml
@@ -0,0 +1,104 @@
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Core\Model\Channel:
+ channel_us:
+ code: 'US'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_tommy:
+ firstName: 'Tommy'
+ lastName: 'Doe'
+ email: 'tommy.doe@example.com'
+ emailCanonical: 'tommy.doe@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ user_tommy:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_tommy'
+ username: 'tommy.doe@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_tommy:
+ shopUser: '@user_tommy'
+ companyName: 'Tommy Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'NL41ABNA3195199319'
+ phoneNumber: '555123123'
+ slug: 'Tommy-Enterprises-Inc'
+ description: 'description'
+ commission: 15
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Settlement\Entity\Settlement:
+ vendor_bruce_settlement_1:
+ vendor: '@vendor_bruce'
+ total_amount: 10600
+ total_commission_amount: 200
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_bruce_settlement_2:
+ vendor: '@vendor_bruce'
+ total_amount: 10000
+ total_commission_amount: 100
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_bruce_settlement_3:
+ vendor: '@vendor_bruce'
+ total_amount: 100500
+ total_commission_amount: 1029
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_tommy_settlement_1:
+ vendor: '@vendor_tommy'
+ total_amount: 100500
+ total_commission_amount: 1029
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_tommy_settlement_2:
+ vendor: '@vendor_tommy'
+ total_amount: 500
+ total_commission_amount: 10
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
+ vendor_tommy_settlement_3:
+ vendor: '@vendor_tommy'
+ total_amount: 1500
+ total_commission_amount: 29
+ start_date: ''
+ end_date: ''
+ channel: '@channel_us'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/TaxonRepositoryTest/test_it_finds_vendor_taxons.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/TaxonRepositoryTest/test_it_finds_vendor_taxons.yaml
new file mode 100644
index 0000000..8a7fa75
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/TaxonRepositoryTest/test_it_finds_vendor_taxons.yaml
@@ -0,0 +1,149 @@
+Sylius\Component\Addressing\Model\Country:
+ USA:
+ code: 'US'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'code'
+ name: 'name'
+ locales:
+ - '@locale'
+ default_locale: '@locale'
+ tax_calculation_strategy: 'order_items_based'
+ base_currency: '@dollar'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@kent.com'
+ usernameCanonical: 'clark@kent.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@USA'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+Sylius\Component\Taxonomy\Model\TaxonTranslation:
+ taxon_translation:
+ locale: 'en_US'
+ name: 'name'
+ slug: 'slug'
+ taxon2_translation:
+ locale: 'en_US'
+ name: 'name2'
+ slug: 'slug2'
+Sylius\Component\Core\Model\Taxon:
+ taxon:
+ code: 'menu_category'
+ translations:
+ - '@taxon_translation'
+ enabled: true
+ taxon2:
+ code: 'menu_category_child'
+ translations:
+ - '@taxon2_translation'
+ enabled: true
+ parent: '@taxon'
+Sylius\Component\Core\Model\ProductTranslation:
+ first_product_US_translation:
+ name: 'test_name1'
+ slug: 'test_slug1'
+ locale: 'en_US'
+ second_product_US_translation:
+ name: 'test_name2'
+ slug: 'test_slug2'
+ locale: 'en_US'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ first_product:
+ mainTaxon: '@taxon'
+ vendor: '@vendor_oliver'
+ code: 'code'
+ channels:
+ - '@channel'
+ translations:
+ - '@first_product_US_translation'
+ second_product:
+ mainTaxon: '@taxon'
+ vendor: '@vendor_oliver'
+ code: 'code2'
+ channels:
+ - '@channel'
+ translations:
+ - '@second_product_US_translation'
+ third_product_without_translation:
+ mainTaxon: '@taxon'
+ vendor: '@vendor_oliver'
+ code: 'code3'
+ channels:
+ - '@channel'
+Sylius\Component\Core\Model\ProductTaxon:
+ firs_relation:
+ taxon: '@taxon'
+ product: '@first_product'
+ second_relation:
+ taxon: '@taxon'
+ product: '@second_product'
+Sylius\Component\Core\Model\ProductVariant:
+ first_variant:
+ product: '@first_product'
+ code: 'code'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_with_oliver:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_oliver'
+ customer: '@customer_bruce'
+ clarks_order_made_with_random_vendor:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ customer: '@customer_clark'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/CustomerFilterStrategyTest/customer_filter_strategy.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/CustomerFilterStrategyTest/customer_filter_strategy.yaml
new file mode 100644
index 0000000..6abcdab
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/CustomerFilterStrategyTest/customer_filter_strategy.yaml
@@ -0,0 +1,90 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Order\Entity\Order:
+ bruce_order_made_by_john_1:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_john'
+ paymentState: 'awaiting_payment'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_john_1'
+ bruce_order_made_by_peter:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_bruce'
+ customer: '@customer_peter'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'bruce_order_made_by_peter'
+ peter_order_made_by_john:
+ currency_code: 'USD'
+ locale_code: 'en-US'
+ vendor: '@vendor_peter'
+ customer: '@customer_john'
+ paymentState: 'paid'
+ state: 'new'
+ checkoutState: 'completed'
+ tokenValue: 'peter_order_made_by_john'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/ProductDraftFilterStrategyTest/product_draft_filter_strategy.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/ProductDraftFilterStrategyTest/product_draft_filter_strategy.yaml
new file mode 100644
index 0000000..818971a
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/ProductDraftFilterStrategyTest/product_draft_filter_strategy.yaml
@@ -0,0 +1,154 @@
+Sylius\Component\Addressing\Model\Country:
+ country_us:
+ code: 'US'
+Sylius\Component\Addressing\Model\Zone:
+ zone_us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Addressing\Model\ZoneMember:
+ zone_member_us:
+ code: 'US'
+ belongsTo: '@zone_us'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'CODE'
+ name: 'name'
+ defaultLocale: '@locale'
+ locales: [ '@locale' ]
+ taxCalculationStrategy: 'order_items_based'
+ baseCurrency: '@dollar'
+ enabled: true
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address_bruce:
+ country: '@country_us'
+ city: 'Arkham City'
+ postalCode: '00000'
+ street: 'Avenue 2115'
+ vendor_address_peter:
+ country: '@country_us'
+ city: 'San Francisco'
+ postalCode: '94016'
+ street: 'Unknown 1'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ vendorAddress: '@vendor_address_bruce'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555444333'
+ vendorAddress: '@vendor_address_peter'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ attribute_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_bruce_2:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_2'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_peter_1:
+ vendor: '@vendor_peter'
+ code: 'attribute_peter_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttributeTranslation:
+ attribute_bruce_1_translations_us:
+ translatable: '@attribute_bruce_1'
+ locale: 'en_US'
+ name: 'attribute_bruce_1_us'
+ attribute_bruce_2_translations_us:
+ translatable: '@attribute_bruce_2'
+ locale: 'en_US'
+ name: 'attribute_bruce_2_us'
+ attribute_peter_1_translations_us:
+ translatable: '@attribute_peter_1'
+ locale: 'en_US'
+ name: 'attribute_peter_1_us'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Listing:
+ product_listing_bruce_1:
+ code: 'product_listing_bruce_1'
+ vendor: '@vendor_bruce'
+ product_listing_bruce_2:
+ code: 'product_listing_bruce_2'
+ vendor: '@vendor_bruce'
+ verificationStatus: 'verified'
+ product_listing_peter_1:
+ code: 'product_listing_peter_1'
+ vendor: '@vendor_peter'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\Draft:
+ product_draft_bruce_1:
+ code: 'product_draft_bruce_1'
+ productListing: '@product_listing_bruce_1'
+ product_draft_bruce_2:
+ code: 'product_draft_bruce_2'
+ productListing: '@product_listing_bruce_2'
+ product_draft_peter_1:
+ code: 'product_draft_peter_1'
+ productListing: '@product_listing_peter_1'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/ProductVariantFilterStrategyTest/product_variant_filter_strategy.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/ProductVariantFilterStrategyTest/product_variant_filter_strategy.yaml
new file mode 100644
index 0000000..bdd7315
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/ProductVariantFilterStrategyTest/product_variant_filter_strategy.yaml
@@ -0,0 +1,107 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Product\Entity\Product:
+ product_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'bruce_1'
+ enabled: true
+ product_bruce_2:
+ vendor: '@vendor_bruce'
+ code: 'bruce_2'
+ enabled: true
+ product_peter_1:
+ vendor: '@vendor_peter'
+ code: 'peter_2'
+ enabled: true
+Sylius\Component\Core\Model\ProductVariant:
+ product_variant_product_bruce_1_1:
+ product: '@product_bruce_1'
+ code: 'bruce_1_1'
+ enabled: true
+ onHold: 2
+ onHand: 3
+ tracked: true
+ product_variant_product_bruce_1_2:
+ product: '@product_bruce_1'
+ code: 'bruce_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
+ product_variant_product_bruce_2_1:
+ product: '@product_bruce_2'
+ code: 'bruce_2_1'
+ enabled: true
+ onHand: 0
+ tracked: false
+ product_variant_product_peter_1_1:
+ product: '@product_peter_1'
+ code: 'peter_1_1'
+ enabled: true
+ onHand: 3
+ tracked: true
+ product_variant_product_peter_1_2:
+ product: '@product_peter_1'
+ code: 'peter_1_2'
+ enabled: true
+ onHand: 1
+ tracked: true
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/VendorFilterStrategyTest/vendor_filter_strategy.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/VendorFilterStrategyTest/vendor_filter_strategy.yaml
new file mode 100644
index 0000000..6cba024
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorContextStrategy/VendorFilterStrategyTest/vendor_filter_strategy.yaml
@@ -0,0 +1,81 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'bruce.wayne@example.com'
+ emailCanonical: 'bruce.wayne@example.com'
+ customer_peter:
+ firstName: 'Peter'
+ lastName: 'Weyland'
+ email: 'peter.weyland@example.com'
+ emailCanonical: 'peter.weyland@example.com'
+ customer_john:
+ firstName: 'John'
+ lastName: 'Smith'
+ email: 'john.smith@example.com'
+ emailCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce.wayne@example.com'
+ usernameCanonical: 'bruce.wayne@example.com'
+ user_peter:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_peter'
+ username: 'peter.weyland@example.com'
+ usernameCanonical: 'peter.weyland@example.com'
+ user_john:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_john'
+ username: 'john.smith@example.com'
+ usernameCanonical: 'john.smith@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Wayne-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_peter:
+ shopUser: '@user_peter'
+ companyName: 'Weyland Corp'
+ taxIdentifier: '7654321'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555444333'
+ slug: 'Weyland-Corp'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\ProductListing\Entity\DraftAttribute:
+ attribute_bruce_1:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_bruce_2:
+ vendor: '@vendor_bruce'
+ code: 'attribute_bruce_2'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
+ attribute_peter_1:
+ vendor: '@vendor_peter'
+ code: 'attribute_peter_1'
+ type: 'text'
+ storageType: 'text'
+ translatable: 'true'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_it_creates_pending_data_row_from_data.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_it_creates_pending_data_row_from_data.yaml
new file mode 100644
index 0000000..c9e55d2
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_it_creates_pending_data_row_from_data.yaml
@@ -0,0 +1,35 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'test-company-name'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_it_doesnt_update_any_vendor_data_immediately.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_it_doesnt_update_any_vendor_data_immediately.yaml
new file mode 100644
index 0000000..2e31de8
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_it_doesnt_update_any_vendor_data_immediately.yaml
@@ -0,0 +1,35 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ description: 'description'
+ slug: 'test-slug'
+ commission: 10
+ commissionType: 'net'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_vendor_data_are_updated_and_removed_correctly.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_vendor_data_are_updated_and_removed_correctly.yaml
new file mode 100644
index 0000000..f135348
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorProfileUpdaterTest/test_vendor_data_are_updated_and_removed_correctly.yaml
@@ -0,0 +1,53 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+ USA:
+ code: 'US'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@vendor_address'
+ slug: 'test-company-name'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ProfileUpdate\Address:
+ vendor_new_address:
+ country: '@USA'
+ city: 'Central City'
+ postalCode: '99-000'
+ street: 'Arrow Street'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ProfileUpdate\ProfileUpdate:
+ vendor_oliver_update:
+ vendor: '@vendor_oliver'
+ companyName: 'new company'
+ taxIdentifier: 'new number'
+ bankAccountNumber: 'new iban'
+ phoneNumber: '999999999'
+ vendorAddress: '@vendor_new_address'
+ description: 'updated description'
+ token: 'hardcoded'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorRepositoryTest/test_it_finds_correct_vendor.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorRepositoryTest/test_it_finds_correct_vendor.yaml
new file mode 100644
index 0000000..71b367b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorRepositoryTest/test_it_finds_correct_vendor.yaml
@@ -0,0 +1,63 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+ bruce_vendor_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Queen company'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Wayne enterprise'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@bruce_vendor_address'
+ slug: 'bruce-wayne-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorRepositoryTest/test_it_finds_vendors_by_settlement_frequency.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorRepositoryTest/test_it_finds_vendors_by_settlement_frequency.yaml
new file mode 100644
index 0000000..913112c
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorRepositoryTest/test_it_finds_vendors_by_settlement_frequency.yaml
@@ -0,0 +1,69 @@
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test1@example.com'
+ emailCanonical: 'test1@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_clark:
+ firstName: 'Clark'
+ lastName: 'Kent'
+ email: 'test3@example.com'
+ emailCanonical: 'test3@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@example.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@example.com'
+ user_clark:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER', 'ROLE_VENDOR' ]
+ enabled: 'true'
+ customer: '@customer_clark'
+ username: 'clark@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Oliver Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Oliver-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ settlementFrequency: 'weekly'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Bruce Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Bruce-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ settlementFrequency: 'monthly'
+ vendor_clark:
+ shopUser: '@user_clark'
+ companyName: 'Clark Enterprises, Inc.'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '555123123'
+ slug: 'Clark-Enterprises-Inc'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ settlementFrequency: 'weekly'
diff --git a/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorShippingMethodRepositoryTest/test_it_finds_all_enabled_shipping_methods_for_vendor_and_channel.yaml b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorShippingMethodRepositoryTest/test_it_finds_all_enabled_shipping_methods_for_vendor_and_channel.yaml
new file mode 100644
index 0000000..88ed85e
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/DataFixtures/ORM/VendorShippingMethodRepositoryTest/test_it_finds_all_enabled_shipping_methods_for_vendor_and_channel.yaml
@@ -0,0 +1,94 @@
+Sylius\Component\Addressing\Model\Country:
+ poland:
+ code: 'PL'
+Sylius\Component\Currency\Model\Currency:
+ dollar:
+ code: 'USD'
+Sylius\Component\Locale\Model\Locale:
+ locale:
+ createdAt: ''
+ code: 'en_US'
+Sylius\Component\Core\Model\Channel:
+ channel:
+ code: 'code'
+ name: 'name'
+ default_locale: '@locale'
+ tax_calculation_strategy: 'order_items_based'
+ base_currency: '@dollar'
+Sylius\Component\Core\Model\Customer:
+ customer_oliver:
+ firstName: 'John'
+ lastName: 'Nowak'
+ email: 'test@example.com'
+ emailCanonical: 'test2@example.com'
+ customer_bruce:
+ firstName: 'Bruce'
+ lastName: 'Wayne'
+ email: 'test2@example.com'
+ emailCanonical: 'test@example.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\ShopUser:
+ user_oliver:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_oliver'
+ username: 'oliver@queen.com'
+ usernameCanonical: 'oliver@queen.com'
+ user_bruce:
+ plainPassword: '123password'
+ roles: [ 'ROLE_USER' ]
+ enabled: 'true'
+ customer: '@customer_bruce'
+ username: 'bruce@wayne.com'
+ usernameCanonical: 'bruce@wayne.com'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Address:
+ oliver_vendor_address:
+ country: '@poland'
+ city: 'Warsaw'
+ postalCode: '00-999'
+ street: 'Avenue 2115'
+ bruce_vendor_address:
+ country: '@poland'
+ city: 'Poznan'
+ postalCode: '61-512'
+ street: 'Umultowska 54'
+BitBag\OpenMarketplace\Component\Vendor\Entity\Vendor:
+ vendor_oliver:
+ shopUser: '@user_oliver'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@oliver_vendor_address'
+ slug: 'oliver-queen-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+ vendor_bruce:
+ shopUser: '@user_bruce'
+ companyName: 'Test company name'
+ taxIdentifier: '1234567'
+ bankAccountNumber: 'PL97109024021972765458596357'
+ phoneNumber: '333111222'
+ vendorAddress: '@bruce_vendor_address'
+ slug: 'bruce-wayne-company'
+ description: 'description'
+ commission: 10
+ commissionType: 'net'
+Sylius\Component\Addressing\Model\Zone:
+ us:
+ code: 'US'
+ name: 'United States of America'
+ type: 'country'
+ scope: 'all'
+Sylius\Component\Core\Model\ShippingMethod:
+ shipping_method_ups:
+ code: 'ups'
+ calculator: 'flat_rate'
+ zone: '@us'
+BitBag\OpenMarketplace\Component\Vendor\Entity\VendorShippingMethod:
+ vendor_shipping_method_ups:
+ vendor: '@vendor_oliver'
+ shippingMethod: '@shipping_method_ups'
+ channelCode: 'CODE'
+
diff --git a/OpenMarketplace/tests/Integration/IntegrationTestCase.php b/OpenMarketplace/tests/Integration/IntegrationTestCase.php
new file mode 100644
index 0000000..509540e
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/IntegrationTestCase.php
@@ -0,0 +1,27 @@
+dataFixturesPath = __DIR__ . '/DataFixtures/ORM';
+ $this->expectedResponsesPath = __DIR__ . '/Responses/Expected';
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Operator/ProductDraftFilesOperatorTest.php b/OpenMarketplace/tests/Integration/Operator/ProductDraftFilesOperatorTest.php
new file mode 100644
index 0000000..073c4d4
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Operator/ProductDraftFilesOperatorTest.php
@@ -0,0 +1,101 @@
+productFromDraftFactory = $this->getContainer()->get('bitbag.open_marketplace.component.product_listing.draft_converter.factory.simple_product');
+
+ $fileSystemMap = $this->getContainer()->get('knp_gaufrette.filesystem_map');
+
+ $fileAdapter = $fileSystemMap->get('sylius_image')->getAdapter();
+
+ $this->fileSystem = new Filesystem($fileAdapter);
+
+ $productImageFactory = $this->getContainer()->get('bitbag.open_marketplace.component.product.factory.product_image');
+
+ $this->productDraftFilesOperator = new ImagesOperator($this->fileSystem, $productImageFactory);
+ }
+
+ public function test_it_copies_draft_image_to_product(): void
+ {
+ $this->loadFixturesFromFile('ProductDraftFilesOperatorTest/test_it_copies_draft_images_to_product.yaml');
+
+ $manager = $this->getEntityManager();
+
+ $this->create_draft_fixture_with_file();
+
+ $draftFixture = $manager->getRepository(Draft::class)->findOneBy(['code' => 'FIXTURE']);
+ $cratedProduct = $this->productFromDraftFactory->create($draftFixture);
+
+ $this->productDraftFilesOperator->copyFilesToProduct($draftFixture, $cratedProduct);
+
+ $expectedFilePathKey = 'AA/test-new.png';
+
+ $manager->persist($cratedProduct);
+ $manager->flush();
+
+ $product = $manager->getRepository(Product::class)->findOneBy(['code' => 'FIXTURE' . '-' . $draftFixture->getProductListing()->getVendor()->getId()]);
+
+ self::assertCount(1, $product->getImages());
+ self::assertEquals($expectedFilePathKey, $product->getImages()[0]->getPath());
+ }
+
+ private function create_draft_fixture_with_file(): void
+ {
+ $manager = $this->getEntityManager();
+
+ $listing = $this->getEntityManager()->getRepository(Listing::class)->findAll()[0];
+
+ $image1 = new DraftImage();
+
+ $draftFixture = new Draft();
+ $draftFixture->setCode('FIXTURE');
+ $draftFixture->setProductListing($listing);
+ $draftFixture->addImage($image1);
+ $draftFixture->setIsVerified(false);
+
+ $fileInfo = new \SplFileInfo(__DIR__ . '/test.png');
+ $fileObject = $fileInfo->openFile('r');
+ $file = $fileObject->fread(filesize(__DIR__ . '/test.png'));
+
+ $originalFilePathName = 'AA/test.png';
+
+ if ($this->fileSystem->has('AA/test.png')) {
+ $this->fileSystem->delete('AA/test.png');
+ }
+
+ if ($this->fileSystem->has('AA/test1.png')) {
+ $this->fileSystem->delete('AA/test1.png');
+ }
+
+ $this->fileSystem->write('AA/test.png', $file);
+
+ $image1->setPath('AA/test.png');
+ $image1->setOwner($draftFixture);
+
+ $manager->persist($draftFixture);
+ $manager->flush();
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Operator/test.png b/OpenMarketplace/tests/Integration/Operator/test.png
new file mode 100644
index 0000000..4897b96
Binary files /dev/null and b/OpenMarketplace/tests/Integration/Operator/test.png differ
diff --git a/OpenMarketplace/tests/Integration/Repository/ChannelRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/ChannelRepositoryTest.php
new file mode 100644
index 0000000..1ef53e8
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/ChannelRepositoryTest.php
@@ -0,0 +1,40 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->getContainer()->get('sylius.repository.channel');
+ }
+
+ public function test_it_finds_all_enabled_channels(): void
+ {
+ $this->loadFixturesFromFile('ChannelRepositoryTest/test_it_finds_all_enabled_channels.yaml');
+ $result = $this->repository->findAllEnabled();
+
+ self::assertCount(2, $result);
+ }
+
+ public function test_it_finds_enabled_channel_by_code(): void
+ {
+ $this->loadFixturesFromFile('ChannelRepositoryTest/test_it_finds_all_enabled_channels.yaml');
+ $result = $this->repository->findOneEnabledByCode('US');
+
+ self::assertNotNull($result);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/ConversationRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/ConversationRepositoryTest.php
new file mode 100644
index 0000000..6c53373
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/ConversationRepositoryTest.php
@@ -0,0 +1,41 @@
+getContainer()->get('open_marketplace.repository.conversation');
+ $this->loadFixturesFromFile('ConversationRepositoryTest/test_it_finds_all_conversations_with_status_and_user.yaml');
+
+ $userOliver = $this->getEntityManager()->getRepository(ShopUser::class)->findOneBy(['username' => 'oliver@queen.com']);
+ $userBruce = $this->getEntityManager()->getRepository(ShopUser::class)->findOneBy(['username' => 'oliver@queen.com']);
+ $statuses = [Conversation::STATUS_OPEN, Conversation::STATUS_CLOSED];
+ foreach ($statuses as $status) {
+ $oliverConversations = $conversationRepository->findAllWithStatusAndUser($status, $userOliver);
+ $bruceConversations = $conversationRepository->findAllWithStatusAndUser($status, $userBruce);
+
+ $this->assertEquals(count($oliverConversations), 1);
+ $this->assertEquals(count($bruceConversations), 1);
+ }
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/CustomerRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/CustomerRepositoryTest.php
new file mode 100644
index 0000000..b45fe62
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/CustomerRepositoryTest.php
@@ -0,0 +1,48 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->getContainer()->get('sylius.repository.customer');
+ }
+
+ public function test_it_finds_all_customers_of_vendor(): void
+ {
+ $this->loadFixturesFromFile('CustomerRepositoryTest/test_it_finds_all_customers_of_vendor.yaml');
+
+ $vendorOliver = $this->entityManager->getRepository(Vendor::class)->findOneBy(['slug' => 'oliver-queen-company']);
+ $queryBuilder = $this->repository->findVendorCustomers($vendorOliver);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(1, $result);
+ }
+
+ public function test_it_finds_order_for_vendor(): void
+ {
+ $this->loadFixturesFromFile('CustomerRepositoryTest/test_it_finds_order_for_vendor.yaml');
+
+ $vendorOliver = $this->entityManager->getRepository(Vendor::class)->findOneBy(['slug' => 'oliver-queen-company']);
+ $customer = $this->entityManager->getRepository(Customer::class)->findOneBy(['email' => 'test2@example.com']);
+ $result = $this->repository->findCustomerForVendor($vendorOliver, (string) $customer->getId());
+
+ self::assertEquals($customer->getId(), $result->getId());
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/DraftAttributeRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/DraftAttributeRepositoryTest.php
new file mode 100644
index 0000000..0cad90e
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/DraftAttributeRepositoryTest.php
@@ -0,0 +1,40 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->entityManager->getRepository(DraftAttribute::class);
+ }
+
+ public function test_it_finds_all_draft_attributes_for_given_vendor(): void
+ {
+ $this->loadFixturesFromFile('DraftAttributeRepositoryTest/test_it_finds_all_draft_attributes_for_given_vendor.yaml');
+
+ $vendorOliver = $this->getEntityManager()->getRepository(Vendor::class)->findOneBy(['slug' => 'oliver-queen-company']);
+ $vendorBruce = $this->getEntityManager()->getRepository(Vendor::class)->findOneBy(['slug' => 'bruce-wayne-company']);
+
+ $oliversAttributes = $this->repository->findVendorDraftAttributes($vendorOliver);
+ $brucesAttributes = $this->repository->findVendorDraftAttributes($vendorBruce);
+
+ self::assertCount(2, $oliversAttributes);
+ self::assertCount(1, $brucesAttributes);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/OrderRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/OrderRepositoryTest.php
new file mode 100644
index 0000000..2dff52b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/OrderRepositoryTest.php
@@ -0,0 +1,102 @@
+orderRepository = self::getContainer()->get('sylius.repository.order');
+ $this->vendorRepository = self::getContainer()->get('bitbag.open_marketplace.component.vendor.repository.vendor');
+ }
+
+ public function test_it_finds_all_customers_of_vendor(): void
+ {
+ $this->loadFixturesFromFile('OrderRepositoryTest/test_it_finds_all_vendor_orders.yaml');
+
+ $vendorOliver = $this->vendorRepository->findOneBy(['slug' => 'oliver-queen-company']);
+ $queryBuilder = $this->orderRepository->findAllByVendorQueryBuilder($vendorOliver);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(1, $result);
+ }
+
+ public function test_it_finds_order_for_vendor(): void
+ {
+ $this->loadFixturesFromFile('OrderRepositoryTest/test_it_finds_order_for_vendor.yaml');
+
+ $vendorOliver = $this->vendorRepository->findOneBy(['slug' => 'oliver-queen-company']);
+ $order = $this->orderRepository->findOneBy(['vendor' => $vendorOliver]);
+ $result = $this->orderRepository->findOrderForVendor($vendorOliver, (string) $order->getId());
+
+ self::assertEquals($order->getId(), $result->getId());
+ }
+
+ public function test_it_finds_orders_for_vendors_customer(): void
+ {
+ $this->loadFixturesFromFile('OrderRepositoryTest/test_it_finds_orders_for_vendors_customer.yaml');
+
+ $vendorOliver = $this->vendorRepository->findOneBy(['slug' => 'oliver-queen-company']);
+ $customer = self::getContainer()->get('sylius.repository.customer')->findOneBy(['email' => 'test2@example.com']);
+ $queryBuilder = $this->orderRepository->findOrdersForVendorByCustomer($vendorOliver, (string) $customer->getId());
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(1, $result);
+ }
+
+ public function test_it_finds_for_settlement(): void
+ {
+ $this->loadFixturesFromFile('OrderRepositoryTest/test_it_finds_for_settlement.yaml');
+ $vendorWayne = $this->vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $vendorWeyland = $this->vendorRepository->findOneBy(['slug' => 'Weyland-Corp']);
+ $channel = self::getContainer()->get('sylius.repository.channel')->findOneBy(['code' => 'US']);
+
+ $startDate = new \DateTime('last week monday 00:00:00');
+ $endDate = new \DateTime('last week sunday 23:59:59');
+
+ $lastSettlementVendorWeyland = $this->orderRepository->findForSettlementByVendorAndChannelAndDates($vendorWeyland, $channel, $startDate, $endDate);
+ $lastSettlementVendorWayne = $this->orderRepository->findForSettlementByVendorAndChannelAndDates($vendorWayne, $channel, $startDate, $endDate);
+
+ $this->assertSame($lastSettlementVendorWayne['total'], '1002');
+ $this->assertSame($lastSettlementVendorWayne['commissionTotal'], '70');
+ $this->assertNull($lastSettlementVendorWeyland['total']);
+ $this->assertNull($lastSettlementVendorWeyland['commissionTotal']);
+ }
+
+ public function test_it_counts_order_for_settlement(): void
+ {
+ $this->loadFixturesFromFile('OrderRepositoryTest/test_it_counts_order_for_settlement.yaml');
+ $settlementRepository = self::getContainer()->get('open_marketplace.repository.settlement');
+ $settlements = $settlementRepository->findAll();
+ $this->assertCount(1, $settlements);
+ $this->assertSame(
+ 2,
+ $this->orderRepository->countOrderForSettlement($settlements[0])
+ );
+ }
+
+ public function test_it_create_query_builder_to_find_order_for_settlement(): void
+ {
+ $this->loadFixturesFromFile('OrderRepositoryTest/test_it_create_query_builder_to_find_order_for_settlement.yaml');
+ $settlementRepository = self::getContainer()->get('open_marketplace.repository.settlement');
+ $settlements = $settlementRepository->findAll();
+ $this->assertCount(1, $settlements);
+
+ $this->assertCount(
+ 2,
+ $this->orderRepository->findForSettlementQueryBuilder($settlements[0])->getQuery()->getResult()
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/ProductListingRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/ProductListingRepositoryTest.php
new file mode 100644
index 0000000..b6fa5af
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/ProductListingRepositoryTest.php
@@ -0,0 +1,47 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->entityManager->getRepository(Listing::class);
+ }
+
+ public function test_it_finds_product_listings_with_latest_draft(): void
+ {
+ $this->loadFixturesFromFile('ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft.yaml');
+
+ $queryBuilder = $this->repository->createQueryBuilderWithLatestDraft();
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(3, $result);
+ }
+
+ public function test_it_finds_product_listings_with_latest_draft_by_vendor(): void
+ {
+ $this->loadFixturesFromFile('ProductListingRepositoryTest/test_it_finds_product_listings_with_latest_draft_by_vendor.yaml');
+
+ $vendorOliver = $this->entityManager->getRepository(Vendor::class)->findOneBy(['slug' => 'oliver-queen-company']);
+ $queryBuilder = $this->repository->createQueryBuilderByVendor($vendorOliver);
+
+ $result = $queryBuilder->getQuery()->getResult();
+ self::assertCount(2, $result);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/ProductRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/ProductRepositoryTest.php
new file mode 100644
index 0000000..f1eeb07
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/ProductRepositoryTest.php
@@ -0,0 +1,44 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->entityManager->getRepository(Product::class);
+ $this->taxonProvider = $this->getContainer()->get('bitbag.open_marketplace.component.vendor.context.taxon');
+ }
+
+ public function test_it_finds_vendor_products(): void
+ {
+ $this->loadFixturesFromFile('ProductRepositoryTest/test_it_finds_vendor_products.yaml');
+ /** @var VendorInterface $vendorOliver */
+ $vendorOliver = $this->entityManager->getRepository(Vendor::class)->findOneBySlug('oliver-queen-company');
+ $channel = $this->entityManager->getRepository(Channel::class)->findAll()[0];
+ $localeCode = $channel->getDefaultLocale()->getCode();
+ $taxon = $this->taxonProvider->getForVendorPage(null, $localeCode);
+ /** @var QueryBuilder $vendorProductsQuery */
+ $vendorProductsQuery = $this->repository->createVendorShopListQueryBuilder($vendorOliver, $channel, $taxon, 'en_US', [], true);
+
+ $this->assertCount(2, $vendorProductsQuery->getQuery()->getResult());
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/ProductReviewRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/ProductReviewRepositoryTest.php
new file mode 100644
index 0000000..bec2af6
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/ProductReviewRepositoryTest.php
@@ -0,0 +1,53 @@
+loadFixturesFromFile('ProductReviewRepositoryTest/found_product_reviews_for_vendor.yaml');
+
+ /** @var VendorRepositoryInterface $vendorRepository */
+ $vendorRepository = $this->getEntityManager()->getRepository(Vendor::class);
+ $vendor = $vendorRepository->findOneBy(['slug' => 'adam-ondra-company']);
+
+ /** @var ProductReviewRepositoryInterface $productReviewRepository */
+ $productReviewRepository = $this->getEntityManager()->getRepository(ProductReview::class);
+ $queryBuilder = $productReviewRepository->createVendorReviewsQueryBuilder($vendor);
+
+ $productReviews = $queryBuilder->getQuery()->getResult();
+ self::assertCount(2, $productReviews);
+ }
+
+ public function test_find_product_reviews_for_vendor_not_found(): void
+ {
+ $this->loadFixturesFromFile('ProductReviewRepositoryTest/not_found_product_reviews_for_vendor.yaml');
+
+ /** @var VendorRepositoryInterface $vendorRepository */
+ $vendorRepository = $this->getEntityManager()->getRepository(Vendor::class);
+ $vendor = $vendorRepository->findOneBy(['slug' => 'alex-honnold-company']);
+
+ /** @var ProductReviewRepositoryInterface $productReviewRepository */
+ $productReviewRepository = $this->getEntityManager()->getRepository(ProductReview::class);
+ $queryBuilder = $productReviewRepository->createVendorReviewsQueryBuilder($vendor);
+
+ $productReviews = $queryBuilder->getQuery()->getResult();
+ self::assertEmpty($productReviews);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/SettlementRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/SettlementRepositoryTest.php
new file mode 100644
index 0000000..57e9c8b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/SettlementRepositoryTest.php
@@ -0,0 +1,76 @@
+repository = self::getContainer()->get('open_marketplace.repository.settlement');
+ }
+
+ public function test_it_finds_last_settlement_for_vendor(): void
+ {
+ $this->loadFixturesFromFile('SettlementRepositoryTest/test_it_finds_last_settlement_for_vendor.yaml');
+ $vendorRepository = self::getContainer()->get('open_marketplace.repository.vendor');
+ $channelRepository = self::getContainer()->get('sylius.repository.channel');
+ $vendor = $vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $channel = $channelRepository->findOneBy(['code' => 'US']);
+
+ $settlement = $this->repository->findLastByVendorAndChannel($vendor, $channel);
+
+ $this->assertSame(10000, $settlement->getTotalAmount());
+ $this->assertSame(100, $settlement->getTotalCommissionAmount());
+ }
+
+ public function test_it_finds_all_available_periods(): void
+ {
+ $this->loadFixturesFromFile('SettlementRepositoryTest/test_it_finds_all_available_periods.yaml');
+
+ $period[] = $this->generatePeriod('last week monday', 'last week sunday');
+ $period[] = $this->generatePeriod('first day of last month', 'last day of last month');
+ $period[] = $this->generatePeriod('first day of January', 'last day of January');
+ $period[] = $this->generatePeriod('first day of April', 'last day of June');
+
+ rsort($period);
+
+ $this->assertSame(
+ $period,
+ $this->repository->findAllPeriods()
+ );
+ }
+
+ public function test_it_finds_all_settlements_by_vendor(): void
+ {
+ $this->loadFixturesFromFile('SettlementRepositoryTest/test_it_finds_all_settlements_by_vendor.yaml');
+ $vendorRepository = self::getContainer()->get('open_marketplace.repository.vendor');
+ $vendor = $vendorRepository->findOneBy(['slug' => 'Wayne-Enterprises-Inc']);
+ $settlements = $this->repository->findAllByVendorQueryBuilder($vendor)->getQuery()->getResult();
+ $this->assertCount(3, $settlements);
+
+ foreach ($settlements as $settlement) {
+ $this->assertSame($vendor, $settlement->getVendor());
+ }
+ }
+
+ private function generatePeriod(string $startDate, string $endDate): string
+ {
+ return sprintf(
+ '%s - %s',
+ (new \DateTime($startDate))->format('j/m/Y'),
+ (new \DateTime($endDate))->format('j/m/Y')
+ );
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/TaxonRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/TaxonRepositoryTest.php
new file mode 100644
index 0000000..e21b790
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/TaxonRepositoryTest.php
@@ -0,0 +1,42 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->getContainer()->get('sylius.repository.taxon');
+ }
+
+ public function test_it_finds_vendor_products(): void
+ {
+ $this->loadFixturesFromFile('TaxonRepositoryTest/test_it_finds_vendor_taxons.yaml');
+
+ $taxon = $this->repository->findForVendorPage('slug', 'en_US');
+
+ $this->assertSame('slug', $taxon->getSlug());
+ }
+
+ public function test_it_finds_null_wuth_incorrect_slug(): void
+ {
+ $this->loadFixturesFromFile('TaxonRepositoryTest/test_it_finds_vendor_taxons.yaml');
+
+ $taxon = $this->repository->findForVendorPage('badSlug', 'en_US');
+
+ $this->assertNull($taxon);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/VendorRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/VendorRepositoryTest.php
new file mode 100644
index 0000000..cc820ce
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/VendorRepositoryTest.php
@@ -0,0 +1,51 @@
+repository = self::getContainer()->get('bitbag.open_marketplace.component.vendor.repository.vendor');
+ }
+
+ public function test_it_finds_correct_vendor(): void
+ {
+ $this->loadFixturesFromFile('VendorRepositoryTest/test_it_finds_correct_vendor.yaml');
+ $vendorOliver = $this->repository->findOneBySlug('oliver-queen-company');
+ $vendorBruce = $this->repository->findOneBySlug('bruce-wayne-company');
+
+ $this->assertEquals('Queen company', $vendorOliver->getCompanyName());
+ $this->assertEquals('Wayne enterprise', $vendorBruce->getCompanyName());
+ }
+
+ public function test_it_finds_null_for_null_slug_vendor(): void
+ {
+ $this->loadFixturesFromFile('VendorRepositoryTest/test_it_finds_correct_vendor.yaml');
+ $vendorOliver = $this->repository->findOneBySlug('Not_in_db_slug');
+
+ $this->assertNull($vendorOliver);
+ }
+
+ public function test_it_finds_vendors_by_settlement_frequency(): void
+ {
+ $this->loadFixturesFromFile('VendorRepositoryTest/test_it_finds_vendors_by_settlement_frequency.yaml');
+ $vendors = $this->repository->findAllBySettlementFrequency('weekly');
+ $this->assertCount(2, $vendors);
+
+ $this->assertSame('Oliver-Enterprises-Inc', $vendors[0]->getSlug());
+ $this->assertSame('Clark-Enterprises-Inc', $vendors[1]->getSlug());
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Repository/VendorShippingMethodRepositoryTest.php b/OpenMarketplace/tests/Integration/Repository/VendorShippingMethodRepositoryTest.php
new file mode 100644
index 0000000..70cbf30
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Repository/VendorShippingMethodRepositoryTest.php
@@ -0,0 +1,37 @@
+entityManager = $this->getContainer()->get('doctrine.orm.entity_manager');
+ $this->repository = $this->getContainer()->get('open_marketplace.repository.vendor_shipping_method');
+ }
+
+ public function test_it_finds_all_enabled_shipping_methods_for_vendor_and_channel(): void
+ {
+ $this->loadFixturesFromFile('VendorShippingMethodRepositoryTest/test_it_finds_all_enabled_shipping_methods_for_vendor_and_channel.yaml');
+
+ $vendor = $this->entityManager->getRepository(Vendor::class)->findOneBy(['slug' => 'oliver-queen-company']);
+ $channel = $this->entityManager->getRepository(Channel::class)->findOneBy(['code' => 'code']);
+ $vendorShippingMethods = $this->repository->findEnabledForChannel($vendor, $channel);
+
+ self::assertCount(1, $vendorShippingMethods);
+ }
+}
diff --git a/OpenMarketplace/tests/Integration/Updater/VendorProfileUpdaterTest.php b/OpenMarketplace/tests/Integration/Updater/VendorProfileUpdaterTest.php
new file mode 100644
index 0000000..46e1a7b
--- /dev/null
+++ b/OpenMarketplace/tests/Integration/Updater/VendorProfileUpdaterTest.php
@@ -0,0 +1,169 @@
+entityManager = static::$container->get('doctrine.orm.entity_manager');
+
+ $this->countryRepository = $this->entityManager->getRepository(Country::class);
+ $this->vendorRepository = $this->entityManager->getRepository(Vendor::class);
+ $this->vendorProfileUpdateRepository = $this->entityManager->getRepository(ProfileUpdate::class);
+ $this->vendorAddressFactory = static::$container->get('bitbag.open_marketplace.component.vendor.profile.factory.address');
+ $this->vendorProfileFactory = static::$container->get('bitbag.open_marketplace.component.vendor.profile.factory.profile_factory');
+ $this->vendorProfileUpdateImageFactoryInterface = static::$container->get('bitbag.open_marketplace.component.vendor.profile.factory.profile_logo_image_factory');
+ $this->vendorProfileUpdateBackgroundImageFactoryInterface = static::$container->get('bitbag.open_marketplace.component.vendor.profile.factory.profile_background_image_factory');
+ $this->imageUploader = static::$container->get('sylius.image_uploader');
+ $this->vendorLogoOperator = static::$container->get('bitbag.open_marketplace.component.vendor.profile.logo_image_operator');
+ $this->vendorBackgroundImageOperator = static::$container->get('bitbag.open_marketplace.component.vendor.profile.background_image_operator');
+
+ $remover = static::$container->get('bitbag.open_marketplace.component.vendor.profile.profile_update_remover');
+ $vendorProfileFactory = static::$container->get('bitbag.open_marketplace.component.vendor.profile.factory.profile_update_factory');
+
+ $senderMock = $this->createMock(SenderInterface::class);
+ $this->vendorProfileUpdater = new ProfileUpdater(
+ $this->entityManager,
+ $senderMock,
+ $remover,
+ $vendorProfileFactory,
+ $this->vendorProfileUpdateImageFactoryInterface,
+ $this->vendorProfileUpdateBackgroundImageFactoryInterface,
+ $this->imageUploader,
+ $this->vendorLogoOperator,
+ $this->vendorBackgroundImageOperator
+ );
+ }
+
+ public function test_it_doesnt_update_any_vendor_data_immediately(): void
+ {
+ $this->loadFixturesFromFile('VendorProfileUpdaterTest/test_it_doesnt_update_any_vendor_data_immediately.yaml');
+
+ $vendorDataBeforeFormSubmit = $this->vendorRepository
+ ->findOneBy(['taxIdentifier' => '1234567']);
+
+ $vendorFormData = $this->createFakeUpdateFormData();
+
+ $fakeImage = new LogoImage();
+ $fakeImage->setPath('fakepath');
+ $fakeBackgroundImage = new BackgroundImage();
+ $fakeBackgroundImage->setPath('fakepath');
+
+ $this->vendorProfileUpdater
+ ->createPendingVendorProfileUpdate($vendorFormData, $vendorDataBeforeFormSubmit, $fakeImage, $fakeBackgroundImage);
+
+ $pendingData = $this->vendorProfileUpdateRepository
+ ->findOneBy(['vendor' => $vendorDataBeforeFormSubmit]);
+
+ $this->assertNotEquals($pendingData->getCompanyName(), $vendorDataBeforeFormSubmit->getCompanyName());
+ }
+
+ private function createFakeUpdateFormData(): ProfileInterface
+ {
+ $poland = $this->countryRepository
+ ->findOneBy(['code' => 'PL']);
+
+ $address = $this->vendorAddressFactory
+ ->createAddress('Grand Street', 'Warsaw', '00-22', $poland);
+
+ $vendorData = $this->vendorProfileFactory
+ ->createVendor('Grand Company', '221133', 'PL14109024029586826934815556', '0-33 221 333 111', 'description', $address);
+
+ $vendorData->setSlug('test-slug');
+
+ $this->entityManager->persist($vendorData);
+ $this->entityManager->persist($address);
+
+ return $vendorData;
+ }
+
+ public function test_it_creates_pending_data_row_from_data(): void
+ {
+ $this->loadFixturesFromFile('VendorProfileUpdaterTest/test_it_creates_pending_data_row_from_data.yaml');
+
+ $vendorFormData = $this->createFakeUpdateFormData();
+ $currentVendor = $this->vendorRepository
+ ->findOneBy(['taxIdentifier' => '1234567']);
+
+ $fakeImage = new LogoImage();
+ $fakeImage->setPath('fakepath');
+ $fakeBackgroundImage = new BackgroundImage();
+ $fakeBackgroundImage->setPath('fakepath');
+
+ $this->vendorProfileUpdater
+ ->createPendingVendorProfileUpdate($vendorFormData, $currentVendor, $fakeImage, $fakeBackgroundImage);
+
+ $pendingData = $this->entityManager
+ ->getRepository(ProfileUpdate::class)
+ ->findOneBy(['vendor' => $currentVendor]);
+
+ $this->assertEquals($vendorFormData->getCompanyName(), $pendingData->getCompanyName());
+ }
+
+ public function test_vendor_information_is_updated_and_removed_correctly(): void
+ {
+ $this->loadFixturesFromFile('VendorProfileUpdaterTest/test_vendor_data_are_updated_and_removed_correctly.yaml');
+
+ $currentVendor = $this->vendorRepository
+ ->findOneBy(['taxIdentifier' => '1234567']);
+
+ $vendorId = $currentVendor->getId();
+
+ $pendingData = $this->vendorProfileUpdateRepository
+ ->findOneBy(['vendor' => $currentVendor]);
+
+ $this->vendorProfileUpdater
+ ->updateVendorFromPendingData($pendingData);
+
+ $updatedVendor = $this->vendorRepository
+ ->findOneBy(['taxIdentifier' => 'new number']);
+
+ $pendingData = $this->vendorProfileUpdateRepository
+ ->findOneBy(['vendor' => $updatedVendor]);
+
+ $this->assertEquals($vendorId, $updatedVendor->getId());
+ $this->assertEquals('new company', $updatedVendor->getCompanyName());
+ $this->assertEquals(null, $pendingData);
+ }
+}
diff --git a/OpenMarketplace/translations/flashes.en.yml b/OpenMarketplace/translations/flashes.en.yml
new file mode 100644
index 0000000..24807a1
--- /dev/null
+++ b/OpenMarketplace/translations/flashes.en.yml
@@ -0,0 +1,27 @@
+vendor:
+ vendor_register: Thank you for filling the Vendor registration form. Your request now will be reviewed by our administrators
+
+open_marketplace:
+ ui:
+ shipping_method_updated: "Shipping methods updated"
+ enabled: "Product successfully enabled"
+ disabled: "Product successfully disabled"
+ restored: "Product successfully restored"
+ removed: "Product successfully removed"
+ vendor_updated: "Confirmation email has been sent"
+ vendor_disabled: "Vendor's account has been successfully disabled."
+ vendor_enabled: "Vendor's account has been successfully enabled."
+ vendor_verified: 'Vendor has been successfully verified.'
+ product_listing_sent_to_verification: 'Product listing sent to verification.'
+ product_listing_created: 'Product listing created.'
+ product_listing_saved_and_sent_to_verification: 'Product listing saved and sent to verification.'
+ product_listing_saved: 'Product listing saved.'
+ product_listing_accepted: 'Product listing accepted.'
+ product_listing_rejected: 'Product listing rejected.'
+ product_listing_send_to_verification: 'Product listing sent to verification.'
+ product_listing_removed : 'The product listing you are trying to reach has been deleted.'
+ archive_message_send: 'Message requesting archiving of conversation has been sent'
+ settlement_accepted: 'Settlement has been accepted successfully.'
+ not_enough_funds: 'Not enough funds in selected wallet.'
+ settlement_created: 'Settlement has been created successfully.'
+ not_enough_balance: 'Not enough funds in selected wallet.'
diff --git a/OpenMarketplace/translations/messages.en.yml b/OpenMarketplace/translations/messages.en.yml
new file mode 100644
index 0000000..46122ff
--- /dev/null
+++ b/OpenMarketplace/translations/messages.en.yml
@@ -0,0 +1,239 @@
+open_marketplace:
+ ui:
+ yes: Yes
+ no: No
+ none: None
+ enabled_channels: Enabled Channels
+ shipping_details: Shipping details
+ is_shipping_required: Is shipping required?
+ shipping_category: Shipping category
+ conversation_categories: Message categories
+ restored: Product successfully restored
+ removed: Product successfully removed
+ remove: Remove
+ restore_visibility: Restore visibility
+ restore: Restore
+ new_product_draft: New Product Listing
+ edit_product_draft: Edit Product Listing
+ draft_attributes: Attributes
+ manage_product_listing_attributes: Manage product listings attributes
+ no_draft_attributes: No attributes set.
+ no_draft_taxons: No taxons set.
+ inventory: Inventory
+ manage_product_listing_stock: Manage your product listings stock
+ clients: Customers
+ order_list: Orders
+ summary_of_your_order: Summary of your order(s)
+ product_list: Product listings
+ admin: Admin
+ customer: Customer
+ details: Details
+ disable: Disable
+ disabled: Disabled
+ edit: Edit
+ edit_vendor: Edit vendor
+ enable: Enable
+ enabled: Enabled
+ id: ID
+ tax_id: Tax ID
+ vendor_dashboard: Vendor dashboard
+ vendor_profile: Profile
+ vendor: Vendor
+ become_a_vendor: Become a Vendor
+ product_listings: Product listings
+ product_listing: Product listing
+ create_product_listing: Create new product listing
+ edit_product_listing: Edit product listing
+ show_product_listing: Product listing details
+ create_draft_attribute: Create attribute
+ edit_draft_attribute: Edit attribute
+ edit_inventory: Edit stock
+ edit_product_review: Edit product review
+ marketplace: Marketplace
+ my_vendor_account: Profile
+ manage_your_vendor_information_and_preferences: Manage your vendor information and preferences
+ your_vendor_profile: Your vendor profile
+ edit_your_vendor_information: Edit your vendor information
+ publishedAt: Published at
+ status: Status
+ tax_identifier: Tax Identifier
+ bank_account_number: Bank account number
+ not_blank: This field cannot be empty
+ missing_translation: missing translation
+ company_name: Company name
+ shop_user: Shop user
+ country: Country
+ city: City
+ street: Street
+ phone_number: Phone number
+ company_address: Company Address
+ postal_code: Postal code
+ pending_update_message: Your profile has been edited. Please approve the changes by clicking on the link in the email sent to you.
+ vendors: Vendors
+ settlements: Settlements
+ manage_your_finances: Manage your finances
+ virtual_wallets: Virtual wallets
+ manage_your_wallets: Manage your wallets and money withdraws
+ virtual_wallet: Virtual wallet
+ profit_withdrawal_amount: Withdrawal amount
+ profit_withdrawal: Profit withdrawal
+ my_wallets: My wallets
+ virtual_wallet_balance: Wallet balance
+ create_settlement: Create settlement
+ balance: Balance
+ withdraw: Withdraw
+ withdraw_funds: Withdraw funds
+ logo: Logo
+ background: Background
+ review: Review
+ invalid_logo: Please upload a valid image (jpg/png/svg)
+ description: Description
+ shipping_methods: Shipping methods
+ manage_shipping_methods: Manage shipping methods accepted in your store
+ open: Open
+ closed: Closed
+ minimum: minimum
+ original: original
+ price: Price
+ product_rejected_intro: Corresponding item has been rejected
+ product_overview: Product overview
+ rejected_listing_msg: This product has been rejected
+ more: More
+ register:
+ new_vendors: New vendors
+ conversations: Messages
+ conversations_listing:
+ username: Username
+ admin_header: Messages
+ admin_subheader: Manage your messages
+ listing_header_open: Open threads
+ listing_header_closed: Closed threads
+ your_open_conversations: Manage your open threads
+ your_closed_conversations: Manage your closed threads
+ reading_closed_conversation: You're reading thread, which has been closed.
+ breadcrumb_header: Messages
+ no_open_conversations: You have no open threads
+ no_closed_conversations: You have no closed threads
+ users: Users
+ open_conversations: Open threads
+ closed_conversations: Closed threads
+ create_new_conversation: New thread
+ create_new_conversation_breadcrumb: New thread
+ create_new_conversation_header: New thread
+ conversation:
+ user_conversation: Thread with user
+ admin_conversation: Thread with administrator
+ no_subject: No subject
+ header: Message from administrator
+ with: Started by
+ your_response_header: "Your response:"
+ attachment: Attachment
+ archive_request_text_first_line: Administrator wants to archive this thread.
+ archive_request_text_second_line: Have you solved your issue?
+ yes: Yes
+ no: No
+ no_category: Message from administrator
+ form:
+ conversation_message:
+ file: File
+ submit: Submit
+ conversation:
+ category: Category
+ messages: Message
+ users: User
+ grid:
+ conversation:
+ applicant: Applicant
+ archive: Archive
+ menu:
+ conversations: Messages
+ conversation_categories: Message categories
+ product_reviews: Product reviews
+ product_reviews: Product reviews
+ manage_product_reviews: Manage your product reviews
+ new_conversation_category: New conversation category
+ edit_conversation_category: Edit conversation category
+ unverified: Unverified
+ vendor_address: Vendor address
+ vendor_details: Vendor details
+ vendor_commission: Vendor commission
+ show_product_listings: Show product listings
+ verified: Accepted
+ verify: Verify
+ new_vendor: New Vendor
+ manage_products: Manage product listings
+ name: Name
+ accept: Accept
+ reject: Reject
+ confirm: Are you sure?
+ code: Code
+ rejected: Rejected
+ created: Created
+ under_verification: Under verification
+ published_at: Published at
+ verified_at: Verified at
+ version: Version
+ actions: Actions
+ create_new_product: Create Product listing
+ save: Save
+ save_and_add: Save and Add
+ save_draft: Save draft
+ send_for_verification: Send for verification
+ vendor_under_verification: Your vendor account is under verification.
+ vendor_verification_accepted: Request to become a Vendor has been granted by the Administrator.
+ order_not_found: The order with id orderId has not been found
+ invalid_csrf: Invalid csrf token.
+ rejection_details: Rejection details
+ no_media_uploaded: No media uploaded.
+ your_account_has_been_disabled: Your vendor account has been disabled. Please contact administrators for more information.
+ view_orders: View your orders
+ footer_signature: BitBag OpenMarketplace - an open-source MVM based on Symfony & Sylius.
+ commission: Commission
+ commission_type: Commission Type
+ vendor_test_credentials: Vendor test credentials
+ username: Username
+ password: Password
+ tax_category: Tax category
+ settlement: Settlement
+ settlement_frequency: Settlement frequency
+ weekly: Weekly
+ monthly: Monthly
+ quarterly: Quarterly
+ period: Period
+ total_amount: Total amount
+ total_commission_amount: Commission
+ total_profit_amount: Settlement amount
+ currency_code: Currency code
+ settlement_status:
+ new: New
+ accepted: Accepted
+ settled: Settled
+ show_settlements: Show settlements
+ show_virtual_wallets: Show virtual wallets
+ created_at: Created at
+ updated_at: Updated at
+ channel: Channel
+ total_orders: Total orders
+ show_orders: Show orders
+ orders: Orders
+ manage_orders: Manage your orders
+ customers: Customers
+ manage_customers: Manage customers who ordered in your store
+ email:
+ settlements_created:
+ subject: Settlement created
+ greetings: Hey, a new settlement has been created.
+ info: Settlement details
+ link_placeholder: View settlements info in your admin panel
+ vendor_profile_update: Vendor profile update requested
+ request_profile_update_greeting: Hey, you asked to change your company details.
+ request_profile_update_info: For security purposes, we need to verify your decision. Click on the link below if you want to make a change or ignore this message.
+ postal_code: Postal code
+ id: ID
+ tax_id: Tax ID
+ vendors: Vendors
+ menu:
+ shop:
+ account:
+ vendor:
+ header: Vendor account
diff --git a/OpenMarketplace/translations/validators.en.yml b/OpenMarketplace/translations/validators.en.yml
new file mode 100644
index 0000000..614eabf
--- /dev/null
+++ b/OpenMarketplace/translations/validators.en.yml
@@ -0,0 +1,26 @@
+validator:
+ message:
+ organization_name: Company Name
+ tax_identifier: Tax Identifier
+ not_blank: This field cannot be empty
+ minimum: 'Required length: {{ limit }} characters.'
+ maximum: This field cannot be longer than {{ limit }}
+ vendor_dashboard: Vendor Dashboard
+ maximum_file_size: The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.
+ image_mime_type: The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.
+ minimum_image_width: The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.
+ minimum_image_height: The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.
+ maximum_image_width: The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.
+ maximum_image_height: The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.
+ slug_invalid: This is not valid slug
+ code_vendor_unique: User cannot have multiple products with same code
+ vendor_already_exists: Vendor for current user already exists
+ positive_or_zero_commission: Commission value must be positive or zero
+ product_listing_unique_code: Product Listing with given code already exists
+ not_valid_iban: This is not a valid International Bank Account Number (IBAN).
+ not_valid_choice: Not a valid choice
+ product_listing_blank_description: Please enter product description.
+
+ messaging:
+ message:
+ not_allowed_mime_types: The mime type of the file is not allowed ({{ type }})
diff --git a/OpenMarketplace/webpack.config.js b/OpenMarketplace/webpack.config.js
new file mode 100644
index 0000000..1686a96
--- /dev/null
+++ b/OpenMarketplace/webpack.config.js
@@ -0,0 +1,56 @@
+const path = require('path');
+const Encore = require('@symfony/webpack-encore');
+
+const [bitbagCmsShop, bitbagCmsAdmin] = require('./vendor/bitbag/cms-plugin/webpack.config.js');
+const [bitbagWishlistShop, bitbagWishlistAdmin] = require('./vendor/bitbag/wishlist-plugin/webpack.config.js');
+
+const syliusBundles = path.resolve(__dirname, 'vendor/sylius/sylius/src/Sylius/Bundle/');
+const uiBundleScripts = path.resolve(syliusBundles, 'UiBundle/Resources/private/js/');
+const uiBundleResources = path.resolve(syliusBundles, 'UiBundle/Resources/private/');
+
+// Shop config
+Encore
+ .setOutputPath('public/build/shop/')
+ .setPublicPath('/build/shop')
+ .addEntry('shop-entry', './assets/shop/entry.js')
+ .disableSingleRuntimeChunk()
+ .cleanupOutputBeforeBuild()
+ .copyFiles({
+ from: 'vendor/sylius/sylius/src/Sylius/Bundle/UiBundle/Resources/private/img',
+ to: '../../assets/shop/img/[path][name].[ext]',
+ includeSubdirectories: true,
+ pattern: /.*/,
+ })
+ .enableSourceMaps(!Encore.isProduction())
+ .enableVersioning(Encore.isProduction())
+ .enableSassLoader();
+
+const shopConfig = Encore.getWebpackConfig();
+
+shopConfig.resolve.alias['sylius/ui'] = uiBundleScripts;
+shopConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources;
+shopConfig.resolve.alias['sylius/bundle'] = syliusBundles;
+shopConfig.name = 'shop';
+
+Encore.reset();
+
+// Admin config
+Encore
+ .setOutputPath('public/build/admin/')
+ .setPublicPath('/build/admin')
+ .addEntry('admin-entry', './assets/admin/entry.js')
+ .disableSingleRuntimeChunk()
+ .cleanupOutputBeforeBuild()
+ .enableSourceMaps(!Encore.isProduction())
+ .enableVersioning(Encore.isProduction())
+ .enableSassLoader();
+
+const adminConfig = Encore.getWebpackConfig();
+
+adminConfig.resolve.alias['sylius/ui'] = uiBundleScripts;
+adminConfig.resolve.alias['sylius/ui-resources'] = uiBundleResources;
+adminConfig.resolve.alias['sylius/bundle'] = syliusBundles;
+adminConfig.externals = Object.assign({}, adminConfig.externals, { window: 'window', document: 'document' });
+adminConfig.name = 'admin';
+
+module.exports = [shopConfig, adminConfig, bitbagCmsShop, bitbagCmsAdmin, bitbagWishlistShop, bitbagWishlistAdmin];
diff --git a/OpenMarketplace/yarn.lock b/OpenMarketplace/yarn.lock
new file mode 100644
index 0000000..50070ce
--- /dev/null
+++ b/OpenMarketplace/yarn.lock
@@ -0,0 +1,7226 @@
+# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
+# yarn lockfile v1
+
+
+"@ampproject/remapping@^2.1.0":
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz"
+ integrity sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.1.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@babel/code-frame@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.18.6.tgz"
+ integrity sha512-TDCmlK5eOvH+eH7cdAFlNXeVJqWIQ7gW9tY1GJIpUtFb6CmjVyq2VM3u71bOyR8CRihcCgMUYoDNyLXao3+70Q==
+ dependencies:
+ "@babel/highlight" "^7.18.6"
+
+"@babel/compat-data@^7.17.7", "@babel/compat-data@^7.18.8", "@babel/compat-data@^7.19.3":
+ version "7.19.3"
+ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz"
+ integrity sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==
+
+"@babel/core@^7.7.0":
+ version "7.19.3"
+ resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.19.3.tgz#2519f62a51458f43b682d61583c3810e7dcee64c"
+ integrity sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==
+ dependencies:
+ "@ampproject/remapping" "^2.1.0"
+ "@babel/code-frame" "^7.18.6"
+ "@babel/generator" "^7.19.3"
+ "@babel/helper-compilation-targets" "^7.19.3"
+ "@babel/helper-module-transforms" "^7.19.0"
+ "@babel/helpers" "^7.19.0"
+ "@babel/parser" "^7.19.3"
+ "@babel/template" "^7.18.10"
+ "@babel/traverse" "^7.19.3"
+ "@babel/types" "^7.19.3"
+ convert-source-map "^1.7.0"
+ debug "^4.1.0"
+ gensync "^1.0.0-beta.2"
+ json5 "^2.2.1"
+ semver "^6.3.0"
+
+"@babel/generator@^7.19.3":
+ version "7.19.3"
+ resolved "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz"
+ integrity sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==
+ dependencies:
+ "@babel/types" "^7.19.3"
+ "@jridgewell/gen-mapping" "^0.3.2"
+ jsesc "^2.5.1"
+
+"@babel/helper-annotate-as-pure@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-builder-binary-assignment-operator-visitor@^7.18.6":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.9.tgz"
+ integrity sha512-yFQ0YCHoIqarl8BCRwBL8ulYUaZpz3bNsA7oFepAzee+8/+ImtADXNOmO5vJvsPff3qi+hvpkY/NYBTrBQgdNw==
+ dependencies:
+ "@babel/helper-explode-assignable-expression" "^7.18.6"
+ "@babel/types" "^7.18.9"
+
+"@babel/helper-compilation-targets@^7.17.7", "@babel/helper-compilation-targets@^7.18.9", "@babel/helper-compilation-targets@^7.19.0", "@babel/helper-compilation-targets@^7.19.3":
+ version "7.19.3"
+ resolved "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.19.3.tgz"
+ integrity sha512-65ESqLGyGmLvgR0mst5AdW1FkNlj9rQsCKduzEoEPhBCDFGXvz2jW6bXFG6i0/MrV2s7hhXjjb2yAzcPuQlLwg==
+ dependencies:
+ "@babel/compat-data" "^7.19.3"
+ "@babel/helper-validator-option" "^7.18.6"
+ browserslist "^4.21.3"
+ semver "^6.3.0"
+
+"@babel/helper-create-class-features-plugin@^7.18.6":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.19.0.tgz"
+ integrity sha512-NRz8DwF4jT3UfrmUoZjd0Uph9HQnP30t7Ash+weACcyNkiYTywpIjDBgReJMKgr+n86sn2nPVVmJ28Dm053Kqw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-function-name" "^7.19.0"
+ "@babel/helper-member-expression-to-functions" "^7.18.9"
+ "@babel/helper-optimise-call-expression" "^7.18.6"
+ "@babel/helper-replace-supers" "^7.18.9"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+
+"@babel/helper-create-regexp-features-plugin@^7.18.6", "@babel/helper-create-regexp-features-plugin@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.19.0.tgz"
+ integrity sha512-htnV+mHX32DF81amCDrwIDr8nrp1PTm+3wfBN9/v8QJOLEioOCOG7qNyq0nHeFiWbT3Eb7gsPwEmV64UCQ1jzw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ regexpu-core "^5.1.0"
+
+"@babel/helper-define-polyfill-provider@^0.3.3":
+ 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==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.17.7"
+ "@babel/helper-plugin-utils" "^7.16.7"
+ debug "^4.1.1"
+ lodash.debounce "^4.0.8"
+ resolve "^1.14.2"
+ semver "^6.1.2"
+
+"@babel/helper-environment-visitor@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.18.9.tgz"
+ integrity sha512-3r/aACDJ3fhQ/EVgFy0hpj8oHyHpQc+LPtJoY9SzTThAsStm4Ptegq92vqKoE3vD706ZVFWITnMnxucw+S9Ipg==
+
+"@babel/helper-explode-assignable-expression@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.18.6.tgz"
+ integrity sha512-eyAYAsQmB80jNfg4baAtLeWAQHfHFiR483rzFK+BhETlGZaQC9bsfrugfXDCbRHLQbIA7U5NxhhOxN7p/dWIcg==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-function-name@^7.18.9", "@babel/helper-function-name@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.19.0.tgz"
+ integrity sha512-WAwHBINyrpqywkUH0nTnNgI5ina5TFn85HKS0pbPDfxFfhyR/aNQEn4hGi1P1JyT//I0t4OgXUlofzWILRvS5w==
+ dependencies:
+ "@babel/template" "^7.18.10"
+ "@babel/types" "^7.19.0"
+
+"@babel/helper-hoist-variables@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-member-expression-to-functions@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.9.tgz"
+ integrity sha512-RxifAh2ZoVU67PyKIO4AMi1wTenGfMR/O/ae0CCRqwgBAt5v7xjdtRw7UoSbsreKrQn5t7r89eruK/9JjYHuDg==
+ dependencies:
+ "@babel/types" "^7.18.9"
+
+"@babel/helper-module-imports@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.18.6.tgz"
+ integrity sha512-0NFvs3VkuSYbFi1x2Vd6tKrywq+z/cLeYC/RJNFrIX/30Bf5aiGYbtvGXolEktzJH8o5E5KJ3tT+nkxuuZFVlA==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-module-transforms@^7.18.6", "@babel/helper-module-transforms@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz"
+ integrity sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-module-imports" "^7.18.6"
+ "@babel/helper-simple-access" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/helper-validator-identifier" "^7.18.6"
+ "@babel/template" "^7.18.10"
+ "@babel/traverse" "^7.19.0"
+ "@babel/types" "^7.19.0"
+
+"@babel/helper-optimise-call-expression@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.7", "@babel/helper-plugin-utils@^7.18.6", "@babel/helper-plugin-utils@^7.18.9", "@babel/helper-plugin-utils@^7.19.0", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.19.0.tgz"
+ integrity sha512-40Ryx7I8mT+0gaNxm8JGTZFUITNqdLAgdg0hXzeVZxVD6nFsdhQvip6v8dqkRHzsz1VFpFAaOCHNn0vKBL7Czw==
+
+"@babel/helper-remap-async-to-generator@^7.18.6", "@babel/helper-remap-async-to-generator@^7.18.9":
+ 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==
+ 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-replace-supers@^7.18.6", "@babel/helper-replace-supers@^7.18.9":
+ version "7.19.1"
+ resolved "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.19.1.tgz"
+ integrity sha512-T7ahH7wV0Hfs46SFh5Jz3s0B6+o8g3c+7TMxu7xKfmHikg7EAZ3I2Qk9LFhjxXq8sL7UkP5JflezNwoZa8WvWw==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-member-expression-to-functions" "^7.18.9"
+ "@babel/helper-optimise-call-expression" "^7.18.6"
+ "@babel/traverse" "^7.19.1"
+ "@babel/types" "^7.19.0"
+
+"@babel/helper-simple-access@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz"
+ integrity sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-skip-transparent-expression-wrappers@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.9.tgz"
+ integrity sha512-imytd2gHi3cJPsybLRbmFrF7u5BIEuI2cNheyKi3/iOBC63kNn3q8Crn2xVuESli0aM4KYsyEqKyS7lFL8YVtw==
+ dependencies:
+ "@babel/types" "^7.18.9"
+
+"@babel/helper-split-export-declaration@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/types" "^7.18.6"
+
+"@babel/helper-string-parser@^7.18.10":
+ version "7.18.10"
+ resolved "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz"
+ integrity sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==
+
+"@babel/helper-validator-identifier@^7.18.6", "@babel/helper-validator-identifier@^7.19.1":
+ 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==
+
+"@babel/helper-validator-option@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.18.6.tgz"
+ integrity sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==
+
+"@babel/helper-wrap-function@^7.18.9":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.19.0.tgz"
+ integrity sha512-txX8aN8CZyYGTwcLhlk87KRqncAzhh5TpQamZUa0/u3an36NtDpUP6bQgBCBcLeBs09R/OwQu3OjK0k/HwfNDg==
+ dependencies:
+ "@babel/helper-function-name" "^7.19.0"
+ "@babel/template" "^7.18.10"
+ "@babel/traverse" "^7.19.0"
+ "@babel/types" "^7.19.0"
+
+"@babel/helpers@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz"
+ integrity sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==
+ dependencies:
+ "@babel/template" "^7.18.10"
+ "@babel/traverse" "^7.19.0"
+ "@babel/types" "^7.19.0"
+
+"@babel/highlight@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz"
+ integrity sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==
+ dependencies:
+ "@babel/helper-validator-identifier" "^7.18.6"
+ chalk "^2.0.0"
+ js-tokens "^4.0.0"
+
+"@babel/parser@^7.18.10", "@babel/parser@^7.19.3":
+ version "7.19.3"
+ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz"
+ integrity sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==
+
+"@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.9.tgz"
+ integrity sha512-AHrP9jadvH7qlOj6PINbgSuphjQUAK7AOT7DPjBo9EHoLhQTnnK5u45e1Hd4DbSQEO9nqPWtQ89r+XEOWFScKg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+ "@babel/plugin-proposal-optional-chaining" "^7.18.9"
+
+"@babel/plugin-proposal-async-generator-functions@^7.19.1":
+ version "7.19.1"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.19.1.tgz"
+ integrity sha512-0yu8vNATgLy4ivqMNBIwb1HebCelqN7YX8SL3FDXORv/RqT0zEEWUCH4GH44JsSrvCu6GqnAdR5EBFAPeNBB4Q==
+ dependencies:
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-plugin-utils" "^7.19.0"
+ "@babel/helper-remap-async-to-generator" "^7.18.9"
+ "@babel/plugin-syntax-async-generators" "^7.8.4"
+
+"@babel/plugin-proposal-class-properties@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-class-static-block@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-static-block/-/plugin-proposal-class-static-block-7.18.6.tgz"
+ integrity sha512-+I3oIiNxrCpup3Gi8n5IGMwj0gOCAjcJUSQEcotNnCCPMEnixawOQ+KeJPlgfjzx+FKQ1QSyZOWe7wmoJp7vhw==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-class-static-block" "^7.14.5"
+
+"@babel/plugin-proposal-dynamic-import@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-dynamic-import" "^7.8.3"
+
+"@babel/plugin-proposal-export-namespace-from@^7.18.9":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+ "@babel/plugin-syntax-export-namespace-from" "^7.8.3"
+
+"@babel/plugin-proposal-json-strings@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+
+"@babel/plugin-proposal-logical-assignment-operators@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.9.tgz"
+ integrity sha512-128YbMpjCrP35IOExw2Fq+x55LMP42DzhOhX2aNNIdI9avSWl2PI0yuBWarr3RYpZBSPtabfadkH2yeRiMD61Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+
+"@babel/plugin-proposal-nullish-coalescing-operator@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+
+"@babel/plugin-proposal-numeric-separator@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+
+"@babel/plugin-proposal-object-rest-spread@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.9.tgz"
+ integrity sha512-kDDHQ5rflIeY5xl69CEqGEZ0KY369ehsCIEbTGb4siHG5BE9sga/T0r0OUwyZNLMmZE79E1kbsqAjwFCW4ds6Q==
+ dependencies:
+ "@babel/compat-data" "^7.18.8"
+ "@babel/helper-compilation-targets" "^7.18.9"
+ "@babel/helper-plugin-utils" "^7.18.9"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-transform-parameters" "^7.18.8"
+
+"@babel/plugin-proposal-optional-catch-binding@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+
+"@babel/plugin-proposal-optional-chaining@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.9.tgz"
+ integrity sha512-v5nwt4IqBXihxGsW2QmCWMDS3B3bzGIk/EQVZz2ei7f3NJl8NzAJVvUmpDW5q1CRNY+Beb/k58UAH1Km1N411w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+
+"@babel/plugin-proposal-private-methods@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-proposal-private-property-in-object@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-proposal-private-property-in-object/-/plugin-proposal-private-property-in-object-7.18.6.tgz"
+ integrity sha512-9Rysx7FOctvT5ouj5JODjAFAkgGoudQuLPamZb0v1TGLpapdNaftzifU8NTWQm0IRjqoYypdrSmyWgkocDQ8Dw==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-create-class-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+
+"@babel/plugin-proposal-unicode-property-regex@^7.18.6", "@babel/plugin-proposal-unicode-property-regex@^7.4.4":
+ 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==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-async-generators@^7.8.4":
+ version "7.8.4"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz"
+ integrity sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-class-properties@^7.12.13":
+ version "7.12.13"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz"
+ integrity sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.12.13"
+
+"@babel/plugin-syntax-class-static-block@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz"
+ integrity sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-dynamic-import@^7.0.0", "@babel/plugin-syntax-dynamic-import@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz"
+ integrity sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-export-namespace-from@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz"
+ integrity sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.3"
+
+"@babel/plugin-syntax-import-assertions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.18.6.tgz"
+ integrity sha512-/DU3RXad9+bZwrgWJQKbr39gYbJpLJHezqEzRzi/BHRlJ9zsQb4CK2CA/5apllXNomwA1qHwzvHl+AdEmC5krQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-syntax-json-strings@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz"
+ integrity sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-logical-assignment-operators@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz"
+ integrity sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-nullish-coalescing-operator@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz"
+ integrity sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-numeric-separator@^7.10.4":
+ version "7.10.4"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz"
+ integrity sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.10.4"
+
+"@babel/plugin-syntax-object-rest-spread@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz"
+ integrity sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-catch-binding@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz"
+ integrity sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-optional-chaining@^7.8.3":
+ version "7.8.3"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz"
+ integrity sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.8.0"
+
+"@babel/plugin-syntax-private-property-in-object@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz"
+ integrity sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-syntax-top-level-await@^7.14.5":
+ version "7.14.5"
+ resolved "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz"
+ integrity sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.14.5"
+
+"@babel/plugin-transform-arrow-functions@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.18.6.tgz"
+ integrity sha512-9S9X9RUefzrsHZmKMbDXxweEH+YlE8JJEuat9FdvW9Qh1cw7W64jELCtWNkPBPX5En45uy28KGvA/AySqUh8CQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-async-to-generator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.18.6.tgz"
+ integrity sha512-ARE5wZLKnTgPW7/1ftQmSi1CmkqqHo2DNmtztFhvgtOWSDfq0Cq9/9L+KnZNYSNrydBekhW3rwShduf59RoXag==
+ dependencies:
+ "@babel/helper-module-imports" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-remap-async-to-generator" "^7.18.6"
+
+"@babel/plugin-transform-block-scoped-functions@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-block-scoping@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.9.tgz"
+ integrity sha512-5sDIJRV1KtQVEbt/EIBwGy4T01uYIo4KRB3VUqzkhrAIOGx7AoctL9+Ux88btY0zXdDyPJ9mW+bg+v+XEkGmtw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-classes@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.19.0.tgz"
+ integrity sha512-YfeEE9kCjqTS9IitkgfJuxjcEtLUHMqa8yUJ6zdz8vR7hKuo6mOy2C05P0F1tdMmDCeuyidKnlrw/iTppHcr2A==
+ dependencies:
+ "@babel/helper-annotate-as-pure" "^7.18.6"
+ "@babel/helper-compilation-targets" "^7.19.0"
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-function-name" "^7.19.0"
+ "@babel/helper-optimise-call-expression" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.19.0"
+ "@babel/helper-replace-supers" "^7.18.9"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ globals "^11.1.0"
+
+"@babel/plugin-transform-computed-properties@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.9.tgz"
+ integrity sha512-+i0ZU1bCDymKakLxn5srGHrsAPRELC2WIbzwjLhHW9SIE1cPYkLCL0NlnXMZaM1vhfgA2+M7hySk42VBvrkBRw==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-destructuring@^7.18.13":
+ version "7.18.13"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.13.tgz"
+ integrity sha512-TodpQ29XekIsex2A+YJPj5ax2plkGa8YYY6mFjCohk/IG9IY42Rtuj1FuDeemfg2ipxIFLzPeA83SIBnlhSIow==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-dotall-regex@^7.18.6", "@babel/plugin-transform-dotall-regex@^7.4.4":
+ 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==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-duplicate-keys@^7.18.9":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-exponentiation-operator@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-builder-binary-assignment-operator-visitor" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-for-of@^7.18.8":
+ version "7.18.8"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.8.tgz"
+ integrity sha512-yEfTRnjuskWYo0k1mHUqrVWaZwrdq8AYbfrpqULOJOaucGSp4mNMVps+YtA8byoevxS/urwU75vyhQIxcCgiBQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-function-name@^7.18.9":
+ 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==
+ dependencies:
+ "@babel/helper-compilation-targets" "^7.18.9"
+ "@babel/helper-function-name" "^7.18.9"
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-literals@^7.18.9":
+ version "7.18.9"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.9.tgz"
+ integrity sha512-IFQDSRoTPnrAIrI5zoZv73IFeZu2dhu6irxQjY9rNjTT53VmKg9fenjvoiOWOkJ6mm4jKVPtdMzBY98Fp4Z4cg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-member-expression-literals@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-modules-amd@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.18.6.tgz"
+ integrity sha512-Pra5aXsmTsOnjM3IajS8rTaLCy++nGM4v3YR4esk5PCsyg9z8NA5oQLwxzMUtDBd8F+UmVza3VxoAaWCbzH1rg==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-commonjs@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.18.6.tgz"
+ integrity sha512-Qfv2ZOWikpvmedXQJDSbxNqy7Xr/j2Y8/KfijM0iJyKkBTmWuvCA1yeH1yDM7NJhBW/2aXxeucLj6i80/LAJ/Q==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-simple-access" "^7.18.6"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-systemjs@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.19.0.tgz"
+ integrity sha512-x9aiR0WXAWmOWsqcsnrzGR+ieaTMVyGyffPVA7F8cXAGt/UxefYv6uSHZLkAFChN5M5Iy1+wjE+xJuPt22H39A==
+ dependencies:
+ "@babel/helper-hoist-variables" "^7.18.6"
+ "@babel/helper-module-transforms" "^7.19.0"
+ "@babel/helper-plugin-utils" "^7.19.0"
+ "@babel/helper-validator-identifier" "^7.18.6"
+ babel-plugin-dynamic-import-node "^2.3.3"
+
+"@babel/plugin-transform-modules-umd@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-module-transforms" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-named-capturing-groups-regex@^7.19.1":
+ version "7.19.1"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.19.1.tgz"
+ integrity sha512-oWk9l9WItWBQYS4FgXD4Uyy5kq898lvkXpXQxoJEY1RnvPk4R/Dvu2ebXU9q8lP+rlMwUQTFf2Ok6d78ODa0kw==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.19.0"
+ "@babel/helper-plugin-utils" "^7.19.0"
+
+"@babel/plugin-transform-new-target@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-object-super@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ "@babel/helper-replace-supers" "^7.18.6"
+
+"@babel/plugin-transform-parameters@^7.18.8":
+ version "7.18.8"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.8.tgz"
+ integrity sha512-ivfbE3X2Ss+Fj8nnXvKJS6sjRG4gzwPMsP+taZC+ZzEGjAYlvENixmt1sZ5Ca6tWls+BlKSGKPJ6OOXvXCbkFg==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-property-literals@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-regenerator@^7.18.6":
+ version "7.18.6"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.18.6.tgz"
+ integrity sha512-poqRI2+qiSdeldcz4wTSTXBRryoq3Gc70ye7m7UD5Ww0nE29IXqMl6r7Nd15WBgRd74vloEMlShtH6CKxVzfmQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+ regenerator-transform "^0.15.0"
+
+"@babel/plugin-transform-reserved-words@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-shorthand-properties@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-spread@^7.19.0":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.19.0.tgz"
+ integrity sha512-RsuMk7j6n+r752EtzyScnWkQyuJdli6LdO5Klv8Yx0OfPVTcQkIUfS8clx5e9yHXzlnhOZF3CbQ8C2uP5j074w==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.19.0"
+ "@babel/helper-skip-transparent-expression-wrappers" "^7.18.9"
+
+"@babel/plugin-transform-sticky-regex@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/plugin-transform-template-literals@^7.18.9":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-typeof-symbol@^7.18.9":
+ 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==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-unicode-escapes@^7.18.10":
+ version "7.18.10"
+ resolved "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.10.tgz"
+ integrity sha512-kKAdAI+YzPgGY/ftStBFXTI1LZFju38rYThnfMykS+IXy8BVx+res7s2fxf1l8I35DV2T97ezo6+SGrXz6B3iQ==
+ dependencies:
+ "@babel/helper-plugin-utils" "^7.18.9"
+
+"@babel/plugin-transform-unicode-regex@^7.18.6":
+ 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==
+ dependencies:
+ "@babel/helper-create-regexp-features-plugin" "^7.18.6"
+ "@babel/helper-plugin-utils" "^7.18.6"
+
+"@babel/preset-env@^7.10.0":
+ version "7.19.3"
+ resolved "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.19.3.tgz#52cd19abaecb3f176a4ff9cc5e15b7bf06bec754"
+ integrity sha512-ziye1OTc9dGFOAXSWKUqQblYHNlBOaDl8wzqf2iKXJAltYiR3hKHUKmkt+S9PppW7RQpq4fFCrwwpIDj/f5P4w==
+ dependencies:
+ "@babel/compat-data" "^7.19.3"
+ "@babel/helper-compilation-targets" "^7.19.3"
+ "@babel/helper-plugin-utils" "^7.19.0"
+ "@babel/helper-validator-option" "^7.18.6"
+ "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.18.6"
+ "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.18.9"
+ "@babel/plugin-proposal-async-generator-functions" "^7.19.1"
+ "@babel/plugin-proposal-class-properties" "^7.18.6"
+ "@babel/plugin-proposal-class-static-block" "^7.18.6"
+ "@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.18.9"
+ "@babel/plugin-proposal-nullish-coalescing-operator" "^7.18.6"
+ "@babel/plugin-proposal-numeric-separator" "^7.18.6"
+ "@babel/plugin-proposal-object-rest-spread" "^7.18.9"
+ "@babel/plugin-proposal-optional-catch-binding" "^7.18.6"
+ "@babel/plugin-proposal-optional-chaining" "^7.18.9"
+ "@babel/plugin-proposal-private-methods" "^7.18.6"
+ "@babel/plugin-proposal-private-property-in-object" "^7.18.6"
+ "@babel/plugin-proposal-unicode-property-regex" "^7.18.6"
+ "@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.18.6"
+ "@babel/plugin-syntax-json-strings" "^7.8.3"
+ "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4"
+ "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3"
+ "@babel/plugin-syntax-numeric-separator" "^7.10.4"
+ "@babel/plugin-syntax-object-rest-spread" "^7.8.3"
+ "@babel/plugin-syntax-optional-catch-binding" "^7.8.3"
+ "@babel/plugin-syntax-optional-chaining" "^7.8.3"
+ "@babel/plugin-syntax-private-property-in-object" "^7.14.5"
+ "@babel/plugin-syntax-top-level-await" "^7.14.5"
+ "@babel/plugin-transform-arrow-functions" "^7.18.6"
+ "@babel/plugin-transform-async-to-generator" "^7.18.6"
+ "@babel/plugin-transform-block-scoped-functions" "^7.18.6"
+ "@babel/plugin-transform-block-scoping" "^7.18.9"
+ "@babel/plugin-transform-classes" "^7.19.0"
+ "@babel/plugin-transform-computed-properties" "^7.18.9"
+ "@babel/plugin-transform-destructuring" "^7.18.13"
+ "@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.18.8"
+ "@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.18.6"
+ "@babel/plugin-transform-modules-commonjs" "^7.18.6"
+ "@babel/plugin-transform-modules-systemjs" "^7.19.0"
+ "@babel/plugin-transform-modules-umd" "^7.18.6"
+ "@babel/plugin-transform-named-capturing-groups-regex" "^7.19.1"
+ "@babel/plugin-transform-new-target" "^7.18.6"
+ "@babel/plugin-transform-object-super" "^7.18.6"
+ "@babel/plugin-transform-parameters" "^7.18.8"
+ "@babel/plugin-transform-property-literals" "^7.18.6"
+ "@babel/plugin-transform-regenerator" "^7.18.6"
+ "@babel/plugin-transform-reserved-words" "^7.18.6"
+ "@babel/plugin-transform-shorthand-properties" "^7.18.6"
+ "@babel/plugin-transform-spread" "^7.19.0"
+ "@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.18.10"
+ "@babel/plugin-transform-unicode-regex" "^7.18.6"
+ "@babel/preset-modules" "^0.1.5"
+ "@babel/types" "^7.19.3"
+ 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/preset-modules@^0.1.5":
+ 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==
+ 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"
+
+"@babel/runtime@^7.8.4":
+ version "7.19.0"
+ resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.19.0.tgz"
+ integrity sha512-eR8Lo9hnDS7tqkO7NsV+mKvCmv5boaXFSZ70DnfhcgiEne8hv9oCEd36Klw74EtizEqLsy4YnW8UWwpBVolHZA==
+ dependencies:
+ regenerator-runtime "^0.13.4"
+
+"@babel/template@^7.18.10":
+ version "7.18.10"
+ resolved "https://registry.npmjs.org/@babel/template/-/template-7.18.10.tgz"
+ integrity sha512-TI+rCtooWHr3QJ27kJxfjutghu44DLnasDMwpDqCXVTal9RLp3RSYNh4NdBrRP2cQAoG9A8juOQl6P6oZG4JxA==
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/parser" "^7.18.10"
+ "@babel/types" "^7.18.10"
+
+"@babel/traverse@^7.19.0", "@babel/traverse@^7.19.1", "@babel/traverse@^7.19.3":
+ version "7.19.3"
+ resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz"
+ integrity sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==
+ dependencies:
+ "@babel/code-frame" "^7.18.6"
+ "@babel/generator" "^7.19.3"
+ "@babel/helper-environment-visitor" "^7.18.9"
+ "@babel/helper-function-name" "^7.19.0"
+ "@babel/helper-hoist-variables" "^7.18.6"
+ "@babel/helper-split-export-declaration" "^7.18.6"
+ "@babel/parser" "^7.19.3"
+ "@babel/types" "^7.19.3"
+ debug "^4.1.0"
+ globals "^11.1.0"
+
+"@babel/types@^7.18.10", "@babel/types@^7.18.6", "@babel/types@^7.18.9", "@babel/types@^7.19.0", "@babel/types@^7.19.3", "@babel/types@^7.4.4":
+ version "7.19.3"
+ resolved "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz"
+ integrity sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==
+ dependencies:
+ "@babel/helper-string-parser" "^7.18.10"
+ "@babel/helper-validator-identifier" "^7.19.1"
+ to-fast-properties "^2.0.0"
+
+"@discoveryjs/json-ext@^0.5.0":
+ version "0.5.7"
+ resolved "https://registry.yarnpkg.com/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz#1d572bfbbe14b7704e0ba0f39b74815b84870d70"
+ integrity sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==
+
+"@jridgewell/gen-mapping@^0.1.0":
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz"
+ integrity sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.0"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@jridgewell/gen-mapping@^0.3.0", "@jridgewell/gen-mapping@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz"
+ integrity sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==
+ dependencies:
+ "@jridgewell/set-array" "^1.0.1"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/resolve-uri@^3.0.3":
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz"
+ integrity sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==
+
+"@jridgewell/set-array@^1.0.0", "@jridgewell/set-array@^1.0.1":
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz"
+ integrity sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==
+
+"@jridgewell/source-map@^0.3.2":
+ version "0.3.2"
+ resolved "https://registry.yarnpkg.com/@jridgewell/source-map/-/source-map-0.3.2.tgz#f45351aaed4527a298512ec72f81040c998580fb"
+ integrity sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==
+ dependencies:
+ "@jridgewell/gen-mapping" "^0.3.0"
+ "@jridgewell/trace-mapping" "^0.3.9"
+
+"@jridgewell/sourcemap-codec@^1.4.10":
+ version "1.4.14"
+ resolved "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz"
+ integrity sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==
+
+"@jridgewell/trace-mapping@^0.3.14", "@jridgewell/trace-mapping@^0.3.9":
+ version "0.3.15"
+ resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz"
+ integrity sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==
+ dependencies:
+ "@jridgewell/resolve-uri" "^3.0.3"
+ "@jridgewell/sourcemap-codec" "^1.4.10"
+
+"@leichtgewicht/ip-codec@^2.0.1":
+ version "2.0.4"
+ resolved "https://registry.yarnpkg.com/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz#b2ac626d6cb9c8718ab459166d4bb405b8ffa78b"
+ integrity sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==
+
+"@nuxt/friendly-errors-webpack-plugin@^2.5.1":
+ version "2.5.2"
+ resolved "https://registry.yarnpkg.com/@nuxt/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-2.5.2.tgz#982a43ee2da61611f7396439e57038392d3944d5"
+ integrity sha512-LLc+90lnxVbpKkMqk5z1EWpXoODhc6gRkqqXJCInJwF5xabHAE7biFvbULfvTRmtaTzAaP8IV4HQDLUgeAUTTw==
+ dependencies:
+ chalk "^2.3.2"
+ consola "^2.6.0"
+ error-stack-parser "^2.0.0"
+ string-width "^4.2.3"
+
+"@symfony/webpack-encore@^1.7.0":
+ version "1.8.2"
+ resolved "https://registry.yarnpkg.com/@symfony/webpack-encore/-/webpack-encore-1.8.2.tgz#ceffa0d9326d29fa62b3a61f213e8e01a9992a7e"
+ integrity sha512-ZOsOqaZNP3BSQuISAsyH/Jv5+rDxbM4Wf6IsKo1y5Cm9BFIS2dPLsqDZfMbi6G2HdAHm88JqX/HGwxE73eADEw==
+ dependencies:
+ "@babel/core" "^7.7.0"
+ "@babel/plugin-syntax-dynamic-import" "^7.0.0"
+ "@babel/preset-env" "^7.10.0"
+ "@nuxt/friendly-errors-webpack-plugin" "^2.5.1"
+ assets-webpack-plugin "7.0.*"
+ babel-loader "^8.2.2"
+ chalk "^4.0.0"
+ clean-webpack-plugin "^3.0.0"
+ css-loader "^5.2.4"
+ css-minimizer-webpack-plugin "^2.0.0"
+ fast-levenshtein "^3.0.0"
+ loader-utils "^2.0.0"
+ mini-css-extract-plugin "^1.5.0"
+ pkg-up "^3.1.0"
+ pretty-error "^3.0.3"
+ resolve-url-loader "^3.1.2"
+ semver "^7.3.2"
+ style-loader "^2.0.0"
+ sync-rpc "^1.3.6"
+ terser-webpack-plugin "^5.1.1"
+ tmp "^0.2.1"
+ webpack "^5.35"
+ webpack-cli "^4.9.1"
+ webpack-dev-server "^4.0.0"
+ yargs-parser "^20.2.4"
+
+"@trysound/sax@0.2.0":
+ version "0.2.0"
+ resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
+ integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
+
+"@types/body-parser@*":
+ version "1.19.2"
+ resolved "https://registry.yarnpkg.com/@types/body-parser/-/body-parser-1.19.2.tgz#aea2059e28b7658639081347ac4fab3de166e6f0"
+ integrity sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==
+ dependencies:
+ "@types/connect" "*"
+ "@types/node" "*"
+
+"@types/bonjour@^3.5.9":
+ version "3.5.10"
+ resolved "https://registry.yarnpkg.com/@types/bonjour/-/bonjour-3.5.10.tgz#0f6aadfe00ea414edc86f5d106357cda9701e275"
+ integrity sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/connect-history-api-fallback@^1.3.5":
+ version "1.3.5"
+ resolved "https://registry.yarnpkg.com/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz#d1f7a8a09d0ed5a57aee5ae9c18ab9b803205dae"
+ integrity sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==
+ dependencies:
+ "@types/express-serve-static-core" "*"
+ "@types/node" "*"
+
+"@types/connect@*":
+ version "3.4.35"
+ resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.35.tgz#5fcf6ae445e4021d1fc2219a4873cc73a3bb2ad1"
+ integrity sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==
+ dependencies:
+ "@types/node" "*"
+
+"@types/eslint-scope@^3.7.3":
+ version "3.7.4"
+ resolved "https://registry.yarnpkg.com/@types/eslint-scope/-/eslint-scope-3.7.4.tgz#37fc1223f0786c39627068a12e94d6e6fc61de16"
+ integrity sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==
+ dependencies:
+ "@types/eslint" "*"
+ "@types/estree" "*"
+
+"@types/eslint@*":
+ version "8.4.6"
+ resolved "https://registry.yarnpkg.com/@types/eslint/-/eslint-8.4.6.tgz#7976f054c1bccfcf514bff0564c0c41df5c08207"
+ integrity sha512-/fqTbjxyFUaYNO7VcW5g+4npmqVACz1bB7RTHYuLj+PRjw9hrCwrUXVQFpChUS0JsyEFvMZ7U/PfmvWgxJhI9g==
+ dependencies:
+ "@types/estree" "*"
+ "@types/json-schema" "*"
+
+"@types/estree@*":
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-1.0.0.tgz#5fb2e536c1ae9bf35366eed879e827fa59ca41c2"
+ integrity sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==
+
+"@types/estree@^0.0.51":
+ version "0.0.51"
+ resolved "https://registry.yarnpkg.com/@types/estree/-/estree-0.0.51.tgz#cfd70924a25a3fd32b218e5e420e6897e1ac4f40"
+ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==
+
+"@types/express-serve-static-core@*", "@types/express-serve-static-core@^4.17.18":
+ version "4.17.31"
+ resolved "https://registry.yarnpkg.com/@types/express-serve-static-core/-/express-serve-static-core-4.17.31.tgz#a1139efeab4e7323834bb0226e62ac019f474b2f"
+ integrity sha512-DxMhY+NAsTwMMFHBTtJFNp5qiHKJ7TeqOo23zVEM9alT1Ml27Q3xcTH0xwxn7Q0BbMcVEJOs/7aQtUWupUQN3Q==
+ dependencies:
+ "@types/node" "*"
+ "@types/qs" "*"
+ "@types/range-parser" "*"
+
+"@types/express@*", "@types/express@^4.17.13":
+ version "4.17.14"
+ resolved "https://registry.yarnpkg.com/@types/express/-/express-4.17.14.tgz#143ea0557249bc1b3b54f15db4c81c3d4eb3569c"
+ integrity sha512-TEbt+vaPFQ+xpxFLFssxUDXj5cWCxZJjIcB7Yg0k0GMHGtgtQgpvx/MUQUeAkNbA9AAGrwkAsoeItdTgS7FMyg==
+ dependencies:
+ "@types/body-parser" "*"
+ "@types/express-serve-static-core" "^4.17.18"
+ "@types/qs" "*"
+ "@types/serve-static" "*"
+
+"@types/glob@^7.1.1":
+ version "7.2.0"
+ resolved "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz"
+ integrity sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==
+ dependencies:
+ "@types/minimatch" "*"
+ "@types/node" "*"
+
+"@types/http-proxy@^1.17.8":
+ version "1.17.9"
+ resolved "https://registry.yarnpkg.com/@types/http-proxy/-/http-proxy-1.17.9.tgz#7f0e7931343761efde1e2bf48c40f02f3f75705a"
+ integrity sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/json-schema@*", "@types/json-schema@^7.0.5", "@types/json-schema@^7.0.8", "@types/json-schema@^7.0.9":
+ version "7.0.11"
+ resolved "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz"
+ integrity sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==
+
+"@types/json5@^0.0.29":
+ version "0.0.29"
+ resolved "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz"
+ integrity sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==
+
+"@types/mime@*":
+ version "3.0.1"
+ resolved "https://registry.yarnpkg.com/@types/mime/-/mime-3.0.1.tgz#5f8f2bca0a5863cb69bc0b0acd88c96cb1d4ae10"
+ integrity sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==
+
+"@types/minimatch@*":
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz"
+ integrity sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==
+
+"@types/node@*":
+ version "18.7.23"
+ resolved "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz"
+ integrity sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==
+
+"@types/qs@*":
+ version "6.9.7"
+ resolved "https://registry.yarnpkg.com/@types/qs/-/qs-6.9.7.tgz#63bb7d067db107cc1e457c303bc25d511febf6cb"
+ integrity sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==
+
+"@types/range-parser@*":
+ version "1.2.4"
+ resolved "https://registry.yarnpkg.com/@types/range-parser/-/range-parser-1.2.4.tgz#cd667bcfdd025213aafb7ca5915a932590acdcdc"
+ integrity sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==
+
+"@types/retry@0.12.0":
+ version "0.12.0"
+ resolved "https://registry.yarnpkg.com/@types/retry/-/retry-0.12.0.tgz#2b35eccfcee7d38cd72ad99232fbd58bffb3c84d"
+ integrity sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==
+
+"@types/serve-index@^1.9.1":
+ version "1.9.1"
+ resolved "https://registry.yarnpkg.com/@types/serve-index/-/serve-index-1.9.1.tgz#1b5e85370a192c01ec6cec4735cf2917337a6278"
+ integrity sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==
+ dependencies:
+ "@types/express" "*"
+
+"@types/serve-static@*", "@types/serve-static@^1.13.10":
+ version "1.15.0"
+ resolved "https://registry.yarnpkg.com/@types/serve-static/-/serve-static-1.15.0.tgz#c7930ff61afb334e121a9da780aac0d9b8f34155"
+ integrity sha512-z5xyF6uh8CbjAu9760KDKsH2FcDxZ2tFCsA4HIMWE6IkiYMXfVoa+4f9KX+FN0ZLsaMw1WNG2ETLA6N+/YA+cg==
+ dependencies:
+ "@types/mime" "*"
+ "@types/node" "*"
+
+"@types/sockjs@^0.3.33":
+ version "0.3.33"
+ resolved "https://registry.yarnpkg.com/@types/sockjs/-/sockjs-0.3.33.tgz#570d3a0b99ac995360e3136fd6045113b1bd236f"
+ integrity sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==
+ dependencies:
+ "@types/node" "*"
+
+"@types/source-list-map@*":
+ version "0.1.2"
+ resolved "https://registry.yarnpkg.com/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
+ integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
+
+"@types/tapable@^1":
+ version "1.0.8"
+ resolved "https://registry.yarnpkg.com/@types/tapable/-/tapable-1.0.8.tgz#b94a4391c85666c7b73299fd3ad79d4faa435310"
+ integrity sha512-ipixuVrh2OdNmauvtT51o3d8z12p6LtFW9in7U79der/kwejjdNchQC5UMn5u/KxNoM7VHHOs/l8KS8uHxhODQ==
+
+"@types/uglify-js@*":
+ version "3.17.0"
+ resolved "https://registry.yarnpkg.com/@types/uglify-js/-/uglify-js-3.17.0.tgz#95271e7abe0bf7094c60284f76ee43232aef43b9"
+ integrity sha512-3HO6rm0y+/cqvOyA8xcYLweF0TKXlAxmQASjbOi49Co51A1N4nR4bEwBgRoD9kNM+rqFGArjKr654SLp2CoGmQ==
+ dependencies:
+ source-map "^0.6.1"
+
+"@types/webpack-sources@*":
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/@types/webpack-sources/-/webpack-sources-3.2.0.tgz#16d759ba096c289034b26553d2df1bf45248d38b"
+ integrity sha512-Ft7YH3lEVRQ6ls8k4Ff1oB4jN6oy/XmU6tQISKdhfh+1mR+viZFphS6WL0IrtDOzvefmJg5a0s7ZQoRXwqTEFg==
+ dependencies:
+ "@types/node" "*"
+ "@types/source-list-map" "*"
+ source-map "^0.7.3"
+
+"@types/webpack@^4.4.31":
+ version "4.41.32"
+ resolved "https://registry.yarnpkg.com/@types/webpack/-/webpack-4.41.32.tgz#a7bab03b72904070162b2f169415492209e94212"
+ integrity sha512-cb+0ioil/7oz5//7tZUSwbrSAN/NWHrQylz5cW8G0dWTcF/g+/dSdMlKVZspBYuMAN1+WnwHrkxiRrLcwd0Heg==
+ dependencies:
+ "@types/node" "*"
+ "@types/tapable" "^1"
+ "@types/uglify-js" "*"
+ "@types/webpack-sources" "*"
+ anymatch "^3.0.0"
+ source-map "^0.6.0"
+
+"@types/ws@^8.5.1":
+ version "8.5.3"
+ resolved "https://registry.yarnpkg.com/@types/ws/-/ws-8.5.3.tgz#7d25a1ffbecd3c4f2d35068d0b283c037003274d"
+ integrity sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==
+ dependencies:
+ "@types/node" "*"
+
+"@webassemblyjs/ast@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"
+ integrity sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==
+ dependencies:
+ "@webassemblyjs/helper-numbers" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+
+"@webassemblyjs/floating-point-hex-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz#f6c61a705f0fd7a6aecaa4e8198f23d9dc179e4f"
+ integrity sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==
+
+"@webassemblyjs/helper-api-error@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz#1a63192d8788e5c012800ba6a7a46c705288fd16"
+ integrity sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==
+
+"@webassemblyjs/helper-buffer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz#832a900eb444884cde9a7cad467f81500f5e5ab5"
+ integrity sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==
+
+"@webassemblyjs/helper-numbers@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz#64d81da219fbbba1e3bd1bfc74f6e8c4e10a62ae"
+ integrity sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==
+ dependencies:
+ "@webassemblyjs/floating-point-hex-parser" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/helper-wasm-bytecode@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz#f328241e41e7b199d0b20c18e88429c4433295e1"
+ integrity sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==
+
+"@webassemblyjs/helper-wasm-section@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz#21ee065a7b635f319e738f0dd73bfbda281c097a"
+ integrity sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+
+"@webassemblyjs/ieee754@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz#963929e9bbd05709e7e12243a099180812992614"
+ integrity sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==
+ dependencies:
+ "@xtuc/ieee754" "^1.2.0"
+
+"@webassemblyjs/leb128@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.11.1.tgz#ce814b45574e93d76bae1fb2644ab9cdd9527aa5"
+ integrity sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==
+ dependencies:
+ "@xtuc/long" "4.2.2"
+
+"@webassemblyjs/utf8@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.11.1.tgz#d1f8b764369e7c6e6bae350e854dec9a59f0a3ff"
+ integrity sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==
+
+"@webassemblyjs/wasm-edit@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz#ad206ebf4bf95a058ce9880a8c092c5dec8193d6"
+ integrity sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/helper-wasm-section" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-opt" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ "@webassemblyjs/wast-printer" "1.11.1"
+
+"@webassemblyjs/wasm-gen@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz#86c5ea304849759b7d88c47a32f4f039ae3c8f76"
+ integrity sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wasm-opt@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz#657b4c2202f4cf3b345f8a4c6461c8c2418985f2"
+ integrity sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-buffer" "1.11.1"
+ "@webassemblyjs/wasm-gen" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+
+"@webassemblyjs/wasm-parser@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz#86ca734534f417e9bd3c67c7a1c75d8be41fb199"
+ integrity sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/helper-api-error" "1.11.1"
+ "@webassemblyjs/helper-wasm-bytecode" "1.11.1"
+ "@webassemblyjs/ieee754" "1.11.1"
+ "@webassemblyjs/leb128" "1.11.1"
+ "@webassemblyjs/utf8" "1.11.1"
+
+"@webassemblyjs/wast-printer@1.11.1":
+ version "1.11.1"
+ resolved "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz#d0c73beda8eec5426f10ae8ef55cee5e7084c2f0"
+ integrity sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==
+ dependencies:
+ "@webassemblyjs/ast" "1.11.1"
+ "@xtuc/long" "4.2.2"
+
+"@webpack-cli/configtest@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/configtest/-/configtest-1.2.0.tgz#7b20ce1c12533912c3b217ea68262365fa29a6f5"
+ integrity sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==
+
+"@webpack-cli/info@^1.5.0":
+ version "1.5.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/info/-/info-1.5.0.tgz#6c78c13c5874852d6e2dd17f08a41f3fe4c261b1"
+ integrity sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==
+ dependencies:
+ envinfo "^7.7.3"
+
+"@webpack-cli/serve@^1.7.0":
+ version "1.7.0"
+ resolved "https://registry.yarnpkg.com/@webpack-cli/serve/-/serve-1.7.0.tgz#e1993689ac42d2b16e9194376cfb6753f6254db1"
+ integrity sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==
+
+"@xtuc/ieee754@^1.2.0":
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz"
+ integrity sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==
+
+"@xtuc/long@4.2.2":
+ version "4.2.2"
+ resolved "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz"
+ integrity sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==
+
+abbrev@1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz"
+ integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==
+
+accepts@~1.3.4, accepts@~1.3.5, accepts@~1.3.8:
+ version "1.3.8"
+ resolved "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz"
+ integrity sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==
+ dependencies:
+ mime-types "~2.1.34"
+ negotiator "0.6.3"
+
+acorn-es7-plugin@^1.1.7:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/acorn-es7-plugin/-/acorn-es7-plugin-1.1.7.tgz"
+ integrity sha512-7D+8kscFMf6F2t+8ZRYmv82CncDZETsaZ4dEl5lh3qQez7FVABk2Vz616SAbnIq1PbNsLVaZjl2oSkk5BWAKng==
+
+acorn-import-assertions@^1.7.6:
+ version "1.8.0"
+ resolved "https://registry.yarnpkg.com/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz#ba2b5939ce62c238db6d93d81c9b111b29b855e9"
+ integrity sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==
+
+acorn-jsx@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz"
+ integrity sha512-AU7pnZkguthwBjKgCg6998ByQNIMjbuDQZ8bb78QAFZwPfmKia8AIzgY/gWgqCjnht8JLdXmB4YxA0KaV60ncQ==
+ dependencies:
+ acorn "^3.0.4"
+
+"acorn@>= 2.5.2 <= 5.7.5":
+ version "4.0.13"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-4.0.13.tgz"
+ integrity sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==
+
+acorn@^3.0.4:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz"
+ integrity sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==
+
+acorn@^5.5.0:
+ version "5.7.4"
+ resolved "https://registry.npmjs.org/acorn/-/acorn-5.7.4.tgz"
+ integrity sha512-1D++VG7BhrtvQpNbBzovKNc1FLGGEE/oGe7b9xJm/RFHMBeUaUGpluV9RLjZa47YFdPcDAenEYuq9pQPcMdLJg==
+
+acorn@^8.5.0, acorn@^8.7.1:
+ version "8.8.0"
+ resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
+ integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
+
+adjust-sourcemap-loader@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz"
+ integrity sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==
+ dependencies:
+ loader-utils "^2.0.0"
+ regex-parser "^2.2.11"
+
+ajv-formats@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/ajv-formats/-/ajv-formats-2.1.1.tgz#6e669400659eb74973bbf2e33327180a0996b520"
+ integrity sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==
+ dependencies:
+ ajv "^8.0.0"
+
+ajv-keywords@^2.1.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz"
+ integrity sha512-ZFztHzVRdGLAzJmpUT9LNFLe1YiVOEylcaNpEutM26PVTCtOD919IMfD01CgbRouB42Dd9atjx1HseC15DgOZA==
+
+ajv-keywords@^3.5.2:
+ version "3.5.2"
+ resolved "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz"
+ integrity sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==
+
+ajv-keywords@^5.0.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-5.1.0.tgz#69d4d385a4733cdbeab44964a1170a88f87f0e16"
+ integrity sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==
+ dependencies:
+ fast-deep-equal "^3.1.3"
+
+ajv@^5.2.3, ajv@^5.3.0:
+ version "5.5.2"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz"
+ integrity sha512-Ajr4IcMXq/2QmMkEmSvxqfLN5zGmJ92gHXAeOXq1OekoH2rfDNsgdDoL2f7QaRCy7G/E6TpxBVdRuNraMztGHw==
+ dependencies:
+ co "^4.6.0"
+ fast-deep-equal "^1.0.0"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.3.0"
+
+ajv@^6.12.3, ajv@^6.12.4, ajv@^6.12.5:
+ version "6.12.6"
+ resolved "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz"
+ integrity sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ fast-json-stable-stringify "^2.0.0"
+ json-schema-traverse "^0.4.1"
+ uri-js "^4.2.2"
+
+ajv@^8.0.0, ajv@^8.8.0:
+ version "8.11.0"
+ resolved "https://registry.yarnpkg.com/ajv/-/ajv-8.11.0.tgz#977e91dd96ca669f54a11e23e378e33b884a565f"
+ integrity sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==
+ dependencies:
+ fast-deep-equal "^3.1.1"
+ json-schema-traverse "^1.0.0"
+ require-from-string "^2.0.2"
+ uri-js "^4.2.2"
+
+amdefine@>=0.0.4:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz"
+ integrity sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==
+
+ansi-escapes@^3.0.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz"
+ integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==
+
+ansi-html-community@^0.0.8:
+ version "0.0.8"
+ resolved "https://registry.yarnpkg.com/ansi-html-community/-/ansi-html-community-0.0.8.tgz#69fbc4d6ccbe383f9736934ae34c3f8290f1bf41"
+ integrity sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==
+
+ansi-regex@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz"
+ integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
+
+ansi-regex@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz"
+ integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==
+
+ansi-regex@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz"
+ integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==
+
+ansi-regex@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.1.tgz#082cb2c89c9fe8659a311a53bd6a4dc5301db304"
+ integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==
+
+ansi-styles@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz"
+ integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
+
+ansi-styles@^3.2.0, ansi-styles@^3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz"
+ integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==
+ dependencies:
+ color-convert "^1.9.0"
+
+ansi-styles@^4.1.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.3.0.tgz#edd803628ae71c04c85ae7a0906edad34b648937"
+ integrity sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==
+ dependencies:
+ color-convert "^2.0.1"
+
+anymatch@^3.0.0, anymatch@~3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz"
+ integrity sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==
+ dependencies:
+ normalize-path "^3.0.0"
+ picomatch "^2.0.4"
+
+aproba@^1.0.3:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz"
+ integrity sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==
+
+are-we-there-yet@~1.1.2:
+ version "1.1.7"
+ resolved "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.7.tgz"
+ integrity sha512-nxwy40TuMiUGqMyRHgCSWZ9FM4VAoRP4xUYSTv5ImRog+h9yISPbVH7H8fASCIzYn9wlEv4zvFL7uKDMCFQm3g==
+ dependencies:
+ delegates "^1.0.0"
+ readable-stream "^2.0.6"
+
+argparse@^1.0.7:
+ version "1.0.10"
+ resolved "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz"
+ integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==
+ dependencies:
+ sprintf-js "~1.0.2"
+
+arity-n@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/arity-n/-/arity-n-1.0.4.tgz"
+ integrity sha512-fExL2kFDC1Q2DUOx3whE/9KoN66IzkY4b4zUHUBFM1ojEYjZZYDcUW3bek/ufGionX9giIKDC5redH2IlGqcQQ==
+
+array-find-index@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz"
+ integrity sha512-M1HQyIXcBGtVywBt8WVdim+lrNaK7VHp99Qt5pSNziXznKHViIBbXWtfRTpEFpF/c4FdfxNAsCCwPp5phBYJtw==
+
+array-flatten@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz"
+ integrity sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==
+
+array-flatten@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz#24ef80a28c1a893617e2149b0c6d0d788293b099"
+ integrity sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==
+
+array-includes@^3.1.4:
+ version "3.1.5"
+ resolved "https://registry.npmjs.org/array-includes/-/array-includes-3.1.5.tgz"
+ integrity sha512-iSDYZMMyTPkiFasVqfuAQnWAYcvO/SeBSCGKePoEthjp4LEMTe4uLc7b025o4jAZpHhihh8xPo99TNWUWWkGDQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.19.5"
+ get-intrinsic "^1.1.1"
+ is-string "^1.0.7"
+
+array-union@^1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz"
+ integrity sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==
+ dependencies:
+ array-uniq "^1.0.1"
+
+array-uniq@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz"
+ integrity sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==
+
+array.prototype.flat@^1.2.5:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.0.tgz"
+ integrity sha512-12IUEkHsAhA4DY5s0FPgNXIdc8VRSqD9Zp78a5au9abH/SOBrsp082JOWFNTjkMozh8mqcdiKuaLGhPeYztxSw==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.2"
+ es-shim-unscopables "^1.0.0"
+
+asn1@~0.2.3:
+ version "0.2.6"
+ resolved "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz"
+ integrity sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==
+ dependencies:
+ safer-buffer "~2.1.0"
+
+assert-plus@1.0.0, assert-plus@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz"
+ integrity sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==
+
+assets-webpack-plugin@7.0.*:
+ version "7.0.0"
+ resolved "https://registry.yarnpkg.com/assets-webpack-plugin/-/assets-webpack-plugin-7.0.0.tgz#c61ed7466f35ff7a4d90d7070948736f471b8804"
+ integrity sha512-DMZ9r6HFxynWeONRMhSOFTvTrmit5dovdoUKdJgCG03M6CC7XiwNImPH+Ad1jaVrQ2n59e05lBhte52xPt4MSA==
+ dependencies:
+ camelcase "^6.0.0"
+ escape-string-regexp "^4.0.0"
+ lodash "^4.17.20"
+
+async-foreach@^0.1.3:
+ version "0.1.3"
+ resolved "https://registry.npmjs.org/async-foreach/-/async-foreach-0.1.3.tgz"
+ integrity sha512-VUeSMD8nEGBWaZK4lizI1sf3yEC7pnAQ/mrI7pC2fBz2s/tq5jWWEngTwaf0Gruu/OoXRGLGg1XFqpYBiGTYJA==
+
+asynckit@^0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz"
+ integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+atob@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz"
+ integrity sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==
+
+aws-sign2@~0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz"
+ integrity sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==
+
+aws4@^1.8.0:
+ version "1.11.0"
+ resolved "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz"
+ integrity sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==
+
+babel-code-frame@^6.22.0, babel-code-frame@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz"
+ integrity sha512-XqYMR2dfdGMW+hd0IUZ2PwK+fGeFkOxZJ0wY+JaQAHzt1Zx8LcvpiZD2NiGkEG8qx0CfkAOr5xt76d1e8vG90g==
+ dependencies:
+ chalk "^1.1.3"
+ esutils "^2.0.2"
+ js-tokens "^3.0.2"
+
+babel-core@^6.26.0, babel-core@^6.26.3:
+ version "6.26.3"
+ resolved "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz"
+ integrity sha512-6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-generator "^6.26.0"
+ babel-helpers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-register "^6.26.0"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ convert-source-map "^1.5.1"
+ debug "^2.6.9"
+ json5 "^0.5.1"
+ lodash "^4.17.4"
+ minimatch "^3.0.4"
+ path-is-absolute "^1.0.1"
+ private "^0.1.8"
+ slash "^1.0.0"
+ source-map "^0.5.7"
+
+babel-generator@^6.26.0:
+ version "6.26.1"
+ resolved "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz"
+ integrity sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.17.4"
+ source-map "^0.5.7"
+ trim-right "^1.0.1"
+
+babel-helper-builder-binary-assignment-operator-visitor@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz"
+ integrity sha512-gCtfYORSG1fUMX4kKraymq607FWgMWg+j42IFPc18kFQEsmtaibP4UrqsXt8FlEJle25HUd4tsoDR7H2wDhe9Q==
+ dependencies:
+ babel-helper-explode-assignable-expression "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-call-delegate@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz"
+ integrity sha512-RL8n2NiEj+kKztlrVJM9JT1cXzzAdvWFh76xh/H1I4nKwunzE4INBXn8ieCZ+wh4zWszZk7NBS1s/8HR5jDkzQ==
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-define-map@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz"
+ integrity sha512-bHkmjcC9lM1kmZcVpA5t2om2nzT/xiZpo6TJq7UlZ3wqKfzia4veeXbIhKvJXAMzhhEBd3cR1IElL5AenWEUpA==
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-explode-assignable-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz"
+ integrity sha512-qe5csbhbvq6ccry9G7tkXbzNtcDiH4r51rrPUbwwoTzZ18AqxWYRZT6AOmxrpxKnQBW0pYlBI/8vh73Z//78nQ==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-function-name@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz"
+ integrity sha512-Oo6+e2iX+o9eVvJ9Y5eKL5iryeRdsIkwRYheCuhYdVHsdEQysbc2z2QkqCLIYnNxkT5Ss3ggrHdXiDI7Dhrn4Q==
+ dependencies:
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-get-function-arity@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz"
+ integrity sha512-WfgKFX6swFB1jS2vo+DwivRN4NB8XUdM3ij0Y1gnC21y1tdBoe6xjVnd7NSI6alv+gZXCtJqvrTeMW3fR/c0ng==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-hoist-variables@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz"
+ integrity sha512-zAYl3tqerLItvG5cKYw7f1SpvIxS9zi7ohyGHaI9cgDUjAT6YcY9jIEH5CstetP5wHIVSceXwNS7Z5BpJg+rOw==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-optimise-call-expression@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz"
+ integrity sha512-Op9IhEaxhbRT8MDXx2iNuMgciu2V8lDvYCNQbDGjdBNCjaMvyLf4wl4A3b8IgndCyQF8TwfgsQ8T3VD8aX1/pA==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-helper-regex@^6.24.1:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz"
+ integrity sha512-VlPiWmqmGJp0x0oK27Out1D+71nVVCTSdlbhIVoaBAj2lUgrNjBCRR9+llO4lTSb2O4r7PJg+RobRkhBrf6ofg==
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-helper-remap-async-to-generator@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz"
+ integrity sha512-RYqaPD0mQyQIFRu7Ho5wE2yvA/5jxqCIj/Lv4BXNq23mHYu/vxikOy2JueLiBxQknwapwrJeNCesvY0ZcfnlHg==
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helper-replace-supers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz"
+ integrity sha512-sLI+u7sXJh6+ToqDr57Bv973kCepItDhMou0xCP2YPVmR1jkHSCY+p1no8xErbV1Siz5QE8qKT1WIwybSWlqjw==
+ dependencies:
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-helpers@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz"
+ integrity sha512-n7pFrqQm44TCYvrCDb0MqabAF+JUBq+ijBvNMUxpkLjJaAu32faIexewMumrH5KLLJ1HDyT0PTEqRyAe/GwwuQ==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-loader@^8.2.2:
+ version "8.2.5"
+ resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.5.tgz#d45f585e654d5a5d90f5350a779d7647c5ed512e"
+ integrity sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==
+ dependencies:
+ find-cache-dir "^3.3.1"
+ loader-utils "^2.0.0"
+ make-dir "^3.1.0"
+ schema-utils "^2.6.5"
+
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz"
+ integrity sha512-Bl3ZiA+LjqaMtNYopA9TYE9HP1tQ+E5dLxE0XrAzcIJeK2UqF0/EaqXwBn9esd4UmTfEab+P+UYQ1GnioFIb/w==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-check-es2015-constants@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz"
+ integrity sha512-B1M5KBP29248dViEo1owyY32lk1ZSH2DaNNrXLGt8lyjjHm7pBqAdQ7VKUPR6EEDO323+OvT3MQXbCin8ooWdA==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-dynamic-import-node@^2.3.3:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz"
+ integrity sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==
+ dependencies:
+ object.assign "^4.1.0"
+
+babel-plugin-external-helpers@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-external-helpers/-/babel-plugin-external-helpers-6.22.0.tgz"
+ integrity sha512-TdAMiM6MzLokhk3yCA0KCctmivVZ/mmCwbp7YPmRGkqh2KkcNuxE3R0jxuYU+4xmvfMZx4p4uo8d1cT9t5BLxA==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-module-resolver@^3.1.1:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/babel-plugin-module-resolver/-/babel-plugin-module-resolver-3.2.0.tgz"
+ integrity sha512-tjR0GvSndzPew/Iayf4uICWZqjBwnlMWjSx6brryfQ81F9rxBVqwDJtFCV8oOs0+vJeefK9TmdZtkIFdFe1UnA==
+ dependencies:
+ find-babel-config "^1.1.0"
+ glob "^7.1.2"
+ pkg-up "^2.0.0"
+ reselect "^3.0.1"
+ resolve "^1.4.0"
+
+babel-plugin-polyfill-corejs2@^0.3.3:
+ 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==
+ dependencies:
+ "@babel/compat-data" "^7.17.7"
+ "@babel/helper-define-polyfill-provider" "^0.3.3"
+ semver "^6.1.1"
+
+babel-plugin-polyfill-corejs3@^0.6.0:
+ 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==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.3"
+ core-js-compat "^3.25.1"
+
+babel-plugin-polyfill-regenerator@^0.4.1:
+ 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==
+ dependencies:
+ "@babel/helper-define-polyfill-provider" "^0.3.3"
+
+babel-plugin-syntax-async-functions@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz"
+ integrity sha512-4Zp4unmHgw30A1eWI5EpACji2qMocisdXhAftfhXoSV9j0Tvj6nRFE3tOmRY912E0FMRm/L5xWE7MGVT2FoLnw==
+
+babel-plugin-syntax-exponentiation-operator@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz"
+ integrity sha512-Z/flU+T9ta0aIEKl1tGEmN/pZiI1uXmCiGFRegKacQfEJzp7iNsKloZmyJlQr+75FCJtiFfGIK03SiCvCt9cPQ==
+
+babel-plugin-syntax-object-rest-spread@^6.8.0:
+ version "6.13.0"
+ resolved "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz"
+ integrity sha512-C4Aq+GaAj83pRQ0EFgTvw5YO6T3Qz2KGrNRwIj9mSoNHVvdZY4KO2uA6HNtNXCw993iSZnckY1aLW8nOi8i4+w==
+
+babel-plugin-syntax-trailing-function-commas@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz"
+ integrity sha512-Gx9CH3Q/3GKbhs07Bszw5fPTlU+ygrOGfAhEt7W2JICwufpC4SuO0mG0+4NykPBSYPMJhqvVlDBU17qB1D+hMQ==
+
+babel-plugin-transform-async-to-generator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz"
+ integrity sha512-7BgYJujNCg0Ti3x0c/DL3tStvnKS6ktIYOmo9wginv/dfZOrbSZ+qG4IRRHMBOzZ5Awb1skTiAsQXg/+IWkZYw==
+ dependencies:
+ babel-helper-remap-async-to-generator "^6.24.1"
+ babel-plugin-syntax-async-functions "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-arrow-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz"
+ integrity sha512-PCqwwzODXW7JMrzu+yZIaYbPQSKjDTAsNNlK2l5Gg9g4rz2VzLnZsStvp/3c46GfXpwkyufb3NCyG9+50FF1Vg==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoped-functions@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz"
+ integrity sha512-2+ujAT2UMBzYFm7tidUsYh+ZoIutxJ3pN9IYrF1/H6dCKtECfhmB8UkHVpyxDwkj0CYbQG35ykoz925TUnBc3A==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-block-scoping@^6.23.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz"
+ integrity sha512-YiN6sFAQ5lML8JjCmr7uerS5Yc/EMbgg9G8ZNmk2E3nYX4ckHR01wrkeeMijEf5WHNK5TW0Sl0Uu3pv3EdOJWw==
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ lodash "^4.17.4"
+
+babel-plugin-transform-es2015-classes@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz"
+ integrity sha512-5Dy7ZbRinGrNtmWpquZKZ3EGY8sDgIVB4CU8Om8q8tnMLrD/m94cKglVcHps0BCTdZ0TJeeAWOq2TK9MIY6cag==
+ dependencies:
+ babel-helper-define-map "^6.24.1"
+ babel-helper-function-name "^6.24.1"
+ babel-helper-optimise-call-expression "^6.24.1"
+ babel-helper-replace-supers "^6.24.1"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-computed-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz"
+ integrity sha512-C/uAv4ktFP/Hmh01gMTvYvICrKze0XVX9f2PdIXuriCSvUmV9j+u+BB9f5fJK3+878yMK6dkdcq+Ymr9mrcLzw==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-destructuring@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz"
+ integrity sha512-aNv/GDAW0j/f4Uy1OEPZn1mqD+Nfy9viFGBfQ5bZyT35YqOiqx7/tXdyfZkJ1sC21NyEsBdfDY6PYmLHF4r5iA==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-duplicate-keys@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz"
+ integrity sha512-ossocTuPOssfxO2h+Z3/Ea1Vo1wWx31Uqy9vIiJusOP4TbF7tPs9U0sJ9pX9OJPf4lXRGj5+6Gkl/HHKiAP5ug==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-for-of@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz"
+ integrity sha512-DLuRwoygCoXx+YfxHLkVx5/NpeSbVwfoTeBykpJK7JhYWlL/O8hgAK/reforUnZDlxasOrVPPJVI/guE3dCwkw==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-function-name@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz"
+ integrity sha512-iFp5KIcorf11iBqu/y/a7DK3MN5di3pNCzto61FqCNnUX4qeBwcV1SLqe10oXNnCaxBUImX3SckX2/o1nsrTcg==
+ dependencies:
+ babel-helper-function-name "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz"
+ integrity sha512-tjFl0cwMPpDYyoqYA9li1/7mGFit39XiNX5DKC/uCNjBctMxyL1/PT/l4rSlbvBG1pOKI88STRdUsWXB3/Q9hQ==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-modules-amd@^6.22.0, babel-plugin-transform-es2015-modules-amd@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz"
+ integrity sha512-LnIIdGWIKdw7zwckqx+eGjcS8/cl8D74A3BpJbGjKTFFNJSMrjN4bIh22HY1AlkUbeLG6X6OZj56BDvWD+OeFA==
+ dependencies:
+ babel-plugin-transform-es2015-modules-commonjs "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-commonjs@^6.23.0, babel-plugin-transform-es2015-modules-commonjs@^6.24.1:
+ version "6.26.2"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz"
+ integrity sha512-CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==
+ dependencies:
+ babel-plugin-transform-strict-mode "^6.24.1"
+ babel-runtime "^6.26.0"
+ babel-template "^6.26.0"
+ babel-types "^6.26.0"
+
+babel-plugin-transform-es2015-modules-systemjs@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz"
+ integrity sha512-ONFIPsq8y4bls5PPsAWYXH/21Hqv64TBxdje0FvU3MhIV6QM2j5YS7KvAzg/nTIVLot2D2fmFQrFWCbgHlFEjg==
+ dependencies:
+ babel-helper-hoist-variables "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-modules-umd@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz"
+ integrity sha512-LpVbiT9CLsuAIp3IG0tfbVo81QIhn6pE8xBJ7XSeCtFlMltuar5VuBV6y6Q45tpui9QWcy5i0vLQfCfrnF7Kiw==
+ dependencies:
+ babel-plugin-transform-es2015-modules-amd "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+
+babel-plugin-transform-es2015-object-super@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz"
+ integrity sha512-8G5hpZMecb53vpD3mjs64NhI1au24TAmokQ4B+TBFBjN9cVoGoOvotdrMMRmHvVZUEvqGUPWL514woru1ChZMA==
+ dependencies:
+ babel-helper-replace-supers "^6.24.1"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-parameters@^6.23.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz"
+ integrity sha512-8HxlW+BB5HqniD+nLkQ4xSAVq3bR/pcYW9IigY+2y0dI+Y7INFeTbfAQr+63T3E4UDsZGjyb+l9txUnABWxlOQ==
+ dependencies:
+ babel-helper-call-delegate "^6.24.1"
+ babel-helper-get-function-arity "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-template "^6.24.1"
+ babel-traverse "^6.24.1"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-shorthand-properties@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz"
+ integrity sha512-mDdocSfUVm1/7Jw/FIRNw9vPrBQNePy6wZJlR8HAUBLybNp1w/6lr6zZ2pjMShee65t/ybR5pT8ulkLzD1xwiw==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-spread@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz"
+ integrity sha512-3Ghhi26r4l3d0Js933E5+IhHwk0A1yiutj9gwvzmFbVV0sPMYk2lekhOufHBswX7NCoSeF4Xrl3sCIuSIa+zOg==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-sticky-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz"
+ integrity sha512-CYP359ADryTo3pCsH0oxRo/0yn6UsEZLqYohHmvLQdfS9xkf+MbCzE3/Kolw9OYIY4ZMilH25z/5CbQbwDD+lQ==
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-plugin-transform-es2015-template-literals@^6.22.0:
+ version "6.22.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz"
+ integrity sha512-x8b9W0ngnKzDMHimVtTfn5ryimars1ByTqsfBDwAqLibmuuQY6pgBQi5z1ErIsUOWBdw1bW9FSz5RZUojM4apg==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-typeof-symbol@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz"
+ integrity sha512-fz6J2Sf4gYN6gWgRZaoFXmq93X+Li/8vf+fb0sGDVtdeWvxC9y5/bTD7bvfWMEq6zetGEHpWjtzRGSugt5kNqw==
+ dependencies:
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-es2015-unicode-regex@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz"
+ integrity sha512-v61Dbbihf5XxnYjtBN04B/JBvsScY37R1cZT5r9permN1cp+b70DY3Ib3fIkgn1DI9U3tGgBJZVD8p/mE/4JbQ==
+ dependencies:
+ babel-helper-regex "^6.24.1"
+ babel-runtime "^6.22.0"
+ regexpu-core "^2.0.0"
+
+babel-plugin-transform-exponentiation-operator@^6.22.0:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz"
+ integrity sha512-LzXDmbMkklvNhprr20//RStKVcT8Cu+SQtX18eMHLhjHf2yFzwtQ0S2f0jQ+89rokoNdmwoSqYzAhq86FxlLSQ==
+ dependencies:
+ babel-helper-builder-binary-assignment-operator-visitor "^6.24.1"
+ babel-plugin-syntax-exponentiation-operator "^6.8.0"
+ babel-runtime "^6.22.0"
+
+babel-plugin-transform-object-rest-spread@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz"
+ integrity sha512-ocgA9VJvyxwt+qJB0ncxV8kb/CjfTcECUY4tQ5VT7nP6Aohzobm8CDFaQ5FHdvZQzLmf0sgDxB8iRXZXxwZcyA==
+ dependencies:
+ babel-plugin-syntax-object-rest-spread "^6.8.0"
+ babel-runtime "^6.26.0"
+
+babel-plugin-transform-regenerator@^6.22.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz"
+ integrity sha512-LS+dBkUGlNR15/5WHKe/8Neawx663qttS6AGqoOUhICc9d1KciBvtrQSuc0PI+CxQ2Q/S1aKuJ+u64GtLdcEZg==
+ dependencies:
+ regenerator-transform "^0.10.0"
+
+babel-plugin-transform-strict-mode@^6.24.1:
+ version "6.24.1"
+ resolved "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz"
+ integrity sha512-j3KtSpjyLSJxNoCDrhwiJad8kw0gJ9REGj8/CqL0HeRyLnvUNYV9zcqluL6QJSXh3nfsLEmSLvwRfGzrgR96Pw==
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-types "^6.24.1"
+
+babel-polyfill@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz"
+ integrity sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==
+ dependencies:
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ regenerator-runtime "^0.10.5"
+
+babel-preset-env@^1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz"
+ integrity sha512-9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==
+ dependencies:
+ babel-plugin-check-es2015-constants "^6.22.0"
+ babel-plugin-syntax-trailing-function-commas "^6.22.0"
+ babel-plugin-transform-async-to-generator "^6.22.0"
+ babel-plugin-transform-es2015-arrow-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoped-functions "^6.22.0"
+ babel-plugin-transform-es2015-block-scoping "^6.23.0"
+ babel-plugin-transform-es2015-classes "^6.23.0"
+ babel-plugin-transform-es2015-computed-properties "^6.22.0"
+ babel-plugin-transform-es2015-destructuring "^6.23.0"
+ babel-plugin-transform-es2015-duplicate-keys "^6.22.0"
+ babel-plugin-transform-es2015-for-of "^6.23.0"
+ babel-plugin-transform-es2015-function-name "^6.22.0"
+ babel-plugin-transform-es2015-literals "^6.22.0"
+ babel-plugin-transform-es2015-modules-amd "^6.22.0"
+ babel-plugin-transform-es2015-modules-commonjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-systemjs "^6.23.0"
+ babel-plugin-transform-es2015-modules-umd "^6.23.0"
+ babel-plugin-transform-es2015-object-super "^6.22.0"
+ babel-plugin-transform-es2015-parameters "^6.23.0"
+ babel-plugin-transform-es2015-shorthand-properties "^6.22.0"
+ babel-plugin-transform-es2015-spread "^6.22.0"
+ babel-plugin-transform-es2015-sticky-regex "^6.22.0"
+ babel-plugin-transform-es2015-template-literals "^6.22.0"
+ babel-plugin-transform-es2015-typeof-symbol "^6.23.0"
+ babel-plugin-transform-es2015-unicode-regex "^6.22.0"
+ babel-plugin-transform-exponentiation-operator "^6.22.0"
+ babel-plugin-transform-regenerator "^6.22.0"
+ browserslist "^3.2.6"
+ invariant "^2.2.2"
+ semver "^5.3.0"
+
+babel-register@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz"
+ integrity sha512-veliHlHX06wjaeY8xNITbveXSiI+ASFnOqvne/LaIJIqOWi2Ogmj91KOugEz/hoh/fwMhXNBJPCv8Xaz5CyM4A==
+ dependencies:
+ babel-core "^6.26.0"
+ babel-runtime "^6.26.0"
+ core-js "^2.5.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.17.4"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.15"
+
+babel-runtime@^6.18.0, babel-runtime@^6.22.0, babel-runtime@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz"
+ integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+ dependencies:
+ core-js "^2.4.0"
+ regenerator-runtime "^0.11.0"
+
+babel-template@^6.24.1, babel-template@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz"
+ integrity sha512-PCOcLFW7/eazGUKIoqH97sO9A2UYMahsn/yRQ7uOk37iutwjq7ODtcTNF+iFDSHNfkctqsLRjLP7URnOx0T1fg==
+ dependencies:
+ babel-runtime "^6.26.0"
+ babel-traverse "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ lodash "^4.17.4"
+
+babel-traverse@^6.24.1, babel-traverse@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz"
+ integrity sha512-iSxeXx7apsjCHe9c7n8VtRXGzI2Bk1rBSOJgCCjfyXb6v1aCqE1KSEpq/8SXuVN8Ka/Rh1WDTF0MDzkvTA4MIA==
+ dependencies:
+ babel-code-frame "^6.26.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.26.0"
+ babel-types "^6.26.0"
+ babylon "^6.18.0"
+ debug "^2.6.8"
+ globals "^9.18.0"
+ invariant "^2.2.2"
+ lodash "^4.17.4"
+
+babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26.0:
+ version "6.26.0"
+ resolved "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz"
+ integrity sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==
+ dependencies:
+ babel-runtime "^6.26.0"
+ esutils "^2.0.2"
+ lodash "^4.17.4"
+ to-fast-properties "^1.0.3"
+
+babylon@^6.18.0:
+ version "6.18.0"
+ resolved "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz"
+ integrity sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==
+
+balanced-match@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz"
+ integrity sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==
+
+batch@0.6.1:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz"
+ integrity sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==
+
+bcrypt-pbkdf@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz"
+ integrity sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==
+ dependencies:
+ tweetnacl "^0.14.3"
+
+big.js@^5.2.2:
+ version "5.2.2"
+ resolved "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz"
+ integrity sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==
+
+binary-extensions@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz"
+ integrity sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==
+
+block-stream@*:
+ version "0.0.9"
+ resolved "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz"
+ integrity sha512-OorbnJVPII4DuUKbjARAe8u8EfqOmkEEaSFIyoQ7OjTHn6kafxWl0wLgoZ2rXaYd7MyLcDaU4TmhfxtwgcccMQ==
+ dependencies:
+ inherits "~2.0.0"
+
+body-parser@1.20.0:
+ version "1.20.0"
+ resolved "https://registry.npmjs.org/body-parser/-/body-parser-1.20.0.tgz"
+ integrity sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==
+ dependencies:
+ bytes "3.1.2"
+ content-type "~1.0.4"
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ on-finished "2.4.1"
+ qs "6.10.3"
+ raw-body "2.5.1"
+ type-is "~1.6.18"
+ unpipe "1.0.0"
+
+bonjour-service@^1.0.11:
+ version "1.0.14"
+ resolved "https://registry.yarnpkg.com/bonjour-service/-/bonjour-service-1.0.14.tgz#c346f5bc84e87802d08f8d5a60b93f758e514ee7"
+ integrity sha512-HIMbgLnk1Vqvs6B4Wq5ep7mxvj9sGz5d1JJyDNSGNIdA/w2MCz6GTjWTdjqOJV1bEPj+6IkxDvWNFKEBxNt4kQ==
+ dependencies:
+ array-flatten "^2.1.2"
+ dns-equal "^1.0.0"
+ fast-deep-equal "^3.1.3"
+ multicast-dns "^7.2.5"
+
+boolbase@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz"
+ integrity sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==
+
+brace-expansion@^1.1.7:
+ version "1.1.11"
+ resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz"
+ integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==
+ dependencies:
+ balanced-match "^1.0.0"
+ concat-map "0.0.1"
+
+braces@^3.0.2, braces@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz"
+ integrity sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==
+ dependencies:
+ fill-range "^7.0.1"
+
+browserslist@^3.2.6:
+ version "3.2.8"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz"
+ integrity sha512-WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==
+ dependencies:
+ caniuse-lite "^1.0.30000844"
+ electron-to-chromium "^1.3.47"
+
+browserslist@^4.0.0, browserslist@^4.14.5, browserslist@^4.16.6, browserslist@^4.20.3, browserslist@^4.21.3, browserslist@^4.21.4:
+ version "4.21.4"
+ resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.21.4.tgz"
+ integrity sha512-CBHJJdDmgjl3daYjN5Cp5kbTf1mUhZoS+beLklHIvkOWscs83YAhLlF3Wsh/lciQYAcbBJgTOD44VtG31ZM4Hw==
+ dependencies:
+ caniuse-lite "^1.0.30001400"
+ electron-to-chromium "^1.4.251"
+ node-releases "^2.0.6"
+ update-browserslist-db "^1.0.9"
+
+buffer-from@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz"
+ integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
+
+bytes@3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz"
+ integrity sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==
+
+bytes@3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz"
+ integrity sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==
+
+call-bind@^1.0.0, call-bind@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz"
+ integrity sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==
+ dependencies:
+ function-bind "^1.1.1"
+ get-intrinsic "^1.0.2"
+
+caller-path@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz"
+ integrity sha512-UJiE1otjXPF5/x+T3zTnSFiTOEmJoGTD9HmBoxnCUwho61a2eSNn/VwtwuIBDAo2SEOv1AJ7ARI5gCmohFLu/g==
+ dependencies:
+ callsites "^0.2.0"
+
+callsites@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz"
+ integrity sha512-Zv4Dns9IbXXmPkgRRUjAaJQgfN4xX5p6+RQFhWUqscdvvK2xK/ZL8b3IXIJsj+4sD+f24NwnWy2BY8AJ82JB0A==
+
+camelcase-keys@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz"
+ integrity sha512-bA/Z/DERHKqoEOrp+qeGKw1QlvEQkGZSc0XaY6VnTxZr+Kv1G5zFwttpjv8qxZ/sBPT4nthwZaAcsAZTJlSKXQ==
+ dependencies:
+ camelcase "^2.0.0"
+ map-obj "^1.0.0"
+
+camelcase@5.3.1, camelcase@^5.0.0:
+ version "5.3.1"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz"
+ integrity sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==
+
+camelcase@^2.0.0:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz"
+ integrity sha512-DLIsRzJVBQu72meAKPkWQOLcujdXT32hwdfnkI1frSiSRMK1MofjKHf+MEx0SB6fjEFXL8fBDv1dKymBlOp4Qw==
+
+camelcase@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz"
+ integrity sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==
+
+camelcase@^6.0.0:
+ version "6.3.0"
+ resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-6.3.0.tgz#5685b95eb209ac9c0c177467778c9c84df58ba9a"
+ integrity sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==
+
+caniuse-api@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz"
+ integrity sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==
+ dependencies:
+ browserslist "^4.0.0"
+ caniuse-lite "^1.0.0"
+ lodash.memoize "^4.1.2"
+ lodash.uniq "^4.5.0"
+
+caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000844, caniuse-lite@^1.0.30001400:
+ version "1.0.30001414"
+ resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz"
+ integrity sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==
+
+caseless@~0.12.0:
+ version "0.12.0"
+ resolved "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz"
+ integrity sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==
+
+chalk@^1.1.1, chalk@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz"
+ integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
+ dependencies:
+ ansi-styles "^2.2.1"
+ escape-string-regexp "^1.0.2"
+ has-ansi "^2.0.0"
+ strip-ansi "^3.0.0"
+ supports-color "^2.0.0"
+
+chalk@^2.0.0, chalk@^2.1.0, chalk@^2.3.2, chalk@^2.4.2:
+ version "2.4.2"
+ resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz"
+ integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==
+ dependencies:
+ ansi-styles "^3.2.1"
+ escape-string-regexp "^1.0.5"
+ supports-color "^5.3.0"
+
+chalk@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01"
+ integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==
+ dependencies:
+ ansi-styles "^4.1.0"
+ supports-color "^7.1.0"
+
+chardet@^0.4.0:
+ version "0.4.2"
+ resolved "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz"
+ integrity sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==
+
+chart.js@^2.9.3:
+ version "2.9.4"
+ resolved "https://registry.npmjs.org/chart.js/-/chart.js-2.9.4.tgz"
+ integrity sha512-B07aAzxcrikjAPyV+01j7BmOpxtQETxTSlQ26BEYJ+3iUkbNKaOJ/nDbT6JjyqYxseM0ON12COHYdU2cTIjC7A==
+ dependencies:
+ chartjs-color "^2.1.0"
+ moment "^2.10.2"
+
+chartjs-color-string@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/chartjs-color-string/-/chartjs-color-string-0.6.0.tgz"
+ integrity sha512-TIB5OKn1hPJvO7JcteW4WY/63v6KwEdt6udfnDE9iCAZgy+V4SrbSxoIbTw/xkUIapjEI4ExGtD0+6D3KyFd7A==
+ dependencies:
+ color-name "^1.0.0"
+
+chartjs-color@^2.1.0:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/chartjs-color/-/chartjs-color-2.4.1.tgz"
+ integrity sha512-haqOg1+Yebys/Ts/9bLo/BqUcONQOdr/hoEr2LLTRl6C5LXctUdHxsCYfvQVg5JIxITrfCNUDr4ntqmQk9+/0w==
+ dependencies:
+ chartjs-color-string "^0.6.0"
+ color-convert "^1.9.3"
+
+chokidar@^3.5.3:
+ version "3.5.3"
+ resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-3.5.3.tgz#1cf37c8707b932bd1af1ae22c0432e2acd1903bd"
+ integrity sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==
+ dependencies:
+ anymatch "~3.1.2"
+ braces "~3.0.2"
+ glob-parent "~5.1.2"
+ is-binary-path "~2.1.0"
+ is-glob "~4.0.1"
+ normalize-path "~3.0.0"
+ readdirp "~3.6.0"
+ optionalDependencies:
+ fsevents "~2.3.2"
+
+chrome-trace-event@^1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz"
+ integrity sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==
+
+circular-json@^0.3.1:
+ version "0.3.3"
+ resolved "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz"
+ integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==
+
+clean-webpack-plugin@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/clean-webpack-plugin/-/clean-webpack-plugin-3.0.0.tgz#a99d8ec34c1c628a4541567aa7b457446460c62b"
+ integrity sha512-MciirUH5r+cYLGCOL5JX/ZLzOZbVr1ot3Fw+KcvbhUb6PM+yycqd9ZhIlcigQ5gl+XhppNmw3bEFuaaMNyLj3A==
+ dependencies:
+ "@types/webpack" "^4.4.31"
+ del "^4.1.1"
+
+cli-cursor@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz"
+ integrity sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==
+ dependencies:
+ restore-cursor "^2.0.0"
+
+cli-width@^2.0.0:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz"
+ integrity sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==
+
+cliui@^3.2.0:
+ version "3.2.0"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz"
+ integrity sha512-0yayqDxWQbqk3ojkYqUKqaAQ6AfNKeKWRNA8kR0WXzAsdHpP4BIaOmMAG87JGuO6qcobyW4GjxHd9PmhEd+T9w==
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wrap-ansi "^2.0.0"
+
+cliui@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz"
+ integrity sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==
+ dependencies:
+ string-width "^3.1.0"
+ strip-ansi "^5.2.0"
+ wrap-ansi "^5.1.0"
+
+clone-deep@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz"
+ integrity sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==
+ dependencies:
+ is-plain-object "^2.0.4"
+ kind-of "^6.0.2"
+ shallow-clone "^3.0.0"
+
+co@^4.6.0:
+ version "4.6.0"
+ resolved "https://registry.npmjs.org/co/-/co-4.6.0.tgz"
+ integrity sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==
+
+code-point-at@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz"
+ integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==
+
+color-convert@^1.9.0, color-convert@^1.9.3:
+ version "1.9.3"
+ resolved "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz"
+ integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==
+ dependencies:
+ color-name "1.1.3"
+
+color-convert@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz#72d3a68d598c9bdb3af2ad1e84f21d896abd4de3"
+ integrity sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==
+ dependencies:
+ color-name "~1.1.4"
+
+color-name@1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz"
+ integrity sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==
+
+color-name@^1.0.0, color-name@~1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz"
+ integrity sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==
+
+colord@^2.9.1:
+ version "2.9.3"
+ resolved "https://registry.yarnpkg.com/colord/-/colord-2.9.3.tgz#4f8ce919de456f1d5c1c368c307fe20f3e59fb43"
+ integrity sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==
+
+colorette@^2.0.10, colorette@^2.0.14:
+ version "2.0.19"
+ resolved "https://registry.yarnpkg.com/colorette/-/colorette-2.0.19.tgz#cdf044f47ad41a0f4b56b3a0d5b4e6e1a2d5a798"
+ integrity sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==
+
+combined-stream@^1.0.6, combined-stream@~1.0.6:
+ version "1.0.8"
+ resolved "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz"
+ integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+ dependencies:
+ delayed-stream "~1.0.0"
+
+commander@^2.20.0:
+ version "2.20.3"
+ resolved "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz"
+ integrity sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==
+
+commander@^7.0.0, commander@^7.2.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/commander/-/commander-7.2.0.tgz#a36cb57d0b501ce108e4d20559a150a391d97ab7"
+ integrity sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==
+
+commondir@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz"
+ integrity sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==
+
+compose-function@3.0.3:
+ version "3.0.3"
+ resolved "https://registry.npmjs.org/compose-function/-/compose-function-3.0.3.tgz"
+ integrity sha512-xzhzTJ5eC+gmIzvZq+C3kCJHsp9os6tJkrigDRZclyGtOKINbZtE8n1Tzmeh32jW+BUDPbvZpibwvJHBLGMVwg==
+ dependencies:
+ arity-n "^1.0.4"
+
+compressible@~2.0.16:
+ version "2.0.18"
+ resolved "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz"
+ integrity sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==
+ dependencies:
+ mime-db ">= 1.43.0 < 2"
+
+compression@^1.7.4:
+ version "1.7.4"
+ resolved "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz"
+ integrity sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==
+ dependencies:
+ accepts "~1.3.5"
+ bytes "3.0.0"
+ compressible "~2.0.16"
+ debug "2.6.9"
+ on-headers "~1.0.2"
+ safe-buffer "5.1.2"
+ vary "~1.1.2"
+
+concat-map@0.0.1:
+ version "0.0.1"
+ resolved "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz"
+ integrity sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==
+
+concat-stream@^1.6.0:
+ version "1.6.2"
+ resolved "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz"
+ integrity sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==
+ dependencies:
+ buffer-from "^1.0.0"
+ inherits "^2.0.3"
+ readable-stream "^2.2.2"
+ typedarray "^0.0.6"
+
+connect-history-api-fallback@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-2.0.0.tgz#647264845251a0daf25b97ce87834cace0f5f1c8"
+ integrity sha512-U73+6lQFmfiNPrYbXqr6kZ1i1wiRqXnp2nhMsINseWXO8lDau0LGEffJ8kQi4EjLZympVgRdvqjAgiZ1tgzDDA==
+
+consola@^2.6.0:
+ version "2.15.3"
+ resolved "https://registry.yarnpkg.com/consola/-/consola-2.15.3.tgz#2e11f98d6a4be71ff72e0bdf07bd23e12cb61550"
+ integrity sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==
+
+console-control-strings@^1.0.0, console-control-strings@~1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz"
+ integrity sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==
+
+content-disposition@0.5.4:
+ version "0.5.4"
+ resolved "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz"
+ integrity sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==
+ dependencies:
+ safe-buffer "5.2.1"
+
+content-type@~1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz"
+ integrity sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==
+
+convert-source-map@1.7.0:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz"
+ integrity sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+convert-source-map@^0.3.3:
+ version "0.3.5"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-0.3.5.tgz"
+ integrity sha512-+4nRk0k3oEpwUB7/CalD7xE2z4VmtEnnq0GO2IPTkrooTrAhEsWvuLF5iWP1dXrwluki/azwXV1ve7gtYuPldg==
+
+convert-source-map@^1.5.1, convert-source-map@^1.7.0:
+ version "1.8.0"
+ resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz"
+ integrity sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==
+ dependencies:
+ safe-buffer "~5.1.1"
+
+cookie-signature@1.0.6:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz"
+ integrity sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==
+
+cookie@0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz"
+ integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==
+
+core-js-compat@^3.25.1:
+ version "3.25.3"
+ resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.25.3.tgz"
+ integrity sha512-xVtYpJQ5grszDHEUU9O7XbjjcZ0ccX3LgQsyqSvTnjX97ZqEgn9F5srmrwwwMtbKzDllyFPL+O+2OFMl1lU4TQ==
+ dependencies:
+ browserslist "^4.21.4"
+
+core-js@^2.4.0, core-js@^2.5.0:
+ version "2.6.12"
+ resolved "https://registry.npmjs.org/core-js/-/core-js-2.6.12.tgz"
+ integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
+core-util-is@1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz"
+ integrity sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==
+
+core-util-is@~1.0.0:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz"
+ integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
+
+cross-spawn@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-3.0.1.tgz"
+ integrity sha512-eZ+m1WNhSZutOa/uRblAc9Ut5MQfukFrFMtPSm3bZCA888NmMd5AWXWdgRZ80zd+pTk1P2JrGjg9pUPTvl2PWQ==
+ dependencies:
+ lru-cache "^4.0.1"
+ which "^1.2.9"
+
+cross-spawn@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz"
+ integrity sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==
+ dependencies:
+ lru-cache "^4.0.1"
+ shebang-command "^1.2.0"
+ which "^1.2.9"
+
+cross-spawn@^7.0.3:
+ version "7.0.3"
+ resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz#f73a85b9d5d41d045551c177e2882d4ac85728a6"
+ integrity sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==
+ dependencies:
+ path-key "^3.1.0"
+ shebang-command "^2.0.0"
+ which "^2.0.1"
+
+css-declaration-sorter@^6.3.0:
+ version "6.3.1"
+ resolved "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-6.3.1.tgz#be5e1d71b7a992433fb1c542c7a1b835e45682ec"
+ integrity sha512-fBffmak0bPAnyqc/HO8C3n2sHrp9wcqQz6ES9koRF2/mLOVAx9zIQ3Y7R29sYCteTPqMCwns4WYQoCX91Xl3+w==
+
+css-loader@^5.2.4:
+ version "5.2.7"
+ resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-5.2.7.tgz#9b9f111edf6fb2be5dc62525644cbc9c232064ae"
+ integrity sha512-Q7mOvpBNBG7YrVGMxRxcBJZFL75o+cH2abNASdibkj/fffYD8qWbInZrD0S9ccI6vZclF3DsHE7njGlLtaHbhg==
+ dependencies:
+ icss-utils "^5.1.0"
+ loader-utils "^2.0.0"
+ postcss "^8.2.15"
+ postcss-modules-extract-imports "^3.0.0"
+ postcss-modules-local-by-default "^4.0.0"
+ postcss-modules-scope "^3.0.0"
+ postcss-modules-values "^4.0.0"
+ postcss-value-parser "^4.1.0"
+ schema-utils "^3.0.0"
+ semver "^7.3.5"
+
+css-minimizer-webpack-plugin@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/css-minimizer-webpack-plugin/-/css-minimizer-webpack-plugin-2.0.0.tgz#3c42f6624ed4cf4780dd963e23ee649e5a25c1a8"
+ integrity sha512-cG/uc94727tx5pBNtb1Sd7gvUPzwmcQi1lkpfqTpdkuNq75hJCw7bIVsCNijLm4dhDcr1atvuysl2rZqOG8Txw==
+ dependencies:
+ cssnano "^5.0.0"
+ jest-worker "^26.3.0"
+ p-limit "^3.0.2"
+ postcss "^8.2.9"
+ schema-utils "^3.0.0"
+ serialize-javascript "^5.0.1"
+ source-map "^0.6.1"
+
+css-select@^4.1.3:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz"
+ integrity sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==
+ dependencies:
+ boolbase "^1.0.0"
+ css-what "^6.0.1"
+ domhandler "^4.3.1"
+ domutils "^2.8.0"
+ nth-check "^2.0.1"
+
+css-tree@^1.1.2, css-tree@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz"
+ integrity sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==
+ dependencies:
+ mdn-data "2.0.14"
+ source-map "^0.6.1"
+
+css-what@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz"
+ integrity sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==
+
+css@^2.0.0:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/css/-/css-2.2.4.tgz"
+ integrity sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==
+ dependencies:
+ inherits "^2.0.3"
+ source-map "^0.6.1"
+ source-map-resolve "^0.5.2"
+ urix "^0.1.0"
+
+cssesc@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz"
+ integrity sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==
+
+cssnano-preset-default@^5.2.12:
+ version "5.2.12"
+ resolved "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-5.2.12.tgz#ebe6596ec7030e62c3eb2b3c09f533c0644a9a97"
+ integrity sha512-OyCBTZi+PXgylz9HAA5kHyoYhfGcYdwFmyaJzWnzxuGRtnMw/kR6ilW9XzlzlRAtB6PLT/r+prYgkef7hngFew==
+ dependencies:
+ css-declaration-sorter "^6.3.0"
+ cssnano-utils "^3.1.0"
+ postcss-calc "^8.2.3"
+ postcss-colormin "^5.3.0"
+ postcss-convert-values "^5.1.2"
+ postcss-discard-comments "^5.1.2"
+ postcss-discard-duplicates "^5.1.0"
+ postcss-discard-empty "^5.1.1"
+ postcss-discard-overridden "^5.1.0"
+ postcss-merge-longhand "^5.1.6"
+ postcss-merge-rules "^5.1.2"
+ postcss-minify-font-values "^5.1.0"
+ postcss-minify-gradients "^5.1.1"
+ postcss-minify-params "^5.1.3"
+ postcss-minify-selectors "^5.2.1"
+ postcss-normalize-charset "^5.1.0"
+ postcss-normalize-display-values "^5.1.0"
+ postcss-normalize-positions "^5.1.1"
+ postcss-normalize-repeat-style "^5.1.1"
+ postcss-normalize-string "^5.1.0"
+ postcss-normalize-timing-functions "^5.1.0"
+ postcss-normalize-unicode "^5.1.0"
+ postcss-normalize-url "^5.1.0"
+ postcss-normalize-whitespace "^5.1.1"
+ postcss-ordered-values "^5.1.3"
+ postcss-reduce-initial "^5.1.0"
+ postcss-reduce-transforms "^5.1.0"
+ postcss-svgo "^5.1.0"
+ postcss-unique-selectors "^5.1.1"
+
+cssnano-utils@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/cssnano-utils/-/cssnano-utils-3.1.0.tgz#95684d08c91511edfc70d2636338ca37ef3a6861"
+ integrity sha512-JQNR19/YZhz4psLX/rQ9M83e3z2Wf/HdJbryzte4a3NSuafyp9w/I4U+hx5C2S9g41qlstH7DEWnZaaj83OuEA==
+
+cssnano@^5.0.0:
+ version "5.1.13"
+ resolved "https://registry.yarnpkg.com/cssnano/-/cssnano-5.1.13.tgz#83d0926e72955332dc4802a7070296e6258efc0a"
+ integrity sha512-S2SL2ekdEz6w6a2epXn4CmMKU4K3KpcyXLKfAYc9UQQqJRkD/2eLUG0vJ3Db/9OvO5GuAdgXw3pFbR6abqghDQ==
+ dependencies:
+ cssnano-preset-default "^5.2.12"
+ lilconfig "^2.0.3"
+ yaml "^1.10.2"
+
+csso@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/csso/-/csso-4.2.0.tgz#ea3a561346e8dc9f546d6febedd50187cf389529"
+ integrity sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==
+ dependencies:
+ css-tree "^1.1.2"
+
+currently-unhandled@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz"
+ integrity sha512-/fITjgjGU50vjQ4FH6eUoYu+iUoUKIXws2hL15JJpIR+BbTxaXQsMuuyjtNh2WqsSBS5nsaZHFsFecyw5CCAng==
+ dependencies:
+ array-find-index "^1.0.1"
+
+d@1, d@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/d/-/d-1.0.1.tgz"
+ integrity sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==
+ dependencies:
+ es5-ext "^0.10.50"
+ type "^1.0.1"
+
+dashdash@^1.12.0:
+ version "1.14.1"
+ resolved "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz"
+ integrity sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==
+ dependencies:
+ assert-plus "^1.0.0"
+
+debug@2.6.9, debug@^2.6.8, debug@^2.6.9:
+ version "2.6.9"
+ resolved "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz"
+ integrity sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==
+ dependencies:
+ ms "2.0.0"
+
+debug@^3.1.0, debug@^3.2.7:
+ version "3.2.7"
+ resolved "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz"
+ integrity sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==
+ dependencies:
+ ms "^2.1.1"
+
+debug@^4.1.0, debug@^4.1.1:
+ version "4.3.4"
+ resolved "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz"
+ integrity sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==
+ dependencies:
+ ms "2.1.2"
+
+decamelize@^1.1.1, decamelize@^1.1.2, decamelize@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz"
+ integrity sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==
+
+decode-uri-component@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz"
+ integrity sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==
+
+dedent@^0.7.0:
+ version "0.7.0"
+ resolved "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz"
+ integrity sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==
+
+deep-is@~0.1.3:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz"
+ integrity sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==
+
+default-gateway@^6.0.3:
+ version "6.0.3"
+ resolved "https://registry.yarnpkg.com/default-gateway/-/default-gateway-6.0.3.tgz#819494c888053bdb743edbf343d6cdf7f2943a71"
+ integrity sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==
+ dependencies:
+ execa "^5.0.0"
+
+define-lazy-prop@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz#3f7ae421129bcaaac9bc74905c98a0009ec9ee7f"
+ integrity sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==
+
+define-properties@^1.1.3, define-properties@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz"
+ integrity sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==
+ dependencies:
+ has-property-descriptors "^1.0.0"
+ object-keys "^1.1.1"
+
+del@^4.1.1:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/del/-/del-4.1.1.tgz"
+ integrity sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==
+ dependencies:
+ "@types/glob" "^7.1.1"
+ globby "^6.1.0"
+ is-path-cwd "^2.0.0"
+ is-path-in-cwd "^2.0.0"
+ p-map "^2.0.0"
+ pify "^4.0.1"
+ rimraf "^2.6.3"
+
+delayed-stream@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz"
+ integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
+delegates@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz"
+ integrity sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==
+
+depd@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz"
+ integrity sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==
+
+depd@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz"
+ integrity sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==
+
+destroy@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz"
+ integrity sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==
+
+detect-indent@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz"
+ integrity sha512-BDKtmHlOzwI7iRuEkhzsnPoi5ypEhWAJB5RvHWe1kMr06js3uK5B3734i3ui5Yd+wOJV1cpE4JnivPD283GU/A==
+ dependencies:
+ repeating "^2.0.0"
+
+detect-node@^2.0.4:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz"
+ integrity sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==
+
+dns-equal@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz"
+ integrity sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==
+
+dns-packet@^5.2.2:
+ version "5.4.0"
+ resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b"
+ integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==
+ dependencies:
+ "@leichtgewicht/ip-codec" "^2.0.1"
+
+doctrine@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz"
+ integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==
+ dependencies:
+ esutils "^2.0.2"
+
+dom-converter@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz"
+ integrity sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==
+ dependencies:
+ utila "~0.4"
+
+dom-serializer@^1.0.1:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz"
+ integrity sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.2.0"
+ entities "^2.0.0"
+
+domelementtype@^2.0.1, domelementtype@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz"
+ integrity sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==
+
+domhandler@^4.0.0, domhandler@^4.2.0, domhandler@^4.3.1:
+ version "4.3.1"
+ resolved "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz"
+ integrity sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==
+ dependencies:
+ domelementtype "^2.2.0"
+
+domutils@^2.5.2, domutils@^2.8.0:
+ version "2.8.0"
+ resolved "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz"
+ integrity sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==
+ dependencies:
+ dom-serializer "^1.0.1"
+ domelementtype "^2.2.0"
+ domhandler "^4.2.0"
+
+ecc-jsbn@~0.1.1:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz"
+ integrity sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==
+ dependencies:
+ jsbn "~0.1.0"
+ safer-buffer "^2.1.0"
+
+ee-first@1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz"
+ integrity sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==
+
+electron-to-chromium@^1.3.47, electron-to-chromium@^1.4.251:
+ version "1.4.268"
+ resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.268.tgz"
+ integrity sha512-PO90Bv++vEzdln+eA9qLg1IRnh0rKETus6QkTzcFm5P3Wg3EQBZud5dcnzkpYXuIKWBjKe5CO8zjz02cicvn1g==
+
+emoji-regex@^7.0.1:
+ version "7.0.3"
+ resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz"
+ integrity sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==
+
+emoji-regex@^8.0.0:
+ version "8.0.0"
+ resolved "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz#e818fd69ce5ccfcb404594f842963bf53164cc37"
+ integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==
+
+emojis-list@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz"
+ integrity sha512-knHEZMgs8BB+MInokmNTg/OyPlAddghe1YBgNwJBc5zsJi/uyIcXoSDsL/W9ymOsBoBGdPIHXYJ9+qKFwRwDng==
+
+emojis-list@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz"
+ integrity sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==
+
+encodeurl@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz"
+ integrity sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==
+
+enhanced-resolve@^5.10.0:
+ version "5.10.0"
+ resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.10.0.tgz#0dc579c3bb2a1032e357ac45b8f3a6f3ad4fb1e6"
+ integrity sha512-T0yTFjdpldGY8PmuXXR0PyQ1ufZpEGiHVrp7zHKB7jdR4qlmZHhONVM5AQOAWXuF/w3dnHbEQVrNptJgt7F+cQ==
+ dependencies:
+ graceful-fs "^4.2.4"
+ tapable "^2.2.0"
+
+entities@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz"
+ integrity sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==
+
+envinfo@^7.7.3:
+ version "7.8.1"
+ resolved "https://registry.yarnpkg.com/envinfo/-/envinfo-7.8.1.tgz#06377e3e5f4d379fea7ac592d5ad8927e0c4d475"
+ integrity sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==
+
+error-ex@^1.2.0:
+ version "1.3.2"
+ resolved "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz"
+ integrity sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==
+ dependencies:
+ is-arrayish "^0.2.1"
+
+error-stack-parser@^2.0.0:
+ version "2.1.4"
+ resolved "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.1.4.tgz#229cb01cdbfa84440bfa91876285b94680188286"
+ integrity sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==
+ dependencies:
+ stackframe "^1.3.4"
+
+es-abstract@^1.19.0, es-abstract@^1.19.1, es-abstract@^1.19.2, es-abstract@^1.19.5:
+ version "1.20.3"
+ resolved "https://registry.npmjs.org/es-abstract/-/es-abstract-1.20.3.tgz"
+ integrity sha512-AyrnaKVpMzljIdwjzrj+LxGmj8ik2LckwXacHqrJJ/jxz6dDDBcZ7I7nlHM0FvEW8MfbWJwOd+yT2XzYW49Frw==
+ dependencies:
+ call-bind "^1.0.2"
+ es-to-primitive "^1.2.1"
+ function-bind "^1.1.1"
+ function.prototype.name "^1.1.5"
+ get-intrinsic "^1.1.3"
+ get-symbol-description "^1.0.0"
+ has "^1.0.3"
+ has-property-descriptors "^1.0.0"
+ has-symbols "^1.0.3"
+ internal-slot "^1.0.3"
+ is-callable "^1.2.6"
+ is-negative-zero "^2.0.2"
+ is-regex "^1.1.4"
+ is-shared-array-buffer "^1.0.2"
+ is-string "^1.0.7"
+ is-weakref "^1.0.2"
+ object-inspect "^1.12.2"
+ object-keys "^1.1.1"
+ object.assign "^4.1.4"
+ regexp.prototype.flags "^1.4.3"
+ safe-regex-test "^1.0.0"
+ string.prototype.trimend "^1.0.5"
+ string.prototype.trimstart "^1.0.5"
+ unbox-primitive "^1.0.2"
+
+es-module-lexer@^0.9.0:
+ version "0.9.3"
+ resolved "https://registry.yarnpkg.com/es-module-lexer/-/es-module-lexer-0.9.3.tgz#6f13db00cc38417137daf74366f535c8eb438f19"
+ integrity sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==
+
+es-shim-unscopables@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz"
+ integrity sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==
+ dependencies:
+ has "^1.0.3"
+
+es-to-primitive@^1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz"
+ integrity sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==
+ dependencies:
+ is-callable "^1.1.4"
+ is-date-object "^1.0.1"
+ is-symbol "^1.0.2"
+
+es5-ext@^0.10.35, es5-ext@^0.10.50:
+ version "0.10.62"
+ resolved "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz"
+ integrity sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==
+ dependencies:
+ es6-iterator "^2.0.3"
+ es6-symbol "^3.1.3"
+ next-tick "^1.1.0"
+
+es6-iterator@2.0.3, es6-iterator@^2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz"
+ integrity sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==
+ dependencies:
+ d "1"
+ es5-ext "^0.10.35"
+ es6-symbol "^3.1.1"
+
+es6-symbol@^3.1.1, es6-symbol@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz"
+ integrity sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==
+ dependencies:
+ d "^1.0.1"
+ ext "^1.1.2"
+
+escalade@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz"
+ integrity sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==
+
+escape-html@~1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz"
+ integrity sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==
+
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz"
+ integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+escape-string-regexp@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34"
+ integrity sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==
+
+eslint-config-airbnb-base@^12.1.0:
+ version "12.1.0"
+ resolved "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-12.1.0.tgz"
+ integrity sha512-/vjm0Px5ZCpmJqnjIzcFb9TKZrKWz0gnuG/7Gfkt0Db1ELJR51xkZth+t14rYdqWgX836XbuxtArbIHlVhbLBA==
+ dependencies:
+ eslint-restricted-globals "^0.1.1"
+
+eslint-import-resolver-babel-module@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-babel-module/-/eslint-import-resolver-babel-module-4.0.0.tgz"
+ integrity sha512-aPj0+pG0H3HCaMD9eRDYEzPdMyKrLE2oNhAzTXd2w86ZBe3s7drSrrPwVTfzO1CBp13FGk8S84oRmZHZvSo0mA==
+ dependencies:
+ pkg-up "^2.0.0"
+ resolve "^1.4.0"
+
+eslint-import-resolver-node@^0.3.6:
+ version "0.3.6"
+ resolved "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.6.tgz"
+ integrity sha512-0En0w03NRVMn9Uiyn8YRPDKvWjxCWkslUEhGNTdGx15RvPJYQ+lbOlqrlNI2vEAs4pDYK4f/HN2TbDmk5TP0iw==
+ dependencies:
+ debug "^3.2.7"
+ resolve "^1.20.0"
+
+eslint-module-utils@^2.7.3:
+ version "2.7.4"
+ resolved "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz"
+ integrity sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==
+ dependencies:
+ debug "^3.2.7"
+
+eslint-plugin-import@^2.11.0:
+ version "2.26.0"
+ resolved "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.26.0.tgz"
+ integrity sha512-hYfi3FXaM8WPLf4S1cikh/r4IxnO6zrhZbEGz2b660EJRbuxgpDS5gkCuYgGWg2xxh2rBuIr4Pvhve/7c31koA==
+ dependencies:
+ array-includes "^3.1.4"
+ array.prototype.flat "^1.2.5"
+ debug "^2.6.9"
+ doctrine "^2.1.0"
+ eslint-import-resolver-node "^0.3.6"
+ eslint-module-utils "^2.7.3"
+ has "^1.0.3"
+ is-core-module "^2.8.1"
+ is-glob "^4.0.3"
+ minimatch "^3.1.2"
+ object.values "^1.1.5"
+ resolve "^1.22.0"
+ tsconfig-paths "^3.14.1"
+
+eslint-restricted-globals@^0.1.1:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/eslint-restricted-globals/-/eslint-restricted-globals-0.1.1.tgz"
+ integrity sha512-d1cerYC0nOJbObxUe1kR8MZ25RLt7IHzR9d+IOupoMqFU03tYjo7Stjqj04uHx1xx7HKSE9/NjdeBiP4/jUP8Q==
+
+eslint-scope@5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.1.tgz#e786e59a66cb92b3f6c1fb0d508aab174848f48c"
+ integrity sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==
+ dependencies:
+ esrecurse "^4.3.0"
+ estraverse "^4.1.1"
+
+eslint-scope@^3.7.1:
+ version "3.7.3"
+ resolved "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.3.tgz"
+ integrity sha512-W+B0SvF4gamyCTmUc+uITPY0989iXVfKvhwtmJocTaYoc/3khEHmEmvfY/Gn9HA9VV75jrQECsHizkNw1b68FA==
+ dependencies:
+ esrecurse "^4.1.0"
+ estraverse "^4.1.1"
+
+eslint-visitor-keys@^1.0.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz"
+ integrity sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==
+
+eslint@^4.19.1:
+ version "4.19.1"
+ resolved "https://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz"
+ integrity sha512-bT3/1x1EbZB7phzYu7vCr1v3ONuzDtX8WjuM9c0iYxe+cq+pwcKEoQjl7zd3RpC6YOLgnSy3cTN58M2jcoPDIQ==
+ dependencies:
+ ajv "^5.3.0"
+ babel-code-frame "^6.22.0"
+ chalk "^2.1.0"
+ concat-stream "^1.6.0"
+ cross-spawn "^5.1.0"
+ debug "^3.1.0"
+ doctrine "^2.1.0"
+ eslint-scope "^3.7.1"
+ eslint-visitor-keys "^1.0.0"
+ espree "^3.5.4"
+ esquery "^1.0.0"
+ esutils "^2.0.2"
+ file-entry-cache "^2.0.0"
+ functional-red-black-tree "^1.0.1"
+ glob "^7.1.2"
+ globals "^11.0.1"
+ ignore "^3.3.3"
+ imurmurhash "^0.1.4"
+ inquirer "^3.0.6"
+ is-resolvable "^1.0.0"
+ js-yaml "^3.9.1"
+ json-stable-stringify-without-jsonify "^1.0.1"
+ levn "^0.3.0"
+ lodash "^4.17.4"
+ minimatch "^3.0.2"
+ mkdirp "^0.5.1"
+ natural-compare "^1.4.0"
+ optionator "^0.8.2"
+ path-is-inside "^1.0.2"
+ pluralize "^7.0.0"
+ progress "^2.0.0"
+ regexpp "^1.0.1"
+ require-uncached "^1.0.3"
+ semver "^5.3.0"
+ strip-ansi "^4.0.0"
+ strip-json-comments "~2.0.1"
+ table "4.0.2"
+ text-table "~0.2.0"
+
+espree@^3.5.4:
+ version "3.5.4"
+ resolved "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz"
+ integrity sha512-yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==
+ dependencies:
+ acorn "^5.5.0"
+ acorn-jsx "^3.0.0"
+
+esprima@^4.0.0:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz"
+ integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==
+
+esquery@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz"
+ integrity sha512-cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==
+ dependencies:
+ estraverse "^5.1.0"
+
+esrecurse@^4.1.0, esrecurse@^4.3.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.3.0.tgz#7ad7964d679abb28bee72cec63758b1c5d2c9921"
+ integrity sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==
+ dependencies:
+ estraverse "^5.2.0"
+
+estraverse@^4.1.1:
+ version "4.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz"
+ integrity sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==
+
+estraverse@^5.1.0, estraverse@^5.2.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz"
+ integrity sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==
+
+esutils@^2.0.2:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz"
+ integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==
+
+etag@~1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz"
+ integrity sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==
+
+eventemitter3@^4.0.0:
+ version "4.0.7"
+ resolved "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz"
+ integrity sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==
+
+events@^3.2.0:
+ version "3.3.0"
+ resolved "https://registry.yarnpkg.com/events/-/events-3.3.0.tgz#31a95ad0a924e2d2c419a813aeb2c4e878ea7400"
+ integrity sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==
+
+execa@^5.0.0:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/execa/-/execa-5.1.1.tgz#f80ad9cbf4298f7bd1d4c9555c21e93741c411dd"
+ integrity sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==
+ dependencies:
+ cross-spawn "^7.0.3"
+ get-stream "^6.0.0"
+ human-signals "^2.1.0"
+ is-stream "^2.0.0"
+ merge-stream "^2.0.0"
+ npm-run-path "^4.0.1"
+ onetime "^5.1.2"
+ signal-exit "^3.0.3"
+ strip-final-newline "^2.0.0"
+
+express@^4.17.3:
+ version "4.18.1"
+ resolved "https://registry.yarnpkg.com/express/-/express-4.18.1.tgz#7797de8b9c72c857b9cd0e14a5eea80666267caf"
+ integrity sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==
+ dependencies:
+ accepts "~1.3.8"
+ array-flatten "1.1.1"
+ body-parser "1.20.0"
+ content-disposition "0.5.4"
+ content-type "~1.0.4"
+ cookie "0.5.0"
+ cookie-signature "1.0.6"
+ debug "2.6.9"
+ depd "2.0.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ finalhandler "1.2.0"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ merge-descriptors "1.0.1"
+ methods "~1.1.2"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ path-to-regexp "0.1.7"
+ proxy-addr "~2.0.7"
+ qs "6.10.3"
+ range-parser "~1.2.1"
+ safe-buffer "5.2.1"
+ send "0.18.0"
+ serve-static "1.15.0"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ type-is "~1.6.18"
+ utils-merge "1.0.1"
+ vary "~1.1.2"
+
+ext@^1.1.2:
+ version "1.7.0"
+ resolved "https://registry.npmjs.org/ext/-/ext-1.7.0.tgz"
+ integrity sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==
+ dependencies:
+ type "^2.7.2"
+
+extend@~3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz"
+ integrity sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==
+
+external-editor@^2.0.4:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz"
+ integrity sha512-bSn6gvGxKt+b7+6TKEv1ZycHleA7aHhRHyAqJyp5pbUFuYYNIzpZnQDk7AsYckyWdEnTeAnay0aCy2aV6iTk9A==
+ dependencies:
+ chardet "^0.4.0"
+ iconv-lite "^0.4.17"
+ tmp "^0.0.33"
+
+extsprintf@1.3.0, extsprintf@^1.2.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz"
+ integrity sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==
+
+fast-async@^6.3.7:
+ version "6.3.8"
+ resolved "https://registry.npmjs.org/fast-async/-/fast-async-6.3.8.tgz"
+ integrity sha512-TjlooyqrYm/gOXjD2UHNwfrWkvTbzU105Nk4bvcRTeRoL+wIeK6rqbqDg3CN9z5p37cE2iXhP6SxQFz8OVIaUg==
+ dependencies:
+ nodent-compiler "^3.2.10"
+ nodent-runtime ">=3.2.1"
+
+fast-deep-equal@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz"
+ integrity sha512-fueX787WZKCV0Is4/T2cyAdM4+x1S3MXXOAhavE1ys/W42SHAPacLTQhucja22QBYrfGw50M2sRiXPtTGv9Ymw==
+
+fast-deep-equal@^3.1.1, fast-deep-equal@^3.1.3:
+ version "3.1.3"
+ resolved "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz"
+ integrity sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==
+
+fast-json-stable-stringify@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz"
+ integrity sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==
+
+fast-levenshtein@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-3.0.0.tgz#37b899ae47e1090e40e3fd2318e4d5f0142ca912"
+ integrity sha512-hKKNajm46uNmTlhHSyZkmToAc56uZJwYq7yrciZjqOxnlfQwERDQJmHPUp7m1m9wx8vgOe8IaCKZ5Kv2k1DdCQ==
+ dependencies:
+ fastest-levenshtein "^1.0.7"
+
+fast-levenshtein@~2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz"
+ integrity sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==
+
+fastest-levenshtein@^1.0.12, fastest-levenshtein@^1.0.7:
+ version "1.0.16"
+ resolved "https://registry.yarnpkg.com/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz#210e61b6ff181de91ea9b3d1b84fdedd47e034e5"
+ integrity sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==
+
+faye-websocket@^0.11.3:
+ version "0.11.4"
+ resolved "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz"
+ integrity sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==
+ dependencies:
+ websocket-driver ">=0.5.1"
+
+figures@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz"
+ integrity sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==
+ dependencies:
+ escape-string-regexp "^1.0.5"
+
+file-entry-cache@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz"
+ integrity sha512-uXP/zGzxxFvFfcZGgBIwotm+Tdc55ddPAzF7iHshP4YGaXMww7rSF9peD9D1sui5ebONg5UobsZv+FfgEpGv/w==
+ dependencies:
+ flat-cache "^1.2.1"
+ object-assign "^4.0.1"
+
+file-loader@^6.0.0:
+ version "6.2.0"
+ resolved "https://registry.yarnpkg.com/file-loader/-/file-loader-6.2.0.tgz#baef7cf8e1840df325e4390b4484879480eebe4d"
+ integrity sha512-qo3glqyTa61Ytg4u73GultjHGjdRyig3tG6lPtyX/jOEJvHif9uB0/OCI2Kif6ctF3caQTW2G5gym21oAsI4pw==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+fill-range@^7.0.1:
+ version "7.0.1"
+ resolved "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz"
+ integrity sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==
+ dependencies:
+ to-regex-range "^5.0.1"
+
+finalhandler@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz"
+ integrity sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==
+ dependencies:
+ debug "2.6.9"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ on-finished "2.4.1"
+ parseurl "~1.3.3"
+ statuses "2.0.1"
+ unpipe "~1.0.0"
+
+find-babel-config@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/find-babel-config/-/find-babel-config-1.2.0.tgz"
+ integrity sha512-jB2CHJeqy6a820ssiqwrKMeyC6nNdmrcgkKWJWmpoxpE8RKciYJXCcXRq1h2AzCo5I5BJeN2tkGEO3hLTuePRA==
+ dependencies:
+ json5 "^0.5.1"
+ path-exists "^3.0.0"
+
+find-cache-dir@^3.3.1:
+ version "3.3.2"
+ resolved "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz"
+ integrity sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==
+ dependencies:
+ commondir "^1.0.1"
+ make-dir "^3.0.2"
+ pkg-dir "^4.1.0"
+
+find-up@^1.0.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz"
+ integrity sha512-jvElSjyuo4EMQGoTwo1uJU5pQMwTW5lS1x05zzfJuTIyLR3zwO27LYrxNg+dlvKpGOuGy/MzBdXh80g0ve5+HA==
+ dependencies:
+ path-exists "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+find-up@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz"
+ integrity sha512-NWzkk0jSJtTt08+FBFMvXoeZnOJD+jTtsRmBYbAIzJdX6l7dLgR7CTubCM5/eDdPUBvLCeVasP1brfVR/9/EZQ==
+ dependencies:
+ locate-path "^2.0.0"
+
+find-up@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz"
+ integrity sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==
+ dependencies:
+ locate-path "^3.0.0"
+
+find-up@^4.0.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz"
+ integrity sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==
+ dependencies:
+ locate-path "^5.0.0"
+ path-exists "^4.0.0"
+
+flat-cache@^1.2.1:
+ version "1.3.4"
+ resolved "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.4.tgz"
+ integrity sha512-VwyB3Lkgacfik2vhqR4uv2rvebqmDvFu4jlN/C1RzWoJEo8I7z4Q404oiqYCkq41mni8EzQnm95emU9seckwtg==
+ dependencies:
+ circular-json "^0.3.1"
+ graceful-fs "^4.1.2"
+ rimraf "~2.6.2"
+ write "^0.2.1"
+
+follow-redirects@^1.0.0:
+ version "1.15.2"
+ resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz"
+ integrity sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==
+
+forever-agent@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz"
+ integrity sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==
+
+form-data@~2.3.2:
+ version "2.3.3"
+ resolved "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz"
+ integrity sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==
+ dependencies:
+ asynckit "^0.4.0"
+ combined-stream "^1.0.6"
+ mime-types "^2.1.12"
+
+forwarded@0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz"
+ integrity sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==
+
+fresh@0.5.2:
+ version "0.5.2"
+ resolved "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz"
+ integrity sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==
+
+fs-monkey@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.yarnpkg.com/fs-monkey/-/fs-monkey-1.0.3.tgz#ae3ac92d53bb328efe0e9a1d9541f6ad8d48e2d3"
+ integrity sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==
+
+fs.realpath@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz"
+ integrity sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==
+
+fsevents@~2.3.2:
+ version "2.3.2"
+ resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-2.3.2.tgz#8a526f78b8fdf4623b709e0b975c52c24c02fd1a"
+ integrity sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==
+
+fstream@^1.0.0, fstream@^1.0.12:
+ version "1.0.12"
+ resolved "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz"
+ integrity sha512-WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ inherits "~2.0.0"
+ mkdirp ">=0.5 0"
+ rimraf "2"
+
+function-bind@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz"
+ integrity sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==
+
+function.prototype.name@^1.1.5:
+ 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==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.0"
+ functions-have-names "^1.2.2"
+
+functional-red-black-tree@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz"
+ integrity sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==
+
+functions-have-names@^1.2.2:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz"
+ integrity sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==
+
+gauge@~2.7.3:
+ version "2.7.4"
+ resolved "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz"
+ integrity sha512-14x4kjc6lkD3ltw589k0NrPD6cCNTD6CWoVUNpB85+DrtONoZn+Rug6xZU5RvSC4+TZPxA5AnBibQYAvZn41Hg==
+ dependencies:
+ aproba "^1.0.3"
+ console-control-strings "^1.0.0"
+ has-unicode "^2.0.0"
+ object-assign "^4.1.0"
+ signal-exit "^3.0.0"
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+ wide-align "^1.1.0"
+
+gaze@^1.0.0:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/gaze/-/gaze-1.1.3.tgz"
+ integrity sha512-BRdNm8hbWzFzWHERTrejLqwHDfS4GibPoq5wjTPIoJHoBtKGPg3xAFfxmM+9ztbXelxcf2hwQcaz1PtmFeue8g==
+ dependencies:
+ globule "^1.0.0"
+
+gensync@^1.0.0-beta.2:
+ version "1.0.0-beta.2"
+ resolved "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz"
+ integrity sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==
+
+get-caller-file@^1.0.1:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz"
+ integrity sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==
+
+get-caller-file@^2.0.1:
+ version "2.0.5"
+ resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz"
+ integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==
+
+get-intrinsic@^1.0.2, get-intrinsic@^1.1.0, get-intrinsic@^1.1.1, get-intrinsic@^1.1.3:
+ version "1.1.3"
+ resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.3.tgz"
+ integrity sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==
+ dependencies:
+ function-bind "^1.1.1"
+ has "^1.0.3"
+ has-symbols "^1.0.3"
+
+get-port@^3.1.0:
+ version "3.2.0"
+ resolved "https://registry.yarnpkg.com/get-port/-/get-port-3.2.0.tgz#dd7ce7de187c06c8bf353796ac71e099f0980ebc"
+ integrity sha512-x5UJKlgeUiNT8nyo/AcnwLnZuZNcSjSw0kogRB+Whd1fjjFq4B1hySFxSFWWSn4mIBzg3sRNUDFYc4g5gjPoLg==
+
+get-stdin@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz"
+ integrity sha512-F5aQMywwJ2n85s4hJPTT9RPxGmubonuB10MNYo17/xph174n2MIR33HRguhzVag10O/npM7SPk73LMZNP+FaWw==
+
+get-stream@^6.0.0:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-6.0.1.tgz#a262d8eef67aced57c2852ad6167526a43cbf7b7"
+ integrity sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==
+
+get-symbol-description@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz"
+ integrity sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.1"
+
+getpass@^0.1.1:
+ version "0.1.7"
+ resolved "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz"
+ integrity sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==
+ dependencies:
+ assert-plus "^1.0.0"
+
+glob-parent@~5.1.2:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz"
+ integrity sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==
+ dependencies:
+ is-glob "^4.0.1"
+
+glob-to-regexp@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz#c75297087c851b9a578bd217dd59a92f59fe546e"
+ integrity sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==
+
+glob@^7.0.0, glob@^7.0.3, glob@^7.1.2, glob@^7.1.3:
+ version "7.2.3"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz"
+ integrity sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.1.1"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+glob@~7.1.1:
+ version "7.1.7"
+ resolved "https://registry.npmjs.org/glob/-/glob-7.1.7.tgz"
+ integrity sha512-OvD9ENzPLbegENnYP5UUfJIirTg4+XwMWGaQfQTY0JenxNvvIKP3U3/tAQSPIu/lHxXYSZmpXlUHeqAIdKzBLQ==
+ dependencies:
+ fs.realpath "^1.0.0"
+ inflight "^1.0.4"
+ inherits "2"
+ minimatch "^3.0.4"
+ once "^1.3.0"
+ path-is-absolute "^1.0.0"
+
+globals@^11.0.1, globals@^11.1.0:
+ version "11.12.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz"
+ integrity sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==
+
+globals@^9.18.0:
+ version "9.18.0"
+ resolved "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz"
+ integrity sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==
+
+globby@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz"
+ integrity sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==
+ dependencies:
+ array-union "^1.0.1"
+ glob "^7.0.3"
+ object-assign "^4.0.1"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+globule@^1.0.0:
+ version "1.3.4"
+ resolved "https://registry.npmjs.org/globule/-/globule-1.3.4.tgz"
+ integrity sha512-OPTIfhMBh7JbBYDpa5b+Q5ptmMWKwcNcFSR/0c6t8V4f3ZAVBEsKNY37QdVqmLRYSMhOUGYrY0QhSoEpzGr/Eg==
+ dependencies:
+ glob "~7.1.1"
+ lodash "^4.17.21"
+ minimatch "~3.0.2"
+
+graceful-fs@^4.1.2, graceful-fs@^4.2.4, graceful-fs@^4.2.6, graceful-fs@^4.2.9:
+ version "4.2.10"
+ resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.10.tgz#147d3a006da4ca3ce14728c7aefc287c367d7a6c"
+ integrity sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==
+
+handle-thing@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz"
+ integrity sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==
+
+har-schema@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz"
+ integrity sha512-Oqluz6zhGX8cyRaTQlFMPw80bSJVG2x/cFb8ZPhUILGgHka9SsokCCOQgpveePerqidZOrT14ipqfJb7ILcW5Q==
+
+har-validator@~5.1.3:
+ version "5.1.5"
+ resolved "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz"
+ integrity sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==
+ dependencies:
+ ajv "^6.12.3"
+ har-schema "^2.0.0"
+
+has-ansi@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz"
+ integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
+ dependencies:
+ ansi-regex "^2.0.0"
+
+has-bigints@^1.0.1, has-bigints@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz"
+ integrity sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==
+
+has-flag@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz"
+ integrity sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==
+
+has-flag@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b"
+ integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==
+
+has-property-descriptors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz"
+ integrity sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==
+ dependencies:
+ get-intrinsic "^1.1.1"
+
+has-symbols@^1.0.2, has-symbols@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz"
+ integrity sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==
+
+has-tostringtag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.0.tgz"
+ integrity sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==
+ dependencies:
+ has-symbols "^1.0.2"
+
+has-unicode@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz"
+ integrity sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==
+
+has@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/has/-/has-1.0.3.tgz"
+ integrity sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==
+ dependencies:
+ function-bind "^1.1.1"
+
+home-or-tmp@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz"
+ integrity sha512-ycURW7oUxE2sNiPVw1HVEFsW+ecOpJ5zaj7eC0RlwhibhRBod20muUN8qu/gzx956YrLolVvs1MTXwKgC2rVEg==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.1"
+
+hosted-git-info@^2.1.4:
+ version "2.8.9"
+ resolved "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz"
+ integrity sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==
+
+hpack.js@^2.1.6:
+ version "2.1.6"
+ resolved "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz"
+ integrity sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==
+ dependencies:
+ inherits "^2.0.1"
+ obuf "^1.0.0"
+ readable-stream "^2.0.1"
+ wbuf "^1.1.0"
+
+html-entities@^2.3.2:
+ version "2.3.3"
+ resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-2.3.3.tgz#117d7626bece327fc8baace8868fa6f5ef856e46"
+ integrity sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==
+
+htmlparser2@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz"
+ integrity sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==
+ dependencies:
+ domelementtype "^2.0.1"
+ domhandler "^4.0.0"
+ domutils "^2.5.2"
+ entities "^2.0.0"
+
+http-deceiver@^1.2.7:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz"
+ integrity sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==
+
+http-errors@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz"
+ integrity sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==
+ dependencies:
+ depd "2.0.0"
+ inherits "2.0.4"
+ setprototypeof "1.2.0"
+ statuses "2.0.1"
+ toidentifier "1.0.1"
+
+http-errors@~1.6.2:
+ version "1.6.3"
+ resolved "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz"
+ integrity sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==
+ dependencies:
+ depd "~1.1.2"
+ inherits "2.0.3"
+ setprototypeof "1.1.0"
+ statuses ">= 1.4.0 < 2"
+
+http-parser-js@>=0.5.1:
+ version "0.5.8"
+ resolved "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz"
+ integrity sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==
+
+http-proxy-middleware@^2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz#e1a4dd6979572c7ab5a4e4b55095d1f32a74963f"
+ integrity sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==
+ dependencies:
+ "@types/http-proxy" "^1.17.8"
+ http-proxy "^1.18.1"
+ is-glob "^4.0.1"
+ is-plain-obj "^3.0.0"
+ micromatch "^4.0.2"
+
+http-proxy@^1.18.1:
+ version "1.18.1"
+ resolved "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz#401541f0534884bbf95260334e72f88ee3976549"
+ integrity sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==
+ dependencies:
+ eventemitter3 "^4.0.0"
+ follow-redirects "^1.0.0"
+ requires-port "^1.0.0"
+
+http-signature@~1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz"
+ integrity sha512-CAbnr6Rz4CYQkLYUtSNXxQPUH2gK8f3iWexVlsnMeD+GjlsQ0Xsy1cOX+mN3dtxYomRy21CiOzU8Uhw6OwncEQ==
+ dependencies:
+ assert-plus "^1.0.0"
+ jsprim "^1.2.2"
+ sshpk "^1.7.0"
+
+human-signals@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/human-signals/-/human-signals-2.1.0.tgz#dc91fcba42e4d06e4abaed33b3e7a3c02f514ea0"
+ integrity sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==
+
+iconv-lite@0.4.24, iconv-lite@^0.4.17:
+ version "0.4.24"
+ resolved "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz"
+ integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==
+ dependencies:
+ safer-buffer ">= 2.1.2 < 3"
+
+icss-utils@^5.0.0, icss-utils@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/icss-utils/-/icss-utils-5.1.0.tgz#c6be6858abd013d768e98366ae47e25d5887b1ae"
+ integrity sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==
+
+ignore@^3.3.3:
+ version "3.3.10"
+ resolved "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz"
+ integrity sha512-Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==
+
+import-local@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/import-local/-/import-local-3.1.0.tgz#b4479df8a5fd44f6cdce24070675676063c95cb4"
+ integrity sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==
+ dependencies:
+ pkg-dir "^4.2.0"
+ resolve-cwd "^3.0.0"
+
+imurmurhash@^0.1.4:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz"
+ integrity sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==
+
+in-publish@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/in-publish/-/in-publish-2.0.1.tgz"
+ integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
+
+indent-string@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz"
+ integrity sha512-aqwDFWSgSgfRaEwao5lg5KEcVd/2a+D1rvoG7NdilmYz0NwRk6StWpWdz/Hpk34MKPpx7s8XxUqimfcQK6gGlg==
+ dependencies:
+ repeating "^2.0.0"
+
+inflight@^1.0.4:
+ version "1.0.6"
+ resolved "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz"
+ integrity sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==
+ dependencies:
+ once "^1.3.0"
+ wrappy "1"
+
+inherits@2, inherits@2.0.4, inherits@^2.0.1, inherits@^2.0.3, inherits@~2.0.0, inherits@~2.0.3:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz"
+ integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
+
+inherits@2.0.3:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz"
+ integrity sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==
+
+inquirer@^3.0.6:
+ version "3.3.0"
+ resolved "https://registry.npmjs.org/inquirer/-/inquirer-3.3.0.tgz"
+ integrity sha512-h+xtnyk4EwKvFWHrUYsWErEVR+igKtLdchu+o0Z1RL7VU/jVMFbYir2bp6bAj8efFNxWqHX0dIss6fJQ+/+qeQ==
+ dependencies:
+ ansi-escapes "^3.0.0"
+ chalk "^2.0.0"
+ cli-cursor "^2.1.0"
+ cli-width "^2.0.0"
+ external-editor "^2.0.4"
+ figures "^2.0.0"
+ lodash "^4.3.0"
+ mute-stream "0.0.7"
+ run-async "^2.2.0"
+ rx-lite "^4.0.8"
+ rx-lite-aggregates "^4.0.8"
+ string-width "^2.1.0"
+ strip-ansi "^4.0.0"
+ through "^2.3.6"
+
+internal-slot@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.3.tgz"
+ integrity sha512-O0DB1JC/sPyZl7cIo78n5dR7eUSwwpYPiXRhTzNxZVAMUuB8vlnRFyLxdrVToks6XPLVnFfbzaVd5WLjhgg+vA==
+ dependencies:
+ get-intrinsic "^1.1.0"
+ has "^1.0.3"
+ side-channel "^1.0.4"
+
+interpret@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/interpret/-/interpret-2.2.0.tgz#1a78a0b5965c40a5416d007ad6f50ad27c417df9"
+ integrity sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==
+
+invariant@^2.2.2:
+ version "2.2.4"
+ resolved "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz"
+ integrity sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==
+ dependencies:
+ loose-envify "^1.0.0"
+
+invert-kv@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz"
+ integrity sha512-xgs2NH9AE66ucSq4cNG1nhSFghr5l6tdL15Pk+jl46bmmBapgoaY/AacXyaDznAqmGL99TiLSQgO/XazFSKYeQ==
+
+ipaddr.js@1.9.1:
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz"
+ integrity sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==
+
+ipaddr.js@^2.0.1:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-2.0.1.tgz#eca256a7a877e917aeb368b0a7497ddf42ef81c0"
+ integrity sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==
+
+is-arrayish@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz"
+ integrity sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==
+
+is-bigint@^1.0.1:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz"
+ integrity sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==
+ dependencies:
+ has-bigints "^1.0.1"
+
+is-binary-path@~2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz"
+ integrity sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==
+ dependencies:
+ binary-extensions "^2.0.0"
+
+is-boolean-object@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz"
+ integrity sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-callable@^1.1.4, is-callable@^1.2.6:
+ version "1.2.7"
+ resolved "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz"
+ integrity sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==
+
+is-core-module@^2.8.1, is-core-module@^2.9.0:
+ version "2.10.0"
+ resolved "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz"
+ integrity sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==
+ dependencies:
+ has "^1.0.3"
+
+is-date-object@^1.0.1:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz"
+ integrity sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-docker@^2.0.0, is-docker@^2.1.1:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/is-docker/-/is-docker-2.2.1.tgz#33eeabe23cfe86f14bde4408a02c0cfb853acdaa"
+ integrity sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==
+
+is-extglob@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz"
+ integrity sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==
+
+is-finite@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz"
+ integrity sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==
+
+is-fullwidth-code-point@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz"
+ integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==
+ dependencies:
+ number-is-nan "^1.0.0"
+
+is-fullwidth-code-point@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz"
+ integrity sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==
+
+is-fullwidth-code-point@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz#f116f8064fe90b3f7844a38997c0b75051269f1d"
+ integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==
+
+is-glob@^4.0.1, is-glob@^4.0.3, is-glob@~4.0.1:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz"
+ integrity sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==
+ dependencies:
+ is-extglob "^2.1.1"
+
+is-negative-zero@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz"
+ integrity sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==
+
+is-number-object@^1.0.4:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz"
+ integrity sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-number@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz"
+ integrity sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==
+
+is-path-cwd@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz"
+ integrity sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==
+
+is-path-in-cwd@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz"
+ integrity sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==
+ dependencies:
+ is-path-inside "^2.1.0"
+
+is-path-inside@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz"
+ integrity sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==
+ dependencies:
+ path-is-inside "^1.0.2"
+
+is-plain-obj@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-3.0.0.tgz#af6f2ea14ac5a646183a5bbdb5baabbc156ad9d7"
+ integrity sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==
+
+is-plain-object@^2.0.4:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz"
+ integrity sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==
+ dependencies:
+ isobject "^3.0.1"
+
+is-regex@^1.1.4:
+ version "1.1.4"
+ resolved "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz"
+ integrity sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==
+ dependencies:
+ call-bind "^1.0.2"
+ has-tostringtag "^1.0.0"
+
+is-resolvable@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz"
+ integrity sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==
+
+is-shared-array-buffer@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz"
+ integrity sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-stream@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.1.tgz#fac1e3d53b97ad5a9d0ae9cef2389f5810a5c077"
+ integrity sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==
+
+is-string@^1.0.5, is-string@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz"
+ integrity sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==
+ dependencies:
+ has-tostringtag "^1.0.0"
+
+is-symbol@^1.0.2, is-symbol@^1.0.3:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz"
+ integrity sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==
+ dependencies:
+ has-symbols "^1.0.2"
+
+is-typedarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz"
+ integrity sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==
+
+is-utf8@^0.2.0:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz"
+ integrity sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==
+
+is-weakref@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz"
+ integrity sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==
+ dependencies:
+ call-bind "^1.0.2"
+
+is-wsl@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz#74a4c76e77ca9fd3f932f290c17ea326cd157271"
+ integrity sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==
+ dependencies:
+ is-docker "^2.0.0"
+
+isarray@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz"
+ integrity sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==
+
+isexe@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz"
+ integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==
+
+isobject@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz"
+ integrity sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==
+
+isstream@~0.1.2:
+ version "0.1.2"
+ resolved "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz"
+ integrity sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==
+
+jest-worker@^26.3.0:
+ version "26.6.2"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-26.6.2.tgz#7f72cbc4d643c365e27b9fd775f9d0eaa9c7a8ed"
+ integrity sha512-KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^7.0.0"
+
+jest-worker@^27.4.5:
+ version "27.5.1"
+ resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-27.5.1.tgz#8d146f0900e8973b106b6f73cc1e9a8cb86f8db0"
+ integrity sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==
+ dependencies:
+ "@types/node" "*"
+ merge-stream "^2.0.0"
+ supports-color "^8.0.0"
+
+jquery.dirtyforms@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/jquery.dirtyforms/-/jquery.dirtyforms-2.0.0.tgz"
+ integrity sha512-iGhN+ESRCYgR1Tz3Z5RwKhCZi+1LMQiglHxghtTk10O1KmjvZwd2HUrSsV9Zn3ntFgDzYcQcLNERUAAF4RDT/A==
+ dependencies:
+ jquery ">=1.4.2"
+
+jquery@>=1.4.2, jquery@^3.5.0, jquery@x.*:
+ version "3.6.1"
+ resolved "https://registry.npmjs.org/jquery/-/jquery-3.6.1.tgz"
+ integrity sha512-opJeO4nCucVnsjiXOE+/PcCgYw9Gwpvs/a6B1LL/lQhwWwpbVEVYDZ1FokFr8PRc7ghYlrFPuyHuiiDNTQxmcw==
+
+js-base64@^2.1.8:
+ version "2.6.4"
+ resolved "https://registry.npmjs.org/js-base64/-/js-base64-2.6.4.tgz"
+ integrity sha512-pZe//GGmwJndub7ZghVHz7vjb2LgC1m8B07Au3eYqeqv9emhESByMXxaEgkUkEqJe87oBbSniGYoQNIBklc7IQ==
+
+"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz"
+ integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
+
+js-tokens@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz"
+ integrity sha512-RjTcuD4xjtthQkaWH7dFlH85L+QaVtSoOyGdZ3g6HFhS9dFNDfLyqgm2NFe2X6cQpeFmt0452FJjFG5UameExg==
+
+js-yaml@^3.9.1:
+ version "3.14.1"
+ resolved "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz"
+ integrity sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==
+ dependencies:
+ argparse "^1.0.7"
+ esprima "^4.0.0"
+
+jsbn@~0.1.0:
+ version "0.1.1"
+ resolved "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz"
+ integrity sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==
+
+jsesc@^1.3.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz"
+ integrity sha512-Mke0DA0QjUWuJlhsE0ZPPhYiJkRap642SmI/4ztCFaUs6V2AiH1sfecc+57NgaryfAA2VR3v6O+CSjC1jZJKOA==
+
+jsesc@^2.5.1:
+ version "2.5.2"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz"
+ integrity sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==
+
+jsesc@~0.5.0:
+ version "0.5.0"
+ resolved "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz"
+ integrity sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==
+
+json-parse-even-better-errors@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
+ integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
+
+json-schema-traverse@^0.3.0:
+ version "0.3.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz"
+ integrity sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==
+
+json-schema-traverse@^0.4.1:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz"
+ integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==
+
+json-schema-traverse@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz#ae7bcb3656ab77a73ba5c49bf654f38e6b6860e2"
+ integrity sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==
+
+json-schema@0.4.0:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz"
+ integrity sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==
+
+json-stable-stringify-without-jsonify@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz"
+ integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
+
+json-stringify-safe@~5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz"
+ integrity sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==
+
+json5@^0.5.1:
+ version "0.5.1"
+ resolved "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz"
+ integrity sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==
+
+json5@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz"
+ integrity sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==
+ dependencies:
+ minimist "^1.2.0"
+
+json5@^2.1.2, json5@^2.2.1:
+ version "2.2.1"
+ resolved "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz"
+ integrity sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==
+
+jsprim@^1.2.2:
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/jsprim/-/jsprim-1.4.2.tgz"
+ integrity sha512-P2bSOMAc/ciLz6DzgjVlGJP9+BrJWu5UDGK70C2iweC5QBIeFf0ZXRvGjEj2uYgrY2MkAAhsSWHDWlFtEroZWw==
+ dependencies:
+ assert-plus "1.0.0"
+ extsprintf "1.3.0"
+ json-schema "0.4.0"
+ verror "1.10.0"
+
+kind-of@^6.0.2:
+ version "6.0.3"
+ resolved "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz"
+ integrity sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==
+
+lcid@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz"
+ integrity sha512-YiGkH6EnGrDGqLMITnGjXtGmNtjoXw9SVUzcaos8RBi7Ps0VBylkq+vOcY9QE5poLasPCR849ucFUkl0UzUyOw==
+ dependencies:
+ invert-kv "^1.0.0"
+
+levn@^0.3.0, levn@~0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz"
+ integrity sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==
+ dependencies:
+ prelude-ls "~1.1.2"
+ type-check "~0.3.2"
+
+lightbox2@^2.9.0:
+ version "2.11.3"
+ resolved "https://registry.npmjs.org/lightbox2/-/lightbox2-2.11.3.tgz"
+ integrity sha512-Q4v6il/OK9ttgEkAxSok/jrI/LUbqTrePFchqP2x/59qaDIZgJjEEc5Xf7peSMc/55Zo5PAgmX6EiN/BeEeUBQ==
+
+lilconfig@^2.0.3:
+ version "2.0.6"
+ resolved "https://registry.yarnpkg.com/lilconfig/-/lilconfig-2.0.6.tgz#32a384558bd58af3d4c6e077dd1ad1d397bc69d4"
+ integrity sha512-9JROoBW7pobfsx+Sq2JsASvCo6Pfo6WWoUW79HuB1BCoBXD4PLWJPqDF6fNj67pqBYTbAHkE57M1kS/+L1neOg==
+
+load-json-file@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz"
+ integrity sha512-cy7ZdNRXdablkXYNI049pthVeXFurRyb9+hA/dZzerZ0pGTx42z+y+ssxBaVV2l70t1muq5IdKhn4UtcoGUY9A==
+ dependencies:
+ graceful-fs "^4.1.2"
+ parse-json "^2.2.0"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+ strip-bom "^2.0.0"
+
+loader-runner@^4.2.0:
+ version "4.3.0"
+ resolved "https://registry.yarnpkg.com/loader-runner/-/loader-runner-4.3.0.tgz#c1b4a163b99f614830353b16755e7149ac2314e1"
+ integrity sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==
+
+loader-utils@1.2.3:
+ version "1.2.3"
+ resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz"
+ integrity sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^2.0.0"
+ json5 "^1.0.1"
+
+loader-utils@^1.0.1:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-1.4.0.tgz"
+ integrity sha512-qH0WSMBtn/oHuwjy/NucEgbx5dbxxnxup9s4PVXJUDHZBQY+s0NWA9rJf53RBnQZxfch7euUui7hpoAPvALZdA==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^1.0.1"
+
+loader-utils@^2.0.0:
+ version "2.0.2"
+ resolved "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz"
+ integrity sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==
+ dependencies:
+ big.js "^5.2.2"
+ emojis-list "^3.0.0"
+ json5 "^2.1.2"
+
+locate-path@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz"
+ integrity sha512-NCI2kiDkyR7VeEKm27Kda/iQHyKJe1Bu0FlTbYp3CqJu+9IFe9bLyAjMxf5ZDDbEg+iMPzB5zYyUTSm8wVTKmA==
+ dependencies:
+ p-locate "^2.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz"
+ integrity sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==
+ dependencies:
+ p-locate "^3.0.0"
+ path-exists "^3.0.0"
+
+locate-path@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz"
+ integrity sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==
+ dependencies:
+ p-locate "^4.1.0"
+
+lodash.debounce@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz"
+ integrity sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==
+
+lodash.memoize@^4.1.2:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz"
+ integrity sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==
+
+lodash.uniq@^4.5.0:
+ version "4.5.0"
+ resolved "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz"
+ integrity sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==
+
+lodash@^4.0.0, lodash@^4.17.15, lodash@^4.17.20, lodash@^4.17.21, lodash@^4.17.4, lodash@^4.3.0:
+ version "4.17.21"
+ resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz"
+ integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+loose-envify@^1.0.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz"
+ integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
+ dependencies:
+ js-tokens "^3.0.0 || ^4.0.0"
+
+loud-rejection@^1.0.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz"
+ integrity sha512-RPNliZOFkqFumDhvYqOaNY4Uz9oJM2K9tC6JWsJJsNdhuONW4LQHRBpb0qf4pJApVffI5N39SwzWZJuEhfd7eQ==
+ dependencies:
+ currently-unhandled "^0.4.1"
+ signal-exit "^3.0.0"
+
+lru-cache@^4.0.1:
+ version "4.1.5"
+ resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz"
+ integrity sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==
+ dependencies:
+ pseudomap "^1.0.2"
+ yallist "^2.1.2"
+
+lru-cache@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
+ integrity sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==
+ dependencies:
+ yallist "^4.0.0"
+
+make-dir@^3.0.2, make-dir@^3.1.0:
+ 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==
+ dependencies:
+ semver "^6.0.0"
+
+map-obj@^1.0.0, map-obj@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz"
+ integrity sha512-7N/q3lyZ+LVCp7PzuxrJr4KMbBE2hW7BT7YNia330OFxIf4d3r5zVpicP2650l7CPN6RM9zOJRl3NGpqSiw3Eg==
+
+mdn-data@2.0.14:
+ version "2.0.14"
+ resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz"
+ integrity sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==
+
+media-typer@0.3.0:
+ version "0.3.0"
+ resolved "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz"
+ integrity sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==
+
+memfs@^3.4.3:
+ version "3.4.7"
+ resolved "https://registry.yarnpkg.com/memfs/-/memfs-3.4.7.tgz#e5252ad2242a724f938cb937e3c4f7ceb1f70e5a"
+ integrity sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==
+ dependencies:
+ fs-monkey "^1.0.3"
+
+meow@^3.7.0:
+ version "3.7.0"
+ resolved "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz"
+ integrity sha512-TNdwZs0skRlpPpCUK25StC4VH+tP5GgeY1HQOOGP+lQ2xtdkN2VtT/5tiX9k3IWpkBPV9b3LsAWXn4GGi/PrSA==
+ dependencies:
+ camelcase-keys "^2.0.0"
+ decamelize "^1.1.2"
+ loud-rejection "^1.0.0"
+ map-obj "^1.0.1"
+ minimist "^1.1.3"
+ normalize-package-data "^2.3.4"
+ object-assign "^4.0.1"
+ read-pkg-up "^1.0.1"
+ redent "^1.0.0"
+ trim-newlines "^1.0.0"
+
+merge-descriptors@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz"
+ integrity sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==
+
+merge-stream@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz"
+ integrity sha512-e6RM36aegd4f+r8BZCcYXlO2P3H6xbUM6ktL2Xmf45GAOit9bI4z6/3VU7JwllVO1L7u0UDSg/EhzQ5lmMLolA==
+ dependencies:
+ readable-stream "^2.0.1"
+
+merge-stream@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz#52823629a14dd00c9770fb6ad47dc6310f2c1f60"
+ integrity sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==
+
+methods@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz"
+ integrity sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==
+
+micromatch@^4.0.2:
+ version "4.0.5"
+ resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-4.0.5.tgz#bc8999a7cbbf77cdc89f132f6e467051b49090c6"
+ integrity sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==
+ dependencies:
+ braces "^3.0.2"
+ picomatch "^2.3.1"
+
+mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
+ version "1.52.0"
+ resolved "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz"
+ integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12, mime-types@^2.1.27, mime-types@^2.1.31, mime-types@~2.1.17, mime-types@~2.1.19, mime-types@~2.1.24, mime-types@~2.1.34:
+ version "2.1.35"
+ resolved "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz"
+ integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+ dependencies:
+ mime-db "1.52.0"
+
+mime@1.6.0:
+ version "1.6.0"
+ resolved "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz"
+ integrity sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==
+
+mimic-fn@^1.0.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz"
+ integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==
+
+mimic-fn@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
+ integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
+
+mini-css-extract-plugin@^1.5.0:
+ version "1.6.2"
+ resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-1.6.2.tgz#83172b4fd812f8fc4a09d6f6d16f924f53990ca8"
+ integrity sha512-WhDvO3SjGm40oV5y26GjMJYjd2UMqrLAGKy5YS2/3QKJy2F7jgynuHTir/tgUUOiNQu5saXHdc8reo7YuhhT4Q==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+ webpack-sources "^1.1.0"
+
+minimalistic-assert@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz"
+ integrity sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==
+
+minimatch@^3.0.2, minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2:
+ version "3.1.2"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz"
+ integrity sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimatch@~3.0.2:
+ version "3.0.8"
+ resolved "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz"
+ integrity sha512-6FsRAQsxQ61mw+qP1ZzbL9Bc78x2p5OqNgNpnoAFLTrX8n5Kxph0CsnhmKKNXTWjXqU5L0pGPR7hYk+XWZr60Q==
+ dependencies:
+ brace-expansion "^1.1.7"
+
+minimist@^1.1.3, minimist@^1.2.0, minimist@^1.2.6:
+ version "1.2.6"
+ resolved "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz"
+ integrity sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==
+
+"mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1:
+ version "0.5.6"
+ resolved "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz"
+ integrity sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==
+ dependencies:
+ minimist "^1.2.6"
+
+moment@^2.10.2:
+ version "2.29.4"
+ resolved "https://registry.npmjs.org/moment/-/moment-2.29.4.tgz"
+ integrity sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==
+
+ms@2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz"
+ integrity sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==
+
+ms@2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz"
+ integrity sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==
+
+ms@2.1.3, ms@^2.1.1:
+ version "2.1.3"
+ resolved "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz"
+ integrity sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==
+
+multicast-dns@^7.2.5:
+ version "7.2.5"
+ resolved "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-7.2.5.tgz#77eb46057f4d7adbd16d9290fa7299f6fa64cced"
+ integrity sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==
+ dependencies:
+ dns-packet "^5.2.2"
+ thunky "^1.0.2"
+
+mute-stream@0.0.7:
+ version "0.0.7"
+ resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz"
+ integrity sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==
+
+nan@^2.13.2:
+ version "2.16.0"
+ resolved "https://registry.yarnpkg.com/nan/-/nan-2.16.0.tgz#664f43e45460fb98faf00edca0bb0d7b8dce7916"
+ integrity sha512-UdAqHyFngu7TfQKsCBgAA6pWDkT8MAO7d0jyOecVhN5354xbLqdn8mV9Tat9gepAupm0bt2DbeaSC8vS52MuFA==
+
+nanoid@^3.3.4:
+ version "3.3.4"
+ resolved "https://registry.yarnpkg.com/nanoid/-/nanoid-3.3.4.tgz#730b67e3cd09e2deacf03c027c81c9d9dbc5e8ab"
+ integrity sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==
+
+natural-compare@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz"
+ integrity sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==
+
+negotiator@0.6.3:
+ version "0.6.3"
+ resolved "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz"
+ integrity sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==
+
+neo-async@^2.5.0, neo-async@^2.6.2:
+ version "2.6.2"
+ resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.2.tgz#b4aafb93e3aeb2d8174ca53cf163ab7d7308305f"
+ integrity sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==
+
+next-tick@^1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz"
+ integrity sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==
+
+node-forge@^1:
+ version "1.3.1"
+ resolved "https://registry.yarnpkg.com/node-forge/-/node-forge-1.3.1.tgz#be8da2af243b2417d5f646a770663a92b7e9ded3"
+ integrity sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==
+
+node-gyp@^3.8.0:
+ version "3.8.0"
+ resolved "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz"
+ integrity sha512-3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==
+ dependencies:
+ fstream "^1.0.0"
+ glob "^7.0.3"
+ graceful-fs "^4.1.2"
+ mkdirp "^0.5.0"
+ nopt "2 || 3"
+ npmlog "0 || 1 || 2 || 3 || 4"
+ osenv "0"
+ request "^2.87.0"
+ rimraf "2"
+ semver "~5.3.0"
+ tar "^2.0.0"
+ which "1"
+
+node-releases@^2.0.6:
+ version "2.0.6"
+ resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.6.tgz"
+ integrity sha512-PiVXnNuFm5+iYkLBNeq5211hvO38y63T0i2KKh2KnUs3RpzJ+JtODFjkD8yjLwnDkTYF1eKXheUwdssR+NRZdg==
+
+node-sass@^4.14:
+ version "4.14.1"
+ resolved "https://registry.npmjs.org/node-sass/-/node-sass-4.14.1.tgz"
+ integrity sha512-sjCuOlvGyCJS40R8BscF5vhVlQjNN069NtQ1gSxyK1u9iqvn6tf7O1R4GNowVZfiZUCRt5MmMs1xd+4V/7Yr0g==
+ dependencies:
+ async-foreach "^0.1.3"
+ chalk "^1.1.1"
+ cross-spawn "^3.0.0"
+ gaze "^1.0.0"
+ get-stdin "^4.0.1"
+ glob "^7.0.3"
+ in-publish "^2.0.0"
+ lodash "^4.17.15"
+ meow "^3.7.0"
+ mkdirp "^0.5.1"
+ nan "^2.13.2"
+ node-gyp "^3.8.0"
+ npmlog "^4.0.0"
+ request "^2.88.0"
+ sass-graph "2.2.5"
+ stdout-stream "^1.4.0"
+ "true-case-path" "^1.0.2"
+
+nodent-compiler@^3.2.10:
+ version "3.2.13"
+ resolved "https://registry.npmjs.org/nodent-compiler/-/nodent-compiler-3.2.13.tgz"
+ integrity sha512-nzzWPXZwSdsWie34om+4dLrT/5l1nT/+ig1v06xuSgMtieJVAnMQFuZihUwREM+M7dFso9YoHfDmweexEXXrrw==
+ dependencies:
+ acorn ">= 2.5.2 <= 5.7.5"
+ acorn-es7-plugin "^1.1.7"
+ nodent-transform "^3.2.9"
+ source-map "^0.5.7"
+
+nodent-runtime@>=3.2.1:
+ version "3.2.1"
+ resolved "https://registry.npmjs.org/nodent-runtime/-/nodent-runtime-3.2.1.tgz"
+ integrity sha512-7Ws63oC+215smeKJQCxzrK21VFVlCFBkwl0MOObt0HOpVQXs3u483sAmtkF33nNqZ5rSOQjB76fgyPBmAUrtCA==
+
+nodent-transform@^3.2.9:
+ version "3.2.9"
+ resolved "https://registry.npmjs.org/nodent-transform/-/nodent-transform-3.2.9.tgz"
+ integrity sha512-4a5FH4WLi+daH/CGD5o/JWRR8W5tlCkd3nrDSkxbOzscJTyTUITltvOJeQjg3HJ1YgEuNyiPhQbvbtRjkQBByQ==
+
+"nopt@2 || 3":
+ version "3.0.6"
+ resolved "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz"
+ integrity sha512-4GUt3kSEYmk4ITxzB/b9vaIDfUVWN/Ml1Fwl11IlnIG2iaJ9O6WXZ9SrYM9NLI8OCBieN2Y8SWC2oJV0RQ7qYg==
+ dependencies:
+ abbrev "1"
+
+normalize-package-data@^2.3.2, normalize-package-data@^2.3.4:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz"
+ integrity sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==
+ dependencies:
+ hosted-git-info "^2.1.4"
+ resolve "^1.10.0"
+ semver "2 || 3 || 4 || 5"
+ validate-npm-package-license "^3.0.1"
+
+normalize-path@^3.0.0, normalize-path@~3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz"
+ integrity sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==
+
+normalize-url@^6.0.1:
+ version "6.1.0"
+ resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-6.1.0.tgz#40d0885b535deffe3f3147bec877d05fe4c5668a"
+ integrity sha512-DlL+XwOy3NxAQ8xuC0okPgK46iuVNAK01YN7RueYBqqFeGsBjV9XmCAzAdgt+667bCl5kPh9EqKKDwnaPG1I7A==
+
+npm-run-path@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz#b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea"
+ integrity sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==
+ dependencies:
+ path-key "^3.0.0"
+
+"npmlog@0 || 1 || 2 || 3 || 4", npmlog@^4.0.0:
+ version "4.1.2"
+ resolved "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz"
+ integrity sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==
+ dependencies:
+ are-we-there-yet "~1.1.2"
+ console-control-strings "~1.1.0"
+ gauge "~2.7.3"
+ set-blocking "~2.0.0"
+
+nth-check@^2.0.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz"
+ integrity sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==
+ dependencies:
+ boolbase "^1.0.0"
+
+number-is-nan@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz"
+ integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
+
+oauth-sign@~0.9.0:
+ version "0.9.0"
+ resolved "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz"
+ integrity sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==
+
+object-assign@^4.0.1, object-assign@^4.1.0:
+ version "4.1.1"
+ resolved "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz"
+ integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+object-inspect@^1.12.2, object-inspect@^1.9.0:
+ version "1.12.2"
+ resolved "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz"
+ integrity sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==
+
+object-keys@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz"
+ integrity sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==
+
+object.assign@^4.1.0, object.assign@^4.1.4:
+ version "4.1.4"
+ resolved "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz"
+ integrity sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ has-symbols "^1.0.3"
+ object-keys "^1.1.1"
+
+object.values@^1.1.5:
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/object.values/-/object.values-1.1.5.tgz"
+ integrity sha512-QUZRW0ilQ3PnPpbNtgdNV1PDbEqLIiSFB3l+EnGtBQ/8SUTLj1PZwtQHABZtLgwpJZTSZhuGLOGk57Drx2IvYg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ es-abstract "^1.19.1"
+
+obuf@^1.0.0, obuf@^1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz"
+ integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
+
+on-finished@2.4.1:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz"
+ integrity sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==
+ dependencies:
+ ee-first "1.1.1"
+
+on-headers@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz"
+ integrity sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==
+
+once@^1.3.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/once/-/once-1.4.0.tgz"
+ integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
+ dependencies:
+ wrappy "1"
+
+onetime@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz"
+ integrity sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==
+ dependencies:
+ mimic-fn "^1.0.0"
+
+onetime@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/onetime/-/onetime-5.1.2.tgz#d0e96ebb56b07476df1dd9c4806e5237985ca45e"
+ integrity sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==
+ dependencies:
+ mimic-fn "^2.1.0"
+
+open@^8.0.9:
+ version "8.4.0"
+ resolved "https://registry.yarnpkg.com/open/-/open-8.4.0.tgz#345321ae18f8138f82565a910fdc6b39e8c244f8"
+ integrity sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==
+ dependencies:
+ define-lazy-prop "^2.0.0"
+ is-docker "^2.1.1"
+ is-wsl "^2.2.0"
+
+optionator@^0.8.2:
+ version "0.8.3"
+ resolved "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz"
+ integrity sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==
+ 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"
+
+os-homedir@^1.0.0:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz"
+ integrity sha512-B5JU3cabzk8c67mRRd3ECmROafjYMXbuzlwtqdM8IbS8ktlTix8aFGb2bAGKrSRIlnfKwovGUUr72JUPyOb6kQ==
+
+os-locale@^1.4.0:
+ version "1.4.0"
+ resolved "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz"
+ integrity sha512-PRT7ZORmwu2MEFt4/fv3Q+mEfN4zetKxufQrkShY2oGvUms9r8otu5HfdyIFHkYXjO7laNsoVGmM2MANfuTA8g==
+ dependencies:
+ lcid "^1.0.0"
+
+os-tmpdir@^1.0.0, os-tmpdir@^1.0.1, os-tmpdir@~1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz"
+ integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==
+
+osenv@0:
+ version "0.1.5"
+ resolved "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz"
+ integrity sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==
+ dependencies:
+ os-homedir "^1.0.0"
+ os-tmpdir "^1.0.0"
+
+p-limit@^1.1.0:
+ version "1.3.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz"
+ integrity sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==
+ dependencies:
+ p-try "^1.0.0"
+
+p-limit@^2.0.0, p-limit@^2.2.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz"
+ integrity sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==
+ dependencies:
+ p-try "^2.0.0"
+
+p-limit@^3.0.2:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-3.1.0.tgz#e1daccbe78d0d1388ca18c64fea38e3e57e3706b"
+ integrity sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==
+ dependencies:
+ yocto-queue "^0.1.0"
+
+p-locate@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz"
+ integrity sha512-nQja7m7gSKuewoVRen45CtVfODR3crN3goVQ0DDZ9N3yHxgpkuBhZqsaiotSQRrADUrne346peY7kT3TSACykg==
+ dependencies:
+ p-limit "^1.1.0"
+
+p-locate@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz"
+ integrity sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==
+ dependencies:
+ p-limit "^2.0.0"
+
+p-locate@^4.1.0:
+ version "4.1.0"
+ resolved "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz"
+ integrity sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==
+ dependencies:
+ p-limit "^2.2.0"
+
+p-map@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz"
+ integrity sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==
+
+p-retry@^4.5.0:
+ version "4.6.2"
+ resolved "https://registry.yarnpkg.com/p-retry/-/p-retry-4.6.2.tgz#9baae7184057edd4e17231cee04264106e092a16"
+ integrity sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==
+ dependencies:
+ "@types/retry" "0.12.0"
+ retry "^0.13.1"
+
+p-try@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz"
+ integrity sha512-U1etNYuMJoIz3ZXSrrySFjsXQTWOx2/jdi86L+2pRvph/qMKL6sbcCYdH23fqsbm8TH2Gn0OybpT4eSFlCVHww==
+
+p-try@^2.0.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz"
+ integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==
+
+parse-json@^2.2.0:
+ version "2.2.0"
+ resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz"
+ integrity sha512-QR/GGaKCkhwk1ePQNYDRKYZ3mwU9ypsKhB0XyFnLQdomyEqk3e8wpW3V5Jp88zbxK4n5ST1nqo+g9juTpownhQ==
+ dependencies:
+ error-ex "^1.2.0"
+
+parseurl@~1.3.2, parseurl@~1.3.3:
+ version "1.3.3"
+ resolved "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz"
+ integrity sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==
+
+path-exists@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz"
+ integrity sha512-yTltuKuhtNeFJKa1PiRzfLAU5182q1y4Eb4XCJ3PBqyzEDkAZRzBrKKBct682ls9reBVHf9udYLN5Nd+K1B9BQ==
+ dependencies:
+ pinkie-promise "^2.0.0"
+
+path-exists@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz"
+ integrity sha512-bpC7GYwiDYQ4wYLe+FA8lhRjhQCMcQGuSgGGqDkg/QerRWw9CmGRT0iSOVRSZJ29NMLZgIzqaljJ63oaL4NIJQ==
+
+path-exists@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz"
+ integrity sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==
+
+path-is-absolute@^1.0.0, path-is-absolute@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz"
+ integrity sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==
+
+path-is-inside@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz"
+ integrity sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==
+
+path-key@^3.0.0, path-key@^3.1.0:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz#581f6ade658cbba65a0d3380de7753295054f375"
+ integrity sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==
+
+path-parse@^1.0.7:
+ version "1.0.7"
+ resolved "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz"
+ integrity sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==
+
+path-to-regexp@0.1.7:
+ version "0.1.7"
+ resolved "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz"
+ integrity sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==
+
+path-type@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz"
+ integrity sha512-S4eENJz1pkiQn9Znv33Q+deTOKmbl+jj1Fl+qiP/vYezj+S8x+J3Uo0ISrx/QoEvIlOaDWJhPaRd1flJ9HXZqg==
+ dependencies:
+ graceful-fs "^4.1.2"
+ pify "^2.0.0"
+ pinkie-promise "^2.0.0"
+
+performance-now@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz"
+ integrity sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==
+
+picocolors@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz"
+ integrity sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==
+
+picomatch@^2.0.4, picomatch@^2.2.1, picomatch@^2.3.1:
+ version "2.3.1"
+ resolved "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz"
+ integrity sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==
+
+pify@^2.0.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz"
+ integrity sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==
+
+pify@^4.0.1:
+ version "4.0.1"
+ resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz"
+ integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==
+
+pinkie-promise@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz"
+ integrity sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==
+ dependencies:
+ pinkie "^2.0.0"
+
+pinkie@^2.0.0:
+ version "2.0.4"
+ resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz"
+ integrity sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==
+
+pkg-dir@^4.1.0, pkg-dir@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz"
+ integrity sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==
+ dependencies:
+ find-up "^4.0.0"
+
+pkg-up@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz"
+ integrity sha512-fjAPuiws93rm7mPUu21RdBnkeZNrbfCFCwfAhPWY+rR3zG0ubpe5cEReHOw5fIbfmsxEV/g2kSxGTATY3Bpnwg==
+ dependencies:
+ find-up "^2.1.0"
+
+pkg-up@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.yarnpkg.com/pkg-up/-/pkg-up-3.1.0.tgz#100ec235cc150e4fd42519412596a28512a0def5"
+ integrity sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==
+ dependencies:
+ find-up "^3.0.0"
+
+pluralize@^7.0.0:
+ version "7.0.0"
+ resolved "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz"
+ integrity sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==
+
+postcss-calc@^8.2.3:
+ version "8.2.4"
+ resolved "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-8.2.4.tgz#77b9c29bfcbe8a07ff6693dc87050828889739a5"
+ integrity sha512-SmWMSJmB8MRnnULldx0lQIyhSNvuDl9HfrZkaqqE/WHAhToYsAvDq+yAsA/kIyINDszOp3Rh0GFoNuH5Ypsm3Q==
+ dependencies:
+ postcss-selector-parser "^6.0.9"
+ postcss-value-parser "^4.2.0"
+
+postcss-colormin@^5.3.0:
+ version "5.3.0"
+ resolved "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-5.3.0.tgz#3cee9e5ca62b2c27e84fce63affc0cfb5901956a"
+ integrity sha512-WdDO4gOFG2Z8n4P8TWBpshnL3JpmNmJwdnfP2gbk2qBA8PWwOYcmjmI/t3CmMeL72a7Hkd+x/Mg9O2/0rD54Pg==
+ dependencies:
+ browserslist "^4.16.6"
+ caniuse-api "^3.0.0"
+ colord "^2.9.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-convert-values@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-5.1.2.tgz#31586df4e184c2e8890e8b34a0b9355313f503ab"
+ integrity sha512-c6Hzc4GAv95B7suy4udszX9Zy4ETyMCgFPUDtWjdFTKH1SE9eFY/jEpHSwTH1QPuwxHpWslhckUQWbNRM4ho5g==
+ dependencies:
+ browserslist "^4.20.3"
+ postcss-value-parser "^4.2.0"
+
+postcss-discard-comments@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-5.1.2.tgz#8df5e81d2925af2780075840c1526f0660e53696"
+ integrity sha512-+L8208OVbHVF2UQf1iDmRcbdjJkuBF6IS29yBDSiWUIzpYaAhtNl6JYnYm12FnkeCwQqF5LeklOu6rAqgfBZqQ==
+
+postcss-discard-duplicates@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-5.1.0.tgz#9eb4fe8456706a4eebd6d3b7b777d07bad03e848"
+ integrity sha512-zmX3IoSI2aoenxHV6C7plngHWWhUOV3sP1T8y2ifzxzbtnuhk1EdPwm0S1bIUNaJ2eNbWeGLEwzw8huPD67aQw==
+
+postcss-discard-empty@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-5.1.1.tgz#e57762343ff7f503fe53fca553d18d7f0c369c6c"
+ integrity sha512-zPz4WljiSuLWsI0ir4Mcnr4qQQ5e1Ukc3i7UfE2XcrwKK2LIPIqE5jxMRxO6GbI3cv//ztXDsXwEWT3BHOGh3A==
+
+postcss-discard-overridden@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-5.1.0.tgz#7e8c5b53325747e9d90131bb88635282fb4a276e"
+ integrity sha512-21nOL7RqWR1kasIVdKs8HNqQJhFxLsyRfAnUDm4Fe4t4mCWL9OJiHvlHPjcd8zc5Myu89b/7wZDnOSjFgeWRtw==
+
+postcss-merge-longhand@^5.1.6:
+ version "5.1.6"
+ resolved "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-5.1.6.tgz#f378a8a7e55766b7b644f48e5d8c789ed7ed51ce"
+ integrity sha512-6C/UGF/3T5OE2CEbOuX7iNO63dnvqhGZeUnKkDeifebY0XqkkvrctYSZurpNE902LDf2yKwwPFgotnfSoPhQiw==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+ stylehacks "^5.1.0"
+
+postcss-merge-rules@^5.1.2:
+ version "5.1.2"
+ resolved "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-5.1.2.tgz#7049a14d4211045412116d79b751def4484473a5"
+ integrity sha512-zKMUlnw+zYCWoPN6yhPjtcEdlJaMUZ0WyVcxTAmw3lkkN/NDMRkOkiuctQEoWAOvH7twaxUUdvBWl0d4+hifRQ==
+ dependencies:
+ browserslist "^4.16.6"
+ caniuse-api "^3.0.0"
+ cssnano-utils "^3.1.0"
+ postcss-selector-parser "^6.0.5"
+
+postcss-minify-font-values@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-5.1.0.tgz#f1df0014a726083d260d3bd85d7385fb89d1f01b"
+ integrity sha512-el3mYTgx13ZAPPirSVsHqFzl+BBBDrXvbySvPGFnQcTI4iNslrPaFq4muTkLZmKlGk4gyFAYUBMH30+HurREyA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-gradients@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-5.1.1.tgz#f1fe1b4f498134a5068240c2f25d46fcd236ba2c"
+ integrity sha512-VGvXMTpCEo4qHTNSa9A0a3D+dxGFZCYwR6Jokk+/3oB6flu2/PnPXAh2x7x52EkY5xlIHLm+Le8tJxe/7TNhzw==
+ dependencies:
+ colord "^2.9.1"
+ cssnano-utils "^3.1.0"
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-params@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-5.1.3.tgz#ac41a6465be2db735099bbd1798d85079a6dc1f9"
+ integrity sha512-bkzpWcjykkqIujNL+EVEPOlLYi/eZ050oImVtHU7b4lFS82jPnsCb44gvC6pxaNt38Els3jWYDHTjHKf0koTgg==
+ dependencies:
+ browserslist "^4.16.6"
+ cssnano-utils "^3.1.0"
+ postcss-value-parser "^4.2.0"
+
+postcss-minify-selectors@^5.2.1:
+ version "5.2.1"
+ resolved "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-5.2.1.tgz#d4e7e6b46147b8117ea9325a915a801d5fe656c6"
+ integrity sha512-nPJu7OjZJTsVUmPdm2TcaiohIwxP+v8ha9NehQ2ye9szv4orirRU3SDdtUmKH+10nzn0bAyOXZ0UEr7OpvLehg==
+ dependencies:
+ postcss-selector-parser "^6.0.5"
+
+postcss-modules-extract-imports@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d"
+ integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==
+
+postcss-modules-local-by-default@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz#ebbb54fae1598eecfdf691a02b3ff3b390a5a51c"
+ integrity sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==
+ dependencies:
+ icss-utils "^5.0.0"
+ postcss-selector-parser "^6.0.2"
+ postcss-value-parser "^4.1.0"
+
+postcss-modules-scope@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz#9ef3151456d3bbfa120ca44898dfca6f2fa01f06"
+ integrity sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==
+ dependencies:
+ postcss-selector-parser "^6.0.4"
+
+postcss-modules-values@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c"
+ integrity sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==
+ dependencies:
+ icss-utils "^5.0.0"
+
+postcss-normalize-charset@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-5.1.0.tgz#9302de0b29094b52c259e9b2cf8dc0879879f0ed"
+ integrity sha512-mSgUJ+pd/ldRGVx26p2wz9dNZ7ji6Pn8VWBajMXFf8jk7vUoSrZ2lt/wZR7DtlZYKesmZI680qjr2CeFF2fbUg==
+
+postcss-normalize-display-values@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-5.1.0.tgz#72abbae58081960e9edd7200fcf21ab8325c3da8"
+ integrity sha512-WP4KIM4o2dazQXWmFaqMmcvsKmhdINFblgSeRgn8BJ6vxaMyaJkwAzpPpuvSIoG/rmX3M+IrRZEz2H0glrQNEA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-positions@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-5.1.1.tgz#ef97279d894087b59325b45c47f1e863daefbb92"
+ integrity sha512-6UpCb0G4eofTCQLFVuI3EVNZzBNPiIKcA1AKVka+31fTVySphr3VUgAIULBhxZkKgwLImhzMR2Bw1ORK+37INg==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-repeat-style@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-5.1.1.tgz#e9eb96805204f4766df66fd09ed2e13545420fb2"
+ integrity sha512-mFpLspGWkQtBcWIRFLmewo8aC3ImN2i/J3v8YCFUwDnPu3Xz4rLohDO26lGjwNsQxB3YF0KKRwspGzE2JEuS0g==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-string@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-5.1.0.tgz#411961169e07308c82c1f8c55f3e8a337757e228"
+ integrity sha512-oYiIJOf4T9T1N4i+abeIc7Vgm/xPCGih4bZz5Nm0/ARVJ7K6xrDlLwvwqOydvyL3RHNf8qZk6vo3aatiw/go3w==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-timing-functions@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-5.1.0.tgz#d5614410f8f0b2388e9f240aa6011ba6f52dafbb"
+ integrity sha512-DOEkzJ4SAXv5xkHl0Wa9cZLF3WCBhF3o1SKVxKQAa+0pYKlueTpCgvkFAHfk+Y64ezX9+nITGrDZeVGgITJXjg==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-unicode@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-5.1.0.tgz#3d23aede35e160089a285e27bf715de11dc9db75"
+ integrity sha512-J6M3MizAAZ2dOdSjy2caayJLQT8E8K9XjLce8AUQMwOrCvjCHv24aLC/Lps1R1ylOfol5VIDMaM/Lo9NGlk1SQ==
+ dependencies:
+ browserslist "^4.16.6"
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-url@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-5.1.0.tgz#ed9d88ca82e21abef99f743457d3729a042adcdc"
+ integrity sha512-5upGeDO+PVthOxSmds43ZeMeZfKH+/DKgGRD7TElkkyS46JXAUhMzIKiCa7BabPeIy3AQcTkXwVVN7DbqsiCew==
+ dependencies:
+ normalize-url "^6.0.1"
+ postcss-value-parser "^4.2.0"
+
+postcss-normalize-whitespace@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-5.1.1.tgz#08a1a0d1ffa17a7cc6efe1e6c9da969cc4493cfa"
+ integrity sha512-83ZJ4t3NUDETIHTa3uEg6asWjSBYL5EdkVB0sDncx9ERzOKBVJIUeDO9RyA9Zwtig8El1d79HBp0JEi8wvGQnA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-ordered-values@^5.1.3:
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-5.1.3.tgz#b6fd2bd10f937b23d86bc829c69e7732ce76ea38"
+ integrity sha512-9UO79VUhPwEkzbb3RNpqqghc6lcYej1aveQteWY+4POIwlqkYE21HKWaLDF6lWNuqCobEAyTovVhtI32Rbv2RQ==
+ dependencies:
+ cssnano-utils "^3.1.0"
+ postcss-value-parser "^4.2.0"
+
+postcss-reduce-initial@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-5.1.0.tgz#fc31659ea6e85c492fb2a7b545370c215822c5d6"
+ integrity sha512-5OgTUviz0aeH6MtBjHfbr57tml13PuedK/Ecg8szzd4XRMbYxH4572JFG067z+FqBIf6Zp/d+0581glkvvWMFw==
+ dependencies:
+ browserslist "^4.16.6"
+ caniuse-api "^3.0.0"
+
+postcss-reduce-transforms@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-5.1.0.tgz#333b70e7758b802f3dd0ddfe98bb1ccfef96b6e9"
+ integrity sha512-2fbdbmgir5AvpW9RLtdONx1QoYG2/EtqpNQbFASDlixBbAYuTcJ0dECwlqNqH7VbaUnEnh8SrxOe2sRIn24XyQ==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+
+postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4, postcss-selector-parser@^6.0.5, postcss-selector-parser@^6.0.9:
+ version "6.0.10"
+ resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz"
+ integrity sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==
+ dependencies:
+ cssesc "^3.0.0"
+ util-deprecate "^1.0.2"
+
+postcss-svgo@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-5.1.0.tgz#0a317400ced789f233a28826e77523f15857d80d"
+ integrity sha512-D75KsH1zm5ZrHyxPakAxJWtkyXew5qwS70v56exwvw542d9CRtTo78K0WeFxZB4G7JXKKMbEZtZayTGdIky/eA==
+ dependencies:
+ postcss-value-parser "^4.2.0"
+ svgo "^2.7.0"
+
+postcss-unique-selectors@^5.1.1:
+ version "5.1.1"
+ resolved "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-5.1.1.tgz#a9f273d1eacd09e9aa6088f4b0507b18b1b541b6"
+ integrity sha512-5JiODlELrz8L2HwxfPnhOWZYWDxVHWL83ufOv84NrcgipI7TaeRsatAhK4Tr2/ZiYldpK/wBvw5BD3qfaK96GA==
+ dependencies:
+ postcss-selector-parser "^6.0.5"
+
+postcss-value-parser@^4.1.0, postcss-value-parser@^4.2.0:
+ version "4.2.0"
+ resolved "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514"
+ integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==
+
+postcss@7.0.36:
+ version "7.0.36"
+ resolved "https://registry.npmjs.org/postcss/-/postcss-7.0.36.tgz"
+ integrity sha512-BebJSIUMwJHRH0HAQoxN4u1CN86glsrwsW0q7T+/m44eXOUAxSNdHRkNZPYz5vVUbg17hFgOQDE7fZk7li3pZw==
+ dependencies:
+ chalk "^2.4.2"
+ source-map "^0.6.1"
+ supports-color "^6.1.0"
+
+postcss@^8.2.15, postcss@^8.2.9:
+ version "8.4.17"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-8.4.17.tgz#f87863ec7cd353f81f7ab2dec5d67d861bbb1be5"
+ integrity sha512-UNxNOLQydcOFi41yHNMcKRZ39NeXlr8AxGuZJsdub8vIb12fHzcq37DTU/QtbI6WLxNg2gF9Z+8qtRwTj1UI1Q==
+ dependencies:
+ nanoid "^3.3.4"
+ picocolors "^1.0.0"
+ source-map-js "^1.0.2"
+
+prelude-ls@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz"
+ integrity sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==
+
+pretty-error@^3.0.3:
+ version "3.0.4"
+ resolved "https://registry.yarnpkg.com/pretty-error/-/pretty-error-3.0.4.tgz#94b1d54f76c1ed95b9c604b9de2194838e5b574e"
+ integrity sha512-ytLFLfv1So4AO1UkoBF6GXQgJRaKbiSiGFICaOPNwQ3CMvBvXpLRubeQWyPGnsbV/t9ml9qto6IeCsho0aEvwQ==
+ dependencies:
+ lodash "^4.17.20"
+ renderkid "^2.0.6"
+
+private@^0.1.6, private@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/private/-/private-0.1.8.tgz"
+ integrity sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==
+
+process-nextick-args@~2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz"
+ integrity sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==
+
+progress@^2.0.0:
+ version "2.0.3"
+ resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz"
+ integrity sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==
+
+proxy-addr@~2.0.7:
+ version "2.0.7"
+ resolved "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz"
+ integrity sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==
+ dependencies:
+ forwarded "0.2.0"
+ ipaddr.js "1.9.1"
+
+pseudomap@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz"
+ integrity sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==
+
+psl@^1.1.28:
+ version "1.9.0"
+ resolved "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz"
+ integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
+
+punycode@^2.1.0, punycode@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz"
+ integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
+
+qs@6.10.3:
+ version "6.10.3"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz"
+ integrity sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==
+ dependencies:
+ side-channel "^1.0.4"
+
+qs@~6.5.2:
+ version "6.5.3"
+ resolved "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz"
+ integrity sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==
+
+randombytes@^2.1.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz"
+ integrity sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==
+ dependencies:
+ safe-buffer "^5.1.0"
+
+range-parser@^1.2.1, range-parser@~1.2.1:
+ version "1.2.1"
+ resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz"
+ integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==
+
+raw-body@2.5.1:
+ version "2.5.1"
+ resolved "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz"
+ integrity sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==
+ dependencies:
+ bytes "3.1.2"
+ http-errors "2.0.0"
+ iconv-lite "0.4.24"
+ unpipe "1.0.0"
+
+read-pkg-up@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz"
+ integrity sha512-WD9MTlNtI55IwYUS27iHh9tK3YoIVhxis8yKhLpTqWtml739uXc9NWTpxoHkfZf3+DkCCsXox94/VWZniuZm6A==
+ dependencies:
+ find-up "^1.0.0"
+ read-pkg "^1.0.0"
+
+read-pkg@^1.0.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz"
+ integrity sha512-7BGwRHqt4s/uVbuyoeejRn4YmFnYZiFl4AuaeXHlgZf3sONF0SOGlxs2Pw8g6hCKupo08RafIO5YXFNOKTfwsQ==
+ dependencies:
+ load-json-file "^1.0.0"
+ normalize-package-data "^2.3.2"
+ path-type "^1.0.0"
+
+readable-stream@^2.0.1, readable-stream@^2.0.6, readable-stream@^2.2.2:
+ version "2.3.7"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz"
+ integrity sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==
+ dependencies:
+ core-util-is "~1.0.0"
+ inherits "~2.0.3"
+ isarray "~1.0.0"
+ process-nextick-args "~2.0.0"
+ safe-buffer "~5.1.1"
+ string_decoder "~1.1.1"
+ util-deprecate "~1.0.1"
+
+readable-stream@^3.0.6:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz"
+ integrity sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==
+ dependencies:
+ inherits "^2.0.3"
+ string_decoder "^1.1.1"
+ util-deprecate "^1.0.1"
+
+readdirp@~3.6.0:
+ version "3.6.0"
+ resolved "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz"
+ integrity sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==
+ dependencies:
+ picomatch "^2.2.1"
+
+rechoir@^0.7.0:
+ version "0.7.1"
+ resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.7.1.tgz#9478a96a1ca135b5e88fc027f03ee92d6c645686"
+ integrity sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==
+ dependencies:
+ resolve "^1.9.0"
+
+redent@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz"
+ integrity sha512-qtW5hKzGQZqKoh6JNSD+4lfitfPKGz42e6QwiRmPM5mmKtR0N41AbJRYu0xJi7nhOJ4WDgRkKvAk6tw4WIwR4g==
+ dependencies:
+ indent-string "^2.1.0"
+ strip-indent "^1.0.1"
+
+regenerate-unicode-properties@^10.1.0:
+ version "10.1.0"
+ resolved "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.1.0.tgz"
+ integrity sha512-d1VudCLoIGitcU/hEg2QqvyGZQmdC0Lf8BqdOMXGFSvJP4bNV1+XqbPQeHHLD51Jh4QJJ225dlIFvY4Ly6MXmQ==
+ dependencies:
+ regenerate "^1.4.2"
+
+regenerate@^1.2.1, regenerate@^1.4.2:
+ version "1.4.2"
+ resolved "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz"
+ integrity sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==
+
+regenerator-runtime@^0.10.5:
+ version "0.10.5"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz"
+ integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==
+
+regenerator-runtime@^0.11.0:
+ version "0.11.1"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz"
+ integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+regenerator-runtime@^0.13.4:
+ version "0.13.9"
+ resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz"
+ integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
+regenerator-transform@^0.10.0:
+ version "0.10.1"
+ resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz"
+ integrity sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==
+ dependencies:
+ babel-runtime "^6.18.0"
+ babel-types "^6.19.0"
+ private "^0.1.6"
+
+regenerator-transform@^0.15.0:
+ version "0.15.0"
+ resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz"
+ integrity sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==
+ dependencies:
+ "@babel/runtime" "^7.8.4"
+
+regex-parser@^2.2.11:
+ version "2.2.11"
+ resolved "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz"
+ integrity sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q==
+
+regexp.prototype.flags@^1.4.3:
+ version "1.4.3"
+ resolved "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz"
+ integrity sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.3"
+ functions-have-names "^1.2.2"
+
+regexpp@^1.0.1:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/regexpp/-/regexpp-1.1.0.tgz"
+ integrity sha512-LOPw8FpgdQF9etWMaAfG/WRthIdXJGYp4mJ2Jgn/2lpkbod9jPn0t9UqN7AxBOKNfzRbYyVfgc7Vk4t/MpnXgw==
+
+regexpu-core@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz"
+ integrity sha512-tJ9+S4oKjxY8IZ9jmjnp/mtytu1u3iyIQAfmI51IKWH6bFf7XR1ybtaO6j7INhZKXOTYADk7V5qxaqLkmNxiZQ==
+ dependencies:
+ regenerate "^1.2.1"
+ regjsgen "^0.2.0"
+ regjsparser "^0.1.4"
+
+regexpu-core@^5.1.0:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.2.1.tgz"
+ integrity sha512-HrnlNtpvqP1Xkb28tMhBUO2EbyUHdQlsnlAhzWcwHy8WJR53UWr7/MAvqrsQKMbV4qdpv03oTMG8iIhfsPFktQ==
+ dependencies:
+ regenerate "^1.4.2"
+ regenerate-unicode-properties "^10.1.0"
+ regjsgen "^0.7.1"
+ regjsparser "^0.9.1"
+ unicode-match-property-ecmascript "^2.0.0"
+ unicode-match-property-value-ecmascript "^2.0.0"
+
+regjsgen@^0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz"
+ integrity sha512-x+Y3yA24uF68m5GA+tBjbGYo64xXVJpbToBaWCoSNSc1hdk6dfctaRWrNFTVJZIIhL5GxW8zwjoixbnifnK59g==
+
+regjsgen@^0.7.1:
+ version "0.7.1"
+ resolved "https://registry.npmjs.org/regjsgen/-/regjsgen-0.7.1.tgz"
+ integrity sha512-RAt+8H2ZEzHeYWxZ3H2z6tF18zyyOnlcdaafLrm21Bguj7uZy6ULibiAFdXEtKQY4Sy7wDTwDiOazasMLc4KPA==
+
+regjsparser@^0.1.4:
+ version "0.1.5"
+ resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz"
+ integrity sha512-jlQ9gYLfk2p3V5Ag5fYhA7fv7OHzd1KUH0PRP46xc3TgwjwgROIW572AfYg/X9kaNq/LJnu6oJcFRXlIrGoTRw==
+ dependencies:
+ jsesc "~0.5.0"
+
+regjsparser@^0.9.1:
+ version "0.9.1"
+ resolved "https://registry.npmjs.org/regjsparser/-/regjsparser-0.9.1.tgz"
+ integrity sha512-dQUtn90WanSNl+7mQKcXAgZxvUe7Z0SqXlgzv0za4LwiUhyzBC58yQO3liFoUgu8GiJVInAhJjkj1N0EtQ5nkQ==
+ dependencies:
+ jsesc "~0.5.0"
+
+renderkid@^2.0.6:
+ version "2.0.7"
+ resolved "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.7.tgz#464f276a6bdcee606f4a15993f9b29fc74ca8609"
+ integrity sha512-oCcFyxaMrKsKcTY59qnCAtmDVSLfPbrv6A3tVbPdFMMrv5jaK10V6m40cKsoPNhAqN6rmHW9sswW4o3ruSrwUQ==
+ dependencies:
+ css-select "^4.1.3"
+ dom-converter "^0.2.0"
+ htmlparser2 "^6.1.0"
+ lodash "^4.17.21"
+ strip-ansi "^3.0.1"
+
+repeating@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz"
+ integrity sha512-ZqtSMuVybkISo2OWvqvm7iHSWngvdaW3IpsT9/uP8v4gMi591LY6h35wdOfvQdWCKFWZWm2Y1Opp4kV7vQKT6A==
+ dependencies:
+ is-finite "^1.0.0"
+
+request@^2.87.0, request@^2.88.0:
+ version "2.88.2"
+ resolved "https://registry.npmjs.org/request/-/request-2.88.2.tgz"
+ integrity sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==
+ dependencies:
+ aws-sign2 "~0.7.0"
+ aws4 "^1.8.0"
+ caseless "~0.12.0"
+ combined-stream "~1.0.6"
+ extend "~3.0.2"
+ forever-agent "~0.6.1"
+ form-data "~2.3.2"
+ har-validator "~5.1.3"
+ http-signature "~1.2.0"
+ is-typedarray "~1.0.0"
+ isstream "~0.1.2"
+ json-stringify-safe "~5.0.1"
+ mime-types "~2.1.19"
+ oauth-sign "~0.9.0"
+ performance-now "^2.1.0"
+ qs "~6.5.2"
+ safe-buffer "^5.1.2"
+ tough-cookie "~2.5.0"
+ tunnel-agent "^0.6.0"
+ uuid "^3.3.2"
+
+require-directory@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz"
+ integrity sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==
+
+require-from-string@^2.0.2:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/require-from-string/-/require-from-string-2.0.2.tgz#89a7fdd938261267318eafe14f9c32e598c36909"
+ integrity sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==
+
+require-main-filename@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz"
+ integrity sha512-IqSUtOVP4ksd1C/ej5zeEh/BIP2ajqpn8c5x+q99gvcIG/Qf0cud5raVnE/Dwd0ua9TXYDoDc0RE5hBSdz22Ug==
+
+require-main-filename@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz"
+ integrity sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==
+
+require-uncached@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz"
+ integrity sha512-Xct+41K3twrbBHdxAgMoOS+cNcoqIjfM2/VxBF4LL2hVph7YsF8VSKyQ3BDFZwEVbok9yeDl2le/qo0S77WG2w==
+ dependencies:
+ caller-path "^0.1.0"
+ resolve-from "^1.0.0"
+
+requires-port@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz"
+ integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
+
+reselect@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/reselect/-/reselect-3.0.1.tgz"
+ integrity sha512-b/6tFZCmRhtBMa4xGqiiRp9jh9Aqi2A687Lo265cN0/QohJQEBPiQ52f4QB6i0eF3yp3hmLL21LSGBcML2dlxA==
+
+resolve-cwd@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-3.0.0.tgz#0f0075f1bb2544766cf73ba6a6e2adfebcb13f2d"
+ integrity sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==
+ dependencies:
+ resolve-from "^5.0.0"
+
+resolve-from@^1.0.0:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz"
+ integrity sha512-kT10v4dhrlLNcnO084hEjvXCI1wUG9qZLoz2RogxqDQQYy7IxjI/iMUkOtQTNEh6rzHxvdQWHsJyel1pKOVCxg==
+
+resolve-from@^5.0.0:
+ version "5.0.0"
+ resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-5.0.0.tgz#c35225843df8f776df21c57557bc087e9dfdfc69"
+ integrity sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==
+
+resolve-url-loader@^3.1.2:
+ version "3.1.4"
+ resolved "https://registry.yarnpkg.com/resolve-url-loader/-/resolve-url-loader-3.1.4.tgz#3c16caebe0b9faea9c7cc252fa49d2353c412320"
+ integrity sha512-D3sQ04o0eeQEySLrcz4DsX3saHfsr8/N6tfhblxgZKXxMT2Louargg12oGNfoTRLV09GXhVUe5/qgA5vdgNigg==
+ dependencies:
+ adjust-sourcemap-loader "3.0.0"
+ camelcase "5.3.1"
+ compose-function "3.0.3"
+ convert-source-map "1.7.0"
+ es6-iterator "2.0.3"
+ loader-utils "1.2.3"
+ postcss "7.0.36"
+ rework "1.0.1"
+ rework-visit "1.0.0"
+ source-map "0.6.1"
+
+resolve-url@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz"
+ integrity sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==
+
+resolve@^1.10.0, resolve@^1.14.2, resolve@^1.20.0, resolve@^1.22.0, resolve@^1.4.0, resolve@^1.9.0:
+ version "1.22.1"
+ resolved "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz"
+ integrity sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==
+ dependencies:
+ is-core-module "^2.9.0"
+ path-parse "^1.0.7"
+ supports-preserve-symlinks-flag "^1.0.0"
+
+restore-cursor@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz"
+ integrity sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==
+ dependencies:
+ onetime "^2.0.0"
+ signal-exit "^3.0.2"
+
+retry@^0.13.1:
+ version "0.13.1"
+ resolved "https://registry.yarnpkg.com/retry/-/retry-0.13.1.tgz#185b1587acf67919d63b357349e03537b2484658"
+ integrity sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==
+
+rework-visit@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/rework-visit/-/rework-visit-1.0.0.tgz"
+ integrity sha512-W6V2fix7nCLUYX1v6eGPrBOZlc03/faqzP4sUxMAJMBMOPYhfV/RyLegTufn5gJKaOITyi+gvf0LXDZ9NzkHnQ==
+
+rework@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/rework/-/rework-1.0.1.tgz"
+ integrity sha512-eEjL8FdkdsxApd0yWVZgBGzfCQiT8yqSc2H1p4jpZpQdtz7ohETiDMoje5PlM8I9WgkqkreVxFUKYOiJdVWDXw==
+ dependencies:
+ convert-source-map "^0.3.3"
+ css "^2.0.0"
+
+rimraf@2, rimraf@^2.6.3:
+ version "2.7.1"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz"
+ integrity sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@^3.0.0, rimraf@^3.0.2:
+ version "3.0.2"
+ resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-3.0.2.tgz#f1a5402ba6220ad52cc1282bac1ae3aa49fd061a"
+ integrity sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==
+ dependencies:
+ glob "^7.1.3"
+
+rimraf@~2.6.2:
+ version "2.6.3"
+ resolved "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz"
+ integrity sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==
+ dependencies:
+ glob "^7.1.3"
+
+run-async@^2.2.0:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz"
+ integrity sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==
+
+rx-lite-aggregates@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz"
+ integrity sha512-3xPNZGW93oCjiO7PtKxRK6iOVYBWBvtf9QHDfU23Oc+dLIQmAV//UnyXV/yihv81VS/UqoQPk4NegS8EFi55Hg==
+ dependencies:
+ rx-lite "*"
+
+rx-lite@*, rx-lite@^4.0.8:
+ version "4.0.8"
+ resolved "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz"
+ integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA==
+
+safe-buffer@5.1.2, safe-buffer@~5.1.0, safe-buffer@~5.1.1:
+ version "5.1.2"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz"
+ integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
+
+safe-buffer@5.2.1, safe-buffer@>=5.1.0, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2:
+ version "5.2.1"
+ resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz"
+ integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
+
+safe-regex-test@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz"
+ integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==
+ dependencies:
+ call-bind "^1.0.2"
+ get-intrinsic "^1.1.3"
+ is-regex "^1.1.4"
+
+"safer-buffer@>= 2.1.2 < 3", safer-buffer@^2.0.2, safer-buffer@^2.1.0, safer-buffer@~2.1.0:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz"
+ integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
+
+sass-graph@2.2.5:
+ version "2.2.5"
+ resolved "https://registry.npmjs.org/sass-graph/-/sass-graph-2.2.5.tgz"
+ integrity sha512-VFWDAHOe6mRuT4mZRd4eKE+d8Uedrk6Xnh7Sh9b4NGufQLQjOrvf/MQoOdx+0s92L89FeyUUNfU597j/3uNpag==
+ dependencies:
+ glob "^7.0.0"
+ lodash "^4.0.0"
+ scss-tokenizer "^0.2.3"
+ yargs "^13.3.2"
+
+sass-loader@^7.0.1:
+ version "7.3.1"
+ resolved "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz"
+ integrity sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==
+ dependencies:
+ clone-deep "^4.0.1"
+ loader-utils "^1.0.1"
+ neo-async "^2.5.0"
+ pify "^4.0.1"
+ semver "^6.3.0"
+
+schema-utils@^2.6.5:
+ version "2.7.1"
+ resolved "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz"
+ integrity sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==
+ dependencies:
+ "@types/json-schema" "^7.0.5"
+ ajv "^6.12.4"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^3.0.0, schema-utils@^3.1.0, schema-utils@^3.1.1:
+ version "3.1.1"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-3.1.1.tgz#bc74c4b6b6995c1d88f76a8b77bea7219e0c8281"
+ integrity sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==
+ dependencies:
+ "@types/json-schema" "^7.0.8"
+ ajv "^6.12.5"
+ ajv-keywords "^3.5.2"
+
+schema-utils@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/schema-utils/-/schema-utils-4.0.0.tgz#60331e9e3ae78ec5d16353c467c34b3a0a1d3df7"
+ integrity sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==
+ dependencies:
+ "@types/json-schema" "^7.0.9"
+ ajv "^8.8.0"
+ ajv-formats "^2.1.1"
+ ajv-keywords "^5.0.0"
+
+scss-tokenizer@^0.2.3:
+ version "0.2.3"
+ resolved "https://registry.npmjs.org/scss-tokenizer/-/scss-tokenizer-0.2.3.tgz"
+ integrity sha512-dYE8LhncfBUar6POCxMTm0Ln+erjeczqEvCJib5/7XNkdw1FkUGgwMPY360FY0FgPWQxHWCx29Jl3oejyGLM9Q==
+ dependencies:
+ js-base64 "^2.1.8"
+ source-map "^0.4.2"
+
+select-hose@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz"
+ integrity sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==
+
+selfsigned@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.yarnpkg.com/selfsigned/-/selfsigned-2.1.1.tgz#18a7613d714c0cd3385c48af0075abf3f266af61"
+ integrity sha512-GSL3aowiF7wa/WtSFwnUrludWFoNhftq8bUkH9pkzjpN2XSPOAYEgg6e0sS9s0rZwgJzJiQRPU18A6clnoW5wQ==
+ dependencies:
+ node-forge "^1"
+
+semantic-ui-css@^2.2.0:
+ version "2.4.1"
+ resolved "https://registry.npmjs.org/semantic-ui-css/-/semantic-ui-css-2.4.1.tgz"
+ integrity sha512-Pkp0p9oWOxlH0kODx7qFpIRYpK1T4WJOO4lNnpNPOoWKCrYsfHqYSKgk5fHfQtnWnsAKy7nLJMW02bgDWWFZFg==
+ dependencies:
+ jquery x.*
+
+"semver@2 || 3 || 4 || 5", semver@^5.3.0:
+ version "5.7.1"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz"
+ integrity sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==
+
+semver@^6.0.0, semver@^6.1.1, semver@^6.1.2, semver@^6.3.0:
+ version "6.3.0"
+ resolved "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz"
+ integrity sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==
+
+semver@^7.3.2, semver@^7.3.5:
+ version "7.3.8"
+ resolved "https://registry.yarnpkg.com/semver/-/semver-7.3.8.tgz#07a78feafb3f7b32347d725e33de7e2a2df67798"
+ integrity sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==
+ dependencies:
+ lru-cache "^6.0.0"
+
+semver@~5.3.0:
+ version "5.3.0"
+ resolved "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz"
+ integrity sha512-mfmm3/H9+67MCVix1h+IXTpDwL6710LyHuk7+cWC9T1mE0qz4iHhh6r4hU2wrIT9iTsAAC2XQRvfblL028cpLw==
+
+send@0.18.0:
+ version "0.18.0"
+ resolved "https://registry.npmjs.org/send/-/send-0.18.0.tgz"
+ integrity sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==
+ dependencies:
+ debug "2.6.9"
+ depd "2.0.0"
+ destroy "1.2.0"
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ etag "~1.8.1"
+ fresh "0.5.2"
+ http-errors "2.0.0"
+ mime "1.6.0"
+ ms "2.1.3"
+ on-finished "2.4.1"
+ range-parser "~1.2.1"
+ statuses "2.0.1"
+
+serialize-javascript@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-5.0.1.tgz#7886ec848049a462467a97d3d918ebb2aaf934f4"
+ integrity sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==
+ dependencies:
+ randombytes "^2.1.0"
+
+serialize-javascript@^6.0.0:
+ version "6.0.0"
+ resolved "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-6.0.0.tgz#efae5d88f45d7924141da8b5c3a7a7e663fefeb8"
+ integrity sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==
+ dependencies:
+ randombytes "^2.1.0"
+
+serve-index@^1.9.1:
+ version "1.9.1"
+ resolved "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz"
+ integrity sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==
+ dependencies:
+ accepts "~1.3.4"
+ batch "0.6.1"
+ debug "2.6.9"
+ escape-html "~1.0.3"
+ http-errors "~1.6.2"
+ mime-types "~2.1.17"
+ parseurl "~1.3.2"
+
+serve-static@1.15.0:
+ version "1.15.0"
+ resolved "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz"
+ integrity sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==
+ dependencies:
+ encodeurl "~1.0.2"
+ escape-html "~1.0.3"
+ parseurl "~1.3.3"
+ send "0.18.0"
+
+set-blocking@^2.0.0, set-blocking@~2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz"
+ integrity sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==
+
+setprototypeof@1.1.0:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz"
+ integrity sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==
+
+setprototypeof@1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz"
+ integrity sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==
+
+shallow-clone@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz"
+ integrity sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==
+ dependencies:
+ kind-of "^6.0.2"
+
+shebang-command@^1.2.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz"
+ integrity sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==
+ dependencies:
+ shebang-regex "^1.0.0"
+
+shebang-command@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"
+ integrity sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==
+ dependencies:
+ shebang-regex "^3.0.0"
+
+shebang-regex@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz"
+ integrity sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==
+
+shebang-regex@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz#ae16f1644d873ecad843b0307b143362d4c42172"
+ integrity sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==
+
+side-channel@^1.0.4:
+ version "1.0.4"
+ resolved "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz"
+ integrity sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==
+ dependencies:
+ call-bind "^1.0.0"
+ get-intrinsic "^1.0.2"
+ object-inspect "^1.9.0"
+
+signal-exit@^3.0.0, signal-exit@^3.0.2, signal-exit@^3.0.3:
+ version "3.0.7"
+ resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.7.tgz#a9a1767f8af84155114eaabd73f99273c8f59ad9"
+ integrity sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==
+
+slash@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz"
+ integrity sha512-3TYDR7xWt4dIqV2JauJr+EJeW356RXijHeUlO+8djJ+uBXPn8/2dpzBc8yQhh583sVvc9CvFAeQVgijsH+PNNg==
+
+slice-ansi@1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz"
+ integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+
+slick-carousel@^1.8.1:
+ version "1.8.1"
+ resolved "https://registry.npmjs.org/slick-carousel/-/slick-carousel-1.8.1.tgz"
+ integrity sha512-XB9Ftrf2EEKfzoQXt3Nitrt/IPbT+f1fgqBdoxO3W/+JYvtEOW6EgxnWfr9GH6nmULv7Y2tPmEX3koxThVmebA==
+
+sockjs@^0.3.24:
+ version "0.3.24"
+ resolved "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.24.tgz#c9bc8995f33a111bea0395ec30aa3206bdb5ccce"
+ integrity sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==
+ dependencies:
+ faye-websocket "^0.11.3"
+ uuid "^8.3.2"
+ websocket-driver "^0.7.4"
+
+source-list-map@^2.0.0:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz"
+ integrity sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==
+
+source-map-js@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.yarnpkg.com/source-map-js/-/source-map-js-1.0.2.tgz#adbc361d9c62df380125e7f161f71c826f1e490c"
+ integrity sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==
+
+source-map-resolve@^0.5.2:
+ version "0.5.3"
+ resolved "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz"
+ integrity sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==
+ dependencies:
+ atob "^2.1.2"
+ decode-uri-component "^0.2.0"
+ resolve-url "^0.2.1"
+ source-map-url "^0.4.0"
+ urix "^0.1.0"
+
+source-map-support@^0.4.15:
+ version "0.4.18"
+ resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz"
+ integrity sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==
+ dependencies:
+ source-map "^0.5.6"
+
+source-map-support@~0.5.20:
+ version "0.5.21"
+ resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.21.tgz#04fe7c7f9e1ed2d662233c28cb2b35b9f63f6e4f"
+ integrity sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==
+ dependencies:
+ buffer-from "^1.0.0"
+ source-map "^0.6.0"
+
+source-map-url@^0.4.0:
+ version "0.4.1"
+ resolved "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz"
+ integrity sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==
+
+source-map@0.6.1, source-map@^0.6.0, source-map@^0.6.1, source-map@~0.6.1:
+ version "0.6.1"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz"
+ integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==
+
+source-map@^0.4.2:
+ version "0.4.4"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz"
+ integrity sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==
+ dependencies:
+ amdefine ">=0.0.4"
+
+source-map@^0.5.6, source-map@^0.5.7:
+ version "0.5.7"
+ resolved "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz"
+ integrity sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==
+
+source-map@^0.7.3:
+ version "0.7.4"
+ resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.4.tgz#a9bbe705c9d8846f4e08ff6765acf0f1b0898656"
+ integrity sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==
+
+spdx-correct@^3.0.0:
+ version "3.1.1"
+ resolved "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz"
+ integrity sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==
+ dependencies:
+ spdx-expression-parse "^3.0.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-exceptions@^2.1.0:
+ version "2.3.0"
+ resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz"
+ integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==
+
+spdx-expression-parse@^3.0.0:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz"
+ integrity sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==
+ dependencies:
+ spdx-exceptions "^2.1.0"
+ spdx-license-ids "^3.0.0"
+
+spdx-license-ids@^3.0.0:
+ version "3.0.12"
+ resolved "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.12.tgz"
+ integrity sha512-rr+VVSXtRhO4OHbXUiAF7xW3Bo9DuuF6C5jH+q/x15j2jniycgKbxU09Hr0WqlSLUs4i4ltHGXqTe7VHclYWyA==
+
+spdy-transport@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz"
+ integrity sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==
+ dependencies:
+ debug "^4.1.0"
+ detect-node "^2.0.4"
+ hpack.js "^2.1.6"
+ obuf "^1.1.2"
+ readable-stream "^3.0.6"
+ wbuf "^1.7.3"
+
+spdy@^4.0.2:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz"
+ integrity sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==
+ dependencies:
+ debug "^4.1.0"
+ handle-thing "^2.0.0"
+ http-deceiver "^1.2.7"
+ select-hose "^2.0.0"
+ spdy-transport "^3.0.0"
+
+sprintf-js@~1.0.2:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz"
+ integrity sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==
+
+sshpk@^1.7.0:
+ version "1.17.0"
+ resolved "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz"
+ integrity sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==
+ dependencies:
+ asn1 "~0.2.3"
+ assert-plus "^1.0.0"
+ bcrypt-pbkdf "^1.0.0"
+ dashdash "^1.12.0"
+ ecc-jsbn "~0.1.1"
+ getpass "^0.1.1"
+ jsbn "~0.1.0"
+ safer-buffer "^2.0.2"
+ tweetnacl "~0.14.0"
+
+stable@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz"
+ integrity sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==
+
+stackframe@^1.3.4:
+ version "1.3.4"
+ resolved "https://registry.npmjs.org/stackframe/-/stackframe-1.3.4.tgz"
+ integrity sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==
+
+statuses@2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz"
+ integrity sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==
+
+"statuses@>= 1.4.0 < 2":
+ version "1.5.0"
+ resolved "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz"
+ integrity sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==
+
+stdout-stream@^1.4.0:
+ version "1.4.1"
+ resolved "https://registry.npmjs.org/stdout-stream/-/stdout-stream-1.4.1.tgz"
+ integrity sha512-j4emi03KXqJWcIeF8eIXkjMFN1Cmb8gUlDYGeBALLPo5qdyTfA9bOtl8m33lRoC+vFMkP3gl0WsDr6+gzxbbTA==
+ dependencies:
+ readable-stream "^2.0.1"
+
+string-width@^1.0.1, string-width@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz"
+ integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
+ dependencies:
+ code-point-at "^1.0.0"
+ is-fullwidth-code-point "^1.0.0"
+ strip-ansi "^3.0.0"
+
+"string-width@^1.0.2 || 2 || 3 || 4", string-width@^4.2.3:
+ version "4.2.3"
+ resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
+ integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
+ dependencies:
+ emoji-regex "^8.0.0"
+ is-fullwidth-code-point "^3.0.0"
+ strip-ansi "^6.0.1"
+
+string-width@^2.1.0, string-width@^2.1.1:
+ version "2.1.1"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz"
+ integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==
+ dependencies:
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^4.0.0"
+
+string-width@^3.0.0, string-width@^3.1.0:
+ version "3.1.0"
+ resolved "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz"
+ integrity sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==
+ dependencies:
+ emoji-regex "^7.0.1"
+ is-fullwidth-code-point "^2.0.0"
+ strip-ansi "^5.1.0"
+
+string.prototype.trimend@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.5.tgz"
+ integrity sha512-I7RGvmjV4pJ7O3kdf+LXFpVfdNOxtCW/2C8f6jNiW4+PQchwxkCDzlk1/7p+Wl4bqFIZeF47qAHXLuHHWKAxog==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.19.5"
+
+string.prototype.trimstart@^1.0.5:
+ version "1.0.5"
+ resolved "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.5.tgz"
+ integrity sha512-THx16TJCGlsN0o6dl2o6ncWUsdgnLRSA23rRE5pyGBw/mLr3Ej/R2LaqCtgP8VNMGZsvMWnf9ooZPyY2bHvUFg==
+ dependencies:
+ call-bind "^1.0.2"
+ define-properties "^1.1.4"
+ es-abstract "^1.19.5"
+
+string_decoder@^1.1.1, string_decoder@~1.1.1:
+ version "1.1.1"
+ resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz"
+ integrity sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==
+ dependencies:
+ safe-buffer "~5.1.0"
+
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+ version "3.0.1"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz"
+ integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
+ dependencies:
+ ansi-regex "^2.0.0"
+
+strip-ansi@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz"
+ integrity sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==
+ dependencies:
+ ansi-regex "^3.0.0"
+
+strip-ansi@^5.0.0, strip-ansi@^5.1.0, strip-ansi@^5.2.0:
+ version "5.2.0"
+ resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz"
+ integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==
+ dependencies:
+ ansi-regex "^4.1.0"
+
+strip-ansi@^6.0.1:
+ version "6.0.1"
+ resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
+ integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
+ dependencies:
+ ansi-regex "^5.0.1"
+
+strip-bom@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz"
+ integrity sha512-kwrX1y7czp1E69n2ajbG65mIo9dqvJ+8aBQXOGVxqwvNbsXdFM6Lq37dLAY3mknUwru8CfcCbfOLL/gMo+fi3g==
+ dependencies:
+ is-utf8 "^0.2.0"
+
+strip-bom@^3.0.0:
+ version "3.0.0"
+ resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz"
+ integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
+strip-final-newline@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz#89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad"
+ integrity sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==
+
+strip-indent@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz"
+ integrity sha512-I5iQq6aFMM62fBEAIB/hXzwJD6EEZ0xEGCX2t7oXqaKPIRgt4WruAQ285BISgdkP+HLGWyeGmNJcpIwFeRYRUA==
+ dependencies:
+ get-stdin "^4.0.1"
+
+strip-json-comments@~2.0.1:
+ version "2.0.1"
+ resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz"
+ integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
+
+style-loader@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/style-loader/-/style-loader-2.0.0.tgz#9669602fd4690740eaaec137799a03addbbc393c"
+ integrity sha512-Z0gYUJmzZ6ZdRUqpg1r8GsaFKypE+3xAzuFeMuoHgjc9KZv3wMyCRjQIWEbhoFSq7+7yoHXySDJyyWQaPajeiQ==
+ dependencies:
+ loader-utils "^2.0.0"
+ schema-utils "^3.0.0"
+
+stylehacks@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.yarnpkg.com/stylehacks/-/stylehacks-5.1.0.tgz#a40066490ca0caca04e96c6b02153ddc39913520"
+ integrity sha512-SzLmvHQTrIWfSgljkQCw2++C9+Ne91d/6Sp92I8c5uHTcy/PgeHamwITIbBW9wnFTY/3ZfSXR9HIL6Ikqmcu6Q==
+ dependencies:
+ browserslist "^4.16.6"
+ postcss-selector-parser "^6.0.4"
+
+supports-color@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz"
+ integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
+
+supports-color@^5.3.0:
+ version "5.5.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz"
+ integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^6.1.0:
+ version "6.1.0"
+ resolved "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz"
+ integrity sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==
+ dependencies:
+ has-flag "^3.0.0"
+
+supports-color@^7.0.0, supports-color@^7.1.0:
+ version "7.2.0"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-7.2.0.tgz#1b7dcdcb32b8138801b3e478ba6a51caa89648da"
+ integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-color@^8.0.0:
+ version "8.1.1"
+ resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-8.1.1.tgz#cd6fc17e28500cff56c1b86c0a7fd4a54a73005c"
+ integrity sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==
+ dependencies:
+ has-flag "^4.0.0"
+
+supports-preserve-symlinks-flag@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz"
+ integrity sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==
+
+svgo@^2.7.0:
+ version "2.8.0"
+ resolved "https://registry.yarnpkg.com/svgo/-/svgo-2.8.0.tgz#4ff80cce6710dc2795f0c7c74101e6764cfccd24"
+ integrity sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==
+ dependencies:
+ "@trysound/sax" "0.2.0"
+ commander "^7.2.0"
+ css-select "^4.1.3"
+ css-tree "^1.1.3"
+ csso "^4.2.0"
+ picocolors "^1.0.0"
+ stable "^0.1.8"
+
+sync-rpc@^1.3.6:
+ version "1.3.6"
+ resolved "https://registry.yarnpkg.com/sync-rpc/-/sync-rpc-1.3.6.tgz#b2e8b2550a12ccbc71df8644810529deb68665a7"
+ integrity sha512-J8jTXuZzRlvU7HemDgHi3pGnh/rkoqR/OZSjhTyyZrEkkYQbk7Z33AXp37mkPfPpfdOuj7Ex3H/TJM1z48uPQw==
+ dependencies:
+ get-port "^3.1.0"
+
+table@4.0.2:
+ version "4.0.2"
+ resolved "https://registry.npmjs.org/table/-/table-4.0.2.tgz"
+ integrity sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==
+ dependencies:
+ ajv "^5.2.3"
+ ajv-keywords "^2.1.0"
+ chalk "^2.1.0"
+ lodash "^4.17.4"
+ slice-ansi "1.0.0"
+ string-width "^2.1.1"
+
+tapable@^2.1.1, tapable@^2.2.0:
+ version "2.2.1"
+ resolved "https://registry.yarnpkg.com/tapable/-/tapable-2.2.1.tgz#1967a73ef4060a82f12ab96af86d52fdb76eeca0"
+ integrity sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==
+
+tar@^2.0.0:
+ version "2.2.2"
+ resolved "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz"
+ integrity sha512-FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==
+ dependencies:
+ block-stream "*"
+ fstream "^1.0.12"
+ inherits "2"
+
+terser-webpack-plugin@^5.1.1, terser-webpack-plugin@^5.1.3:
+ version "5.3.6"
+ resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.3.6.tgz#5590aec31aa3c6f771ce1b1acca60639eab3195c"
+ integrity sha512-kfLFk+PoLUQIbLmB1+PZDMRSZS99Mp+/MHqDNmMA6tOItzRt+Npe3E+fsMs5mfcM0wCtrrdU387UnV+vnSffXQ==
+ dependencies:
+ "@jridgewell/trace-mapping" "^0.3.14"
+ jest-worker "^27.4.5"
+ schema-utils "^3.1.1"
+ serialize-javascript "^6.0.0"
+ terser "^5.14.1"
+
+terser@^5.14.1:
+ version "5.15.1"
+ resolved "https://registry.yarnpkg.com/terser/-/terser-5.15.1.tgz#8561af6e0fd6d839669c73b92bdd5777d870ed6c"
+ integrity sha512-K1faMUvpm/FBxjBXud0LWVAGxmvoPbZbfTCYbSgaaYQaIXI3/TdI7a7ZGA73Zrou6Q8Zmz3oeUTsp/dj+ag2Xw==
+ dependencies:
+ "@jridgewell/source-map" "^0.3.2"
+ acorn "^8.5.0"
+ commander "^2.20.0"
+ source-map-support "~0.5.20"
+
+text-table@~0.2.0:
+ version "0.2.0"
+ resolved "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz"
+ integrity sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==
+
+through@^2.3.6:
+ version "2.3.8"
+ resolved "https://registry.npmjs.org/through/-/through-2.3.8.tgz"
+ integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
+thunky@^1.0.2:
+ version "1.1.0"
+ resolved "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz"
+ integrity sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==
+
+tmp@^0.0.33:
+ version "0.0.33"
+ resolved "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz"
+ integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==
+ dependencies:
+ os-tmpdir "~1.0.2"
+
+tmp@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.2.1.tgz#8457fc3037dcf4719c251367a1af6500ee1ccf14"
+ integrity sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==
+ dependencies:
+ rimraf "^3.0.0"
+
+to-fast-properties@^1.0.3:
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz"
+ integrity sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==
+
+to-fast-properties@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz"
+ integrity sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==
+
+to-regex-range@^5.0.1:
+ version "5.0.1"
+ resolved "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz"
+ integrity sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==
+ dependencies:
+ is-number "^7.0.0"
+
+toidentifier@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz"
+ integrity sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==
+
+tough-cookie@~2.5.0:
+ version "2.5.0"
+ resolved "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz"
+ integrity sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==
+ dependencies:
+ psl "^1.1.28"
+ punycode "^2.1.1"
+
+trim-newlines@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz"
+ integrity sha512-Nm4cF79FhSTzrLKGDMi3I4utBtFv8qKy4sq1enftf2gMdpqI8oVQTAfySkTz5r49giVzDj88SVZXP4CeYQwjaw==
+
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz"
+ integrity sha512-WZGXGstmCWgeevgTL54hrCuw1dyMQIzWy7ZfqRJfSmJZBwklI15egmQytFP6bPidmw3M8d5yEowl1niq4vmqZw==
+
+"true-case-path@^1.0.2":
+ version "1.0.3"
+ resolved "https://registry.npmjs.org/true-case-path/-/true-case-path-1.0.3.tgz"
+ integrity sha512-m6s2OdQe5wgpFMC+pAJ+q9djG82O2jcHPOI6RNg1yy9rCYR+WD6Nbpl32fDpfC56nirdRy+opFa/Vk7HYhqaew==
+ dependencies:
+ glob "^7.1.2"
+
+tsconfig-paths@^3.14.1:
+ version "3.14.1"
+ resolved "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz"
+ integrity sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==
+ dependencies:
+ "@types/json5" "^0.0.29"
+ json5 "^1.0.1"
+ minimist "^1.2.6"
+ strip-bom "^3.0.0"
+
+tunnel-agent@^0.6.0:
+ version "0.6.0"
+ resolved "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz"
+ integrity sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==
+ dependencies:
+ safe-buffer "^5.0.1"
+
+tweetnacl@^0.14.3, tweetnacl@~0.14.0:
+ version "0.14.5"
+ resolved "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz"
+ integrity sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==
+
+type-check@~0.3.2:
+ version "0.3.2"
+ resolved "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz"
+ integrity sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==
+ dependencies:
+ prelude-ls "~1.1.2"
+
+type-is@~1.6.18:
+ version "1.6.18"
+ resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz"
+ integrity sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==
+ dependencies:
+ media-typer "0.3.0"
+ mime-types "~2.1.24"
+
+type@^1.0.1:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/type/-/type-1.2.0.tgz"
+ integrity sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==
+
+type@^2.7.2:
+ version "2.7.2"
+ resolved "https://registry.npmjs.org/type/-/type-2.7.2.tgz"
+ integrity sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==
+
+typedarray@^0.0.6:
+ version "0.0.6"
+ resolved "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz"
+ integrity sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==
+
+unbox-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz"
+ integrity sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==
+ dependencies:
+ call-bind "^1.0.2"
+ has-bigints "^1.0.2"
+ has-symbols "^1.0.3"
+ which-boxed-primitive "^1.0.2"
+
+unicode-canonical-property-names-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz"
+ integrity sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==
+
+unicode-match-property-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-2.0.0.tgz"
+ integrity sha512-5kaZCrbp5mmbz5ulBkDkbY0SsPOjKqVS35VpL9ulMPfSl0J0Xsm+9Evphv9CoIZFwre7aJoa94AY6seMKGVN5Q==
+ dependencies:
+ unicode-canonical-property-names-ecmascript "^2.0.0"
+ unicode-property-aliases-ecmascript "^2.0.0"
+
+unicode-match-property-value-ecmascript@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-2.0.0.tgz"
+ integrity sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==
+
+unicode-property-aliases-ecmascript@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.1.0.tgz"
+ integrity sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==
+
+unpipe@1.0.0, unpipe@~1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz"
+ integrity sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==
+
+upath@^1.1.0:
+ version "1.2.0"
+ resolved "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz"
+ integrity sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==
+
+update-browserslist-db@^1.0.9:
+ version "1.0.9"
+ resolved "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz"
+ integrity sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==
+ dependencies:
+ escalade "^3.1.1"
+ picocolors "^1.0.0"
+
+uri-js@^4.2.2:
+ version "4.4.1"
+ resolved "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz"
+ integrity sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==
+ dependencies:
+ punycode "^2.1.0"
+
+urix@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz"
+ integrity sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==
+
+util-deprecate@^1.0.1, util-deprecate@^1.0.2, util-deprecate@~1.0.1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz"
+ integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
+
+utila@~0.4:
+ version "0.4.0"
+ resolved "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz"
+ integrity sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==
+
+utils-merge@1.0.1:
+ version "1.0.1"
+ resolved "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz"
+ integrity sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==
+
+uuid@^3.3.2:
+ version "3.4.0"
+ resolved "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz"
+ integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==
+
+uuid@^8.3.2:
+ version "8.3.2"
+ resolved "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz"
+ integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
+
+validate-npm-package-license@^3.0.1:
+ version "3.0.4"
+ resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz"
+ integrity sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==
+ dependencies:
+ spdx-correct "^3.0.0"
+ spdx-expression-parse "^3.0.0"
+
+vary@~1.1.2:
+ version "1.1.2"
+ resolved "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz"
+ integrity sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==
+
+verror@1.10.0:
+ version "1.10.0"
+ resolved "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz"
+ integrity sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==
+ dependencies:
+ assert-plus "^1.0.0"
+ core-util-is "1.0.2"
+ extsprintf "^1.2.0"
+
+watchpack@^2.4.0:
+ version "2.4.0"
+ resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
+ integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
+ dependencies:
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.1.2"
+
+wbuf@^1.1.0, wbuf@^1.7.3:
+ version "1.7.3"
+ resolved "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz"
+ integrity sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==
+ dependencies:
+ minimalistic-assert "^1.0.0"
+
+webpack-cli@^4.9.1:
+ version "4.10.0"
+ resolved "https://registry.yarnpkg.com/webpack-cli/-/webpack-cli-4.10.0.tgz#37c1d69c8d85214c5a65e589378f53aec64dab31"
+ integrity sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==
+ dependencies:
+ "@discoveryjs/json-ext" "^0.5.0"
+ "@webpack-cli/configtest" "^1.2.0"
+ "@webpack-cli/info" "^1.5.0"
+ "@webpack-cli/serve" "^1.7.0"
+ colorette "^2.0.14"
+ commander "^7.0.0"
+ cross-spawn "^7.0.3"
+ fastest-levenshtein "^1.0.12"
+ import-local "^3.0.2"
+ interpret "^2.2.0"
+ rechoir "^0.7.0"
+ webpack-merge "^5.7.3"
+
+webpack-dev-middleware@^5.3.1:
+ version "5.3.3"
+ resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz#efae67c2793908e7311f1d9b06f2a08dcc97e51f"
+ integrity sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==
+ dependencies:
+ colorette "^2.0.10"
+ memfs "^3.4.3"
+ mime-types "^2.1.31"
+ range-parser "^1.2.1"
+ schema-utils "^4.0.0"
+
+webpack-dev-server@^4.0.0:
+ version "4.11.1"
+ resolved "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-4.11.1.tgz#ae07f0d71ca0438cf88446f09029b92ce81380b5"
+ integrity sha512-lILVz9tAUy1zGFwieuaQtYiadImb5M3d+H+L1zDYalYoDl0cksAB1UNyuE5MMWJrG6zR1tXkCP2fitl7yoUJiw==
+ dependencies:
+ "@types/bonjour" "^3.5.9"
+ "@types/connect-history-api-fallback" "^1.3.5"
+ "@types/express" "^4.17.13"
+ "@types/serve-index" "^1.9.1"
+ "@types/serve-static" "^1.13.10"
+ "@types/sockjs" "^0.3.33"
+ "@types/ws" "^8.5.1"
+ ansi-html-community "^0.0.8"
+ bonjour-service "^1.0.11"
+ chokidar "^3.5.3"
+ colorette "^2.0.10"
+ compression "^1.7.4"
+ connect-history-api-fallback "^2.0.0"
+ default-gateway "^6.0.3"
+ express "^4.17.3"
+ graceful-fs "^4.2.6"
+ html-entities "^2.3.2"
+ http-proxy-middleware "^2.0.3"
+ ipaddr.js "^2.0.1"
+ open "^8.0.9"
+ p-retry "^4.5.0"
+ rimraf "^3.0.2"
+ schema-utils "^4.0.0"
+ selfsigned "^2.1.1"
+ serve-index "^1.9.1"
+ sockjs "^0.3.24"
+ spdy "^4.0.2"
+ webpack-dev-middleware "^5.3.1"
+ ws "^8.4.2"
+
+webpack-merge@^5.7.3:
+ version "5.8.0"
+ resolved "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-5.8.0.tgz#2b39dbf22af87776ad744c390223731d30a68f61"
+ integrity sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==
+ dependencies:
+ clone-deep "^4.0.1"
+ wildcard "^2.0.0"
+
+webpack-sources@^1.1.0:
+ version "1.4.3"
+ resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.4.3.tgz"
+ integrity sha512-lgTS3Xhv1lCOKo7SA5TjKXMjpSM4sBjNV5+q2bqesbSPs5FjGmU6jjtBSkX9b4qW87vDIsCIlUPOEhbZrMdjeQ==
+ dependencies:
+ source-list-map "^2.0.0"
+ source-map "~0.6.1"
+
+webpack-sources@^3.2.3:
+ version "3.2.3"
+ resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.3.tgz#2d4daab8451fd4b240cc27055ff6a0c2ccea0cde"
+ integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
+
+webpack@^5.35:
+ version "5.74.0"
+ resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.74.0.tgz#02a5dac19a17e0bb47093f2be67c695102a55980"
+ integrity sha512-A2InDwnhhGN4LYctJj6M1JEaGL7Luj6LOmyBHjcI8529cm5p6VXiTIW2sn6ffvEAKmveLzvu4jrihwXtPojlAA==
+ dependencies:
+ "@types/eslint-scope" "^3.7.3"
+ "@types/estree" "^0.0.51"
+ "@webassemblyjs/ast" "1.11.1"
+ "@webassemblyjs/wasm-edit" "1.11.1"
+ "@webassemblyjs/wasm-parser" "1.11.1"
+ acorn "^8.7.1"
+ acorn-import-assertions "^1.7.6"
+ browserslist "^4.14.5"
+ chrome-trace-event "^1.0.2"
+ enhanced-resolve "^5.10.0"
+ es-module-lexer "^0.9.0"
+ eslint-scope "5.1.1"
+ events "^3.2.0"
+ glob-to-regexp "^0.4.1"
+ graceful-fs "^4.2.9"
+ json-parse-even-better-errors "^2.3.1"
+ loader-runner "^4.2.0"
+ mime-types "^2.1.27"
+ neo-async "^2.6.2"
+ schema-utils "^3.1.0"
+ tapable "^2.1.1"
+ terser-webpack-plugin "^5.1.3"
+ watchpack "^2.4.0"
+ webpack-sources "^3.2.3"
+
+websocket-driver@>=0.5.1, websocket-driver@^0.7.4:
+ version "0.7.4"
+ resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz"
+ integrity sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==
+ dependencies:
+ http-parser-js ">=0.5.1"
+ safe-buffer ">=5.1.0"
+ websocket-extensions ">=0.1.1"
+
+websocket-extensions@>=0.1.1:
+ version "0.1.4"
+ resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz"
+ integrity sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==
+
+which-boxed-primitive@^1.0.2:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz"
+ integrity sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==
+ dependencies:
+ is-bigint "^1.0.1"
+ is-boolean-object "^1.1.0"
+ is-number-object "^1.0.4"
+ is-string "^1.0.5"
+ is-symbol "^1.0.3"
+
+which-module@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.npmjs.org/which-module/-/which-module-1.0.0.tgz"
+ integrity sha512-F6+WgncZi/mJDrammbTuHe1q0R5hOXv/mBaiNA2TCNT/LTHusX0V+CJnj9XT8ki5ln2UZyyddDgHfCzyrOH7MQ==
+
+which-module@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz"
+ integrity sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==
+
+which@1, which@^1.2.9:
+ version "1.3.1"
+ resolved "https://registry.npmjs.org/which/-/which-1.3.1.tgz"
+ integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==
+ dependencies:
+ isexe "^2.0.0"
+
+which@^2.0.1:
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz#7c6a8dd0a636a0327e10b59c9286eee93f3f51b1"
+ integrity sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==
+ dependencies:
+ isexe "^2.0.0"
+
+wide-align@^1.1.0:
+ version "1.1.5"
+ resolved "https://registry.npmjs.org/wide-align/-/wide-align-1.1.5.tgz"
+ integrity sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==
+ dependencies:
+ string-width "^1.0.2 || 2 || 3 || 4"
+
+wildcard@^2.0.0:
+ version "2.0.0"
+ resolved "https://registry.yarnpkg.com/wildcard/-/wildcard-2.0.0.tgz#a77d20e5200c6faaac979e4b3aadc7b3dd7f8fec"
+ integrity sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==
+
+word-wrap@~1.2.3:
+ 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==
+
+wrap-ansi@^2.0.0:
+ version "2.1.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz"
+ integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==
+ dependencies:
+ string-width "^1.0.1"
+ strip-ansi "^3.0.1"
+
+wrap-ansi@^5.1.0:
+ version "5.1.0"
+ resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz"
+ integrity sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==
+ dependencies:
+ ansi-styles "^3.2.0"
+ string-width "^3.0.0"
+ strip-ansi "^5.0.0"
+
+wrappy@1:
+ version "1.0.2"
+ resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz"
+ integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
+
+write@^0.2.1:
+ version "0.2.1"
+ resolved "https://registry.npmjs.org/write/-/write-0.2.1.tgz"
+ integrity sha512-CJ17OoULEKXpA5pef3qLj5AxTJ6mSt7g84he2WIskKwqFO4T97d5V7Tadl0DYDk7qyUOQD5WlUlOMChaYrhxeA==
+ dependencies:
+ mkdirp "^0.5.1"
+
+ws@^8.4.2:
+ version "8.9.0"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-8.9.0.tgz#2a994bb67144be1b53fe2d23c53c028adeb7f45e"
+ integrity sha512-Ja7nszREasGaYUYCI2k4lCKIRTt+y7XuqVoHR44YpI49TtryyqbqvDMn5eqfW7e6HzTukDRIsXqzVHScqRcafg==
+
+y18n@^3.2.1:
+ version "3.2.2"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-3.2.2.tgz"
+ integrity sha512-uGZHXkHnhF0XeeAPgnKfPv1bgKAYyVvmNL1xlKsPYZPaIHxGti2hHqvOCQv71XMsLxu1QjergkqogUnms5D3YQ==
+
+y18n@^4.0.0:
+ version "4.0.3"
+ resolved "https://registry.npmjs.org/y18n/-/y18n-4.0.3.tgz"
+ integrity sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==
+
+yallist@^2.1.2:
+ version "2.1.2"
+ resolved "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz"
+ integrity sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==
+
+yallist@^4.0.0:
+ version "4.0.0"
+ resolved "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz#9bb92790d9c0effec63be73519e11a35019a3a72"
+ integrity sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==
+
+yaml@^1.10.2:
+ version "1.10.2"
+ resolved "https://registry.yarnpkg.com/yaml/-/yaml-1.10.2.tgz#2301c5ffbf12b467de8da2333a459e29e7920e4b"
+ integrity sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==
+
+yargs-parser@^13.1.2:
+ version "13.1.2"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz"
+ integrity sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==
+ dependencies:
+ camelcase "^5.0.0"
+ decamelize "^1.2.0"
+
+yargs-parser@^20.2.4:
+ version "20.2.9"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-20.2.9.tgz#2eb7dc3b0289718fc295f362753845c41a0c94ee"
+ integrity sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==
+
+yargs-parser@^4.2.0:
+ version "4.2.1"
+ resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-4.2.1.tgz"
+ integrity sha512-+QQWqC2xeL0N5/TE+TY6OGEqyNRM+g2/r712PDNYgiCdXYCApXf1vzfmDSLBxfGRwV+moTq/V8FnMI24JCm2Yg==
+ dependencies:
+ camelcase "^3.0.0"
+
+yargs@^13.3.2:
+ version "13.3.2"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz"
+ integrity sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==
+ dependencies:
+ cliui "^5.0.0"
+ find-up "^3.0.0"
+ get-caller-file "^2.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^2.0.0"
+ set-blocking "^2.0.0"
+ string-width "^3.0.0"
+ which-module "^2.0.0"
+ y18n "^4.0.0"
+ yargs-parser "^13.1.2"
+
+yargs@^6.4.0:
+ version "6.6.0"
+ resolved "https://registry.npmjs.org/yargs/-/yargs-6.6.0.tgz"
+ integrity sha512-6/QWTdisjnu5UHUzQGst+UOEuEVwIzFVGBjq3jMTFNs5WJQsH/X6nMURSaScIdF5txylr1Ao9bvbWiKi2yXbwA==
+ dependencies:
+ camelcase "^3.0.0"
+ cliui "^3.2.0"
+ decamelize "^1.1.1"
+ get-caller-file "^1.0.1"
+ os-locale "^1.4.0"
+ read-pkg-up "^1.0.1"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^1.0.2"
+ which-module "^1.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^4.2.0"
+
+yocto-queue@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/yocto-queue/-/yocto-queue-0.1.0.tgz#0294eb3dee05028d31ee1a5fa2c556a6aaf10a1b"
+ integrity sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==