diff --git a/.github/workflows/backend.yml b/.github/workflows/backend.yml index 561e1978..821f1b4f 100644 --- a/.github/workflows/backend.yml +++ b/.github/workflows/backend.yml @@ -36,3 +36,15 @@ jobs: - name: gradle build run: ./gradlew build + + - name: publish unit test results + uses: EnricoMi/publish-unit-test-result-action@v2 + if: always() + with: + files: backend/build/test-results/test/TEST-*.xml + + - name: add comments to a pull request + uses: mikepenz/action-junit-report@v3 + if: always() + with: + report_paths: backend/build/test-results/test/TEST-*.xml diff --git a/.github/workflows/frontend.yml b/.github/workflows/frontend.yml new file mode 100644 index 00000000..9bb3a4f9 --- /dev/null +++ b/.github/workflows/frontend.yml @@ -0,0 +1,44 @@ +name: frontend + +on: + push: + branches: + - main + - release + paths: + - 'frontend/**' + pull_request: + branches: + - main + - release + paths: + - 'frontend/**' + +defaults: + run: + working-directory: frontend + +jobs: + cypress-run: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Cypress run + uses: cypress-io/github-action@v4 + with: + start: npm run start + working-directory: frontend + chromatic-deployment: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + with: + fetch-depth: 0 + - name: Install dependencies + run: npm install + - name: Publish to Chromatic + uses: chromaui/action@v1 + with: + projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }} + workingDir: frontend diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 00000000..9aa82efe --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "backend/security"] + path = backend/security + url = https://github.com/woowacourse-f12/security.git diff --git a/backend/.gitignore b/backend/.gitignore index d8f1356a..7b5e51a4 100644 --- a/backend/.gitignore +++ b/backend/.gitignore @@ -36,5 +36,5 @@ out/ ### VS Code ### .vscode/ -### auth ### -application-auth.yml +### submodules ### +submodules/ diff --git a/backend/build.gradle b/backend/build.gradle index a9beba02..464a0717 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -11,6 +11,9 @@ sourceCompatibility = '11' configurations { asciidoctorExtensions + all { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-logging' + } } repositories { @@ -22,8 +25,11 @@ dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' implementation 'org.springframework.boot:spring-boot-starter-validation' implementation 'org.springframework.boot:spring-boot-starter-webflux' + implementation 'org.springframework.boot:spring-boot-starter-log4j2' + implementation 'com.lmax:disruptor:3.4.2' runtimeOnly 'com.h2database:h2' + runtimeOnly 'mysql:mysql-connector-java' compileOnly 'org.projectlombok:lombok' annotationProcessor 'org.projectlombok:lombok' @@ -41,18 +47,32 @@ dependencies { // rest-docs asciidoctorExtensions 'org.springframework.restdocs:spring-restdocs-asciidoctor' testImplementation 'org.springframework.restdocs:spring-restdocs-mockmvc' + + implementation 'com.querydsl:querydsl-jpa' + + annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" + annotationProcessor "jakarta.persistence:jakarta.persistence-api" + annotationProcessor "jakarta.annotation:jakarta.annotation-api" } ext { set('snippetsDir', file("build/generated-snippets")) } -tasks.named('test') { +task copySubmodule(type: Copy) { + copy { + from 'security' + include "*.yml" + into 'src/main/resources/submodules' + } +} + +test { outputs.dir snippetsDir useJUnitPlatform() } -tasks.named('asciidoctor') { +asciidoctor { configurations 'asciidoctorExtensions' inputs.dir snippetsDir sources { @@ -64,9 +84,8 @@ tasks.named('asciidoctor') { task copyDocument(type: Copy) { dependsOn asciidoctor - from file("${asciidoctor.outputDir}") - into file("src/main/resources/static") + into file("build/resources/main/static") } bootJar { diff --git a/backend/security b/backend/security new file mode 160000 index 00000000..353aeef2 --- /dev/null +++ b/backend/security @@ -0,0 +1 @@ +Subproject commit 353aeef29b69eb191b78d33dfe77d75f82b051ea diff --git a/backend/src/docs/asciidoc/index.adoc b/backend/src/docs/asciidoc/index.adoc index f85809e3..7206c75f 100644 --- a/backend/src/docs/asciidoc/index.adoc +++ b/backend/src/docs/asciidoc/index.adoc @@ -7,6 +7,6 @@ include::auth.adoc[] include::members.adoc[] -include::keyboards.adoc[] +include::products.adoc[] include::reviews.adoc[] include::inventoryProducts.adoc[] diff --git a/backend/src/docs/asciidoc/keyboards.adoc b/backend/src/docs/asciidoc/keyboards.adoc deleted file mode 100644 index 22094d09..00000000 --- a/backend/src/docs/asciidoc/keyboards.adoc +++ /dev/null @@ -1,16 +0,0 @@ -[[Keyboard]] -== Keyboard API - -=== 키보드 단일 상품 조회 - -operation::keyboards-get[snippets='http-request,http-response'] - -=== 키보드 목록 페이지 조회 - -==== sort 조건 - -- `rating,desc`(평점순) -- `reviewCount,desc`(리뷰 많은순) -- 없을 경우 등록 순서 - -operation::keyboards-page-get[snippets='http-request,http-response'] diff --git a/backend/src/docs/asciidoc/members.adoc b/backend/src/docs/asciidoc/members.adoc index a925e3be..d4be7a52 100644 --- a/backend/src/docs/asciidoc/members.adoc +++ b/backend/src/docs/asciidoc/members.adoc @@ -12,3 +12,7 @@ operation::members-get-by-memberId[snippets='http-request,http-response'] === 로그인된 상태로 나의 회원 정보 수정 operation::members-update[snippets='http-request,http-response'] + +=== 회원 검색 + +operation::members-search[snippets='http-request,http-response'] diff --git a/backend/src/docs/asciidoc/products.adoc b/backend/src/docs/asciidoc/products.adoc new file mode 100644 index 00000000..7ec7fe51 --- /dev/null +++ b/backend/src/docs/asciidoc/products.adoc @@ -0,0 +1,29 @@ +[[Product]] +== Product API + +=== 제품 단일 상품 조회 + +operation::products-get[snippets='http-request,http-response'] + +=== 제품 목록 페이지 조회 + +==== category 조건 + +- `keyboard` (키보드) +- `mouse` (마우스) +- `monitor` (모니터) +- `stand` (거치대) +- `software` (소프트웨어) +- 없을 경우 모든 제품 조회 + +==== sort 조건 + +- `rating,desc`(평점순) +- `reviewCount,desc`(리뷰 많은순) +- 없을 경우 등록 순서 + +operation::products-page-get[snippets='http-request,http-response'] + +=== 특정 제품의 사용자 통계를 조회 + +operation::products-member-statistics-get[snippets='http-request,http-response'] diff --git a/backend/src/main/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductService.java b/backend/src/main/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductService.java index c70c5f5a..81e958db 100644 --- a/backend/src/main/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductService.java +++ b/backend/src/main/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductService.java @@ -1,15 +1,20 @@ package com.woowacourse.f12.application.inventoryproduct; +import static com.woowacourse.f12.domain.product.Category.SOFTWARE; + import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; import com.woowacourse.f12.domain.inventoryproduct.InventoryProductRepository; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; import com.woowacourse.f12.dto.request.inventoryproduct.ProfileProductRequest; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductsResponse; -import com.woowacourse.f12.exception.badrequest.InvalidProfileProductException; -import com.woowacourse.f12.exception.notfound.InventoryItemNotFoundException; +import com.woowacourse.f12.exception.internalserver.SqlUpdateException; +import com.woowacourse.f12.exception.badrequest.DuplicatedProfileProductCategoryException; +import com.woowacourse.f12.exception.badrequest.InvalidProfileProductCategoryException; +import com.woowacourse.f12.exception.internalserver.SqlUpdateException; +import com.woowacourse.f12.exception.badrequest.NotUpdatableException; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; import java.util.List; -import java.util.Objects; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -28,31 +33,50 @@ public InventoryProductService(final InventoryProductRepository inventoryProduct @Transactional public void updateProfileProducts(final Long memberId, final ProfileProductRequest profileProductRequest) { - validateMember(memberId); - validateInvalidProfileProductRequest(profileProductRequest); - updateProfileProduct(profileProductRequest); + final Member member = memberRepository.findById(memberId) + .orElseThrow(MemberNotFoundException::new); + final List selectedInventoryProductIds = profileProductRequest.getSelectedInventoryProductIds(); + validateProfileProducts(selectedInventoryProductIds); + cancelProfileProducts(member); + registerProfileProducts(member, selectedInventoryProductIds); } - private void validateInvalidProfileProductRequest(final ProfileProductRequest profileProductRequest) { - if (Objects.isNull(profileProductRequest.getSelectedInventoryProductId()) && Objects.isNull( - profileProductRequest.getUnselectedInventoryProductId())) { - throw new InvalidProfileProductException(); - } + private void validateProfileProducts(final List selectedInventoryProductIds) { + final List inventoryProducts = inventoryProductRepository.findAllById( + selectedInventoryProductIds); + validateNotContainsSoftware(inventoryProducts); + validateCategoryNotDuplicated(inventoryProducts); } - private void updateProfileProduct(final ProfileProductRequest profileProductRequest) { - if (!Objects.isNull(profileProductRequest.getSelectedInventoryProductId())) { - updateProfileProduct(profileProductRequest.getSelectedInventoryProductId(), true); + private void validateNotContainsSoftware(final List inventoryProducts) { + final boolean hasSoftware = inventoryProducts.stream() + .map(it -> it.getProduct().getCategory()) + .anyMatch(it -> it.equals(SOFTWARE)); + if (hasSoftware) { + throw new InvalidProfileProductCategoryException(); } - if (!Objects.isNull(profileProductRequest.getUnselectedInventoryProductId())) { - updateProfileProduct(profileProductRequest.getUnselectedInventoryProductId(), false); + } + + private void validateCategoryNotDuplicated(final List inventoryProducts) { + final long distinctCount = inventoryProducts.stream() + .map(it -> it.getProduct().getCategory()) + .distinct() + .count(); + if (distinctCount != inventoryProducts.size()) { + throw new DuplicatedProfileProductCategoryException(); } } - private void updateProfileProduct(final Long inventoryItemId, final boolean selected) { - final InventoryProduct inventoryProduct = inventoryProductRepository.findById(inventoryItemId) - .orElseThrow(InventoryItemNotFoundException::new); - inventoryProduct.updateSelected(selected); + private void cancelProfileProducts(final Member member) { + inventoryProductRepository.updateBulkProfileProductByMember(member, false); + } + + private void registerProfileProducts(final Member member, final List selectedInventoryProductIds) { + final int updatedCount = inventoryProductRepository.updateBulkProfileProductByMemberAndIds(member, + selectedInventoryProductIds, true); + if (updatedCount != selectedInventoryProductIds.size()) { + throw new NotUpdatableException(); + } } public InventoryProductsResponse findByMemberId(final Long memberId) { diff --git a/backend/src/main/java/com/woowacourse/f12/application/member/MemberService.java b/backend/src/main/java/com/woowacourse/f12/application/member/MemberService.java index 8a69e86d..5b91f750 100644 --- a/backend/src/main/java/com/woowacourse/f12/application/member/MemberService.java +++ b/backend/src/main/java/com/woowacourse/f12/application/member/MemberService.java @@ -1,12 +1,21 @@ package com.woowacourse.f12.application.member; +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.JobType; import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; import com.woowacourse.f12.dto.request.member.MemberRequest; +import com.woowacourse.f12.dto.request.member.MemberSearchRequest; +import com.woowacourse.f12.dto.response.member.MemberPageResponse; import com.woowacourse.f12.dto.response.member.MemberResponse; import com.woowacourse.f12.exception.badrequest.InvalidProfileArgumentException; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; +import com.woowacourse.f12.presentation.member.CareerLevelConstant; +import com.woowacourse.f12.presentation.member.JobTypeConstant; +import java.util.Objects; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -31,12 +40,36 @@ public MemberResponse findById(final Long memberId) { @Transactional public void updateMember(final Long memberId, final MemberRequest memberRequest) { final Member member = findMember(memberId); - member.updateCareerLevel(memberRequest.getCareerLevel()); - member.updateJobType(memberRequest.getJobType()); + member.updateCareerLevel(memberRequest.getCareerLevel().toCareerLevel()); + member.updateJobType(memberRequest.getJobType().toJobType()); } private Member findMember(final Long memberId) { return memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); } + + public MemberPageResponse findByContains(final MemberSearchRequest memberSearchRequest, final Pageable pageable) { + final CareerLevel careerLevel = parseCareerLevel(memberSearchRequest); + final JobType jobType = parseJobType(memberSearchRequest); + final Slice slice = memberRepository.findBySearchConditions(memberSearchRequest.getQuery(), careerLevel, + jobType, pageable); + return MemberPageResponse.from(slice); + } + + private JobType parseJobType(final MemberSearchRequest memberSearchRequest) { + final JobTypeConstant jobTypeConstant = memberSearchRequest.getJobType(); + if (Objects.isNull(jobTypeConstant)) { + return null; + } + return jobTypeConstant.toJobType(); + } + + private CareerLevel parseCareerLevel(final MemberSearchRequest memberSearchRequest) { + final CareerLevelConstant careerLevelConstant = memberSearchRequest.getCareerLevel(); + if (Objects.isNull(careerLevelConstant)) { + return null; + } + return careerLevelConstant.toCareerLevel(); + } } diff --git a/backend/src/main/java/com/woowacourse/f12/application/product/KeyboardService.java b/backend/src/main/java/com/woowacourse/f12/application/product/KeyboardService.java deleted file mode 100644 index 2fb854a6..00000000 --- a/backend/src/main/java/com/woowacourse/f12/application/product/KeyboardService.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.woowacourse.f12.application.product; - -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; -import com.woowacourse.f12.exception.notfound.KeyboardNotFoundException; -import org.springframework.data.domain.Pageable; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@Transactional(readOnly = true) -public class KeyboardService { - - private final KeyboardRepository keyboardRepository; - - public KeyboardService(final KeyboardRepository keyboardRepository) { - this.keyboardRepository = keyboardRepository; - } - - public KeyboardResponse findById(final Long id) { - final Keyboard keyboard = keyboardRepository.findById(id) - .orElseThrow(KeyboardNotFoundException::new); - return KeyboardResponse.from(keyboard); - } - - public KeyboardPageResponse findPage(final Pageable pageable) { - return KeyboardPageResponse.from(keyboardRepository.findPageBy(pageable)); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/application/product/ProductService.java b/backend/src/main/java/com/woowacourse/f12/application/product/ProductService.java new file mode 100644 index 00000000..bb073398 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/application/product/ProductService.java @@ -0,0 +1,72 @@ +package com.woowacourse.f12.application.product; + +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.domain.product.Category; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; +import com.woowacourse.f12.domain.review.CareerLevelCount; +import com.woowacourse.f12.domain.review.JobTypeCount; +import com.woowacourse.f12.domain.review.MemberInfoStatistics; +import com.woowacourse.f12.domain.review.ReviewRepository; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.dto.response.product.ProductStatisticsResponse; +import com.woowacourse.f12.exception.notfound.ProductNotFoundException; +import com.woowacourse.f12.presentation.product.CategoryConstant; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional(readOnly = true) +public class ProductService { + + private final ProductRepository productRepository; + private final ReviewRepository reviewRepository; + + public ProductService(final ProductRepository productRepository, final ReviewRepository reviewRepository) { + this.productRepository = productRepository; + this.reviewRepository = reviewRepository; + } + + public ProductResponse findById(final Long id) { + final Product product = productRepository.findById(id) + .orElseThrow(ProductNotFoundException::new); + return ProductResponse.from(product); + } + + public ProductPageResponse findPage(final CategoryConstant categoryConstant, final Pageable pageable) { + if (Objects.isNull(categoryConstant)) { + return ProductPageResponse.from(productRepository.findPageBy(pageable)); + } + + final Category category = categoryConstant.toCategory(); + return ProductPageResponse.from(productRepository.findPageByCategory(category, pageable)); + } + + public ProductStatisticsResponse calculateMemberStatisticsById(final Long productId) { + if (!productRepository.existsById(productId)) { + throw new ProductNotFoundException(); + } + final Map careerLevel = calculateWithCareerLevel(productId); + final Map jobType = calculateWithJobType(productId); + return ProductStatisticsResponse.of(careerLevel, jobType); + } + + private Map calculateWithCareerLevel(final Long productId) { + final List careerLevelCounts = reviewRepository.findCareerLevelCountByProductId(productId); + final MemberInfoStatistics careerLevelStatistics = new MemberInfoStatistics<>( + careerLevelCounts); + return careerLevelStatistics.calculateStatistics(CareerLevel.values()); + } + + private Map calculateWithJobType(final Long productId) { + final List jobTypeCounts = reviewRepository.findJobTypeCountByProductId(productId); + final MemberInfoStatistics jobTypeStatistics = new MemberInfoStatistics<>(jobTypeCounts); + return jobTypeStatistics.calculateStatistics(JobType.values()); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/application/review/ReviewService.java b/backend/src/main/java/com/woowacourse/f12/application/review/ReviewService.java index 2eca4a23..e65b4f7b 100644 --- a/backend/src/main/java/com/woowacourse/f12/application/review/ReviewService.java +++ b/backend/src/main/java/com/woowacourse/f12/application/review/ReviewService.java @@ -4,8 +4,8 @@ import com.woowacourse.f12.domain.inventoryproduct.InventoryProductRepository; import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; import com.woowacourse.f12.domain.review.Review; import com.woowacourse.f12.domain.review.ReviewRepository; import com.woowacourse.f12.dto.request.review.ReviewRequest; @@ -13,8 +13,8 @@ import com.woowacourse.f12.dto.response.review.ReviewWithProductPageResponse; import com.woowacourse.f12.exception.badrequest.AlreadyWrittenReviewException; import com.woowacourse.f12.exception.forbidden.NotAuthorException; -import com.woowacourse.f12.exception.notfound.KeyboardNotFoundException; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; +import com.woowacourse.f12.exception.notfound.ProductNotFoundException; import com.woowacourse.f12.exception.notfound.ReviewNotFoundException; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; @@ -26,15 +26,15 @@ public class ReviewService { private final ReviewRepository reviewRepository; - private final KeyboardRepository keyboardRepository; + private final ProductRepository productRepository; private final MemberRepository memberRepository; private final InventoryProductRepository inventoryProductRepository; - public ReviewService(final ReviewRepository reviewRepository, final KeyboardRepository keyboardRepository, + public ReviewService(final ReviewRepository reviewRepository, final ProductRepository productRepository, final MemberRepository memberRepository, final InventoryProductRepository inventoryProductRepository) { this.reviewRepository = reviewRepository; - this.keyboardRepository = keyboardRepository; + this.productRepository = productRepository; this.memberRepository = memberRepository; this.inventoryProductRepository = inventoryProductRepository; } @@ -44,33 +44,33 @@ public Long saveReviewAndInventoryProduct(final Long productId, final Long membe final ReviewRequest reviewRequest) { final Member member = memberRepository.findById(memberId) .orElseThrow(MemberNotFoundException::new); - final Keyboard keyboard = keyboardRepository.findById(productId) - .orElseThrow(KeyboardNotFoundException::new); - final Long reviewId = saveReview(reviewRequest, member, keyboard); - saveInventoryProduct(memberId, keyboard); + final Product product = productRepository.findById(productId) + .orElseThrow(ProductNotFoundException::new); + final Long reviewId = saveReview(reviewRequest, member, product); + saveInventoryProduct(member, product); return reviewId; } - private Long saveReview(final ReviewRequest reviewRequest, final Member member, final Keyboard keyboard) { - validateNotWritten(member, keyboard); - final Review review = reviewRequest.toReview(keyboard, member); + private Long saveReview(final ReviewRequest reviewRequest, final Member member, final Product product) { + validateNotWritten(member, product); + final Review review = reviewRequest.toReview(product, member); return reviewRepository.save(review) .getId(); } - private void validateNotWritten(final Member member, final Keyboard keyboard) { - if (reviewRepository.existsByMemberAndKeyboard(member, keyboard)) { + private void validateNotWritten(final Member member, final Product product) { + if (reviewRepository.existsByMemberAndProduct(member, product)) { throw new AlreadyWrittenReviewException(); } } - private void saveInventoryProduct(final Long memberId, final Keyboard keyboard) { - if (inventoryProductRepository.existsByMemberIdAndKeyboard(memberId, keyboard)) { + private void saveInventoryProduct(final Member member, final Product product) { + if (inventoryProductRepository.existsByMemberAndProduct(member, product)) { return; } final InventoryProduct inventoryProduct = InventoryProduct.builder() - .memberId(memberId) - .keyboard(keyboard) + .member(member) + .product(product) .build(); inventoryProductRepository.save(inventoryProduct); } @@ -82,8 +82,8 @@ public ReviewPageResponse findPageByProductId(final Long productId, final Pageab } private void validateKeyboardExists(final Long productId) { - if (!keyboardRepository.existsById(productId)) { - throw new KeyboardNotFoundException(); + if (!productRepository.existsById(productId)) { + throw new ProductNotFoundException(); } } @@ -95,7 +95,7 @@ public ReviewWithProductPageResponse findPage(final Pageable pageable) { @Transactional public void update(final Long reviewId, final Long memberId, final ReviewRequest updateRequest) { final Review target = findTarget(reviewId, memberId); - final Review updateReview = updateRequest.toReview(target.getKeyboard(), target.getMember()); + final Review updateReview = updateRequest.toReview(target.getProduct(), target.getMember()); target.update(updateReview); } diff --git a/backend/src/main/java/com/woowacourse/f12/config/JpaConfig.java b/backend/src/main/java/com/woowacourse/f12/config/JpaConfig.java index 0d2436c2..4215f595 100644 --- a/backend/src/main/java/com/woowacourse/f12/config/JpaConfig.java +++ b/backend/src/main/java/com/woowacourse/f12/config/JpaConfig.java @@ -1,5 +1,9 @@ package com.woowacourse.f12.config; +import com.querydsl.jpa.impl.JPAQueryFactory; +import javax.persistence.EntityManager; +import javax.persistence.PersistenceContext; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.jpa.repository.config.EnableJpaAuditing; @@ -7,4 +11,11 @@ @EnableJpaAuditing public class JpaConfig { + @PersistenceContext + private EntityManager entityManager; + + @Bean + public JPAQueryFactory jpaQueryFactory() { + return new JPAQueryFactory(entityManager); + } } diff --git a/backend/src/main/java/com/woowacourse/f12/config/WebConfig.java b/backend/src/main/java/com/woowacourse/f12/config/WebConfig.java index 8500d361..6ddfba65 100644 --- a/backend/src/main/java/com/woowacourse/f12/config/WebConfig.java +++ b/backend/src/main/java/com/woowacourse/f12/config/WebConfig.java @@ -1,7 +1,10 @@ package com.woowacourse.f12.config; +import com.woowacourse.f12.presentation.ViewConstant; import java.util.List; import org.springframework.context.annotation.Configuration; +import org.springframework.core.convert.converter.Converter; +import org.springframework.format.FormatterRegistry; import org.springframework.http.HttpHeaders; import org.springframework.web.method.support.HandlerMethodArgumentResolver; import org.springframework.web.servlet.HandlerInterceptor; @@ -16,10 +19,13 @@ public class WebConfig implements WebMvcConfigurer { private final List interceptors; private final List resolvers; + private final List> converters; - public WebConfig(List interceptors, List resolvers) { + public WebConfig(final List interceptors, final List resolvers, + final List> converters) { this.interceptors = interceptors; this.resolvers = resolvers; + this.converters = converters; } @Override @@ -38,4 +44,9 @@ public void addCorsMappings(final CorsRegistry registry) { public void addArgumentResolvers(final List resolvers) { resolvers.addAll(this.resolvers); } + + @Override + public void addFormatters(final FormatterRegistry registry) { + converters.forEach(registry::addConverter); + } } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProduct.java b/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProduct.java index c9a502ad..db19b5e1 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProduct.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProduct.java @@ -1,6 +1,7 @@ package com.woowacourse.f12.domain.inventoryproduct; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.domain.product.Product; import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; @@ -26,22 +27,23 @@ public class InventoryProduct { @Column(name = "selected") private boolean selected; - @Column(name = "member_id") - private Long memberId; + @ManyToOne(fetch = FetchType.EAGER) + @JoinColumn(name = "product_id") + private Product product; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "keyboard_id") - private Keyboard keyboard; + @JoinColumn(name = "member_id") + private Member member; protected InventoryProduct() { } @Builder - private InventoryProduct(final Long id, final boolean selected, final Long memberId, final Keyboard keyboard) { + private InventoryProduct(final Long id, final boolean selected, final Member member, final Product product) { this.id = id; this.selected = selected; - this.memberId = memberId; - this.keyboard = keyboard; + this.member = member; + this.product = product; } public void updateSelected(boolean selected) { diff --git a/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepository.java b/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepository.java index a2b391c9..a34880ea 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepository.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepository.java @@ -1,12 +1,24 @@ package com.woowacourse.f12.domain.inventoryproduct; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.domain.product.Product; import java.util.List; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; public interface InventoryProductRepository extends JpaRepository { List findByMemberId(Long memberId); - boolean existsByMemberIdAndKeyboard(Long memberId, Keyboard keyboard); + boolean existsByMemberAndProduct(Member member, Product product); + + @Modifying(clearAutomatically = true) + @Query("update InventoryProduct i set i.selected = :selected where i.member = :member") + int updateBulkProfileProductByMember(Member member, boolean selected); + + @Modifying(clearAutomatically = true) + @Query("update InventoryProduct i set i.selected = :selected " + + "where i.member = :member and i.id in :selectedInventoryProductIds") + int updateBulkProfileProductByMemberAndIds(Member member, List selectedInventoryProductIds, boolean selected); } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/CareerLevel.java b/backend/src/main/java/com/woowacourse/f12/domain/member/CareerLevel.java index 4591201e..136872dc 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/member/CareerLevel.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/CareerLevel.java @@ -1,18 +1,9 @@ package com.woowacourse.f12.domain.member; -import lombok.Getter; +public enum CareerLevel implements MemberInfo { -@Getter -public enum CareerLevel { - - NONE("경력 없음"), - JUNIOR("0~2년차"), - MID_LEVEL("3~5년차"), - SENIOR("5년차 이상"); - - private final String value; - - CareerLevel(final String value) { - this.value = value; - } + NONE, + JUNIOR, + MID_LEVEL, + SENIOR; } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/JobType.java b/backend/src/main/java/com/woowacourse/f12/domain/member/JobType.java index dd8f5d88..111160fd 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/member/JobType.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/JobType.java @@ -3,16 +3,10 @@ import lombok.Getter; @Getter -public enum JobType { +public enum JobType implements MemberInfo { - FRONT_END("프론트엔드"), - BACK_END("백엔드"), - MOBILE("모바일 (안드로이드, iOS)"), - ETC("기타"); - - private final String value; - - JobType(final String value) { - this.value = value; - } + FRONTEND, + BACKEND, + MOBILE, + ETC; } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/Member.java b/backend/src/main/java/com/woowacourse/f12/domain/member/Member.java index d913da5c..8c0bef47 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/member/Member.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/Member.java @@ -1,6 +1,11 @@ package com.woowacourse.f12.domain.member; +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; +import com.woowacourse.f12.domain.product.Product; +import java.util.ArrayList; +import java.util.List; import java.util.Objects; +import java.util.stream.Collectors; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.EntityListeners; @@ -9,9 +14,11 @@ import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; +import javax.persistence.OneToMany; import javax.persistence.Table; import lombok.Builder; import lombok.Getter; +import org.hibernate.annotations.BatchSize; import org.springframework.data.jpa.domain.support.AuditingEntityListener; @Entity @@ -41,18 +48,24 @@ public class Member { @Enumerated(EnumType.STRING) private JobType jobType; + @BatchSize(size = 150) + @OneToMany(mappedBy = "member") + private List inventoryProducts = new ArrayList<>(); + protected Member() { } @Builder private Member(final Long id, final String gitHubId, final String name, final String imageUrl, - final CareerLevel careerLevel, final JobType jobType) { + final CareerLevel careerLevel, final JobType jobType, + final List inventoryProducts) { this.id = id; this.gitHubId = gitHubId; this.name = name; this.imageUrl = imageUrl; this.careerLevel = careerLevel; this.jobType = jobType; + this.inventoryProducts = inventoryProducts; } public void updateName(final String name) { @@ -71,6 +84,13 @@ public boolean isRegisterCompleted() { return Objects.nonNull(this.careerLevel) && Objects.nonNull(this.jobType); } + public List getProfileProducts() { + return this.inventoryProducts.stream() + .filter(InventoryProduct::isSelected) + .map(InventoryProduct::getProduct) + .collect(Collectors.toList()); + } + @Override public boolean equals(final Object o) { if (this == o) { diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/MemberInfo.java b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberInfo.java new file mode 100644 index 00000000..8e5b6ffc --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberInfo.java @@ -0,0 +1,5 @@ +package com.woowacourse.f12.domain.member; + +public interface MemberInfo { + +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepository.java b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepository.java index 051862c9..1bc2584d 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepository.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepository.java @@ -3,7 +3,7 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface MemberRepository extends JpaRepository { +public interface MemberRepository extends JpaRepository, MemberRepositoryCustom { Optional findByGitHubId(String gitHubId); } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepositoryCustom.java b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepositoryCustom.java new file mode 100644 index 00000000..c77f09c4 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepositoryCustom.java @@ -0,0 +1,9 @@ +package com.woowacourse.f12.domain.member; + +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; + +public interface MemberRepositoryCustom { + + Slice findBySearchConditions(String keyword, CareerLevel careerLevel, JobType jobType, Pageable pageable); +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepositoryCustomImpl.java b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepositoryCustomImpl.java new file mode 100644 index 00000000..b3b6efd8 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/member/MemberRepositoryCustomImpl.java @@ -0,0 +1,95 @@ +package com.woowacourse.f12.domain.member; + +import com.querydsl.core.types.Order; +import com.querydsl.core.types.OrderSpecifier; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.PathBuilder; +import com.querydsl.jpa.impl.JPAQuery; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; +import org.springframework.data.domain.SliceImpl; +import org.springframework.data.domain.Sort; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; + +import java.util.List; +import java.util.Objects; +import java.util.stream.Collectors; + +import static com.woowacourse.f12.domain.member.QMember.member; + +public class MemberRepositoryCustomImpl extends QuerydslRepositorySupport implements MemberRepositoryCustom { + + private final JPAQueryFactory jpaQueryFactory; + + public MemberRepositoryCustomImpl(final JPAQueryFactory jpaQueryFactory) { + super(Member.class); + this.jpaQueryFactory = jpaQueryFactory; + } + + public Slice findBySearchConditions(final String keyword, final CareerLevel careerLevel, + final JobType jobType, + final Pageable pageable) { + final JPAQuery jpaQuery = jpaQueryFactory.select(member) + .from(member) + .where( + containsKeyword(keyword), + eqCareerLevel(careerLevel), + eqJobType(jobType) + ) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize() + 1) + .orderBy(makeOrderSpecifiers(pageable)); + + return toSlice(pageable, jpaQuery.fetch()); + } + + private OrderSpecifier[] makeOrderSpecifiers(final Pageable pageable) { + return pageable.getSort() + .stream() + .map(this::toOrderSpecifier) + .collect(Collectors.toList()).toArray(OrderSpecifier[]::new); + } + + private OrderSpecifier toOrderSpecifier(final Sort.Order sortOrder) { + final Order orderMethod = toOrder(sortOrder); + final PathBuilder pathBuilder = new PathBuilder<>(member.getType(), member.getMetadata()); + return new OrderSpecifier(orderMethod, pathBuilder.get(sortOrder.getProperty())); + } + + private Order toOrder(final Sort.Order sortOrder) { + if (sortOrder.isAscending()) { + return Order.ASC; + } + return Order.DESC; + } + + private BooleanExpression containsKeyword(final String keyword) { + if (Objects.isNull(keyword) || keyword.isBlank()) { + return null; + } + return member.gitHubId.contains(keyword); + } + + private BooleanExpression eqCareerLevel(final CareerLevel careerLevel) { + if (Objects.isNull(careerLevel)) { + return null; + } + return member.careerLevel.eq(careerLevel); + } + + private BooleanExpression eqJobType(final JobType jobType) { + if (Objects.isNull(jobType)) { + return null; + } + return member.jobType.eq(jobType); + } + + private Slice toSlice(final Pageable pageable, final List members) { + if (members.size() > pageable.getPageSize()) { + members.remove(members.size() - 1); + return new SliceImpl<>(members, pageable, true); + } + return new SliceImpl<>(members, pageable, false); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/product/Category.java b/backend/src/main/java/com/woowacourse/f12/domain/product/Category.java new file mode 100644 index 00000000..8b0d0d7c --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/product/Category.java @@ -0,0 +1,9 @@ +package com.woowacourse.f12.domain.product; + +public enum Category { + KEYBOARD, + MOUSE, + MONITOR, + STAND, + SOFTWARE; +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/product/Keyboard.java b/backend/src/main/java/com/woowacourse/f12/domain/product/Product.java similarity index 71% rename from backend/src/main/java/com/woowacourse/f12/domain/product/Keyboard.java rename to backend/src/main/java/com/woowacourse/f12/domain/product/Product.java index 753a9907..bde487cb 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/product/Keyboard.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/product/Product.java @@ -3,6 +3,8 @@ import java.util.Objects; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; @@ -13,10 +15,10 @@ import org.hibernate.annotations.Formula; @Entity -@Table(name = "keyboard", uniqueConstraints = { +@Table(name = "product", uniqueConstraints = { @UniqueConstraint(name = "NAME_UNIQUE", columnNames = {"name"})}) @Getter -public class Keyboard { +public class Product { private static final int MAXIMUM_IMAGE_URL_LENGTH = 65535; @@ -36,14 +38,19 @@ public class Keyboard { @Formula("(SELECT IFNULL(AVG(r.rating), 0) FROM review r WHERE r.product_id = id)") private double rating; - protected Keyboard() { + @Column(name = "category", nullable = false) + @Enumerated(value = EnumType.STRING) + private Category category; + + protected Product() { } @Builder - private Keyboard(final Long id, final String name, final String imageUrl) { + private Product(final Long id, final String name, final String imageUrl, final Category category) { this.id = id; this.name = name; this.imageUrl = imageUrl; + this.category = category; } @Override @@ -51,11 +58,11 @@ public boolean equals(final Object o) { if (this == o) { return true; } - if (!(o instanceof Keyboard)) { + if (!(o instanceof Product)) { return false; } - final Keyboard keyboard = (Keyboard) o; - return Objects.equals(id, keyboard.getId()); + final Product product = (Product) o; + return Objects.equals(id, product.getId()); } @Override diff --git a/backend/src/main/java/com/woowacourse/f12/domain/product/KeyboardRepository.java b/backend/src/main/java/com/woowacourse/f12/domain/product/ProductRepository.java similarity index 50% rename from backend/src/main/java/com/woowacourse/f12/domain/product/KeyboardRepository.java rename to backend/src/main/java/com/woowacourse/f12/domain/product/ProductRepository.java index a2289e03..68d6dd70 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/product/KeyboardRepository.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/product/ProductRepository.java @@ -4,7 +4,9 @@ import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; -public interface KeyboardRepository extends JpaRepository { +public interface ProductRepository extends JpaRepository { - Slice findPageBy(Pageable pageable); + Slice findPageBy(Pageable pageable); + + Slice findPageByCategory(Category category, Pageable pageable); } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/CareerLevelCount.java b/backend/src/main/java/com/woowacourse/f12/domain/review/CareerLevelCount.java new file mode 100644 index 00000000..3fb860e3 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/CareerLevelCount.java @@ -0,0 +1,27 @@ +package com.woowacourse.f12.domain.review; + +import com.querydsl.core.annotations.QueryProjection; +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.MemberInfo; + +public class CareerLevelCount implements Countable { + + private final CareerLevel careerLevel; + private final long count; + + @QueryProjection + public CareerLevelCount(final CareerLevel careerLevel, final long count) { + this.careerLevel = careerLevel; + this.count = count; + } + + @Override + public MemberInfo getValue() { + return careerLevel; + } + + @Override + public long getCount() { + return count; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/Countable.java b/backend/src/main/java/com/woowacourse/f12/domain/review/Countable.java new file mode 100644 index 00000000..013e5123 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/Countable.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.domain.review; + +import com.woowacourse.f12.domain.member.MemberInfo; + +public interface Countable { + + MemberInfo getValue(); + + long getCount(); +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/JobTypeCount.java b/backend/src/main/java/com/woowacourse/f12/domain/review/JobTypeCount.java new file mode 100644 index 00000000..7d3f7f40 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/JobTypeCount.java @@ -0,0 +1,27 @@ +package com.woowacourse.f12.domain.review; + +import com.querydsl.core.annotations.QueryProjection; +import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.domain.member.MemberInfo; + +public class JobTypeCount implements Countable { + + private final JobType jobType; + private final long count; + + @QueryProjection + public JobTypeCount(final JobType jobType, final long count) { + this.jobType = jobType; + this.count = count; + } + + @Override + public MemberInfo getValue() { + return jobType; + } + + @Override + public long getCount() { + return count; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/MemberInfoStatistics.java b/backend/src/main/java/com/woowacourse/f12/domain/review/MemberInfoStatistics.java new file mode 100644 index 00000000..934eed8a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/MemberInfoStatistics.java @@ -0,0 +1,46 @@ +package com.woowacourse.f12.domain.review; + +import com.woowacourse.f12.domain.member.MemberInfo; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.function.Function; +import java.util.stream.Collectors; + +public class MemberInfoStatistics { + + private static final int DECIMAL_PLACE = 2; + private static final double DEFAULT_VALUE = 0.00; + private static final double DECIMAL = 10.0; + private final List elements; + + public MemberInfoStatistics(final List elements) { + this.elements = elements; + } + + public Map calculateStatistics(final T[] values) { + final long totalCount = calculateTotalCount(); + return Arrays.stream(values) + .collect(Collectors.toMap(Function.identity(), + memberInfo -> calculateProportion(memberInfo, totalCount))); + } + + private long calculateTotalCount() { + return elements.stream() + .mapToLong(Countable::getCount) + .sum(); + } + + private Double calculateProportion(final T t, final long totalCount) { + return elements.stream() + .filter(it -> it.getValue().equals(t)) + .findAny() + .map(countable -> round(countable.getCount() / (double) totalCount)) + .orElse(DEFAULT_VALUE); + } + + private double round(double number) { + final double operand = Math.pow(DECIMAL, DECIMAL_PLACE); + return Math.round(number * operand) / operand; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/Review.java b/backend/src/main/java/com/woowacourse/f12/domain/review/Review.java index d03ee0ad..4e1837d2 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/review/Review.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/Review.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.domain.review; import com.woowacourse.f12.domain.member.Member; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.product.Product; import com.woowacourse.f12.exception.badrequest.BlankContentException; import com.woowacourse.f12.exception.badrequest.InvalidContentLengthException; import com.woowacourse.f12.exception.badrequest.InvalidRatingValueException; @@ -44,7 +44,7 @@ public class Review { @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "product_id", nullable = false) - private Keyboard keyboard; + private Product product; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "member_id", nullable = false) @@ -58,14 +58,14 @@ protected Review() { } @Builder - private Review(final Long id, final String content, final int rating, final Keyboard keyboard, final Member member, + private Review(final Long id, final String content, final int rating, final Product product, final Member member, final LocalDateTime createdAt) { validateContent(content); validateRating(rating); this.id = id; this.content = content; this.rating = rating; - this.keyboard = keyboard; + this.product = product; this.member = member; this.createdAt = createdAt; } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepository.java b/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepository.java index dde42de8..0ce444c4 100644 --- a/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepository.java +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepository.java @@ -1,18 +1,18 @@ package com.woowacourse.f12.domain.review; import com.woowacourse.f12.domain.member.Member; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.product.Product; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; -public interface ReviewRepository extends JpaRepository { +public interface ReviewRepository extends JpaRepository, ReviewRepositoryCustom { - @Query("select r from Review r where r.keyboard.id = :productId") + @Query("select r from Review r where r.product.id = :productId") Slice findPageByProductId(Long productId, Pageable pageable); Slice findPageBy(Pageable pageable); - boolean existsByMemberAndKeyboard(Member member, Keyboard keyboard); + boolean existsByMemberAndProduct(Member member, Product product); } diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepositoryCustom.java b/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepositoryCustom.java new file mode 100644 index 00000000..d4b5948d --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepositoryCustom.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.domain.review; + +import java.util.List; + +public interface ReviewRepositoryCustom { + + List findCareerLevelCountByProductId(Long productId); + + List findJobTypeCountByProductId(Long productId); +} diff --git a/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepositoryCustomImpl.java b/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepositoryCustomImpl.java new file mode 100644 index 00000000..8bc8f357 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/domain/review/ReviewRepositoryCustomImpl.java @@ -0,0 +1,39 @@ +package com.woowacourse.f12.domain.review; + +import static com.woowacourse.f12.domain.member.QMember.member; +import static com.woowacourse.f12.domain.review.QReview.review; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import com.woowacourse.f12.domain.product.Product; +import java.util.List; +import org.springframework.data.jpa.repository.support.QuerydslRepositorySupport; + +public class ReviewRepositoryCustomImpl extends QuerydslRepositorySupport implements ReviewRepositoryCustom { + + private final JPAQueryFactory jpaQueryFactory; + + public ReviewRepositoryCustomImpl(final JPAQueryFactory jpaQueryFactory) { + super(Product.class); + this.jpaQueryFactory = jpaQueryFactory; + } + + @Override + public List findCareerLevelCountByProductId(final Long productId) { + return jpaQueryFactory.select(new QCareerLevelCount(member.careerLevel, member.id.count())) + .from(review) + .innerJoin(review.member, member) + .where(review.product.id.eq(productId)) + .groupBy(member.careerLevel) + .fetch(); + } + + @Override + public List findJobTypeCountByProductId(final Long productId) { + return jpaQueryFactory.select(new QJobTypeCount(member.jobType, member.id.count())) + .from(review) + .innerJoin(review.member, member) + .where(review.product.id.eq(productId)) + .groupBy(member.jobType) + .fetch(); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/request/inventoryproduct/ProfileProductRequest.java b/backend/src/main/java/com/woowacourse/f12/dto/request/inventoryproduct/ProfileProductRequest.java index 8749242b..17b1140e 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/request/inventoryproduct/ProfileProductRequest.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/request/inventoryproduct/ProfileProductRequest.java @@ -1,18 +1,19 @@ package com.woowacourse.f12.dto.request.inventoryproduct; +import java.util.List; +import javax.validation.constraints.NotNull; import lombok.Getter; @Getter public class ProfileProductRequest { - private Long selectedInventoryProductId; - private Long unselectedInventoryProductId; + @NotNull(message = "등록할 대표장비가 없습니다.") + private List selectedInventoryProductIds; private ProfileProductRequest() { } - public ProfileProductRequest(final Long selectedInventoryProductId, final Long unselectedInventoryProductId) { - this.selectedInventoryProductId = selectedInventoryProductId; - this.unselectedInventoryProductId = unselectedInventoryProductId; + public ProfileProductRequest(final List selectedInventoryProductIds) { + this.selectedInventoryProductIds = selectedInventoryProductIds; } } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberRequest.java b/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberRequest.java index ba017856..d9c95281 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberRequest.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberRequest.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.dto.request.member; -import com.woowacourse.f12.domain.member.CareerLevel; -import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.presentation.member.CareerLevelConstant; +import com.woowacourse.f12.presentation.member.JobTypeConstant; import javax.validation.constraints.NotNull; import lombok.Getter; @@ -9,15 +9,15 @@ public class MemberRequest { @NotNull(message = "직업 경력 내용이 없습니다.") - private CareerLevel careerLevel; + private CareerLevelConstant careerLevel; @NotNull(message = "직무 내용이 없습니다.") - private JobType jobType; + private JobTypeConstant jobType; private MemberRequest() { } - public MemberRequest(final CareerLevel careerLevel, final JobType jobType) { + public MemberRequest(final CareerLevelConstant careerLevel, final JobTypeConstant jobType) { this.careerLevel = careerLevel; this.jobType = jobType; } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberSearchRequest.java b/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberSearchRequest.java new file mode 100644 index 00000000..5630d098 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/request/member/MemberSearchRequest.java @@ -0,0 +1,23 @@ +package com.woowacourse.f12.dto.request.member; + +import com.woowacourse.f12.presentation.member.CareerLevelConstant; +import com.woowacourse.f12.presentation.member.JobTypeConstant; +import lombok.Getter; + +@Getter +public class MemberSearchRequest { + + private String query; + private CareerLevelConstant careerLevel; + private JobTypeConstant jobType; + + private MemberSearchRequest() { + } + + public MemberSearchRequest(final String query, final CareerLevelConstant careerLevel, + final JobTypeConstant jobType) { + this.query = query; + this.careerLevel = careerLevel; + this.jobType = jobType; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/request/review/ReviewRequest.java b/backend/src/main/java/com/woowacourse/f12/dto/request/review/ReviewRequest.java index b46eae0f..0ba8d45d 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/request/review/ReviewRequest.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/request/review/ReviewRequest.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.dto.request.review; import com.woowacourse.f12.domain.member.Member; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.product.Product; import com.woowacourse.f12.domain.review.Review; import javax.validation.constraints.NotNull; import lombok.Getter; @@ -23,9 +23,9 @@ public ReviewRequest(final String content, final Integer rating) { this.rating = rating; } - public Review toReview(final Keyboard keyboard, final Member member) { + public Review toReview(final Product product, final Member member) { return Review.builder() - .keyboard(keyboard) + .product(product) .member(member) .content(this.content) .rating(this.rating) diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/ExceptionResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/ExceptionResponse.java index 7a1bf4f5..71954c34 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/ExceptionResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/ExceptionResponse.java @@ -1,24 +1,28 @@ package com.woowacourse.f12.dto.response; +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; import lombok.Getter; @Getter public class ExceptionResponse { private String message; + private ErrorCode errorCode; private ExceptionResponse() { } - private ExceptionResponse(final String message) { + private ExceptionResponse(final String message, final ErrorCode errorCode) { this.message = message; + this.errorCode = errorCode; } - public static ExceptionResponse from(final Exception e) { - return new ExceptionResponse(e.getMessage()); + public static ExceptionResponse from(final CustomException e) { + return new ExceptionResponse(e.getMessage(), e.getErrorCode()); } - public static ExceptionResponse from(final String message) { - return new ExceptionResponse(message); + public static ExceptionResponse from(final String message, final ErrorCode errorCode) { + return new ExceptionResponse(message, errorCode); } } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/auth/LoginMemberResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/auth/LoginMemberResponse.java index 84c7289d..56be1dc1 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/auth/LoginMemberResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/auth/LoginMemberResponse.java @@ -24,13 +24,4 @@ private LoginMemberResponse(final Long id, final String gitHubId, final String n public static LoginMemberResponse from(final Member member) { return new LoginMemberResponse(member.getId(), member.getGitHubId(), member.getName(), member.getImageUrl()); } - - public Member toMember() { - return Member.builder() - .id(id) - .gitHubId(gitHubId) - .name(name) - .imageUrl(imageUrl) - .build(); - } } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductResponse.java index 8d71c4f6..7df16d68 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductResponse.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.dto.response.inventoryproduct; import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; import lombok.Getter; @Getter @@ -9,19 +9,19 @@ public class InventoryProductResponse { private Long id; private boolean selected; - private KeyboardResponse product; + private ProductResponse product; private InventoryProductResponse() { } - private InventoryProductResponse(final Long id, final boolean selected, final KeyboardResponse product) { + private InventoryProductResponse(final Long id, final boolean selected, final ProductResponse product) { this.id = id; this.selected = selected; this.product = product; } public static InventoryProductResponse from(final InventoryProduct inventoryProduct) { - final KeyboardResponse keyboardResponse = KeyboardResponse.from(inventoryProduct.getKeyboard()); - return new InventoryProductResponse(inventoryProduct.getId(), inventoryProduct.isSelected(), keyboardResponse); + final ProductResponse productResponse = ProductResponse.from(inventoryProduct.getProduct()); + return new InventoryProductResponse(inventoryProduct.getId(), inventoryProduct.isSelected(), productResponse); } } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductsResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductsResponse.java index 7796a238..28d34b1a 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductsResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/inventoryproduct/InventoryProductsResponse.java @@ -8,13 +8,13 @@ @Getter public class InventoryProductsResponse { - private List keyboards; + private List items; private InventoryProductsResponse() { } - private InventoryProductsResponse(final List keyboards) { - this.keyboards = keyboards; + private InventoryProductsResponse(final List items) { + this.items = items; } public static InventoryProductsResponse from(final List inventoryProducts) { diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberPageResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberPageResponse.java new file mode 100644 index 00000000..a17b68d0 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberPageResponse.java @@ -0,0 +1,30 @@ +package com.woowacourse.f12.dto.response.member; + +import com.woowacourse.f12.domain.member.Member; +import java.util.List; +import java.util.stream.Collectors; +import lombok.Getter; +import org.springframework.data.domain.Slice; + +@Getter +public class MemberPageResponse { + + private boolean hasNext; + private List items; + + private MemberPageResponse() { + } + + private MemberPageResponse(final boolean hasNext, final List items) { + this.hasNext = hasNext; + this.items = items; + } + + public static MemberPageResponse from(final Slice slice) { + final List items = slice.getContent() + .stream() + .map(MemberWithProfileProductResponse::from) + .collect(Collectors.toList()); + return new MemberPageResponse(slice.hasNext(), items); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberResponse.java index 88e65a35..05c744c2 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberResponse.java @@ -1,6 +1,8 @@ package com.woowacourse.f12.dto.response.member; import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.presentation.member.CareerLevelConstant; +import com.woowacourse.f12.presentation.member.JobTypeConstant; import lombok.Getter; @Getter @@ -10,14 +12,15 @@ public class MemberResponse { private String gitHubId; private String name; private String imageUrl; - private String careerLevel; - private String jobType; + private CareerLevelConstant careerLevel; + private JobTypeConstant jobType; private MemberResponse() { } - private MemberResponse(final Long id, final String gitHubId, final String name, final String imageUrl, - final String careerLevel, final String jobType) { + public MemberResponse(final Long id, final String gitHubId, final String name, final String imageUrl, + final CareerLevelConstant careerLevel, + final JobTypeConstant jobType) { this.id = id; this.gitHubId = gitHubId; this.name = name; @@ -28,6 +31,7 @@ private MemberResponse(final Long id, final String gitHubId, final String name, public static MemberResponse from(final Member member) { return new MemberResponse(member.getId(), member.getGitHubId(), member.getName(), member.getImageUrl(), - member.getCareerLevel().name(), member.getJobType().name()); + CareerLevelConstant.from(member.getCareerLevel()), + JobTypeConstant.from(member.getJobType())); } } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberWithProfileProductResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberWithProfileProductResponse.java new file mode 100644 index 00000000..4df632c1 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/member/MemberWithProfileProductResponse.java @@ -0,0 +1,47 @@ +package com.woowacourse.f12.dto.response.member; + +import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.presentation.member.CareerLevelConstant; +import com.woowacourse.f12.presentation.member.JobTypeConstant; +import java.util.List; +import java.util.stream.Collectors; +import lombok.Getter; + +@Getter +public class MemberWithProfileProductResponse { + + private Long id; + private String gitHubId; + private String name; + private String imageUrl; + private CareerLevelConstant careerLevel; + private JobTypeConstant jobType; + private List profileProducts; + + private MemberWithProfileProductResponse() { + } + + public MemberWithProfileProductResponse(final Long id, final String gitHubId, final String name, + final String imageUrl, + final CareerLevelConstant careerLevel, final JobTypeConstant jobType, + final List profileProducts) { + this.id = id; + this.gitHubId = gitHubId; + this.name = name; + this.imageUrl = imageUrl; + this.careerLevel = careerLevel; + this.jobType = jobType; + this.profileProducts = profileProducts; + } + + public static MemberWithProfileProductResponse from(final Member member) { + final List profileProducts = member.getProfileProducts() + .stream() + .map(ProductResponse::from) + .collect(Collectors.toList()); + return new MemberWithProfileProductResponse(member.getId(), member.getGitHubId(), member.getName(), + member.getImageUrl(), CareerLevelConstant.from(member.getCareerLevel()), + JobTypeConstant.from(member.getJobType()), profileProducts); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardForReviewResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardForReviewResponse.java deleted file mode 100644 index 6fd6e061..00000000 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardForReviewResponse.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.woowacourse.f12.dto.response.product; - -import com.woowacourse.f12.domain.product.Keyboard; -import lombok.Getter; - -@Getter -public class KeyboardForReviewResponse { - - private Long id; - private String name; - private String imageUrl; - - private KeyboardForReviewResponse() { - } - - private KeyboardForReviewResponse(final Long id, final String name, final String imageUrl) { - this.id = id; - this.name = name; - this.imageUrl = imageUrl; - } - - public static KeyboardForReviewResponse from(final Keyboard keyboard) { - return new KeyboardForReviewResponse(keyboard.getId(), keyboard.getName(), keyboard.getImageUrl()); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardPageResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardPageResponse.java deleted file mode 100644 index 4d7a1adb..00000000 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardPageResponse.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.woowacourse.f12.dto.response.product; - -import com.woowacourse.f12.domain.product.Keyboard; -import java.util.List; -import java.util.stream.Collectors; -import lombok.Getter; -import org.springframework.data.domain.Slice; - -@Getter -public class KeyboardPageResponse { - - private boolean hasNext; - private List items; - - private KeyboardPageResponse() { - } - - private KeyboardPageResponse(final boolean hasNext, final List items) { - this.hasNext = hasNext; - this.items = items; - } - - public static KeyboardPageResponse from(final Slice slice) { - final List keyboards = slice.getContent() - .stream() - .map(KeyboardResponse::from) - .collect(Collectors.toList()); - return new KeyboardPageResponse(slice.hasNext(), keyboards); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardResponse.java deleted file mode 100644 index 13b8cfb3..00000000 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/product/KeyboardResponse.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.woowacourse.f12.dto.response.product; - -import com.woowacourse.f12.domain.product.Keyboard; -import lombok.Getter; - -@Getter -public class KeyboardResponse { - - private Long id; - private String name; - private String imageUrl; - private int reviewCount; - private double rating; - - private KeyboardResponse() { - } - - private KeyboardResponse(final Long id, final String name, final String imageUrl, final int reviewCount, - final double rating) { - this.id = id; - this.name = name; - this.imageUrl = imageUrl; - this.reviewCount = reviewCount; - this.rating = rating; - } - - public static KeyboardResponse from(final Keyboard keyboard) { - return new KeyboardResponse( - keyboard.getId(), - keyboard.getName(), - keyboard.getImageUrl(), - keyboard.getReviewCount(), - keyboard.getRating() - ); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductForReviewResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductForReviewResponse.java new file mode 100644 index 00000000..e5543eab --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductForReviewResponse.java @@ -0,0 +1,25 @@ +package com.woowacourse.f12.dto.response.product; + +import com.woowacourse.f12.domain.product.Product; +import lombok.Getter; + +@Getter +public class ProductForReviewResponse { + + private Long id; + private String name; + private String imageUrl; + + private ProductForReviewResponse() { + } + + private ProductForReviewResponse(final Long id, final String name, final String imageUrl) { + this.id = id; + this.name = name; + this.imageUrl = imageUrl; + } + + public static ProductForReviewResponse from(final Product product) { + return new ProductForReviewResponse(product.getId(), product.getName(), product.getImageUrl()); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductPageResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductPageResponse.java new file mode 100644 index 00000000..2df768aa --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductPageResponse.java @@ -0,0 +1,30 @@ +package com.woowacourse.f12.dto.response.product; + +import com.woowacourse.f12.domain.product.Product; +import java.util.List; +import java.util.stream.Collectors; +import lombok.Getter; +import org.springframework.data.domain.Slice; + +@Getter +public class ProductPageResponse { + + private boolean hasNext; + private List items; + + private ProductPageResponse() { + } + + private ProductPageResponse(final boolean hasNext, final List items) { + this.hasNext = hasNext; + this.items = items; + } + + public static ProductPageResponse from(final Slice slice) { + final List productResponses = slice.getContent() + .stream() + .map(ProductResponse::from) + .collect(Collectors.toList()); + return new ProductPageResponse(slice.hasNext(), productResponses); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductResponse.java new file mode 100644 index 00000000..0abe2f18 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductResponse.java @@ -0,0 +1,40 @@ +package com.woowacourse.f12.dto.response.product; + +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.presentation.product.CategoryConstant; +import lombok.Getter; + +@Getter +public class ProductResponse { + + private Long id; + private String name; + private String imageUrl; + private int reviewCount; + private double rating; + private CategoryConstant category; + + private ProductResponse() { + } + + private ProductResponse(final Long id, final String name, final String imageUrl, final int reviewCount, + final double rating, final CategoryConstant category) { + this.id = id; + this.name = name; + this.imageUrl = imageUrl; + this.reviewCount = reviewCount; + this.rating = rating; + this.category = category; + } + + public static ProductResponse from(final Product product) { + return new ProductResponse( + product.getId(), + product.getName(), + product.getImageUrl(), + product.getReviewCount(), + product.getRating(), + CategoryConstant.from(product.getCategory()) + ); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductStatisticsResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductStatisticsResponse.java new file mode 100644 index 00000000..557ee985 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/product/ProductStatisticsResponse.java @@ -0,0 +1,37 @@ +package com.woowacourse.f12.dto.response.product; + +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.presentation.member.CareerLevelConstant; +import com.woowacourse.f12.presentation.member.JobTypeConstant; +import java.util.Map; +import java.util.Map.Entry; +import java.util.stream.Collectors; +import lombok.Getter; + +@Getter +public class ProductStatisticsResponse { + + private Map careerLevel; + private Map jobType; + + private ProductStatisticsResponse() { + } + + private ProductStatisticsResponse(final Map careerLevel, + final Map jobType) { + this.careerLevel = careerLevel; + this.jobType = jobType; + } + + public static ProductStatisticsResponse of(final Map enumCareerLevel, + final Map enumJobType) { + final Map careerLevel = enumCareerLevel.entrySet() + .stream() + .collect(Collectors.toMap(entry -> CareerLevelConstant.from(entry.getKey()), Entry::getValue)); + final Map jobType = enumJobType.entrySet() + .stream() + .collect(Collectors.toMap(entry -> JobTypeConstant.from(entry.getKey()), Entry::getValue)); + return new ProductStatisticsResponse(careerLevel, jobType); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewResponse.java index fcde72f4..72b0ca77 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewResponse.java @@ -28,7 +28,7 @@ private ReviewResponse(final Long id, final ReviewAuthorResponse author, final L public static ReviewResponse from(final Review review) { final ReviewAuthorResponse author = ReviewAuthorResponse.from(review.getMember()); - return new ReviewResponse(review.getId(), author, review.getKeyboard().getId(), review.getContent(), + return new ReviewResponse(review.getId(), author, review.getProduct().getId(), review.getContent(), review.getRating(), review.getCreatedAt().toString()); } } diff --git a/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewWithProductResponse.java b/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewWithProductResponse.java index ae7e8e1a..e1c0deb9 100644 --- a/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewWithProductResponse.java +++ b/backend/src/main/java/com/woowacourse/f12/dto/response/review/ReviewWithProductResponse.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.dto.response.review; import com.woowacourse.f12.domain.review.Review; -import com.woowacourse.f12.dto.response.product.KeyboardForReviewResponse; +import com.woowacourse.f12.dto.response.product.ProductForReviewResponse; import lombok.Getter; @Getter @@ -9,7 +9,7 @@ public class ReviewWithProductResponse { private Long id; private ReviewAuthorResponse author; - private KeyboardForReviewResponse product; + private ProductForReviewResponse product; private String content; private int rating; private String createdAt; @@ -18,7 +18,7 @@ private ReviewWithProductResponse() { } private ReviewWithProductResponse(final Long id, final ReviewAuthorResponse author, - final KeyboardForReviewResponse product, + final ProductForReviewResponse product, final String content, final int rating, final String createdAt) { this.id = id; this.author = author; @@ -29,7 +29,7 @@ private ReviewWithProductResponse(final Long id, final ReviewAuthorResponse auth } public static ReviewWithProductResponse from(final Review review) { - final KeyboardForReviewResponse product = KeyboardForReviewResponse.from(review.getKeyboard()); + final ProductForReviewResponse product = ProductForReviewResponse.from(review.getProduct()); final ReviewAuthorResponse author = ReviewAuthorResponse.from(review.getMember()); return new ReviewWithProductResponse(review.getId(), author, product, review.getContent(), review.getRating(), review.getCreatedAt().toString()); diff --git a/backend/src/main/java/com/woowacourse/f12/exception/CustomException.java b/backend/src/main/java/com/woowacourse/f12/exception/CustomException.java new file mode 100644 index 00000000..df73e314 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/CustomException.java @@ -0,0 +1,14 @@ +package com.woowacourse.f12.exception; + +import lombok.Getter; + +@Getter +public class CustomException extends RuntimeException { + + private final ErrorCode errorCode; + + public CustomException(final ErrorCode errorCode, final String message) { + super(message); + this.errorCode = errorCode; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/ErrorCode.java b/backend/src/main/java/com/woowacourse/f12/exception/ErrorCode.java new file mode 100644 index 00000000..f7475a1e --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/ErrorCode.java @@ -0,0 +1,35 @@ +package com.woowacourse.f12.exception; + +import com.fasterxml.jackson.annotation.JsonValue; + +public enum ErrorCode { + + INVALID_SEARCH_PARAM("40000"), + INVALID_REQUEST_BODY("40001"), + INVALID_TOKEN("40002"), + DUPLICATED_CONTENT("40003"), + BLANK_CONTENT("40004"), + NOT_ENOUGH_DATA("40005"), + + TOKEN_NOT_EXISTS("40100"), + TOKEN_EXPIRED("40101"), + TOKEN_INVALID("40102"), + + PERMISSION_DENIED("40300"), + + DATA_NOT_FOUND("40400"), + + INTERNAL_SERVER_ERROR("50000"), + EXTERNAL_SERVER_ERROR("50001"); + + private final String value; + + ErrorCode(final String value) { + this.value = value; + } + + @JsonValue + public String getValue() { + return value; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/AlreadyWrittenReviewException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/AlreadyWrittenReviewException.java index 9c5f8160..5e6ac3bf 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/AlreadyWrittenReviewException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/AlreadyWrittenReviewException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.DUPLICATED_CONTENT; + public class AlreadyWrittenReviewException extends InvalidValueException { public AlreadyWrittenReviewException() { - super("해당 제품에 대해 이미 리뷰가 작성되어 있습니다."); + super(DUPLICATED_CONTENT, "해당 제품에 대해 이미 리뷰가 작성되어 있습니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/BlankContentException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/BlankContentException.java index 6108eb39..411863e7 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/BlankContentException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/BlankContentException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.BLANK_CONTENT; + public class BlankContentException extends InvalidValueException { public BlankContentException() { - super("리뷰 내용은 공백이 될 수 없습니다."); + super(BLANK_CONTENT, "리뷰 내용은 공백이 될 수 없습니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/DuplicatedProfileProductCategoryException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/DuplicatedProfileProductCategoryException.java new file mode 100644 index 00000000..4037beef --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/DuplicatedProfileProductCategoryException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.badrequest; + +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; + +public class DuplicatedProfileProductCategoryException extends InvalidValueException { + + public DuplicatedProfileProductCategoryException() { + super(INVALID_REQUEST_BODY, "대표장비는 카테고리가 중복될 수 없습니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidCareerLevelException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidCareerLevelException.java new file mode 100644 index 00000000..fc78440a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidCareerLevelException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.badrequest; + +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + +public class InvalidCareerLevelException extends InvalidValueException { + + public InvalidCareerLevelException() { + super(INVALID_SEARCH_PARAM, "올바르지 않은 연차 입력입니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidCategoryValueException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidCategoryValueException.java new file mode 100644 index 00000000..777a46b7 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidCategoryValueException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.badrequest; + +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + +public class InvalidCategoryValueException extends InvalidValueException { + + public InvalidCategoryValueException() { + super(INVALID_SEARCH_PARAM, "잘못된 카테고리입니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidContentLengthException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidContentLengthException.java index f772b262..37450568 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidContentLengthException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidContentLengthException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; + public class InvalidContentLengthException extends InvalidValueException { public InvalidContentLengthException(final int maxLength) { - super("내용의 길이는 " + maxLength + "자 이하 여야 합니다."); + super(INVALID_REQUEST_BODY, "내용의 길이는 " + maxLength + "자 이하 여야 합니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidGitHubLoginException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidGitHubLoginException.java index defcd6eb..0e1b42d2 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidGitHubLoginException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidGitHubLoginException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + public class InvalidGitHubLoginException extends InvalidValueException { public InvalidGitHubLoginException() { - super("잘못된 GitHub 로그인 요청입니다."); + super(INVALID_SEARCH_PARAM, "잘못된 GitHub 로그인 요청입니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidJobTypeException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidJobTypeException.java new file mode 100644 index 00000000..943429d7 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidJobTypeException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.badrequest; + +import com.woowacourse.f12.exception.ErrorCode; + +public class InvalidJobTypeException extends InvalidValueException { + + public InvalidJobTypeException() { + super(ErrorCode.INVALID_SEARCH_PARAM, "올바르지 않은 직군 입력입니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageNumberFormatException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageNumberFormatException.java index a6f8b220..051bd5b6 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageNumberFormatException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageNumberFormatException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + public class InvalidPageNumberFormatException extends InvalidValueException { public InvalidPageNumberFormatException() { - super("페이지 번호는 숫자 형식이여야 합니다."); + super(INVALID_SEARCH_PARAM, "페이지 번호는 숫자 형식이여야 합니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeException.java index 3751a208..4f70f025 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + public class InvalidPageSizeException extends InvalidValueException { public InvalidPageSizeException(int maxSize) { - super("페이지의 크기는" + maxSize + "이하여야 합니다."); + super(INVALID_SEARCH_PARAM, "페이지의 크기는" + maxSize + "이하여야 합니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeFormatException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeFormatException.java index 4a53bc0b..e7a86ced 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeFormatException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidPageSizeFormatException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + public class InvalidPageSizeFormatException extends InvalidValueException { public InvalidPageSizeFormatException() { - super("패이지 크기는 숫자 형식이어야 합니다."); + super(INVALID_SEARCH_PARAM, "패이지 크기는 숫자 형식이어야 합니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileArgumentException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileArgumentException.java index d9db4344..b96bb40a 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileArgumentException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileArgumentException.java @@ -1,9 +1,11 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.NOT_ENOUGH_DATA; + public class InvalidProfileArgumentException extends InvalidValueException { public InvalidProfileArgumentException() { - super("추가 정보가 등록되지 않았습니다."); + super(NOT_ENOUGH_DATA, "추가 정보가 등록되지 않았습니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductCategoryException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductCategoryException.java new file mode 100644 index 00000000..283cdc9a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductCategoryException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.badrequest; + +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; + +public class InvalidProfileProductCategoryException extends InvalidValueException { + + public InvalidProfileProductCategoryException() { + super(INVALID_REQUEST_BODY, "대표장비로 등록할 수 없는 카테고리입니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductException.java index 7a8a67de..ba801e11 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidProfileProductException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; + public class InvalidProfileProductException extends InvalidValueException { public InvalidProfileProductException() { - super("유효하지 않은 대표 장비 수정 요청입니다."); + super(INVALID_REQUEST_BODY, "유효하지 않은 대표 장비 수정 요청입니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidRatingValueException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidRatingValueException.java index c17f1c87..733673d0 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidRatingValueException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidRatingValueException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.badrequest; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; + public class InvalidRatingValueException extends InvalidValueException { public InvalidRatingValueException() { - super("평점은 1에서 5 사이여야 합니다."); + super(INVALID_REQUEST_BODY, "평점은 1에서 5 사이여야 합니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidValueException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidValueException.java index f383ee21..10fbc388 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidValueException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/InvalidValueException.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.exception.badrequest; -public class InvalidValueException extends RuntimeException { +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; - public InvalidValueException(final String message) { - super(message); +public class InvalidValueException extends CustomException { + + public InvalidValueException(final ErrorCode errorCode, final String message) { + super(errorCode, message); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/badrequest/NotUpdatableException.java b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/NotUpdatableException.java new file mode 100644 index 00000000..cb486745 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/badrequest/NotUpdatableException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.badrequest; + +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; + +public class NotUpdatableException extends InvalidValueException { + + public NotUpdatableException() { + super(INVALID_REQUEST_BODY, "요청된 업데이트 개수와 실행된 업데이트의 수가 다릅니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/forbidden/ForbiddenMemberException.java b/backend/src/main/java/com/woowacourse/f12/exception/forbidden/ForbiddenMemberException.java index 716cb257..5890d243 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/forbidden/ForbiddenMemberException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/forbidden/ForbiddenMemberException.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.exception.forbidden; -public class ForbiddenMemberException extends RuntimeException { +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; - public ForbiddenMemberException(final String message) { - super(message); +public class ForbiddenMemberException extends CustomException { + + public ForbiddenMemberException(final ErrorCode errorCode, final String message) { + super(errorCode, message); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/forbidden/NotAuthorException.java b/backend/src/main/java/com/woowacourse/f12/exception/forbidden/NotAuthorException.java index 35a7128c..c0c5628e 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/forbidden/NotAuthorException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/forbidden/NotAuthorException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.forbidden; +import static com.woowacourse.f12.exception.ErrorCode.PERMISSION_DENIED; + public class NotAuthorException extends ForbiddenMemberException { public NotAuthorException() { - super("리뷰의 작성자가 아닙니다."); + super(PERMISSION_DENIED, "리뷰의 작성자가 아닙니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/internalserver/ExternalServerException.java b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/ExternalServerException.java index c44cc5bb..c4d13f97 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/internalserver/ExternalServerException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/ExternalServerException.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.exception.internalserver; -public class ExternalServerException extends RuntimeException { +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; - public ExternalServerException(final String message) { - super(message); +public class ExternalServerException extends CustomException { + + public ExternalServerException(final ErrorCode errorCode, final String message) { + super(errorCode, message); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/internalserver/GitHubServerException.java b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/GitHubServerException.java index 579c7e26..ae7999e2 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/internalserver/GitHubServerException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/GitHubServerException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.internalserver; +import static com.woowacourse.f12.exception.ErrorCode.EXTERNAL_SERVER_ERROR; + public class GitHubServerException extends ExternalServerException { public GitHubServerException() { - super("GitHub 서버에 문제가 있습니다."); + super(EXTERNAL_SERVER_ERROR, "GitHub 서버에 문제가 있습니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/internalserver/InternalServerException.java b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/InternalServerException.java new file mode 100644 index 00000000..b88a7015 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/InternalServerException.java @@ -0,0 +1,11 @@ +package com.woowacourse.f12.exception.internalserver; + +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; + +public class InternalServerException extends CustomException { + + public InternalServerException(final ErrorCode errorCode, final String message) { + super(errorCode, message); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/internalserver/SqlUpdateException.java b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/SqlUpdateException.java new file mode 100644 index 00000000..86050970 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/internalserver/SqlUpdateException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.internalserver; + +import com.woowacourse.f12.exception.ErrorCode; + +public class SqlUpdateException extends InternalServerException { + + public SqlUpdateException() { + super(ErrorCode.INTERNAL_SERVER_ERROR, "요청된 업데이트 개수와 실행된 업데이트의 수가 다릅니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/InventoryItemNotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/InventoryItemNotFoundException.java deleted file mode 100644 index 2756c6ce..00000000 --- a/backend/src/main/java/com/woowacourse/f12/exception/notfound/InventoryItemNotFoundException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.woowacourse.f12.exception.notfound; - -public class InventoryItemNotFoundException extends NotFoundException { - - public InventoryItemNotFoundException() { - super("등록 장비를 찾을 수 없습니다."); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/InventoryProductNotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/InventoryProductNotFoundException.java new file mode 100644 index 00000000..690fa9e9 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/notfound/InventoryProductNotFoundException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.notfound; + +import static com.woowacourse.f12.exception.ErrorCode.DATA_NOT_FOUND; + +public class InventoryProductNotFoundException extends NotFoundException { + + public InventoryProductNotFoundException() { + super(DATA_NOT_FOUND, "등록 장비를 찾을 수 없습니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/KeyboardNotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/KeyboardNotFoundException.java deleted file mode 100644 index ba10aa49..00000000 --- a/backend/src/main/java/com/woowacourse/f12/exception/notfound/KeyboardNotFoundException.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.woowacourse.f12.exception.notfound; - -public class KeyboardNotFoundException extends NotFoundException { - - public KeyboardNotFoundException() { - super("키보드를 찾을 수 없습니다."); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/MemberNotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/MemberNotFoundException.java index 3223210e..777709b9 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/notfound/MemberNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/notfound/MemberNotFoundException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.notfound; +import static com.woowacourse.f12.exception.ErrorCode.DATA_NOT_FOUND; + public class MemberNotFoundException extends NotFoundException { public MemberNotFoundException() { - super("회원을 찾을 수 없습니다."); + super(DATA_NOT_FOUND, "회원을 찾을 수 없습니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/NotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/NotFoundException.java index 95240c66..9a51d31d 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/notfound/NotFoundException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/notfound/NotFoundException.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.exception.notfound; -public class NotFoundException extends RuntimeException { +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; - public NotFoundException(final String message) { - super(message); +public class NotFoundException extends CustomException { + + public NotFoundException(final ErrorCode errorCode, final String message) { + super(errorCode, message); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/ProductNotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/ProductNotFoundException.java new file mode 100644 index 00000000..54270ba3 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/notfound/ProductNotFoundException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.notfound; + +import static com.woowacourse.f12.exception.ErrorCode.DATA_NOT_FOUND; + +public class ProductNotFoundException extends NotFoundException { + + public ProductNotFoundException() { + super(DATA_NOT_FOUND, "제품을 찾을 수 없습니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/notfound/ReviewNotFoundException.java b/backend/src/main/java/com/woowacourse/f12/exception/notfound/ReviewNotFoundException.java index 3368358f..55c3a949 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/notfound/ReviewNotFoundException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/notfound/ReviewNotFoundException.java @@ -1,8 +1,10 @@ package com.woowacourse.f12.exception.notfound; +import static com.woowacourse.f12.exception.ErrorCode.DATA_NOT_FOUND; + public class ReviewNotFoundException extends NotFoundException { public ReviewNotFoundException() { - super("리뷰를 찾을 수 없습니다."); + super(DATA_NOT_FOUND, "리뷰를 찾을 수 없습니다."); } } diff --git a/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenExpiredException.java b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenExpiredException.java new file mode 100644 index 00000000..e1457d9d --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenExpiredException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.unauthorized; + +import static com.woowacourse.f12.exception.ErrorCode.TOKEN_EXPIRED; + +public class TokenExpiredException extends UnauthorizedException { + + public TokenExpiredException() { + super(TOKEN_EXPIRED, "토큰이 만료됐습니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenInvalidException.java b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenInvalidException.java new file mode 100644 index 00000000..c8133a0d --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenInvalidException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.unauthorized; + +import static com.woowacourse.f12.exception.ErrorCode.TOKEN_INVALID; + +public class TokenInvalidException extends UnauthorizedException { + + public TokenInvalidException() { + super(TOKEN_INVALID, "토큰이 잘못된 형식입니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenNotExistsException.java b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenNotExistsException.java new file mode 100644 index 00000000..06f92411 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/TokenNotExistsException.java @@ -0,0 +1,10 @@ +package com.woowacourse.f12.exception.unauthorized; + +import static com.woowacourse.f12.exception.ErrorCode.TOKEN_NOT_EXISTS; + +public class TokenNotExistsException extends UnauthorizedException { + + public TokenNotExistsException() { + super(TOKEN_NOT_EXISTS, "토큰이 존재하지 않습니다."); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/UnauthorizedException.java b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/UnauthorizedException.java index c7feccb1..d2b83964 100644 --- a/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/UnauthorizedException.java +++ b/backend/src/main/java/com/woowacourse/f12/exception/unauthorized/UnauthorizedException.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.exception.unauthorized; -public class UnauthorizedException extends RuntimeException { +import com.woowacourse.f12.exception.CustomException; +import com.woowacourse.f12.exception.ErrorCode; - public UnauthorizedException() { - super("로그인이 필요합니다."); +public class UnauthorizedException extends CustomException { + + public UnauthorizedException(final ErrorCode errorCode, final String message) { + super(errorCode, message); } } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolver.java b/backend/src/main/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolver.java index dc6c9b2e..4f17270d 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolver.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolver.java @@ -7,7 +7,9 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.springframework.core.MethodParameter; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Sort; import org.springframework.data.web.PageableHandlerMethodArgumentResolver; import org.springframework.stereotype.Component; import org.springframework.web.bind.support.WebDataBinderFactory; @@ -32,7 +34,13 @@ public Pageable resolveArgument(final MethodParameter methodParameter, final Mod validatePage(pageArgument); final String sizeArgument = webRequest.getParameter("size"); validateSize(sizeArgument); - return super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); + final Pageable pageable = super.resolveArgument(methodParameter, mavContainer, webRequest, binderFactory); + return addSecondarySortById(pageable); + } + + private Pageable addSecondarySortById(final Pageable pageable) { + final Sort sort = pageable.getSort().and(Sort.by("id").descending()); + return PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort); } private void validatePage(final String pageArgument) { diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/GlobalExceptionHandler.java b/backend/src/main/java/com/woowacourse/f12/presentation/GlobalExceptionHandler.java index 299acbdc..6cdd3ee8 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/GlobalExceptionHandler.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/GlobalExceptionHandler.java @@ -1,17 +1,26 @@ package com.woowacourse.f12.presentation; +import static com.woowacourse.f12.exception.ErrorCode.INTERNAL_SERVER_ERROR; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_REQUEST_BODY; +import static com.woowacourse.f12.exception.ErrorCode.INVALID_SEARCH_PARAM; + import com.woowacourse.f12.dto.response.ExceptionResponse; -import com.woowacourse.f12.exception.forbidden.ForbiddenMemberException; +import com.woowacourse.f12.exception.CustomException; import com.woowacourse.f12.exception.badrequest.InvalidValueException; +import com.woowacourse.f12.exception.forbidden.ForbiddenMemberException; +import com.woowacourse.f12.exception.internalserver.ExternalServerException; +import com.woowacourse.f12.exception.internalserver.InternalServerException; import com.woowacourse.f12.exception.notfound.NotFoundException; import com.woowacourse.f12.exception.unauthorized.UnauthorizedException; import lombok.extern.slf4j.Slf4j; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.http.converter.HttpMessageNotReadableException; +import org.springframework.validation.BindException; import org.springframework.web.bind.MethodArgumentNotValidException; import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.RestControllerAdvice; +import org.springframework.web.method.annotation.MethodArgumentTypeMismatchException; @Slf4j @RestControllerAdvice @@ -19,44 +28,65 @@ public class GlobalExceptionHandler { private static final String REQUEST_DATA_FORMAT_ERROR_MESSAGE = "요청으로 넘어온 값이 형식에 맞지 않습니다."; private static final String INTERNAL_SERVER_ERROR_MESSAGE = "서버 오류가 발생했습니다"; + private static final String LOG_FORMAT = "Class : {}, Code : {}, Message : {}"; @ExceptionHandler(NotFoundException.class) public ResponseEntity handleNotFoundException(final NotFoundException e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), e.getErrorCode().getValue(), e.getMessage()); return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ExceptionResponse.from(e)); } @ExceptionHandler(InvalidValueException.class) public ResponseEntity handleInvalidValueException(final InvalidValueException e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), e.getErrorCode().getValue(), e.getMessage()); return ResponseEntity.badRequest().body(ExceptionResponse.from(e)); } @ExceptionHandler(HttpMessageNotReadableException.class) - public ResponseEntity handleHttpMessageNotReadableException() { - return ResponseEntity.badRequest().body(ExceptionResponse.from(REQUEST_DATA_FORMAT_ERROR_MESSAGE)); + public ResponseEntity handleHttpMessageNotReadableException(HttpMessageNotReadableException e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), INVALID_REQUEST_BODY.getValue(), e.getMessage()); + return ResponseEntity.badRequest() + .body(ExceptionResponse.from(REQUEST_DATA_FORMAT_ERROR_MESSAGE, INVALID_REQUEST_BODY)); + } + + @ExceptionHandler({BindException.class, MethodArgumentTypeMismatchException.class}) + public ResponseEntity handleInvalidQueryParameterException(Exception e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), INVALID_SEARCH_PARAM.getValue(), e.getMessage()); + return ResponseEntity.badRequest() + .body(ExceptionResponse.from(REQUEST_DATA_FORMAT_ERROR_MESSAGE, INVALID_SEARCH_PARAM)); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleValidationException( - final MethodArgumentNotValidException exception) { + final MethodArgumentNotValidException e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), INVALID_REQUEST_BODY.getValue(), e.getMessage()); final StringBuilder stringBuilder = new StringBuilder(); - exception.getBindingResult().getAllErrors().forEach((error) -> stringBuilder.append(error.getDefaultMessage()) + e.getBindingResult().getAllErrors().forEach((error) -> stringBuilder.append(error.getDefaultMessage()) .append(System.lineSeparator())); - return ResponseEntity.badRequest().body(ExceptionResponse.from(stringBuilder.toString())); + return ResponseEntity.badRequest().body(ExceptionResponse.from(stringBuilder.toString(), INVALID_REQUEST_BODY)); } @ExceptionHandler(UnauthorizedException.class) public ResponseEntity handleUnauthorizedException(final UnauthorizedException e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), e.getErrorCode().getValue(), e.getMessage()); return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(ExceptionResponse.from(e)); } @ExceptionHandler(ForbiddenMemberException.class) public ResponseEntity handleForbiddenMemberException(final ForbiddenMemberException e) { + log.info(LOG_FORMAT, e.getClass().getSimpleName(), e.getErrorCode().getValue(), e.getMessage()); return ResponseEntity.status(HttpStatus.FORBIDDEN).body(ExceptionResponse.from(e)); } + @ExceptionHandler({ExternalServerException.class, InternalServerException.class}) + public ResponseEntity handleInternalException(final CustomException e) { + return ResponseEntity.internalServerError().body(ExceptionResponse.from(e)); + } + @ExceptionHandler(Exception.class) public ResponseEntity handleUnhandledException(final Exception e) { - log.error("[ERROR]", e); - return ResponseEntity.internalServerError().body(ExceptionResponse.from(INTERNAL_SERVER_ERROR_MESSAGE)); + log.warn(LOG_FORMAT, e.getClass().getSimpleName(), INTERNAL_SERVER_ERROR.getValue(), e.getMessage()); + return ResponseEntity.internalServerError() + .body(ExceptionResponse.from(INTERNAL_SERVER_ERROR_MESSAGE, INTERNAL_SERVER_ERROR)); } } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/LogInterceptor.java b/backend/src/main/java/com/woowacourse/f12/presentation/LogInterceptor.java new file mode 100644 index 00000000..0f2a8871 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/LogInterceptor.java @@ -0,0 +1,35 @@ +package com.woowacourse.f12.presentation; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.util.ContentCachingRequestWrapper; +import org.springframework.web.util.ContentCachingResponseWrapper; + +@Slf4j +@Component +public class LogInterceptor implements HandlerInterceptor { + + private static final String REQUEST_LOG_FORMAT = "METHOD: {}, URL : {}, AUTHORIZATION : {}, BODY : {}"; + private static final String RESPONSE_LOG_FORMAT = "STATUS_CODE: {}, BODY : {}"; + + @Override + public boolean preHandle(final HttpServletRequest request, final HttpServletResponse response, final Object handler) + throws Exception { + final String body = new String(new ContentCachingRequestWrapper(request).getContentAsByteArray()); + log.info(REQUEST_LOG_FORMAT, request.getMethod(), request.getRequestURI(), request.getHeader("Authorization"), + body); + return true; + } + + @Override + public void afterCompletion(final HttpServletRequest request, final HttpServletResponse response, + final Object handler, final Exception ex) + throws Exception { + final ContentCachingResponseWrapper contentCachingResponseWrapper = new ContentCachingResponseWrapper(response); + final String responseBody = new String(contentCachingResponseWrapper.getContentAsByteArray()); + log.info(RESPONSE_LOG_FORMAT, response.getStatus(), responseBody); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/ViewConstant.java b/backend/src/main/java/com/woowacourse/f12/presentation/ViewConstant.java new file mode 100644 index 00000000..2fcabcb2 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/ViewConstant.java @@ -0,0 +1,9 @@ +package com.woowacourse.f12.presentation; + +import com.fasterxml.jackson.annotation.JsonValue; + +public interface ViewConstant { + + @JsonValue + String getViewValue(); +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthArgumentResolver.java b/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthArgumentResolver.java index 95962a3e..e4bd5ade 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthArgumentResolver.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthArgumentResolver.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.presentation.auth; import com.woowacourse.f12.application.auth.JwtProvider; -import com.woowacourse.f12.exception.unauthorized.UnauthorizedException; +import com.woowacourse.f12.exception.unauthorized.TokenInvalidException; import org.springframework.core.MethodParameter; import org.springframework.http.HttpHeaders; import org.springframework.stereotype.Component; @@ -32,7 +32,7 @@ public Object resolveArgument(final MethodParameter parameter, final ModelAndVie try { return Long.parseLong(payload); } catch (NumberFormatException e) { - throw new UnauthorizedException(); + throw new TokenInvalidException(); } } } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthController.java b/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthController.java index 4aefb15a..f3b5d69d 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthController.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthController.java @@ -20,6 +20,6 @@ public AuthController(final AuthService authService) { @GetMapping("/login") public ResponseEntity login(@RequestParam final String code) { - return ResponseEntity.ok().body(authService.login(code)); + return ResponseEntity.ok(authService.login(code)); } } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthInterceptor.java b/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthInterceptor.java index 2c71551e..fbd9b26a 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthInterceptor.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/auth/AuthInterceptor.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.presentation.auth; import com.woowacourse.f12.application.auth.JwtProvider; -import com.woowacourse.f12.exception.unauthorized.UnauthorizedException; +import com.woowacourse.f12.exception.unauthorized.TokenExpiredException; import java.util.Objects; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -40,7 +40,7 @@ private boolean isNotTarget(final Object handler) { private void validateAuthorization(final HttpServletRequest request) { final String authorizationHeader = request.getHeader(HttpHeaders.AUTHORIZATION); if (!jwtProvider.validateToken(authorizationHeader)) { - throw new UnauthorizedException(); + throw new TokenExpiredException(); } } } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductController.java b/backend/src/main/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductController.java index a3b244b4..c33045a0 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductController.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductController.java @@ -5,6 +5,7 @@ import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductsResponse; import com.woowacourse.f12.presentation.auth.LoginRequired; import com.woowacourse.f12.presentation.auth.VerifiedMember; +import javax.validation.Valid; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PatchMapping; @@ -25,8 +26,9 @@ public InventoryProductController(final InventoryProductService inventoryProduct @PatchMapping("/inventoryProducts") @LoginRequired - public ResponseEntity updateProfileProducts(@RequestBody final ProfileProductRequest profileProductRequest, - @VerifiedMember final Long memberId) { + public ResponseEntity updateProfileProducts( + @RequestBody @Valid final ProfileProductRequest profileProductRequest, + @VerifiedMember final Long memberId) { inventoryProductService.updateProfileProducts(memberId, profileProductRequest); return ResponseEntity.ok().build(); } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/member/CareerLevelConstant.java b/backend/src/main/java/com/woowacourse/f12/presentation/member/CareerLevelConstant.java new file mode 100644 index 00000000..77d1cc4f --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/member/CareerLevelConstant.java @@ -0,0 +1,52 @@ +package com.woowacourse.f12.presentation.member; + +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.CareerLevel.MID_LEVEL; +import static com.woowacourse.f12.domain.member.CareerLevel.NONE; +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; + +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.exception.badrequest.InvalidCareerLevelException; +import com.woowacourse.f12.presentation.ViewConstant; +import java.util.Arrays; +import lombok.Getter; + +@Getter +public enum CareerLevelConstant implements ViewConstant { + + NONE_CONSTANT("none", NONE), + JUNIOR_CONSTANT("junior", JUNIOR), + MID_LEVEL_CONSTANT("midlevel", MID_LEVEL), + SENIOR_CONSTANT("senior", SENIOR); + + private final String value; + private final CareerLevel careerLevel; + + CareerLevelConstant(final String value, final CareerLevel careerLevel) { + this.value = value; + this.careerLevel = careerLevel; + } + + public static CareerLevelConstant findByViewValue(final String source) { + return Arrays.stream(values()) + .filter(careerLevel -> careerLevel.value.equals(source)) + .findAny() + .orElseThrow(InvalidCareerLevelException::new); + } + + public static CareerLevelConstant from(final CareerLevel careerLevel) { + return Arrays.stream(values()) + .filter(it -> it.careerLevel.equals(careerLevel)) + .findAny() + .orElseThrow(InvalidCareerLevelException::new); + } + + public CareerLevel toCareerLevel() { + return this.careerLevel; + } + + @Override + public String getViewValue() { + return this.value; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/member/CareerLevelParamConverter.java b/backend/src/main/java/com/woowacourse/f12/presentation/member/CareerLevelParamConverter.java new file mode 100644 index 00000000..72da30b0 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/member/CareerLevelParamConverter.java @@ -0,0 +1,14 @@ +package com.woowacourse.f12.presentation.member; + + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class CareerLevelParamConverter implements Converter { + + @Override + public CareerLevelConstant convert(String source) { + return CareerLevelConstant.findByViewValue(source); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/member/JobTypeConstant.java b/backend/src/main/java/com/woowacourse/f12/presentation/member/JobTypeConstant.java new file mode 100644 index 00000000..f7a3fadc --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/member/JobTypeConstant.java @@ -0,0 +1,52 @@ +package com.woowacourse.f12.presentation.member; + +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.domain.member.JobType.FRONTEND; +import static com.woowacourse.f12.domain.member.JobType.MOBILE; + +import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.exception.badrequest.InvalidJobTypeException; +import com.woowacourse.f12.presentation.ViewConstant; +import java.util.Arrays; +import lombok.Getter; + +@Getter +public enum JobTypeConstant implements ViewConstant { + + FRONTEND_CONSTANT("frontend", FRONTEND), + BACKEND_CONSTANT("backend", BACKEND), + MOBILE_CONSTANT("mobile", MOBILE), + ETC_CONSTANT("etc", ETC); + + private final String value; + private final JobType jobType; + + JobTypeConstant(final String value, final JobType jobType) { + this.value = value; + this.jobType = jobType; + } + + public static JobTypeConstant findByViewValue(final String source) { + return Arrays.stream(values()) + .filter(jobType -> jobType.value.equals(source)) + .findAny() + .orElseThrow(InvalidJobTypeException::new); + } + + public static JobTypeConstant from(final JobType jobType) { + return Arrays.stream(values()) + .filter(it -> it.jobType.equals(jobType)) + .findAny() + .orElseThrow(InvalidJobTypeException::new); + } + + public JobType toJobType() { + return this.jobType; + } + + @Override + public String getViewValue() { + return this.value; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/member/JobTypeParamConverter.java b/backend/src/main/java/com/woowacourse/f12/presentation/member/JobTypeParamConverter.java new file mode 100644 index 00000000..5639980a --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/member/JobTypeParamConverter.java @@ -0,0 +1,13 @@ +package com.woowacourse.f12.presentation.member; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class JobTypeParamConverter implements Converter { + + @Override + public JobTypeConstant convert(String source) { + return JobTypeConstant.findByViewValue(source); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/member/MemberController.java b/backend/src/main/java/com/woowacourse/f12/presentation/member/MemberController.java index dcec02f8..4dfc9e48 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/member/MemberController.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/member/MemberController.java @@ -2,12 +2,16 @@ import com.woowacourse.f12.application.member.MemberService; import com.woowacourse.f12.dto.request.member.MemberRequest; +import com.woowacourse.f12.dto.request.member.MemberSearchRequest; +import com.woowacourse.f12.dto.response.member.MemberPageResponse; import com.woowacourse.f12.dto.response.member.MemberResponse; import com.woowacourse.f12.presentation.auth.LoginRequired; import com.woowacourse.f12.presentation.auth.VerifiedMember; import javax.validation.Valid; +import org.springframework.data.domain.Pageable; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; @@ -44,4 +48,11 @@ public ResponseEntity updateMe(@VerifiedMember final Long memberId, memberService.updateMember(memberId, memberRequest); return ResponseEntity.ok().build(); } + + @GetMapping + public ResponseEntity searchMembers( + @ModelAttribute final MemberSearchRequest memberSearchRequest, final Pageable pageable) { + final MemberPageResponse memberPageResponse = memberService.findByContains(memberSearchRequest, pageable); + return ResponseEntity.ok(memberPageResponse); + } } diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/product/CategoryConstant.java b/backend/src/main/java/com/woowacourse/f12/presentation/product/CategoryConstant.java new file mode 100644 index 00000000..4fc1db82 --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/product/CategoryConstant.java @@ -0,0 +1,52 @@ +package com.woowacourse.f12.presentation.product; + +import static com.woowacourse.f12.domain.product.Category.*; + +import com.woowacourse.f12.domain.product.Category; +import com.woowacourse.f12.exception.badrequest.InvalidCategoryValueException; +import com.woowacourse.f12.presentation.ViewConstant; +import java.util.Arrays; + +public enum CategoryConstant implements ViewConstant { + + KEYBOARD_CONSTANT("keyboard", KEYBOARD), + MOUSE_CONSTANT("mouse", MOUSE), + MONITOR_CONSTANT("monitor", MONITOR), + STAND_CONSTANT("stand", STAND), + SOFTWARE_CONSTANT("software", SOFTWARE); + + private final String viewValue; + private final Category category; + + CategoryConstant(final String viewValue, final Category category) { + this.viewValue = viewValue; + this.category = category; + } + + public static CategoryConstant findByViewValue(final String viewValue) { + return Arrays.stream(values()) + .filter(category -> category.hasViewValue(viewValue)) + .findAny() + .orElseThrow(InvalidCategoryValueException::new); + } + + public static CategoryConstant from(final Category category) { + return Arrays.stream(values()) + .filter(constant -> constant.category.equals(category)) + .findFirst() + .orElseThrow(InvalidCategoryValueException::new); + } + + public Category toCategory() { + return this.category; + } + + public boolean hasViewValue(final String viewValue) { + return this.viewValue.equals(viewValue); + } + + @Override + public String getViewValue() { + return viewValue; + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/product/CategoryParamConverter.java b/backend/src/main/java/com/woowacourse/f12/presentation/product/CategoryParamConverter.java new file mode 100644 index 00000000..0f6e25bd --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/product/CategoryParamConverter.java @@ -0,0 +1,13 @@ +package com.woowacourse.f12.presentation.product; + +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; + +@Component +public class CategoryParamConverter implements Converter { + + @Override + public CategoryConstant convert(String source) { + return CategoryConstant.findByViewValue(source); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/product/KeyboardController.java b/backend/src/main/java/com/woowacourse/f12/presentation/product/KeyboardController.java deleted file mode 100644 index 6198fb60..00000000 --- a/backend/src/main/java/com/woowacourse/f12/presentation/product/KeyboardController.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.woowacourse.f12.presentation.product; - -import com.woowacourse.f12.application.product.KeyboardService; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; -import org.springframework.data.domain.Pageable; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@RestController -@RequestMapping("/api/v1/keyboards") -public class KeyboardController { - - private final KeyboardService keyboardService; - - public KeyboardController(final KeyboardService keyboardService) { - this.keyboardService = keyboardService; - } - - @GetMapping - public ResponseEntity showPage(final Pageable pageable) { - return ResponseEntity.ok().body(keyboardService.findPage(pageable)); - } - - @GetMapping("/{id}") - public ResponseEntity show(@PathVariable final Long id) { - return ResponseEntity.ok().body(keyboardService.findById(id)); - } -} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/product/ProductController.java b/backend/src/main/java/com/woowacourse/f12/presentation/product/ProductController.java new file mode 100644 index 00000000..6f1403af --- /dev/null +++ b/backend/src/main/java/com/woowacourse/f12/presentation/product/ProductController.java @@ -0,0 +1,40 @@ +package com.woowacourse.f12.presentation.product; + +import com.woowacourse.f12.application.product.ProductService; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.dto.response.product.ProductStatisticsResponse; +import org.springframework.data.domain.Pageable; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequestMapping("/api/v1/products") +public class ProductController { + + private final ProductService productService; + + public ProductController(final ProductService productService) { + this.productService = productService; + } + + @GetMapping + public ResponseEntity showPage(@RequestParam(required = false) final CategoryConstant category, + final Pageable pageable) { + return ResponseEntity.ok(productService.findPage(category, pageable)); + } + + @GetMapping("/{id}") + public ResponseEntity show(@PathVariable final Long id) { + return ResponseEntity.ok(productService.findById(id)); + } + + @GetMapping("/{id}/statistics") + public ResponseEntity showStatistics(@PathVariable final Long id) { + return ResponseEntity.ok(productService.calculateMemberStatisticsById(id)); + } +} diff --git a/backend/src/main/java/com/woowacourse/f12/presentation/review/ReviewController.java b/backend/src/main/java/com/woowacourse/f12/presentation/review/ReviewController.java index de75cb21..acdf47f4 100644 --- a/backend/src/main/java/com/woowacourse/f12/presentation/review/ReviewController.java +++ b/backend/src/main/java/com/woowacourse/f12/presentation/review/ReviewController.java @@ -29,7 +29,7 @@ public ReviewController(final ReviewService reviewService) { this.reviewService = reviewService; } - @PostMapping("/keyboards/{productId}/reviews") + @PostMapping("/products/{productId}/reviews") @LoginRequired public ResponseEntity create(@PathVariable final Long productId, @VerifiedMember final Long memberId, @@ -39,7 +39,7 @@ public ResponseEntity create(@PathVariable final Long productId, .build(); } - @GetMapping("/keyboards/{productId}/reviews") + @GetMapping("/products/{productId}/reviews") public ResponseEntity showPageByProductId(@PathVariable final Long productId, final Pageable pageable) { final ReviewPageResponse reviewPageResponse = reviewService.findPageByProductId(productId, pageable); diff --git a/backend/src/main/java/com/woowacourse/f12/support/AuthTokenExtractor.java b/backend/src/main/java/com/woowacourse/f12/support/AuthTokenExtractor.java index 6545c35d..4550f71d 100644 --- a/backend/src/main/java/com/woowacourse/f12/support/AuthTokenExtractor.java +++ b/backend/src/main/java/com/woowacourse/f12/support/AuthTokenExtractor.java @@ -1,6 +1,7 @@ package com.woowacourse.f12.support; -import com.woowacourse.f12.exception.unauthorized.UnauthorizedException; +import com.woowacourse.f12.exception.unauthorized.TokenInvalidException; +import com.woowacourse.f12.exception.unauthorized.TokenNotExistsException; import java.util.Objects; import org.springframework.stereotype.Component; @@ -9,11 +10,11 @@ public class AuthTokenExtractor { public String extractToken(final String authorizationHeader, final String tokenType) { if (Objects.isNull(authorizationHeader)) { - throw new UnauthorizedException(); + throw new TokenNotExistsException(); } final String[] splitHeaders = authorizationHeader.split(" "); if (splitHeaders.length != 2 || !splitHeaders[0].equalsIgnoreCase(tokenType)) { - throw new UnauthorizedException(); + throw new TokenInvalidException(); } return splitHeaders[1]; } diff --git a/backend/src/main/resources/application-local.yml b/backend/src/main/resources/application-local.yml new file mode 100644 index 00000000..75851dab --- /dev/null +++ b/backend/src/main/resources/application-local.yml @@ -0,0 +1,5 @@ +spring: + config: + import: submodules/security-local.yml +logging: + config: classpath:log4j2/log4j2-local.xml diff --git a/backend/src/main/resources/application-main.yml b/backend/src/main/resources/application-main.yml new file mode 100644 index 00000000..6dabb698 --- /dev/null +++ b/backend/src/main/resources/application-main.yml @@ -0,0 +1,5 @@ +spring: + config: + import: submodules/security-main.yml +logging: + config: classpath:log4j2/log4j2-main.xml diff --git a/backend/src/main/resources/application-release.yml b/backend/src/main/resources/application-release.yml new file mode 100644 index 00000000..838f3129 --- /dev/null +++ b/backend/src/main/resources/application-release.yml @@ -0,0 +1,5 @@ +spring: + config: + import: submodules/security-release.yml +logging: + config: classpath:log4j2/log4j2-release.xml diff --git a/backend/src/main/resources/application.yml b/backend/src/main/resources/application.yml index 673541aa..216e2343 100644 --- a/backend/src/main/resources/application.yml +++ b/backend/src/main/resources/application.yml @@ -1,10 +1,12 @@ spring: + config: + import: submodules/security-common.yml profiles: - include: auth - datasource: - url: jdbc:h2:~/test;MODE=MySQL; - username: sa - password: + group: + main: + release: + local: + default: local jpa: hibernate: ddl-auto: none @@ -12,10 +14,6 @@ spring: properties: hibernate: format_sql: true - h2: - console: - enabled: true - path: /h2-console server: port: 8080 diff --git a/backend/src/main/resources/log4j2/log4j2-local.xml b/backend/src/main/resources/log4j2/log4j2-local.xml new file mode 100644 index 00000000..48a54684 --- /dev/null +++ b/backend/src/main/resources/log4j2/log4j2-local.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/resources/log4j2/log4j2-main.xml b/backend/src/main/resources/log4j2/log4j2-main.xml new file mode 100644 index 00000000..74bf8c8e --- /dev/null +++ b/backend/src/main/resources/log4j2/log4j2-main.xml @@ -0,0 +1,57 @@ + + + + logs/log/log + logs/db/db + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %t %class{36}.%M L:%L %m%n + %d{yyyy-MM-dd}-%i.log.gz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/main/resources/log4j2/log4j2-release.xml b/backend/src/main/resources/log4j2/log4j2-release.xml new file mode 100644 index 00000000..9dcb1a8d --- /dev/null +++ b/backend/src/main/resources/log4j2/log4j2-release.xml @@ -0,0 +1,57 @@ + + + + logs/log/log + logs/db/db + %d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %t %class{36}.%M L:%L %m%n + %d{yyyy-MM-dd}-%i.log.gz + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/backend/src/test/java/com/woowacourse/f12/acceptance/AuthAcceptanceTest.java b/backend/src/test/java/com/woowacourse/f12/acceptance/AuthAcceptanceTest.java index 1b06e91c..a4d45688 100644 --- a/backend/src/test/java/com/woowacourse/f12/acceptance/AuthAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/acceptance/AuthAcceptanceTest.java @@ -1,6 +1,7 @@ package com.woowacourse.f12.acceptance; import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.GET_요청을_보낸다; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; @@ -15,7 +16,7 @@ class AuthAcceptanceTest extends AcceptanceTest { @Test void 로그인_요청이_들어오고_OAUTH_인증에_성공하면_토큰과_회원정보를_반환한다() { // given, when - ExtractableResponse response = GET_요청을_보낸다("/api/v1/login?code=1"); + ExtractableResponse response = GET_요청을_보낸다("/api/v1/login?code=" + CORINNE_GITHUB.getCode()); // then assertAll( diff --git a/backend/src/test/java/com/woowacourse/f12/acceptance/InventoryProductAcceptanceTest.java b/backend/src/test/java/com/woowacourse/f12/acceptance/InventoryProductAcceptanceTest.java index 2ad6825b..07facf6e 100644 --- a/backend/src/test/java/com/woowacourse/f12/acceptance/InventoryProductAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/acceptance/InventoryProductAcceptanceTest.java @@ -4,18 +4,22 @@ import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.GET_요청을_보낸다; import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_GET_요청을_보낸다; import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_PATCH_요청을_보낸다; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; import static com.woowacourse.f12.support.InventoryProductFixtures.UNSELECTED_INVENTORY_PRODUCT; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; import com.woowacourse.f12.domain.inventoryproduct.InventoryProductRepository; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; +import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; import com.woowacourse.f12.dto.request.inventoryproduct.ProfileProductRequest; +import com.woowacourse.f12.dto.response.auth.LoginMemberResponse; import com.woowacourse.f12.dto.response.auth.LoginResponse; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductResponse; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductsResponse; @@ -29,7 +33,7 @@ class InventoryProductAcceptanceTest extends AcceptanceTest { @Autowired - private KeyboardRepository keyboardRepository; + private ProductRepository productRepository; @Autowired private InventoryProductRepository inventoryProductRepository; @@ -37,41 +41,41 @@ class InventoryProductAcceptanceTest extends AcceptanceTest { @Test void 리뷰를_작성하면_해당_장비가_인벤토리에_추가된다() { // given - Long keyboardId = 키보드를_저장한다(KEYBOARD_1.생성()).getId(); - String token = 로그인을_한다("1").getToken(); - REVIEW_RATING_5.작성_요청을_보낸다(keyboardId, token); + Long productId = 제품을_저장한다(KEYBOARD_1.생성()).getId(); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + REVIEW_RATING_5.작성_요청을_보낸다(productId, token); // when List keyboardsInInventory = 로그인된_상태로_GET_요청을_보낸다("/api/v1/members/inventoryProducts", token) .as(InventoryProductsResponse.class) - .getKeyboards(); + .getItems(); // then assertThat(keyboardsInInventory).extracting("id") - .containsOnly(keyboardId); + .containsOnly(productId); } @Test void 대표_장비가_없는_상태에서_대표_장비를_등록한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - LoginResponse loginResponse = 로그인을_한다("1"); + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); String token = loginResponse.getToken(); - Long memberId = loginResponse.getMember().getId(); + Member member = 응답을_회원으로_변환한다(loginResponse.getMember()); - InventoryProduct inventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + InventoryProduct inventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(member, product); InventoryProduct savedInventoryProduct = 인벤토리에_장비를_추가한다(inventoryProduct); // when ExtractableResponse profileProductResponse = 로그인된_상태로_PATCH_요청을_보낸다( "api/v1/members/inventoryProducts", token, - new ProfileProductRequest(savedInventoryProduct.getId(), null)); + new ProfileProductRequest(List.of(savedInventoryProduct.getId()))); List inventoryProductResponses = 로그인된_상태로_GET_요청을_보낸다( "/api/v1/members/inventoryProducts", token) - .as(InventoryProductsResponse.class).getKeyboards(); + .as(InventoryProductsResponse.class).getItems(); // then assertAll( @@ -80,17 +84,44 @@ class InventoryProductAcceptanceTest extends AcceptanceTest { ); } + @Test + void 대표_장비가_있는_상태에서_대표_장비를_모두_해제한다() { + // given + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + String token = loginResponse.getToken(); + Member member = 응답을_회원으로_변환한다(loginResponse.getMember()); + + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(member, product); + 인벤토리에_장비를_추가한다(inventoryProduct); + + // when + ExtractableResponse profileProductResponse = 로그인된_상태로_PATCH_요청을_보낸다( + "api/v1/members/inventoryProducts", token, + new ProfileProductRequest(List.of())); + + List inventoryProductResponses = 로그인된_상태로_GET_요청을_보낸다( + "/api/v1/members/inventoryProducts", + token) + .as(InventoryProductsResponse.class).getItems(); + + // then + assertAll( + () -> assertThat(profileProductResponse.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(inventoryProductResponses.get(0).isSelected()).isFalse() + ); + } + @Test void 등록된_장비_목록을_대표_장비를_포함해서_조회한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - LoginResponse response = 로그인을_한다("1"); - String token = response.getToken(); - Long memberId = response.getMember() - .getId(); - InventoryProduct selectedInventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + String token = loginResponse.getToken(); + Member member = 응답을_회원으로_변환한다(loginResponse.getMember()); + InventoryProduct selectedInventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(member, product); InventoryProduct savedSelectedInventoryProduct = 인벤토리에_장비를_추가한다(selectedInventoryProduct); - InventoryProduct unselectedInventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + InventoryProduct unselectedInventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(member, product); InventoryProduct savedUnselectedInventoryProduct = 인벤토리에_장비를_추가한다(unselectedInventoryProduct); // when @@ -100,7 +131,7 @@ class InventoryProductAcceptanceTest extends AcceptanceTest { // then assertAll( () -> assertThat(profileProductResponse.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(profileProductResponse.as(InventoryProductsResponse.class).getKeyboards()) + () -> assertThat(profileProductResponse.as(InventoryProductsResponse.class).getItems()) .usingRecursiveFieldByFieldElementComparator() .containsOnly(InventoryProductResponse.from(savedSelectedInventoryProduct), InventoryProductResponse.from(savedUnselectedInventoryProduct)) @@ -110,34 +141,42 @@ class InventoryProductAcceptanceTest extends AcceptanceTest { @Test void 다른_회원의_아이디로_등록된_장비를_조회한다() { // given - LoginResponse response = 로그인을_한다("1"); - Long memberId = response.getMember() - .getId(); - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - InventoryProduct selectedInventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + Member member = 응답을_회원으로_변환한다(loginResponse.getMember()); + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + InventoryProduct selectedInventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(member, product); InventoryProduct savedSelectedInventoryProduct = 인벤토리에_장비를_추가한다(selectedInventoryProduct); - InventoryProduct unselectedInventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + InventoryProduct unselectedInventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(member, product); InventoryProduct savedUnselectedInventoryProduct = 인벤토리에_장비를_추가한다(unselectedInventoryProduct); // when ExtractableResponse profileProductResponse = GET_요청을_보낸다( - "/api/v1/members/" + memberId + "/inventoryProducts"); + "/api/v1/members/" + member.getId() + "/inventoryProducts"); // then assertAll( () -> assertThat(profileProductResponse.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(profileProductResponse.as(InventoryProductsResponse.class).getKeyboards()) + () -> assertThat(profileProductResponse.as(InventoryProductsResponse.class).getItems()) .usingRecursiveFieldByFieldElementComparator() .containsOnly(InventoryProductResponse.from(savedSelectedInventoryProduct), InventoryProductResponse.from(savedUnselectedInventoryProduct)) ); } - private Keyboard 키보드를_저장한다(Keyboard keyboard) { - return keyboardRepository.save(keyboard); + private Product 제품을_저장한다(Product product) { + return productRepository.save(product); } private InventoryProduct 인벤토리에_장비를_추가한다(InventoryProduct inventoryProduct) { return inventoryProductRepository.save(inventoryProduct); } + + private Member 응답을_회원으로_변환한다(LoginMemberResponse loginMemberResponse) { + return Member.builder() + .id(loginMemberResponse.getId()) + .gitHubId(loginMemberResponse.getGitHubId()) + .name(loginMemberResponse.getName()) + .imageUrl(loginMemberResponse.getImageUrl()) + .build(); + } } diff --git a/backend/src/test/java/com/woowacourse/f12/acceptance/KeyboardAcceptanceTest.java b/backend/src/test/java/com/woowacourse/f12/acceptance/KeyboardAcceptanceTest.java deleted file mode 100644 index f4fc8465..00000000 --- a/backend/src/test/java/com/woowacourse/f12/acceptance/KeyboardAcceptanceTest.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.woowacourse.f12.acceptance; - -import static com.woowacourse.f12.acceptance.support.LoginUtil.로그인을_한다; -import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.GET_요청을_보낸다; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; -import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_3; -import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; -import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; -import io.restassured.response.ExtractableResponse; -import io.restassured.response.Response; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; - -class KeyboardAcceptanceTest extends AcceptanceTest { - - @Autowired - private KeyboardRepository keyboardRepository; - - @Test - void 키보드_단일_제품_조회한다() { - // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - - // when - ExtractableResponse response = GET_요청을_보낸다("/api/v1/keyboards/" + keyboard.getId()); - - // then - assertAll( - () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(response.as(KeyboardResponse.class)).usingRecursiveComparison() - .isEqualTo(keyboard) - ); - } - - @Test - void 키보드_목록을_페이징하여_조회한다() { - // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - 키보드를_저장한다(KEYBOARD_2.생성()); - - // when - ExtractableResponse response = GET_요청을_보낸다("/api/v1/keyboards?page=0&size=1"); - - // then - assertAll( - () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(response.as(KeyboardPageResponse.class).getItems()) - .extracting("id") - .containsExactly(keyboard.getId()), - () -> assertThat(response.as(KeyboardPageResponse.class).isHasNext()).isTrue() - ); - } - - @Test - void 키보드_목록을_리뷰가_많은_순서로_페이징하여_조회한다() { - // given - Keyboard keyboard1 = 키보드를_저장한다(KEYBOARD_1.생성()); - Keyboard keyboard2 = 키보드를_저장한다(KEYBOARD_2.생성()); - String token = 로그인을_한다("1").getToken(); - REVIEW_RATING_5.작성_요청을_보낸다(keyboard1.getId(), token); - REVIEW_RATING_4.작성_요청을_보낸다(keyboard1.getId(), token); - REVIEW_RATING_3.작성_요청을_보낸다(keyboard2.getId(), token); - - // when - ExtractableResponse response = GET_요청을_보낸다("/api/v1/keyboards?page=0&size=1&sort=reviewCount,desc"); - - // then - assertAll( - () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(response.as(KeyboardPageResponse.class).getItems()) - .extracting("id") - .containsExactly(keyboard1.getId()), - () -> assertThat(response.as(KeyboardPageResponse.class).isHasNext()).isTrue() - ); - } - - @Test - void 키보드_목록을_평점_높은_순서로_페이징하여_조회한다() { - // given - Keyboard keyboard1 = 키보드를_저장한다(KEYBOARD_1.생성()); - Keyboard keyboard2 = 키보드를_저장한다(KEYBOARD_2.생성()); - String token = 로그인을_한다("1").getToken(); - REVIEW_RATING_4.작성_요청을_보낸다(keyboard1.getId(), token); - REVIEW_RATING_5.작성_요청을_보낸다(keyboard2.getId(), token); - - // when - ExtractableResponse response = GET_요청을_보낸다("/api/v1/keyboards?page=0&size=1&sort=rating,desc"); - - // then - assertAll( - () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), - () -> assertThat(response.as(KeyboardPageResponse.class).getItems()) - .extracting("id") - .containsExactly(keyboard2.getId()), - () -> assertThat(response.as(KeyboardPageResponse.class).isHasNext()).isTrue() - ); - } - - private Keyboard 키보드를_저장한다(Keyboard keyboard) { - return keyboardRepository.save(keyboard); - } -} diff --git a/backend/src/test/java/com/woowacourse/f12/acceptance/MemberAcceptanceTest.java b/backend/src/test/java/com/woowacourse/f12/acceptance/MemberAcceptanceTest.java index 13db3a5d..ac55d97b 100644 --- a/backend/src/test/java/com/woowacourse/f12/acceptance/MemberAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/acceptance/MemberAcceptanceTest.java @@ -1,32 +1,54 @@ package com.woowacourse.f12.acceptance; -import static com.woowacourse.f12.acceptance.support.LoginUtil.로그인을_한다; -import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.GET_요청을_보낸다; -import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_GET_요청을_보낸다; -import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_PATCH_요청을_보낸다; -import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; -import static com.woowacourse.f12.domain.member.JobType.BACK_END; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertAll; - +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; import com.woowacourse.f12.dto.request.member.MemberRequest; import com.woowacourse.f12.dto.response.auth.LoginMemberResponse; import com.woowacourse.f12.dto.response.auth.LoginResponse; +import com.woowacourse.f12.dto.response.member.MemberPageResponse; import com.woowacourse.f12.dto.response.member.MemberResponse; +import com.woowacourse.f12.dto.response.member.MemberWithProfileProductResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; import io.restassured.response.ExtractableResponse; import io.restassured.response.Response; import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; +import java.util.List; + +import static com.woowacourse.f12.acceptance.support.LoginUtil.로그인을_한다; +import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.*; +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.JUNIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.SENIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.BACKEND_CONSTANT; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; +import static com.woowacourse.f12.support.GitHubProfileFixtures.MINCHO_GITHUB; +import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; +import static com.woowacourse.f12.support.InventoryProductFixtures.대표_장비_업데이트_한다; +import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.MOUSE_1; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + public class MemberAcceptanceTest extends AcceptanceTest { + @Autowired + private ProductRepository productRepository; + @Test void 로그인_된_상태에서_내_회원정보를_업데이트한다() { // given - LoginResponse loginResponse = 로그인을_한다("1"); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); String token = loginResponse.getToken(); - MemberRequest memberRequest = new MemberRequest(JUNIOR, BACK_END); + MemberRequest memberRequest = new MemberRequest(JUNIOR_CONSTANT, BACKEND_CONSTANT); // when ExtractableResponse memberUpdatedResponse = 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", token, @@ -36,7 +58,7 @@ public class MemberAcceptanceTest extends AcceptanceTest { // then Member member = Member.builder() .careerLevel(JUNIOR) - .jobType(BACK_END) + .jobType(BACKEND) .build(); assertAll( () -> assertThat(memberGetResponse.as(MemberResponse.class)).usingRecursiveComparison() @@ -49,20 +71,19 @@ public class MemberAcceptanceTest extends AcceptanceTest { @Test void 로그인_된_상태에서_내_회원정보를_조회한다() { // given - LoginResponse loginResponse = 로그인을_한다("1"); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); String token = loginResponse.getToken(); - LoginMemberResponse loginMemberResponse = loginResponse.getMember(); - MemberRequest memberRequest = new MemberRequest(JUNIOR, BACK_END); + MemberRequest memberRequest = new MemberRequest(JUNIOR_CONSTANT, BACKEND_CONSTANT); 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", token, memberRequest); // when ExtractableResponse response = 로그인된_상태로_GET_요청을_보낸다("/api/v1/members/me", token); // then - Member expectedMember = loginMemberResponse.toMember(); + Member expectedMember = 응답을_회원으로_변환한다(loginResponse.getMember()); expectedMember.updateCareerLevel(JUNIOR); - expectedMember.updateJobType(BACK_END); + expectedMember.updateJobType(BACKEND); assertAll( () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), @@ -74,11 +95,11 @@ public class MemberAcceptanceTest extends AcceptanceTest { @Test void 비로그인_상태에서_회원정보를_조회한다() { // given - LoginResponse loginResponse = 로그인을_한다("1"); + LoginResponse loginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); String token = loginResponse.getToken(); LoginMemberResponse loginMemberResponse = loginResponse.getMember(); - MemberRequest memberRequest = new MemberRequest(JUNIOR, BACK_END); + MemberRequest memberRequest = new MemberRequest(JUNIOR_CONSTANT, BACKEND_CONSTANT); 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", token, memberRequest); // when @@ -91,7 +112,7 @@ public class MemberAcceptanceTest extends AcceptanceTest { .gitHubId(loginMemberResponse.getGitHubId()) .imageUrl(loginMemberResponse.getImageUrl()) .careerLevel(JUNIOR) - .jobType(BACK_END) + .jobType(BACKEND) .build(); assertAll( () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), @@ -99,4 +120,163 @@ public class MemberAcceptanceTest extends AcceptanceTest { .isEqualTo(MemberResponse.from(expectedMember)) ); } + + @Test + void 회원정보를_키워드와_옵션을_입력하지않고_조회한다() { + // given + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + + MemberRequest memberRequest = new MemberRequest(SENIOR_CONSTANT, BACKEND_CONSTANT); + LoginResponse firstLoginResponse = 로그인을_한다(MINCHO_GITHUB.getCode()); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", firstLoginResponse.getToken(), memberRequest); + + LoginResponse secondLoginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + String token = secondLoginResponse.getToken(); + Long memberId = secondLoginResponse.getMember().getId(); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", token, memberRequest); + + REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/members?page=0&size=2"); + + // then + MemberPageResponse memberPageResponse = response.as(MemberPageResponse.class); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, CORINNE.생성(memberId), product); + Member member = CORINNE.대표장비를_추가해서_생성(memberId, inventoryProduct); + MemberWithProfileProductResponse memberWithProfileProductResponse = MemberWithProfileProductResponse.from( + member); + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(memberPageResponse.isHasNext()).isFalse(), + () -> assertThat( + memberPageResponse.getItems()).usingRecursiveFieldByFieldElementComparatorIgnoringFields( + "profileProducts") + .hasSize(2) + .contains(memberWithProfileProductResponse) + ); + } + + @Test + void 회원정보를_옵션으로_검색하여_조회한다() { + // given + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + + MemberRequest memberRequest = new MemberRequest(SENIOR_CONSTANT, BACKEND_CONSTANT); + LoginResponse firstLoginResponse = 로그인을_한다(MINCHO_GITHUB.getCode()); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", firstLoginResponse.getToken(), memberRequest); + + LoginResponse secondLoginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + String token = secondLoginResponse.getToken(); + Long memberId = secondLoginResponse.getMember().getId(); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", token, memberRequest); + + REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/members?page=0&size=2&careerLevel=senior&jobType=backend"); + + // then + MemberPageResponse memberPageResponse = response.as(MemberPageResponse.class); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, CORINNE.생성(memberId), product); + Member member = CORINNE.대표장비를_추가해서_생성(memberId, inventoryProduct); + MemberWithProfileProductResponse memberWithProfileProductResponse = MemberWithProfileProductResponse.from( + member); + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(memberPageResponse.isHasNext()).isFalse(), + () -> assertThat( + memberPageResponse.getItems()).usingRecursiveFieldByFieldElementComparatorIgnoringFields( + "profileProducts") + .hasSize(2) + .contains(memberWithProfileProductResponse) + ); + } + + @Test + void 회원정보를_키워드와_옵션으로_검색하여_대표_장비와_함께_조회한다() { + // given + Product keyboard = 제품을_저장한다(KEYBOARD_1.생성()); + Product mouse = 제품을_저장한다(MOUSE_1.생성()); + + MemberRequest memberRequest = new MemberRequest(SENIOR_CONSTANT, BACKEND_CONSTANT); + LoginResponse firstLoginResponse = 로그인을_한다(MINCHO_GITHUB.getCode()); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", firstLoginResponse.getToken(), memberRequest); + + LoginResponse secondLoginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + String token = secondLoginResponse.getToken(); + Long memberId = secondLoginResponse.getMember().getId(); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", token, memberRequest); + + REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token); + REVIEW_RATING_4.작성_요청을_보낸다(mouse.getId(), token); + 대표_장비_업데이트_한다(List.of(keyboard), token); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/members?page=0&size=2&query=cheese&careerLevel=senior&jobType=backend"); + + // then + MemberPageResponse memberPageResponse = response.as(MemberPageResponse.class); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, CORINNE.생성(memberId), keyboard); + Member member = CORINNE.대표장비를_추가해서_생성(memberId, inventoryProduct); + MemberWithProfileProductResponse memberWithProfileProductResponse = MemberWithProfileProductResponse.from( + member); + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(memberPageResponse.isHasNext()).isFalse(), + () -> assertThat(memberPageResponse.getItems()) + .usingRecursiveFieldByFieldElementComparatorIgnoringFields("profileProducts") + .hasSize(1) + .containsOnly(memberWithProfileProductResponse), + () -> assertThat(memberPageResponse.getItems().get(0).getProfileProducts()) + .usingRecursiveFieldByFieldElementComparatorIgnoringFields("reviewCount", "rating") + .hasSize(1) + .containsOnly(ProductResponse.from(keyboard)) + ); + } + + @Test + void 회원정보_목록은_id의_역순으로_조회된다() { + // given + MemberRequest memberRequest = new MemberRequest(SENIOR_CONSTANT, BACKEND_CONSTANT); + + LoginResponse firstLoginResponse = 로그인을_한다(MINCHO_GITHUB.getCode()); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", firstLoginResponse.getToken(), memberRequest); + + LoginResponse secondLoginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", secondLoginResponse.getToken(), memberRequest); + + // when + ExtractableResponse response = GET_요청을_보낸다("/api/v1/members?page=0&size=2"); + + // then + MemberPageResponse memberPageResponse = response.as(MemberPageResponse.class); + + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(memberPageResponse.isHasNext()).isFalse(), + () -> assertThat(memberPageResponse.getItems() + .stream() + .map(MemberWithProfileProductResponse::getId)) + .usingRecursiveFieldByFieldElementComparatorOnFields("id") + .hasSize(2) + .containsExactly(secondLoginResponse.getMember().getId(), firstLoginResponse.getMember().getId()) + ); + } + + private Product 제품을_저장한다(Product product) { + return productRepository.save(product); + } + + private Member 응답을_회원으로_변환한다(LoginMemberResponse loginMemberResponse) { + return Member.builder() + .id(loginMemberResponse.getId()) + .gitHubId(loginMemberResponse.getGitHubId()) + .name(loginMemberResponse.getName()) + .imageUrl(loginMemberResponse.getImageUrl()) + .build(); + } } diff --git a/backend/src/test/java/com/woowacourse/f12/acceptance/ProductAcceptanceTest.java b/backend/src/test/java/com/woowacourse/f12/acceptance/ProductAcceptanceTest.java new file mode 100644 index 00000000..9588945e --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/acceptance/ProductAcceptanceTest.java @@ -0,0 +1,232 @@ +package com.woowacourse.f12.acceptance; + +import static com.woowacourse.f12.acceptance.support.LoginUtil.로그인을_한다; +import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.GET_요청을_보낸다; +import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_PATCH_요청을_보낸다; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.JUNIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.MID_LEVEL_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.NONE_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.SENIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.BACKEND_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.ETC_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.FRONTEND_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.MOBILE_CONSTANT; +import static com.woowacourse.f12.presentation.product.CategoryConstant.KEYBOARD_CONSTANT; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; +import static com.woowacourse.f12.support.GitHubProfileFixtures.MINCHO_GITHUB; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; +import static com.woowacourse.f12.support.ProductFixture.MOUSE_1; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_3; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; +import com.woowacourse.f12.dto.request.member.MemberRequest; +import com.woowacourse.f12.dto.response.auth.LoginResponse; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.dto.response.product.ProductStatisticsResponse; +import com.woowacourse.f12.presentation.product.CategoryConstant; +import io.restassured.response.ExtractableResponse; +import io.restassured.response.Response; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; + +class ProductAcceptanceTest extends AcceptanceTest { + + @Autowired + private ProductRepository productRepository; + + @Test + void 단일_제품_조회한다() { + // given + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + + // when + ExtractableResponse response = GET_요청을_보낸다("/api/v1/products/" + product.getId()); + + // then + ProductResponse productResponse = response.as(ProductResponse.class); + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(productResponse.getCategory()).isEqualTo(KEYBOARD_CONSTANT), + () -> assertThat(productResponse).usingRecursiveComparison() + .ignoringFieldsOfTypes(CategoryConstant.class) + .isEqualTo(product) + ); + } + + @Test + void 모든_제품_목록을_페이징하여_조회한다() { + // given + 제품을_저장한다(KEYBOARD_1.생성()); + Product product = 제품을_저장한다(MOUSE_1.생성()); + + // when + ExtractableResponse response = GET_요청을_보낸다("/api/v1/products?page=0&size=1"); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.as(ProductPageResponse.class).getItems()) + .extracting("id") + .containsExactly(product.getId()), + () -> assertThat(response.as(ProductPageResponse.class).isHasNext()).isTrue() + ); + } + + @Test + void 특정_카테고리_목록을_페이징하여_조회한다() { + // given + Product keyboard1 = 제품을_저장한다(KEYBOARD_1.생성()); + Product keyboard2 = 제품을_저장한다(KEYBOARD_2.생성()); + 제품을_저장한다(MOUSE_1.생성()); + + // when + ExtractableResponse response = GET_요청을_보낸다("/api/v1/products?category=keyboard&page=0&size=2"); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.as(ProductPageResponse.class).getItems()) + .extracting("id") + .containsExactly(keyboard2.getId(), keyboard1.getId()), + () -> assertThat(response.as(ProductPageResponse.class).isHasNext()).isFalse() + ); + } + + @Test + void 키보드_목록을_리뷰가_많은_순서로_페이징하여_조회한다() { + // given + Product product1 = 제품을_저장한다(KEYBOARD_1.생성()); + Product product2 = 제품을_저장한다(KEYBOARD_2.생성()); + String corinneToken = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + String minchoToken = 로그인을_한다(MINCHO_GITHUB.getCode()).getToken(); + REVIEW_RATING_5.작성_요청을_보낸다(product1.getId(), corinneToken); + REVIEW_RATING_4.작성_요청을_보낸다(product1.getId(), minchoToken); + REVIEW_RATING_3.작성_요청을_보낸다(product2.getId(), minchoToken); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/products?category=keyboard&page=0&size=2&sort=reviewCount,desc"); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.as(ProductPageResponse.class).getItems()) + .extracting("id") + .containsExactly(product1.getId(), product2.getId()), + () -> assertThat(response.as(ProductPageResponse.class).isHasNext()).isFalse() + ); + } + + @Test + void 리뷰_개수가_같은_상태에서_제품_목록을_리뷰가_많은_순서로_페이징하여_조회하면_id_역순으로_조회된다() { + // given + Product product1 = 제품을_저장한다(KEYBOARD_1.생성()); + Product product2 = 제품을_저장한다(KEYBOARD_2.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + REVIEW_RATING_5.작성_요청을_보낸다(product1.getId(), token); + REVIEW_RATING_3.작성_요청을_보낸다(product2.getId(), token); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/products?category=keyboard&page=0&size=2&sort=reviewCount,desc"); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.as(ProductPageResponse.class).getItems()) + .extracting("id") + .containsExactly(product2.getId(), product1.getId()), + () -> assertThat(response.as(ProductPageResponse.class).isHasNext()).isFalse() + ); + } + + @Test + void 정렬_조건으로_id_역순으로_페이징하여_조회하면_id_역순으로_조회된다() { + // given + Product product1 = 제품을_저장한다(KEYBOARD_1.생성()); + Product product2 = 제품을_저장한다(KEYBOARD_2.생성()); + Product product3 = 제품을_저장한다(MOUSE_1.생성()); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/products?page=0&size=3&sort=id,desc"); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.as(ProductPageResponse.class).getItems()) + .extracting("id") + .containsExactly(product3.getId(), product2.getId(), product1.getId()), + () -> assertThat(response.as(ProductPageResponse.class).isHasNext()).isFalse() + ); + } + + @Test + void 키보드_목록을_평점_높은_순서로_페이징하여_조회한다() { + // given + Product product1 = 제품을_저장한다(KEYBOARD_1.생성()); + Product product2 = 제품을_저장한다(KEYBOARD_2.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + REVIEW_RATING_4.작성_요청을_보낸다(product1.getId(), token); + REVIEW_RATING_5.작성_요청을_보낸다(product2.getId(), token); + + // when + ExtractableResponse response = GET_요청을_보낸다( + "/api/v1/products?category=keyboard&page=0&size=1&sort=rating,desc"); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(response.as(ProductPageResponse.class).getItems()) + .extracting("id") + .containsExactly(product2.getId()), + () -> assertThat(response.as(ProductPageResponse.class).isHasNext()).isTrue() + ); + } + + @Test + void 제품의_사용자_통계를_조회한다() { + // given + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + + LoginResponse firstLoginResponse = 로그인을_한다(MINCHO_GITHUB.getCode()); + String firstToken = firstLoginResponse.getToken(); + MemberRequest firstMemberRequest = new MemberRequest(SENIOR_CONSTANT, BACKEND_CONSTANT); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", firstToken, firstMemberRequest); + REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), firstToken); + + LoginResponse secondLoginResponse = 로그인을_한다(CORINNE_GITHUB.getCode()); + String secondToken = secondLoginResponse.getToken(); + MemberRequest secondMemberRequest = new MemberRequest(JUNIOR_CONSTANT, FRONTEND_CONSTANT); + 로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/me", secondToken, secondMemberRequest); + REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), secondToken); + + // when + ExtractableResponse response = GET_요청을_보낸다("/api/v1/products/" + product.getId() + "/statistics"); + ProductStatisticsResponse productStatisticsResponse = response.as(ProductStatisticsResponse.class); + + // then + assertAll( + () -> assertThat(response.statusCode()).isEqualTo(HttpStatus.OK.value()), + () -> assertThat(productStatisticsResponse.getCareerLevel()).usingRecursiveComparison() + .isEqualTo(Map.of(NONE_CONSTANT, 0.0, JUNIOR_CONSTANT, 0.5, MID_LEVEL_CONSTANT, 0.0, + SENIOR_CONSTANT, 0.5)), + () -> assertThat(productStatisticsResponse.getJobType()).usingRecursiveComparison() + .isEqualTo(Map.of(FRONTEND_CONSTANT, 0.5, BACKEND_CONSTANT, 0.5, MOBILE_CONSTANT, 0.0, + ETC_CONSTANT, 0.0)) + ); + } + + private Product 제품을_저장한다(Product product) { + return productRepository.save(product); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/acceptance/ReviewAcceptanceTest.java b/backend/src/test/java/com/woowacourse/f12/acceptance/ReviewAcceptanceTest.java index a85d45ad..3ce2939e 100644 --- a/backend/src/test/java/com/woowacourse/f12/acceptance/ReviewAcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/acceptance/ReviewAcceptanceTest.java @@ -4,15 +4,17 @@ import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.GET_요청을_보낸다; import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_DELETE_요청을_보낸다; import static com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil.로그인된_상태로_PUT_요청을_보낸다; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; +import static com.woowacourse.f12.support.GitHubProfileFixtures.MINCHO_GITHUB; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.jupiter.api.Assertions.assertAll; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; import com.woowacourse.f12.dto.request.review.ReviewRequest; import com.woowacourse.f12.dto.response.ExceptionResponse; import com.woowacourse.f12.dto.response.review.ReviewPageResponse; @@ -28,16 +30,16 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Autowired - private KeyboardRepository keyboardRepository; + private ProductRepository productRepository; @Test void 키보드가_저장되어있고_키보드에_대한_리뷰를_작성한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - String token = 로그인을_한다("1").getToken(); + Product product = 키보드를_저장한다(KEYBOARD_1.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); // when - ExtractableResponse response = REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token); + ExtractableResponse response = REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token); // then assertAll( @@ -49,12 +51,12 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Test void 같은_회원이_같은_제품에_리뷰를_중복해서_작성하면_예외가_발생한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - String token = 로그인을_한다("1").getToken(); - REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token); + Product product = 키보드를_저장한다(KEYBOARD_1.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token); // when - ExtractableResponse response = REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token); + ExtractableResponse response = REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token); // then assertAll( @@ -67,14 +69,14 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Test void 특정_제품_리뷰_목록을_최신순으로_조회한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - String token = 로그인을_한다("1").getToken(); - REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token); - String token2 = 로그인을_한다("2").getToken(); - Long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token2)); + Product product = 키보드를_저장한다(KEYBOARD_1.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token); + String token2 = 로그인을_한다(MINCHO_GITHUB.getCode()).getToken(); + Long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token2)); // when - String url = "/api/v1/keyboards/" + keyboard.getId() + "/reviews?size=1&page=0&sort=createdAt,desc"; + String url = "/api/v1/products/" + product.getId() + "/reviews?size=1&page=0&sort=createdAt,desc"; ExtractableResponse response = GET_요청을_보낸다(url); // then @@ -91,14 +93,14 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Test void 특정_제품_리뷰_목록을_평점순으로_조회한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - String token = 로그인을_한다("1").getToken(); - REVIEW_RATING_4.작성_요청을_보낸다(keyboard.getId(), token); - String token2 = 로그인을_한다("2").getToken(); - Long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token2)); + Product product = 키보드를_저장한다(KEYBOARD_1.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + REVIEW_RATING_4.작성_요청을_보낸다(product.getId(), token); + String token2 = 로그인을_한다(MINCHO_GITHUB.getCode()).getToken(); + Long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token2)); // when - String url = "/api/v1/keyboards/" + keyboard.getId() + "/reviews?size=1&page=0&sort=rating,desc"; + String url = "/api/v1/products/" + product.getId() + "/reviews?size=1&page=0&sort=rating,desc"; ExtractableResponse response = GET_요청을_보낸다(url); // then @@ -115,11 +117,11 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Test void 전체_리뷰_목록을_최신순으로_조회한다() { // given - Keyboard keyboard1 = 키보드를_저장한다(KEYBOARD_1.생성()); - Keyboard keyboard2 = 키보드를_저장한다(KEYBOARD_2.생성()); - String token = 로그인을_한다("1").getToken(); - Long reviewId1 = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_4.작성_요청을_보낸다(keyboard1.getId(), token)); - Long reviewId2 = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_4.작성_요청을_보낸다(keyboard2.getId(), token)); + Product product1 = 키보드를_저장한다(KEYBOARD_1.생성()); + Product product2 = 키보드를_저장한다(KEYBOARD_2.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + Long reviewId1 = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_4.작성_요청을_보낸다(product1.getId(), token)); + Long reviewId2 = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_4.작성_요청을_보낸다(product2.getId(), token)); // when ExtractableResponse response = GET_요청을_보낸다( @@ -138,9 +140,9 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Test void 로그인한_회원이_리뷰_작성자와_일치하면_리뷰를_수정한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - String token = 로그인을_한다("1").getToken(); - long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token)); + Product product = 키보드를_저장한다(KEYBOARD_1.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token)); ReviewRequest requestBody = new ReviewRequest("수정된 내용", 4); // when @@ -162,9 +164,9 @@ public class ReviewAcceptanceTest extends AcceptanceTest { @Test void 로그인한_회원이_리뷰_작성자와_일치하면_리뷰를_삭제한다() { // given - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성()); - String token = 로그인을_한다("1").getToken(); - long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(keyboard.getId(), token)); + Product product = 키보드를_저장한다(KEYBOARD_1.생성()); + String token = 로그인을_한다(CORINNE_GITHUB.getCode()).getToken(); + long reviewId = Location_헤더에서_id값을_꺼낸다(REVIEW_RATING_5.작성_요청을_보낸다(product.getId(), token)); // when ExtractableResponse response = 로그인된_상태로_DELETE_요청을_보낸다( @@ -186,7 +188,7 @@ public class ReviewAcceptanceTest extends AcceptanceTest { .split("/")[4]); } - private Keyboard 키보드를_저장한다(Keyboard keyboard) { - return keyboardRepository.save(keyboard); + private Product 키보드를_저장한다(Product product) { + return productRepository.save(product); } } diff --git a/backend/src/test/java/com/woowacourse/f12/application/auth/GitHubOauthClientTest.java b/backend/src/test/java/com/woowacourse/f12/application/auth/GitHubOauthClientTest.java index b4ab309e..66029256 100644 --- a/backend/src/test/java/com/woowacourse/f12/application/auth/GitHubOauthClientTest.java +++ b/backend/src/test/java/com/woowacourse/f12/application/auth/GitHubOauthClientTest.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.application.auth; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; import static org.assertj.core.api.Assertions.assertThat; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.response.auth.GitHubProfileResponse; +import com.woowacourse.f12.support.MemberFixtures; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; @@ -17,17 +20,19 @@ class GitHubOauthClientTest { @Test void GitHub에_accessToken을_요청한다() { // given, when - String accessToken = gitHubOauthClient.getAccessToken("1"); + String accessToken = gitHubOauthClient.getAccessToken(CORINNE_GITHUB.getCode()); // then - assertThat(accessToken).isEqualTo("token1"); + assertThat(accessToken).isEqualTo(CORINNE_GITHUB.getToken()); } @Test void GitHub에_프로필을_요청한다() { // given - String accessToken = "token1"; - GitHubProfileResponse expected = new GitHubProfileResponse("gitHubId1", "name", "url"); + Member corinne = MemberFixtures.CORINNE.생성(); + String accessToken = CORINNE_GITHUB.getToken(); + GitHubProfileResponse expected = new GitHubProfileResponse(corinne.getGitHubId(), corinne.getName(), + corinne.getImageUrl()); // when GitHubProfileResponse gitHubProfileResponse = gitHubOauthClient.getProfile(accessToken); diff --git a/backend/src/test/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductServiceTest.java b/backend/src/test/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductServiceTest.java index c503d4c5..fb7df1b5 100644 --- a/backend/src/test/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductServiceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/application/inventoryproduct/InventoryProductServiceTest.java @@ -2,8 +2,9 @@ import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; import static com.woowacourse.f12.support.InventoryProductFixtures.UNSELECTED_INVENTORY_PRODUCT; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; +import static com.woowacourse.f12.support.ProductFixture.SOFTWARE_1; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; @@ -12,11 +13,16 @@ import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; import com.woowacourse.f12.domain.inventoryproduct.InventoryProductRepository; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; import com.woowacourse.f12.dto.request.inventoryproduct.ProfileProductRequest; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductResponse; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductsResponse; -import com.woowacourse.f12.exception.badrequest.InvalidProfileProductException; +import com.woowacourse.f12.exception.badrequest.NotUpdatableException; +import com.woowacourse.f12.exception.badrequest.DuplicatedProfileProductCategoryException; +import com.woowacourse.f12.exception.badrequest.InvalidProfileProductCategoryException; +import com.woowacourse.f12.exception.internalserver.SqlUpdateException; +import com.woowacourse.f12.support.MemberFixtures; import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; @@ -38,41 +44,99 @@ class InventoryProductServiceTest { private InventoryProductService inventoryProductService; @Test - void 대표_장비를_등록한다() { + void 대표_장비를_수정한다() { // given - ProfileProductRequest profileProductRequest = new ProfileProductRequest(1L, 2L); - InventoryProduct inventoryProduct1 = UNSELECTED_INVENTORY_PRODUCT.생성(1L, 1L, KEYBOARD_1.생성()); - InventoryProduct inventoryProduct2 = SELECTED_INVENTORY_PRODUCT.생성(2L, 1L, KEYBOARD_2.생성()); - given(memberRepository.existsById(1L)) - .willReturn(true); - given(inventoryProductRepository.findById(1L)) - .willReturn(Optional.of(inventoryProduct1)); - given(inventoryProductRepository.findById(2L)) - .willReturn(Optional.of(inventoryProduct2)); + List selectedInventoryProductIds = List.of(2L); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(selectedInventoryProductIds); + Member member = MemberFixtures.CORINNE.생성(1L); + given(memberRepository.findById(1L)) + .willReturn(Optional.of(member)); + given(inventoryProductRepository.updateBulkProfileProductByMember(member, false)) + .willReturn(1); + given(inventoryProductRepository.updateBulkProfileProductByMemberAndIds(member, selectedInventoryProductIds, + true)) + .willReturn(selectedInventoryProductIds.size()); // when inventoryProductService.updateProfileProducts(1L, profileProductRequest); // then assertAll( - () -> verify(memberRepository).existsById(1L), - () -> verify(inventoryProductRepository).findById(1L), - () -> verify(inventoryProductRepository).findById(2L) + () -> verify(memberRepository).findById(1L), + () -> verify(inventoryProductRepository).updateBulkProfileProductByMember(member, false), + () -> verify(inventoryProductRepository).updateBulkProfileProductByMemberAndIds(member, + selectedInventoryProductIds, true) ); } @Test - void 대표_장비를_업데이트할_때_요청된_장비가_모두_null인_경우_예외가_발생한다() { + void 수정하려는_장비_개수와_실제_등록된_대표_장비_개수와_일치하지_않으면_예외를_반환한다() { // given - ProfileProductRequest profileProductRequest = new ProfileProductRequest(null, null); - given(memberRepository.existsById(1L)) - .willReturn(true); + List selectedInventoryProductIds = List.of(2L); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(selectedInventoryProductIds); + Member member = MemberFixtures.CORINNE.생성(1L); + given(memberRepository.findById(1L)) + .willReturn(Optional.of(member)); + given(inventoryProductRepository.updateBulkProfileProductByMember(member, false)) + .willReturn(1); + given(inventoryProductRepository.updateBulkProfileProductByMemberAndIds(member, selectedInventoryProductIds, + true)) + .willReturn(0); + + // when, then + assertAll( + () -> assertThatThrownBy(() -> inventoryProductService.updateProfileProducts(1L, profileProductRequest)) + .isExactlyInstanceOf(NotUpdatableException.class), + () -> verify(memberRepository).findById(1L), + () -> verify(inventoryProductRepository).updateBulkProfileProductByMember(member, false), + () -> verify(inventoryProductRepository).updateBulkProfileProductByMemberAndIds(member, + selectedInventoryProductIds, true) + ); + } + + @Test + void 대표장비_변경_요청에_카테고리가_중복되면_예외를_반환한다() { + // given + List selectedInventoryProductIds = List.of(1L, 2L); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(selectedInventoryProductIds); + Member member = MemberFixtures.CORINNE.생성(1L); + InventoryProduct inventoryProduct1 = SELECTED_INVENTORY_PRODUCT.생성(1L, member, KEYBOARD_1.생성()); + InventoryProduct inventoryProduct2 = UNSELECTED_INVENTORY_PRODUCT.생성(2L, member, KEYBOARD_2.생성()); + + given(memberRepository.findById(1L)) + .willReturn(Optional.of(member)); + given(inventoryProductRepository.findAllById(selectedInventoryProductIds)) + .willReturn(List.of(inventoryProduct1, inventoryProduct2)); + + // when, then + assertAll( + () -> assertThatThrownBy(() -> inventoryProductService.updateProfileProducts(1L, profileProductRequest)) + .isExactlyInstanceOf(DuplicatedProfileProductCategoryException.class), + () -> verify(memberRepository).findById(1L), + () -> verify(inventoryProductRepository).findAllById(selectedInventoryProductIds) + ); + } + + @Test + void 대표장비_변경_요청에_소프트웨어_카테고리가_포함되면_예외를_반환한다() { + // given + List selectedInventoryProductIds = List.of(1L, 2L); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(selectedInventoryProductIds); + Member member = MemberFixtures.CORINNE.생성(1L); + InventoryProduct inventoryProduct1 = SELECTED_INVENTORY_PRODUCT.생성(1L, member, SOFTWARE_1.생성()); + InventoryProduct inventoryProduct2 = UNSELECTED_INVENTORY_PRODUCT.생성(2L, member, KEYBOARD_2.생성()); + + given(memberRepository.findById(1L)) + .willReturn(Optional.of(member)); + given(inventoryProductRepository.findAllById(selectedInventoryProductIds)) + .willReturn(List.of(inventoryProduct1, inventoryProduct2)); // when, then assertAll( () -> assertThatThrownBy(() -> inventoryProductService.updateProfileProducts(1L, profileProductRequest)) - .isExactlyInstanceOf(InvalidProfileProductException.class), - () -> verify(memberRepository).existsById(1L) + .isExactlyInstanceOf(InvalidProfileProductCategoryException.class), + () -> verify(memberRepository).findById(1L), + () -> verify(inventoryProductRepository).findAllById(selectedInventoryProductIds) ); } @@ -80,7 +144,8 @@ class InventoryProductServiceTest { void 등록된_장비를_멤버_id로_조회한다() { // given Long memberId = 1L; - InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, memberId, KEYBOARD_1.생성(1L)); + Member member = MemberFixtures.CORINNE.생성(memberId); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, member, KEYBOARD_1.생성(1L)); given(memberRepository.existsById(1L)) .willReturn(true); given(inventoryProductRepository.findByMemberId(memberId)) @@ -91,7 +156,7 @@ class InventoryProductServiceTest { // then assertAll( - () -> assertThat(inventoryProductsResponse.getKeyboards()).hasSize(1) + () -> assertThat(inventoryProductsResponse.getItems()).hasSize(1) .usingRecursiveFieldByFieldElementComparator() .containsOnly(InventoryProductResponse.from(inventoryProduct)), () -> verify(memberRepository).existsById(memberId), diff --git a/backend/src/test/java/com/woowacourse/f12/application/member/MemberServiceTest.java b/backend/src/test/java/com/woowacourse/f12/application/member/MemberServiceTest.java index cb1e132f..34852b7f 100644 --- a/backend/src/test/java/com/woowacourse/f12/application/member/MemberServiceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/application/member/MemberServiceTest.java @@ -1,26 +1,40 @@ package com.woowacourse.f12.application.member; -import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; -import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.JUNIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.SENIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.BACKEND_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.ETC_CONSTANT; +import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.verify; +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; import com.woowacourse.f12.dto.request.member.MemberRequest; +import com.woowacourse.f12.dto.request.member.MemberSearchRequest; +import com.woowacourse.f12.dto.response.member.MemberPageResponse; import com.woowacourse.f12.dto.response.member.MemberResponse; +import com.woowacourse.f12.dto.response.member.MemberWithProfileProductResponse; import com.woowacourse.f12.exception.badrequest.InvalidProfileArgumentException; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; +import java.util.List; import java.util.Optional; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; @ExtendWith(MockitoExtension.class) class MemberServiceTest { @@ -89,9 +103,33 @@ class MemberServiceTest { .willReturn(Optional.of(CORINNE.생성(1L))); // when - memberService.updateMember(1L, new MemberRequest(JUNIOR, ETC)); + memberService.updateMember(1L, new MemberRequest(JUNIOR_CONSTANT, ETC_CONSTANT)); // then verify(memberRepository).findById(1L); } + + @Test + void 키워드와_옵션으로_회원을_조회한다() { + // given + Pageable pageable = PageRequest.of(0, 10); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(CORINNE.생성(1L), KEYBOARD_1.생성(1L)); + Member member = CORINNE.대표장비를_추가해서_생성(1L, inventoryProduct); + + given(memberRepository.findBySearchConditions("cheese", SENIOR, BACKEND, pageable)) + .willReturn(new SliceImpl<>(List.of(member), pageable, false)); + + // when + MemberSearchRequest memberSearchRequest = new MemberSearchRequest("cheese", SENIOR_CONSTANT, BACKEND_CONSTANT); + MemberPageResponse memberPageResponse = memberService.findByContains(memberSearchRequest, pageable); + + // then + assertAll( + () -> verify(memberRepository).findBySearchConditions("cheese", SENIOR, BACKEND, pageable), + () -> assertThat(memberPageResponse.isHasNext()).isFalse(), + () -> assertThat(memberPageResponse.getItems()).usingRecursiveFieldByFieldElementComparator() + .containsOnly(MemberWithProfileProductResponse.from(member)) + ); + } + } diff --git a/backend/src/test/java/com/woowacourse/f12/application/product/KeyboardServiceTest.java b/backend/src/test/java/com/woowacourse/f12/application/product/KeyboardServiceTest.java deleted file mode 100644 index 6efccc1b..00000000 --- a/backend/src/test/java/com/woowacourse/f12/application/product/KeyboardServiceTest.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.woowacourse.f12.application.product; - -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertAll; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.BDDMockito.anyLong; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.verify; - -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; -import com.woowacourse.f12.exception.notfound.KeyboardNotFoundException; -import java.util.List; -import java.util.Optional; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; -import org.mockito.InjectMocks; -import org.mockito.Mock; -import org.mockito.junit.jupiter.MockitoExtension; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.SliceImpl; - -@ExtendWith(MockitoExtension.class) -class KeyboardServiceTest { - - @Mock - private KeyboardRepository keyboardRepository; - - @InjectMocks - private KeyboardService keyboardService; - - @Test - void id_값으로_키보드를_조회한다() { - // given - Keyboard keyboard = KEYBOARD_1.생성(1L); - - given(keyboardRepository.findById(anyLong())) - .willReturn(Optional.of(keyboard)); - // when - KeyboardResponse keyboardResponse = keyboardService.findById(1L); - - // then - assertAll( - () -> verify(keyboardRepository).findById(1L), - () -> assertThat(keyboardResponse).usingRecursiveComparison() - .isEqualTo(KeyboardResponse.from(keyboard)) - ); - } - - @Test - void 존재하지_않는_id_값으로_키보드를_조회하면_예외를_반환한다() { - // given - given(keyboardRepository.findById(anyLong())) - .willReturn(Optional.empty()); - // when then - assertAll( - () -> assertThatThrownBy(() -> keyboardService.findById(1L)) - .isExactlyInstanceOf(KeyboardNotFoundException.class), - () -> verify(keyboardRepository).findById(1L) - ); - } - - @Test - void 전체_키보드_목록을_조회한다() { - // given - Keyboard keyboard = KEYBOARD_1.생성(1L); - Pageable pageable = PageRequest.of(0, 1); - given(keyboardRepository.findPageBy(any(Pageable.class))) - .willReturn(new SliceImpl<>(List.of(keyboard), pageable, false)); - - // when - KeyboardPageResponse keyboardPageResponse = keyboardService.findPage(pageable); - - // then - assertAll( - () -> verify(keyboardRepository).findPageBy(any(Pageable.class)), - () -> assertThat(keyboardPageResponse.isHasNext()).isFalse(), - () -> assertThat(keyboardPageResponse.getItems()).hasSize(1) - .usingRecursiveFieldByFieldElementComparator() - .containsOnly(KeyboardResponse.from(keyboard)) - ); - } -} diff --git a/backend/src/test/java/com/woowacourse/f12/application/product/ProductServiceTest.java b/backend/src/test/java/com/woowacourse/f12/application/product/ProductServiceTest.java new file mode 100644 index 00000000..c7c67bab --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/application/product/ProductServiceTest.java @@ -0,0 +1,164 @@ +package com.woowacourse.f12.application.product; + +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.CareerLevel.MID_LEVEL; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.JUNIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.MID_LEVEL_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.NONE_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.SENIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.BACKEND_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.ETC_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.FRONTEND_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.MOBILE_CONSTANT; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.MOUSE_1; +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; +import static org.junit.jupiter.api.Assertions.assertAll; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.anyLong; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.verify; + +import com.woowacourse.f12.domain.product.Category; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; +import com.woowacourse.f12.domain.review.CareerLevelCount; +import com.woowacourse.f12.domain.review.JobTypeCount; +import com.woowacourse.f12.domain.review.ReviewRepository; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.dto.response.product.ProductStatisticsResponse; +import com.woowacourse.f12.exception.notfound.ProductNotFoundException; +import com.woowacourse.f12.presentation.product.CategoryConstant; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; + +@ExtendWith(MockitoExtension.class) +class ProductServiceTest { + + @Mock + private ProductRepository productRepository; + + @Mock + private ReviewRepository reviewRepository; + + @InjectMocks + private ProductService productService; + + @Test + void id_값으로_제품을_조회한다() { + // given + Product product = KEYBOARD_1.생성(1L); + + given(productRepository.findById(anyLong())) + .willReturn(Optional.of(product)); + + // when + ProductResponse productResponse = productService.findById(1L); + + // then + assertAll( + () -> verify(productRepository).findById(1L), + () -> assertThat(productResponse).usingRecursiveComparison() + .isEqualTo(ProductResponse.from(product)) + ); + } + + @Test + void 존재하지_않는_id_값으로_제품을_조회하면_예외를_반환한다() { + // given + given(productRepository.findById(anyLong())) + .willReturn(Optional.empty()); + + // when then + assertAll( + () -> assertThatThrownBy(() -> productService.findById(1L)) + .isExactlyInstanceOf(ProductNotFoundException.class), + () -> verify(productRepository).findById(1L) + ); + } + + @Test + void 전체_키보드_목록을_조회한다() { + // given + Product product = KEYBOARD_1.생성(1L); + Pageable pageable = PageRequest.of(0, 1); + given(productRepository.findPageByCategory(eq(Category.KEYBOARD), any(Pageable.class))) + .willReturn(new SliceImpl<>(List.of(product), pageable, false)); + + // when + ProductPageResponse productPageResponse = productService.findPage(CategoryConstant.KEYBOARD_CONSTANT, pageable); + + // then + assertAll( + () -> verify(productRepository).findPageByCategory(eq(Category.KEYBOARD), any(Pageable.class)), + () -> assertThat(productPageResponse.isHasNext()).isFalse(), + () -> assertThat(productPageResponse.getItems()).hasSize(1) + .usingRecursiveFieldByFieldElementComparator() + .containsOnly(ProductResponse.from(product)) + ); + } + + @Test + void 전체_제품_목록을_조회한다() { + // given + Product product = KEYBOARD_1.생성(1L); + MOUSE_1.생성(2L); + Pageable pageable = PageRequest.of(0, 1); + given(productRepository.findPageBy(any(Pageable.class))) + .willReturn(new SliceImpl<>(List.of(product), pageable, true)); + + // when + ProductPageResponse productPageResponse = productService.findPage(null, pageable); + + // then + assertAll( + () -> verify(productRepository).findPageBy(any(Pageable.class)), + () -> assertThat(productPageResponse.isHasNext()).isTrue(), + () -> assertThat(productPageResponse.getItems()).hasSize(1) + .usingRecursiveFieldByFieldElementComparator() + .containsOnly(ProductResponse.from(product)) + ); + } + + @Test + void 특정_제품의_사용자의_연차와_직군의_비율을_반환한다() { + // given + Long productId = 1L; + given(productRepository.existsById(productId)) + .willReturn(true); + given(reviewRepository.findCareerLevelCountByProductId(productId)) + .willReturn(List.of(new CareerLevelCount(JUNIOR, 1), new CareerLevelCount(MID_LEVEL, 1))); + given(reviewRepository.findJobTypeCountByProductId(productId)) + .willReturn(List.of(new JobTypeCount(BACKEND, 1), new JobTypeCount(ETC, 1))); + + // when + ProductStatisticsResponse productStatisticsResponse = productService.calculateMemberStatisticsById(productId); + + // then + assertAll( + () -> verify(productRepository).existsById(productId), + () -> verify(reviewRepository).findCareerLevelCountByProductId(productId), + () -> verify(reviewRepository).findJobTypeCountByProductId(productId), + () -> assertThat(productStatisticsResponse.getCareerLevel()).usingRecursiveComparison() + .isEqualTo(Map.of(NONE_CONSTANT, 0.0, JUNIOR_CONSTANT, 0.5, MID_LEVEL_CONSTANT, 0.5, + SENIOR_CONSTANT, 0.0)), + () -> assertThat(productStatisticsResponse.getJobType()).usingRecursiveComparison() + .isEqualTo(Map.of(FRONTEND_CONSTANT, 0.0, BACKEND_CONSTANT, 0.5, MOBILE_CONSTANT, 0.0, + ETC_CONSTANT, 0.5)) + ); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/application/review/ReviewServiceTest.java b/backend/src/test/java/com/woowacourse/f12/application/review/ReviewServiceTest.java index 9909322b..b355add8 100644 --- a/backend/src/test/java/com/woowacourse/f12/application/review/ReviewServiceTest.java +++ b/backend/src/test/java/com/woowacourse/f12/application/review/ReviewServiceTest.java @@ -1,9 +1,9 @@ package com.woowacourse.f12.application.review; import static com.woowacourse.f12.support.InventoryProductFixtures.UNSELECTED_INVENTORY_PRODUCT; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; @@ -19,8 +19,8 @@ import com.woowacourse.f12.domain.inventoryproduct.InventoryProductRepository; import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; import com.woowacourse.f12.domain.review.Review; import com.woowacourse.f12.domain.review.ReviewRepository; import com.woowacourse.f12.dto.request.review.ReviewRequest; @@ -30,8 +30,8 @@ import com.woowacourse.f12.dto.response.review.ReviewWithProductResponse; import com.woowacourse.f12.exception.badrequest.AlreadyWrittenReviewException; import com.woowacourse.f12.exception.forbidden.NotAuthorException; -import com.woowacourse.f12.exception.notfound.KeyboardNotFoundException; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; +import com.woowacourse.f12.exception.notfound.ProductNotFoundException; import com.woowacourse.f12.exception.notfound.ReviewNotFoundException; import java.util.List; import java.util.Optional; @@ -54,7 +54,7 @@ class ReviewServiceTest { private ReviewRepository reviewRepository; @Mock - private KeyboardRepository keyboardRepository; + private ProductRepository productRepository; @Mock private MemberRepository memberRepository; @@ -70,20 +70,20 @@ class ReviewServiceTest { // given ReviewRequest reviewRequest = new ReviewRequest("내용", 5); Long productId = 1L; - Keyboard keyboard = KEYBOARD_1.생성(productId); + Product product = KEYBOARD_1.생성(productId); Long memberId = 1L; Member member = CORINNE.생성(memberId); - InventoryProduct inventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + InventoryProduct inventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(member, product); given(memberRepository.findById(1L)) .willReturn(Optional.of(member)); - given(keyboardRepository.findById(productId)) - .willReturn(Optional.of(keyboard)); - given(inventoryProductRepository.existsByMemberIdAndKeyboard(memberId, keyboard)) + given(productRepository.findById(productId)) + .willReturn(Optional.of(product)); + given(inventoryProductRepository.existsByMemberAndProduct(member, product)) .willReturn(false); given(inventoryProductRepository.save(inventoryProduct)) .willReturn(inventoryProduct); - given(reviewRepository.save(reviewRequest.toReview(keyboard, member))) - .willReturn(REVIEW_RATING_5.작성(1L, keyboard, member)); + given(reviewRepository.save(reviewRequest.toReview(product, member))) + .willReturn(REVIEW_RATING_5.작성(1L, product, member)); // when Long reviewId = reviewService.saveReviewAndInventoryProduct(productId, memberId, reviewRequest); @@ -91,10 +91,10 @@ class ReviewServiceTest { // then assertAll( () -> assertThat(reviewId).isEqualTo(1L), - () -> verify(keyboardRepository).findById(productId), + () -> verify(productRepository).findById(productId), () -> verify(memberRepository).findById(memberId), () -> verify(reviewRepository).save(any(Review.class)), - () -> verify(inventoryProductRepository).existsByMemberIdAndKeyboard(memberId, keyboard), + () -> verify(inventoryProductRepository).existsByMemberAndProduct(member, product), () -> verify(inventoryProductRepository).save(inventoryProduct) ); } @@ -129,15 +129,15 @@ class ReviewServiceTest { given(memberRepository.findById(memberId)) .willReturn(Optional.of(member)); - given(keyboardRepository.findById(productId)) + given(productRepository.findById(productId)) .willReturn(Optional.empty()); // when, then assertAll( () -> assertThatThrownBy(() -> reviewService.saveReviewAndInventoryProduct(1L, 1L, reviewRequest)) - .isExactlyInstanceOf(KeyboardNotFoundException.class), + .isExactlyInstanceOf(ProductNotFoundException.class), () -> verify(memberRepository).findById(memberId), - () -> verify(keyboardRepository).findById(productId), + () -> verify(productRepository).findById(productId), () -> verify(reviewRepository, times(0)).save(any(Review.class)) ); } @@ -149,13 +149,13 @@ class ReviewServiceTest { Long productId = 1L; Member member = CORINNE.생성(memberId); ReviewRequest reviewRequest = new ReviewRequest("내용", 5); - Keyboard keyboard = KEYBOARD_1.생성(productId); + Product product = KEYBOARD_1.생성(productId); given(memberRepository.findById(memberId)) .willReturn(Optional.of(member)); - given(keyboardRepository.findById(productId)) - .willReturn(Optional.of(keyboard)); - given(reviewRepository.existsByMemberAndKeyboard(member, keyboard)) + given(productRepository.findById(productId)) + .willReturn(Optional.of(product)); + given(reviewRepository.existsByMemberAndProduct(member, product)) .willReturn(true); // when, then @@ -163,8 +163,8 @@ class ReviewServiceTest { () -> assertThatThrownBy(() -> reviewService.saveReviewAndInventoryProduct(1L, 1L, reviewRequest)) .isExactlyInstanceOf(AlreadyWrittenReviewException.class), () -> verify(memberRepository).findById(memberId), - () -> verify(keyboardRepository).findById(productId), - () -> verify(reviewRepository).existsByMemberAndKeyboard(member, keyboard), + () -> verify(productRepository).findById(productId), + () -> verify(reviewRepository).existsByMemberAndProduct(member, product), () -> verify(reviewRepository, times(0)).save(any(Review.class)) ); } @@ -173,13 +173,13 @@ class ReviewServiceTest { void 특정_제품에_대한_리뷰_목록을_조회한다() { // given Long productId = 1L; - Keyboard keyboard = KEYBOARD_1.생성(); + Product product = KEYBOARD_1.생성(); Member member = CORINNE.생성(1L); Pageable pageable = PageRequest.of(0, 1, Sort.by(Order.desc("createdAt"))); - Review review = REVIEW_RATING_5.작성(1L, keyboard, member); + Review review = REVIEW_RATING_5.작성(1L, product, member); Slice slice = new SliceImpl<>(List.of(review), pageable, true); - given(keyboardRepository.existsById(productId)) + given(productRepository.existsById(productId)) .willReturn(true); given(reviewRepository.findPageByProductId(productId, pageable)) .willReturn(slice); @@ -193,7 +193,7 @@ class ReviewServiceTest { .usingRecursiveFieldByFieldElementComparator() .containsOnly(ReviewResponse.from(review)), () -> assertThat(reviewPageResponse.isHasNext()).isTrue(), - () -> verify(keyboardRepository).existsById(productId), + () -> verify(productRepository).existsById(productId), () -> verify(reviewRepository).findPageByProductId(productId, pageable) ); } @@ -202,14 +202,14 @@ class ReviewServiceTest { void 존재하지_않는_제품에_대한_리뷰_목록을_조회하면_예외가_발생한다() { // given Pageable pageable = PageRequest.of(0, 1, Sort.by(Order.desc("createdAt"))); - given(keyboardRepository.existsById(0L)) + given(productRepository.existsById(0L)) .willReturn(false); // when, then assertAll( () -> assertThatThrownBy(() -> reviewService.findPageByProductId(0L, pageable)) - .isExactlyInstanceOf(KeyboardNotFoundException.class), - () -> verify(keyboardRepository).existsById(0L) + .isExactlyInstanceOf(ProductNotFoundException.class), + () -> verify(productRepository).existsById(0L) ); } diff --git a/backend/src/test/java/com/woowacourse/f12/config/WebConfigTest.java b/backend/src/test/java/com/woowacourse/f12/config/WebConfigTest.java index b92dfba0..ab68017c 100644 --- a/backend/src/test/java/com/woowacourse/f12/config/WebConfigTest.java +++ b/backend/src/test/java/com/woowacourse/f12/config/WebConfigTest.java @@ -24,7 +24,7 @@ class WebConfigTest { @Test void CORS가_허용되어있다() throws Exception { mockMvc.perform( - options("/api/v1/keyboards") + options("/api/v1/products") .header(HttpHeaders.ORIGIN, "http://localhost:8080") .header(HttpHeaders.ACCESS_CONTROL_REQUEST_METHOD, "GET") ) diff --git a/backend/src/test/java/com/woowacourse/f12/documentation/inventoryproduct/InventoryProductDocumentation.java b/backend/src/test/java/com/woowacourse/f12/documentation/inventoryproduct/InventoryProductDocumentation.java index 7a7ad2df..edcf85dc 100644 --- a/backend/src/test/java/com/woowacourse/f12/documentation/inventoryproduct/InventoryProductDocumentation.java +++ b/backend/src/test/java/com/woowacourse/f12/documentation/inventoryproduct/InventoryProductDocumentation.java @@ -1,7 +1,8 @@ package com.woowacourse.f12.documentation.inventoryproduct; import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.MOUSE_1; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willDoNothing; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -15,9 +16,11 @@ import com.woowacourse.f12.application.inventoryproduct.InventoryProductService; import com.woowacourse.f12.documentation.Documentation; import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.request.inventoryproduct.ProfileProductRequest; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductsResponse; import com.woowacourse.f12.presentation.inventoryproduct.InventoryProductController; +import com.woowacourse.f12.support.MemberFixtures; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -51,7 +54,7 @@ class InventoryProductDocumentation extends Documentation { given(jwtProvider.getPayload(authorizationHeader)) .willReturn("1"); Long memberId = 1L; - ProfileProductRequest profileProductRequest = new ProfileProductRequest(1L, 2L); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(List.of(1L)); willDoNothing().given(inventoryProductService).updateProfileProducts(memberId, profileProductRequest); // when @@ -74,14 +77,16 @@ class InventoryProductDocumentation extends Documentation { void 멤버_id_로_인벤토리_상품_조회하는_API_문서화() throws Exception { // given Long memberId = 1L; - InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, memberId, KEYBOARD_1.생성(1L)); + Member member = MemberFixtures.CORINNE.생성(memberId); + InventoryProduct inventoryProduct1 = SELECTED_INVENTORY_PRODUCT.생성(1L, member, KEYBOARD_1.생성(1L)); + InventoryProduct inventoryProduct2 = SELECTED_INVENTORY_PRODUCT.생성(2L, member, MOUSE_1.생성(1L)); String authorizationHeader = "Bearer Token"; given(jwtProvider.validateToken(authorizationHeader)) .willReturn(true); given(jwtProvider.getPayload(authorizationHeader)) .willReturn("1"); given(inventoryProductService.findByMemberId(memberId)) - .willReturn(InventoryProductsResponse.from(List.of(inventoryProduct))); + .willReturn(InventoryProductsResponse.from(List.of(inventoryProduct1, inventoryProduct2))); // when ResultActions resultActions = mockMvc.perform( @@ -99,9 +104,11 @@ class InventoryProductDocumentation extends Documentation { void 다른_멤버_id_로_인벤토리_상품_조회하는_API_문서화() throws Exception { // given Long memberId = 1L; - InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, memberId, KEYBOARD_1.생성(1L)); + Member member = MemberFixtures.CORINNE.생성(memberId); + InventoryProduct inventoryProduct1 = SELECTED_INVENTORY_PRODUCT.생성(1L, member, KEYBOARD_1.생성(1L)); + InventoryProduct inventoryProduct2 = SELECTED_INVENTORY_PRODUCT.생성(2L, member, MOUSE_1.생성(1L)); given(inventoryProductService.findByMemberId(memberId)) - .willReturn(InventoryProductsResponse.from(List.of(inventoryProduct))); + .willReturn(InventoryProductsResponse.from(List.of(inventoryProduct1, inventoryProduct2))); // when ResultActions resultActions = mockMvc.perform( diff --git a/backend/src/test/java/com/woowacourse/f12/documentation/member/MemberDocumentation.java b/backend/src/test/java/com/woowacourse/f12/documentation/member/MemberDocumentation.java index 6fad8fd7..a7f0c354 100644 --- a/backend/src/test/java/com/woowacourse/f12/documentation/member/MemberDocumentation.java +++ b/backend/src/test/java/com/woowacourse/f12/documentation/member/MemberDocumentation.java @@ -1,8 +1,11 @@ package com.woowacourse.f12.documentation.member; -import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; -import static com.woowacourse.f12.domain.member.JobType.BACK_END; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.JUNIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.BACKEND_CONSTANT; +import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static org.mockito.ArgumentMatchers.any; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willDoNothing; import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; @@ -15,13 +18,21 @@ import com.woowacourse.f12.application.auth.JwtProvider; import com.woowacourse.f12.application.member.MemberService; import com.woowacourse.f12.documentation.Documentation; +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.request.member.MemberRequest; +import com.woowacourse.f12.dto.request.member.MemberSearchRequest; +import com.woowacourse.f12.dto.response.member.MemberPageResponse; import com.woowacourse.f12.dto.response.member.MemberResponse; import com.woowacourse.f12.presentation.member.MemberController; +import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; @@ -85,7 +96,7 @@ public class MemberDocumentation extends Documentation { @Test void 로그인된_상태에서_나의_회원정보를_수정_API_문서화() throws Exception { // given - MemberRequest memberRequest = new MemberRequest(JUNIOR, BACK_END); + MemberRequest memberRequest = new MemberRequest(JUNIOR_CONSTANT, BACKEND_CONSTANT); String authorizationHeader = "Bearer Token"; given(jwtProvider.validateToken(authorizationHeader)) .willReturn(true); @@ -106,4 +117,25 @@ public class MemberDocumentation extends Documentation { .andDo(document("members-update")) .andDo(print()); } + + @Test + void 키워드와_옵션으로_회원을_조회_API_문서화() throws Exception { + // given + Pageable pageable = PageRequest.of(0, 10); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(CORINNE.생성(1L), + KEYBOARD_1.생성(1L)); + Member member = CORINNE.대표장비를_추가해서_생성(1L, inventoryProduct); + + MemberPageResponse memberPageResponse = MemberPageResponse.from( + new SliceImpl<>(List.of(member), pageable, false)); + given(memberService.findByContains(any(MemberSearchRequest.class), any(PageRequest.class))) + .willReturn(memberPageResponse); + + // when, then + mockMvc.perform( + get("/api/v1/members?query=cheese&careerLevel=none&jobType=backend&page=0&size=10") + ).andExpect(status().isOk()) + .andDo(document("members-search")) + .andDo(print()); + } } diff --git a/backend/src/test/java/com/woowacourse/f12/documentation/product/KeyboardDocumentation.java b/backend/src/test/java/com/woowacourse/f12/documentation/product/KeyboardDocumentation.java deleted file mode 100644 index bce7a07c..00000000 --- a/backend/src/test/java/com/woowacourse/f12/documentation/product/KeyboardDocumentation.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.woowacourse.f12.documentation.product; - -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.woowacourse.f12.application.product.KeyboardService; -import com.woowacourse.f12.documentation.Documentation; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; -import com.woowacourse.f12.presentation.product.KeyboardController; -import java.util.List; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.SliceImpl; -import org.springframework.data.domain.Sort; -import org.springframework.test.web.servlet.MockMvc; -import org.springframework.test.web.servlet.ResultActions; - -@WebMvcTest(KeyboardController.class) -class KeyboardDocumentation extends Documentation { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private KeyboardService keyboardService; - - @Test - void 키보드_단일_조회_API_문서화() throws Exception { - // given - Keyboard keyboard = KEYBOARD_1.생성(1L); - given(keyboardService.findById(1L)) - .willReturn(KeyboardResponse.from(keyboard)); - - // when - ResultActions resultActions = mockMvc.perform( - get("/api/v1/keyboards/1") - ); - - // then - resultActions.andExpect(status().isOk()) - .andDo(print()) - .andDo( - document("keyboards-get") - ); - } - - @Test - void 키보드_목록_조회_API_문서화() throws Exception { - // given - Keyboard keyboard1 = KEYBOARD_1.생성(1L); - Keyboard keyboard2 = KEYBOARD_2.생성(2L); - PageRequest pageable = PageRequest.of(0, 5, Sort.by("rating").descending()); - SliceImpl keyboards = new SliceImpl<>(List.of(keyboard1, keyboard2), pageable, false); - - given(keyboardService.findPage(pageable)) - .willReturn(KeyboardPageResponse.from(keyboards)); - - // when - ResultActions resultActions = mockMvc.perform( - get("/api/v1/keyboards?page=0&size=5&sort=rating,desc") - ); - - // then - resultActions.andExpect(status().isOk()) - .andDo(print()) - .andDo( - document("keyboards-page-get") - ); - } -} diff --git a/backend/src/test/java/com/woowacourse/f12/documentation/product/ProductDocumentation.java b/backend/src/test/java/com/woowacourse/f12/documentation/product/ProductDocumentation.java new file mode 100644 index 00000000..61a66711 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/documentation/product/ProductDocumentation.java @@ -0,0 +1,115 @@ +package com.woowacourse.f12.documentation.product; + +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.CareerLevel.MID_LEVEL; +import static com.woowacourse.f12.domain.member.CareerLevel.NONE; +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.domain.member.JobType.FRONTEND; +import static com.woowacourse.f12.domain.member.JobType.MOBILE; +import static com.woowacourse.f12.presentation.product.CategoryConstant.KEYBOARD_CONSTANT; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.BDDMockito.given; +import static org.springframework.restdocs.mockmvc.MockMvcRestDocumentation.document; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.woowacourse.f12.application.product.ProductService; +import com.woowacourse.f12.documentation.Documentation; +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.dto.response.product.ProductStatisticsResponse; +import com.woowacourse.f12.presentation.product.ProductController; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.SliceImpl; +import org.springframework.data.domain.Sort; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.ResultActions; + +@WebMvcTest(ProductController.class) +class ProductDocumentation extends Documentation { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ProductService productService; + + @Test + void 제품_단일_조회_API_문서화() throws Exception { + // given + Product product = KEYBOARD_1.생성(1L); + given(productService.findById(1L)) + .willReturn(ProductResponse.from(product)); + + // when + ResultActions resultActions = mockMvc.perform( + get("/api/v1/products/1") + ); + + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andDo( + document("products-get") + ); + } + + @Test + void 제품_목록_조회_API_문서화() throws Exception { + // given + Product product1 = KEYBOARD_1.생성(1L); + Product product2 = KEYBOARD_2.생성(2L); + PageRequest pageable = PageRequest.of(0, 5, Sort.by("rating").descending()); + SliceImpl keyboards = new SliceImpl<>(List.of(product1, product2), pageable, false); + + given(productService.findPage(KEYBOARD_CONSTANT, pageable)) + .willReturn(ProductPageResponse.from(keyboards)); + + // when + ResultActions resultActions = mockMvc.perform( + get("/api/v1/products?category=keyboard&page=0&size=5&sort=rating,desc") + ); + + // then + resultActions.andExpect(status().isOk()) + .andDo(print()) + .andDo( + document("products-page-get") + ); + } + + @Test + void 특정_제품에_대한_사용자_통계_조회_API_문서화() throws Exception { + // given + Map careerLevel = Map.of(NONE, 0.0, JUNIOR, 0.5, + MID_LEVEL, 0.0, SENIOR, 0.5); + Map jobType = Map.of(FRONTEND, 0.33, BACKEND, + 0.33, MOBILE, 0.33, ETC, 0.0); + given(productService.calculateMemberStatisticsById(anyLong())) + .willReturn(ProductStatisticsResponse.of(careerLevel, jobType)); + + // when + ResultActions resultActions = mockMvc.perform( + get("/api/v1/products/1/statistics") + ); + + // then + resultActions.andExpect(status().isOk()) + .andDo(document("products-member-statistics-get")) + .andDo(print()); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/documentation/review/ReviewDocumentation.java b/backend/src/test/java/com/woowacourse/f12/documentation/review/ReviewDocumentation.java index b76d08ba..c02ccdb4 100644 --- a/backend/src/test/java/com/woowacourse/f12/documentation/review/ReviewDocumentation.java +++ b/backend/src/test/java/com/woowacourse/f12/documentation/review/ReviewDocumentation.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.documentation.review; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; import static com.woowacourse.f12.support.MemberFixtures.MINCHO; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; @@ -23,7 +23,7 @@ import com.woowacourse.f12.application.review.ReviewService; import com.woowacourse.f12.documentation.Documentation; import com.woowacourse.f12.domain.member.Member; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.product.Product; import com.woowacourse.f12.dto.request.review.ReviewRequest; import com.woowacourse.f12.dto.response.review.ReviewPageResponse; import com.woowacourse.f12.dto.response.review.ReviewWithProductPageResponse; @@ -71,7 +71,7 @@ public class ReviewDocumentation extends Documentation { // when ResultActions resultActions = mockMvc.perform( - post("/api/v1/keyboards/" + 1L + "/reviews") + post("/api/v1/products/" + 1L + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -99,7 +99,7 @@ public class ReviewDocumentation extends Documentation { // when ResultActions resultActions = mockMvc.perform( - post("/api/v1/keyboards/" + 1L + "/reviews") + post("/api/v1/products/" + 1L + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -117,12 +117,12 @@ public class ReviewDocumentation extends Documentation { void 특정_제품의_리뷰_목록_조회_API_문서화() throws Exception { // given PageRequest pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending()); - Keyboard keyboard = KEYBOARD_1.생성(1L); + Product product = KEYBOARD_1.생성(1L); Member corinne = CORINNE.생성(1L); Member mincho = MINCHO.생성(2L); ReviewPageResponse reviewPageResponse = ReviewPageResponse.from( new SliceImpl<>( - List.of(REVIEW_RATING_5.작성(1L, keyboard, corinne), REVIEW_RATING_4.작성(2L, keyboard, mincho)), + List.of(REVIEW_RATING_5.작성(1L, product, corinne), REVIEW_RATING_4.작성(2L, product, mincho)), pageable, false)); given(reviewService.findPageByProductId(anyLong(), any(Pageable.class))) @@ -130,7 +130,7 @@ public class ReviewDocumentation extends Documentation { // when, then ResultActions resultActions = mockMvc.perform( - get("/api/v1/keyboards/1/reviews?page=0&size=10&sort=createdAt,desc")); + get("/api/v1/products/1/reviews?page=0&size=10&sort=createdAt,desc")); // then resultActions.andExpect(status().isOk()) @@ -144,12 +144,12 @@ public class ReviewDocumentation extends Documentation { void 모든_리뷰_목록_페이지_조회_API_문서화() throws Exception { // given PageRequest pageable = PageRequest.of(0, 10, Sort.by("createdAt").descending()); - Keyboard keyboard1 = KEYBOARD_1.생성(1L); - Keyboard keyboard2 = KEYBOARD_2.생성(2L); + Product product1 = KEYBOARD_1.생성(1L); + Product product2 = KEYBOARD_2.생성(2L); Member member = CORINNE.생성(1L); ReviewWithProductPageResponse reviewWithProductPageResponse = ReviewWithProductPageResponse.from( new SliceImpl<>( - List.of(REVIEW_RATING_5.작성(1L, keyboard1, member), REVIEW_RATING_4.작성(2L, keyboard2, member)), + List.of(REVIEW_RATING_5.작성(1L, product1, member), REVIEW_RATING_4.작성(2L, product2, member)), pageable, false)); given(reviewService.findPage(any(Pageable.class))) diff --git a/backend/src/test/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepositoryTest.java b/backend/src/test/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepositoryTest.java index 7a011727..c63b70f3 100644 --- a/backend/src/test/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepositoryTest.java +++ b/backend/src/test/java/com/woowacourse/f12/domain/inventoryproduct/InventoryProductRepositoryTest.java @@ -1,13 +1,18 @@ package com.woowacourse.f12.domain.inventoryproduct; import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; +import static com.woowacourse.f12.support.InventoryProductFixtures.UNSELECTED_INVENTORY_PRODUCT; +import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.MemberFixtures.MINCHO; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; import static org.assertj.core.api.Assertions.assertThat; import com.woowacourse.f12.config.JpaConfig; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; +import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.domain.member.MemberRepository; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -22,21 +27,24 @@ class InventoryProductRepositoryTest { private InventoryProductRepository inventoryProductRepository; @Autowired - private KeyboardRepository keyboardRepository; + private ProductRepository productRepository; + + @Autowired + private MemberRepository memberRepository; @Test void 멤버_아이디로_인벤토리_상품_목록을_조회한다() { // given - Long myMemberId = 1L; - Long otherMemberId = 2L; - Keyboard keyboard1 = 키보드를_저장한다(KEYBOARD_1.생성(1L)); - Keyboard keyboard2 = 키보드를_저장한다(KEYBOARD_2.생성(2L)); - InventoryProduct inventoryProduct1 = SELECTED_INVENTORY_PRODUCT.생성(myMemberId, keyboard1); - InventoryProduct inventoryProduct2 = SELECTED_INVENTORY_PRODUCT.생성(otherMemberId, keyboard2); + Member me = 회원을_저장한다(CORINNE.생성()); + Member otherMember = 회원을_저장한다(MINCHO.생성()); + Product product1 = 제품을_저장한다(KEYBOARD_1.생성()); + Product product2 = 제품을_저장한다(KEYBOARD_2.생성()); + InventoryProduct inventoryProduct1 = SELECTED_INVENTORY_PRODUCT.생성(me, product1); + InventoryProduct inventoryProduct2 = SELECTED_INVENTORY_PRODUCT.생성(otherMember, product2); inventoryProductRepository.saveAll(List.of(inventoryProduct1, inventoryProduct2)); // when - List inventoryProducts = inventoryProductRepository.findByMemberId(myMemberId); + List inventoryProducts = inventoryProductRepository.findByMemberId(me.getId()); // then assertThat(inventoryProducts).containsOnly(inventoryProduct1); @@ -44,20 +52,55 @@ class InventoryProductRepositoryTest { @Test void 멤버_아이디와_상품으로_인벤토리_상품_목록을_조회한다() { - // given - Long memberId = 1L; - Keyboard keyboard = 키보드를_저장한다(KEYBOARD_1.생성(1L)); - InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(memberId, keyboard); + // given다 + Member member = 회원을_저장한다(CORINNE.생성()); + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(member, product); inventoryProductRepository.save(inventoryProduct); // when - boolean actual = inventoryProductRepository.existsByMemberIdAndKeyboard(memberId, keyboard); + boolean actual = inventoryProductRepository.existsByMemberAndProduct(member, product); // then assertThat(actual).isTrue(); } - private Keyboard 키보드를_저장한다(Keyboard keyboard) { - return keyboardRepository.save(keyboard); + @Test + void 인벤토리_상품_모두를_대표_장비에서_해제한다() { + // given + Member member = 회원을_저장한다(CORINNE.생성()); + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + InventoryProduct inventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(member, product); + inventoryProductRepository.save(inventoryProduct); + + // when + int actual = inventoryProductRepository.updateBulkProfileProductByMember(member, false); + + // then + assertThat(actual).isOne(); + } + + @Test + void 인벤토리_상품을_대표_장비로_등록한다() { + // given + Member member = 회원을_저장한다(CORINNE.생성()); + Product product = 제품을_저장한다(KEYBOARD_1.생성()); + InventoryProduct inventoryProduct = UNSELECTED_INVENTORY_PRODUCT.생성(member, product); + inventoryProductRepository.save(inventoryProduct); + + // when + int actual = inventoryProductRepository.updateBulkProfileProductByMemberAndIds(member, + List.of(inventoryProduct.getId()), true); + + // then + assertThat(actual).isOne(); + } + + private Product 제품을_저장한다(Product product) { + return productRepository.save(product); + } + + private Member 회원을_저장한다(Member member) { + return memberRepository.save(member); } } diff --git a/backend/src/test/java/com/woowacourse/f12/domain/member/MemberRepositoryTest.java b/backend/src/test/java/com/woowacourse/f12/domain/member/MemberRepositoryTest.java new file mode 100644 index 00000000..b8b2c7a8 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/domain/member/MemberRepositoryTest.java @@ -0,0 +1,114 @@ +package com.woowacourse.f12.domain.member; + +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.MemberFixtures.MINCHO; +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertAll; + +import com.woowacourse.f12.config.JpaConfig; +import java.util.List; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.NullAndEmptySource; +import org.junit.jupiter.params.provider.ValueSource; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.context.annotation.Import; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Slice; + +@DataJpaTest +@Import({JpaConfig.class}) +class MemberRepositoryTest { + + @Autowired + private MemberRepository memberRepository; + + @Test + void 키워드와_옵션을_입력하지않고_회원을_조회한다() { + // given + memberRepository.saveAll(List.of(CORINNE.생성(), MINCHO.생성())); + + // when + Slice slice = memberRepository.findBySearchConditions(null, null, null, PageRequest.of(0, 2)); + + // then + assertAll( + () -> assertThat(slice.hasNext()).isFalse(), + () -> assertThat(slice.getContent()).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsOnly(CORINNE.생성(), MINCHO.생성()) + ); + } + + @Test + void 회원의_깃허브_아이디를_키워드로_조회한다() { + // given + memberRepository.saveAll(List.of(CORINNE.생성(), MINCHO.생성())); + + // when + Slice slice = memberRepository.findBySearchConditions("hamcheeseburger", null, null, + PageRequest.of(0, 2)); + + // then + assertAll( + () -> assertThat(slice.hasNext()).isFalse(), + () -> assertThat(slice.getContent()).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsOnly(CORINNE.생성()) + ); + } + + @Test + void 회원의_깃허브_아이디_일부를_키워드로_조회한다() { + // given + memberRepository.saveAll(List.of(CORINNE.생성(), MINCHO.생성())); + + // when + Slice slice = memberRepository.findBySearchConditions("cheese", null, null, PageRequest.of(0, 2)); + + // then + assertAll( + () -> assertThat(slice.hasNext()).isFalse(), + () -> assertThat(slice.getContent()).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsOnly(CORINNE.생성()) + ); + } + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {"cheese"}) + void 회원을_키워드와_연차_옵션으로_조회한다(String keyword) { + // given + memberRepository.saveAll(List.of(CORINNE.생성(), MINCHO.생성())); + + // when + Slice slice = memberRepository.findBySearchConditions(keyword, SENIOR, null, PageRequest.of(0, 2)); + + // then + assertAll( + () -> assertThat(slice.hasNext()).isFalse(), + () -> assertThat(slice.getContent()).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsOnly(CORINNE.생성()) + ); + } + + @ParameterizedTest + @NullAndEmptySource + @ValueSource(strings = {"cheese"}) + void 회원을_키워드와_연차와_직군_옵션으로_조회한다(String keyword) { + // given + memberRepository.saveAll(List.of(CORINNE.생성(), MINCHO.생성())); + + // when + Slice slice = memberRepository.findBySearchConditions(keyword, SENIOR, BACKEND, + PageRequest.of(0, 2)); + + // then + assertAll( + () -> assertThat(slice.hasNext()).isFalse(), + () -> assertThat(slice.getContent()).usingRecursiveFieldByFieldElementComparatorIgnoringFields("id") + .containsOnly(CORINNE.생성()) + ); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/domain/member/MemberTest.java b/backend/src/test/java/com/woowacourse/f12/domain/member/MemberTest.java new file mode 100644 index 00000000..aba01e2c --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/domain/member/MemberTest.java @@ -0,0 +1,50 @@ +package com.woowacourse.f12.domain.member; + +import static org.assertj.core.api.Assertions.assertThat; + +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; +import com.woowacourse.f12.domain.product.Category; +import com.woowacourse.f12.domain.product.Product; +import java.util.List; +import org.junit.jupiter.api.Test; + +class MemberTest { + + @Test + void getProfileProducts() { + // given + Product keyboard = Product.builder() + .category(Category.KEYBOARD) + .imageUrl("keyboardImage") + .name("keyboard") + .build(); + Product mouse = Product.builder() + .category(Category.MOUSE) + .imageUrl("mouseImage") + .name("mouse") + .build(); + InventoryProduct selectedInventoryProduct = InventoryProduct.builder() + .product(keyboard) + .selected(true) + .build(); + InventoryProduct unselectedInventoryProduct = InventoryProduct.builder() + .product(mouse) + .selected(false) + .build(); + Member member = Member.builder() + .careerLevel(CareerLevel.JUNIOR) + .jobType(JobType.BACKEND) + .gitHubId("githubId") + .imageUrl("imageUrl") + .name("klay") + .inventoryProducts(List.of(selectedInventoryProduct, unselectedInventoryProduct)) + .build(); + + // when + List profileProducts = member.getProfileProducts(); + + // then + assertThat(profileProducts) + .containsOnly(selectedInventoryProduct.getProduct()); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/domain/product/KeyboardRepositoryTest.java b/backend/src/test/java/com/woowacourse/f12/domain/product/ProductRepositoryTest.java similarity index 57% rename from backend/src/test/java/com/woowacourse/f12/domain/product/KeyboardRepositoryTest.java rename to backend/src/test/java/com/woowacourse/f12/domain/product/ProductRepositoryTest.java index 1131d627..83cf1f58 100644 --- a/backend/src/test/java/com/woowacourse/f12/domain/product/KeyboardRepositoryTest.java +++ b/backend/src/test/java/com/woowacourse/f12/domain/product/ProductRepositoryTest.java @@ -1,8 +1,9 @@ package com.woowacourse.f12.domain.product; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; +import static com.woowacourse.f12.domain.product.Category.KEYBOARD; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_1; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_2; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; @@ -29,10 +30,10 @@ @DataJpaTest @Import(JpaConfig.class) -class KeyboardRepositoryTest { +class ProductRepositoryTest { @Autowired - private KeyboardRepository keyboardRepository; + private ProductRepository productRepository; @Autowired private MemberRepository memberRepository; @@ -44,92 +45,92 @@ class KeyboardRepositoryTest { private EntityManager entityManager; @Test - void 키보드를_단일_조회_한다() { + void 제품을_단일_조회_한다() { // given - Keyboard keyboard = 키보드_저장(KEYBOARD_1.생성()); - Member member = memberRepository.save(CORINNE.생성(1L)); - 리뷰_저장(REVIEW_RATING_4.작성(keyboard, member)); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard, member)); + Product product = 제품_저장(KEYBOARD_1.생성()); + Member member = memberRepository.save(CORINNE.생성()); + 리뷰_저장(REVIEW_RATING_4.작성(product, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product, member)); entityManager.flush(); - entityManager.refresh(keyboard); + entityManager.refresh(product); // when - Keyboard savedKeyboard = keyboardRepository.findById(keyboard.getId()) + Product savedProduct = productRepository.findById(product.getId()) .orElseThrow(IllegalArgumentException::new); // then assertAll( - () -> assertThat(savedKeyboard.getRating()).isEqualTo(4.5), - () -> assertThat(savedKeyboard.getReviewCount()).isEqualTo(2) + () -> assertThat(savedProduct.getRating()).isEqualTo(4.5), + () -> assertThat(savedProduct.getReviewCount()).isEqualTo(2) ); } @Test void 키보드_전체_목록을_페이징하여_조회한다() { // given - Keyboard keyboard1 = 키보드_저장(KEYBOARD_1.생성()); - 키보드_저장(KEYBOARD_2.생성()); + Product product1 = 제품_저장(KEYBOARD_1.생성()); + 제품_저장(KEYBOARD_2.생성()); Pageable pageable = PageRequest.of(0, 1); // when - Slice slice = keyboardRepository.findPageBy(pageable); + Slice slice = productRepository.findPageByCategory(KEYBOARD, pageable); // then assertAll( () -> assertThat(slice.hasNext()).isTrue(), - () -> assertThat(slice.getContent()).containsExactly(keyboard1) + () -> assertThat(slice.getContent()).containsExactly(product1) ); } @Test void 키보드_전체_목록을_리뷰_많은_순으로_페이징하여_조회한다() { // given - Keyboard keyboard1 = 키보드_저장(KEYBOARD_1.생성()); - Keyboard keyboard2 = 키보드_저장(KEYBOARD_2.생성()); - Member member = memberRepository.save(CORINNE.생성(1L)); + Product product1 = 제품_저장(KEYBOARD_1.생성()); + Product product2 = 제품_저장(KEYBOARD_2.생성()); + Member member = memberRepository.save(CORINNE.생성()); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard1, member)); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard2, member)); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard2, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product1, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product2, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product2, member)); Pageable pageable = PageRequest.of(0, 1, Sort.by(Order.desc("reviewCount"))); // when - Slice slice = keyboardRepository.findPageBy(pageable); + Slice slice = productRepository.findPageByCategory(KEYBOARD, pageable); // then assertAll( () -> assertThat(slice.hasNext()).isTrue(), - () -> assertThat(slice.getContent()).containsExactly(keyboard2) + () -> assertThat(slice.getContent()).containsExactly(product2) ); } @Test void 키보드_전체_목록을_평균_평점_순으로_페이징하여_조회한다() { // given - Keyboard keyboard2 = 키보드_저장(KEYBOARD_1.생성()); - Keyboard keyboard1 = 키보드_저장(KEYBOARD_2.생성()); - Member member = memberRepository.save(CORINNE.생성(1L)); + Product product2 = 제품_저장(KEYBOARD_1.생성()); + Product product1 = 제품_저장(KEYBOARD_2.생성()); + Member member = memberRepository.save(CORINNE.생성()); - 리뷰_저장(REVIEW_RATING_2.작성(keyboard1, member)); - 리뷰_저장(REVIEW_RATING_1.작성(keyboard1, member)); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard2, member)); - 리뷰_저장(REVIEW_RATING_4.작성(keyboard2, member)); + 리뷰_저장(REVIEW_RATING_2.작성(product1, member)); + 리뷰_저장(REVIEW_RATING_1.작성(product1, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product2, member)); + 리뷰_저장(REVIEW_RATING_4.작성(product2, member)); Pageable pageable = PageRequest.of(0, 1, Sort.by(Order.desc("rating"))); // when - Slice slice = keyboardRepository.findPageBy(pageable); + Slice slice = productRepository.findPageByCategory(KEYBOARD, pageable); // then assertAll( () -> assertThat(slice.hasNext()).isTrue(), - () -> assertThat(slice.getContent()).containsExactly(keyboard2) + () -> assertThat(slice.getContent()).containsExactly(product2) ); } - private Keyboard 키보드_저장(Keyboard keyboard) { - return keyboardRepository.save(keyboard); + private Product 제품_저장(Product product) { + return productRepository.save(product); } private Review 리뷰_저장(Review review) { diff --git a/backend/src/test/java/com/woowacourse/f12/domain/review/MemberInfoStatisticsTest.java b/backend/src/test/java/com/woowacourse/f12/domain/review/MemberInfoStatisticsTest.java new file mode 100644 index 00000000..f4d526fe --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/domain/review/MemberInfoStatisticsTest.java @@ -0,0 +1,51 @@ +package com.woowacourse.f12.domain.review; + +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.CareerLevel.MID_LEVEL; +import static com.woowacourse.f12.domain.member.CareerLevel.NONE; +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.domain.member.JobType.FRONTEND; +import static com.woowacourse.f12.domain.member.JobType.MOBILE; +import static org.assertj.core.api.Assertions.assertThat; + +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.JobType; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; + +class MemberInfoStatisticsTest { + + @Test + void 연차에_대한_비율을_계산하여_반환한다() { + // given + List careerLevelCounts = List.of(new CareerLevelCount(JUNIOR, 2), + new CareerLevelCount(SENIOR, 2)); + MemberInfoStatistics memberInfoStatistics = new MemberInfoStatistics<>( + careerLevelCounts); + + // when + Map result = memberInfoStatistics.calculateStatistics(CareerLevel.values()); + + // then + assertThat(result).usingRecursiveComparison() + .isEqualTo(Map.of(JUNIOR, 0.50, SENIOR, 0.50, NONE, 0.00, MID_LEVEL, 0.00)); + } + + @Test + void 직군에_대한_비율을_계산하여_반환한다() { + // given + List jobTypeCounts = List.of(new JobTypeCount(BACKEND, 1), new JobTypeCount(FRONTEND, 1), + new JobTypeCount(MOBILE, 1)); + MemberInfoStatistics memberInfoStatistics = new MemberInfoStatistics<>(jobTypeCounts); + + // when + Map result = memberInfoStatistics.calculateStatistics(JobType.values()); + + // then + assertThat(result).usingRecursiveComparison() + .isEqualTo(Map.of(BACKEND, 0.33, FRONTEND, 0.33, MOBILE, 0.33, ETC, 0.0)); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/domain/review/ReviewRepositoryTest.java b/backend/src/test/java/com/woowacourse/f12/domain/review/ReviewRepositoryTest.java index d530e198..98ab561f 100644 --- a/backend/src/test/java/com/woowacourse/f12/domain/review/ReviewRepositoryTest.java +++ b/backend/src/test/java/com/woowacourse/f12/domain/review/ReviewRepositoryTest.java @@ -1,8 +1,15 @@ package com.woowacourse.f12.domain.review; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_2; +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.MOBILE; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.MemberFixtures.MINCHO; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_2; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_1; +import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_2; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_4; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; import static org.assertj.core.api.Assertions.assertThat; @@ -12,8 +19,9 @@ import com.woowacourse.f12.config.JpaConfig; import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.domain.member.MemberRepository; -import com.woowacourse.f12.domain.product.Keyboard; -import com.woowacourse.f12.domain.product.KeyboardRepository; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.domain.product.ProductRepository; +import java.util.List; import javax.persistence.EntityManager; import javax.persistence.PersistenceContext; import org.junit.jupiter.api.Test; @@ -33,7 +41,7 @@ class ReviewRepositoryTest { private ReviewRepository reviewRepository; @Autowired - private KeyboardRepository keyboardRepository; + private ProductRepository productRepository; @Autowired private MemberRepository memberRepository; @@ -44,14 +52,14 @@ class ReviewRepositoryTest { @Test void 특정_제품의_리뷰_목록을_최신순으로_페이징하여_조회한다() { // given - Keyboard keyboard = keyboardRepository.save(KEYBOARD_1.생성()); - Member member = memberRepository.save(CORINNE.생성(1L)); + Product product = productRepository.save(KEYBOARD_1.생성()); + Member member = memberRepository.save(CORINNE.생성()); Pageable pageable = PageRequest.of(0, 1, Sort.by(desc("createdAt"))); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard, member)); - Review review = 리뷰_저장(REVIEW_RATING_5.작성(keyboard, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product, member)); + Review review = 리뷰_저장(REVIEW_RATING_5.작성(product, member)); // when - Slice page = reviewRepository.findPageByProductId(keyboard.getId(), pageable); + Slice page = reviewRepository.findPageByProductId(product.getId(), pageable); // then assertAll( @@ -65,14 +73,14 @@ class ReviewRepositoryTest { @Test void 특정_제품의_리뷰_목록을_평점순으로_페이징하여_조회한다() { // given - Keyboard keyboard = keyboardRepository.save(KEYBOARD_1.생성()); - Member member = memberRepository.save(CORINNE.생성(1L)); + Product product = productRepository.save(KEYBOARD_1.생성()); + Member member = memberRepository.save(CORINNE.생성()); Pageable pageable = PageRequest.of(0, 1, Sort.by(desc("rating"))); - Review review = 리뷰_저장(REVIEW_RATING_5.작성(keyboard, member)); - 리뷰_저장(REVIEW_RATING_4.작성(keyboard, member)); + Review review = 리뷰_저장(REVIEW_RATING_5.작성(product, member)); + 리뷰_저장(REVIEW_RATING_4.작성(product, member)); // when - Slice page = reviewRepository.findPageByProductId(keyboard.getId(), pageable); + Slice page = reviewRepository.findPageByProductId(product.getId(), pageable); // then assertAll( @@ -86,12 +94,12 @@ class ReviewRepositoryTest { @Test void 리뷰_목록을_최신순으로_페이징하여_조회한다() { // given - Keyboard keyboard1 = keyboardRepository.save(KEYBOARD_1.생성()); - Keyboard keyboard2 = keyboardRepository.save(KEYBOARD_2.생성()); - Member member = memberRepository.save(CORINNE.생성(1L)); + Product product1 = productRepository.save(KEYBOARD_1.생성()); + Product product2 = productRepository.save(KEYBOARD_2.생성()); + Member member = memberRepository.save(CORINNE.생성()); Pageable pageable = PageRequest.of(0, 1, Sort.by(desc("createdAt"))); - 리뷰_저장(REVIEW_RATING_5.작성(keyboard1, member)); - Review review = 리뷰_저장(REVIEW_RATING_5.작성(keyboard2, member)); + 리뷰_저장(REVIEW_RATING_5.작성(product1, member)); + Review review = 리뷰_저장(REVIEW_RATING_5.작성(product2, member)); // when Slice page = reviewRepository.findPageBy(pageable); @@ -108,11 +116,11 @@ class ReviewRepositoryTest { @Test void 프록시의_equals_hashCode_테스트() { // given - Keyboard keyboard = keyboardRepository.save(KEYBOARD_1.생성()); + Product product = productRepository.save(KEYBOARD_1.생성()); Member member = memberRepository.save(CORINNE.생성()); - Long testReviewId = reviewRepository.save(REVIEW_RATING_5.작성(keyboard, member)) + Long testReviewId = reviewRepository.save(REVIEW_RATING_5.작성(product, member)) .getId(); - Long testKeyboardId = keyboard.getId(); + Long testKeyboardId = product.getId(); Long testMemberId = member.getId(); entityManager.clear(); @@ -121,30 +129,95 @@ class ReviewRepositoryTest { .get(); Member targetMember = memberRepository.findById(testMemberId) .get(); - Keyboard targetKeyboard = keyboardRepository.findById(testKeyboardId) + Product targetProduct = productRepository.findById(testKeyboardId) .get(); // then assertAll( () -> assertThat(targetMember).isEqualTo(review.getMember()), - () -> assertThat(targetKeyboard).isEqualTo(review.getKeyboard()) + () -> assertThat(targetProduct).isEqualTo(review.getProduct()) ); } @Test void 회원과_제품으로_작성된_리뷰가_존재하는지_확인한다() { // given - Keyboard keyboard = keyboardRepository.save(KEYBOARD_1.생성()); + Product product = productRepository.save(KEYBOARD_1.생성()); Member member = memberRepository.save(CORINNE.생성()); - reviewRepository.save(REVIEW_RATING_5.작성(keyboard, member)); + reviewRepository.save(REVIEW_RATING_5.작성(product, member)); // when - boolean actual = reviewRepository.existsByMemberAndKeyboard(member, keyboard); + boolean actual = reviewRepository.existsByMemberAndProduct(member, product); // then assertThat(actual).isTrue(); } + @Test + void 제품에_대한_사용자_연차의_총_개수를_반환한다() { + // given + Product product = 제품_저장(KEYBOARD_1.생성()); + + Member corinne = CORINNE.생성(); + corinne.updateCareerLevel(SENIOR); + corinne.updateJobType(MOBILE); + corinne = memberRepository.save(corinne); + + Member mincho = MINCHO.생성(); + mincho.updateCareerLevel(JUNIOR); + mincho.updateJobType(BACKEND); + mincho = memberRepository.save(mincho); + + 리뷰_저장(REVIEW_RATING_2.작성(product, corinne)); + 리뷰_저장(REVIEW_RATING_1.작성(product, mincho)); + + // when + List careerLevelCounts = reviewRepository.findCareerLevelCountByProductId( + product.getId()); + + // then + assertThat(careerLevelCounts).usingRecursiveFieldByFieldElementComparator() + .hasSize(2) + .containsOnly( + new CareerLevelCount(JUNIOR, 1), + new CareerLevelCount(SENIOR, 1) + ); + } + + @Test + void 제품에_대한_사용자_직군의_총_개수를_반환한다() { + // given + Product product = 제품_저장(KEYBOARD_1.생성()); + + Member corinne = CORINNE.생성(); + corinne.updateCareerLevel(SENIOR); + corinne.updateJobType(MOBILE); + corinne = memberRepository.save(corinne); + + Member mincho = MINCHO.생성(); + mincho.updateCareerLevel(JUNIOR); + mincho.updateJobType(BACKEND); + mincho = memberRepository.save(mincho); + + 리뷰_저장(REVIEW_RATING_2.작성(product, corinne)); + 리뷰_저장(REVIEW_RATING_1.작성(product, mincho)); + + // when + List jobTypeCounts = reviewRepository.findJobTypeCountByProductId(product.getId()); + + // then + assertThat(jobTypeCounts).usingRecursiveFieldByFieldElementComparator() + .hasSize(2) + .containsOnly( + new JobTypeCount(MOBILE, 1), + new JobTypeCount(BACKEND, 1) + ); + } + + private Product 제품_저장(Product product) { + return productRepository.save(product); + } + private Review 리뷰_저장(Review review) { return reviewRepository.save(review); } diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolverTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolverTest.java index 17186045..a44d8487 100644 --- a/backend/src/test/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolverTest.java +++ b/backend/src/test/java/com/woowacourse/f12/presentation/CustomPageableArgumentResolverTest.java @@ -1,6 +1,7 @@ package com.woowacourse.f12.presentation; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.BDDMockito.given; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; @@ -9,9 +10,10 @@ import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; import com.woowacourse.f12.application.auth.JwtProvider; -import com.woowacourse.f12.application.product.KeyboardService; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.presentation.product.KeyboardController; +import com.woowacourse.f12.application.product.ProductService; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.presentation.product.CategoryConstant; +import com.woowacourse.f12.presentation.product.ProductController; import com.woowacourse.f12.support.AuthTokenExtractor; import java.util.List; import org.junit.jupiter.api.Test; @@ -25,7 +27,7 @@ import org.springframework.data.domain.Sort; import org.springframework.test.web.servlet.MockMvc; -@WebMvcTest(KeyboardController.class) +@WebMvcTest(ProductController.class) @Import({AuthTokenExtractor.class, JwtProvider.class}) public class CustomPageableArgumentResolverTest { @@ -33,69 +35,69 @@ public class CustomPageableArgumentResolverTest { private MockMvc mockMvc; @MockBean - private KeyboardService keyboardService; + private ProductService productService; @Test void 페이징_실패_페이지_번호_숫자_형식_아님() throws Exception { // given - given(keyboardService.findPage(any(Pageable.class))) - .willReturn(KeyboardPageResponse.from(new SliceImpl<>(List.of()))); + given(productService.findPage(eq(CategoryConstant.KEYBOARD_CONSTANT), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of()))); // when - mockMvc.perform(get("/api/v1/keyboards?page=abc&size=10&sort=rating,desc")) + mockMvc.perform(get("/api/v1/products?category=keyboard&page=abc&size=10&sort=rating,desc")) .andExpect(status().isBadRequest()) .andDo(print()); // then - verify(keyboardService, times(0)) - .findPage(any(Pageable.class)); + verify(productService, times(0)) + .findPage(eq(CategoryConstant.KEYBOARD_CONSTANT), any(Pageable.class)); } @Test void 페이징_실패_최대_페이징_크기_초과() throws Exception { // given - given(keyboardService.findPage(any(Pageable.class))) - .willReturn(KeyboardPageResponse.from(new SliceImpl<>(List.of()))); + given(productService.findPage(eq(CategoryConstant.KEYBOARD_CONSTANT), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of()))); // when - mockMvc.perform(get("/api/v1/keyboards?page=0&size=151&sort=rating,desc")) + mockMvc.perform(get("/api/v1/products?category=keyboard&page=0&size=151&sort=rating,desc")) .andExpect(status().isBadRequest()) .andDo(print()); // then - verify(keyboardService, times(0)) - .findPage(PageRequest.of(0, 151, Sort.by("rating").descending())); + verify(productService, times(0)) + .findPage(CategoryConstant.KEYBOARD_CONSTANT, PageRequest.of(0, 151, Sort.by("rating").descending())); } @Test void 페이징_실패_페이징_크기_숫자_형식_아님() throws Exception { // given - given(keyboardService.findPage(any(Pageable.class))) - .willReturn(KeyboardPageResponse.from(new SliceImpl<>(List.of()))); + given(productService.findPage(eq(CategoryConstant.KEYBOARD_CONSTANT), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of()))); // when - mockMvc.perform(get("/api/v1/keyboards?page=0&size=abc&sort=rating,desc")) + mockMvc.perform(get("/api/v1/products?category=keyboard&page=0&size=abc&sort=rating,desc")) .andExpect(status().isBadRequest()) .andDo(print()); // then - verify(keyboardService, times(0)) - .findPage(any(Pageable.class)); + verify(productService, times(0)) + .findPage(eq(CategoryConstant.KEYBOARD_CONSTANT), any(Pageable.class)); } @Test void 페이징_성공_페이징_값_지정_안할_경우_기본값으로_페이징() throws Exception { // given - given(keyboardService.findPage(any(Pageable.class))) - .willReturn(KeyboardPageResponse.from(new SliceImpl<>(List.of()))); + given(productService.findPage(eq(CategoryConstant.KEYBOARD_CONSTANT), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of()))); // when - mockMvc.perform(get("/api/v1/keyboards")) + mockMvc.perform(get("/api/v1/products")) .andExpect(status().isOk()) .andDo(print()); // then - verify(keyboardService) - .findPage(PageRequest.of(0, 20)); + verify(productService) + .findPage(null, PageRequest.of(0, 20, Sort.by("id").descending())); } } diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/auth/AuthInterceptorTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/auth/AuthInterceptorTest.java index 6d5d3d8c..63413c17 100644 --- a/backend/src/test/java/com/woowacourse/f12/presentation/auth/AuthInterceptorTest.java +++ b/backend/src/test/java/com/woowacourse/f12/presentation/auth/AuthInterceptorTest.java @@ -53,7 +53,7 @@ public AuthInterceptorTest() { .willReturn(1L); // when mockMvc.perform( - post("/api/v1/keyboards/" + 1L + "/reviews") + post("/api/v1/products/" + 1L + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductControllerTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductControllerTest.java index dd13c011..ad1fa364 100644 --- a/backend/src/test/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductControllerTest.java +++ b/backend/src/test/java/com/woowacourse/f12/presentation/inventoryproduct/InventoryProductControllerTest.java @@ -1,13 +1,14 @@ package com.woowacourse.f12.presentation.inventoryproduct; import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willDoNothing; import static org.mockito.BDDMockito.willThrow; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.patch; @@ -18,10 +19,13 @@ import com.woowacourse.f12.application.auth.JwtProvider; import com.woowacourse.f12.application.inventoryproduct.InventoryProductService; import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.request.inventoryproduct.ProfileProductRequest; import com.woowacourse.f12.dto.response.inventoryproduct.InventoryProductsResponse; -import com.woowacourse.f12.exception.badrequest.InvalidProfileProductException; -import com.woowacourse.f12.exception.notfound.InventoryItemNotFoundException; +import com.woowacourse.f12.exception.badrequest.DuplicatedProfileProductCategoryException; +import com.woowacourse.f12.exception.badrequest.InvalidProfileProductCategoryException; +import com.woowacourse.f12.exception.notfound.InventoryProductNotFoundException; +import com.woowacourse.f12.support.MemberFixtures; import java.util.List; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; @@ -53,7 +57,7 @@ class InventoryProductControllerTest { .willReturn(true); given(jwtProvider.getPayload(authorizationHeader)) .willReturn("1"); - ProfileProductRequest profileProductRequest = new ProfileProductRequest(1L, 2L); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(List.of(1L)); willDoNothing().given(inventoryProductService).updateProfileProducts(1L, profileProductRequest); // when @@ -82,8 +86,8 @@ class InventoryProductControllerTest { .willReturn(true); given(jwtProvider.getPayload(authorizationHeader)) .willReturn("1"); - ProfileProductRequest profileProductRequest = new ProfileProductRequest(1L, 2L); - willThrow(new InventoryItemNotFoundException()).given(inventoryProductService) + ProfileProductRequest profileProductRequest = new ProfileProductRequest(List.of(1L)); + willThrow(new InventoryProductNotFoundException()).given(inventoryProductService) .updateProfileProducts(anyLong(), any(ProfileProductRequest.class)); // when @@ -106,15 +110,72 @@ class InventoryProductControllerTest { @Test void 대표_장비_등록_실패_요청된_장비가_모두_null인_경우() throws Exception { + // given + String authorizationHeader = "Bearer Token"; + given(jwtProvider.validateToken(authorizationHeader)) + .willReturn(true); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(null); + + // when + mockMvc.perform( + patch("/api/v1/members/inventoryProducts") + .header(HttpHeaders.AUTHORIZATION, authorizationHeader) + .content(objectMapper.writeValueAsString(profileProductRequest)) + .contentType(MediaType.APPLICATION_JSON_VALUE) + ) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // then + assertAll( + () -> verify(jwtProvider).validateToken(authorizationHeader), + () -> verify(jwtProvider, times(0)).getPayload(authorizationHeader), + () -> verify(inventoryProductService, times(0)).updateProfileProducts(anyLong(), + any(ProfileProductRequest.class)) + ); + } + + @Test + void 대표_장비_등록_실패_요청된_장비가_중복된_카테고리인_경우() throws Exception { // given String authorizationHeader = "Bearer Token"; given(jwtProvider.validateToken(authorizationHeader)) .willReturn(true); given(jwtProvider.getPayload(authorizationHeader)) .willReturn("1"); - ProfileProductRequest profileProductRequest = new ProfileProductRequest(null, null); - willThrow(new InvalidProfileProductException()).given(inventoryProductService) - .updateProfileProducts(anyLong(), any(ProfileProductRequest.class)); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(List.of(1L, 2L)); + willThrow(new DuplicatedProfileProductCategoryException()) + .given(inventoryProductService).updateProfileProducts(anyLong(), any(ProfileProductRequest.class)); + + // when + mockMvc.perform( + patch("/api/v1/members/inventoryProducts") + .header(HttpHeaders.AUTHORIZATION, authorizationHeader) + .content(objectMapper.writeValueAsString(profileProductRequest)) + .contentType(MediaType.APPLICATION_JSON_VALUE) + ) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // then + assertAll( + () -> verify(jwtProvider).validateToken(authorizationHeader), + () -> verify(jwtProvider).getPayload(authorizationHeader), + () -> verify(inventoryProductService).updateProfileProducts(anyLong(), any(ProfileProductRequest.class)) + ); + } + + @Test + void 대표_장비_등록_실패_요청된_장비에_소프트웨어_카테고리가_포함된_경우() throws Exception { + // given + String authorizationHeader = "Bearer Token"; + given(jwtProvider.validateToken(authorizationHeader)) + .willReturn(true); + given(jwtProvider.getPayload(authorizationHeader)) + .willReturn("1"); + ProfileProductRequest profileProductRequest = new ProfileProductRequest(List.of(1L, 2L)); + willThrow(new InvalidProfileProductCategoryException()) + .given(inventoryProductService).updateProfileProducts(anyLong(), any(ProfileProductRequest.class)); // when mockMvc.perform( @@ -138,7 +199,8 @@ class InventoryProductControllerTest { void 멤버_id_로_조회한다() throws Exception { // given Long memberId = 1L; - InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, memberId, KEYBOARD_1.생성(1L)); + Member member = MemberFixtures.CORINNE.생성(memberId); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, member, KEYBOARD_1.생성(1L)); String authorizationHeader = "Bearer Token"; given(jwtProvider.validateToken(authorizationHeader)) .willReturn(true); @@ -168,7 +230,8 @@ class InventoryProductControllerTest { void 다른_멤버_id_로_조회한다() throws Exception { // given Long memberId = 1L; - InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, memberId, KEYBOARD_1.생성(1L)); + Member member = MemberFixtures.CORINNE.생성(memberId); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(1L, member, KEYBOARD_1.생성(1L)); given(inventoryProductService.findByMemberId(memberId)) .willReturn(InventoryProductsResponse.from(List.of(inventoryProduct))); diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/member/MemberControllerTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/member/MemberControllerTest.java index ed8b27ba..ace1f0d5 100644 --- a/backend/src/test/java/com/woowacourse/f12/presentation/member/MemberControllerTest.java +++ b/backend/src/test/java/com/woowacourse/f12/presentation/member/MemberControllerTest.java @@ -1,11 +1,16 @@ package com.woowacourse.f12.presentation.member; -import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; -import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.JUNIOR_CONSTANT; +import static com.woowacourse.f12.presentation.member.CareerLevelConstant.NONE_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.BACKEND_CONSTANT; +import static com.woowacourse.f12.presentation.member.JobTypeConstant.ETC_CONSTANT; +import static com.woowacourse.f12.support.InventoryProductFixtures.SELECTED_INVENTORY_PRODUCT; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.refEq; import static org.mockito.BDDMockito.given; import static org.mockito.BDDMockito.willDoNothing; import static org.mockito.Mockito.times; @@ -18,15 +23,24 @@ import com.fasterxml.jackson.databind.ObjectMapper; import com.woowacourse.f12.application.auth.JwtProvider; import com.woowacourse.f12.application.member.MemberService; +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.request.member.MemberRequest; +import com.woowacourse.f12.dto.request.member.MemberSearchRequest; +import com.woowacourse.f12.dto.response.member.MemberPageResponse; import com.woowacourse.f12.dto.response.member.MemberResponse; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; import java.util.HashMap; +import java.util.List; import java.util.Map; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; +import org.springframework.data.domain.Sort; import org.springframework.http.HttpHeaders; import org.springframework.http.MediaType; import org.springframework.test.web.servlet.MockMvc; @@ -108,7 +122,7 @@ class MemberControllerTest { @Test void 로그인된_상태에서_나의_회원정보를_수정_성공() throws Exception { // given - MemberRequest memberRequest = new MemberRequest(JUNIOR, ETC); + MemberRequest memberRequest = new MemberRequest(JUNIOR_CONSTANT, ETC_CONSTANT); String authorizationHeader = "Bearer Token"; given(jwtProvider.validateToken(authorizationHeader)) .willReturn(true); @@ -138,8 +152,8 @@ class MemberControllerTest { void 로그인된_상태에서_나의_회원정보를_수정_성공_Enum의_name값으로_요청을_보낼때() throws Exception { // given Map memberRequest = new HashMap<>(); - memberRequest.put("careerLevel", "SENIOR"); - memberRequest.put("jobType", "BACK_END"); + memberRequest.put("careerLevel", "senior"); + memberRequest.put("jobType", "backend"); String authorizationHeader = "Bearer Token"; given(jwtProvider.validateToken(authorizationHeader)) @@ -227,4 +241,63 @@ class MemberControllerTest { ); } + @Test + void 키워드와_옵션으로_회원을_조회한다() throws Exception { + // given + MemberSearchRequest memberSearchRequest = new MemberSearchRequest("cheese", NONE_CONSTANT, BACKEND_CONSTANT); + Pageable pageable = PageRequest.of(0, 10, Sort.by("id").descending()); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(CORINNE.생성(1L), + KEYBOARD_1.생성(1L)); + Member member = CORINNE.대표장비를_추가해서_생성(1L, inventoryProduct); + + MemberPageResponse memberPageResponse = MemberPageResponse.from( + new SliceImpl<>(List.of(member), pageable, false)); + given(memberService.findByContains(any(MemberSearchRequest.class), any(PageRequest.class))) + .willReturn(memberPageResponse); + + // when + mockMvc.perform( + get("/api/v1/members?query=cheese&careerLevel=none&jobType=backend&page=0&size=10") + ).andExpect(status().isOk()) + .andDo(print()); + + // then + verify(memberService).findByContains(refEq(memberSearchRequest), refEq(pageable)); + } + + @Test + void 회원_조회_실패_옵션값이_올바르지_않을때() throws Exception { + // when + mockMvc.perform( + get("/api/v1/members?query=cheese&careerLevel=invalid&jobType=invalid&page=0&size=10") + ).andExpect(status().isBadRequest()) + .andDo(print()); + + // then + verify(memberService, times(0)).findByContains(any(MemberSearchRequest.class), any(PageRequest.class)); + } + + @Test + void 회원_조회_성공_키워드와_옵션값이_주어지지_않을때() throws Exception { + // given + MemberSearchRequest memberSearchRequest = new MemberSearchRequest(null, null, null); + Pageable pageable = PageRequest.of(0, 10, Sort.by("id").descending()); + InventoryProduct inventoryProduct = SELECTED_INVENTORY_PRODUCT.생성(CORINNE.생성(1L), + KEYBOARD_1.생성(1L)); + Member member = CORINNE.대표장비를_추가해서_생성(1L, inventoryProduct); + + MemberPageResponse memberPageResponse = MemberPageResponse.from( + new SliceImpl<>(List.of(member), pageable, false)); + given(memberService.findByContains(any(MemberSearchRequest.class), any(PageRequest.class))) + .willReturn(memberPageResponse); + + // when + mockMvc.perform( + get("/api/v1/members?page=0&size=10") + ).andExpect(status().isOk()) + .andDo(print()); + + // then + verify(memberService).findByContains(refEq(memberSearchRequest), refEq(pageable)); + } } diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/product/CategoryConstantTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/product/CategoryConstantTest.java new file mode 100644 index 00000000..1f95f5d9 --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/presentation/product/CategoryConstantTest.java @@ -0,0 +1,60 @@ +package com.woowacourse.f12.presentation.product; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.assertj.core.api.Assertions.assertThatThrownBy; + +import com.woowacourse.f12.domain.product.Category; +import com.woowacourse.f12.exception.badrequest.InvalidCategoryValueException; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.CsvSource; + +class CategoryConstantTest { + + @ParameterizedTest + @CsvSource(value = {"keyboard,KEYBOARD_CONSTANT", "software,SOFTWARE_CONSTANT"}) + void 뷰에서_전달된_이름으로_찾아서_반환한다(String viewValue, CategoryConstant expect) { + // given, when + CategoryConstant actual = CategoryConstant.findByViewValue(viewValue); + + // then + assertThat(actual).isEqualTo(expect); + } + + @Test + void 뷰에서_잘못된_이름을_전달하면_예외_발생한다() { + // given + String invalidViewName = "invalid"; + + // when, then + assertThatThrownBy(() -> CategoryConstant.findByViewValue(invalidViewName)) + .isExactlyInstanceOf(InvalidCategoryValueException.class); + } + + @ParameterizedTest + @CsvSource(value = {"KEYBOARD,KEYBOARD_CONSTANT", "SOFTWARE,SOFTWARE_CONSTANT"}) + void 뷰_열거형을_도메인_열거형으로_찾아서_반환한다(Category category, CategoryConstant expect) { + // given, when + CategoryConstant actual = CategoryConstant.from(category); + + // then + assertThat(actual).isEqualTo(expect); + } + + @Test + void 도메인_열거형으로_찾을_수_없는_경우_예외_발생한다() { + // given, when, then + assertThatThrownBy(() -> CategoryConstant.from(null)) + .isExactlyInstanceOf(InvalidCategoryValueException.class); + } + + @ParameterizedTest + @CsvSource(value = {"KEYBOARD_CONSTANT,KEYBOARD", "SOFTWARE_CONSTANT,SOFTWARE"}) + void 도메인_열거형을_뷰_열거형으로_찾아서_반환한다(CategoryConstant constant, Category expect) { + // given, when + Category actual = constant.toCategory(); + + // then + assertThat(actual).isEqualTo(expect); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/product/KeyboardControllerTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/product/KeyboardControllerTest.java deleted file mode 100644 index 89f6e29e..00000000 --- a/backend/src/test/java/com/woowacourse/f12/presentation/product/KeyboardControllerTest.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.woowacourse.f12.presentation.product; - -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; -import static org.mockito.ArgumentMatchers.anyLong; -import static org.mockito.BDDMockito.any; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.verify; -import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; -import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; -import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; - -import com.woowacourse.f12.application.auth.JwtProvider; -import com.woowacourse.f12.application.product.KeyboardService; -import com.woowacourse.f12.dto.response.product.KeyboardPageResponse; -import com.woowacourse.f12.dto.response.product.KeyboardResponse; -import com.woowacourse.f12.exception.notfound.KeyboardNotFoundException; -import com.woowacourse.f12.support.AuthTokenExtractor; -import java.util.List; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.Import; -import org.springframework.data.domain.PageRequest; -import org.springframework.data.domain.Pageable; -import org.springframework.data.domain.SliceImpl; -import org.springframework.data.domain.Sort; -import org.springframework.test.web.servlet.MockMvc; - -@WebMvcTest(KeyboardController.class) -@Import({AuthTokenExtractor.class, JwtProvider.class}) -class KeyboardControllerTest { - - @Autowired - private MockMvc mockMvc; - - @MockBean - private KeyboardService keyboardService; - - @Test - void 키보드_목록_페이지_조회_성공() throws Exception { - // given - given(keyboardService.findPage(any(Pageable.class))) - .willReturn(KeyboardPageResponse.from(new SliceImpl<>(List.of(KEYBOARD_1.생성(1L))))); - - // when - mockMvc.perform(get("/api/v1/keyboards?page=0&size=150&sort=rating,desc")) - .andExpect(status().isOk()) - .andDo(print()); - - // then - verify(keyboardService).findPage(PageRequest.of(0, 150, Sort.by("rating").descending())); - } - - @Test - void 키보드_단일_조회_성공() throws Exception { - // given - given(keyboardService.findById(anyLong())) - .willReturn(KeyboardResponse.from(KEYBOARD_1.생성(1L))); - - // when - mockMvc.perform(get("/api/v1/keyboards/" + 1L)) - .andExpect(status().isOk()) - .andDo(print()); - - // then - verify(keyboardService).findById(1L); - } - - @Test - void 키보드_단일_조회_실패_존재_하지_않는_아이디() throws Exception { - // given - given(keyboardService.findById(anyLong())) - .willThrow(new KeyboardNotFoundException()); - - // when - mockMvc.perform(get("/api/v1/keyboards/0")) - .andExpect(status().isNotFound()) - .andDo(print()); - - // then - verify(keyboardService).findById(0L); - } -} diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/product/ProductControllerTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/product/ProductControllerTest.java new file mode 100644 index 00000000..895d1f2f --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/presentation/product/ProductControllerTest.java @@ -0,0 +1,165 @@ +package com.woowacourse.f12.presentation.product; + +import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; +import static com.woowacourse.f12.domain.member.CareerLevel.MID_LEVEL; +import static com.woowacourse.f12.domain.member.CareerLevel.NONE; +import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.ETC; +import static com.woowacourse.f12.domain.member.JobType.FRONTEND; +import static com.woowacourse.f12.domain.member.JobType.MOBILE; +import static com.woowacourse.f12.presentation.product.CategoryConstant.KEYBOARD_CONSTANT; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; +import static org.mockito.ArgumentMatchers.anyLong; +import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.BDDMockito.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +import com.woowacourse.f12.application.auth.JwtProvider; +import com.woowacourse.f12.application.product.ProductService; +import com.woowacourse.f12.domain.member.CareerLevel; +import com.woowacourse.f12.domain.member.JobType; +import com.woowacourse.f12.dto.response.product.ProductPageResponse; +import com.woowacourse.f12.dto.response.product.ProductResponse; +import com.woowacourse.f12.dto.response.product.ProductStatisticsResponse; +import com.woowacourse.f12.exception.notfound.ProductNotFoundException; +import com.woowacourse.f12.support.AuthTokenExtractor; +import java.util.List; +import java.util.Map; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.context.annotation.Import; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.SliceImpl; +import org.springframework.data.domain.Sort; +import org.springframework.test.web.servlet.MockMvc; + +@WebMvcTest(ProductController.class) +@Import({AuthTokenExtractor.class, JwtProvider.class}) +class ProductControllerTest { + + @Autowired + private MockMvc mockMvc; + + @MockBean + private ProductService productService; + + @Test + void 키보드_목록_페이지_조회_성공() throws Exception { + // given + given(productService.findPage(eq(KEYBOARD_CONSTANT), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of(KEYBOARD_1.생성(1L))))); + + // when + mockMvc.perform(get("/api/v1/products?category=keyboard&page=0&size=150&sort=rating,desc")) + .andExpect(status().isOk()) + .andDo(print()); + + // then + verify(productService).findPage(KEYBOARD_CONSTANT, + PageRequest.of(0, 150, Sort.by("rating", "id").descending())); + } + + @Test + void 제품_목록_페이지_조회_성공() throws Exception { + // given + given(productService.findPage(eq(null), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of(KEYBOARD_1.생성(1L))))); + + // when + mockMvc.perform(get("/api/v1/products?page=0&size=150&sort=rating,desc")) + .andExpect(status().isOk()) + .andDo(print()); + + // then + verify(productService).findPage(null, PageRequest.of(0, 150, Sort.by("rating", "id").descending())); + } + + @Test + void 잘못된_카테고리로_조회하려는_경우_예외_발생() throws Exception { + // given + given(productService.findPage(eq(KEYBOARD_CONSTANT), any(Pageable.class))) + .willReturn(ProductPageResponse.from(new SliceImpl<>(List.of(KEYBOARD_1.생성(1L))))); + + // when + mockMvc.perform(get("/api/v1/products?category=INVALID&page=0&size=150&sort=rating,desc")) + .andExpect(status().isBadRequest()) + .andDo(print()); + + // then + verify(productService, times(0)).findPage(KEYBOARD_CONSTANT, + PageRequest.of(0, 150, Sort.by("rating").descending())); + } + + @Test + void 제품_단일_조회_성공() throws Exception { + // given + given(productService.findById(anyLong())) + .willReturn(ProductResponse.from(KEYBOARD_1.생성(1L))); + + // when + mockMvc.perform(get("/api/v1/products/" + 1L)) + .andExpect(status().isOk()) + .andDo(print()); + + // then + verify(productService).findById(1L); + } + + @Test + void 제품_단일_조회_실패_존재_하지_않는_아이디() throws Exception { + // given + given(productService.findById(anyLong())) + .willThrow(new ProductNotFoundException()); + + // when + mockMvc.perform(get("/api/v1/products/0")) + .andExpect(status().isNotFound()) + .andDo(print()); + + // then + verify(productService).findById(0L); + } + + @Test + void 특정_제품에_대한_사용자_통계_조회_성공() throws Exception { + // given + Map careerLevel = Map.of(NONE, 0.0, JUNIOR, 0.5, + MID_LEVEL, 0.0, SENIOR, 0.5); + Map jobType = Map.of(FRONTEND, 0.5, BACKEND, + 0.5, MOBILE, 0.0, ETC, 0.0); + given(productService.calculateMemberStatisticsById(anyLong())) + .willReturn(ProductStatisticsResponse.of(careerLevel, jobType)); + + // when + mockMvc.perform(get("/api/v1/products/1/statistics")) + .andExpect(status().isOk()) + .andDo(print()); + + // then + verify(productService).calculateMemberStatisticsById(1L); + } + + @Test + void 특정_제품에_대한_사용자_통계_조회_실패_제품이_존재하지_않을_경우() throws Exception { + // given + given(productService.calculateMemberStatisticsById(anyLong())) + .willThrow(new ProductNotFoundException()); + + // when + mockMvc.perform(get("/api/v1/products/1/statistics")) + .andExpect(status().isNotFound()) + .andDo(print()); + + // then + verify(productService).calculateMemberStatisticsById(1L); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/presentation/review/ReviewControllerTest.java b/backend/src/test/java/com/woowacourse/f12/presentation/review/ReviewControllerTest.java index feb5e0e2..0fecbaf8 100644 --- a/backend/src/test/java/com/woowacourse/f12/presentation/review/ReviewControllerTest.java +++ b/backend/src/test/java/com/woowacourse/f12/presentation/review/ReviewControllerTest.java @@ -1,7 +1,7 @@ package com.woowacourse.f12.presentation.review; -import static com.woowacourse.f12.support.KeyboardFixtures.KEYBOARD_1; import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.ProductFixture.KEYBOARD_1; import static com.woowacourse.f12.support.ReviewFixtures.REVIEW_RATING_5; import static org.junit.jupiter.api.Assertions.assertAll; import static org.mockito.ArgumentMatchers.any; @@ -30,8 +30,8 @@ import com.woowacourse.f12.exception.badrequest.InvalidContentLengthException; import com.woowacourse.f12.exception.badrequest.InvalidRatingValueException; import com.woowacourse.f12.exception.forbidden.NotAuthorException; -import com.woowacourse.f12.exception.notfound.KeyboardNotFoundException; import com.woowacourse.f12.exception.notfound.MemberNotFoundException; +import com.woowacourse.f12.exception.notfound.ProductNotFoundException; import com.woowacourse.f12.exception.notfound.ReviewNotFoundException; import com.woowacourse.f12.support.AuthTokenExtractor; import java.util.HashMap; @@ -84,7 +84,7 @@ public ReviewControllerTest() { .willReturn(1L); // when mockMvc.perform( - post("/api/v1/keyboards/" + PRODUCT_ID + "/reviews") + post("/api/v1/products/" + PRODUCT_ID + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -114,7 +114,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + PRODUCT_ID + "/reviews") + post("/api/v1/products/" + PRODUCT_ID + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -145,7 +145,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + PRODUCT_ID + "/reviews") + post("/api/v1/products/" + PRODUCT_ID + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -174,7 +174,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + PRODUCT_ID + "/reviews") + post("/api/v1/products/" + PRODUCT_ID + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -205,7 +205,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + PRODUCT_ID + "/reviews") + post("/api/v1/products/" + PRODUCT_ID + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -235,7 +235,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + PRODUCT_ID + "/reviews") + post("/api/v1/products/" + PRODUCT_ID + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -261,11 +261,11 @@ public ReviewControllerTest() { given(jwtProvider.getPayload(authorizationHeader)) .willReturn("1"); given(reviewService.saveReviewAndInventoryProduct(anyLong(), anyLong(), any(ReviewRequest.class))) - .willThrow(new KeyboardNotFoundException()); + .willThrow(new ProductNotFoundException()); // when mockMvc.perform( - post("/api/v1/keyboards/" + 0L + "/reviews") + post("/api/v1/products/" + 0L + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -294,7 +294,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + 1L + "/reviews") + post("/api/v1/products/" + 1L + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -323,7 +323,7 @@ public ReviewControllerTest() { // when mockMvc.perform( - post("/api/v1/keyboards/" + 1L + "/reviews") + post("/api/v1/products/" + 1L + "/reviews") .header(HttpHeaders.AUTHORIZATION, authorizationHeader) .contentType(MediaType.APPLICATION_JSON) .content(objectMapper.writeValueAsString(reviewRequest)) @@ -351,7 +351,7 @@ public ReviewControllerTest() { .andDo(print()); // then - verify(reviewService).findPage(PageRequest.of(0, 150, Sort.by("rating").descending())); + verify(reviewService).findPage(PageRequest.of(0, 150, Sort.by("rating", "id").descending())); } @Test @@ -362,27 +362,30 @@ public ReviewControllerTest() { new SliceImpl<>(List.of(REVIEW_RATING_5.작성(1L, KEYBOARD_1.생성(), CORINNE.생성(1L)))))); // when - mockMvc.perform(get("/api/v1/keyboards/" + PRODUCT_ID + "/reviews?size=150&page=0&sort=rating,desc")) + mockMvc.perform(get("/api/v1/products/" + PRODUCT_ID + "/reviews?size=150&page=0&sort=rating,desc")) .andExpect(status().isOk()) .andDo(print()); // then - verify(reviewService).findPageByProductId(PRODUCT_ID, PageRequest.of(0, 150, Sort.by("rating").descending())); + verify(reviewService).findPageByProductId(PRODUCT_ID, + PageRequest.of(0, 150, Sort.by("rating", "id").descending())); } @Test void 특정_상품의_리뷰_페이지_조회_실패_상품_존재_하지않음() throws Exception { // given given(reviewService.findPageByProductId(anyLong(), any(Pageable.class))) - .willThrow(new KeyboardNotFoundException()); + .willThrow(new ProductNotFoundException()); // when - mockMvc.perform(get("/api/v1/keyboards/" + 0L + "/reviews?size=150&page=0&sort=rating,desc")) + mockMvc.perform(get("/api/v1/products/" + 0L + "/reviews?size=150&page=0&sort=rating,desc")) .andExpect(status().isNotFound()) .andDo(print()); // then - verify(reviewService).findPageByProductId(0L, PageRequest.of(0, 150, Sort.by("rating").descending())); + PageRequest pageable = PageRequest.of(0, 150, + Sort.by("rating", "id").descending()); + verify(reviewService).findPageByProductId(0L, pageable); } @Test diff --git a/backend/src/test/java/com/woowacourse/f12/support/AuthTokenExtractorTest.java b/backend/src/test/java/com/woowacourse/f12/support/AuthTokenExtractorTest.java index 242e50d1..18c5b463 100644 --- a/backend/src/test/java/com/woowacourse/f12/support/AuthTokenExtractorTest.java +++ b/backend/src/test/java/com/woowacourse/f12/support/AuthTokenExtractorTest.java @@ -3,7 +3,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; -import com.woowacourse.f12.exception.unauthorized.UnauthorizedException; +import com.woowacourse.f12.exception.unauthorized.TokenInvalidException; +import com.woowacourse.f12.exception.unauthorized.TokenNotExistsException; import org.junit.jupiter.api.Test; class AuthTokenExtractorTest { @@ -25,7 +26,7 @@ class AuthTokenExtractorTest { @Test void Authorization_헤더가_null_이면_예외가_발생한다() { assertThatThrownBy(() -> authTokenExtractor.extractToken(null, "Bearer")) - .isExactlyInstanceOf(UnauthorizedException.class); + .isExactlyInstanceOf(TokenNotExistsException.class); } @Test @@ -35,7 +36,7 @@ class AuthTokenExtractorTest { // when, then assertThatThrownBy(() -> authTokenExtractor.extractToken(authorizationHeader, "Bearer")) - .isExactlyInstanceOf(UnauthorizedException.class); + .isExactlyInstanceOf(TokenInvalidException.class); } @Test @@ -45,6 +46,6 @@ class AuthTokenExtractorTest { // when, then assertThatThrownBy(() -> authTokenExtractor.extractToken(authorizationHeader, "Bearer")) - .isExactlyInstanceOf(UnauthorizedException.class); + .isExactlyInstanceOf(TokenInvalidException.class); } } diff --git a/backend/src/test/java/com/woowacourse/f12/support/FakeGitHubApiController.java b/backend/src/test/java/com/woowacourse/f12/support/FakeGitHubApiController.java index ee0220eb..b4bc4068 100644 --- a/backend/src/test/java/com/woowacourse/f12/support/FakeGitHubApiController.java +++ b/backend/src/test/java/com/woowacourse/f12/support/FakeGitHubApiController.java @@ -1,9 +1,16 @@ package com.woowacourse.f12.support; +import static com.woowacourse.f12.support.GitHubProfileFixtures.CORINNE_GITHUB; +import static com.woowacourse.f12.support.GitHubProfileFixtures.MINCHO_GITHUB; +import static com.woowacourse.f12.support.MemberFixtures.CORINNE; +import static com.woowacourse.f12.support.MemberFixtures.MINCHO; + +import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.request.auth.GitHubTokenRequest; import com.woowacourse.f12.dto.response.auth.GitHubProfileResponse; import com.woowacourse.f12.dto.response.auth.GitHubTokenResponse; import java.util.Map; +import java.util.Objects; import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; import org.springframework.http.ResponseEntity; @@ -16,11 +23,14 @@ @RestController public class FakeGitHubApiController { - private Map codeAndToken = Map.of("1", "token1", "2", "token2"); - private Map tokenAndGitHubId = Map.of("token1", "gitHubId1", "token2", "gitHubId2"); + private final Map codeAndToken = Map.of(CORINNE_GITHUB.getCode(), CORINNE_GITHUB.getToken(), + MINCHO_GITHUB.getCode(), MINCHO_GITHUB.getToken()); + + private final Map tokenAndMember = Map.of(CORINNE_GITHUB.getToken(), CORINNE.생성(), + MINCHO_GITHUB.getToken(), MINCHO.생성()); - private String clientId; - private String clientSecret; + private final String clientId; + private final String clientSecret; public FakeGitHubApiController(@Value("${github.client.id}") final String clientId, @Value("${github.client.secret}") final String clientSecret) { @@ -41,13 +51,15 @@ public ResponseEntity issueFakeAccessToken( @GetMapping("/user") public ResponseEntity showFakeProfile( @RequestHeader(value = HttpHeaders.AUTHORIZATION) final String authorizationHeaderValue) { - if (authorizationHeaderValue == null) { + if (Objects.isNull(authorizationHeaderValue)) { return ResponseEntity.badRequest().build(); } final String[] splitValue = authorizationHeaderValue.split(" "); if (splitValue.length != 2 || !splitValue[0].equals("token")) { return ResponseEntity.badRequest().build(); } - return ResponseEntity.ok(new GitHubProfileResponse(tokenAndGitHubId.get(splitValue[1]), "name", "url")); + Member member = tokenAndMember.get(splitValue[1]); + return ResponseEntity.ok( + new GitHubProfileResponse(member.getGitHubId(), member.getName(), member.getImageUrl())); } } diff --git a/backend/src/test/java/com/woowacourse/f12/support/GitHubProfileFixtures.java b/backend/src/test/java/com/woowacourse/f12/support/GitHubProfileFixtures.java new file mode 100644 index 00000000..6e21250b --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/support/GitHubProfileFixtures.java @@ -0,0 +1,24 @@ +package com.woowacourse.f12.support; + +public enum GitHubProfileFixtures { + + CORINNE_GITHUB("corinne-code", "corinne-token"), + MINCHO_GITHUB("mincho-code", "mincho-token"), + ; + + private final String code; + private final String token; + + GitHubProfileFixtures(final String code, final String token) { + this.code = code; + this.token = token; + } + + public String getCode() { + return code; + } + + public String getToken() { + return token; + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/support/InventoryProductFixtures.java b/backend/src/test/java/com/woowacourse/f12/support/InventoryProductFixtures.java index ddd8a65c..570f386d 100644 --- a/backend/src/test/java/com/woowacourse/f12/support/InventoryProductFixtures.java +++ b/backend/src/test/java/com/woowacourse/f12/support/InventoryProductFixtures.java @@ -1,7 +1,14 @@ package com.woowacourse.f12.support; +import com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil; import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.member.Member; +import com.woowacourse.f12.domain.product.Product; +import com.woowacourse.f12.dto.request.inventoryproduct.ProfileProductRequest; +import io.restassured.response.ExtractableResponse; +import io.restassured.response.Response; +import java.util.List; +import java.util.stream.Collectors; public enum InventoryProductFixtures { @@ -15,16 +22,25 @@ public enum InventoryProductFixtures { this.selected = selected; } - public InventoryProduct 생성(final Long memberId, final Keyboard keyboard) { - return 생성(null, memberId, keyboard); + public InventoryProduct 생성(final Member member, final Product product) { + return 생성(null, member, product); } - public InventoryProduct 생성(final Long id, final Long memberId, final Keyboard keyboard) { + public InventoryProduct 생성(final Long id, final Member member, final Product product) { return InventoryProduct.builder() .id(id) .selected(this.selected) - .memberId(memberId) - .keyboard(keyboard) + .member(member) + .product(product) .build(); } + + public static ExtractableResponse 대표_장비_업데이트_한다(final List selectedProducts, + final String token) { + final List selectedProductIds = selectedProducts.stream() + .map(Product::getId) + .collect(Collectors.toList()); + return RestAssuredRequestUtil.로그인된_상태로_PATCH_요청을_보낸다("/api/v1/members/inventoryProducts", token, + new ProfileProductRequest(selectedProductIds)); + } } diff --git a/backend/src/test/java/com/woowacourse/f12/support/KeyboardFixtures.java b/backend/src/test/java/com/woowacourse/f12/support/KeyboardFixtures.java deleted file mode 100644 index 87d47f91..00000000 --- a/backend/src/test/java/com/woowacourse/f12/support/KeyboardFixtures.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.woowacourse.f12.support; - -import com.woowacourse.f12.domain.product.Keyboard; - -public enum KeyboardFixtures { - - KEYBOARD_1("키보드1", "이미지 주소"), - KEYBOARD_2("키보드2", "이미지 주소"), - ; - - private final String name; - private final String imageUrl; - - KeyboardFixtures(final String name, final String imageUrl) { - this.name = name; - this.imageUrl = imageUrl; - } - - public Keyboard 생성() { - return 생성(null); - } - - public Keyboard 생성(final Long id) { - return Keyboard.builder() - .id(id) - .name(this.name) - .imageUrl(this.imageUrl) - .build(); - } -} diff --git a/backend/src/test/java/com/woowacourse/f12/support/MemberFixtures.java b/backend/src/test/java/com/woowacourse/f12/support/MemberFixtures.java index e6614265..d554bf6d 100644 --- a/backend/src/test/java/com/woowacourse/f12/support/MemberFixtures.java +++ b/backend/src/test/java/com/woowacourse/f12/support/MemberFixtures.java @@ -2,19 +2,21 @@ import static com.woowacourse.f12.domain.member.CareerLevel.JUNIOR; import static com.woowacourse.f12.domain.member.CareerLevel.SENIOR; -import static com.woowacourse.f12.domain.member.JobType.BACK_END; -import static com.woowacourse.f12.domain.member.JobType.FRONT_END; +import static com.woowacourse.f12.domain.member.JobType.BACKEND; +import static com.woowacourse.f12.domain.member.JobType.FRONTEND; +import com.woowacourse.f12.domain.inventoryproduct.InventoryProduct; import com.woowacourse.f12.domain.member.CareerLevel; import com.woowacourse.f12.domain.member.JobType; import com.woowacourse.f12.domain.member.Member; import com.woowacourse.f12.dto.response.auth.GitHubProfileResponse; +import java.util.List; public enum MemberFixtures { - CORINNE("hamcheeseburger", "유현지", "corinne_url", SENIOR, BACK_END), - MINCHO("jswith", "홍영민", "mincho_url", JUNIOR, FRONT_END), - CORINNE_UPDATED("hamcheeseburger", "괴물개발자", "corinne_url", SENIOR, BACK_END); + CORINNE("hamcheeseburger", "유현지", "corinne_url", SENIOR, BACKEND), + MINCHO("jswith", "홍영민", "mincho_url", JUNIOR, FRONTEND), + CORINNE_UPDATED("hamcheeseburger", "괴물개발자", "corinne_url", SENIOR, BACKEND); private final String gitHubId; private final String name; @@ -49,4 +51,16 @@ public enum MemberFixtures { public GitHubProfileResponse 깃허브_프로필() { return new GitHubProfileResponse(this.gitHubId, this.name, this.imageUrl); } + + public Member 대표장비를_추가해서_생성(final Long id, final InventoryProduct inventoryProduct) { + return Member.builder() + .id(id) + .gitHubId(this.gitHubId) + .name(this.name) + .imageUrl(this.imageUrl) + .careerLevel(this.careerLevel) + .jobType(this.jobType) + .inventoryProducts(List.of(inventoryProduct)) + .build(); + } } diff --git a/backend/src/test/java/com/woowacourse/f12/support/ProductFixture.java b/backend/src/test/java/com/woowacourse/f12/support/ProductFixture.java new file mode 100644 index 00000000..b6d0c48d --- /dev/null +++ b/backend/src/test/java/com/woowacourse/f12/support/ProductFixture.java @@ -0,0 +1,48 @@ +package com.woowacourse.f12.support; + +import static com.woowacourse.f12.domain.product.Category.KEYBOARD; +import static com.woowacourse.f12.domain.product.Category.MONITOR; +import static com.woowacourse.f12.domain.product.Category.MOUSE; +import static com.woowacourse.f12.domain.product.Category.SOFTWARE; +import static com.woowacourse.f12.domain.product.Category.STAND; + +import com.woowacourse.f12.domain.product.Category; +import com.woowacourse.f12.domain.product.Product; + +public enum ProductFixture { + + KEYBOARD_1("키보드1", "이미지 주소", KEYBOARD), + KEYBOARD_2("키보드2", "이미지 주소", KEYBOARD), + MOUSE_1("마우스1", "이미지 주소", MOUSE), + MOUSE_2("마우스2", "이미지 주소", MOUSE), + MONITOR_1("모니터1", "이미지 주소", MONITOR), + MONITOR_2("모니터2", "이미지 주소", MONITOR), + STAND_1("거치대1", "이미지 주소", STAND), + STAND_2("거치대2", "이미지 주소", STAND), + SOFTWARE_1("소프트웨어1", "이미지 주소", SOFTWARE), + SOFTWARE_2("소프트웨어2", "이미지 주소", SOFTWARE), + ; + + private final String name; + private final String imageUrl; + private final Category category; + + ProductFixture(final String name, final String imageUrl, final Category category) { + this.name = name; + this.imageUrl = imageUrl; + this.category = category; + } + + public Product 생성() { + return 생성(null); + } + + public Product 생성(final Long id) { + return Product.builder() + .id(id) + .category(category) + .name(this.name) + .imageUrl(this.imageUrl) + .build(); + } +} diff --git a/backend/src/test/java/com/woowacourse/f12/support/ReviewFixtures.java b/backend/src/test/java/com/woowacourse/f12/support/ReviewFixtures.java index 10fa2c41..7f36947c 100644 --- a/backend/src/test/java/com/woowacourse/f12/support/ReviewFixtures.java +++ b/backend/src/test/java/com/woowacourse/f12/support/ReviewFixtures.java @@ -2,7 +2,7 @@ import com.woowacourse.f12.acceptance.support.RestAssuredRequestUtil; import com.woowacourse.f12.domain.member.Member; -import com.woowacourse.f12.domain.product.Keyboard; +import com.woowacourse.f12.domain.product.Product; import com.woowacourse.f12.domain.review.Review; import com.woowacourse.f12.dto.request.review.ReviewRequest; import io.restassured.response.ExtractableResponse; @@ -26,14 +26,14 @@ public enum ReviewFixtures { this.rating = rating; } - public Review 작성(final Keyboard keyboard, final Member member) { - return 작성(null, keyboard, member); + public Review 작성(final Product product, final Member member) { + return 작성(null, product, member); } - public Review 작성(final Long reviewId, final Keyboard keyboard, final Member member) { + public Review 작성(final Long reviewId, final Product product, final Member member) { return Review.builder() .id(reviewId) - .keyboard(keyboard) + .product(product) .member(member) .content(this.content) .rating(this.rating) @@ -43,7 +43,7 @@ public enum ReviewFixtures { public ExtractableResponse 작성_요청을_보낸다(final Long productId, final String token) { final ReviewRequest reviewRequest = new ReviewRequest(this.content, this.rating); - return RestAssuredRequestUtil.로그인된_상태로_POST_요청을_보낸다("/api/v1/keyboards/" + productId + "/reviews", token, + return RestAssuredRequestUtil.로그인된_상태로_POST_요청을_보낸다("/api/v1/products/" + productId + "/reviews", token, reviewRequest); } } diff --git a/backend/src/test/resources/application.yml b/backend/src/test/resources/application.yml index bd6c6af4..ff54274b 100644 --- a/backend/src/test/resources/application.yml +++ b/backend/src/test/resources/application.yml @@ -2,7 +2,6 @@ spring: jpa: hibernate: ddl-auto: create - show-sql: true properties: hibernate: format_sql: true @@ -22,3 +21,6 @@ security: jwt: secret-key: testfkjasl123jl1kjdklfha2h3eoi1eojqdoiq112lkdldk expire-length: 3600000 + +logging: + config: classpath:log4j2/log4j2-local.xml diff --git a/frontend/.eslintrc.json b/frontend/.eslintrc.json index 1a9fc7bd..9f058462 100644 --- a/frontend/.eslintrc.json +++ b/frontend/.eslintrc.json @@ -3,12 +3,13 @@ "parser": "@typescript-eslint/parser", "env": { "browser": true, - "node": true + "node": true, + "cypress/globals": true }, "parserOptions": { "project": ["./tsconfig.json"] }, - "plugins": ["@typescript-eslint", "prettier"], + "plugins": ["@typescript-eslint", "prettier", "cypress"], "extends": [ "eslint:recommended", "plugin:@typescript-eslint/recommended", @@ -16,9 +17,16 @@ "plugin:react/recommended", "plugin:react/jsx-runtime", "plugin:react-hooks/recommended", - "prettier" + "prettier", + "plugin:cypress/recommended" ], "rules": { - "react-hooks/exhaustive-deps": 0 + "react-hooks/exhaustive-deps": 0, + "@typescript-eslint/no-misused-promises": [ + "error", + { + "checksVoidReturn": false + } + ] } } diff --git a/frontend/cypress.config.ts b/frontend/cypress.config.ts new file mode 100644 index 00000000..562b65f3 --- /dev/null +++ b/frontend/cypress.config.ts @@ -0,0 +1,9 @@ +import { defineConfig } from 'cypress'; + +export default defineConfig({ + e2e: { + baseUrl: 'http://localhost:3000', + viewportHeight: 900, + viewportWidth: 1440, + }, +}); diff --git a/frontend/cypress/e2e/spec.cy.ts b/frontend/cypress/e2e/spec.cy.ts new file mode 100644 index 00000000..7e5a6c4c --- /dev/null +++ b/frontend/cypress/e2e/spec.cy.ts @@ -0,0 +1,132 @@ +describe('비회원 사용자 기본 플로우', () => { + beforeEach(() => { + cy.intercept({ method: 'GET', url: '**/api/v1/products*' }).as( + 'productsRequest' + ); + cy.intercept({ method: 'GET', url: '**/api/v1/reviews*' }).as( + 'reviewsRequest' + ); + + cy.visit(''); + }); + + describe('홈 페이지 테스트', () => { + it('홈 페이지에 접속할 수 있다.', () => { + cy.visit(''); + }); + + it('홈 페이지에 접속하면 상품을 조회할 수 있다.', () => { + cy.wait('@productsRequest'); + + cy.findByRole('region', { name: /상품/ }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('홈 페이지에 접속하면 후기를 조회할 수 있다.', () => { + cy.wait('@reviewsRequest'); + + cy.findByRole('region', { name: /후기/ }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('홈 페이지에서 스크롤을 내리면 후기가 추가 로딩이 된다.', () => { + cy.wait('@reviewsRequest').then(() => { + cy.findByRole('region', { name: /후기/ }).isCardImageLoadDone(); + }); + + cy.findByRole('region', { + name: '무한스크롤 목록 끝 지표', + }).scrollIntoView(); + + cy.wait('@reviewsRequest').then((res) => { + const page = new URL(res.request.url).searchParams.get('page'); + expect(page).to.equal('1'); // 요청 url에서 페이지 추가 로딩 확인 + + cy.findByRole('region', { name: /후기/ }).isNotLoading(); + }); + }); + + it('카테고리에서 전체 상품을 클릭하면 전체 상품 리스트를 조회할 수 있다.', () => { + cy.findByRole('button', { name: '카테고리' }).click(); + cy.findByRole('link', { name: '전체 상품' }).click(); + cy.findByRole('region', { name: '모든 상품 목록' }) + .findAllByRole('article') + .should('be.visible'); + }); + it('카테고리에서 키보드를 클릭하면 전체 키보드 상품 리스트를 조회할 수 있다.', () => { + cy.findByRole('button', { name: '카테고리' }).click(); + cy.findByRole('link', { name: '키보드' }).click(); + + cy.wait('@productsRequest'); + + cy.findByRole('region', { name: '모든 키보드 목록' }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('카테고리에서 마우스를 클릭하면 전체 마우스 상품 리스트를 조회할 수 있다.', () => { + cy.findByRole('button', { name: '카테고리' }).click(); + cy.findByRole('link', { name: '마우스' }).click(); + + cy.wait('@productsRequest'); + + cy.findByRole('region', { name: '모든 마우스 목록' }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('카테고리에서 모니터를 클릭하면 전체 모니터 상품 리스트를 조회할 수 있다.', () => { + cy.findByRole('button', { name: '카테고리' }).click(); + cy.findByRole('link', { name: '모니터' }).click(); + + cy.wait('@productsRequest'); + + cy.findByRole('region', { name: '모든 모니터 목록' }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('카테고리에서 거치대를 클릭하면 전체 거치대 상품 리스트를 조회할 수 있다.', () => { + cy.findByRole('button', { name: '카테고리' }).click(); + cy.findByRole('link', { name: '거치대' }).click(); + + cy.wait('@productsRequest'); + + cy.findByRole('region', { name: '모든 거치대 목록' }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('카테고리에서 소프트웨어를 클릭하면 전체 소프트웨어 상품 리스트를 조회할 수 있다.', () => { + cy.findByRole('button', { name: '카테고리' }).click(); + cy.findByRole('link', { name: '소프트웨어' }).click(); + + cy.wait('@productsRequest'); + cy.findByRole('region', { name: '모든 소프트웨어 목록' }) + .findAllByRole('article') + .should('be.visible'); + }); + + it('상품 상세 페이지에 진입하면, 상품 사진과 리뷰와 통계정보를 볼 수 있다.', () => { + cy.wait('@productsRequest'); + + cy.findByRole('region', { name: '인기 있는 상품' }) + .findAllByRole('article') + .findByRole('img') + .click(); + + // 후기는 없는 상품이 있을 수도 있기 때문에 삭제하거나 빈 데이터 이미지 표시 필요 + // cy.findByRole('region', { name: '최근 후기' }) + // .findAllByRole('article') + // .should('be.visible'); + + cy.findByRole('img', { name: '상품 이미지' }).should('be.visible'); + + cy.findByRole('region', { name: '통계 정보' }) + .scrollIntoView() + .should('be.visible'); + }); + }); +}); diff --git a/frontend/cypress/support/commands.ts b/frontend/cypress/support/commands.ts new file mode 100644 index 00000000..65b7f159 --- /dev/null +++ b/frontend/cypress/support/commands.ts @@ -0,0 +1,23 @@ +import '@testing-library/cypress/add-commands'; + +Cypress.Commands.add( + 'isCardImageLoadDone', + { prevSubject: true }, + (card: Cypress.Chainable>) => { + cy.wrap(card) + .findAllByRole('article') + .each((element) => { + cy.wrap(element).get('img').should('be.visible'); + }); + } +); + +Cypress.Commands.add( + 'isNotLoading', + { prevSubject: true }, + (container: Cypress.Chainable>) => { + cy.wrap(container) + .findByRole('region', { name: 'loading' }) + .should('not.exist'); + } +); diff --git a/frontend/cypress/support/e2e.ts b/frontend/cypress/support/e2e.ts new file mode 100644 index 00000000..1221b17e --- /dev/null +++ b/frontend/cypress/support/e2e.ts @@ -0,0 +1 @@ +import './commands'; diff --git a/frontend/cypress/testing-library.d.ts b/frontend/cypress/testing-library.d.ts new file mode 100644 index 00000000..111e6f8b --- /dev/null +++ b/frontend/cypress/testing-library.d.ts @@ -0,0 +1,252 @@ +// TypeScript Version: 3.8 + +import { + configure, + Matcher, + ByRoleMatcher, + MatcherOptions as DTLMatcherOptions, + ByRoleOptions as DTLByRoleOptions, + SelectorMatcherOptions as DTLSelectorMatcherOptions, +} from '@testing-library/dom'; + +export interface CTLMatcherOptions + extends Partial, + Partial { + container?: Element | JQuery; +} + +export type MatcherOptions = DTLMatcherOptions | CTLMatcherOptions; +export type ByRoleOptions = DTLByRoleOptions | CTLMatcherOptions; +export type SelectorMatcherOptions = + | DTLSelectorMatcherOptions + | CTLMatcherOptions; + +declare global { + namespace Cypress { + // 🤔 unsure why this Subject is unused, nor what to do with it... + // eslint-disable-next-line @typescript-eslint/no-unused-vars + interface Chainable { + isNotLoading: () => void; + isCardImageLoadDone: () => void; + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByPlaceholderText( + id: Matcher, + options?: MatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByPlaceholderText( + id: Matcher, + options?: MatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByText( + id: Matcher, + options?: SelectorMatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByText( + id: Matcher, + options?: SelectorMatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByLabelText( + id: Matcher, + options?: SelectorMatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByLabelText( + id: Matcher, + options?: SelectorMatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByAltText(id: Matcher, options?: MatcherOptions): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByAltText( + id: Matcher, + options?: MatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByTestId(id: Matcher, options?: MatcherOptions): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByTestId(id: Matcher, options?: MatcherOptions): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByTitle(id: Matcher, options?: MatcherOptions): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByTitle(id: Matcher, options?: MatcherOptions): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByDisplayValue( + id: Matcher, + options?: MatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByDisplayValue( + id: Matcher, + options?: MatcherOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findByRole(id: ByRoleMatcher, options?: ByRoleOptions): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * `findBy*` APIs search for an element and throw an error if nothing found + * `findAllBy*` APIs search for all elements and an error if nothing found + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + findAllByRole( + id: ByRoleMatcher, + options?: ByRoleOptions + ): Chainable; + + /** + * dom-testing-library helpers for Cypress + * + * Configure dom-testing-library through Cypress object. Wraps `configure(config)` + * + * @see https://github.com/testing-library/cypress-testing-library#usage + * @see https://github.com/testing-library/dom-testing-library#table-of-contents + */ + configureCypressTestingLibrary( + config: Parameters[0] + ): Chainable; + } + } +} + +export { configure }; diff --git a/frontend/cypress/tsconfig.json b/frontend/cypress/tsconfig.json new file mode 100644 index 00000000..e1a02dd8 --- /dev/null +++ b/frontend/cypress/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../tsconfig.json", + "compilerOptions": { + "target": "es5", + "lib": ["es5", "dom"], + "types": ["cypress", "node"], + "baseUrl": ".." + }, + "include": ["**/*.ts", "./testing-library.d.ts"] +} diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 216cf7a4..8b26734b 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -1,26 +1,42 @@ { - "name": "react-setup", - "version": "1.0.0", + "name": "f12", + "version": "0.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { - "name": "react-setup", - "version": "1.0.0", + "name": "f12", + "version": "0.3.0", "license": "ISC", "dependencies": { + "@babel/cli": "^7.18.6", + "@babel/core": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@lottiefiles/react-lottie-player": "^3.4.7", + "@svgr/webpack": "^6.2.1", + "@types/react": "^18.0.14", + "@types/react-dom": "^18.0.5", + "@types/react-router-dom": "^5.3.3", + "@types/styled-components": "^5.1.25", "axios": "^0.27.2", + "babel-loader": "^8.2.5", + "css-loader": "^6.7.1", + "html-webpack-plugin": "^5.5.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.3.0", - "styled-components": "^5.3.5" + "sass": "^1.53.0", + "sass-loader": "^13.0.2", + "style-loader": "^3.3.1", + "styled-components": "^5.3.5", + "typescript": "^4.7.4", + "webpack": "^5.73.0", + "webpack-cli": "^4.10.0", + "webpack-dev-server": "^4.9.2" }, "devDependencies": { - "@babel/cli": "^7.18.6", - "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", "@storybook/addon-actions": "^6.5.9", "@storybook/addon-essentials": "^6.5.9", "@storybook/addon-interactions": "^6.5.9", @@ -29,37 +45,25 @@ "@storybook/manager-webpack5": "^6.5.9", "@storybook/react": "^6.5.9", "@storybook/testing-library": "^0.0.13", - "@svgr/webpack": "^6.2.1", - "@types/react": "^18.0.14", - "@types/react-dom": "^18.0.5", - "@types/react-router-dom": "^5.3.3", - "@types/styled-components": "^5.1.25", + "@testing-library/cypress": "^8.0.3", "@typescript-eslint/eslint-plugin": "^5.30.0", "@typescript-eslint/parser": "^5.30.0", - "babel-loader": "^8.2.5", - "css-loader": "^6.7.1", + "chromatic": "^6.7.3", + "cypress": "^10.3.1", "eslint": "^8.19.0", "eslint-config-prettier": "^8.5.0", + "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-prettier": "^4.1.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", - "html-webpack-plugin": "^5.5.0", "msw": "^0.42.3", - "prettier": "^2.7.1", - "sass": "^1.53.0", - "sass-loader": "^13.0.2", - "style-loader": "^3.3.1", - "typescript": "^4.7.4", - "webpack": "^5.73.0", - "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.9.2" + "prettier": "^2.7.1" } }, "node_modules/@ampproject/remapping": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -72,7 +76,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.18.6.tgz", "integrity": "sha512-jXNHoYCbxZ8rKy+2lyy0VjcaGxS4NPbN0qc95DjIiGZQL/mTNx3o2/yI0TG+X0VrrTuwmO7zH52T9NcNdbF9Uw==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.8", "commander": "^4.0.1", @@ -112,7 +115,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -121,7 +123,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -188,7 +189,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "dev": true, "dependencies": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.6" @@ -201,7 +201,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -219,7 +218,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.6", @@ -240,7 +238,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -256,7 +253,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -283,7 +279,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==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -318,7 +313,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -341,7 +335,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", @@ -360,7 +353,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==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -372,7 +364,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -381,7 +372,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.6", @@ -399,7 +389,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-member-expression-to-functions": "^7.18.6", @@ -415,7 +404,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==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -427,7 +415,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "dev": true, "dependencies": { "@babel/types": "^7.18.6" }, @@ -458,7 +445,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==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -467,7 +453,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "dev": true, "dependencies": { "@babel/helper-function-name": "^7.18.6", "@babel/template": "^7.18.6", @@ -482,7 +467,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dev": true, "dependencies": { "@babel/template": "^7.18.6", "@babel/traverse": "^7.18.6", @@ -520,7 +504,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -535,7 +518,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", @@ -552,7 +534,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -570,7 +551,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==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -586,7 +566,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==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -622,7 +601,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -654,7 +632,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -670,7 +647,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -686,7 +662,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -702,7 +677,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -718,7 +692,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -734,7 +707,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.18.6", "@babel/helper-compilation-targets": "^7.18.6", @@ -753,7 +725,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -769,7 +740,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", @@ -786,7 +756,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==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -802,7 +771,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==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -820,7 +788,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -836,7 +803,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -848,7 +814,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.12.13" }, @@ -860,7 +825,6 @@ "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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -890,7 +854,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -917,7 +880,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.3" }, @@ -944,7 +906,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -959,7 +920,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -971,7 +931,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -986,7 +945,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -998,7 +956,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1010,7 +967,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.10.4" }, @@ -1022,7 +978,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1034,7 +989,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1046,7 +1000,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.8.0" }, @@ -1058,7 +1011,6 @@ "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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1073,7 +1025,6 @@ "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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.14.5" }, @@ -1088,7 +1039,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1103,7 +1053,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1118,7 +1067,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==", - "dev": true, "dependencies": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1135,7 +1083,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1150,7 +1097,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1165,7 +1111,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.6", @@ -1187,7 +1132,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1202,7 +1146,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1217,7 +1160,6 @@ "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==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1233,7 +1175,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1248,7 +1189,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==", - "dev": true, "dependencies": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1280,7 +1220,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1295,7 +1234,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "dev": true, "dependencies": { "@babel/helper-compilation-targets": "^7.18.6", "@babel/helper-function-name": "^7.18.6", @@ -1312,7 +1250,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1327,7 +1264,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1342,7 +1278,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==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1359,7 +1294,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==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1377,7 +1311,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "dev": true, "dependencies": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.18.6", @@ -1396,7 +1329,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==", - "dev": true, "dependencies": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1412,7 +1344,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1428,7 +1359,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1443,7 +1373,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" @@ -1459,7 +1388,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1474,7 +1402,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1489,7 +1416,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.6.tgz", "integrity": "sha512-4g5H1bonF1dqgMe+wQ2fvDlRZ/mN/KwArk13teDv+xxn+pUDEiiDluQd6D2B30MJcL1u3qr0WZpfq0mw9/zSqA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1504,7 +1430,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1519,7 +1444,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", @@ -1538,7 +1462,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, "dependencies": { "@babel/plugin-transform-react-jsx": "^7.18.6" }, @@ -1553,7 +1476,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1569,7 +1491,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" @@ -1585,7 +1506,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1600,7 +1520,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1615,7 +1534,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" @@ -1631,7 +1549,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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1646,7 +1563,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1661,7 +1577,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1676,7 +1591,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.6.tgz", "integrity": "sha512-ijHNhzIrLj5lQCnI6aaNVRtGVuUZhOXFLRVFs7lLrkXTHip4FKty5oAuQdk4tywG0/WjXmjTfQCWmuzrvFer1w==", - "dev": true, "dependencies": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -1693,7 +1607,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6" }, @@ -1708,7 +1621,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==", - "dev": true, "dependencies": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -1724,7 +1636,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.18.6", "@babel/helper-compilation-targets": "^7.18.6", @@ -1830,7 +1741,6 @@ "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==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -1846,7 +1756,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -1866,7 +1775,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, "dependencies": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -2064,6 +1972,77 @@ "node": ">=0.1.90" } }, + "node_modules/@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "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", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "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": "^8.3.2" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/@cypress/request/node_modules/form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 0.12" + } + }, + "node_modules/@cypress/request/node_modules/qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true, + "engines": { + "node": ">=0.6" + } + }, + "node_modules/@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "dependencies": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + } + }, + "node_modules/@cypress/xvfb/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/@design-systems/utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/@design-systems/utils/-/utils-2.12.0.tgz", @@ -2174,7 +2153,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, "engines": { "node": ">=10.0.0" } @@ -2505,7 +2483,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -2534,7 +2511,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -2544,7 +2520,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "dependencies": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -2571,8 +2546,18 @@ "node_modules/@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "node_modules/@lottiefiles/react-lottie-player": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@lottiefiles/react-lottie-player/-/react-lottie-player-3.4.7.tgz", + "integrity": "sha512-KqkwRiCQPDNzimsXnNSgeJjJlZQ6Fr9JE3OtZdOaGrXovZJ+zDeZNxIwxID8Up0eAdm4zJjudOSc5EJSiGw9RA==", + "dependencies": { + "lottie-web": "^5.7.8" + }, + "peerDependencies": { + "react": "16 - 18" + } }, "node_modules/@mdx-js/mdx": { "version": "1.6.22", @@ -2742,7 +2727,6 @@ "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, "optional": true }, "node_modules/@nodelib/fs.scandir": { @@ -9241,7 +9225,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", - "dev": true, "engines": { "node": ">=10" }, @@ -9257,7 +9240,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", - "dev": true, "engines": { "node": ">=10" }, @@ -9273,7 +9255,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", - "dev": true, "engines": { "node": ">=10" }, @@ -9289,7 +9270,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -9305,7 +9285,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", - "dev": true, "engines": { "node": ">=10" }, @@ -9321,7 +9300,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", - "dev": true, "engines": { "node": ">=10" }, @@ -9337,7 +9315,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -9353,7 +9330,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", - "dev": true, "engines": { "node": ">=12" }, @@ -9369,7 +9345,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", - "dev": true, "dependencies": { "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", @@ -9395,7 +9370,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", - "dev": true, "dependencies": { "@svgr/plugin-jsx": "^6.2.1", "camelcase": "^6.2.0", @@ -9413,7 +9387,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, "engines": { "node": ">=10" }, @@ -9425,7 +9398,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", - "dev": true, "dependencies": { "@babel/types": "^7.15.6", "entities": "^3.0.1" @@ -9442,7 +9414,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true, "engines": { "node": ">=0.12" }, @@ -9454,7 +9425,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", - "dev": true, "dependencies": { "@babel/core": "^7.15.5", "@svgr/babel-preset": "^6.2.0", @@ -9476,7 +9446,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", - "dev": true, "dependencies": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", @@ -9497,7 +9466,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", - "dev": true, "dependencies": { "@babel/core": "^7.15.5", "@babel/plugin-transform-react-constant-elements": "^7.14.5", @@ -9516,6 +9484,23 @@ "url": "https://github.com/sponsors/gregberge" } }, + "node_modules/@testing-library/cypress": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.3.tgz", + "integrity": "sha512-nY2YaSbmuPo5k6kL0iLj/pGPPfka3iwb3kpTx8QN/vOCns92Saz9wfACqB8FJzcR7+lfA4d5HUOWqmTddBzczg==", + "dev": true, + "dependencies": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" + }, + "engines": { + "node": ">=12", + "npm": ">=6" + }, + "peerDependencies": { + "cypress": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 || ^10.0.0" + } + }, "node_modules/@testing-library/dom": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.14.0.tgz", @@ -9625,7 +9610,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true, "engines": { "node": ">=10.13.0" } @@ -9640,7 +9624,6 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "dependencies": { "@types/connect": "*", "@types/node": "*" @@ -9650,7 +9633,6 @@ "version": "3.5.10", "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -9659,7 +9641,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -9668,7 +9649,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, "dependencies": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -9684,7 +9664,6 @@ "version": "8.4.3", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", - "dev": true, "dependencies": { "@types/estree": "*", "@types/json-schema": "*" @@ -9694,7 +9673,6 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, "dependencies": { "@types/eslint": "*", "@types/estree": "*" @@ -9703,14 +9681,12 @@ "node_modules/@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -9722,7 +9698,6 @@ "version": "4.17.29", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", - "dev": true, "dependencies": { "@types/node": "*", "@types/qs": "*", @@ -9760,14 +9735,12 @@ "node_modules/@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "node_modules/@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "dev": true, "dependencies": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -9776,14 +9749,12 @@ "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "node_modules/@types/http-proxy": { "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -9827,8 +9798,7 @@ "node_modules/@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "node_modules/@types/lodash": { "version": "4.14.182", @@ -9848,8 +9818,7 @@ "node_modules/@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "node_modules/@types/minimatch": { "version": "3.0.5", @@ -9860,8 +9829,7 @@ "node_modules/@types/node": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", - "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==", - "dev": true + "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" }, "node_modules/@types/node-fetch": { "version": "2.6.2", @@ -9888,8 +9856,7 @@ "node_modules/@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "node_modules/@types/parse5": { "version": "5.0.3", @@ -9906,26 +9873,22 @@ "node_modules/@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "node_modules/@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "node_modules/@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { "version": "18.0.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", "integrity": "sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==", - "dev": true, "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -9936,7 +9899,6 @@ "version": "18.0.5", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", - "dev": true, "dependencies": { "@types/react": "*" } @@ -9945,7 +9907,6 @@ "version": "5.1.18", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", - "dev": true, "dependencies": { "@types/history": "^4.7.11", "@types/react": "*" @@ -9955,7 +9916,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, "dependencies": { "@types/history": "^4.7.11", "@types/react": "*", @@ -9974,20 +9934,17 @@ "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "node_modules/@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, "dependencies": { "@types/express": "*" } @@ -9996,7 +9953,6 @@ "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, "dependencies": { "@types/mime": "^1", "@types/node": "*" @@ -10011,11 +9967,22 @@ "@types/node": "*" } }, + "node_modules/@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "node_modules/@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "node_modules/@types/sockjs": { "version": "0.3.33", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -10030,7 +9997,6 @@ "version": "5.1.25", "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.25.tgz", "integrity": "sha512-fgwl+0Pa8pdkwXRoVPP9JbqF0Ivo9llnmsm+7TCI330kbPIFd9qv1Lrhr37shf4tnxCOSu+/IgqM7uJXLWZZNQ==", - "dev": true, "dependencies": { "@types/hoist-non-react-statics": "*", "@types/react": "*", @@ -10102,7 +10068,6 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, "dependencies": { "@types/node": "*" } @@ -10122,6 +10087,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "node_modules/@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz", @@ -10340,7 +10315,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, "dependencies": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -10349,20 +10323,17 @@ "node_modules/@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "node_modules/@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "node_modules/@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "node_modules/@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -10437,7 +10408,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, "dependencies": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -10447,14 +10417,12 @@ "node_modules/@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "node_modules/@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -10466,7 +10434,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, "dependencies": { "@xtuc/ieee754": "^1.2.0" } @@ -10475,7 +10442,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, "dependencies": { "@xtuc/long": "4.2.2" } @@ -10483,14 +10449,12 @@ "node_modules/@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "node_modules/@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -10506,7 +10470,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -10519,7 +10482,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -10531,7 +10493,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -10588,7 +10549,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, "dependencies": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -10598,7 +10558,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, "peerDependencies": { "webpack": "4.x.x || 5.x.x", "webpack-cli": "4.x.x" @@ -10608,7 +10567,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, "dependencies": { "envinfo": "^7.7.3" }, @@ -10620,7 +10578,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, "peerDependencies": { "webpack-cli": "4.x.x" }, @@ -10642,20 +10599,17 @@ "node_modules/@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "node_modules/@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "node_modules/accepts": { "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==", - "dev": true, "dependencies": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -10668,7 +10622,6 @@ "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -10680,7 +10633,6 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, "peerDependencies": { "acorn": "^8" } @@ -10754,7 +10706,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -10779,7 +10730,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "dependencies": { "ajv": "^8.0.0" }, @@ -10796,7 +10746,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -10811,14 +10760,12 @@ "node_modules/ajv-formats/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/ajv-keywords": { "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "peerDependencies": { "ajv": "^6.9.1" } @@ -10872,7 +10819,6 @@ "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true, "engines": [ "node >= 0.8.0" ], @@ -10884,7 +10830,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -10919,7 +10864,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -10940,6 +10884,26 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "node_modules/arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -11008,8 +10972,7 @@ "node_modules/array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "node_modules/array-includes": { "version": "3.1.5", @@ -11140,6 +11103,15 @@ "node": ">=8" } }, + "node_modules/asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "dependencies": { + "safer-buffer": "~2.1.0" + } + }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -11168,6 +11140,15 @@ "util": "0.10.3" } }, + "node_modules/assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true, + "engines": { + "node": ">=0.8" + } + }, "node_modules/assert/node_modules/inherits": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", @@ -11204,6 +11185,21 @@ "node": ">=4" } }, + "node_modules/astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "node_modules/async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -11282,6 +11278,21 @@ "url": "https://opencollective.com/postcss/" } }, + "node_modules/aws-sign2": { + "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==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, "node_modules/axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -11308,7 +11319,6 @@ "version": "8.2.5", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, "dependencies": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -11327,7 +11337,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -11342,7 +11351,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -11389,7 +11397,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "dependencies": { "object.assign": "^4.1.0" } @@ -11454,7 +11461,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.3.1", @@ -11468,7 +11474,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.21.0" @@ -11481,7 +11486,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, "dependencies": { "@babel/helper-define-polyfill-provider": "^0.3.1" }, @@ -11533,8 +11537,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base": { "version": "0.11.2", @@ -11589,8 +11592,16 @@ "node_modules/batch": { "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==", - "dev": true + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "dependencies": { + "tweetnacl": "^0.14.3" + } }, "node_modules/better-opn": { "version": "2.1.1", @@ -11634,7 +11645,6 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true, "engines": { "node": "*" } @@ -11643,7 +11653,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -11693,6 +11702,12 @@ "ieee754": "^1.1.13" } }, + "node_modules/blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, "node_modules/bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -11709,7 +11724,6 @@ "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==", - "dev": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -11733,7 +11747,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -11742,7 +11755,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -11750,14 +11762,12 @@ "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/bonjour-service": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", - "dev": true, "dependencies": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -11768,8 +11778,7 @@ "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "node_modules/boxen": { "version": "5.1.2", @@ -11889,7 +11898,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -11899,7 +11907,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -12016,7 +12023,6 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -12060,11 +12066,19 @@ "isarray": "^1.0.0" } }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "node_modules/buffer-xor": { "version": "1.0.3", @@ -12082,7 +12096,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -12238,11 +12251,19 @@ "node": ">=0.10.0" } }, + "node_modules/cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -12261,7 +12282,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -12270,7 +12290,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, "dependencies": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -12327,7 +12346,6 @@ "version": "1.0.30001359", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz", "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==", - "dev": true, "funding": [ { "type": "opencollective", @@ -12360,6 +12378,12 @@ "node": ">=4" } }, + "node_modules/caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "node_modules/ccount": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", @@ -12419,11 +12443,19 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "node_modules/check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, "node_modules/chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -12455,11 +12487,25 @@ "node": ">=10" } }, + "node_modules/chromatic": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-6.7.3.tgz", + "integrity": "sha512-QVeP9LRj/4r/eVCyX+TybFEl7iyQ+6QzrkPChtoDhFw0B24B1y13Mya3FElltb+EPDsEG6V5VYzYnG+w/VPmaw==", + "dev": true, + "dependencies": { + "@discoveryjs/json-ext": "^0.5.7", + "@types/webpack-env": "^1.17.0" + }, + "bin": { + "chroma": "bin/main.cjs", + "chromatic": "bin/main.cjs", + "chromatic-cli": "bin/main.cjs" + } + }, "node_modules/chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, "engines": { "node": ">=6.0" } @@ -12588,7 +12634,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "dev": true, "dependencies": { "source-map": "~0.6.0" }, @@ -12656,6 +12701,22 @@ "@colors/colors": "1.5.0" } }, + "node_modules/cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "dependencies": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -12689,7 +12750,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, "dependencies": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -12756,8 +12816,7 @@ "node_modules/colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "node_modules/combined-stream": { "version": "1.0.8", @@ -12784,7 +12843,6 @@ "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true, "engines": { "node": ">= 6" } @@ -12795,11 +12853,19 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, + "node_modules/common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "node_modules/component-emitter": { "version": "1.3.0", @@ -12811,7 +12877,6 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, "dependencies": { "mime-db": ">= 1.43.0 < 2" }, @@ -12823,7 +12888,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, "dependencies": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -12841,7 +12905,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -12849,14 +12912,12 @@ "node_modules/compression/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -12901,7 +12962,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true, "engines": { "node": ">=0.8" } @@ -12928,7 +12988,6 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, "dependencies": { "safe-buffer": "5.2.1" }, @@ -12940,7 +12999,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -12960,7 +13018,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -12969,7 +13026,6 @@ "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==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.1" } @@ -12978,7 +13034,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -12986,8 +13041,7 @@ "node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "node_modules/copy-concurrently": { "version": "1.0.5", @@ -13057,7 +13111,6 @@ "version": "3.23.3", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, "dependencies": { "browserslist": "^4.21.0", "semver": "7.0.0" @@ -13071,7 +13124,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -13090,14 +13142,12 @@ "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "node_modules/cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "dependencies": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -13466,7 +13516,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -13510,7 +13559,6 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, "dependencies": { "icss-utils": "^5.1.0", "postcss": "^8.4.7", @@ -13536,7 +13584,6 @@ "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -13551,7 +13598,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, "dependencies": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -13577,7 +13623,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, "dependencies": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -13590,7 +13635,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true, "engines": { "node": ">= 6" }, @@ -13602,7 +13646,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true, "bin": { "cssesc": "bin/cssesc" }, @@ -13614,7 +13657,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, "dependencies": { "css-tree": "^1.1.2" }, @@ -13625,8 +13667,7 @@ "node_modules/csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", - "dev": true + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "node_modules/currently-unhandled": { "version": "0.4.1", @@ -13647,6 +13688,306 @@ "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", "dev": true }, + "node_modules/cypress": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.3.1.tgz", + "integrity": "sha512-As9HrExjAgpgjCnbiQCuPdw5sWKx5HUJcK2EOKziu642akwufr/GUeqL5UnCPYXTyyibvEdWT/pSC2qnGW/e5w==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "bin": { + "cypress": "bin/cypress" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/cypress/node_modules/@types/node": { + "version": "14.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.23.tgz", + "integrity": "sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA==", + "dev": true + }, + "node_modules/cypress/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/cypress/node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/cypress/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/cypress/node_modules/chalk/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "node_modules/cypress/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/cypress/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/cypress/node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/cypress/node_modules/execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/cypress/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cypress/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/cypress/node_modules/human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true, + "engines": { + "node": ">=8.12.0" + } + }, + "node_modules/cypress/node_modules/is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/cypress/node_modules/semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/cypress/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/cypress/node_modules/tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "dependencies": { + "rimraf": "^3.0.0" + }, + "engines": { + "node": ">=8.17.0" + } + }, + "node_modules/cypress/node_modules/untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/dayjs": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", + "dev": true + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -13698,7 +14039,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -13725,7 +14065,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, "dependencies": { "execa": "^5.0.0" }, @@ -13746,7 +14085,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true, "engines": { "node": ">=8" } @@ -13755,7 +14093,6 @@ "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, "dependencies": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -13798,7 +14135,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -13817,7 +14153,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" @@ -13839,8 +14174,7 @@ "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "node_modules/detect-package-manager": { "version": "2.0.1", @@ -13918,14 +14252,12 @@ "node_modules/dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "node_modules/dns-packet": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, "dependencies": { "@leichtgewicht/ip-codec": "^2.0.1" }, @@ -13955,7 +14287,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, "dependencies": { "utila": "~0.4" } @@ -13964,7 +14295,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, "dependencies": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -13994,7 +14324,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true, "funding": [ { "type": "github", @@ -14006,7 +14335,6 @@ "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, "dependencies": { "domelementtype": "^2.2.0" }, @@ -14021,7 +14349,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, "dependencies": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -14035,7 +14362,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -14092,17 +14418,25 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "dependencies": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { "version": "1.4.172", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.172.tgz", - "integrity": "sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q==", - "dev": true + "integrity": "sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q==" }, "node_modules/elliptic": { "version": "6.5.4", @@ -14135,7 +14469,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true, "engines": { "node": ">= 4" } @@ -14144,7 +14477,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -14173,7 +14505,6 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, "dependencies": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" @@ -14182,11 +14513,31 @@ "node": ">=10.13.0" } }, + "node_modules/enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "dependencies": { + "ansi-colors": "^4.1.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/enquirer/node_modules/ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true, + "engines": { + "node": ">=6" + } + }, "node_modules/entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true, "funding": { "url": "https://github.com/fb55/entities?sponsor=1" } @@ -14195,7 +14546,6 @@ "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, "bin": { "envinfo": "dist/cli.js" }, @@ -14219,7 +14569,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "dependencies": { "is-arrayish": "^0.2.1" } @@ -14304,8 +14653,7 @@ "node_modules/es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "node_modules/es-shim-unscopables": { "version": "1.0.0", @@ -14352,7 +14700,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, "engines": { "node": ">=6" } @@ -14360,8 +14707,7 @@ "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "node_modules/escape-string-regexp": { "version": "1.0.5", @@ -14517,6 +14863,18 @@ "eslint": ">=7.0.0" } }, + "node_modules/eslint-plugin-cypress": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", + "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "dev": true, + "dependencies": { + "globals": "^11.12.0" + }, + "peerDependencies": { + "eslint": ">= 3.2.1" + } + }, "node_modules/eslint-plugin-prettier": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.1.0.tgz", @@ -14620,7 +14978,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -14848,7 +15205,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "dependencies": { "estraverse": "^5.2.0" }, @@ -14860,7 +15216,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, "engines": { "node": ">=4.0" } @@ -14869,7 +15224,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, "engines": { "node": ">=4.0" } @@ -14892,7 +15246,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -14901,22 +15254,25 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "dev": true, "engines": { "node": ">= 0.6" } }, + "node_modules/eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", + "dev": true + }, "node_modules/eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "node_modules/events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, "engines": { "node": ">=0.8.x" } @@ -14941,7 +15297,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "dependencies": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -14960,6 +15315,27 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "dependencies": { + "pify": "^2.2.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/executable/node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -15107,7 +15483,6 @@ "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -15148,14 +15523,12 @@ "node_modules/express/node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "node_modules/express/node_modules/debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15163,14 +15536,12 @@ "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -15271,11 +15642,54 @@ "node": ">=0.10.0" } }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/extract-zip/node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true, + "engines": [ + "node >=0.6.0" + ] + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "node_modules/fast-diff": { "version": "1.2.0", @@ -15308,8 +15722,7 @@ "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "node_modules/fast-levenshtein": { "version": "2.0.6", @@ -15320,8 +15733,7 @@ "node_modules/fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==" }, "node_modules/fastq": { "version": "1.13.0", @@ -15349,7 +15761,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, "dependencies": { "websocket-driver": ">=0.5.1" }, @@ -15366,6 +15777,15 @@ "bser": "2.1.1" } }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "dependencies": { + "pend": "~1.2.0" + } + }, "node_modules/fetch-retry": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.2.tgz", @@ -15460,7 +15880,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -15472,7 +15891,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -15490,7 +15908,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -15498,14 +15915,12 @@ "node_modules/finalhandler/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/find-cache-dir": { "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==", - "dev": true, "dependencies": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -15522,7 +15937,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "dependencies": { "semver": "^6.0.0" }, @@ -15537,7 +15951,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "dependencies": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -15658,6 +16071,15 @@ "node": ">=8.0.0" } }, + "node_modules/forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true, + "engines": { + "node": "*" + } + }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -15852,7 +16274,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -15873,7 +16294,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -15942,14 +16362,12 @@ "node_modules/fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "node_modules/fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" }, "node_modules/fs-write-stream-atomic": { "version": "1.0.10", @@ -15990,14 +16408,12 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -16010,8 +16426,7 @@ "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "node_modules/function.prototype.name": { "version": "1.1.5", @@ -16070,7 +16485,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -16088,7 +16502,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, "dependencies": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -16121,7 +16534,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, "engines": { "node": ">=10" }, @@ -16154,6 +16566,24 @@ "node": ">=0.10.0" } }, + "node_modules/getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "dependencies": { + "async": "^3.2.0" + } + }, + "node_modules/getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0" + } + }, "node_modules/github-slugger": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", @@ -16164,7 +16594,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -16184,7 +16613,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -16210,8 +16638,7 @@ "node_modules/glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "node_modules/global": { "version": "4.4.0", @@ -16223,6 +16650,21 @@ "process": "^0.11.10" } }, + "node_modules/global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -16278,8 +16720,7 @@ "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "node_modules/graphql": { "version": "16.5.0", @@ -16293,8 +16734,7 @@ "node_modules/handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "node_modules/handlebars": { "version": "4.7.7", @@ -16321,7 +16761,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "dependencies": { "function-bind": "^1.1.1" }, @@ -16374,7 +16813,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "dependencies": { "get-intrinsic": "^1.1.1" }, @@ -16386,7 +16824,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -16635,7 +17072,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, "bin": { "he": "bin/he" } @@ -16692,7 +17128,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, "dependencies": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -16704,7 +17139,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "dependencies": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -16719,7 +17153,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "dependencies": { "safe-buffer": "~5.1.0" } @@ -16727,8 +17160,7 @@ "node_modules/html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "node_modules/html-escaper": { "version": "2.0.2", @@ -16740,7 +17172,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, "dependencies": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -16761,7 +17192,6 @@ "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true, "engines": { "node": ">= 12" } @@ -16792,7 +17222,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, "dependencies": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -16815,7 +17244,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, "funding": [ "https://github.com/fb55/htmlparser2?sponsor=1", { @@ -16833,14 +17261,12 @@ "node_modules/http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "node_modules/http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "dependencies": { "depd": "2.0.0", "inherits": "2.0.4", @@ -16855,14 +17281,12 @@ "node_modules/http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "node_modules/http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "dependencies": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -16876,7 +17300,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, "dependencies": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -16896,6 +17319,20 @@ } } }, + "node_modules/http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "dependencies": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + }, + "engines": { + "node": ">=0.10" + } + }, "node_modules/https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -16906,7 +17343,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, "engines": { "node": ">=10.17.0" } @@ -16915,7 +17351,6 @@ "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3" }, @@ -16927,7 +17362,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -16973,14 +17407,12 @@ "node_modules/immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -16996,7 +17428,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -17005,7 +17436,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, "dependencies": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -17048,7 +17478,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -17057,8 +17486,16 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", + "dev": true, + "engines": { + "node": ">=10" + } }, "node_modules/inline-style-parser": { "version": "0.1.1", @@ -17180,7 +17617,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, "engines": { "node": ">= 0.10" } @@ -17195,7 +17631,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true, "engines": { "node": ">= 10" } @@ -17264,8 +17699,7 @@ "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "node_modules/is-bigint": { "version": "1.0.4", @@ -17283,7 +17717,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -17358,7 +17791,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "dependencies": { "has": "^1.0.3" }, @@ -17421,7 +17853,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true, "bin": { "is-docker": "cli.js" }, @@ -17458,7 +17889,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17495,7 +17925,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -17513,6 +17942,22 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -17553,7 +17998,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -17582,11 +18026,19 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true, "engines": { "node": ">=10" }, @@ -17598,7 +18050,6 @@ "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "dependencies": { "isobject": "^3.0.1" }, @@ -17647,7 +18098,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, "engines": { "node": ">=8" }, @@ -17761,7 +18211,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "dependencies": { "is-docker": "^2.0.0" }, @@ -17772,20 +18221,17 @@ "node_modules/isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -17800,6 +18246,12 @@ "unfetch": "^4.2.0" } }, + "node_modules/isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "node_modules/istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -18193,7 +18645,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "dependencies": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -18207,7 +18658,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -18216,7 +18666,6 @@ "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -18262,6 +18711,12 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "node_modules/jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -18282,14 +18737,18 @@ "node_modules/json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "node_modules/json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -18297,11 +18756,16 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "node_modules/json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -18321,6 +18785,21 @@ "graceful-fs": "^4.1.6" } }, + "node_modules/jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "node_modules/jsx-ast-utils": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz", @@ -18347,7 +18826,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -18365,11 +18843,19 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", - "dev": true, "engines": { "node": ">= 8" } }, + "node_modules/lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", + "dev": true, + "engines": { + "node": "> 0.8" + } + }, "node_modules/lazy-universal-dotenv": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/lazy-universal-dotenv/-/lazy-universal-dotenv-3.0.1.tgz", @@ -18404,8 +18890,49 @@ "node_modules/lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "dependencies": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "enquirer": ">= 2.3.0 < 3" + }, + "peerDependenciesMeta": { + "enquirer": { + "optional": true + } + } + }, + "node_modules/listr2/node_modules/p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } }, "node_modules/load-json-file": { "version": "1.1.0", @@ -18451,7 +18978,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, "engines": { "node": ">=6.11.5" } @@ -18460,7 +18986,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, "dependencies": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -18474,7 +18999,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "dependencies": { "p-locate": "^4.1.0" }, @@ -18490,8 +19014,7 @@ "node_modules/lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "node_modules/lodash.merge": { "version": "4.6.2", @@ -18499,6 +19022,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "node_modules/lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "node_modules/lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -18591,6 +19120,88 @@ "node": ">=8" } }, + "node_modules/log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "dependencies": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/log-update/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/log-update/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/log-update/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/log-update/node_modules/slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/log-update/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -18602,6 +19213,11 @@ "loose-envify": "cli.js" } }, + "node_modules/lottie-web": { + "version": "5.9.6", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.9.6.tgz", + "integrity": "sha512-JFs7KsHwflugH5qIXBpB4905yC1Sub2MZWtl/elvO/QC6qj1ApqbUZJyjzJseJUtVpgiDaXQLjBlIJGS7UUUXA==" + }, "node_modules/loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -18620,7 +19236,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, "dependencies": { "tslib": "^2.0.3" } @@ -18643,7 +19258,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -18664,7 +19278,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "dependencies": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -18677,7 +19290,6 @@ "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, "bin": { "semver": "bin/semver" } @@ -18820,8 +19432,7 @@ "node_modules/mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "node_modules/mdurl": { "version": "1.0.1", @@ -18833,7 +19444,6 @@ "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -18867,7 +19477,6 @@ "version": "3.4.7", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", - "dev": true, "dependencies": { "fs-monkey": "^1.0.3" }, @@ -19024,14 +19633,12 @@ "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "node_modules/merge2": { "version": "1.4.1", @@ -19046,7 +19653,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -19061,7 +19667,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -19093,7 +19698,6 @@ "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true, "bin": { "mime": "cli.js" }, @@ -19124,7 +19728,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, "engines": { "node": ">=6" } @@ -19150,8 +19753,7 @@ "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "node_modules/minimalistic-crypto-utils": { "version": "1.0.1", @@ -19163,7 +19765,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -19508,7 +20109,6 @@ "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, "dependencies": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -19534,7 +20134,6 @@ "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true, "bin": { "nanoid": "bin/nanoid.cjs" }, @@ -19574,7 +20173,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -19582,8 +20180,7 @@ "node_modules/neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "node_modules/nested-error-stacks": { "version": "2.1.1", @@ -19601,7 +20198,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, "dependencies": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -19643,7 +20239,6 @@ "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true, "engines": { "node": ">= 6.13.0" } @@ -19724,8 +20319,7 @@ "node_modules/node-releases": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" }, "node_modules/normalize-package-data": { "version": "2.5.0", @@ -19752,7 +20346,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -19770,7 +20363,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "dependencies": { "path-key": "^3.0.0" }, @@ -19794,7 +20386,6 @@ "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==", - "dev": true, "dependencies": { "boolbase": "^1.0.0" }, @@ -19912,7 +20503,6 @@ "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true, "funding": { "url": "https://github.com/sponsors/ljharb" } @@ -19921,7 +20511,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true, "engines": { "node": ">= 0.4" } @@ -19942,7 +20531,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -20056,14 +20644,12 @@ "node_modules/obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "node_modules/on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, "dependencies": { "ee-first": "1.1.1" }, @@ -20075,7 +20661,6 @@ "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==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -20084,7 +20669,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -20093,7 +20677,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "dependencies": { "mimic-fn": "^2.1.0" }, @@ -20108,7 +20691,6 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, "dependencies": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -20256,6 +20838,12 @@ "node": ">=0.10.0" } }, + "node_modules/ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, "node_modules/outvariant": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", @@ -20341,7 +20929,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "dependencies": { "p-try": "^2.0.0" }, @@ -20356,7 +20943,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "dependencies": { "p-limit": "^2.2.0" }, @@ -20380,7 +20966,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, "dependencies": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -20405,7 +20990,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, "engines": { "node": ">=6" } @@ -20455,7 +21039,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, "dependencies": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -20465,7 +21048,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -20508,7 +21090,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -20532,7 +21113,6 @@ "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -20541,7 +21121,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, "dependencies": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -20572,7 +21151,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -20581,7 +21159,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -20590,7 +21167,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -20598,20 +21174,17 @@ "node_modules/path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "node_modules/path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -20632,11 +21205,22 @@ "node": ">=0.12" } }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "node_modules/performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "node_modules/picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "node_modules/picomatch": { "version": "2.3.1", @@ -20653,7 +21237,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, "engines": { "node": ">=6" } @@ -20694,7 +21277,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "dependencies": { "find-up": "^4.0.0" }, @@ -20739,7 +21321,6 @@ "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "funding": [ { "type": "opencollective", @@ -20834,7 +21415,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, "engines": { "node": "^10 || ^12 || >= 14" }, @@ -20846,7 +21426,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, "dependencies": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -20863,7 +21442,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, "dependencies": { "postcss-selector-parser": "^6.0.4" }, @@ -20878,7 +21456,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, "dependencies": { "icss-utils": "^5.0.0" }, @@ -20893,7 +21470,6 @@ "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -20943,11 +21519,22 @@ "node": ">=6.0.0" } }, + "node_modules/pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, "dependencies": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -21015,8 +21602,7 @@ "node_modules/process-nextick-args": { "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==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "node_modules/promise-inflight": { "version": "1.0.1", @@ -21102,7 +21688,6 @@ "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==", - "dev": true, "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -21115,17 +21700,28 @@ "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==", - "dev": true, "engines": { "node": ">= 0.10" } }, + "node_modules/proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "node_modules/prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, + "node_modules/psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "node_modules/public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -21181,7 +21777,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, "engines": { "node": ">=6" } @@ -21190,7 +21785,6 @@ "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, "dependencies": { "side-channel": "^1.0.4" }, @@ -21254,7 +21848,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "dependencies": { "safe-buffer": "^5.1.0" } @@ -21273,7 +21866,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -21282,7 +21874,6 @@ "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, "dependencies": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -21297,7 +21888,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -21546,7 +22136,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -21560,7 +22149,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -21572,7 +22160,6 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, "dependencies": { "resolve": "^1.9.0" }, @@ -21650,14 +22237,12 @@ "node_modules/regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "node_modules/regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "dependencies": { "regenerate": "^1.4.2" }, @@ -21674,7 +22259,6 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, "dependencies": { "@babel/runtime": "^7.8.4" } @@ -21725,7 +22309,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, "dependencies": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -21741,14 +22324,12 @@ "node_modules/regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "node_modules/regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "dependencies": { "jsesc": "~0.5.0" }, @@ -21760,7 +22341,6 @@ "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" } @@ -21769,7 +22349,6 @@ "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true, "engines": { "node": ">= 0.10" } @@ -21968,7 +22547,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, "dependencies": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -22008,6 +22586,15 @@ "node": ">=0.10.0" } }, + "node_modules/request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "dependencies": { + "throttleit": "^1.0.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -22021,7 +22608,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -22029,14 +22615,12 @@ "node_modules/requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "node_modules/resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "dependencies": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -22053,7 +22637,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, "dependencies": { "resolve-from": "^5.0.0" }, @@ -22065,7 +22648,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, "engines": { "node": ">=8" } @@ -22103,7 +22685,6 @@ "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true, "engines": { "node": ">= 4" } @@ -22118,11 +22699,16 @@ "node": ">=0.10.0" } }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -22211,8 +22797,7 @@ "node_modules/safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "node_modules/safe-regex": { "version": "1.1.0", @@ -22226,8 +22811,7 @@ "node_modules/safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sane": { "version": "4.1.0", @@ -22533,7 +23117,6 @@ "version": "1.53.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", - "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -22550,7 +23133,6 @@ "version": "13.0.2", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, "dependencies": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -22596,7 +23178,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -22613,14 +23194,12 @@ "node_modules/select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "node_modules/selfsigned": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dev": true, "dependencies": { "node-forge": "^1" }, @@ -22632,7 +23211,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -22641,7 +23219,6 @@ "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -22665,7 +23242,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -22673,20 +23249,17 @@ "node_modules/send/node_modules/debug/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serialize-javascript": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "dependencies": { "randombytes": "^2.1.0" } @@ -22723,7 +23296,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, "dependencies": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -22741,7 +23313,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "dependencies": { "ms": "2.0.0" } @@ -22750,7 +23321,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -22759,7 +23329,6 @@ "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -22773,26 +23342,22 @@ "node_modules/serve-index/node_modules/inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "node_modules/serve-index/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "node_modules/serve-index/node_modules/setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "node_modules/serve-index/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true, "engines": { "node": ">= 0.6" } @@ -22801,7 +23366,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -22869,8 +23433,7 @@ "node_modules/setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "node_modules/sha.js": { "version": "2.4.11", @@ -22889,7 +23452,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, "dependencies": { "kind-of": "^6.0.2" }, @@ -22906,7 +23468,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -22918,7 +23479,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -22927,7 +23487,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "dependencies": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -22940,8 +23499,7 @@ "node_modules/signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "node_modules/sisteransi": { "version": "1.0.5", @@ -22953,11 +23511,57 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true, "engines": { "node": ">=6" } }, + "node_modules/slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/slice-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/slice-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/snapdragon": { "version": "0.8.2", "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz", @@ -23171,7 +23775,6 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, "dependencies": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -23188,7 +23791,6 @@ "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23197,7 +23799,6 @@ "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -23220,7 +23821,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "dependencies": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -23279,7 +23879,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, "dependencies": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -23295,7 +23894,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, "dependencies": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -23323,6 +23921,31 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "node_modules/sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "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" + }, + "bin": { + "sshpk-conv": "bin/sshpk-conv", + "sshpk-sign": "bin/sshpk-sign", + "sshpk-verify": "bin/sshpk-verify" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -23339,8 +23962,7 @@ "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility", - "dev": true + "deprecated": "Modern JS already guarantees Array#sort() is a stable sort, so this library is deprecated. See the compatibility table on MDN: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort#browser_compatibility" }, "node_modules/stackframe": { "version": "1.3.4", @@ -23464,7 +24086,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -23575,7 +24196,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "dependencies": { "safe-buffer": "~5.2.0" } @@ -23584,7 +24204,6 @@ "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, "funding": [ { "type": "github", @@ -23699,7 +24318,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -23733,7 +24351,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, "engines": { "node": ">=6" } @@ -23766,7 +24383,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, "engines": { "node": ">= 12.13.0" }, @@ -23832,7 +24448,6 @@ "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==", - "dev": true, "engines": { "node": ">= 0.4" }, @@ -23843,14 +24458,12 @@ "node_modules/svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "node_modules/svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, "dependencies": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -23871,7 +24484,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, "engines": { "node": ">= 10" } @@ -23904,7 +24516,6 @@ "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -23955,7 +24566,6 @@ "version": "5.14.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", - "dev": true, "dependencies": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -23973,7 +24583,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.7", "jest-worker": "^27.4.5", @@ -24006,8 +24615,7 @@ "node_modules/terser/node_modules/commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" }, "node_modules/test-exclude": { "version": "6.0.0", @@ -24029,6 +24637,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "node_modules/throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -24072,8 +24686,7 @@ "node_modules/thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "node_modules/timers-browserify": { "version": "2.0.12", @@ -24168,7 +24781,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -24180,11 +24792,23 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true, "engines": { "node": ">=0.6" } }, + "node_modules/tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "dependencies": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -24253,8 +24877,7 @@ "node_modules/tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "node_modules/tsutils": { "version": "3.21.0", @@ -24283,6 +24906,24 @@ "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", "dev": true }, + "node_modules/tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "dependencies": { + "safe-buffer": "^5.0.1" + }, + "engines": { + "node": "*" + } + }, + "node_modules/tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "node_modules/type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -24311,7 +24952,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "dependencies": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -24339,7 +24979,6 @@ "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -24400,7 +25039,6 @@ "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==", - "dev": true, "engines": { "node": ">=4" } @@ -24409,7 +25047,6 @@ "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==", - "dev": true, "dependencies": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -24422,7 +25059,6 @@ "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==", - "dev": true, "engines": { "node": ">=4" } @@ -24431,7 +25067,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true, "engines": { "node": ">=4" } @@ -24626,7 +25261,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true, "engines": { "node": ">= 0.8" } @@ -24707,7 +25341,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "dev": true, "funding": [ { "type": "opencollective", @@ -24733,7 +25366,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "dependencies": { "punycode": "^2.1.0" } @@ -24819,8 +25451,7 @@ "node_modules/util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/util.promisify": { "version": "1.0.0", @@ -24841,14 +25472,12 @@ "node_modules/utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "node_modules/utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true, "engines": { "node": ">= 0.4.0" } @@ -24857,7 +25486,6 @@ "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true, "bin": { "uuid": "dist/bin/uuid" } @@ -24902,11 +25530,30 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true, "engines": { "node": ">= 0.8" } }, + "node_modules/verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "engines": [ + "node >=0.6.0" + ], + "dependencies": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "node_modules/verror/node_modules/core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + }, "node_modules/vfile": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/vfile/-/vfile-4.2.1.tgz", @@ -24966,7 +25613,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "dependencies": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -25290,7 +25936,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, "dependencies": { "minimalistic-assert": "^1.0.0" } @@ -25324,7 +25969,6 @@ "version": "5.73.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", - "dev": true, "dependencies": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -25371,7 +26015,6 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, "dependencies": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -25418,7 +26061,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, "engines": { "node": ">= 10" } @@ -25427,7 +26069,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, "dependencies": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -25450,7 +26091,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -25466,7 +26106,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -25477,14 +26116,12 @@ "node_modules/webpack-dev-middleware/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack-dev-middleware/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -25503,7 +26140,6 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", - "dev": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -25554,7 +26190,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -25570,7 +26205,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, "dependencies": { "fast-deep-equal": "^3.1.3" }, @@ -25581,14 +26215,12 @@ "node_modules/webpack-dev-server/node_modules/json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "node_modules/webpack-dev-server/node_modules/schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -25654,7 +26286,6 @@ "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, "dependencies": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -25667,7 +26298,6 @@ "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, "engines": { "node": ">=10.13.0" } @@ -25682,7 +26312,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, "dependencies": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -25696,7 +26325,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -25715,7 +26343,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -25766,8 +26393,7 @@ "node_modules/wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "node_modules/word-wrap": { "version": "1.2.3", @@ -25855,8 +26481,7 @@ "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "3.0.3", @@ -25874,7 +26499,6 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", - "dev": true, "engines": { "node": ">=10.0.0" }, @@ -25924,14 +26548,12 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true, "engines": { "node": ">= 6" } @@ -25963,6 +26585,16 @@ "node": ">=10" } }, + "node_modules/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", @@ -25991,7 +26623,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.2.0.tgz", "integrity": "sha512-qRmjj8nj9qmLTQXXmaR1cck3UXSRMPrbsLJAasZpF+t3riI71BXed5ebIOYwQntykeZuhjsdweEc9BxH5Jc26w==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.1.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -26001,7 +26632,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.18.6.tgz", "integrity": "sha512-jXNHoYCbxZ8rKy+2lyy0VjcaGxS4NPbN0qc95DjIiGZQL/mTNx3o2/yI0TG+X0VrrTuwmO7zH52T9NcNdbF9Uw==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.8", "@nicolo-ribaudo/chokidar-2": "2.1.8-no-fsevents.3", @@ -26025,14 +26655,12 @@ "@babel/compat-data": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.18.6.tgz", - "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==", - "dev": true + "integrity": "sha512-tzulrgDT0QD6U7BJ4TKVk2SDDg7wlP39P9yAx1RfLy7vP/7rsDRlWVfbWxElslu56+r7QOhB2NSDsabYYruoZQ==" }, "@babel/core": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.18.6.tgz", "integrity": "sha512-cQbWBpxcbbs/IUredIPkHiAGULLV8iwgNRMFzvbhEXISp4f3rUUXE5+TIw6KwUWUR3DwyI6gmBRnmAtYaWehwQ==", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", @@ -26085,7 +26713,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.18.6.tgz", "integrity": "sha512-KT10c1oWEpmrIRYnthbzHgoOf6B+Xd6a5yhdbNtdhtG7aO1or5HViuf1TQR36xY/QprXA5nvxO6nAjhJ4y38jw==", - "dev": true, "requires": { "@babel/helper-explode-assignable-expression": "^7.18.6", "@babel/types": "^7.18.6" @@ -26095,7 +26722,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.18.6.tgz", "integrity": "sha512-vFjbfhNCzqdeAtZflUFrG5YIFqGTqsctrtkZ1D/NB0mDW9TwW3GmmUepYY4G9wCET5rY5ugz4OGTcLd614IzQg==", - "dev": true, "requires": { "@babel/compat-data": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -26107,7 +26733,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.18.6.tgz", "integrity": "sha512-YfDzdnoxHGV8CzqHGyCbFvXg5QESPFkXlHtvdCkesLjjVMT2Adxe4FGUR5ChIb3DxSaXO12iIOCWoXdsUVwnqw==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.6", @@ -26122,7 +26747,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.18.6.tgz", "integrity": "sha512-7LcpH1wnQLGrI+4v+nPp+zUvIkF9x0ddv1Hkdue10tg3gmRnLy97DXh4STiOf1qeIInyD69Qv5kKSZzKD8B/7A==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "regexpu-core": "^5.1.0" @@ -26132,7 +26756,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.3.1.tgz", "integrity": "sha512-J9hGMpJQmtWmj46B3kBHmL38UhJGhYX7eqkcq+2gsstyYt341HmPeWspihX43yVRA0mS+8GGk2Gckc7bY/HCmA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.13.0", "@babel/helper-module-imports": "^7.12.13", @@ -26153,7 +26776,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==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -26179,7 +26801,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.18.6.tgz", "integrity": "sha512-CeHxqwwipekotzPDUuJOfIMtcIHBuc7WAzLmTYWctVigqS5RktNMQ5bEwQSuGewzYnCtTWa3BARXeiLxDTv+Ng==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -26196,7 +26817,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.18.6.tgz", "integrity": "sha512-L//phhB4al5uucwzlimruukHB3jRd5JGClwRMD/ROrVjXfLqovYnvQrK/JK36WYyVwGGO7OD3kMyVTjx+WVPhw==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", @@ -26212,7 +26832,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==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -26220,14 +26839,12 @@ "@babel/helper-plugin-utils": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.18.6.tgz", - "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==", - "dev": true + "integrity": "sha512-gvZnm1YAAxh13eJdkb9EWHBnF3eAub3XTLCZEehHT2kWxiKVRL64+ae5Y6Ivne0mVHmMYKT+xWgZO+gQhuLUBg==" }, "@babel/helper-remap-async-to-generator": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.18.6.tgz", "integrity": "sha512-z5wbmV55TveUPZlCLZvxWHtrjuJd+8inFhk7DG0WW87/oJuGDcjDiu7HIvGcpf5464L6xKCg3vNkmlVVz9hwyQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.6", @@ -26239,7 +26856,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.18.6.tgz", "integrity": "sha512-fTf7zoXnUGl9gF25fXCWE26t7Tvtyn6H4hkLSYhATwJvw2uYxd3aoXplMSe0g9XbwK7bmxNes7+FGO0rB/xC0g==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-member-expression-to-functions": "^7.18.6", @@ -26252,7 +26868,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==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -26261,7 +26876,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.18.6.tgz", "integrity": "sha512-4KoLhwGS9vGethZpAhYnMejWkX64wsnHPDwvOsKWU6Fg4+AlK2Jz3TyjQLMEPvz+1zemi/WBdkYxCD0bAfIkiw==", - "dev": true, "requires": { "@babel/types": "^7.18.6" } @@ -26282,14 +26896,12 @@ "@babel/helper-validator-option": { "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==", - "dev": true + "integrity": "sha512-XO7gESt5ouv/LRJdrVjkShckw6STTaB7l9BrpBaAHDeF5YZT+01PCwmR0SJHnkW6i8OwW/EVWRShfi4j2x+KQw==" }, "@babel/helper-wrap-function": { "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.18.6.tgz", "integrity": "sha512-I5/LZfozwMNbwr/b1vhhuYD+J/mU+gfGAj5td7l5Rv9WYmH6i3Om69WGKNmlIpsVW/mF6O5bvTKbvDQZVgjqOw==", - "dev": true, "requires": { "@babel/helper-function-name": "^7.18.6", "@babel/template": "^7.18.6", @@ -26301,7 +26913,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.18.6.tgz", "integrity": "sha512-vzSiiqbQOghPngUYt/zWGvK3LAsPhz55vc9XNN0xAl2gV4ieShI2OQli5duxWHD+72PZPTKAcfcZDE1Cwc5zsQ==", - "dev": true, "requires": { "@babel/template": "^7.18.6", "@babel/traverse": "^7.18.6", @@ -26327,7 +26938,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26336,7 +26946,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.18.6.tgz", "integrity": "sha512-Udgu8ZRgrBrttVz6A0EVL0SJ1z+RLbIeqsu632SA1hf0awEppD6TvdznoH+orIF8wtFFAV/Enmw9Y+9oV8TQcw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", @@ -26347,7 +26956,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.18.6.tgz", "integrity": "sha512-WAz4R9bvozx4qwf74M+sfqPMKfSqwM0phxPTR6iJIi8robgzXwkEgmeJG1gEKhm6sDqT/U9aV3lfcqybIpev8w==", - "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -26359,7 +26967,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==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26369,7 +26976,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==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -26393,7 +26999,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-dynamic-import": "^7.8.3" @@ -26413,7 +27018,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-export-namespace-from/-/plugin-proposal-export-namespace-from-7.18.6.tgz", "integrity": "sha512-zr/QcUlUo7GPo6+X1wC98NJADqmy5QTFWWhqeQWiki4XHafJtLl/YMGkmRB2szDD2IYJCCdBTd4ElwhId9T7Xw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-export-namespace-from": "^7.8.3" @@ -26423,7 +27027,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-json-strings": "^7.8.3" @@ -26433,7 +27036,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-logical-assignment-operators/-/plugin-proposal-logical-assignment-operators-7.18.6.tgz", "integrity": "sha512-zMo66azZth/0tVd7gmkxOkOjs2rpHyhpcFo565PUP37hSp6hSd9uUKIfTDFMz58BwqgQKhJ9YxtM5XddjXVn+Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" @@ -26443,7 +27045,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" @@ -26453,7 +27054,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-numeric-separator": "^7.10.4" @@ -26463,7 +27063,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.18.6.tgz", "integrity": "sha512-9yuM6wr4rIsKa1wlUAbZEazkCrgw2sMPEXCr4Rnwetu7cEW1NydkCWytLuYletbf8vFxdJxFhwEZqMpOx2eZyw==", - "dev": true, "requires": { "@babel/compat-data": "^7.18.6", "@babel/helper-compilation-targets": "^7.18.6", @@ -26476,7 +27075,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" @@ -26486,7 +27084,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.18.6.tgz", "integrity": "sha512-PatI6elL5eMzoypFAiYDpYQyMtXTn+iMhuxxQt5mAXD4fEmKorpSI3PHd+i3JXBJN3xyA6MvJv7at23HffFHwA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6", @@ -26497,7 +27094,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==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26507,7 +27103,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==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-create-class-features-plugin": "^7.18.6", @@ -26519,7 +27114,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.18.6.tgz", "integrity": "sha512-2BShG/d5yoZyXZfVePH91urL5wTG6ASZU9M4o03lKK8u8UW1y08OMttBSOADTcJrnPMpvDXRG3G8fyLh4ovs8w==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26529,7 +27123,6 @@ "version": "7.8.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26538,7 +27131,6 @@ "version": "7.12.13", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.12.13" } @@ -26547,7 +27139,6 @@ "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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -26565,7 +27156,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz", "integrity": "sha512-5gdGbFon+PszYzqs83S3E5mpi7/y/8M9eC90MRTZfduQOYW76ig6SOSPNe41IG5LoP3FGBn2N0RjVDSQiS94kQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26583,7 +27173,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-export-namespace-from/-/plugin-syntax-export-namespace-from-7.8.3.tgz", "integrity": "sha512-MXf5laXo6c1IbEbegDmzGPwGNTsHZmEy6QGznu5Sh2UCWvueywb2ee+CCE4zQiZstxU9BMoQO9i6zUFSY0Kj0Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.3" } @@ -26601,7 +27190,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26610,7 +27198,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26619,7 +27206,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.18.6.tgz", "integrity": "sha512-6mmljtAedFGTWu2p/8WIORGwy+61PLgOMPOdazc7YoJ9ZCWUyFy3A6CpPkRKLKD1ToAesxX8KGEViAiLo9N+7Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26628,7 +27214,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -26637,7 +27222,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26646,7 +27230,6 @@ "version": "7.10.4", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.10.4" } @@ -26655,7 +27238,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26664,7 +27246,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26673,7 +27254,6 @@ "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.8.0" } @@ -26682,7 +27262,6 @@ "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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -26691,7 +27270,6 @@ "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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.14.5" } @@ -26700,7 +27278,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.18.6.tgz", "integrity": "sha512-mAWAuq4rvOepWCBid55JuRNvpTNf2UGVgoz4JV0fXEKolsVZDzsa4NqCef758WZJj/GDu0gVGItjKFiClTAmZA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26709,7 +27286,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26718,7 +27294,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==", - "dev": true, "requires": { "@babel/helper-module-imports": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -26729,7 +27304,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26738,7 +27312,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.18.6.tgz", "integrity": "sha512-pRqwb91C42vs1ahSAWJkxOxU1RHWDn16XAa6ggQ72wjLlWyYeAcLvTtE0aM8ph3KNydy9CQF2nLYcjq1WysgxQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26747,7 +27320,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.18.6.tgz", "integrity": "sha512-XTg8XW/mKpzAF3actL554Jl/dOYoJtv3l8fxaEczpgz84IeeVf+T1u2CSvPHuZbt0w3JkIx4rdn/MRQI7mo0HQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-environment-visitor": "^7.18.6", @@ -26763,7 +27335,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.18.6.tgz", "integrity": "sha512-9repI4BhNrR0KenoR9vm3/cIc1tSBIo+u1WVjKCAynahj25O8zfbiE6JtAtHPGQSs4yZ+bA8mRasRP+qc+2R5A==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26772,7 +27343,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.18.6.tgz", "integrity": "sha512-tgy3u6lRp17ilY8r1kP4i2+HDUwxlVqq3RTc943eAWSzGgpU1qhiKpqZ5CMyHReIYPHdo3Kg8v8edKtDqSVEyQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26781,7 +27351,6 @@ "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==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26791,7 +27360,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.18.6.tgz", "integrity": "sha512-NJU26U/208+sxYszf82nmGYqVF9QN8py2HFTblPT9hbawi8+1C5a9JubODLTGFuT0qlkqVinmkwOD13s0sZktg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26800,7 +27368,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==", - "dev": true, "requires": { "@babel/helper-builder-binary-assignment-operator-visitor": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26820,7 +27387,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.18.6.tgz", "integrity": "sha512-WAjoMf4wIiSsy88KmG7tgj2nFdEK7E46tArVtcgED7Bkj6Fg/tG5SbvNIOKxbFS2VFgNh6+iaPswBeQZm4ox8w==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26829,7 +27395,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.18.6.tgz", "integrity": "sha512-kJha/Gbs5RjzIu0CxZwf5e3aTTSlhZnHMT8zPWnJMjNpLOUgqevg+PN5oMH68nMCXnfiMo4Bhgxqj59KHTlAnA==", - "dev": true, "requires": { "@babel/helper-compilation-targets": "^7.18.6", "@babel/helper-function-name": "^7.18.6", @@ -26840,7 +27405,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.18.6.tgz", "integrity": "sha512-x3HEw0cJZVDoENXOp20HlypIHfl0zMIhMVZEBVTfmqbObIpsMxMbmU5nOEO8R7LYT+z5RORKPlTI5Hj4OsO9/Q==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26849,7 +27413,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26858,7 +27421,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==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -26869,7 +27431,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==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -26881,7 +27442,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.18.6.tgz", "integrity": "sha512-UbPYpXxLjTw6w6yXX2BYNxF3p6QY225wcTkfQCy3OMnSlS/C3xGtwUjEzGkldb/sy6PWLiCQ3NbYfjWUTI3t4g==", - "dev": true, "requires": { "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-module-transforms": "^7.18.6", @@ -26894,7 +27454,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==", - "dev": true, "requires": { "@babel/helper-module-transforms": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26904,7 +27463,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.18.6.tgz", "integrity": "sha512-UmEOGF8XgaIqD74bC8g7iV3RYj8lMf0Bw7NJzvnS9qQhM4mg+1WHKotUIdjxgD2RGrgFLZZPCFPFj3P/kVDYhg==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -26914,7 +27472,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26923,7 +27480,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-replace-supers": "^7.18.6" @@ -26933,7 +27489,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.18.6.tgz", "integrity": "sha512-FjdqgMv37yVl/gwvzkcB+wfjRI8HQmc5EgOG9iGNvUY1ok+TjsoaMP7IqCDZBhkFcM5f3OPVMs6Dmp03C5k4/A==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26942,7 +27497,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26951,7 +27505,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-constant-elements/-/plugin-transform-react-constant-elements-7.18.6.tgz", "integrity": "sha512-4g5H1bonF1dqgMe+wQ2fvDlRZ/mN/KwArk13teDv+xxn+pUDEiiDluQd6D2B30MJcL1u3qr0WZpfq0mw9/zSqA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26960,7 +27513,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.18.6.tgz", "integrity": "sha512-TV4sQ+T013n61uMoygyMRm+xf04Bd5oqFpv2jAEQwSZ8NwQA7zeRPg1LMVg2PWi3zWBz+CLKD+v5bcpZ/BS0aA==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -26969,7 +27521,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.18.6.tgz", "integrity": "sha512-Mz7xMPxoy9kPS/JScj6fJs03TZ/fZ1dJPlMjRAgTaxaS0fUBk8FV/A2rRgfPsVCZqALNwMexD+0Uaf5zlcKPpw==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-module-imports": "^7.18.6", @@ -26982,7 +27533,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.18.6.tgz", "integrity": "sha512-SA6HEjwYFKF7WDjWcMcMGUimmw/nhNRDWxr+KaLSCrkD/LMDBvWRmHAYgE1HDeF8KUuI8OAu+RT6EOtKxSW2qA==", - "dev": true, "requires": { "@babel/plugin-transform-react-jsx": "^7.18.6" } @@ -26991,7 +27541,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.18.6.tgz", "integrity": "sha512-I8VfEPg9r2TRDdvnHgPepTKvuRomzA8+u+nhY7qSI1fR2hRNebasZEETLyM5mAUr0Ku56OkXJ0I7NHJnO6cJiQ==", - "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -27001,7 +27550,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "regenerator-transform": "^0.15.0" @@ -27011,7 +27559,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -27020,7 +27567,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -27029,7 +27575,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.18.6.tgz", "integrity": "sha512-ayT53rT/ENF8WWexIRg9AiV9h0aIteyWn5ptfZTZQrjk/+f3WdrJGCY4c9wcgl2+MKkKPhzbYp97FTsquZpDCw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-skip-transparent-expression-wrappers": "^7.18.6" @@ -27039,7 +27584,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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -27048,7 +27592,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.18.6.tgz", "integrity": "sha512-UuqlRrQmT2SWRvahW46cGSany0uTlcj8NYOS5sRGYi8FxPYPoLd5DDmMd32ZXEj2Jq+06uGVQKHxa/hJx2EzKw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -27057,7 +27600,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.18.6.tgz", "integrity": "sha512-7m71iS/QhsPk85xSjFPovHPcH3H9qeyzsujhTc+vcdnsXavoWYJ74zx0lP5RhpC5+iDnVLO+PPMHzC11qels1g==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -27066,7 +27608,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.18.6.tgz", "integrity": "sha512-ijHNhzIrLj5lQCnI6aaNVRtGVuUZhOXFLRVFs7lLrkXTHip4FKty5oAuQdk4tywG0/WjXmjTfQCWmuzrvFer1w==", - "dev": true, "requires": { "@babel/helper-create-class-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6", @@ -27077,7 +27618,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.18.6.tgz", "integrity": "sha512-XNRwQUXYMP7VLuy54cr/KS/WeL3AZeORhrmeZ7iewgu+X2eBqmpaLI/hzqr9ZxCeUoq0ASK4GUzSM0BDhZkLFw==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6" } @@ -27086,7 +27626,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==", - "dev": true, "requires": { "@babel/helper-create-regexp-features-plugin": "^7.18.6", "@babel/helper-plugin-utils": "^7.18.6" @@ -27096,7 +27635,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.18.6.tgz", "integrity": "sha512-WrthhuIIYKrEFAwttYzgRNQ5hULGmwTj+D6l7Zdfsv5M7IWV/OZbUfbeL++Qrzx1nVJwWROIFhCHRYQV4xbPNw==", - "dev": true, "requires": { "@babel/compat-data": "^7.18.6", "@babel/helper-compilation-targets": "^7.18.6", @@ -27190,7 +27728,6 @@ "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==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.0.0", "@babel/plugin-proposal-unicode-property-regex": "^7.4.4", @@ -27203,7 +27740,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.18.6.tgz", "integrity": "sha512-zXr6atUmyYdiWRVLOZahakYmOBHtWc2WGCkP8PYTgZi0iJXDY2CN180TdrIW4OGOAdLc7TifzDIvtx6izaRIzg==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -27217,7 +27753,6 @@ "version": "7.18.6", "resolved": "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.18.6.tgz", "integrity": "sha512-s9ik86kXBAnD760aybBucdpnLsAt0jK1xqJn2juOn9lkOvSHV60os5hxoVJsPzMQxvnUJFAlkont2DvvaYEBtQ==", - "dev": true, "requires": { "@babel/helper-plugin-utils": "^7.18.6", "@babel/helper-validator-option": "^7.18.6", @@ -27366,6 +27901,72 @@ "dev": true, "optional": true }, + "@cypress/request": { + "version": "2.88.10", + "resolved": "https://registry.npmjs.org/@cypress/request/-/request-2.88.10.tgz", + "integrity": "sha512-Zp7F+R93N0yZyG34GutyTNr+okam7s/Fzc1+i3kcqOP8vk6OuajuE9qZJ6Rs+10/1JFtXFYMdyarnU1rZuJesg==", + "dev": true, + "requires": { + "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", + "http-signature": "~1.3.6", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.19", + "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": "^8.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "dev": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + }, + "qs": { + "version": "6.5.3", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.3.tgz", + "integrity": "sha512-qxXIEh4pCGfHICj1mAJQ2/2XVZkjCDTcEgfoSQxc/fYivUZxTkk7L3bDBJSoNrEzXI17oUO5Dp07ktqE5KzczA==", + "dev": true + } + } + }, + "@cypress/xvfb": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/@cypress/xvfb/-/xvfb-1.2.4.tgz", + "integrity": "sha512-skbBzPggOVYCbnGgV+0dmBdW/s77ZkAOXIC1knS8NagwDjBrNC1LuXtQJeiN6l+m7lzmHtaoUw/ctJKdqkG57Q==", + "dev": true, + "requires": { + "debug": "^3.1.0", + "lodash.once": "^4.1.1" + }, + "dependencies": { + "debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + } + } + }, "@design-systems/utils": { "version": "2.12.0", "resolved": "https://registry.npmjs.org/@design-systems/utils/-/utils-2.12.0.tgz", @@ -27469,8 +28070,7 @@ "@discoveryjs/json-ext": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true + "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==" }, "@emotion/is-prop-valid": { "version": "1.1.3", @@ -27734,7 +28334,6 @@ "version": "0.1.1", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.1.1.tgz", "integrity": "sha512-sQXCasFk+U8lWYEe66WxRDOE9PjVz4vSM51fTu3Hw+ClTpUSQb718772vH3pyS5pShp6lvQM7SxgIDXXXmOX7w==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.0", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -27754,7 +28353,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, "requires": { "@jridgewell/gen-mapping": "^0.3.0", "@jridgewell/trace-mapping": "^0.3.9" @@ -27764,7 +28362,6 @@ "version": "0.3.2", "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, "requires": { "@jridgewell/set-array": "^1.0.1", "@jridgewell/sourcemap-codec": "^1.4.10", @@ -27790,8 +28387,15 @@ "@leichtgewicht/ip-codec": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/@leichtgewicht/ip-codec/-/ip-codec-2.0.4.tgz", - "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==", - "dev": true + "integrity": "sha512-Hcv+nVC0kZnQ3tD9GVu5xSMR4VVYOteQIr/hwFPVEvPdlXqgGEuRjiheChHgdM+JyqdgNcmzZOX/tnl0JOiI7A==" + }, + "@lottiefiles/react-lottie-player": { + "version": "3.4.7", + "resolved": "https://registry.npmjs.org/@lottiefiles/react-lottie-player/-/react-lottie-player-3.4.7.tgz", + "integrity": "sha512-KqkwRiCQPDNzimsXnNSgeJjJlZQ6Fr9JE3OtZdOaGrXovZJ+zDeZNxIwxID8Up0eAdm4zJjudOSc5EJSiGw9RA==", + "requires": { + "lottie-web": "^5.7.8" + } }, "@mdx-js/mdx": { "version": "1.6.22", @@ -27926,7 +28530,6 @@ "version": "2.1.8-no-fsevents.3", "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/chokidar-2/-/chokidar-2-2.1.8-no-fsevents.3.tgz", "integrity": "sha512-s88O1aVtXftvp5bCPB7WnmXc5IwOZZ7YPuwNPt+GtOOXpPvad1LfbmjYv+qII7zP6RU2QGnqve27dnLycEnyEQ==", - "dev": true, "optional": true }, "@nodelib/fs.scandir": { @@ -32870,63 +33473,54 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-add-jsx-attribute/-/babel-plugin-add-jsx-attribute-6.0.0.tgz", "integrity": "sha512-MdPdhdWLtQsjd29Wa4pABdhWbaRMACdM1h31BY+c6FghTZqNGT7pEYdBoaGeKtdTOBC/XNFQaKVj+r/Ei2ryWA==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-remove-jsx-attribute": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-attribute/-/babel-plugin-remove-jsx-attribute-6.0.0.tgz", "integrity": "sha512-aVdtfx9jlaaxc3unA6l+M9YRnKIZjOhQPthLKqmTXC8UVkBLDRGwPKo+r8n3VZN8B34+yVajzPTZ+ptTSuZZCw==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-remove-jsx-empty-expression": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-remove-jsx-empty-expression/-/babel-plugin-remove-jsx-empty-expression-6.0.0.tgz", "integrity": "sha512-Ccj42ApsePD451AZJJf1QzTD1B/BOU392URJTeXFxSK709i0KUsGtbwyiqsKu7vsYxpTM0IA5clAKDyf9RCZyA==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-replace-jsx-attribute-value": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-replace-jsx-attribute-value/-/babel-plugin-replace-jsx-attribute-value-6.0.0.tgz", "integrity": "sha512-88V26WGyt1Sfd1emBYmBJRWMmgarrExpKNVmI9vVozha4kqs6FzQJ/Kp5+EYli1apgX44518/0+t9+NU36lThQ==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-svg-dynamic-title": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-dynamic-title/-/babel-plugin-svg-dynamic-title-6.0.0.tgz", "integrity": "sha512-F7YXNLfGze+xv0KMQxrl2vkNbI9kzT9oDK55/kUuymh1ACyXkMV+VZWX1zEhSTfEKh7VkHVZGmVtHg8eTZ6PRg==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-svg-em-dimensions": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-svg-em-dimensions/-/babel-plugin-svg-em-dimensions-6.0.0.tgz", "integrity": "sha512-+rghFXxdIqJNLQK08kwPBD3Z22/0b2tEZ9lKiL/yTfuyj1wW8HUXu4bo/XkogATIYuXSghVQOOCwURXzHGKyZA==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-transform-react-native-svg": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-react-native-svg/-/babel-plugin-transform-react-native-svg-6.0.0.tgz", "integrity": "sha512-VaphyHZ+xIKv5v0K0HCzyfAaLhPGJXSk2HkpYfXIOKb7DjLBv0soHDxNv6X0vr2titsxE7klb++u7iOf7TSrFQ==", - "dev": true, "requires": {} }, "@svgr/babel-plugin-transform-svg-component": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-plugin-transform-svg-component/-/babel-plugin-transform-svg-component-6.2.0.tgz", "integrity": "sha512-bhYIpsORb++wpsp91fymbFkf09Z/YEKR0DnFjxvN+8JHeCUD2unnh18jIMKnDJTWtvpTaGYPXELVe4OOzFI0xg==", - "dev": true, "requires": {} }, "@svgr/babel-preset": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/babel-preset/-/babel-preset-6.2.0.tgz", "integrity": "sha512-4WQNY0J71JIaL03DRn0vLiz87JXx0b9dYm2aA8XHlQJQoixMl4r/soYHm8dsaJZ3jWtkCiOYy48dp9izvXhDkQ==", - "dev": true, "requires": { "@svgr/babel-plugin-add-jsx-attribute": "^6.0.0", "@svgr/babel-plugin-remove-jsx-attribute": "^6.0.0", @@ -32942,7 +33536,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/core/-/core-6.2.1.tgz", "integrity": "sha512-NWufjGI2WUyrg46mKuySfviEJ6IxHUOm/8a3Ph38VCWSp+83HBraCQrpEM3F3dB6LBs5x8OElS8h3C0oOJaJAA==", - "dev": true, "requires": { "@svgr/plugin-jsx": "^6.2.1", "camelcase": "^6.2.0", @@ -32952,8 +33545,7 @@ "camelcase": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true + "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==" } } }, @@ -32961,7 +33553,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/hast-util-to-babel-ast/-/hast-util-to-babel-ast-6.2.1.tgz", "integrity": "sha512-pt7MMkQFDlWJVy9ULJ1h+hZBDGFfSCwlBNW1HkLnVi7jUhyEXUaGYWi1x6bM2IXuAR9l265khBT4Av4lPmaNLQ==", - "dev": true, "requires": { "@babel/types": "^7.15.6", "entities": "^3.0.1" @@ -32970,8 +33561,7 @@ "entities": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", - "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", - "dev": true + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" } } }, @@ -32979,7 +33569,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/plugin-jsx/-/plugin-jsx-6.2.1.tgz", "integrity": "sha512-u+MpjTsLaKo6r3pHeeSVsh9hmGRag2L7VzApWIaS8imNguqoUwDq/u6U/NDmYs/KAsrmtBjOEaAAPbwNGXXp1g==", - "dev": true, "requires": { "@babel/core": "^7.15.5", "@svgr/babel-preset": "^6.2.0", @@ -32991,7 +33580,6 @@ "version": "6.2.0", "resolved": "https://registry.npmjs.org/@svgr/plugin-svgo/-/plugin-svgo-6.2.0.tgz", "integrity": "sha512-oDdMQONKOJEbuKwuy4Np6VdV6qoaLLvoY86hjvQEgU82Vx1MSWRyYms6Sl0f+NtqxLI/rDVufATbP/ev996k3Q==", - "dev": true, "requires": { "cosmiconfig": "^7.0.1", "deepmerge": "^4.2.2", @@ -33002,7 +33590,6 @@ "version": "6.2.1", "resolved": "https://registry.npmjs.org/@svgr/webpack/-/webpack-6.2.1.tgz", "integrity": "sha512-h09ngMNd13hnePwgXa+Y5CgOjzlCvfWLHg+MBnydEedAnuLRzUHUJmGS3o2OsrhxTOOqEsPOFt5v/f6C5Qulcw==", - "dev": true, "requires": { "@babel/core": "^7.15.5", "@babel/plugin-transform-react-constant-elements": "^7.14.5", @@ -33014,6 +33601,16 @@ "@svgr/plugin-svgo": "^6.2.0" } }, + "@testing-library/cypress": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/@testing-library/cypress/-/cypress-8.0.3.tgz", + "integrity": "sha512-nY2YaSbmuPo5k6kL0iLj/pGPPfka3iwb3kpTx8QN/vOCns92Saz9wfACqB8FJzcR7+lfA4d5HUOWqmTddBzczg==", + "dev": true, + "requires": { + "@babel/runtime": "^7.14.6", + "@testing-library/dom": "^8.1.0" + } + }, "@testing-library/dom": { "version": "8.14.0", "resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-8.14.0.tgz", @@ -33093,8 +33690,7 @@ "@trysound/sax": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/@trysound/sax/-/sax-0.2.0.tgz", - "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==", - "dev": true + "integrity": "sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==" }, "@types/aria-query": { "version": "4.2.2", @@ -33106,7 +33702,6 @@ "version": "1.19.2", "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.2.tgz", "integrity": "sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==", - "dev": true, "requires": { "@types/connect": "*", "@types/node": "*" @@ -33116,7 +33711,6 @@ "version": "3.5.10", "resolved": "https://registry.npmjs.org/@types/bonjour/-/bonjour-3.5.10.tgz", "integrity": "sha512-p7ienRMiS41Nu2/igbJxxLDWrSZ0WxM8UQgCeO9KhoVF7cOVFkrKsiDr1EsJIla8vV3oEEjGcz11jc5yimhzZw==", - "dev": true, "requires": { "@types/node": "*" } @@ -33125,7 +33719,6 @@ "version": "3.4.35", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "integrity": "sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==", - "dev": true, "requires": { "@types/node": "*" } @@ -33134,7 +33727,6 @@ "version": "1.3.5", "resolved": "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.5.tgz", "integrity": "sha512-h8QJa8xSb1WD4fpKBDcATDNGXghFj6/3GRWG6dhmRcu0RX1Ubasur2Uvx5aeEwlf0MwblEC2bMzzMQntxnw/Cw==", - "dev": true, "requires": { "@types/express-serve-static-core": "*", "@types/node": "*" @@ -33150,7 +33742,6 @@ "version": "8.4.3", "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.3.tgz", "integrity": "sha512-YP1S7YJRMPs+7KZKDb9G63n8YejIwW9BALq7a5j2+H4yl6iOv9CB29edho+cuFRrvmJbbaH2yiVChKLJVysDGw==", - "dev": true, "requires": { "@types/estree": "*", "@types/json-schema": "*" @@ -33160,7 +33751,6 @@ "version": "3.7.3", "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, "requires": { "@types/eslint": "*", "@types/estree": "*" @@ -33169,14 +33759,12 @@ "@types/estree": { "version": "0.0.51", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true + "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==" }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", "integrity": "sha512-6bSZTPaTIACxn48l50SR+axgrqm6qXFIxrdAKaG6PaJk3+zuUr35hBlgT7vOmJcum+OEaIBLtHV/qloEAFITeA==", - "dev": true, "requires": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.18", @@ -33188,7 +33776,6 @@ "version": "4.17.29", "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.29.tgz", "integrity": "sha512-uMd++6dMKS32EOuw1Uli3e3BPgdLIXmezcfHv7N4c1s3gkhikBplORPpMq3fuWkxncZN1reb16d5n8yhQ80x7Q==", - "dev": true, "requires": { "@types/node": "*", "@types/qs": "*", @@ -33226,14 +33813,12 @@ "@types/history": { "version": "4.7.11", "resolved": "https://registry.npmjs.org/@types/history/-/history-4.7.11.tgz", - "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==", - "dev": true + "integrity": "sha512-qjDJRrmvBMiTx+jyLxvLfJU7UznFuokDv4f3WRuriHKERccVpFU+8XMQUAbDzoiJCsmexxRExQeMwwCdamSKDA==" }, "@types/hoist-non-react-statics": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/@types/hoist-non-react-statics/-/hoist-non-react-statics-3.3.1.tgz", "integrity": "sha512-iMIqiko6ooLrTh1joXodJK5X9xeEALT1kM5G3ZLhD3hszxBdIEd5C75U834D9mLcINgD4OyZf5uQXjkuYydWvA==", - "dev": true, "requires": { "@types/react": "*", "hoist-non-react-statics": "^3.3.0" @@ -33242,14 +33827,12 @@ "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", - "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==", - "dev": true + "integrity": "sha512-oh/6byDPnL1zeNXFrDXFLyZjkr1MsBG667IM792caf1L2UPOOMf65NFzjUH/ltyfwjAGfs1rsX1eftK0jC/KIg==" }, "@types/http-proxy": { "version": "1.17.9", "resolved": "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.9.tgz", "integrity": "sha512-QsbSjA/fSk7xB+UXlCT3wHBy5ai9wOcNDWwZAtud+jXhwOM3l+EYZh8Lng4+/6n8uar0J7xILzqftJdJ/Wdfkw==", - "dev": true, "requires": { "@types/node": "*" } @@ -33293,8 +33876,7 @@ "@types/json-schema": { "version": "7.0.11", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true + "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==" }, "@types/lodash": { "version": "4.14.182", @@ -33314,8 +33896,7 @@ "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", - "dev": true + "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==" }, "@types/minimatch": { "version": "3.0.5", @@ -33326,8 +33907,7 @@ "@types/node": { "version": "18.0.0", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.0.0.tgz", - "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==", - "dev": true + "integrity": "sha512-cHlGmko4gWLVI27cGJntjs/Sj8th9aYwplmZFwmmgYQQvL5NUsgVJG7OddLvNfLqYS31KFN0s3qlaD9qCaxACA==" }, "@types/node-fetch": { "version": "2.6.2", @@ -33354,8 +33934,7 @@ "@types/parse-json": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.0.tgz", - "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==", - "dev": true + "integrity": "sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==" }, "@types/parse5": { "version": "5.0.3", @@ -33372,26 +33951,22 @@ "@types/prop-types": { "version": "15.7.5", "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==", - "dev": true + "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" }, "@types/qs": { "version": "6.9.7", "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.7.tgz", - "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==", - "dev": true + "integrity": "sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==" }, "@types/range-parser": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", - "dev": true + "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { "version": "18.0.14", "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.14.tgz", "integrity": "sha512-x4gGuASSiWmo0xjDLpm5mPb52syZHJx02VKbqUKdLmKtAwIh63XClGsiTI1K6DO5q7ox4xAsQrU+Gl3+gGXF9Q==", - "dev": true, "requires": { "@types/prop-types": "*", "@types/scheduler": "*", @@ -33402,7 +33977,6 @@ "version": "18.0.5", "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.0.5.tgz", "integrity": "sha512-OWPWTUrY/NIrjsAPkAk1wW9LZeIjSvkXRhclsFO8CZcZGCOg2G0YZy4ft+rOyYxy8B7ui5iZzi9OkDebZ7/QSA==", - "dev": true, "requires": { "@types/react": "*" } @@ -33411,7 +33985,6 @@ "version": "5.1.18", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", "integrity": "sha512-YYknwy0D0iOwKQgz9v8nOzt2J6l4gouBmDnWqUUznltOTaon+r8US8ky8HvN0tXvc38U9m6z/t2RsVsnd1zM0g==", - "dev": true, "requires": { "@types/history": "^4.7.11", "@types/react": "*" @@ -33421,7 +33994,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/@types/react-router-dom/-/react-router-dom-5.3.3.tgz", "integrity": "sha512-kpqnYK4wcdm5UaWI3fLcELopqLrHgLqNsdpHauzlQktfkHL3npOSwtj1Uz9oKBAzs7lFtVkV8j83voAz2D8fhw==", - "dev": true, "requires": { "@types/history": "^4.7.11", "@types/react": "*", @@ -33440,20 +34012,17 @@ "@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", - "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==", - "dev": true + "integrity": "sha512-wWKOClTTiizcZhXnPY4wikVAwmdYHp8q6DmC+EJUzAMsycb7HB32Kh9RN4+0gExjmPmZSAQjgURXIGATPegAvA==" }, "@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", - "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==", - "dev": true + "integrity": "sha512-hppQEBDmlwhFAXKJX2KnWLYu5yMfi91yazPb2l+lbJiwW+wdo1gNeRA+3RgNSO39WYX2euey41KEwnqesU2Jew==" }, "@types/serve-index": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/@types/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-d/Hs3nWDxNL2xAczmOVZNj92YZCS6RGxfBPjKzuu/XirCgXdpKEb88dYNbrYGint6IVWLNP+yonwVAuRC0T2Dg==", - "dev": true, "requires": { "@types/express": "*" } @@ -33462,7 +34031,6 @@ "version": "1.13.10", "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.10.tgz", "integrity": "sha512-nCkHGI4w7ZgAdNkrEu0bv+4xNV/XDqW+DydknebMOQwkpDGx8G+HTlj7R7ABI8i8nKxVw0wtKPi1D+lPOkh4YQ==", - "dev": true, "requires": { "@types/mime": "^1", "@types/node": "*" @@ -33477,11 +34045,22 @@ "@types/node": "*" } }, + "@types/sinonjs__fake-timers": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/@types/sinonjs__fake-timers/-/sinonjs__fake-timers-8.1.1.tgz", + "integrity": "sha512-0kSuKjAS0TrGLJ0M/+8MaFkGsQhZpB6pxOmvS3K8FYI72K//YmdfoW9X2qPsAKh1mkwxGD5zib9s1FIFed6E8g==", + "dev": true + }, + "@types/sizzle": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz", + "integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==", + "dev": true + }, "@types/sockjs": { "version": "0.3.33", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", "integrity": "sha512-f0KEEe05NvUnat+boPTZ0dgaLZ4SfSouXUgv5noUiefG2ajgKjmETo9ZJyuqsl7dfl2aHlLJUiki6B4ZYldiiw==", - "dev": true, "requires": { "@types/node": "*" } @@ -33496,7 +34075,6 @@ "version": "5.1.25", "resolved": "https://registry.npmjs.org/@types/styled-components/-/styled-components-5.1.25.tgz", "integrity": "sha512-fgwl+0Pa8pdkwXRoVPP9JbqF0Ivo9llnmsm+7TCI330kbPIFd9qv1Lrhr37shf4tnxCOSu+/IgqM7uJXLWZZNQ==", - "dev": true, "requires": { "@types/hoist-non-react-statics": "*", "@types/react": "*", @@ -33567,7 +34145,6 @@ "version": "8.5.3", "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.3.tgz", "integrity": "sha512-6YOoWjruKj1uLf3INHH7D3qTXwFfEsg1kf3c0uDdSBJwfa/llkwIjrAGV7j7mVgGNbzTQ3HiHKKDXl6bJPD97w==", - "dev": true, "requires": { "@types/node": "*" } @@ -33587,6 +34164,16 @@ "integrity": "sha512-iO9ZQHkZxHn4mSakYV0vFHAVDyEOIJQrV2uZ06HxEPcx+mt8swXoZHIbaaJ2crJYFfErySgktuTZ3BeLz+XmFA==", "dev": true }, + "@types/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-Cn6WYCm0tXv8p6k+A8PvbDG763EDpBoTzHdA+Q/MF6H3sapGjCm9NzoaJncJS9tUKSuCoDs9XHxYYsQDgxR6kw==", + "dev": true, + "optional": true, + "requires": { + "@types/node": "*" + } + }, "@typescript-eslint/eslint-plugin": { "version": "5.30.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.30.0.tgz", @@ -33708,7 +34295,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, "requires": { "@webassemblyjs/helper-numbers": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1" @@ -33717,20 +34303,17 @@ "@webassemblyjs/floating-point-hex-parser": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true + "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==" }, "@webassemblyjs/helper-api-error": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true + "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==" }, "@webassemblyjs/helper-buffer": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true + "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==" }, "@webassemblyjs/helper-code-frame": { "version": "1.9.0", @@ -33809,7 +34392,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, "requires": { "@webassemblyjs/floating-point-hex-parser": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -33819,14 +34401,12 @@ "@webassemblyjs/helper-wasm-bytecode": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true + "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==" }, "@webassemblyjs/helper-wasm-section": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -33838,7 +34418,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, "requires": { "@xtuc/ieee754": "^1.2.0" } @@ -33847,7 +34426,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, "requires": { "@xtuc/long": "4.2.2" } @@ -33855,14 +34433,12 @@ "@webassemblyjs/utf8": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true + "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==" }, "@webassemblyjs/wasm-edit": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -33878,7 +34454,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-wasm-bytecode": "1.11.1", @@ -33891,7 +34466,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-buffer": "1.11.1", @@ -33903,7 +34477,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@webassemblyjs/helper-api-error": "1.11.1", @@ -33962,7 +34535,6 @@ "version": "1.11.1", "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, "requires": { "@webassemblyjs/ast": "1.11.1", "@xtuc/long": "4.2.2" @@ -33972,14 +34544,12 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, "requires": {} }, "@webpack-cli/info": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, "requires": { "envinfo": "^7.7.3" } @@ -33988,7 +34558,6 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, "requires": {} }, "@xmldom/xmldom": { @@ -34000,20 +34569,17 @@ "@xtuc/ieee754": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true + "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==" }, "@xtuc/long": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true + "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==" }, "accepts": { "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==", - "dev": true, "requires": { "mime-types": "~2.1.34", "negotiator": "0.6.3" @@ -34022,14 +34588,12 @@ "acorn": { "version": "8.7.1", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true + "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==" }, "acorn-import-assertions": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, "requires": {} }, "acorn-jsx": { @@ -34090,7 +34654,6 @@ "version": "6.12.6", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -34109,7 +34672,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", - "dev": true, "requires": { "ajv": "^8.0.0" }, @@ -34118,7 +34680,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -34129,8 +34690,7 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" } } }, @@ -34138,7 +34698,6 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, "requires": {} }, "ansi-align": { @@ -34176,14 +34735,12 @@ "ansi-html-community": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/ansi-html-community/-/ansi-html-community-0.0.8.tgz", - "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==", - "dev": true + "integrity": "sha512-1APHAyr3+PCamwNw3bXCPp4HFLONZt/yIH0sZp0/469KWNTEy+qN5jQ3GVX6DMZ1UXAi34yVwtTeaG/HpBuuzw==" }, "ansi-regex": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { "version": "3.2.1", @@ -34206,7 +34763,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -34224,6 +34780,12 @@ "integrity": "sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==", "dev": true }, + "arch": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/arch/-/arch-2.2.0.tgz", + "integrity": "sha512-Of/R0wqp83cgHozfIYLbBMnej79U/SVGOOyuB3VVFv1NRM/PSFMK12x9KVtiYzJqmnU5WR2qp0Z5rHb7sWGnFQ==", + "dev": true + }, "are-we-there-yet": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-2.0.0.tgz", @@ -34274,8 +34836,7 @@ "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", - "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", - "dev": true + "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==" }, "array-includes": { "version": "3.1.5", @@ -34364,6 +34925,15 @@ "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", "dev": true }, + "asn1": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.6.tgz", + "integrity": "sha512-ix/FxPn0MDjeyJ7i/yoHGFt/EX6LyNbxSEhPPXODPL+KB0VPk86UYfL0lMdy+KCnv+fmvIzySwaK5COwqVbWTQ==", + "dev": true, + "requires": { + "safer-buffer": "~2.1.0" + } + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -34411,6 +34981,12 @@ } } }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha512-NfJ4UzBCcQGLDlQq7nHxH+tv3kyZ0hHQqF5BO6J7tNJeP5do1llPr8dZ8zHonfhAu0PHAdMkSo+8o0wxg9lZWw==", + "dev": true + }, "assign-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", @@ -34426,6 +35002,18 @@ "tslib": "^2.0.1" } }, + "astral-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", + "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", + "dev": true + }, + "async": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", + "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", + "dev": true + }, "async-each": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz", @@ -34483,6 +35071,18 @@ } } }, + "aws-sign2": { + "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==", + "dev": true + }, + "aws4": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", + "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==", + "dev": true + }, "axios": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz", @@ -34508,7 +35108,6 @@ "version": "8.2.5", "resolved": "https://registry.npmjs.org/babel-loader/-/babel-loader-8.2.5.tgz", "integrity": "sha512-OSiFfH89LrEMiWd4pLNqGz4CwJDtbs2ZVc+iGu2HrkRfPxId9F2anQj38IxWpmRfsUY0aBZYi1EFcd3mhtRMLQ==", - "dev": true, "requires": { "find-cache-dir": "^3.3.1", "loader-utils": "^2.0.0", @@ -34520,7 +35119,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" } @@ -34529,7 +35127,6 @@ "version": "2.7.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-2.7.1.tgz", "integrity": "sha512-SHiNtMOUGWBQJwzISiVYKu82GiV4QYGePp3odlY1tuKO7gPtphAT5R/py0fA6xtbgLL/RvtJZnU9b8s0F1q0Xg==", - "dev": true, "requires": { "@types/json-schema": "^7.0.5", "ajv": "^6.12.4", @@ -34566,7 +35163,6 @@ "version": "2.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz", "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==", - "dev": true, "requires": { "object.assign": "^4.1.0" } @@ -34622,7 +35218,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.1.tgz", "integrity": "sha512-v7/T6EQcNfVLfcN2X8Lulb7DjprieyLWJK/zOWH5DUYcAgex9sP3h25Q+DLsX9TloXe3y1O8l2q2Jv9q8UVB9w==", - "dev": true, "requires": { "@babel/compat-data": "^7.13.11", "@babel/helper-define-polyfill-provider": "^0.3.1", @@ -34633,7 +35228,6 @@ "version": "0.5.2", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.5.2.tgz", "integrity": "sha512-G3uJih0XWiID451fpeFaYGVuxHEjzKTHtc9uGFEjR6hHrvNzeS/PX+LLLcetJcytsB5m4j+K3o/EpXJNb/5IEQ==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1", "core-js-compat": "^3.21.0" @@ -34643,7 +35237,6 @@ "version": "0.3.1", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.3.1.tgz", "integrity": "sha512-Y2B06tvgHYt1x0yz17jGkGeeMr5FeKUu+ASJ+N6nB5lQ8Dapfg42i0OVrf8PNGJ3zKL4A23snMi1IRwrqqND7A==", - "dev": true, "requires": { "@babel/helper-define-polyfill-provider": "^0.3.1" } @@ -34685,8 +35278,7 @@ "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "base": { "version": "0.11.2", @@ -34723,8 +35315,16 @@ "batch": { "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==", - "dev": true + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "bcrypt-pbkdf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", + "integrity": "sha512-qeFIXtP4MSoi6NLqO12WfqARWWuCKi2Rn/9hJLEmtB5yTNr9DqFWkJRCf2qShWzPeAMRnOgCrq0sg/KLv5ES9w==", + "dev": true, + "requires": { + "tweetnacl": "^0.14.3" + } }, "better-opn": { "version": "2.1.1", @@ -34757,14 +35357,12 @@ "big.js": { "version": "5.2.2", "resolved": "https://registry.npmjs.org/big.js/-/big.js-5.2.2.tgz", - "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==", - "dev": true + "integrity": "sha512-vyL2OymJxmarO8gxMr0mhChsO9QGwhynfuu4+MHTAW6czfq9humCB7rKpUjDd9YUiDPU4mzpyupFSvOClAwbmQ==" }, "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bindings": { "version": "1.5.0", @@ -34799,6 +35397,12 @@ } } }, + "blob-util": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/blob-util/-/blob-util-2.0.2.tgz", + "integrity": "sha512-T7JQa+zsXXEa6/8ZhHcQEW1UFfVM49Ts65uBkFL6fz2QmrElqmbajIDJvuA0tEhRe5eIjpV9ZF+0RfZR9voJFQ==", + "dev": true + }, "bluebird": { "version": "3.7.2", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", @@ -34815,7 +35419,6 @@ "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==", - "dev": true, "requires": { "bytes": "3.1.2", "content-type": "~1.0.4", @@ -34834,14 +35437,12 @@ "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -34849,8 +35450,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -34858,7 +35458,6 @@ "version": "1.0.13", "resolved": "https://registry.npmjs.org/bonjour-service/-/bonjour-service-1.0.13.tgz", "integrity": "sha512-LWKRU/7EqDUC9CTAQtuZl5HzBALoCYwtLhffW3et7vZMwv3bWLpJf8bRYlMD5OCcDpTfnPgNCV4yo9ZIaJGMiA==", - "dev": true, "requires": { "array-flatten": "^2.1.2", "dns-equal": "^1.0.0", @@ -34869,8 +35468,7 @@ "boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==", - "dev": true + "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" }, "boxen": { "version": "5.1.2", @@ -34959,7 +35557,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -34969,7 +35566,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -35071,7 +35667,6 @@ "version": "4.21.0", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.0.tgz", "integrity": "sha512-UQxE0DIhRB5z/zDz9iA03BOfxaN2+GQdBYH/2WrSIWEUrnpzTPJbhqt+umq6r3acaPRTW1FNTkrcp0PXgtFkvA==", - "dev": true, "requires": { "caniuse-lite": "^1.0.30001358", "electron-to-chromium": "^1.4.164", @@ -35099,11 +35694,16 @@ "isarray": "^1.0.0" } }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true + }, "buffer-from": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true + "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==" }, "buffer-xor": { "version": "1.0.3", @@ -35120,8 +35720,7 @@ "bytes": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", - "dev": true + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" }, "c8": { "version": "7.11.3", @@ -35236,11 +35835,16 @@ "unset-value": "^1.0.0" } }, + "cachedir": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/cachedir/-/cachedir-2.3.0.tgz", + "integrity": "sha512-A+Fezp4zxnit6FanDmv9EqXNAi3vt9DWp51/71UEhXukb7QUuvtv9344h91dyAxuTLoSYJFU299qzR3tzwPAhw==", + "dev": true + }, "call-bind": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "get-intrinsic": "^1.0.2" @@ -35255,14 +35859,12 @@ "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" }, "camel-case": { "version": "4.1.2", "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-4.1.2.tgz", "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", - "dev": true, "requires": { "pascal-case": "^3.1.2", "tslib": "^2.0.3" @@ -35308,8 +35910,7 @@ "caniuse-lite": { "version": "1.0.30001359", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001359.tgz", - "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==", - "dev": true + "integrity": "sha512-Xln/BAsPzEuiVLgJ2/45IaqD9jShtk3Y33anKb4+yLwQzws3+v6odKfpgES/cDEaZMLzSChpIGdbOYtH9MyuHw==" }, "capture-exit": { "version": "2.0.0", @@ -35326,6 +35927,12 @@ "integrity": "sha512-roIFONhcxog0JSSWbvVAh3OocukmSgpqOH6YpMkCvav/ySIV3JKg4Dc8vYtQjYi/UxpNE36r/9v+VqTQqgkYmw==", "dev": true }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==", + "dev": true + }, "ccount": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ccount/-/ccount-1.1.0.tgz", @@ -35366,11 +35973,16 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "check-more-types": { + "version": "2.24.0", + "resolved": "https://registry.npmjs.org/check-more-types/-/check-more-types-2.24.0.tgz", + "integrity": "sha512-Pj779qHxV2tuapviy1bSZNEL1maXr13bPYpsvSDB68HlYcYuhlDrmGd63i0JHMCLKzc7rUSNIrpdJlhVlNwrxA==", + "dev": true + }, "chokidar": { "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -35388,11 +36000,20 @@ "integrity": "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==", "dev": true }, + "chromatic": { + "version": "6.7.3", + "resolved": "https://registry.npmjs.org/chromatic/-/chromatic-6.7.3.tgz", + "integrity": "sha512-QVeP9LRj/4r/eVCyX+TybFEl7iyQ+6QzrkPChtoDhFw0B24B1y13Mya3FElltb+EPDsEG6V5VYzYnG+w/VPmaw==", + "dev": true, + "requires": { + "@discoveryjs/json-ext": "^0.5.7", + "@types/webpack-env": "^1.17.0" + } + }, "chrome-trace-event": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true + "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==" }, "ci-info": { "version": "2.0.0", @@ -35500,7 +36121,6 @@ "version": "5.3.0", "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.0.tgz", "integrity": "sha512-YYuuxv4H/iNb1Z/5IbMRoxgrzjWGhOEFfd+groZ5dMCVkpENiMZmwspdrzBo9286JjM1gZJPAyL7ZIdzuvu2AQ==", - "dev": true, "requires": { "source-map": "~0.6.0" } @@ -35542,6 +36162,16 @@ "string-width": "^4.2.0" } }, + "cli-truncate": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-2.1.0.tgz", + "integrity": "sha512-n8fOixwDD6b/ObinzTrp1ZKFzbgvKZvuz/TvejnLn1aQfC6r52XEx85FmuC+3HI+JM7coBRXUvNqEU2PHVrHpg==", + "dev": true, + "requires": { + "slice-ansi": "^3.0.0", + "string-width": "^4.2.0" + } + }, "cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -35569,7 +36199,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, "requires": { "is-plain-object": "^2.0.4", "kind-of": "^6.0.2", @@ -35620,8 +36249,7 @@ "colorette": { "version": "2.0.19", "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true + "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==" }, "combined-stream": { "version": "1.0.8", @@ -35640,8 +36268,7 @@ "commander": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", - "dev": true + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" }, "common-path-prefix": { "version": "3.0.0", @@ -35649,11 +36276,16 @@ "integrity": "sha512-QE33hToZseCH3jS0qN96O/bSh3kaw/h+Tq7ngyY9eWDUnTlTNUyqfqvCXioLe5Na5jFsL78ra/wuBU4iuEgd4w==", "dev": true }, + "common-tags": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/common-tags/-/common-tags-1.8.2.tgz", + "integrity": "sha512-gk/Z852D2Wtb//0I+kRFNKKE9dIIVirjoqPoA1wJU+XePVXZfGeBpk45+A1rKO4Q43prqWBNY/MiIeRLbPWUaA==", + "dev": true + }, "commondir": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz", - "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==", - "dev": true + "integrity": "sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==" }, "component-emitter": { "version": "1.3.0", @@ -35665,7 +36297,6 @@ "version": "2.0.18", "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", - "dev": true, "requires": { "mime-db": ">= 1.43.0 < 2" } @@ -35674,7 +36305,6 @@ "version": "1.7.4", "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", - "dev": true, "requires": { "accepts": "~1.3.5", "bytes": "3.0.0", @@ -35689,7 +36319,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -35697,16 +36326,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "concat-stream": { "version": "1.6.2", @@ -35749,8 +36376,7 @@ "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", - "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", - "dev": true + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" }, "console-browserify": { "version": "1.2.0", @@ -35774,7 +36400,6 @@ "version": "0.5.4", "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz", "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==", - "dev": true, "requires": { "safe-buffer": "5.2.1" }, @@ -35782,22 +36407,19 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, "content-type": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", - "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", - "dev": true + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" }, "convert-source-map": { "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==", - "dev": true, "requires": { "safe-buffer": "~5.1.1" } @@ -35805,14 +36427,12 @@ "cookie": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "dev": true + "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" }, "cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "dev": true + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" }, "copy-concurrently": { "version": "1.0.5", @@ -35870,7 +36490,6 @@ "version": "3.23.3", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.23.3.tgz", "integrity": "sha512-WSzUs2h2vvmKsacLHNTdpyOC9k43AEhcGoFlVgCY4L7aw98oSBKtPL6vD0/TqZjRWRQYdDSLkzZIni4Crbbiqw==", - "dev": true, "requires": { "browserslist": "^4.21.0", "semver": "7.0.0" @@ -35879,8 +36498,7 @@ "semver": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true + "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==" } } }, @@ -35893,14 +36511,12 @@ "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "dev": true + "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, "cosmiconfig": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.0.1.tgz", "integrity": "sha512-a1YWNUV2HwGimB7dU2s1wUMurNKjpx60HxBB6xUM8Re+2s1g1IIfJvFR0/iCF+XHdE0GMTKTuLR32UQff4TEyQ==", - "dev": true, "requires": { "@types/parse-json": "^4.0.0", "import-fresh": "^3.2.1", @@ -36213,7 +36829,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "requires": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -36248,7 +36863,6 @@ "version": "6.7.1", "resolved": "https://registry.npmjs.org/css-loader/-/css-loader-6.7.1.tgz", "integrity": "sha512-yB5CNFa14MbPJcomwNh3wLThtkZgcNyI2bNMRt8iE5Z8Vwl7f8vQXFAzn2HDOJvtDq2NTZBUGMSUNNyrv3/+cw==", - "dev": true, "requires": { "icss-utils": "^5.1.0", "postcss": "^8.4.7", @@ -36264,7 +36878,6 @@ "version": "7.3.7", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -36275,7 +36888,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz", "integrity": "sha512-wPpOYtnsVontu2mODhA19JrqWxNsfdatRKd64kmpRbQgh1KtItko5sTnEpPdpSaJszTOhEMlF/RPz28qj4HqhQ==", - "dev": true, "requires": { "boolbase": "^1.0.0", "css-what": "^6.0.1", @@ -36298,7 +36910,6 @@ "version": "1.1.3", "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.1.3.tgz", "integrity": "sha512-tRpdppF7TRazZrjJ6v3stzv93qxRcSsFmW6cX0Zm2NVKpxE1WV1HblnghVv9TreireHkqI/VDEsfolRF1p6y7Q==", - "dev": true, "requires": { "mdn-data": "2.0.14", "source-map": "^0.6.1" @@ -36307,20 +36918,17 @@ "css-what": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "dev": true + "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, "cssesc": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", - "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", - "dev": true + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==" }, "csso": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/csso/-/csso-4.2.0.tgz", "integrity": "sha512-wvlcdIbf6pwKEk7vHj8/Bkc0B4ylXZruLvOgs9doS5eOsOpuodOV2zJChSpkp+pRpYQLQMeF04nr3Z68Sta9jA==", - "dev": true, "requires": { "css-tree": "^1.1.2" } @@ -36328,8 +36936,7 @@ "csstype": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==", - "dev": true + "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" }, "currently-unhandled": { "version": "0.4.1", @@ -36347,6 +36954,226 @@ "integrity": "sha512-NJGVKPS81XejHcLhaLJS7plab0fK3slPh11mESeeDq2W4ZI5kUKK/LRRdVDvjJseojbPB7ZwjnyOybg3Igea/A==", "dev": true }, + "cypress": { + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/cypress/-/cypress-10.3.1.tgz", + "integrity": "sha512-As9HrExjAgpgjCnbiQCuPdw5sWKx5HUJcK2EOKziu642akwufr/GUeqL5UnCPYXTyyibvEdWT/pSC2qnGW/e5w==", + "dev": true, + "requires": { + "@cypress/request": "^2.88.10", + "@cypress/xvfb": "^1.2.4", + "@types/node": "^14.14.31", + "@types/sinonjs__fake-timers": "8.1.1", + "@types/sizzle": "^2.3.2", + "arch": "^2.2.0", + "blob-util": "^2.0.2", + "bluebird": "^3.7.2", + "buffer": "^5.6.0", + "cachedir": "^2.3.0", + "chalk": "^4.1.0", + "check-more-types": "^2.24.0", + "cli-cursor": "^3.1.0", + "cli-table3": "~0.6.1", + "commander": "^5.1.0", + "common-tags": "^1.8.0", + "dayjs": "^1.10.4", + "debug": "^4.3.2", + "enquirer": "^2.3.6", + "eventemitter2": "^6.4.3", + "execa": "4.1.0", + "executable": "^4.1.1", + "extract-zip": "2.0.1", + "figures": "^3.2.0", + "fs-extra": "^9.1.0", + "getos": "^3.2.1", + "is-ci": "^3.0.0", + "is-installed-globally": "~0.4.0", + "lazy-ass": "^1.6.0", + "listr2": "^3.8.3", + "lodash": "^4.17.21", + "log-symbols": "^4.0.0", + "minimist": "^1.2.6", + "ospath": "^1.2.2", + "pretty-bytes": "^5.6.0", + "proxy-from-env": "1.0.0", + "request-progress": "^3.0.0", + "semver": "^7.3.2", + "supports-color": "^8.1.1", + "tmp": "~0.2.1", + "untildify": "^4.0.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "@types/node": { + "version": "14.18.23", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.23.tgz", + "integrity": "sha512-MhbCWN18R4GhO8ewQWAFK4TGQdBpXWByukz7cWyJmXhvRuCIaM/oWytGPqVmDzgEnnaIc9ss6HbU5mUi+vyZPA==", + "dev": true + }, + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "dev": true, + "requires": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "dependencies": { + "supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, + "ci-info": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.3.2.tgz", + "integrity": "sha512-xmDt/QIAdeZ9+nfdPsaBCpMvHNLFiLdjj59qjqn+6iPe6YmHGQ35sBnQ8uslRBXFmXkiZQOJRjvQeoGppoTjjg==", + "dev": true + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "commander": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "dev": true + }, + "execa": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz", + "integrity": "sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "human-signals": "^1.1.1", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.0", + "onetime": "^5.1.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "human-signals": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", + "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==", + "dev": true + }, + "is-ci": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-3.0.1.tgz", + "integrity": "sha512-ZYvCgrefwqoQ6yTyYUbQu64HsITZ3NfKX1lzaEYdkTDcfKzzCI/wthRRYKkdjHKFVgNiXKAKm65Zo1pk2as/QQ==", + "dev": true, + "requires": { + "ci-info": "^3.2.0" + } + }, + "semver": { + "version": "7.3.7", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", + "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + }, + "supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + }, + "tmp": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.2.1.tgz", + "integrity": "sha512-76SUhtfqR2Ijn+xllcI5P1oyannHNHByD80W1q447gU3mp9G9PSpGdWmjUOHRDPiHYacIk66W7ubDTuPF3BEtQ==", + "dev": true, + "requires": { + "rimraf": "^3.0.0" + } + }, + "untildify": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/untildify/-/untildify-4.0.0.tgz", + "integrity": "sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==", + "dev": true + } + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha512-jRFi8UDGo6j+odZiEpjazZaWqEal3w/basFjQHQEwVtZJGDpxbH1MeYluwCS8Xq5wmLJooDlMgvVarmWfGM44g==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "dayjs": { + "version": "1.11.4", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.4.tgz", + "integrity": "sha512-Zj/lPM5hOvQ1Bf7uAvewDaUcsJoI6JmNqmHhHl3nyumwe0XHwt8sWdOVAPACJzCebL8gQCi+K49w7iKWnGwX9g==", + "dev": true + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -36383,8 +37210,7 @@ "deepmerge": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", - "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", - "dev": true + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" }, "default-browser-id": { "version": "1.0.4", @@ -36402,7 +37228,6 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/default-gateway/-/default-gateway-6.0.3.tgz", "integrity": "sha512-fwSOJsbbNzZ/CUFpqFBqYfYNLj1NbMPm8MMCIzHjC83iSJRBEGmDUxU+WP661BaBQImeC2yHwXtz+P/O9o+XEg==", - "dev": true, "requires": { "execa": "^5.0.0" } @@ -36419,14 +37244,12 @@ "define-lazy-prop": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", - "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", - "dev": true + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" }, "define-properties": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.4.tgz", "integrity": "sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==", - "dev": true, "requires": { "has-property-descriptors": "^1.0.0", "object-keys": "^1.1.1" @@ -36456,8 +37279,7 @@ "depd": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "dev": true + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, "des.js": { "version": "1.0.1", @@ -36472,8 +37294,7 @@ "destroy": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz", - "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==", - "dev": true + "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==" }, "detab": { "version": "2.0.4", @@ -36487,8 +37308,7 @@ "detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", - "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==", - "dev": true + "integrity": "sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==" }, "detect-package-manager": { "version": "2.0.1", @@ -36557,14 +37377,12 @@ "dns-equal": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/dns-equal/-/dns-equal-1.0.0.tgz", - "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==", - "dev": true + "integrity": "sha512-z+paD6YUQsk+AbGCEM4PrOXSss5gd66QfcVBFTKR/HpFL9jCqikS94HYwKww6fQyO7IxrIIyUu+g0Ka9tUS2Cg==" }, "dns-packet": { "version": "5.4.0", "resolved": "https://registry.npmjs.org/dns-packet/-/dns-packet-5.4.0.tgz", "integrity": "sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==", - "dev": true, "requires": { "@leichtgewicht/ip-codec": "^2.0.1" } @@ -36588,7 +37406,6 @@ "version": "0.2.0", "resolved": "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz", "integrity": "sha512-gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==", - "dev": true, "requires": { "utila": "~0.4" } @@ -36597,7 +37414,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz", "integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==", - "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.2.0", @@ -36619,14 +37435,12 @@ "domelementtype": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "dev": true + "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==" }, "domhandler": { "version": "4.3.1", "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-4.3.1.tgz", "integrity": "sha512-GrwoxYN+uWlzO8uhUXRl0P+kHE4GtVPfYzVLcUxPL7KNdHKj66vvlhiweIHqYYXWlw+T8iLMp42Lm67ghw4WMQ==", - "dev": true, "requires": { "domelementtype": "^2.2.0" } @@ -36635,7 +37449,6 @@ "version": "2.8.0", "resolved": "https://registry.npmjs.org/domutils/-/domutils-2.8.0.tgz", "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", - "dev": true, "requires": { "dom-serializer": "^1.0.1", "domelementtype": "^2.2.0", @@ -36646,7 +37459,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/dot-case/-/dot-case-3.0.4.tgz", "integrity": "sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -36702,17 +37514,25 @@ } } }, + "ecc-jsbn": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", + "integrity": "sha512-eh9O+hwRHNbG4BLTjEl3nw044CkGm5X6LoaCf7LPp7UU8Qrt47JYNi6nPX8xjW97TKGKm1ouctg0QSpZe9qrnw==", + "dev": true, + "requires": { + "jsbn": "~0.1.0", + "safer-buffer": "^2.1.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "dev": true + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "electron-to-chromium": { "version": "1.4.172", "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.172.tgz", - "integrity": "sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q==", - "dev": true + "integrity": "sha512-yDoFfTJnqBAB6hSiPvzmsBJSrjOXJtHSJoqJdI/zSIh7DYupYnIOHt/bbPw/WE31BJjNTybDdNAs21gCMnTh0Q==" }, "elliptic": { "version": "6.5.4", @@ -36746,14 +37566,12 @@ "emojis-list": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-3.0.0.tgz", - "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==", - "dev": true + "integrity": "sha512-/kyM18EfinwXZbno9FyUGeFh87KC8HRQBQGildHZbEuRyWFOmv1U10o9BBp8XVZDVNNuQKyIGIu5ZYAAXJ0V2Q==" }, "encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", - "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", - "dev": true + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" }, "end-of-stream": { "version": "1.4.4", @@ -36779,23 +37597,37 @@ "version": "5.9.3", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, "requires": { "graceful-fs": "^4.2.4", "tapable": "^2.2.0" } }, + "enquirer": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", + "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", + "dev": true, + "requires": { + "ansi-colors": "^4.1.1" + }, + "dependencies": { + "ansi-colors": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", + "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", + "dev": true + } + } + }, "entities": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/entities/-/entities-2.2.0.tgz", - "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==", - "dev": true + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" }, "envinfo": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true + "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==" }, "errno": { "version": "0.1.8", @@ -36810,7 +37642,6 @@ "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, "requires": { "is-arrayish": "^0.2.1" } @@ -36888,8 +37719,7 @@ "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true + "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==" }, "es-shim-unscopables": { "version": "1.0.0", @@ -36926,14 +37756,12 @@ "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "dev": true + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" }, "escape-string-regexp": { "version": "1.0.5", @@ -37141,6 +37969,15 @@ "dev": true, "requires": {} }, + "eslint-plugin-cypress": { + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-cypress/-/eslint-plugin-cypress-2.12.1.tgz", + "integrity": "sha512-c2W/uPADl5kospNDihgiLc7n87t5XhUbFDoTl6CfVkmG+kDAb5Ux10V9PoLPu9N+r7znpc+iQlcmAqT1A/89HA==", + "dev": true, + "requires": { + "globals": "^11.12.0" + } + }, "eslint-plugin-prettier": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-prettier/-/eslint-plugin-prettier-4.1.0.tgz", @@ -37211,7 +38048,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, "requires": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" @@ -37278,7 +38114,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, "requires": { "estraverse": "^5.2.0" }, @@ -37286,16 +38121,14 @@ "estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" } } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==" }, "estree-to-babel": { "version": "3.2.1", @@ -37311,26 +38144,28 @@ "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" }, "etag": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter2": { + "version": "6.4.7", + "resolved": "https://registry.npmjs.org/eventemitter2/-/eventemitter2-6.4.7.tgz", + "integrity": "sha512-tYUSVOGeQPKt/eC1ABfhHy5Xd96N3oIijJvN3O9+TsC28T5V9yX9oEfEK5faP0EFSNVOG97qtAS68GBrQB2hDg==", "dev": true }, "eventemitter3": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" }, "events": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true + "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==" }, "evp_bytestokey": { "version": "1.0.3", @@ -37352,7 +38187,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, "requires": { "cross-spawn": "^7.0.3", "get-stream": "^6.0.0", @@ -37365,6 +38199,23 @@ "strip-final-newline": "^2.0.0" } }, + "executable": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/executable/-/executable-4.1.1.tgz", + "integrity": "sha512-8iA79xD3uAch729dUG8xaaBBFGaEa0wdD2VkYLFHwlqosEj/jT66AzcreRDSgV7ehnNLBW2WR5jIXwGKjVdTLg==", + "dev": true, + "requires": { + "pify": "^2.2.0" + }, + "dependencies": { + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "dev": true + } + } + }, "expand-brackets": { "version": "2.1.4", "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", @@ -37488,7 +38339,6 @@ "version": "4.18.1", "resolved": "https://registry.npmjs.org/express/-/express-4.18.1.tgz", "integrity": "sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==", - "dev": true, "requires": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -37526,14 +38376,12 @@ "array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", - "dev": true + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" }, "debug": { "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -37541,14 +38389,12 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -37621,11 +38467,39 @@ } } }, + "extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "dev": true, + "requires": { + "@types/yauzl": "^2.9.1", + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "dependencies": { + "get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha512-11Ndz7Nv+mvAC1j0ktTa7fAb0vLyGGX+rMHNBYQviQDGU0Hw7lhctJANqbPhu9nV9/izT/IntTgZ7Im/9LJs9g==", + "dev": true + }, "fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" }, "fast-diff": { "version": "1.2.0", @@ -37655,8 +38529,7 @@ "fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" }, "fast-levenshtein": { "version": "2.0.6", @@ -37667,8 +38540,7 @@ "fastest-levenshtein": { "version": "1.0.12", "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true + "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==" }, "fastq": { "version": "1.13.0", @@ -37692,7 +38564,6 @@ "version": "0.11.4", "resolved": "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.11.4.tgz", "integrity": "sha512-CzbClwlXAuiRQAlUyfqPgvPoNKTckTPGfwZV4ZdAhVcP2lh9KUxJg2b5GkE7XbjKQ3YJnQ9z6D9ntLAlB+tP8g==", - "dev": true, "requires": { "websocket-driver": ">=0.5.1" } @@ -37706,6 +38577,15 @@ "bser": "2.1.1" } }, + "fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "dev": true, + "requires": { + "pend": "~1.2.0" + } + }, "fetch-retry": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/fetch-retry/-/fetch-retry-5.0.2.tgz", @@ -37780,7 +38660,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -37789,7 +38668,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", - "dev": true, "requires": { "debug": "2.6.9", "encodeurl": "~1.0.2", @@ -37804,7 +38682,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -37812,8 +38689,7 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, @@ -37821,7 +38697,6 @@ "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==", - "dev": true, "requires": { "commondir": "^1.0.1", "make-dir": "^3.0.2", @@ -37832,7 +38707,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-3.1.0.tgz", "integrity": "sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==", - "dev": true, "requires": { "semver": "^6.0.0" } @@ -37843,7 +38717,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, "requires": { "locate-path": "^5.0.0", "path-exists": "^4.0.0" @@ -37939,6 +38812,12 @@ "signal-exit": "^3.0.2" } }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha512-j0KLYPhm6zeac4lz3oJ3o65qvgQCcPubiyotZrXqEaG4hNagNYO8qdlUrX5vwqv9ohqeT/Z3j6+yW067yWWdUw==", + "dev": true + }, "fork-ts-checker-webpack-plugin": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-6.5.2.tgz", @@ -38070,8 +38949,7 @@ "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "dev": true + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" }, "fragment-cache": { "version": "0.2.1", @@ -38085,8 +38963,7 @@ "fresh": { "version": "0.5.2", "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", - "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", - "dev": true + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, "from2": { "version": "2.3.0", @@ -38148,14 +39025,12 @@ "fs-monkey": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/fs-monkey/-/fs-monkey-1.0.3.tgz", - "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==", - "dev": true + "integrity": "sha512-cybjIfiiE+pTWicSCLFHSrXZ6EilF30oh91FDP9S2B051prEa7QWfrVTQm10/dDpswBDXZugPa1Ogu8Yh+HV0Q==" }, "fs-readdir-recursive": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz", - "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==", - "dev": true + "integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==" }, "fs-write-stream-atomic": { "version": "1.0.10", @@ -38198,21 +39073,18 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "fsevents": { "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" }, "function.prototype.name": { "version": "1.1.5", @@ -38258,8 +39130,7 @@ "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true + "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==" }, "get-caller-file": { "version": "2.0.5", @@ -38271,7 +39142,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "dev": true, "requires": { "function-bind": "^1.1.1", "has": "^1.0.3", @@ -38294,8 +39164,7 @@ "get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true + "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==" }, "get-symbol-description": { "version": "1.0.0", @@ -38313,6 +39182,24 @@ "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true }, + "getos": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/getos/-/getos-3.2.1.tgz", + "integrity": "sha512-U56CfOK17OKgTVqozZjUKNdkfEv6jk5WISBJ8SHoagjE6L69zOwl3Z+O8myjY9MEW3i2HPWQBt/LTbCgcC973Q==", + "dev": true, + "requires": { + "async": "^3.2.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha512-0fzj9JxOLfJ+XGLhR8ze3unN0KZCgZwiSSDz168VERjK8Wl8kVSdcu2kspd4s4wtAa1y/qrVRiAA0WclVsu0ng==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, "github-slugger": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/github-slugger/-/github-slugger-1.4.0.tgz", @@ -38323,7 +39210,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -38337,7 +39223,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -38354,8 +39239,7 @@ "glob-to-regexp": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true + "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==" }, "global": { "version": "4.4.0", @@ -38367,6 +39251,15 @@ "process": "^0.11.10" } }, + "global-dirs": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/global-dirs/-/global-dirs-3.0.0.tgz", + "integrity": "sha512-v8ho2DS5RiCjftj1nD9NmnfaOzTdud7RRnVd9kFNOjqZbISlx5DQ+OrTkywgd0dIt7oFCvKetZSHoHcP3sDdiA==", + "dev": true, + "requires": { + "ini": "2.0.0" + } + }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", @@ -38406,8 +39299,7 @@ "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true + "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==" }, "graphql": { "version": "16.5.0", @@ -38418,8 +39310,7 @@ "handle-thing": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", - "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", - "dev": true + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==" }, "handlebars": { "version": "4.7.7", @@ -38438,7 +39329,6 @@ "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, "requires": { "function-bind": "^1.1.1" } @@ -38478,7 +39368,6 @@ "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, "requires": { "get-intrinsic": "^1.1.1" } @@ -38486,8 +39375,7 @@ "has-symbols": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true + "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" }, "has-tostringtag": { "version": "1.0.0", @@ -38673,8 +39561,7 @@ "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==" }, "headers-polyfill": { "version": "3.0.7", @@ -38725,7 +39612,6 @@ "version": "2.1.6", "resolved": "https://registry.npmjs.org/hpack.js/-/hpack.js-2.1.6.tgz", "integrity": "sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==", - "dev": true, "requires": { "inherits": "^2.0.1", "obuf": "^1.0.0", @@ -38737,7 +39623,6 @@ "version": "2.3.7", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "dev": true, "requires": { "core-util-is": "~1.0.0", "inherits": "~2.0.3", @@ -38752,7 +39637,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "dev": true, "requires": { "safe-buffer": "~5.1.0" } @@ -38762,8 +39646,7 @@ "html-entities": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.3.3.tgz", - "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==", - "dev": true + "integrity": "sha512-DV5Ln36z34NNTDgnz0EWGBLZENelNAtkiFA4kyNOG2tDI6Mz1uSWiq1wAKdyjnJwyDiDO7Fa2SO1CTxPXL8VxA==" }, "html-escaper": { "version": "2.0.2", @@ -38775,7 +39658,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", "integrity": "sha512-YXxSlJBZTP7RS3tWnQw74ooKa6L9b9i9QYXY21eUEvhZ3u9XLfv6OnFsQq6RxkhHygsaUMvYsZRV5rU/OVNZxw==", - "dev": true, "requires": { "camel-case": "^4.1.2", "clean-css": "^5.2.2", @@ -38789,8 +39671,7 @@ "commander": { "version": "8.3.0", "resolved": "https://registry.npmjs.org/commander/-/commander-8.3.0.tgz", - "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==", - "dev": true + "integrity": "sha512-OkTL9umf+He2DZkUq8f8J9of7yL6RJKI24dVITBmNfZBmri9zYZQrKkuXiKhyfPSu8tUhnVBB1iKXevvnlR4Ww==" } } }, @@ -38810,7 +39691,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-5.5.0.tgz", "integrity": "sha512-sy88PC2cRTVxvETRgUHFrL4No3UxvcH8G1NepGhqaTT+GXN2kTamqasot0inS5hXeg1cMbFDt27zzo9p35lZVw==", - "dev": true, "requires": { "@types/html-minifier-terser": "^6.0.0", "html-minifier-terser": "^6.0.2", @@ -38823,7 +39703,6 @@ "version": "6.1.0", "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-6.1.0.tgz", "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", - "dev": true, "requires": { "domelementtype": "^2.0.1", "domhandler": "^4.0.0", @@ -38834,14 +39713,12 @@ "http-deceiver": { "version": "1.2.7", "resolved": "https://registry.npmjs.org/http-deceiver/-/http-deceiver-1.2.7.tgz", - "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==", - "dev": true + "integrity": "sha512-LmpOGxTfbpgtGVxJrj5k7asXHCgNZp5nLfp+hWc8QQRqtb7fUy6kRY3BO1h9ddF6yIPYUARgxGOwB42DnxIaNw==" }, "http-errors": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "dev": true, "requires": { "depd": "2.0.0", "inherits": "2.0.4", @@ -38853,14 +39730,12 @@ "http-parser-js": { "version": "0.5.8", "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", - "dev": true + "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==" }, "http-proxy": { "version": "1.18.1", "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", - "dev": true, "requires": { "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", @@ -38871,7 +39746,6 @@ "version": "2.0.6", "resolved": "https://registry.npmjs.org/http-proxy-middleware/-/http-proxy-middleware-2.0.6.tgz", "integrity": "sha512-ya/UeJ6HVBYxrgYotAZo1KvPWlgB48kUJLDePFeneHsVujFaW5WNj2NgWCAE//B1Dl02BIfYlpNgBy8Kf8Rjmw==", - "dev": true, "requires": { "@types/http-proxy": "^1.17.8", "http-proxy": "^1.18.1", @@ -38880,6 +39754,17 @@ "micromatch": "^4.0.2" } }, + "http-signature": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.3.6.tgz", + "integrity": "sha512-3adrsD6zqo4GsTqtO7FyrejHNv+NgiIfAfv68+jVlFmSr9OGy7zrxONceFRLKvnnZA5jbxQBX1u9PpB6Wi32Gw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^2.0.2", + "sshpk": "^1.14.1" + } + }, "https-browserify": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz", @@ -38889,14 +39774,12 @@ "human-signals": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true + "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==" }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -38905,7 +39788,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true, "requires": {} }, "ieee754": { @@ -38929,14 +39811,12 @@ "immutable": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.1.0.tgz", - "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==", - "dev": true + "integrity": "sha512-oNkuqVTA8jqG1Q6c+UglTOD1xhC1BtjKI7XkCXRkZHrN5m18/XsnUp8Q89GkQO/z+0WjonSvl0FLhDYftp46nQ==" }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -38945,8 +39825,7 @@ "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" } } }, @@ -38954,7 +39833,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, "requires": { "pkg-dir": "^4.2.0", "resolve-cwd": "^3.0.0" @@ -38982,7 +39860,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -38991,7 +39868,12 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "ini": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ini/-/ini-2.0.0.tgz", + "integrity": "sha512-7PnF4oN3CvZF23ADhA5wRaYEQpJ8qygSkbtTXWBeXWXmEVRXK+1ITciHWwHhsjv1TmW0MgacIv6hEi5pX5NQdA==", "dev": true }, "inline-style-parser": { @@ -39088,8 +39970,7 @@ "interpret": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true + "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==" }, "ip": { "version": "2.0.0", @@ -39100,8 +39981,7 @@ "ipaddr.js": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz", - "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==", - "dev": true + "integrity": "sha512-1qTgH9NG+IIJ4yfKs2e6Pp1bZg8wbDbKHT21HrLIeYBTRLgMYKnMTPAuI3Lcs61nfx5h1xlXnbJtH1kX5/d/ng==" }, "is-absolute-url": { "version": "3.0.3", @@ -39147,8 +40027,7 @@ "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" }, "is-bigint": { "version": "1.0.4", @@ -39163,7 +40042,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -39203,7 +40081,6 @@ "version": "2.9.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, "requires": { "has": "^1.0.3" } @@ -39246,8 +40123,7 @@ "is-docker": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-2.2.1.tgz", - "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", - "dev": true + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" }, "is-dom": { "version": "1.1.0", @@ -39271,8 +40147,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "is-finite": { "version": "1.1.0", @@ -39297,7 +40172,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -39308,6 +40182,16 @@ "integrity": "sha512-gyPJuv83bHMpocVYoqof5VDiZveEoGoFL8m3BXNb2VW8Xs+rz9kqO8LOQ5DH6EsuvilT1ApazU0pyl+ytbPtlw==", "dev": true }, + "is-installed-globally": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/is-installed-globally/-/is-installed-globally-0.4.0.tgz", + "integrity": "sha512-iwGqO3J21aaSkC7jWnHP/difazwS7SFeIqxv6wEtLU8Y5KlzFTjyqcSIT0d8s4+dDhKytsk9PJZ2BkS5eZwQRQ==", + "dev": true, + "requires": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + } + }, "is-interactive": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", @@ -39335,8 +40219,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-number-object": { "version": "1.0.7", @@ -39353,17 +40236,21 @@ "integrity": "sha512-2rRIahhZr2UWb45fIOuvZGpFtz0TyOZLf32KxBbSoUCeZR495zCKlWUKKUByk3geS2eAs7ZAABt0Y/Rx0GiQGA==", "dev": true }, + "is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true + }, "is-plain-obj": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-3.0.0.tgz", - "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==", - "dev": true + "integrity": "sha512-gwsOE28k+23GP1B6vFl1oVh/WOzmawBrKwo5Ev6wMKzPkaXaCDIQKzLnvsA42DRlbVTWorkgTKIviAKCWkfUwA==" }, "is-plain-object": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, "requires": { "isobject": "^3.0.1" } @@ -39396,8 +40283,7 @@ "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true + "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==" }, "is-string": { "version": "1.0.7", @@ -39473,7 +40359,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", - "dev": true, "requires": { "is-docker": "^2.0.0" } @@ -39481,20 +40366,17 @@ "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "dev": true + "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==" }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "isobject": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true + "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==" }, "isomorphic-unfetch": { "version": "3.1.0", @@ -39506,6 +40388,12 @@ "unfetch": "^4.2.0" } }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha512-Yljz7ffyPbrLpLngrMtZ7NduUgVvi6wG9RJ9IUcyCd59YQ911PBJphODUcbOVbqYfxe1wuYf/LJ8PauMRwsM/g==", + "dev": true + }, "istanbul-lib-coverage": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.0.tgz", @@ -39806,7 +40694,6 @@ "version": "27.5.1", "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, "requires": { "@types/node": "*", "merge-stream": "^2.0.0", @@ -39816,14 +40703,12 @@ "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" }, "supports-color": { "version": "8.1.1", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, "requires": { "has-flag": "^4.0.0" } @@ -39856,6 +40741,12 @@ "argparse": "^2.0.1" } }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha512-UVU9dibq2JcFWxQPA6KCqj5O42VOmAY3zQUfEKxU0KpTGXwNoCjkX1e13eHNvw/xPynt6pU0rZ1htjWTNTSXsg==", + "dev": true + }, "jsesc": { "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", @@ -39870,14 +40761,18 @@ "json-parse-even-better-errors": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, + "json-schema": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.4.0.tgz", + "integrity": "sha512-es94M3nTIfsEPisRafak+HDLfHXnKBhV3vU5eqPcS3flIWqcxJWgXHXiey3YrpaNsanY5ei1VoYEbOzijuq9BA==", "dev": true }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", @@ -39885,11 +40780,16 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha512-ZClg6AaYvamvYEE82d3Iyd3vSSIjQ+odgjaTzRuO3s7toCdFKczob2i0zCh7JE8kWn17yvAWhUVxvqGwUalsRA==", + "dev": true + }, "json5": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.1.tgz", - "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==", - "dev": true + "integrity": "sha512-1hqLFMSrGHRHxav9q9gNjJ5EXznIxGVO09xQRrwplcS8qs28pZ8s8hupZAmqDwZUmVZ2Qb2jnyPOWcDH8m8dlA==" }, "jsonfile": { "version": "6.1.0", @@ -39901,6 +40801,18 @@ "universalify": "^2.0.0" } }, + "jsprim": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-2.0.2.tgz", + "integrity": "sha512-gqXddjPqQ6G40VdnI6T6yObEC+pDNvyP95wdQhkWkg7crHH3km5qP1FsOXEkzEQwnz6gz5qGTn1c2Y52wP3OyQ==", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.4.0", + "verror": "1.10.0" + } + }, "jsx-ast-utils": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.1.tgz", @@ -39920,8 +40832,7 @@ "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true + "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==" }, "kleur": { "version": "3.0.3", @@ -39932,7 +40843,12 @@ "klona": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/klona/-/klona-2.0.5.tgz", - "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==", + "integrity": "sha512-pJiBpiXMbt7dkzXe8Ghj/u4FfXOOa98fPW+bihOJ4SjnoijweJrNThJfd3ifXpXhREjpoF2mZVH1GfS9LV3kHQ==" + }, + "lazy-ass": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lazy-ass/-/lazy-ass-1.6.0.tgz", + "integrity": "sha512-cc8oEVoctTvsFZ/Oje/kGnHbpWHYBe8IAJe4C0QNc3t8uM/0Y8+erSz/7Y1ALuXTEZTMvxXwO6YbX1ey3ujiZw==", "dev": true }, "lazy-universal-dotenv": { @@ -39961,8 +40877,34 @@ "lines-and-columns": { "version": "1.2.4", "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "listr2": { + "version": "3.14.0", + "resolved": "https://registry.npmjs.org/listr2/-/listr2-3.14.0.tgz", + "integrity": "sha512-TyWI8G99GX9GjE54cJ+RrNMcIFBfwMPxc3XTFiAYGN4s10hWROGtOg7+O6u6LE3mNkyld7RSLE6nrKBvTfcs3g==", + "dev": true, + "requires": { + "cli-truncate": "^2.1.0", + "colorette": "^2.0.16", + "log-update": "^4.0.0", + "p-map": "^4.0.0", + "rfdc": "^1.3.0", + "rxjs": "^7.5.1", + "through": "^2.3.8", + "wrap-ansi": "^7.0.0" + }, + "dependencies": { + "p-map": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", + "integrity": "sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==", + "dev": true, + "requires": { + "aggregate-error": "^3.0.0" + } + } + } }, "load-json-file": { "version": "1.1.0", @@ -40000,14 +40942,12 @@ "loader-runner": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true + "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==" }, "loader-utils": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.2.tgz", "integrity": "sha512-TM57VeHptv569d/GKh6TAYdzKblwDNiumOdkFnejjD0XwTH87K90w3O7AiJRqdQoXygvi1VQTJTLGhJl7WqA7A==", - "dev": true, "requires": { "big.js": "^5.2.2", "emojis-list": "^3.0.0", @@ -40018,7 +40958,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, "requires": { "p-locate": "^4.1.0" } @@ -40031,8 +40970,7 @@ "lodash.debounce": { "version": "4.0.8", "resolved": "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz", - "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==", - "dev": true + "integrity": "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow==" }, "lodash.merge": { "version": "4.6.2", @@ -40040,6 +40978,12 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, + "lodash.once": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", + "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", @@ -40107,6 +41051,66 @@ } } }, + "log-update": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-4.0.0.tgz", + "integrity": "sha512-9fkkDevMefjg0mmzWFBW8YkFP91OrizzkW3diF7CpG+S2EYdy4+TVfGwz1zeF8x7hCx1ovSPTOE9Ngib74qqUg==", + "dev": true, + "requires": { + "ansi-escapes": "^4.3.0", + "cli-cursor": "^3.1.0", + "slice-ansi": "^4.0.0", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "slice-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", + "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + } + } + }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", @@ -40115,6 +41119,11 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lottie-web": { + "version": "5.9.6", + "resolved": "https://registry.npmjs.org/lottie-web/-/lottie-web-5.9.6.tgz", + "integrity": "sha512-JFs7KsHwflugH5qIXBpB4905yC1Sub2MZWtl/elvO/QC6qj1ApqbUZJyjzJseJUtVpgiDaXQLjBlIJGS7UUUXA==" + }, "loud-rejection": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", @@ -40130,7 +41139,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", - "dev": true, "requires": { "tslib": "^2.0.3" } @@ -40149,7 +41157,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -40164,7 +41171,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==", - "dev": true, "requires": { "pify": "^4.0.1", "semver": "^5.6.0" @@ -40173,8 +41179,7 @@ "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" } } }, @@ -40284,8 +41289,7 @@ "mdn-data": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.14.tgz", - "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==", - "dev": true + "integrity": "sha512-dn6wd0uw5GsdswPFfsgMp5NSB0/aDe6fK94YJV/AJDYXL6HVLWBsxeq7js7Ad+mU2K9LAlwpk6kN2D5mwCPVow==" }, "mdurl": { "version": "1.0.1", @@ -40296,8 +41300,7 @@ "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "dev": true + "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, "mem": { "version": "8.1.1", @@ -40321,7 +41324,6 @@ "version": "3.4.7", "resolved": "https://registry.npmjs.org/memfs/-/memfs-3.4.7.tgz", "integrity": "sha512-ygaiUSNalBX85388uskeCyhSAoOSgzBbtVCr9jA2RROssFL9Q19/ZXFqS+2Th2sr1ewNIWgFdLzLC3Yl1Zv+lw==", - "dev": true, "requires": { "fs-monkey": "^1.0.3" } @@ -40458,14 +41460,12 @@ "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", - "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", - "dev": true + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" }, "merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==" }, "merge2": { "version": "1.4.1", @@ -40476,8 +41476,7 @@ "methods": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true + "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" }, "microevent.ts": { "version": "0.1.1", @@ -40489,7 +41488,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "requires": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -40516,8 +41514,7 @@ "mime": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "dev": true + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" }, "mime-db": { "version": "1.52.0", @@ -40535,8 +41532,7 @@ "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" }, "min-document": { "version": "2.19.0", @@ -40556,8 +41552,7 @@ "minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", - "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==", - "dev": true + "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==" }, "minimalistic-crypto-utils": { "version": "1.0.1", @@ -40569,7 +41564,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -40827,7 +41821,6 @@ "version": "7.2.5", "resolved": "https://registry.npmjs.org/multicast-dns/-/multicast-dns-7.2.5.tgz", "integrity": "sha512-2eznPJP8z2BFLX50tf0LuODrpINqP1RVIm/CObbTcBRITQgmC/TjcREF1NeTBzIcR5XO/ukWo+YHOjBbFwIupg==", - "dev": true, "requires": { "dns-packet": "^5.2.2", "thunky": "^1.0.2" @@ -40849,8 +41842,7 @@ "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", - "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==", - "dev": true + "integrity": "sha512-MqBkQh/OHTS2egovRtLk45wEyNXwF+cokD+1YPf9u5VfJiRdAiRwB2froX5Co9Rh20xs4siNPm8naNotSD6RBw==" }, "nanomatch": { "version": "1.2.13", @@ -40880,14 +41872,12 @@ "negotiator": { "version": "0.6.3", "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "dev": true + "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==" }, "neo-async": { "version": "2.6.2", "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "nested-error-stacks": { "version": "2.1.1", @@ -40905,7 +41895,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/no-case/-/no-case-3.0.4.tgz", "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", - "dev": true, "requires": { "lower-case": "^2.0.2", "tslib": "^2.0.3" @@ -40932,8 +41921,7 @@ "node-forge": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", - "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", - "dev": true + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==" }, "node-int64": { "version": "0.4.0", @@ -41013,8 +42001,7 @@ "node-releases": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true + "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==" }, "normalize-package-data": { "version": "2.5.0", @@ -41039,8 +42026,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -41052,7 +42038,6 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, "requires": { "path-key": "^3.0.0" } @@ -41073,7 +42058,6 @@ "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==", - "dev": true, "requires": { "boolbase": "^1.0.0" } @@ -41167,14 +42151,12 @@ "object-inspect": { "version": "1.12.2", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==", - "dev": true + "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true + "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==" }, "object-visit": { "version": "1.0.1", @@ -41189,7 +42171,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz", "integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==", - "dev": true, "requires": { "call-bind": "^1.0.0", "define-properties": "^1.1.3", @@ -41270,14 +42251,12 @@ "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", - "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==", - "dev": true + "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, "on-finished": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "dev": true, "requires": { "ee-first": "1.1.1" } @@ -41285,14 +42264,12 @@ "on-headers": { "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==", - "dev": true + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "requires": { "wrappy": "1" } @@ -41301,7 +42278,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, "requires": { "mimic-fn": "^2.1.0" } @@ -41310,7 +42286,6 @@ "version": "8.4.0", "resolved": "https://registry.npmjs.org/open/-/open-8.4.0.tgz", "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", - "dev": true, "requires": { "define-lazy-prop": "^2.0.0", "is-docker": "^2.1.1", @@ -41418,6 +42393,12 @@ "integrity": "sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==", "dev": true }, + "ospath": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/ospath/-/ospath-1.2.2.tgz", + "integrity": "sha512-o6E5qJV5zkAbIDNhGSIlyOhScKXgQrSRMilfph0clDfM0nEnBOlKlH4sWDmG95BW/CvwNz0vmm7dJVtU2KlMiA==", + "dev": true + }, "outvariant": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.3.0.tgz", @@ -41483,7 +42464,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, "requires": { "p-try": "^2.0.0" } @@ -41492,7 +42472,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, "requires": { "p-limit": "^2.2.0" } @@ -41510,7 +42489,6 @@ "version": "4.6.2", "resolved": "https://registry.npmjs.org/p-retry/-/p-retry-4.6.2.tgz", "integrity": "sha512-312Id396EbJdvRONlngUx0NydfrIQ5lsYu0znKVUzVvArzEIt08V1qhtyESbGVd1FGX7UKtiFp5uwKZdM8wIuQ==", - "dev": true, "requires": { "@types/retry": "0.12.0", "retry": "^0.13.1" @@ -41528,8 +42506,7 @@ "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" }, "pako": { "version": "1.0.11", @@ -41578,7 +42555,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/param-case/-/param-case-3.0.4.tgz", "integrity": "sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==", - "dev": true, "requires": { "dot-case": "^3.0.4", "tslib": "^2.0.3" @@ -41588,7 +42564,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "requires": { "callsites": "^3.0.0" } @@ -41624,7 +42599,6 @@ "version": "5.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "error-ex": "^1.3.1", @@ -41641,14 +42615,12 @@ "parseurl": { "version": "1.3.3", "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "dev": true + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" }, "pascal-case": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/pascal-case/-/pascal-case-3.1.2.tgz", "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", - "dev": true, "requires": { "no-case": "^3.0.4", "tslib": "^2.0.3" @@ -41675,38 +42647,32 @@ "path-exists": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, "path-key": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" }, "path-parse": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "path-to-regexp": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", - "dev": true + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" }, "path-type": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" }, "pbkdf2": { "version": "3.1.2", @@ -41721,11 +42687,22 @@ "sha.js": "^2.4.8" } }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==", + "dev": true + }, "picocolors": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" }, "picomatch": { "version": "2.3.1", @@ -41735,8 +42712,7 @@ "pify": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true + "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==" }, "pinkie": { "version": "2.0.4", @@ -41765,7 +42741,6 @@ "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, "requires": { "find-up": "^4.0.0" } @@ -41798,7 +42773,6 @@ "version": "8.4.14", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.14.tgz", "integrity": "sha512-E398TUmfAYFPBSdzgeieK2Y1+1cpdxJx8yXbK/m57nRhKSmk1GB2tO4lbLBtlkfPQTDKfe4Xqv1ASWPpayPEig==", - "dev": true, "requires": { "nanoid": "^3.3.4", "picocolors": "^1.0.0", @@ -41860,14 +42834,12 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true, "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.0.tgz", "integrity": "sha512-sT7ihtmGSF9yhm6ggikHdV0hlziDTX7oFoXtuVWeDd3hHObNkcHRo9V3yg7vCAY7cONyxJC/XXCmmiHHcvX7bQ==", - "dev": true, "requires": { "icss-utils": "^5.0.0", "postcss-selector-parser": "^6.0.2", @@ -41878,7 +42850,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.0.0.tgz", "integrity": "sha512-hncihwFA2yPath8oZ15PZqvWGkWf+XUfQgUGamS4LqoP1anQLOsOJw0vr7J7IwLpoY9fatA2qiGUGmuZL0Iqlg==", - "dev": true, "requires": { "postcss-selector-parser": "^6.0.4" } @@ -41887,7 +42858,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz", "integrity": "sha512-RDxHkAiEGI78gS2ofyvCsu7iycRv7oqw5xMWn9iMoR0N/7mf9D50ecQqUo5BZ9Zh2vH4bCUR/ktCqbB9m8vJjQ==", - "dev": true, "requires": { "icss-utils": "^5.0.0" } @@ -41896,7 +42866,6 @@ "version": "6.0.10", "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.10.tgz", "integrity": "sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==", - "dev": true, "requires": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -41928,11 +42897,16 @@ "fast-diff": "^1.1.2" } }, + "pretty-bytes": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/pretty-bytes/-/pretty-bytes-5.6.0.tgz", + "integrity": "sha512-FFw039TmrBqFK8ma/7OL3sDz/VytdtJr044/QUJtH0wK9lb9jLq9tJyIxUwtQJHwar2BqtiA4iCWSwo9JLkzFg==", + "dev": true + }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", "integrity": "sha512-AoJ5YMAcXKYxKhuJGdcvse+Voc6v1RgnsR3nWcYU7q4t6z0Q6T86sv5Zq8VIRbOWWFpvdGE83LtdSMNd+6Y0xw==", - "dev": true, "requires": { "lodash": "^4.17.20", "renderkid": "^3.0.0" @@ -41984,8 +42958,7 @@ "process-nextick-args": { "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==", - "dev": true + "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "promise-inflight": { "version": "1.0.1", @@ -42052,7 +43025,6 @@ "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==", - "dev": true, "requires": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" @@ -42061,17 +43033,28 @@ "ipaddr.js": { "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==", - "dev": true + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" } } }, + "proxy-from-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.0.0.tgz", + "integrity": "sha512-F2JHgJQ1iqwnHDcQjVBsq3n/uoaFL+iPW/eAeL7kVxy/2RrWaN4WroKjjvbsoRtv0ftelNyC01bjRhn/bhcf4A==", + "dev": true + }, "prr": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", "integrity": "sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==", "dev": true }, + "psl": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", + "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", + "dev": true + }, "public-encrypt": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz", @@ -42130,14 +43113,12 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "qs": { "version": "6.10.3", "resolved": "https://registry.npmjs.org/qs/-/qs-6.10.3.tgz", "integrity": "sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==", - "dev": true, "requires": { "side-channel": "^1.0.4" } @@ -42170,7 +43151,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, "requires": { "safe-buffer": "^5.1.0" } @@ -42188,14 +43168,12 @@ "range-parser": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "dev": true + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, "raw-body": { "version": "2.5.1", "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.1.tgz", "integrity": "sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==", - "dev": true, "requires": { "bytes": "3.1.2", "http-errors": "2.0.0", @@ -42206,8 +43184,7 @@ "bytes": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" } } }, @@ -42397,7 +43374,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "dev": true, "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -42408,7 +43384,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -42417,7 +43392,6 @@ "version": "0.7.1", "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, "requires": { "resolve": "^1.9.0" } @@ -42477,14 +43451,12 @@ "regenerate": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.2.tgz", - "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==", - "dev": true + "integrity": "sha512-zrceR/XhGYU/d/opr2EKO7aRHUeiBI8qjtfHqADTwZd6Szfy16la6kqD0MIUs5z5hx6AaKa+PixpPrR289+I0A==" }, "regenerate-unicode-properties": { "version": "10.0.1", "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-10.0.1.tgz", "integrity": "sha512-vn5DU6yg6h8hP/2OkQo3K7uVILvY4iu0oI4t3HFa81UPkhGJwkRwM10JEc3upjdhHjs/k8GJY1sRBhk5sr69Bw==", - "dev": true, "requires": { "regenerate": "^1.4.2" } @@ -42498,7 +43470,6 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.15.0.tgz", "integrity": "sha512-LsrGtPmbYg19bcPHwdtmXwbW+TqNvtY4riE3P83foeHRroMbH6/2ddFBfab3t7kbzc7v7p4wbkIecHImqt0QNg==", - "dev": true, "requires": { "@babel/runtime": "^7.8.4" } @@ -42534,7 +43505,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-5.1.0.tgz", "integrity": "sha512-bb6hk+xWd2PEOkj5It46A16zFMs2mv86Iwpdu94la4S3sJ7C973h2dHpYKwIBGaWSO7cIRJ+UX0IeMaWcO4qwA==", - "dev": true, "requires": { "regenerate": "^1.4.2", "regenerate-unicode-properties": "^10.0.1", @@ -42547,14 +43517,12 @@ "regjsgen": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.6.0.tgz", - "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==", - "dev": true + "integrity": "sha512-ozE883Uigtqj3bx7OhL1KNbCzGyW2NQZPl6Hs09WTvCuZD5sTI4JY58bkbQWa/Y9hxIsvJ3M8Nbf7j54IqeZbA==" }, "regjsparser": { "version": "0.8.4", "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.8.4.tgz", "integrity": "sha512-J3LABycON/VNEu3abOviqGHuB/LOtOQj8SKmfP9anY5GfAVw/SPjwzSjxGjbZXIxbGfqTHtJw58C2Li/WkStmA==", - "dev": true, "requires": { "jsesc": "~0.5.0" }, @@ -42562,16 +43530,14 @@ "jsesc": { "version": "0.5.0", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", - "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==", - "dev": true + "integrity": "sha512-uZz5UnB7u4T9LvwmFqXii7pZSouaRPorGs5who1Ip7VO0wxanFvBL7GkM6dTHlgX+jhBApRetaWpnDabOeTcnA==" } } }, "relateurl": { "version": "0.2.7", "resolved": "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz", - "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==", - "dev": true + "integrity": "sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==" }, "remark-external-links": { "version": "8.0.0", @@ -42726,7 +43692,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/renderkid/-/renderkid-3.0.0.tgz", "integrity": "sha512-q/7VIQA8lmM1hF+jn+sFSPWGlMkSAeNYcPLmDQx2zzuiDfaLrOmumR8iaUKlenFgh0XRPIUeSPlH3A+AW3Z5pg==", - "dev": true, "requires": { "css-select": "^4.1.3", "dom-converter": "^0.2.0", @@ -42757,6 +43722,15 @@ "is-finite": "^1.0.0" } }, + "request-progress": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/request-progress/-/request-progress-3.0.0.tgz", + "integrity": "sha512-MnWzEHHaxHO2iWiQuHrUPBi/1WeBf5PkxQqNyNvLl9VAYSdXkP8tQ3pBSeCPD+yw0v0Aq1zosWLz0BdeXpWwZg==", + "dev": true, + "requires": { + "throttleit": "^1.0.0" + } + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -42766,20 +43740,17 @@ "require-from-string": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true + "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==" }, "requires-port": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", - "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", - "dev": true + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" }, "resolve": { "version": "1.22.1", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, "requires": { "is-core-module": "^2.9.0", "path-parse": "^1.0.7", @@ -42790,7 +43761,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, "requires": { "resolve-from": "^5.0.0" } @@ -42798,8 +43768,7 @@ "resolve-from": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==" }, "resolve-url": { "version": "0.2.1", @@ -42826,8 +43795,7 @@ "retry": { "version": "0.13.1", "resolved": "https://registry.npmjs.org/retry/-/retry-0.13.1.tgz", - "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==", - "dev": true + "integrity": "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==" }, "reusify": { "version": "1.0.4", @@ -42835,11 +43803,16 @@ "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", "dev": true }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==", + "dev": true + }, "rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "requires": { "glob": "^7.1.3" } @@ -42904,8 +43877,7 @@ "safe-buffer": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", - "dev": true + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" }, "safe-regex": { "version": "1.1.0", @@ -42919,8 +43891,7 @@ "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "sane": { "version": "4.1.0", @@ -43167,7 +44138,6 @@ "version": "1.53.0", "resolved": "https://registry.npmjs.org/sass/-/sass-1.53.0.tgz", "integrity": "sha512-zb/oMirbKhUgRQ0/GFz8TSAwRq2IlR29vOUJZOx0l8sV+CkHUfHa4u5nqrG+1VceZp7Jfj59SVW9ogdhTvJDcQ==", - "dev": true, "requires": { "chokidar": ">=3.0.0 <4.0.0", "immutable": "^4.0.0", @@ -43178,7 +44148,6 @@ "version": "13.0.2", "resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-13.0.2.tgz", "integrity": "sha512-BbiqbVmbfJaWVeOOAu2o7DhYWtcNmTfvroVgFXa6k2hHheMxNAeDHLNoDy/Q5aoaVlz0LH+MbMktKwm9vN/j8Q==", - "dev": true, "requires": { "klona": "^2.0.4", "neo-async": "^2.6.2" @@ -43196,7 +44165,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, "requires": { "@types/json-schema": "^7.0.8", "ajv": "^6.12.5", @@ -43206,14 +44174,12 @@ "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", - "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==", - "dev": true + "integrity": "sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==" }, "selfsigned": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/selfsigned/-/selfsigned-2.0.1.tgz", "integrity": "sha512-LmME957M1zOsUhG+67rAjKfiWFox3SBxE/yymatMZsAx+oMrJ0YQ8AToOnyCm7xbeg2ep37IHLxdu0o2MavQOQ==", - "dev": true, "requires": { "node-forge": "^1" } @@ -43221,14 +44187,12 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "send": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", - "dev": true, "requires": { "debug": "2.6.9", "depd": "2.0.0", @@ -43249,7 +44213,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" }, @@ -43257,16 +44220,14 @@ "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, "ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" } } }, @@ -43274,7 +44235,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, "requires": { "randombytes": "^2.1.0" } @@ -43310,7 +44270,6 @@ "version": "1.9.1", "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.9.1.tgz", "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", - "dev": true, "requires": { "accepts": "~1.3.4", "batch": "0.6.1", @@ -43325,7 +44284,6 @@ "version": "2.6.9", "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", - "dev": true, "requires": { "ms": "2.0.0" } @@ -43333,14 +44291,12 @@ "depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", - "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "dev": true + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" }, "http-errors": { "version": "1.6.3", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", - "dev": true, "requires": { "depd": "~1.1.2", "inherits": "2.0.3", @@ -43351,26 +44307,22 @@ "inherits": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", - "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==", - "dev": true + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "dev": true + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, "setprototypeof": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", - "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", - "dev": true + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" }, "statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" } } }, @@ -43378,7 +44330,6 @@ "version": "1.15.0", "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", - "dev": true, "requires": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -43436,8 +44387,7 @@ "setprototypeof": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "dev": true + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" }, "sha.js": { "version": "2.4.11", @@ -43453,7 +44403,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, "requires": { "kind-of": "^6.0.2" } @@ -43467,7 +44416,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "requires": { "shebang-regex": "^3.0.0" } @@ -43475,14 +44423,12 @@ "shebang-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" }, "side-channel": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, "requires": { "call-bind": "^1.0.0", "get-intrinsic": "^1.0.2", @@ -43492,8 +44438,7 @@ "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==" }, "sisteransi": { "version": "1.0.5", @@ -43504,8 +44449,44 @@ "slash": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-2.0.0.tgz", - "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==", - "dev": true + "integrity": "sha512-ZYKh3Wh2z1PpEXWr0MpSBZ0V6mZHAQfYevttO11c51CaWjGTaadiKZ+wVt1PbMlDV5qhMFslpZCemhwOK7C89A==" + }, + "slice-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-3.0.0.tgz", + "integrity": "sha512-pSyv7bSTC7ig9Dcgbw9AuRNUb5k5V6oDudjZoMBSr13qpLBG7tB+zgCkARjq7xIUgdz5P1Qe8u+rSGdouOOIyQ==", + "dev": true, + "requires": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "requires": { + "color-convert": "^2.0.1" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + } + } }, "snapdragon": { "version": "0.8.2", @@ -43685,7 +44666,6 @@ "version": "0.3.24", "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.24.tgz", "integrity": "sha512-GJgLTZ7vYb/JtPSSZ10hsOYIvEYsjbNU+zPdIHcUaWVNUEPivzxku31865sSSud0Da0W4lEeOPlmw93zLQchuQ==", - "dev": true, "requires": { "faye-websocket": "^0.11.3", "uuid": "^8.3.2", @@ -43701,14 +44681,12 @@ "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" }, "source-map-js": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", - "dev": true + "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==" }, "source-map-resolve": { "version": "0.5.3", @@ -43727,7 +44705,6 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, "requires": { "buffer-from": "^1.0.0", "source-map": "^0.6.0" @@ -43781,7 +44758,6 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", - "dev": true, "requires": { "debug": "^4.1.0", "handle-thing": "^2.0.0", @@ -43794,7 +44770,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdy-transport/-/spdy-transport-3.0.0.tgz", "integrity": "sha512-hsLVFE5SjA6TCisWeJXFKniGGOpBgMLmerfO2aCyCU5s7nJ/rpAepqmFifv/GCbSbueEeAJJnmSQ2rKC/g8Fcw==", - "dev": true, "requires": { "debug": "^4.1.0", "detect-node": "^2.0.4", @@ -43819,6 +44794,23 @@ "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", "dev": true }, + "sshpk": { + "version": "1.17.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.17.0.tgz", + "integrity": "sha512-/9HIEs1ZXGhSPE8X6Ccm7Nam1z8KcoCqPdI7ecm1N33EzAetWahvQWVqLZtaZQ+IDKX4IyA2o0gBzqIMkAagHQ==", + "dev": true, + "requires": { + "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" + } + }, "ssri": { "version": "8.0.1", "resolved": "https://registry.npmjs.org/ssri/-/ssri-8.0.1.tgz", @@ -43831,8 +44823,7 @@ "stable": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz", - "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==", - "dev": true + "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==" }, "stackframe": { "version": "1.3.4", @@ -43933,8 +44924,7 @@ "statuses": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "dev": true + "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==" }, "store2": { "version": "2.13.2", @@ -44046,7 +45036,6 @@ "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, "requires": { "safe-buffer": "~5.2.0" }, @@ -44054,8 +45043,7 @@ "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" } } }, @@ -44134,7 +45122,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "requires": { "ansi-regex": "^5.0.1" } @@ -44158,8 +45145,7 @@ "strip-final-newline": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true + "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==" }, "strip-indent": { "version": "3.0.0", @@ -44180,7 +45166,6 @@ "version": "3.3.1", "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-3.3.1.tgz", "integrity": "sha512-GPcQ+LDJbrcxHORTRes6Jy2sfvK2kS6hpSfI/fXhPt+spVzxF6LJ1dHLN9zIGmVaaP044YKaIatFaufENRiDoQ==", - "dev": true, "requires": {} }, "style-to-object": { @@ -44220,20 +45205,17 @@ "supports-preserve-symlinks-flag": { "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==", - "dev": true + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, "svg-parser": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/svg-parser/-/svg-parser-2.0.4.tgz", - "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==", - "dev": true + "integrity": "sha512-e4hG1hRwoOdRb37cIMSgzNsxyzKfayW6VOflrwvR+/bzrkyxY/31WkbgnQpgtrNp1SdpJvpUAGTa/ZoiPNDuRQ==" }, "svgo": { "version": "2.8.0", "resolved": "https://registry.npmjs.org/svgo/-/svgo-2.8.0.tgz", "integrity": "sha512-+N/Q9kV1+F+UeWYoSiULYo4xYSDQlTgb+ayMobAXPwMnLvop7oxKMo9OzIrX5x3eS4L4f2UHhc9axXwY8DpChg==", - "dev": true, "requires": { "@trysound/sax": "0.2.0", "commander": "^7.2.0", @@ -44247,8 +45229,7 @@ "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" } } }, @@ -44273,8 +45254,7 @@ "tapable": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true + "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==" }, "tar": { "version": "6.1.11", @@ -44318,7 +45298,6 @@ "version": "5.14.1", "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.1.tgz", "integrity": "sha512-+ahUAE+iheqBTDxXhTisdA8hgvbEG1hHOQ9xmNjeUJSoi6DU/gMrKNcfZjHkyY6Alnuyc+ikYJaxxfHkT3+WuQ==", - "dev": true, "requires": { "@jridgewell/source-map": "^0.3.2", "acorn": "^8.5.0", @@ -44329,8 +45308,7 @@ "commander": { "version": "2.20.3", "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" } } }, @@ -44338,7 +45316,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.3.tgz", "integrity": "sha512-Fx60G5HNYknNTNQnzQ1VePRuu89ZVYWfjRAeT5rITuCY/1b08s49e5kSQwHDirKZWuoKOBRFS98EUUoZ9kLEwQ==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.7", "jest-worker": "^27.4.5", @@ -44364,6 +45341,12 @@ "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", "dev": true }, + "throttleit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz", + "integrity": "sha512-rkTVqu6IjfQ/6+uNuuc3sZek4CEYxTJom3IktzgdSxcZqdARuebbA/f4QmAxMQIxqq9ZLEUkSYqvuk1I6VKq4g==", + "dev": true + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -44409,8 +45392,7 @@ "thunky": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz", - "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==", - "dev": true + "integrity": "sha512-eHY7nBftgThBqOyHGVN+l8gF0BucP09fMo0oO/Lb0w1OF80dJv+lDVpXG60WMQvkcxAkNybKsrEIE3ZtKGmPrA==" }, "timers-browserify": { "version": "2.0.12", @@ -44489,7 +45471,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -44497,8 +45478,17 @@ "toidentifier": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "dev": true + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "tough-cookie": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", + "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", + "dev": true, + "requires": { + "psl": "^1.1.28", + "punycode": "^2.1.1" + } }, "tr46": { "version": "0.0.3", @@ -44546,8 +45536,7 @@ "tslib": { "version": "2.4.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.0.tgz", - "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==", - "dev": true + "integrity": "sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==" }, "tsutils": { "version": "3.21.0", @@ -44572,6 +45561,21 @@ "integrity": "sha512-JVa5ijo+j/sOoHGjw0sxw734b1LhBkQ3bvUGNdxnVXDCX81Yx7TFgnZygxrIIWn23hbfTaMYLwRmAxFyDuFmIw==", "dev": true }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", + "dev": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==", + "dev": true + }, "type-check": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", @@ -44591,7 +45595,6 @@ "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "dev": true, "requires": { "media-typer": "0.3.0", "mime-types": "~2.1.24" @@ -44615,8 +45618,7 @@ "typescript": { "version": "4.7.4", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.7.4.tgz", - "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==", - "dev": true + "integrity": "sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==" }, "uglify-js": { "version": "3.16.1", @@ -44656,14 +45658,12 @@ "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", - "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==", - "dev": true + "integrity": "sha512-yY5PpDlfVIU5+y/BSCxAJRBIS1Zc2dDG3Ujq+sR0U+JjUevW2JhocOF+soROYDSaAezOzOKuyyixhD6mBknSmQ==" }, "unicode-match-property-ecmascript": { "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==", - "dev": true, "requires": { "unicode-canonical-property-names-ecmascript": "^2.0.0", "unicode-property-aliases-ecmascript": "^2.0.0" @@ -44672,14 +45672,12 @@ "unicode-match-property-value-ecmascript": { "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==", - "dev": true + "integrity": "sha512-7Yhkc0Ye+t4PNYzOGKedDhXbYIBe1XEQYQxOPyhcXNMJ0WCABqqj6ckydd6pWRZTHV4GuCPKdBAUiMc60tsKVw==" }, "unicode-property-aliases-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-2.0.0.tgz", - "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==", - "dev": true + "integrity": "sha512-5Zfuy9q/DFr4tfO7ZPeVXb1aPoeQSdeFMLpYuFebehDAhbuevLs5yxSZmIFN1tP5F9Wl4IpJrYojg85/zgyZHQ==" }, "unified": { "version": "9.2.0", @@ -44822,8 +45820,7 @@ "unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "dev": true + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" }, "unset-value": { "version": "1.0.0", @@ -44886,7 +45883,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.4.tgz", "integrity": "sha512-jnmO2BEGUjsMOe/Fg9u0oczOe/ppIDZPebzccl1yDWGLFP16Pa1/RM5wEoKYPG2zstNcDuAStejyxsOuKINdGA==", - "dev": true, "requires": { "escalade": "^3.1.1", "picocolors": "^1.0.0" @@ -44896,7 +45892,6 @@ "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -44968,8 +45963,7 @@ "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "util.promisify": { "version": "1.0.0", @@ -44984,20 +45978,17 @@ "utila": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz", - "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==", - "dev": true + "integrity": "sha512-Z0DbgELS9/L/75wZbro8xAnT50pBVFQZ+hUEueGDU5FN51YSCYM+jdxsfCiHjwNP/4LCDD0i/graKpeBnOXKRA==" }, "utils-merge": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", - "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", - "dev": true + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" }, "uuid": { "version": "8.3.2", "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", - "dev": true + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==" }, "uuid-browser": { "version": "3.1.0", @@ -45035,8 +46026,26 @@ "vary": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "dev": true + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha512-ZZKSmDAEFOijERBLkmYfJ+vmk3w+7hOLYDNkRCuRuMJGEmqYNCNLyBBFwWKVMhfwaEF3WOd0Zlw86U/WC/+nYw==", + "dev": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + }, + "dependencies": { + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha512-3lqz5YjWTYnW6dlDa5TLaTCcShfar1e40rmcJVwCBJC6mWlFuj0eCHIElmG1g5kyuJ/GD+8Wn4FFCcz4gJPfaQ==", + "dev": true + } + } }, "vfile": { "version": "4.2.1", @@ -45085,7 +46094,6 @@ "version": "2.4.0", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, "requires": { "glob-to-regexp": "^0.4.1", "graceful-fs": "^4.1.2" @@ -45365,7 +46373,6 @@ "version": "1.7.3", "resolved": "https://registry.npmjs.org/wbuf/-/wbuf-1.7.3.tgz", "integrity": "sha512-O84QOnr0icsbFGLS0O3bI5FswxzRr8/gHwWkDlQFskhSPryQXvrTMxjxGP4+iWYoauLoBvfDpkrOauZ+0iZpDA==", - "dev": true, "requires": { "minimalistic-assert": "^1.0.0" } @@ -45395,7 +46402,6 @@ "version": "5.73.0", "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.73.0.tgz", "integrity": "sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==", - "dev": true, "requires": { "@types/eslint-scope": "^3.7.3", "@types/estree": "^0.0.51", @@ -45427,7 +46433,6 @@ "version": "4.10.0", "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, "requires": { "@discoveryjs/json-ext": "^0.5.0", "@webpack-cli/configtest": "^1.2.0", @@ -45446,8 +46451,7 @@ "commander": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==" } } }, @@ -45455,7 +46459,6 @@ "version": "5.3.3", "resolved": "https://registry.npmjs.org/webpack-dev-middleware/-/webpack-dev-middleware-5.3.3.tgz", "integrity": "sha512-hj5CYrY0bZLB+eTO+x/j67Pkrquiy7kWepMHmUMoPsmcUaeEnQJqFzHJOyxgWlq746/wUuA64p9ta34Kyb01pA==", - "dev": true, "requires": { "colorette": "^2.0.10", "memfs": "^3.4.3", @@ -45468,7 +46471,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -45480,7 +46482,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.3" } @@ -45488,14 +46489,12 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -45509,7 +46508,6 @@ "version": "4.9.2", "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.9.2.tgz", "integrity": "sha512-H95Ns95dP24ZsEzO6G9iT+PNw4Q7ltll1GfJHV4fKphuHWgKFzGHWi4alTlTnpk1SPPk41X+l2RB7rLfIhnB9Q==", - "dev": true, "requires": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -45546,7 +46544,6 @@ "version": "8.11.0", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.11.0.tgz", "integrity": "sha512-wGgprdCvMalC0BztXvitD2hC04YffAvtsUn93JbGXYLAtCUO4xd17mCCZQxUOItiBwZvJScWo8NIvQMQ71rdpg==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -45558,7 +46555,6 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-5.1.0.tgz", "integrity": "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw==", - "dev": true, "requires": { "fast-deep-equal": "^3.1.3" } @@ -45566,14 +46562,12 @@ "json-schema-traverse": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, "schema-utils": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.0.0.tgz", "integrity": "sha512-1edyXKgh6XnJsJSQ8mKWXnN/BVaIbFMLpouRUrXgVq7WYne5kw3MW7UPhO44uRXQSIpTSXoJbmrR2X0w9kUTyg==", - "dev": true, "requires": { "@types/json-schema": "^7.0.9", "ajv": "^8.8.0", @@ -45624,7 +46618,6 @@ "version": "5.8.0", "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, "requires": { "clone-deep": "^4.0.1", "wildcard": "^2.0.0" @@ -45633,8 +46626,7 @@ "webpack-sources": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true + "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==" }, "webpack-virtual-modules": { "version": "0.4.4", @@ -45646,7 +46638,6 @@ "version": "0.7.4", "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz", "integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==", - "dev": true, "requires": { "http-parser-js": ">=0.5.1", "safe-buffer": ">=5.1.0", @@ -45656,8 +46647,7 @@ "websocket-extensions": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.4.tgz", - "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==", - "dev": true + "integrity": "sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==" }, "whatwg-url": { "version": "5.0.0", @@ -45673,7 +46663,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "requires": { "isexe": "^2.0.0" } @@ -45712,8 +46701,7 @@ "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true + "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==" }, "word-wrap": { "version": "1.2.3", @@ -45785,8 +46773,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "write-file-atomic": { "version": "3.0.3", @@ -45804,7 +46791,6 @@ "version": "8.8.0", "resolved": "https://registry.npmjs.org/ws/-/ws-8.8.0.tgz", "integrity": "sha512-JDAgSYQ1ksuwqfChJusw1LSJ8BizJ2e/vVu5Lxjq3YvNJNlROv1ui4i+c/kUUrPheBvQl4c5UbERhTwKa6QBJQ==", - "dev": true, "requires": {} }, "x-default-browser": { @@ -45831,14 +46817,12 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", - "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", - "dev": true + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" }, "yargs": { "version": "16.2.0", @@ -45861,6 +46845,16 @@ "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", "dev": true }, + "yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "dev": true, + "requires": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, "yocto-queue": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/frontend/package.json b/frontend/package.json index b0b2a624..3e80b624 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,7 +1,7 @@ { "name": "f12", - "version": "0.2.0", - "description": "", + "version": "0.3.0", + "description": "개발자의 모든 도구 - F12", "main": "index.js", "scripts": { "build-main": "npx webpack build --config webpack.prod.js", @@ -12,20 +12,15 @@ }, "repository": { "type": "git", - "url": "git+https://github.com/f12-frontend/react-setup.git" + "url": "git+https://github.com/woowacourse-teams/2022-f12.git" }, "author": "", "license": "ISC", "bugs": { - "url": "https://github.com/f12-frontend/react-setup/issues" + "url": "https://github.com/woowacourse-teams/2022-f12/issues" }, - "homepage": "https://github.com/f12-frontend/react-setup#readme", + "homepage": "https://github.com/woowacourse-teams/2022-f12#readme", "devDependencies": { - "@babel/cli": "^7.18.6", - "@babel/core": "^7.18.6", - "@babel/preset-env": "^7.18.6", - "@babel/preset-react": "^7.18.6", - "@babel/preset-typescript": "^7.18.6", "@storybook/addon-actions": "^6.5.9", "@storybook/addon-essentials": "^6.5.9", "@storybook/addon-interactions": "^6.5.9", @@ -34,32 +29,42 @@ "@storybook/manager-webpack5": "^6.5.9", "@storybook/react": "^6.5.9", "@storybook/testing-library": "^0.0.13", - "@svgr/webpack": "^6.2.1", - "@types/react": "^18.0.14", - "@types/react-dom": "^18.0.5", - "@types/react-router-dom": "^5.3.3", - "@types/styled-components": "^5.1.25", + "@testing-library/cypress": "^8.0.3", "@typescript-eslint/eslint-plugin": "^5.30.0", "@typescript-eslint/parser": "^5.30.0", - "babel-loader": "^8.2.5", - "css-loader": "^6.7.1", + "chromatic": "^6.7.3", + "cypress": "^10.3.1", "eslint": "^8.19.0", "eslint-config-prettier": "^8.5.0", + "eslint-plugin-cypress": "^2.12.1", "eslint-plugin-prettier": "^4.1.0", "eslint-plugin-react": "^7.30.1", "eslint-plugin-react-hooks": "^4.6.0", - "html-webpack-plugin": "^5.5.0", "msw": "^0.42.3", - "prettier": "^2.7.1", + "prettier": "^2.7.1" + }, + "dependencies": { + "@babel/cli": "^7.18.6", + "@babel/core": "^7.18.6", + "@babel/preset-env": "^7.18.6", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.18.6", + "@types/react": "^18.0.14", + "@types/react-dom": "^18.0.5", + "@types/react-router-dom": "^5.3.3", + "@types/styled-components": "^5.1.25", + "@svgr/webpack": "^6.2.1", + "babel-loader": "^8.2.5", + "css-loader": "^6.7.1", "sass": "^1.53.0", "sass-loader": "^13.0.2", "style-loader": "^3.3.1", "typescript": "^4.7.4", "webpack": "^5.73.0", "webpack-cli": "^4.10.0", - "webpack-dev-server": "^4.9.2" - }, - "dependencies": { + "webpack-dev-server": "^4.9.2", + "html-webpack-plugin": "^5.5.0", + "@lottiefiles/react-lottie-player": "^3.4.7", "axios": "^0.27.2", "react": "^18.2.0", "react-dom": "^18.2.0", diff --git a/frontend/public/index.html b/frontend/public/index.html index 548a9c34..a627f5fd 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -3,7 +3,6 @@ - + + diff --git a/frontend/src/assets/bookmark_empty.svg b/frontend/src/assets/bookmark_empty.svg new file mode 100644 index 00000000..85e031a8 --- /dev/null +++ b/frontend/src/assets/bookmark_empty.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/github.svg b/frontend/src/assets/github.svg new file mode 100644 index 00000000..4ee2b106 --- /dev/null +++ b/frontend/src/assets/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/assets/search.svg b/frontend/src/assets/search.svg new file mode 100644 index 00000000..3cecb8e1 --- /dev/null +++ b/frontend/src/assets/search.svg @@ -0,0 +1,3 @@ + + + diff --git a/frontend/src/components/InventoryProductList/InventoryProductList.style.tsx b/frontend/src/components/InventoryProductList/InventoryProductList.style.tsx new file mode 100644 index 00000000..7cc48ae5 --- /dev/null +++ b/frontend/src/components/InventoryProductList/InventoryProductList.style.tsx @@ -0,0 +1,8 @@ +import styled from 'styled-components'; + +export const Container = styled.div` + display: flex; + flex-direction: column; + align-items: center; + gap: 1rem; +`; diff --git a/frontend/src/components/InventoryProductList/InventoryProductList.tsx b/frontend/src/components/InventoryProductList/InventoryProductList.tsx new file mode 100644 index 00000000..b3057b7a --- /dev/null +++ b/frontend/src/components/InventoryProductList/InventoryProductList.tsx @@ -0,0 +1,22 @@ +import ProductBar from '@/components/common/ProductBar/ProductBar'; +import * as S from '@/components/InventoryProductList/InventoryProductList.style'; + +type Props = { + products: InventoryProduct[]; +}; + +function InventoryProductList({ products }: Props) { + return ( + + {products.map(({ id: inventoryId, selected, product: { name } }) => ( + + ))} + + ); +} + +export default InventoryProductList; diff --git a/frontend/src/components/Login/Login.tsx b/frontend/src/components/Login/Login.tsx index 0e49c18e..b48e1373 100644 --- a/frontend/src/components/Login/Login.tsx +++ b/frontend/src/components/Login/Login.tsx @@ -1,25 +1,37 @@ +import Loading from '@/components/common/Loading/Loading'; import ROUTES from '@/constants/routes'; +import { UserDataContext } from '@/contexts/LoginContextProvider'; import useAuth from '@/hooks/useAuth'; -import { useEffect } from 'react'; +import useModal from '@/hooks/useModal'; +import { useContext, useEffect } from 'react'; import { useNavigate, useSearchParams } from 'react-router-dom'; function Login() { const { login } = useAuth(); + const { showAlert } = useModal(); const [searchParam] = useSearchParams(); + const userData = useContext(UserDataContext); const navigate = useNavigate(); useEffect(() => { - login(searchParam.get('code')) - .catch(() => { - alert('로그인에 실패했습니다. 잠시 후 다시 시도해주세요.'); - }) - .finally(() => { - navigate(ROUTES.HOME); - }); + login(searchParam.get('code')).catch(() => { + showAlert('로그인에 실패했습니다. 잠시 후 다시 시도해주세요.'); + navigate(ROUTES.HOME); + }); }, []); - return
로그인 진행중..
; + useEffect(() => { + if (!userData) return; + + if (userData.registerCompleted) { + navigate(ROUTES.HOME); + return; + } + navigate(ROUTES.REGISTER); + }, [userData]); + + return ; } export default Login; diff --git a/frontend/src/components/ProductListSection/ProductListSection.stories.tsx b/frontend/src/components/ProductListSection/ProductListSection.stories.tsx index a7e43ed6..8be92dd4 100644 --- a/frontend/src/components/ProductListSection/ProductListSection.stories.tsx +++ b/frontend/src/components/ProductListSection/ProductListSection.stories.tsx @@ -1,6 +1,6 @@ -import ProductListSection from './ProductListSection'; +import ProductListSection from '@/components/ProductListSection/ProductListSection'; import { ComponentStory } from '@storybook/react'; -import { products } from '../../mocks/data'; +import { products } from '@/mocks/data'; export default { component: ProductListSection, diff --git a/frontend/src/components/ProductListSection/ProductListSection.style.tsx b/frontend/src/components/ProductListSection/ProductListSection.style.tsx index 19f1aa90..5f3d2451 100644 --- a/frontend/src/components/ProductListSection/ProductListSection.style.tsx +++ b/frontend/src/components/ProductListSection/ProductListSection.style.tsx @@ -5,6 +5,8 @@ export const Container = styled.section` display: flex; flex-direction: column; gap: 1rem; + + min-height: 28rem; `; export const Title = styled.h1` diff --git a/frontend/src/components/ProductListSection/ProductListSection.tsx b/frontend/src/components/ProductListSection/ProductListSection.tsx index 780797bc..fdccc6ee 100644 --- a/frontend/src/components/ProductListSection/ProductListSection.tsx +++ b/frontend/src/components/ProductListSection/ProductListSection.tsx @@ -1,48 +1,81 @@ import React from 'react'; import { Link } from 'react-router-dom'; -import ProductCard from '../common/ProductCard/ProductCard'; -import SectionHeader from '../common/SectionHeader/SectionHeader'; +import ProductCard from '@/components/common/ProductCard/ProductCard'; +import SectionHeader from '@/components/common/SectionHeader/SectionHeader'; -import * as S from './ProductListSection.style'; -import ROUTES from '../../constants/routes'; -import InfiniteScroll from '../common/InfiniteScroll/InfiniteScroll'; -import Masonry from '../common/Masonry/Masonry'; +import * as S from '@/components/ProductListSection/ProductListSection.style'; +import ROUTES from '@/constants/routes'; +import InfiniteScroll from '@/components/common/InfiniteScroll/InfiniteScroll'; +import Masonry from '@/components/common/Masonry/Masonry'; +import AsyncWrapper from '@/components/common/AsyncWrapper/AsyncWrapper'; +import Loading from '@/components/common/Loading/Loading'; +import NoDataPlaceholder from '@/components/common/NoDataPlaceholder/NoDataPlaceholder'; type Props = { title: string; addOn?: React.ReactNode; - data: { id: number; imageUrl: string; name: string; rating: number }[]; + data: Product[]; + isLoading: boolean; + isReady: boolean; + isError: boolean; getNextPage?: () => void; }; -function ProductListSection({ title, addOn, data, getNextPage }: Props) { - const productCardList = - data && - data.map(({ id, imageUrl, name, rating }) => ( - - - - )); - +function ProductListSection({ + title, + addOn, + data, + isLoading, + isReady, + isError, + getNextPage, +}: Props) { return ( - data.length !== 0 && ( - - - {title} - {addOn} - - - {getNextPage !== undefined ? ( - - {productCardList} + + + {title} + {addOn} + + + {getNextPage !== undefined ? ( + } + isReady={isReady} + isError={isError} + > + + - ) : ( - {productCardList} - )} - - - ) + + ) : ( + } + isReady={isReady} + isError={isError} + > + + + )} + + ); } +const ProductCardList = ({ data }: { data: Product[] }) => { + return ( + + {data.map(({ id, imageUrl, name, rating }) => ( + + + + ))} + {data.length === 0 && } + + ); +}; + export default ProductListSection; diff --git a/frontend/src/components/ProfileCard/ProfileCard.stories.tsx b/frontend/src/components/ProfileCard/ProfileCard.stories.tsx new file mode 100644 index 00000000..98055eff --- /dev/null +++ b/frontend/src/components/ProfileCard/ProfileCard.stories.tsx @@ -0,0 +1,35 @@ +import ProfileCard from '@/components/ProfileCard/ProfileCard'; +import { ComponentStory } from '@storybook/react'; + +export default { + component: ProfileCard, + title: 'Components/ProfileCard', +}; + +const Template: ComponentStory = (args) => ( +
+ +
+); + +const defaultArgs = { + id: 1, + gitHubId: 'jswith', + imageUrl: 'https://avatars.githubusercontent.com/u/64275588?v=4', + careerLevel: 'junior', + jobType: 'frontend', + profileProducts: [ + { + id: 1, + name: '키보드', + imageUrl: 'https://avatars.githubusercontent.com/u/64275588?v=4', + reviewCount: 3, + rating: 4, + category: 'keyboard', + }, + ], +}; + +export const Default = () =>